From db372c14b2b0d1d352fa5cebdf31340cf59499ff Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 10 Apr 2026 22:24:03 +0000 Subject: [PATCH 01/91] Backport #101798 to 25.8: Prevent server termination when unregistering S3 client fails --- src/IO/S3/Client.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/IO/S3/Client.cpp b/src/IO/S3/Client.cpp index e4f8757d4968..8b224e3ef8f3 100644 --- a/src/IO/S3/Client.cpp +++ b/src/IO/S3/Client.cpp @@ -338,7 +338,6 @@ Client::~Client() catch (...) { tryLogCurrentException(log); - throw; } } From 0e25e816d404e919262a8c775b37aa689cb9994e Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Sat, 11 Apr 2026 08:25:17 +0000 Subject: [PATCH 02/91] Backport #102384 to 25.8: Coalescing merge tree fix array --- .../Algorithms/SummingSortedAlgorithm.cpp | 53 +++++++++++-------- ...ee_array_tuple_with_column_param.reference | 2 + ...rge_tree_array_tuple_with_column_param.sql | 29 ++++++++++ 3 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.reference create mode 100644 tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.sql diff --git a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp index 6598846d4ae7..6c17eb278579 100644 --- a/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp +++ b/src/Processors/Merges/Algorithms/SummingSortedAlgorithm.cpp @@ -267,33 +267,40 @@ static SummingSortedAlgorithm::ColumnsDefinition defineColumns( /// if nested table name ends with `Map` it is a possible candidate for special handling if (map_name == column.name || !endsWith(map_name, "Map")) { - bool is_agg_func = WhichDataType(column.type).isAggregateFunction(); - - SummingSortedAlgorithm::AggregateDescription desc; - desc.remove_default_values = remove_default_values; - desc.aggregate_all_columns = aggregate_all_columns; - desc.sum_function_map_name = sum_function_map_name; - desc.is_agg_func_type = is_agg_func; - desc.column_numbers = {i}; - - desc.real_type = column.type; - desc.nested_type = recursiveRemoveLowCardinality(desc.real_type); - if (desc.real_type.get() == desc.nested_type.get()) - desc.nested_type = nullptr; - - if (simple) + if (!column_names_to_sum.empty() && !isInNames(column.name, column_names_to_sum)) { - // simple aggregate function - desc.init(simple->getFunction(), true); - if (desc.function->allocatesMemoryInArena()) - def.allocates_memory_in_arena = true; + def.column_numbers_not_to_aggregate.push_back(i); } - else if (!is_agg_func) + else { - desc.init(sum_function_name.c_str(), {column.type}); - } + bool is_agg_func = WhichDataType(column.type).isAggregateFunction(); - def.columns_to_aggregate.emplace_back(std::move(desc)); + SummingSortedAlgorithm::AggregateDescription desc; + desc.remove_default_values = remove_default_values; + desc.aggregate_all_columns = aggregate_all_columns; + desc.sum_function_map_name = sum_function_map_name; + desc.is_agg_func_type = is_agg_func; + desc.column_numbers = {i}; + + desc.real_type = column.type; + desc.nested_type = recursiveRemoveLowCardinality(desc.real_type); + if (desc.real_type.get() == desc.nested_type.get()) + desc.nested_type = nullptr; + + if (simple) + { + // simple aggregate function + desc.init(simple->getFunction(), true); + if (desc.function->allocatesMemoryInArena()) + def.allocates_memory_in_arena = true; + } + else if (!is_agg_func) + { + desc.init(sum_function_name.c_str(), {column.type}); + } + + def.columns_to_aggregate.emplace_back(std::move(desc)); + } } continue; diff --git a/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.reference b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.reference new file mode 100644 index 000000000000..607043c71a00 --- /dev/null +++ b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.reference @@ -0,0 +1,2 @@ +first ['a','b'] ('hello',42) {'x':1,'y':2} v2 +first ['a','b'] ('hello',42) {'x':1,'y':2} v2 diff --git a/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.sql b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.sql new file mode 100644 index 000000000000..edb3398a0b87 --- /dev/null +++ b/tests/queries/0_stateless/04060_coalescing_merge_tree_array_tuple_with_column_param.sql @@ -0,0 +1,29 @@ +DROP TABLE IF EXISTS 04060_test; + +CREATE TABLE 04060_test +( + key String, + str_col String, + arr_col Array(String), + tuple_col Tuple(x String, y UInt32), + map_col Map(String, UInt32), + update_column Nullable(String) +) +ENGINE = CoalescingMergeTree(update_column) +ORDER BY key; + +INSERT INTO 04060_test (key, str_col, arr_col, tuple_col, map_col) +VALUES ('k', 'first', ['a', 'b'], ('hello', 42), {'x': 1, 'y': 2}); + +INSERT INTO 04060_test (key, update_column) +VALUES ('k', 'v2'); + +SELECT str_col, arr_col, tuple_col, map_col, update_column +FROM 04060_test FINAL; + +OPTIMIZE TABLE 04060_test FINAL; + +SELECT str_col, arr_col, tuple_col, map_col, update_column +FROM 04060_test; + +DROP TABLE 04060_test; From c14a1921fccff06b955c1010d8ee0e55b884eee5 Mon Sep 17 00:00:00 2001 From: alesapin Date: Wed, 24 Sep 2025 20:26:27 +0200 Subject: [PATCH 03/91] Fix very weird issue --- src/IO/S3/PocoHTTPClient.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/IO/S3/PocoHTTPClient.cpp b/src/IO/S3/PocoHTTPClient.cpp index 7f8b374de4f1..a002d298710d 100644 --- a/src/IO/S3/PocoHTTPClient.cpp +++ b/src/IO/S3/PocoHTTPClient.cpp @@ -133,6 +133,11 @@ PocoHTTPClientConfiguration::PocoHTTPClientConfiguration( LOG_INFO(getLogger("PocoHTTPClientConfiguration"), "Jitter factor for the retry strategy must be within the [0, 1], clamping"); retry_strategy.jitter_factor = std::clamp(retry_strategy.jitter_factor, 0.0, 1.0); } + + /// NOTE: Without these settings AWS SDK enable transfer-encoding: chunked and content-encoding: aws-chunked + /// We don't use them and MinIO server doesn't support them. + checksumConfig.requestChecksumCalculation = Aws::Client::RequestChecksumCalculation::WHEN_REQUIRED; + checksumConfig.responseChecksumValidation = Aws::Client::ResponseChecksumValidation::WHEN_REQUIRED; } void PocoHTTPClientConfiguration::updateSchemeAndRegion() From 8cc0fb13c21ccb845962450fe545f2550bac53fb Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 30 Apr 2026 03:21:34 +0000 Subject: [PATCH 04/91] Backport #103552 to 25.8: Fix masking nested credentials in logs --- .../ASTFunctionWithKeyValueArguments.cpp | 2 +- .../test_mask_sensitive_info/test.py | 45 +++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/Parsers/ASTFunctionWithKeyValueArguments.cpp b/src/Parsers/ASTFunctionWithKeyValueArguments.cpp index ecd4aa424654..f3eb658573d3 100644 --- a/src/Parsers/ASTFunctionWithKeyValueArguments.cpp +++ b/src/Parsers/ASTFunctionWithKeyValueArguments.cpp @@ -59,7 +59,7 @@ void ASTPair::formatImpl(WriteBuffer & ostr, const FormatSettings & settings, Fo bool ASTPair::hasSecretParts() const { - return first == "password"; + return (first == "password") || second->hasSecretParts(); } diff --git a/tests/integration/test_mask_sensitive_info/test.py b/tests/integration/test_mask_sensitive_info/test.py index 1ca836c0e406..80558f978332 100644 --- a/tests/integration/test_mask_sensitive_info/test.py +++ b/tests/integration/test_mask_sensitive_info/test.py @@ -770,35 +770,74 @@ def test_encryption_functions(): def test_create_dictionary(): password = new_password() + # ClickHouse source. node.query( f"CREATE DICTIONARY dict1 (n int DEFAULT 0, m int DEFAULT 1) PRIMARY KEY n " f"SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'user1' TABLE 'test' PASSWORD '{password}' DB 'default')) " f"LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" ) + # HTTP source with top-level USER/PASSWORD keys. + node.query( + f"CREATE DICTIONARY dict2 (n int DEFAULT 0) PRIMARY KEY n " + f"SOURCE(HTTP(url 'http://localhost:8123/dict.tsv' format 'TabSeparated' user 'huser' password '{password}')) " + f"LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" + ) + + # HTTP source with nested CREDENTIALS(USER ... PASSWORD ...). + node.query( + f"CREATE DICTIONARY dict3 (n int DEFAULT 0) PRIMARY KEY n " + f"SOURCE(HTTP(url 'http://localhost:8123/dict.tsv' format 'TabSeparated' credentials(user 'huser' password '{password}'))) " + f"LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" + ) + for toggle, secret in enumerate(["[HIDDEN]", password]): assert ( node.query(f"SHOW CREATE TABLE dict1 {show_secrets}={toggle}") == f"CREATE DICTIONARY default.dict1\\n(\\n `n` int DEFAULT 0,\\n `m` int DEFAULT 1\\n)\\nPRIMARY KEY n\\nSOURCE(CLICKHOUSE(HOST \\'localhost\\' PORT 9000 USER \\'user1\\' TABLE \\'test\\' PASSWORD \\'{secret}\\' DB \\'default\\'))\\nLIFETIME(MIN 0 MAX 10)\\nLAYOUT(FLAT())\n" ) + assert ( + node.query(f"SHOW CREATE TABLE dict2 {show_secrets}={toggle}") + == f"CREATE DICTIONARY default.dict2\\n(\\n `n` int DEFAULT 0\\n)\\nPRIMARY KEY n\\nSOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' USER \\'huser\\' PASSWORD \\'{secret}\\'))\\nLIFETIME(MIN 0 MAX 10)\\nLAYOUT(FLAT())\n" + ) + + assert ( + node.query(f"SHOW CREATE TABLE dict3 {show_secrets}={toggle}") + == f"CREATE DICTIONARY default.dict3\\n(\\n `n` int DEFAULT 0\\n)\\nPRIMARY KEY n\\nSOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' CREDENTIALS (USER \\'huser\\' PASSWORD \\'{secret}\\')))\\nLIFETIME(MIN 0 MAX 10)\\nLAYOUT(FLAT())\n" + ) + assert ( node.query( - f"SELECT create_table_query FROM system.tables WHERE name = 'dict1' {show_secrets}={toggle}" + f"SELECT create_table_query FROM system.tables WHERE name IN ['dict1', 'dict2', 'dict3'] ORDER BY name {show_secrets}={toggle}" + ) + == ( + f"CREATE DICTIONARY default.dict1 (`n` int DEFAULT 0, `m` int DEFAULT 1) PRIMARY KEY n SOURCE(CLICKHOUSE(HOST \\'localhost\\' PORT 9000 USER \\'user1\\' TABLE \\'test\\' PASSWORD \\'{secret}\\' DB \\'default\\')) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" + f"CREATE DICTIONARY default.dict2 (`n` int DEFAULT 0) PRIMARY KEY n SOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' USER \\'huser\\' PASSWORD \\'{secret}\\')) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" + f"CREATE DICTIONARY default.dict3 (`n` int DEFAULT 0) PRIMARY KEY n SOURCE(HTTP(URL \\'http://localhost:8123/dict.tsv\\' FORMAT \\'TabSeparated\\' CREDENTIALS (USER \\'huser\\' PASSWORD \\'{secret}\\'))) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" ) - == f"CREATE DICTIONARY default.dict1 (`n` int DEFAULT 0, `m` int DEFAULT 1) PRIMARY KEY n SOURCE(CLICKHOUSE(HOST \\'localhost\\' PORT 9000 USER \\'user1\\' TABLE \\'test\\' PASSWORD \\'{secret}\\' DB \\'default\\')) LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())\n" ) check_logs( must_contain=[ "CREATE DICTIONARY dict1 (`n` int DEFAULT 0, `m` int DEFAULT 1) PRIMARY KEY n " "SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'user1' TABLE 'test' PASSWORD '[HIDDEN]' DB 'default')) " - "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())" + "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())", + + "CREATE DICTIONARY dict2 (`n` int DEFAULT 0) PRIMARY KEY n " + "SOURCE(HTTP(URL 'http://localhost:8123/dict.tsv' FORMAT 'TabSeparated' USER 'huser' PASSWORD '[HIDDEN]')) " + "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())", + + "CREATE DICTIONARY dict3 (`n` int DEFAULT 0) PRIMARY KEY n " + "SOURCE(HTTP(URL 'http://localhost:8123/dict.tsv' FORMAT 'TabSeparated' CREDENTIALS (USER 'huser' PASSWORD '[HIDDEN]'))) " + "LIFETIME(MIN 0 MAX 10) LAYOUT(FLAT())", ], must_not_contain=[password], ) node.query("DROP DICTIONARY dict1") + node.query("DROP DICTIONARY dict2") + node.query("DROP DICTIONARY dict3") def test_backup_to_s3(): From aedd933800332cd82a6338166a332b1f7e5f9ac2 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 30 Apr 2026 14:56:53 +0000 Subject: [PATCH 05/91] Backport #103773 to 25.8: Fix UB while parsing dateTime --- src/IO/parseDateTimeBestEffort.cpp | 4 ++++ tests/queries/0_stateless/04143_ub_parsing_datetime.reference | 1 + tests/queries/0_stateless/04143_ub_parsing_datetime.sql | 1 + 3 files changed, 6 insertions(+) create mode 100644 tests/queries/0_stateless/04143_ub_parsing_datetime.reference create mode 100644 tests/queries/0_stateless/04143_ub_parsing_datetime.sql diff --git a/src/IO/parseDateTimeBestEffort.cpp b/src/IO/parseDateTimeBestEffort.cpp index 694dca66a262..8c2e2fe43d6d 100644 --- a/src/IO/parseDateTimeBestEffort.cpp +++ b/src/IO/parseDateTimeBestEffort.cpp @@ -110,6 +110,7 @@ ReturnType parseDateTimeBestEffortImpl( UInt8 second = 0; bool has_time = false; + bool has_fractional = false; bool has_time_zone_offset = false; bool time_zone_offset_negative = false; @@ -519,6 +520,9 @@ ReturnType parseDateTimeBestEffortImpl( { if (!has_time) return on_error(ErrorCodes::CANNOT_PARSE_DATETIME, "Cannot read DateTime: unexpected point symbol"); + if (has_fractional) + return on_error(ErrorCodes::CANNOT_PARSE_DATETIME, "Cannot read DateTime: duplicate fractional part"); + has_fractional = true; ++in.position(); num_digits = readDigits(digits, sizeof(digits), in); diff --git a/tests/queries/0_stateless/04143_ub_parsing_datetime.reference b/tests/queries/0_stateless/04143_ub_parsing_datetime.reference new file mode 100644 index 000000000000..dec7d2fabd2e --- /dev/null +++ b/tests/queries/0_stateless/04143_ub_parsing_datetime.reference @@ -0,0 +1 @@ +\N diff --git a/tests/queries/0_stateless/04143_ub_parsing_datetime.sql b/tests/queries/0_stateless/04143_ub_parsing_datetime.sql new file mode 100644 index 000000000000..100ef25a02c2 --- /dev/null +++ b/tests/queries/0_stateless/04143_ub_parsing_datetime.sql @@ -0,0 +1 @@ +SELECT parseDateTime64BestEffortOrNull('1970-01-01 00:00:00.99999999999999999.999999999999', 9); From ac95f6f29b68c5c95d011189915c1b184d698835 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 4 May 2026 16:48:06 +0000 Subject: [PATCH 06/91] Backport #100758 to 25.8: Erase sorted_dynamic_paths entries before dynamic_paths ones --- src/Columns/ColumnObject.cpp | 2 + src/Columns/tests/gtest_column_object.cpp | 47 +++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/Columns/ColumnObject.cpp b/src/Columns/ColumnObject.cpp index 7e6a1e356c19..83f0d93fa232 100644 --- a/src/Columns/ColumnObject.cpp +++ b/src/Columns/ColumnObject.cpp @@ -531,6 +531,7 @@ bool ColumnObject::tryInsert(const Field & x) for (const auto & path : new_dynamic_paths) { dynamic_paths_ptrs.erase(path); + sorted_dynamic_paths.erase(path); dynamic_paths.erase(path); } @@ -566,6 +567,7 @@ bool ColumnObject::tryInsert(const Field & x) } else if (auto * dynamic_path_column = tryToAddNewDynamicPath(path)) { + new_dynamic_paths.insert(String(path)); if (!dynamic_path_column->tryInsert(value_field)) { restore_sizes(); diff --git a/src/Columns/tests/gtest_column_object.cpp b/src/Columns/tests/gtest_column_object.cpp index 4a0ca225617d..1182da72f031 100644 --- a/src/Columns/tests/gtest_column_object.cpp +++ b/src/Columns/tests/gtest_column_object.cpp @@ -444,3 +444,50 @@ TEST(ColumnObject, RepairDuplicatesInDynamicPathsAndSharedData) ASSERT_EQ((*column_object)[2], (Object{{"b", Field(1u)}, {"c", Field(1u)}, {"d", Field(1u)}})); ASSERT_EQ((*column_object)[3], (Object{{"d", Field(1u)}})); } + +TEST(ColumnObject, TryInsertRestoresSortedDynamicPaths) +{ + /// "b" is a typed UInt32 path; everything else becomes a dynamic path. + auto type = DataTypeFactory::instance().get("JSON(max_dynamic_types=10, max_dynamic_paths=10, b UInt32)"); + auto col = type->createColumn(); + auto & col_object = assert_cast(*col); + const auto & dynamic_paths = col_object.getDynamicPaths(); + + /// One valid row so we have something to serialize later. + col_object.insert(Object{{"b", Field{5u}}}); + ASSERT_EQ(col_object.size(), 1u); + ASSERT_EQ(dynamic_paths.size(), 0u); + + /// tryInsert with Object{"a_new": 1, "b": "not_a_number"}. + /// Fields are processed in alphabetical order ("a_new" before "b"), so: + /// 1. "a_new" is new → tryToAddNewDynamicPath succeeds, "a_new" is added to all + /// three structures including sorted_dynamic_paths. + /// 2. ColumnDynamic::tryInsert(1u) for "a_new" succeeds. + /// 3. ColumnUInt32::tryInsert(String) for "b" returns false. + /// 4. restore_sizes() is called. + /// BUG 1: new_dynamic_paths was never populated, so the loop that removes + /// newly-added paths is a no-op — "a_new" is left in dynamic_paths, + /// dynamic_paths_ptrs, and sorted_dynamic_paths with a rolled-back size. + /// BUG 2: even after populating new_dynamic_paths, the old code erased from + /// dynamic_paths before sorted_dynamic_paths, leaving a dangling view. + /// FIX: record the path in new_dynamic_paths immediately after + /// tryToAddNewDynamicPath succeeds, and erase sorted_dynamic_paths + /// before dynamic_paths. + bool result = col_object.tryInsert(Object{{"a_new", Field{1u}}, {"b", Field{String("not_a_number")}}}); + ASSERT_FALSE(result); + + ASSERT_EQ(col_object.size(), 1u); + ASSERT_EQ(dynamic_paths.size(), 0u); /// "a_new" must be fully rolled back + + /// serializeValueIntoArena iterates sorted_dynamic_paths. + /// Without the fix the stale "a_new" entry causes undefined behavior here (see comment above). + Arena arena; + const char * begin = nullptr; + auto ref = col_object.serializeValueIntoArena(0, arena, begin, nullptr); + + /// Round-trip sanity check. + ReadBufferFromMemory buf(ref.data(), ref.size()); + col_object.deserializeAndInsertFromArena(buf, nullptr); + ASSERT_EQ(col_object.size(), 2u); + ASSERT_EQ(col_object[1], col_object[0]); +} From e72c1c329bc176bb0172a6b3f40d9f35225c479f Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 4 May 2026 20:48:04 +0000 Subject: [PATCH 07/91] Update autogenerated version to 25.8.23.13 and contributors --- cmake/autogenerated_versions.txt | 10 +++++----- .../System/StorageSystemContributors.generated.cpp | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cmake/autogenerated_versions.txt b/cmake/autogenerated_versions.txt index 3f721de321fe..ef9409c640cd 100644 --- a/cmake/autogenerated_versions.txt +++ b/cmake/autogenerated_versions.txt @@ -2,11 +2,11 @@ # NOTE: VERSION_REVISION has nothing common with DBMS_TCP_PROTOCOL_VERSION, # only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes. -SET(VERSION_REVISION 54523) +SET(VERSION_REVISION 54524) SET(VERSION_MAJOR 25) SET(VERSION_MINOR 8) -SET(VERSION_PATCH 23) -SET(VERSION_GITHASH 6d29497525664acca46a1d1cd0d5787e9ad0857d) -SET(VERSION_DESCRIBE v25.8.23.1-lts) -SET(VERSION_STRING 25.8.23.1) +SET(VERSION_PATCH 24) +SET(VERSION_GITHASH 443620d152ed64184d6f221c988c569334311055) +SET(VERSION_DESCRIBE v25.8.24.1-lts) +SET(VERSION_STRING 25.8.24.1) # end of autochange diff --git a/src/Storages/System/StorageSystemContributors.generated.cpp b/src/Storages/System/StorageSystemContributors.generated.cpp index d85cb2413c66..c88d9898eb5f 100644 --- a/src/Storages/System/StorageSystemContributors.generated.cpp +++ b/src/Storages/System/StorageSystemContributors.generated.cpp @@ -1090,6 +1090,7 @@ const char * auto_contributors[] { "Rafael David Tinoco", "Rafael Roquetto", "Rahul", + "Rahul Nair", "Rajakavitha Kodhandapani", "Rajkumar", "Rajkumar Varada", From 4cea8973b6563717bac042df84ad321b9dc92b5f Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 5 May 2026 13:48:55 +0000 Subject: [PATCH 08/91] Backport #104047 to 25.8: Bump libarchive form 3.8.6 to 3.8.7 --- contrib/libarchive | 2 +- contrib/libarchive-cmake/config.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/libarchive b/contrib/libarchive index 3a9249b4eeb2..ded82291ab41 160000 --- a/contrib/libarchive +++ b/contrib/libarchive @@ -1 +1 @@ -Subproject commit 3a9249b4eeb2a101ca4e0d2b12e4007642bac126 +Subproject commit ded82291ab41d5e355831b96b0e1ff49e24d8939 diff --git a/contrib/libarchive-cmake/config.h b/contrib/libarchive-cmake/config.h index 309251100cd9..86732ed06a9a 100644 --- a/contrib/libarchive-cmake/config.h +++ b/contrib/libarchive-cmake/config.h @@ -1031,6 +1031,9 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 From e27c3d40c321a2147569cea36709c2067f867cde Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 5 May 2026 20:40:41 +0000 Subject: [PATCH 09/91] Backport #102921 to 25.8: Disable trivial LIMIT optimization with row policies/additional_table_filters --- src/Planner/PlannerJoinTree.cpp | 134 ++++++++++++++---- ...row_policy_trivial_limit_threads.reference | 22 +++ ...04099_row_policy_trivial_limit_threads.sql | 65 +++++++++ ...ial_count_with_additional_filter.reference | 9 ++ ...1_trivial_count_with_additional_filter.sql | 48 +++++++ 5 files changed, 251 insertions(+), 27 deletions(-) create mode 100644 tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference create mode 100644 tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.sql create mode 100644 tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference create mode 100644 tests/queries/0_stateless/04201_trivial_count_with_additional_filter.sql diff --git a/src/Planner/PlannerJoinTree.cpp b/src/Planner/PlannerJoinTree.cpp index dff3ebfb14c2..112ea45ca75e 100644 --- a/src/Planner/PlannerJoinTree.cpp +++ b/src/Planner/PlannerJoinTree.cpp @@ -265,6 +265,22 @@ NameAndTypePair chooseSmallestColumnToReadFromStorage(const StoragePtr & storage return result; } +/// Returns the effective row policy filter for the table, or nullptr if the +/// table has no row policies for the current user or the combined filter is +/// always-true. Mirrors the effective-filter check used by +/// buildRowPolicyFilterIfNeeded. +RowPolicyFilterPtr getEffectiveRowPolicyFilter(const StoragePtr & storage, const ContextPtr & query_context) +{ + auto storage_id = storage->getStorageID(); + if (!storage_id.hasDatabase()) + return nullptr; + auto row_policy_filter = query_context->getRowPolicyFilter( + storage_id.getDatabaseName(), storage_id.getTableName(), RowPolicyFilterType::SELECT_FILTER); + if (!row_policy_filter || row_policy_filter->empty()) + return nullptr; + return row_policy_filter; +} + bool applyTrivialCountIfPossible( QueryPlan & query_plan, SelectQueryInfo & select_query_info, @@ -283,12 +299,8 @@ bool applyTrivialCountIfPossible( table_node ? table_node->getStorageSnapshot() : table_function_node->getStorageSnapshot(), query_context)) return false; - auto storage_id = storage->getStorageID(); - auto row_policy_filter = query_context->getRowPolicyFilter(storage_id.getDatabaseName(), - storage_id.getTableName(), - RowPolicyFilterType::SELECT_FILTER); - if (row_policy_filter) - return {}; + if (getEffectiveRowPolicyFilter(storage, query_context)) + return false; if (select_query_info.additional_filter_ast) return false; @@ -523,11 +535,10 @@ std::optional buildRowPolicyFilterIfNeeded(const StoragePtr & sto PlannerContextPtr & planner_context, std::set & used_row_policies) { - auto storage_id = storage->getStorageID(); const auto & query_context = planner_context->getQueryContext(); - auto row_policy_filter = query_context->getRowPolicyFilter(storage_id.getDatabaseName(), storage_id.getTableName(), RowPolicyFilterType::SELECT_FILTER); - if (!row_policy_filter || row_policy_filter->empty()) + auto row_policy_filter = getEffectiveRowPolicyFilter(storage, query_context); + if (!row_policy_filter) return {}; for (const auto & row_policy : row_policy_filter->policies) @@ -572,22 +583,24 @@ std::optional buildCustomKeyFilterIfNeeded(const StoragePtr & sto return buildFilterInfo(parallel_replicas_custom_filter_ast, table_expression_query_info.table_expression, planner_context); } -/// Apply filters from additional_table_filters setting -std::optional buildAdditionalFiltersIfNeeded(const StoragePtr & storage, +/// Parse `additional_table_filters` for this table expression and assign the AST into +/// `table_expression_query_info.additional_filter_ast`. This is the pure, side-effect-free +/// part of `buildAdditionalFiltersIfNeeded` — no planner-context mutation, no prewhere +/// touch — so it can be called early (before prewhere / row-policy / trivial-count / +/// trivial-limit decisions) and later consumers can simply read the parsed AST. +void parseAdditionalFilterAstIfNeeded(const StoragePtr & storage, const String & table_expression_alias, SelectQueryInfo & table_expression_query_info, - PlannerContextPtr & planner_context) + const ContextPtr & query_context) { - const auto & query_context = planner_context->getQueryContext(); const auto & settings = query_context->getSettingsRef(); auto const & additional_filters = settings[Setting::additional_table_filters].value; if (additional_filters.empty()) - return {}; + return; auto const & storage_id = storage->getStorageID(); - ASTPtr additional_filter_ast; for (const auto & additional_filter : additional_filters) { const auto & tuple = additional_filter.safeGet(); @@ -599,7 +612,7 @@ std::optional buildAdditionalFiltersIfNeeded(const StoragePtr & s (table == storage_id.getFullNameNotQuoted())) { ParserExpression parser; - additional_filter_ast = parseQuery( + table_expression_query_info.additional_filter_ast = parseQuery( parser, filter.data(), filter.data() + filter.size(), @@ -607,15 +620,30 @@ std::optional buildAdditionalFiltersIfNeeded(const StoragePtr & s settings[Setting::max_query_size], settings[Setting::max_parser_depth], settings[Setting::max_parser_backtracks]); - break; + return; } } +} +/// Apply filters from additional_table_filters setting. Expects +/// `parseAdditionalFilterAstIfNeeded` to have been called earlier so +/// `table_expression_query_info.additional_filter_ast` is populated. +std::optional buildAdditionalFiltersIfNeeded( + SelectQueryInfo & table_expression_query_info, + const PrewhereInfoPtr & prewhere_info, + PlannerContextPtr & planner_context) +{ + const auto & additional_filter_ast = table_expression_query_info.additional_filter_ast; if (!additional_filter_ast) return {}; - table_expression_query_info.additional_filter_ast = additional_filter_ast; - return buildFilterInfo(additional_filter_ast, table_expression_query_info.table_expression, planner_context); + auto filter_info = buildFilterInfo(additional_filter_ast, table_expression_query_info.table_expression, planner_context); + if (prewhere_info) + { + for (const auto * input : filter_info.actions.getInputs()) + prewhere_info->prewhere_actions.tryRestoreColumn(input->result_name); + } + return filter_info; } UInt64 mainQueryNodeBlockSizeByLimit(const SelectQueryInfo & select_query_info) @@ -747,6 +775,15 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres if (const auto & filter_actions = table_expression_data.getFilterActions()) table_expression_query_info.filter_actions_dag = std::make_shared(filter_actions->clone()); + /// Parse additional_table_filters early so that later decisions (trivial-count, + /// trivial-limit) can see `additional_filter_ast` before the actual filter DAG + /// is built further down + /// + /// Skip under `only_analyze`, since we may not have the database in case of Distributed. + if (!select_query_options.only_analyze) + parseAdditionalFilterAstIfNeeded( + storage, table_expression->getOriginalAlias(), table_expression_query_info, query_context); + size_t max_streams = settings[Setting::max_threads]; size_t max_threads_execute_query = settings[Setting::max_threads]; @@ -771,14 +808,20 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres UInt64 max_block_size = settings[Setting::max_block_size]; UInt64 max_block_size_limited = 0; - if (is_single_table_expression) + if (is_single_table_expression && !select_query_options.only_analyze) { /** If not specified DISTINCT, WHERE, GROUP BY, HAVING, ORDER BY, JOIN, LIMIT BY, LIMIT WITH TIES * but LIMIT is specified, and limit + offset < max_block_size, * then as the block size we will use limit + offset (not to read more from the table than requested), * and also set the number of threads to 1. */ - max_block_size_limited = mainQueryNodeBlockSizeByLimit(select_query_info); + /// Use the same effective-filter checks as the row-policy / additional-filter + /// planning further down: the trivial-LIMIT optimization must be disabled + /// whenever those filters actually apply, so the flags must agree. + bool has_additional_filters = !!table_expression_query_info.additional_filter_ast + || !!getEffectiveRowPolicyFilter(storage, query_context); + if (!has_additional_filters) + max_block_size_limited = mainQueryNodeBlockSizeByLimit(select_query_info); if (max_block_size_limited) { if (max_block_size_limited < max_block_size) @@ -851,7 +894,7 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres /// Apply trivial_count optimization if possible bool is_trivial_count_applied = !select_query_options.only_analyze && !select_query_options.build_logical_plan && is_single_table_expression - && (table_node || table_function_node) && select_query_info.has_aggregates && settings[Setting::additional_table_filters].value.empty() + && (table_node || table_function_node) && select_query_info.has_aggregates && applyTrivialCountIfPossible( query_plan, table_expression_query_info, @@ -877,11 +920,49 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres if (prewhere_actions && select_query_options.build_logical_plan) { + /// Collect columns needed by row policy and additional filters + NameSet columns_needed_by_other_filters; + + /// Pre-build additional table filter to know what columns it needs + auto additional_filters_info_temp = buildAdditionalFiltersIfNeeded( + table_expression_query_info, prewhere_info, planner_context); + if (additional_filters_info_temp) + { + for (const auto * input : additional_filters_info_temp->actions.getInputs()) + columns_needed_by_other_filters.insert(input->result_name); + } + + /// Clone prewhere actions and add required columns to outputs + auto prewhere_actions_clone = prewhere_actions->clone(); + const auto prewhere_column_name = prewhere_actions_clone.getOutputs().at(0)->result_name; + + /// Add columns needed by other filters to prewhere outputs + auto & prewhere_outputs = prewhere_actions_clone.getOutputs(); + + /// Build set of existing outputs for fast lookup + std::unordered_set existing_outputs( + prewhere_outputs.begin(), prewhere_outputs.end()); + + /// Iterate inputs in deterministic order and add missing nodes + for (const auto * input : prewhere_actions_clone.getInputs()) + { + if (columns_needed_by_other_filters.contains(input->result_name) + && !existing_outputs.contains(input)) + { + prewhere_outputs.push_back(input); + } + } + + /// Check if prewhere filter column should be removed + const bool keep_for_query = std::ranges::contains(columns_names, prewhere_column_name); + const bool keep_for_filters = columns_needed_by_other_filters.contains(prewhere_column_name); + const bool remove_prewhere_column = !keep_for_query && !keep_for_filters; + where_filters.emplace_back( FilterDAGInfo{ - prewhere_actions->clone(), - prewhere_actions->getOutputs().at(0)->result_name, - true}, + std::move(prewhere_actions_clone), + prewhere_column_name, + remove_prewhere_column}, "Prewhere"); } else if (prewhere_actions) @@ -964,8 +1045,7 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres } } - const auto & table_expression_alias = table_expression->getOriginalAlias(); - if (auto additional_filters_info = buildAdditionalFiltersIfNeeded(storage, table_expression_alias, table_expression_query_info, planner_context)) + if (auto additional_filters_info = buildAdditionalFiltersIfNeeded(table_expression_query_info, prewhere_info, planner_context)) { appendSetsFromActionsDAG(additional_filters_info->actions, useful_sets); add_filter(*additional_filters_info, "additional filter"); diff --git a/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference new file mode 100644 index 000000000000..ac70543519a7 --- /dev/null +++ b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference @@ -0,0 +1,22 @@ +no_row_policy + (Limit) + Limit + (ReadFromMergeTree) + Concat 4 → 1 + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) × 4 0 → 1 +row_policy + (Limit) + Limit 4 → 4 + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPool, algorithm: Thread) × 4 0 → 1 +row_policy_always_true + (Limit) + Limit + (ReadFromMergeTree) + Concat 4 → 1 + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) × 4 0 → 1 +additional_filter + (Limit) + Limit 4 → 4 + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPool, algorithm: Thread) × 4 0 → 1 diff --git a/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.sql b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.sql new file mode 100644 index 000000000000..1e139e4d9202 --- /dev/null +++ b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.sql @@ -0,0 +1,65 @@ +-- Tags: no-parallel-replicas, no-object-storage +-- -no-parallel-replicas - PR changes the EXPLAIN output +-- -no-object-storage - parts on remote FS use MergeTreeSelect(pool: ReadPool) over MergeTreeSelect(pool: ReadPoolInOrder) + +-- The trivial LIMIT optimization reduces max_streams to 1 for simple +-- SELECT ... LIMIT N queries without WHERE. When row policies or +-- additional table filters are active the optimization must not fire +-- because the filter still needs multi-threaded index analysis. + +SET merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_injection_probability=0; + +DROP TABLE IF EXISTS t_row_policy_limit; +CREATE TABLE t_row_policy_limit (id UInt64) ENGINE = MergeTree ORDER BY id +SETTINGS index_granularity = 128; + +SYSTEM STOP MERGES t_row_policy_limit; + +-- Create enough parts so multiple streams are meaningful. +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; +INSERT INTO t_row_policy_limit SELECT number FROM numbers(1000) SETTINGS insert_deduplicate=1; + +SET enable_analyzer = 1; + +-- Case 0: no row policies +SELECT 'no_row_policy'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; + +-- Case 1: row policy prevents trivial-limit, keeps multiple streams. +DROP ROW POLICY IF EXISTS 04099_p1 ON t_row_policy_limit; +CREATE ROW POLICY 04099_p1 ON t_row_policy_limit USING id < 500 AS permissive TO ALL; + +SELECT 'row_policy'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; +DROP ROW POLICY 04099_p1 ON t_row_policy_limit; + +-- Case 2: always-true row policy adds no effective predicate, so the +-- trivial-limit optimization must still fire (max_streams = 1). +DROP ROW POLICY IF EXISTS 04099_p_true ON t_row_policy_limit; +CREATE ROW POLICY 04099_p_true ON t_row_policy_limit USING 1 AS permissive TO ALL; + +SELECT 'row_policy_always_true'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; + +DROP ROW POLICY 04099_p_true ON t_row_policy_limit; + +-- Case 3: additional_table_filters prevents trivial-limit. +SELECT 'additional_filter'; +SELECT * +FROM (EXPLAIN PIPELINE SELECT id FROM t_row_policy_limit LIMIT 1 + SETTINGS max_threads = 4, + additional_table_filters = {'t_row_policy_limit': 'id < 500'}) +WHERE explain LIKE '%Limit%' OR explain LIKE '%Concat%' OR explain LIKE '%ReadFromMergeTree%' OR explain LIKE '%MergeTreeSelect%'; + +DROP TABLE t_row_policy_limit; diff --git a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference new file mode 100644 index 000000000000..b143e75ed95b --- /dev/null +++ b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference @@ -0,0 +1,9 @@ +baseline + (ReadFromPreparedSource) + SourceFromSingleChunk 0 → 1 +filtered_this_table + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) 0 → 1 +filter_other_table + (ReadFromPreparedSource) + SourceFromSingleChunk 0 → 1 diff --git a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.sql b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.sql new file mode 100644 index 000000000000..8dceed682f8d --- /dev/null +++ b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.sql @@ -0,0 +1,48 @@ +-- Tags: no-object-storage +-- no-object-storage since the output of the pipeline depends on the read method. + +-- Verify that the trivial-count optimization correctly handles +-- `additional_table_filters`: +-- - DISABLED when the setting targets THIS table. +-- - STILL FIRES when the setting targets a different table only +-- (previously the pessimistic outer guard disabled the optimization +-- whenever any entry was present, regardless of the table). +-- +-- The fix moved `parseAdditionalFilterAstIfNeeded` earlier in +-- PlannerJoinTree so `applyTrivialCountIfPossible` sees the +-- already-matched per-table AST. +-- +-- Trivial-count signature in the pipeline: +-- (ReadFromPreparedSource) / SourceFromSingleChunk -> fired +-- (ReadFromMergeTree) / MergeTreeSelect -> did not fire + +DROP TABLE IF EXISTS t_trivial_count_filter; +CREATE TABLE t_trivial_count_filter (id UInt64) ENGINE = MergeTree ORDER BY id; +INSERT INTO t_trivial_count_filter SELECT number FROM numbers(100); + +SET enable_analyzer = 1; +SET optimize_trivial_count_query = 1; + +-- Baseline: no filter at all, trivial-count fires. +SELECT 'baseline'; +SELECT explain FROM (EXPLAIN PIPELINE SELECT count() FROM t_trivial_count_filter) +WHERE explain LIKE '%ReadFromPreparedSource%' OR explain LIKE '%ReadFromMergeTree%' + OR explain LIKE '%SourceFromSingleChunk%' OR explain LIKE '%MergeTreeSelect%'; + +-- Filter targets THIS table: trivial-count is disabled. +SELECT 'filtered_this_table'; +SELECT explain FROM (EXPLAIN PIPELINE SELECT count() FROM t_trivial_count_filter) +WHERE explain LIKE '%ReadFromPreparedSource%' OR explain LIKE '%ReadFromMergeTree%' + OR explain LIKE '%SourceFromSingleChunk%' OR explain LIKE '%MergeTreeSelect%' +SETTINGS additional_table_filters = {'t_trivial_count_filter': 'id < 5'}; + +-- Filter targets a DIFFERENT table only: trivial-count must still fire. +-- Without the fix the optimization was disabled whenever any +-- additional_table_filters entry was present. +SELECT 'filter_other_table'; +SELECT explain FROM (EXPLAIN PIPELINE SELECT count() FROM t_trivial_count_filter) +WHERE explain LIKE '%ReadFromPreparedSource%' OR explain LIKE '%ReadFromMergeTree%' + OR explain LIKE '%SourceFromSingleChunk%' OR explain LIKE '%MergeTreeSelect%' +SETTINGS additional_table_filters = {'some_other_table': 'id < 5'}; + +DROP TABLE t_trivial_count_filter; From 64d8b8e86620335a2866baf5cbcdbbb1be3a90ac Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 6 May 2026 09:04:51 +0000 Subject: [PATCH 10/91] Backport #104141 to 25.8: Fix write out of bounds in quantileTiming deserialization --- src/AggregateFunctions/QuantileTiming.h | 2 + ...ntile_timing_deserialization_bug.reference | 0 ...12_quantile_timing_deserialization_bug.sql | 209 ++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.reference create mode 100644 tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.sql diff --git a/src/AggregateFunctions/QuantileTiming.h b/src/AggregateFunctions/QuantileTiming.h index b2758890022f..d0e334a5c786 100644 --- a/src/AggregateFunctions/QuantileTiming.h +++ b/src/AggregateFunctions/QuantileTiming.h @@ -391,6 +391,8 @@ namespace detail readBinaryLittleEndian(index, buf); if (index == BIG_THRESHOLD) break; + if (index - SMALL_THRESHOLD >= BIG_SIZE) + throw Exception(ErrorCodes::INCORRECT_DATA, "Incorrect index {} in 'large' kind of quantileTiming deserialization", index); UInt64 elem_count = 0; readBinaryLittleEndian(elem_count, buf); diff --git a/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.reference b/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.sql b/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.sql new file mode 100644 index 000000000000..c125347f7e99 --- /dev/null +++ b/tests/queries/0_stateless/03812_quantile_timing_deserialization_bug.sql @@ -0,0 +1,209 @@ + +SET max_query_size=1000000000; + +SELECT + quantileTimingMerge(qt), + sumMapMerge(sm) +FROM +( + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('033200000000000000770bbebafecaefbeadde7f0bbebafecaefbeadde870bbebafecaefbeadde8f0bbebafecaefbeadde970bbebafecaefbeadde9f0bbebafecaefbeaddea70bbebafecaefbeaddeaf0bbebafecaefbeaddeb70bbebafecaefbeaddebf0bbebafecaefbeaddec70bbebafecaefbeaddecf0bbebafecaefbeadded70bbebafecaefbeaddedf0bbebafecaefbeaddee70bbebafecaefbeaddeef0bbebafecaefbeaddef70bbebafecaefbeaddeff0bbebafecaefbeadde070cbebafecaefbeadde0f0cbebafecaefbeadde170cbebafecaefbeadde1f0cbebafecaefbeadde270cbebafecaefbeadde2f0cbebafecaefbeadde370cbebafecaefbeadde3f0cbebafecaefbeadde470cbebafecaefbeadde4f0cbebafecaefbeadde570cbebafecaefbeadde5f0cbebafecaefbeadde670cbebafecaefbeadde6f0cbebafecaefbeadde770cbebafecaefbeadde7f0cbebafecaefbeadde870cbebafecaefbeadde8f0cbebafecaefbeadde970cbebafecaefbeadde9f0cbebafecaefbeaddea70cbebafecaefbeaddeaf0cbebafecaefbeaddeb70cbebafecaefbeaddebf0cbebafecaefbeaddec70cbebafecaefbeaddecf0cbebafecaefbeadded70cbebafecaefbeaddedf0cbebafecaefbeaddee70cbebafecaefbeaddeef0cbebafecaefbeaddef70cbebafecaefbeaddeff0cbebafecaefbeadde3075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm + UNION ALL + SELECT + materialize(CAST(unhex('0300000000000000003075'), 'AggregateFunction(quantileTiming, UInt64)')) AS qt, + materialize(CAST(unhex('f4010000000000000000000000100000000000000100000001100000000000000200000002100000000000000300000003100000000000000400000004100000000000000500000005100000000000000600000006100000000000000700000007100000000000000800000008100000000000000900000009100000000000000a0000000a100000000000000b0000000b100000000000000c0000000c100000000000000d0000000d100000000000000e0000000e100000000000000f0000000f100000000000001000000010100000000000001100000011100000000000001200000012100000000000001300000013100000000000001400000014100000000000001500000015100000000000001600000016100000000000001700000017100000000000001800000018100000000000001900000019100000000000001a0000001a100000000000001b0000001b100000000000001c0000001c100000000000001d0000001d100000000000001e0000001e100000000000001f0000001f100000000000002000000020100000000000002100000021100000000000002200000022100000000000002300000023100000000000002400000024100000000000002500000025100000000000002600000026100000000000002700000027100000000000002800000028100000000000002900000029100000000000002a0000002a100000000000002b0000002b100000000000002c0000002c100000000000002d0000002d100000000000002e0000002e100000000000002f0000002f100000000000003000000030100000000000003100000031100000000000003200000032100000000000003300000033100000000000003400000034100000000000003500000035100000000000003600000036100000000000003700000037100000000000003800000038100000000000003900000039100000000000003a0000003a100000000000003b0000003b100000000000003c0000003c100000000000003d0000003d100000000000003e0000003e100000000000003f0000003f100000000000004000000040100000000000004100000041100000000000004200000042100000000000004300000043100000000000004400000044100000000000004500000045100000000000004600000046100000000000004700000047100000000000004800000048100000000000004900000049100000000000004a0000004a100000000000004b0000004b100000000000004c0000004c100000000000004d0000004d100000000000004e0000004e100000000000004f0000004f100000000000005000000050100000000000005100000051100000000000005200000052100000000000005300000053100000000000005400000054100000000000005500000055100000000000005600000056100000000000005700000057100000000000005800000058100000000000005900000059100000000000005a0000005a100000000000005b0000005b100000000000005c0000005c100000000000005d0000005d100000000000005e0000005e100000000000005f0000005f100000000000006000000060100000000000006100000061100000000000006200000062100000000000006300000063100000000000006400000064100000000000006500000065100000000000006600000066100000000000006700000067100000000000006800000068100000000000006900000069100000000000006a0000006a100000000000006b0000006b100000000000006c0000006c100000000000006d0000006d100000000000006e0000006e100000000000006f0000006f100000000000007000000070100000000000007100000071100000000000007200000072100000000000007300000073100000000000007400000074100000000000007500000075100000000000007600000076100000000000007700000077100000000000007800000078100000000000007900000079100000000000007a0000007a100000000000007b0000007b100000000000007c0000007c100000000000007d0000007d100000000000007e0000007e100000000000007f0000007f100000000000008000000080100000000000008100000081100000000000008200000082100000000000008300000083100000000000008400000084100000000000008500000085100000000000008600000086100000000000008700000087100000000000008800000088100000000000008900000089100000000000008a0000008a100000000000008b0000008b100000000000008c0000008c100000000000008d0000008d100000000000008e0000008e100000000000008f0000008f100000000000009000000090100000000000009100000091100000000000009200000092100000000000009300000093100000000000009400000094100000000000009500000095100000000000009600000096100000000000009700000097100000000000009800000098100000000000009900000099100000000000009a0000009a100000000000009b0000009b100000000000009c0000009c100000000000009d0000009d100000000000009e0000009e100000000000009f0000009f10000000000000a0000000a010000000000000a1000000a110000000000000a2000000a210000000000000a3000000a310000000000000a4000000a410000000000000a5000000a510000000000000a6000000a610000000000000a7000000a710000000000000a8000000a810000000000000a9000000a910000000000000aa000000aa10000000000000ab000000ab10000000000000ac000000ac10000000000000ad000000ad10000000000000ae000000ae10000000000000af000000af10000000000000b0000000b010000000000000b1000000b110000000000000b2000000b210000000000000b3000000b310000000000000b4000000b410000000000000b5000000b510000000000000b6000000b610000000000000b7000000b710000000000000b8000000b810000000000000b9000000b910000000000000ba000000ba10000000000000bb000000bb10000000000000bc000000bc10000000000000bd000000bd10000000000000be000000be10000000000000bf000000bf10000000000000c0000000c010000000000000c1000000c110000000000000c2000000c210000000000000c3000000c310000000000000c4000000c410000000000000c5000000c510000000000000c6000000c610000000000000c7000000c710000000000000c8000000c810000000000000c9000000c910000000000000ca000000ca10000000000000cb000000cb10000000000000cc000000cc10000000000000cd000000cd10000000000000ce000000ce10000000000000cf000000cf10000000000000d0000000d010000000000000d1000000d110000000000000d2000000d210000000000000d3000000d310000000000000d4000000d410000000000000d5000000d510000000000000d6000000d610000000000000d7000000d710000000000000d8000000d810000000000000d9000000d910000000000000da000000da10000000000000db000000db10000000000000dc000000dc10000000000000dd000000dd10000000000000de000000de10000000000000df000000df10000000000000e0000000e010000000000000e1000000e110000000000000e2000000e210000000000000e3000000e310000000000000e4000000e410000000000000e5000000e510000000000000e6000000e610000000000000e7000000e710000000000000e8000000e810000000000000e9000000e910000000000000ea000000ea10000000000000eb000000eb10000000000000ec000000ec10000000000000ed000000ed10000000000000ee000000ee10000000000000ef000000ef10000000000000f0000000f010000000000000f1000000f110000000000000f2000000f210000000000000f3000000f310000000000000f4000000f410000000000000f5000000f510000000000000f6000000f610000000000000f7000000f710000000000000f8000000f810000000000000f9000000f910000000000000fa000000fa10000000000000fb000000fb10000000000000fc000000fc10000000000000fd000000fd10000000000000fe000000fe10000000000000ff000000ff100000000000000001000000110000000000000101000001110000000000000201000002110000000000000301000003110000000000000401000004110000000000000501000005110000000000000601000006110000000000000701000007110000000000000801000008110000000000000901000009110000000000000a0100000a110000000000000b0100000b110000000000000c0100000c110000000000000d0100000d110000000000000e0100000e110000000000000f0100000f110000000000001001000010110000000000001101000011110000000000001201000012110000000000001301000013110000000000001401000014110000000000001501000015110000000000001601000016110000000000001701000017110000000000001801000018110000000000001901000019110000000000001a0100001a110000000000001b0100001b110000000000001c0100001c110000000000001d0100001d110000000000001e0100001e110000000000001f0100001f110000000000002001000020110000000000002101000021110000000000002201000022110000000000002301000023110000000000002401000024110000000000002501000025110000000000002601000026110000000000002701000027110000000000002801000028110000000000002901000029110000000000002a0100002a110000000000002b0100002b110000000000002c0100002c110000000000002d0100002d110000000000002e0100002e110000000000002f0100002f110000000000003001000030110000000000003101000031110000000000003201000032110000000000003301000033110000000000003401000034110000000000003501000035110000000000003601000036110000000000003701000037110000000000003801000038110000000000003901000039110000000000003a0100003a110000000000003b0100003b110000000000003c0100003c110000000000003d0100003d110000000000003e0100003e110000000000003f0100003f110000000000004001000040110000000000004101000041110000000000004201000042110000000000004301000043110000000000004401000044110000000000004501000045110000000000004601000046110000000000004701000047110000000000004801000048110000000000004901000049110000000000004a0100004a110000000000004b0100004b110000000000004c0100004c110000000000004d0100004d110000000000004e0100004e110000000000004f0100004f110000000000005001000050110000000000005101000051110000000000005201000052110000000000005301000053110000000000005401000054110000000000005501000055110000000000005601000056110000000000005701000057110000000000005801000058110000000000005901000059110000000000005a0100005a110000000000005b0100005b110000000000005c0100005c110000000000005d0100005d110000000000005e0100005e110000000000005f0100005f110000000000006001000060110000000000006101000061110000000000006201000062110000000000006301000063110000000000006401000064110000000000006501000065110000000000006601000066110000000000006701000067110000000000006801000068110000000000006901000069110000000000006a0100006a110000000000006b0100006b110000000000006c0100006c110000000000006d0100006d110000000000006e0100006e110000000000006f0100006f110000000000007001000070110000000000007101000071110000000000007201000072110000000000007301000073110000000000007401000074110000000000007501000075110000000000007601000076110000000000007701000077110000000000007801000078110000000000007901000079110000000000007a0100007a110000000000007b0100007b110000000000007c0100007c110000000000007d0100007d110000000000007e0100007e110000000000007f0100007f110000000000008001000080110000000000008101000081110000000000008201000082110000000000008301000083110000000000008401000084110000000000008501000085110000000000008601000086110000000000008701000087110000000000008801000088110000000000008901000089110000000000008a0100008a110000000000008b0100008b110000000000008c0100008c110000000000008d0100008d110000000000008e0100008e110000000000008f0100008f110000000000009001000090110000000000009101000091110000000000009201000092110000000000009301000093110000000000009401000094110000000000009501000095110000000000009601000096110000000000009701000097110000000000009801000098110000000000009901000099110000000000009a0100009a110000000000009b0100009b110000000000009c0100009c110000000000009d0100009d110000000000009e0100009e110000000000009f0100009f11000000000000a0010000a011000000000000a1010000a111000000000000a2010000a211000000000000a3010000a311000000000000a4010000a411000000000000a5010000a511000000000000a6010000a611000000000000a7010000a711000000000000a8010000a811000000000000a9010000a911000000000000aa010000aa11000000000000ab010000ab11000000000000ac010000ac11000000000000ad010000ad11000000000000ae010000ae11000000000000af010000af11000000000000b0010000b011000000000000b1010000b111000000000000b2010000b211000000000000b3010000b311000000000000b4010000b411000000000000b5010000b511000000000000b6010000b611000000000000b7010000b711000000000000b8010000b811000000000000b9010000b911000000000000ba010000ba11000000000000bb010000bb11000000000000bc010000bc11000000000000bd010000bd11000000000000be010000be11000000000000bf010000bf11000000000000c0010000c011000000000000c1010000c111000000000000c2010000c211000000000000c3010000c311000000000000c4010000c411000000000000c5010000c511000000000000c6010000c611000000000000c7010000c711000000000000c8010000c811000000000000c9010000c911000000000000ca010000ca11000000000000cb010000cb11000000000000cc010000cc11000000000000cd010000cd11000000000000ce010000ce11000000000000cf010000cf11000000000000d0010000d011000000000000d1010000d111000000000000d2010000d211000000000000d3010000d311000000000000d4010000d411000000000000d5010000d511000000000000d6010000d611000000000000d7010000d711000000000000d8010000d811000000000000d9010000d911000000000000da010000da11000000000000db010000db11000000000000dc010000dc11000000000000dd010000dd11000000000000de010000de11000000000000df010000df11000000000000e0010000e011000000000000e1010000e111000000000000e2010000e211000000000000e3010000e311000000000000e4010000e411000000000000e5010000e511000000000000e6010000e611000000000000e7010000e711000000000000e8010000e811000000000000e9010000e911000000000000ea010000ea11000000000000eb010000eb11000000000000ec010000ec11000000000000ed010000ed11000000000000ee010000ee11000000000000ef010000ef11000000000000f0010000f011000000000000f1010000f111000000000000f2010000f211000000000000f3010000f311000000000000'), 'AggregateFunction(sumMap, Map(Int32, Int64))')) AS sm +) +SETTINGS max_threads = 1 -- { serverError INCORRECT_DATA }; \ No newline at end of file From 1432515c5b414d8d84bbccf2e5a16f2350bd1790 Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Wed, 6 May 2026 11:56:57 +0200 Subject: [PATCH 11/91] Fix reference --- .../04099_row_policy_trivial_limit_threads.reference | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference index ac70543519a7..e6482e7b382f 100644 --- a/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference +++ b/tests/queries/0_stateless/04099_row_policy_trivial_limit_threads.reference @@ -18,5 +18,5 @@ row_policy_always_true additional_filter (Limit) Limit 4 → 4 - (ReadFromMergeTree) - MergeTreeSelect(pool: ReadPool, algorithm: Thread) × 4 0 → 1 + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPool, algorithm: Thread) × 4 0 → 1 From a43852570dee38902c895e1bb7ec04a4aff035be Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 6 May 2026 10:56:22 +0000 Subject: [PATCH 12/91] Backport #102961 to 25.8: Use max_insert_threads for plain INSERTs without materialized views --- src/Interpreters/InterpreterInsertQuery.cpp | 6 +- ...2_insert_threads_eagerly_spawned.reference | 4 + .../04102_insert_threads_eagerly_spawned.sh | 80 +++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.reference create mode 100755 tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.sh diff --git a/src/Interpreters/InterpreterInsertQuery.cpp b/src/Interpreters/InterpreterInsertQuery.cpp index 0d59042499d2..78053834bd5f 100644 --- a/src/Interpreters/InterpreterInsertQuery.cpp +++ b/src/Interpreters/InterpreterInsertQuery.cpp @@ -727,7 +727,11 @@ QueryPipeline InterpreterInsertQuery::buildInsertPipeline(ASTInsertQuery & query QueryPipeline pipeline = QueryPipeline(std::move(chain)); - pipeline.setNumThreads(max_threads); + /// When materialized views are attached, their inner SELECT queries benefit + /// from full parallelism, so we use max_threads. Without MVs the insert + /// pipeline is 1-wide and requesting max_threads would only waste + /// ConcurrencyControl slots and spawn unnecessary threads (see #102947). + pipeline.setNumThreads(insert_dependencies->isViewsInvolved() ? max_threads : max_insert_threads); pipeline.setConcurrencyControl(settings[Setting::use_concurrency_control]); if (query.hasInlinedData() && !async_insert) diff --git a/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.reference b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.reference new file mode 100644 index 000000000000..f10182ea5bce --- /dev/null +++ b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.reference @@ -0,0 +1,4 @@ +=== Plain INSERT without MVs === +FEW THREADS +=== Plain INSERT with MV === +MORE THAN 1 THREAD diff --git a/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.sh b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.sh new file mode 100755 index 000000000000..6f3c71bd9bff --- /dev/null +++ b/tests/queries/0_stateless/04102_insert_threads_eagerly_spawned.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# Tags: no-parallel, no-replicated-database, no-async-insert, no-parallel-replicas, no-s3-storage +# no-parallel: checks thread count, which can be affected by concurrent queries +# no-replicated-database: query_log lookup assumes single-node execution +# no-async-insert: test measures synchronous INSERT pipeline threading +# no-parallel-replicas: parallel replicas settings alter query execution plans and thread allocation +# no-s3-storage: S3 I/O threads inflate peak_threads_usage beyond the pipeline thread count + +# Verifies that a plain INSERT (no SELECT, no MVs) does not request +# excessive ConcurrencyControl slots or spawn unnecessary threads. +# Regression test for https://github.com/ClickHouse/ClickHouse/issues/102947 + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +$CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS test_insert_threads" +$CLICKHOUSE_CLIENT -q "DROP TABLE IF EXISTS test_insert_threads_mv" +$CLICKHOUSE_CLIENT -q "CREATE TABLE test_insert_threads (x UInt64) ENGINE = MergeTree ORDER BY x" + +# Test 1: Plain INSERT FORMAT TSV with max_threads=16, no MVs. +# The insert pipeline is a single chain — should use max_insert_threads (1). +echo "=== Plain INSERT without MVs ===" +QUERY_ID1="04102_no_mv_$RANDOM" + +$CLICKHOUSE_CLIENT -q "SELECT number FROM numbers(10000) FORMAT TSV" | \ +$CLICKHOUSE_CLIENT \ + --query_id="$QUERY_ID1" \ + --max_threads=16 \ + --max_insert_threads=1 \ + --input_format_parallel_parsing=0 \ + --log_queries=1 \ + -q "INSERT INTO test_insert_threads FORMAT TSV" + +$CLICKHOUSE_CLIENT -q "SYSTEM FLUSH LOGS query_log" + +$CLICKHOUSE_CLIENT -q " + SELECT + if(peak_threads_usage <= 4, 'FEW THREADS', 'MANY THREADS SPAWNED') + FROM system.query_log + WHERE event_date >= yesterday() + AND event_time >= now() - 600 + AND current_database = currentDatabase() + AND type = 'QueryFinish' + AND query_id = '$QUERY_ID1' + SETTINGS optimize_if_transform_strings_to_enum = 0 +" + +# Test 2: INSERT with a materialized view — should use more threads. +echo "=== Plain INSERT with MV ===" +$CLICKHOUSE_CLIENT -q "CREATE MATERIALIZED VIEW test_insert_threads_mv ENGINE = MergeTree ORDER BY x AS SELECT x FROM test_insert_threads" + +QUERY_ID2="04102_with_mv_$RANDOM" + +$CLICKHOUSE_CLIENT -q "SELECT number FROM numbers(10000) FORMAT TSV" | \ +$CLICKHOUSE_CLIENT \ + --query_id="$QUERY_ID2" \ + --max_threads=16 \ + --max_insert_threads=1 \ + --input_format_parallel_parsing=0 \ + --log_queries=1 \ + -q "INSERT INTO test_insert_threads FORMAT TSV" + +$CLICKHOUSE_CLIENT -q "SYSTEM FLUSH LOGS query_log" + +# With MVs, peak_threads should be higher than without MVs +$CLICKHOUSE_CLIENT -q " + SELECT + if(peak_threads_usage > 1, 'MORE THAN 1 THREAD', 'SINGLE THREAD') + FROM system.query_log + WHERE event_date >= yesterday() + AND event_time >= now() - 600 + AND current_database = currentDatabase() + AND type = 'QueryFinish' + AND query_id = '$QUERY_ID2' + SETTINGS optimize_if_transform_strings_to_enum = 0 +" + +$CLICKHOUSE_CLIENT -q "DROP TABLE test_insert_threads_mv" +$CLICKHOUSE_CLIENT -q "DROP TABLE test_insert_threads" From 37e92a0a4e7201b8488daa8aaca00d8888667c2c Mon Sep 17 00:00:00 2001 From: Azat Khuzhin Date: Wed, 6 May 2026 14:47:24 +0200 Subject: [PATCH 13/91] Update tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference --- .../04201_trivial_count_with_additional_filter.reference | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference index b143e75ed95b..41e65d960eda 100644 --- a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference +++ b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference @@ -2,8 +2,8 @@ baseline (ReadFromPreparedSource) SourceFromSingleChunk 0 → 1 filtered_this_table - (ReadFromMergeTree) - MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) 0 → 1 + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) 0 → 1 filter_other_table (ReadFromPreparedSource) SourceFromSingleChunk 0 → 1 From 7af0fafc05d879efcb114d87df0c6ff1ab14f52c Mon Sep 17 00:00:00 2001 From: robot-ch-test-poll3 <69307580+robot-ch-test-poll3@users.noreply.github.com> Date: Thu, 7 May 2026 07:20:35 +0700 Subject: [PATCH 14/91] Backport #104063 to 25.8: Bypass index uncompressed cache when its size is zero (#104164) * Backport #104063 to 25.8: Bypass index uncompressed cache when its size is zero * Add reload_before/reload_after to with_replace_config Cherry-picked from b5149576b260 (the cluster.py portion). The whitespace-only KEEPER_PUBLISH_CLIENT hunk was skipped because that code does not exist on this branch. Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: robot-clickhouse Co-authored-by: Michael Kolupaev Co-authored-by: Claude Opus 4.7 (1M context) --- src/Core/ServerSettings.cpp | 2 +- src/Interpreters/Context.cpp | 7 +- src/Interpreters/Context.h | 2 +- tests/integration/helpers/cluster.py | 6 +- .../__init__.py | 0 .../configs/cache_size.xml | 3 + .../test.py | 113 ++++++++++++++++++ 7 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 tests/integration/test_index_uncompressed_cache_zero_size/__init__.py create mode 100644 tests/integration/test_index_uncompressed_cache_zero_size/configs/cache_size.xml create mode 100644 tests/integration/test_index_uncompressed_cache_zero_size/test.py diff --git a/src/Core/ServerSettings.cpp b/src/Core/ServerSettings.cpp index b18b920e8fa8..063f1bf8d01e 100644 --- a/src/Core/ServerSettings.cpp +++ b/src/Core/ServerSettings.cpp @@ -1283,7 +1283,7 @@ void ServerSettings::dumpToSystemServerSettingsColumns(ServerSettingColumnsParam {"mark_cache_size", {std::to_string(context->getMarkCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"uncompressed_cache_size", {std::to_string(context->getUncompressedCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"index_mark_cache_size", {std::to_string(context->getIndexMarkCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, - {"index_uncompressed_cache_size", {std::to_string(context->getIndexUncompressedCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, + {"index_uncompressed_cache_size", {std::to_string(context->getIndexUncompressedCache(/*only_if_enabled=*/ false)->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"mmap_cache_size", {std::to_string(context->getMMappedFileCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, {"query_condition_cache_size", {std::to_string(context->getQueryConditionCache()->maxSizeInBytes()), ChangeableWithoutRestart::Yes}}, diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index b554e36fe257..33ea4b790ea0 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -513,6 +513,7 @@ struct ContextSharedPart : boost::noncopyable mutable OnceFlag build_vector_similarity_index_threadpool_initialized; mutable std::unique_ptr build_vector_similarity_index_threadpool; /// Threadpool for vector-similarity index creation. mutable UncompressedCachePtr index_uncompressed_cache TSA_GUARDED_BY(mutex); /// The cache of decompressed blocks for MergeTree indices. + mutable bool index_uncompressed_cache_enabled TSA_GUARDED_BY(mutex) = false; /// Whether index_uncompressed_cache should be used. mutable VectorSimilarityIndexCachePtr vector_similarity_index_cache TSA_GUARDED_BY(mutex); /// Cache of deserialized secondary index granules. mutable QueryConditionCachePtr query_condition_cache TSA_GUARDED_BY(mutex); /// Cache of matching marks for predicates mutable QueryResultCachePtr query_result_cache TSA_GUARDED_BY(mutex); /// Cache of query results. @@ -3700,6 +3701,7 @@ void Context::setIndexUncompressedCache(const String & cache_policy, size_t max_ throw Exception(ErrorCodes::LOGICAL_ERROR, "Index uncompressed cache has been already created."); shared->index_uncompressed_cache = std::make_shared(cache_policy, CurrentMetrics::IndexUncompressedCacheBytes, CurrentMetrics::IndexUncompressedCacheCells, max_size_in_bytes, size_ratio); + shared->index_uncompressed_cache_enabled = shared->index_uncompressed_cache->maxSizeInBytes() != 0; } void Context::updateIndexUncompressedCacheConfiguration(const Poco::Util::AbstractConfiguration & config) @@ -3711,11 +3713,14 @@ void Context::updateIndexUncompressedCacheConfiguration(const Poco::Util::Abstra size_t max_size_in_bytes = config.getUInt64("index_uncompressed_cache_size", DEFAULT_INDEX_UNCOMPRESSED_CACHE_MAX_SIZE); shared->index_uncompressed_cache->setMaxSizeInBytes(max_size_in_bytes); + shared->index_uncompressed_cache_enabled = shared->index_uncompressed_cache->maxSizeInBytes() != 0; } -UncompressedCachePtr Context::getIndexUncompressedCache() const +UncompressedCachePtr Context::getIndexUncompressedCache(bool only_if_enabled) const { SharedLockGuard lock(shared->mutex); + if (only_if_enabled && !shared->index_uncompressed_cache_enabled) + return nullptr; return shared->index_uncompressed_cache; } diff --git a/src/Interpreters/Context.h b/src/Interpreters/Context.h index 626705099e22..ba3f62f43fc0 100644 --- a/src/Interpreters/Context.h +++ b/src/Interpreters/Context.h @@ -1240,7 +1240,7 @@ class Context: public ContextData, public std::enable_shared_from_this void setIndexUncompressedCache(const String & cache_policy, size_t max_size_in_bytes, double size_ratio); void updateIndexUncompressedCacheConfiguration(const Poco::Util::AbstractConfiguration & config); - std::shared_ptr getIndexUncompressedCache() const; + std::shared_ptr getIndexUncompressedCache(bool only_if_enabled = true) const; void clearIndexUncompressedCache() const; void setIndexMarkCache(const String & cache_policy, size_t max_cache_size_in_bytes, double size_ratio); diff --git a/tests/integration/helpers/cluster.py b/tests/integration/helpers/cluster.py index e4e58fc10136..5faf06f8d4ec 100644 --- a/tests/integration/helpers/cluster.py +++ b/tests/integration/helpers/cluster.py @@ -5124,7 +5124,7 @@ def _create_odbc_config_file(self): f.write(key + "=" + value + "\n") @contextmanager - def with_replace_config(self, path, replacement): + def with_replace_config(self, path, replacement, reload_before=False, reload_after=False): """Create a copy of existing config (if exists) and revert on leaving the context""" _directory, filename = os.path.split(path) basename, extension = os.path.splitext(filename) @@ -5136,12 +5136,16 @@ def with_replace_config(self, path, replacement): self.exec_in_container( ["bash", "-c", "echo '{}' > {}".format(replacement, path)] ) + if reload_before: + self.query("SYSTEM RELOAD CONFIG") try: yield finally: self.exec_in_container( ["bash", "-c", f"test ! -f {backup_path} || mv {backup_path} {path}"] ) + if reload_after: + self.query("SYSTEM RELOAD CONFIG") def replace_config(self, path_to_config, replacement): self.exec_in_container( diff --git a/tests/integration/test_index_uncompressed_cache_zero_size/__init__.py b/tests/integration/test_index_uncompressed_cache_zero_size/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/integration/test_index_uncompressed_cache_zero_size/configs/cache_size.xml b/tests/integration/test_index_uncompressed_cache_zero_size/configs/cache_size.xml new file mode 100644 index 000000000000..e05fcc7bc958 --- /dev/null +++ b/tests/integration/test_index_uncompressed_cache_zero_size/configs/cache_size.xml @@ -0,0 +1,3 @@ + + 0 + diff --git a/tests/integration/test_index_uncompressed_cache_zero_size/test.py b/tests/integration/test_index_uncompressed_cache_zero_size/test.py new file mode 100644 index 000000000000..38d60148fb64 --- /dev/null +++ b/tests/integration/test_index_uncompressed_cache_zero_size/test.py @@ -0,0 +1,113 @@ +import pytest + +from helpers.cluster import ClickHouseCluster + +CACHE_CONFIG_PATH = "/etc/clickhouse-server/config.d/cache_size.xml" + +cluster = ClickHouseCluster(__file__) +node = cluster.add_instance( + "node", + main_configs=["configs/cache_size.xml"], + stay_alive=True, +) + + +@pytest.fixture(scope="module", autouse=True) +def start_cluster(): + try: + cluster.start() + node.query( + """ + CREATE TABLE t ( + id UInt64, + s String, + INDEX bf s TYPE bloom_filter GRANULARITY 1 + ) + ENGINE = MergeTree + ORDER BY id + SETTINGS index_granularity = 1024 + """ + ) + # A single part keeps the bloom-filter file deterministic across phases. + node.query( + "INSERT INTO t SELECT number, toString(number) FROM numbers(200000)" + ) + yield + finally: + cluster.shutdown() + + +def run_skip_index_query(query_id): + # Filtering on `s` forces the bloom_filter skip index to be loaded for every + # mark range, which is the path that exhibited the bug. + node.query( + "SELECT count() FROM t WHERE s = '12345'", + query_id=query_id, + settings={"use_skip_indexes": 1}, + ) + + +def get_cache_events(query_id): + node.query("SYSTEM FLUSH LOGS") + row = node.query( + f""" + SELECT + ProfileEvents['UncompressedCacheHits'], + ProfileEvents['UncompressedCacheMisses'], + ProfileEvents['UncompressedCacheWeightLost'] + FROM system.query_log + WHERE query_id = '{query_id}' AND type = 'QueryFinish' + FORMAT TSV + """ + ).strip() + assert row, f"No QueryFinish entry in system.query_log for query_id={query_id}" + hits, misses, weight_lost = row.split("\t") + return int(hits), int(misses), int(weight_lost) + + +def test_index_uncompressed_cache_runtime_toggle(): + # Phase 1: cache disabled (size=0 from initial config). The skip-index read + # path must bypass the cache entirely - no profile events should fire. + run_skip_index_query("phase1_disabled") + hits, misses, weight_lost = get_cache_events("phase1_disabled") + assert (hits, misses, weight_lost) == (0, 0, 0), ( + f"Expected zero index-uncompressed-cache events when the cache is " + f"disabled, got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) + + # Phase 2: enable the cache via runtime SYSTEM RELOAD CONFIG, verify that + # the cache is now actually used (misses on first query, hits on second). + with node.with_replace_config( + CACHE_CONFIG_PATH, + "10485760", + reload_before=True, + reload_after=True, + ): + node.query("SYSTEM DROP INDEX UNCOMPRESSED CACHE") + + run_skip_index_query("phase2_first") + hits, misses, weight_lost = get_cache_events("phase2_first") + assert misses > 0, ( + f"Expected misses with the cache enabled, " + f"got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) + assert hits == 0, ( + f"Expected no hits on the first query after dropping the cache, " + f"got hits={hits}" + ) + + run_skip_index_query("phase2_second") + hits, misses, weight_lost = get_cache_events("phase2_second") + assert hits > 0, ( + f"Expected hits on the repeated query, " + f"got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) + + # Phase 3: original config restored and reloaded by `reload_after=True`. + # Disabling the cache at runtime must again bypass it for new queries. + run_skip_index_query("phase3_redisabled") + hits, misses, weight_lost = get_cache_events("phase3_redisabled") + assert (hits, misses, weight_lost) == (0, 0, 0), ( + f"Expected zero index-uncompressed-cache events after re-disabling at " + f"runtime, got hits={hits}, misses={misses}, weight_lost={weight_lost}" + ) From f05c134d625d1a4e769c00aa23613a6c7be3b0c2 Mon Sep 17 00:00:00 2001 From: avogar Date: Mon, 11 May 2026 11:26:56 +0000 Subject: [PATCH 15/91] Backport fix for IPv6StringToNumOrDefault to 25.8 Fix `IPv6StringToNumOrDefault` not properly zeroing output bytes on parse failure. Only one byte was zeroed (`vec_res[i] = 0`) instead of all 16 bytes (`std::fill_n(&vec_res[out_offset], offset_inc, 0)`), causing stale data from previous successful parses to leak into default results. Backport of https://github.com/ClickHouse/ClickHouse/pull/93543 Co-Authored-By: Claude Opus 4.6 --- src/Functions/FunctionsCodingIP.h | 2 +- .../04202_ipv6_string_to_num_or_default_bug.reference | 2 ++ .../0_stateless/04202_ipv6_string_to_num_or_default_bug.sql | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.reference create mode 100644 tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.sql diff --git a/src/Functions/FunctionsCodingIP.h b/src/Functions/FunctionsCodingIP.h index 00b1deb1a3d5..9ec94dc2d628 100644 --- a/src/Functions/FunctionsCodingIP.h +++ b/src/Functions/FunctionsCodingIP.h @@ -180,7 +180,7 @@ namespace detail if constexpr (exception_mode == IPStringToNumExceptionMode::Throw) throw Exception(ErrorCodes::CANNOT_PARSE_IPV6, "Invalid IPv6 value"); else if constexpr (exception_mode == IPStringToNumExceptionMode::Default) - vec_res[i] = 0; + std::fill_n(&vec_res[out_offset], offset_inc, 0); else if constexpr (exception_mode == IPStringToNumExceptionMode::Null) (*vec_null_map_to)[i] = true; } diff --git a/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.reference b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.reference new file mode 100644 index 000000000000..0c8995e09979 --- /dev/null +++ b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.reference @@ -0,0 +1,2 @@ +:: 50 +::ffff:104.30.2.197 50 diff --git a/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.sql b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.sql new file mode 100644 index 000000000000..7b37931f50b3 --- /dev/null +++ b/tests/queries/0_stateless/04202_ipv6_string_to_num_or_default_bug.sql @@ -0,0 +1,6 @@ +-- Verify that IPv6StringToNumOrDefault properly zeroes all 16 bytes on failure. +-- Bug: only one byte was zeroed (vec_res[i] = 0 instead of filling all 16 bytes), +-- causing stale parse data to leak into "default" results. +-- https://github.com/ClickHouse/ClickHouse/pull/93543 + +SELECT IPv6NumToString(IPv6StringToNumOrDefault(if(number % 2 = 0, '::ffff:104.30.2.197', 'invalid'))) AS ip, count() AS c FROM numbers(100) GROUP BY ip ORDER BY ip; From 1896d6b2425e2a95e81cef4d6d510c563faa4d76 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 11 May 2026 17:07:56 +0000 Subject: [PATCH 16/91] Backport #103277 to 25.8: Fix data race in dictionaries --- .../ClickHouseDictionarySource.cpp | 6 ++--- src/Dictionaries/ClickHouseDictionarySource.h | 3 ++- src/Dictionaries/InvalidateQueryResponse.cpp | 21 ++++++++++++++++ src/Dictionaries/InvalidateQueryResponse.h | 24 +++++++++++++++++++ src/Dictionaries/MySQLDictionarySource.cpp | 6 +---- src/Dictionaries/MySQLDictionarySource.h | 3 ++- .../PostgreSQLDictionarySource.cpp | 4 +--- src/Dictionaries/PostgreSQLDictionarySource.h | 3 ++- src/Dictionaries/XDBCDictionarySource.cpp | 4 +--- src/Dictionaries/XDBCDictionarySource.h | 3 ++- 10 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 src/Dictionaries/InvalidateQueryResponse.cpp create mode 100644 src/Dictionaries/InvalidateQueryResponse.h diff --git a/src/Dictionaries/ClickHouseDictionarySource.cpp b/src/Dictionaries/ClickHouseDictionarySource.cpp index ebdddbf62ab9..b1b11076438c 100644 --- a/src/Dictionaries/ClickHouseDictionarySource.cpp +++ b/src/Dictionaries/ClickHouseDictionarySource.cpp @@ -142,10 +142,8 @@ bool ClickHouseDictionarySource::isModified() const if (!configuration.invalidate_query.empty()) { auto response = doInvalidateQuery(configuration.invalidate_query); - LOG_TRACE(log, "Invalidate query has returned: {}, previous value: {}", response, invalidate_query_response); - if (invalidate_query_response == response) - return false; - invalidate_query_response = response; + LOG_TRACE(log, "Invalidate query has returned: {}", response); + return invalidate_query_response.updateAndCheckModified(response); } return true; } diff --git a/src/Dictionaries/ClickHouseDictionarySource.h b/src/Dictionaries/ClickHouseDictionarySource.h index 33c7abc598f5..20c5c14255e4 100644 --- a/src/Dictionaries/ClickHouseDictionarySource.h +++ b/src/Dictionaries/ClickHouseDictionarySource.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace DB @@ -81,7 +82,7 @@ class ClickHouseDictionarySource final : public IDictionarySource std::chrono::time_point update_time; const DictionaryStructure dict_struct; const Configuration configuration; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; ExternalQueryBuilderPtr query_builder; Block sample_block; ContextMutablePtr context; diff --git a/src/Dictionaries/InvalidateQueryResponse.cpp b/src/Dictionaries/InvalidateQueryResponse.cpp new file mode 100644 index 000000000000..7ed91254673b --- /dev/null +++ b/src/Dictionaries/InvalidateQueryResponse.cpp @@ -0,0 +1,21 @@ +#include + +namespace DB +{ + +InvalidateQueryResponse::InvalidateQueryResponse(const InvalidateQueryResponse & other) +{ + std::lock_guard lock(other.mutex); + response = other.response; +} + +bool InvalidateQueryResponse::updateAndCheckModified(const std::string & new_response) +{ + std::lock_guard lock(mutex); + if (response == new_response) + return false; + response = new_response; + return true; +} + +} diff --git a/src/Dictionaries/InvalidateQueryResponse.h b/src/Dictionaries/InvalidateQueryResponse.h new file mode 100644 index 000000000000..5ad836ea196a --- /dev/null +++ b/src/Dictionaries/InvalidateQueryResponse.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace DB +{ + +/// Thread-safe holder for the last value returned by a dictionary source's invalidate query. +class InvalidateQueryResponse +{ +public: + InvalidateQueryResponse() = default; + InvalidateQueryResponse(const InvalidateQueryResponse & other); + InvalidateQueryResponse & operator=(const InvalidateQueryResponse &) = delete; + + bool updateAndCheckModified(const std::string & new_response); + +private: + mutable std::mutex mutex; + std::string response; +}; + +} diff --git a/src/Dictionaries/MySQLDictionarySource.cpp b/src/Dictionaries/MySQLDictionarySource.cpp index 7ba8eb01c6f6..e5fd9b7614bb 100644 --- a/src/Dictionaries/MySQLDictionarySource.cpp +++ b/src/Dictionaries/MySQLDictionarySource.cpp @@ -268,11 +268,7 @@ bool MySQLDictionarySource::isModified() const { LOG_TRACE(log, "Executing invalidate query: {}", configuration.invalidate_query); auto response = doInvalidateQuery(configuration.invalidate_query); - if (response == invalidate_query_response) - return false; - - invalidate_query_response = response; - return true; + return invalidate_query_response.updateAndCheckModified(response); } return true; diff --git a/src/Dictionaries/MySQLDictionarySource.h b/src/Dictionaries/MySQLDictionarySource.h index 81e835669414..128daeda99ee 100644 --- a/src/Dictionaries/MySQLDictionarySource.h +++ b/src/Dictionaries/MySQLDictionarySource.h @@ -10,6 +10,7 @@ # include # include # include +# include # include namespace Poco @@ -89,7 +90,7 @@ class MySQLDictionarySource final : public IDictionarySource Block sample_block; ExternalQueryBuilder query_builder; const std::string load_all_query; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; const StreamSettings settings; }; diff --git a/src/Dictionaries/PostgreSQLDictionarySource.cpp b/src/Dictionaries/PostgreSQLDictionarySource.cpp index 516bab8a483b..5623c9d4f4db 100644 --- a/src/Dictionaries/PostgreSQLDictionarySource.cpp +++ b/src/Dictionaries/PostgreSQLDictionarySource.cpp @@ -130,9 +130,7 @@ bool PostgreSQLDictionarySource::isModified() const if (!configuration.invalidate_query.empty()) { auto response = doInvalidateQuery(configuration.invalidate_query); - if (response == invalidate_query_response) - return false; - invalidate_query_response = response; + return invalidate_query_response.updateAndCheckModified(response); } return true; } diff --git a/src/Dictionaries/PostgreSQLDictionarySource.h b/src/Dictionaries/PostgreSQLDictionarySource.h index d3d6aeca56c5..0f36cfc54071 100644 --- a/src/Dictionaries/PostgreSQLDictionarySource.h +++ b/src/Dictionaries/PostgreSQLDictionarySource.h @@ -3,6 +3,7 @@ #include "config.h" #include #include +#include #if USE_LIBPQXX #include @@ -65,7 +66,7 @@ class PostgreSQLDictionarySource final : public IDictionarySource ExternalQueryBuilder query_builder; const std::string load_all_query; std::chrono::time_point update_time; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; }; diff --git a/src/Dictionaries/XDBCDictionarySource.cpp b/src/Dictionaries/XDBCDictionarySource.cpp index 680401ca9785..27bb003a25c8 100644 --- a/src/Dictionaries/XDBCDictionarySource.cpp +++ b/src/Dictionaries/XDBCDictionarySource.cpp @@ -187,9 +187,7 @@ bool XDBCDictionarySource::isModified() const if (!configuration.invalidate_query.empty()) { auto response = doInvalidateQuery(configuration.invalidate_query); - if (invalidate_query_response == response) - return false; - invalidate_query_response = response; + return invalidate_query_response.updateAndCheckModified(response); } return true; } diff --git a/src/Dictionaries/XDBCDictionarySource.h b/src/Dictionaries/XDBCDictionarySource.h index 55223162bddd..3128ab899384 100644 --- a/src/Dictionaries/XDBCDictionarySource.h +++ b/src/Dictionaries/XDBCDictionarySource.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace Poco @@ -83,7 +84,7 @@ class XDBCDictionarySource final : public IDictionarySource, WithContext Block sample_block; ExternalQueryBuilder query_builder; const std::string load_all_query; - mutable std::string invalidate_query_response; + mutable InvalidateQueryResponse invalidate_query_response; BridgeHelperPtr bridge_helper; Poco::URI bridge_url; From 7f5666c2a9d600571afe7144b6df618ac19b0a72 Mon Sep 17 00:00:00 2001 From: Pavel Kruglov <48961922+Avogar@users.noreply.github.com> Date: Tue, 12 May 2026 17:30:43 +0200 Subject: [PATCH 17/91] Update gtest_column_object.cpp --- src/Columns/tests/gtest_column_object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Columns/tests/gtest_column_object.cpp b/src/Columns/tests/gtest_column_object.cpp index 1182da72f031..b5c05c6b6b67 100644 --- a/src/Columns/tests/gtest_column_object.cpp +++ b/src/Columns/tests/gtest_column_object.cpp @@ -486,7 +486,7 @@ TEST(ColumnObject, TryInsertRestoresSortedDynamicPaths) auto ref = col_object.serializeValueIntoArena(0, arena, begin, nullptr); /// Round-trip sanity check. - ReadBufferFromMemory buf(ref.data(), ref.size()); + ReadBufferFromMemory buf(ref.data, ref.size); col_object.deserializeAndInsertFromArena(buf, nullptr); ASSERT_EQ(col_object.size(), 2u); ASSERT_EQ(col_object[1], col_object[0]); From 1acc89ff875713efa3c70228ca9832827a9a09a0 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 13 May 2026 01:52:42 +0000 Subject: [PATCH 18/91] Backport #104322 to 25.8: fixing a possible underflow while parsing postgres array values --- src/Core/PostgreSQL/insertPostgreSQLValue.cpp | 3 + .../tests/gtest_insertPostgreSQLValue.cpp | 96 +++++++++++ .../test_storage_postgresql/test.py | 156 ++++++++++++++++++ 3 files changed, 255 insertions(+) create mode 100644 src/Core/tests/gtest_insertPostgreSQLValue.cpp diff --git a/src/Core/PostgreSQL/insertPostgreSQLValue.cpp b/src/Core/PostgreSQL/insertPostgreSQLValue.cpp index e4c243f8f7e2..e731d0a38953 100644 --- a/src/Core/PostgreSQL/insertPostgreSQLValue.cpp +++ b/src/Core/PostgreSQL/insertPostgreSQLValue.cpp @@ -149,6 +149,9 @@ void insertPostgreSQLValue( { max_dimension = std::max(max_dimension, dimension); + if (dimension == 0) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Unexpected array closing bracket"); + --dimension; if (dimension == 0) break; diff --git a/src/Core/tests/gtest_insertPostgreSQLValue.cpp b/src/Core/tests/gtest_insertPostgreSQLValue.cpp new file mode 100644 index 000000000000..f37e64b43c52 --- /dev/null +++ b/src/Core/tests/gtest_insertPostgreSQLValue.cpp @@ -0,0 +1,96 @@ +#include "config.h" + +#if USE_LIBPQXX + +#include + +#include +#include +#include +#include +#include +#include + + +using namespace DB; + +namespace DB::ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + +/// Regression test for dimension underflow in PostgreSQL array parser. +/// When pqxx::array_parser emits row_end before any row_start (e.g. malformed +/// input starting with '}'), the dimension counter must not underflow from 0. +/// See https://github.com/ClickHouse/clickhouse-core-incidents/issues/1693 + +TEST(InsertPostgreSQLValue, MalformedArrayClosingBracketThrows) +{ + auto nested_type = std::make_shared(); + auto array_type = std::make_shared(nested_type); + auto column = ColumnArray::create(ColumnInt32::create()); + + std::unordered_map array_info; + preparePostgreSQLArrayInfo(array_info, 0, array_type); + + /// Input "}" causes row_end at dimension 0 — must throw BAD_ARGUMENTS, + /// not underflow size_t to SIZE_MAX and crash. + try + { + insertPostgreSQLValue( + *column, "}", + ExternalResultDescription::ValueType::vtArray, + array_type, array_info, 0); + FAIL() << "Expected BAD_ARGUMENTS exception for malformed array '}'"; + } + catch (const Exception & e) + { + EXPECT_EQ(e.code(), ErrorCodes::BAD_ARGUMENTS); + } +} + +TEST(InsertPostgreSQLValue, MalformedArrayClosingThenOpeningThrows) +{ + auto nested_type = std::make_shared(); + auto array_type = std::make_shared(nested_type); + auto column = ColumnArray::create(ColumnInt32::create()); + + std::unordered_map array_info; + preparePostgreSQLArrayInfo(array_info, 0, array_type); + + /// Input "}{" also starts with row_end at dimension 0. + try + { + insertPostgreSQLValue( + *column, "}{", + ExternalResultDescription::ValueType::vtArray, + array_type, array_info, 0); + FAIL() << "Expected BAD_ARGUMENTS exception for malformed array '}{'" ; + } + catch (const Exception & e) + { + EXPECT_EQ(e.code(), ErrorCodes::BAD_ARGUMENTS); + } +} + +TEST(InsertPostgreSQLValue, WellFormedArraySucceeds) +{ + auto nested_type = std::make_shared(); + auto array_type = std::make_shared(nested_type); + auto column = ColumnArray::create(ColumnInt32::create()); + + std::unordered_map array_info; + preparePostgreSQLArrayInfo(array_info, 0, array_type); + + /// Well-formed "{1,2,3}" must succeed without exceptions. + EXPECT_NO_THROW( + insertPostgreSQLValue( + *column, "{1,2,3}", + ExternalResultDescription::ValueType::vtArray, + array_type, array_info, 0)); + + /// Verify the column now has one row with 3 elements. + ASSERT_EQ(column->size(), 1u); +} + +#endif diff --git a/tests/integration/test_storage_postgresql/test.py b/tests/integration/test_storage_postgresql/test.py index 39679997151e..3c73875cc22e 100644 --- a/tests/integration/test_storage_postgresql/test.py +++ b/tests/integration/test_storage_postgresql/test.py @@ -892,6 +892,162 @@ def test_postgres_datetime(started_cluster): assert result == "2025-01-02 03:04:05.678900\n" +def test_postgres_reading_clone(started_cluster): + cursor = started_cluster.postgres_conn.cursor() + cursor.execute(f"DROP TABLE IF EXISTS test_clone") + cursor.execute("CREATE TABLE test_clone AS (SELECT number FROM generate_series(0, 99) AS number)") + + node1.query("DROP TABLE IF EXISTS test_clone") + node1.query( + f"CREATE TABLE test_clone ENGINE = PostgreSQL('postgres1:5432', 'postgres', 'test_clone', 'postgres', '{pg_pass}')" + ) + + result = node1.query( + "SELECT count() FROM (SELECT (SELECT tx.number) = 1 as x FROM test_clone AS tx) WHERE x SETTINGS correlated_subqueries_substitute_equivalent_expressions = 0" + ) + assert result.strip() == "1" + + +def test_postgres_insert_boolean_array(started_cluster): + """Test for https://github.com/ClickHouse/ClickHouse/issues/72754 + Inserting into PostgreSQL BOOLEAN[] was causing a logical error due to + incorrect column type creation for Bool arrays. + """ + cursor = started_cluster.postgres_conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test_bool_array") + cursor.execute("CREATE TABLE test_bool_array (id INTEGER, flags BOOLEAN[])") + + table_func = f"postgresql('{started_cluster.postgres_ip}:{started_cluster.postgres_port}', 'postgres', 'test_bool_array', 'postgres', '{pg_pass}')" + + # Insert boolean arrays using ClickHouse Bool type + node1.query( + f"INSERT INTO TABLE FUNCTION {table_func} VALUES (1, [true, false, true])" + ) + node1.query( + f"INSERT INTO TABLE FUNCTION {table_func} SELECT 2, [false, false]" + ) + node1.query( + f"INSERT INTO TABLE FUNCTION {table_func} SELECT 3, []" + ) + + # Verify data was inserted correctly + cursor.execute("SELECT id, flags FROM test_bool_array ORDER BY id") + result = cursor.fetchall() + assert result[0] == (1, [True, False, True]) + assert result[1] == (2, [False, False]) + assert result[2] == (3, []) + + # Verify we can read the data back through ClickHouse + result = node1.query(f"SELECT * FROM {table_func} ORDER BY id") + expected = "1\t[1,0,1]\n2\t[0,0]\n3\t[]\n" + assert result == expected + + cursor.execute("DROP TABLE test_bool_array") + + +def test_postgres_date32(started_cluster): + """Test that PostgreSQL DATE values outside the Date (UInt16) range are correctly read. + + This is a regression test for https://github.com/ClickHouse/ClickHouse/issues/73084 + PostgreSQL DATE type supports a much wider range than ClickHouse Date (1970-2149). + Large dates like '2276-11-21' must be read correctly using Date32. + """ + cursor = started_cluster.postgres_conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test_date32") + cursor.execute("CREATE TABLE test_date32 (d DATE)") + + # Insert dates that would overflow with the old Date (UInt16) type + # Date range is ~1970-2149, these dates are beyond that + cursor.execute( + "INSERT INTO test_date32 VALUES ('2276-11-21'), ('2269-07-01'), ('2200-01-01'), ('1950-06-15')" + ) + + # Read dates back using the postgresql table function + result = node1.query( + f"SELECT d FROM postgresql('postgres1:5432', 'postgres', 'test_date32', 'postgres', '{pg_pass}') ORDER BY d" + ) + expected = "1950-06-15\n2200-01-01\n2269-07-01\n2276-11-21\n" + assert result == expected, f"Expected:\n{expected}\nGot:\n{result}" + + # Also verify the column type is Date32 + result = node1.query( + f"DESCRIBE TABLE postgresql('postgres1:5432', 'postgres', 'test_date32', 'postgres', '{pg_pass}')" + ) + assert "Date32" in result, f"Expected Date32 type, got: {result}" + + cursor.execute("DROP TABLE test_date32") + + +def test_postgres_date32_array(started_cluster): + """Test that PostgreSQL DATE[] arrays with large dates are correctly read as Array(Date32).""" + cursor = started_cluster.postgres_conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test_date32_array") + cursor.execute("CREATE TABLE test_date32_array (dates DATE[] NOT NULL)") + + # Insert array with dates that would overflow with Date (UInt16) + cursor.execute( + "INSERT INTO test_date32_array VALUES (ARRAY['2276-11-21'::date, '2269-07-01'::date, '1950-06-15'::date])" + ) + + # Read dates back (array elements are in insertion order) + result = node1.query( + f"SELECT dates FROM postgresql('postgres1:5432', 'postgres', 'test_date32_array', 'postgres', '{pg_pass}')" + ) + expected = "['2276-11-21','2269-07-01','1950-06-15']\n" + assert result == expected, f"Expected:\n{expected}\nGot:\n{result}" + + # Verify the column type is Array(Date32) + result = node1.query( + f"DESCRIBE TABLE postgresql('postgres1:5432', 'postgres', 'test_date32_array', 'postgres', '{pg_pass}')" + ) + assert "Array(Date32)" in result, f"Expected Array(Date32) type, got: {result}" + + cursor.execute("DROP TABLE test_date32_array") + + +def test_postgres_array_parser_dimension_underflow(started_cluster): + """Regression test for `size_t` underflow in the PostgreSQL array parser. + + When `pqxx::array_parser` emits `row_end` while the parser's `dimension` + counter is 0 (for example, an array text starting with `}`), the previous + code decremented `dimension` past 0 — a `size_t` underflow to `SIZE_MAX` — + and then indexed `dimensions[SIZE_MAX]`, which is out-of-bounds. The fix + throws a `BAD_ARGUMENTS` exception in this case instead. + + PostgreSQL itself validates array literals at INSERT time, so the bug is + unreachable via a column declared as `boolean[]`/`integer[]` on the + PostgreSQL side. The reproducer below stores the malformed payload in a + PostgreSQL `text` column and declares the same column as `Array(Int32)` on + the ClickHouse side via the `PostgreSQL` table engine. ClickHouse then + dispatches the raw `'}'` value through the `vtArray` branch of + `insertPostgreSQLValue`, which calls `pqxx::array_parser` on it and + reproduces the bug. + """ + cursor = started_cluster.postgres_conn.cursor() + cursor.execute("DROP TABLE IF EXISTS test_array_underflow") + cursor.execute( + "CREATE TABLE test_array_underflow (id integer, payload text)" + ) + cursor.execute("INSERT INTO test_array_underflow VALUES (1, '}')") + started_cluster.postgres_conn.commit() + + node1.query("DROP TABLE IF EXISTS pg_array_underflow") + node1.query( + f"CREATE TABLE pg_array_underflow (id Int32, payload Array(Int32)) " + f"ENGINE = PostgreSQL(" + f"'{started_cluster.postgres_ip}:{started_cluster.postgres_port}', " + f"'postgres', 'test_array_underflow', 'postgres', '{pg_pass}')" + ) + + error = node1.query_and_get_error("SELECT id, payload FROM pg_array_underflow") + assert "Unexpected array closing bracket" in error, ( + f"Expected BAD_ARGUMENTS('Unexpected array closing bracket'), got: {error}" + ) + + node1.query("DROP TABLE pg_array_underflow") + cursor.execute("DROP TABLE test_array_underflow") + + if __name__ == "__main__": cluster.start() input("Cluster created, press any key to destroy...") From 4cea51f4e8ae21c18e0901e419f328297a42a3de Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 13 May 2026 07:22:19 +0000 Subject: [PATCH 19/91] Backport #98460 to 25.8: Fix null pointer dereference in dictGetOrDefault with nullable key --- src/Functions/FunctionsExternalDictionaries.h | 4 +- ...fault_nullable_key_short_circuit.reference | 2 + ..._or_default_nullable_key_short_circuit.sql | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.reference create mode 100644 tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.sql diff --git a/src/Functions/FunctionsExternalDictionaries.h b/src/Functions/FunctionsExternalDictionaries.h index 76251b874e25..0fddd31fbb22 100644 --- a/src/Functions/FunctionsExternalDictionaries.h +++ b/src/Functions/FunctionsExternalDictionaries.h @@ -720,9 +720,9 @@ class FunctionDictGetNoType final : public IFunction result = dictionary->getColumn(attribute_names[0], attribute_type, key_columns, key_types, default_mask); auto [defaults_column, mask_column] = - getDefaultsShortCircuit(std::move(default_mask), result_type, last_argument); + getDefaultsShortCircuit(std::move(default_mask), attribute_type, last_argument); - restoreShortCircuitColumn(result, defaults_column, mask_column, result_type); + restoreShortCircuitColumn(result, defaults_column, mask_column, attribute_type); } else { diff --git a/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.reference b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.reference new file mode 100644 index 000000000000..386d4703f69d --- /dev/null +++ b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.reference @@ -0,0 +1,2 @@ +Android +Android diff --git a/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.sql b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.sql new file mode 100644 index 000000000000..60c829843ab5 --- /dev/null +++ b/tests/queries/0_stateless/04009_dict_get_or_default_nullable_key_short_circuit.sql @@ -0,0 +1,40 @@ +-- Regression test: dictGetOrDefault with nullable key and short-circuit evaluation +-- caused UBSan error (member call on null pointer) in the `if` function because +-- restoreShortCircuitColumn passed a non-nullable column with a Nullable type to `if`. + +DROP TABLE IF EXISTS regexp_dictionary_source_table; +CREATE TABLE regexp_dictionary_source_table +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String), +) ENGINE=TinyLog; + +INSERT INTO regexp_dictionary_source_table VALUES (1, 0, 'Linux/(\d+[\.\d]*).+tlinux', ['name', 'version'], ['TencentOS', '\1']); +INSERT INTO regexp_dictionary_source_table VALUES (2, 0, '(\d+)/tclwebkit(\d+[\.\d]*)', ['name', 'version', 'comment'], ['Android', '$1', 'test $1 and $2']); +INSERT INTO regexp_dictionary_source_table VALUES (3, 2, '33/tclwebkit', ['version'], ['13']); +INSERT INTO regexp_dictionary_source_table VALUES (4, 2, '3[12]/tclwebkit', ['version'], ['12']); +INSERT INTO regexp_dictionary_source_table VALUES (5, 2, '3[12]/tclwebkit', ['version'], ['11']); +INSERT INTO regexp_dictionary_source_table VALUES (6, 2, '3[12]/tclwebkit', ['version'], ['10']); + +DROP DICTIONARY IF EXISTS regexp_dict; +CREATE DICTIONARY regexp_dict +( + regexp String, + name String, + version Nullable(UInt64), + comment String default 'nothing' +) +PRIMARY KEY(regexp) +SOURCE(CLICKHOUSE(TABLE 'regexp_dictionary_source_table')) +LIFETIME(0) +LAYOUT(regexp_tree); + +-- The toNullable makes the key nullable, which triggers a different code path +-- where result_type is Nullable but the dictionary column is not. +SELECT dictGetOrDefault('regexp_dict', 'name', concat(toString(number), toNullable('/tclwebkit'), toString(number)), intDiv(1, number)) FROM numbers(2); + +DROP DICTIONARY regexp_dict; +DROP TABLE regexp_dictionary_source_table; From 565a58826b6cda2d0373b369886704c9292f6082 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 13 May 2026 13:01:20 +0000 Subject: [PATCH 20/91] Backport #104751 to 25.8: Fix use-after-free in `AvroConfluentRowInputFormat` --- .../Formats/Impl/AvroRowInputFormat.cpp | 2 +- .../Formats/Impl/AvroRowInputFormat.h | 6 +++ .../test_format_avro_confluent/test.py | 41 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/Processors/Formats/Impl/AvroRowInputFormat.cpp b/src/Processors/Formats/Impl/AvroRowInputFormat.cpp index f9a780b42007..0852256f2049 100644 --- a/src/Processors/Formats/Impl/AvroRowInputFormat.cpp +++ b/src/Processors/Formats/Impl/AvroRowInputFormat.cpp @@ -1242,7 +1242,7 @@ const AvroDeserializer & AvroConfluentRowInputFormat::getOrCreateDeserializer(Sc auto schema = schema_registry->getSchema(schema_id); AvroDeserializer deserializer( output.getHeader(), schema, format_settings.avro.allow_missing_fields, format_settings.null_as_default, format_settings); - it = deserializer_cache.emplace(schema_id, deserializer).first; + it = deserializer_cache.emplace(schema_id, std::move(deserializer)).first; } return it->second; } diff --git a/src/Processors/Formats/Impl/AvroRowInputFormat.h b/src/Processors/Formats/Impl/AvroRowInputFormat.h index 81f25c36ca05..b9acc525676a 100644 --- a/src/Processors/Formats/Impl/AvroRowInputFormat.h +++ b/src/Processors/Formats/Impl/AvroRowInputFormat.h @@ -51,6 +51,12 @@ class AvroDeserializer public: AvroDeserializer(const Block & header, avro::ValidSchema schema, bool allow_missing_fields, bool null_as_default_, const FormatSettings & settings_); AvroDeserializer(DataTypePtr data_type, const std::string & column_name, avro::ValidSchema schema, bool allow_missing_fields, bool null_as_default_, const FormatSettings & settings_); + + AvroDeserializer(const AvroDeserializer &) = delete; + AvroDeserializer & operator=(const AvroDeserializer &) = delete; + AvroDeserializer(AvroDeserializer &&) = default; + AvroDeserializer & operator=(AvroDeserializer &&) = delete; + void deserializeRow(MutableColumns & columns, avro::Decoder & decoder, RowReadExtension & ext) const; using DeserializeFn = std::function; diff --git a/tests/integration/test_format_avro_confluent/test.py b/tests/integration/test_format_avro_confluent/test.py index b6d49c60c01f..587498fa5dad 100644 --- a/tests/integration/test_format_avro_confluent/test.py +++ b/tests/integration/test_format_avro_confluent/test.py @@ -85,6 +85,47 @@ def test_select(started_cluster): ] +def test_select_skip_symbolic(started_cluster): + # type: (ClickHouseCluster) -> None + + reg_url = "http://localhost:{}".format(started_cluster.schema_registry_port) + schema_registry_client = CachedSchemaRegistryClient({"url": reg_url}) + serializer = MessageSerializer(schema_registry_client) + + schema = avro.schema.make_avsc_object( + { + "name": "Node", + "type": "record", + "fields": [ + {"name": "value", "type": "long"}, + {"name": "next", "type": ["null", "Node"]}, + ], + } + ) + + record = {"value": 0, "next": {"value": 1, "next": {"value": 2, "next": None}}} + data = serializer.encode_record_with_schema( + "test_subject_skip_symbolic", schema, record + ) + + instance = started_cluster.instances["dummy"] # type: ClickHouseInstance + schema_registry_url = "http://{}:{}".format( + started_cluster.schema_registry_host, started_cluster.schema_registry_port + ) + settings = {"format_avro_schema_registry_url": schema_registry_url} + run_query( + instance, + "create table avro_data_skip_symbolic(value Int64) engine = Memory()", + ) + run_query( + instance, + "insert into avro_data_skip_symbolic format AvroConfluent", + data, + settings, + ) + assert run_query(instance, "select value from avro_data_skip_symbolic").strip() == "0" + + def test_select_auth(started_cluster): # type: (ClickHouseCluster) -> None From e15bfd7b02492d6b86b27d223ccd57c7b71d7ec0 Mon Sep 17 00:00:00 2001 From: Grant Holly Date: Wed, 13 May 2026 14:20:08 -0700 Subject: [PATCH 21/91] removing unrelated tests that got accidentally dragged in during merge --- .../test_storage_postgresql/test.py | 112 ------------------ 1 file changed, 112 deletions(-) diff --git a/tests/integration/test_storage_postgresql/test.py b/tests/integration/test_storage_postgresql/test.py index 3c73875cc22e..87d7f410e111 100644 --- a/tests/integration/test_storage_postgresql/test.py +++ b/tests/integration/test_storage_postgresql/test.py @@ -892,118 +892,6 @@ def test_postgres_datetime(started_cluster): assert result == "2025-01-02 03:04:05.678900\n" -def test_postgres_reading_clone(started_cluster): - cursor = started_cluster.postgres_conn.cursor() - cursor.execute(f"DROP TABLE IF EXISTS test_clone") - cursor.execute("CREATE TABLE test_clone AS (SELECT number FROM generate_series(0, 99) AS number)") - - node1.query("DROP TABLE IF EXISTS test_clone") - node1.query( - f"CREATE TABLE test_clone ENGINE = PostgreSQL('postgres1:5432', 'postgres', 'test_clone', 'postgres', '{pg_pass}')" - ) - - result = node1.query( - "SELECT count() FROM (SELECT (SELECT tx.number) = 1 as x FROM test_clone AS tx) WHERE x SETTINGS correlated_subqueries_substitute_equivalent_expressions = 0" - ) - assert result.strip() == "1" - - -def test_postgres_insert_boolean_array(started_cluster): - """Test for https://github.com/ClickHouse/ClickHouse/issues/72754 - Inserting into PostgreSQL BOOLEAN[] was causing a logical error due to - incorrect column type creation for Bool arrays. - """ - cursor = started_cluster.postgres_conn.cursor() - cursor.execute("DROP TABLE IF EXISTS test_bool_array") - cursor.execute("CREATE TABLE test_bool_array (id INTEGER, flags BOOLEAN[])") - - table_func = f"postgresql('{started_cluster.postgres_ip}:{started_cluster.postgres_port}', 'postgres', 'test_bool_array', 'postgres', '{pg_pass}')" - - # Insert boolean arrays using ClickHouse Bool type - node1.query( - f"INSERT INTO TABLE FUNCTION {table_func} VALUES (1, [true, false, true])" - ) - node1.query( - f"INSERT INTO TABLE FUNCTION {table_func} SELECT 2, [false, false]" - ) - node1.query( - f"INSERT INTO TABLE FUNCTION {table_func} SELECT 3, []" - ) - - # Verify data was inserted correctly - cursor.execute("SELECT id, flags FROM test_bool_array ORDER BY id") - result = cursor.fetchall() - assert result[0] == (1, [True, False, True]) - assert result[1] == (2, [False, False]) - assert result[2] == (3, []) - - # Verify we can read the data back through ClickHouse - result = node1.query(f"SELECT * FROM {table_func} ORDER BY id") - expected = "1\t[1,0,1]\n2\t[0,0]\n3\t[]\n" - assert result == expected - - cursor.execute("DROP TABLE test_bool_array") - - -def test_postgres_date32(started_cluster): - """Test that PostgreSQL DATE values outside the Date (UInt16) range are correctly read. - - This is a regression test for https://github.com/ClickHouse/ClickHouse/issues/73084 - PostgreSQL DATE type supports a much wider range than ClickHouse Date (1970-2149). - Large dates like '2276-11-21' must be read correctly using Date32. - """ - cursor = started_cluster.postgres_conn.cursor() - cursor.execute("DROP TABLE IF EXISTS test_date32") - cursor.execute("CREATE TABLE test_date32 (d DATE)") - - # Insert dates that would overflow with the old Date (UInt16) type - # Date range is ~1970-2149, these dates are beyond that - cursor.execute( - "INSERT INTO test_date32 VALUES ('2276-11-21'), ('2269-07-01'), ('2200-01-01'), ('1950-06-15')" - ) - - # Read dates back using the postgresql table function - result = node1.query( - f"SELECT d FROM postgresql('postgres1:5432', 'postgres', 'test_date32', 'postgres', '{pg_pass}') ORDER BY d" - ) - expected = "1950-06-15\n2200-01-01\n2269-07-01\n2276-11-21\n" - assert result == expected, f"Expected:\n{expected}\nGot:\n{result}" - - # Also verify the column type is Date32 - result = node1.query( - f"DESCRIBE TABLE postgresql('postgres1:5432', 'postgres', 'test_date32', 'postgres', '{pg_pass}')" - ) - assert "Date32" in result, f"Expected Date32 type, got: {result}" - - cursor.execute("DROP TABLE test_date32") - - -def test_postgres_date32_array(started_cluster): - """Test that PostgreSQL DATE[] arrays with large dates are correctly read as Array(Date32).""" - cursor = started_cluster.postgres_conn.cursor() - cursor.execute("DROP TABLE IF EXISTS test_date32_array") - cursor.execute("CREATE TABLE test_date32_array (dates DATE[] NOT NULL)") - - # Insert array with dates that would overflow with Date (UInt16) - cursor.execute( - "INSERT INTO test_date32_array VALUES (ARRAY['2276-11-21'::date, '2269-07-01'::date, '1950-06-15'::date])" - ) - - # Read dates back (array elements are in insertion order) - result = node1.query( - f"SELECT dates FROM postgresql('postgres1:5432', 'postgres', 'test_date32_array', 'postgres', '{pg_pass}')" - ) - expected = "['2276-11-21','2269-07-01','1950-06-15']\n" - assert result == expected, f"Expected:\n{expected}\nGot:\n{result}" - - # Verify the column type is Array(Date32) - result = node1.query( - f"DESCRIBE TABLE postgresql('postgres1:5432', 'postgres', 'test_date32_array', 'postgres', '{pg_pass}')" - ) - assert "Array(Date32)" in result, f"Expected Array(Date32) type, got: {result}" - - cursor.execute("DROP TABLE test_date32_array") - def test_postgres_array_parser_dimension_underflow(started_cluster): """Regression test for `size_t` underflow in the PostgreSQL array parser. From f73bb43ccbe8674994f5f98e808e90707d422d40 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 14 May 2026 16:04:03 +0000 Subject: [PATCH 22/91] Backport #104673 to 25.8: Fix data race in FutureSetFromTuple --- src/Interpreters/PreparedSets.cpp | 18 ++++++++---------- src/Interpreters/PreparedSets.h | 4 ++++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Interpreters/PreparedSets.cpp b/src/Interpreters/PreparedSets.cpp index 3eedfb308820..279da8eeb849 100644 --- a/src/Interpreters/PreparedSets.cpp +++ b/src/Interpreters/PreparedSets.cpp @@ -108,30 +108,28 @@ FutureSetFromTuple::FutureSetFromTuple( DataTypes FutureSetFromTuple::getTypes() const { return set->getElementsTypes(); } FutureSet::Hash FutureSetFromTuple::getHash() const { return hash; } -Columns FutureSetFromTuple::getKeyColumns() +void FutureSetFromTuple::fillSetElementsOnce() { - if (!set->hasExplicitSetElements()) + callOnce(fill_set_elements_once, [this] { set->fillSetElements(); set->appendSetElements(set_key_columns); - } + }); +} +Columns FutureSetFromTuple::getKeyColumns() +{ + fillSetElementsOnce(); return set->getSetElements(); } SetPtr FutureSetFromTuple::buildOrderedSetInplace(const ContextPtr & context) { - if (set->hasExplicitSetElements()) - return set; - const auto & settings = context->getSettingsRef(); size_t max_values = settings[Setting::use_index_for_in_with_subqueries_max_values]; bool too_many_values = max_values && max_values < set->getTotalRowCount(); if (!too_many_values) - { - set->fillSetElements(); - set->appendSetElements(set_key_columns); - } + fillSetElementsOnce(); return set; } diff --git a/src/Interpreters/PreparedSets.h b/src/Interpreters/PreparedSets.h index cfd7435833f8..473bd83a9b2f 100644 --- a/src/Interpreters/PreparedSets.h +++ b/src/Interpreters/PreparedSets.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -106,10 +107,13 @@ class FutureSetFromTuple final : public FutureSet ASTPtr getSourceAST() const override { return ast; } Columns getKeyColumns(); private: + void fillSetElementsOnce(); + Hash hash; ASTPtr ast; SetPtr set; SetKeyColumns set_key_columns; + OnceFlag fill_set_elements_once; }; using FutureSetFromTuplePtr = std::shared_ptr; From e4089b986e52f20f63af0335a95451edc03d09e2 Mon Sep 17 00:00:00 2001 From: Grant Holly Date: Thu, 14 May 2026 10:29:59 -0700 Subject: [PATCH 23/91] updating reference files --- .../0_stateless/03707_set_index_bad_get_null_bug.reference | 2 +- .../04201_trivial_count_with_additional_filter.reference | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/queries/0_stateless/03707_set_index_bad_get_null_bug.reference b/tests/queries/0_stateless/03707_set_index_bad_get_null_bug.reference index 7d5596416eb0..6c3792712ba4 100644 --- a/tests/queries/0_stateless/03707_set_index_bad_get_null_bug.reference +++ b/tests/queries/0_stateless/03707_set_index_bad_get_null_bug.reference @@ -11,4 +11,4 @@ Expression Description: set GRANULARITY 1 Parts: 0/1 Granules: 0/1 - Ranges: 0 + Ranges: 0 diff --git a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference index 41e65d960eda..b143e75ed95b 100644 --- a/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference +++ b/tests/queries/0_stateless/04201_trivial_count_with_additional_filter.reference @@ -2,8 +2,8 @@ baseline (ReadFromPreparedSource) SourceFromSingleChunk 0 → 1 filtered_this_table - (ReadFromMergeTree) - MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) 0 → 1 + (ReadFromMergeTree) + MergeTreeSelect(pool: ReadPoolInOrder, algorithm: InOrder) 0 → 1 filter_other_table (ReadFromPreparedSource) SourceFromSingleChunk 0 → 1 From 1a9cf6a93b8531845d69e6de1d01226560587db8 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 15 May 2026 19:46:31 +0000 Subject: [PATCH 24/91] Backport #103890 to 25.8: Fix use-after-free in KeeperHandlingConsumer::setKeeper (StorageKafka2) --- src/Storages/Kafka/KeeperHandlingConsumer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Storages/Kafka/KeeperHandlingConsumer.cpp b/src/Storages/Kafka/KeeperHandlingConsumer.cpp index 449e7e56e916..5b3605dccc15 100644 --- a/src/Storages/Kafka/KeeperHandlingConsumer.cpp +++ b/src/Storages/Kafka/KeeperHandlingConsumer.cpp @@ -130,12 +130,14 @@ bool KeeperHandlingConsumer::needsNewKeeper() const void KeeperHandlingConsumer::setKeeper(const std::shared_ptr & keeper_) { - keeper = keeper_; + /// Drop the lock holders before replacing `keeper` -- same use-after-free hazard as + /// `replica_is_active_node` in `StorageKafka2::partialShutdown` (see comment there). { std::lock_guard lock(topic_partition_locks_mutex); permanent_locks.clear(); tmp_locks.clear(); } + keeper = keeper_; tmp_locks_quota = 0; assigned_topic_partitions.clear(); topic_partition_index_to_consume_from = 0; From 221d172f80733fd9ea61530116006392e521107c Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 18 May 2026 15:20:13 +0000 Subject: [PATCH 25/91] Backport #104663 to 25.8: Fix Keeper termination on get `/keeper/availability_zone` with `quorum_reads=true` --- src/Coordination/KeeperStorage.cpp | 3 +- .../__init__.py | 0 .../configs/keeper_config.xml | 36 +++++++ .../configs/keeper_config_configured.xml | 41 ++++++++ .../configs/keeper_config_local_reads.xml | 38 +++++++ .../test.py | 98 +++++++++++++++++++ 6 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 tests/integration/test_keeper_availability_zone_quorum_reads/__init__.py create mode 100644 tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config.xml create mode 100644 tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_configured.xml create mode 100644 tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_local_reads.xml create mode 100644 tests/integration/test_keeper_availability_zone_quorum_reads/test.py diff --git a/src/Coordination/KeeperStorage.cpp b/src/Coordination/KeeperStorage.cpp index 11be234d7584..997e8f7db4fa 100644 --- a/src/Coordination/KeeperStorage.cpp +++ b/src/Coordination/KeeperStorage.cpp @@ -1789,8 +1789,7 @@ std::list preprocess( ProfileEvents::increment(ProfileEvents::KeeperGetRequest); if (zk_request.path == Coordination::keeper_api_feature_flags_path - || zk_request.path == Coordination::keeper_config_path - || zk_request.path == Coordination::keeper_availability_zone_path) + || zk_request.path == Coordination::keeper_config_path) return {}; if (!storage.uncommitted_state.getNode(zk_request.path)) diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/__init__.py b/tests/integration/test_keeper_availability_zone_quorum_reads/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config.xml b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config.xml new file mode 100644 index 000000000000..24095f39136e --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config.xml @@ -0,0 +1,36 @@ + + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 5000 + 10000 + trace + true + + + + 1 + node + 2888 + + + + + + + node + 9181 + + + diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_configured.xml b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_configured.xml new file mode 100644 index 000000000000..cce9700173aa --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_configured.xml @@ -0,0 +1,41 @@ + + + + + 0 + az-configured + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 5000 + 10000 + trace + true + + + + 1 + node_configured + 2888 + + + + + + + node_configured + 9181 + + + diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_local_reads.xml b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_local_reads.xml new file mode 100644 index 000000000000..2497feede885 --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/configs/keeper_config_local_reads.xml @@ -0,0 +1,38 @@ + + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 5000 + 10000 + trace + false + + + + 1 + node_local + 2888 + + + + + + + node_local + 9181 + + + diff --git a/tests/integration/test_keeper_availability_zone_quorum_reads/test.py b/tests/integration/test_keeper_availability_zone_quorum_reads/test.py new file mode 100644 index 000000000000..c2ddc1cd0486 --- /dev/null +++ b/tests/integration/test_keeper_availability_zone_quorum_reads/test.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +"""Regression test for keeper termination when `Get /keeper/availability_zone` +is sent to a keeper that was started without `` and runs with +`quorum_reads=true`. + +Before the fix the keeper called `onStorageInconsistency` (=> `std::terminate`) +on commit, and the request entry persisted in the raft log, so log replay +re-triggered the termination on every restart. + +The companion test under `quorum_reads=false` exercises the local read path +(`processLocalRequests` -> `processImpl`), which already returned +`ZNONODE` gracefully before the fix. Running both ensures the two read modes +return the same response for an unconfigured AZ. A third case pins the +configured branch: with `` set, a `quorum_reads=true` `Get` should +return the AZ value normally. +""" + +import pytest + +import helpers.keeper_utils as keeper_utils +from helpers.cluster import ClickHouseCluster +from helpers.keeper_utils import KeeperClient, KeeperException + +cluster = ClickHouseCluster(__file__) + +node = cluster.add_instance( + "node", + main_configs=["configs/keeper_config.xml"], + stay_alive=True, +) + +node_local = cluster.add_instance( + "node_local", + main_configs=["configs/keeper_config_local_reads.xml"], + stay_alive=True, +) + +node_configured = cluster.add_instance( + "node_configured", + main_configs=["configs/keeper_config_configured.xml"], + stay_alive=True, +) + + +@pytest.fixture(scope="module", autouse=True) +def started_cluster(): + try: + cluster.start() + yield cluster + finally: + cluster.shutdown() + + +def _keeper_alive(target) -> bool: + return keeper_utils.send_4lw_cmd(cluster, target, "ruok") == "imok" + + +def _assert_znonode(target, instance_name): + keeper_utils.wait_until_connected(cluster, target) + assert _keeper_alive(target) + + with KeeperClient.from_cluster(cluster, instance_name, port=9181) as client: + with pytest.raises(KeeperException) as ex: + client.get("/keeper/availability_zone") + + error = str(ex.value) + assert "node doesn't exist" in error + assert "/keeper/availability_zone" in error + + # The keeper should still be alive — no SIGABRT, no raft-log poisoning. + assert _keeper_alive(target) + + +def test_get_availability_zone_returns_znonode_under_quorum_reads(): + """Keeper without `` should reply with `ZNONODE` for the AZ + path even when `quorum_reads=true` routes the read through the raft + commit path. The keeper must remain alive afterwards.""" + _assert_znonode(node, "node") + + +def test_get_availability_zone_returns_znonode_under_local_reads(): + """Same path, `quorum_reads=false` (the default). The read goes through + `processLocalRequests` and `processImpl` and should also return + `ZNONODE`, matching the response of the quorum-read path after the fix.""" + _assert_znonode(node_local, "node_local") + + +def test_get_availability_zone_returns_value_when_configured(): + """When `` is configured, a `quorum_reads=true` `Get` must + return the configured AZ value. This pins the configured branch of the + fix: the container lookup still succeeds under the raft commit path.""" + keeper_utils.wait_until_connected(cluster, node_configured) + assert _keeper_alive(node_configured) + + with KeeperClient.from_cluster(cluster, "node_configured", port=9181) as client: + assert client.get("/keeper/availability_zone") == "az-configured" + + assert _keeper_alive(node_configured) From be0cc8fd34d9c2d16bdce082207e7c9efa9d8af7 Mon Sep 17 00:00:00 2001 From: robot-ch-test-poll4 <69306974+robot-ch-test-poll4@users.noreply.github.com> Date: Tue, 19 May 2026 03:32:36 +0200 Subject: [PATCH 26/91] Backport #103536 to 25.8: Fix heap-use-after-free in `executeAggregateMultiply` self-merge (#105212) Co-authored-by: robot-clickhouse --- src/Functions/FunctionBinaryArithmetic.h | 24 +++++++++- ...06_reservoir_sample_self_merging.reference | 2 +- ...te_state_multiply_self_merge_uaf.reference | 13 +++++ ...ggregate_state_multiply_self_merge_uaf.sql | 47 ++++++++++++++++++ ...ultiply_self_merge_uaf_0988_2212.reference | 11 +++++ ...impl_multiply_self_merge_uaf_0988_2212.sql | 48 +++++++++++++++++++ 6 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.reference create mode 100644 tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.sql create mode 100644 tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.reference create mode 100644 tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.sql diff --git a/src/Functions/FunctionBinaryArithmetic.h b/src/Functions/FunctionBinaryArithmetic.h index 60bd11f85aaf..f815afbdeaf5 100644 --- a/src/Functions/FunctionBinaryArithmetic.h +++ b/src/Functions/FunctionBinaryArithmetic.h @@ -1160,6 +1160,21 @@ class FunctionBinaryArithmetic : public IFunction /// We use exponentiation by squaring algorithm to perform multiplying aggregate states by N in O(log(N)) operations /// https://en.wikipedia.org/wiki/Exponentiation_by_squaring + /// + /// The squaring step computes vec_from[i] := vec_from[i] + vec_from[i]. + /// Calling `function->merge(state, state)` directly is undefined behaviour: + /// many aggregate function `merge` implementations append the source's + /// internal storage to the destination's. When `src == dst` and the + /// destination reallocates, the source iterators (pointing to the freed + /// buffer) are dereferenced, producing a heap-use-after-free. We avoid + /// the alias by copying `vec_from` into an independent column first. + /// + /// The temporary column is constructed inside the squaring branch so + /// that its arena is released at the end of each iteration. Re-using a + /// single column across iterations would leak per-iteration state + /// memory into the column's monotonic arena (`popBack` decrements the + /// row count but does not free arena allocations), causing the + /// temporary footprint to grow with the multiplier. while (m) { if (m % 2) @@ -1170,8 +1185,15 @@ class FunctionBinaryArithmetic : public IFunction } else { + auto column_temp = ColumnAggregateFunction::create(function); + column_temp->reserve(size); for (size_t i = 0; i < size; ++i) - function->merge(vec_from[i], vec_from[i], arena.get()); + column_temp->insertFrom(vec_from[i]); + auto & vec_temp = column_temp->getData(); + + for (size_t i = 0; i < size; ++i) + function->merge(vec_from[i], vec_temp[i], arena.get()); + m /= 2; } } diff --git a/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference b/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference index 15e0c9417a7c..1538e93e2abf 100644 --- a/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference +++ b/tests/queries/0_stateless/03406_reservoir_sample_self_merging.reference @@ -1,3 +1,3 @@ 4.5 -499.5 +495 50501.5 diff --git a/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.reference b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.reference new file mode 100644 index 000000000000..cb68ed1c2e92 --- /dev/null +++ b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.reference @@ -0,0 +1,13 @@ +50 +100 +200 +400 +800 +12800 +150 +250 +350 +1 +200 +200 +4900 diff --git a/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.sql b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.sql new file mode 100644 index 000000000000..49996f0db012 --- /dev/null +++ b/tests/queries/0_stateless/04117_aggregate_state_multiply_self_merge_uaf.sql @@ -0,0 +1,47 @@ +-- Tags: no-fasttest +-- ^ The reproducer needs Address Sanitizer / Memory Sanitizer to surface the +-- bug; release builds happen to read freed memory without aborting, so a +-- fast-test-only run would be silent. + +-- Regression test for STID 0988-40af: heap-use-after-free in +-- FunctionBinaryArithmetic::executeAggregateMultiply, triggered when the +-- exponentiation-by-squaring loop calls func->merge(state, state) on an +-- aggregate function whose merge implementation appends the source's internal +-- storage into the destination's. With src == dst, the source iterators are +-- invalidated by the destination's reallocation, producing a heap-use-after- +-- free. The fix copies the state to an independent column before each +-- squaring step. + +-- groupArrayState's merge appends rhs.value to lhs.value (a PODArray). With +-- src == dst the source iterator points to a buffer that is reallocated mid- +-- merge, which deterministically reproduces the heap-use-after-free under +-- Address Sanitizer. The result length grows linearly with the multiplier: +SELECT length(finalizeAggregation(state * 1)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 2)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 8)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 16)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 256)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); + +-- Pure-odd and mixed multipliers still exercise the squaring branch (e.g. +-- 7 = 4 + 2 + 1 squares twice). +SELECT length(finalizeAggregation(state * 3)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 5)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 7)) FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); + +-- quantilesExactState is the variant the production fuzzer caught (its +-- internal PODArray is what the original sanitizer +-- report flagged). The aggregate result is a fixed-length quantiles array, +-- but the squaring path still allocates / merges the underlying buffer the +-- same way. +SELECT length(finalizeAggregation(state * 8)) FROM (SELECT quantilesExactState(0.5)(number) AS state FROM numbers(50)); + +-- Constant column path: a single state value replicated across multiple +-- rows. agg_state_is_const takes the size=1 branch in executeAggregateMultiply. +SELECT length(finalizeAggregation(arrayJoin([state, state]) * 4)) +FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); + +-- Numerical correctness: multiplying the state by N should produce N*size +-- elements; sum-aggregating them gives N * sum([0..49]) = N * 1225. +SELECT sum(arrayJoin(finalizeAggregation(state * 4))) +FROM (SELECT groupArrayState(number) AS state FROM numbers(50)); diff --git a/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.reference b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.reference new file mode 100644 index 000000000000..20740609668d --- /dev/null +++ b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.reference @@ -0,0 +1,11 @@ +50 +100 +150 +200 +400 +800 +200 +200 +200 +200 +200 diff --git a/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.sql b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.sql new file mode 100644 index 000000000000..a59b7f6a4a21 --- /dev/null +++ b/tests/queries/0_stateless/04235_moving_impl_multiply_self_merge_uaf_0988_2212.sql @@ -0,0 +1,48 @@ +-- Tags: no-fasttest +-- ^ The reproducer surfaces as a `Segmentation fault` / `use-after-poison` +-- on AddressSanitizer / MemorySanitizer builds, and as a PODArray +-- `insertPrepare` assertion (`assertNotIntersects`) on Debug builds. +-- On Release builds the corruption can be silent, so the no-fasttest tag +-- restricts the test to builds where the regression is observable. + +-- Regression test for STID 0988-2212: `Segmentation fault` inside +-- `DB::MovingImpl::merge` (`AggregateFunctionGroupArrayMoving`) reached via +-- `FunctionBinaryArithmetic::executeAggregateMultiply` during +-- the analyzer dry-run. Same bug class as STID 0988-40af / 0988-3351 — the +-- exponentiation-by-squaring loop in `executeAggregateMultiply` invoked +-- `function->merge(state, state)`, aliasing the source and destination +-- aggregate state. `MovingImpl::merge` then called +-- `cur_elems.value.insert(rhs_elems.value.begin(), rhs_elems.value.end(), arena)` +-- where `rhs_elems` referenced the same `PODArray` as `cur_elems.value`, so +-- the source iterators pointed into the buffer that `insertPrepare` was +-- about to reallocate. The fix removes the self-alias at the call site by +-- copying `vec_from` into an independent column before each squaring step. + +-- Length grows linearly with the multiplier: each squaring concatenates the +-- backing prefix-sum array. For 50 input rows, `state * N` materialises +-- `N * 50` prefix sums. +SELECT length(finalizeAggregation(state * 1)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 2)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 3)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 8)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); +SELECT length(finalizeAggregation(state * 16)) FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); + +-- groupArrayMovingAvg exercises the same `MovingImpl::merge` code path with +-- a different `Data::Accumulator` (Float64 / Decimal). +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingAvgState(number) AS state FROM numbers(50)); + +-- Decimal accumulator path: `MovingImpl<..., MovingSumData>>::merge` +-- — the variant caught on PR #101062 (STID 0988-2212 on amd_debug). The +-- squaring branch exercises the same self-alias hazard. +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingSumState(toDecimal64(number, 2)) AS state FROM numbers(50)); + +-- Windowed variant `groupArrayMovingSum(window_size)`: parameterised template +-- (`LimitNumElements::value = true`) exercises the same merge path, with a +-- different `MovingImpl` instantiation. +SELECT length(finalizeAggregation(state * 4)) FROM (SELECT groupArrayMovingSumState(5)(number) AS state FROM numbers(50)); + +-- Constant column path: `executeAggregateMultiply` takes the `size = 1` +-- branch through `agg_state_is_const` and produces a `ColumnConst`. +SELECT length(finalizeAggregation(arrayJoin([state, state]) * 4)) +FROM (SELECT groupArrayMovingSumState(number) AS state FROM numbers(50)); From 96aec582361aa967a6601758808fa9bea6540e50 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 19 May 2026 20:50:44 +0000 Subject: [PATCH 27/91] Backport #102417 to 25.8: Check for stack overflow in Avro reader --- contrib/avro | 2 +- .../Formats/Impl/AvroRowInputFormat.cpp | 18 +++++++++++++++--- .../Formats/Impl/AvroRowInputFormat.h | 6 ++++++ .../Iceberg/AvroForIcebergDeserializer.cpp | 2 +- ...eply_nested_schema_stack_overflow.reference | 0 ...avro_deeply_nested_schema_stack_overflow.sh | 17 +++++++++++++++++ .../data_avro/deeply_nested_schema.avro | 1 + 7 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.reference create mode 100755 tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.sh create mode 100644 tests/queries/0_stateless/data_avro/deeply_nested_schema.avro diff --git a/contrib/avro b/contrib/avro index b32d5f3c7858..477ed40c656b 160000 --- a/contrib/avro +++ b/contrib/avro @@ -1 +1 @@ -Subproject commit b32d5f3c7858e32e51d3bc905bf5943d1cddca53 +Subproject commit 477ed40c656b1646a093d663668fb76dd0e75e47 diff --git a/src/Processors/Formats/Impl/AvroRowInputFormat.cpp b/src/Processors/Formats/Impl/AvroRowInputFormat.cpp index 0852256f2049..66293a91984b 100644 --- a/src/Processors/Formats/Impl/AvroRowInputFormat.cpp +++ b/src/Processors/Formats/Impl/AvroRowInputFormat.cpp @@ -3,6 +3,7 @@ #include +#include #include #include @@ -251,6 +252,8 @@ static bool canBeDeserializedFromFixed(const DataTypePtr & target_type, size_t f AvroDeserializer::DeserializeFn AvroDeserializer::createDeserializeFn(const avro::NodePtr & root_node, const DataTypePtr & target_type) { + checkStackSize(); + if (target_type->lowCardinality()) { const auto * lc_type = assert_cast(target_type.get()); @@ -712,6 +715,8 @@ AvroDeserializer::DeserializeFn AvroDeserializer::createDeserializeFn(const avro AvroDeserializer::SkipFn AvroDeserializer::createSkipFn(const avro::NodePtr & root_node) { + checkStackSize(); + switch (root_node->type()) { case avro::AVRO_STRING: @@ -854,6 +859,8 @@ static inline std::string concatPath(const std::string & a, const std::string & AvroDeserializer::Action AvroDeserializer::createAction(const Block & header, const avro::NodePtr & node, const std::string & current_path) { + checkStackSize(); + if (node->type() == avro::AVRO_SYMBOLIC) { /// continue traversal only if some column name starts with current_path @@ -1017,7 +1024,8 @@ AvroRowInputFormat::AvroRowInputFormat(SharedHeader header_, ReadBuffer & in_, P void AvroRowInputFormat::readPrefix() { - file_reader_ptr = std::make_unique(std::make_unique(*in)); + file_reader_ptr = std::make_unique( + std::make_unique(*in), MAX_AVRO_SCHEMA_DEPTH); deserializer_ptr = std::make_unique( output.getHeader(), file_reader_ptr->dataSchema(), format_settings.avro.allow_missing_fields, format_settings.null_as_default, format_settings); file_reader_ptr->init(); @@ -1121,7 +1129,7 @@ class AvroConfluentRowInputFormat::SchemaRegistry auto schema = json_body->getValue("schema"); LOG_TRACE((getLogger("AvroConfluentRowInputFormat")), "Successfully fetched schema id = {}\n{}", id, schema); - return avro::compileJsonSchemaFromString(schema); + return avro::compileJsonSchemaFromString(schema, MAX_AVRO_SCHEMA_DEPTH); } catch (const Exception &) { @@ -1262,7 +1270,8 @@ NamesAndTypesList AvroSchemaReader::readSchema() } else { - auto file_reader_ptr = std::make_unique(std::make_unique(in)); + auto file_reader_ptr = std::make_unique( + std::make_unique(in), MAX_AVRO_SCHEMA_DEPTH); root_node = file_reader_ptr->dataSchema().root(); } @@ -1278,6 +1287,9 @@ NamesAndTypesList AvroSchemaReader::readSchema() DataTypePtr AvroSchemaReader::avroNodeToDataType(avro::NodePtr node) { + checkStackSize(); + + switch (node->type()) { case avro::Type::AVRO_INT: diff --git a/src/Processors/Formats/Impl/AvroRowInputFormat.h b/src/Processors/Formats/Impl/AvroRowInputFormat.h index b9acc525676a..520802802cb6 100644 --- a/src/Processors/Formats/Impl/AvroRowInputFormat.h +++ b/src/Processors/Formats/Impl/AvroRowInputFormat.h @@ -29,6 +29,12 @@ namespace ErrorCodes class Block; +/// Maximum nesting depth for Avro schemas. Passed to the Avro library to +/// prevent stack overflow on deeply nested schemas (e.g. crafted inputs with +/// thousands of nested arrays/records). Real-world schemas rarely exceed 10-20 +/// levels, so 256 is more than enough. +static constexpr size_t MAX_AVRO_SCHEMA_DEPTH = 256; + class AvroInputStreamReadBufferAdapter : public avro::InputStream { public: diff --git a/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp b/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp index 5057b5df9d2d..5b62c301d215 100644 --- a/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp +++ b/src/Storages/ObjectStorage/DataLakes/Iceberg/AvroForIcebergDeserializer.cpp @@ -31,7 +31,7 @@ try , manifest_file_path(manifest_file_path_) { auto manifest_file_reader - = std::make_unique(std::make_unique(*buffer)); + = std::make_unique(std::make_unique(*buffer), MAX_AVRO_SCHEMA_DEPTH); avro::NodePtr root_node = manifest_file_reader->dataSchema().root(); auto data_type = AvroSchemaReader::avroNodeToDataType(root_node); diff --git a/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.reference b/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.sh b/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.sh new file mode 100755 index 000000000000..d06e6ec65418 --- /dev/null +++ b/tests/queries/0_stateless/04093_avro_deeply_nested_schema_stack_overflow.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Tags: no-fasttest, long + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +# Use a pre-generated deeply nested Avro file (2000 levels of nested arrays) +# that would cause stack overflow without proper recursion depth checks. +AVRO_FILE="${CURDIR}/data_avro/deeply_nested_schema.avro" + +# Should not crash (SIGSEGV). May succeed or fail with TOO_DEEP_RECURSION depending on build type. +${CLICKHOUSE_LOCAL} -q "SELECT * FROM file('${AVRO_FILE}', 'Avro') FORMAT Null" > /dev/null 2>&1 +[ $? -lt 128 ] || echo "CRASHED" + +${CLICKHOUSE_LOCAL} -q "DESC file('${AVRO_FILE}', 'Avro')" > /dev/null 2>&1 +[ $? -lt 128 ] || echo "CRASHED" diff --git a/tests/queries/0_stateless/data_avro/deeply_nested_schema.avro b/tests/queries/0_stateless/data_avro/deeply_nested_schema.avro new file mode 100644 index 000000000000..51af4042ced9 --- /dev/null +++ b/tests/queries/0_stateless/data_avro/deeply_nested_schema.avro @@ -0,0 +1 @@ +Objavro.codecnullavro.schema{"type": "record", "name": "test", "fields": [{"type": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": {"type": "array", "items": "int"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, "name": "nested"}]}VD1>TVD1 \ No newline at end of file From dc5512487c6de5ab0f45bd958cd829793a0dc22f Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 20 May 2026 09:25:16 +0000 Subject: [PATCH 28/91] Backport #104610 to 25.8: Use restore Keeper retries for restored parts --- src/Backups/RestorerFromBackup.h | 1 + src/Common/FailPoint.cpp | 1 + src/Storages/MergeTree/MergeTreeData.cpp | 13 ++++-- src/Storages/MergeTree/MergeTreeData.h | 3 +- .../MergeTree/ReplicatedMergeTreeSink.cpp | 25 ++++++++--- .../MergeTree/ReplicatedMergeTreeSink.h | 6 ++- src/Storages/StorageMergeTree.cpp | 2 +- src/Storages/StorageMergeTree.h | 2 +- src/Storages/StorageReplicatedMergeTree.cpp | 5 ++- src/Storages/StorageReplicatedMergeTree.h | 2 +- ...tach_uses_restore_keeper_retries.reference | 1 + ...ted_attach_uses_restore_keeper_retries.sql | 45 +++++++++++++++++++ 12 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.reference create mode 100644 tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.sql diff --git a/src/Backups/RestorerFromBackup.h b/src/Backups/RestorerFromBackup.h index 48561c89f6d8..cec83d5c15b1 100644 --- a/src/Backups/RestorerFromBackup.h +++ b/src/Backups/RestorerFromBackup.h @@ -64,6 +64,7 @@ class RestorerFromBackup : private boost::noncopyable bool isNonEmptyTableAllowed() const { return getRestoreSettings().allow_non_empty_tables; } std::shared_ptr getRestoreCoordination() const { return restore_coordination; } ContextMutablePtr getContext() const { return context; } + const ZooKeeperRetriesInfo & getZooKeeperRetriesInfo() const { return zookeeper_retries_info; } /// Adds a data restore task which will be later returned by getDataRestoreTasks(). /// This function can be called by implementations of IStorage::restoreFromBackup() in inherited storage classes. diff --git a/src/Common/FailPoint.cpp b/src/Common/FailPoint.cpp index d467b17a2e3c..129d9a499ef2 100644 --- a/src/Common/FailPoint.cpp +++ b/src/Common/FailPoint.cpp @@ -81,6 +81,7 @@ static struct InitFiu REGULAR(smt_outdated_parts_exception_response) \ REGULAR(object_storage_queue_fail_in_the_middle_of_file) \ PAUSEABLE_ONCE(replicated_merge_tree_insert_retry_pause) \ + ONCE(replicated_merge_tree_restore_attach_retry) \ PAUSEABLE_ONCE(finish_set_quorum_failed_parts) \ PAUSEABLE_ONCE(finish_clean_quorum_failed_parts) \ PAUSEABLE_ONCE(smt_wait_next_mutation) \ diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index 37e9630c4d68..a19730b88ddf 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -6482,8 +6482,11 @@ void MergeTreeData::restoreDataFromBackup(RestorerFromBackup & restorer, const S class MergeTreeData::RestoredPartsHolder { public: - RestoredPartsHolder(const std::shared_ptr & storage_, const BackupPtr & backup_) - : storage(storage_), backup(backup_) + RestoredPartsHolder( + const std::shared_ptr & storage_, + const BackupPtr & backup_, + const ZooKeeperRetriesInfo & zookeeper_retries_info_) + : storage(storage_), backup(backup_), zookeeper_retries_info(zookeeper_retries_info_) { } @@ -6540,7 +6543,7 @@ class MergeTreeData::RestoredPartsHolder parts.end(), [](const MutableDataPartPtr & lhs, const MutableDataPartPtr & rhs) { return lhs->info.min_block < rhs->info.min_block; }); - storage->attachRestoredParts(std::move(parts)); + storage->attachRestoredParts(std::move(parts), zookeeper_retries_info); parts.clear(); temp_part_dirs.clear(); num_parts = 0; @@ -6548,6 +6551,7 @@ class MergeTreeData::RestoredPartsHolder const std::shared_ptr storage; const BackupPtr backup; + const ZooKeeperRetriesInfo zookeeper_retries_info; size_t num_parts = 0; size_t num_broken_parts = 0; MutableDataPartsVector parts; @@ -6567,7 +6571,8 @@ void MergeTreeData::restorePartsFromBackup(RestorerFromBackup & restorer, const bool restore_broken_parts_as_detached = restorer.getRestoreSettings().restore_broken_parts_as_detached; - auto restored_parts_holder = std::make_shared(std::static_pointer_cast(shared_from_this()), backup); + auto restored_parts_holder = std::make_shared( + std::static_pointer_cast(shared_from_this()), backup, restorer.getZooKeeperRetriesInfo()); fs::path data_path_in_backup_fs = data_path_in_backup; size_t num_parts = 0; diff --git a/src/Storages/MergeTree/MergeTreeData.h b/src/Storages/MergeTree/MergeTreeData.h index 2cd69c086473..e51a5c506d89 100644 --- a/src/Storages/MergeTree/MergeTreeData.h +++ b/src/Storages/MergeTree/MergeTreeData.h @@ -59,6 +59,7 @@ class Context; struct JobAndPool; class MergeTreeTransaction; struct ZeroCopyLock; +struct ZooKeeperRetriesInfo; class IBackupEntry; using BackupEntries = std::vector>>; @@ -1640,7 +1641,7 @@ class MergeTreeData : public IStorage, public WithMutableContext MutableDataPartPtr loadPartRestoredFromBackup(const String & part_name, const DiskPtr & disk, const String & temp_part_dir, bool detach_if_broken) const; /// Attaches restored parts to the storage. - virtual void attachRestoredParts(MutableDataPartsVector && parts) = 0; + virtual void attachRestoredParts(MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) = 0; void resetObjectColumnsFromActiveParts(const DataPartsLock & lock); void updateObjectColumns(const DataPartPtr & part, const DataPartsLock & lock); diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp b/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp index 96f934fc6de1..99f31d857ad6 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp +++ b/src/Storages/MergeTree/ReplicatedMergeTreeSink.cpp @@ -52,6 +52,7 @@ namespace FailPoints extern const char replicated_merge_tree_insert_quorum_fail_0[]; extern const char replicated_merge_tree_commit_zk_fail_when_recovering_from_hw_fault[]; extern const char replicated_merge_tree_insert_retry_pause[]; + extern const char replicated_merge_tree_restore_attach_retry[]; extern const char rmt_delay_commit_part[]; } @@ -123,7 +124,8 @@ ReplicatedMergeTreeSinkImpl::ReplicatedMergeTreeSinkImpl( bool majority_quorum, ContextPtr context_, bool is_attach_, - bool allow_attach_while_readonly_) + bool allow_attach_while_readonly_, + std::optional keeper_retries_info_) : SinkToStorage(std::make_shared(metadata_snapshot_->getSampleBlock())) , storage(storage_) , metadata_snapshot(metadata_snapshot_) @@ -137,6 +139,7 @@ ReplicatedMergeTreeSinkImpl::ReplicatedMergeTreeSinkImpl( , log(getLogger(storage.getLogName() + " (Replicated OutputStream)")) , context(context_) , storage_snapshot(storage.getStorageSnapshotWithoutData(metadata_snapshot, context_)) + , keeper_retries_info(std::move(keeper_retries_info_)) { /// The quorum value `1` has the same meaning as if it is disabled. if (required_quorum_size == 1) @@ -722,13 +725,15 @@ std::pair, bool> ReplicatedMergeTreeSinkImpl:: CommitRetryContext retry_context; const auto & settings = context->getSettingsRef(); + ZooKeeperRetriesInfo retries_info = keeper_retries_info.value_or(ZooKeeperRetriesInfo{ + settings[Setting::insert_keeper_max_retries], + settings[Setting::insert_keeper_retry_initial_backoff_ms], + settings[Setting::insert_keeper_retry_max_backoff_ms], + context->getProcessListElement()}); ZooKeeperRetriesControl retries_ctl( "commitPart", log, - {settings[Setting::insert_keeper_max_retries], - settings[Setting::insert_keeper_retry_initial_backoff_ms], - settings[Setting::insert_keeper_retry_max_backoff_ms], - context->getProcessListElement()}); + retries_info); auto resolve_duplicate_stage = [&] () -> CommitRetryContext::Stages { @@ -854,6 +859,16 @@ std::pair, bool> ReplicatedMergeTreeSinkImpl:: auto commit_new_part_stage = [&]() -> CommitRetryContext::Stages { + if (is_attach) + { + fiu_do_on(FailPoints::replicated_merge_tree_restore_attach_retry, + { + retries_ctl.setUserError( + Exception(ErrorCodes::TABLE_IS_READ_ONLY, "Injected read-only error while attaching restored part")); + return CommitRetryContext::LOCK_AND_COMMIT; + }); + } + if (storage.is_readonly) { /// stop retries if in shutdown diff --git a/src/Storages/MergeTree/ReplicatedMergeTreeSink.h b/src/Storages/MergeTree/ReplicatedMergeTreeSink.h index 598fa1c7d4b6..f61a279fed78 100644 --- a/src/Storages/MergeTree/ReplicatedMergeTreeSink.h +++ b/src/Storages/MergeTree/ReplicatedMergeTreeSink.h @@ -1,6 +1,8 @@ #pragma once +#include #include + #include #include #include @@ -84,7 +86,8 @@ class ReplicatedMergeTreeSinkImpl : public SinkToStorage // special flag to determine the ALTER TABLE ATTACH PART without the query context, // needed to set the special LogEntryType::ATTACH_PART bool is_attach_ = false, - bool allow_attach_while_readonly_ = false); + bool allow_attach_while_readonly_ = false, + std::optional keeper_retries_info_ = std::nullopt); ~ReplicatedMergeTreeSinkImpl() override; @@ -167,6 +170,7 @@ class ReplicatedMergeTreeSinkImpl : public SinkToStorage ContextPtr context; StorageSnapshotPtr storage_snapshot; + std::optional keeper_retries_info; UInt64 chunk_dedup_seqnum = 0; /// input chunk ordinal number in case of dedup token }; diff --git a/src/Storages/StorageMergeTree.cpp b/src/Storages/StorageMergeTree.cpp index acfe2905f91d..55e4d21880fe 100644 --- a/src/Storages/StorageMergeTree.cpp +++ b/src/Storages/StorageMergeTree.cpp @@ -2722,7 +2722,7 @@ BackupEntries StorageMergeTree::backupMutations(UInt64 version, const String & d } -void StorageMergeTree::attachRestoredParts(MutableDataPartsVector && parts) +void StorageMergeTree::attachRestoredParts(MutableDataPartsVector && parts, const std::optional &) { for (auto part : parts) { diff --git a/src/Storages/StorageMergeTree.h b/src/Storages/StorageMergeTree.h index 00cbc7acdad8..89533726ff27 100644 --- a/src/Storages/StorageMergeTree.h +++ b/src/Storages/StorageMergeTree.h @@ -291,7 +291,7 @@ class StorageMergeTree final : public MergeTreeData BackupEntries backupMutations(UInt64 version, const String & data_path_in_backup) const; /// Attaches restored parts to the storage. - void attachRestoredParts(MutableDataPartsVector && parts) override; + void attachRestoredParts(MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) override; std::unique_ptr getDefaultSettings() const override; diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index aadf16191b5d..1854e9e06411 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -11286,13 +11286,14 @@ void StorageReplicatedMergeTree::restoreDataFromBackup(RestorerFromBackup & rest restorePartsFromBackup(restorer, data_path_in_backup, partitions); } -void StorageReplicatedMergeTree::attachRestoredParts(MutableDataPartsVector && parts) +void StorageReplicatedMergeTree::attachRestoredParts( + MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) { auto metadata_snapshot = getInMemoryMetadataPtr(); auto sink = std::make_shared( *this, metadata_snapshot, /* quorum */ 0, /* quorum_timeout_ms */ 0, /* max_parts_per_block */ 0, /* quorum_parallel */ false, - /* deduplicate */ false, /* majority_quorum */ false, getContext(), /* is_attach */ true, /* allow_attach_while_readonly */ false); + /* deduplicate */ false, /* majority_quorum */ false, getContext(), /* is_attach */ true, /* allow_attach_while_readonly */ false, zookeeper_retries_info); for (auto part : parts) sink->writeExistingPart(part); diff --git a/src/Storages/StorageReplicatedMergeTree.h b/src/Storages/StorageReplicatedMergeTree.h index 487c3a3f44c0..17763eb79268 100644 --- a/src/Storages/StorageReplicatedMergeTree.h +++ b/src/Storages/StorageReplicatedMergeTree.h @@ -958,7 +958,7 @@ class StorageReplicatedMergeTree final : public MergeTreeData void startBackgroundMovesIfNeeded() override; /// Attaches restored parts to the storage. - void attachRestoredParts(MutableDataPartsVector && parts) override; + void attachRestoredParts(MutableDataPartsVector && parts, const std::optional & zookeeper_retries_info) override; std::unique_ptr getDefaultSettings() const override; diff --git a/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.reference b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.reference new file mode 100644 index 000000000000..0cfbf08886fc --- /dev/null +++ b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.reference @@ -0,0 +1 @@ +2 diff --git a/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.sql b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.sql new file mode 100644 index 000000000000..2699e89a725e --- /dev/null +++ b/tests/queries/0_stateless/04218_restore_replicated_attach_uses_restore_keeper_retries.sql @@ -0,0 +1,45 @@ +-- Tags: no-parallel +-- Uses a global one-shot failpoint in `ReplicatedMergeTreeSink::commitPart`. + +SYSTEM DISABLE FAILPOINT replicated_merge_tree_restore_attach_retry; + +DROP TABLE IF EXISTS src_04218 SYNC; +DROP TABLE IF EXISTS dst_04218_fail SYNC; +DROP TABLE IF EXISTS dst_04218_ok SYNC; + +CREATE TABLE src_04218 (x UInt64) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/04218_restore_retries/src', 'r1') +ORDER BY x; + +INSERT INTO src_04218 VALUES (1), (2); + +BACKUP TABLE src_04218 TO Memory('04218_restore_retries') FORMAT Null; + +CREATE TABLE dst_04218_fail (x UInt64) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/04218_restore_retries/dst_fail', 'r1') +ORDER BY x; + +SYSTEM ENABLE FAILPOINT replicated_merge_tree_restore_attach_retry; + +RESTORE TABLE src_04218 AS dst_04218_fail FROM Memory('04218_restore_retries') +SETTINGS allow_different_table_def = 1, backup_restore_keeper_max_retries = 0; -- { serverError TABLE_IS_READ_ONLY } + +DROP TABLE dst_04218_fail SYNC; + +CREATE TABLE dst_04218_ok (x UInt64) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/04218_restore_retries/dst_ok', 'r1') +ORDER BY x; + +SYSTEM ENABLE FAILPOINT replicated_merge_tree_restore_attach_retry; + +RESTORE TABLE src_04218 AS dst_04218_ok FROM Memory('04218_restore_retries') +SETTINGS allow_different_table_def = 1, + backup_restore_keeper_max_retries = 1, + backup_restore_keeper_retry_initial_backoff_ms = 1, + backup_restore_keeper_retry_max_backoff_ms = 1 +FORMAT Null; + +SELECT count() FROM dst_04218_ok; + +DROP TABLE src_04218 SYNC; +DROP TABLE dst_04218_ok SYNC; From bf990cbe2c77e6e04f161bda047ad33e1f80aa28 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 20 May 2026 13:39:33 +0000 Subject: [PATCH 29/91] Update autogenerated version to 25.8.24.21 and contributors --- cmake/autogenerated_versions.txt | 10 +++++----- .../System/StorageSystemContributors.generated.cpp | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cmake/autogenerated_versions.txt b/cmake/autogenerated_versions.txt index ef9409c640cd..318cc7d24376 100644 --- a/cmake/autogenerated_versions.txt +++ b/cmake/autogenerated_versions.txt @@ -2,11 +2,11 @@ # NOTE: VERSION_REVISION has nothing common with DBMS_TCP_PROTOCOL_VERSION, # only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes. -SET(VERSION_REVISION 54524) +SET(VERSION_REVISION 54525) SET(VERSION_MAJOR 25) SET(VERSION_MINOR 8) -SET(VERSION_PATCH 24) -SET(VERSION_GITHASH 443620d152ed64184d6f221c988c569334311055) -SET(VERSION_DESCRIBE v25.8.24.1-lts) -SET(VERSION_STRING 25.8.24.1) +SET(VERSION_PATCH 25) +SET(VERSION_GITHASH 497e61c6debfeb644f6de6d7f59059db198cb173) +SET(VERSION_DESCRIBE v25.8.25.1-lts) +SET(VERSION_STRING 25.8.25.1) # end of autochange diff --git a/src/Storages/System/StorageSystemContributors.generated.cpp b/src/Storages/System/StorageSystemContributors.generated.cpp index c88d9898eb5f..8f29bc211096 100644 --- a/src/Storages/System/StorageSystemContributors.generated.cpp +++ b/src/Storages/System/StorageSystemContributors.generated.cpp @@ -518,6 +518,7 @@ const char * auto_contributors[] { "GoGoWen2021", "Gosha Letov", "Graham Campbell", + "Grant Holly", "Greg Maher", "Gregory", "Grigorii Sokolik", @@ -2120,6 +2121,7 @@ const char * auto_contributors[] { "singhksandeep25", "siyuan", "skyoct", + "slach", "slu", "slvrtrn", "snyk-bot", From eb1c44fec6f09d9667438ae19858490a11993d4e Mon Sep 17 00:00:00 2001 From: avogar Date: Wed, 20 May 2026 14:06:14 +0000 Subject: [PATCH 30/91] Fix `contrib/avro` submodule pointer for stack overflow protection The cherry-pick of #102417 resolved the avro submodule conflict to the wrong commit (477ed40c656b, old API) instead of 3b5d52bdf9f9 (which adds the `max_depth` parameter to `DataFileReaderBase` and `compileJsonSchemaFromString`). Co-Authored-By: Claude Opus 4.6 --- contrib/avro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/avro b/contrib/avro index 477ed40c656b..3b5d52bdf9f9 160000 --- a/contrib/avro +++ b/contrib/avro @@ -1 +1 @@ -Subproject commit 477ed40c656b1646a093d663668fb76dd0e75e47 +Subproject commit 3b5d52bdf9f9f66121b663741f4270b33c91c1a6 From 65a8ef10a4f8e47cc428f76bc2f98bd237dab435 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 20 May 2026 15:21:30 +0000 Subject: [PATCH 31/91] Backport #92717 to 25.8: Fix flaky test_named_collections --- .../NamedCollectionsFactory.cpp | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Common/NamedCollections/NamedCollectionsFactory.cpp b/src/Common/NamedCollections/NamedCollectionsFactory.cpp index 9295bbfdf722..ad1abc36f928 100644 --- a/src/Common/NamedCollections/NamedCollectionsFactory.cpp +++ b/src/Common/NamedCollections/NamedCollectionsFactory.cpp @@ -380,34 +380,34 @@ void NamedCollectionFactory::updateFunc() while (!shutdown_called.load()) { - if (metadata_storage->waitUpdate()) + try { - try + if (metadata_storage->waitUpdate()) { reloadFromSQL(); } - catch (const Coordination::Exception & e) + } + catch (const Coordination::Exception & e) + { + if (Coordination::isHardwareError(e.code)) { - if (Coordination::isHardwareError(e.code)) - { - LOG_INFO(log, "Lost ZooKeeper connection, will try to connect again: {}", - DB::getCurrentExceptionMessage(true)); - - sleepForSeconds(1); - } - else - { - tryLogCurrentException(__PRETTY_FUNCTION__); - chassert(false); - } - continue; + LOG_INFO(log, "Lost ZooKeeper connection, will try to connect again: {}", + DB::getCurrentExceptionMessage(true)); + + sleepForSeconds(1); } - catch (...) + else { - DB::tryLogCurrentException(__PRETTY_FUNCTION__); + tryLogCurrentException(__PRETTY_FUNCTION__); chassert(false); - continue; } + continue; + } + catch (...) + { + DB::tryLogCurrentException(__PRETTY_FUNCTION__); + chassert(false); + continue; } } From e33115cb943abdb6aadba6cafb578dbc32c36f31 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 21 May 2026 22:41:52 +0000 Subject: [PATCH 32/91] Backport #105492 to 25.8: Skip test_numbers_check on release branches --- ci/jobs/check_style.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ci/jobs/check_style.py b/ci/jobs/check_style.py index c613d711fe5f..24a96cdddcb5 100644 --- a/ci/jobs/check_style.py +++ b/ci/jobs/check_style.py @@ -6,6 +6,7 @@ from concurrent.futures import ProcessPoolExecutor from pathlib import Path +from praktika.info import Info from praktika.result import Result from praktika.utils import Shell, Utils @@ -322,7 +323,13 @@ def parse_args(): ) ) testname = "test_numbers_check" - if testpattern.lower() in testname.lower(): + # Skip on release branches and backport PRs: backports cherry-pick a small + # subset of test files, which legitimately leaves large gaps in the numbering. + info = Info() + release_branch_re = re.compile(r"^\d{2}\.\d+$") + branch_to_check = (info.base_branch or info.git_branch or "").removeprefix("release/") + is_release_branch = bool(release_branch_re.match(branch_to_check)) + if testpattern.lower() in testname.lower() and not is_release_branch: results.append( Result.from_commands_run( name=testname, From e91f9225f0d706333df87e0138ecc6701b67937d Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 22 May 2026 09:23:03 +0000 Subject: [PATCH 33/91] Backport #105449 to 25.8: Fix heap-buffer-overflow and null-pointer dereference in Arrow geo/string column readers --- .../Formats/Impl/ArrowColumnToCHColumn.cpp | 79 +++++++++- .../04259_arrow_corrupted_offsets.reference | 4 + .../04259_arrow_corrupted_offsets.sh | 139 ++++++++++++++++++ ...4260_arrow_geo_corrupted_offsets.reference | 3 + .../04260_arrow_geo_corrupted_offsets.sh | 91 ++++++++++++ 5 files changed, 309 insertions(+), 7 deletions(-) create mode 100644 tests/queries/0_stateless/04259_arrow_corrupted_offsets.reference create mode 100755 tests/queries/0_stateless/04259_arrow_corrupted_offsets.sh create mode 100644 tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.reference create mode 100755 tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.sh diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index 4dae97e0d58b..f54843b38300 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -113,17 +113,61 @@ static ColumnWithTypeAndName readColumnWithStringData(const std::shared_ptr & column_chars = assert_cast(*internal_column).getChars(); PaddedPODArray & column_offsets = assert_cast(*internal_column).getOffsets(); + /// Pre-flight: validate every non-null row's offset+length against the actual buffer and + /// accumulate an exact chars_size. This prevents both the source read overflow and the + /// destination write overflow via insert_assume_reserved. + /// + /// Using buffer->size() as the bound (rather than value_offset(N-1)+value_length(N-1)) + /// is deliberate: corrupted offsets can make intermediate value_length(i) entries much + /// larger than the buffer while keeping the last entry's value look correct. Counting + /// per-row also handles non-monotonic (rewinding) offsets at null rows, which would let + /// later non-null rows re-read the same range and exceed a buffer-size-based reserve. + /// + /// Casting a negative signed offset/length to size_t wraps to a huge value, so the + /// two-part check (safe_offset > buf || safe_length > buf - safe_offset) catches negative + /// values without a separate signed test. size_t chars_size = 0; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; - if (chunk_length > 0) + if (chunk.null_count() == 0) { - chars_size += chunk.value_offset(chunk_length - 1) + chunk.value_length(chunk_length - 1); - chars_size += chunk_length; + for (size_t i = 0; i < chunk_length; ++i) + { + const size_t safe_offset = static_cast(chunk.value_offset(i)); + const size_t safe_length = static_cast(chunk.value_length(i)); + if (unlikely(safe_offset > buffer_size || safe_length > buffer_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds: " + "row {} has offset {} and length {} but buffer is {} bytes", + i, chunk.value_offset(i), chunk.value_length(i), buffer_size); + chars_size += safe_length; + } } + else + { + for (size_t i = 0; i < chunk_length; ++i) + { + if (!chunk.IsNull(i)) + { + const size_t safe_offset = static_cast(chunk.value_offset(i)); + const size_t safe_length = static_cast(chunk.value_length(i)); + if (unlikely(safe_offset > buffer_size || safe_length > buffer_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds: " + "row {} has offset {} and length {} but buffer is {} bytes", + i, chunk.value_offset(i), chunk.value_length(i), buffer_size); + chars_size += safe_length; + } + } + } + chars_size += chunk_length; // one null terminator per row } column_chars.reserve(chars_size); @@ -140,8 +184,12 @@ static ColumnWithTypeAndName readColumnWithStringData(const std::shared_ptrdata() + chunk.value_offset(offset_i); - column_chars.insert_assume_reserved(raw_data, raw_data + chunk.value_length(offset_i)); + const auto value_length = chunk.value_length(offset_i); + if (value_length > 0) + { + const auto * raw_data = buffer->data() + chunk.value_offset(offset_i); + column_chars.insert_assume_reserved(raw_data, raw_data + value_length); + } column_offsets.emplace_back(column_chars.size()); } } @@ -522,16 +570,33 @@ static ColumnWithTypeAndName readColumnWithGeoData(const std::shared_ptr(*(arrow_column->chunk(chunk_i))); std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; for (size_t offset_i = 0; offset_i != chunk_length; ++offset_i) { - auto * raw_data = buffer->mutable_data() + chunk.value_offset(offset_i); if (chunk.IsNull(offset_i)) { column->insertDefault(); continue; } - ReadBuffer in_buffer(reinterpret_cast(raw_data), chunk.value_length(offset_i), 0); + + if (!buffer) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray has no data buffer for non-null geo row {}", + offset_i); + + const size_t safe_offset = static_cast(chunk.value_offset(offset_i)); + const size_t safe_length = static_cast(chunk.value_length(offset_i)); + if (unlikely(safe_offset > buffer_size || safe_length > buffer_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds: " + "row {} has offset {} and length {} but buffer is {} bytes", + offset_i, chunk.value_offset(offset_i), chunk.value_length(offset_i), buffer_size); + + const auto * raw_data = buffer->data() + safe_offset; + ReadBuffer in_buffer(const_cast(reinterpret_cast(raw_data)), safe_length, 0); GeometricObject result_object; switch (geo_metadata.encoding) { diff --git a/tests/queries/0_stateless/04259_arrow_corrupted_offsets.reference b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.reference new file mode 100644 index 000000000000..530e25cd51cd --- /dev/null +++ b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.reference @@ -0,0 +1,4 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +3 3 diff --git a/tests/queries/0_stateless/04259_arrow_corrupted_offsets.sh b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.sh new file mode 100755 index 000000000000..9f82bf5fc5e7 --- /dev/null +++ b/tests/queries/0_stateless/04259_arrow_corrupted_offsets.sh @@ -0,0 +1,139 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test for heap-buffer-overflow in readColumnWithStringData when an +# Arrow file carries corrupted intermediate offsets that make individual +# value_length(i) much larger than the actual values buffer. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +DATA_FILE="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}.arrow" +DATA_FILE_STREAM="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_stream.arrow" +DATA_FILE_NULLABLE="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_nullable.arrow" +trap 'rm -f "$DATA_FILE" "$DATA_FILE_STREAM" "$DATA_FILE_NULLABLE"' EXIT + +# Build a well-formed Arrow file with 4 binary rows of 10 bytes each, +# then corrupt offset[1] from 10 to 0x40000000 (1 GiB). +# A vulnerable build would attempt a 1 GiB memcpy into a ~40-byte heap buffer; +# the fixed build must reject the file with INCORRECT_DATA. +python3 - "$DATA_FILE" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +arr = pa.array([b'A' * 10, b'B' * 10, b'C' * 10, b'D' * 10], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() + +# Patch offsets [0, 10, 20, 30, 40] -> [0, 0x40000000, 20, 30, 40]. +# value_length(0) = offset[1] - offset[0] = 1 GiB; the last entry is unchanged +# so the pre-flight reserve stays small, triggering a write overflow on the old code. +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 4 : idx + 8] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' + +# Same payload via ArrowStream format. +python3 - "$DATA_FILE_STREAM" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +arr = pa.array([b'A' * 10, b'B' * 10, b'C' * 10, b'D' * 10], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_stream(f, tbl.schema) + w.write_table(tbl) + w.close() + +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 4 : idx + 8] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' + +# Nullable column: corrupt the last offset on a non-null row so its value_length +# becomes 1 GiB. The pre-flight must validate non-null rows in the nullable path. +python3 - "$DATA_FILE_NULLABLE" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +# 3 rows: non-null / null / non-null. Well-formed offsets: [0, 10, 10, 20]. +arr = pa.array([b'A' * 10, None, b'C' * 10], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() + +# Corrupt offsets[3]: 20 -> 0x40000000. +# Row 2 (non-null): value_offset = offsets[2] = 10, value_length = 0x40000000 - 10 = 1 GiB. +# Pre-flight must reject this with INCORRECT_DATA. +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 12 : idx + 16] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' + +# Write loop path: non-null empty strings with absent values buffer (IPC body offset=-1). +# This exercises the null_count==0 write path when buffer->data() may be null. +# The fixed build must read all rows as empty strings without crashing. +DATA_FILE_EMPTY="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_empty.arrow" +trap 'rm -f "$DATA_FILE" "$DATA_FILE_STREAM" "$DATA_FILE_NULLABLE" "$DATA_FILE_EMPTY"' EXIT +python3 - "$DATA_FILE_EMPTY" <<'EOF' +import struct +import sys +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +arr = pa.array([b'', b'', b''], type=pa.binary()) +tbl = pa.Table.from_arrays([arr], names=['x']) +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() + +# Set values buffer entry offset to -1 to mark it as absent in the IPC body. +# The buffer entry for values is {offset: int64, length: int64}; for 3 empty +# strings the values buffer has length=0. Setting offset=-1 signals absence. +data = bytearray(open(path, 'rb').read()) +target = struct.pack('= 0, "could not locate values buffer entry" +data[idx : idx + 8] = struct.pack('&1 diff --git a/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.reference b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.reference new file mode 100644 index 000000000000..aadb02b069d8 --- /dev/null +++ b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.reference @@ -0,0 +1,3 @@ +(1,2) +(1,2) +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.sh b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.sh new file mode 100755 index 000000000000..b1cba5812e3c --- /dev/null +++ b/tests/queries/0_stateless/04260_arrow_geo_corrupted_offsets.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test for heap-buffer-overflow in readColumnWithGeoData when an +# Arrow file carries corrupted intermediate offsets, and for the crash caused +# by using buffer->mutable_data() (which returns nullptr for read-only IPC +# buffers) instead of buffer->data(). + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +DATA_FILE="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_geo.arrow" +DATA_FILE_VALID="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}_geo_valid.arrow" +trap 'rm -f "$DATA_FILE" "$DATA_FILE_VALID"' EXIT + +# Build a valid Arrow IPC file with WKB Point rows and geo schema metadata. +# Before the fix, buffer->mutable_data() returned nullptr for read-only IPC +# buffers, causing a null-pointer dereference on any geo-tagged Arrow column. +python3 - "$DATA_FILE_VALID" <<'EOF' +import struct +import sys +import json +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +# WKB Point(1.0, 2.0): byte_order=1(LE), type=1(Point), x=1.0, y=2.0 +wkb_point = struct.pack('metadata()), not to the +# IPC footer (file_reader->metadata()), which is what ArrowBlockInputFormat reads. +meta = tbl.schema.metadata or {} +meta[b'geo'] = geo_meta.encode() +tbl = tbl.replace_schema_metadata(meta) + +with pa.OSFile(path, 'wb') as f: + w = ipc.new_file(f, tbl.schema) + w.write_table(tbl) + w.close() +EOF + +$CLICKHOUSE_LOCAL --input_format_parquet_allow_geoparquet_parser=1 \ + --query "SELECT x FROM file('${DATA_FILE_VALID}', 'Arrow')" 2>&1 + +# Build an Arrow IPC file with WKB binary rows, geo schema metadata, and a +# corrupted offset that makes value_length(0) = 1 GiB. +# Before the fix, this caused a heap-buffer-overflow in parseWKBFormat. +# After the fix, it must be rejected with INCORRECT_DATA. +python3 - "$DATA_FILE" <<'EOF' +import struct +import sys +import json +import pyarrow as pa +import pyarrow.ipc as ipc + +path = sys.argv[1] + +wkb_point = struct.pack(' [0, 0x40000000, 42, 63]. +# value_length(0) = offset[1] - offset[0] = 1 GiB; the read would overflow +# the ~63-byte data buffer. +data = bytearray(open(path, 'rb').read()) +needle = struct.pack('= 0, "could not locate offsets array" +data[idx + 4 : idx + 8] = struct.pack('&1 \ + | grep -oF 'INCORRECT_DATA' || echo 'FAIL: expected INCORRECT_DATA' From 4f2cb4fa637026334bb331ee914d704d4d079196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Fri, 22 May 2026 14:31:32 +0000 Subject: [PATCH 34/91] Fix geoparquet metadata handling in Arrow IPC format Arrow IPC stores schema-level metadata in `schema->metadata()`, not in `file_reader->metadata()` (which returns IPC footer custom metadata). The Arrow reader was passing the wrong metadata to `ArrowColumnToCHColumn`, so the `geo` key was never found and geoparquet parsing never activated for Arrow IPC files. Backport of 14122ed29df7bc630e89c0e3c2e75bcc8f625dfd. Required for test `04260_arrow_geo_corrupted_offsets` (added by #105449) to pass. --- src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp index fbd7dae07f73..5ab17e985763 100644 --- a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp @@ -100,7 +100,8 @@ Chunk ArrowBlockInputFormat::read() /// If defaults_for_omitted_fields is true, calculate the default values from default expression for omitted fields. /// Otherwise fill the missing columns with zero values of its type. BlockMissingValues * block_missing_values_ptr = format_settings.defaults_for_omitted_fields ? &block_missing_values : nullptr; - res = arrow_column_to_ch_column->arrowTableToCHChunk(*table_result, (*table_result)->num_rows(), file_reader ? file_reader->metadata() : nullptr, block_missing_values_ptr); + auto schema_metadata = stream ? stream_reader->schema()->metadata() : file_reader->schema()->metadata(); + res = arrow_column_to_ch_column->arrowTableToCHChunk(*table_result, (*table_result)->num_rows(), schema_metadata, block_missing_values_ptr); /// There is no easy way to get original record batch size from Arrow metadata. /// Let's just use the number of bytes read from read buffer. @@ -223,7 +224,7 @@ NamesAndTypesList ArrowSchemaReader::readSchema() auto header = ArrowColumnToCHColumn::arrowSchemaToCHHeader( *schema, - file_reader ? file_reader->metadata() : nullptr, + schema->metadata(), stream ? "ArrowStream" : "Arrow", format_settings, format_settings.arrow.skip_columns_with_unsupported_types_in_schema_inference, From ae816cfb29b77bc56148699e0577f88dfb50f8e6 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 22 May 2026 16:59:12 +0000 Subject: [PATCH 35/91] Backport #105636 to 25.8: Fix test_mysql_dotnet_client by anchoring to /testapp --- tests/integration/test_mysql_protocol/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/test_mysql_protocol/test.py b/tests/integration/test_mysql_protocol/test.py index d8c371a10819..2b5635be77c1 100644 --- a/tests/integration/test_mysql_protocol/test.py +++ b/tests/integration/test_mysql_protocol/test.py @@ -958,7 +958,7 @@ def test_mysql_dotnet_client(started_cluster): [ "bash", "-c", - f"dotnet run -- --host {node.hostname} --port {server_port} --username default --password 123", + f"cd /testapp && dotnet run -- --host {node.hostname} --port {server_port} --username default --password 123", ], ) # there is some thrash at the beggining of output, so it's better to use `in` instead of `==`` From f9975432b419cb96aabf5bcec07207ff5b8595e3 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 26 May 2026 13:18:07 +0000 Subject: [PATCH 36/91] Backport #105776 to 25.8: Reject empty or NUL-containing MongoDB collection names --- src/Dictionaries/MongoDBDictionarySource.cpp | 1 + src/Storages/StorageMongoDB.cpp | 11 ++++++++ src/Storages/StorageMongoDB.h | 1 + ...7_mongodb_empty_collection_crash.reference | 0 .../04267_mongodb_empty_collection_crash.sql | 25 +++++++++++++++++++ ...godb_dictionary_empty_collection.reference | 0 ...68_mongodb_dictionary_empty_collection.sql | 22 ++++++++++++++++ 7 files changed, 60 insertions(+) create mode 100644 tests/queries/0_stateless/04267_mongodb_empty_collection_crash.reference create mode 100644 tests/queries/0_stateless/04267_mongodb_empty_collection_crash.sql create mode 100644 tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.reference create mode 100644 tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.sql diff --git a/src/Dictionaries/MongoDBDictionarySource.cpp b/src/Dictionaries/MongoDBDictionarySource.cpp index 1704a058fcbb..3e2c38528a12 100644 --- a/src/Dictionaries/MongoDBDictionarySource.cpp +++ b/src/Dictionaries/MongoDBDictionarySource.cpp @@ -95,6 +95,7 @@ void registerDictionarySourceMongoDB(DictionarySourceFactory & factory) } configuration->checkHosts(context); + configuration->checkCollection(); return std::make_unique(dict_struct, std::move(configuration), std::make_shared(sample_block)); }; diff --git a/src/Storages/StorageMongoDB.cpp b/src/Storages/StorageMongoDB.cpp index 42202a230fe0..17a7722af4dd 100644 --- a/src/Storages/StorageMongoDB.cpp +++ b/src/Storages/StorageMongoDB.cpp @@ -49,6 +49,7 @@ namespace DB namespace ErrorCodes { + extern const int BAD_ARGUMENTS; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; extern const int NOT_IMPLEMENTED; } @@ -68,6 +69,15 @@ void MongoDBConfiguration::checkHosts(const ContextPtr & context) const context->getRemoteHostFilter().checkHostAndPort(host.name, toString(host.port)); } +void MongoDBConfiguration::checkCollection() const +{ + /// The C driver builds the namespace as "." and asserts that the collection part is non-empty. + /// It treats the name as a NUL-terminated C string, so any embedded NUL truncates it and can produce an + /// effectively empty collection name, which aborts the process inside the driver. + if (collection.empty() || collection.find('\0') != String::npos) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "MongoDB collection name must be non-empty and must not contain NUL characters"); +} + StorageMongoDB::StorageMongoDB( const StorageID & table_id_, MongoDBConfiguration configuration_, @@ -223,6 +233,7 @@ static MongoDBConfiguration getConfigurationImpl(const StorageID * table_id, AST } configuration.checkHosts(context); + configuration.checkCollection(); return configuration; } diff --git a/src/Storages/StorageMongoDB.h b/src/Storages/StorageMongoDB.h index 7c8f6a913232..d9287ae6ddb2 100644 --- a/src/Storages/StorageMongoDB.h +++ b/src/Storages/StorageMongoDB.h @@ -46,6 +46,7 @@ struct MongoDBConfiguration std::unordered_set oid_fields = {"_id"}; void checkHosts(const ContextPtr & context) const; + void checkCollection() const; bool isOidColumn(const std::string & name) const { diff --git a/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.reference b/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.sql b/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.sql new file mode 100644 index 000000000000..fd2d59810dd5 --- /dev/null +++ b/tests/queries/0_stateless/04267_mongodb_empty_collection_crash.sql @@ -0,0 +1,25 @@ +-- Tags: no-fasttest + +-- An empty collection name or a name containing NUL bytes used to abort the server inside the C driver +-- (assertion failure in `_mongoc_cursor_collection`: `collection_len > 0`). +-- See https://github.com/ClickHouse/ClickHouse/issues/105773. + +-- Table function: 6-argument form `mongodb('host:port', database, collection, user, password, structure)`. +SELECT * FROM mongodb('test', 'db', '', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('test', 'db', '\0', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('test', 'db', 'col\0lection', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('test', 'db', '\0col', 'user', 'pass', 'x Int32'); -- { serverError BAD_ARGUMENTS } + +-- Table function: 3-argument form `mongodb(uri, collection, structure)`. +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', '', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', '\0', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', 'col\0lection', 'x Int32'); -- { serverError BAD_ARGUMENTS } +SELECT * FROM mongodb('mongodb://some-cluster:27017/db', '\0col', 'x Int32'); -- { serverError BAD_ARGUMENTS } + +-- The same problem reachable via the storage engine: `CREATE TABLE ... ENGINE = MongoDB(...)`. +DROP TABLE IF EXISTS t_mongo_empty_collection; +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('some-cluster:27017', 'db', '', 'user', 'pass'); -- { serverError BAD_ARGUMENTS } +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('some-cluster:27017', 'db', '\0', 'user', 'pass'); -- { serverError BAD_ARGUMENTS } +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('mongodb://some-cluster:27017/db', ''); -- { serverError BAD_ARGUMENTS } +CREATE TABLE t_mongo_empty_collection (x Int32) ENGINE = MongoDB('mongodb://some-cluster:27017/db', '\0'); -- { serverError BAD_ARGUMENTS } +DROP TABLE IF EXISTS t_mongo_empty_collection; diff --git a/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.reference b/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.sql b/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.sql new file mode 100644 index 000000000000..3a20837111dc --- /dev/null +++ b/tests/queries/0_stateless/04268_mongodb_dictionary_empty_collection.sql @@ -0,0 +1,22 @@ +-- Tags: no-fasttest + +-- Regression test for the dictionary path of https://github.com/ClickHouse/ClickHouse/issues/105773. +-- An empty collection name (or one containing NUL bytes) used to abort the server inside the C driver +-- when the dictionary source was loaded; now it must fail with BAD_ARGUMENTS. + +DROP DICTIONARY IF EXISTS dict_mongo_empty_collection; +CREATE DICTIONARY dict_mongo_empty_collection (id UInt64, name String) +PRIMARY KEY id +SOURCE(MONGODB(URI 'mongodb://example.test:27017/db' COLLECTION '')) +LIFETIME(0) +LAYOUT(FLAT()); +SELECT * FROM dict_mongo_empty_collection; -- { serverError BAD_ARGUMENTS } +DROP DICTIONARY dict_mongo_empty_collection; + +CREATE DICTIONARY dict_mongo_empty_collection (id UInt64, name String) +PRIMARY KEY id +SOURCE(MONGODB(URI 'mongodb://example.test:27017/db' COLLECTION '\0')) +LIFETIME(0) +LAYOUT(FLAT()); +SELECT * FROM dict_mongo_empty_collection; -- { serverError BAD_ARGUMENTS } +DROP DICTIONARY dict_mongo_empty_collection; From dae9ac3b57d3c710d82c1378b05eb99454823e33 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 27 May 2026 11:30:30 +0000 Subject: [PATCH 37/91] Backport #104300 to 25.8: Update mongo-c-driver to 2.3.0 --- contrib/mongo-c-driver | 2 +- contrib/mongo-c-driver-cmake/CMakeLists.txt | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contrib/mongo-c-driver b/contrib/mongo-c-driver index 529d7f0af3b8..a26c8e251fec 160000 --- a/contrib/mongo-c-driver +++ b/contrib/mongo-c-driver @@ -1 +1 @@ -Subproject commit 529d7f0af3b86d7da6ce90562cf9bcd10e8a3a0a +Subproject commit a26c8e251fec147258e89b7e85e9adfa259fc42f diff --git a/contrib/mongo-c-driver-cmake/CMakeLists.txt b/contrib/mongo-c-driver-cmake/CMakeLists.txt index 0b608517607c..fa856376c93f 100644 --- a/contrib/mongo-c-driver-cmake/CMakeLists.txt +++ b/contrib/mongo-c-driver-cmake/CMakeLists.txt @@ -5,13 +5,13 @@ if(NOT USE_MONGODB) endif() set(libbson_VERSION_MAJOR 2) -set(libbson_VERSION_MINOR 2) -set(libbson_VERSION_PATCH 2) -set(libbson_VERSION 2.2.2) +set(libbson_VERSION_MINOR 3) +set(libbson_VERSION_PATCH 0) +set(libbson_VERSION 2.3.0) set(libmongoc_VERSION_MAJOR 2) -set(libmongoc_VERSION_MINOR 2) -set(libmongoc_VERSION_PATCH 2) -set(libmongoc_VERSION 2.2.2) +set(libmongoc_VERSION_MINOR 3) +set(libmongoc_VERSION_PATCH 0) +set(libmongoc_VERSION 2.3.0) set(LIBBSON_SOURCES_ROOT "${ClickHouse_SOURCE_DIR}/contrib/mongo-c-driver/src") set(LIBBSON_SOURCE_DIR "${LIBBSON_SOURCES_ROOT}/libbson/src") From 139fc04e55a00264b167989a589133e3fe17fc35 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 27 May 2026 15:22:01 +0000 Subject: [PATCH 38/91] Backport #105535 to 25.8: Fix SEGFAULT in `singleValueOrNull` deserialization for JSON type --- .../AggregateFunctionSingleValueOrNull.cpp | 4 +-- ...ngleValueOrNull_json_deserialize.reference | 5 ++++ ...262_singleValueOrNull_json_deserialize.sql | 27 +++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.reference create mode 100644 tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.sql diff --git a/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp b/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp index 68d8676af377..96e1ebffa124 100644 --- a/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp +++ b/src/AggregateFunctions/AggregateFunctionSingleValueOrNull.cpp @@ -92,7 +92,7 @@ struct AggregateFunctionSingleValueOrNullData { ColumnNullable & col = typeid_cast(to); col.getNullMapColumn().insertDefault(); - data().insertResultInto(col.getNestedColumn(), result_type); + data().insertResultInto(col.getNestedColumn(), removeNullable(result_type)); } } }; @@ -169,7 +169,7 @@ class AggregateFunctionSingleValueOrNull final void deserialize(AggregateDataPtr place, ReadBuffer & buf, std::optional /* version */, Arena * arena) const override { - data(place).read(buf, *serialization, result_type, arena); + data(place).read(buf, *serialization, value_type, arena); } bool allocatesMemoryInArena() const override { return singleValueTypeAllocatesMemoryInArena(value_type->getTypeId()); } diff --git a/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.reference b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.reference new file mode 100644 index 000000000000..f2c122e01968 --- /dev/null +++ b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.reference @@ -0,0 +1,5 @@ +{"a":1} +{"a":1} +\N +1 \N +2 \N diff --git a/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.sql b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.sql new file mode 100644 index 000000000000..e92383088c95 --- /dev/null +++ b/tests/queries/0_stateless/04262_singleValueOrNull_json_deserialize.sql @@ -0,0 +1,27 @@ +-- Tags: no-fasttest + +-- Regression test for https://github.com/ClickHouse/ClickHouse/issues/103630 +-- singleValueOrNull(JSON) crashed with SEGFAULT during deserialization because +-- result_type (Nullable(JSON)) was passed instead of value_type (JSON) to +-- SingleValueDataGenericWithColumn::read, causing a type/serialization mismatch. + +SET enable_json_type = 1; + +-- Test 1: singleValueOrNull with JSON works correctly without MergeTree (no serialize/deserialize cycle). +SELECT singleValueOrNull(j) FROM (SELECT '{"a":1}'::JSON AS j); +SELECT singleValueOrNull(j) FROM (SELECT '{"a":1}'::JSON AS j FROM numbers(3)); +SELECT singleValueOrNull(j) FROM (SELECT if(number % 2, '{"a":1}', '{"b":2}')::JSON AS j FROM numbers(4)); + +-- Test 2: Deserialization from MergeTree must not crash. +-- Note: singleValueOrNull serialize/read methods do not persist first_value/is_null flags (see TODO in source), +-- so the deserialized state always appears empty and returns NULL. This is a known pre-existing limitation. +-- This test verifies the SEGFAULT is fixed (the server does not crash during deserialization). +DROP TABLE IF EXISTS t_single_value_or_null_json; +CREATE TABLE t_single_value_or_null_json (id UInt32, s AggregateFunction(singleValueOrNull, JSON)) ENGINE = MergeTree ORDER BY id; +INSERT INTO t_single_value_or_null_json SELECT 1, singleValueOrNullState(j) FROM (SELECT '{"a":1}'::JSON AS j); +INSERT INTO t_single_value_or_null_json SELECT 2, singleValueOrNullState(j) FROM (SELECT '{"b":"hello"}'::JSON AS j); + +-- This SELECT triggered SEGFAULT before the fix (deserialization of aggregate state). +SELECT id, singleValueOrNullMerge(s) FROM t_single_value_or_null_json GROUP BY id ORDER BY id; + +DROP TABLE t_single_value_or_null_json; From bc239de2be2b899dee714a89ddd51499825e7edd Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 2 Jun 2026 15:40:21 +0000 Subject: [PATCH 39/91] Backport #106077 to 25.8: Bump `curl` from 8.19 to 8.20 --- contrib/curl | 2 +- contrib/curl-cmake/CMakeLists.txt | 6 +++++- contrib/curl-cmake/curl_config.h | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/contrib/curl b/contrib/curl index 8c908d2d0a6d..a05f34973e6c 160000 --- a/contrib/curl +++ b/contrib/curl @@ -1 +1 @@ -Subproject commit 8c908d2d0a6d32abdedda2c52e90bd56ec76c24d +Subproject commit a05f34973e6c4bb629d018f7cb51487be1c904d8 diff --git a/contrib/curl-cmake/CMakeLists.txt b/contrib/curl-cmake/CMakeLists.txt index 8b74a53a51e0..4c134500953f 100644 --- a/contrib/curl-cmake/CMakeLists.txt +++ b/contrib/curl-cmake/CMakeLists.txt @@ -15,6 +15,7 @@ set (SRCS "${LIBRARY_DIR}/lib/asyn-thrdd.c" "${LIBRARY_DIR}/lib/bufq.c" "${LIBRARY_DIR}/lib/bufref.c" + "${LIBRARY_DIR}/lib/cf-dns.c" "${LIBRARY_DIR}/lib/cf-h1-proxy.c" "${LIBRARY_DIR}/lib/cf-h2-proxy.c" "${LIBRARY_DIR}/lib/cf-haproxy.c" @@ -37,7 +38,6 @@ set (SRCS "${LIBRARY_DIR}/lib/curl_memrchr.c" "${LIBRARY_DIR}/lib/curl_ntlm_core.c" "${LIBRARY_DIR}/lib/curl_range.c" - "${LIBRARY_DIR}/lib/curl_rtmp.c" "${LIBRARY_DIR}/lib/curl_sasl.c" "${LIBRARY_DIR}/lib/curl_sha512_256.c" "${LIBRARY_DIR}/lib/curl_share.c" @@ -47,6 +47,7 @@ set (SRCS "${LIBRARY_DIR}/lib/cw-out.c" "${LIBRARY_DIR}/lib/cw-pause.c" "${LIBRARY_DIR}/lib/dict.c" + "${LIBRARY_DIR}/lib/dnscache.c" "${LIBRARY_DIR}/lib/doh.c" "${LIBRARY_DIR}/lib/dynhds.c" "${LIBRARY_DIR}/lib/easy.c" @@ -100,6 +101,7 @@ set (SRCS "${LIBRARY_DIR}/lib/pingpong.c" "${LIBRARY_DIR}/lib/pop3.c" "${LIBRARY_DIR}/lib/progress.c" + "${LIBRARY_DIR}/lib/protocol.c" "${LIBRARY_DIR}/lib/psl.c" "${LIBRARY_DIR}/lib/rand.c" "${LIBRARY_DIR}/lib/ratelimit.c" @@ -123,6 +125,8 @@ set (SRCS "${LIBRARY_DIR}/lib/system_win32.c" "${LIBRARY_DIR}/lib/telnet.c" "${LIBRARY_DIR}/lib/tftp.c" + "${LIBRARY_DIR}/lib/thrdpool.c" + "${LIBRARY_DIR}/lib/thrdqueue.c" "${LIBRARY_DIR}/lib/transfer.c" "${LIBRARY_DIR}/lib/uint-bset.c" "${LIBRARY_DIR}/lib/uint-hash.c" diff --git a/contrib/curl-cmake/curl_config.h b/contrib/curl-cmake/curl_config.h index 0e42508dff0f..8fc920bb5158 100644 --- a/contrib/curl-cmake/curl_config.h +++ b/contrib/curl-cmake/curl_config.h @@ -55,8 +55,10 @@ #define ENABLE_IPV6 #define USE_OPENSSL -#define USE_THREADS_POSIX +#define HAVE_THREADS_POSIX #define USE_ARES +#define USE_RESOLV_ARES +#define CURL_ENABLE_NTLM #ifdef __illumos__ #define HAVE_POSIX_STRERROR_R 1 From 44575b3d812d641302412ef0875c184f9037f605 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 2 Jun 2026 15:45:39 +0000 Subject: [PATCH 40/91] Backport #105994 to 25.8: Use `postgres` REL_18_4 --- contrib/postgres | 2 +- contrib/postgres-cmake/CMakeLists.txt | 1 + contrib/postgres-cmake/pg_config.h | 17 +++++++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/contrib/postgres b/contrib/postgres index c37596dd61c5..ab6952af3ac8 160000 --- a/contrib/postgres +++ b/contrib/postgres @@ -1 +1 @@ -Subproject commit c37596dd61c5f2b8b7521fdbcdabc651bd9412c4 +Subproject commit ab6952af3ac8cdede654be4dc68f990b0352c213 diff --git a/contrib/postgres-cmake/CMakeLists.txt b/contrib/postgres-cmake/CMakeLists.txt index 93c5159300f3..46d7af59c870 100644 --- a/contrib/postgres-cmake/CMakeLists.txt +++ b/contrib/postgres-cmake/CMakeLists.txt @@ -56,6 +56,7 @@ set(SRCS "${POSTGRES_SOURCE_DIR}/src/port/pgstrcasecmp.c" "${POSTGRES_SOURCE_DIR}/src/port/pg_bitutils.c" "${POSTGRES_SOURCE_DIR}/src/port/path.c" + "${POSTGRES_SOURCE_DIR}/src/port/timingsafe_bcmp.c" ) if(NOT OS_DARWIN) diff --git a/contrib/postgres-cmake/pg_config.h b/contrib/postgres-cmake/pg_config.h index 12767588b94d..84e435838d41 100644 --- a/contrib/postgres-cmake/pg_config.h +++ b/contrib/postgres-cmake/pg_config.h @@ -618,19 +618,24 @@ #define PG_MAJORVERSION_NUM 18 /* PostgreSQL minor version number */ -#define PG_MINORVERSION_NUM 3 +#define PG_MINORVERSION_NUM 4 -/* Define to best printf format archetype, usually gnu_printf if available. */ -#define PG_PRINTF_ATTRIBUTE gnu_printf +/* Define to best C++ printf format archetype, usually gnu_printf if + available. */ +#define PG_CXX_PRINTF_ATTRIBUTE gnu_printf + +/* Define to best C printf format archetype, usually gnu_printf if available. + */ +#define PG_C_PRINTF_ATTRIBUTE gnu_printf /* PostgreSQL version as a string */ -#define PG_VERSION "18.3" +#define PG_VERSION "18.4" /* PostgreSQL version as a number */ -#define PG_VERSION_NUM 180003 +#define PG_VERSION_NUM 180004 /* A string containing the version number, platform, and C compiler */ -#define PG_VERSION_STR "PostgreSQL 18.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 15.2.1 20250813, 64-bit" +#define PG_VERSION_STR "PostgreSQL 18.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 15.2.1 20250813, 64-bit" /* Define to 1 to allow profiling output to be saved separately for each process. */ From 54e38403d1a3547e67f09db6dab840195c108b51 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 2 Jun 2026 15:48:22 +0000 Subject: [PATCH 41/91] Backport #105985 to 25.8: Bump libxml2 from 2.15.1 to 2.15.3 --- contrib/libxml2 | 2 +- contrib/libxml2-cmake/linux_x86_64/include/config.h | 6 +++--- .../linux_x86_64/include/libxml/xmlversion.h | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/libxml2 b/contrib/libxml2 index b7fa62cbe8ef..c94eb0210183 160000 --- a/contrib/libxml2 +++ b/contrib/libxml2 @@ -1 +1 @@ -Subproject commit b7fa62cbe8ef0df5869e000d5b690bdedd07f33e +Subproject commit c94eb0210183b9d7cb43f8e7fddc6be55843ef49 diff --git a/contrib/libxml2-cmake/linux_x86_64/include/config.h b/contrib/libxml2-cmake/linux_x86_64/include/config.h index 600e7570e990..8abacf912b82 100644 --- a/contrib/libxml2-cmake/linux_x86_64/include/config.h +++ b/contrib/libxml2-cmake/linux_x86_64/include/config.h @@ -77,7 +77,7 @@ #define PACKAGE_NAME "libxml2" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "libxml2 2.15.1" +#define PACKAGE_STRING "libxml2 2.15.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libxml2" @@ -86,7 +86,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "2.15.1" +#define PACKAGE_VERSION "2.15.3" /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for @@ -94,7 +94,7 @@ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "2.15.1" +#define VERSION "2.15.3" /* System configuration directory (/etc) */ #define XML_SYSCONFDIR "/usr/local/etc" diff --git a/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h b/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h index ff8b0ed8011b..e63ad461ce92 100644 --- a/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h +++ b/contrib/libxml2-cmake/linux_x86_64/include/libxml/xmlversion.h @@ -16,17 +16,17 @@ /** * the version string like "1.2.3" */ -#define LIBXML_DOTTED_VERSION "2.15.1" +#define LIBXML_DOTTED_VERSION "2.15.3" /** * the version number: 1.2.3 value is 10203 */ -#define LIBXML_VERSION 21501 +#define LIBXML_VERSION 21503 /** * the version number string, 1.2.3 value is "10203" */ -#define LIBXML_VERSION_STRING "21501" +#define LIBXML_VERSION_STRING "21503" /** * extra version information, used to show a git commit description @@ -37,7 +37,7 @@ * Macro to check that the libxml version in use is compatible with * the version the software has been compiled against */ -#define LIBXML_TEST_VERSION xmlCheckVersion(21501); +#define LIBXML_TEST_VERSION xmlCheckVersion(21503); #if 1 /** From 1d7a488dcae281076b2f5a216300a9e939d87b07 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 4 Jun 2026 11:18:46 +0000 Subject: [PATCH 42/91] Backport #106287 to 25.8: Bump mariadb-connector-c to 3.1.29 --- contrib/mariadb-connector-c | 2 +- contrib/mariadb-connector-c-cmake/CMakeLists.txt | 10 +++++++++- tests/integration/helpers/port_forward.py | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/contrib/mariadb-connector-c b/contrib/mariadb-connector-c index d0a788c5b9fc..95d6264bb43d 160000 --- a/contrib/mariadb-connector-c +++ b/contrib/mariadb-connector-c @@ -1 +1 @@ -Subproject commit d0a788c5b9fcaca2368d9233770d3ca91ea79f88 +Subproject commit 95d6264bb43d31f825cf2f85ce1928557457b62d diff --git a/contrib/mariadb-connector-c-cmake/CMakeLists.txt b/contrib/mariadb-connector-c-cmake/CMakeLists.txt index 9840009b628f..8c5ff513ae37 100644 --- a/contrib/mariadb-connector-c-cmake/CMakeLists.txt +++ b/contrib/mariadb-connector-c-cmake/CMakeLists.txt @@ -43,6 +43,14 @@ MATH(EXPR MARIADB_VERSION_ID "${MARIADB_CLIENT_VERSION_MAJOR} * 10000 + ${MARIADB_CLIENT_VERSION_MINOR} * 100 + ${MARIADB_CLIENT_VERSION_PATCH}") +set(CPACK_PACKAGE_VERSION_MAJOR 3) +set(CPACK_PACKAGE_VERSION_MINOR 1) +set(CPACK_PACKAGE_VERSION_PATCH 29) +set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") +MATH(EXPR MARIADB_PACKAGE_VERSION_ID "${CPACK_PACKAGE_VERSION_MAJOR} * 10000 + + ${CPACK_PACKAGE_VERSION_MINOR} * 100 + + ${CPACK_PACKAGE_VERSION_PATCH}") + IF (NOT MARIADB_PORT) set(MARIADB_PORT 3306) ENDIF () @@ -207,7 +215,7 @@ set(LIBMARIADB_SOURCES ${LIBMARIADB_SOURCES} ${CC_SOURCE_DIR}/plugins/auth/my_auth.c ${CC_SOURCE_DIR}/libmariadb/ma_array.c ${CC_SOURCE_DIR}/libmariadb/ma_charset.c -${CC_SOURCE_DIR}/libmariadb/ma_hash.c +${CC_SOURCE_DIR}/libmariadb/ma_hashtbl.c ${CC_SOURCE_DIR}/libmariadb/ma_net.c ${CC_SOURCE_DIR}/libmariadb/mariadb_charset.c ${CC_SOURCE_DIR}/libmariadb/ma_time.c diff --git a/tests/integration/helpers/port_forward.py b/tests/integration/helpers/port_forward.py index 230f434e04b2..9f29688d4fd4 100644 --- a/tests/integration/helpers/port_forward.py +++ b/tests/integration/helpers/port_forward.py @@ -70,6 +70,10 @@ def termination(connection: socket.socket, idx: int): def start(self, address, listen_port=0): self._address = address self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # Allow rebinding to the same fixed port immediately after stop(): the + # previously accepted connection lingers in TIME_WAIT on this port, so + # without SO_REUSEADDR bind() fails with "Address already in use". + self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._sock.bind(("", listen_port)) self._sock.listen() self._sock.settimeout(1) From 5cb401e077f5788266be390e93be2f97cb2b6f2e Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 4 Jun 2026 13:24:53 +0000 Subject: [PATCH 43/91] Backport #106105 to 25.8: Fix `system.dictionaries` returning 0 rows with partial `SHOW DICTIONARIES` revoke --- .../System/StorageSystemCompletions.cpp | 5 +-- .../System/StorageSystemDictionaries.cpp | 7 +-- ...stem_dictionaries_partial_revoke.reference | 2 + ...4268_system_dictionaries_partial_revoke.sh | 43 +++++++++++++++++++ 4 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.reference create mode 100755 tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.sh diff --git a/src/Storages/System/StorageSystemCompletions.cpp b/src/Storages/System/StorageSystemCompletions.cpp index 16bdee3ff29d..616731172155 100644 --- a/src/Storages/System/StorageSystemCompletions.cpp +++ b/src/Storages/System/StorageSystemCompletions.cpp @@ -272,8 +272,7 @@ void fillDataWithPolicies(MutableColumns & res_columns, const ContextPtr & conte void fillDataWithDictionaries(MutableColumns & res_columns, const ContextPtr & context) { const auto & access = context->getAccess(); - if (access->isGranted(AccessType::SHOW_DICTIONARIES)) - return; + const bool need_to_check_access_for_dictionaries = !access->isGranted(AccessType::SHOW_DICTIONARIES); const auto & external_dictionaries = context->getExternalDictionariesLoader(); for (const auto & load_result : external_dictionaries.getLoadResults()) @@ -289,7 +288,7 @@ void fillDataWithDictionaries(MutableColumns & res_columns, const ContextPtr & c dict_id.table_name = load_result.name; String db_or_tag = dict_id.database_name.empty() ? IDictionary::NO_DATABASE_TAG : dict_id.database_name; - if (!access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) + if (need_to_check_access_for_dictionaries && !access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) continue; res_columns[0]->insert(dict_id.table_name); res_columns[1]->insert(DICTIONARY_CONTEXT); diff --git a/src/Storages/System/StorageSystemDictionaries.cpp b/src/Storages/System/StorageSystemDictionaries.cpp index 1926093f56d3..49a2856be5db 100644 --- a/src/Storages/System/StorageSystemDictionaries.cpp +++ b/src/Storages/System/StorageSystemDictionaries.cpp @@ -104,13 +104,10 @@ ColumnsDescription StorageSystemDictionaries::getColumnsDescription() void StorageSystemDictionaries::fillData(MutableColumns & res_columns, ContextPtr context, const ActionsDAG::Node *, std::vector) const { const auto access = context->getAccess(); - const bool check_access_for_dictionaries = access->isGranted(AccessType::SHOW_DICTIONARIES); + const bool need_to_check_access_for_dictionaries = !access->isGranted(AccessType::SHOW_DICTIONARIES); const auto & external_dictionaries = context->getExternalDictionariesLoader(); - if (!check_access_for_dictionaries) - return; - for (const auto & load_result : external_dictionaries.getLoadResults()) { const auto dict_ptr = std::dynamic_pointer_cast(load_result.object); @@ -121,7 +118,7 @@ void StorageSystemDictionaries::fillData(MutableColumns & res_columns, ContextPt StorageID dict_id = getDictionaryID(load_result, dict_ptr); String db_or_tag = dict_id.database_name.empty() ? IDictionary::NO_DATABASE_TAG : dict_id.database_name; - if (!access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) + if (need_to_check_access_for_dictionaries && !access->isGranted(AccessType::SHOW_DICTIONARIES, db_or_tag, dict_id.table_name)) continue; size_t i = 0; diff --git a/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.reference b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.reference new file mode 100644 index 000000000000..19567e7d2bac --- /dev/null +++ b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.reference @@ -0,0 +1,2 @@ +test_dict_04268 +1 diff --git a/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.sh b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.sh new file mode 100755 index 000000000000..974cfcc74a8b --- /dev/null +++ b/tests/queries/0_stateless/04268_system_dictionaries_partial_revoke.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +# Test that system.dictionaries shows dictionaries when SHOW DICTIONARIES +# has a partial revoke on an unrelated table. + +USER="test_user_04268_${CLICKHOUSE_DATABASE}" +ROLE="test_role_04268_${CLICKHOUSE_DATABASE}" +DICT="${CLICKHOUSE_DATABASE}.test_dict_04268" + +${CLICKHOUSE_CLIENT} -q "DROP DICTIONARY IF EXISTS ${DICT}" +${CLICKHOUSE_CLIENT} -q "DROP USER IF EXISTS ${USER}" +${CLICKHOUSE_CLIENT} -q "DROP ROLE IF EXISTS ${ROLE}" + +${CLICKHOUSE_CLIENT} -q " + CREATE DICTIONARY ${DICT} (id UInt64, value String) + PRIMARY KEY id + SOURCE(CLICKHOUSE(TABLE 'numbers' DB 'system')) + LIFETIME(MIN 0 MAX 300) + LAYOUT(FLAT()) +" + +# Create role with SHOW DICTIONARIES and a partial revoke on an unrelated table +${CLICKHOUSE_CLIENT} -q "CREATE ROLE ${ROLE}" +${CLICKHOUSE_CLIENT} -q "GRANT SHOW DICTIONARIES, SELECT ON *.* TO ${ROLE}" +${CLICKHOUSE_CLIENT} -q "REVOKE SHOW DICTIONARIES, SELECT ON system.non_existing_table FROM ${ROLE}" + +${CLICKHOUSE_CLIENT} -q "CREATE USER ${USER} IDENTIFIED WITH no_password" +${CLICKHOUSE_CLIENT} -q "GRANT ${ROLE} TO ${USER}" + +# The dictionary should be visible despite the partial revoke +${CLICKHOUSE_CLIENT} --user "${USER}" -q "SELECT name FROM system.dictionaries WHERE database = '${CLICKHOUSE_DATABASE}' AND name = 'test_dict_04268'" + +# The dictionary should also appear in system.completions +${CLICKHOUSE_CLIENT} --user "${USER}" -q "SELECT count() > 0 FROM system.completions WHERE word = 'test_dict_04268'" + +# Cleanup +${CLICKHOUSE_CLIENT} -q "DROP DICTIONARY IF EXISTS ${DICT}" +${CLICKHOUSE_CLIENT} -q "DROP USER IF EXISTS ${USER}" +${CLICKHOUSE_CLIENT} -q "DROP ROLE IF EXISTS ${ROLE}" From 55a561c6a2ff835053ac46e0422778266d213cd0 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 4 Jun 2026 15:22:11 +0000 Subject: [PATCH 44/91] Backport #105464 to 25.8: Fix SIGSEGV when reading Dynamic subcolumns from compressed Memory table after ALTER --- src/Interpreters/getColumnFromBlock.cpp | 2 +- .../04260_dynamic_subcolumn_compressed_memory.reference | 5 +++++ .../04260_dynamic_subcolumn_compressed_memory.sql | 9 +++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.reference create mode 100644 tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.sql diff --git a/src/Interpreters/getColumnFromBlock.cpp b/src/Interpreters/getColumnFromBlock.cpp index 450808befa48..a4438fa1fe5e 100644 --- a/src/Interpreters/getColumnFromBlock.cpp +++ b/src/Interpreters/getColumnFromBlock.cpp @@ -45,7 +45,7 @@ ColumnPtr tryGetSubcolumnFromBlock(const Block & block, const DataTypePtr & requ /// extract the subcolumn, because the data of dynamic subcolumn can change after cast. if ((elem->type->hasDynamicSubcolumns() || requested_column_type->hasDynamicSubcolumns()) && !elem->type->equals(*requested_column_type)) { - auto cast_column = castColumn({elem->column, elem->type, ""}, requested_column_type); + auto cast_column = castColumn({elem->column->decompress(), elem->type, ""}, requested_column_type); auto elem_column = requested_column_type->tryGetSubcolumn(subcolumn_name, cast_column); auto elem_type = requested_column_type->tryGetSubcolumnType(subcolumn_name); diff --git a/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.reference b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.reference new file mode 100644 index 000000000000..9dfcf39f5a78 --- /dev/null +++ b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.reference @@ -0,0 +1,5 @@ +0 +1 +2 +3 +4 diff --git a/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.sql b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.sql new file mode 100644 index 000000000000..6010c771dc12 --- /dev/null +++ b/tests/queries/0_stateless/04260_dynamic_subcolumn_compressed_memory.sql @@ -0,0 +1,9 @@ +-- Tags: memory-engine +SET allow_experimental_dynamic_type=1; + +DROP TABLE IF EXISTS test_dynamic_compressed; +CREATE TABLE test_dynamic_compressed (d Dynamic) ENGINE=Memory SETTINGS compress=1; +INSERT INTO test_dynamic_compressed SELECT number FROM numbers(5); +ALTER TABLE test_dynamic_compressed MODIFY COLUMN d Dynamic(max_types=0); +SELECT d.UInt64 FROM test_dynamic_compressed ORDER BY d.UInt64; +DROP TABLE test_dynamic_compressed; From d7b117bd46ddda3f46db22be1895c85d9bb4ba71 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 5 Jun 2026 11:26:42 +0000 Subject: [PATCH 45/91] Backport #105579 to 25.8: Fix nullptr deref in CREATE TABLE TO INNER UUID without ENGINE --- src/Parsers/ParserCreateQuery.cpp | 5 ++++- ...04272_create_table_to_inner_uuid_without_engine.reference | 2 ++ .../04272_create_table_to_inner_uuid_without_engine.sql | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.reference create mode 100644 tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.sql diff --git a/src/Parsers/ParserCreateQuery.cpp b/src/Parsers/ParserCreateQuery.cpp index 243fe3fcba0b..76bae95bbce9 100644 --- a/src/Parsers/ParserCreateQuery.cpp +++ b/src/Parsers/ParserCreateQuery.cpp @@ -973,7 +973,10 @@ bool ParserCreateTableQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expe if (to_inner_uuid) { if (!storage || !storage->engine || (storage->engine->name != "SharedSet" && storage->engine->name != "SharedJoin")) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "Storage engine {} does not inner UUID", storage->engine->name); + { + const String engine_name = (storage && storage->engine) ? storage->engine->name : "(no engine)"; + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Storage engine {} does not support inner UUID", engine_name); + } if (targets) throw Exception(ErrorCodes::BAD_ARGUMENTS, "targets are already defined {}", targets->formatForErrorMessage()); diff --git a/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.reference b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.reference new file mode 100644 index 000000000000..c8fd20ceb261 --- /dev/null +++ b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.reference @@ -0,0 +1,2 @@ +no engine +wrong engine diff --git a/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.sql b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.sql new file mode 100644 index 000000000000..d3e9e9b367f4 --- /dev/null +++ b/tests/queries/0_stateless/04272_create_table_to_inner_uuid_without_engine.sql @@ -0,0 +1,2 @@ +SELECT 'no engine'; CREATE TABLE t TO INNER UUID '00000000-0000-0000-0000-000000000001' (id UInt32) ORDER BY id; -- { clientError BAD_ARGUMENTS } +SELECT 'wrong engine'; CREATE TABLE t TO INNER UUID '00000000-0000-0000-0000-000000000001' (id UInt32) ENGINE = MergeTree ORDER BY id; -- { clientError BAD_ARGUMENTS } From ebaf79cd7e8cca807d51407e34ccb4c7ab6b2214 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 8 Jun 2026 19:11:37 +0000 Subject: [PATCH 46/91] Backport #105666 to 25.8: Fix OOB read in flattened Dynamic column Native deserialization --- .../Serializations/SerializationDynamic.cpp | 7 +++++++ ...c_flattened_underfilled_type_data.reference | 1 + ..._dynamic_flattened_underfilled_type_data.sh | 17 +++++++++++++++++ .../dynamic_flattened_underfilled.native | Bin 0 -> 51 bytes 4 files changed, 25 insertions(+) create mode 100644 tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.reference create mode 100755 tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.sh create mode 100644 tests/queries/0_stateless/data_native/dynamic_flattened_underfilled.native diff --git a/src/DataTypes/Serializations/SerializationDynamic.cpp b/src/DataTypes/Serializations/SerializationDynamic.cpp index e21836f408bf..6ccb1bd8992d 100644 --- a/src/DataTypes/Serializations/SerializationDynamic.cpp +++ b/src/DataTypes/Serializations/SerializationDynamic.cpp @@ -636,6 +636,13 @@ void SerializationDynamic::deserializeBinaryBulkWithMultipleStreams( { ColumnPtr type_column = flattened_column.types[i]->createColumn(); flattened_column.types[i]->getDefaultSerialization()->deserializeBinaryBulkWithMultipleStreams(type_column, 0, flattened_limits[i], settings, dynamic_state->flattened_states[i], cache); + if (type_column->size() != flattened_limits[i]) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Mismatch in flattened Dynamic column: indexes declare {} rows for type {}, but only {} rows were deserialized", + flattened_limits[i], + flattened_column.types[i]->getName(), + type_column->size()); flattened_column.columns.emplace_back(std::move(type_column)); } diff --git a/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.reference b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.reference new file mode 100644 index 000000000000..1e6d4f95a01a --- /dev/null +++ b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.reference @@ -0,0 +1 @@ +Mismatch in flattened Dynamic column: indexes declare 2 rows for type FixedString(8), but only 0 rows were deserialized diff --git a/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.sh b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.sh new file mode 100755 index 000000000000..e09d325ce352 --- /dev/null +++ b/tests/queries/0_stateless/04267_dynamic_flattened_underfilled_type_data.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Tags: no-fasttest + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +# Test that reading a Native file with a flattened Dynamic column where the +# type data stream has fewer rows than declared by the indexes column produces +# an error instead of reading uninitialized memory. +# +# The file data_native/dynamic_flattened_underfilled.native is a truncated +# Native file with flattened Dynamic serialization for Dynamic(max_types=1) +# declaring 2 rows of FixedString(8) via the indexes column, but providing +# zero bytes of actual FixedString data. + +$CLICKHOUSE_LOCAL --table test --input-format Native -q "SELECT * FROM test" < "${CUR_DIR}/data_native/dynamic_flattened_underfilled.native" 2>&1 | grep -o 'Mismatch in flattened Dynamic column[^.]*' diff --git a/tests/queries/0_stateless/data_native/dynamic_flattened_underfilled.native b/tests/queries/0_stateless/data_native/dynamic_flattened_underfilled.native new file mode 100644 index 0000000000000000000000000000000000000000..20586739707c6e4282c75ed22d33115e6c36f33f GIT binary patch literal 51 zcmZQ%VoVWnsmx2v%}mzFO{|D7sVqn>wl&mbW`F=jKDW$@)Rf?oqRhN>4GT>M1^`;` B4BY?# literal 0 HcmV?d00001 From d27c080ce6bb4f34bf940912ce353002c3a714da Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 8 Jun 2026 19:14:30 +0000 Subject: [PATCH 47/91] Backport #105582 to 25.8: Fix crash in Values format when tuples have different sizes --- .../Formats/Impl/ConstantExpressionTemplate.cpp | 3 +++ ...04267_values_template_tuple_size_mismatch.reference | 4 ++++ .../04267_values_template_tuple_size_mismatch.sql | 10 ++++++++++ 3 files changed, 17 insertions(+) create mode 100644 tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.reference create mode 100644 tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.sql diff --git a/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp b/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp index 0e25a98a3218..6f5f41f48175 100644 --- a/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp +++ b/src/Processors/Formats/Impl/ConstantExpressionTemplate.cpp @@ -586,6 +586,9 @@ bool ConstantExpressionTemplate::parseLiteralAndAssertType( nested_types = map_type->getKeyValueTypes(); } + if (nested_types.size() != type_info.nested_types.size()) + return false; + for (size_t i = 0; i < nested_types.size(); ++i) { const auto & [nested_field_type, is_nullable] = type_info.nested_types[i]; diff --git a/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.reference b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.reference new file mode 100644 index 000000000000..a28d0ccb88ae --- /dev/null +++ b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.reference @@ -0,0 +1,4 @@ +(1,2) +(1,2) +(1,2,3) +(1,2,3) diff --git a/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.sql b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.sql new file mode 100644 index 000000000000..5fee3b4c104f --- /dev/null +++ b/tests/queries/0_stateless/04267_values_template_tuple_size_mismatch.sql @@ -0,0 +1,10 @@ +-- Regression test for https://github.com/ClickHouse/ClickHouse/issues/101727 +-- Tuples of different sizes in VALUES should not cause OOB access in template parser. +DROP TABLE IF EXISTS t_tuple_size_mismatch; +CREATE TABLE t_tuple_size_mismatch (c0 String) ENGINE = Memory; + +INSERT INTO TABLE t_tuple_size_mismatch (c0) VALUES ((1, 2)), ((1, 2, 3)); +INSERT INTO TABLE t_tuple_size_mismatch (c0) VALUES ((1, 2, 3)), ((1, 2)); + +SELECT * FROM t_tuple_size_mismatch ORDER BY c0; +DROP TABLE t_tuple_size_mismatch; From 989dbdfec3bfe17a665c8495d69e0a86792b9d26 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 8 Jun 2026 23:40:15 +0000 Subject: [PATCH 48/91] Backport #106741 to 25.8: Fix heap buffer overflow in decodeHTMLComponent with expanding HTML entities --- src/Functions/CMakeLists.txt | 2 + .../HTMLCharacterReference.generated.cpp | 35156 ++++++++-------- src/Functions/HTMLCharacterReference.gperf | 24 + src/Functions/HTMLCharacterReference.sh | 32 + src/Functions/decodeHTMLComponent.cpp | 11 +- ...tml_component_expanding_entities.reference | 5 + ...code_html_component_expanding_entities.sql | 14 + 7 files changed, 17668 insertions(+), 17576 deletions(-) create mode 100644 tests/queries/0_stateless/04325_decode_html_component_expanding_entities.reference create mode 100644 tests/queries/0_stateless/04325_decode_html_component_expanding_entities.sql diff --git a/src/Functions/CMakeLists.txt b/src/Functions/CMakeLists.txt index 6b7355dca5d6..232f114652ec 100644 --- a/src/Functions/CMakeLists.txt +++ b/src/Functions/CMakeLists.txt @@ -164,6 +164,8 @@ if (USE_GPERF) && clang-format -i HTMLCharacterReference.generated.cpp # for clang-tidy, since string.h is deprecated && sed -i 's/\#include /\#include /g' HTMLCharacterReference.generated.cpp + # the table must be constexpr for the compile-time entity-expansion static_assert in the .gperf + && sed -i 's/static const struct NameAndGlyph wordlist/static constexpr struct NameAndGlyph wordlist/g' HTMLCharacterReference.generated.cpp SOURCES HTMLCharacterReference.gperf WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) diff --git a/src/Functions/HTMLCharacterReference.generated.cpp b/src/Functions/HTMLCharacterReference.generated.cpp index dec2f2695de4..4efbf3bfd82d 100644 --- a/src/Functions/HTMLCharacterReference.generated.cpp +++ b/src/Functions/HTMLCharacterReference.generated.cpp @@ -1,5 +1,5 @@ /* C++ code produced by gperf version 3.1 */ -/* Command-line: /usr/bin/gperf -t --output-file=HTMLCharacterReference.generated.cpp HTMLCharacterReference.gperf */ +/* Command-line: gperf -t --output-file=HTMLCharacterReference.generated.cpp HTMLCharacterReference.gperf */ /* Computed positions: -k'1-8,12,14' */ #if !( \ @@ -15,10 +15,10 @@ && ('q' == 113) && ('r' == 114) && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) && ('w' == 119) && ('x' == 120) \ && ('y' == 121) && ('z' == 122) && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ -# error "gperf generated tables don't work with this execution character set. Please report a bug to ." +#error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif -#line 7 "HTMLCharacterReference.gperf" +#line 8 "HTMLCharacterReference.gperf" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" @@ -27,7 +27,7 @@ #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #pragma GCC diagnostic ignored "-Wshorten-64-to-32" // NOLINTBEGIN(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum) -#line 16 "HTMLCharacterReference.gperf" +#line 17 "HTMLCharacterReference.gperf" struct NameAndGlyph { const char * name; @@ -73,17791 +73,17780 @@ inline unsigned int HTMLCharacterHash::hash(const char * str, size_t len) switch (hval) { - default: - hval += asso_values[static_cast(str[13])]; + default: hval += asso_values[static_cast(str[13])]; /*FALLTHROUGH*/ case 13: - case 12: - hval += asso_values[static_cast(str[11])]; + case 12: hval += asso_values[static_cast(str[11])]; /*FALLTHROUGH*/ case 11: case 10: case 9: - case 8: - hval += asso_values[static_cast(str[7])]; + case 8: hval += asso_values[static_cast(str[7])]; /*FALLTHROUGH*/ - case 7: - hval += asso_values[static_cast(str[6] + 1)]; + case 7: hval += asso_values[static_cast(str[6] + 1)]; /*FALLTHROUGH*/ - case 6: - hval += asso_values[static_cast(str[5] + 2)]; + case 6: hval += asso_values[static_cast(str[5] + 2)]; /*FALLTHROUGH*/ - case 5: - hval += asso_values[static_cast(str[4] + 3)]; + case 5: hval += asso_values[static_cast(str[4] + 3)]; /*FALLTHROUGH*/ - case 4: - hval += asso_values[static_cast(str[3] + 5)]; + case 4: hval += asso_values[static_cast(str[3] + 5)]; /*FALLTHROUGH*/ - case 3: - hval += asso_values[static_cast(str[2] + 1)]; + case 3: hval += asso_values[static_cast(str[2] + 1)]; /*FALLTHROUGH*/ - case 2: - hval += asso_values[static_cast(str[1])]; + case 2: hval += asso_values[static_cast(str[1])]; /*FALLTHROUGH*/ - case 1: - hval += asso_values[static_cast(str[0] + 13)]; - break; + case 1: hval += asso_values[static_cast(str[0] + 13)]; break; } return hval; } -const struct NameAndGlyph * HTMLCharacterHash::Lookup(const char * str, size_t len) -{ - static const struct NameAndGlyph wordlist[] - = {{""}, - {""}, -#line 1155 "HTMLCharacterReference.gperf" - {"gt", ">"}, +static constexpr struct NameAndGlyph wordlist[] + = {{""}, + {""}, #line 1156 "HTMLCharacterReference.gperf" - {"gt;", ">"}, - {""}, - {""}, - {""}, -#line 1410 "HTMLCharacterReference.gperf" - {"lt", "<"}, + {"gt", ">"}, +#line 1157 "HTMLCharacterReference.gperf" + {"gt;", ">"}, + {""}, + {""}, + {""}, #line 1411 "HTMLCharacterReference.gperf" - {"lt;", "<"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 704 "HTMLCharacterReference.gperf" - {"ap;", "≈"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1398 "HTMLCharacterReference.gperf" - {"lrm;", "‎"}, - {""}, - {""}, - {""}, - {""}, -#line 1062 "HTMLCharacterReference.gperf" - {"eta;", "η"}, -#line 1044 "HTMLCharacterReference.gperf" - {"epsi;", "ε"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1046 "HTMLCharacterReference.gperf" - {"epsiv;", "ϵ"}, - {""}, - {""}, - {""}, - {""}, -#line 1148 "HTMLCharacterReference.gperf" - {"gnsim;", "⋧"}, - {""}, - {""}, - {""}, - {""}, -#line 1373 "HTMLCharacterReference.gperf" - {"lnsim;", "⋦"}, - {""}, - {""}, - {""}, -#line 601 "HTMLCharacterReference.gperf" - {"Upsi;", "ϒ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1392 "HTMLCharacterReference.gperf" - {"lpar;", "("}, - {""}, - {""}, - {""}, - {""}, -#line 1041 "HTMLCharacterReference.gperf" - {"epar;", "⋕"}, - {""}, - {""}, - {""}, - {""}, -#line 1038 "HTMLCharacterReference.gperf" - {"ensp;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1049 "HTMLCharacterReference.gperf" - {"eqsim;", "≂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1143 "HTMLCharacterReference.gperf" - {"gnap;", "⪊"}, - {""}, - {""}, - {""}, - {""}, -#line 1368 "HTMLCharacterReference.gperf" - {"lnap;", "⪉"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"lt", "<"}, +#line 1412 "HTMLCharacterReference.gperf" + {"lt;", "<"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 705 "HTMLCharacterReference.gperf" + {"ap;", "≈"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1399 "HTMLCharacterReference.gperf" + {"lrm;", "‎"}, + {""}, + {""}, + {""}, + {""}, +#line 1063 "HTMLCharacterReference.gperf" + {"eta;", "η"}, +#line 1045 "HTMLCharacterReference.gperf" + {"epsi;", "ε"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1047 "HTMLCharacterReference.gperf" + {"epsiv;", "ϵ"}, + {""}, + {""}, + {""}, + {""}, +#line 1149 "HTMLCharacterReference.gperf" + {"gnsim;", "⋧"}, + {""}, + {""}, + {""}, + {""}, +#line 1374 "HTMLCharacterReference.gperf" + {"lnsim;", "⋦"}, + {""}, + {""}, + {""}, +#line 602 "HTMLCharacterReference.gperf" + {"Upsi;", "ϒ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1393 "HTMLCharacterReference.gperf" + {"lpar;", "("}, + {""}, + {""}, + {""}, + {""}, +#line 1042 "HTMLCharacterReference.gperf" + {"epar;", "⋕"}, + {""}, + {""}, + {""}, + {""}, +#line 1039 "HTMLCharacterReference.gperf" + {"ensp;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1050 "HTMLCharacterReference.gperf" + {"eqsim;", "≂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1144 "HTMLCharacterReference.gperf" + {"gnap;", "⪊"}, + {""}, + {""}, + {""}, + {""}, +#line 1369 "HTMLCharacterReference.gperf" + {"lnap;", "⪉"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2199 "HTMLCharacterReference.gperf" + {"wr;", "≀"}, + {""}, + {""}, + {""}, + {""}, #line 2198 "HTMLCharacterReference.gperf" - {"wr;", "≀"}, - {""}, - {""}, - {""}, - {""}, -#line 2197 "HTMLCharacterReference.gperf" - {"wp;", "℘"}, -#line 917 "HTMLCharacterReference.gperf" - {"cup;", "∪"}, -#line 1420 "HTMLCharacterReference.gperf" - {"ltri;", "◃"}, -#line 1394 "HTMLCharacterReference.gperf" - {"lrarr;", "⇆"}, - {""}, - {""}, - {""}, - {""}, -#line 1058 "HTMLCharacterReference.gperf" - {"erarr;", "⥱"}, - {""}, - {""}, -#line 1065 "HTMLCharacterReference.gperf" - {"euml", "ë"}, + {"wp;", "℘"}, +#line 918 "HTMLCharacterReference.gperf" + {"cup;", "∪"}, +#line 1421 "HTMLCharacterReference.gperf" + {"ltri;", "◃"}, +#line 1395 "HTMLCharacterReference.gperf" + {"lrarr;", "⇆"}, + {""}, + {""}, + {""}, + {""}, +#line 1059 "HTMLCharacterReference.gperf" + {"erarr;", "⥱"}, + {""}, + {""}, #line 1066 "HTMLCharacterReference.gperf" - {"euml;", "ë"}, -#line 903 "HTMLCharacterReference.gperf" - {"crarr;", "↵"}, - {""}, - {""}, - {""}, -#line 1179 "HTMLCharacterReference.gperf" - {"hbar;", "ℏ"}, - {""}, - {""}, - {""}, -#line 720 "HTMLCharacterReference.gperf" - {"auml", "ä"}, + {"euml", "ë"}, +#line 1067 "HTMLCharacterReference.gperf" + {"euml;", "ë"}, +#line 904 "HTMLCharacterReference.gperf" + {"crarr;", "↵"}, + {""}, + {""}, + {""}, +#line 1180 "HTMLCharacterReference.gperf" + {"hbar;", "ℏ"}, + {""}, + {""}, + {""}, #line 721 "HTMLCharacterReference.gperf" - {"auml;", "ä"}, -#line 1303 "HTMLCharacterReference.gperf" - {"lbarr;", "⤌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 606 "HTMLCharacterReference.gperf" - {"Uuml", "Ü"}, + {"auml", "ä"}, +#line 722 "HTMLCharacterReference.gperf" + {"auml;", "ä"}, +#line 1304 "HTMLCharacterReference.gperf" + {"lbarr;", "⤌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 607 "HTMLCharacterReference.gperf" - {"Uuml;", "Ü"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1067 "HTMLCharacterReference.gperf" - {"euro;", "€"}, - {""}, - {""}, - {""}, - {""}, -#line 998 "HTMLCharacterReference.gperf" - {"dtri;", "▿"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 922 "HTMLCharacterReference.gperf" - {"cupor;", "⩅"}, - {""}, - {""}, -#line 715 "HTMLCharacterReference.gperf" - {"ast;", "*"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 774 "HTMLCharacterReference.gperf" - {"bnot;", "⌐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 995 "HTMLCharacterReference.gperf" - {"dsol;", "⧶"}, -#line 1000 "HTMLCharacterReference.gperf" - {"duarr;", "⇵"}, - {""}, -#line 1250 "HTMLCharacterReference.gperf" - {"it;", "⁢"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1037 "HTMLCharacterReference.gperf" - {"eng;", "ŋ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 684 "HTMLCharacterReference.gperf" - {"ang;", "∠"}, -#line 891 "HTMLCharacterReference.gperf" - {"comp;", "∁"}, - {""}, - {""}, -#line 1225 "HTMLCharacterReference.gperf" - {"in;", "∈"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 979 "HTMLCharacterReference.gperf" - {"dot;", "˙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1006 "HTMLCharacterReference.gperf" - {"eDot;", "≑"}, -#line 1375 "HTMLCharacterReference.gperf" - {"loarr;", "⇽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 668 "HTMLCharacterReference.gperf" - {"af;", "⁡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1145 "HTMLCharacterReference.gperf" - {"gne;", "⪈"}, -#line 836 "HTMLCharacterReference.gperf" - {"bump;", "≎"}, - {""}, - {""}, - {""}, -#line 1370 "HTMLCharacterReference.gperf" - {"lne;", "⪇"}, - {""}, -#line 696 "HTMLCharacterReference.gperf" - {"angrt;", "∟"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 325 "HTMLCharacterReference.gperf" - {"Lt;", "≪"}, -#line 707 "HTMLCharacterReference.gperf" - {"ape;", "≊"}, -#line 733 "HTMLCharacterReference.gperf" - {"bbrk;", "⎵"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1230 "HTMLCharacterReference.gperf" - {"int;", "∫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1054 "HTMLCharacterReference.gperf" - {"equiv;", "≡"}, - {""}, - {""}, - {""}, -#line 831 "HTMLCharacterReference.gperf" - {"bsol;", "\\"}, -#line 1188 "HTMLCharacterReference.gperf" - {"hoarr;", "⇿"}, - {""}, - {""}, - {""}, - {""}, -#line 1421 "HTMLCharacterReference.gperf" - {"ltrie;", "⊴"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1042 "HTMLCharacterReference.gperf" - {"eparsl;", "⧣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1090 "HTMLCharacterReference.gperf" - {"frac12", "½"}, + {"Uuml", "Ü"}, +#line 608 "HTMLCharacterReference.gperf" + {"Uuml;", "Ü"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1068 "HTMLCharacterReference.gperf" + {"euro;", "€"}, + {""}, + {""}, + {""}, + {""}, +#line 999 "HTMLCharacterReference.gperf" + {"dtri;", "▿"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 923 "HTMLCharacterReference.gperf" + {"cupor;", "⩅"}, + {""}, + {""}, +#line 716 "HTMLCharacterReference.gperf" + {"ast;", "*"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 775 "HTMLCharacterReference.gperf" + {"bnot;", "⌐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 996 "HTMLCharacterReference.gperf" + {"dsol;", "⧶"}, +#line 1001 "HTMLCharacterReference.gperf" + {"duarr;", "⇵"}, + {""}, +#line 1251 "HTMLCharacterReference.gperf" + {"it;", "⁢"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1038 "HTMLCharacterReference.gperf" + {"eng;", "ŋ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 685 "HTMLCharacterReference.gperf" + {"ang;", "∠"}, +#line 892 "HTMLCharacterReference.gperf" + {"comp;", "∁"}, + {""}, + {""}, +#line 1226 "HTMLCharacterReference.gperf" + {"in;", "∈"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 980 "HTMLCharacterReference.gperf" + {"dot;", "˙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1007 "HTMLCharacterReference.gperf" + {"eDot;", "≑"}, +#line 1376 "HTMLCharacterReference.gperf" + {"loarr;", "⇽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 669 "HTMLCharacterReference.gperf" + {"af;", "⁡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1146 "HTMLCharacterReference.gperf" + {"gne;", "⪈"}, +#line 837 "HTMLCharacterReference.gperf" + {"bump;", "≎"}, + {""}, + {""}, + {""}, +#line 1371 "HTMLCharacterReference.gperf" + {"lne;", "⪇"}, + {""}, +#line 697 "HTMLCharacterReference.gperf" + {"angrt;", "∟"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 326 "HTMLCharacterReference.gperf" + {"Lt;", "≪"}, +#line 708 "HTMLCharacterReference.gperf" + {"ape;", "≊"}, +#line 734 "HTMLCharacterReference.gperf" + {"bbrk;", "⎵"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1231 "HTMLCharacterReference.gperf" + {"int;", "∫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1055 "HTMLCharacterReference.gperf" + {"equiv;", "≡"}, + {""}, + {""}, + {""}, +#line 832 "HTMLCharacterReference.gperf" + {"bsol;", "\\"}, +#line 1189 "HTMLCharacterReference.gperf" + {"hoarr;", "⇿"}, + {""}, + {""}, + {""}, + {""}, +#line 1422 "HTMLCharacterReference.gperf" + {"ltrie;", "⊴"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1043 "HTMLCharacterReference.gperf" + {"eparsl;", "⧣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1091 "HTMLCharacterReference.gperf" - {"frac12;", "½"}, - {""}, - {""}, - {""}, -#line 2182 "HTMLCharacterReference.gperf" - {"vprop;", "∝"}, - {""}, - {""}, - {""}, - {""}, -#line 1307 "HTMLCharacterReference.gperf" - {"lbrke;", "⦋"}, - {""}, - {""}, -#line 1253 "HTMLCharacterReference.gperf" - {"iuml", "ï"}, + {"frac12", "½"}, +#line 1092 "HTMLCharacterReference.gperf" + {"frac12;", "½"}, + {""}, + {""}, + {""}, +#line 2183 "HTMLCharacterReference.gperf" + {"vprop;", "∝"}, + {""}, + {""}, + {""}, + {""}, +#line 1308 "HTMLCharacterReference.gperf" + {"lbrke;", "⦋"}, + {""}, + {""}, #line 1254 "HTMLCharacterReference.gperf" - {"iuml;", "ï"}, -#line 1093 "HTMLCharacterReference.gperf" - {"frac14", "¼"}, + {"iuml", "ï"}, +#line 1255 "HTMLCharacterReference.gperf" + {"iuml;", "ï"}, #line 1094 "HTMLCharacterReference.gperf" - {"frac14;", "¼"}, - {""}, -#line 776 "HTMLCharacterReference.gperf" - {"bot;", "⊥"}, - {""}, -#line 961 "HTMLCharacterReference.gperf" - {"dharr;", "⇂"}, + {"frac14", "¼"}, #line 1095 "HTMLCharacterReference.gperf" - {"frac15;", "⅕"}, - {""}, -#line 1133 "HTMLCharacterReference.gperf" - {"gfr;", "𝔤"}, - {""}, - {""}, + {"frac14;", "¼"}, + {""}, +#line 777 "HTMLCharacterReference.gperf" + {"bot;", "⊥"}, + {""}, +#line 962 "HTMLCharacterReference.gperf" + {"dharr;", "⇂"}, #line 1096 "HTMLCharacterReference.gperf" - {"frac16;", "⅙"}, - {""}, -#line 1351 "HTMLCharacterReference.gperf" - {"lfr;", "𝔩"}, -#line 1087 "HTMLCharacterReference.gperf" - {"fork;", "⋔"}, -#line 1100 "HTMLCharacterReference.gperf" - {"frac34", "¾"}, -#line 1101 "HTMLCharacterReference.gperf" - {"frac34;", "¾"}, - {""}, -#line 1019 "HTMLCharacterReference.gperf" - {"efr;", "𝔢"}, - {""}, + {"frac15;", "⅕"}, + {""}, +#line 1134 "HTMLCharacterReference.gperf" + {"gfr;", "𝔤"}, + {""}, + {""}, +#line 1097 "HTMLCharacterReference.gperf" + {"frac16;", "⅙"}, + {""}, +#line 1352 "HTMLCharacterReference.gperf" + {"lfr;", "𝔩"}, #line 1088 "HTMLCharacterReference.gperf" - {"forkv;", "⫙"}, + {"fork;", "⋔"}, +#line 1101 "HTMLCharacterReference.gperf" + {"frac34", "¾"}, #line 1102 "HTMLCharacterReference.gperf" - {"frac35;", "⅗"}, - {""}, -#line 864 "HTMLCharacterReference.gperf" - {"cfr;", "𝔠"}, - {""}, - {""}, -#line 1104 "HTMLCharacterReference.gperf" - {"frac45;", "⅘"}, - {""}, -#line 669 "HTMLCharacterReference.gperf" - {"afr;", "𝔞"}, -#line 644 "HTMLCharacterReference.gperf" - {"Yuml;", "Ÿ"}, - {""}, - {""}, - {""}, -#line 1257 "HTMLCharacterReference.gperf" - {"jfr;", "𝔧"}, -#line 1279 "HTMLCharacterReference.gperf" - {"lHar;", "⥢"}, - {""}, + {"frac34;", "¾"}, + {""}, +#line 1020 "HTMLCharacterReference.gperf" + {"efr;", "𝔢"}, + {""}, +#line 1089 "HTMLCharacterReference.gperf" + {"forkv;", "⫙"}, +#line 1103 "HTMLCharacterReference.gperf" + {"frac35;", "⅗"}, + {""}, +#line 865 "HTMLCharacterReference.gperf" + {"cfr;", "𝔠"}, + {""}, + {""}, #line 1105 "HTMLCharacterReference.gperf" - {"frac56;", "⅚"}, - {""}, -#line 578 "HTMLCharacterReference.gperf" - {"Ufr;", "𝔘"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 908 "HTMLCharacterReference.gperf" - {"csup;", "⫐"}, - {""}, -#line 1092 "HTMLCharacterReference.gperf" - {"frac13;", "⅓"}, - {""}, -#line 1774 "HTMLCharacterReference.gperf" - {"quot", "\""}, + {"frac45;", "⅘"}, + {""}, +#line 670 "HTMLCharacterReference.gperf" + {"afr;", "𝔞"}, +#line 645 "HTMLCharacterReference.gperf" + {"Yuml;", "Ÿ"}, + {""}, + {""}, + {""}, +#line 1258 "HTMLCharacterReference.gperf" + {"jfr;", "𝔧"}, +#line 1280 "HTMLCharacterReference.gperf" + {"lHar;", "⥢"}, + {""}, +#line 1106 "HTMLCharacterReference.gperf" + {"frac56;", "⅚"}, + {""}, +#line 579 "HTMLCharacterReference.gperf" + {"Ufr;", "𝔘"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 909 "HTMLCharacterReference.gperf" + {"csup;", "⫐"}, + {""}, +#line 1093 "HTMLCharacterReference.gperf" + {"frac13;", "⅓"}, + {""}, #line 1775 "HTMLCharacterReference.gperf" - {"quot;", "\""}, -#line 1039 "HTMLCharacterReference.gperf" - {"eogon;", "ę"}, - {""}, - {""}, - {""}, - {""}, -#line 930 "HTMLCharacterReference.gperf" - {"curren", "¤"}, + {"quot", "\""}, +#line 1776 "HTMLCharacterReference.gperf" + {"quot;", "\""}, +#line 1040 "HTMLCharacterReference.gperf" + {"eogon;", "ę"}, + {""}, + {""}, + {""}, + {""}, #line 931 "HTMLCharacterReference.gperf" - {"curren;", "¤"}, -#line 334 "HTMLCharacterReference.gperf" - {"Mu;", "Μ"}, -#line 959 "HTMLCharacterReference.gperf" - {"dfr;", "𝔡"}, - {""}, -#line 702 "HTMLCharacterReference.gperf" - {"aogon;", "ą"}, -#line 1163 "HTMLCharacterReference.gperf" - {"gtrarr;", "⥸"}, - {""}, -#line 1185 "HTMLCharacterReference.gperf" - {"hfr;", "𝔥"}, - {""}, - {""}, -#line 1099 "HTMLCharacterReference.gperf" - {"frac25;", "⅖"}, - {""}, - {""}, - {""}, -#line 588 "HTMLCharacterReference.gperf" - {"Uogon;", "Ų"}, - {""}, - {""}, -#line 772 "HTMLCharacterReference.gperf" - {"bne;", "=⃥"}, - {""}, - {""}, -#line 1097 "HTMLCharacterReference.gperf" - {"frac18;", "⅛"}, - {""}, - {""}, -#line 940 "HTMLCharacterReference.gperf" - {"dHar;", "⥥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 913 "HTMLCharacterReference.gperf" - {"cuepr;", "⋞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1103 "HTMLCharacterReference.gperf" - {"frac38;", "⅜"}, - {""}, - {""}, - {""}, + {"curren", "¤"}, +#line 932 "HTMLCharacterReference.gperf" + {"curren;", "¤"}, +#line 335 "HTMLCharacterReference.gperf" + {"Mu;", "Μ"}, #line 960 "HTMLCharacterReference.gperf" - {"dharl;", "⇃"}, -#line 1393 "HTMLCharacterReference.gperf" - {"lparlt;", "⦓"}, - {""}, -#line 457 "HTMLCharacterReference.gperf" - {"Qfr;", "𝔔"}, - {""}, - {""}, -#line 1106 "HTMLCharacterReference.gperf" - {"frac58;", "⅝"}, - {""}, - {""}, - {""}, - {""}, + {"dfr;", "𝔡"}, + {""}, +#line 703 "HTMLCharacterReference.gperf" + {"aogon;", "ą"}, +#line 1164 "HTMLCharacterReference.gperf" + {"gtrarr;", "⥸"}, + {""}, +#line 1186 "HTMLCharacterReference.gperf" + {"hfr;", "𝔥"}, + {""}, + {""}, +#line 1100 "HTMLCharacterReference.gperf" + {"frac25;", "⅖"}, + {""}, + {""}, + {""}, +#line 589 "HTMLCharacterReference.gperf" + {"Uogon;", "Ų"}, + {""}, + {""}, +#line 773 "HTMLCharacterReference.gperf" + {"bne;", "=⃥"}, + {""}, + {""}, #line 1098 "HTMLCharacterReference.gperf" - {"frac23;", "⅔"}, - {""}, -#line 1078 "HTMLCharacterReference.gperf" - {"ffr;", "𝔣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2195 "HTMLCharacterReference.gperf" - {"wfr;", "𝔴"}, - {""}, -#line 838 "HTMLCharacterReference.gperf" - {"bumpe;", "≏"}, - {""}, - {""}, - {""}, - {""}, -#line 686 "HTMLCharacterReference.gperf" - {"angle;", "∠"}, - {""}, - {""}, -#line 2177 "HTMLCharacterReference.gperf" - {"vfr;", "𝔳"}, - {""}, - {""}, -#line 924 "HTMLCharacterReference.gperf" - {"curarr;", "↷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1146 "HTMLCharacterReference.gperf" - {"gneq;", "⪈"}, + {"frac18;", "⅛"}, + {""}, + {""}, +#line 941 "HTMLCharacterReference.gperf" + {"dHar;", "⥥"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 914 "HTMLCharacterReference.gperf" + {"cuepr;", "⋞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1104 "HTMLCharacterReference.gperf" + {"frac38;", "⅜"}, + {""}, + {""}, + {""}, +#line 961 "HTMLCharacterReference.gperf" + {"dharl;", "⇃"}, +#line 1394 "HTMLCharacterReference.gperf" + {"lparlt;", "⦓"}, + {""}, +#line 458 "HTMLCharacterReference.gperf" + {"Qfr;", "𝔔"}, + {""}, + {""}, +#line 1107 "HTMLCharacterReference.gperf" + {"frac58;", "⅝"}, + {""}, + {""}, + {""}, + {""}, +#line 1099 "HTMLCharacterReference.gperf" + {"frac23;", "⅔"}, + {""}, +#line 1079 "HTMLCharacterReference.gperf" + {"ffr;", "𝔣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2196 "HTMLCharacterReference.gperf" + {"wfr;", "𝔴"}, + {""}, +#line 839 "HTMLCharacterReference.gperf" + {"bumpe;", "≏"}, + {""}, + {""}, + {""}, + {""}, +#line 687 "HTMLCharacterReference.gperf" + {"angle;", "∠"}, + {""}, + {""}, +#line 2178 "HTMLCharacterReference.gperf" + {"vfr;", "𝔳"}, + {""}, + {""}, +#line 925 "HTMLCharacterReference.gperf" + {"curarr;", "↷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1147 "HTMLCharacterReference.gperf" - {"gneqq;", "≩"}, - {""}, - {""}, - {""}, -#line 1371 "HTMLCharacterReference.gperf" - {"lneq;", "⪇"}, + {"gneq;", "⪈"}, +#line 1148 "HTMLCharacterReference.gperf" + {"gneqq;", "≩"}, + {""}, + {""}, + {""}, #line 1372 "HTMLCharacterReference.gperf" - {"lneqq;", "≨"}, -#line 899 "HTMLCharacterReference.gperf" - {"coprod;", "∐"}, -#line 1121 "HTMLCharacterReference.gperf" - {"ge;", "≥"}, -#line 746 "HTMLCharacterReference.gperf" - {"bfr;", "𝔟"}, - {""}, - {""}, - {""}, -#line 1321 "HTMLCharacterReference.gperf" - {"le;", "≤"}, -#line 1126 "HTMLCharacterReference.gperf" - {"ges;", "⩾"}, - {""}, -#line 1383 "HTMLCharacterReference.gperf" - {"lopar;", "⦅"}, -#line 777 "HTMLCharacterReference.gperf" - {"bottom;", "⊥"}, -#line 1017 "HTMLCharacterReference.gperf" - {"ee;", "ⅇ"}, -#line 1336 "HTMLCharacterReference.gperf" - {"les;", "⩽"}, - {""}, - {""}, -#line 1107 "HTMLCharacterReference.gperf" - {"frac78;", "⅞"}, - {""}, -#line 1123 "HTMLCharacterReference.gperf" - {"geq;", "≥"}, - {""}, - {""}, - {""}, - {""}, -#line 1333 "HTMLCharacterReference.gperf" - {"leq;", "≤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1159 "HTMLCharacterReference.gperf" - {"gtdot;", "⋗"}, - {""}, - {""}, + {"lneq;", "⪇"}, +#line 1373 "HTMLCharacterReference.gperf" + {"lneqq;", "≨"}, #line 900 "HTMLCharacterReference.gperf" - {"copy", "©"}, + {"coprod;", "∐"}, +#line 1122 "HTMLCharacterReference.gperf" + {"ge;", "≥"}, +#line 747 "HTMLCharacterReference.gperf" + {"bfr;", "𝔟"}, + {""}, + {""}, + {""}, +#line 1322 "HTMLCharacterReference.gperf" + {"le;", "≤"}, +#line 1127 "HTMLCharacterReference.gperf" + {"ges;", "⩾"}, + {""}, +#line 1384 "HTMLCharacterReference.gperf" + {"lopar;", "⦅"}, +#line 778 "HTMLCharacterReference.gperf" + {"bottom;", "⊥"}, +#line 1018 "HTMLCharacterReference.gperf" + {"ee;", "ⅇ"}, +#line 1337 "HTMLCharacterReference.gperf" + {"les;", "⩽"}, + {""}, + {""}, +#line 1108 "HTMLCharacterReference.gperf" + {"frac78;", "⅞"}, + {""}, +#line 1124 "HTMLCharacterReference.gperf" + {"geq;", "≥"}, + {""}, + {""}, + {""}, + {""}, +#line 1334 "HTMLCharacterReference.gperf" + {"leq;", "≤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1160 "HTMLCharacterReference.gperf" + {"gtdot;", "⋗"}, + {""}, + {""}, #line 901 "HTMLCharacterReference.gperf" - {"copy;", "©"}, -#line 1414 "HTMLCharacterReference.gperf" - {"ltdot;", "⋖"}, - {""}, - {""}, - {""}, - {""}, -#line 782 "HTMLCharacterReference.gperf" - {"boxDr;", "╓"}, - {""}, - {""}, - {""}, - {""}, + {"copy", "©"}, +#line 902 "HTMLCharacterReference.gperf" + {"copy;", "©"}, +#line 1415 "HTMLCharacterReference.gperf" + {"ltdot;", "⋖"}, + {""}, + {""}, + {""}, + {""}, +#line 783 "HTMLCharacterReference.gperf" + {"boxDr;", "╓"}, + {""}, + {""}, + {""}, + {""}, +#line 911 "HTMLCharacterReference.gperf" + {"ctdot;", "⋯"}, + {""}, + {""}, +#line 680 "HTMLCharacterReference.gperf" + {"and;", "∧"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1132 "HTMLCharacterReference.gperf" + {"gesl;", "⋛︀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 215 "HTMLCharacterReference.gperf" + {"Hfr;", "ℌ"}, + {""}, + {""}, + {""}, + {""}, +#line 182 "HTMLCharacterReference.gperf" + {"Ffr;", "𝔉"}, + {""}, + {""}, +#line 840 "HTMLCharacterReference.gperf" + {"bumpeq;", "≏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1210 "HTMLCharacterReference.gperf" + {"ifr;", "𝔦"}, + {""}, +#line 998 "HTMLCharacterReference.gperf" + {"dtdot;", "⋱"}, + {""}, + {""}, + {""}, + {""}, #line 910 "HTMLCharacterReference.gperf" - {"ctdot;", "⋯"}, - {""}, - {""}, -#line 679 "HTMLCharacterReference.gperf" - {"and;", "∧"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1131 "HTMLCharacterReference.gperf" - {"gesl;", "⋛︀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 214 "HTMLCharacterReference.gperf" - {"Hfr;", "ℌ"}, - {""}, - {""}, - {""}, - {""}, -#line 181 "HTMLCharacterReference.gperf" - {"Ffr;", "𝔉"}, - {""}, - {""}, -#line 839 "HTMLCharacterReference.gperf" - {"bumpeq;", "≏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1209 "HTMLCharacterReference.gperf" - {"ifr;", "𝔦"}, - {""}, -#line 997 "HTMLCharacterReference.gperf" - {"dtdot;", "⋱"}, - {""}, - {""}, - {""}, - {""}, -#line 909 "HTMLCharacterReference.gperf" - {"csupe;", "⫒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 837 "HTMLCharacterReference.gperf" - {"bumpE;", "⪮"}, -#line 897 "HTMLCharacterReference.gperf" - {"conint;", "∮"}, - {""}, - {""}, -#line 531 "HTMLCharacterReference.gperf" - {"Star;", "⋆"}, - {""}, - {""}, - {""}, -#line 641 "HTMLCharacterReference.gperf" - {"Yfr;", "𝔜"}, - {""}, -#line 1237 "HTMLCharacterReference.gperf" - {"iogon;", "į"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 540 "HTMLCharacterReference.gperf" - {"Sum;", "∑"}, - {""}, -#line 781 "HTMLCharacterReference.gperf" - {"boxDl;", "╖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 117 "HTMLCharacterReference.gperf" - {"Dot;", "¨"}, - {""}, -#line 1060 "HTMLCharacterReference.gperf" - {"esdot;", "≐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1134 "HTMLCharacterReference.gperf" - {"gg;", "≫"}, -#line 309 "HTMLCharacterReference.gperf" - {"Lfr;", "𝔏"}, - {""}, - {""}, - {""}, -#line 1352 "HTMLCharacterReference.gperf" - {"lg;", "≶"}, - {""}, - {""}, - {""}, - {""}, -#line 1020 "HTMLCharacterReference.gperf" - {"eg;", "⪚"}, + {"csupe;", "⫒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 838 "HTMLCharacterReference.gperf" + {"bumpE;", "⪮"}, +#line 898 "HTMLCharacterReference.gperf" + {"conint;", "∮"}, + {""}, + {""}, +#line 532 "HTMLCharacterReference.gperf" + {"Star;", "⋆"}, + {""}, + {""}, + {""}, +#line 642 "HTMLCharacterReference.gperf" + {"Yfr;", "𝔜"}, + {""}, +#line 1238 "HTMLCharacterReference.gperf" + {"iogon;", "į"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 541 "HTMLCharacterReference.gperf" - {"Sup;", "⋑"}, - {""}, - {""}, - {""}, -#line 96 "HTMLCharacterReference.gperf" - {"DD;", "ⅅ"}, -#line 1023 "HTMLCharacterReference.gperf" - {"egs;", "⪖"}, - {""}, - {""}, - {""}, -#line 1612 "HTMLCharacterReference.gperf" - {"nu;", "ν"}, -#line 861 "HTMLCharacterReference.gperf" - {"cent", "¢"}, -#line 862 "HTMLCharacterReference.gperf" - {"cent;", "¢"}, -#line 866 "HTMLCharacterReference.gperf" - {"check;", "✓"}, - {""}, -#line 1045 "HTMLCharacterReference.gperf" - {"epsilon;", "ε"}, -#line 238 "HTMLCharacterReference.gperf" - {"Int;", "∬"}, -#line 1239 "HTMLCharacterReference.gperf" - {"iota;", "ι"}, - {""}, - {""}, - {""}, -#line 1765 "HTMLCharacterReference.gperf" - {"qfr;", "𝔮"}, - {""}, - {""}, - {""}, -#line 1167 "HTMLCharacterReference.gperf" - {"gtrless;", "≷"}, - {""}, -#line 1560 "HTMLCharacterReference.gperf" - {"npar;", "∦"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 780 "HTMLCharacterReference.gperf" - {"boxDR;", "╔"}, - {""}, -#line 602 "HTMLCharacterReference.gperf" - {"Upsilon;", "Υ"}, + {"Sum;", "∑"}, + {""}, +#line 782 "HTMLCharacterReference.gperf" + {"boxDl;", "╖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 118 "HTMLCharacterReference.gperf" + {"Dot;", "¨"}, + {""}, +#line 1061 "HTMLCharacterReference.gperf" + {"esdot;", "≐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1135 "HTMLCharacterReference.gperf" + {"gg;", "≫"}, +#line 310 "HTMLCharacterReference.gperf" + {"Lfr;", "𝔏"}, + {""}, + {""}, + {""}, +#line 1353 "HTMLCharacterReference.gperf" + {"lg;", "≶"}, + {""}, + {""}, + {""}, + {""}, +#line 1021 "HTMLCharacterReference.gperf" + {"eg;", "⪚"}, +#line 542 "HTMLCharacterReference.gperf" + {"Sup;", "⋑"}, + {""}, + {""}, + {""}, +#line 97 "HTMLCharacterReference.gperf" + {"DD;", "ⅅ"}, +#line 1024 "HTMLCharacterReference.gperf" + {"egs;", "⪖"}, + {""}, + {""}, + {""}, #line 1613 "HTMLCharacterReference.gperf" - {"num;", "#"}, - {""}, - {""}, -#line 1181 "HTMLCharacterReference.gperf" - {"hearts;", "♥"}, - {""}, -#line 1489 "HTMLCharacterReference.gperf" - {"nbsp", " "}, + {"nu;", "ν"}, +#line 862 "HTMLCharacterReference.gperf" + {"cent", "¢"}, +#line 863 "HTMLCharacterReference.gperf" + {"cent;", "¢"}, +#line 867 "HTMLCharacterReference.gperf" + {"check;", "✓"}, + {""}, +#line 1046 "HTMLCharacterReference.gperf" + {"epsilon;", "ε"}, +#line 239 "HTMLCharacterReference.gperf" + {"Int;", "∬"}, +#line 1240 "HTMLCharacterReference.gperf" + {"iota;", "ι"}, + {""}, + {""}, + {""}, +#line 1766 "HTMLCharacterReference.gperf" + {"qfr;", "𝔮"}, + {""}, + {""}, + {""}, +#line 1168 "HTMLCharacterReference.gperf" + {"gtrless;", "≷"}, + {""}, +#line 1561 "HTMLCharacterReference.gperf" + {"npar;", "∦"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 781 "HTMLCharacterReference.gperf" + {"boxDR;", "╔"}, + {""}, +#line 603 "HTMLCharacterReference.gperf" + {"Upsilon;", "Υ"}, +#line 1614 "HTMLCharacterReference.gperf" + {"num;", "#"}, + {""}, + {""}, +#line 1182 "HTMLCharacterReference.gperf" + {"hearts;", "♥"}, + {""}, #line 1490 "HTMLCharacterReference.gperf" - {"nbsp;", " "}, - {""}, - {""}, - {""}, -#line 1332 "HTMLCharacterReference.gperf" - {"leg;", "⋚"}, -#line 522 "HTMLCharacterReference.gperf" - {"Sqrt;", "√"}, -#line 791 "HTMLCharacterReference.gperf" - {"boxUr;", "╙"}, - {""}, - {""}, -#line 330 "HTMLCharacterReference.gperf" - {"Mfr;", "𝔐"}, - {""}, -#line 1563 "HTMLCharacterReference.gperf" - {"npart;", "∂̸"}, - {""}, - {""}, - {""}, -#line 1162 "HTMLCharacterReference.gperf" - {"gtrapprox;", "⪆"}, - {""}, -#line 687 "HTMLCharacterReference.gperf" - {"angmsd;", "∡"}, - {""}, -#line 249 "HTMLCharacterReference.gperf" - {"Iuml", "Ï"}, + {"nbsp", " "}, +#line 1491 "HTMLCharacterReference.gperf" + {"nbsp;", " "}, + {""}, + {""}, + {""}, +#line 1333 "HTMLCharacterReference.gperf" + {"leg;", "⋚"}, +#line 523 "HTMLCharacterReference.gperf" + {"Sqrt;", "√"}, +#line 792 "HTMLCharacterReference.gperf" + {"boxUr;", "╙"}, + {""}, + {""}, +#line 331 "HTMLCharacterReference.gperf" + {"Mfr;", "𝔐"}, + {""}, +#line 1564 "HTMLCharacterReference.gperf" + {"npart;", "∂̸"}, + {""}, + {""}, + {""}, +#line 1163 "HTMLCharacterReference.gperf" + {"gtrapprox;", "⪆"}, + {""}, +#line 688 "HTMLCharacterReference.gperf" + {"angmsd;", "∡"}, + {""}, #line 250 "HTMLCharacterReference.gperf" - {"Iuml;", "Ï"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2176 "HTMLCharacterReference.gperf" - {"vert;", "|"}, - {""}, - {""}, - {""}, -#line 1565 "HTMLCharacterReference.gperf" - {"npr;", "⊀"}, -#line 1124 "HTMLCharacterReference.gperf" - {"geqq;", "≧"}, -#line 1571 "HTMLCharacterReference.gperf" - {"nrarr;", "↛"}, -#line 1052 "HTMLCharacterReference.gperf" - {"equals;", "="}, - {""}, - {""}, -#line 1334 "HTMLCharacterReference.gperf" - {"leqq;", "≦"}, - {""}, -#line 1573 "HTMLCharacterReference.gperf" - {"nrarrw;", "↝̸"}, -#line 954 "HTMLCharacterReference.gperf" - {"deg", "°"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Iuml", "Ï"}, +#line 251 "HTMLCharacterReference.gperf" + {"Iuml;", "Ï"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2177 "HTMLCharacterReference.gperf" + {"vert;", "|"}, + {""}, + {""}, + {""}, +#line 1566 "HTMLCharacterReference.gperf" + {"npr;", "⊀"}, +#line 1125 "HTMLCharacterReference.gperf" + {"geqq;", "≧"}, +#line 1572 "HTMLCharacterReference.gperf" + {"nrarr;", "↛"}, +#line 1053 "HTMLCharacterReference.gperf" + {"equals;", "="}, + {""}, + {""}, +#line 1335 "HTMLCharacterReference.gperf" + {"leqq;", "≦"}, + {""}, +#line 1574 "HTMLCharacterReference.gperf" + {"nrarrw;", "↝̸"}, #line 955 "HTMLCharacterReference.gperf" - {"deg;", "°"}, - {""}, -#line 1632 "HTMLCharacterReference.gperf" - {"nwarr;", "↖"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 902 "HTMLCharacterReference.gperf" - {"copysr;", "℗"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 983 "HTMLCharacterReference.gperf" - {"dotplus;", "∔"}, - {""}, -#line 1406 "HTMLCharacterReference.gperf" - {"lsqb;", "["}, - {""}, -#line 1086 "HTMLCharacterReference.gperf" - {"forall;", "∀"}, - {""}, -#line 1389 "HTMLCharacterReference.gperf" - {"loz;", "◊"}, - {""}, - {""}, - {""}, -#line 209 "HTMLCharacterReference.gperf" - {"Gt;", "≫"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 689 "HTMLCharacterReference.gperf" - {"angmsdab;", "⦩"}, - {""}, - {""}, - {""}, -#line 925 "HTMLCharacterReference.gperf" - {"curarrm;", "⤼"}, -#line 175 "HTMLCharacterReference.gperf" - {"Eta;", "Η"}, - {""}, - {""}, - {""}, - {""}, -#line 108 "HTMLCharacterReference.gperf" - {"Dfr;", "𝔇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 790 "HTMLCharacterReference.gperf" - {"boxUl;", "╜"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1132 "HTMLCharacterReference.gperf" - {"gesles;", "⪔"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 810 "HTMLCharacterReference.gperf" - {"boxplus;", "⊞"}, - {""}, - {""}, - {""}, - {""}, -#line 1548 "HTMLCharacterReference.gperf" - {"not", "¬"}, - {""}, - {""}, -#line 832 "HTMLCharacterReference.gperf" - {"bsolb;", "⧅"}, - {""}, - {""}, -#line 1549 "HTMLCharacterReference.gperf" - {"not;", "¬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 253 "HTMLCharacterReference.gperf" - {"Jfr;", "𝔍"}, - {""}, - {""}, - {""}, - {""}, -#line 1135 "HTMLCharacterReference.gperf" - {"ggg;", "⋙"}, -#line 1169 "HTMLCharacterReference.gperf" - {"gvertneqq;", "≩︀"}, -#line 1150 "HTMLCharacterReference.gperf" - {"grave;", "`"}, - {""}, - {""}, - {""}, -#line 1425 "HTMLCharacterReference.gperf" - {"lvertneqq;", "≨︀"}, - {""}, - {""}, - {""}, - {""}, -#line 1604 "HTMLCharacterReference.gperf" - {"ntgl;", "≹"}, -#line 789 "HTMLCharacterReference.gperf" - {"boxUR;", "╚"}, - {""}, - {""}, -#line 630 "HTMLCharacterReference.gperf" - {"Xfr;", "𝔛"}, -#line 867 "HTMLCharacterReference.gperf" - {"checkmark;", "✓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1629 "HTMLCharacterReference.gperf" - {"nvsim;", "∼⃒"}, - {""}, - {""}, + {"deg", "°"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 956 "HTMLCharacterReference.gperf" + {"deg;", "°"}, + {""}, +#line 1633 "HTMLCharacterReference.gperf" + {"nwarr;", "↖"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 903 "HTMLCharacterReference.gperf" + {"copysr;", "℗"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 984 "HTMLCharacterReference.gperf" + {"dotplus;", "∔"}, + {""}, +#line 1407 "HTMLCharacterReference.gperf" + {"lsqb;", "["}, + {""}, +#line 1087 "HTMLCharacterReference.gperf" + {"forall;", "∀"}, + {""}, +#line 1390 "HTMLCharacterReference.gperf" + {"loz;", "◊"}, + {""}, + {""}, + {""}, +#line 210 "HTMLCharacterReference.gperf" + {"Gt;", "≫"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 690 "HTMLCharacterReference.gperf" + {"angmsdab;", "⦩"}, + {""}, + {""}, + {""}, +#line 926 "HTMLCharacterReference.gperf" + {"curarrm;", "⤼"}, #line 176 "HTMLCharacterReference.gperf" - {"Euml", "Ë"}, -#line 177 "HTMLCharacterReference.gperf" - {"Euml;", "Ë"}, - {""}, -#line 1184 "HTMLCharacterReference.gperf" - {"hercon;", "⊹"}, - {""}, -#line 2171 "HTMLCharacterReference.gperf" - {"vee;", "∨"}, - {""}, -#line 2218 "HTMLCharacterReference.gperf" - {"xrarr;", "⟶"}, - {""}, - {""}, - {""}, - {""}, + {"Eta;", "Η"}, + {""}, + {""}, + {""}, + {""}, +#line 109 "HTMLCharacterReference.gperf" + {"Dfr;", "𝔇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 791 "HTMLCharacterReference.gperf" + {"boxUl;", "╜"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1133 "HTMLCharacterReference.gperf" + {"gesles;", "⪔"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 811 "HTMLCharacterReference.gperf" + {"boxplus;", "⊞"}, + {""}, + {""}, + {""}, + {""}, +#line 1549 "HTMLCharacterReference.gperf" + {"not", "¬"}, + {""}, + {""}, +#line 833 "HTMLCharacterReference.gperf" + {"bsolb;", "⧅"}, + {""}, + {""}, #line 1550 "HTMLCharacterReference.gperf" - {"notin;", "∉"}, -#line 742 "HTMLCharacterReference.gperf" - {"bernou;", "ℬ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1309 "HTMLCharacterReference.gperf" - {"lbrkslu;", "⦍"}, - {""}, - {""}, -#line 1354 "HTMLCharacterReference.gperf" - {"lhard;", "↽"}, - {""}, - {""}, -#line 514 "HTMLCharacterReference.gperf" - {"Sfr;", "𝔖"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 816 "HTMLCharacterReference.gperf" - {"boxv;", "│"}, + {"not;", "¬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 254 "HTMLCharacterReference.gperf" + {"Jfr;", "𝔍"}, + {""}, + {""}, + {""}, + {""}, +#line 1136 "HTMLCharacterReference.gperf" + {"ggg;", "⋙"}, +#line 1170 "HTMLCharacterReference.gperf" + {"gvertneqq;", "≩︀"}, +#line 1151 "HTMLCharacterReference.gperf" + {"grave;", "`"}, + {""}, + {""}, + {""}, +#line 1426 "HTMLCharacterReference.gperf" + {"lvertneqq;", "≨︀"}, + {""}, + {""}, + {""}, + {""}, +#line 1605 "HTMLCharacterReference.gperf" + {"ntgl;", "≹"}, +#line 790 "HTMLCharacterReference.gperf" + {"boxUR;", "╚"}, + {""}, + {""}, +#line 631 "HTMLCharacterReference.gperf" + {"Xfr;", "𝔛"}, +#line 868 "HTMLCharacterReference.gperf" + {"checkmark;", "✓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1630 "HTMLCharacterReference.gperf" + {"nvsim;", "∼⃒"}, + {""}, + {""}, +#line 177 "HTMLCharacterReference.gperf" + {"Euml", "Ë"}, +#line 178 "HTMLCharacterReference.gperf" + {"Euml;", "Ë"}, + {""}, +#line 1185 "HTMLCharacterReference.gperf" + {"hercon;", "⊹"}, + {""}, +#line 2172 "HTMLCharacterReference.gperf" + {"vee;", "∨"}, + {""}, +#line 2219 "HTMLCharacterReference.gperf" + {"xrarr;", "⟶"}, + {""}, + {""}, + {""}, + {""}, +#line 1551 "HTMLCharacterReference.gperf" + {"notin;", "∉"}, +#line 743 "HTMLCharacterReference.gperf" + {"bernou;", "ℬ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1310 "HTMLCharacterReference.gperf" + {"lbrkslu;", "⦍"}, + {""}, + {""}, +#line 1355 "HTMLCharacterReference.gperf" + {"lhard;", "↽"}, + {""}, + {""}, +#line 515 "HTMLCharacterReference.gperf" + {"Sfr;", "𝔖"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 817 "HTMLCharacterReference.gperf" - {"boxvH;", "╪"}, - {""}, - {""}, - {""}, - {""}, -#line 1523 "HTMLCharacterReference.gperf" - {"nharr;", "↮"}, - {""}, - {""}, - {""}, -#line 1618 "HTMLCharacterReference.gperf" - {"nvap;", "≍⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 586 "HTMLCharacterReference.gperf" - {"Union;", "⋃"}, -#line 1562 "HTMLCharacterReference.gperf" - {"nparsl;", "⫽⃥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1152 "HTMLCharacterReference.gperf" - {"gsim;", "≳"}, - {""}, - {""}, - {""}, -#line 695 "HTMLCharacterReference.gperf" - {"angmsdah;", "⦯"}, -#line 1403 "HTMLCharacterReference.gperf" - {"lsim;", "≲"}, - {""}, - {""}, - {""}, -#line 475 "HTMLCharacterReference.gperf" - {"Rho;", "Ρ"}, -#line 1061 "HTMLCharacterReference.gperf" - {"esim;", "≂"}, -#line 1127 "HTMLCharacterReference.gperf" - {"gescc;", "⪩"}, + {"boxv;", "│"}, +#line 818 "HTMLCharacterReference.gperf" + {"boxvH;", "╪"}, + {""}, + {""}, + {""}, + {""}, +#line 1524 "HTMLCharacterReference.gperf" + {"nharr;", "↮"}, + {""}, + {""}, + {""}, +#line 1619 "HTMLCharacterReference.gperf" + {"nvap;", "≍⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 587 "HTMLCharacterReference.gperf" + {"Union;", "⋃"}, +#line 1563 "HTMLCharacterReference.gperf" + {"nparsl;", "⫽⃥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1153 "HTMLCharacterReference.gperf" + {"gsim;", "≳"}, + {""}, + {""}, + {""}, +#line 696 "HTMLCharacterReference.gperf" + {"angmsdah;", "⦯"}, +#line 1404 "HTMLCharacterReference.gperf" + {"lsim;", "≲"}, + {""}, + {""}, + {""}, +#line 476 "HTMLCharacterReference.gperf" + {"Rho;", "Ρ"}, +#line 1062 "HTMLCharacterReference.gperf" + {"esim;", "≂"}, +#line 1128 "HTMLCharacterReference.gperf" + {"gescc;", "⪩"}, +#line 824 "HTMLCharacterReference.gperf" + {"bprime;", "‵"}, + {""}, +#line 232 "HTMLCharacterReference.gperf" + {"Ifr;", "ℑ"}, + {""}, +#line 1338 "HTMLCharacterReference.gperf" + {"lescc;", "⪨"}, + {""}, + {""}, + {""}, +#line 744 "HTMLCharacterReference.gperf" + {"beta;", "β"}, + {""}, + {""}, +#line 407 "HTMLCharacterReference.gperf" + {"Nu;", "Ν"}, + {""}, + {""}, +#line 1228 "HTMLCharacterReference.gperf" + {"infin;", "∞"}, + {""}, + {""}, + {""}, + {""}, #line 823 "HTMLCharacterReference.gperf" - {"bprime;", "‵"}, - {""}, -#line 231 "HTMLCharacterReference.gperf" - {"Ifr;", "ℑ"}, - {""}, -#line 1337 "HTMLCharacterReference.gperf" - {"lescc;", "⪨"}, - {""}, - {""}, - {""}, -#line 743 "HTMLCharacterReference.gperf" - {"beta;", "β"}, - {""}, - {""}, -#line 406 "HTMLCharacterReference.gperf" - {"Nu;", "Ν"}, - {""}, - {""}, -#line 1227 "HTMLCharacterReference.gperf" - {"infin;", "∞"}, - {""}, - {""}, - {""}, - {""}, + {"boxvr;", "├"}, + {""}, + {""}, +#line 1513 "HTMLCharacterReference.gperf" + {"nfr;", "𝔫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1492 "HTMLCharacterReference.gperf" + {"nbump;", "≎̸"}, + {""}, + {""}, + {""}, + {""}, +#line 244 "HTMLCharacterReference.gperf" + {"Iogon;", "Į"}, + {""}, + {""}, + {""}, +#line 907 "HTMLCharacterReference.gperf" + {"csub;", "⫏"}, +#line 1241 "HTMLCharacterReference.gperf" + {"iprod;", "⨼"}, + {""}, + {""}, + {""}, +#line 1599 "HTMLCharacterReference.gperf" + {"nsup;", "⊅"}, +#line 938 "HTMLCharacterReference.gperf" + {"cwint;", "∱"}, + {""}, + {""}, + {""}, + {""}, +#line 724 "HTMLCharacterReference.gperf" + {"awint;", "⨑"}, + {""}, + {""}, +#line 694 "HTMLCharacterReference.gperf" + {"angmsdaf;", "⦭"}, + {""}, + {""}, + {""}, + {""}, +#line 653 "HTMLCharacterReference.gperf" + {"Zfr;", "ℨ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1622 "HTMLCharacterReference.gperf" + {"nvgt;", ">⃒"}, + {""}, + {""}, + {""}, +#line 869 "HTMLCharacterReference.gperf" + {"chi;", "χ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 246 "HTMLCharacterReference.gperf" + {"Iota;", "Ι"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 119 "HTMLCharacterReference.gperf" + {"DotDot;", "⃜"}, + {""}, + {""}, +#line 686 "HTMLCharacterReference.gperf" + {"ange;", "⦤"}, #line 822 "HTMLCharacterReference.gperf" - {"boxvr;", "├"}, - {""}, - {""}, -#line 1512 "HTMLCharacterReference.gperf" - {"nfr;", "𝔫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1491 "HTMLCharacterReference.gperf" - {"nbump;", "≎̸"}, - {""}, - {""}, - {""}, - {""}, -#line 243 "HTMLCharacterReference.gperf" - {"Iogon;", "Į"}, - {""}, - {""}, - {""}, -#line 906 "HTMLCharacterReference.gperf" - {"csub;", "⫏"}, -#line 1240 "HTMLCharacterReference.gperf" - {"iprod;", "⨼"}, - {""}, - {""}, - {""}, -#line 1598 "HTMLCharacterReference.gperf" - {"nsup;", "⊅"}, -#line 937 "HTMLCharacterReference.gperf" - {"cwint;", "∱"}, - {""}, - {""}, - {""}, - {""}, -#line 723 "HTMLCharacterReference.gperf" - {"awint;", "⨑"}, - {""}, - {""}, -#line 693 "HTMLCharacterReference.gperf" - {"angmsdaf;", "⦭"}, - {""}, - {""}, - {""}, - {""}, -#line 652 "HTMLCharacterReference.gperf" - {"Zfr;", "ℨ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1621 "HTMLCharacterReference.gperf" - {"nvgt;", ">⃒"}, - {""}, - {""}, - {""}, -#line 868 "HTMLCharacterReference.gperf" - {"chi;", "χ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 245 "HTMLCharacterReference.gperf" - {"Iota;", "Ι"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 118 "HTMLCharacterReference.gperf" - {"DotDot;", "⃜"}, - {""}, - {""}, -#line 685 "HTMLCharacterReference.gperf" - {"ange;", "⦤"}, -#line 821 "HTMLCharacterReference.gperf" - {"boxvl;", "┤"}, - {""}, - {""}, - {""}, - {""}, -#line 2207 "HTMLCharacterReference.gperf" - {"xharr;", "⟷"}, -#line 267 "HTMLCharacterReference.gperf" - {"LT", "<"}, + {"boxvl;", "┤"}, + {""}, + {""}, + {""}, + {""}, +#line 2208 "HTMLCharacterReference.gperf" + {"xharr;", "⟷"}, #line 268 "HTMLCharacterReference.gperf" - {"LT;", "<"}, - {""}, -#line 1206 "HTMLCharacterReference.gperf" - {"iexcl", "¡"}, + {"LT", "<"}, +#line 269 "HTMLCharacterReference.gperf" + {"LT;", "<"}, + {""}, #line 1207 "HTMLCharacterReference.gperf" - {"iexcl;", "¡"}, - {""}, - {""}, - {""}, - {""}, -#line 1587 "HTMLCharacterReference.gperf" - {"nspar;", "∦"}, - {""}, - {""}, - {""}, - {""}, -#line 980 "HTMLCharacterReference.gperf" - {"doteq;", "≐"}, - {""}, - {""}, - {""}, -#line 829 "HTMLCharacterReference.gperf" - {"bsim;", "∽"}, -#line 1154 "HTMLCharacterReference.gperf" - {"gsiml;", "⪐"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1416 "HTMLCharacterReference.gperf" - {"ltimes;", "⋉"}, - {""}, -#line 474 "HTMLCharacterReference.gperf" - {"Rfr;", "ℜ"}, - {""}, - {""}, - {""}, - {""}, -#line 1473 "HTMLCharacterReference.gperf" - {"nLt;", "≪⃒"}, - {""}, - {""}, -#line 680 "HTMLCharacterReference.gperf" - {"andand;", "⩕"}, - {""}, -#line 46 "HTMLCharacterReference.gperf" - {"Auml", "Ä"}, -#line 47 "HTMLCharacterReference.gperf" - {"Auml;", "Ä"}, - {""}, - {""}, - {""}, -#line 160 "HTMLCharacterReference.gperf" - {"Efr;", "𝔈"}, - {""}, -#line 1374 "HTMLCharacterReference.gperf" - {"loang;", "⟬"}, - {""}, - {""}, -#line 351 "HTMLCharacterReference.gperf" - {"Not;", "⫬"}, - {""}, -#line 934 "HTMLCharacterReference.gperf" - {"cuvee;", "⋎"}, - {""}, -#line 1501 "HTMLCharacterReference.gperf" - {"ne;", "≠"}, -#line 2205 "HTMLCharacterReference.gperf" - {"xfr;", "𝔵"}, - {""}, -#line 819 "HTMLCharacterReference.gperf" - {"boxvR;", "╞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1768 "HTMLCharacterReference.gperf" - {"qprime;", "⁗"}, - {""}, + {"iexcl", "¡"}, #line 1208 "HTMLCharacterReference.gperf" - {"iff;", "⇔"}, - {""}, -#line 1153 "HTMLCharacterReference.gperf" - {"gsime;", "⪎"}, - {""}, - {""}, -#line 198 "HTMLCharacterReference.gperf" - {"Gfr;", "𝔊"}, - {""}, -#line 1404 "HTMLCharacterReference.gperf" - {"lsime;", "⪍"}, - {""}, - {""}, - {""}, - {""}, -#line 167 "HTMLCharacterReference.gperf" - {"Eogon;", "Ę"}, - {""}, - {""}, - {""}, -#line 724 "HTMLCharacterReference.gperf" - {"bNot;", "⫭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1509 "HTMLCharacterReference.gperf" - {"nesim;", "≂̸"}, - {""}, - {""}, -#line 1552 "HTMLCharacterReference.gperf" - {"notindot;", "⋵̸"}, -#line 683 "HTMLCharacterReference.gperf" - {"andv;", "⩚"}, - {""}, - {""}, - {""}, - {""}, -#line 1120 "HTMLCharacterReference.gperf" - {"gdot;", "ġ"}, -#line 1524 "HTMLCharacterReference.gperf" - {"nhpar;", "⫲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1016 "HTMLCharacterReference.gperf" - {"edot;", "ė"}, - {""}, - {""}, -#line 1386 "HTMLCharacterReference.gperf" - {"lotimes;", "⨴"}, - {""}, -#line 857 "HTMLCharacterReference.gperf" - {"cdot;", "ċ"}, -#line 907 "HTMLCharacterReference.gperf" - {"csube;", "⫑"}, - {""}, -#line 1308 "HTMLCharacterReference.gperf" - {"lbrksld;", "⦏"}, - {""}, - {""}, -#line 1600 "HTMLCharacterReference.gperf" - {"nsupe;", "⊉"}, - {""}, - {""}, - {""}, + {"iexcl;", "¡"}, + {""}, + {""}, + {""}, + {""}, +#line 1588 "HTMLCharacterReference.gperf" + {"nspar;", "∦"}, + {""}, + {""}, + {""}, + {""}, +#line 981 "HTMLCharacterReference.gperf" + {"doteq;", "≐"}, + {""}, + {""}, + {""}, +#line 830 "HTMLCharacterReference.gperf" + {"bsim;", "∽"}, +#line 1155 "HTMLCharacterReference.gperf" + {"gsiml;", "⪐"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1417 "HTMLCharacterReference.gperf" + {"ltimes;", "⋉"}, + {""}, +#line 475 "HTMLCharacterReference.gperf" + {"Rfr;", "ℜ"}, + {""}, + {""}, + {""}, + {""}, +#line 1474 "HTMLCharacterReference.gperf" + {"nLt;", "≪⃒"}, + {""}, + {""}, +#line 681 "HTMLCharacterReference.gperf" + {"andand;", "⩕"}, + {""}, +#line 47 "HTMLCharacterReference.gperf" + {"Auml", "Ä"}, +#line 48 "HTMLCharacterReference.gperf" + {"Auml;", "Ä"}, + {""}, + {""}, + {""}, +#line 161 "HTMLCharacterReference.gperf" + {"Efr;", "𝔈"}, + {""}, +#line 1375 "HTMLCharacterReference.gperf" + {"loang;", "⟬"}, + {""}, + {""}, +#line 352 "HTMLCharacterReference.gperf" + {"Not;", "⫬"}, + {""}, +#line 935 "HTMLCharacterReference.gperf" + {"cuvee;", "⋎"}, + {""}, +#line 1502 "HTMLCharacterReference.gperf" + {"ne;", "≠"}, +#line 2206 "HTMLCharacterReference.gperf" + {"xfr;", "𝔵"}, + {""}, +#line 820 "HTMLCharacterReference.gperf" + {"boxvR;", "╞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1769 "HTMLCharacterReference.gperf" + {"qprime;", "⁗"}, + {""}, +#line 1209 "HTMLCharacterReference.gperf" + {"iff;", "⇔"}, + {""}, +#line 1154 "HTMLCharacterReference.gperf" + {"gsime;", "⪎"}, + {""}, + {""}, +#line 199 "HTMLCharacterReference.gperf" + {"Gfr;", "𝔊"}, + {""}, +#line 1405 "HTMLCharacterReference.gperf" + {"lsime;", "⪍"}, + {""}, + {""}, + {""}, + {""}, +#line 168 "HTMLCharacterReference.gperf" + {"Eogon;", "Ę"}, + {""}, + {""}, + {""}, +#line 725 "HTMLCharacterReference.gperf" + {"bNot;", "⫭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1510 "HTMLCharacterReference.gperf" + {"nesim;", "≂̸"}, + {""}, + {""}, +#line 1553 "HTMLCharacterReference.gperf" + {"notindot;", "⋵̸"}, +#line 684 "HTMLCharacterReference.gperf" + {"andv;", "⩚"}, + {""}, + {""}, + {""}, + {""}, +#line 1121 "HTMLCharacterReference.gperf" + {"gdot;", "ġ"}, +#line 1525 "HTMLCharacterReference.gperf" + {"nhpar;", "⫲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1017 "HTMLCharacterReference.gperf" + {"edot;", "ė"}, + {""}, + {""}, +#line 1387 "HTMLCharacterReference.gperf" + {"lotimes;", "⨴"}, + {""}, #line 858 "HTMLCharacterReference.gperf" - {"cedil", "¸"}, + {"cdot;", "ċ"}, +#line 908 "HTMLCharacterReference.gperf" + {"csube;", "⫑"}, + {""}, +#line 1309 "HTMLCharacterReference.gperf" + {"lbrksld;", "⦏"}, + {""}, + {""}, +#line 1601 "HTMLCharacterReference.gperf" + {"nsupe;", "⊉"}, + {""}, + {""}, + {""}, #line 859 "HTMLCharacterReference.gperf" - {"cedil;", "¸"}, - {""}, -#line 950 "HTMLCharacterReference.gperf" - {"dd;", "ⅆ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2188 "HTMLCharacterReference.gperf" - {"vsupne;", "⊋︀"}, - {""}, - {""}, -#line 792 "HTMLCharacterReference.gperf" - {"boxV;", "║"}, + {"cedil", "¸"}, +#line 860 "HTMLCharacterReference.gperf" + {"cedil;", "¸"}, + {""}, +#line 951 "HTMLCharacterReference.gperf" + {"dd;", "ⅆ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2189 "HTMLCharacterReference.gperf" + {"vsupne;", "⊋︀"}, + {""}, + {""}, #line 793 "HTMLCharacterReference.gperf" - {"boxVH;", "╬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 824 "HTMLCharacterReference.gperf" - {"breve;", "˘"}, - {""}, - {""}, - {""}, - {""}, -#line 1158 "HTMLCharacterReference.gperf" - {"gtcir;", "⩺"}, - {""}, - {""}, - {""}, - {""}, -#line 1413 "HTMLCharacterReference.gperf" - {"ltcir;", "⩹"}, - {""}, - {""}, - {""}, - {""}, -#line 1504 "HTMLCharacterReference.gperf" - {"nearr;", "↗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 470 "HTMLCharacterReference.gperf" - {"Re;", "ℜ"}, - {""}, - {""}, - {""}, -#line 1572 "HTMLCharacterReference.gperf" - {"nrarrc;", "⤳̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1235 "HTMLCharacterReference.gperf" - {"intprod;", "⨼"}, - {""}, -#line 1244 "HTMLCharacterReference.gperf" - {"isin;", "∈"}, - {""}, + {"boxV;", "║"}, +#line 794 "HTMLCharacterReference.gperf" + {"boxVH;", "╬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 825 "HTMLCharacterReference.gperf" + {"breve;", "˘"}, + {""}, + {""}, + {""}, + {""}, +#line 1159 "HTMLCharacterReference.gperf" + {"gtcir;", "⩺"}, + {""}, + {""}, + {""}, + {""}, +#line 1414 "HTMLCharacterReference.gperf" + {"ltcir;", "⩹"}, + {""}, + {""}, + {""}, + {""}, +#line 1505 "HTMLCharacterReference.gperf" + {"nearr;", "↗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 471 "HTMLCharacterReference.gperf" + {"Re;", "ℜ"}, + {""}, + {""}, + {""}, +#line 1573 "HTMLCharacterReference.gperf" + {"nrarrc;", "⤳̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1236 "HTMLCharacterReference.gperf" + {"intprod;", "⨼"}, + {""}, +#line 1245 "HTMLCharacterReference.gperf" + {"isin;", "∈"}, + {""}, +#line 993 "HTMLCharacterReference.gperf" + {"drcrop;", "⌌"}, + {""}, +#line 693 "HTMLCharacterReference.gperf" + {"angmsdae;", "⦬"}, + {""}, +#line 1250 "HTMLCharacterReference.gperf" + {"isinv;", "∈"}, + {""}, +#line 445 "HTMLCharacterReference.gperf" + {"Pr;", "⪻"}, + {""}, + {""}, +#line 799 "HTMLCharacterReference.gperf" + {"boxVr;", "╟"}, + {""}, + {""}, +#line 348 "HTMLCharacterReference.gperf" + {"Nfr;", "𝔑"}, + {""}, + {""}, + {""}, +#line 913 "HTMLCharacterReference.gperf" + {"cudarrr;", "⤵"}, + {""}, +#line 1152 "HTMLCharacterReference.gperf" + {"gscr;", "ℊ"}, +#line 596 "HTMLCharacterReference.gperf" + {"UpTee;", "⊥"}, +#line 1262 "HTMLCharacterReference.gperf" + {"jsercy;", "ј"}, + {""}, +#line 1117 "HTMLCharacterReference.gperf" + {"gap;", "⪆"}, +#line 1402 "HTMLCharacterReference.gperf" + {"lscr;", "𝓁"}, +#line 831 "HTMLCharacterReference.gperf" + {"bsime;", "⋍"}, #line 992 "HTMLCharacterReference.gperf" - {"drcrop;", "⌌"}, - {""}, -#line 692 "HTMLCharacterReference.gperf" - {"angmsdae;", "⦬"}, - {""}, -#line 1249 "HTMLCharacterReference.gperf" - {"isinv;", "∈"}, - {""}, -#line 444 "HTMLCharacterReference.gperf" - {"Pr;", "⪻"}, - {""}, - {""}, -#line 798 "HTMLCharacterReference.gperf" - {"boxVr;", "╟"}, - {""}, - {""}, -#line 347 "HTMLCharacterReference.gperf" - {"Nfr;", "𝔑"}, - {""}, - {""}, - {""}, -#line 912 "HTMLCharacterReference.gperf" - {"cudarrr;", "⤵"}, - {""}, -#line 1151 "HTMLCharacterReference.gperf" - {"gscr;", "ℊ"}, -#line 595 "HTMLCharacterReference.gperf" - {"UpTee;", "⊥"}, + {"drcorn;", "⌟"}, + {""}, +#line 1288 "HTMLCharacterReference.gperf" + {"lap;", "⪅"}, +#line 1060 "HTMLCharacterReference.gperf" + {"escr;", "ℯ"}, + {""}, + {""}, + {""}, +#line 1300 "HTMLCharacterReference.gperf" + {"lat;", "⪫"}, +#line 906 "HTMLCharacterReference.gperf" + {"cscr;", "𝒸"}, + {""}, + {""}, + {""}, +#line 842 "HTMLCharacterReference.gperf" + {"cap;", "∩"}, +#line 715 "HTMLCharacterReference.gperf" + {"ascr;", "𝒶"}, + {""}, +#line 1306 "HTMLCharacterReference.gperf" + {"lbrace;", "{"}, + {""}, + {""}, #line 1261 "HTMLCharacterReference.gperf" - {"jsercy;", "ј"}, - {""}, -#line 1116 "HTMLCharacterReference.gperf" - {"gap;", "⪆"}, -#line 1401 "HTMLCharacterReference.gperf" - {"lscr;", "𝓁"}, -#line 830 "HTMLCharacterReference.gperf" - {"bsime;", "⋍"}, -#line 991 "HTMLCharacterReference.gperf" - {"drcorn;", "⌟"}, - {""}, -#line 1287 "HTMLCharacterReference.gperf" - {"lap;", "⪅"}, -#line 1059 "HTMLCharacterReference.gperf" - {"escr;", "ℯ"}, - {""}, - {""}, - {""}, -#line 1299 "HTMLCharacterReference.gperf" - {"lat;", "⪫"}, -#line 905 "HTMLCharacterReference.gperf" - {"cscr;", "𝒸"}, - {""}, - {""}, - {""}, -#line 841 "HTMLCharacterReference.gperf" - {"cap;", "∩"}, -#line 714 "HTMLCharacterReference.gperf" - {"ascr;", "𝒶"}, - {""}, -#line 1305 "HTMLCharacterReference.gperf" - {"lbrace;", "{"}, - {""}, - {""}, -#line 1260 "HTMLCharacterReference.gperf" - {"jscr;", "𝒿"}, - {""}, - {""}, - {""}, - {""}, -#line 604 "HTMLCharacterReference.gperf" - {"Uscr;", "𝒰"}, -#line 1519 "HTMLCharacterReference.gperf" - {"ngsim;", "≵"}, - {""}, - {""}, - {""}, -#line 1165 "HTMLCharacterReference.gperf" - {"gtreqless;", "⋛"}, -#line 952 "HTMLCharacterReference.gperf" - {"ddarr;", "⇊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1599 "HTMLCharacterReference.gperf" - {"nsupE;", "⫆̸"}, - {""}, - {""}, - {""}, -#line 993 "HTMLCharacterReference.gperf" - {"dscr;", "𝒹"}, - {""}, - {""}, - {""}, + {"jscr;", "𝒿"}, + {""}, + {""}, + {""}, + {""}, +#line 605 "HTMLCharacterReference.gperf" + {"Uscr;", "𝒰"}, #line 1520 "HTMLCharacterReference.gperf" - {"ngt;", "≯"}, -#line 1194 "HTMLCharacterReference.gperf" - {"hscr;", "𝒽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1617 "HTMLCharacterReference.gperf" - {"nvHarr;", "⤄"}, - {""}, -#line 31 "HTMLCharacterReference.gperf" - {"Afr;", "𝔄"}, -#line 1157 "HTMLCharacterReference.gperf" - {"gtcc;", "⪧"}, -#line 889 "HTMLCharacterReference.gperf" - {"comma;", ","}, - {""}, - {""}, - {""}, -#line 1412 "HTMLCharacterReference.gperf" - {"ltcc;", "⪦"}, - {""}, - {""}, - {""}, - {""}, + {"ngsim;", "≵"}, + {""}, + {""}, + {""}, +#line 1166 "HTMLCharacterReference.gperf" + {"gtreqless;", "⋛"}, +#line 953 "HTMLCharacterReference.gperf" + {"ddarr;", "⇊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1600 "HTMLCharacterReference.gperf" + {"nsupE;", "⫆̸"}, + {""}, + {""}, + {""}, +#line 994 "HTMLCharacterReference.gperf" + {"dscr;", "𝒹"}, + {""}, + {""}, + {""}, #line 1521 "HTMLCharacterReference.gperf" - {"ngtr;", "≯"}, - {""}, - {""}, - {""}, -#line 981 "HTMLCharacterReference.gperf" - {"doteqdot;", "≑"}, -#line 1290 "HTMLCharacterReference.gperf" - {"larr;", "←"}, -#line 797 "HTMLCharacterReference.gperf" - {"boxVl;", "╢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 459 "HTMLCharacterReference.gperf" - {"Qscr;", "𝒬"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 37 "HTMLCharacterReference.gperf" - {"Aogon;", "Ą"}, - {""}, -#line 658 "HTMLCharacterReference.gperf" - {"ac;", "∾"}, - {""}, -#line 1110 "HTMLCharacterReference.gperf" - {"fscr;", "𝒻"}, - {""}, - {""}, - {""}, - {""}, -#line 570 "HTMLCharacterReference.gperf" - {"Uarr;", "↟"}, - {""}, - {""}, - {""}, -#line 918 "HTMLCharacterReference.gperf" - {"cupbrcap;", "⩈"}, -#line 2200 "HTMLCharacterReference.gperf" - {"wscr;", "𝓌"}, -#line 1596 "HTMLCharacterReference.gperf" - {"nsucc;", "⊁"}, - {""}, - {""}, - {""}, - {""}, -#line 849 "HTMLCharacterReference.gperf" - {"caron;", "ˇ"}, - {""}, - {""}, - {""}, -#line 2184 "HTMLCharacterReference.gperf" - {"vscr;", "𝓋"}, - {""}, - {""}, - {""}, - {""}, -#line 943 "HTMLCharacterReference.gperf" - {"darr;", "↓"}, - {""}, -#line 1298 "HTMLCharacterReference.gperf" - {"larrtl;", "↢"}, - {""}, -#line 694 "HTMLCharacterReference.gperf" - {"angmsdag;", "⦮"}, -#line 1176 "HTMLCharacterReference.gperf" - {"harr;", "↔"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1586 "HTMLCharacterReference.gperf" - {"nsmid;", "∤"}, - {""}, - {""}, - {""}, - {""}, -#line 795 "HTMLCharacterReference.gperf" - {"boxVR;", "╠"}, - {""}, -#line 169 "HTMLCharacterReference.gperf" - {"Epsilon;", "Ε"}, - {""}, -#line 827 "HTMLCharacterReference.gperf" - {"bscr;", "𝒷"}, -#line 596 "HTMLCharacterReference.gperf" - {"UpTeeArrow;", "↥"}, - {""}, - {""}, - {""}, - {""}, + {"ngt;", "≯"}, +#line 1195 "HTMLCharacterReference.gperf" + {"hscr;", "𝒽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1618 "HTMLCharacterReference.gperf" + {"nvHarr;", "⤄"}, + {""}, +#line 32 "HTMLCharacterReference.gperf" + {"Afr;", "𝔄"}, +#line 1158 "HTMLCharacterReference.gperf" + {"gtcc;", "⪧"}, +#line 890 "HTMLCharacterReference.gperf" + {"comma;", ","}, + {""}, + {""}, + {""}, +#line 1413 "HTMLCharacterReference.gperf" + {"ltcc;", "⪦"}, + {""}, + {""}, + {""}, + {""}, +#line 1522 "HTMLCharacterReference.gperf" + {"ngtr;", "≯"}, + {""}, + {""}, + {""}, +#line 982 "HTMLCharacterReference.gperf" + {"doteqdot;", "≑"}, +#line 1291 "HTMLCharacterReference.gperf" + {"larr;", "←"}, +#line 798 "HTMLCharacterReference.gperf" + {"boxVl;", "╢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 460 "HTMLCharacterReference.gperf" + {"Qscr;", "𝒬"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 38 "HTMLCharacterReference.gperf" + {"Aogon;", "Ą"}, + {""}, +#line 659 "HTMLCharacterReference.gperf" + {"ac;", "∾"}, + {""}, +#line 1111 "HTMLCharacterReference.gperf" + {"fscr;", "𝒻"}, + {""}, + {""}, + {""}, + {""}, +#line 571 "HTMLCharacterReference.gperf" + {"Uarr;", "↟"}, + {""}, + {""}, + {""}, +#line 919 "HTMLCharacterReference.gperf" + {"cupbrcap;", "⩈"}, +#line 2201 "HTMLCharacterReference.gperf" + {"wscr;", "𝓌"}, +#line 1597 "HTMLCharacterReference.gperf" + {"nsucc;", "⊁"}, + {""}, + {""}, + {""}, + {""}, +#line 850 "HTMLCharacterReference.gperf" + {"caron;", "ˇ"}, + {""}, + {""}, + {""}, +#line 2185 "HTMLCharacterReference.gperf" + {"vscr;", "𝓋"}, + {""}, + {""}, + {""}, + {""}, +#line 944 "HTMLCharacterReference.gperf" + {"darr;", "↓"}, + {""}, +#line 1299 "HTMLCharacterReference.gperf" + {"larrtl;", "↢"}, + {""}, +#line 695 "HTMLCharacterReference.gperf" + {"angmsdag;", "⦮"}, +#line 1177 "HTMLCharacterReference.gperf" + {"harr;", "↔"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1587 "HTMLCharacterReference.gperf" + {"nsmid;", "∤"}, + {""}, + {""}, + {""}, + {""}, +#line 796 "HTMLCharacterReference.gperf" + {"boxVR;", "╠"}, + {""}, #line 170 "HTMLCharacterReference.gperf" - {"Equal;", "⩵"}, - {""}, -#line 199 "HTMLCharacterReference.gperf" - {"Gg;", "⋙"}, - {""}, - {""}, - {""}, -#line 1009 "HTMLCharacterReference.gperf" - {"easter;", "⩮"}, - {""}, - {""}, - {""}, -#line 1304 "HTMLCharacterReference.gperf" - {"lbbrk;", "❲"}, - {""}, - {""}, - {""}, -#line 609 "HTMLCharacterReference.gperf" - {"Vbar;", "⫫"}, -#line 2213 "HTMLCharacterReference.gperf" - {"xodot;", "⨀"}, -#line 1310 "HTMLCharacterReference.gperf" - {"lcaron;", "ľ"}, - {""}, - {""}, - {""}, - {""}, + {"Epsilon;", "Ε"}, + {""}, +#line 828 "HTMLCharacterReference.gperf" + {"bscr;", "𝒷"}, +#line 597 "HTMLCharacterReference.gperf" + {"UpTeeArrow;", "↥"}, + {""}, + {""}, + {""}, + {""}, +#line 171 "HTMLCharacterReference.gperf" + {"Equal;", "⩵"}, + {""}, +#line 200 "HTMLCharacterReference.gperf" + {"Gg;", "⋙"}, + {""}, + {""}, + {""}, #line 1010 "HTMLCharacterReference.gperf" - {"ecaron;", "ě"}, - {""}, - {""}, - {""}, - {""}, -#line 851 "HTMLCharacterReference.gperf" - {"ccaron;", "č"}, - {""}, - {""}, - {""}, - {""}, -#line 1014 "HTMLCharacterReference.gperf" - {"ecolon;", "≕"}, - {""}, - {""}, - {""}, - {""}, -#line 1419 "HTMLCharacterReference.gperf" - {"ltrPar;", "⦖"}, - {""}, - {""}, -#line 651 "HTMLCharacterReference.gperf" - {"Zeta;", "Ζ"}, - {""}, - {""}, - {""}, - {""}, -#line 2159 "HTMLCharacterReference.gperf" - {"varr;", "↕"}, - {""}, -#line 919 "HTMLCharacterReference.gperf" - {"cupcap;", "⩆"}, - {""}, - {""}, - {""}, -#line 1247 "HTMLCharacterReference.gperf" - {"isins;", "⋴"}, + {"easter;", "⩮"}, + {""}, + {""}, + {""}, +#line 1305 "HTMLCharacterReference.gperf" + {"lbbrk;", "❲"}, + {""}, + {""}, + {""}, +#line 610 "HTMLCharacterReference.gperf" + {"Vbar;", "⫫"}, +#line 2214 "HTMLCharacterReference.gperf" + {"xodot;", "⨀"}, +#line 1311 "HTMLCharacterReference.gperf" + {"lcaron;", "ľ"}, + {""}, + {""}, + {""}, + {""}, +#line 1011 "HTMLCharacterReference.gperf" + {"ecaron;", "ě"}, + {""}, + {""}, + {""}, + {""}, +#line 852 "HTMLCharacterReference.gperf" + {"ccaron;", "č"}, + {""}, + {""}, + {""}, + {""}, +#line 1015 "HTMLCharacterReference.gperf" + {"ecolon;", "≕"}, + {""}, + {""}, + {""}, + {""}, +#line 1420 "HTMLCharacterReference.gperf" + {"ltrPar;", "⦖"}, + {""}, + {""}, +#line 652 "HTMLCharacterReference.gperf" + {"Zeta;", "Ζ"}, + {""}, + {""}, + {""}, + {""}, +#line 2160 "HTMLCharacterReference.gperf" + {"varr;", "↕"}, + {""}, +#line 920 "HTMLCharacterReference.gperf" + {"cupcap;", "⩆"}, + {""}, + {""}, + {""}, +#line 1248 "HTMLCharacterReference.gperf" + {"isins;", "⋴"}, +#line 1297 "HTMLCharacterReference.gperf" + {"larrpl;", "⤹"}, + {""}, + {""}, +#line 219 "HTMLCharacterReference.gperf" + {"Hscr;", "ℋ"}, + {""}, +#line 2200 "HTMLCharacterReference.gperf" + {"wreath;", "≀"}, + {""}, + {""}, +#line 188 "HTMLCharacterReference.gperf" + {"Fscr;", "ℱ"}, + {""}, +#line 949 "HTMLCharacterReference.gperf" + {"dcaron;", "ď"}, + {""}, +#line 213 "HTMLCharacterReference.gperf" + {"Hat;", "^"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1244 "HTMLCharacterReference.gperf" + {"iscr;", "𝒾"}, + {""}, + {""}, + {""}, +#line 1396 "HTMLCharacterReference.gperf" + {"lrcorner;", "⌟"}, + {""}, + {""}, + {""}, + {""}, +#line 628 "HTMLCharacterReference.gperf" + {"Wfr;", "𝔚"}, + {""}, + {""}, + {""}, + {""}, +#line 37 "HTMLCharacterReference.gperf" + {"And;", "⩓"}, + {""}, + {""}, #line 1296 "HTMLCharacterReference.gperf" - {"larrpl;", "⤹"}, - {""}, - {""}, -#line 218 "HTMLCharacterReference.gperf" - {"Hscr;", "ℋ"}, - {""}, -#line 2199 "HTMLCharacterReference.gperf" - {"wreath;", "≀"}, - {""}, - {""}, -#line 187 "HTMLCharacterReference.gperf" - {"Fscr;", "ℱ"}, - {""}, -#line 948 "HTMLCharacterReference.gperf" - {"dcaron;", "ď"}, - {""}, -#line 212 "HTMLCharacterReference.gperf" - {"Hat;", "^"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1243 "HTMLCharacterReference.gperf" - {"iscr;", "𝒾"}, - {""}, - {""}, - {""}, -#line 1395 "HTMLCharacterReference.gperf" - {"lrcorner;", "⌟"}, - {""}, - {""}, - {""}, - {""}, -#line 627 "HTMLCharacterReference.gperf" - {"Wfr;", "𝔚"}, - {""}, - {""}, - {""}, - {""}, -#line 36 "HTMLCharacterReference.gperf" - {"And;", "⩓"}, - {""}, - {""}, -#line 1295 "HTMLCharacterReference.gperf" - {"larrlp;", "↫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 863 "HTMLCharacterReference.gperf" - {"centerdot;", "·"}, - {""}, - {""}, - {""}, -#line 1514 "HTMLCharacterReference.gperf" - {"nge;", "≱"}, -#line 643 "HTMLCharacterReference.gperf" - {"Yscr;", "𝒴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 860 "HTMLCharacterReference.gperf" - {"cemptyv;", "⦲"}, - {""}, -#line 894 "HTMLCharacterReference.gperf" - {"complexes;", "ℂ"}, -#line 1376 "HTMLCharacterReference.gperf" - {"lobrk;", "⟦"}, -#line 189 "HTMLCharacterReference.gperf" - {"GT", ">"}, + {"larrlp;", "↫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 864 "HTMLCharacterReference.gperf" + {"centerdot;", "·"}, + {""}, + {""}, + {""}, +#line 1515 "HTMLCharacterReference.gperf" + {"nge;", "≱"}, +#line 644 "HTMLCharacterReference.gperf" + {"Yscr;", "𝒴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 861 "HTMLCharacterReference.gperf" + {"cemptyv;", "⦲"}, + {""}, +#line 895 "HTMLCharacterReference.gperf" + {"complexes;", "ℂ"}, +#line 1377 "HTMLCharacterReference.gperf" + {"lobrk;", "⟦"}, #line 190 "HTMLCharacterReference.gperf" - {"GT;", ">"}, - {""}, -#line 1583 "HTMLCharacterReference.gperf" - {"nsim;", "≁"}, - {""}, -#line 1053 "HTMLCharacterReference.gperf" - {"equest;", "≟"}, - {""}, - {""}, -#line 1567 "HTMLCharacterReference.gperf" - {"npre;", "⪯̸"}, - {""}, -#line 890 "HTMLCharacterReference.gperf" - {"commat;", "@"}, - {""}, - {""}, -#line 322 "HTMLCharacterReference.gperf" - {"Lscr;", "ℒ"}, -#line 893 "HTMLCharacterReference.gperf" - {"complement;", "∁"}, - {""}, - {""}, -#line 2237 "HTMLCharacterReference.gperf" - {"yuml", "ÿ"}, + {"GT", ">"}, +#line 191 "HTMLCharacterReference.gperf" + {"GT;", ">"}, + {""}, +#line 1584 "HTMLCharacterReference.gperf" + {"nsim;", "≁"}, + {""}, +#line 1054 "HTMLCharacterReference.gperf" + {"equest;", "≟"}, + {""}, + {""}, +#line 1568 "HTMLCharacterReference.gperf" + {"npre;", "⪯̸"}, + {""}, +#line 891 "HTMLCharacterReference.gperf" + {"commat;", "@"}, + {""}, + {""}, +#line 323 "HTMLCharacterReference.gperf" + {"Lscr;", "ℒ"}, +#line 894 "HTMLCharacterReference.gperf" + {"complement;", "∁"}, + {""}, + {""}, #line 2238 "HTMLCharacterReference.gperf" - {"yuml;", "ÿ"}, - {""}, - {""}, -#line 1201 "HTMLCharacterReference.gperf" - {"ic;", "⁣"}, - {""}, - {""}, -#line 1245 "HTMLCharacterReference.gperf" - {"isinE;", "⋹"}, - {""}, - {""}, -#line 555 "HTMLCharacterReference.gperf" - {"Tfr;", "𝔗"}, -#line 2251 "HTMLCharacterReference.gperf" - {"zwnj;", "‌"}, - {""}, - {""}, -#line 957 "HTMLCharacterReference.gperf" - {"demptyv;", "⦱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1590 "HTMLCharacterReference.gperf" - {"nsub;", "⊄"}, - {""}, -#line 1510 "HTMLCharacterReference.gperf" - {"nexist;", "∄"}, -#line 1002 "HTMLCharacterReference.gperf" - {"dwangle;", "⦦"}, - {""}, -#line 1769 "HTMLCharacterReference.gperf" - {"qscr;", "𝓆"}, - {""}, - {""}, -#line 1461 "HTMLCharacterReference.gperf" - {"mp;", "∓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 438 "HTMLCharacterReference.gperf" - {"Pfr;", "𝔓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1117 "HTMLCharacterReference.gperf" - {"gbreve;", "ğ"}, - {""}, -#line 2245 "HTMLCharacterReference.gperf" - {"zfr;", "𝔷"}, -#line 994 "HTMLCharacterReference.gperf" - {"dscy;", "ѕ"}, -#line 1357 "HTMLCharacterReference.gperf" - {"lhblk;", "▄"}, - {""}, - {""}, - {""}, -#line 333 "HTMLCharacterReference.gperf" - {"Mscr;", "ℳ"}, - {""}, -#line 1614 "HTMLCharacterReference.gperf" - {"numero;", "№"}, - {""}, -#line 326 "HTMLCharacterReference.gperf" - {"Map;", "⤅"}, - {""}, - {""}, -#line 1492 "HTMLCharacterReference.gperf" - {"nbumpe;", "≏̸"}, - {""}, - {""}, - {""}, - {""}, -#line 657 "HTMLCharacterReference.gperf" - {"abreve;", "ă"}, -#line 1464 "HTMLCharacterReference.gperf" - {"mu;", "μ"}, - {""}, -#line 273 "HTMLCharacterReference.gperf" - {"Larr;", "↞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 573 "HTMLCharacterReference.gperf" - {"Ubreve;", "Ŭ"}, - {""}, - {""}, - {""}, -#line 1506 "HTMLCharacterReference.gperf" - {"nedot;", "≐̸"}, -#line 2216 "HTMLCharacterReference.gperf" - {"xotime;", "⨂"}, - {""}, - {""}, - {""}, - {""}, -#line 1231 "HTMLCharacterReference.gperf" - {"intcal;", "⊺"}, - {""}, - {""}, -#line 2158 "HTMLCharacterReference.gperf" - {"varpropto;", "∝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 352 "HTMLCharacterReference.gperf" - {"NotCongruent;", "≢"}, - {""}, - {""}, -#line 1021 "HTMLCharacterReference.gperf" - {"egrave", "è"}, + {"yuml", "ÿ"}, +#line 2239 "HTMLCharacterReference.gperf" + {"yuml;", "ÿ"}, + {""}, + {""}, +#line 1202 "HTMLCharacterReference.gperf" + {"ic;", "⁣"}, + {""}, + {""}, +#line 1246 "HTMLCharacterReference.gperf" + {"isinE;", "⋹"}, + {""}, + {""}, +#line 556 "HTMLCharacterReference.gperf" + {"Tfr;", "𝔗"}, +#line 2252 "HTMLCharacterReference.gperf" + {"zwnj;", "‌"}, + {""}, + {""}, +#line 958 "HTMLCharacterReference.gperf" + {"demptyv;", "⦱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1591 "HTMLCharacterReference.gperf" + {"nsub;", "⊄"}, + {""}, +#line 1511 "HTMLCharacterReference.gperf" + {"nexist;", "∄"}, +#line 1003 "HTMLCharacterReference.gperf" + {"dwangle;", "⦦"}, + {""}, +#line 1770 "HTMLCharacterReference.gperf" + {"qscr;", "𝓆"}, + {""}, + {""}, +#line 1462 "HTMLCharacterReference.gperf" + {"mp;", "∓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 439 "HTMLCharacterReference.gperf" + {"Pfr;", "𝔓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1118 "HTMLCharacterReference.gperf" + {"gbreve;", "ğ"}, + {""}, +#line 2246 "HTMLCharacterReference.gperf" + {"zfr;", "𝔷"}, +#line 995 "HTMLCharacterReference.gperf" + {"dscy;", "ѕ"}, +#line 1358 "HTMLCharacterReference.gperf" + {"lhblk;", "▄"}, + {""}, + {""}, + {""}, +#line 334 "HTMLCharacterReference.gperf" + {"Mscr;", "ℳ"}, + {""}, +#line 1615 "HTMLCharacterReference.gperf" + {"numero;", "№"}, + {""}, +#line 327 "HTMLCharacterReference.gperf" + {"Map;", "⤅"}, + {""}, + {""}, +#line 1493 "HTMLCharacterReference.gperf" + {"nbumpe;", "≏̸"}, + {""}, + {""}, + {""}, + {""}, +#line 658 "HTMLCharacterReference.gperf" + {"abreve;", "ă"}, +#line 1465 "HTMLCharacterReference.gperf" + {"mu;", "μ"}, + {""}, +#line 274 "HTMLCharacterReference.gperf" + {"Larr;", "↞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 574 "HTMLCharacterReference.gperf" + {"Ubreve;", "Ŭ"}, + {""}, + {""}, + {""}, +#line 1507 "HTMLCharacterReference.gperf" + {"nedot;", "≐̸"}, +#line 2217 "HTMLCharacterReference.gperf" + {"xotime;", "⨂"}, + {""}, + {""}, + {""}, + {""}, +#line 1232 "HTMLCharacterReference.gperf" + {"intcal;", "⊺"}, + {""}, + {""}, +#line 2159 "HTMLCharacterReference.gperf" + {"varpropto;", "∝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 353 "HTMLCharacterReference.gperf" + {"NotCongruent;", "≢"}, + {""}, + {""}, #line 1022 "HTMLCharacterReference.gperf" - {"egrave;", "è"}, - {""}, - {""}, -#line 865 "HTMLCharacterReference.gperf" - {"chcy;", "ч"}, -#line 850 "HTMLCharacterReference.gperf" - {"ccaps;", "⩍"}, -#line 1074 "HTMLCharacterReference.gperf" - {"female;", "♀"}, -#line 740 "HTMLCharacterReference.gperf" - {"bemptyv;", "⦰"}, - {""}, - {""}, -#line 670 "HTMLCharacterReference.gperf" - {"agrave", "à"}, + {"egrave", "è"}, +#line 1023 "HTMLCharacterReference.gperf" + {"egrave;", "è"}, + {""}, + {""}, +#line 866 "HTMLCharacterReference.gperf" + {"chcy;", "ч"}, +#line 851 "HTMLCharacterReference.gperf" + {"ccaps;", "⩍"}, +#line 1075 "HTMLCharacterReference.gperf" + {"female;", "♀"}, +#line 741 "HTMLCharacterReference.gperf" + {"bemptyv;", "⦰"}, + {""}, + {""}, #line 671 "HTMLCharacterReference.gperf" - {"agrave;", "à"}, - {""}, - {""}, - {""}, - {""}, -#line 1174 "HTMLCharacterReference.gperf" - {"hamilt;", "ℋ"}, - {""}, - {""}, -#line 174 "HTMLCharacterReference.gperf" - {"Esim;", "⩳"}, -#line 579 "HTMLCharacterReference.gperf" - {"Ugrave", "Ù"}, + {"agrave", "à"}, +#line 672 "HTMLCharacterReference.gperf" + {"agrave;", "à"}, + {""}, + {""}, + {""}, + {""}, +#line 1175 "HTMLCharacterReference.gperf" + {"hamilt;", "ℋ"}, + {""}, + {""}, +#line 175 "HTMLCharacterReference.gperf" + {"Esim;", "⩳"}, #line 580 "HTMLCharacterReference.gperf" - {"Ugrave;", "Ù"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 148 "HTMLCharacterReference.gperf" - {"Dscr;", "𝒟"}, -#line 2173 "HTMLCharacterReference.gperf" - {"veeeq;", "≚"}, -#line 710 "HTMLCharacterReference.gperf" - {"approx;", "≈"}, - {""}, -#line 621 "HTMLCharacterReference.gperf" - {"Vfr;", "𝔙"}, -#line 1474 "HTMLCharacterReference.gperf" - {"nLtv;", "≪̸"}, -#line 1407 "HTMLCharacterReference.gperf" - {"lsquo;", "‘"}, + {"Ugrave", "Ù"}, +#line 581 "HTMLCharacterReference.gperf" + {"Ugrave;", "Ù"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 149 "HTMLCharacterReference.gperf" + {"Dscr;", "𝒟"}, +#line 2174 "HTMLCharacterReference.gperf" + {"veeeq;", "≚"}, +#line 711 "HTMLCharacterReference.gperf" + {"approx;", "≈"}, + {""}, +#line 622 "HTMLCharacterReference.gperf" + {"Vfr;", "𝔙"}, +#line 1475 "HTMLCharacterReference.gperf" + {"nLtv;", "≪̸"}, #line 1408 "HTMLCharacterReference.gperf" - {"lsquor;", "‚"}, -#line 151 "HTMLCharacterReference.gperf" - {"ETH", "Ð"}, -#line 582 "HTMLCharacterReference.gperf" - {"UnderBar;", "_"}, - {""}, - {""}, - {""}, - {""}, + {"lsquo;", "‘"}, +#line 1409 "HTMLCharacterReference.gperf" + {"lsquor;", "‚"}, #line 152 "HTMLCharacterReference.gperf" - {"ETH;", "Ð"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 274 "HTMLCharacterReference.gperf" - {"Lcaron;", "Ľ"}, - {""}, - {""}, - {""}, - {""}, -#line 256 "HTMLCharacterReference.gperf" - {"Jsercy;", "Ј"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1515 "HTMLCharacterReference.gperf" - {"ngeq;", "≱"}, + {"ETH", "Ð"}, +#line 583 "HTMLCharacterReference.gperf" + {"UnderBar;", "_"}, + {""}, + {""}, + {""}, + {""}, +#line 153 "HTMLCharacterReference.gperf" + {"ETH;", "Ð"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 275 "HTMLCharacterReference.gperf" + {"Lcaron;", "Ľ"}, + {""}, + {""}, + {""}, + {""}, +#line 257 "HTMLCharacterReference.gperf" + {"Jsercy;", "Ј"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1516 "HTMLCharacterReference.gperf" - {"ngeqq;", "≧̸"}, - {""}, - {""}, - {""}, - {""}, -#line 1584 "HTMLCharacterReference.gperf" - {"nsime;", "≄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 255 "HTMLCharacterReference.gperf" - {"Jscr;", "𝒥"}, - {""}, - {""}, - {""}, - {""}, -#line 230 "HTMLCharacterReference.gperf" - {"Idot;", "İ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1241 "HTMLCharacterReference.gperf" - {"iquest", "¿"}, + {"ngeq;", "≱"}, +#line 1517 "HTMLCharacterReference.gperf" + {"ngeqq;", "≧̸"}, + {""}, + {""}, + {""}, + {""}, +#line 1585 "HTMLCharacterReference.gperf" + {"nsime;", "≄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 256 "HTMLCharacterReference.gperf" + {"Jscr;", "𝒥"}, + {""}, + {""}, + {""}, + {""}, +#line 231 "HTMLCharacterReference.gperf" + {"Idot;", "İ"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1242 "HTMLCharacterReference.gperf" - {"iquest;", "¿"}, - {""}, - {""}, - {""}, -#line 1405 "HTMLCharacterReference.gperf" - {"lsimg;", "⪏"}, - {""}, - {""}, - {""}, -#line 633 "HTMLCharacterReference.gperf" - {"Xscr;", "𝒳"}, -#line 1312 "HTMLCharacterReference.gperf" - {"lceil;", "⌈"}, - {""}, - {""}, - {""}, -#line 102 "HTMLCharacterReference.gperf" - {"Darr;", "↡"}, -#line 1592 "HTMLCharacterReference.gperf" - {"nsube;", "⊈"}, -#line 523 "HTMLCharacterReference.gperf" - {"Square;", "□"}, - {""}, - {""}, -#line 712 "HTMLCharacterReference.gperf" - {"aring", "å"}, + {"iquest", "¿"}, +#line 1243 "HTMLCharacterReference.gperf" + {"iquest;", "¿"}, + {""}, + {""}, + {""}, +#line 1406 "HTMLCharacterReference.gperf" + {"lsimg;", "⪏"}, + {""}, + {""}, + {""}, +#line 634 "HTMLCharacterReference.gperf" + {"Xscr;", "𝒳"}, +#line 1313 "HTMLCharacterReference.gperf" + {"lceil;", "⌈"}, + {""}, + {""}, + {""}, +#line 103 "HTMLCharacterReference.gperf" + {"Darr;", "↡"}, +#line 1593 "HTMLCharacterReference.gperf" + {"nsube;", "⊈"}, +#line 524 "HTMLCharacterReference.gperf" + {"Square;", "□"}, + {""}, + {""}, #line 713 "HTMLCharacterReference.gperf" - {"aring;", "å"}, -#line 1047 "HTMLCharacterReference.gperf" - {"eqcirc;", "≖"}, - {""}, - {""}, -#line 663 "HTMLCharacterReference.gperf" - {"acute", "´"}, -#line 664 "HTMLCharacterReference.gperf" - {"acute;", "´"}, - {""}, - {""}, -#line 1444 "HTMLCharacterReference.gperf" - {"mho;", "℧"}, - {""}, -#line 603 "HTMLCharacterReference.gperf" - {"Uring;", "Ů"}, -#line 2186 "HTMLCharacterReference.gperf" - {"vsubne;", "⊊︀"}, - {""}, -#line 2232 "HTMLCharacterReference.gperf" - {"yfr;", "𝔶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1568 "HTMLCharacterReference.gperf" - {"nprec;", "⊀"}, - {""}, - {""}, - {""}, -#line 649 "HTMLCharacterReference.gperf" - {"Zdot;", "Ż"}, -#line 716 "HTMLCharacterReference.gperf" - {"asymp;", "≈"}, - {""}, - {""}, - {""}, -#line 530 "HTMLCharacterReference.gperf" - {"Sscr;", "𝒮"}, - {""}, - {""}, - {""}, - {""}, -#line 286 "HTMLCharacterReference.gperf" - {"LeftFloor;", "⌊"}, -#line 2180 "HTMLCharacterReference.gperf" - {"vnsup;", "⊃⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"aring", "å"}, +#line 714 "HTMLCharacterReference.gperf" + {"aring;", "å"}, #line 1048 "HTMLCharacterReference.gperf" - {"eqcolon;", "≕"}, - {""}, -#line 1236 "HTMLCharacterReference.gperf" - {"iocy;", "ё"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 842 "HTMLCharacterReference.gperf" - {"capand;", "⩄"}, - {""}, - {""}, - {""}, - {""}, -#line 1585 "HTMLCharacterReference.gperf" - {"nsimeq;", "≄"}, - {""}, -#line 542 "HTMLCharacterReference.gperf" - {"Superset;", "⊃"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1620 "HTMLCharacterReference.gperf" - {"nvge;", "≥⃒"}, -#line 1291 "HTMLCharacterReference.gperf" - {"larrb;", "⇤"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1463 "HTMLCharacterReference.gperf" - {"mstpos;", "∾"}, - {""}, -#line 1577 "HTMLCharacterReference.gperf" - {"nsc;", "⊁"}, -#line 246 "HTMLCharacterReference.gperf" - {"Iscr;", "ℐ"}, -#line 855 "HTMLCharacterReference.gperf" - {"ccups;", "⩌"}, -#line 104 "HTMLCharacterReference.gperf" - {"Dcaron;", "Ď"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1511 "HTMLCharacterReference.gperf" - {"nexists;", "∄"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 660 "HTMLCharacterReference.gperf" - {"acd;", "∿"}, - {""}, -#line 1210 "HTMLCharacterReference.gperf" - {"igrave", "ì"}, + {"eqcirc;", "≖"}, + {""}, + {""}, +#line 664 "HTMLCharacterReference.gperf" + {"acute", "´"}, +#line 665 "HTMLCharacterReference.gperf" + {"acute;", "´"}, + {""}, + {""}, +#line 1445 "HTMLCharacterReference.gperf" + {"mho;", "℧"}, + {""}, +#line 604 "HTMLCharacterReference.gperf" + {"Uring;", "Ů"}, +#line 2187 "HTMLCharacterReference.gperf" + {"vsubne;", "⊊︀"}, + {""}, +#line 2233 "HTMLCharacterReference.gperf" + {"yfr;", "𝔶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1569 "HTMLCharacterReference.gperf" + {"nprec;", "⊀"}, + {""}, + {""}, + {""}, +#line 650 "HTMLCharacterReference.gperf" + {"Zdot;", "Ż"}, +#line 717 "HTMLCharacterReference.gperf" + {"asymp;", "≈"}, + {""}, + {""}, + {""}, +#line 531 "HTMLCharacterReference.gperf" + {"Sscr;", "𝒮"}, + {""}, + {""}, + {""}, + {""}, +#line 287 "HTMLCharacterReference.gperf" + {"LeftFloor;", "⌊"}, +#line 2181 "HTMLCharacterReference.gperf" + {"vnsup;", "⊃⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1049 "HTMLCharacterReference.gperf" + {"eqcolon;", "≕"}, + {""}, +#line 1237 "HTMLCharacterReference.gperf" + {"iocy;", "ё"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 843 "HTMLCharacterReference.gperf" + {"capand;", "⩄"}, + {""}, + {""}, + {""}, + {""}, +#line 1586 "HTMLCharacterReference.gperf" + {"nsimeq;", "≄"}, + {""}, +#line 543 "HTMLCharacterReference.gperf" + {"Superset;", "⊃"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1621 "HTMLCharacterReference.gperf" + {"nvge;", "≥⃒"}, +#line 1292 "HTMLCharacterReference.gperf" + {"larrb;", "⇤"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1464 "HTMLCharacterReference.gperf" + {"mstpos;", "∾"}, + {""}, +#line 1578 "HTMLCharacterReference.gperf" + {"nsc;", "⊁"}, +#line 247 "HTMLCharacterReference.gperf" + {"Iscr;", "ℐ"}, +#line 856 "HTMLCharacterReference.gperf" + {"ccups;", "⩌"}, +#line 105 "HTMLCharacterReference.gperf" + {"Dcaron;", "Ď"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1512 "HTMLCharacterReference.gperf" + {"nexists;", "∄"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 661 "HTMLCharacterReference.gperf" + {"acd;", "∿"}, + {""}, #line 1211 "HTMLCharacterReference.gperf" - {"igrave;", "ì"}, - {""}, - {""}, -#line 1580 "HTMLCharacterReference.gperf" - {"nscr;", "𝓃"}, - {""}, - {""}, - {""}, -#line 1481 "HTMLCharacterReference.gperf" - {"nap;", "≉"}, - {""}, - {""}, - {""}, - {""}, -#line 691 "HTMLCharacterReference.gperf" - {"angmsdad;", "⦫"}, - {""}, - {""}, - {""}, -#line 509 "HTMLCharacterReference.gperf" - {"Sc;", "⪼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 635 "HTMLCharacterReference.gperf" - {"YIcy;", "Ї"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1591 "HTMLCharacterReference.gperf" - {"nsubE;", "⫅̸"}, - {""}, - {""}, - {""}, -#line 159 "HTMLCharacterReference.gperf" - {"Edot;", "Ė"}, - {""}, - {""}, - {""}, - {""}, -#line 654 "HTMLCharacterReference.gperf" - {"Zscr;", "𝒵"}, - {""}, - {""}, - {""}, - {""}, + {"igrave", "ì"}, +#line 1212 "HTMLCharacterReference.gperf" + {"igrave;", "ì"}, + {""}, + {""}, +#line 1581 "HTMLCharacterReference.gperf" + {"nscr;", "𝓃"}, + {""}, + {""}, + {""}, +#line 1482 "HTMLCharacterReference.gperf" + {"nap;", "≉"}, + {""}, + {""}, + {""}, + {""}, +#line 692 "HTMLCharacterReference.gperf" + {"angmsdad;", "⦫"}, + {""}, + {""}, + {""}, +#line 510 "HTMLCharacterReference.gperf" + {"Sc;", "⪼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 636 "HTMLCharacterReference.gperf" - {"YUcy;", "Ю"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 278 "HTMLCharacterReference.gperf" - {"LeftArrow;", "←"}, -#line 815 "HTMLCharacterReference.gperf" - {"boxur;", "└"}, - {""}, - {""}, -#line 1443 "HTMLCharacterReference.gperf" - {"mfr;", "𝔪"}, -#line 197 "HTMLCharacterReference.gperf" - {"Gdot;", "Ġ"}, - {""}, -#line 43 "HTMLCharacterReference.gperf" - {"Assign;", "≔"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"YIcy;", "Ї"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1592 "HTMLCharacterReference.gperf" + {"nsubE;", "⫅̸"}, + {""}, + {""}, + {""}, +#line 160 "HTMLCharacterReference.gperf" + {"Edot;", "Ė"}, + {""}, + {""}, + {""}, + {""}, +#line 655 "HTMLCharacterReference.gperf" + {"Zscr;", "𝒵"}, + {""}, + {""}, + {""}, + {""}, +#line 637 "HTMLCharacterReference.gperf" + {"YUcy;", "Ю"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 279 "HTMLCharacterReference.gperf" - {"LeftArrowBar;", "⇤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 532 "HTMLCharacterReference.gperf" - {"Sub;", "⋐"}, -#line 615 "HTMLCharacterReference.gperf" - {"Vert;", "‖"}, - {""}, - {""}, - {""}, -#line 263 "HTMLCharacterReference.gperf" - {"Kfr;", "𝔎"}, - {""}, - {""}, - {""}, - {""}, -#line 688 "HTMLCharacterReference.gperf" - {"angmsdaa;", "⦨"}, - {""}, - {""}, - {""}, - {""}, -#line 94 "HTMLCharacterReference.gperf" - {"Cup;", "⋓"}, - {""}, -#line 825 "HTMLCharacterReference.gperf" - {"brvbar", "¦"}, + {"LeftArrow;", "←"}, +#line 816 "HTMLCharacterReference.gperf" + {"boxur;", "└"}, + {""}, + {""}, +#line 1444 "HTMLCharacterReference.gperf" + {"mfr;", "𝔪"}, +#line 198 "HTMLCharacterReference.gperf" + {"Gdot;", "Ġ"}, + {""}, +#line 44 "HTMLCharacterReference.gperf" + {"Assign;", "≔"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 280 "HTMLCharacterReference.gperf" + {"LeftArrowBar;", "⇤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 533 "HTMLCharacterReference.gperf" + {"Sub;", "⋐"}, +#line 616 "HTMLCharacterReference.gperf" + {"Vert;", "‖"}, + {""}, + {""}, + {""}, +#line 264 "HTMLCharacterReference.gperf" + {"Kfr;", "𝔎"}, + {""}, + {""}, + {""}, + {""}, +#line 689 "HTMLCharacterReference.gperf" + {"angmsdaa;", "⦨"}, + {""}, + {""}, + {""}, + {""}, +#line 95 "HTMLCharacterReference.gperf" + {"Cup;", "⋓"}, + {""}, #line 826 "HTMLCharacterReference.gperf" - {"brvbar;", "¦"}, - {""}, - {""}, - {""}, -#line 1050 "HTMLCharacterReference.gperf" - {"eqslantgtr;", "⪖"}, -#line 510 "HTMLCharacterReference.gperf" - {"Scaron;", "Š"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 783 "HTMLCharacterReference.gperf" - {"boxH;", "═"}, - {""}, - {""}, -#line 500 "HTMLCharacterReference.gperf" - {"RoundImplies;", "⥰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 502 "HTMLCharacterReference.gperf" - {"Rscr;", "ℛ"}, - {""}, - {""}, - {""}, -#line 711 "HTMLCharacterReference.gperf" - {"approxeq;", "≊"}, - {""}, -#line 1466 "HTMLCharacterReference.gperf" - {"mumap;", "⊸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 173 "HTMLCharacterReference.gperf" - {"Escr;", "ℰ"}, - {""}, - {""}, - {""}, -#line 1142 "HTMLCharacterReference.gperf" - {"gnE;", "≩"}, - {""}, -#line 814 "HTMLCharacterReference.gperf" - {"boxul;", "┘"}, - {""}, - {""}, -#line 1367 "HTMLCharacterReference.gperf" - {"lnE;", "≨"}, -#line 2219 "HTMLCharacterReference.gperf" - {"xscr;", "𝓍"}, - {""}, - {""}, - {""}, - {""}, -#line 1517 "HTMLCharacterReference.gperf" - {"ngeqslant;", "⩾̸"}, - {""}, - {""}, - {""}, -#line 705 "HTMLCharacterReference.gperf" - {"apE;", "⩰"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 208 "HTMLCharacterReference.gperf" - {"Gscr;", "𝒢"}, - {""}, + {"brvbar", "¦"}, +#line 827 "HTMLCharacterReference.gperf" + {"brvbar;", "¦"}, + {""}, + {""}, + {""}, +#line 1051 "HTMLCharacterReference.gperf" + {"eqslantgtr;", "⪖"}, +#line 511 "HTMLCharacterReference.gperf" + {"Scaron;", "Š"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 784 "HTMLCharacterReference.gperf" + {"boxH;", "═"}, + {""}, + {""}, +#line 501 "HTMLCharacterReference.gperf" + {"RoundImplies;", "⥰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 503 "HTMLCharacterReference.gperf" + {"Rscr;", "ℛ"}, + {""}, + {""}, + {""}, +#line 712 "HTMLCharacterReference.gperf" + {"approxeq;", "≊"}, + {""}, +#line 1467 "HTMLCharacterReference.gperf" + {"mumap;", "⊸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 174 "HTMLCharacterReference.gperf" + {"Escr;", "ℰ"}, + {""}, + {""}, + {""}, +#line 1143 "HTMLCharacterReference.gperf" + {"gnE;", "≩"}, + {""}, +#line 815 "HTMLCharacterReference.gperf" + {"boxul;", "┘"}, + {""}, + {""}, +#line 1368 "HTMLCharacterReference.gperf" + {"lnE;", "≨"}, +#line 2220 "HTMLCharacterReference.gperf" + {"xscr;", "𝓍"}, + {""}, + {""}, + {""}, + {""}, +#line 1518 "HTMLCharacterReference.gperf" + {"ngeqslant;", "⩾̸"}, + {""}, + {""}, + {""}, +#line 706 "HTMLCharacterReference.gperf" + {"apE;", "⩰"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 209 "HTMLCharacterReference.gperf" + {"Gscr;", "𝒢"}, + {""}, +#line 1495 "HTMLCharacterReference.gperf" + {"ncaron;", "ň"}, + {""}, + {""}, #line 1494 "HTMLCharacterReference.gperf" - {"ncaron;", "ň"}, - {""}, - {""}, -#line 1493 "HTMLCharacterReference.gperf" - {"ncap;", "⩃"}, - {""}, - {""}, - {""}, -#line 150 "HTMLCharacterReference.gperf" - {"ENG;", "Ŋ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2223 "HTMLCharacterReference.gperf" - {"xvee;", "⋁"}, - {""}, - {""}, -#line 375 "HTMLCharacterReference.gperf" - {"NotLessSlantEqual;", "⩽̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2244 "HTMLCharacterReference.gperf" - {"zeta;", "ζ"}, - {""}, - {""}, -#line 371 "HTMLCharacterReference.gperf" - {"NotLess;", "≮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 465 "HTMLCharacterReference.gperf" - {"Rarr;", "↠"}, - {""}, -#line 647 "HTMLCharacterReference.gperf" - {"Zcaron;", "Ž"}, - {""}, - {""}, - {""}, -#line 813 "HTMLCharacterReference.gperf" - {"boxuR;", "╘"}, - {""}, -#line 2230 "HTMLCharacterReference.gperf" - {"yen", "¥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2231 "HTMLCharacterReference.gperf" - {"yen;", "¥"}, - {""}, - {""}, -#line 1193 "HTMLCharacterReference.gperf" - {"horbar;", "―"}, - {""}, -#line 690 "HTMLCharacterReference.gperf" - {"angmsdac;", "⦪"}, -#line 556 "HTMLCharacterReference.gperf" - {"Therefore;", "∴"}, - {""}, - {""}, - {""}, - {""}, -#line 1301 "HTMLCharacterReference.gperf" - {"late;", "⪭"}, -#line 1484 "HTMLCharacterReference.gperf" - {"napos;", "ʼn"}, - {""}, - {""}, -#line 613 "HTMLCharacterReference.gperf" - {"Vee;", "⋁"}, -#line 99 "HTMLCharacterReference.gperf" - {"DScy;", "Ѕ"}, - {""}, - {""}, - {""}, -#line 1190 "HTMLCharacterReference.gperf" - {"hookleftarrow;", "↩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ncap;", "⩃"}, + {""}, + {""}, + {""}, +#line 151 "HTMLCharacterReference.gperf" + {"ENG;", "Ŋ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2224 "HTMLCharacterReference.gperf" + {"xvee;", "⋁"}, + {""}, + {""}, +#line 376 "HTMLCharacterReference.gperf" + {"NotLessSlantEqual;", "⩽̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2245 "HTMLCharacterReference.gperf" + {"zeta;", "ζ"}, + {""}, + {""}, +#line 372 "HTMLCharacterReference.gperf" + {"NotLess;", "≮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 466 "HTMLCharacterReference.gperf" - {"Rarrtl;", "⤖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1381 "HTMLCharacterReference.gperf" - {"looparrowleft;", "↫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Rarr;", "↠"}, + {""}, +#line 648 "HTMLCharacterReference.gperf" + {"Zcaron;", "Ž"}, + {""}, + {""}, + {""}, +#line 814 "HTMLCharacterReference.gperf" + {"boxuR;", "╘"}, + {""}, +#line 2231 "HTMLCharacterReference.gperf" + {"yen", "¥"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2232 "HTMLCharacterReference.gperf" + {"yen;", "¥"}, + {""}, + {""}, +#line 1194 "HTMLCharacterReference.gperf" + {"horbar;", "―"}, + {""}, +#line 691 "HTMLCharacterReference.gperf" + {"angmsdac;", "⦪"}, +#line 557 "HTMLCharacterReference.gperf" + {"Therefore;", "∴"}, + {""}, + {""}, + {""}, + {""}, +#line 1302 "HTMLCharacterReference.gperf" + {"late;", "⪭"}, +#line 1485 "HTMLCharacterReference.gperf" + {"napos;", "ʼn"}, + {""}, + {""}, +#line 614 "HTMLCharacterReference.gperf" + {"Vee;", "⋁"}, +#line 100 "HTMLCharacterReference.gperf" + {"DScy;", "Ѕ"}, + {""}, + {""}, + {""}, +#line 1191 "HTMLCharacterReference.gperf" + {"hookleftarrow;", "↩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 467 "HTMLCharacterReference.gperf" - {"Rcaron;", "Ř"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 403 "HTMLCharacterReference.gperf" - {"Nscr;", "𝒩"}, - {""}, - {""}, -#line 1161 "HTMLCharacterReference.gperf" - {"gtquest;", "⩼"}, -#line 454 "HTMLCharacterReference.gperf" - {"Psi;", "Ψ"}, - {""}, - {""}, -#line 155 "HTMLCharacterReference.gperf" - {"Ecaron;", "Ě"}, -#line 1418 "HTMLCharacterReference.gperf" - {"ltquest;", "⩻"}, - {""}, - {""}, -#line 848 "HTMLCharacterReference.gperf" - {"caret;", "⁁"}, - {""}, - {""}, - {""}, -#line 1205 "HTMLCharacterReference.gperf" - {"iecy;", "е"}, - {""}, - {""}, - {""}, - {""}, -#line 2201 "HTMLCharacterReference.gperf" - {"xcap;", "⋂"}, -#line 718 "HTMLCharacterReference.gperf" - {"atilde", "ã"}, + {"Rarrtl;", "⤖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1382 "HTMLCharacterReference.gperf" + {"looparrowleft;", "↫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 468 "HTMLCharacterReference.gperf" + {"Rcaron;", "Ř"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 404 "HTMLCharacterReference.gperf" + {"Nscr;", "𝒩"}, + {""}, + {""}, +#line 1162 "HTMLCharacterReference.gperf" + {"gtquest;", "⩼"}, +#line 455 "HTMLCharacterReference.gperf" + {"Psi;", "Ψ"}, + {""}, + {""}, +#line 156 "HTMLCharacterReference.gperf" + {"Ecaron;", "Ě"}, +#line 1419 "HTMLCharacterReference.gperf" + {"ltquest;", "⩻"}, + {""}, + {""}, +#line 849 "HTMLCharacterReference.gperf" + {"caret;", "⁁"}, + {""}, + {""}, + {""}, +#line 1206 "HTMLCharacterReference.gperf" + {"iecy;", "е"}, + {""}, + {""}, + {""}, + {""}, +#line 2202 "HTMLCharacterReference.gperf" + {"xcap;", "⋂"}, #line 719 "HTMLCharacterReference.gperf" - {"atilde;", "ã"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1601 "HTMLCharacterReference.gperf" - {"nsupset;", "⊃⃒"}, -#line 55 "HTMLCharacterReference.gperf" - {"Bfr;", "𝔅"}, -#line 221 "HTMLCharacterReference.gperf" - {"HumpEqual;", "≏"}, - {""}, -#line 605 "HTMLCharacterReference.gperf" - {"Utilde;", "Ũ"}, - {""}, - {""}, -#line 1011 "HTMLCharacterReference.gperf" - {"ecir;", "≖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 75 "HTMLCharacterReference.gperf" - {"Cfr;", "ℭ"}, - {""}, - {""}, - {""}, -#line 856 "HTMLCharacterReference.gperf" - {"ccupssm;", "⩐"}, - {""}, -#line 1313 "HTMLCharacterReference.gperf" - {"lcub;", "{"}, -#line 2179 "HTMLCharacterReference.gperf" - {"vnsub;", "⊂⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1063 "HTMLCharacterReference.gperf" - {"eth", "ð"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"atilde", "ã"}, +#line 720 "HTMLCharacterReference.gperf" + {"atilde;", "ã"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1602 "HTMLCharacterReference.gperf" + {"nsupset;", "⊃⃒"}, +#line 56 "HTMLCharacterReference.gperf" + {"Bfr;", "𝔅"}, +#line 222 "HTMLCharacterReference.gperf" + {"HumpEqual;", "≏"}, + {""}, +#line 606 "HTMLCharacterReference.gperf" + {"Utilde;", "Ũ"}, + {""}, + {""}, +#line 1012 "HTMLCharacterReference.gperf" + {"ecir;", "≖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 76 "HTMLCharacterReference.gperf" + {"Cfr;", "ℭ"}, + {""}, + {""}, + {""}, +#line 857 "HTMLCharacterReference.gperf" + {"ccupssm;", "⩐"}, + {""}, +#line 1314 "HTMLCharacterReference.gperf" + {"lcub;", "{"}, +#line 2180 "HTMLCharacterReference.gperf" + {"vnsub;", "⊂⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1064 "HTMLCharacterReference.gperf" - {"eth;", "ð"}, -#line 1498 "HTMLCharacterReference.gperf" - {"ncup;", "⩂"}, - {""}, - {""}, + {"eth", "ð"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1065 "HTMLCharacterReference.gperf" + {"eth;", "ð"}, +#line 1499 "HTMLCharacterReference.gperf" + {"ncup;", "⩂"}, + {""}, + {""}, +#line 1139 "HTMLCharacterReference.gperf" + {"gl;", "≷"}, + {""}, +#line 43 "HTMLCharacterReference.gperf" + {"Ascr;", "𝒜"}, + {""}, + {""}, +#line 1360 "HTMLCharacterReference.gperf" + {"ll;", "≪"}, + {""}, +#line 101 "HTMLCharacterReference.gperf" + {"DZcy;", "Џ"}, +#line 233 "HTMLCharacterReference.gperf" + {"Igrave", "Ì"}, +#line 234 "HTMLCharacterReference.gperf" + {"Igrave;", "Ì"}, +#line 1026 "HTMLCharacterReference.gperf" + {"el;", "⪙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1029 "HTMLCharacterReference.gperf" + {"els;", "⪕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2244 "HTMLCharacterReference.gperf" + {"zeetrf;", "ℨ"}, + {""}, +#line 440 "HTMLCharacterReference.gperf" + {"Phi;", "Φ"}, +#line 1383 "HTMLCharacterReference.gperf" + {"looparrowright;", "↬"}, +#line 360 "HTMLCharacterReference.gperf" + {"NotGreater;", "≯"}, +#line 60 "HTMLCharacterReference.gperf" + {"Bumpeq;", "≎"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1141 "HTMLCharacterReference.gperf" + {"gla;", "⪥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 450 "HTMLCharacterReference.gperf" + {"Prime;", "″"}, + {""}, +#line 1247 "HTMLCharacterReference.gperf" + {"isindot;", "⋵"}, + {""}, #line 1138 "HTMLCharacterReference.gperf" - {"gl;", "≷"}, - {""}, -#line 42 "HTMLCharacterReference.gperf" - {"Ascr;", "𝒜"}, - {""}, - {""}, + {"gjcy;", "ѓ"}, + {""}, + {""}, + {""}, + {""}, #line 1359 "HTMLCharacterReference.gperf" - {"ll;", "≪"}, - {""}, -#line 100 "HTMLCharacterReference.gperf" - {"DZcy;", "Џ"}, -#line 232 "HTMLCharacterReference.gperf" - {"Igrave", "Ì"}, -#line 233 "HTMLCharacterReference.gperf" - {"Igrave;", "Ì"}, -#line 1025 "HTMLCharacterReference.gperf" - {"el;", "⪙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1028 "HTMLCharacterReference.gperf" - {"els;", "⪕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2243 "HTMLCharacterReference.gperf" - {"zeetrf;", "ℨ"}, - {""}, -#line 439 "HTMLCharacterReference.gperf" - {"Phi;", "Φ"}, -#line 1382 "HTMLCharacterReference.gperf" - {"looparrowright;", "↬"}, -#line 359 "HTMLCharacterReference.gperf" - {"NotGreater;", "≯"}, -#line 59 "HTMLCharacterReference.gperf" - {"Bumpeq;", "≎"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1140 "HTMLCharacterReference.gperf" - {"gla;", "⪥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 449 "HTMLCharacterReference.gperf" - {"Prime;", "″"}, - {""}, -#line 1246 "HTMLCharacterReference.gperf" - {"isindot;", "⋵"}, - {""}, -#line 1137 "HTMLCharacterReference.gperf" - {"gjcy;", "ѓ"}, - {""}, - {""}, - {""}, - {""}, -#line 1358 "HTMLCharacterReference.gperf" - {"ljcy;", "љ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ljcy;", "љ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 970 "HTMLCharacterReference.gperf" + {"div;", "÷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 963 "HTMLCharacterReference.gperf" + {"diam;", "⋄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1598 "HTMLCharacterReference.gperf" + {"nsucceq;", "⪰̸"}, + {""}, + {""}, +#line 1303 "HTMLCharacterReference.gperf" + {"lates;", "⪭︀"}, + {""}, +#line 1293 "HTMLCharacterReference.gperf" + {"larrbfs;", "⤟"}, + {""}, +#line 517 "HTMLCharacterReference.gperf" + {"ShortLeftArrow;", "←"}, +#line 780 "HTMLCharacterReference.gperf" + {"boxDL;", "╗"}, +#line 2195 "HTMLCharacterReference.gperf" + {"weierp;", "℘"}, +#line 1486 "HTMLCharacterReference.gperf" + {"napprox;", "≉"}, +#line 1403 "HTMLCharacterReference.gperf" + {"lsh;", "↰"}, +#line 507 "HTMLCharacterReference.gperf" + {"SHcy;", "Ш"}, + {""}, +#line 338 "HTMLCharacterReference.gperf" + {"Ncaron;", "Ň"}, +#line 207 "HTMLCharacterReference.gperf" + {"GreaterSlantEqual;", "⩾"}, + {""}, +#line 975 "HTMLCharacterReference.gperf" + {"djcy;", "ђ"}, +#line 1400 "HTMLCharacterReference.gperf" + {"lrtri;", "⊿"}, +#line 1227 "HTMLCharacterReference.gperf" + {"incare;", "℅"}, + {""}, +#line 870 "HTMLCharacterReference.gperf" + {"cir;", "○"}, + {""}, #line 969 "HTMLCharacterReference.gperf" - {"div;", "÷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 962 "HTMLCharacterReference.gperf" - {"diam;", "⋄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1597 "HTMLCharacterReference.gperf" - {"nsucceq;", "⪰̸"}, - {""}, - {""}, -#line 1302 "HTMLCharacterReference.gperf" - {"lates;", "⪭︀"}, - {""}, -#line 1292 "HTMLCharacterReference.gperf" - {"larrbfs;", "⤟"}, - {""}, -#line 516 "HTMLCharacterReference.gperf" - {"ShortLeftArrow;", "←"}, -#line 779 "HTMLCharacterReference.gperf" - {"boxDL;", "╗"}, -#line 2194 "HTMLCharacterReference.gperf" - {"weierp;", "℘"}, -#line 1485 "HTMLCharacterReference.gperf" - {"napprox;", "≉"}, -#line 1402 "HTMLCharacterReference.gperf" - {"lsh;", "↰"}, -#line 506 "HTMLCharacterReference.gperf" - {"SHcy;", "Ш"}, - {""}, -#line 337 "HTMLCharacterReference.gperf" - {"Ncaron;", "Ň"}, -#line 206 "HTMLCharacterReference.gperf" - {"GreaterSlantEqual;", "⩾"}, - {""}, -#line 974 "HTMLCharacterReference.gperf" - {"djcy;", "ђ"}, -#line 1399 "HTMLCharacterReference.gperf" - {"lrtri;", "⊿"}, -#line 1226 "HTMLCharacterReference.gperf" - {"incare;", "℅"}, - {""}, -#line 869 "HTMLCharacterReference.gperf" - {"cir;", "○"}, - {""}, -#line 968 "HTMLCharacterReference.gperf" - {"disin;", "⋲"}, - {""}, - {""}, - {""}, - {""}, -#line 1422 "HTMLCharacterReference.gperf" - {"ltrif;", "◂"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1172 "HTMLCharacterReference.gperf" - {"hairsp;", " "}, - {""}, - {""}, - {""}, -#line 1360 "HTMLCharacterReference.gperf" - {"llarr;", "⇇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 953 "HTMLCharacterReference.gperf" - {"ddotseq;", "⩷"}, - {""}, -#line 1081 "HTMLCharacterReference.gperf" - {"flat;", "♭"}, - {""}, - {""}, - {""}, - {""}, -#line 2203 "HTMLCharacterReference.gperf" - {"xcup;", "⋃"}, - {""}, -#line 193 "HTMLCharacterReference.gperf" - {"Gbreve;", "Ğ"}, - {""}, - {""}, - {""}, -#line 1114 "HTMLCharacterReference.gperf" - {"gamma;", "γ"}, - {""}, - {""}, - {""}, - {""}, -#line 999 "HTMLCharacterReference.gperf" - {"dtrif;", "▾"}, -#line 1251 "HTMLCharacterReference.gperf" - {"itilde;", "ĩ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 161 "HTMLCharacterReference.gperf" - {"Egrave", "È"}, + {"disin;", "⋲"}, + {""}, + {""}, + {""}, + {""}, +#line 1423 "HTMLCharacterReference.gperf" + {"ltrif;", "◂"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1173 "HTMLCharacterReference.gperf" + {"hairsp;", " "}, + {""}, + {""}, + {""}, +#line 1361 "HTMLCharacterReference.gperf" + {"llarr;", "⇇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 954 "HTMLCharacterReference.gperf" + {"ddotseq;", "⩷"}, + {""}, +#line 1082 "HTMLCharacterReference.gperf" + {"flat;", "♭"}, + {""}, + {""}, + {""}, + {""}, +#line 2204 "HTMLCharacterReference.gperf" + {"xcup;", "⋃"}, + {""}, +#line 194 "HTMLCharacterReference.gperf" + {"Gbreve;", "Ğ"}, + {""}, + {""}, + {""}, +#line 1115 "HTMLCharacterReference.gperf" + {"gamma;", "γ"}, + {""}, + {""}, + {""}, + {""}, +#line 1000 "HTMLCharacterReference.gperf" + {"dtrif;", "▾"}, +#line 1252 "HTMLCharacterReference.gperf" + {"itilde;", "ĩ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 162 "HTMLCharacterReference.gperf" - {"Egrave;", "È"}, - {""}, - {""}, -#line 629 "HTMLCharacterReference.gperf" - {"Wscr;", "𝒲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2242 "HTMLCharacterReference.gperf" - {"zdot;", "ż"}, - {""}, - {""}, - {""}, - {""}, -#line 1602 "HTMLCharacterReference.gperf" - {"nsupseteq;", "⊉"}, + {"Egrave", "È"}, +#line 163 "HTMLCharacterReference.gperf" + {"Egrave;", "È"}, + {""}, + {""}, +#line 630 "HTMLCharacterReference.gperf" + {"Wscr;", "𝒲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2243 "HTMLCharacterReference.gperf" + {"zdot;", "ż"}, + {""}, + {""}, + {""}, + {""}, #line 1603 "HTMLCharacterReference.gperf" - {"nsupseteqq;", "⫆̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 645 "HTMLCharacterReference.gperf" - {"ZHcy;", "Ж"}, -#line 735 "HTMLCharacterReference.gperf" - {"bcong;", "≌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1212 "HTMLCharacterReference.gperf" - {"ii;", "ⅈ"}, - {""}, - {""}, - {""}, -#line 87 "HTMLCharacterReference.gperf" - {"Conint;", "∯"}, - {""}, -#line 455 "HTMLCharacterReference.gperf" - {"QUOT", "\""}, + {"nsupseteq;", "⊉"}, +#line 1604 "HTMLCharacterReference.gperf" + {"nsupseteqq;", "⫆̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 646 "HTMLCharacterReference.gperf" + {"ZHcy;", "Ж"}, +#line 736 "HTMLCharacterReference.gperf" + {"bcong;", "≌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1213 "HTMLCharacterReference.gperf" + {"ii;", "ⅈ"}, + {""}, + {""}, + {""}, +#line 88 "HTMLCharacterReference.gperf" + {"Conint;", "∯"}, + {""}, #line 456 "HTMLCharacterReference.gperf" - {"QUOT;", "\""}, -#line 1118 "HTMLCharacterReference.gperf" - {"gcirc;", "ĝ"}, - {""}, - {""}, - {""}, - {""}, -#line 2183 "HTMLCharacterReference.gperf" - {"vrtri;", "⊳"}, - {""}, - {""}, - {""}, -#line 1012 "HTMLCharacterReference.gperf" - {"ecirc", "ê"}, + {"QUOT", "\""}, +#line 457 "HTMLCharacterReference.gperf" + {"QUOT;", "\""}, +#line 1119 "HTMLCharacterReference.gperf" + {"gcirc;", "ĝ"}, + {""}, + {""}, + {""}, + {""}, +#line 2184 "HTMLCharacterReference.gperf" + {"vrtri;", "⊳"}, + {""}, + {""}, + {""}, #line 1013 "HTMLCharacterReference.gperf" - {"ecirc;", "ê"}, - {""}, - {""}, - {""}, - {""}, -#line 854 "HTMLCharacterReference.gperf" - {"ccirc;", "ĉ"}, - {""}, - {""}, - {""}, -#line 661 "HTMLCharacterReference.gperf" - {"acirc", "â"}, + {"ecirc", "ê"}, +#line 1014 "HTMLCharacterReference.gperf" + {"ecirc;", "ê"}, + {""}, + {""}, + {""}, + {""}, +#line 855 "HTMLCharacterReference.gperf" + {"ccirc;", "ĉ"}, + {""}, + {""}, + {""}, #line 662 "HTMLCharacterReference.gperf" - {"acirc;", "â"}, -#line 598 "HTMLCharacterReference.gperf" - {"Updownarrow;", "⇕"}, - {""}, - {""}, - {""}, -#line 1255 "HTMLCharacterReference.gperf" - {"jcirc;", "ĵ"}, -#line 892 "HTMLCharacterReference.gperf" - {"compfn;", "∘"}, - {""}, - {""}, -#line 574 "HTMLCharacterReference.gperf" - {"Ucirc", "Û"}, -#line 575 "HTMLCharacterReference.gperf" - {"Ucirc;", "Û"}, - {""}, - {""}, - {""}, -#line 566 "HTMLCharacterReference.gperf" - {"Tscr;", "𝒯"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 788 "HTMLCharacterReference.gperf" - {"boxUL;", "╝"}, -#line 374 "HTMLCharacterReference.gperf" - {"NotLessLess;", "≪̸"}, - {""}, -#line 445 "HTMLCharacterReference.gperf" - {"Precedes;", "≺"}, + {"acirc", "â"}, +#line 663 "HTMLCharacterReference.gperf" + {"acirc;", "â"}, #line 599 "HTMLCharacterReference.gperf" - {"UpperLeftArrow;", "↖"}, - {""}, -#line 706 "HTMLCharacterReference.gperf" - {"apacir;", "⩯"}, - {""}, - {""}, -#line 709 "HTMLCharacterReference.gperf" - {"apos;", "'"}, -#line 1180 "HTMLCharacterReference.gperf" - {"hcirc;", "ĥ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1228 "HTMLCharacterReference.gperf" - {"infintie;", "⧝"}, -#line 453 "HTMLCharacterReference.gperf" - {"Pscr;", "𝒫"}, - {""}, -#line 2175 "HTMLCharacterReference.gperf" - {"verbar;", "|"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2249 "HTMLCharacterReference.gperf" - {"zscr;", "𝓏"}, - {""}, -#line 585 "HTMLCharacterReference.gperf" - {"UnderParenthesis;", "⏝"}, - {""}, + {"Updownarrow;", "⇕"}, + {""}, + {""}, + {""}, +#line 1256 "HTMLCharacterReference.gperf" + {"jcirc;", "ĵ"}, +#line 893 "HTMLCharacterReference.gperf" + {"compfn;", "∘"}, + {""}, + {""}, +#line 575 "HTMLCharacterReference.gperf" + {"Ucirc", "Û"}, +#line 576 "HTMLCharacterReference.gperf" + {"Ucirc;", "Û"}, + {""}, + {""}, + {""}, +#line 567 "HTMLCharacterReference.gperf" + {"Tscr;", "𝒯"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 789 "HTMLCharacterReference.gperf" + {"boxUL;", "╝"}, +#line 375 "HTMLCharacterReference.gperf" + {"NotLessLess;", "≪̸"}, + {""}, +#line 446 "HTMLCharacterReference.gperf" + {"Precedes;", "≺"}, +#line 600 "HTMLCharacterReference.gperf" + {"UpperLeftArrow;", "↖"}, + {""}, +#line 707 "HTMLCharacterReference.gperf" + {"apacir;", "⩯"}, + {""}, + {""}, +#line 710 "HTMLCharacterReference.gperf" + {"apos;", "'"}, +#line 1181 "HTMLCharacterReference.gperf" + {"hcirc;", "ĥ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1229 "HTMLCharacterReference.gperf" + {"infintie;", "⧝"}, +#line 454 "HTMLCharacterReference.gperf" + {"Pscr;", "𝒫"}, + {""}, +#line 2176 "HTMLCharacterReference.gperf" + {"verbar;", "|"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2250 "HTMLCharacterReference.gperf" + {"zscr;", "𝓏"}, + {""}, +#line 586 "HTMLCharacterReference.gperf" + {"UnderParenthesis;", "⏝"}, + {""}, +#line 967 "HTMLCharacterReference.gperf" + {"die;", "¨"}, +#line 872 "HTMLCharacterReference.gperf" + {"circ;", "ˆ"}, + {""}, + {""}, +#line 311 "HTMLCharacterReference.gperf" + {"Ll;", "⋘"}, + {""}, + {""}, #line 966 "HTMLCharacterReference.gperf" - {"die;", "¨"}, -#line 871 "HTMLCharacterReference.gperf" - {"circ;", "ˆ"}, - {""}, - {""}, -#line 310 "HTMLCharacterReference.gperf" - {"Ll;", "⋘"}, - {""}, - {""}, -#line 965 "HTMLCharacterReference.gperf" - {"diams;", "♦"}, -#line 799 "HTMLCharacterReference.gperf" - {"boxbox;", "⧉"}, - {""}, - {""}, -#line 1315 "HTMLCharacterReference.gperf" - {"ldca;", "⤶"}, -#line 767 "HTMLCharacterReference.gperf" - {"blank;", "␣"}, - {""}, - {""}, - {""}, - {""}, -#line 1396 "HTMLCharacterReference.gperf" - {"lrhar;", "⇋"}, - {""}, - {""}, - {""}, -#line 895 "HTMLCharacterReference.gperf" - {"cong;", "≅"}, -#line 1483 "HTMLCharacterReference.gperf" - {"napid;", "≋̸"}, - {""}, - {""}, - {""}, -#line 1322 "HTMLCharacterReference.gperf" - {"leftarrow;", "←"}, - {""}, -#line 1164 "HTMLCharacterReference.gperf" - {"gtrdot;", "⋗"}, - {""}, - {""}, - {""}, -#line 2190 "HTMLCharacterReference.gperf" - {"wcirc;", "ŵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 923 "HTMLCharacterReference.gperf" - {"cups;", "∪︀"}, -#line 803 "HTMLCharacterReference.gperf" - {"boxdr;", "┌"}, -#line 921 "HTMLCharacterReference.gperf" - {"cupdot;", "⊍"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 27 "HTMLCharacterReference.gperf" - {"Abreve;", "Ă"}, - {""}, - {""}, -#line 280 "HTMLCharacterReference.gperf" - {"LeftArrowRightArrow;", "⇆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1282 "HTMLCharacterReference.gperf" - {"lagran;", "ℒ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 990 "HTMLCharacterReference.gperf" - {"drbkarow;", "⤐"}, - {""}, - {""}, - {""}, -#line 525 "HTMLCharacterReference.gperf" - {"SquareSubset;", "⊏"}, - {""}, -#line 623 "HTMLCharacterReference.gperf" - {"Vscr;", "𝒱"}, -#line 771 "HTMLCharacterReference.gperf" - {"block;", "█"}, - {""}, - {""}, -#line 323 "HTMLCharacterReference.gperf" - {"Lsh;", "↰"}, - {""}, - {""}, -#line 185 "HTMLCharacterReference.gperf" - {"ForAll;", "∀"}, - {""}, - {""}, - {""}, - {""}, -#line 844 "HTMLCharacterReference.gperf" - {"capcap;", "⩋"}, - {""}, - {""}, - {""}, -#line 32 "HTMLCharacterReference.gperf" - {"Agrave", "À"}, + {"diams;", "♦"}, +#line 800 "HTMLCharacterReference.gperf" + {"boxbox;", "⧉"}, + {""}, + {""}, +#line 1316 "HTMLCharacterReference.gperf" + {"ldca;", "⤶"}, +#line 768 "HTMLCharacterReference.gperf" + {"blank;", "␣"}, + {""}, + {""}, + {""}, + {""}, +#line 1397 "HTMLCharacterReference.gperf" + {"lrhar;", "⇋"}, + {""}, + {""}, + {""}, +#line 896 "HTMLCharacterReference.gperf" + {"cong;", "≅"}, +#line 1484 "HTMLCharacterReference.gperf" + {"napid;", "≋̸"}, + {""}, + {""}, + {""}, +#line 1323 "HTMLCharacterReference.gperf" + {"leftarrow;", "←"}, + {""}, +#line 1165 "HTMLCharacterReference.gperf" + {"gtrdot;", "⋗"}, + {""}, + {""}, + {""}, +#line 2191 "HTMLCharacterReference.gperf" + {"wcirc;", "ŵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 924 "HTMLCharacterReference.gperf" + {"cups;", "∪︀"}, +#line 804 "HTMLCharacterReference.gperf" + {"boxdr;", "┌"}, +#line 922 "HTMLCharacterReference.gperf" + {"cupdot;", "⊍"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 28 "HTMLCharacterReference.gperf" + {"Abreve;", "Ă"}, + {""}, + {""}, +#line 281 "HTMLCharacterReference.gperf" + {"LeftArrowRightArrow;", "⇆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1283 "HTMLCharacterReference.gperf" + {"lagran;", "ℒ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 991 "HTMLCharacterReference.gperf" + {"drbkarow;", "⤐"}, + {""}, + {""}, + {""}, +#line 526 "HTMLCharacterReference.gperf" + {"SquareSubset;", "⊏"}, + {""}, +#line 624 "HTMLCharacterReference.gperf" + {"Vscr;", "𝒱"}, +#line 772 "HTMLCharacterReference.gperf" + {"block;", "█"}, + {""}, + {""}, +#line 324 "HTMLCharacterReference.gperf" + {"Lsh;", "↰"}, + {""}, + {""}, +#line 186 "HTMLCharacterReference.gperf" + {"ForAll;", "∀"}, + {""}, + {""}, + {""}, + {""}, +#line 845 "HTMLCharacterReference.gperf" + {"capcap;", "⩋"}, + {""}, + {""}, + {""}, #line 33 "HTMLCharacterReference.gperf" - {"Agrave;", "À"}, - {""}, - {""}, - {""}, -#line 1001 "HTMLCharacterReference.gperf" - {"duhar;", "⥯"}, -#line 1619 "HTMLCharacterReference.gperf" - {"nvdash;", "⊬"}, - {""}, - {""}, - {""}, -#line 786 "HTMLCharacterReference.gperf" - {"boxHd;", "╤"}, -#line 1115 "HTMLCharacterReference.gperf" - {"gammad;", "ϝ"}, - {""}, -#line 377 "HTMLCharacterReference.gperf" - {"NotNestedGreaterGreater;", "⪢̸"}, - {""}, - {""}, -#line 552 "HTMLCharacterReference.gperf" - {"Tcaron;", "Ť"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1353 "HTMLCharacterReference.gperf" - {"lgE;", "⪑"}, -#line 54 "HTMLCharacterReference.gperf" - {"Beta;", "Β"}, -#line 213 "HTMLCharacterReference.gperf" - {"Hcirc;", "Ĥ"}, - {""}, + {"Agrave", "À"}, +#line 34 "HTMLCharacterReference.gperf" + {"Agrave;", "À"}, + {""}, + {""}, + {""}, +#line 1002 "HTMLCharacterReference.gperf" + {"duhar;", "⥯"}, +#line 1620 "HTMLCharacterReference.gperf" + {"nvdash;", "⊬"}, + {""}, + {""}, + {""}, +#line 787 "HTMLCharacterReference.gperf" + {"boxHd;", "╤"}, +#line 1116 "HTMLCharacterReference.gperf" + {"gammad;", "ϝ"}, + {""}, #line 378 "HTMLCharacterReference.gperf" - {"NotNestedLessLess;", "⪡̸"}, -#line 551 "HTMLCharacterReference.gperf" - {"Tau;", "Τ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 802 "HTMLCharacterReference.gperf" - {"boxdl;", "┐"}, -#line 2172 "HTMLCharacterReference.gperf" - {"veebar;", "⊻"}, -#line 526 "HTMLCharacterReference.gperf" - {"SquareSubsetEqual;", "⊑"}, - {""}, -#line 1202 "HTMLCharacterReference.gperf" - {"icirc", "î"}, -#line 1203 "HTMLCharacterReference.gperf" - {"icirc;", "î"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 529 "HTMLCharacterReference.gperf" - {"SquareUnion;", "⊔"}, - {""}, -#line 1144 "HTMLCharacterReference.gperf" - {"gnapprox;", "⪊"}, -#line 1579 "HTMLCharacterReference.gperf" - {"nsce;", "⪰̸"}, - {""}, - {""}, - {""}, -#line 1369 "HTMLCharacterReference.gperf" - {"lnapprox;", "⪉"}, - {""}, - {""}, -#line 2240 "HTMLCharacterReference.gperf" - {"zcaron;", "ž"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1766 "HTMLCharacterReference.gperf" - {"qint;", "⨌"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 639 "HTMLCharacterReference.gperf" - {"Ycirc;", "Ŷ"}, - {""}, - {""}, - {""}, -#line 2235 "HTMLCharacterReference.gperf" - {"yscr;", "𝓎"}, -#line 1355 "HTMLCharacterReference.gperf" - {"lharu;", "↼"}, - {""}, - {""}, - {""}, - {""}, -#line 700 "HTMLCharacterReference.gperf" - {"angst;", "Å"}, -#line 1229 "HTMLCharacterReference.gperf" - {"inodot;", "ı"}, - {""}, - {""}, + {"NotNestedGreaterGreater;", "⪢̸"}, + {""}, + {""}, +#line 553 "HTMLCharacterReference.gperf" + {"Tcaron;", "Ť"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1354 "HTMLCharacterReference.gperf" + {"lgE;", "⪑"}, +#line 55 "HTMLCharacterReference.gperf" + {"Beta;", "Β"}, +#line 214 "HTMLCharacterReference.gperf" + {"Hcirc;", "Ĥ"}, + {""}, +#line 379 "HTMLCharacterReference.gperf" + {"NotNestedLessLess;", "⪡̸"}, +#line 552 "HTMLCharacterReference.gperf" + {"Tau;", "Τ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 803 "HTMLCharacterReference.gperf" + {"boxdl;", "┐"}, +#line 2173 "HTMLCharacterReference.gperf" + {"veebar;", "⊻"}, #line 527 "HTMLCharacterReference.gperf" - {"SquareSuperset;", "⊐"}, -#line 904 "HTMLCharacterReference.gperf" - {"cross;", "✗"}, - {""}, - {""}, - {""}, -#line 528 "HTMLCharacterReference.gperf" - {"SquareSupersetEqual;", "⊒"}, -#line 1083 "HTMLCharacterReference.gperf" - {"fltns;", "▱"}, - {""}, -#line 631 "HTMLCharacterReference.gperf" - {"Xi;", "Ξ"}, -#line 571 "HTMLCharacterReference.gperf" - {"Uarrocir;", "⥉"}, - {""}, -#line 801 "HTMLCharacterReference.gperf" - {"boxdR;", "╒"}, + {"SquareSubsetEqual;", "⊑"}, + {""}, +#line 1203 "HTMLCharacterReference.gperf" + {"icirc", "î"}, +#line 1204 "HTMLCharacterReference.gperf" + {"icirc;", "î"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 530 "HTMLCharacterReference.gperf" + {"SquareUnion;", "⊔"}, + {""}, +#line 1145 "HTMLCharacterReference.gperf" + {"gnapprox;", "⪊"}, +#line 1580 "HTMLCharacterReference.gperf" + {"nsce;", "⪰̸"}, + {""}, + {""}, + {""}, +#line 1370 "HTMLCharacterReference.gperf" + {"lnapprox;", "⪉"}, + {""}, + {""}, +#line 2241 "HTMLCharacterReference.gperf" + {"zcaron;", "ž"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1767 "HTMLCharacterReference.gperf" + {"qint;", "⨌"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 640 "HTMLCharacterReference.gperf" + {"Ycirc;", "Ŷ"}, + {""}, + {""}, + {""}, +#line 2236 "HTMLCharacterReference.gperf" + {"yscr;", "𝓎"}, #line 1356 "HTMLCharacterReference.gperf" - {"lharul;", "⥪"}, - {""}, -#line 843 "HTMLCharacterReference.gperf" - {"capbrcup;", "⩉"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 40 "HTMLCharacterReference.gperf" - {"Aring", "Å"}, + {"lharu;", "↼"}, + {""}, + {""}, + {""}, + {""}, +#line 701 "HTMLCharacterReference.gperf" + {"angst;", "Å"}, +#line 1230 "HTMLCharacterReference.gperf" + {"inodot;", "ı"}, + {""}, + {""}, +#line 528 "HTMLCharacterReference.gperf" + {"SquareSuperset;", "⊐"}, +#line 905 "HTMLCharacterReference.gperf" + {"cross;", "✗"}, + {""}, + {""}, + {""}, +#line 529 "HTMLCharacterReference.gperf" + {"SquareSupersetEqual;", "⊒"}, +#line 1084 "HTMLCharacterReference.gperf" + {"fltns;", "▱"}, + {""}, +#line 632 "HTMLCharacterReference.gperf" + {"Xi;", "Ξ"}, +#line 572 "HTMLCharacterReference.gperf" + {"Uarrocir;", "⥉"}, + {""}, +#line 802 "HTMLCharacterReference.gperf" + {"boxdR;", "╒"}, +#line 1357 "HTMLCharacterReference.gperf" + {"lharul;", "⥪"}, + {""}, +#line 844 "HTMLCharacterReference.gperf" + {"capbrcup;", "⩉"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 41 "HTMLCharacterReference.gperf" - {"Aring;", "Å"}, - {""}, - {""}, - {""}, - {""}, -#line 1108 "HTMLCharacterReference.gperf" - {"frasl;", "⁄"}, - {""}, - {""}, - {""}, - {""}, -#line 1316 "HTMLCharacterReference.gperf" - {"ldquo;", "“"}, + {"Aring", "Å"}, +#line 42 "HTMLCharacterReference.gperf" + {"Aring;", "Å"}, + {""}, + {""}, + {""}, + {""}, +#line 1109 "HTMLCharacterReference.gperf" + {"frasl;", "⁄"}, + {""}, + {""}, + {""}, + {""}, #line 1317 "HTMLCharacterReference.gperf" - {"ldquor;", "„"}, -#line 1569 "HTMLCharacterReference.gperf" - {"npreceq;", "⪯̸"}, - {""}, -#line 1341 "HTMLCharacterReference.gperf" - {"lesg;", "⋚︀"}, -#line 828 "HTMLCharacterReference.gperf" - {"bsemi;", "⁏"}, -#line 1634 "HTMLCharacterReference.gperf" - {"nwnear;", "⤧"}, -#line 717 "HTMLCharacterReference.gperf" - {"asympeq;", "≍"}, - {""}, - {""}, -#line 818 "HTMLCharacterReference.gperf" - {"boxvL;", "╡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1385 "HTMLCharacterReference.gperf" - {"loplus;", "⨭"}, - {""}, - {""}, -#line 681 "HTMLCharacterReference.gperf" - {"andd;", "⩜"}, - {""}, -#line 247 "HTMLCharacterReference.gperf" - {"Itilde;", "Ĩ"}, - {""}, - {""}, - {""}, - {""}, -#line 205 "HTMLCharacterReference.gperf" - {"GreaterLess;", "≷"}, - {""}, - {""}, -#line 984 "HTMLCharacterReference.gperf" - {"dotsquare;", "⊡"}, - {""}, -#line 920 "HTMLCharacterReference.gperf" - {"cupcup;", "⩊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1605 "HTMLCharacterReference.gperf" - {"ntilde", "ñ"}, + {"ldquo;", "“"}, +#line 1318 "HTMLCharacterReference.gperf" + {"ldquor;", "„"}, +#line 1570 "HTMLCharacterReference.gperf" + {"npreceq;", "⪯̸"}, + {""}, +#line 1342 "HTMLCharacterReference.gperf" + {"lesg;", "⋚︀"}, +#line 829 "HTMLCharacterReference.gperf" + {"bsemi;", "⁏"}, +#line 1635 "HTMLCharacterReference.gperf" + {"nwnear;", "⤧"}, +#line 718 "HTMLCharacterReference.gperf" + {"asympeq;", "≍"}, + {""}, + {""}, +#line 819 "HTMLCharacterReference.gperf" + {"boxvL;", "╡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1386 "HTMLCharacterReference.gperf" + {"loplus;", "⨭"}, + {""}, + {""}, +#line 682 "HTMLCharacterReference.gperf" + {"andd;", "⩜"}, + {""}, +#line 248 "HTMLCharacterReference.gperf" + {"Itilde;", "Ĩ"}, + {""}, + {""}, + {""}, + {""}, +#line 206 "HTMLCharacterReference.gperf" + {"GreaterLess;", "≷"}, + {""}, + {""}, +#line 985 "HTMLCharacterReference.gperf" + {"dotsquare;", "⊡"}, + {""}, +#line 921 "HTMLCharacterReference.gperf" + {"cupcup;", "⩊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1606 "HTMLCharacterReference.gperf" - {"ntilde;", "ñ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1593 "HTMLCharacterReference.gperf" - {"nsubset;", "⊂⃒"}, - {""}, - {""}, - {""}, -#line 1397 "HTMLCharacterReference.gperf" - {"lrhard;", "⥭"}, - {""}, -#line 1232 "HTMLCharacterReference.gperf" - {"integers;", "ℤ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 557 "HTMLCharacterReference.gperf" - {"Theta;", "Θ"}, - {""}, - {""}, -#line 1267 "HTMLCharacterReference.gperf" - {"kfr;", "𝔨"}, - {""}, - {""}, - {""}, -#line 388 "HTMLCharacterReference.gperf" - {"NotSquareSuperset;", "⊐̸"}, - {""}, - {""}, - {""}, - {""}, + {"ntilde", "ñ"}, +#line 1607 "HTMLCharacterReference.gperf" + {"ntilde;", "ñ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1594 "HTMLCharacterReference.gperf" + {"nsubset;", "⊂⃒"}, + {""}, + {""}, + {""}, +#line 1398 "HTMLCharacterReference.gperf" + {"lrhard;", "⥭"}, + {""}, +#line 1233 "HTMLCharacterReference.gperf" + {"integers;", "ℤ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 558 "HTMLCharacterReference.gperf" + {"Theta;", "Θ"}, + {""}, + {""}, +#line 1268 "HTMLCharacterReference.gperf" + {"kfr;", "𝔨"}, + {""}, + {""}, + {""}, #line 389 "HTMLCharacterReference.gperf" - {"NotSquareSupersetEqual;", "⋣"}, - {""}, -#line 1288 "HTMLCharacterReference.gperf" - {"laquo", "«"}, + {"NotSquareSuperset;", "⊐̸"}, + {""}, + {""}, + {""}, + {""}, +#line 390 "HTMLCharacterReference.gperf" + {"NotSquareSupersetEqual;", "⋣"}, + {""}, #line 1289 "HTMLCharacterReference.gperf" - {"laquo;", "«"}, -#line 872 "HTMLCharacterReference.gperf" - {"circeq;", "≗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1525 "HTMLCharacterReference.gperf" - {"ni;", "∋"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"laquo", "«"}, +#line 1290 "HTMLCharacterReference.gperf" + {"laquo;", "«"}, +#line 873 "HTMLCharacterReference.gperf" + {"circeq;", "≗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1526 "HTMLCharacterReference.gperf" - {"nis;", "⋼"}, -#line 301 "HTMLCharacterReference.gperf" - {"Leftarrow;", "⇐"}, - {""}, - {""}, - {""}, -#line 982 "HTMLCharacterReference.gperf" - {"dotminus;", "∸"}, -#line 1462 "HTMLCharacterReference.gperf" - {"mscr;", "𝓂"}, - {""}, - {""}, - {""}, -#line 1433 "HTMLCharacterReference.gperf" - {"map;", "↦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1326 "HTMLCharacterReference.gperf" - {"leftleftarrows;", "⇇"}, - {""}, -#line 1400 "HTMLCharacterReference.gperf" - {"lsaquo;", "‹"}, - {""}, -#line 1528 "HTMLCharacterReference.gperf" - {"niv;", "∋"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 265 "HTMLCharacterReference.gperf" - {"Kscr;", "𝒦"}, - {""}, - {""}, - {""}, - {""}, -#line 363 "HTMLCharacterReference.gperf" - {"NotGreaterLess;", "≹"}, - {""}, -#line 120 "HTMLCharacterReference.gperf" - {"DoubleContourIntegral;", "∯"}, - {""}, -#line 76 "HTMLCharacterReference.gperf" - {"Chi;", "Χ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 515 "HTMLCharacterReference.gperf" - {"ShortDownArrow;", "↓"}, -#line 737 "HTMLCharacterReference.gperf" - {"bdquo;", "„"}, - {""}, - {""}, -#line 809 "HTMLCharacterReference.gperf" - {"boxminus;", "⊟"}, -#line 549 "HTMLCharacterReference.gperf" - {"TScy;", "Ц"}, -#line 1542 "HTMLCharacterReference.gperf" - {"nlsim;", "≴"}, - {""}, -#line 132 "HTMLCharacterReference.gperf" - {"DoubleUpDownArrow;", "⇕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ni;", "∋"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1527 "HTMLCharacterReference.gperf" + {"nis;", "⋼"}, +#line 302 "HTMLCharacterReference.gperf" + {"Leftarrow;", "⇐"}, + {""}, + {""}, + {""}, +#line 983 "HTMLCharacterReference.gperf" + {"dotminus;", "∸"}, +#line 1463 "HTMLCharacterReference.gperf" + {"mscr;", "𝓂"}, + {""}, + {""}, + {""}, +#line 1434 "HTMLCharacterReference.gperf" + {"map;", "↦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1327 "HTMLCharacterReference.gperf" + {"leftleftarrows;", "⇇"}, + {""}, +#line 1401 "HTMLCharacterReference.gperf" + {"lsaquo;", "‹"}, + {""}, #line 1529 "HTMLCharacterReference.gperf" - {"njcy;", "њ"}, -#line 1496 "HTMLCharacterReference.gperf" - {"ncong;", "≇"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2191 "HTMLCharacterReference.gperf" - {"wedbar;", "⩟"}, - {""}, - {""}, -#line 2246 "HTMLCharacterReference.gperf" - {"zhcy;", "ж"}, -#line 57 "HTMLCharacterReference.gperf" - {"Breve;", "˘"}, - {""}, -#line 1111 "HTMLCharacterReference.gperf" - {"gE;", "≧"}, + {"niv;", "∋"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 266 "HTMLCharacterReference.gperf" + {"Kscr;", "𝒦"}, + {""}, + {""}, + {""}, + {""}, +#line 364 "HTMLCharacterReference.gperf" + {"NotGreaterLess;", "≹"}, + {""}, +#line 121 "HTMLCharacterReference.gperf" + {"DoubleContourIntegral;", "∯"}, + {""}, +#line 77 "HTMLCharacterReference.gperf" + {"Chi;", "Χ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 516 "HTMLCharacterReference.gperf" + {"ShortDownArrow;", "↓"}, +#line 738 "HTMLCharacterReference.gperf" + {"bdquo;", "„"}, + {""}, + {""}, +#line 810 "HTMLCharacterReference.gperf" + {"boxminus;", "⊟"}, +#line 550 "HTMLCharacterReference.gperf" + {"TScy;", "Ц"}, #line 1543 "HTMLCharacterReference.gperf" - {"nlt;", "≮"}, -#line 2040 "HTMLCharacterReference.gperf" - {"tbrk;", "⎴"}, - {""}, -#line 730 "HTMLCharacterReference.gperf" - {"barvee;", "⊽"}, -#line 1277 "HTMLCharacterReference.gperf" - {"lE;", "≦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1119 "HTMLCharacterReference.gperf" - {"gcy;", "г"}, - {""}, -#line 251 "HTMLCharacterReference.gperf" - {"Jcirc;", "Ĵ"}, - {""}, - {""}, -#line 1314 "HTMLCharacterReference.gperf" - {"lcy;", "л"}, - {""}, - {""}, - {""}, - {""}, -#line 1015 "HTMLCharacterReference.gperf" - {"ecy;", "э"}, - {""}, - {""}, - {""}, -#line 597 "HTMLCharacterReference.gperf" - {"Uparrow;", "⇑"}, - {""}, -#line 932 "HTMLCharacterReference.gperf" - {"curvearrowleft;", "↶"}, -#line 1575 "HTMLCharacterReference.gperf" - {"nrtri;", "⋫"}, - {""}, - {""}, -#line 665 "HTMLCharacterReference.gperf" - {"acy;", "а"}, - {""}, - {""}, - {""}, - {""}, -#line 1256 "HTMLCharacterReference.gperf" - {"jcy;", "й"}, -#line 2236 "HTMLCharacterReference.gperf" - {"yucy;", "ю"}, - {""}, -#line 1128 "HTMLCharacterReference.gperf" - {"gesdot;", "⪀"}, - {""}, -#line 576 "HTMLCharacterReference.gperf" - {"Ucy;", "У"}, - {""}, -#line 1057 "HTMLCharacterReference.gperf" - {"erDot;", "≓"}, -#line 1338 "HTMLCharacterReference.gperf" - {"lesdot;", "⩿"}, - {""}, - {""}, - {""}, -#line 1532 "HTMLCharacterReference.gperf" - {"nlarr;", "↚"}, - {""}, - {""}, -#line 2067 "HTMLCharacterReference.gperf" - {"top;", "⊤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1178 "HTMLCharacterReference.gperf" - {"harrw;", "↭"}, - {""}, -#line 2208 "HTMLCharacterReference.gperf" - {"xi;", "ξ"}, -#line 949 "HTMLCharacterReference.gperf" - {"dcy;", "д"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 583 "HTMLCharacterReference.gperf" - {"UnderBrace;", "⏟"}, -#line 1627 "HTMLCharacterReference.gperf" - {"nvrArr;", "⤃"}, + {"nlsim;", "≴"}, + {""}, +#line 133 "HTMLCharacterReference.gperf" + {"DoubleUpDownArrow;", "⇕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1530 "HTMLCharacterReference.gperf" + {"njcy;", "њ"}, +#line 1497 "HTMLCharacterReference.gperf" + {"ncong;", "≇"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2192 "HTMLCharacterReference.gperf" + {"wedbar;", "⩟"}, + {""}, + {""}, +#line 2247 "HTMLCharacterReference.gperf" + {"zhcy;", "ж"}, +#line 58 "HTMLCharacterReference.gperf" + {"Breve;", "˘"}, + {""}, +#line 1112 "HTMLCharacterReference.gperf" + {"gE;", "≧"}, +#line 1544 "HTMLCharacterReference.gperf" + {"nlt;", "≮"}, +#line 2041 "HTMLCharacterReference.gperf" + {"tbrk;", "⎴"}, + {""}, +#line 731 "HTMLCharacterReference.gperf" + {"barvee;", "⊽"}, +#line 1278 "HTMLCharacterReference.gperf" + {"lE;", "≦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1120 "HTMLCharacterReference.gperf" + {"gcy;", "г"}, + {""}, +#line 252 "HTMLCharacterReference.gperf" + {"Jcirc;", "Ĵ"}, + {""}, + {""}, +#line 1315 "HTMLCharacterReference.gperf" + {"lcy;", "л"}, + {""}, + {""}, + {""}, + {""}, +#line 1016 "HTMLCharacterReference.gperf" + {"ecy;", "э"}, + {""}, + {""}, + {""}, +#line 598 "HTMLCharacterReference.gperf" + {"Uparrow;", "⇑"}, + {""}, +#line 933 "HTMLCharacterReference.gperf" + {"curvearrowleft;", "↶"}, +#line 1576 "HTMLCharacterReference.gperf" + {"nrtri;", "⋫"}, + {""}, + {""}, +#line 666 "HTMLCharacterReference.gperf" + {"acy;", "а"}, + {""}, + {""}, + {""}, + {""}, +#line 1257 "HTMLCharacterReference.gperf" + {"jcy;", "й"}, +#line 2237 "HTMLCharacterReference.gperf" + {"yucy;", "ю"}, + {""}, +#line 1129 "HTMLCharacterReference.gperf" + {"gesdot;", "⪀"}, + {""}, +#line 577 "HTMLCharacterReference.gperf" + {"Ucy;", "У"}, + {""}, +#line 1058 "HTMLCharacterReference.gperf" + {"erDot;", "≓"}, +#line 1339 "HTMLCharacterReference.gperf" + {"lesdot;", "⩿"}, + {""}, + {""}, + {""}, +#line 1533 "HTMLCharacterReference.gperf" + {"nlarr;", "↚"}, + {""}, + {""}, +#line 2068 "HTMLCharacterReference.gperf" + {"top;", "⊤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1179 "HTMLCharacterReference.gperf" + {"harrw;", "↭"}, + {""}, +#line 2209 "HTMLCharacterReference.gperf" + {"xi;", "ξ"}, +#line 950 "HTMLCharacterReference.gperf" + {"dcy;", "д"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 584 "HTMLCharacterReference.gperf" - {"UnderBracket;", "⎵"}, -#line 1340 "HTMLCharacterReference.gperf" - {"lesdotor;", "⪃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 512 "HTMLCharacterReference.gperf" - {"Scirc;", "Ŝ"}, -#line 1342 "HTMLCharacterReference.gperf" - {"lesges;", "⪓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 751 "HTMLCharacterReference.gperf" - {"bigoplus;", "⨁"}, - {""}, - {""}, -#line 1477 "HTMLCharacterReference.gperf" - {"nVdash;", "⊮"}, -#line 1771 "HTMLCharacterReference.gperf" - {"quatint;", "⨖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1594 "HTMLCharacterReference.gperf" - {"nsubseteq;", "⊈"}, + {"UnderBrace;", "⏟"}, +#line 1628 "HTMLCharacterReference.gperf" + {"nvrArr;", "⤃"}, +#line 585 "HTMLCharacterReference.gperf" + {"UnderBracket;", "⎵"}, +#line 1341 "HTMLCharacterReference.gperf" + {"lesdotor;", "⪃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 513 "HTMLCharacterReference.gperf" + {"Scirc;", "Ŝ"}, +#line 1343 "HTMLCharacterReference.gperf" + {"lesges;", "⪓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 752 "HTMLCharacterReference.gperf" + {"bigoplus;", "⨁"}, + {""}, + {""}, +#line 1478 "HTMLCharacterReference.gperf" + {"nVdash;", "⊮"}, +#line 1772 "HTMLCharacterReference.gperf" + {"quatint;", "⨖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1595 "HTMLCharacterReference.gperf" - {"nsubseteqq;", "⫅̸"}, - {""}, - {""}, - {""}, -#line 72 "HTMLCharacterReference.gperf" - {"Cdot;", "Ċ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 914 "HTMLCharacterReference.gperf" - {"cuesc;", "⋟"}, - {""}, - {""}, -#line 1073 "HTMLCharacterReference.gperf" - {"fcy;", "ф"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 762 "HTMLCharacterReference.gperf" - {"blacksquare;", "▪"}, - {""}, - {""}, -#line 227 "HTMLCharacterReference.gperf" - {"Icirc", "Î"}, + {"nsubseteq;", "⊈"}, +#line 1596 "HTMLCharacterReference.gperf" + {"nsubseteqq;", "⫅̸"}, + {""}, + {""}, + {""}, +#line 73 "HTMLCharacterReference.gperf" + {"Cdot;", "Ċ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 915 "HTMLCharacterReference.gperf" + {"cuesc;", "⋟"}, + {""}, + {""}, +#line 1074 "HTMLCharacterReference.gperf" + {"fcy;", "ф"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 763 "HTMLCharacterReference.gperf" + {"blacksquare;", "▪"}, + {""}, + {""}, #line 228 "HTMLCharacterReference.gperf" - {"Icirc;", "Î"}, - {""}, - {""}, -#line 811 "HTMLCharacterReference.gperf" - {"boxtimes;", "⊠"}, - {""}, -#line 794 "HTMLCharacterReference.gperf" - {"boxVL;", "╣"}, - {""}, - {""}, -#line 2169 "HTMLCharacterReference.gperf" - {"vcy;", "в"}, -#line 2057 "HTMLCharacterReference.gperf" - {"thorn", "þ"}, + {"Icirc", "Î"}, +#line 229 "HTMLCharacterReference.gperf" + {"Icirc;", "Î"}, + {""}, + {""}, +#line 812 "HTMLCharacterReference.gperf" + {"boxtimes;", "⊠"}, + {""}, +#line 795 "HTMLCharacterReference.gperf" + {"boxVL;", "╣"}, + {""}, + {""}, +#line 2170 "HTMLCharacterReference.gperf" + {"vcy;", "в"}, #line 2058 "HTMLCharacterReference.gperf" - {"thorn;", "þ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 503 "HTMLCharacterReference.gperf" - {"Rsh;", "↱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 376 "HTMLCharacterReference.gperf" - {"NotLessTilde;", "≴"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 736 "HTMLCharacterReference.gperf" - {"bcy;", "б"}, - {""}, -#line 404 "HTMLCharacterReference.gperf" - {"Ntilde", "Ñ"}, + {"thorn", "þ"}, +#line 2059 "HTMLCharacterReference.gperf" + {"thorn;", "þ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 504 "HTMLCharacterReference.gperf" + {"Rsh;", "↱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 377 "HTMLCharacterReference.gperf" + {"NotLessTilde;", "≴"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 737 "HTMLCharacterReference.gperf" + {"bcy;", "б"}, + {""}, #line 405 "HTMLCharacterReference.gperf" - {"Ntilde;", "Ñ"}, - {""}, - {""}, -#line 708 "HTMLCharacterReference.gperf" - {"apid;", "≋"}, - {""}, -#line 1508 "HTMLCharacterReference.gperf" - {"nesear;", "⤨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1003 "HTMLCharacterReference.gperf" - {"dzcy;", "џ"}, - {""}, -#line 1415 "HTMLCharacterReference.gperf" - {"lthree;", "⋋"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 23 "HTMLCharacterReference.gperf" - {"AMP", "&"}, - {""}, - {""}, - {""}, -#line 1438 "HTMLCharacterReference.gperf" - {"marker;", "▮"}, - {""}, + {"Ntilde", "Ñ"}, +#line 406 "HTMLCharacterReference.gperf" + {"Ntilde;", "Ñ"}, + {""}, + {""}, +#line 709 "HTMLCharacterReference.gperf" + {"apid;", "≋"}, + {""}, +#line 1509 "HTMLCharacterReference.gperf" + {"nesear;", "⤨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1004 "HTMLCharacterReference.gperf" + {"dzcy;", "џ"}, + {""}, +#line 1416 "HTMLCharacterReference.gperf" + {"lthree;", "⋋"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 24 "HTMLCharacterReference.gperf" - {"AMP;", "&"}, - {""}, -#line 1772 "HTMLCharacterReference.gperf" - {"quest;", "?"}, - {""}, - {""}, -#line 1534 "HTMLCharacterReference.gperf" - {"nle;", "≰"}, -#line 58 "HTMLCharacterReference.gperf" - {"Bscr;", "ℬ"}, -#line 2210 "HTMLCharacterReference.gperf" - {"xlarr;", "⟵"}, -#line 1024 "HTMLCharacterReference.gperf" - {"egsdot;", "⪘"}, -#line 289 "HTMLCharacterReference.gperf" - {"LeftTee;", "⊣"}, -#line 1278 "HTMLCharacterReference.gperf" - {"lEg;", "⪋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 963 "HTMLCharacterReference.gperf" - {"diamond;", "⋄"}, -#line 2046 "HTMLCharacterReference.gperf" - {"tfr;", "𝔱"}, -#line 93 "HTMLCharacterReference.gperf" - {"Cscr;", "𝒞"}, - {""}, - {""}, - {""}, -#line 64 "HTMLCharacterReference.gperf" - {"Cap;", "⋒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2222 "HTMLCharacterReference.gperf" - {"xutri;", "△"}, - {""}, - {""}, -#line 180 "HTMLCharacterReference.gperf" - {"Fcy;", "Ф"}, -#line 1182 "HTMLCharacterReference.gperf" - {"heartsuit;", "♥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 44 "HTMLCharacterReference.gperf" - {"Atilde", "Ã"}, + {"AMP", "&"}, + {""}, + {""}, + {""}, +#line 1439 "HTMLCharacterReference.gperf" + {"marker;", "▮"}, + {""}, +#line 25 "HTMLCharacterReference.gperf" + {"AMP;", "&"}, + {""}, +#line 1773 "HTMLCharacterReference.gperf" + {"quest;", "?"}, + {""}, + {""}, +#line 1535 "HTMLCharacterReference.gperf" + {"nle;", "≰"}, +#line 59 "HTMLCharacterReference.gperf" + {"Bscr;", "ℬ"}, +#line 2211 "HTMLCharacterReference.gperf" + {"xlarr;", "⟵"}, +#line 1025 "HTMLCharacterReference.gperf" + {"egsdot;", "⪘"}, +#line 290 "HTMLCharacterReference.gperf" + {"LeftTee;", "⊣"}, +#line 1279 "HTMLCharacterReference.gperf" + {"lEg;", "⪋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 964 "HTMLCharacterReference.gperf" + {"diamond;", "⋄"}, +#line 2047 "HTMLCharacterReference.gperf" + {"tfr;", "𝔱"}, +#line 94 "HTMLCharacterReference.gperf" + {"Cscr;", "𝒞"}, + {""}, + {""}, + {""}, +#line 65 "HTMLCharacterReference.gperf" + {"Cap;", "⋒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2223 "HTMLCharacterReference.gperf" + {"xutri;", "△"}, + {""}, + {""}, +#line 181 "HTMLCharacterReference.gperf" + {"Fcy;", "Ф"}, +#line 1183 "HTMLCharacterReference.gperf" + {"heartsuit;", "♥"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 45 "HTMLCharacterReference.gperf" - {"Atilde;", "Ã"}, - {""}, -#line 1204 "HTMLCharacterReference.gperf" - {"icy;", "и"}, - {""}, - {""}, -#line 1197 "HTMLCharacterReference.gperf" - {"hybull;", "⁃"}, - {""}, - {""}, - {""}, -#line 1556 "HTMLCharacterReference.gperf" - {"notni;", "∌"}, - {""}, - {""}, - {""}, -#line 880 "HTMLCharacterReference.gperf" - {"cire;", "≗"}, -#line 191 "HTMLCharacterReference.gperf" - {"Gamma;", "Γ"}, - {""}, - {""}, - {""}, -#line 2072 "HTMLCharacterReference.gperf" - {"tosa;", "⤩"}, -#line 1276 "HTMLCharacterReference.gperf" - {"lBarr;", "⤎"}, - {""}, - {""}, -#line 1497 "HTMLCharacterReference.gperf" - {"ncongdot;", "⩭̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 640 "HTMLCharacterReference.gperf" - {"Ycy;", "Ы"}, - {""}, -#line 1005 "HTMLCharacterReference.gperf" - {"eDDot;", "⩷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 967 "HTMLCharacterReference.gperf" - {"digamma;", "ϝ"}, - {""}, - {""}, -#line 1273 "HTMLCharacterReference.gperf" - {"lAarr;", "⇚"}, - {""}, - {""}, - {""}, -#line 156 "HTMLCharacterReference.gperf" - {"Ecirc", "Ê"}, -#line 157 "HTMLCharacterReference.gperf" - {"Ecirc;", "Ê"}, - {""}, - {""}, - {""}, -#line 1971 "HTMLCharacterReference.gperf" - {"star;", "☆"}, -#line 1018 "HTMLCharacterReference.gperf" - {"efDot;", "≒"}, - {""}, - {""}, - {""}, + {"Atilde", "Ã"}, +#line 46 "HTMLCharacterReference.gperf" + {"Atilde;", "Ã"}, + {""}, +#line 1205 "HTMLCharacterReference.gperf" + {"icy;", "и"}, + {""}, + {""}, +#line 1198 "HTMLCharacterReference.gperf" + {"hybull;", "⁃"}, + {""}, + {""}, + {""}, +#line 1557 "HTMLCharacterReference.gperf" + {"notni;", "∌"}, + {""}, + {""}, + {""}, +#line 881 "HTMLCharacterReference.gperf" + {"cire;", "≗"}, +#line 192 "HTMLCharacterReference.gperf" + {"Gamma;", "Γ"}, + {""}, + {""}, + {""}, +#line 2073 "HTMLCharacterReference.gperf" + {"tosa;", "⤩"}, +#line 1277 "HTMLCharacterReference.gperf" + {"lBarr;", "⤎"}, + {""}, + {""}, +#line 1498 "HTMLCharacterReference.gperf" + {"ncongdot;", "⩭̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 641 "HTMLCharacterReference.gperf" + {"Ycy;", "Ы"}, + {""}, +#line 1006 "HTMLCharacterReference.gperf" + {"eDDot;", "⩷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 968 "HTMLCharacterReference.gperf" + {"digamma;", "ϝ"}, + {""}, + {""}, #line 1274 "HTMLCharacterReference.gperf" - {"lArr;", "⇐"}, -#line 2202 "HTMLCharacterReference.gperf" - {"xcirc;", "◯"}, - {""}, - {""}, - {""}, - {""}, -#line 1136 "HTMLCharacterReference.gperf" - {"gimel;", "ℷ"}, - {""}, - {""}, - {""}, -#line 1949 "HTMLCharacterReference.gperf" - {"spar;", "∥"}, -#line 517 "HTMLCharacterReference.gperf" - {"ShortRightArrow;", "→"}, - {""}, - {""}, -#line 276 "HTMLCharacterReference.gperf" - {"Lcy;", "Л"}, - {""}, -#line 195 "HTMLCharacterReference.gperf" - {"Gcirc;", "Ĝ"}, - {""}, - {""}, -#line 2002 "HTMLCharacterReference.gperf" - {"sum;", "∑"}, -#line 2149 "HTMLCharacterReference.gperf" - {"vBar;", "⫨"}, - {""}, -#line 964 "HTMLCharacterReference.gperf" - {"diamondsuit;", "♦"}, -#line 240 "HTMLCharacterReference.gperf" - {"Intersection;", "⋂"}, - {""}, - {""}, + {"lAarr;", "⇚"}, + {""}, + {""}, + {""}, +#line 157 "HTMLCharacterReference.gperf" + {"Ecirc", "Ê"}, +#line 158 "HTMLCharacterReference.gperf" + {"Ecirc;", "Ê"}, + {""}, + {""}, + {""}, +#line 1972 "HTMLCharacterReference.gperf" + {"star;", "☆"}, +#line 1019 "HTMLCharacterReference.gperf" + {"efDot;", "≒"}, + {""}, + {""}, + {""}, +#line 1275 "HTMLCharacterReference.gperf" + {"lArr;", "⇐"}, +#line 2203 "HTMLCharacterReference.gperf" + {"xcirc;", "◯"}, + {""}, + {""}, + {""}, + {""}, +#line 1137 "HTMLCharacterReference.gperf" + {"gimel;", "ℷ"}, + {""}, + {""}, + {""}, +#line 1950 "HTMLCharacterReference.gperf" + {"spar;", "∥"}, +#line 518 "HTMLCharacterReference.gperf" + {"ShortRightArrow;", "→"}, + {""}, + {""}, +#line 277 "HTMLCharacterReference.gperf" + {"Lcy;", "Л"}, + {""}, +#line 196 "HTMLCharacterReference.gperf" + {"Gcirc;", "Ĝ"}, + {""}, + {""}, +#line 2003 "HTMLCharacterReference.gperf" + {"sum;", "∑"}, #line 2150 "HTMLCharacterReference.gperf" - {"vBarv;", "⫩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1615 "HTMLCharacterReference.gperf" - {"numsp;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 939 "HTMLCharacterReference.gperf" - {"dArr;", "⇓"}, - {""}, -#line 1459 "HTMLCharacterReference.gperf" - {"models;", "⊧"}, -#line 1129 "HTMLCharacterReference.gperf" - {"gesdoto;", "⪂"}, -#line 2010 "HTMLCharacterReference.gperf" - {"sup;", "⊃"}, -#line 1171 "HTMLCharacterReference.gperf" - {"hArr;", "⇔"}, - {""}, -#line 1770 "HTMLCharacterReference.gperf" - {"quaternions;", "ℍ"}, -#line 1339 "HTMLCharacterReference.gperf" - {"lesdoto;", "⪁"}, -#line 1513 "HTMLCharacterReference.gperf" - {"ngE;", "≧̸"}, - {""}, - {""}, - {""}, - {""}, -#line 2004 "HTMLCharacterReference.gperf" - {"sup1", "¹"}, + {"vBar;", "⫨"}, + {""}, +#line 965 "HTMLCharacterReference.gperf" + {"diamondsuit;", "♦"}, +#line 241 "HTMLCharacterReference.gperf" + {"Intersection;", "⋂"}, + {""}, + {""}, +#line 2151 "HTMLCharacterReference.gperf" + {"vBarv;", "⫩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1616 "HTMLCharacterReference.gperf" + {"numsp;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 940 "HTMLCharacterReference.gperf" + {"dArr;", "⇓"}, + {""}, +#line 1460 "HTMLCharacterReference.gperf" + {"models;", "⊧"}, +#line 1130 "HTMLCharacterReference.gperf" + {"gesdoto;", "⪂"}, +#line 2011 "HTMLCharacterReference.gperf" + {"sup;", "⊃"}, +#line 1172 "HTMLCharacterReference.gperf" + {"hArr;", "⇔"}, + {""}, +#line 1771 "HTMLCharacterReference.gperf" + {"quaternions;", "ℍ"}, +#line 1340 "HTMLCharacterReference.gperf" + {"lesdoto;", "⪁"}, +#line 1514 "HTMLCharacterReference.gperf" + {"ngE;", "≧̸"}, + {""}, + {""}, + {""}, + {""}, #line 2005 "HTMLCharacterReference.gperf" - {"sup1;", "¹"}, -#line 1966 "HTMLCharacterReference.gperf" - {"srarr;", "→"}, - {""}, - {""}, + {"sup1", "¹"}, #line 2006 "HTMLCharacterReference.gperf" - {"sup2", "²"}, + {"sup1;", "¹"}, +#line 1967 "HTMLCharacterReference.gperf" + {"srarr;", "→"}, + {""}, + {""}, #line 2007 "HTMLCharacterReference.gperf" - {"sup2;", "²"}, - {""}, - {""}, - {""}, + {"sup2", "²"}, #line 2008 "HTMLCharacterReference.gperf" - {"sup3", "³"}, + {"sup2;", "²"}, + {""}, + {""}, + {""}, #line 2009 "HTMLCharacterReference.gperf" - {"sup3;", "³"}, - {""}, - {""}, - {""}, -#line 327 "HTMLCharacterReference.gperf" - {"Mcy;", "М"}, - {""}, -#line 2033 "HTMLCharacterReference.gperf" - {"swarr;", "↙"}, - {""}, - {""}, -#line 131 "HTMLCharacterReference.gperf" - {"DoubleUpArrow;", "⇑"}, - {""}, - {""}, -#line 67 "HTMLCharacterReference.gperf" - {"Ccaron;", "Č"}, -#line 1564 "HTMLCharacterReference.gperf" - {"npolint;", "⨔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1387 "HTMLCharacterReference.gperf" - {"lowast;", "∗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 386 "HTMLCharacterReference.gperf" - {"NotSquareSubset;", "⊏̸"}, - {""}, - {""}, - {""}, -#line 2148 "HTMLCharacterReference.gperf" - {"vArr;", "⇕"}, + {"sup3", "³"}, +#line 2010 "HTMLCharacterReference.gperf" + {"sup3;", "³"}, + {""}, + {""}, + {""}, +#line 328 "HTMLCharacterReference.gperf" + {"Mcy;", "М"}, + {""}, +#line 2034 "HTMLCharacterReference.gperf" + {"swarr;", "↙"}, + {""}, + {""}, +#line 132 "HTMLCharacterReference.gperf" + {"DoubleUpArrow;", "⇑"}, + {""}, + {""}, +#line 68 "HTMLCharacterReference.gperf" + {"Ccaron;", "Č"}, +#line 1565 "HTMLCharacterReference.gperf" + {"npolint;", "⨔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1388 "HTMLCharacterReference.gperf" + {"lowast;", "∗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 387 "HTMLCharacterReference.gperf" - {"NotSquareSubsetEqual;", "⋢"}, - {""}, - {""}, - {""}, -#line 1537 "HTMLCharacterReference.gperf" - {"nleq;", "≰"}, + {"NotSquareSubset;", "⊏̸"}, + {""}, + {""}, + {""}, +#line 2149 "HTMLCharacterReference.gperf" + {"vArr;", "⇕"}, +#line 388 "HTMLCharacterReference.gperf" + {"NotSquareSubsetEqual;", "⋢"}, + {""}, + {""}, + {""}, #line 1538 "HTMLCharacterReference.gperf" - {"nleqq;", "≦̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 207 "HTMLCharacterReference.gperf" - {"GreaterTilde;", "≳"}, -#line 543 "HTMLCharacterReference.gperf" - {"SupersetEqual;", "⊇"}, - {""}, -#line 884 "HTMLCharacterReference.gperf" - {"clubs;", "♣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 105 "HTMLCharacterReference.gperf" - {"Dcy;", "Д"}, - {""}, - {""}, - {""}, -#line 73 "HTMLCharacterReference.gperf" - {"Cedilla;", "¸"}, -#line 659 "HTMLCharacterReference.gperf" - {"acE;", "∾̳"}, - {""}, - {""}, -#line 624 "HTMLCharacterReference.gperf" - {"Vvdash;", "⊪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 535 "HTMLCharacterReference.gperf" - {"Succeeds;", "≻"}, -#line 1533 "HTMLCharacterReference.gperf" - {"nldr;", "‥"}, - {""}, - {""}, - {""}, - {""}, -#line 258 "HTMLCharacterReference.gperf" - {"KHcy;", "Х"}, -#line 600 "HTMLCharacterReference.gperf" - {"UpperRightArrow;", "↗"}, - {""}, - {""}, - {""}, - {""}, -#line 1214 "HTMLCharacterReference.gperf" - {"iiint;", "∭"}, - {""}, -#line 423 "HTMLCharacterReference.gperf" - {"Or;", "⩔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 211 "HTMLCharacterReference.gperf" - {"Hacek;", "ˇ"}, - {""}, - {""}, -#line 252 "HTMLCharacterReference.gperf" - {"Jcy;", "Й"}, -#line 1084 "HTMLCharacterReference.gperf" - {"fnof;", "ƒ"}, - {""}, -#line 192 "HTMLCharacterReference.gperf" - {"Gammad;", "Ϝ"}, - {""}, - {""}, -#line 2066 "HTMLCharacterReference.gperf" - {"toea;", "⤨"}, - {""}, - {""}, - {""}, -#line 1962 "HTMLCharacterReference.gperf" - {"squ;", "□"}, -#line 28 "HTMLCharacterReference.gperf" - {"Acirc", "Â"}, -#line 29 "HTMLCharacterReference.gperf" - {"Acirc;", "Â"}, -#line 2221 "HTMLCharacterReference.gperf" - {"xuplus;", "⨄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 95 "HTMLCharacterReference.gperf" - {"CupCap;", "≍"}, - {""}, - {""}, - {""}, - {""}, -#line 2047 "HTMLCharacterReference.gperf" - {"there4;", "∴"}, - {""}, - {""}, -#line 1345 "HTMLCharacterReference.gperf" - {"lesseqgtr;", "⋚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 440 "HTMLCharacterReference.gperf" - {"Pi;", "Π"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1423 "HTMLCharacterReference.gperf" - {"lurdshar;", "⥊"}, -#line 1149 "HTMLCharacterReference.gperf" - {"gopf;", "𝕘"}, - {""}, - {""}, - {""}, -#line 513 "HTMLCharacterReference.gperf" - {"Scy;", "С"}, -#line 1384 "HTMLCharacterReference.gperf" - {"lopf;", "𝕝"}, - {""}, -#line 976 "HTMLCharacterReference.gperf" - {"dlcrop;", "⌍"}, - {""}, - {""}, -#line 1040 "HTMLCharacterReference.gperf" - {"eopf;", "𝕖"}, - {""}, - {""}, - {""}, - {""}, -#line 898 "HTMLCharacterReference.gperf" - {"copf;", "𝕔"}, - {""}, - {""}, - {""}, - {""}, -#line 703 "HTMLCharacterReference.gperf" - {"aopf;", "𝕒"}, -#line 1912 "HTMLCharacterReference.gperf" - {"sharp;", "♯"}, -#line 760 "HTMLCharacterReference.gperf" - {"bkarow;", "⤍"}, - {""}, - {""}, -#line 1259 "HTMLCharacterReference.gperf" - {"jopf;", "𝕛"}, - {""}, - {""}, -#line 362 "HTMLCharacterReference.gperf" - {"NotGreaterGreater;", "≫̸"}, -#line 1910 "HTMLCharacterReference.gperf" - {"sfr;", "𝔰"}, -#line 589 "HTMLCharacterReference.gperf" - {"Uopf;", "𝕌"}, - {""}, -#line 975 "HTMLCharacterReference.gperf" - {"dlcorn;", "⌞"}, -#line 114 "HTMLCharacterReference.gperf" - {"Diamond;", "⋄"}, - {""}, - {""}, -#line 272 "HTMLCharacterReference.gperf" - {"Laplacetrf;", "ℒ"}, - {""}, - {""}, -#line 430 "HTMLCharacterReference.gperf" - {"Ouml", "Ö"}, -#line 431 "HTMLCharacterReference.gperf" - {"Ouml;", "Ö"}, - {""}, -#line 2215 "HTMLCharacterReference.gperf" - {"xoplus;", "⨁"}, - {""}, - {""}, - {""}, -#line 1486 "HTMLCharacterReference.gperf" - {"natur;", "♮"}, + {"nleq;", "≰"}, +#line 1539 "HTMLCharacterReference.gperf" + {"nleqq;", "≦̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 208 "HTMLCharacterReference.gperf" + {"GreaterTilde;", "≳"}, #line 544 "HTMLCharacterReference.gperf" - {"Supset;", "⋑"}, - {""}, -#line 229 "HTMLCharacterReference.gperf" - {"Icy;", "И"}, -#line 978 "HTMLCharacterReference.gperf" - {"dopf;", "𝕕"}, - {""}, -#line 2220 "HTMLCharacterReference.gperf" - {"xsqcup;", "⨆"}, - {""}, -#line 1056 "HTMLCharacterReference.gperf" - {"eqvparsl;", "⧥"}, -#line 1192 "HTMLCharacterReference.gperf" - {"hopf;", "𝕙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 299 "HTMLCharacterReference.gperf" - {"LeftVector;", "↼"}, -#line 1968 "HTMLCharacterReference.gperf" - {"ssetmn;", "∖"}, -#line 1633 "HTMLCharacterReference.gperf" - {"nwarrow;", "↖"}, - {""}, - {""}, -#line 360 "HTMLCharacterReference.gperf" - {"NotGreaterEqual;", "≱"}, - {""}, - {""}, -#line 1499 "HTMLCharacterReference.gperf" - {"ncy;", "н"}, - {""}, -#line 2021 "HTMLCharacterReference.gperf" - {"supne;", "⊋"}, - {""}, - {""}, - {""}, - {""}, -#line 2192 "HTMLCharacterReference.gperf" - {"wedge;", "∧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1213 "HTMLCharacterReference.gperf" - {"iiiint;", "⨌"}, - {""}, - {""}, -#line 458 "HTMLCharacterReference.gperf" - {"Qopf;", "ℚ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1975 "HTMLCharacterReference.gperf" - {"strns;", "¯"}, -#line 2073 "HTMLCharacterReference.gperf" - {"tprime;", "‴"}, - {""}, - {""}, -#line 1085 "HTMLCharacterReference.gperf" - {"fopf;", "𝕗"}, - {""}, - {""}, - {""}, -#line 648 "HTMLCharacterReference.gperf" - {"Zcy;", "З"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2196 "HTMLCharacterReference.gperf" - {"wopf;", "𝕨"}, - {""}, - {""}, -#line 896 "HTMLCharacterReference.gperf" - {"congdot;", "⩭"}, - {""}, - {""}, + {"SupersetEqual;", "⊇"}, + {""}, +#line 885 "HTMLCharacterReference.gperf" + {"clubs;", "♣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 106 "HTMLCharacterReference.gperf" + {"Dcy;", "Д"}, + {""}, + {""}, + {""}, +#line 74 "HTMLCharacterReference.gperf" + {"Cedilla;", "¸"}, +#line 660 "HTMLCharacterReference.gperf" + {"acE;", "∾̳"}, + {""}, + {""}, #line 625 "HTMLCharacterReference.gperf" - {"Wcirc;", "Ŵ"}, - {""}, - {""}, - {""}, -#line 2181 "HTMLCharacterReference.gperf" - {"vopf;", "𝕧"}, -#line 785 "HTMLCharacterReference.gperf" - {"boxHU;", "╩"}, -#line 1576 "HTMLCharacterReference.gperf" - {"nrtrie;", "⋭"}, -#line 750 "HTMLCharacterReference.gperf" - {"bigodot;", "⨀"}, - {""}, - {""}, -#line 186 "HTMLCharacterReference.gperf" - {"Fouriertrf;", "ℱ"}, - {""}, - {""}, - {""}, - {""}, -#line 1216 "HTMLCharacterReference.gperf" - {"iiota;", "℩"}, - {""}, - {""}, -#line 1281 "HTMLCharacterReference.gperf" - {"laemptyv;", "⦴"}, -#line 1284 "HTMLCharacterReference.gperf" - {"lang;", "⟨"}, - {""}, -#line 699 "HTMLCharacterReference.gperf" - {"angsph;", "∢"}, - {""}, - {""}, -#line 134 "HTMLCharacterReference.gperf" - {"DownArrow;", "↓"}, -#line 970 "HTMLCharacterReference.gperf" - {"divide", "÷"}, -#line 971 "HTMLCharacterReference.gperf" - {"divide;", "÷"}, - {""}, -#line 725 "HTMLCharacterReference.gperf" - {"backcong;", "≌"}, -#line 775 "HTMLCharacterReference.gperf" - {"bopf;", "𝕓"}, -#line 451 "HTMLCharacterReference.gperf" - {"Proportion;", "∷"}, - {""}, - {""}, -#line 1089 "HTMLCharacterReference.gperf" - {"fpartint;", "⨍"}, -#line 1539 "HTMLCharacterReference.gperf" - {"nleqslant;", "⩽̸"}, - {""}, -#line 1293 "HTMLCharacterReference.gperf" - {"larrfs;", "⤝"}, -#line 135 "HTMLCharacterReference.gperf" - {"DownArrowBar;", "⤓"}, - {""}, -#line 1036 "HTMLCharacterReference.gperf" - {"emsp;", " "}, - {""}, - {""}, -#line 677 "HTMLCharacterReference.gperf" - {"amp", "&"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 678 "HTMLCharacterReference.gperf" - {"amp;", "&"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 60 "HTMLCharacterReference.gperf" - {"CHcy;", "Ч"}, - {""}, -#line 1035 "HTMLCharacterReference.gperf" - {"emsp14;", " "}, - {""}, - {""}, + {"Vvdash;", "⊪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 536 "HTMLCharacterReference.gperf" + {"Succeeds;", "≻"}, +#line 1534 "HTMLCharacterReference.gperf" + {"nldr;", "‥"}, + {""}, + {""}, + {""}, + {""}, +#line 259 "HTMLCharacterReference.gperf" + {"KHcy;", "Х"}, +#line 601 "HTMLCharacterReference.gperf" + {"UpperRightArrow;", "↗"}, + {""}, + {""}, + {""}, + {""}, +#line 1215 "HTMLCharacterReference.gperf" + {"iiint;", "∭"}, + {""}, +#line 424 "HTMLCharacterReference.gperf" + {"Or;", "⩔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 212 "HTMLCharacterReference.gperf" + {"Hacek;", "ˇ"}, + {""}, + {""}, +#line 253 "HTMLCharacterReference.gperf" + {"Jcy;", "Й"}, +#line 1085 "HTMLCharacterReference.gperf" + {"fnof;", "ƒ"}, + {""}, +#line 193 "HTMLCharacterReference.gperf" + {"Gammad;", "Ϝ"}, + {""}, + {""}, +#line 2067 "HTMLCharacterReference.gperf" + {"toea;", "⤨"}, + {""}, + {""}, + {""}, +#line 1963 "HTMLCharacterReference.gperf" + {"squ;", "□"}, +#line 29 "HTMLCharacterReference.gperf" + {"Acirc", "Â"}, +#line 30 "HTMLCharacterReference.gperf" + {"Acirc;", "Â"}, +#line 2222 "HTMLCharacterReference.gperf" + {"xuplus;", "⨄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 96 "HTMLCharacterReference.gperf" + {"CupCap;", "≍"}, + {""}, + {""}, + {""}, + {""}, #line 2048 "HTMLCharacterReference.gperf" - {"therefore;", "∴"}, - {""}, -#line 2193 "HTMLCharacterReference.gperf" - {"wedgeq;", "≙"}, -#line 1553 "HTMLCharacterReference.gperf" - {"notinva;", "∉"}, - {""}, -#line 1068 "HTMLCharacterReference.gperf" - {"excl;", "!"}, - {""}, - {""}, - {""}, - {""}, -#line 1909 "HTMLCharacterReference.gperf" - {"sext;", "✶"}, - {""}, -#line 505 "HTMLCharacterReference.gperf" - {"SHCHcy;", "Щ"}, - {""}, -#line 469 "HTMLCharacterReference.gperf" - {"Rcy;", "Р"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2020 "HTMLCharacterReference.gperf" - {"supnE;", "⫌"}, - {""}, - {""}, -#line 158 "HTMLCharacterReference.gperf" - {"Ecy;", "Э"}, -#line 216 "HTMLCharacterReference.gperf" - {"Hopf;", "ℍ"}, - {""}, - {""}, - {""}, - {""}, -#line 184 "HTMLCharacterReference.gperf" - {"Fopf;", "𝔽"}, - {""}, - {""}, - {""}, - {""}, -#line 1905 "HTMLCharacterReference.gperf" - {"semi;", ";"}, - {""}, -#line 1034 "HTMLCharacterReference.gperf" - {"emsp13;", " "}, - {""}, - {""}, -#line 1238 "HTMLCharacterReference.gperf" - {"iopf;", "𝕚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 196 "HTMLCharacterReference.gperf" - {"Gcy;", "Г"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1272 "HTMLCharacterReference.gperf" - {"kscr;", "𝓀"}, -#line 812 "HTMLCharacterReference.gperf" - {"boxuL;", "╛"}, - {""}, -#line 1862 "HTMLCharacterReference.gperf" - {"rpar;", ")"}, -#line 1361 "HTMLCharacterReference.gperf" - {"llcorner;", "⌞"}, -#line 642 "HTMLCharacterReference.gperf" - {"Yopf;", "𝕐"}, - {""}, -#line 1189 "HTMLCharacterReference.gperf" - {"homtht;", "∻"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 847 "HTMLCharacterReference.gperf" - {"caps;", "∩︀"}, -#line 2157 "HTMLCharacterReference.gperf" - {"varpi;", "ϖ"}, -#line 846 "HTMLCharacterReference.gperf" - {"capdot;", "⩀"}, - {""}, - {""}, - {""}, - {""}, -#line 614 "HTMLCharacterReference.gperf" - {"Verbar;", "‖"}, - {""}, -#line 414 "HTMLCharacterReference.gperf" - {"Ofr;", "𝔒"}, - {""}, - {""}, - {""}, - {""}, -#line 682 "HTMLCharacterReference.gperf" - {"andslope;", "⩘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1570 "HTMLCharacterReference.gperf" - {"nrArr;", "⇏"}, - {""}, - {""}, - {""}, - {""}, -#line 1901 "HTMLCharacterReference.gperf" - {"searr;", "↘"}, -#line 1409 "HTMLCharacterReference.gperf" - {"lstrok;", "ł"}, -#line 2022 "HTMLCharacterReference.gperf" - {"supplus;", "⫀"}, - {""}, -#line 319 "HTMLCharacterReference.gperf" - {"Lopf;", "𝕃"}, -#line 1908 "HTMLCharacterReference.gperf" - {"setmn;", "∖"}, - {""}, - {""}, - {""}, - {""}, -#line 1630 "HTMLCharacterReference.gperf" - {"nwArr;", "⇖"}, - {""}, -#line 1874 "HTMLCharacterReference.gperf" - {"rtri;", "▹"}, -#line 1865 "HTMLCharacterReference.gperf" - {"rrarr;", "⇉"}, -#line 49 "HTMLCharacterReference.gperf" - {"Barv;", "⫧"}, -#line 886 "HTMLCharacterReference.gperf" - {"colon;", ":"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 550 "HTMLCharacterReference.gperf" - {"Tab;", "\t"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1300 "HTMLCharacterReference.gperf" - {"latail;", "⤙"}, - {""}, -#line 1806 "HTMLCharacterReference.gperf" - {"rbarr;", "⤍"}, -#line 1767 "HTMLCharacterReference.gperf" - {"qopf;", "𝕢"}, - {""}, - {""}, -#line 163 "HTMLCharacterReference.gperf" - {"Element;", "∈"}, - {""}, - {""}, - {""}, -#line 1970 "HTMLCharacterReference.gperf" - {"sstarf;", "⋆"}, - {""}, - {""}, - {""}, - {""}, -#line 996 "HTMLCharacterReference.gperf" - {"dstrok;", "đ"}, - {""}, - {""}, - {""}, - {""}, -#line 1196 "HTMLCharacterReference.gperf" - {"hstrok;", "ħ"}, - {""}, - {""}, -#line 834 "HTMLCharacterReference.gperf" - {"bull;", "•"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 332 "HTMLCharacterReference.gperf" - {"Mopf;", "𝕄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1350 "HTMLCharacterReference.gperf" - {"lfloor;", "⌊"}, - {""}, -#line 339 "HTMLCharacterReference.gperf" - {"Ncy;", "Н"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2068 "HTMLCharacterReference.gperf" - {"topbot;", "⌶"}, - {""}, - {""}, - {""}, -#line 1030 "HTMLCharacterReference.gperf" - {"emacr;", "ē"}, -#line 1051 "HTMLCharacterReference.gperf" - {"eqslantless;", "⪕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 291 "HTMLCharacterReference.gperf" - {"LeftTeeVector;", "⥚"}, -#line 804 "HTMLCharacterReference.gperf" - {"boxh;", "─"}, -#line 675 "HTMLCharacterReference.gperf" - {"amacr;", "ā"}, -#line 1836 "HTMLCharacterReference.gperf" - {"rho;", "ρ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1071 "HTMLCharacterReference.gperf" - {"exponentiale;", "ⅇ"}, - {""}, - {""}, -#line 581 "HTMLCharacterReference.gperf" - {"Umacr;", "Ū"}, - {""}, - {""}, -#line 2154 "HTMLCharacterReference.gperf" - {"varkappa;", "ϰ"}, - {""}, - {""}, -#line 1417 "HTMLCharacterReference.gperf" - {"ltlarr;", "⥶"}, - {""}, - {""}, - {""}, - {""}, -#line 1198 "HTMLCharacterReference.gperf" - {"hyphen;", "‐"}, - {""}, - {""}, - {""}, -#line 2228 "HTMLCharacterReference.gperf" - {"ycirc;", "ŷ"}, -#line 1283 "HTMLCharacterReference.gperf" - {"lambda;", "λ"}, - {""}, - {""}, - {""}, - {""}, -#line 941 "HTMLCharacterReference.gperf" - {"dagger;", "†"}, - {""}, - {""}, -#line 271 "HTMLCharacterReference.gperf" - {"Lang;", "⟪"}, -#line 460 "HTMLCharacterReference.gperf" - {"RBarr;", "⤐"}, - {""}, - {""}, -#line 833 "HTMLCharacterReference.gperf" - {"bsolhsub;", "⟈"}, -#line 224 "HTMLCharacterReference.gperf" - {"IOcy;", "Ё"}, -#line 2217 "HTMLCharacterReference.gperf" - {"xrArr;", "⟹"}, -#line 747 "HTMLCharacterReference.gperf" - {"bigcap;", "⋂"}, - {""}, -#line 30 "HTMLCharacterReference.gperf" - {"Acy;", "А"}, -#line 116 "HTMLCharacterReference.gperf" - {"Dopf;", "𝔻"}, - {""}, - {""}, - {""}, -#line 1856 "HTMLCharacterReference.gperf" - {"roarr;", "⇾"}, - {""}, - {""}, - {""}, - {""}, -#line 1319 "HTMLCharacterReference.gperf" - {"ldrushar;", "⥋"}, -#line 90 "HTMLCharacterReference.gperf" - {"Coproduct;", "∐"}, + {"there4;", "∴"}, + {""}, + {""}, #line 1346 "HTMLCharacterReference.gperf" - {"lesseqqgtr;", "⪋"}, -#line 1964 "HTMLCharacterReference.gperf" - {"squarf;", "▪"}, - {""}, - {""}, - {""}, -#line 558 "HTMLCharacterReference.gperf" - {"ThickSpace;", "  "}, -#line 1248 "HTMLCharacterReference.gperf" - {"isinsv;", "⋳"}, - {""}, -#line 448 "HTMLCharacterReference.gperf" - {"PrecedesTilde;", "≾"}, - {""}, - {""}, -#line 973 "HTMLCharacterReference.gperf" - {"divonx;", "⋇"}, - {""}, -#line 2130 "HTMLCharacterReference.gperf" - {"upsi;", "υ"}, -#line 2044 "HTMLCharacterReference.gperf" - {"tdot;", "⃛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1522 "HTMLCharacterReference.gperf" - {"nhArr;", "⇎"}, -#line 845 "HTMLCharacterReference.gperf" - {"capcup;", "⩇"}, - {""}, - {""}, -#line 1170 "HTMLCharacterReference.gperf" - {"gvnE;", "≩︀"}, - {""}, -#line 915 "HTMLCharacterReference.gperf" - {"cularr;", "↶"}, - {""}, - {""}, -#line 1426 "HTMLCharacterReference.gperf" - {"lvnE;", "≨︀"}, - {""}, -#line 379 "HTMLCharacterReference.gperf" - {"NotPrecedes;", "⊀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1233 "HTMLCharacterReference.gperf" - {"intercal;", "⊺"}, -#line 254 "HTMLCharacterReference.gperf" - {"Jopf;", "𝕁"}, - {""}, - {""}, - {""}, -#line 1428 "HTMLCharacterReference.gperf" - {"macr", "¯"}, -#line 1429 "HTMLCharacterReference.gperf" - {"macr;", "¯"}, - {""}, -#line 219 "HTMLCharacterReference.gperf" - {"Hstrok;", "Ħ"}, - {""}, + {"lesseqgtr;", "⋚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 441 "HTMLCharacterReference.gperf" + {"Pi;", "Π"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1424 "HTMLCharacterReference.gperf" + {"lurdshar;", "⥊"}, +#line 1150 "HTMLCharacterReference.gperf" + {"gopf;", "𝕘"}, + {""}, + {""}, + {""}, +#line 514 "HTMLCharacterReference.gperf" + {"Scy;", "С"}, +#line 1385 "HTMLCharacterReference.gperf" + {"lopf;", "𝕝"}, + {""}, +#line 977 "HTMLCharacterReference.gperf" + {"dlcrop;", "⌍"}, + {""}, + {""}, +#line 1041 "HTMLCharacterReference.gperf" + {"eopf;", "𝕖"}, + {""}, + {""}, + {""}, + {""}, +#line 899 "HTMLCharacterReference.gperf" + {"copf;", "𝕔"}, + {""}, + {""}, + {""}, + {""}, +#line 704 "HTMLCharacterReference.gperf" + {"aopf;", "𝕒"}, +#line 1913 "HTMLCharacterReference.gperf" + {"sharp;", "♯"}, +#line 761 "HTMLCharacterReference.gperf" + {"bkarow;", "⤍"}, + {""}, + {""}, +#line 1260 "HTMLCharacterReference.gperf" + {"jopf;", "𝕛"}, + {""}, + {""}, +#line 363 "HTMLCharacterReference.gperf" + {"NotGreaterGreater;", "≫̸"}, +#line 1911 "HTMLCharacterReference.gperf" + {"sfr;", "𝔰"}, +#line 590 "HTMLCharacterReference.gperf" + {"Uopf;", "𝕌"}, + {""}, +#line 976 "HTMLCharacterReference.gperf" + {"dlcorn;", "⌞"}, +#line 115 "HTMLCharacterReference.gperf" + {"Diamond;", "⋄"}, + {""}, + {""}, +#line 273 "HTMLCharacterReference.gperf" + {"Laplacetrf;", "ℒ"}, + {""}, + {""}, +#line 431 "HTMLCharacterReference.gperf" + {"Ouml", "Ö"}, +#line 432 "HTMLCharacterReference.gperf" + {"Ouml;", "Ö"}, + {""}, +#line 2216 "HTMLCharacterReference.gperf" + {"xoplus;", "⨁"}, + {""}, + {""}, + {""}, +#line 1487 "HTMLCharacterReference.gperf" + {"natur;", "♮"}, +#line 545 "HTMLCharacterReference.gperf" + {"Supset;", "⋑"}, + {""}, +#line 230 "HTMLCharacterReference.gperf" + {"Icy;", "И"}, +#line 979 "HTMLCharacterReference.gperf" + {"dopf;", "𝕕"}, + {""}, +#line 2221 "HTMLCharacterReference.gperf" + {"xsqcup;", "⨆"}, + {""}, +#line 1057 "HTMLCharacterReference.gperf" + {"eqvparsl;", "⧥"}, +#line 1193 "HTMLCharacterReference.gperf" + {"hopf;", "𝕙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 300 "HTMLCharacterReference.gperf" + {"LeftVector;", "↼"}, +#line 1969 "HTMLCharacterReference.gperf" + {"ssetmn;", "∖"}, +#line 1634 "HTMLCharacterReference.gperf" + {"nwarrow;", "↖"}, + {""}, + {""}, +#line 361 "HTMLCharacterReference.gperf" + {"NotGreaterEqual;", "≱"}, + {""}, + {""}, +#line 1500 "HTMLCharacterReference.gperf" + {"ncy;", "н"}, + {""}, +#line 2022 "HTMLCharacterReference.gperf" + {"supne;", "⊋"}, + {""}, + {""}, + {""}, + {""}, +#line 2193 "HTMLCharacterReference.gperf" + {"wedge;", "∧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1214 "HTMLCharacterReference.gperf" + {"iiiint;", "⨌"}, + {""}, + {""}, +#line 459 "HTMLCharacterReference.gperf" + {"Qopf;", "ℚ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1976 "HTMLCharacterReference.gperf" + {"strns;", "¯"}, +#line 2074 "HTMLCharacterReference.gperf" + {"tprime;", "‴"}, + {""}, + {""}, +#line 1086 "HTMLCharacterReference.gperf" + {"fopf;", "𝕗"}, + {""}, + {""}, + {""}, +#line 649 "HTMLCharacterReference.gperf" + {"Zcy;", "З"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2197 "HTMLCharacterReference.gperf" + {"wopf;", "𝕨"}, + {""}, + {""}, +#line 897 "HTMLCharacterReference.gperf" + {"congdot;", "⩭"}, + {""}, + {""}, +#line 626 "HTMLCharacterReference.gperf" + {"Wcirc;", "Ŵ"}, + {""}, + {""}, + {""}, +#line 2182 "HTMLCharacterReference.gperf" + {"vopf;", "𝕧"}, +#line 786 "HTMLCharacterReference.gperf" + {"boxHU;", "╩"}, +#line 1577 "HTMLCharacterReference.gperf" + {"nrtrie;", "⋭"}, +#line 751 "HTMLCharacterReference.gperf" + {"bigodot;", "⨀"}, + {""}, + {""}, +#line 187 "HTMLCharacterReference.gperf" + {"Fouriertrf;", "ℱ"}, + {""}, + {""}, + {""}, + {""}, +#line 1217 "HTMLCharacterReference.gperf" + {"iiota;", "℩"}, + {""}, + {""}, +#line 1282 "HTMLCharacterReference.gperf" + {"laemptyv;", "⦴"}, +#line 1285 "HTMLCharacterReference.gperf" + {"lang;", "⟨"}, + {""}, +#line 700 "HTMLCharacterReference.gperf" + {"angsph;", "∢"}, + {""}, + {""}, +#line 135 "HTMLCharacterReference.gperf" + {"DownArrow;", "↓"}, +#line 971 "HTMLCharacterReference.gperf" + {"divide", "÷"}, +#line 972 "HTMLCharacterReference.gperf" + {"divide;", "÷"}, + {""}, +#line 726 "HTMLCharacterReference.gperf" + {"backcong;", "≌"}, +#line 776 "HTMLCharacterReference.gperf" + {"bopf;", "𝕓"}, +#line 452 "HTMLCharacterReference.gperf" + {"Proportion;", "∷"}, + {""}, + {""}, +#line 1090 "HTMLCharacterReference.gperf" + {"fpartint;", "⨍"}, +#line 1540 "HTMLCharacterReference.gperf" + {"nleqslant;", "⩽̸"}, + {""}, +#line 1294 "HTMLCharacterReference.gperf" + {"larrfs;", "⤝"}, +#line 136 "HTMLCharacterReference.gperf" + {"DownArrowBar;", "⤓"}, + {""}, +#line 1037 "HTMLCharacterReference.gperf" + {"emsp;", " "}, + {""}, + {""}, +#line 678 "HTMLCharacterReference.gperf" + {"amp", "&"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 679 "HTMLCharacterReference.gperf" + {"amp;", "&"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 61 "HTMLCharacterReference.gperf" + {"CHcy;", "Ч"}, + {""}, +#line 1036 "HTMLCharacterReference.gperf" + {"emsp14;", " "}, + {""}, + {""}, +#line 2049 "HTMLCharacterReference.gperf" + {"therefore;", "∴"}, + {""}, +#line 2194 "HTMLCharacterReference.gperf" + {"wedgeq;", "≙"}, +#line 1554 "HTMLCharacterReference.gperf" + {"notinva;", "∉"}, + {""}, +#line 1069 "HTMLCharacterReference.gperf" + {"excl;", "!"}, + {""}, + {""}, + {""}, + {""}, +#line 1910 "HTMLCharacterReference.gperf" + {"sext;", "✶"}, + {""}, +#line 506 "HTMLCharacterReference.gperf" + {"SHCHcy;", "Щ"}, + {""}, +#line 470 "HTMLCharacterReference.gperf" + {"Rcy;", "Р"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2021 "HTMLCharacterReference.gperf" + {"supnE;", "⫌"}, + {""}, + {""}, +#line 159 "HTMLCharacterReference.gperf" + {"Ecy;", "Э"}, +#line 217 "HTMLCharacterReference.gperf" + {"Hopf;", "ℍ"}, + {""}, + {""}, + {""}, + {""}, +#line 185 "HTMLCharacterReference.gperf" + {"Fopf;", "𝔽"}, + {""}, + {""}, + {""}, + {""}, +#line 1906 "HTMLCharacterReference.gperf" + {"semi;", ";"}, + {""}, +#line 1035 "HTMLCharacterReference.gperf" + {"emsp13;", " "}, + {""}, + {""}, +#line 1239 "HTMLCharacterReference.gperf" + {"iopf;", "𝕚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 197 "HTMLCharacterReference.gperf" + {"Gcy;", "Г"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1273 "HTMLCharacterReference.gperf" + {"kscr;", "𝓀"}, +#line 813 "HTMLCharacterReference.gperf" + {"boxuL;", "╛"}, + {""}, +#line 1863 "HTMLCharacterReference.gperf" + {"rpar;", ")"}, +#line 1362 "HTMLCharacterReference.gperf" + {"llcorner;", "⌞"}, +#line 643 "HTMLCharacterReference.gperf" + {"Yopf;", "𝕐"}, + {""}, +#line 1190 "HTMLCharacterReference.gperf" + {"homtht;", "∻"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 848 "HTMLCharacterReference.gperf" + {"caps;", "∩︀"}, +#line 2158 "HTMLCharacterReference.gperf" + {"varpi;", "ϖ"}, +#line 847 "HTMLCharacterReference.gperf" + {"capdot;", "⩀"}, + {""}, + {""}, + {""}, + {""}, +#line 615 "HTMLCharacterReference.gperf" + {"Verbar;", "‖"}, + {""}, +#line 415 "HTMLCharacterReference.gperf" + {"Ofr;", "𝔒"}, + {""}, + {""}, + {""}, + {""}, +#line 683 "HTMLCharacterReference.gperf" + {"andslope;", "⩘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1571 "HTMLCharacterReference.gperf" + {"nrArr;", "⇏"}, + {""}, + {""}, + {""}, + {""}, +#line 1902 "HTMLCharacterReference.gperf" + {"searr;", "↘"}, +#line 1410 "HTMLCharacterReference.gperf" + {"lstrok;", "ł"}, +#line 2023 "HTMLCharacterReference.gperf" + {"supplus;", "⫀"}, + {""}, +#line 320 "HTMLCharacterReference.gperf" + {"Lopf;", "𝕃"}, +#line 1909 "HTMLCharacterReference.gperf" + {"setmn;", "∖"}, + {""}, + {""}, + {""}, + {""}, +#line 1631 "HTMLCharacterReference.gperf" + {"nwArr;", "⇖"}, + {""}, #line 1875 "HTMLCharacterReference.gperf" - {"rtrie;", "⊵"}, -#line 1518 "HTMLCharacterReference.gperf" - {"nges;", "⩾̸"}, - {""}, - {""}, + {"rtri;", "▹"}, +#line 1866 "HTMLCharacterReference.gperf" + {"rrarr;", "⇉"}, +#line 50 "HTMLCharacterReference.gperf" + {"Barv;", "⫧"}, +#line 887 "HTMLCharacterReference.gperf" + {"colon;", ":"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 551 "HTMLCharacterReference.gperf" + {"Tab;", "\t"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1301 "HTMLCharacterReference.gperf" + {"latail;", "⤙"}, + {""}, +#line 1807 "HTMLCharacterReference.gperf" + {"rbarr;", "⤍"}, +#line 1768 "HTMLCharacterReference.gperf" + {"qopf;", "𝕢"}, + {""}, + {""}, +#line 164 "HTMLCharacterReference.gperf" + {"Element;", "∈"}, + {""}, + {""}, + {""}, +#line 1971 "HTMLCharacterReference.gperf" + {"sstarf;", "⋆"}, + {""}, + {""}, + {""}, + {""}, +#line 997 "HTMLCharacterReference.gperf" + {"dstrok;", "đ"}, + {""}, + {""}, + {""}, + {""}, +#line 1197 "HTMLCharacterReference.gperf" + {"hstrok;", "ħ"}, + {""}, + {""}, +#line 835 "HTMLCharacterReference.gperf" + {"bull;", "•"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 333 "HTMLCharacterReference.gperf" + {"Mopf;", "𝕄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1351 "HTMLCharacterReference.gperf" + {"lfloor;", "⌊"}, + {""}, +#line 340 "HTMLCharacterReference.gperf" + {"Ncy;", "Н"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2069 "HTMLCharacterReference.gperf" + {"topbot;", "⌶"}, + {""}, + {""}, + {""}, +#line 1031 "HTMLCharacterReference.gperf" + {"emacr;", "ē"}, +#line 1052 "HTMLCharacterReference.gperf" + {"eqslantless;", "⪕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 292 "HTMLCharacterReference.gperf" + {"LeftTeeVector;", "⥚"}, +#line 805 "HTMLCharacterReference.gperf" + {"boxh;", "─"}, +#line 676 "HTMLCharacterReference.gperf" + {"amacr;", "ā"}, +#line 1837 "HTMLCharacterReference.gperf" + {"rho;", "ρ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1072 "HTMLCharacterReference.gperf" + {"exponentiale;", "ⅇ"}, + {""}, + {""}, +#line 582 "HTMLCharacterReference.gperf" + {"Umacr;", "Ū"}, + {""}, + {""}, +#line 2155 "HTMLCharacterReference.gperf" + {"varkappa;", "ϰ"}, + {""}, + {""}, +#line 1418 "HTMLCharacterReference.gperf" + {"ltlarr;", "⥶"}, + {""}, + {""}, + {""}, + {""}, +#line 1199 "HTMLCharacterReference.gperf" + {"hyphen;", "‐"}, + {""}, + {""}, + {""}, +#line 2229 "HTMLCharacterReference.gperf" + {"ycirc;", "ŷ"}, +#line 1284 "HTMLCharacterReference.gperf" + {"lambda;", "λ"}, + {""}, + {""}, + {""}, + {""}, +#line 942 "HTMLCharacterReference.gperf" + {"dagger;", "†"}, + {""}, + {""}, +#line 272 "HTMLCharacterReference.gperf" + {"Lang;", "⟪"}, #line 461 "HTMLCharacterReference.gperf" - {"REG", "®"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"RBarr;", "⤐"}, + {""}, + {""}, +#line 834 "HTMLCharacterReference.gperf" + {"bsolhsub;", "⟈"}, +#line 225 "HTMLCharacterReference.gperf" + {"IOcy;", "Ё"}, +#line 2218 "HTMLCharacterReference.gperf" + {"xrArr;", "⟹"}, +#line 748 "HTMLCharacterReference.gperf" + {"bigcap;", "⋂"}, + {""}, +#line 31 "HTMLCharacterReference.gperf" + {"Acy;", "А"}, +#line 117 "HTMLCharacterReference.gperf" + {"Dopf;", "𝔻"}, + {""}, + {""}, + {""}, +#line 1857 "HTMLCharacterReference.gperf" + {"roarr;", "⇾"}, + {""}, + {""}, + {""}, + {""}, +#line 1320 "HTMLCharacterReference.gperf" + {"ldrushar;", "⥋"}, +#line 91 "HTMLCharacterReference.gperf" + {"Coproduct;", "∐"}, +#line 1347 "HTMLCharacterReference.gperf" + {"lesseqqgtr;", "⪋"}, +#line 1965 "HTMLCharacterReference.gperf" + {"squarf;", "▪"}, + {""}, + {""}, + {""}, +#line 559 "HTMLCharacterReference.gperf" + {"ThickSpace;", "  "}, +#line 1249 "HTMLCharacterReference.gperf" + {"isinsv;", "⋳"}, + {""}, +#line 449 "HTMLCharacterReference.gperf" + {"PrecedesTilde;", "≾"}, + {""}, + {""}, +#line 974 "HTMLCharacterReference.gperf" + {"divonx;", "⋇"}, + {""}, +#line 2131 "HTMLCharacterReference.gperf" + {"upsi;", "υ"}, +#line 2045 "HTMLCharacterReference.gperf" + {"tdot;", "⃛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1523 "HTMLCharacterReference.gperf" + {"nhArr;", "⇎"}, +#line 846 "HTMLCharacterReference.gperf" + {"capcup;", "⩇"}, + {""}, + {""}, +#line 1171 "HTMLCharacterReference.gperf" + {"gvnE;", "≩︀"}, + {""}, +#line 916 "HTMLCharacterReference.gperf" + {"cularr;", "↶"}, + {""}, + {""}, +#line 1427 "HTMLCharacterReference.gperf" + {"lvnE;", "≨︀"}, + {""}, +#line 380 "HTMLCharacterReference.gperf" + {"NotPrecedes;", "⊀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1234 "HTMLCharacterReference.gperf" + {"intercal;", "⊺"}, +#line 255 "HTMLCharacterReference.gperf" + {"Jopf;", "𝕁"}, + {""}, + {""}, + {""}, +#line 1429 "HTMLCharacterReference.gperf" + {"macr", "¯"}, +#line 1430 "HTMLCharacterReference.gperf" + {"macr;", "¯"}, + {""}, +#line 220 "HTMLCharacterReference.gperf" + {"Hstrok;", "Ħ"}, + {""}, +#line 1876 "HTMLCharacterReference.gperf" + {"rtrie;", "⊵"}, +#line 1519 "HTMLCharacterReference.gperf" + {"nges;", "⩾̸"}, + {""}, + {""}, #line 462 "HTMLCharacterReference.gperf" - {"REG;", "®"}, -#line 632 "HTMLCharacterReference.gperf" - {"Xopf;", "𝕏"}, - {""}, - {""}, - {""}, -#line 1672 "HTMLCharacterReference.gperf" - {"or;", "∨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1810 "HTMLCharacterReference.gperf" - {"rbrke;", "⦌"}, -#line 1191 "HTMLCharacterReference.gperf" - {"hookrightarrow;", "↪"}, - {""}, -#line 2187 "HTMLCharacterReference.gperf" - {"vsupnE;", "⫌︀"}, - {""}, - {""}, - {""}, -#line 935 "HTMLCharacterReference.gperf" - {"cuwed;", "⋏"}, - {""}, -#line 1344 "HTMLCharacterReference.gperf" - {"lessdot;", "⋖"}, -#line 446 "HTMLCharacterReference.gperf" - {"PrecedesEqual;", "⪯"}, - {""}, - {""}, -#line 2152 "HTMLCharacterReference.gperf" - {"vangrt;", "⦜"}, - {""}, - {""}, - {""}, - {""}, -#line 1832 "HTMLCharacterReference.gperf" - {"rfr;", "𝔯"}, - {""}, - {""}, -#line 1684 "HTMLCharacterReference.gperf" - {"orv;", "⩛"}, - {""}, -#line 758 "HTMLCharacterReference.gperf" - {"bigvee;", "⋁"}, -#line 1505 "HTMLCharacterReference.gperf" - {"nearrow;", "↗"}, -#line 2142 "HTMLCharacterReference.gperf" - {"utri;", "▵"}, - {""}, - {""}, - {""}, -#line 2145 "HTMLCharacterReference.gperf" - {"uuml", "ü"}, -#line 2146 "HTMLCharacterReference.gperf" - {"uuml;", "ü"}, -#line 521 "HTMLCharacterReference.gperf" - {"Sopf;", "𝕊"}, -#line 1682 "HTMLCharacterReference.gperf" - {"oror;", "⩖"}, -#line 1566 "HTMLCharacterReference.gperf" - {"nprcue;", "⋠"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1780 "HTMLCharacterReference.gperf" - {"rHar;", "⥤"}, - {""}, - {""}, - {""}, -#line 874 "HTMLCharacterReference.gperf" - {"circlearrowright;", "↻"}, - {""}, - {""}, -#line 2089 "HTMLCharacterReference.gperf" - {"tscr;", "𝓉"}, - {""}, - {""}, - {""}, -#line 876 "HTMLCharacterReference.gperf" - {"circledS;", "Ⓢ"}, -#line 1391 "HTMLCharacterReference.gperf" - {"lozf;", "⧫"}, -#line 1669 "HTMLCharacterReference.gperf" - {"opar;", "⦷"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 324 "HTMLCharacterReference.gperf" - {"Lstrok;", "Ł"}, -#line 1773 "HTMLCharacterReference.gperf" - {"questeq;", "≟"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1026 "HTMLCharacterReference.gperf" - {"elinters;", "⏧"}, -#line 2212 "HTMLCharacterReference.gperf" - {"xnis;", "⋻"}, -#line 1379 "HTMLCharacterReference.gperf" - {"longmapsto;", "⟼"}, - {""}, - {""}, - {""}, -#line 2144 "HTMLCharacterReference.gperf" - {"uuarr;", "⇈"}, -#line 1218 "HTMLCharacterReference.gperf" - {"imacr;", "ī"}, - {""}, -#line 297 "HTMLCharacterReference.gperf" - {"LeftUpVector;", "↿"}, - {""}, -#line 244 "HTMLCharacterReference.gperf" - {"Iopf;", "𝕀"}, -#line 260 "HTMLCharacterReference.gperf" - {"Kappa;", "Κ"}, - {""}, - {""}, -#line 1122 "HTMLCharacterReference.gperf" - {"gel;", "⋛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2014 "HTMLCharacterReference.gperf" - {"supe;", "⊇"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2206 "HTMLCharacterReference.gperf" - {"xhArr;", "⟺"}, -#line 1969 "HTMLCharacterReference.gperf" - {"ssmile;", "⌣"}, - {""}, - {""}, -#line 1547 "HTMLCharacterReference.gperf" - {"nopf;", "𝕟"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"REG", "®"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 463 "HTMLCharacterReference.gperf" + {"REG;", "®"}, +#line 633 "HTMLCharacterReference.gperf" + {"Xopf;", "𝕏"}, + {""}, + {""}, + {""}, #line 1673 "HTMLCharacterReference.gperf" - {"orarr;", "↻"}, - {""}, - {""}, -#line 1693 "HTMLCharacterReference.gperf" - {"ouml", "ö"}, + {"or;", "∨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1811 "HTMLCharacterReference.gperf" + {"rbrke;", "⦌"}, +#line 1192 "HTMLCharacterReference.gperf" + {"hookrightarrow;", "↪"}, + {""}, +#line 2188 "HTMLCharacterReference.gperf" + {"vsupnE;", "⫌︀"}, + {""}, + {""}, + {""}, +#line 936 "HTMLCharacterReference.gperf" + {"cuwed;", "⋏"}, + {""}, +#line 1345 "HTMLCharacterReference.gperf" + {"lessdot;", "⋖"}, +#line 447 "HTMLCharacterReference.gperf" + {"PrecedesEqual;", "⪯"}, + {""}, + {""}, +#line 2153 "HTMLCharacterReference.gperf" + {"vangrt;", "⦜"}, + {""}, + {""}, + {""}, + {""}, +#line 1833 "HTMLCharacterReference.gperf" + {"rfr;", "𝔯"}, + {""}, + {""}, +#line 1685 "HTMLCharacterReference.gperf" + {"orv;", "⩛"}, + {""}, +#line 759 "HTMLCharacterReference.gperf" + {"bigvee;", "⋁"}, +#line 1506 "HTMLCharacterReference.gperf" + {"nearrow;", "↗"}, +#line 2143 "HTMLCharacterReference.gperf" + {"utri;", "▵"}, + {""}, + {""}, + {""}, +#line 2146 "HTMLCharacterReference.gperf" + {"uuml", "ü"}, +#line 2147 "HTMLCharacterReference.gperf" + {"uuml;", "ü"}, +#line 522 "HTMLCharacterReference.gperf" + {"Sopf;", "𝕊"}, +#line 1683 "HTMLCharacterReference.gperf" + {"oror;", "⩖"}, +#line 1567 "HTMLCharacterReference.gperf" + {"nprcue;", "⋠"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1781 "HTMLCharacterReference.gperf" + {"rHar;", "⥤"}, + {""}, + {""}, + {""}, +#line 875 "HTMLCharacterReference.gperf" + {"circlearrowright;", "↻"}, + {""}, + {""}, +#line 2090 "HTMLCharacterReference.gperf" + {"tscr;", "𝓉"}, + {""}, + {""}, + {""}, +#line 877 "HTMLCharacterReference.gperf" + {"circledS;", "Ⓢ"}, +#line 1392 "HTMLCharacterReference.gperf" + {"lozf;", "⧫"}, +#line 1670 "HTMLCharacterReference.gperf" + {"opar;", "⦷"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 325 "HTMLCharacterReference.gperf" + {"Lstrok;", "Ł"}, +#line 1774 "HTMLCharacterReference.gperf" + {"questeq;", "≟"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1027 "HTMLCharacterReference.gperf" + {"elinters;", "⏧"}, +#line 2213 "HTMLCharacterReference.gperf" + {"xnis;", "⋻"}, +#line 1380 "HTMLCharacterReference.gperf" + {"longmapsto;", "⟼"}, + {""}, + {""}, + {""}, +#line 2145 "HTMLCharacterReference.gperf" + {"uuarr;", "⇈"}, +#line 1219 "HTMLCharacterReference.gperf" + {"imacr;", "ī"}, + {""}, +#line 298 "HTMLCharacterReference.gperf" + {"LeftUpVector;", "↿"}, + {""}, +#line 245 "HTMLCharacterReference.gperf" + {"Iopf;", "𝕀"}, +#line 261 "HTMLCharacterReference.gperf" + {"Kappa;", "Κ"}, + {""}, + {""}, +#line 1123 "HTMLCharacterReference.gperf" + {"gel;", "⋛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2015 "HTMLCharacterReference.gperf" + {"supe;", "⊇"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2207 "HTMLCharacterReference.gperf" + {"xhArr;", "⟺"}, +#line 1970 "HTMLCharacterReference.gperf" + {"ssmile;", "⌣"}, + {""}, + {""}, +#line 1548 "HTMLCharacterReference.gperf" + {"nopf;", "𝕟"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1674 "HTMLCharacterReference.gperf" + {"orarr;", "↻"}, + {""}, + {""}, #line 1694 "HTMLCharacterReference.gperf" - {"ouml;", "ö"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ouml", "ö"}, +#line 1695 "HTMLCharacterReference.gperf" + {"ouml;", "ö"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1270 "HTMLCharacterReference.gperf" + {"khcy;", "х"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 520 "HTMLCharacterReference.gperf" + {"Sigma;", "Σ"}, + {""}, +#line 2086 "HTMLCharacterReference.gperf" + {"triplus;", "⨹"}, +#line 1469 "HTMLCharacterReference.gperf" + {"nGt;", "≫⃒"}, +#line 2228 "HTMLCharacterReference.gperf" + {"yacy;", "я"}, + {""}, +#line 2055 "HTMLCharacterReference.gperf" + {"thinsp;", " "}, + {""}, + {""}, +#line 654 "HTMLCharacterReference.gperf" + {"Zopf;", "ℤ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1071 "HTMLCharacterReference.gperf" + {"expectation;", "ℰ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1689 "HTMLCharacterReference.gperf" + {"osol;", "⊘"}, + {""}, + {""}, + {""}, +#line 987 "HTMLCharacterReference.gperf" + {"downarrow;", "↓"}, + {""}, + {""}, + {""}, +#line 555 "HTMLCharacterReference.gperf" + {"Tcy;", "Т"}, + {""}, +#line 948 "HTMLCharacterReference.gperf" + {"dblac;", "˝"}, +#line 1110 "HTMLCharacterReference.gperf" + {"frown;", "⌢"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 235 "HTMLCharacterReference.gperf" + {"Im;", "ℑ"}, +#line 1859 "HTMLCharacterReference.gperf" + {"ropar;", "⦆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 271 "HTMLCharacterReference.gperf" + {"Lambda;", "Λ"}, + {""}, +#line 438 "HTMLCharacterReference.gperf" + {"Pcy;", "П"}, + {""}, +#line 1344 "HTMLCharacterReference.gperf" + {"lessapprox;", "⪅"}, + {""}, + {""}, +#line 1636 "HTMLCharacterReference.gperf" + {"oS;", "Ⓢ"}, + {""}, + {""}, + {""}, + {""}, +#line 2242 "HTMLCharacterReference.gperf" + {"zcy;", "з"}, +#line 1657 "HTMLCharacterReference.gperf" + {"ohm;", "Ω"}, +#line 821 "HTMLCharacterReference.gperf" + {"boxvh;", "┼"}, +#line 150 "HTMLCharacterReference.gperf" + {"Dstrok;", "Đ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2115 "HTMLCharacterReference.gperf" + {"uharr;", "↾"}, + {""}, +#line 2042 "HTMLCharacterReference.gperf" + {"tcaron;", "ť"}, + {""}, +#line 886 "HTMLCharacterReference.gperf" + {"clubsuit;", "♣"}, + {""}, + {""}, +#line 1307 "HTMLCharacterReference.gperf" + {"lbrack;", "["}, + {""}, + {""}, +#line 500 "HTMLCharacterReference.gperf" + {"Ropf;", "ℝ"}, + {""}, +#line 1459 "HTMLCharacterReference.gperf" + {"mnplus;", "∓"}, + {""}, +#line 2040 "HTMLCharacterReference.gperf" + {"tau;", "τ"}, + {""}, + {""}, +#line 578 "HTMLCharacterReference.gperf" + {"Udblac;", "Ű"}, + {""}, + {""}, +#line 1481 "HTMLCharacterReference.gperf" + {"nang;", "∠⃒"}, + {""}, + {""}, + {""}, + {""}, +#line 169 "HTMLCharacterReference.gperf" + {"Eopf;", "𝔼"}, +#line 2205 "HTMLCharacterReference.gperf" + {"xdtri;", "▽"}, + {""}, + {""}, +#line 62 "HTMLCharacterReference.gperf" + {"COPY", "©"}, +#line 63 "HTMLCharacterReference.gperf" + {"COPY;", "©"}, + {""}, +#line 836 "HTMLCharacterReference.gperf" + {"bullet;", "•"}, + {""}, + {""}, +#line 2215 "HTMLCharacterReference.gperf" + {"xopf;", "𝕩"}, + {""}, #line 1269 "HTMLCharacterReference.gperf" - {"khcy;", "х"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 519 "HTMLCharacterReference.gperf" - {"Sigma;", "Σ"}, - {""}, -#line 2085 "HTMLCharacterReference.gperf" - {"triplus;", "⨹"}, + {"kgreen;", "ĸ"}, +#line 1824 "HTMLCharacterReference.gperf" + {"real;", "ℜ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1140 "HTMLCharacterReference.gperf" + {"glE;", "⪒"}, + {""}, + {""}, + {""}, + {""}, +#line 1917 "HTMLCharacterReference.gperf" + {"shortparallel;", "∥"}, +#line 201 "HTMLCharacterReference.gperf" + {"Gopf;", "𝔾"}, +#line 1503 "HTMLCharacterReference.gperf" + {"neArr;", "⇗"}, + {""}, +#line 2111 "HTMLCharacterReference.gperf" + {"ufr;", "𝔲"}, #line 1468 "HTMLCharacterReference.gperf" - {"nGt;", "≫⃒"}, -#line 2227 "HTMLCharacterReference.gperf" - {"yacy;", "я"}, - {""}, -#line 2054 "HTMLCharacterReference.gperf" - {"thinsp;", " "}, - {""}, - {""}, -#line 653 "HTMLCharacterReference.gperf" - {"Zopf;", "ℤ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1070 "HTMLCharacterReference.gperf" - {"expectation;", "ℰ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1688 "HTMLCharacterReference.gperf" - {"osol;", "⊘"}, - {""}, - {""}, - {""}, -#line 986 "HTMLCharacterReference.gperf" - {"downarrow;", "↓"}, - {""}, - {""}, - {""}, -#line 554 "HTMLCharacterReference.gperf" - {"Tcy;", "Т"}, - {""}, -#line 947 "HTMLCharacterReference.gperf" - {"dblac;", "˝"}, -#line 1109 "HTMLCharacterReference.gperf" - {"frown;", "⌢"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 234 "HTMLCharacterReference.gperf" - {"Im;", "ℑ"}, -#line 1858 "HTMLCharacterReference.gperf" - {"ropar;", "⦆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 270 "HTMLCharacterReference.gperf" - {"Lambda;", "Λ"}, - {""}, -#line 437 "HTMLCharacterReference.gperf" - {"Pcy;", "П"}, - {""}, -#line 1343 "HTMLCharacterReference.gperf" - {"lessapprox;", "⪅"}, - {""}, - {""}, -#line 1635 "HTMLCharacterReference.gperf" - {"oS;", "Ⓢ"}, - {""}, - {""}, - {""}, - {""}, -#line 2241 "HTMLCharacterReference.gperf" - {"zcy;", "з"}, -#line 1656 "HTMLCharacterReference.gperf" - {"ohm;", "Ω"}, -#line 820 "HTMLCharacterReference.gperf" - {"boxvh;", "┼"}, -#line 149 "HTMLCharacterReference.gperf" - {"Dstrok;", "Đ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"nGg;", "⋙̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1286 "HTMLCharacterReference.gperf" + {"langd;", "⦑"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 745 "HTMLCharacterReference.gperf" + {"beth;", "ℶ"}, + {""}, + {""}, + {""}, +#line 2098 "HTMLCharacterReference.gperf" + {"uHar;", "⥣"}, + {""}, + {""}, +#line 102 "HTMLCharacterReference.gperf" + {"Dagger;", "‡"}, +#line 917 "HTMLCharacterReference.gperf" + {"cularrp;", "⤽"}, +#line 611 "HTMLCharacterReference.gperf" + {"Vcy;", "В"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2124 "HTMLCharacterReference.gperf" + {"uogon;", "ų"}, + {""}, + {""}, + {""}, + {""}, #line 2114 "HTMLCharacterReference.gperf" - {"uharr;", "↾"}, - {""}, -#line 2041 "HTMLCharacterReference.gperf" - {"tcaron;", "ť"}, - {""}, -#line 885 "HTMLCharacterReference.gperf" - {"clubsuit;", "♣"}, - {""}, - {""}, -#line 1306 "HTMLCharacterReference.gperf" - {"lbrack;", "["}, - {""}, - {""}, -#line 499 "HTMLCharacterReference.gperf" - {"Ropf;", "ℝ"}, - {""}, -#line 1458 "HTMLCharacterReference.gperf" - {"mnplus;", "∓"}, - {""}, -#line 2039 "HTMLCharacterReference.gperf" - {"tau;", "τ"}, - {""}, - {""}, -#line 577 "HTMLCharacterReference.gperf" - {"Udblac;", "Ű"}, - {""}, - {""}, -#line 1480 "HTMLCharacterReference.gperf" - {"nang;", "∠⃒"}, - {""}, - {""}, - {""}, - {""}, -#line 168 "HTMLCharacterReference.gperf" - {"Eopf;", "𝔼"}, -#line 2204 "HTMLCharacterReference.gperf" - {"xdtri;", "▽"}, - {""}, - {""}, -#line 61 "HTMLCharacterReference.gperf" - {"COPY", "©"}, -#line 62 "HTMLCharacterReference.gperf" - {"COPY;", "©"}, - {""}, -#line 835 "HTMLCharacterReference.gperf" - {"bullet;", "•"}, - {""}, - {""}, -#line 2214 "HTMLCharacterReference.gperf" - {"xopf;", "𝕩"}, - {""}, -#line 1268 "HTMLCharacterReference.gperf" - {"kgreen;", "ĸ"}, -#line 1823 "HTMLCharacterReference.gperf" - {"real;", "ℜ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1139 "HTMLCharacterReference.gperf" - {"glE;", "⪒"}, - {""}, - {""}, - {""}, - {""}, -#line 1916 "HTMLCharacterReference.gperf" - {"shortparallel;", "∥"}, -#line 200 "HTMLCharacterReference.gperf" - {"Gopf;", "𝔾"}, -#line 1502 "HTMLCharacterReference.gperf" - {"neArr;", "⇗"}, - {""}, -#line 2110 "HTMLCharacterReference.gperf" - {"ufr;", "𝔲"}, -#line 1467 "HTMLCharacterReference.gperf" - {"nGg;", "⋙̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1285 "HTMLCharacterReference.gperf" - {"langd;", "⦑"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 744 "HTMLCharacterReference.gperf" - {"beth;", "ℶ"}, - {""}, - {""}, - {""}, -#line 2097 "HTMLCharacterReference.gperf" - {"uHar;", "⥣"}, - {""}, - {""}, -#line 101 "HTMLCharacterReference.gperf" - {"Dagger;", "‡"}, -#line 916 "HTMLCharacterReference.gperf" - {"cularrp;", "⤽"}, -#line 610 "HTMLCharacterReference.gperf" - {"Vcy;", "В"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2123 "HTMLCharacterReference.gperf" - {"uogon;", "ų"}, - {""}, - {""}, - {""}, - {""}, -#line 2113 "HTMLCharacterReference.gperf" - {"uharl;", "↿"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1447 "HTMLCharacterReference.gperf" - {"mid;", "∣"}, -#line 1896 "HTMLCharacterReference.gperf" - {"sdot;", "⋅"}, -#line 70 "HTMLCharacterReference.gperf" - {"Ccirc;", "Ĉ"}, - {""}, - {""}, - {""}, -#line 545 "HTMLCharacterReference.gperf" - {"THORN", "Þ"}, + {"uharl;", "↿"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1448 "HTMLCharacterReference.gperf" + {"mid;", "∣"}, +#line 1897 "HTMLCharacterReference.gperf" + {"sdot;", "⋅"}, +#line 71 "HTMLCharacterReference.gperf" + {"Ccirc;", "Ĉ"}, + {""}, + {""}, + {""}, #line 546 "HTMLCharacterReference.gperf" - {"THORN;", "Þ"}, -#line 1439 "HTMLCharacterReference.gperf" - {"mcomma;", "⨩"}, - {""}, - {""}, -#line 559 "HTMLCharacterReference.gperf" - {"ThinSpace;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 572 "HTMLCharacterReference.gperf" - {"Ubrcy;", "Ў"}, - {""}, - {""}, -#line 1650 "HTMLCharacterReference.gperf" - {"ofr;", "𝔬"}, - {""}, -#line 1551 "HTMLCharacterReference.gperf" - {"notinE;", "⋹̸"}, - {""}, - {""}, -#line 2090 "HTMLCharacterReference.gperf" - {"tscy;", "ц"}, - {""}, - {""}, - {""}, - {""}, -#line 464 "HTMLCharacterReference.gperf" - {"Rang;", "⟫"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1828 "HTMLCharacterReference.gperf" - {"reg", "®"}, - {""}, - {""}, - {""}, -#line 1457 "HTMLCharacterReference.gperf" - {"mldr;", "…"}, - {""}, + {"THORN", "Þ"}, +#line 547 "HTMLCharacterReference.gperf" + {"THORN;", "Þ"}, +#line 1440 "HTMLCharacterReference.gperf" + {"mcomma;", "⨩"}, + {""}, + {""}, +#line 560 "HTMLCharacterReference.gperf" + {"ThinSpace;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 573 "HTMLCharacterReference.gperf" + {"Ubrcy;", "Ў"}, + {""}, + {""}, +#line 1651 "HTMLCharacterReference.gperf" + {"ofr;", "𝔬"}, + {""}, +#line 1552 "HTMLCharacterReference.gperf" + {"notinE;", "⋹̸"}, + {""}, + {""}, +#line 2091 "HTMLCharacterReference.gperf" + {"tscy;", "ц"}, + {""}, + {""}, + {""}, + {""}, +#line 465 "HTMLCharacterReference.gperf" + {"Rang;", "⟫"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1829 "HTMLCharacterReference.gperf" - {"reg;", "®"}, - {""}, - {""}, - {""}, -#line 88 "HTMLCharacterReference.gperf" - {"ContourIntegral;", "∮"}, - {""}, - {""}, - {""}, - {""}, -#line 2049 "HTMLCharacterReference.gperf" - {"theta;", "θ"}, - {""}, - {""}, -#line 1854 "HTMLCharacterReference.gperf" - {"rnmid;", "⫮"}, - {""}, -#line 800 "HTMLCharacterReference.gperf" - {"boxdL;", "╕"}, -#line 1670 "HTMLCharacterReference.gperf" - {"operp;", "⦹"}, -#line 697 "HTMLCharacterReference.gperf" - {"angrtvb;", "⊾"}, -#line 2229 "HTMLCharacterReference.gperf" - {"ycy;", "ы"}, - {""}, -#line 1478 "HTMLCharacterReference.gperf" - {"nabla;", "∇"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1963 "HTMLCharacterReference.gperf" - {"square;", "□"}, - {""}, - {""}, -#line 350 "HTMLCharacterReference.gperf" - {"Nopf;", "ℕ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1347 "HTMLCharacterReference.gperf" - {"lessgtr;", "≶"}, - {""}, - {""}, - {""}, -#line 1388 "HTMLCharacterReference.gperf" - {"lowbar;", "_"}, -#line 1390 "HTMLCharacterReference.gperf" - {"lozenge;", "◊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1625 "HTMLCharacterReference.gperf" - {"nvlt;", "<⃒"}, - {""}, -#line 1286 "HTMLCharacterReference.gperf" - {"langle;", "⟨"}, - {""}, - {""}, -#line 2211 "HTMLCharacterReference.gperf" - {"xmap;", "⟼"}, - {""}, - {""}, -#line 1869 "HTMLCharacterReference.gperf" - {"rsqb;", "]"}, - {""}, -#line 1967 "HTMLCharacterReference.gperf" - {"sscr;", "𝓈"}, - {""}, -#line 938 "HTMLCharacterReference.gperf" - {"cylcty;", "⌭"}, - {""}, -#line 1377 "HTMLCharacterReference.gperf" - {"longleftarrow;", "⟵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2140 "HTMLCharacterReference.gperf" - {"utdot;", "⋰"}, - {""}, -#line 887 "HTMLCharacterReference.gperf" - {"colone;", "≔"}, - {""}, - {""}, -#line 2083 "HTMLCharacterReference.gperf" - {"trie;", "≜"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 235 "HTMLCharacterReference.gperf" - {"Imacr;", "Ī"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 972 "HTMLCharacterReference.gperf" - {"divideontimes;", "⋇"}, - {""}, -#line 787 "HTMLCharacterReference.gperf" - {"boxHu;", "╧"}, - {""}, -#line 518 "HTMLCharacterReference.gperf" - {"ShortUpArrow;", "↑"}, - {""}, -#line 38 "HTMLCharacterReference.gperf" - {"Aopf;", "𝔸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1826 "HTMLCharacterReference.gperf" - {"reals;", "ℝ"}, - {""}, - {""}, -#line 1175 "HTMLCharacterReference.gperf" - {"hardcy;", "ъ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 429 "HTMLCharacterReference.gperf" - {"Otimes;", "⨷"}, -#line 1837 "HTMLCharacterReference.gperf" - {"rhov;", "ϱ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 796 "HTMLCharacterReference.gperf" - {"boxVh;", "╫"}, - {""}, -#line 292 "HTMLCharacterReference.gperf" - {"LeftTriangle;", "⊲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1674 "HTMLCharacterReference.gperf" - {"ord;", "⩝"}, -#line 676 "HTMLCharacterReference.gperf" - {"amalg;", "⨿"}, - {""}, -#line 1882 "HTMLCharacterReference.gperf" - {"sc;", "≻"}, - {""}, -#line 1679 "HTMLCharacterReference.gperf" - {"ordm", "º"}, + {"reg", "®"}, + {""}, + {""}, + {""}, +#line 1458 "HTMLCharacterReference.gperf" + {"mldr;", "…"}, + {""}, +#line 1830 "HTMLCharacterReference.gperf" + {"reg;", "®"}, + {""}, + {""}, + {""}, +#line 89 "HTMLCharacterReference.gperf" + {"ContourIntegral;", "∮"}, + {""}, + {""}, + {""}, + {""}, +#line 2050 "HTMLCharacterReference.gperf" + {"theta;", "θ"}, + {""}, + {""}, +#line 1855 "HTMLCharacterReference.gperf" + {"rnmid;", "⫮"}, + {""}, +#line 801 "HTMLCharacterReference.gperf" + {"boxdL;", "╕"}, +#line 1671 "HTMLCharacterReference.gperf" + {"operp;", "⦹"}, +#line 698 "HTMLCharacterReference.gperf" + {"angrtvb;", "⊾"}, +#line 2230 "HTMLCharacterReference.gperf" + {"ycy;", "ы"}, + {""}, +#line 1479 "HTMLCharacterReference.gperf" + {"nabla;", "∇"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1964 "HTMLCharacterReference.gperf" + {"square;", "□"}, + {""}, + {""}, +#line 351 "HTMLCharacterReference.gperf" + {"Nopf;", "ℕ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1348 "HTMLCharacterReference.gperf" + {"lessgtr;", "≶"}, + {""}, + {""}, + {""}, +#line 1389 "HTMLCharacterReference.gperf" + {"lowbar;", "_"}, +#line 1391 "HTMLCharacterReference.gperf" + {"lozenge;", "◊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1626 "HTMLCharacterReference.gperf" + {"nvlt;", "<⃒"}, + {""}, +#line 1287 "HTMLCharacterReference.gperf" + {"langle;", "⟨"}, + {""}, + {""}, +#line 2212 "HTMLCharacterReference.gperf" + {"xmap;", "⟼"}, + {""}, + {""}, +#line 1870 "HTMLCharacterReference.gperf" + {"rsqb;", "]"}, + {""}, +#line 1968 "HTMLCharacterReference.gperf" + {"sscr;", "𝓈"}, + {""}, +#line 939 "HTMLCharacterReference.gperf" + {"cylcty;", "⌭"}, + {""}, +#line 1378 "HTMLCharacterReference.gperf" + {"longleftarrow;", "⟵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2141 "HTMLCharacterReference.gperf" + {"utdot;", "⋰"}, + {""}, +#line 888 "HTMLCharacterReference.gperf" + {"colone;", "≔"}, + {""}, + {""}, +#line 2084 "HTMLCharacterReference.gperf" + {"trie;", "≜"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 236 "HTMLCharacterReference.gperf" + {"Imacr;", "Ī"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 973 "HTMLCharacterReference.gperf" + {"divideontimes;", "⋇"}, + {""}, +#line 788 "HTMLCharacterReference.gperf" + {"boxHu;", "╧"}, + {""}, +#line 519 "HTMLCharacterReference.gperf" + {"ShortUpArrow;", "↑"}, + {""}, +#line 39 "HTMLCharacterReference.gperf" + {"Aopf;", "𝔸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1827 "HTMLCharacterReference.gperf" + {"reals;", "ℝ"}, + {""}, + {""}, +#line 1176 "HTMLCharacterReference.gperf" + {"hardcy;", "ъ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 430 "HTMLCharacterReference.gperf" + {"Otimes;", "⨷"}, +#line 1838 "HTMLCharacterReference.gperf" + {"rhov;", "ϱ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 797 "HTMLCharacterReference.gperf" + {"boxVh;", "╫"}, + {""}, +#line 293 "HTMLCharacterReference.gperf" + {"LeftTriangle;", "⊲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1675 "HTMLCharacterReference.gperf" + {"ord;", "⩝"}, +#line 677 "HTMLCharacterReference.gperf" + {"amalg;", "⨿"}, + {""}, +#line 1883 "HTMLCharacterReference.gperf" + {"sc;", "≻"}, + {""}, #line 1680 "HTMLCharacterReference.gperf" - {"ordm;", "º"}, - {""}, - {""}, - {""}, - {""}, -#line 1898 "HTMLCharacterReference.gperf" - {"sdote;", "⩦"}, - {""}, - {""}, -#line 106 "HTMLCharacterReference.gperf" - {"Del;", "∇"}, - {""}, - {""}, - {""}, - {""}, -#line 1440 "HTMLCharacterReference.gperf" - {"mcy;", "м"}, - {""}, -#line 807 "HTMLCharacterReference.gperf" - {"boxhd;", "┬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 147 "HTMLCharacterReference.gperf" - {"Downarrow;", "⇓"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1894 "HTMLCharacterReference.gperf" - {"scsim;", "≿"}, - {""}, - {""}, -#line 262 "HTMLCharacterReference.gperf" - {"Kcy;", "К"}, -#line 1994 "HTMLCharacterReference.gperf" - {"succ;", "≻"}, - {""}, - {""}, -#line 294 "HTMLCharacterReference.gperf" - {"LeftTriangleEqual;", "⊴"}, - {""}, - {""}, -#line 364 "HTMLCharacterReference.gperf" - {"NotGreaterSlantEqual;", "⩾̸"}, - {""}, - {""}, - {""}, - {""}, -#line 1812 "HTMLCharacterReference.gperf" - {"rbrkslu;", "⦐"}, -#line 210 "HTMLCharacterReference.gperf" - {"HARDcy;", "Ъ"}, - {""}, -#line 1833 "HTMLCharacterReference.gperf" - {"rhard;", "⇁"}, - {""}, - {""}, -#line 738 "HTMLCharacterReference.gperf" - {"becaus;", "∵"}, - {""}, -#line 1976 "HTMLCharacterReference.gperf" - {"sub;", "⊂"}, - {""}, - {""}, -#line 2132 "HTMLCharacterReference.gperf" - {"upsilon;", "υ"}, - {""}, - {""}, - {""}, -#line 92 "HTMLCharacterReference.gperf" - {"Cross;", "⨯"}, - {""}, - {""}, -#line 2250 "HTMLCharacterReference.gperf" - {"zwj;", "‍"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1363 "HTMLCharacterReference.gperf" - {"lltri;", "◺"}, - {""}, - {""}, - {""}, -#line 361 "HTMLCharacterReference.gperf" - {"NotGreaterFullEqual;", "≧̸"}, - {""}, + {"ordm", "º"}, +#line 1681 "HTMLCharacterReference.gperf" + {"ordm;", "º"}, + {""}, + {""}, + {""}, + {""}, +#line 1899 "HTMLCharacterReference.gperf" + {"sdote;", "⩦"}, + {""}, + {""}, +#line 107 "HTMLCharacterReference.gperf" + {"Del;", "∇"}, + {""}, + {""}, + {""}, + {""}, +#line 1441 "HTMLCharacterReference.gperf" + {"mcy;", "м"}, + {""}, +#line 808 "HTMLCharacterReference.gperf" + {"boxhd;", "┬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 148 "HTMLCharacterReference.gperf" + {"Downarrow;", "⇓"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1895 "HTMLCharacterReference.gperf" + {"scsim;", "≿"}, + {""}, + {""}, +#line 263 "HTMLCharacterReference.gperf" + {"Kcy;", "К"}, +#line 1995 "HTMLCharacterReference.gperf" + {"succ;", "≻"}, + {""}, + {""}, +#line 295 "HTMLCharacterReference.gperf" + {"LeftTriangleEqual;", "⊴"}, + {""}, + {""}, +#line 365 "HTMLCharacterReference.gperf" + {"NotGreaterSlantEqual;", "⩾̸"}, + {""}, + {""}, + {""}, + {""}, +#line 1813 "HTMLCharacterReference.gperf" + {"rbrkslu;", "⦐"}, +#line 211 "HTMLCharacterReference.gperf" + {"HARDcy;", "Ъ"}, + {""}, +#line 1834 "HTMLCharacterReference.gperf" + {"rhard;", "⇁"}, + {""}, + {""}, +#line 739 "HTMLCharacterReference.gperf" + {"becaus;", "∵"}, + {""}, +#line 1977 "HTMLCharacterReference.gperf" + {"sub;", "⊂"}, + {""}, + {""}, +#line 2133 "HTMLCharacterReference.gperf" + {"upsilon;", "υ"}, + {""}, + {""}, + {""}, +#line 93 "HTMLCharacterReference.gperf" + {"Cross;", "⨯"}, + {""}, + {""}, +#line 2251 "HTMLCharacterReference.gperf" + {"zwj;", "‍"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1364 "HTMLCharacterReference.gperf" + {"lltri;", "◺"}, + {""}, + {""}, + {""}, +#line 362 "HTMLCharacterReference.gperf" + {"NotGreaterFullEqual;", "≧̸"}, + {""}, +#line 1886 "HTMLCharacterReference.gperf" + {"scaron;", "š"}, + {""}, +#line 876 "HTMLCharacterReference.gperf" + {"circledR;", "®"}, #line 1885 "HTMLCharacterReference.gperf" - {"scaron;", "š"}, - {""}, -#line 875 "HTMLCharacterReference.gperf" - {"circledR;", "®"}, -#line 1884 "HTMLCharacterReference.gperf" - {"scap;", "⪸"}, -#line 626 "HTMLCharacterReference.gperf" - {"Wedge;", "⋀"}, - {""}, - {""}, -#line 757 "HTMLCharacterReference.gperf" - {"biguplus;", "⨄"}, - {""}, - {""}, -#line 2185 "HTMLCharacterReference.gperf" - {"vsubnE;", "⫋︀"}, - {""}, -#line 1683 "HTMLCharacterReference.gperf" - {"orslope;", "⩗"}, - {""}, -#line 164 "HTMLCharacterReference.gperf" - {"Emacr;", "Ē"}, - {""}, - {""}, -#line 239 "HTMLCharacterReference.gperf" - {"Integral;", "∫"}, -#line 48 "HTMLCharacterReference.gperf" - {"Backslash;", "∖"}, - {""}, - {""}, - {""}, - {""}, -#line 126 "HTMLCharacterReference.gperf" - {"DoubleLongLeftArrow;", "⟸"}, - {""}, - {""}, - {""}, -#line 1472 "HTMLCharacterReference.gperf" - {"nLl;", "⋘̸"}, + {"scap;", "⪸"}, +#line 627 "HTMLCharacterReference.gperf" + {"Wedge;", "⋀"}, + {""}, + {""}, +#line 758 "HTMLCharacterReference.gperf" + {"biguplus;", "⨄"}, + {""}, + {""}, +#line 2186 "HTMLCharacterReference.gperf" + {"vsubnE;", "⫋︀"}, + {""}, +#line 1684 "HTMLCharacterReference.gperf" + {"orslope;", "⩗"}, + {""}, +#line 165 "HTMLCharacterReference.gperf" + {"Emacr;", "Ē"}, + {""}, + {""}, +#line 240 "HTMLCharacterReference.gperf" + {"Integral;", "∫"}, +#line 49 "HTMLCharacterReference.gperf" + {"Backslash;", "∖"}, + {""}, + {""}, + {""}, + {""}, #line 127 "HTMLCharacterReference.gperf" - {"DoubleLongLeftRightArrow;", "⟺"}, -#line 123 "HTMLCharacterReference.gperf" - {"DoubleLeftArrow;", "⇐"}, - {""}, - {""}, -#line 1125 "HTMLCharacterReference.gperf" - {"geqslant;", "⩾"}, - {""}, - {""}, -#line 1113 "HTMLCharacterReference.gperf" - {"gacute;", "ǵ"}, - {""}, -#line 1335 "HTMLCharacterReference.gperf" - {"leqslant;", "⩽"}, -#line 628 "HTMLCharacterReference.gperf" - {"Wopf;", "𝕎"}, - {""}, -#line 1280 "HTMLCharacterReference.gperf" - {"lacute;", "ĺ"}, - {""}, - {""}, - {""}, -#line 1007 "HTMLCharacterReference.gperf" - {"eacute", "é"}, + {"DoubleLongLeftArrow;", "⟸"}, + {""}, + {""}, + {""}, +#line 1473 "HTMLCharacterReference.gperf" + {"nLl;", "⋘̸"}, +#line 128 "HTMLCharacterReference.gperf" + {"DoubleLongLeftRightArrow;", "⟺"}, +#line 124 "HTMLCharacterReference.gperf" + {"DoubleLeftArrow;", "⇐"}, + {""}, + {""}, +#line 1126 "HTMLCharacterReference.gperf" + {"geqslant;", "⩾"}, + {""}, + {""}, +#line 1114 "HTMLCharacterReference.gperf" + {"gacute;", "ǵ"}, + {""}, +#line 1336 "HTMLCharacterReference.gperf" + {"leqslant;", "⩽"}, +#line 629 "HTMLCharacterReference.gperf" + {"Wopf;", "𝕎"}, + {""}, +#line 1281 "HTMLCharacterReference.gperf" + {"lacute;", "ĺ"}, + {""}, + {""}, + {""}, #line 1008 "HTMLCharacterReference.gperf" - {"eacute;", "é"}, - {""}, - {""}, - {""}, - {""}, -#line 840 "HTMLCharacterReference.gperf" - {"cacute;", "ć"}, - {""}, - {""}, - {""}, -#line 655 "HTMLCharacterReference.gperf" - {"aacute", "á"}, + {"eacute", "é"}, +#line 1009 "HTMLCharacterReference.gperf" + {"eacute;", "é"}, + {""}, + {""}, + {""}, + {""}, +#line 841 "HTMLCharacterReference.gperf" + {"cacute;", "ć"}, + {""}, + {""}, + {""}, #line 656 "HTMLCharacterReference.gperf" - {"aacute;", "á"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 568 "HTMLCharacterReference.gperf" - {"Uacute", "Ú"}, + {"aacute", "á"}, +#line 657 "HTMLCharacterReference.gperf" + {"aacute;", "á"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 569 "HTMLCharacterReference.gperf" - {"Uacute;", "Ú"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 424 "HTMLCharacterReference.gperf" - {"Oscr;", "𝒪"}, - {""}, - {""}, - {""}, -#line 936 "HTMLCharacterReference.gperf" - {"cwconint;", "∲"}, - {""}, - {""}, - {""}, - {""}, -#line 722 "HTMLCharacterReference.gperf" - {"awconint;", "∳"}, -#line 345 "HTMLCharacterReference.gperf" - {"NestedLessLess;", "≪"}, -#line 769 "HTMLCharacterReference.gperf" - {"blk14;", "░"}, - {""}, - {""}, -#line 398 "HTMLCharacterReference.gperf" - {"NotTilde;", "≁"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Uacute", "Ú"}, +#line 570 "HTMLCharacterReference.gperf" + {"Uacute;", "Ú"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 425 "HTMLCharacterReference.gperf" + {"Oscr;", "𝒪"}, + {""}, + {""}, + {""}, +#line 937 "HTMLCharacterReference.gperf" + {"cwconint;", "∲"}, + {""}, + {""}, + {""}, + {""}, +#line 723 "HTMLCharacterReference.gperf" + {"awconint;", "∳"}, +#line 346 "HTMLCharacterReference.gperf" + {"NestedLessLess;", "≪"}, #line 770 "HTMLCharacterReference.gperf" - {"blk34;", "▓"}, - {""}, - {""}, - {""}, -#line 1654 "HTMLCharacterReference.gperf" - {"ogt;", "⧁"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2178 "HTMLCharacterReference.gperf" - {"vltri;", "⊲"}, - {""}, - {""}, - {""}, -#line 564 "HTMLCharacterReference.gperf" - {"Topf;", "𝕋"}, -#line 1950 "HTMLCharacterReference.gperf" - {"sqcap;", "⊓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1736 "HTMLCharacterReference.gperf" - {"pr;", "≺"}, - {""}, - {""}, - {""}, - {""}, -#line 316 "HTMLCharacterReference.gperf" - {"Longleftarrow;", "⟸"}, - {""}, -#line 768 "HTMLCharacterReference.gperf" - {"blk12;", "▒"}, -#line 1029 "HTMLCharacterReference.gperf" - {"elsdot;", "⪗"}, - {""}, - {""}, -#line 1320 "HTMLCharacterReference.gperf" - {"ldsh;", "↲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 888 "HTMLCharacterReference.gperf" - {"coloneq;", "≔"}, - {""}, -#line 443 "HTMLCharacterReference.gperf" - {"Popf;", "ℙ"}, - {""}, - {""}, - {""}, - {""}, -#line 1469 "HTMLCharacterReference.gperf" - {"nGtv;", "≫̸"}, - {""}, - {""}, -#line 911 "HTMLCharacterReference.gperf" - {"cudarrl;", "⤸"}, - {""}, -#line 2248 "HTMLCharacterReference.gperf" - {"zopf;", "𝕫"}, - {""}, -#line 2224 "HTMLCharacterReference.gperf" - {"xwedge;", "⋀"}, - {""}, - {""}, -#line 1873 "HTMLCharacterReference.gperf" - {"rtimes;", "⋊"}, -#line 1651 "HTMLCharacterReference.gperf" - {"ogon;", "˛"}, -#line 1760 "HTMLCharacterReference.gperf" - {"prsim;", "≾"}, - {""}, - {""}, -#line 1270 "HTMLCharacterReference.gperf" - {"kjcy;", "ќ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"blk14;", "░"}, + {""}, + {""}, +#line 399 "HTMLCharacterReference.gperf" + {"NotTilde;", "≁"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 771 "HTMLCharacterReference.gperf" + {"blk34;", "▓"}, + {""}, + {""}, + {""}, +#line 1655 "HTMLCharacterReference.gperf" + {"ogt;", "⧁"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2179 "HTMLCharacterReference.gperf" + {"vltri;", "⊲"}, + {""}, + {""}, + {""}, +#line 565 "HTMLCharacterReference.gperf" + {"Topf;", "𝕋"}, #line 1951 "HTMLCharacterReference.gperf" - {"sqcaps;", "⊓︀"}, - {""}, -#line 1887 "HTMLCharacterReference.gperf" - {"sce;", "⪰"}, -#line 86 "HTMLCharacterReference.gperf" - {"Congruent;", "≡"}, -#line 1427 "HTMLCharacterReference.gperf" - {"mDDot;", "∺"}, - {""}, -#line 761 "HTMLCharacterReference.gperf" - {"blacklozenge;", "⧫"}, -#line 1855 "HTMLCharacterReference.gperf" - {"roang;", "⟭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1076 "HTMLCharacterReference.gperf" - {"fflig;", "ff"}, - {""}, -#line 1555 "HTMLCharacterReference.gperf" - {"notinvc;", "⋶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1863 "HTMLCharacterReference.gperf" - {"rpargt;", "⦔"}, -#line 1758 "HTMLCharacterReference.gperf" - {"prop;", "∝"}, - {""}, - {""}, -#line 51 "HTMLCharacterReference.gperf" - {"Bcy;", "Б"}, - {""}, -#line 1881 "HTMLCharacterReference.gperf" - {"sbquo;", "‚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1738 "HTMLCharacterReference.gperf" - {"prap;", "⪷"}, - {""}, - {""}, - {""}, -#line 634 "HTMLCharacterReference.gperf" - {"YAcy;", "Я"}, - {""}, -#line 2160 "HTMLCharacterReference.gperf" - {"varrho;", "ϱ"}, - {""}, -#line 1903 "HTMLCharacterReference.gperf" - {"sect", "§"}, + {"sqcap;", "⊓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1737 "HTMLCharacterReference.gperf" + {"pr;", "≺"}, + {""}, + {""}, + {""}, + {""}, +#line 317 "HTMLCharacterReference.gperf" + {"Longleftarrow;", "⟸"}, + {""}, +#line 769 "HTMLCharacterReference.gperf" + {"blk12;", "▒"}, +#line 1030 "HTMLCharacterReference.gperf" + {"elsdot;", "⪗"}, + {""}, + {""}, +#line 1321 "HTMLCharacterReference.gperf" + {"ldsh;", "↲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 889 "HTMLCharacterReference.gperf" + {"coloneq;", "≔"}, + {""}, +#line 444 "HTMLCharacterReference.gperf" + {"Popf;", "ℙ"}, + {""}, + {""}, + {""}, + {""}, +#line 1470 "HTMLCharacterReference.gperf" + {"nGtv;", "≫̸"}, + {""}, + {""}, +#line 912 "HTMLCharacterReference.gperf" + {"cudarrl;", "⤸"}, + {""}, +#line 2249 "HTMLCharacterReference.gperf" + {"zopf;", "𝕫"}, + {""}, +#line 2225 "HTMLCharacterReference.gperf" + {"xwedge;", "⋀"}, + {""}, + {""}, +#line 1874 "HTMLCharacterReference.gperf" + {"rtimes;", "⋊"}, +#line 1652 "HTMLCharacterReference.gperf" + {"ogon;", "˛"}, +#line 1761 "HTMLCharacterReference.gperf" + {"prsim;", "≾"}, + {""}, + {""}, +#line 1271 "HTMLCharacterReference.gperf" + {"kjcy;", "ќ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1952 "HTMLCharacterReference.gperf" + {"sqcaps;", "⊓︀"}, + {""}, +#line 1888 "HTMLCharacterReference.gperf" + {"sce;", "⪰"}, +#line 87 "HTMLCharacterReference.gperf" + {"Congruent;", "≡"}, +#line 1428 "HTMLCharacterReference.gperf" + {"mDDot;", "∺"}, + {""}, +#line 762 "HTMLCharacterReference.gperf" + {"blacklozenge;", "⧫"}, +#line 1856 "HTMLCharacterReference.gperf" + {"roang;", "⟭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1077 "HTMLCharacterReference.gperf" + {"fflig;", "ff"}, + {""}, +#line 1556 "HTMLCharacterReference.gperf" + {"notinvc;", "⋶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1864 "HTMLCharacterReference.gperf" + {"rpargt;", "⦔"}, +#line 1759 "HTMLCharacterReference.gperf" + {"prop;", "∝"}, + {""}, + {""}, +#line 52 "HTMLCharacterReference.gperf" + {"Bcy;", "Б"}, + {""}, +#line 1882 "HTMLCharacterReference.gperf" + {"sbquo;", "‚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1739 "HTMLCharacterReference.gperf" + {"prap;", "⪷"}, + {""}, + {""}, + {""}, +#line 635 "HTMLCharacterReference.gperf" + {"YAcy;", "Я"}, + {""}, +#line 2161 "HTMLCharacterReference.gperf" + {"varrho;", "ϱ"}, + {""}, #line 1904 "HTMLCharacterReference.gperf" - {"sect;", "§"}, - {""}, - {""}, -#line 145 "HTMLCharacterReference.gperf" - {"DownTee;", "⊤"}, - {""}, -#line 1914 "HTMLCharacterReference.gperf" - {"shcy;", "ш"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1628 "HTMLCharacterReference.gperf" - {"nvrtrie;", "⊵⃒"}, -#line 538 "HTMLCharacterReference.gperf" - {"SucceedsTilde;", "≿"}, - {""}, -#line 1897 "HTMLCharacterReference.gperf" - {"sdotb;", "⊡"}, -#line 1942 "HTMLCharacterReference.gperf" - {"softcy;", "ь"}, - {""}, - {""}, - {""}, -#line 35 "HTMLCharacterReference.gperf" - {"Amacr;", "Ā"}, -#line 533 "HTMLCharacterReference.gperf" - {"Subset;", "⋐"}, - {""}, - {""}, -#line 622 "HTMLCharacterReference.gperf" - {"Vopf;", "𝕍"}, -#line 1861 "HTMLCharacterReference.gperf" - {"rotimes;", "⨵"}, - {""}, - {""}, - {""}, - {""}, -#line 1811 "HTMLCharacterReference.gperf" - {"rbrksld;", "⦎"}, -#line 1997 "HTMLCharacterReference.gperf" - {"succeq;", "⪰"}, -#line 2018 "HTMLCharacterReference.gperf" - {"suplarr;", "⥻"}, -#line 442 "HTMLCharacterReference.gperf" - {"Poincareplane;", "ℌ"}, -#line 944 "HTMLCharacterReference.gperf" - {"dash;", "‐"}, -#line 1199 "HTMLCharacterReference.gperf" - {"iacute", "í"}, -#line 1200 "HTMLCharacterReference.gperf" - {"iacute;", "í"}, - {""}, - {""}, - {""}, + {"sect", "§"}, +#line 1905 "HTMLCharacterReference.gperf" + {"sect;", "§"}, + {""}, + {""}, +#line 146 "HTMLCharacterReference.gperf" + {"DownTee;", "⊤"}, + {""}, +#line 1915 "HTMLCharacterReference.gperf" + {"shcy;", "ш"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1629 "HTMLCharacterReference.gperf" + {"nvrtrie;", "⊵⃒"}, +#line 539 "HTMLCharacterReference.gperf" + {"SucceedsTilde;", "≿"}, + {""}, +#line 1898 "HTMLCharacterReference.gperf" + {"sdotb;", "⊡"}, +#line 1943 "HTMLCharacterReference.gperf" + {"softcy;", "ь"}, + {""}, + {""}, + {""}, +#line 36 "HTMLCharacterReference.gperf" + {"Amacr;", "Ā"}, +#line 534 "HTMLCharacterReference.gperf" + {"Subset;", "⋐"}, + {""}, + {""}, +#line 623 "HTMLCharacterReference.gperf" + {"Vopf;", "𝕍"}, +#line 1862 "HTMLCharacterReference.gperf" + {"rotimes;", "⨵"}, + {""}, + {""}, + {""}, + {""}, +#line 1812 "HTMLCharacterReference.gperf" + {"rbrksld;", "⦎"}, +#line 1998 "HTMLCharacterReference.gperf" + {"succeq;", "⪰"}, +#line 2019 "HTMLCharacterReference.gperf" + {"suplarr;", "⥻"}, +#line 443 "HTMLCharacterReference.gperf" + {"Poincareplane;", "ℌ"}, #line 945 "HTMLCharacterReference.gperf" - {"dashv;", "⊣"}, - {""}, - {""}, -#line 734 "HTMLCharacterReference.gperf" - {"bbrktbrk;", "⎶"}, - {""}, -#line 1983 "HTMLCharacterReference.gperf" - {"subne;", "⊊"}, -#line 882 "HTMLCharacterReference.gperf" - {"cirmid;", "⫯"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1759 "HTMLCharacterReference.gperf" - {"propto;", "∝"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1531 "HTMLCharacterReference.gperf" - {"nlE;", "≦̸"}, - {""}, -#line 933 "HTMLCharacterReference.gperf" - {"curvearrowright;", "↷"}, - {""}, - {""}, - {""}, - {""}, -#line 637 "HTMLCharacterReference.gperf" - {"Yacute", "Ý"}, -#line 638 "HTMLCharacterReference.gperf" - {"Yacute;", "Ý"}, - {""}, -#line 1608 "HTMLCharacterReference.gperf" - {"ntriangleleft;", "⋪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1958 "HTMLCharacterReference.gperf" - {"sqsup;", "⊐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 536 "HTMLCharacterReference.gperf" - {"SucceedsEqual;", "⪰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 269 "HTMLCharacterReference.gperf" - {"Lacute;", "Ĺ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2234 "HTMLCharacterReference.gperf" - {"yopf;", "𝕪"}, - {""}, -#line 1160 "HTMLCharacterReference.gperf" - {"gtlPar;", "⦕"}, -#line 1917 "HTMLCharacterReference.gperf" - {"shy", "­"}, - {""}, - {""}, -#line 1263 "HTMLCharacterReference.gperf" - {"kappa;", "κ"}, - {""}, -#line 1867 "HTMLCharacterReference.gperf" - {"rscr;", "𝓇"}, + {"dash;", "‐"}, +#line 1200 "HTMLCharacterReference.gperf" + {"iacute", "í"}, +#line 1201 "HTMLCharacterReference.gperf" + {"iacute;", "í"}, + {""}, + {""}, + {""}, +#line 946 "HTMLCharacterReference.gperf" + {"dashv;", "⊣"}, + {""}, + {""}, +#line 735 "HTMLCharacterReference.gperf" + {"bbrktbrk;", "⎶"}, + {""}, +#line 1984 "HTMLCharacterReference.gperf" + {"subne;", "⊊"}, +#line 883 "HTMLCharacterReference.gperf" + {"cirmid;", "⫯"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1760 "HTMLCharacterReference.gperf" + {"propto;", "∝"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1532 "HTMLCharacterReference.gperf" + {"nlE;", "≦̸"}, + {""}, +#line 934 "HTMLCharacterReference.gperf" + {"curvearrowright;", "↷"}, + {""}, + {""}, + {""}, + {""}, +#line 638 "HTMLCharacterReference.gperf" + {"Yacute", "Ý"}, +#line 639 "HTMLCharacterReference.gperf" + {"Yacute;", "Ý"}, + {""}, +#line 1609 "HTMLCharacterReference.gperf" + {"ntriangleleft;", "⋪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1959 "HTMLCharacterReference.gperf" + {"sqsup;", "⊐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 537 "HTMLCharacterReference.gperf" + {"SucceedsEqual;", "⪰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 270 "HTMLCharacterReference.gperf" + {"Lacute;", "Ĺ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2235 "HTMLCharacterReference.gperf" + {"yopf;", "𝕪"}, + {""}, +#line 1161 "HTMLCharacterReference.gperf" + {"gtlPar;", "⦕"}, #line 1918 "HTMLCharacterReference.gperf" - {"shy;", "­"}, -#line 1327 "HTMLCharacterReference.gperf" - {"leftrightarrow;", "↔"}, + {"shy", "­"}, + {""}, + {""}, +#line 1264 "HTMLCharacterReference.gperf" + {"kappa;", "κ"}, + {""}, +#line 1868 "HTMLCharacterReference.gperf" + {"rscr;", "𝓇"}, +#line 1919 "HTMLCharacterReference.gperf" + {"shy;", "­"}, #line 1328 "HTMLCharacterReference.gperf" - {"leftrightarrows;", "⇆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 666 "HTMLCharacterReference.gperf" - {"aelig", "æ"}, + {"leftrightarrow;", "↔"}, +#line 1329 "HTMLCharacterReference.gperf" + {"leftrightarrows;", "⇆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 667 "HTMLCharacterReference.gperf" - {"aelig;", "æ"}, - {""}, - {""}, - {""}, -#line 1808 "HTMLCharacterReference.gperf" - {"rbrace;", "}"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1168 "HTMLCharacterReference.gperf" - {"gtrsim;", "≳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 977 "HTMLCharacterReference.gperf" - {"dollar;", "$"}, - {""}, -#line 1804 "HTMLCharacterReference.gperf" - {"ratio;", "∶"}, -#line 1740 "HTMLCharacterReference.gperf" - {"pre;", "⪯"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 473 "HTMLCharacterReference.gperf" - {"ReverseUpEquilibrium;", "⥯"}, - {""}, -#line 1554 "HTMLCharacterReference.gperf" - {"notinvb;", "⋷"}, - {""}, -#line 222 "HTMLCharacterReference.gperf" - {"IEcy;", "Е"}, -#line 1982 "HTMLCharacterReference.gperf" - {"subnE;", "⫋"}, -#line 567 "HTMLCharacterReference.gperf" - {"Tstrok;", "Ŧ"}, - {""}, - {""}, -#line 1445 "HTMLCharacterReference.gperf" - {"micro", "µ"}, + {"aelig", "æ"}, +#line 668 "HTMLCharacterReference.gperf" + {"aelig;", "æ"}, + {""}, + {""}, + {""}, +#line 1809 "HTMLCharacterReference.gperf" + {"rbrace;", "}"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1169 "HTMLCharacterReference.gperf" + {"gtrsim;", "≳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 978 "HTMLCharacterReference.gperf" + {"dollar;", "$"}, + {""}, +#line 1805 "HTMLCharacterReference.gperf" + {"ratio;", "∶"}, +#line 1741 "HTMLCharacterReference.gperf" + {"pre;", "⪯"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 474 "HTMLCharacterReference.gperf" + {"ReverseUpEquilibrium;", "⥯"}, + {""}, +#line 1555 "HTMLCharacterReference.gperf" + {"notinvb;", "⋷"}, + {""}, +#line 223 "HTMLCharacterReference.gperf" + {"IEcy;", "Е"}, +#line 1983 "HTMLCharacterReference.gperf" + {"subnE;", "⫋"}, +#line 568 "HTMLCharacterReference.gperf" + {"Tstrok;", "Ŧ"}, + {""}, + {""}, #line 1446 "HTMLCharacterReference.gperf" - {"micro;", "µ"}, - {""}, - {""}, - {""}, -#line 1610 "HTMLCharacterReference.gperf" - {"ntriangleright;", "⋫"}, - {""}, + {"micro", "µ"}, +#line 1447 "HTMLCharacterReference.gperf" + {"micro;", "µ"}, + {""}, + {""}, + {""}, #line 1611 "HTMLCharacterReference.gperf" - {"ntrianglerighteq;", "⋭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1891 "HTMLCharacterReference.gperf" - {"scnap;", "⪺"}, - {""}, -#line 1791 "HTMLCharacterReference.gperf" - {"rarr;", "→"}, - {""}, - {""}, - {""}, -#line 1448 "HTMLCharacterReference.gperf" - {"midast;", "*"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1456 "HTMLCharacterReference.gperf" - {"mlcp;", "⫛"}, - {""}, -#line 1195 "HTMLCharacterReference.gperf" - {"hslash;", "ℏ"}, - {""}, - {""}, - {""}, -#line 368 "HTMLCharacterReference.gperf" - {"NotLeftTriangle;", "⋪"}, - {""}, - {""}, + {"ntriangleright;", "⋫"}, + {""}, +#line 1612 "HTMLCharacterReference.gperf" + {"ntrianglerighteq;", "⋭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1892 "HTMLCharacterReference.gperf" + {"scnap;", "⪺"}, + {""}, +#line 1792 "HTMLCharacterReference.gperf" + {"rarr;", "→"}, + {""}, + {""}, + {""}, +#line 1449 "HTMLCharacterReference.gperf" + {"midast;", "*"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1457 "HTMLCharacterReference.gperf" + {"mlcp;", "⫛"}, + {""}, +#line 1196 "HTMLCharacterReference.gperf" + {"hslash;", "ℏ"}, + {""}, + {""}, + {""}, #line 369 "HTMLCharacterReference.gperf" - {"NotLeftTriangleBar;", "⧏̸"}, - {""}, + {"NotLeftTriangle;", "⋪"}, + {""}, + {""}, #line 370 "HTMLCharacterReference.gperf" - {"NotLeftTriangleEqual;", "⋬"}, -#line 1362 "HTMLCharacterReference.gperf" - {"llhard;", "⥫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 300 "HTMLCharacterReference.gperf" - {"LeftVectorBar;", "⥒"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1801 "HTMLCharacterReference.gperf" - {"rarrtl;", "↣"}, -#line 415 "HTMLCharacterReference.gperf" - {"Ograve", "Ò"}, + {"NotLeftTriangleBar;", "⧏̸"}, + {""}, +#line 371 "HTMLCharacterReference.gperf" + {"NotLeftTriangleEqual;", "⋬"}, +#line 1363 "HTMLCharacterReference.gperf" + {"llhard;", "⥫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 301 "HTMLCharacterReference.gperf" + {"LeftVectorBar;", "⥒"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1802 "HTMLCharacterReference.gperf" + {"rarrtl;", "↣"}, #line 416 "HTMLCharacterReference.gperf" - {"Ograve;", "Ò"}, -#line 1329 "HTMLCharacterReference.gperf" - {"leftrightharpoons;", "⇋"}, - {""}, -#line 1709 "HTMLCharacterReference.gperf" - {"pfr;", "𝔭"}, -#line 877 "HTMLCharacterReference.gperf" - {"circledast;", "⊛"}, -#line 1616 "HTMLCharacterReference.gperf" - {"nvDash;", "⊭"}, - {""}, - {""}, -#line 1460 "HTMLCharacterReference.gperf" - {"mopf;", "𝕞"}, - {""}, -#line 328 "HTMLCharacterReference.gperf" - {"MediumSpace;", " "}, -#line 1691 "HTMLCharacterReference.gperf" - {"otimes;", "⊗"}, - {""}, -#line 1527 "HTMLCharacterReference.gperf" - {"nisd;", "⋺"}, - {""}, - {""}, -#line 1984 "HTMLCharacterReference.gperf" - {"subplus;", "⪿"}, -#line 1323 "HTMLCharacterReference.gperf" - {"leftarrowtail;", "↢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1807 "HTMLCharacterReference.gperf" - {"rbbrk;", "❳"}, -#line 264 "HTMLCharacterReference.gperf" - {"Kopf;", "𝕂"}, - {""}, - {""}, - {""}, - {""}, -#line 1813 "HTMLCharacterReference.gperf" - {"rcaron;", "ř"}, -#line 171 "HTMLCharacterReference.gperf" - {"EqualTilde;", "≂"}, - {""}, -#line 739 "HTMLCharacterReference.gperf" - {"because;", "∵"}, - {""}, - {""}, -#line 1609 "HTMLCharacterReference.gperf" - {"ntrianglelefteq;", "⋬"}, - {""}, - {""}, - {""}, - {""}, -#line 2136 "HTMLCharacterReference.gperf" - {"urcrop;", "⌎"}, -#line 1911 "HTMLCharacterReference.gperf" - {"sfrown;", "⌢"}, - {""}, - {""}, - {""}, -#line 1166 "HTMLCharacterReference.gperf" - {"gtreqqless;", "⪌"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 381 "HTMLCharacterReference.gperf" - {"NotPrecedesSlantEqual;", "⋠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2015 "HTMLCharacterReference.gperf" - {"supedot;", "⫄"}, - {""}, -#line 1799 "HTMLCharacterReference.gperf" - {"rarrpl;", "⥅"}, -#line 2134 "HTMLCharacterReference.gperf" - {"urcorn;", "⌝"}, - {""}, - {""}, - {""}, -#line 2233 "HTMLCharacterReference.gperf" - {"yicy;", "ї"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1646 "HTMLCharacterReference.gperf" - {"odot;", "⊙"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2065 "HTMLCharacterReference.gperf" - {"tint;", "∭"}, -#line 1741 "HTMLCharacterReference.gperf" - {"prec;", "≺"}, - {""}, - {""}, - {""}, -#line 2106 "HTMLCharacterReference.gperf" - {"udarr;", "⇅"}, - {""}, -#line 1578 "HTMLCharacterReference.gperf" - {"nsccue;", "⋡"}, -#line 1297 "HTMLCharacterReference.gperf" - {"larrsim;", "⥳"}, - {""}, -#line 1798 "HTMLCharacterReference.gperf" - {"rarrlp;", "↬"}, - {""}, - {""}, -#line 926 "HTMLCharacterReference.gperf" - {"curlyeqprec;", "⋞"}, - {""}, - {""}, - {""}, -#line 508 "HTMLCharacterReference.gperf" - {"Sacute;", "Ś"}, -#line 1761 "HTMLCharacterReference.gperf" - {"prurel;", "⊰"}, -#line 2139 "HTMLCharacterReference.gperf" - {"uscr;", "𝓊"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 348 "HTMLCharacterReference.gperf" - {"NoBreak;", "⁠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1544 "HTMLCharacterReference.gperf" - {"nltri;", "⋪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1960 "HTMLCharacterReference.gperf" - {"sqsupset;", "⊐"}, + {"Ograve", "Ò"}, +#line 417 "HTMLCharacterReference.gperf" + {"Ograve;", "Ò"}, +#line 1330 "HTMLCharacterReference.gperf" + {"leftrightharpoons;", "⇋"}, + {""}, +#line 1710 "HTMLCharacterReference.gperf" + {"pfr;", "𝔭"}, +#line 878 "HTMLCharacterReference.gperf" + {"circledast;", "⊛"}, +#line 1617 "HTMLCharacterReference.gperf" + {"nvDash;", "⊭"}, + {""}, + {""}, +#line 1461 "HTMLCharacterReference.gperf" + {"mopf;", "𝕞"}, + {""}, +#line 329 "HTMLCharacterReference.gperf" + {"MediumSpace;", " "}, #line 1692 "HTMLCharacterReference.gperf" - {"otimesas;", "⨶"}, + {"otimes;", "⊗"}, + {""}, +#line 1528 "HTMLCharacterReference.gperf" + {"nisd;", "⋺"}, + {""}, + {""}, +#line 1985 "HTMLCharacterReference.gperf" + {"subplus;", "⪿"}, +#line 1324 "HTMLCharacterReference.gperf" + {"leftarrowtail;", "↢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1808 "HTMLCharacterReference.gperf" + {"rbbrk;", "❳"}, +#line 265 "HTMLCharacterReference.gperf" + {"Kopf;", "𝕂"}, + {""}, + {""}, + {""}, + {""}, +#line 1814 "HTMLCharacterReference.gperf" + {"rcaron;", "ř"}, +#line 172 "HTMLCharacterReference.gperf" + {"EqualTilde;", "≂"}, + {""}, +#line 740 "HTMLCharacterReference.gperf" + {"because;", "∵"}, + {""}, + {""}, +#line 1610 "HTMLCharacterReference.gperf" + {"ntrianglelefteq;", "⋬"}, + {""}, + {""}, + {""}, + {""}, +#line 2137 "HTMLCharacterReference.gperf" + {"urcrop;", "⌎"}, +#line 1912 "HTMLCharacterReference.gperf" + {"sfrown;", "⌢"}, + {""}, + {""}, + {""}, +#line 1167 "HTMLCharacterReference.gperf" + {"gtreqqless;", "⪌"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 382 "HTMLCharacterReference.gperf" + {"NotPrecedesSlantEqual;", "⋠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2016 "HTMLCharacterReference.gperf" + {"supedot;", "⫄"}, + {""}, +#line 1800 "HTMLCharacterReference.gperf" + {"rarrpl;", "⥅"}, +#line 2135 "HTMLCharacterReference.gperf" + {"urcorn;", "⌝"}, + {""}, + {""}, + {""}, +#line 2234 "HTMLCharacterReference.gperf" + {"yicy;", "ї"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1647 "HTMLCharacterReference.gperf" + {"odot;", "⊙"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2066 "HTMLCharacterReference.gperf" + {"tint;", "∭"}, +#line 1742 "HTMLCharacterReference.gperf" + {"prec;", "≺"}, + {""}, + {""}, + {""}, +#line 2107 "HTMLCharacterReference.gperf" + {"udarr;", "⇅"}, + {""}, +#line 1579 "HTMLCharacterReference.gperf" + {"nsccue;", "⋡"}, +#line 1298 "HTMLCharacterReference.gperf" + {"larrsim;", "⥳"}, + {""}, +#line 1799 "HTMLCharacterReference.gperf" + {"rarrlp;", "↬"}, + {""}, + {""}, +#line 927 "HTMLCharacterReference.gperf" + {"curlyeqprec;", "⋞"}, + {""}, + {""}, + {""}, +#line 509 "HTMLCharacterReference.gperf" + {"Sacute;", "Ś"}, +#line 1762 "HTMLCharacterReference.gperf" + {"prurel;", "⊰"}, +#line 2140 "HTMLCharacterReference.gperf" + {"uscr;", "𝓊"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 349 "HTMLCharacterReference.gperf" + {"NoBreak;", "⁠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1545 "HTMLCharacterReference.gperf" + {"nltri;", "⋪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1961 "HTMLCharacterReference.gperf" - {"sqsupseteq;", "⊒"}, -#line 1713 "HTMLCharacterReference.gperf" - {"phone;", "☎"}, - {""}, -#line 1857 "HTMLCharacterReference.gperf" - {"robrk;", "⟧"}, - {""}, -#line 1638 "HTMLCharacterReference.gperf" - {"oast;", "⊛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1752 "HTMLCharacterReference.gperf" - {"prnap;", "⪹"}, - {""}, - {""}, - {""}, -#line 225 "HTMLCharacterReference.gperf" - {"Iacute", "Í"}, + {"sqsupset;", "⊐"}, +#line 1693 "HTMLCharacterReference.gperf" + {"otimesas;", "⨶"}, +#line 1962 "HTMLCharacterReference.gperf" + {"sqsupseteq;", "⊒"}, +#line 1714 "HTMLCharacterReference.gperf" + {"phone;", "☎"}, + {""}, +#line 1858 "HTMLCharacterReference.gperf" + {"robrk;", "⟧"}, + {""}, +#line 1639 "HTMLCharacterReference.gperf" + {"oast;", "⊛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1753 "HTMLCharacterReference.gperf" + {"prnap;", "⪹"}, + {""}, + {""}, + {""}, #line 226 "HTMLCharacterReference.gperf" - {"Iacute;", "Í"}, - {""}, - {""}, -#line 302 "HTMLCharacterReference.gperf" - {"Leftrightarrow;", "⇔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 749 "HTMLCharacterReference.gperf" - {"bigcup;", "⋃"}, - {""}, -#line 1130 "HTMLCharacterReference.gperf" - {"gesdotol;", "⪄"}, - {""}, -#line 103 "HTMLCharacterReference.gperf" - {"Dashv;", "⫤"}, - {""}, -#line 2247 "HTMLCharacterReference.gperf" - {"zigrarr;", "⇝"}, - {""}, -#line 1624 "HTMLCharacterReference.gperf" - {"nvle;", "≤⃒"}, -#line 2074 "HTMLCharacterReference.gperf" - {"trade;", "™"}, -#line 1479 "HTMLCharacterReference.gperf" - {"nacute;", "ń"}, - {""}, -#line 698 "HTMLCharacterReference.gperf" - {"angrtvbd;", "⦝"}, - {""}, - {""}, -#line 726 "HTMLCharacterReference.gperf" - {"backepsilon;", "϶"}, - {""}, -#line 125 "HTMLCharacterReference.gperf" - {"DoubleLeftTee;", "⫤"}, - {""}, - {""}, - {""}, - {""}, -#line 2100 "HTMLCharacterReference.gperf" - {"uarr;", "↑"}, - {""}, -#line 1685 "HTMLCharacterReference.gperf" - {"oscr;", "ℴ"}, - {""}, -#line 927 "HTMLCharacterReference.gperf" - {"curlyeqsucc;", "⋟"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1795 "HTMLCharacterReference.gperf" - {"rarrc;", "⤳"}, -#line 373 "HTMLCharacterReference.gperf" - {"NotLessGreater;", "≸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 879 "HTMLCharacterReference.gperf" - {"circleddash;", "⊝"}, - {""}, - {""}, - {""}, - {""}, -#line 646 "HTMLCharacterReference.gperf" - {"Zacute;", "Ź"}, - {""}, - {""}, - {""}, -#line 956 "HTMLCharacterReference.gperf" - {"delta;", "δ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 296 "HTMLCharacterReference.gperf" - {"LeftUpTeeVector;", "⥠"}, - {""}, - {""}, - {""}, - {""}, -#line 1954 "HTMLCharacterReference.gperf" - {"sqsub;", "⊏"}, - {""}, - {""}, - {""}, - {""}, -#line 298 "HTMLCharacterReference.gperf" - {"LeftUpVectorBar;", "⥘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 320 "HTMLCharacterReference.gperf" - {"LowerLeftArrow;", "↙"}, - {""}, - {""}, - {""}, -#line 1999 "HTMLCharacterReference.gperf" - {"succneqq;", "⪶"}, -#line 587 "HTMLCharacterReference.gperf" - {"UnionPlus;", "⊎"}, - {""}, - {""}, -#line 1827 "HTMLCharacterReference.gperf" - {"rect;", "▭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 121 "HTMLCharacterReference.gperf" - {"DoubleDot;", "¨"}, -#line 1224 "HTMLCharacterReference.gperf" - {"imped;", "Ƶ"}, - {""}, -#line 1177 "HTMLCharacterReference.gperf" - {"harrcir;", "⥈"}, - {""}, - {""}, - {""}, - {""}, -#line 1764 "HTMLCharacterReference.gperf" - {"puncsp;", " "}, - {""}, -#line 56 "HTMLCharacterReference.gperf" - {"Bopf;", "𝔹"}, - {""}, - {""}, -#line 951 "HTMLCharacterReference.gperf" - {"ddagger;", "‡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 266 "HTMLCharacterReference.gperf" - {"LJcy;", "Љ"}, - {""}, - {""}, - {""}, - {""}, -#line 89 "HTMLCharacterReference.gperf" - {"Copf;", "ℂ"}, -#line 1080 "HTMLCharacterReference.gperf" - {"fjlig;", "fj"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1186 "HTMLCharacterReference.gperf" - {"hksearow;", "⤥"}, -#line 353 "HTMLCharacterReference.gperf" - {"NotCupCap;", "≭"}, - {""}, -#line 463 "HTMLCharacterReference.gperf" - {"Racute;", "Ŕ"}, - {""}, - {""}, - {""}, -#line 1707 "HTMLCharacterReference.gperf" - {"perp;", "⊥"}, - {""}, - {""}, -#line 1870 "HTMLCharacterReference.gperf" - {"rsquo;", "’"}, -#line 1871 "HTMLCharacterReference.gperf" - {"rsquor;", "’"}, - {""}, - {""}, - {""}, - {""}, -#line 287 "HTMLCharacterReference.gperf" - {"LeftRightArrow;", "↔"}, -#line 153 "HTMLCharacterReference.gperf" - {"Eacute", "É"}, -#line 154 "HTMLCharacterReference.gperf" - {"Eacute;", "É"}, - {""}, - {""}, - {""}, - {""}, -#line 1675 "HTMLCharacterReference.gperf" - {"order;", "ℴ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1979 "HTMLCharacterReference.gperf" - {"sube;", "⊆"}, - {""}, -#line 1434 "HTMLCharacterReference.gperf" - {"mapsto;", "↦"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2135 "HTMLCharacterReference.gperf" - {"urcorner;", "⌝"}, -#line 1266 "HTMLCharacterReference.gperf" - {"kcy;", "к"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1043 "HTMLCharacterReference.gperf" - {"eplus;", "⩱"}, - {""}, - {""}, -#line 1922 "HTMLCharacterReference.gperf" - {"sim;", "∼"}, - {""}, -#line 741 "HTMLCharacterReference.gperf" - {"bepsi;", "϶"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2069 "HTMLCharacterReference.gperf" - {"topcir;", "⫱"}, - {""}, -#line 1378 "HTMLCharacterReference.gperf" - {"longleftrightarrow;", "⟷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 701 "HTMLCharacterReference.gperf" - {"angzarr;", "⍼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 946 "HTMLCharacterReference.gperf" - {"dbkarow;", "⤏"}, -#line 1815 "HTMLCharacterReference.gperf" - {"rceil;", "⌉"}, - {""}, - {""}, -#line 1476 "HTMLCharacterReference.gperf" - {"nVDash;", "⊯"}, - {""}, - {""}, - {""}, -#line 1972 "HTMLCharacterReference.gperf" - {"starf;", "★"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2147 "HTMLCharacterReference.gperf" - {"uwangle;", "⦧"}, - {""}, - {""}, - {""}, -#line 784 "HTMLCharacterReference.gperf" - {"boxHD;", "╦"}, - {""}, -#line 1744 "HTMLCharacterReference.gperf" - {"preceq;", "⪯"}, - {""}, -#line 1928 "HTMLCharacterReference.gperf" - {"siml;", "⪝"}, - {""}, -#line 1649 "HTMLCharacterReference.gperf" - {"ofcir;", "⦿"}, - {""}, -#line 447 "HTMLCharacterReference.gperf" - {"PrecedesSlantEqual;", "≼"}, -#line 81 "HTMLCharacterReference.gperf" - {"ClockwiseContourIntegral;", "∲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 97 "HTMLCharacterReference.gperf" - {"DDotrahd;", "⤑"}, -#line 1482 "HTMLCharacterReference.gperf" - {"napE;", "⩰̸"}, -#line 1217 "HTMLCharacterReference.gperf" - {"ijlig;", "ij"}, - {""}, - {""}, - {""}, -#line 1581 "HTMLCharacterReference.gperf" - {"nshortmid;", "∤"}, - {""}, -#line 878 "HTMLCharacterReference.gperf" - {"circledcirc;", "⊚"}, - {""}, - {""}, - {""}, -#line 806 "HTMLCharacterReference.gperf" - {"boxhU;", "╨"}, - {""}, - {""}, - {""}, + {"Iacute", "Í"}, +#line 227 "HTMLCharacterReference.gperf" + {"Iacute;", "Í"}, + {""}, + {""}, +#line 303 "HTMLCharacterReference.gperf" + {"Leftrightarrow;", "⇔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 750 "HTMLCharacterReference.gperf" + {"bigcup;", "⋃"}, + {""}, +#line 1131 "HTMLCharacterReference.gperf" + {"gesdotol;", "⪄"}, + {""}, +#line 104 "HTMLCharacterReference.gperf" + {"Dashv;", "⫤"}, + {""}, +#line 2248 "HTMLCharacterReference.gperf" + {"zigrarr;", "⇝"}, + {""}, +#line 1625 "HTMLCharacterReference.gperf" + {"nvle;", "≤⃒"}, +#line 2075 "HTMLCharacterReference.gperf" + {"trade;", "™"}, +#line 1480 "HTMLCharacterReference.gperf" + {"nacute;", "ń"}, + {""}, +#line 699 "HTMLCharacterReference.gperf" + {"angrtvbd;", "⦝"}, + {""}, + {""}, +#line 727 "HTMLCharacterReference.gperf" + {"backepsilon;", "϶"}, + {""}, +#line 126 "HTMLCharacterReference.gperf" + {"DoubleLeftTee;", "⫤"}, + {""}, + {""}, + {""}, + {""}, +#line 2101 "HTMLCharacterReference.gperf" + {"uarr;", "↑"}, + {""}, +#line 1686 "HTMLCharacterReference.gperf" + {"oscr;", "ℴ"}, + {""}, +#line 928 "HTMLCharacterReference.gperf" + {"curlyeqsucc;", "⋟"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1796 "HTMLCharacterReference.gperf" + {"rarrc;", "⤳"}, +#line 374 "HTMLCharacterReference.gperf" + {"NotLessGreater;", "≸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 880 "HTMLCharacterReference.gperf" + {"circleddash;", "⊝"}, + {""}, + {""}, + {""}, + {""}, +#line 647 "HTMLCharacterReference.gperf" + {"Zacute;", "Ź"}, + {""}, + {""}, + {""}, +#line 957 "HTMLCharacterReference.gperf" + {"delta;", "δ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 297 "HTMLCharacterReference.gperf" + {"LeftUpTeeVector;", "⥠"}, + {""}, + {""}, + {""}, + {""}, +#line 1955 "HTMLCharacterReference.gperf" + {"sqsub;", "⊏"}, + {""}, + {""}, + {""}, + {""}, +#line 299 "HTMLCharacterReference.gperf" + {"LeftUpVectorBar;", "⥘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 321 "HTMLCharacterReference.gperf" + {"LowerLeftArrow;", "↙"}, + {""}, + {""}, + {""}, +#line 2000 "HTMLCharacterReference.gperf" + {"succneqq;", "⪶"}, +#line 588 "HTMLCharacterReference.gperf" + {"UnionPlus;", "⊎"}, + {""}, + {""}, +#line 1828 "HTMLCharacterReference.gperf" + {"rect;", "▭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 122 "HTMLCharacterReference.gperf" + {"DoubleDot;", "¨"}, +#line 1225 "HTMLCharacterReference.gperf" + {"imped;", "Ƶ"}, + {""}, +#line 1178 "HTMLCharacterReference.gperf" + {"harrcir;", "⥈"}, + {""}, + {""}, + {""}, + {""}, +#line 1765 "HTMLCharacterReference.gperf" + {"puncsp;", " "}, + {""}, +#line 57 "HTMLCharacterReference.gperf" + {"Bopf;", "𝔹"}, + {""}, + {""}, +#line 952 "HTMLCharacterReference.gperf" + {"ddagger;", "‡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 267 "HTMLCharacterReference.gperf" + {"LJcy;", "Љ"}, + {""}, + {""}, + {""}, + {""}, +#line 90 "HTMLCharacterReference.gperf" + {"Copf;", "ℂ"}, +#line 1081 "HTMLCharacterReference.gperf" + {"fjlig;", "fj"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1187 "HTMLCharacterReference.gperf" + {"hksearow;", "⤥"}, +#line 354 "HTMLCharacterReference.gperf" + {"NotCupCap;", "≭"}, + {""}, +#line 464 "HTMLCharacterReference.gperf" + {"Racute;", "Ŕ"}, + {""}, + {""}, + {""}, +#line 1708 "HTMLCharacterReference.gperf" + {"perp;", "⊥"}, + {""}, + {""}, +#line 1871 "HTMLCharacterReference.gperf" + {"rsquo;", "’"}, +#line 1872 "HTMLCharacterReference.gperf" + {"rsquor;", "’"}, + {""}, + {""}, + {""}, + {""}, +#line 288 "HTMLCharacterReference.gperf" + {"LeftRightArrow;", "↔"}, +#line 154 "HTMLCharacterReference.gperf" + {"Eacute", "É"}, +#line 155 "HTMLCharacterReference.gperf" + {"Eacute;", "É"}, + {""}, + {""}, + {""}, + {""}, +#line 1676 "HTMLCharacterReference.gperf" + {"order;", "ℴ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1980 "HTMLCharacterReference.gperf" + {"sube;", "⊆"}, + {""}, +#line 1435 "HTMLCharacterReference.gperf" + {"mapsto;", "↦"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2136 "HTMLCharacterReference.gperf" + {"urcorner;", "⌝"}, +#line 1267 "HTMLCharacterReference.gperf" + {"kcy;", "к"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1044 "HTMLCharacterReference.gperf" + {"eplus;", "⩱"}, + {""}, + {""}, +#line 1923 "HTMLCharacterReference.gperf" + {"sim;", "∼"}, + {""}, +#line 742 "HTMLCharacterReference.gperf" + {"bepsi;", "϶"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2070 "HTMLCharacterReference.gperf" + {"topcir;", "⫱"}, + {""}, +#line 1379 "HTMLCharacterReference.gperf" + {"longleftrightarrow;", "⟷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 702 "HTMLCharacterReference.gperf" + {"angzarr;", "⍼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 947 "HTMLCharacterReference.gperf" + {"dbkarow;", "⤏"}, +#line 1816 "HTMLCharacterReference.gperf" + {"rceil;", "⌉"}, + {""}, + {""}, +#line 1477 "HTMLCharacterReference.gperf" + {"nVDash;", "⊯"}, + {""}, + {""}, + {""}, +#line 1973 "HTMLCharacterReference.gperf" + {"starf;", "★"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2148 "HTMLCharacterReference.gperf" + {"uwangle;", "⦧"}, + {""}, + {""}, + {""}, +#line 785 "HTMLCharacterReference.gperf" + {"boxHD;", "╦"}, + {""}, +#line 1745 "HTMLCharacterReference.gperf" + {"preceq;", "⪯"}, + {""}, +#line 1929 "HTMLCharacterReference.gperf" + {"siml;", "⪝"}, + {""}, +#line 1650 "HTMLCharacterReference.gperf" + {"ofcir;", "⦿"}, + {""}, +#line 448 "HTMLCharacterReference.gperf" + {"PrecedesSlantEqual;", "≼"}, +#line 82 "HTMLCharacterReference.gperf" + {"ClockwiseContourIntegral;", "∲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 98 "HTMLCharacterReference.gperf" - {"DJcy;", "Ђ"}, -#line 122 "HTMLCharacterReference.gperf" - {"DoubleDownArrow;", "⇓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2153 "HTMLCharacterReference.gperf" - {"varepsilon;", "ϵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2168 "HTMLCharacterReference.gperf" - {"vartriangleright;", "⊳"}, - {""}, -#line 1793 "HTMLCharacterReference.gperf" - {"rarrb;", "⇥"}, - {""}, -#line 1933 "HTMLCharacterReference.gperf" - {"slarr;", "←"}, - {""}, -#line 1055 "HTMLCharacterReference.gperf" - {"equivDD;", "⩸"}, - {""}, -#line 2115 "HTMLCharacterReference.gperf" - {"uhblk;", "▀"}, -#line 2102 "HTMLCharacterReference.gperf" - {"ubreve;", "ŭ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1647 "HTMLCharacterReference.gperf" - {"odsold;", "⦼"}, - {""}, - {""}, - {""}, -#line 336 "HTMLCharacterReference.gperf" - {"Nacute;", "Ń"}, - {""}, -#line 1915 "HTMLCharacterReference.gperf" - {"shortmid;", "∣"}, - {""}, - {""}, - {""}, - {""}, -#line 1141 "HTMLCharacterReference.gperf" - {"glj;", "⪤"}, -#line 204 "HTMLCharacterReference.gperf" - {"GreaterGreater;", "⪢"}, -#line 547 "HTMLCharacterReference.gperf" - {"TRADE;", "™"}, -#line 1959 "HTMLCharacterReference.gperf" - {"sqsupe;", "⊒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2111 "HTMLCharacterReference.gperf" - {"ugrave", "ù"}, + {"DDotrahd;", "⤑"}, +#line 1483 "HTMLCharacterReference.gperf" + {"napE;", "⩰̸"}, +#line 1218 "HTMLCharacterReference.gperf" + {"ijlig;", "ij"}, + {""}, + {""}, + {""}, +#line 1582 "HTMLCharacterReference.gperf" + {"nshortmid;", "∤"}, + {""}, +#line 879 "HTMLCharacterReference.gperf" + {"circledcirc;", "⊚"}, + {""}, + {""}, + {""}, +#line 807 "HTMLCharacterReference.gperf" + {"boxhU;", "╨"}, + {""}, + {""}, + {""}, +#line 99 "HTMLCharacterReference.gperf" + {"DJcy;", "Ђ"}, +#line 123 "HTMLCharacterReference.gperf" + {"DoubleDownArrow;", "⇓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2154 "HTMLCharacterReference.gperf" + {"varepsilon;", "ϵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2169 "HTMLCharacterReference.gperf" + {"vartriangleright;", "⊳"}, + {""}, +#line 1794 "HTMLCharacterReference.gperf" + {"rarrb;", "⇥"}, + {""}, +#line 1934 "HTMLCharacterReference.gperf" + {"slarr;", "←"}, + {""}, +#line 1056 "HTMLCharacterReference.gperf" + {"equivDD;", "⩸"}, + {""}, +#line 2116 "HTMLCharacterReference.gperf" + {"uhblk;", "▀"}, +#line 2103 "HTMLCharacterReference.gperf" + {"ubreve;", "ŭ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1648 "HTMLCharacterReference.gperf" + {"odsold;", "⦼"}, + {""}, + {""}, + {""}, +#line 337 "HTMLCharacterReference.gperf" + {"Nacute;", "Ń"}, + {""}, +#line 1916 "HTMLCharacterReference.gperf" + {"shortmid;", "∣"}, + {""}, + {""}, + {""}, + {""}, +#line 1142 "HTMLCharacterReference.gperf" + {"glj;", "⪤"}, +#line 205 "HTMLCharacterReference.gperf" + {"GreaterGreater;", "⪢"}, +#line 548 "HTMLCharacterReference.gperf" + {"TRADE;", "™"}, +#line 1960 "HTMLCharacterReference.gperf" + {"sqsupe;", "⊒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2112 "HTMLCharacterReference.gperf" - {"ugrave;", "ù"}, - {""}, - {""}, - {""}, - {""}, -#line 2055 "HTMLCharacterReference.gperf" - {"thkap;", "≈"}, - {""}, - {""}, - {""}, -#line 1540 "HTMLCharacterReference.gperf" - {"nles;", "⩽̸"}, -#line 427 "HTMLCharacterReference.gperf" - {"Otilde", "Õ"}, + {"ugrave", "ù"}, +#line 2113 "HTMLCharacterReference.gperf" + {"ugrave;", "ù"}, + {""}, + {""}, + {""}, + {""}, +#line 2056 "HTMLCharacterReference.gperf" + {"thkap;", "≈"}, + {""}, + {""}, + {""}, +#line 1541 "HTMLCharacterReference.gperf" + {"nles;", "⩽̸"}, #line 428 "HTMLCharacterReference.gperf" - {"Otilde;", "Õ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1705 "HTMLCharacterReference.gperf" - {"period;", "."}, - {""}, -#line 2133 "HTMLCharacterReference.gperf" - {"upuparrows;", "⇈"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 25 "HTMLCharacterReference.gperf" - {"Aacute", "Á"}, + {"Otilde", "Õ"}, +#line 429 "HTMLCharacterReference.gperf" + {"Otilde;", "Õ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1706 "HTMLCharacterReference.gperf" + {"period;", "."}, + {""}, +#line 2134 "HTMLCharacterReference.gperf" + {"upuparrows;", "⇈"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 26 "HTMLCharacterReference.gperf" - {"Aacute;", "Á"}, - {""}, -#line 1956 "HTMLCharacterReference.gperf" - {"sqsubset;", "⊏"}, -#line 2003 "HTMLCharacterReference.gperf" - {"sung;", "♪"}, + {"Aacute", "Á"}, +#line 27 "HTMLCharacterReference.gperf" + {"Aacute;", "Á"}, + {""}, #line 1957 "HTMLCharacterReference.gperf" - {"sqsubseteq;", "⊑"}, - {""}, - {""}, - {""}, -#line 1330 "HTMLCharacterReference.gperf" - {"leftrightsquigarrow;", "↭"}, -#line 1889 "HTMLCharacterReference.gperf" - {"scirc;", "ŝ"}, -#line 929 "HTMLCharacterReference.gperf" - {"curlywedge;", "⋏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1365 "HTMLCharacterReference.gperf" - {"lmoust;", "⎰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1437 "HTMLCharacterReference.gperf" - {"mapstoup;", "↥"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1763 "HTMLCharacterReference.gperf" - {"psi;", "ψ"}, -#line 84 "HTMLCharacterReference.gperf" - {"Colon;", "∷"}, -#line 303 "HTMLCharacterReference.gperf" - {"LessEqualGreater;", "⋚"}, - {""}, - {""}, - {""}, - {""}, -#line 1652 "HTMLCharacterReference.gperf" - {"ograve", "ò"}, + {"sqsubset;", "⊏"}, +#line 2004 "HTMLCharacterReference.gperf" + {"sung;", "♪"}, +#line 1958 "HTMLCharacterReference.gperf" + {"sqsubseteq;", "⊑"}, + {""}, + {""}, + {""}, +#line 1331 "HTMLCharacterReference.gperf" + {"leftrightsquigarrow;", "↭"}, +#line 1890 "HTMLCharacterReference.gperf" + {"scirc;", "ŝ"}, +#line 930 "HTMLCharacterReference.gperf" + {"curlywedge;", "⋏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1366 "HTMLCharacterReference.gperf" + {"lmoust;", "⎰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1438 "HTMLCharacterReference.gperf" + {"mapstoup;", "↥"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1764 "HTMLCharacterReference.gperf" + {"psi;", "ψ"}, +#line 85 "HTMLCharacterReference.gperf" + {"Colon;", "∷"}, +#line 304 "HTMLCharacterReference.gperf" + {"LessEqualGreater;", "⋚"}, + {""}, + {""}, + {""}, + {""}, #line 1653 "HTMLCharacterReference.gperf" - {"ograve;", "ò"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 365 "HTMLCharacterReference.gperf" - {"NotGreaterTilde;", "≵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 778 "HTMLCharacterReference.gperf" - {"bowtie;", "⋈"}, - {""}, -#line 1783 "HTMLCharacterReference.gperf" - {"radic;", "√"}, - {""}, -#line 107 "HTMLCharacterReference.gperf" - {"Delta;", "Δ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1275 "HTMLCharacterReference.gperf" - {"lAtail;", "⤛"}, - {""}, - {""}, -#line 2137 "HTMLCharacterReference.gperf" - {"uring;", "ů"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1947 "HTMLCharacterReference.gperf" - {"spades;", "♠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1930 "HTMLCharacterReference.gperf" - {"simne;", "≆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 317 "HTMLCharacterReference.gperf" - {"Longleftrightarrow;", "⟺"}, - {""}, - {""}, -#line 1075 "HTMLCharacterReference.gperf" - {"ffilig;", "ffi"}, - {""}, - {""}, - {""}, - {""}, -#line 2052 "HTMLCharacterReference.gperf" - {"thickapprox;", "≈"}, - {""}, -#line 2043 "HTMLCharacterReference.gperf" - {"tcy;", "т"}, - {""}, -#line 293 "HTMLCharacterReference.gperf" - {"LeftTriangleBar;", "⧏"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2012 "HTMLCharacterReference.gperf" - {"supdot;", "⪾"}, - {""}, - {""}, -#line 1710 "HTMLCharacterReference.gperf" - {"phi;", "φ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 396 "HTMLCharacterReference.gperf" - {"NotSuperset;", "⊃⃒"}, - {""}, - {""}, - {""}, - {""}, -#line 1749 "HTMLCharacterReference.gperf" - {"prime;", "′"}, -#line 342 "HTMLCharacterReference.gperf" - {"NegativeThinSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1452 "HTMLCharacterReference.gperf" - {"minus;", "−"}, - {""}, - {""}, - {""}, - {""}, -#line 1995 "HTMLCharacterReference.gperf" - {"succapprox;", "⪸"}, - {""}, - {""}, -#line 753 "HTMLCharacterReference.gperf" - {"bigsqcup;", "⨆"}, - {""}, - {""}, - {""}, -#line 1704 "HTMLCharacterReference.gperf" - {"percnt;", "%"}, - {""}, - {""}, -#line 1929 "HTMLCharacterReference.gperf" - {"simlE;", "⪟"}, - {""}, - {""}, - {""}, - {""}, -#line 1069 "HTMLCharacterReference.gperf" - {"exist;", "∃"}, - {""}, - {""}, - {""}, -#line 74 "HTMLCharacterReference.gperf" - {"CenterDot;", "·"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 548 "HTMLCharacterReference.gperf" - {"TSHcy;", "Ћ"}, - {""}, - {""}, - {""}, -#line 1541 "HTMLCharacterReference.gperf" - {"nless;", "≮"}, - {""}, + {"ograve", "ò"}, +#line 1654 "HTMLCharacterReference.gperf" + {"ograve;", "ò"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 366 "HTMLCharacterReference.gperf" + {"NotGreaterTilde;", "≵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 779 "HTMLCharacterReference.gperf" + {"bowtie;", "⋈"}, + {""}, +#line 1784 "HTMLCharacterReference.gperf" + {"radic;", "√"}, + {""}, +#line 108 "HTMLCharacterReference.gperf" + {"Delta;", "Δ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1276 "HTMLCharacterReference.gperf" + {"lAtail;", "⤛"}, + {""}, + {""}, +#line 2138 "HTMLCharacterReference.gperf" + {"uring;", "ů"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1948 "HTMLCharacterReference.gperf" + {"spades;", "♠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1931 "HTMLCharacterReference.gperf" + {"simne;", "≆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 318 "HTMLCharacterReference.gperf" + {"Longleftrightarrow;", "⟺"}, + {""}, + {""}, +#line 1076 "HTMLCharacterReference.gperf" + {"ffilig;", "ffi"}, + {""}, + {""}, + {""}, + {""}, +#line 2053 "HTMLCharacterReference.gperf" + {"thickapprox;", "≈"}, + {""}, +#line 2044 "HTMLCharacterReference.gperf" + {"tcy;", "т"}, + {""}, +#line 294 "HTMLCharacterReference.gperf" + {"LeftTriangleBar;", "⧏"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2013 "HTMLCharacterReference.gperf" + {"supdot;", "⪾"}, + {""}, + {""}, +#line 1711 "HTMLCharacterReference.gperf" + {"phi;", "φ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 397 "HTMLCharacterReference.gperf" + {"NotSuperset;", "⊃⃒"}, + {""}, + {""}, + {""}, + {""}, #line 1750 "HTMLCharacterReference.gperf" - {"primes;", "ℙ"}, - {""}, - {""}, - {""}, -#line 1825 "HTMLCharacterReference.gperf" - {"realpart;", "ℜ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 66 "HTMLCharacterReference.gperf" - {"Cayleys;", "ℭ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1734 "HTMLCharacterReference.gperf" - {"pound", "£"}, + {"prime;", "′"}, +#line 343 "HTMLCharacterReference.gperf" + {"NegativeThinSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1453 "HTMLCharacterReference.gperf" + {"minus;", "−"}, + {""}, + {""}, + {""}, + {""}, +#line 1996 "HTMLCharacterReference.gperf" + {"succapprox;", "⪸"}, + {""}, + {""}, +#line 754 "HTMLCharacterReference.gperf" + {"bigsqcup;", "⨆"}, + {""}, + {""}, + {""}, +#line 1705 "HTMLCharacterReference.gperf" + {"percnt;", "%"}, + {""}, + {""}, +#line 1930 "HTMLCharacterReference.gperf" + {"simlE;", "⪟"}, + {""}, + {""}, + {""}, + {""}, +#line 1070 "HTMLCharacterReference.gperf" + {"exist;", "∃"}, + {""}, + {""}, + {""}, +#line 75 "HTMLCharacterReference.gperf" + {"CenterDot;", "·"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 549 "HTMLCharacterReference.gperf" + {"TSHcy;", "Ћ"}, + {""}, + {""}, + {""}, +#line 1542 "HTMLCharacterReference.gperf" + {"nless;", "≮"}, + {""}, +#line 1751 "HTMLCharacterReference.gperf" + {"primes;", "ℙ"}, + {""}, + {""}, + {""}, +#line 1826 "HTMLCharacterReference.gperf" + {"realpart;", "ℜ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 67 "HTMLCharacterReference.gperf" + {"Cayleys;", "ℭ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1735 "HTMLCharacterReference.gperf" - {"pound;", "£"}, - {""}, - {""}, -#line 188 "HTMLCharacterReference.gperf" - {"GJcy;", "Ѓ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1655 "HTMLCharacterReference.gperf" - {"ohbar;", "⦵"}, - {""}, -#line 1027 "HTMLCharacterReference.gperf" - {"ell;", "ℓ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1545 "HTMLCharacterReference.gperf" - {"nltrie;", "⋬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 410 "HTMLCharacterReference.gperf" - {"Ocirc", "Ô"}, + {"pound", "£"}, +#line 1736 "HTMLCharacterReference.gperf" + {"pound;", "£"}, + {""}, + {""}, +#line 189 "HTMLCharacterReference.gperf" + {"GJcy;", "Ѓ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1656 "HTMLCharacterReference.gperf" + {"ohbar;", "⦵"}, + {""}, +#line 1028 "HTMLCharacterReference.gperf" + {"ell;", "ℓ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1546 "HTMLCharacterReference.gperf" + {"nltrie;", "⋬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 411 "HTMLCharacterReference.gperf" - {"Ocirc;", "Ô"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 306 "HTMLCharacterReference.gperf" - {"LessLess;", "⪡"}, - {""}, -#line 673 "HTMLCharacterReference.gperf" - {"aleph;", "ℵ"}, -#line 1695 "HTMLCharacterReference.gperf" - {"ovbar;", "⌽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 452 "HTMLCharacterReference.gperf" - {"Proportional;", "∝"}, - {""}, - {""}, -#line 873 "HTMLCharacterReference.gperf" - {"circlearrowleft;", "↺"}, -#line 2239 "HTMLCharacterReference.gperf" - {"zacute;", "ź"}, -#line 1816 "HTMLCharacterReference.gperf" - {"rcub;", "}"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 471 "HTMLCharacterReference.gperf" - {"ReverseElement;", "∋"}, - {""}, - {""}, -#line 731 "HTMLCharacterReference.gperf" - {"barwed;", "⌅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 343 "HTMLCharacterReference.gperf" - {"NegativeVeryThinSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1931 "HTMLCharacterReference.gperf" - {"simplus;", "⨤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1746 "HTMLCharacterReference.gperf" - {"precneqq;", "⪵"}, - {""}, - {""}, - {""}, - {""}, -#line 870 "HTMLCharacterReference.gperf" - {"cirE;", "⧃"}, - {""}, - {""}, - {""}, - {""}, -#line 1561 "HTMLCharacterReference.gperf" - {"nparallel;", "∦"}, - {""}, -#line 1851 "HTMLCharacterReference.gperf" - {"rlm;", "‏"}, -#line 71 "HTMLCharacterReference.gperf" - {"Cconint;", "∰"}, - {""}, - {""}, - {""}, - {""}, -#line 1557 "HTMLCharacterReference.gperf" - {"notniva;", "∌"}, - {""}, -#line 1271 "HTMLCharacterReference.gperf" - {"kopf;", "𝕜"}, - {""}, -#line 1955 "HTMLCharacterReference.gperf" - {"sqsube;", "⊑"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 290 "HTMLCharacterReference.gperf" - {"LeftTeeArrow;", "↤"}, - {""}, -#line 335 "HTMLCharacterReference.gperf" - {"NJcy;", "Њ"}, - {""}, - {""}, - {""}, -#line 745 "HTMLCharacterReference.gperf" - {"between;", "≬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1762 "HTMLCharacterReference.gperf" - {"pscr;", "𝓅"}, - {""}, - {""}, - {""}, -#line 130 "HTMLCharacterReference.gperf" - {"DoubleRightTee;", "⊨"}, - {""}, - {""}, -#line 590 "HTMLCharacterReference.gperf" - {"UpArrow;", "↑"}, - {""}, -#line 565 "HTMLCharacterReference.gperf" - {"TripleDot;", "⃛"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1794 "HTMLCharacterReference.gperf" - {"rarrbfs;", "⤠"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1868 "HTMLCharacterReference.gperf" - {"rsh;", "↱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1530 "HTMLCharacterReference.gperf" - {"nlArr;", "⇍"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1876 "HTMLCharacterReference.gperf" - {"rtrif;", "▸"}, - {""}, - {""}, -#line 1454 "HTMLCharacterReference.gperf" - {"minusd;", "∸"}, - {""}, - {""}, - {""}, -#line 355 "HTMLCharacterReference.gperf" - {"NotElement;", "∉"}, - {""}, - {""}, -#line 1849 "HTMLCharacterReference.gperf" - {"rlarr;", "⇄"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Ocirc", "Ô"}, +#line 412 "HTMLCharacterReference.gperf" + {"Ocirc;", "Ô"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 307 "HTMLCharacterReference.gperf" + {"LessLess;", "⪡"}, + {""}, +#line 674 "HTMLCharacterReference.gperf" + {"aleph;", "ℵ"}, #line 1696 "HTMLCharacterReference.gperf" - {"par;", "∥"}, -#line 1702 "HTMLCharacterReference.gperf" - {"part;", "∂"}, - {""}, - {""}, - {""}, - {""}, -#line 1952 "HTMLCharacterReference.gperf" - {"sqcup;", "⊔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1435 "HTMLCharacterReference.gperf" - {"mapstodown;", "↧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2225 "HTMLCharacterReference.gperf" - {"yacute", "ý"}, -#line 2226 "HTMLCharacterReference.gperf" - {"yacute;", "ý"}, - {""}, - {""}, - {""}, -#line 1470 "HTMLCharacterReference.gperf" - {"nLeftarrow;", "⇍"}, - {""}, - {""}, - {""}, -#line 2060 "HTMLCharacterReference.gperf" - {"times", "×"}, -#line 2061 "HTMLCharacterReference.gperf" - {"times;", "×"}, -#line 2082 "HTMLCharacterReference.gperf" - {"tridot;", "◬"}, - {""}, -#line 620 "HTMLCharacterReference.gperf" - {"VeryThinSpace;", " "}, -#line 39 "HTMLCharacterReference.gperf" - {"ApplyFunction;", "⁡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2141 "HTMLCharacterReference.gperf" - {"utilde;", "ũ"}, - {""}, -#line 2034 "HTMLCharacterReference.gperf" - {"swarrow;", "↙"}, - {""}, - {""}, - {""}, + {"ovbar;", "⌽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 453 "HTMLCharacterReference.gperf" + {"Proportional;", "∝"}, + {""}, + {""}, +#line 874 "HTMLCharacterReference.gperf" + {"circlearrowleft;", "↺"}, +#line 2240 "HTMLCharacterReference.gperf" + {"zacute;", "ź"}, +#line 1817 "HTMLCharacterReference.gperf" + {"rcub;", "}"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 472 "HTMLCharacterReference.gperf" + {"ReverseElement;", "∋"}, + {""}, + {""}, +#line 732 "HTMLCharacterReference.gperf" + {"barwed;", "⌅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 344 "HTMLCharacterReference.gperf" + {"NegativeVeryThinSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1932 "HTMLCharacterReference.gperf" + {"simplus;", "⨤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1747 "HTMLCharacterReference.gperf" + {"precneqq;", "⪵"}, + {""}, + {""}, + {""}, + {""}, +#line 871 "HTMLCharacterReference.gperf" + {"cirE;", "⧃"}, + {""}, + {""}, + {""}, + {""}, +#line 1562 "HTMLCharacterReference.gperf" + {"nparallel;", "∦"}, + {""}, +#line 1852 "HTMLCharacterReference.gperf" + {"rlm;", "‏"}, +#line 72 "HTMLCharacterReference.gperf" + {"Cconint;", "∰"}, + {""}, + {""}, + {""}, + {""}, +#line 1558 "HTMLCharacterReference.gperf" + {"notniva;", "∌"}, + {""}, +#line 1272 "HTMLCharacterReference.gperf" + {"kopf;", "𝕜"}, + {""}, +#line 1956 "HTMLCharacterReference.gperf" + {"sqsube;", "⊑"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 291 "HTMLCharacterReference.gperf" + {"LeftTeeArrow;", "↤"}, + {""}, +#line 336 "HTMLCharacterReference.gperf" + {"NJcy;", "Њ"}, + {""}, + {""}, + {""}, +#line 746 "HTMLCharacterReference.gperf" + {"between;", "≬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1763 "HTMLCharacterReference.gperf" + {"pscr;", "𝓅"}, + {""}, + {""}, + {""}, +#line 131 "HTMLCharacterReference.gperf" + {"DoubleRightTee;", "⊨"}, + {""}, + {""}, +#line 591 "HTMLCharacterReference.gperf" + {"UpArrow;", "↑"}, + {""}, +#line 566 "HTMLCharacterReference.gperf" + {"TripleDot;", "⃛"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1795 "HTMLCharacterReference.gperf" + {"rarrbfs;", "⤠"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1869 "HTMLCharacterReference.gperf" + {"rsh;", "↱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1531 "HTMLCharacterReference.gperf" + {"nlArr;", "⇍"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1877 "HTMLCharacterReference.gperf" + {"rtrif;", "▸"}, + {""}, + {""}, +#line 1455 "HTMLCharacterReference.gperf" + {"minusd;", "∸"}, + {""}, + {""}, + {""}, +#line 356 "HTMLCharacterReference.gperf" + {"NotElement;", "∉"}, + {""}, + {""}, +#line 1850 "HTMLCharacterReference.gperf" + {"rlarr;", "⇄"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1697 "HTMLCharacterReference.gperf" + {"par;", "∥"}, +#line 1703 "HTMLCharacterReference.gperf" + {"part;", "∂"}, + {""}, + {""}, + {""}, + {""}, #line 1953 "HTMLCharacterReference.gperf" - {"sqcups;", "⊔︀"}, -#line 2019 "HTMLCharacterReference.gperf" - {"supmult;", "⫂"}, -#line 1895 "HTMLCharacterReference.gperf" - {"scy;", "с"}, -#line 985 "HTMLCharacterReference.gperf" - {"doublebarwedge;", "⌆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1311 "HTMLCharacterReference.gperf" - {"lcedil;", "ļ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 401 "HTMLCharacterReference.gperf" - {"NotTildeTilde;", "≉"}, - {""}, -#line 852 "HTMLCharacterReference.gperf" - {"ccedil", "ç"}, + {"sqcup;", "⊔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1436 "HTMLCharacterReference.gperf" + {"mapstodown;", "↧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2226 "HTMLCharacterReference.gperf" + {"yacute", "ý"}, +#line 2227 "HTMLCharacterReference.gperf" + {"yacute;", "ý"}, + {""}, + {""}, + {""}, +#line 1471 "HTMLCharacterReference.gperf" + {"nLeftarrow;", "⇍"}, + {""}, + {""}, + {""}, +#line 2061 "HTMLCharacterReference.gperf" + {"times", "×"}, +#line 2062 "HTMLCharacterReference.gperf" + {"times;", "×"}, +#line 2083 "HTMLCharacterReference.gperf" + {"tridot;", "◬"}, + {""}, +#line 621 "HTMLCharacterReference.gperf" + {"VeryThinSpace;", " "}, +#line 40 "HTMLCharacterReference.gperf" + {"ApplyFunction;", "⁡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2142 "HTMLCharacterReference.gperf" + {"utilde;", "ũ"}, + {""}, +#line 2035 "HTMLCharacterReference.gperf" + {"swarrow;", "↙"}, + {""}, + {""}, + {""}, +#line 1954 "HTMLCharacterReference.gperf" + {"sqcups;", "⊔︀"}, +#line 2020 "HTMLCharacterReference.gperf" + {"supmult;", "⫂"}, +#line 1896 "HTMLCharacterReference.gperf" + {"scy;", "с"}, +#line 986 "HTMLCharacterReference.gperf" + {"doublebarwedge;", "⌆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1312 "HTMLCharacterReference.gperf" + {"lcedil;", "ļ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 402 "HTMLCharacterReference.gperf" + {"NotTildeTilde;", "≉"}, + {""}, #line 853 "HTMLCharacterReference.gperf" - {"ccedil;", "ç"}, -#line 1985 "HTMLCharacterReference.gperf" - {"subrarr;", "⥹"}, - {""}, - {""}, -#line 1879 "HTMLCharacterReference.gperf" - {"rx;", "℞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 172 "HTMLCharacterReference.gperf" - {"Equilibrium;", "⇌"}, - {""}, - {""}, - {""}, -#line 2151 "HTMLCharacterReference.gperf" - {"vDash;", "⊨"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2023 "HTMLCharacterReference.gperf" - {"supset;", "⊃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2209 "HTMLCharacterReference.gperf" - {"xlArr;", "⟸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1689 "HTMLCharacterReference.gperf" - {"otilde", "õ"}, + {"ccedil", "ç"}, +#line 854 "HTMLCharacterReference.gperf" + {"ccedil;", "ç"}, +#line 1986 "HTMLCharacterReference.gperf" + {"subrarr;", "⥹"}, + {""}, + {""}, +#line 1880 "HTMLCharacterReference.gperf" + {"rx;", "℞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 173 "HTMLCharacterReference.gperf" + {"Equilibrium;", "⇌"}, + {""}, + {""}, + {""}, +#line 2152 "HTMLCharacterReference.gperf" + {"vDash;", "⊨"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2024 "HTMLCharacterReference.gperf" + {"supset;", "⊃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2210 "HTMLCharacterReference.gperf" + {"xlArr;", "⟸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1690 "HTMLCharacterReference.gperf" - {"otilde;", "õ"}, - {""}, -#line 1792 "HTMLCharacterReference.gperf" - {"rarrap;", "⥵"}, -#line 344 "HTMLCharacterReference.gperf" - {"NestedGreaterGreater;", "≫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1639 "HTMLCharacterReference.gperf" - {"ocir;", "⊚"}, - {""}, - {""}, -#line 399 "HTMLCharacterReference.gperf" - {"NotTildeEqual;", "≄"}, - {""}, - {""}, - {""}, -#line 1589 "HTMLCharacterReference.gperf" - {"nsqsupe;", "⋣"}, - {""}, -#line 987 "HTMLCharacterReference.gperf" - {"downdownarrows;", "⇊"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 321 "HTMLCharacterReference.gperf" - {"LowerRightArrow;", "↘"}, - {""}, -#line 1818 "HTMLCharacterReference.gperf" - {"rdca;", "⤷"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2084 "HTMLCharacterReference.gperf" - {"triminus;", "⨺"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1004 "HTMLCharacterReference.gperf" - {"dzigrarr;", "⟿"}, -#line 1924 "HTMLCharacterReference.gperf" - {"sime;", "≃"}, + {"otilde", "õ"}, +#line 1691 "HTMLCharacterReference.gperf" + {"otilde;", "õ"}, + {""}, +#line 1793 "HTMLCharacterReference.gperf" + {"rarrap;", "⥵"}, +#line 345 "HTMLCharacterReference.gperf" + {"NestedGreaterGreater;", "≫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1640 "HTMLCharacterReference.gperf" + {"ocir;", "⊚"}, + {""}, + {""}, +#line 400 "HTMLCharacterReference.gperf" + {"NotTildeEqual;", "≄"}, + {""}, + {""}, + {""}, +#line 1590 "HTMLCharacterReference.gperf" + {"nsqsupe;", "⋣"}, + {""}, +#line 988 "HTMLCharacterReference.gperf" + {"downdownarrows;", "⇊"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 322 "HTMLCharacterReference.gperf" + {"LowerRightArrow;", "↘"}, + {""}, +#line 1819 "HTMLCharacterReference.gperf" + {"rdca;", "⤷"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2085 "HTMLCharacterReference.gperf" + {"triminus;", "⨺"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1005 "HTMLCharacterReference.gperf" + {"dzigrarr;", "⟿"}, #line 1925 "HTMLCharacterReference.gperf" - {"simeq;", "≃"}, - {""}, - {""}, - {""}, -#line 307 "HTMLCharacterReference.gperf" - {"LessSlantEqual;", "⩽"}, -#line 2155 "HTMLCharacterReference.gperf" - {"varnothing;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2138 "HTMLCharacterReference.gperf" - {"urtri;", "◹"}, -#line 1471 "HTMLCharacterReference.gperf" - {"nLeftrightarrow;", "⇎"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2143 "HTMLCharacterReference.gperf" - {"utrif;", "▴"}, - {""}, - {""}, - {""}, - {""}, -#line 2070 "HTMLCharacterReference.gperf" - {"topf;", "𝕥"}, - {""}, - {""}, - {""}, -#line 1325 "HTMLCharacterReference.gperf" - {"leftharpoonup;", "↼"}, - {""}, -#line 1219 "HTMLCharacterReference.gperf" - {"image;", "ℑ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1697 "HTMLCharacterReference.gperf" - {"para", "¶"}, + {"sime;", "≃"}, +#line 1926 "HTMLCharacterReference.gperf" + {"simeq;", "≃"}, + {""}, + {""}, + {""}, +#line 308 "HTMLCharacterReference.gperf" + {"LessSlantEqual;", "⩽"}, +#line 2156 "HTMLCharacterReference.gperf" + {"varnothing;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2139 "HTMLCharacterReference.gperf" + {"urtri;", "◹"}, +#line 1472 "HTMLCharacterReference.gperf" + {"nLeftrightarrow;", "⇎"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2144 "HTMLCharacterReference.gperf" + {"utrif;", "▴"}, + {""}, + {""}, + {""}, + {""}, +#line 2071 "HTMLCharacterReference.gperf" + {"topf;", "𝕥"}, + {""}, + {""}, + {""}, +#line 1326 "HTMLCharacterReference.gperf" + {"leftharpoonup;", "↼"}, + {""}, +#line 1220 "HTMLCharacterReference.gperf" + {"image;", "ℑ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1698 "HTMLCharacterReference.gperf" - {"para;", "¶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 85 "HTMLCharacterReference.gperf" - {"Colone;", "⩴"}, - {""}, - {""}, -#line 1662 "HTMLCharacterReference.gperf" - {"olt;", "⧀"}, - {""}, - {""}, -#line 1712 "HTMLCharacterReference.gperf" - {"phmmat;", "ℳ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1998 "HTMLCharacterReference.gperf" - {"succnapprox;", "⪺"}, - {""}, - {""}, -#line 1331 "HTMLCharacterReference.gperf" - {"leftthreetimes;", "⋋"}, - {""}, - {""}, - {""}, -#line 756 "HTMLCharacterReference.gperf" - {"bigtriangleup;", "△"}, -#line 140 "HTMLCharacterReference.gperf" - {"DownLeftVector;", "↽"}, - {""}, - {""}, + {"para", "¶"}, +#line 1699 "HTMLCharacterReference.gperf" + {"para;", "¶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 86 "HTMLCharacterReference.gperf" + {"Colone;", "⩴"}, + {""}, + {""}, +#line 1663 "HTMLCharacterReference.gperf" + {"olt;", "⧀"}, + {""}, + {""}, +#line 1713 "HTMLCharacterReference.gperf" + {"phmmat;", "ℳ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1999 "HTMLCharacterReference.gperf" + {"succnapprox;", "⪺"}, + {""}, + {""}, +#line 1332 "HTMLCharacterReference.gperf" + {"leftthreetimes;", "⋋"}, + {""}, + {""}, + {""}, +#line 757 "HTMLCharacterReference.gperf" + {"bigtriangleup;", "△"}, #line 141 "HTMLCharacterReference.gperf" - {"DownLeftVectorBar;", "⥖"}, -#line 1907 "HTMLCharacterReference.gperf" - {"setminus;", "∖"}, -#line 1380 "HTMLCharacterReference.gperf" - {"longrightarrow;", "⟶"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2031 "HTMLCharacterReference.gperf" - {"swArr;", "⇙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2064 "HTMLCharacterReference.gperf" - {"timesd;", "⨰"}, - {""}, - {""}, - {""}, -#line 808 "HTMLCharacterReference.gperf" - {"boxhu;", "┴"}, - {""}, - {""}, -#line 412 "HTMLCharacterReference.gperf" - {"Ocy;", "О"}, - {""}, -#line 1711 "HTMLCharacterReference.gperf" - {"phiv;", "ϕ"}, - {""}, -#line 728 "HTMLCharacterReference.gperf" - {"backsim;", "∽"}, - {""}, - {""}, - {""}, -#line 1658 "HTMLCharacterReference.gperf" - {"olarr;", "↺"}, -#line 220 "HTMLCharacterReference.gperf" - {"HumpDownHump;", "≎"}, -#line 537 "HTMLCharacterReference.gperf" - {"SucceedsSlantEqual;", "≽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2126 "HTMLCharacterReference.gperf" - {"updownarrow;", "↕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2103 "HTMLCharacterReference.gperf" - {"ucirc", "û"}, + {"DownLeftVector;", "↽"}, + {""}, + {""}, +#line 142 "HTMLCharacterReference.gperf" + {"DownLeftVectorBar;", "⥖"}, +#line 1908 "HTMLCharacterReference.gperf" + {"setminus;", "∖"}, +#line 1381 "HTMLCharacterReference.gperf" + {"longrightarrow;", "⟶"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2032 "HTMLCharacterReference.gperf" + {"swArr;", "⇙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2065 "HTMLCharacterReference.gperf" + {"timesd;", "⨰"}, + {""}, + {""}, + {""}, +#line 809 "HTMLCharacterReference.gperf" + {"boxhu;", "┴"}, + {""}, + {""}, +#line 413 "HTMLCharacterReference.gperf" + {"Ocy;", "О"}, + {""}, +#line 1712 "HTMLCharacterReference.gperf" + {"phiv;", "ϕ"}, + {""}, +#line 729 "HTMLCharacterReference.gperf" + {"backsim;", "∽"}, + {""}, + {""}, + {""}, +#line 1659 "HTMLCharacterReference.gperf" + {"olarr;", "↺"}, +#line 221 "HTMLCharacterReference.gperf" + {"HumpDownHump;", "≎"}, +#line 538 "HTMLCharacterReference.gperf" + {"SucceedsSlantEqual;", "≽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2127 "HTMLCharacterReference.gperf" + {"updownarrow;", "↕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2104 "HTMLCharacterReference.gperf" - {"ucirc;", "û"}, -#line 1657 "HTMLCharacterReference.gperf" - {"oint;", "∮"}, - {""}, - {""}, -#line 1676 "HTMLCharacterReference.gperf" - {"orderof;", "ℴ"}, - {""}, - {""}, - {""}, - {""}, -#line 1834 "HTMLCharacterReference.gperf" - {"rharu;", "⇀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1742 "HTMLCharacterReference.gperf" - {"precapprox;", "⪷"}, - {""}, - {""}, -#line 1431 "HTMLCharacterReference.gperf" - {"malt;", "✠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ucirc", "û"}, +#line 2105 "HTMLCharacterReference.gperf" + {"ucirc;", "û"}, +#line 1658 "HTMLCharacterReference.gperf" + {"oint;", "∮"}, + {""}, + {""}, +#line 1677 "HTMLCharacterReference.gperf" + {"orderof;", "ℴ"}, + {""}, + {""}, + {""}, + {""}, #line 1835 "HTMLCharacterReference.gperf" - {"rharul;", "⥬"}, - {""}, -#line 275 "HTMLCharacterReference.gperf" - {"Lcedil;", "Ļ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 752 "HTMLCharacterReference.gperf" - {"bigotimes;", "⨂"}, - {""}, - {""}, - {""}, -#line 1820 "HTMLCharacterReference.gperf" - {"rdquo;", "”"}, + {"rharu;", "⇀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1743 "HTMLCharacterReference.gperf" + {"precapprox;", "⪷"}, + {""}, + {""}, +#line 1432 "HTMLCharacterReference.gperf" + {"malt;", "✠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1836 "HTMLCharacterReference.gperf" + {"rharul;", "⥬"}, + {""}, +#line 276 "HTMLCharacterReference.gperf" + {"Lcedil;", "Ļ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 753 "HTMLCharacterReference.gperf" + {"bigotimes;", "⨂"}, + {""}, + {""}, + {""}, #line 1821 "HTMLCharacterReference.gperf" - {"rdquor;", "”"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 313 "HTMLCharacterReference.gperf" - {"LongLeftArrow;", "⟵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1860 "HTMLCharacterReference.gperf" - {"roplus;", "⨮"}, - {""}, - {""}, -#line 1980 "HTMLCharacterReference.gperf" - {"subedot;", "⫃"}, - {""}, - {""}, - {""}, - {""}, -#line 748 "HTMLCharacterReference.gperf" - {"bigcirc;", "◯"}, - {""}, -#line 1607 "HTMLCharacterReference.gperf" - {"ntlg;", "≸"}, -#line 1640 "HTMLCharacterReference.gperf" - {"ocirc", "ô"}, + {"rdquo;", "”"}, +#line 1822 "HTMLCharacterReference.gperf" + {"rdquor;", "”"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 314 "HTMLCharacterReference.gperf" + {"LongLeftArrow;", "⟵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1861 "HTMLCharacterReference.gperf" + {"roplus;", "⨮"}, + {""}, + {""}, +#line 1981 "HTMLCharacterReference.gperf" + {"subedot;", "⫃"}, + {""}, + {""}, + {""}, + {""}, +#line 749 "HTMLCharacterReference.gperf" + {"bigcirc;", "◯"}, + {""}, +#line 1608 "HTMLCharacterReference.gperf" + {"ntlg;", "≸"}, #line 1641 "HTMLCharacterReference.gperf" - {"ocirc;", "ô"}, - {""}, -#line 2024 "HTMLCharacterReference.gperf" - {"supseteq;", "⊇"}, + {"ocirc", "ô"}, +#line 1642 "HTMLCharacterReference.gperf" + {"ocirc;", "ô"}, + {""}, #line 2025 "HTMLCharacterReference.gperf" - {"supseteqq;", "⫆"}, - {""}, -#line 1183 "HTMLCharacterReference.gperf" - {"hellip;", "…"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1623 "HTMLCharacterReference.gperf" - {"nvlArr;", "⤂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1877 "HTMLCharacterReference.gperf" - {"rtriltri;", "⧎"}, -#line 1789 "HTMLCharacterReference.gperf" - {"raquo", "»"}, -#line 1790 "HTMLCharacterReference.gperf" - {"raquo;", "»"}, - {""}, - {""}, -#line 63 "HTMLCharacterReference.gperf" - {"Cacute;", "Ć"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1112 "HTMLCharacterReference.gperf" - {"gEl;", "⪌"}, - {""}, - {""}, -#line 1262 "HTMLCharacterReference.gperf" - {"jukcy;", "є"}, - {""}, - {""}, - {""}, - {""}, -#line 2174 "HTMLCharacterReference.gperf" - {"vellip;", "⋮"}, - {""}, -#line 1883 "HTMLCharacterReference.gperf" - {"scE;", "⪴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1455 "HTMLCharacterReference.gperf" - {"minusdu;", "⨪"}, - {""}, - {""}, - {""}, -#line 942 "HTMLCharacterReference.gperf" - {"daleth;", "ℸ"}, - {""}, -#line 119 "HTMLCharacterReference.gperf" - {"DotEqual;", "≐"}, -#line 1866 "HTMLCharacterReference.gperf" - {"rsaquo;", "›"}, -#line 128 "HTMLCharacterReference.gperf" - {"DoubleLongRightArrow;", "⟹"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 137 "HTMLCharacterReference.gperf" - {"DownBreve;", "̑"}, - {""}, -#line 2092 "HTMLCharacterReference.gperf" - {"tstrok;", "ŧ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2087 "HTMLCharacterReference.gperf" - {"tritime;", "⨻"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 729 "HTMLCharacterReference.gperf" - {"backsimeq;", "⋍"}, - {""}, - {""}, -#line 1902 "HTMLCharacterReference.gperf" - {"searrow;", "↘"}, - {""}, - {""}, -#line 1645 "HTMLCharacterReference.gperf" - {"odiv;", "⨸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2086 "HTMLCharacterReference.gperf" - {"trisb;", "⧍"}, -#line 178 "HTMLCharacterReference.gperf" - {"Exists;", "∃"}, -#line 282 "HTMLCharacterReference.gperf" - {"LeftDoubleBracket;", "⟦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1802 "HTMLCharacterReference.gperf" - {"rarrw;", "↝"}, -#line 732 "HTMLCharacterReference.gperf" - {"barwedge;", "⌅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1817 "HTMLCharacterReference.gperf" - {"rcy;", "р"}, - {""}, - {""}, -#line 318 "HTMLCharacterReference.gperf" - {"Longrightarrow;", "⟹"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1946 "HTMLCharacterReference.gperf" - {"sopf;", "𝕤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 511 "HTMLCharacterReference.gperf" - {"Scedil;", "Ş"}, - {""}, - {""}, - {""}, - {""}, -#line 295 "HTMLCharacterReference.gperf" - {"LeftUpDownVector;", "⥑"}, - {""}, - {""}, -#line 259 "HTMLCharacterReference.gperf" - {"KJcy;", "Ќ"}, - {""}, -#line 380 "HTMLCharacterReference.gperf" - {"NotPrecedesEqual;", "⪯̸"}, - {""}, -#line 2166 "HTMLCharacterReference.gperf" - {"vartheta;", "ϑ"}, - {""}, - {""}, - {""}, - {""}, -#line 539 "HTMLCharacterReference.gperf" - {"SuchThat;", "∋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 773 "HTMLCharacterReference.gperf" - {"bnequiv;", "≡⃥"}, - {""}, - {""}, - {""}, -#line 1252 "HTMLCharacterReference.gperf" - {"iukcy;", "і"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1965 "HTMLCharacterReference.gperf" - {"squf;", "▪"}, - {""}, -#line 1495 "HTMLCharacterReference.gperf" - {"ncedil;", "ņ"}, - {""}, - {""}, -#line 1737 "HTMLCharacterReference.gperf" - {"prE;", "⪳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 136 "HTMLCharacterReference.gperf" - {"DownArrowUpArrow;", "⇵"}, - {""}, - {""}, - {""}, -#line 1919 "HTMLCharacterReference.gperf" - {"sigma;", "σ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1079 "HTMLCharacterReference.gperf" - {"filig;", "fi"}, - {""}, - {""}, - {""}, -#line 315 "HTMLCharacterReference.gperf" - {"LongRightArrow;", "⟶"}, - {""}, -#line 1449 "HTMLCharacterReference.gperf" - {"midcir;", "⫰"}, - {""}, - {""}, -#line 1872 "HTMLCharacterReference.gperf" - {"rthree;", "⋌"}, - {""}, -#line 2038 "HTMLCharacterReference.gperf" - {"target;", "⌖"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1424 "HTMLCharacterReference.gperf" - {"luruhar;", "⥦"}, - {""}, - {""}, -#line 1082 "HTMLCharacterReference.gperf" - {"fllig;", "fl"}, - {""}, - {""}, - {""}, - {""}, -#line 1450 "HTMLCharacterReference.gperf" - {"middot", "·"}, -#line 1451 "HTMLCharacterReference.gperf" - {"middot;", "·"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1348 "HTMLCharacterReference.gperf" - {"lesssim;", "≲"}, - {""}, - {""}, - {""}, - {""}, -#line 754 "HTMLCharacterReference.gperf" - {"bigstar;", "★"}, -#line 1939 "HTMLCharacterReference.gperf" - {"smt;", "⪪"}, + {"supseteq;", "⊇"}, #line 2026 "HTMLCharacterReference.gperf" - {"supsetneq;", "⊋"}, -#line 2027 "HTMLCharacterReference.gperf" - {"supsetneqq;", "⫌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1899 "HTMLCharacterReference.gperf" - {"seArr;", "⇘"}, - {""}, -#line 52 "HTMLCharacterReference.gperf" - {"Because;", "∵"}, - {""}, - {""}, - {""}, - {""}, -#line 450 "HTMLCharacterReference.gperf" - {"Product;", "∏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 329 "HTMLCharacterReference.gperf" - {"Mellintrf;", "ℳ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2125 "HTMLCharacterReference.gperf" - {"uparrow;", "↑"}, - {""}, - {""}, -#line 390 "HTMLCharacterReference.gperf" - {"NotSubset;", "⊂⃒"}, - {""}, -#line 2051 "HTMLCharacterReference.gperf" - {"thetav;", "ϑ"}, - {""}, -#line 1779 "HTMLCharacterReference.gperf" - {"rBarr;", "⤏"}, - {""}, -#line 288 "HTMLCharacterReference.gperf" - {"LeftRightVector;", "⥎"}, -#line 468 "HTMLCharacterReference.gperf" - {"Rcedil;", "Ŗ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2105 "HTMLCharacterReference.gperf" - {"ucy;", "у"}, - {""}, -#line 2011 "HTMLCharacterReference.gperf" - {"supE;", "⫆"}, - {""}, - {""}, -#line 133 "HTMLCharacterReference.gperf" - {"DoubleVerticalBar;", "∥"}, -#line 524 "HTMLCharacterReference.gperf" - {"SquareIntersection;", "⊓"}, - {""}, - {""}, - {""}, -#line 1781 "HTMLCharacterReference.gperf" - {"race;", "∽̱"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1776 "HTMLCharacterReference.gperf" - {"rAarr;", "⇛"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1364 "HTMLCharacterReference.gperf" - {"lmidot;", "ŀ"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1777 "HTMLCharacterReference.gperf" - {"rArr;", "⇒"}, - {""}, - {""}, - {""}, -#line 194 "HTMLCharacterReference.gperf" - {"Gcedil;", "Ģ"}, - {""}, -#line 1943 "HTMLCharacterReference.gperf" - {"sol;", "/"}, -#line 420 "HTMLCharacterReference.gperf" - {"Oopf;", "𝕆"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 124 "HTMLCharacterReference.gperf" - {"DoubleLeftRightArrow;", "⇔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 477 "HTMLCharacterReference.gperf" - {"RightArrow;", "→"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1453 "HTMLCharacterReference.gperf" - {"minusb;", "⊟"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1745 "HTMLCharacterReference.gperf" - {"precnapprox;", "⪹"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1642 "HTMLCharacterReference.gperf" - {"ocy;", "о"}, -#line 1258 "HTMLCharacterReference.gperf" - {"jmath;", "ȷ"}, -#line 1920 "HTMLCharacterReference.gperf" - {"sigmaf;", "ς"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1714 "HTMLCharacterReference.gperf" - {"pi;", "π"}, - {""}, - {""}, - {""}, -#line 2164 "HTMLCharacterReference.gperf" - {"varsupsetneq;", "⊋︀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 672 "HTMLCharacterReference.gperf" - {"alefsym;", "ℵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1754 "HTMLCharacterReference.gperf" - {"prod;", "∏"}, - {""}, -#line 1932 "HTMLCharacterReference.gperf" - {"simrarr;", "⥲"}, - {""}, -#line 1716 "HTMLCharacterReference.gperf" - {"piv;", "ϖ"}, - {""}, -#line 257 "HTMLCharacterReference.gperf" - {"Jukcy;", "Є"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 372 "HTMLCharacterReference.gperf" - {"NotLessEqual;", "≰"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 400 "HTMLCharacterReference.gperf" - {"NotTildeFullEqual;", "≇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 356 "HTMLCharacterReference.gperf" - {"NotEqual;", "≠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1366 "HTMLCharacterReference.gperf" - {"lmoustache;", "⎰"}, -#line 338 "HTMLCharacterReference.gperf" - {"Ncedil;", "Ņ"}, - {""}, -#line 1234 "HTMLCharacterReference.gperf" - {"intlarhk;", "⨗"}, - {""}, - {""}, -#line 507 "HTMLCharacterReference.gperf" - {"SOFTcy;", "Ь"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1978 "HTMLCharacterReference.gperf" - {"subdot;", "⪽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 727 "HTMLCharacterReference.gperf" - {"backprime;", "‵"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 674 "HTMLCharacterReference.gperf" - {"alpha;", "α"}, - {""}, + {"supseteqq;", "⫆"}, + {""}, +#line 1184 "HTMLCharacterReference.gperf" + {"hellip;", "…"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1624 "HTMLCharacterReference.gperf" + {"nvlArr;", "⤂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1878 "HTMLCharacterReference.gperf" + {"rtriltri;", "⧎"}, +#line 1790 "HTMLCharacterReference.gperf" + {"raquo", "»"}, +#line 1791 "HTMLCharacterReference.gperf" + {"raquo;", "»"}, + {""}, + {""}, +#line 64 "HTMLCharacterReference.gperf" + {"Cacute;", "Ć"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1113 "HTMLCharacterReference.gperf" + {"gEl;", "⪌"}, + {""}, + {""}, +#line 1263 "HTMLCharacterReference.gperf" + {"jukcy;", "є"}, + {""}, + {""}, + {""}, + {""}, +#line 2175 "HTMLCharacterReference.gperf" + {"vellip;", "⋮"}, + {""}, +#line 1884 "HTMLCharacterReference.gperf" + {"scE;", "⪴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1456 "HTMLCharacterReference.gperf" + {"minusdu;", "⨪"}, + {""}, + {""}, + {""}, +#line 943 "HTMLCharacterReference.gperf" + {"daleth;", "ℸ"}, + {""}, +#line 120 "HTMLCharacterReference.gperf" + {"DotEqual;", "≐"}, +#line 1867 "HTMLCharacterReference.gperf" + {"rsaquo;", "›"}, +#line 129 "HTMLCharacterReference.gperf" + {"DoubleLongRightArrow;", "⟹"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 138 "HTMLCharacterReference.gperf" + {"DownBreve;", "̑"}, + {""}, +#line 2093 "HTMLCharacterReference.gperf" + {"tstrok;", "ŧ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2088 "HTMLCharacterReference.gperf" + {"tritime;", "⨻"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 730 "HTMLCharacterReference.gperf" + {"backsimeq;", "⋍"}, + {""}, + {""}, +#line 1903 "HTMLCharacterReference.gperf" + {"searrow;", "↘"}, + {""}, + {""}, +#line 1646 "HTMLCharacterReference.gperf" + {"odiv;", "⨸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2087 "HTMLCharacterReference.gperf" + {"trisb;", "⧍"}, #line 179 "HTMLCharacterReference.gperf" - {"ExponentialE;", "ⅇ"}, - {""}, - {""}, -#line 2170 "HTMLCharacterReference.gperf" - {"vdash;", "⊢"}, - {""}, - {""}, - {""}, - {""}, -#line 1824 "HTMLCharacterReference.gperf" - {"realine;", "ℛ"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"Exists;", "∃"}, +#line 283 "HTMLCharacterReference.gperf" + {"LeftDoubleBracket;", "⟦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1803 "HTMLCharacterReference.gperf" + {"rarrw;", "↝"}, +#line 733 "HTMLCharacterReference.gperf" + {"barwedge;", "⌅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1818 "HTMLCharacterReference.gperf" + {"rcy;", "р"}, + {""}, + {""}, +#line 319 "HTMLCharacterReference.gperf" + {"Longrightarrow;", "⟹"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1947 "HTMLCharacterReference.gperf" + {"sopf;", "𝕤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 512 "HTMLCharacterReference.gperf" + {"Scedil;", "Ş"}, + {""}, + {""}, + {""}, + {""}, +#line 296 "HTMLCharacterReference.gperf" + {"LeftUpDownVector;", "⥑"}, + {""}, + {""}, +#line 260 "HTMLCharacterReference.gperf" + {"KJcy;", "Ќ"}, + {""}, +#line 381 "HTMLCharacterReference.gperf" + {"NotPrecedesEqual;", "⪯̸"}, + {""}, +#line 2167 "HTMLCharacterReference.gperf" + {"vartheta;", "ϑ"}, + {""}, + {""}, + {""}, + {""}, +#line 540 "HTMLCharacterReference.gperf" + {"SuchThat;", "∋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 774 "HTMLCharacterReference.gperf" + {"bnequiv;", "≡⃥"}, + {""}, + {""}, + {""}, +#line 1253 "HTMLCharacterReference.gperf" + {"iukcy;", "і"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1966 "HTMLCharacterReference.gperf" + {"squf;", "▪"}, + {""}, +#line 1496 "HTMLCharacterReference.gperf" + {"ncedil;", "ņ"}, + {""}, + {""}, +#line 1738 "HTMLCharacterReference.gperf" + {"prE;", "⪳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 137 "HTMLCharacterReference.gperf" + {"DownArrowUpArrow;", "⇵"}, + {""}, + {""}, + {""}, +#line 1920 "HTMLCharacterReference.gperf" + {"sigma;", "σ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1080 "HTMLCharacterReference.gperf" + {"filig;", "fi"}, + {""}, + {""}, + {""}, +#line 316 "HTMLCharacterReference.gperf" + {"LongRightArrow;", "⟶"}, + {""}, +#line 1450 "HTMLCharacterReference.gperf" + {"midcir;", "⫰"}, + {""}, + {""}, +#line 1873 "HTMLCharacterReference.gperf" + {"rthree;", "⋌"}, + {""}, +#line 2039 "HTMLCharacterReference.gperf" + {"target;", "⌖"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1425 "HTMLCharacterReference.gperf" + {"luruhar;", "⥦"}, + {""}, + {""}, +#line 1083 "HTMLCharacterReference.gperf" + {"fllig;", "fl"}, + {""}, + {""}, + {""}, + {""}, +#line 1451 "HTMLCharacterReference.gperf" + {"middot", "·"}, +#line 1452 "HTMLCharacterReference.gperf" + {"middot;", "·"}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1349 "HTMLCharacterReference.gperf" - {"lfisht;", "⥼"}, -#line 1559 "HTMLCharacterReference.gperf" - {"notnivc;", "⋽"}, - {""}, - {""}, - {""}, -#line 203 "HTMLCharacterReference.gperf" - {"GreaterFullEqual;", "≧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 248 "HTMLCharacterReference.gperf" - {"Iukcy;", "І"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 138 "HTMLCharacterReference.gperf" - {"DownLeftRightVector;", "⥐"}, - {""}, - {""}, - {""}, - {""}, -#line 1223 "HTMLCharacterReference.gperf" - {"imof;", "⊷"}, -#line 1324 "HTMLCharacterReference.gperf" - {"leftharpoondown;", "↽"}, -#line 958 "HTMLCharacterReference.gperf" - {"dfisht;", "⥿"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 346 "HTMLCharacterReference.gperf" - {"NewLine;", "\n"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2096 "HTMLCharacterReference.gperf" - {"uArr;", "⇑"}, - {""}, -#line 1222 "HTMLCharacterReference.gperf" - {"imath;", "ı"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 650 "HTMLCharacterReference.gperf" - {"ZeroWidthSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"lesssim;", "≲"}, + {""}, + {""}, + {""}, + {""}, #line 755 "HTMLCharacterReference.gperf" - {"bigtriangledown;", "▽"}, - {""}, -#line 1859 "HTMLCharacterReference.gperf" - {"ropf;", "𝕣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 312 "HTMLCharacterReference.gperf" - {"Lmidot;", "Ŀ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1432 "HTMLCharacterReference.gperf" - {"maltese;", "✠"}, - {""}, - {""}, - {""}, -#line 534 "HTMLCharacterReference.gperf" - {"SubsetEqual;", "⊆"}, -#line 2127 "HTMLCharacterReference.gperf" - {"upharpoonleft;", "↿"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 354 "HTMLCharacterReference.gperf" - {"NotDoubleVerticalBar;", "∦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1430 "HTMLCharacterReference.gperf" - {"male;", "♂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"bigstar;", "★"}, +#line 1940 "HTMLCharacterReference.gperf" + {"smt;", "⪪"}, +#line 2027 "HTMLCharacterReference.gperf" + {"supsetneq;", "⊋"}, +#line 2028 "HTMLCharacterReference.gperf" + {"supsetneqq;", "⫌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1900 "HTMLCharacterReference.gperf" + {"seArr;", "⇘"}, + {""}, +#line 53 "HTMLCharacterReference.gperf" + {"Because;", "∵"}, + {""}, + {""}, + {""}, + {""}, +#line 451 "HTMLCharacterReference.gperf" + {"Product;", "∏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 330 "HTMLCharacterReference.gperf" + {"Mellintrf;", "ℳ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2126 "HTMLCharacterReference.gperf" + {"uparrow;", "↑"}, + {""}, + {""}, +#line 391 "HTMLCharacterReference.gperf" + {"NotSubset;", "⊂⃒"}, + {""}, +#line 2052 "HTMLCharacterReference.gperf" + {"thetav;", "ϑ"}, + {""}, +#line 1780 "HTMLCharacterReference.gperf" + {"rBarr;", "⤏"}, + {""}, +#line 289 "HTMLCharacterReference.gperf" + {"LeftRightVector;", "⥎"}, +#line 469 "HTMLCharacterReference.gperf" + {"Rcedil;", "Ŗ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2106 "HTMLCharacterReference.gperf" + {"ucy;", "у"}, + {""}, +#line 2012 "HTMLCharacterReference.gperf" + {"supE;", "⫆"}, + {""}, + {""}, +#line 134 "HTMLCharacterReference.gperf" + {"DoubleVerticalBar;", "∥"}, +#line 525 "HTMLCharacterReference.gperf" + {"SquareIntersection;", "⊓"}, + {""}, + {""}, + {""}, +#line 1782 "HTMLCharacterReference.gperf" + {"race;", "∽̱"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1777 "HTMLCharacterReference.gperf" + {"rAarr;", "⇛"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1365 "HTMLCharacterReference.gperf" + {"lmidot;", "ŀ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1778 "HTMLCharacterReference.gperf" + {"rArr;", "⇒"}, + {""}, + {""}, + {""}, +#line 195 "HTMLCharacterReference.gperf" + {"Gcedil;", "Ģ"}, + {""}, +#line 1944 "HTMLCharacterReference.gperf" + {"sol;", "/"}, +#line 421 "HTMLCharacterReference.gperf" + {"Oopf;", "𝕆"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 125 "HTMLCharacterReference.gperf" + {"DoubleLeftRightArrow;", "⇔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 478 "HTMLCharacterReference.gperf" + {"RightArrow;", "→"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1454 "HTMLCharacterReference.gperf" + {"minusb;", "⊟"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1746 "HTMLCharacterReference.gperf" + {"precnapprox;", "⪹"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1643 "HTMLCharacterReference.gperf" + {"ocy;", "о"}, +#line 1259 "HTMLCharacterReference.gperf" + {"jmath;", "ȷ"}, +#line 1921 "HTMLCharacterReference.gperf" + {"sigmaf;", "ς"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1715 "HTMLCharacterReference.gperf" + {"pi;", "π"}, + {""}, + {""}, + {""}, #line 2165 "HTMLCharacterReference.gperf" - {"varsupsetneqq;", "⫌︀"}, - {""}, - {""}, -#line 2062 "HTMLCharacterReference.gperf" - {"timesb;", "⊠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2131 "HTMLCharacterReference.gperf" - {"upsih;", "ϒ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1546 "HTMLCharacterReference.gperf" - {"nmid;", "∤"}, - {""}, - {""}, -#line 201 "HTMLCharacterReference.gperf" - {"GreaterEqual;", "≥"}, - {""}, - {""}, -#line 417 "HTMLCharacterReference.gperf" - {"Omacr;", "Ō"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1558 "HTMLCharacterReference.gperf" - {"notnivb;", "⋾"}, + {"varsupsetneq;", "⊋︀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 673 "HTMLCharacterReference.gperf" + {"alefsym;", "ℵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1755 "HTMLCharacterReference.gperf" + {"prod;", "∏"}, + {""}, +#line 1933 "HTMLCharacterReference.gperf" + {"simrarr;", "⥲"}, + {""}, +#line 1717 "HTMLCharacterReference.gperf" + {"piv;", "ϖ"}, + {""}, +#line 258 "HTMLCharacterReference.gperf" + {"Jukcy;", "Є"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 373 "HTMLCharacterReference.gperf" + {"NotLessEqual;", "≰"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 401 "HTMLCharacterReference.gperf" + {"NotTildeFullEqual;", "≇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 357 "HTMLCharacterReference.gperf" + {"NotEqual;", "≠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1367 "HTMLCharacterReference.gperf" + {"lmoustache;", "⎰"}, +#line 339 "HTMLCharacterReference.gperf" + {"Ncedil;", "Ņ"}, + {""}, +#line 1235 "HTMLCharacterReference.gperf" + {"intlarhk;", "⨗"}, + {""}, + {""}, +#line 508 "HTMLCharacterReference.gperf" + {"SOFTcy;", "Ь"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1979 "HTMLCharacterReference.gperf" + {"subdot;", "⪽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 728 "HTMLCharacterReference.gperf" + {"backprime;", "‵"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 675 "HTMLCharacterReference.gperf" + {"alpha;", "α"}, + {""}, +#line 180 "HTMLCharacterReference.gperf" + {"ExponentialE;", "ⅇ"}, + {""}, + {""}, +#line 2171 "HTMLCharacterReference.gperf" + {"vdash;", "⊢"}, + {""}, + {""}, + {""}, + {""}, +#line 1825 "HTMLCharacterReference.gperf" + {"realine;", "ℛ"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1350 "HTMLCharacterReference.gperf" + {"lfisht;", "⥼"}, +#line 1560 "HTMLCharacterReference.gperf" + {"notnivc;", "⋽"}, + {""}, + {""}, + {""}, +#line 204 "HTMLCharacterReference.gperf" + {"GreaterFullEqual;", "≧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 249 "HTMLCharacterReference.gperf" + {"Iukcy;", "І"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 139 "HTMLCharacterReference.gperf" + {"DownLeftRightVector;", "⥐"}, + {""}, + {""}, + {""}, + {""}, +#line 1224 "HTMLCharacterReference.gperf" + {"imof;", "⊷"}, +#line 1325 "HTMLCharacterReference.gperf" + {"leftharpoondown;", "↽"}, +#line 959 "HTMLCharacterReference.gperf" + {"dfisht;", "⥿"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 347 "HTMLCharacterReference.gperf" + {"NewLine;", "\n"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2097 "HTMLCharacterReference.gperf" + {"uArr;", "⇑"}, + {""}, +#line 1223 "HTMLCharacterReference.gperf" + {"imath;", "ı"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 651 "HTMLCharacterReference.gperf" + {"ZeroWidthSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 756 "HTMLCharacterReference.gperf" + {"bigtriangledown;", "▽"}, + {""}, +#line 1860 "HTMLCharacterReference.gperf" + {"ropf;", "𝕣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 313 "HTMLCharacterReference.gperf" + {"Lmidot;", "Ŀ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1433 "HTMLCharacterReference.gperf" + {"maltese;", "✠"}, + {""}, + {""}, + {""}, +#line 535 "HTMLCharacterReference.gperf" + {"SubsetEqual;", "⊆"}, +#line 2128 "HTMLCharacterReference.gperf" + {"upharpoonleft;", "↿"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 355 "HTMLCharacterReference.gperf" + {"NotDoubleVerticalBar;", "∦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1431 "HTMLCharacterReference.gperf" + {"male;", "♂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2166 "HTMLCharacterReference.gperf" + {"varsupsetneqq;", "⫌︀"}, + {""}, + {""}, #line 2063 "HTMLCharacterReference.gperf" - {"timesbar;", "⨱"}, - {""}, - {""}, - {""}, -#line 1805 "HTMLCharacterReference.gperf" - {"rationals;", "ℚ"}, - {""}, - {""}, - {""}, - {""}, -#line 1681 "HTMLCharacterReference.gperf" - {"origof;", "⊶"}, -#line 341 "HTMLCharacterReference.gperf" - {"NegativeThickSpace;", "​"}, - {""}, - {""}, -#line 1784 "HTMLCharacterReference.gperf" - {"raemptyv;", "⦳"}, + {"timesb;", "⊠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2132 "HTMLCharacterReference.gperf" + {"upsih;", "ϒ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1547 "HTMLCharacterReference.gperf" + {"nmid;", "∤"}, + {""}, + {""}, +#line 202 "HTMLCharacterReference.gperf" + {"GreaterEqual;", "≥"}, + {""}, + {""}, +#line 418 "HTMLCharacterReference.gperf" + {"Omacr;", "Ō"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1559 "HTMLCharacterReference.gperf" + {"notnivb;", "⋾"}, +#line 2064 "HTMLCharacterReference.gperf" + {"timesbar;", "⨱"}, + {""}, + {""}, + {""}, +#line 1806 "HTMLCharacterReference.gperf" + {"rationals;", "ℚ"}, + {""}, + {""}, + {""}, + {""}, +#line 1682 "HTMLCharacterReference.gperf" + {"origof;", "⊶"}, +#line 342 "HTMLCharacterReference.gperf" + {"NegativeThickSpace;", "​"}, + {""}, + {""}, #line 1785 "HTMLCharacterReference.gperf" - {"rang;", "⟩"}, - {""}, - {""}, - {""}, -#line 616 "HTMLCharacterReference.gperf" - {"VerticalBar;", "∣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2128 "HTMLCharacterReference.gperf" - {"upharpoonright;", "↾"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1796 "HTMLCharacterReference.gperf" - {"rarrfs;", "⤞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1864 "HTMLCharacterReference.gperf" - {"rppolint;", "⨒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 553 "HTMLCharacterReference.gperf" - {"Tcedil;", "Ţ"}, - {""}, - {""}, - {""}, -#line 805 "HTMLCharacterReference.gperf" - {"boxhD;", "╥"}, - {""}, -#line 1588 "HTMLCharacterReference.gperf" - {"nsqsube;", "⋢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2118 "HTMLCharacterReference.gperf" - {"ulcrop;", "⌏"}, - {""}, - {""}, - {""}, - {""}, -#line 2167 "HTMLCharacterReference.gperf" - {"vartriangleleft;", "⊲"}, -#line 1661 "HTMLCharacterReference.gperf" - {"oline;", "‾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 608 "HTMLCharacterReference.gperf" - {"VDash;", "⊫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2116 "HTMLCharacterReference.gperf" - {"ulcorn;", "⌜"}, - {""}, -#line 2013 "HTMLCharacterReference.gperf" - {"supdsub;", "⫘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2124 "HTMLCharacterReference.gperf" - {"uopf;", "𝕦"}, - {""}, - {""}, -#line 1264 "HTMLCharacterReference.gperf" - {"kappav;", "ϰ"}, -#line 1981 "HTMLCharacterReference.gperf" - {"submult;", "⫁"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 479 "HTMLCharacterReference.gperf" - {"RightArrowLeftArrow;", "⇄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1507 "HTMLCharacterReference.gperf" - {"nequiv;", "≢"}, - {""}, - {""}, -#line 928 "HTMLCharacterReference.gperf" - {"curlyvee;", "⋎"}, -#line 1886 "HTMLCharacterReference.gperf" - {"sccue;", "≽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1986 "HTMLCharacterReference.gperf" - {"subset;", "⊂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1659 "HTMLCharacterReference.gperf" - {"olcir;", "⦾"}, -#line 237 "HTMLCharacterReference.gperf" - {"Implies;", "⇒"}, - {""}, -#line 284 "HTMLCharacterReference.gperf" - {"LeftDownVector;", "⇃"}, - {""}, - {""}, -#line 285 "HTMLCharacterReference.gperf" - {"LeftDownVectorBar;", "⥙"}, -#line 766 "HTMLCharacterReference.gperf" - {"blacktriangleright;", "▸"}, -#line 1803 "HTMLCharacterReference.gperf" - {"ratail;", "⤚"}, - {""}, -#line 1996 "HTMLCharacterReference.gperf" - {"succcurlyeq;", "≽"}, - {""}, - {""}, - {""}, -#line 1668 "HTMLCharacterReference.gperf" - {"oopf;", "𝕠"}, -#line 281 "HTMLCharacterReference.gperf" - {"LeftCeiling;", "⌈"}, - {""}, -#line 1787 "HTMLCharacterReference.gperf" - {"range;", "⦥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1831 "HTMLCharacterReference.gperf" - {"rfloor;", "⌋"}, - {""}, - {""}, + {"raemptyv;", "⦳"}, +#line 1786 "HTMLCharacterReference.gperf" + {"rang;", "⟩"}, + {""}, + {""}, + {""}, #line 617 "HTMLCharacterReference.gperf" - {"VerticalLine;", "|"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1944 "HTMLCharacterReference.gperf" - {"solb;", "⧄"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1500 "HTMLCharacterReference.gperf" - {"ndash;", "–"}, -#line 1574 "HTMLCharacterReference.gperf" - {"nrightarrow;", "↛"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1631 "HTMLCharacterReference.gperf" - {"nwarhk;", "⤣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 402 "HTMLCharacterReference.gperf" - {"NotVerticalBar;", "∤"}, -#line 311 "HTMLCharacterReference.gperf" - {"Lleftarrow;", "⇚"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2045 "HTMLCharacterReference.gperf" - {"telrec;", "⌕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2108 "HTMLCharacterReference.gperf" - {"udhar;", "⥮"}, - {""}, - {""}, -#line 1706 "HTMLCharacterReference.gperf" - {"permil;", "‰"}, - {""}, - {""}, - {""}, -#line 413 "HTMLCharacterReference.gperf" - {"Odblac;", "Ő"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 50 "HTMLCharacterReference.gperf" - {"Barwed;", "⌆"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1934 "HTMLCharacterReference.gperf" - {"smallsetminus;", "∖"}, -#line 1940 "HTMLCharacterReference.gperf" - {"smte;", "⪬"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 392 "HTMLCharacterReference.gperf" - {"NotSucceeds;", "⊁"}, - {""}, - {""}, - {""}, - {""}, -#line 1031 "HTMLCharacterReference.gperf" - {"empty;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 215 "HTMLCharacterReference.gperf" - {"HilbertSpace;", "ℋ"}, -#line 1221 "HTMLCharacterReference.gperf" - {"imagpart;", "ℑ"}, - {""}, - {""}, -#line 1739 "HTMLCharacterReference.gperf" - {"prcue;", "≼"}, + {"VerticalBar;", "∣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2129 "HTMLCharacterReference.gperf" + {"upharpoonright;", "↾"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1797 "HTMLCharacterReference.gperf" + {"rarrfs;", "⤞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1865 "HTMLCharacterReference.gperf" + {"rppolint;", "⨒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 554 "HTMLCharacterReference.gperf" + {"Tcedil;", "Ţ"}, + {""}, + {""}, + {""}, +#line 806 "HTMLCharacterReference.gperf" + {"boxhD;", "╥"}, + {""}, +#line 1589 "HTMLCharacterReference.gperf" + {"nsqsube;", "⋢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2119 "HTMLCharacterReference.gperf" + {"ulcrop;", "⌏"}, + {""}, + {""}, + {""}, + {""}, +#line 2168 "HTMLCharacterReference.gperf" + {"vartriangleleft;", "⊲"}, +#line 1662 "HTMLCharacterReference.gperf" + {"oline;", "‾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 609 "HTMLCharacterReference.gperf" + {"VDash;", "⊫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2117 "HTMLCharacterReference.gperf" - {"ulcorner;", "⌜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1703 "HTMLCharacterReference.gperf" - {"pcy;", "п"}, - {""}, - {""}, -#line 146 "HTMLCharacterReference.gperf" - {"DownTeeArrow;", "↧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1926 "HTMLCharacterReference.gperf" - {"simg;", "⪞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 501 "HTMLCharacterReference.gperf" - {"Rrightarrow;", "⇛"}, - {""}, -#line 1465 "HTMLCharacterReference.gperf" - {"multimap;", "⊸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 472 "HTMLCharacterReference.gperf" - {"ReverseEquilibrium;", "⇋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 759 "HTMLCharacterReference.gperf" - {"bigwedge;", "⋀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 261 "HTMLCharacterReference.gperf" - {"Kcedil;", "Ķ"}, -#line 1622 "HTMLCharacterReference.gperf" - {"nvinfin;", "⧞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 763 "HTMLCharacterReference.gperf" - {"blacktriangle;", "▴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ulcorn;", "⌜"}, + {""}, +#line 2014 "HTMLCharacterReference.gperf" + {"supdsub;", "⫘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2125 "HTMLCharacterReference.gperf" + {"uopf;", "𝕦"}, + {""}, + {""}, +#line 1265 "HTMLCharacterReference.gperf" + {"kappav;", "ϰ"}, +#line 1982 "HTMLCharacterReference.gperf" + {"submult;", "⫁"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 480 "HTMLCharacterReference.gperf" + {"RightArrowLeftArrow;", "⇄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1508 "HTMLCharacterReference.gperf" + {"nequiv;", "≢"}, + {""}, + {""}, +#line 929 "HTMLCharacterReference.gperf" + {"curlyvee;", "⋎"}, +#line 1887 "HTMLCharacterReference.gperf" + {"sccue;", "≽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1987 "HTMLCharacterReference.gperf" - {"subseteq;", "⊆"}, + {"subset;", "⊂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1660 "HTMLCharacterReference.gperf" + {"olcir;", "⦾"}, +#line 238 "HTMLCharacterReference.gperf" + {"Implies;", "⇒"}, + {""}, +#line 285 "HTMLCharacterReference.gperf" + {"LeftDownVector;", "⇃"}, + {""}, + {""}, +#line 286 "HTMLCharacterReference.gperf" + {"LeftDownVectorBar;", "⥙"}, +#line 767 "HTMLCharacterReference.gperf" + {"blacktriangleright;", "▸"}, +#line 1804 "HTMLCharacterReference.gperf" + {"ratail;", "⤚"}, + {""}, +#line 1997 "HTMLCharacterReference.gperf" + {"succcurlyeq;", "≽"}, + {""}, + {""}, + {""}, +#line 1669 "HTMLCharacterReference.gperf" + {"oopf;", "𝕠"}, +#line 282 "HTMLCharacterReference.gperf" + {"LeftCeiling;", "⌈"}, + {""}, +#line 1788 "HTMLCharacterReference.gperf" + {"range;", "⦥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1832 "HTMLCharacterReference.gperf" + {"rfloor;", "⌋"}, + {""}, + {""}, +#line 618 "HTMLCharacterReference.gperf" + {"VerticalLine;", "|"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1945 "HTMLCharacterReference.gperf" + {"solb;", "⧄"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1501 "HTMLCharacterReference.gperf" + {"ndash;", "–"}, +#line 1575 "HTMLCharacterReference.gperf" + {"nrightarrow;", "↛"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1632 "HTMLCharacterReference.gperf" + {"nwarhk;", "⤣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 403 "HTMLCharacterReference.gperf" + {"NotVerticalBar;", "∤"}, +#line 312 "HTMLCharacterReference.gperf" + {"Lleftarrow;", "⇚"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2046 "HTMLCharacterReference.gperf" + {"telrec;", "⌕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2109 "HTMLCharacterReference.gperf" + {"udhar;", "⥮"}, + {""}, + {""}, +#line 1707 "HTMLCharacterReference.gperf" + {"permil;", "‰"}, + {""}, + {""}, + {""}, +#line 414 "HTMLCharacterReference.gperf" + {"Odblac;", "Ő"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 51 "HTMLCharacterReference.gperf" + {"Barwed;", "⌆"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1935 "HTMLCharacterReference.gperf" + {"smallsetminus;", "∖"}, +#line 1941 "HTMLCharacterReference.gperf" + {"smte;", "⪬"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 393 "HTMLCharacterReference.gperf" + {"NotSucceeds;", "⊁"}, + {""}, + {""}, + {""}, + {""}, +#line 1032 "HTMLCharacterReference.gperf" + {"empty;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 216 "HTMLCharacterReference.gperf" + {"HilbertSpace;", "ℋ"}, +#line 1222 "HTMLCharacterReference.gperf" + {"imagpart;", "ℑ"}, + {""}, + {""}, +#line 1740 "HTMLCharacterReference.gperf" + {"prcue;", "≼"}, +#line 2118 "HTMLCharacterReference.gperf" + {"ulcorner;", "⌜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1704 "HTMLCharacterReference.gperf" + {"pcy;", "п"}, + {""}, + {""}, +#line 147 "HTMLCharacterReference.gperf" + {"DownTeeArrow;", "↧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1927 "HTMLCharacterReference.gperf" + {"simg;", "⪞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 502 "HTMLCharacterReference.gperf" + {"Rrightarrow;", "⇛"}, + {""}, +#line 1466 "HTMLCharacterReference.gperf" + {"multimap;", "⊸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 473 "HTMLCharacterReference.gperf" + {"ReverseEquilibrium;", "⇋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 760 "HTMLCharacterReference.gperf" + {"bigwedge;", "⋀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 262 "HTMLCharacterReference.gperf" + {"Kcedil;", "Ķ"}, +#line 1623 "HTMLCharacterReference.gperf" + {"nvinfin;", "⧞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 764 "HTMLCharacterReference.gperf" + {"blacktriangle;", "▴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1988 "HTMLCharacterReference.gperf" - {"subseteqq;", "⫅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1660 "HTMLCharacterReference.gperf" - {"olcross;", "⦻"}, - {""}, - {""}, -#line 202 "HTMLCharacterReference.gperf" - {"GreaterEqualLess;", "⋛"}, - {""}, - {""}, -#line 2120 "HTMLCharacterReference.gperf" - {"umacr;", "ū"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1880 "HTMLCharacterReference.gperf" - {"sacute;", "ś"}, - {""}, - {""}, -#line 1677 "HTMLCharacterReference.gperf" - {"ordf", "ª"}, + {"subseteq;", "⊆"}, +#line 1989 "HTMLCharacterReference.gperf" + {"subseteqq;", "⫅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1661 "HTMLCharacterReference.gperf" + {"olcross;", "⦻"}, + {""}, + {""}, +#line 203 "HTMLCharacterReference.gperf" + {"GreaterEqualLess;", "⋛"}, + {""}, + {""}, +#line 2121 "HTMLCharacterReference.gperf" + {"umacr;", "ū"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1881 "HTMLCharacterReference.gperf" + {"sacute;", "ś"}, + {""}, + {""}, #line 1678 "HTMLCharacterReference.gperf" - {"ordf;", "ª"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 129 "HTMLCharacterReference.gperf" - {"DoubleRightArrow;", "⇒"}, - {""}, - {""}, - {""}, -#line 1938 "HTMLCharacterReference.gperf" - {"smile;", "⌣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1941 "HTMLCharacterReference.gperf" - {"smtes;", "⪬︀"}, -#line 1663 "HTMLCharacterReference.gperf" - {"omacr;", "ō"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1923 "HTMLCharacterReference.gperf" - {"simdot;", "⩪"}, - {""}, - {""}, - {""}, -#line 79 "HTMLCharacterReference.gperf" - {"CirclePlus;", "⊕"}, - {""}, - {""}, - {""}, -#line 1809 "HTMLCharacterReference.gperf" - {"rbrack;", "]"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1535 "HTMLCharacterReference.gperf" - {"nleftarrow;", "↚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"ordf", "ª"}, +#line 1679 "HTMLCharacterReference.gperf" + {"ordf;", "ª"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 130 "HTMLCharacterReference.gperf" + {"DoubleRightArrow;", "⇒"}, + {""}, + {""}, + {""}, +#line 1939 "HTMLCharacterReference.gperf" + {"smile;", "⌣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1942 "HTMLCharacterReference.gperf" + {"smtes;", "⪬︀"}, +#line 1664 "HTMLCharacterReference.gperf" + {"omacr;", "ō"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1924 "HTMLCharacterReference.gperf" + {"simdot;", "⩪"}, + {""}, + {""}, + {""}, #line 80 "HTMLCharacterReference.gperf" - {"CircleTimes;", "⊗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 593 "HTMLCharacterReference.gperf" - {"UpDownArrow;", "↕"}, - {""}, -#line 1786 "HTMLCharacterReference.gperf" - {"rangd;", "⦒"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1032 "HTMLCharacterReference.gperf" - {"emptyset;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 68 "HTMLCharacterReference.gperf" - {"Ccedil", "Ç"}, + {"CirclePlus;", "⊕"}, + {""}, + {""}, + {""}, +#line 1810 "HTMLCharacterReference.gperf" + {"rbrack;", "]"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1536 "HTMLCharacterReference.gperf" + {"nleftarrow;", "↚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 81 "HTMLCharacterReference.gperf" + {"CircleTimes;", "⊗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 594 "HTMLCharacterReference.gperf" + {"UpDownArrow;", "↕"}, + {""}, +#line 1787 "HTMLCharacterReference.gperf" + {"rangd;", "⦒"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1033 "HTMLCharacterReference.gperf" + {"emptyset;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 69 "HTMLCharacterReference.gperf" - {"Ccedil;", "Ç"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1927 "HTMLCharacterReference.gperf" - {"simgE;", "⪠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 34 "HTMLCharacterReference.gperf" - {"Alpha;", "Α"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 408 "HTMLCharacterReference.gperf" - {"Oacute", "Ó"}, + {"Ccedil", "Ç"}, +#line 70 "HTMLCharacterReference.gperf" + {"Ccedil;", "Ç"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1928 "HTMLCharacterReference.gperf" + {"simgE;", "⪠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 35 "HTMLCharacterReference.gperf" + {"Alpha;", "Α"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 409 "HTMLCharacterReference.gperf" - {"Oacute;", "Ó"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1503 "HTMLCharacterReference.gperf" - {"nearhk;", "⤤"}, - {""}, -#line 142 "HTMLCharacterReference.gperf" - {"DownRightTeeVector;", "⥟"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1708 "HTMLCharacterReference.gperf" - {"pertenk;", "‱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2162 "HTMLCharacterReference.gperf" - {"varsubsetneq;", "⊊︀"}, - {""}, - {""}, -#line 1536 "HTMLCharacterReference.gperf" - {"nleftrightarrow;", "↮"}, -#line 2156 "HTMLCharacterReference.gperf" - {"varphi;", "ϕ"}, -#line 1743 "HTMLCharacterReference.gperf" - {"preccurlyeq;", "≼"}, - {""}, -#line 1788 "HTMLCharacterReference.gperf" - {"rangle;", "⟩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1989 "HTMLCharacterReference.gperf" - {"subsetneq;", "⊊"}, + {"Oacute", "Ó"}, +#line 410 "HTMLCharacterReference.gperf" + {"Oacute;", "Ó"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1504 "HTMLCharacterReference.gperf" + {"nearhk;", "⤤"}, + {""}, +#line 143 "HTMLCharacterReference.gperf" + {"DownRightTeeVector;", "⥟"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1709 "HTMLCharacterReference.gperf" + {"pertenk;", "‱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2163 "HTMLCharacterReference.gperf" + {"varsubsetneq;", "⊊︀"}, + {""}, + {""}, +#line 1537 "HTMLCharacterReference.gperf" + {"nleftrightarrow;", "↮"}, +#line 2157 "HTMLCharacterReference.gperf" + {"varphi;", "ϕ"}, +#line 1744 "HTMLCharacterReference.gperf" + {"preccurlyeq;", "≼"}, + {""}, +#line 1789 "HTMLCharacterReference.gperf" + {"rangle;", "⟩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1990 "HTMLCharacterReference.gperf" - {"subsetneqq;", "⫋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2107 "HTMLCharacterReference.gperf" - {"udblac;", "ű"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 486 "HTMLCharacterReference.gperf" - {"RightTee;", "⊢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 217 "HTMLCharacterReference.gperf" - {"HorizontalLine;", "─"}, -#line 2028 "HTMLCharacterReference.gperf" - {"supsim;", "⫈"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 488 "HTMLCharacterReference.gperf" - {"RightTeeVector;", "⥛"}, - {""}, - {""}, - {""}, - {""}, -#line 1948 "HTMLCharacterReference.gperf" - {"spadesuit;", "♠"}, - {""}, - {""}, - {""}, - {""}, -#line 1173 "HTMLCharacterReference.gperf" - {"half;", "½"}, - {""}, - {""}, - {""}, -#line 1893 "HTMLCharacterReference.gperf" - {"scpolint;", "⨓"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1977 "HTMLCharacterReference.gperf" - {"subE;", "⫅"}, - {""}, -#line 1215 "HTMLCharacterReference.gperf" - {"iinfin;", "⧜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1644 "HTMLCharacterReference.gperf" - {"odblac;", "ő"}, - {""}, - {""}, - {""}, -#line 989 "HTMLCharacterReference.gperf" - {"downharpoonright;", "⇂"}, - {""}, - {""}, - {""}, -#line 1733 "HTMLCharacterReference.gperf" - {"popf;", "𝕡"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2030 "HTMLCharacterReference.gperf" - {"supsup;", "⫖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 433 "HTMLCharacterReference.gperf" - {"OverBrace;", "⏞"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2101 "HTMLCharacterReference.gperf" - {"ubrcy;", "ў"}, -#line 1294 "HTMLCharacterReference.gperf" - {"larrhk;", "↩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 498 "HTMLCharacterReference.gperf" - {"Rightarrow;", "⇒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1890 "HTMLCharacterReference.gperf" - {"scnE;", "⪶"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 139 "HTMLCharacterReference.gperf" - {"DownLeftTeeVector;", "⥞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 77 "HTMLCharacterReference.gperf" - {"CircleDot;", "⊙"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 611 "HTMLCharacterReference.gperf" - {"Vdash;", "⊩"}, - {""}, - {""}, -#line 1731 "HTMLCharacterReference.gperf" - {"pm;", "±"}, - {""}, - {""}, -#line 1475 "HTMLCharacterReference.gperf" - {"nRightarrow;", "⇏"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1847 "HTMLCharacterReference.gperf" - {"ring;", "˚"}, - {""}, -#line 1782 "HTMLCharacterReference.gperf" - {"racute;", "ŕ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"subsetneq;", "⊊"}, +#line 1991 "HTMLCharacterReference.gperf" + {"subsetneqq;", "⫋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2108 "HTMLCharacterReference.gperf" + {"udblac;", "ű"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 487 "HTMLCharacterReference.gperf" + {"RightTee;", "⊢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 218 "HTMLCharacterReference.gperf" + {"HorizontalLine;", "─"}, +#line 2029 "HTMLCharacterReference.gperf" + {"supsim;", "⫈"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 489 "HTMLCharacterReference.gperf" + {"RightTeeVector;", "⥛"}, + {""}, + {""}, + {""}, + {""}, +#line 1949 "HTMLCharacterReference.gperf" + {"spadesuit;", "♠"}, + {""}, + {""}, + {""}, + {""}, +#line 1174 "HTMLCharacterReference.gperf" + {"half;", "½"}, + {""}, + {""}, + {""}, +#line 1894 "HTMLCharacterReference.gperf" + {"scpolint;", "⨓"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1978 "HTMLCharacterReference.gperf" + {"subE;", "⫅"}, + {""}, +#line 1216 "HTMLCharacterReference.gperf" + {"iinfin;", "⧜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1645 "HTMLCharacterReference.gperf" + {"odblac;", "ő"}, + {""}, + {""}, + {""}, +#line 990 "HTMLCharacterReference.gperf" + {"downharpoonright;", "⇂"}, + {""}, + {""}, + {""}, +#line 1734 "HTMLCharacterReference.gperf" + {"popf;", "𝕡"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2031 "HTMLCharacterReference.gperf" + {"supsup;", "⫖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 434 "HTMLCharacterReference.gperf" + {"OverBrace;", "⏞"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2102 "HTMLCharacterReference.gperf" + {"ubrcy;", "ў"}, +#line 1295 "HTMLCharacterReference.gperf" + {"larrhk;", "↩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 499 "HTMLCharacterReference.gperf" + {"Rightarrow;", "⇒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1891 "HTMLCharacterReference.gperf" + {"scnE;", "⪶"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 140 "HTMLCharacterReference.gperf" + {"DownLeftTeeVector;", "⥞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 78 "HTMLCharacterReference.gperf" + {"CircleDot;", "⊙"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 612 "HTMLCharacterReference.gperf" - {"Vdashl;", "⫦"}, -#line 1626 "HTMLCharacterReference.gperf" - {"nvltrie;", "⊴⃒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 494 "HTMLCharacterReference.gperf" - {"RightUpVector;", "↾"}, -#line 21 "HTMLCharacterReference.gperf" - {"AElig", "Æ"}, + {"Vdash;", "⊩"}, + {""}, + {""}, +#line 1732 "HTMLCharacterReference.gperf" + {"pm;", "±"}, + {""}, + {""}, +#line 1476 "HTMLCharacterReference.gperf" + {"nRightarrow;", "⇏"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1848 "HTMLCharacterReference.gperf" + {"ring;", "˚"}, + {""}, +#line 1783 "HTMLCharacterReference.gperf" + {"racute;", "ŕ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 613 "HTMLCharacterReference.gperf" + {"Vdashl;", "⫦"}, +#line 1627 "HTMLCharacterReference.gperf" + {"nvltrie;", "⊴⃒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 495 "HTMLCharacterReference.gperf" + {"RightUpVector;", "↾"}, #line 22 "HTMLCharacterReference.gperf" - {"AElig;", "Æ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2163 "HTMLCharacterReference.gperf" - {"varsubsetneqq;", "⫋︀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2093 "HTMLCharacterReference.gperf" - {"twixt;", "≬"}, -#line 2001 "HTMLCharacterReference.gperf" - {"succsim;", "≿"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 425 "HTMLCharacterReference.gperf" - {"Oslash", "Ø"}, + {"AElig", "Æ"}, +#line 23 "HTMLCharacterReference.gperf" + {"AElig;", "Æ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2164 "HTMLCharacterReference.gperf" + {"varsubsetneqq;", "⫋︀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2094 "HTMLCharacterReference.gperf" + {"twixt;", "≬"}, +#line 2002 "HTMLCharacterReference.gperf" + {"succsim;", "≿"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 426 "HTMLCharacterReference.gperf" - {"Oslash;", "Ø"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1822 "HTMLCharacterReference.gperf" - {"rdsh;", "↳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 520 "HTMLCharacterReference.gperf" - {"SmallCircle;", "∘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 478 "HTMLCharacterReference.gperf" - {"RightArrowBar;", "⇥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 53 "HTMLCharacterReference.gperf" - {"Bernoullis;", "ℬ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 619 "HTMLCharacterReference.gperf" - {"VerticalTilde;", "≀"}, - {""}, - {""}, - {""}, - {""}, -#line 357 "HTMLCharacterReference.gperf" - {"NotEqualTilde;", "≂̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 397 "HTMLCharacterReference.gperf" - {"NotSupersetEqual;", "⊉"}, - {""}, - {""}, - {""}, -#line 1751 "HTMLCharacterReference.gperf" - {"prnE;", "⪵"}, - {""}, - {""}, -#line 1850 "HTMLCharacterReference.gperf" - {"rlhar;", "⇌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1077 "HTMLCharacterReference.gperf" - {"ffllig;", "ffl"}, -#line 2035 "HTMLCharacterReference.gperf" - {"swnwar;", "⤪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2053 "HTMLCharacterReference.gperf" - {"thicksim;", "∼"}, - {""}, - {""}, - {""}, -#line 2095 "HTMLCharacterReference.gperf" - {"twoheadrightarrow;", "↠"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2119 "HTMLCharacterReference.gperf" - {"ultri;", "◸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 434 "HTMLCharacterReference.gperf" - {"OverBracket;", "⎴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1318 "HTMLCharacterReference.gperf" - {"ldrdhar;", "⥧"}, - {""}, - {""}, -#line 1441 "HTMLCharacterReference.gperf" - {"mdash;", "—"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1187 "HTMLCharacterReference.gperf" - {"hkswarow;", "⤦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 143 "HTMLCharacterReference.gperf" - {"DownRightVector;", "⇁"}, - {""}, -#line 419 "HTMLCharacterReference.gperf" - {"Omicron;", "Ο"}, + {"Oslash", "Ø"}, +#line 427 "HTMLCharacterReference.gperf" + {"Oslash;", "Ø"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1823 "HTMLCharacterReference.gperf" + {"rdsh;", "↳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 521 "HTMLCharacterReference.gperf" + {"SmallCircle;", "∘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 479 "HTMLCharacterReference.gperf" + {"RightArrowBar;", "⇥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 54 "HTMLCharacterReference.gperf" + {"Bernoullis;", "ℬ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 620 "HTMLCharacterReference.gperf" + {"VerticalTilde;", "≀"}, + {""}, + {""}, + {""}, + {""}, +#line 358 "HTMLCharacterReference.gperf" + {"NotEqualTilde;", "≂̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 398 "HTMLCharacterReference.gperf" + {"NotSupersetEqual;", "⊉"}, + {""}, + {""}, + {""}, +#line 1752 "HTMLCharacterReference.gperf" + {"prnE;", "⪵"}, + {""}, + {""}, +#line 1851 "HTMLCharacterReference.gperf" + {"rlhar;", "⇌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1078 "HTMLCharacterReference.gperf" + {"ffllig;", "ffl"}, +#line 2036 "HTMLCharacterReference.gperf" + {"swnwar;", "⤪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2054 "HTMLCharacterReference.gperf" + {"thicksim;", "∼"}, + {""}, + {""}, + {""}, +#line 2096 "HTMLCharacterReference.gperf" + {"twoheadrightarrow;", "↠"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2120 "HTMLCharacterReference.gperf" + {"ultri;", "◸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 435 "HTMLCharacterReference.gperf" + {"OverBracket;", "⎴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1319 "HTMLCharacterReference.gperf" + {"ldrdhar;", "⥧"}, + {""}, + {""}, +#line 1442 "HTMLCharacterReference.gperf" + {"mdash;", "—"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1188 "HTMLCharacterReference.gperf" + {"hkswarow;", "⤦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 144 "HTMLCharacterReference.gperf" - {"DownRightVectorBar;", "⥗"}, -#line 2098 "HTMLCharacterReference.gperf" - {"uacute", "ú"}, + {"DownRightVector;", "⇁"}, + {""}, +#line 420 "HTMLCharacterReference.gperf" + {"Omicron;", "Ο"}, +#line 145 "HTMLCharacterReference.gperf" + {"DownRightVectorBar;", "⥗"}, #line 2099 "HTMLCharacterReference.gperf" - {"uacute;", "ú"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 487 "HTMLCharacterReference.gperf" - {"RightTeeArrow;", "↦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 432 "HTMLCharacterReference.gperf" - {"OverBar;", "‾"}, -#line 1488 "HTMLCharacterReference.gperf" - {"naturals;", "ℕ"}, - {""}, - {""}, -#line 1265 "HTMLCharacterReference.gperf" - {"kcedil;", "ķ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 493 "HTMLCharacterReference.gperf" - {"RightUpTeeVector;", "⥜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 764 "HTMLCharacterReference.gperf" - {"blacktriangledown;", "▾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 358 "HTMLCharacterReference.gperf" - {"NotExists;", "∄"}, -#line 223 "HTMLCharacterReference.gperf" - {"IJlig;", "IJ"}, -#line 305 "HTMLCharacterReference.gperf" - {"LessGreater;", "≶"}, - {""}, - {""}, - {""}, - {""}, -#line 1636 "HTMLCharacterReference.gperf" - {"oacute", "ó"}, + {"uacute", "ú"}, +#line 2100 "HTMLCharacterReference.gperf" + {"uacute;", "ú"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 488 "HTMLCharacterReference.gperf" + {"RightTeeArrow;", "↦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 433 "HTMLCharacterReference.gperf" + {"OverBar;", "‾"}, +#line 1489 "HTMLCharacterReference.gperf" + {"naturals;", "ℕ"}, + {""}, + {""}, +#line 1266 "HTMLCharacterReference.gperf" + {"kcedil;", "ķ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 494 "HTMLCharacterReference.gperf" + {"RightUpTeeVector;", "⥜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 765 "HTMLCharacterReference.gperf" + {"blacktriangledown;", "▾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 359 "HTMLCharacterReference.gperf" + {"NotExists;", "∄"}, +#line 224 "HTMLCharacterReference.gperf" + {"IJlig;", "IJ"}, +#line 306 "HTMLCharacterReference.gperf" + {"LessGreater;", "≶"}, + {""}, + {""}, + {""}, + {""}, #line 1637 "HTMLCharacterReference.gperf" - {"oacute;", "ó"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1757 "HTMLCharacterReference.gperf" - {"profsurf;", "⌓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1701 "HTMLCharacterReference.gperf" - {"parsl;", "⫽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 277 "HTMLCharacterReference.gperf" - {"LeftAngleBracket;", "⟨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1945 "HTMLCharacterReference.gperf" - {"solbar;", "⌿"}, - {""}, - {""}, - {""}, - {""}, -#line 78 "HTMLCharacterReference.gperf" - {"CircleMinus;", "⊖"}, - {""}, - {""}, - {""}, - {""}, -#line 91 "HTMLCharacterReference.gperf" - {"CounterClockwiseContourIntegral;", "∳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2017 "HTMLCharacterReference.gperf" - {"suphsub;", "⫗"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 883 "HTMLCharacterReference.gperf" - {"cirscir;", "⧂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1487 "HTMLCharacterReference.gperf" - {"natural;", "♮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 110 "HTMLCharacterReference.gperf" - {"DiacriticalDot;", "˙"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 236 "HTMLCharacterReference.gperf" - {"ImaginaryI;", "ⅈ"}, - {""}, - {""}, - {""}, - {""}, -#line 591 "HTMLCharacterReference.gperf" - {"UpArrowBar;", "⤒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 394 "HTMLCharacterReference.gperf" - {"NotSucceedsSlantEqual;", "⋡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1906 "HTMLCharacterReference.gperf" - {"seswar;", "⤩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 422 "HTMLCharacterReference.gperf" - {"OpenCurlyQuote;", "‘"}, - {""}, - {""}, -#line 2071 "HTMLCharacterReference.gperf" - {"topfork;", "⫚"}, - {""}, - {""}, -#line 435 "HTMLCharacterReference.gperf" - {"OverParenthesis;", "⏜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"oacute", "ó"}, +#line 1638 "HTMLCharacterReference.gperf" + {"oacute;", "ó"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1758 "HTMLCharacterReference.gperf" + {"profsurf;", "⌓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1702 "HTMLCharacterReference.gperf" + {"parsl;", "⫽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 278 "HTMLCharacterReference.gperf" + {"LeftAngleBracket;", "⟨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1946 "HTMLCharacterReference.gperf" + {"solbar;", "⌿"}, + {""}, + {""}, + {""}, + {""}, +#line 79 "HTMLCharacterReference.gperf" + {"CircleMinus;", "⊖"}, + {""}, + {""}, + {""}, + {""}, +#line 92 "HTMLCharacterReference.gperf" + {"CounterClockwiseContourIntegral;", "∳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2018 "HTMLCharacterReference.gperf" + {"suphsub;", "⫗"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 884 "HTMLCharacterReference.gperf" + {"cirscir;", "⧂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1488 "HTMLCharacterReference.gperf" + {"natural;", "♮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 111 "HTMLCharacterReference.gperf" - {"DiacriticalDoubleAcute;", "˝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1800 "HTMLCharacterReference.gperf" - {"rarrsim;", "⥴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2042 "HTMLCharacterReference.gperf" - {"tcedil;", "ţ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1848 "HTMLCharacterReference.gperf" - {"risingdotseq;", "≓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1648 "HTMLCharacterReference.gperf" - {"oelig;", "œ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 331 "HTMLCharacterReference.gperf" - {"MinusPlus;", "∓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1913 "HTMLCharacterReference.gperf" - {"shchcy;", "щ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1699 "HTMLCharacterReference.gperf" - {"parallel;", "∥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 476 "HTMLCharacterReference.gperf" - {"RightAngleBracket;", "⟩"}, - {""}, - {""}, - {""}, -#line 1686 "HTMLCharacterReference.gperf" - {"oslash", "ø"}, -#line 1687 "HTMLCharacterReference.gperf" - {"oslash;", "ø"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1748 "HTMLCharacterReference.gperf" - {"precsim;", "≾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1582 "HTMLCharacterReference.gperf" - {"nshortparallel;", "∦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"DiacriticalDot;", "˙"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 237 "HTMLCharacterReference.gperf" + {"ImaginaryI;", "ⅈ"}, + {""}, + {""}, + {""}, + {""}, #line 592 "HTMLCharacterReference.gperf" - {"UpArrowDownArrow;", "⇅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2000 "HTMLCharacterReference.gperf" - {"succnsim;", "⋩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1665 "HTMLCharacterReference.gperf" - {"omicron;", "ο"}, - {""}, - {""}, - {""}, - {""}, -#line 881 "HTMLCharacterReference.gperf" - {"cirfnint;", "⨐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 391 "HTMLCharacterReference.gperf" - {"NotSubsetEqual;", "⊈"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2036 "HTMLCharacterReference.gperf" - {"szlig", "ß"}, + {"UpArrowBar;", "⤒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 395 "HTMLCharacterReference.gperf" + {"NotSucceedsSlantEqual;", "⋡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1907 "HTMLCharacterReference.gperf" + {"seswar;", "⤩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 423 "HTMLCharacterReference.gperf" + {"OpenCurlyQuote;", "‘"}, + {""}, + {""}, +#line 2072 "HTMLCharacterReference.gperf" + {"topfork;", "⫚"}, + {""}, + {""}, +#line 436 "HTMLCharacterReference.gperf" + {"OverParenthesis;", "⏜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 112 "HTMLCharacterReference.gperf" + {"DiacriticalDoubleAcute;", "˝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1801 "HTMLCharacterReference.gperf" + {"rarrsim;", "⥴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2043 "HTMLCharacterReference.gperf" + {"tcedil;", "ţ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1849 "HTMLCharacterReference.gperf" + {"risingdotseq;", "≓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1649 "HTMLCharacterReference.gperf" + {"oelig;", "œ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 332 "HTMLCharacterReference.gperf" + {"MinusPlus;", "∓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1914 "HTMLCharacterReference.gperf" + {"shchcy;", "щ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1700 "HTMLCharacterReference.gperf" + {"parallel;", "∥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 477 "HTMLCharacterReference.gperf" + {"RightAngleBracket;", "⟩"}, + {""}, + {""}, + {""}, +#line 1687 "HTMLCharacterReference.gperf" + {"oslash", "ø"}, +#line 1688 "HTMLCharacterReference.gperf" + {"oslash;", "ø"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1749 "HTMLCharacterReference.gperf" + {"precsim;", "≾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1583 "HTMLCharacterReference.gperf" + {"nshortparallel;", "∦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 593 "HTMLCharacterReference.gperf" + {"UpArrowDownArrow;", "⇅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2001 "HTMLCharacterReference.gperf" + {"succnsim;", "⋩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1666 "HTMLCharacterReference.gperf" + {"omicron;", "ο"}, + {""}, + {""}, + {""}, + {""}, +#line 882 "HTMLCharacterReference.gperf" + {"cirfnint;", "⨐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 392 "HTMLCharacterReference.gperf" + {"NotSubsetEqual;", "⊈"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2037 "HTMLCharacterReference.gperf" - {"szlig;", "ß"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1921 "HTMLCharacterReference.gperf" - {"sigmav;", "ς"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1755 "HTMLCharacterReference.gperf" - {"profalar;", "⌮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1732 "HTMLCharacterReference.gperf" - {"pointint;", "⨕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1888 "HTMLCharacterReference.gperf" - {"scedil;", "ş"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 314 "HTMLCharacterReference.gperf" - {"LongLeftRightArrow;", "⟷"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1852 "HTMLCharacterReference.gperf" - {"rmoust;", "⎱"}, - {""}, -#line 2091 "HTMLCharacterReference.gperf" - {"tshcy;", "ћ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2129 "HTMLCharacterReference.gperf" - {"uplus;", "⊎"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1778 "HTMLCharacterReference.gperf" - {"rAtail;", "⤜"}, - {""}, -#line 2029 "HTMLCharacterReference.gperf" - {"supsub;", "⫔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1072 "HTMLCharacterReference.gperf" - {"fallingdotseq;", "≒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 65 "HTMLCharacterReference.gperf" - {"CapitalDifferentialD;", "ⅅ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1671 "HTMLCharacterReference.gperf" - {"oplus;", "⊕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 283 "HTMLCharacterReference.gperf" - {"LeftDownTeeVector;", "⥡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1991 "HTMLCharacterReference.gperf" - {"subsim;", "⫇"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 560 "HTMLCharacterReference.gperf" - {"Tilde;", "∼"}, - {""}, -#line 618 "HTMLCharacterReference.gperf" - {"VerticalSeparator;", "❘"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1436 "HTMLCharacterReference.gperf" - {"mapstoleft;", "↤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 492 "HTMLCharacterReference.gperf" - {"RightUpDownVector;", "⥏"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1993 "HTMLCharacterReference.gperf" - {"subsup;", "⫓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1892 "HTMLCharacterReference.gperf" - {"scnsim;", "⋩"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1719 "HTMLCharacterReference.gperf" - {"plankv;", "ℏ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2050 "HTMLCharacterReference.gperf" - {"thetasym;", "ϑ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 115 "HTMLCharacterReference.gperf" - {"DifferentialD;", "ⅆ"}, - {""}, -#line 366 "HTMLCharacterReference.gperf" - {"NotHumpDownHump;", "≎̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2161 "HTMLCharacterReference.gperf" - {"varsigma;", "ς"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"szlig", "ß"}, +#line 2038 "HTMLCharacterReference.gperf" + {"szlig;", "ß"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1922 "HTMLCharacterReference.gperf" + {"sigmav;", "ς"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1756 "HTMLCharacterReference.gperf" + {"profalar;", "⌮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1733 "HTMLCharacterReference.gperf" + {"pointint;", "⨕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1889 "HTMLCharacterReference.gperf" + {"scedil;", "ş"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 315 "HTMLCharacterReference.gperf" + {"LongLeftRightArrow;", "⟷"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1853 "HTMLCharacterReference.gperf" + {"rmoust;", "⎱"}, + {""}, +#line 2092 "HTMLCharacterReference.gperf" + {"tshcy;", "ћ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2130 "HTMLCharacterReference.gperf" + {"uplus;", "⊎"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1779 "HTMLCharacterReference.gperf" + {"rAtail;", "⤜"}, + {""}, +#line 2030 "HTMLCharacterReference.gperf" + {"supsub;", "⫔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1073 "HTMLCharacterReference.gperf" + {"fallingdotseq;", "≒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 66 "HTMLCharacterReference.gperf" + {"CapitalDifferentialD;", "ⅅ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1672 "HTMLCharacterReference.gperf" + {"oplus;", "⊕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 284 "HTMLCharacterReference.gperf" + {"LeftDownTeeVector;", "⥡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1992 "HTMLCharacterReference.gperf" + {"subsim;", "⫇"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 561 "HTMLCharacterReference.gperf" + {"Tilde;", "∼"}, + {""}, +#line 619 "HTMLCharacterReference.gperf" + {"VerticalSeparator;", "❘"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1437 "HTMLCharacterReference.gperf" + {"mapstoleft;", "↤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 493 "HTMLCharacterReference.gperf" + {"RightUpDownVector;", "⥏"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1994 "HTMLCharacterReference.gperf" + {"subsup;", "⫓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1893 "HTMLCharacterReference.gperf" + {"scnsim;", "⋩"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1720 "HTMLCharacterReference.gperf" - {"plus;", "+"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1727 "HTMLCharacterReference.gperf" - {"plusmn", "±"}, + {"plankv;", "ℏ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2051 "HTMLCharacterReference.gperf" + {"thetasym;", "ϑ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 116 "HTMLCharacterReference.gperf" + {"DifferentialD;", "ⅆ"}, + {""}, +#line 367 "HTMLCharacterReference.gperf" + {"NotHumpDownHump;", "≎̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2162 "HTMLCharacterReference.gperf" + {"varsigma;", "ς"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1721 "HTMLCharacterReference.gperf" + {"plus;", "+"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1728 "HTMLCharacterReference.gperf" - {"plusmn;", "±"}, - {""}, -#line 1747 "HTMLCharacterReference.gperf" - {"precnsim;", "⋨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 765 "HTMLCharacterReference.gperf" - {"blacktriangleleft;", "◂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1753 "HTMLCharacterReference.gperf" - {"prnsim;", "⋨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1814 "HTMLCharacterReference.gperf" - {"rcedil;", "ŗ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1937 "HTMLCharacterReference.gperf" - {"smid;", "∣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 482 "HTMLCharacterReference.gperf" - {"RightDownTeeVector;", "⥝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1726 "HTMLCharacterReference.gperf" - {"pluse;", "⩲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1730 "HTMLCharacterReference.gperf" - {"plustwo;", "⨧"}, - {""}, - {""}, - {""}, - {""}, -#line 1845 "HTMLCharacterReference.gperf" - {"rightsquigarrow;", "↝"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 436 "HTMLCharacterReference.gperf" - {"PartialD;", "∂"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"plusmn", "±"}, +#line 1729 "HTMLCharacterReference.gperf" + {"plusmn;", "±"}, + {""}, +#line 1748 "HTMLCharacterReference.gperf" + {"precnsim;", "⋨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 766 "HTMLCharacterReference.gperf" + {"blacktriangleleft;", "◂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1754 "HTMLCharacterReference.gperf" + {"prnsim;", "⋨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1815 "HTMLCharacterReference.gperf" + {"rcedil;", "ŗ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1938 "HTMLCharacterReference.gperf" + {"smid;", "∣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 483 "HTMLCharacterReference.gperf" + {"RightDownTeeVector;", "⥝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1727 "HTMLCharacterReference.gperf" + {"pluse;", "⩲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1731 "HTMLCharacterReference.gperf" + {"plustwo;", "⨧"}, + {""}, + {""}, + {""}, + {""}, +#line 1846 "HTMLCharacterReference.gperf" + {"rightsquigarrow;", "↝"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 437 "HTMLCharacterReference.gperf" + {"PartialD;", "∂"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 84 "HTMLCharacterReference.gperf" + {"CloseCurlyQuote;", "’"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 989 "HTMLCharacterReference.gperf" + {"downharpoonleft;", "⇃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2057 "HTMLCharacterReference.gperf" + {"thksim;", "∼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1034 "HTMLCharacterReference.gperf" + {"emptyv;", "∅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2033 "HTMLCharacterReference.gperf" + {"swarhk;", "⤦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 350 "HTMLCharacterReference.gperf" + {"NonBreakingSpace;", " "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 83 "HTMLCharacterReference.gperf" - {"CloseCurlyQuote;", "’"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 988 "HTMLCharacterReference.gperf" - {"downharpoonleft;", "⇃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2056 "HTMLCharacterReference.gperf" - {"thksim;", "∼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1033 "HTMLCharacterReference.gperf" - {"emptyv;", "∅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2032 "HTMLCharacterReference.gperf" - {"swarhk;", "⤦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 349 "HTMLCharacterReference.gperf" - {"NonBreakingSpace;", " "}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 82 "HTMLCharacterReference.gperf" - {"CloseCurlyDoubleQuote;", "”"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1722 "HTMLCharacterReference.gperf" - {"plusb;", "⊞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1220 "HTMLCharacterReference.gperf" - {"imagline;", "ℐ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 383 "HTMLCharacterReference.gperf" - {"NotRightTriangle;", "⋫"}, - {""}, - {""}, + {"CloseCurlyDoubleQuote;", "”"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1723 "HTMLCharacterReference.gperf" + {"plusb;", "⊞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1221 "HTMLCharacterReference.gperf" + {"imagline;", "ℐ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 384 "HTMLCharacterReference.gperf" - {"NotRightTriangleBar;", "⧐̸"}, - {""}, + {"NotRightTriangle;", "⋫"}, + {""}, + {""}, #line 385 "HTMLCharacterReference.gperf" - {"NotRightTriangleEqual;", "⋭"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2075 "HTMLCharacterReference.gperf" - {"triangle;", "▵"}, -#line 2079 "HTMLCharacterReference.gperf" - {"triangleq;", "≜"}, - {""}, - {""}, -#line 2077 "HTMLCharacterReference.gperf" - {"triangleleft;", "◃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"NotRightTriangleBar;", "⧐̸"}, + {""}, +#line 386 "HTMLCharacterReference.gperf" + {"NotRightTriangleEqual;", "⋭"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2076 "HTMLCharacterReference.gperf" - {"triangledown;", "▿"}, -#line 1842 "HTMLCharacterReference.gperf" - {"rightleftarrows;", "⇄"}, - {""}, - {""}, -#line 496 "HTMLCharacterReference.gperf" - {"RightVector;", "⇀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"triangle;", "▵"}, +#line 2080 "HTMLCharacterReference.gperf" + {"triangleq;", "≜"}, + {""}, + {""}, #line 2078 "HTMLCharacterReference.gperf" - {"trianglelefteq;", "⊴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 483 "HTMLCharacterReference.gperf" - {"RightDownVector;", "⇂"}, - {""}, - {""}, -#line 484 "HTMLCharacterReference.gperf" - {"RightDownVectorBar;", "⥕"}, - {""}, - {""}, - {""}, -#line 1725 "HTMLCharacterReference.gperf" - {"plusdu;", "⨥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 393 "HTMLCharacterReference.gperf" - {"NotSucceedsEqual;", "⪰̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1724 "HTMLCharacterReference.gperf" - {"plusdo;", "∔"}, - {""}, - {""}, - {""}, - {""}, -#line 382 "HTMLCharacterReference.gperf" - {"NotReverseElement;", "∌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 395 "HTMLCharacterReference.gperf" - {"NotSucceedsTilde;", "≿̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"triangleleft;", "◃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2077 "HTMLCharacterReference.gperf" + {"triangledown;", "▿"}, #line 1843 "HTMLCharacterReference.gperf" - {"rightleftharpoons;", "⇌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1936 "HTMLCharacterReference.gperf" - {"smeparsl;", "⧤"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 421 "HTMLCharacterReference.gperf" - {"OpenCurlyDoubleQuote;", "“"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1974 "HTMLCharacterReference.gperf" - {"straightphi;", "ϕ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1900 "HTMLCharacterReference.gperf" - {"searhk;", "⤥"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1841 "HTMLCharacterReference.gperf" - {"rightharpoonup;", "⇀"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1666 "HTMLCharacterReference.gperf" - {"omid;", "⦶"}, - {""}, - {""}, - {""}, - {""}, -#line 418 "HTMLCharacterReference.gperf" - {"Omega;", "Ω"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1992 "HTMLCharacterReference.gperf" - {"subsub;", "⫕"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 367 "HTMLCharacterReference.gperf" - {"NotHumpEqual;", "≏̸"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1853 "HTMLCharacterReference.gperf" - {"rmoustache;", "⎱"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1715 "HTMLCharacterReference.gperf" - {"pitchfork;", "⋔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2080 "HTMLCharacterReference.gperf" - {"triangleright;", "▹"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1830 "HTMLCharacterReference.gperf" - {"rfisht;", "⥽"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1840 "HTMLCharacterReference.gperf" - {"rightharpoondown;", "⇁"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 407 "HTMLCharacterReference.gperf" - {"OElig;", "Œ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 304 "HTMLCharacterReference.gperf" - {"LessFullEqual;", "≦"}, - {""}, + {"rightleftarrows;", "⇄"}, + {""}, + {""}, +#line 497 "HTMLCharacterReference.gperf" + {"RightVector;", "⇀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2079 "HTMLCharacterReference.gperf" + {"trianglelefteq;", "⊴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 484 "HTMLCharacterReference.gperf" + {"RightDownVector;", "⇂"}, + {""}, + {""}, #line 485 "HTMLCharacterReference.gperf" - {"RightFloor;", "⌋"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1700 "HTMLCharacterReference.gperf" - {"parsim;", "⫳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1643 "HTMLCharacterReference.gperf" - {"odash;", "⊝"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1717 "HTMLCharacterReference.gperf" - {"planck;", "ℏ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2081 "HTMLCharacterReference.gperf" - {"trianglerighteq;", "⊵"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2109 "HTMLCharacterReference.gperf" - {"ufisht;", "⥾"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2016 "HTMLCharacterReference.gperf" - {"suphsol;", "⟉"}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1442 "HTMLCharacterReference.gperf" - {"measuredangle;", "∡"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2059 "HTMLCharacterReference.gperf" - {"tilde;", "˜"}, - {""}, + {"RightDownVectorBar;", "⥕"}, + {""}, + {""}, + {""}, +#line 1726 "HTMLCharacterReference.gperf" + {"plusdu;", "⨥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 394 "HTMLCharacterReference.gperf" + {"NotSucceedsEqual;", "⪰̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1725 "HTMLCharacterReference.gperf" + {"plusdo;", "∔"}, + {""}, + {""}, + {""}, + {""}, +#line 383 "HTMLCharacterReference.gperf" + {"NotReverseElement;", "∌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 396 "HTMLCharacterReference.gperf" + {"NotSucceedsTilde;", "≿̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1844 "HTMLCharacterReference.gperf" + {"rightleftharpoons;", "⇌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1937 "HTMLCharacterReference.gperf" + {"smeparsl;", "⧤"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 422 "HTMLCharacterReference.gperf" + {"OpenCurlyDoubleQuote;", "“"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1975 "HTMLCharacterReference.gperf" + {"straightphi;", "ϕ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1901 "HTMLCharacterReference.gperf" + {"searhk;", "⤥"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1842 "HTMLCharacterReference.gperf" + {"rightharpoonup;", "⇀"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 1667 "HTMLCharacterReference.gperf" - {"ominus;", "⊖"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2121 "HTMLCharacterReference.gperf" - {"uml", "¨"}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"omid;", "⦶"}, + {""}, + {""}, + {""}, + {""}, +#line 419 "HTMLCharacterReference.gperf" + {"Omega;", "Ω"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1993 "HTMLCharacterReference.gperf" + {"subsub;", "⫕"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 368 "HTMLCharacterReference.gperf" + {"NotHumpEqual;", "≏̸"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1854 "HTMLCharacterReference.gperf" + {"rmoustache;", "⎱"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1716 "HTMLCharacterReference.gperf" + {"pitchfork;", "⋔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2081 "HTMLCharacterReference.gperf" + {"triangleright;", "▹"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1831 "HTMLCharacterReference.gperf" + {"rfisht;", "⥽"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1841 "HTMLCharacterReference.gperf" + {"rightharpoondown;", "⇁"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 408 "HTMLCharacterReference.gperf" + {"OElig;", "Œ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 305 "HTMLCharacterReference.gperf" + {"LessFullEqual;", "≦"}, + {""}, +#line 486 "HTMLCharacterReference.gperf" + {"RightFloor;", "⌋"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1701 "HTMLCharacterReference.gperf" + {"parsim;", "⫳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1644 "HTMLCharacterReference.gperf" + {"odash;", "⊝"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1718 "HTMLCharacterReference.gperf" + {"planck;", "ℏ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2082 "HTMLCharacterReference.gperf" + {"trianglerighteq;", "⊵"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2110 "HTMLCharacterReference.gperf" + {"ufisht;", "⥾"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2017 "HTMLCharacterReference.gperf" + {"suphsol;", "⟉"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1443 "HTMLCharacterReference.gperf" + {"measuredangle;", "∡"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2060 "HTMLCharacterReference.gperf" + {"tilde;", "˜"}, + {""}, +#line 1668 "HTMLCharacterReference.gperf" + {"ominus;", "⊖"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 2122 "HTMLCharacterReference.gperf" - {"uml;", "¨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 165 "HTMLCharacterReference.gperf" - {"EmptySmallSquare;", "◻"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 495 "HTMLCharacterReference.gperf" - {"RightUpVectorBar;", "⥔"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 182 "HTMLCharacterReference.gperf" - {"FilledSmallSquare;", "◼"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1838 "HTMLCharacterReference.gperf" - {"rightarrow;", "→"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1664 "HTMLCharacterReference.gperf" - {"omega;", "ω"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2189 "HTMLCharacterReference.gperf" - {"vzigzag;", "⦚"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1844 "HTMLCharacterReference.gperf" - {"rightrightarrows;", "⇉"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"uml", "¨"}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2123 "HTMLCharacterReference.gperf" + {"uml;", "¨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 166 "HTMLCharacterReference.gperf" + {"EmptySmallSquare;", "◻"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 496 "HTMLCharacterReference.gperf" + {"RightUpVectorBar;", "⥔"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 183 "HTMLCharacterReference.gperf" + {"FilledSmallSquare;", "◼"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1839 "HTMLCharacterReference.gperf" + {"rightarrow;", "→"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1665 "HTMLCharacterReference.gperf" + {"omega;", "ω"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2190 "HTMLCharacterReference.gperf" + {"vzigzag;", "⦚"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1845 "HTMLCharacterReference.gperf" + {"rightrightarrows;", "⇉"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 243 "HTMLCharacterReference.gperf" + {"InvisibleTimes;", "⁢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 341 "HTMLCharacterReference.gperf" + {"NegativeMediumSpace;", "​"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 442 "HTMLCharacterReference.gperf" + {"PlusMinus;", "±"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 114 "HTMLCharacterReference.gperf" + {"DiacriticalTilde;", "˜"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 110 "HTMLCharacterReference.gperf" + {"DiacriticalAcute;", "´"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 309 "HTMLCharacterReference.gperf" + {"LessTilde;", "≲"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1798 "HTMLCharacterReference.gperf" + {"rarrhk;", "↪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2095 "HTMLCharacterReference.gperf" + {"twoheadleftarrow;", "↞"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1757 "HTMLCharacterReference.gperf" + {"profline;", "⌒"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1722 "HTMLCharacterReference.gperf" + {"plusacir;", "⨣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 490 "HTMLCharacterReference.gperf" + {"RightTriangle;", "⊳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1936 "HTMLCharacterReference.gperf" + {"smashp;", "⨳"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 242 "HTMLCharacterReference.gperf" - {"InvisibleTimes;", "⁢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 340 "HTMLCharacterReference.gperf" - {"NegativeMediumSpace;", "​"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 441 "HTMLCharacterReference.gperf" - {"PlusMinus;", "±"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 113 "HTMLCharacterReference.gperf" - {"DiacriticalTilde;", "˜"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 109 "HTMLCharacterReference.gperf" - {"DiacriticalAcute;", "´"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 308 "HTMLCharacterReference.gperf" - {"LessTilde;", "≲"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1797 "HTMLCharacterReference.gperf" - {"rarrhk;", "↪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2094 "HTMLCharacterReference.gperf" - {"twoheadleftarrow;", "↞"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1756 "HTMLCharacterReference.gperf" - {"profline;", "⌒"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1721 "HTMLCharacterReference.gperf" - {"plusacir;", "⨣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 489 "HTMLCharacterReference.gperf" - {"RightTriangle;", "⊳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1935 "HTMLCharacterReference.gperf" - {"smashp;", "⨳"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 241 "HTMLCharacterReference.gperf" - {"InvisibleComma;", "⁣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1973 "HTMLCharacterReference.gperf" - {"straightepsilon;", "ϵ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 480 "HTMLCharacterReference.gperf" - {"RightCeiling;", "⌉"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 561 "HTMLCharacterReference.gperf" - {"TildeEqual;", "≃"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 497 "HTMLCharacterReference.gperf" - {"RightVectorBar;", "⥓"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 563 "HTMLCharacterReference.gperf" - {"TildeTilde;", "≈"}, - {""}, - {""}, + {"InvisibleComma;", "⁣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1974 "HTMLCharacterReference.gperf" + {"straightepsilon;", "ϵ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 481 "HTMLCharacterReference.gperf" - {"RightDoubleBracket;", "⟧"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 112 "HTMLCharacterReference.gperf" - {"DiacriticalGrave;", "`"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 183 "HTMLCharacterReference.gperf" - {"FilledVerySmallSquare;", "▪"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1718 "HTMLCharacterReference.gperf" - {"planckh;", "ℎ"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1729 "HTMLCharacterReference.gperf" - {"plussim;", "⨦"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1723 "HTMLCharacterReference.gperf" - {"pluscir;", "⨢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 166 "HTMLCharacterReference.gperf" - {"EmptyVerySmallSquare;", "▫"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1878 "HTMLCharacterReference.gperf" - {"ruluhar;", "⥨"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 594 "HTMLCharacterReference.gperf" - {"UpEquilibrium;", "⥮"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 504 "HTMLCharacterReference.gperf" - {"RuleDelayed;", "⧴"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"RightCeiling;", "⌉"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 562 "HTMLCharacterReference.gperf" - {"TildeFullEqual;", "≅"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1839 "HTMLCharacterReference.gperf" - {"rightarrowtail;", "↣"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, + {"TildeEqual;", "≃"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 498 "HTMLCharacterReference.gperf" + {"RightVectorBar;", "⥓"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 564 "HTMLCharacterReference.gperf" + {"TildeTilde;", "≈"}, + {""}, + {""}, +#line 482 "HTMLCharacterReference.gperf" + {"RightDoubleBracket;", "⟧"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 113 "HTMLCharacterReference.gperf" + {"DiacriticalGrave;", "`"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 184 "HTMLCharacterReference.gperf" + {"FilledVerySmallSquare;", "▪"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1719 "HTMLCharacterReference.gperf" + {"planckh;", "ℎ"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1730 "HTMLCharacterReference.gperf" + {"plussim;", "⨦"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1724 "HTMLCharacterReference.gperf" + {"pluscir;", "⨢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 167 "HTMLCharacterReference.gperf" + {"EmptyVerySmallSquare;", "▫"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1879 "HTMLCharacterReference.gperf" + {"ruluhar;", "⥨"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 595 "HTMLCharacterReference.gperf" + {"UpEquilibrium;", "⥮"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 505 "HTMLCharacterReference.gperf" + {"RuleDelayed;", "⧴"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 563 "HTMLCharacterReference.gperf" + {"TildeFullEqual;", "≅"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1840 "HTMLCharacterReference.gperf" + {"rightarrowtail;", "↣"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 492 "HTMLCharacterReference.gperf" + {"RightTriangleEqual;", "⊵"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1847 "HTMLCharacterReference.gperf" + {"rightthreetimes;", "⋌"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, #line 491 "HTMLCharacterReference.gperf" - {"RightTriangleEqual;", "⊵"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1846 "HTMLCharacterReference.gperf" - {"rightthreetimes;", "⋌"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 490 "HTMLCharacterReference.gperf" - {"RightTriangleBar;", "⧐"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 2088 "HTMLCharacterReference.gperf" - {"trpezium;", "⏢"}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, - {""}, -#line 1819 "HTMLCharacterReference.gperf" - {"rdldhar;", "⥩"}}; + {"RightTriangleBar;", "⧐"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 2089 "HTMLCharacterReference.gperf" + {"trpezium;", "⏢"}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, + {""}, +#line 1820 "HTMLCharacterReference.gperf" + {"rdldhar;", "⥩"}}; +const struct NameAndGlyph * HTMLCharacterHash::Lookup(const char * str, size_t len) +{ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { unsigned int key = hash(str, len); @@ -17872,6 +17861,29 @@ const struct NameAndGlyph * HTMLCharacterHash::Lookup(const char * str, size_t l } return 0; } -#line 2252 "HTMLCharacterReference.gperf" +#line 2253 "HTMLCharacterReference.gperf" + + +[[maybe_unused]] static constexpr bool html_entity_expansion_within_6_5 = []() constexpr +{ + for (const auto & entry : wordlist) + { + if (entry.glyph == nullptr) + continue; + size_t name_len = 0; + while (entry.name[name_len] != '\0') + ++name_len; + size_t glyph_len = 0; + while (entry.glyph[glyph_len] != '\0') + ++glyph_len; + if (glyph_len * 5 > (name_len + 1) * 6) + return false; + } + return true; +}(); +static_assert( + html_entity_expansion_within_6_5, + "An HTML entity decodes to more than 6/5 of its byte length; " + "update the output buffer size in decodeHTMLComponent.cpp"); // NOLINTEND(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum) diff --git a/src/Functions/HTMLCharacterReference.gperf b/src/Functions/HTMLCharacterReference.gperf index c2ff4505832c..36c3e0785c7d 100644 --- a/src/Functions/HTMLCharacterReference.gperf +++ b/src/Functions/HTMLCharacterReference.gperf @@ -4,6 +4,7 @@ %readonly-tables %includes %compare-strncmp +%global-table %{ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" @@ -2250,4 +2251,27 @@ const char *glyph; "zwj;", "‍" "zwnj;", "‌" %% + +[[maybe_unused]] static constexpr bool html_entity_expansion_within_6_5 = []() constexpr +{ + for (const auto & entry : wordlist) + { + if (entry.glyph == nullptr) + continue; + size_t name_len = 0; + while (entry.name[name_len] != '\0') + ++name_len; + size_t glyph_len = 0; + while (entry.glyph[glyph_len] != '\0') + ++glyph_len; + if (glyph_len * 5 > (name_len + 1) * 6) + return false; + } + return true; +}(); +static_assert( + html_entity_expansion_within_6_5, + "An HTML entity decodes to more than 6/5 of its byte length; " + "update the output buffer size in decodeHTMLComponent.cpp"); + // NOLINTEND(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum) diff --git a/src/Functions/HTMLCharacterReference.sh b/src/Functions/HTMLCharacterReference.sh index 3d90a90b6bcb..76259b5cbc8d 100755 --- a/src/Functions/HTMLCharacterReference.sh +++ b/src/Functions/HTMLCharacterReference.sh @@ -6,6 +6,7 @@ echo '%language=C++ %readonly-tables %includes %compare-strncmp +%global-table %{ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" @@ -24,4 +25,35 @@ const char *glyph; # character reference as available at https://html.spec.whatwg.org/multipage/named-characters.html curl -X GET https://html.spec.whatwg.org/entities.json | jq -r 'keys[] as $k | "\"\($k)\", \(.[$k] | .characters|tojson)"' | sed 's/^"&/"/' >> HTMLCharacterReference.gperf echo '%%' >> HTMLCharacterReference.gperf + +# decodeHTMLComponent sizes its output buffer assuming an entity decodes to at most 6/5 of the bytes +# it occupies in the input ('&' + name, where name includes the trailing ';'). `≫⃒`/`≪⃒` +# (5 bytes -> 6-byte UTF-8) hit that bound exactly. Verify it at compile time over the whole table so +# a newer entity list cannot silently break the buffer sizing. (`%global-table` puts `wordlist` at +# file scope so this can reference it; the CMake target makes it `constexpr`.) +cat >> HTMLCharacterReference.gperf <<'CPP' + +[[maybe_unused]] static constexpr bool html_entity_expansion_within_6_5 = []() constexpr +{ + for (const auto & entry : wordlist) + { + if (entry.glyph == nullptr) + continue; + size_t name_len = 0; + while (entry.name[name_len] != '\0') + ++name_len; + size_t glyph_len = 0; + while (entry.glyph[glyph_len] != '\0') + ++glyph_len; + if (glyph_len * 5 > (name_len + 1) * 6) + return false; + } + return true; +}(); +static_assert( + html_entity_expansion_within_6_5, + "An HTML entity decodes to more than 6/5 of its byte length; " + "update the output buffer size in decodeHTMLComponent.cpp"); +CPP + echo '// NOLINTEND(google-runtime-int,hicpp-use-nullptr,modernize-use-nullptr,modernize-macro-to-enum)' >> HTMLCharacterReference.gperf diff --git a/src/Functions/decodeHTMLComponent.cpp b/src/Functions/decodeHTMLComponent.cpp index 0212d448c3ec..9e4e8bd39b9a 100644 --- a/src/Functions/decodeHTMLComponent.cpp +++ b/src/Functions/decodeHTMLComponent.cpp @@ -31,10 +31,13 @@ namespace ColumnString::Offsets & res_offsets, size_t input_rows_count) { - /// The size of result is always not more than the size of source. - /// Because entities decodes to the shorter byte sequence. - /// Example: &#xx... &#xx... will decode to UTF-8 byte sequence not longer than 4 bytes. - res_data.resize(data.size()); + /// Most entities decode to a byte sequence not longer than the entity itself, but a few + /// expand: `≫⃒` and `≪⃒` are 5 bytes and decode to a 6-byte UTF-8 sequence + /// (U+226B/U+226A followed by the combining U+20D2). That is the largest expansion among + /// all entities, so the worst case is 6/5 of the input. Size the buffer accordingly (plus + /// a small constant for the up-to-15-byte overwrite of memcpySmallAllowReadWriteOverflow15 + /// at the end of the buffer) to avoid a heap buffer overflow. + res_data.resize(data.size() + data.size() / 5 + 64); res_offsets.resize(input_rows_count); diff --git a/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.reference b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.reference new file mode 100644 index 000000000000..d3f4627737e2 --- /dev/null +++ b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.reference @@ -0,0 +1,5 @@ +1200000 +1200000 +E289ABE28392 +E289AAE28392 +
Hello & "World"
diff --git a/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.sql b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.sql new file mode 100644 index 000000000000..1bdf7c9e2f6d --- /dev/null +++ b/tests/queries/0_stateless/04325_decode_html_component_expanding_entities.sql @@ -0,0 +1,14 @@ +-- Regression test for a heap buffer overflow in decodeHTMLComponent. +-- The output buffer was sized to the input length, but the entities `≫⃒` and `≪⃒` are 5 bytes +-- and decode to a 6-byte UTF-8 sequence, so a long run of them overflowed the output buffer. + +-- A large run of the expanding entity must decode without overflowing (6 bytes per 5-byte entity). +SELECT length(decodeHTMLComponent(repeat('≫⃒', 200000))); +SELECT length(decodeHTMLComponent(repeat('≪⃒', 200000))); + +-- Correctness of the expanding entities (U+226B/U+226A + combining U+20D2). +SELECT hex(decodeHTMLComponent('≫⃒')); +SELECT hex(decodeHTMLComponent('≪⃒')); + +-- Ordinary entities still decode correctly. +SELECT decodeHTMLComponent('<div>Hello & "World"</div>'); From 55054592c46c7d65c69eaa6254629df9b5568e55 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 10 Jun 2026 15:23:09 +0000 Subject: [PATCH 49/91] Backport #106076 to 25.8: Bump `krb5` to 1.22.2 --- contrib/krb5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/krb5 b/contrib/krb5 index ed01212a0ba6..42d204a24a57 160000 --- a/contrib/krb5 +++ b/contrib/krb5 @@ -1 +1 @@ -Subproject commit ed01212a0ba6e101f51178b9014368af062c01c4 +Subproject commit 42d204a24a577ef93081cb7b70cb78ff6f7130ee From 1b56bada22020f0c6742dee81b3ffe73b77b8b0e Mon Sep 17 00:00:00 2001 From: Konstantin Bogdanov Date: Wed, 10 Jun 2026 19:48:35 +0200 Subject: [PATCH 50/91] Update CMakeLists.txt --- contrib/krb5-cmake/CMakeLists.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/contrib/krb5-cmake/CMakeLists.txt b/contrib/krb5-cmake/CMakeLists.txt index f5e0c4bc0aa4..91a0c7503743 100644 --- a/contrib/krb5-cmake/CMakeLists.txt +++ b/contrib/krb5-cmake/CMakeLists.txt @@ -132,16 +132,18 @@ set(ALL_SRCS "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/ser_sctx.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/k5sealv3.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/acquire_cred.c" - "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/k5unseal.c" + # "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/k5unseal.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/rel_cred.c" "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/util_cksum.c" + "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/verify_mic.c" + "${KRB5_SOURCE_DIR}/lib/gssapi/krb5/unwrap.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/disp_com_err_status.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/gssapi_generic.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/rel_oid_set.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/oid_ops.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_buffer.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_buffer_set.c" - "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_set.c" + # "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_set.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_token.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/disp_major_status.c" "${KRB5_SOURCE_DIR}/lib/gssapi/generic/util_seqstate.c" @@ -415,6 +417,7 @@ set(ALL_SRCS "${KRB5_SOURCE_DIR}/lib/krb5/os/realm_dom.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/dnssrv.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/mk_faddr.c" + "${KRB5_SOURCE_DIR}/lib/krb5/os/addr.c" # "${KRB5_SOURCE_DIR}/lib/krb5/os/dnsglue.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/sendto_kdc.c" "${KRB5_SOURCE_DIR}/lib/krb5/os/hostrealm_registry.c" @@ -585,11 +588,11 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin") file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/kcmrpc.hin" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include_private/" ) - file(RENAME + file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.cin" "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.c" ) - file(RENAME + file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.hin" "${CMAKE_CURRENT_BINARY_DIR}/include_private/kcmrpc.h" ) From 929912232ece35de94852d3c47026829901d8505 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 11 Jun 2026 21:05:41 +0000 Subject: [PATCH 51/91] Backport #107097 to 25.8: Do not hold mutex across ZooKeeper reads in access entities refresh --- src/Access/ZooKeeperReplicator.cpp | 43 ++++++++++++++++++------------ src/Access/ZooKeeperReplicator.h | 10 ++++++- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/Access/ZooKeeperReplicator.cpp b/src/Access/ZooKeeperReplicator.cpp index 84829e2bf48a..0438625b3c31 100644 --- a/src/Access/ZooKeeperReplicator.cpp +++ b/src/Access/ZooKeeperReplicator.cpp @@ -282,6 +282,7 @@ bool ZooKeeperReplicator::removeEntity(const UUID & id, bool throw_if_not_exists if (!ok) return false; + std::lock_guard refresh_lock{refresh_mutex}; std::lock_guard lock{mutex}; removeEntityNoLock(id); return true; @@ -538,6 +539,13 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper { LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entities list"); + /// Reading from ZooKeeper is one synchronous round trip per entity and must not happen under + /// `mutex`: findEntity (authentication, Context::getAccess) blocks on it, so holding it across + /// a slow refresh stalls every query on the server. `refresh_mutex` keeps the reads and the + /// publication of their results atomic with respect to other read->publish sequences, so this + /// snapshot can never overwrite the result of a newer read. + std::lock_guard refresh_lock{refresh_mutex}; + if (all) { /// It doesn't make sense to keep the queue because we will reread everything in this function. @@ -557,8 +565,6 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper for (const String & entity_uuid_str : entity_uuid_strs) entity_uuids.emplace_back(parseUUID(entity_uuid_str)); - std::lock_guard lock{mutex}; - if (all) { /// all=true means we read & parse all access entities from ZooKeeper. @@ -568,17 +574,25 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper if (auto entity = tryReadEntityFromZooKeeper(zookeeper, uuid)) entities.emplace_back(uuid, entity); } + + std::lock_guard lock{mutex}; memory_storage.setAll(entities); } else { /// all=false means we read & parse only new access entities from ZooKeeper. - memory_storage.removeAllExcept(entity_uuids); - for (const auto & uuid : entity_uuids) + std::vector new_uuids; { - if (!memory_storage.exists(uuid)) - refreshEntityNoLock(zookeeper, uuid); + std::lock_guard lock{mutex}; + memory_storage.removeAllExcept(entity_uuids); + for (const auto & uuid : entity_uuids) + { + if (!memory_storage.exists(uuid)) + new_uuids.push_back(uuid); + } } + for (const auto & uuid : new_uuids) + refreshEntityImpl(zookeeper, uuid); } LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entities list finished"); @@ -586,23 +600,18 @@ void ZooKeeperReplicator::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper void ZooKeeperReplicator::refreshEntity(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) { - LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entity {}", toString(id)); - - auto entity = tryReadEntityFromZooKeeper(zookeeper, id); - - std::lock_guard lock{mutex}; - - if (entity) - setEntityNoLock(id, entity); - else - removeEntityNoLock(id); + std::lock_guard refresh_lock{refresh_mutex}; + refreshEntityImpl(zookeeper, id); } -void ZooKeeperReplicator::refreshEntityNoLock(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) +void ZooKeeperReplicator::refreshEntityImpl(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) { LOG_DEBUG(&Poco::Logger::get(storage_name), "Refreshing entity {}", toString(id)); auto entity = tryReadEntityFromZooKeeper(zookeeper, id); + + std::lock_guard lock{mutex}; + if (entity) setEntityNoLock(id, entity); else diff --git a/src/Access/ZooKeeperReplicator.h b/src/Access/ZooKeeperReplicator.h index b7daaf63e153..486e15d67a0d 100644 --- a/src/Access/ZooKeeperReplicator.h +++ b/src/Access/ZooKeeperReplicator.h @@ -86,12 +86,20 @@ class ZooKeeperReplicator bool refresh(); void refreshEntities(const zkutil::ZooKeeperPtr & zookeeper, bool all); void refreshEntity(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id); - void refreshEntityNoLock(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) TSA_REQUIRES(mutex); + void refreshEntityImpl(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) TSA_REQUIRES(refresh_mutex); AccessEntityPtr tryReadEntityFromZooKeeper(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) const; void setEntityNoLock(const UUID & id, const AccessEntityPtr & entity) TSA_REQUIRES(mutex); void removeEntityNoLock(const UUID & id) TSA_REQUIRES(mutex); + /// Serializes every "read from ZooKeeper -> publish into memory_storage" sequence (entity + /// refreshes and the cache updates of local writes), so that a publish based on an older + /// ZooKeeper read can never overwrite a publish based on a newer one. Held across ZooKeeper + /// round trips, therefore never taken by the read-only methods (findEntity etc.). + /// Lock order: cached_zookeeper_mutex -> refresh_mutex -> mutex. + std::mutex refresh_mutex; + + /// Guards memory_storage; held only for in-memory operations, never across ZooKeeper requests. mutable std::mutex mutex; }; From dabdd1e442cacd69c88febe96cff3f336ac088dd Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 12 Jun 2026 15:21:56 +0000 Subject: [PATCH 52/91] Backport #106395 to 25.8: Arrow IPC: fix heap out-of-bounds reads and structural validation gaps in the column reader --- .../Formats/Impl/ArrowBlockInputFormat.cpp | 5 + .../Formats/Impl/ArrowColumnToCHColumn.cpp | 648 ++++++++++++++++-- .../Formats/Impl/ArrowColumnToCHColumn.h | 7 + .../Formats/Impl/ORCBlockInputFormat.cpp | 5 + src/Processors/Sources/ArrowFlightSource.cpp | 5 + .../04307_arrow_oob_reads.reference | 7 + .../0_stateless/04307_arrow_oob_reads.sh | 113 +++ .../04308_arrow_oob_reads_value.reference | 9 + .../04308_arrow_oob_reads_value.sh | 114 +++ .../04309_arrow_oob_reads_offsets.reference | 15 + .../04309_arrow_oob_reads_offsets.sh | 229 +++++++ ...04310_arrow_oob_reads_arithmetic.reference | 2 + .../04310_arrow_oob_reads_arithmetic.sh | 89 +++ .../04326_arrow_oob_neg_length.reference | 1 + .../0_stateless/04326_arrow_oob_neg_length.sh | 69 ++ .../04327_arrow_oob_list_offsets.reference | 5 + .../04327_arrow_oob_list_offsets.sh | 114 +++ ...28_arrow_oob_nested_child_length.reference | 7 + .../04328_arrow_oob_nested_child_length.sh | 126 ++++ .../04329_arrow_oob_struct_fields.reference | 6 + .../04329_arrow_oob_struct_fields.sh | 140 ++++ .../04330_arrow_oob_declared_length.reference | 9 + .../04330_arrow_oob_declared_length.sh | 144 ++++ .../04331_arrow_oob_validity_bitmap.reference | 4 + .../04331_arrow_oob_validity_bitmap.sh | 141 ++++ 25 files changed, 1958 insertions(+), 56 deletions(-) create mode 100644 tests/queries/0_stateless/04307_arrow_oob_reads.reference create mode 100755 tests/queries/0_stateless/04307_arrow_oob_reads.sh create mode 100644 tests/queries/0_stateless/04308_arrow_oob_reads_value.reference create mode 100755 tests/queries/0_stateless/04308_arrow_oob_reads_value.sh create mode 100644 tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference create mode 100755 tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh create mode 100644 tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.reference create mode 100755 tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.sh create mode 100644 tests/queries/0_stateless/04326_arrow_oob_neg_length.reference create mode 100755 tests/queries/0_stateless/04326_arrow_oob_neg_length.sh create mode 100644 tests/queries/0_stateless/04327_arrow_oob_list_offsets.reference create mode 100755 tests/queries/0_stateless/04327_arrow_oob_list_offsets.sh create mode 100644 tests/queries/0_stateless/04328_arrow_oob_nested_child_length.reference create mode 100755 tests/queries/0_stateless/04328_arrow_oob_nested_child_length.sh create mode 100644 tests/queries/0_stateless/04329_arrow_oob_struct_fields.reference create mode 100755 tests/queries/0_stateless/04329_arrow_oob_struct_fields.sh create mode 100644 tests/queries/0_stateless/04330_arrow_oob_declared_length.reference create mode 100755 tests/queries/0_stateless/04330_arrow_oob_declared_length.sh create mode 100644 tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.reference create mode 100755 tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.sh diff --git a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp index 5ab17e985763..28741ed62f44 100644 --- a/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ArrowBlockInputFormat.cpp @@ -90,6 +90,11 @@ Chunk ArrowBlockInputFormat::read() throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, "Error while reading batch of Arrow data: {}", batch_result.status().ToString()); + /// Validate validity bitmaps before building the table: Table::FromRecordBatches computes + /// each column's null_count, and Arrow derives an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds on a truncated bitmap. + ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(**batch_result); + auto table_result = arrow::Table::FromRecordBatches({*batch_result}); if (!table_result.ok()) throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index f54843b38300..a9d137fa2071 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -80,6 +80,220 @@ namespace ErrorCodes extern const int INCORRECT_DATA; } +namespace +{ + +/// Validate that the validity bitmap (buffers[0]) covers all declared rows. +/// We deliberately do NOT gate on null_count(): for an array produced by Arrow's +/// Slice/Flatten the null count is kUnknownNullCount, and calling null_count() +/// triggers a CountSetBits scan over buffers[0] across [offset, offset+length), +/// which reads out of bounds when the bitmap is truncated, the very thing we are +/// trying to validate. Instead we validate the buffer size whenever a bitmap is +/// present (a present-but-undersized bitmap is always malformed), and skip when it +/// is absent (Arrow reports null_count == 0 for a missing bitmap without scanning). +/// This must run before any null_count()/IsNull()/IsValid() call, including the +/// implicit null_count() in arrow::ChunkedArray's constructor. +void checkValidityBitmap(const arrow::Array & chunk, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[0]; + if (!buffer) + return; + const size_t buffer_size = static_cast(buffer->size()); + const size_t count = static_cast(chunk.offset()) + static_cast(chunk.length()); + const size_t required = count / 8 + (count % 8 != 0 ? 1 : 0); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow validity bitmap too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); +} + +/// Validate that buffers[1] of an Arrow array chunk is large enough to hold +/// elem_size * (offset + length) bytes, then throw INCORRECT_DATA if not. +/// All readers that access buffers[1] directly must call one of these helpers +/// before touching any raw pointer, so the check can never be silently omitted. +void checkArrowBuffer(const arrow::Array & chunk, size_t elem_size, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[1]; + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; + const size_t count = static_cast(chunk.offset()) + static_cast(chunk.length()); + size_t required = 0; + if (unlikely(__builtin_mul_overflow(elem_size, count, &required))) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer size overflow for column '{}': element size {} × {} elements", + column_name, elem_size, count); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + checkValidityBitmap(chunk, column_name); +} + +/// Typed wrapper: validates and returns a pointer to the first element at chunk.offset(). +/// Use for bulk-copy readers. Per-element Value() readers call this for the validation +/// side-effect only (discarding the returned pointer). +template +const T * getValidatedBuffer(const arrow::Array & chunk, const String & column_name) +{ + checkArrowBuffer(chunk, sizeof(T), column_name); + const auto * buf = chunk.data()->buffers[1].get(); + if (!buf) + return nullptr; /// empty chunk (offset == 0, length == 0); no elements will be accessed + return reinterpret_cast(buf->data()) + chunk.offset(); +} + +/// Boolean arrays pack 8 values per byte starting at bit chunk.offset(), so the +/// required byte count uses ceiling division rather than a simple multiply. +void checkBooleanBuffer(const arrow::BooleanArray & chunk, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[1]; + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; + const size_t count = static_cast(chunk.offset()) + static_cast(chunk.length()); + const size_t required = count / 8 + (count % 8 != 0 ? 1 : 0); /// overflow-safe ceiling division + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + checkValidityBitmap(chunk, column_name); +} + +/// Cast array to ArrowNumericArray and validate the data buffer is large enough +/// for all declared rows. Element size is derived from ArrowNumericArray::value_type, +/// so this only compiles for typed numeric arrays (Date32, Date64, Timestamp, +/// Time32/64, HalfFloat, and the plain numeric types). +/// Use checkedCastFixedSizeBinary for FixedSizeBinary arrays, checkedCastBool for BooleanArray. +template +const ArrowNumericArray & checkedCast(const arrow::Array & array, const String & column_name) +{ + static_assert( + requires { typename ArrowNumericArray::value_type; }, + "use checkedCastFixedSizeBinary for FixedSizeBinary arrays or checkedCastBool for BooleanArray"); + const auto & typed = assert_cast(array); + checkArrowBuffer(typed, sizeof(typename ArrowNumericArray::value_type), column_name); + return typed; +} + +/// Cast to a view array type (StringViewArray or BinaryViewArray) and validate +/// that the view-struct buffer (buffers[1]) has enough 16-byte view structs for +/// all declared rows. The actual string bytes live in variadic buffers[2..N] +/// and are validated individually via GetView(). +template +const ArrowViewArray & checkedCastView(const arrow::Array & array, const String & column_name) +{ + const auto & typed = assert_cast(array); + checkArrowBuffer(typed, sizeof(arrow::BinaryViewType::c_type), column_name); + return typed; +} + +/// Validate that the validity bitmap (buffers[0]) covers all declared rows. +/// Validate that the offsets buffer (buffers[1]) of a BinaryArray or LargeBinaryArray +/// holds at least (offset + length + 1) entries. One more than length is required +/// because value_length(i) = offset[i+1] - offset[i], so the last element needs +/// offset[length]. This must be checked before any call to value_offset(i) or +/// GetView(i) to prevent an over-read of the offsets buffer. +template +void checkBinaryOffsetsBuffer(const ArrowBinaryArray & chunk, const String & column_name) +{ + if (unlikely(chunk.length() < 0 || chunk.offset() < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, chunk.length(), chunk.offset()); + const auto & buffer = chunk.data()->buffers[1]; + const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; + const size_t count_plus_one = static_cast(chunk.offset()) + static_cast(chunk.length()) + 1; + size_t required = 0; + if (unlikely(__builtin_mul_overflow(sizeof(typename ArrowBinaryArray::offset_type), count_plus_one, &required))) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow offsets buffer size overflow for column '{}': {} entries", + column_name, count_plus_one); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow buffer too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + checkValidityBitmap(chunk, column_name); +} + +/// Cast to a FixedSizeBinaryArray subclass (plain FixedSizeBinaryArray, Decimal128Array, +/// Decimal256Array) and validate the data buffer using the runtime byte_width(). +template +const ArrowFixedSizeBinaryArray & checkedCastFixedSizeBinary(const arrow::Array & array, const String & column_name) +{ + const auto & typed = assert_cast(array); + checkArrowBuffer(typed, static_cast(typed.byte_width()), column_name); + return typed; +} + +/// Cast to BooleanArray and validate the bit-packed data buffer. +const arrow::BooleanArray & checkedCastBool(const arrow::Array & array, const String & column_name) +{ + const auto & typed = assert_cast(array); + checkBooleanBuffer(typed, column_name); + return typed; +} + +/// Recursively validate that every validity bitmap (buffers[0]) in an array and its children / +/// dictionary covers the declared rows, WITHOUT computing null_count. Must run before any Arrow +/// operation that computes an unknown null_count (kUnknownNullCount = -1) by scanning the bitmap +/// over the declared length, which reads out of bounds when the bitmap is truncated. +void checkArrayDataValidityBitmaps(const arrow::ArrayData & data, const String & column_name) +{ + if (unlikely(data.length < 0 || data.offset < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow array has negative length or offset for column '{}': length={}, offset={}", + column_name, data.length, data.offset); + if (!data.buffers.empty() && data.buffers[0]) + { + const size_t buffer_size = static_cast(data.buffers[0]->size()); + const size_t count = static_cast(data.offset) + static_cast(data.length); + const size_t required = count / 8 + (count % 8 != 0 ? 1 : 0); + if (unlikely(buffer_size < required)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow validity bitmap too small for column '{}': {} bytes available, {} required", + column_name, buffer_size, required); + } + for (const auto & child : data.child_data) + if (child) + checkArrayDataValidityBitmaps(*child, column_name); + if (data.dictionary) + checkArrayDataValidityBitmaps(*data.dictionary, column_name); +} + +/// Validate every chunk with `validate` before the caller reserves column memory based on +/// arrow_column->length(). Without this, an inflated or buffer-inconsistent declared length +/// makes reserve() throw CANNOT_ALLOCATE_MEMORY instead of a clean INCORRECT_DATA from the +/// per-chunk validator. Use the same validator the reader's main loop uses. +template +void validateChunksBeforeReserve(const arrow::ChunkedArray & arrow_column, Validator && validate) +{ + for (int chunk_i = 0, num_chunks = arrow_column.num_chunks(); chunk_i < num_chunks; ++chunk_i) + validate(*arrow_column.chunk(chunk_i)); +} + +} + /// Inserts numeric data right into internal column data to reduce an overhead template > static ColumnWithTypeAndName readColumnWithNumericData(const std::shared_ptr & arrow_column, const String & column_name) @@ -87,6 +301,11 @@ static ColumnWithTypeAndName readColumnWithNumericData(const std::shared_ptr>(); auto internal_column = internal_type->createColumn(); auto & column_data = static_cast(*internal_column).getData(); + + /// Validate every chunk's data buffer before reserving column memory: an inflated + /// (or buffer-inconsistent) declared length must surface as INCORRECT_DATA rather than + /// a huge reserve() that throws CANNOT_ALLOCATE_MEMORY. + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkArrowBuffer(chunk, sizeof(NumericType), column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) @@ -96,8 +315,7 @@ static ColumnWithTypeAndName readColumnWithNumericData(const std::shared_ptr buffer = chunk->data()->buffers[1]; - const auto * raw_data = reinterpret_cast(buffer->data()) + chunk->offset(); + const auto * raw_data = getValidatedBuffer(*chunk, column_name); column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); } return {std::move(internal_column), std::move(internal_type), column_name}; @@ -129,11 +347,16 @@ static ColumnWithTypeAndName readColumnWithStringData(const std::shared_ptrnum_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; + /// Validate the offsets buffer before the first value_offset(i) call. + /// The offsets array needs (offset + length + 1) entries because + /// value_length(i) = offset[i+1] - offset[i]. + checkBinaryOffsetsBuffer(chunk, column_name); + if (chunk.null_count() == 0) { for (size_t i = 0; i < chunk_length; ++i) @@ -175,7 +398,7 @@ static ColumnWithTypeAndName readColumnWithStringData(const std::shared_ptrnum_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); @@ -222,16 +445,57 @@ static ColumnWithTypeAndName readColumnWithJSONData( auto internal_column = internal_type->createColumn(); auto & column_object = assert_cast(*internal_column); + /// Validate every chunk's offsets buffer AND each row's data range before reserving column + /// memory, so a forged (or buffer-inconsistent) declared length, or valid offsets metadata + /// over a truncated data buffer, is rejected as INCORRECT_DATA rather than a huge reserve(). + /// The String/Binary reader validates in its first pass for the same reason. + for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) + { + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; + const bool has_nulls = chunk.null_count() != 0; + for (size_t row_i = 0, num_rows = chunk.length(); row_i < num_rows; ++row_i) + { + if (has_nulls && chunk.IsNull(row_i)) + continue; + const size_t safe_offset = static_cast(chunk.value_offset(row_i)); + const size_t safe_length = static_cast(chunk.value_length(row_i)); + if (unlikely(safe_offset > data_buf_size || safe_length > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds for column '{}': " + "row {} has offset {} and length {} but buffer is {} bytes", + column_name, row_i, chunk.value_offset(row_i), chunk.value_length(row_i), data_buf_size); + } + } + column_object.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const ArrowArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; + + const auto validate_row = [&](size_t row_i) + { + const size_t safe_offset = static_cast(chunk.value_offset(row_i)); + const size_t safe_length = static_cast(chunk.value_length(row_i)); + if (unlikely(safe_offset > data_buf_size || safe_length > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray offsets exceed data buffer bounds for column '{}': " + "row {} has offset {} and length {} but buffer is {} bytes", + column_name, row_i, chunk.value_offset(row_i), chunk.value_length(row_i), data_buf_size); + }; if (chunk.null_count() == 0) { for (size_t row_i = 0, num_rows = chunk.length(); row_i < num_rows; ++row_i) { + validate_row(row_i); auto view = chunk.GetView(row_i); ReadBufferFromMemory rb(view.data(), view.size()); serialization->deserializeTextJSON(column_object, rb, format_settings); @@ -246,6 +510,7 @@ static ColumnWithTypeAndName readColumnWithJSONData( column_object.insertDefault(); continue; } + validate_row(row_i); auto view = chunk.GetView(row_i); ReadBufferFromMemory rb(view.data(), view.size()); serialization->deserializeTextJSON(column_object, rb, format_settings); @@ -263,11 +528,15 @@ static ColumnWithTypeAndName readColumnWithFixedStringData(const std::shared_ptr auto internal_type = std::make_shared(fixed_len); auto internal_column = internal_type->createColumn(); PaddedPODArray & column_chars = assert_cast(*internal_column).getChars(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastFixedSizeBinary(chunk, column_name); }); column_chars.reserve(arrow_column->length() * fixed_len); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::FixedSizeBinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCastFixedSizeBinary(*(arrow_column->chunk(chunk_i)), column_name); + /// An empty chunk can leave the data buffer null; skip before reading raw_values(). + if (chunk.length() == 0) + continue; const uint8_t * raw_data = chunk.raw_values(); column_chars.insert_assume_reserved(raw_data, raw_data + fixed_len * chunk.length()); } @@ -289,11 +558,15 @@ static ColumnWithTypeAndName readColumnWithBigIntegerFromFixedBinaryData(const s auto internal_column = column_type->createColumn(); auto & data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastFixedSizeBinary(chunk, column_name); }); data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::FixedSizeBinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCastFixedSizeBinary(*(arrow_column->chunk(chunk_i)), column_name); + /// An empty chunk can leave the data buffer null; skip before reading raw_values(). + if (chunk.length() == 0) + continue; const auto * raw_data = reinterpret_cast(chunk.raw_values()); data.insert_assume_reserved(raw_data, raw_data + chunk.length()); } @@ -307,17 +580,29 @@ static ColumnWithTypeAndName readColumnWithBigNumberFromBinaryData(const std::sh size_t total_size = 0; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); const size_t chunk_length = chunk.length(); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t i = 0; i != chunk_length; ++i) { + if (chunk.IsNull(i)) + continue; /// If at least one value size is not equal to the size if big integer, fallback to reading String column and further cast to result type. - if (!chunk.IsNull(i) && chunk.value_length(i) != sizeof(ValueType)) + if (chunk.value_length(i) != sizeof(ValueType)) return readColumnWithStringData(arrow_column, column_name); - - total_size += chunk_length; + /// Validate the data range before reserve(total_size): valid sizeof(ValueType) offsets + /// with a truncated data buffer must be rejected here, not after the allocation. + const size_t safe_offset = static_cast(chunk.value_offset(i)); + if (unlikely(safe_offset > data_buf_size || sizeof(ValueType) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, i, chunk.value_offset(i), data_buf_size); } + total_size += chunk_length; } auto internal_column = column_type->createColumn(); @@ -326,13 +611,27 @@ static ColumnWithTypeAndName readColumnWithBigNumberFromBinaryData(const std::sh for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { if (chunk.IsNull(value_i)) + { integer_column.insertDefault(); + } else - integer_column.insertData(chunk.Value(value_i).data(), chunk.Value(value_i).size()); + { + const size_t safe_offset = static_cast(chunk.value_offset(value_i)); + if (unlikely(safe_offset > data_buf_size || sizeof(ValueType) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, value_i, chunk.value_offset(value_i), data_buf_size); + const auto * raw_data = reinterpret_cast(chunk.value_data()->data()) + safe_offset; + integer_column.insertData(raw_data, sizeof(ValueType)); + } } } return {std::move(internal_column), column_type, column_name}; @@ -343,14 +642,15 @@ static ColumnWithTypeAndName readColumnWithBooleanData(const std::shared_ptrcreateColumn(); auto & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastBool(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::BooleanArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); - if (chunk.length() == 0) + if (arrow_column->chunk(chunk_i)->length() == 0) continue; + const auto & chunk = checkedCastBool(*(arrow_column->chunk(chunk_i)), column_name); for (size_t bool_i = 0; bool_i != static_cast(chunk.length()); ++bool_i) column_data.emplace_back(chunk.Value(bool_i)); } @@ -376,13 +676,13 @@ static ColumnWithTypeAndName readColumnWithDate32Data(const std::shared_ptrcreateColumn(); PaddedPODArray & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::Date32Array & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); - /// Check date range only when requested type is actually Date32 if (check_date_range) { for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) @@ -410,8 +710,11 @@ static ColumnWithTypeAndName readColumnWithDate32Data(const std::shared_ptr buffer = chunk.data()->buffers[1]; - const auto * raw_data = reinterpret_cast(buffer->data()) + chunk.offset(); + /// getValidatedBuffer returns nullptr for an empty chunk (Arrow may leave buffers[1] + /// null when length == 0); skip it instead of dereferencing a null data buffer. + if (chunk.length() == 0) + continue; + const auto * raw_data = getValidatedBuffer(chunk, column_name); column_data.insert_assume_reserved(raw_data, raw_data + chunk.length()); } } @@ -424,11 +727,12 @@ static ColumnWithTypeAndName readColumnWithDate64Data(const std::shared_ptr(); auto internal_column = internal_type->createColumn(); auto & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { auto timestamp = static_cast(chunk.Value(value_i) / 1000); // Always? in ms @@ -445,11 +749,12 @@ static ColumnWithTypeAndName readColumnWithTimestampData(const std::shared_ptr(scale, arrow_type.timezone()); auto internal_column = internal_type->createColumn(); auto & column_data = assert_cast &>(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { column_data.emplace_back(chunk.Value(value_i)); @@ -465,14 +770,15 @@ static ColumnWithTypeAndName readColumnWithTimeData(const std::shared_ptr(scale); auto internal_column = internal_type->createColumn(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); internal_column->reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); - if (chunk.length() == 0) + if (arrow_column->chunk(chunk_i)->length() == 0) continue; + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { assert_cast(*internal_column).insertValue(chunk.Value(value_i)); @@ -498,11 +804,12 @@ static ColumnWithTypeAndName readColumnWithDecimalDataImpl(const std::shared_ptr auto internal_column = internal_type->createColumn(); auto & column = assert_cast &>(*internal_column); auto & column_data = column.getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCastFixedSizeBinary(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCastFixedSizeBinary(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { column_data.emplace_back(chunk.IsNull(value_i) ? DecimalType(0) : *reinterpret_cast(chunk.Value(value_i))); // TODO: copy column @@ -515,11 +822,12 @@ static ColumnWithTypeAndName readColumnWithFloat16Data(const std::shared_ptrgetData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkedCast(chunk, column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = checkedCast(*(arrow_column->chunk(chunk_i)), column_name); for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) column_data.emplace_back(chunk.IsNull(value_i) ? 0 : convertFloat16ToFloat32(chunk.Value(value_i))); } @@ -542,8 +850,14 @@ static ColumnWithTypeAndName readColumnWithDecimalData(const std::shared_ptr & arrow_column) +static ColumnPtr readByteMapFromArrowColumn(const std::shared_ptr & arrow_column, const String & column_name) { + /// Validate every chunk's validity bitmap before allocating the null map, so a forged length + /// whose validity bitmap is too small is rejected as INCORRECT_DATA instead of triggering a + /// huge null-map allocation. + for (int chunk_i = 0; chunk_i != arrow_column->num_chunks(); ++chunk_i) + checkValidityBitmap(*arrow_column->chunk(chunk_i), column_name); + if (!arrow_column->null_count()) return ColumnUInt8::create(arrow_column->length(), 0); @@ -567,7 +881,8 @@ static ColumnWithTypeAndName readColumnWithGeoData(const std::shared_ptrcreateColumn(); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::BinaryArray & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); std::shared_ptr buffer = chunk.value_data(); const size_t chunk_length = chunk.length(); const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; @@ -629,8 +944,36 @@ struct ArrowOffsetArray using type = arrow::Int64Array; }; +/// Validate that an Arrow list offsets array is non-negative and monotonically non-decreasing. +/// Must run before arrow's Flatten() slices the values array using offset[0]..offset[length]: +/// a decreasing pair such as [64, 0] otherwise reaches ArrayData::Slice with an out-of-range +/// length and fails deep inside Arrow instead of being rejected here as INCORRECT_DATA. +template +static void checkListOffsetsMonotonic(const OffsetArray & arrow_offsets, const String & column_name) +{ + if (arrow_offsets.length() == 0) + return; + int64_t previous_offset = arrow_offsets.Value(0); + if (unlikely(previous_offset < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List offsets contain a negative value for column '{}': offset[0]={}", + column_name, previous_offset); + for (int64_t i = 1; i < arrow_offsets.length(); ++i) + { + int64_t offset = arrow_offsets.Value(i); + if (unlikely(offset < previous_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List offsets are not monotonically non-decreasing for column '{}': " + "offset[{}]={} < offset[{}]={}", + column_name, i, offset, i - 1, previous_offset); + previous_offset = offset; + } +} + template -static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptr & arrow_column) +static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptr & arrow_column, const String & column_name) { auto offsets_column = ColumnUInt64::create(); ColumnArray::Offsets & offsets_data = assert_cast &>(*offsets_column).getData(); @@ -638,9 +981,11 @@ static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptrnum_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowListArray & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); auto arrow_offsets_array = list_chunk.offsets(); - auto & arrow_offsets = dynamic_cast::type &>(*arrow_offsets_array); + /// The offsets array is a numeric Int32/Int64 array, validate its buffer before Value() calls. + using OffsetArray = typename ArrowOffsetArray::type; + const auto & arrow_offsets = checkedCast(*arrow_offsets_array, column_name); /* * CH uses element size as "offsets", while arrow uses actual offsets as offsets. @@ -656,12 +1001,15 @@ static ColumnPtr readOffsetsFromArrowListColumn(const std::shared_ptr(offset - previous_offset); previous_offset = offset; offsets_data.emplace_back(offsets_data.back() + elements); } @@ -697,6 +1045,7 @@ static ColumnWithTypeAndName readColumnWithIndexesDataImpl(std::shared_ptr>(); auto internal_column = internal_type->createColumn(); auto & column_data = static_cast(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkArrowBuffer(chunk, sizeof(NumericType), column_name); }); column_data.reserve(arrow_column->length()); NumericType shift = is_nullable ? 2 : 1; @@ -707,8 +1056,7 @@ static ColumnWithTypeAndName readColumnWithIndexesDataImpl(std::shared_ptr buffer = chunk->data()->buffers[1]; - const auto * data = reinterpret_cast(buffer->data()) + chunk->offset(); + const auto * data = getValidatedBuffer(*chunk, column_name); /// Check that indexes are correct (protection against corrupted files) /// Note that on null values index can be arbitrary value. @@ -808,13 +1156,87 @@ static ColumnPtr readColumnWithIndexesData(std::shared_ptr } template -static std::shared_ptr getNestedArrowColumn(const std::shared_ptr & arrow_column) +static std::shared_ptr getNestedArrowColumn(const std::shared_ptr & arrow_column, const String & column_name) { arrow::ArrayVector array_vector; array_vector.reserve(arrow_column->num_chunks()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - ArrowListArray & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & list_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + + /// Validate the parent list validity bitmap before Flatten(): when null_count > 0, + /// Flatten calls IsValid on the parent list array which reads buffers[0]. + checkValidityBitmap(list_chunk, column_name); + + /// Validate the offsets buffer before Flatten() reads it: Flatten() iterates + /// over offset[0..length] to slice the values array, so it needs (length+1) entries. + /// We also validate monotonicity here, before Flatten(), because Flatten() slices the + /// values array from offset[0] to offset[length]; a decreasing pair would otherwise fail + /// deep inside Arrow's ArrayData::Slice instead of being rejected as INCORRECT_DATA. + /// FixedSizeListArray uses a fixed stride instead of a variable-length offsets array. + if constexpr (!std::is_same_v) + { + /// offsets() returns a temporary shared_ptr; keep it alive in a named local so the + /// reference returned by checkedCast does not dangle while we validate it. + auto arrow_offsets_array = list_chunk.offsets(); + using OffsetArray = typename ArrowOffsetArray::type; + const auto & arrow_offsets = checkedCast(*arrow_offsets_array, column_name); + checkListOffsetsMonotonic(arrow_offsets, column_name); + + /// Flatten() slices the values array over [offset[0], offset[length]]. Monotonic, + /// non-negative offsets can still point past the end of (or a negative-length) values + /// array, which would fail inside Arrow's ArrayData::Slice; reject it here instead. + const auto & values = list_chunk.values(); + const int64_t values_len = values ? values->length() : 0; + if (unlikely(values_len < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List values array has negative length {} for column '{}'", + values_len, column_name); + if (arrow_offsets.length() > 0) + { + const int64_t last_offset = arrow_offsets.Value(arrow_offsets.length() - 1); + if (unlikely(last_offset > values_len)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List last offset {} exceeds values array length {} for column '{}'", + last_offset, values_len, column_name); + } + } + else + { + /// FixedSizeList has no offsets array: Flatten() slices the values array over + /// [offset*stride, (offset+length)*stride]. Validate the fixed stride is + /// non-negative and the slice stays within the values array before Flatten() + /// reaches Arrow's ArrayData::Slice (which would otherwise fail with STD_EXCEPTION). + const int64_t stride = list_chunk.value_length(); + if (unlikely(stride < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList has negative list size {} for column '{}'", + stride, column_name); + const size_t count = static_cast(list_chunk.offset()) + static_cast(list_chunk.length()); + size_t required = 0; + if (unlikely(__builtin_mul_overflow(count, static_cast(stride), &required))) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList size overflow for column '{}': {} rows × stride {}", + column_name, count, stride); + const auto & values = list_chunk.values(); + const int64_t values_len_signed = values ? values->length() : 0; + if (unlikely(values_len_signed < 0)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList values array has negative length {} for column '{}'", + values_len_signed, column_name); + const size_t values_len = static_cast(values_len_signed); + if (unlikely(required > values_len)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow FixedSizeList values array too small for column '{}': " + "need {} elements but values array has {}", + column_name, required, values_len); + } /* * It seems like arrow::ListArray::values() (nested column data) might or might not be shared across chunks. @@ -826,7 +1248,12 @@ static std::shared_ptr getNestedArrowColumn(const std::shar auto flatten_result = list_chunk.Flatten(); if (flatten_result.ok()) { - array_vector.emplace_back(flatten_result.ValueOrDie()); + /// Flatten slices the values array, producing a child with kUnknownNullCount. + /// Validate its validity bitmap now, before arrow::ChunkedArray's constructor + /// (below) sums chunk->null_count() and scans a possibly-truncated bitmap. + const auto & flattened = flatten_result.ValueOrDie(); + checkValidityBitmap(*flattened, column_name); + array_vector.emplace_back(flattened); } else { @@ -841,14 +1268,27 @@ static ColumnWithTypeAndName readIPv6ColumnFromBinaryData(const std::shared_ptr< size_t total_size = 0; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); const size_t chunk_length = chunk.length(); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t i = 0; i != chunk_length; ++i) { + if (chunk.IsNull(i)) + continue; /// If at least one value size is not 16 bytes, fallback to reading String column and further cast to IPv6. - if (!chunk.IsNull(i) && chunk.value_length(i) != sizeof(IPv6)) + if (chunk.value_length(i) != sizeof(IPv6)) return readColumnWithStringData(arrow_column, column_name); + /// Validate the data range before reserve(total_size): valid 16-byte offsets with a + /// truncated data buffer must be rejected here, not after the allocation. + const size_t safe_offset = static_cast(chunk.value_offset(i)); + if (unlikely(safe_offset > data_buf_size || sizeof(IPv6) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, i, chunk.value_offset(i), data_buf_size); } total_size += chunk_length; } @@ -860,13 +1300,27 @@ static ColumnWithTypeAndName readIPv6ColumnFromBinaryData(const std::shared_ptr< for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + const auto & chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + checkBinaryOffsetsBuffer(chunk, column_name); + const size_t data_buf_size = chunk.value_data() ? static_cast(chunk.value_data()->size()) : 0; for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) { if (chunk.IsNull(value_i)) + { ipv6_column.insertDefault(); + } else - ipv6_column.insertData(chunk.Value(value_i).data(), chunk.Value(value_i).size()); + { + const size_t safe_offset = static_cast(chunk.value_offset(value_i)); + if (unlikely(safe_offset > data_buf_size || sizeof(IPv6) > data_buf_size - safe_offset)) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow BinaryArray data buffer too small for column '{}': " + "row {} has offset {} but buffer is {} bytes", + column_name, value_i, chunk.value_offset(value_i), data_buf_size); + const auto * raw_data = reinterpret_cast(chunk.value_data()->data()) + safe_offset; + ipv6_column.insertData(raw_data, sizeof(IPv6)); + } } } return {std::move(internal_column), std::move(internal_type), column_name}; @@ -877,6 +1331,7 @@ static ColumnWithTypeAndName readIPv4ColumnWithInt32Data(const std::shared_ptr(); auto internal_column = internal_type->createColumn(); auto & column_data = assert_cast(*internal_column).getData(); + validateChunksBeforeReserve(*arrow_column, [&](const arrow::Array & chunk) { checkArrowBuffer(chunk, sizeof(IPv4), column_name); }); column_data.reserve(arrow_column->length()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) @@ -886,8 +1341,7 @@ static ColumnWithTypeAndName readIPv4ColumnWithInt32Data(const std::shared_ptr buffer = chunk->data()->buffers[1]; - const auto * raw_data = reinterpret_cast(buffer->data()) + chunk->offset(); + const auto * raw_data = getValidatedBuffer(*chunk, column_name); column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); } return {std::move(internal_column), std::move(internal_type), column_name}; @@ -1079,7 +1533,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( } } - auto arrow_nested_column = getNestedArrowColumn(arrow_column); + auto arrow_nested_column = getNestedArrowColumn(arrow_column, column_name); auto nested_column = readColumnFromArrowColumn(arrow_nested_column, column_name, full_column_name, @@ -1095,7 +1549,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( if (!nested_column.column) return {}; - auto offsets_column = readOffsetsFromArrowListColumn(arrow_column); + auto offsets_column = readOffsetsFromArrowListColumn(arrow_column, column_name); const auto * tuple_column = assert_cast(nested_column.column.get()); const auto * tuple_type = assert_cast(nested_column.type.get()); @@ -1112,6 +1566,14 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( key_type = key_type_hint; } + { + const auto & off = assert_cast &>(*offsets_column).getData(); + if (!off.empty() && off.back() != key_column->size()) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow Map column '{}': last offset {} does not match nested column size {}", + column_name, off.back(), key_column->size()); + } auto map_column = ColumnMap::create(key_column, value_column, offsets_column); auto map_type = std::make_shared(key_type, value_type); return {std::move(map_column), std::move(map_type), column_name}; @@ -1176,11 +1638,11 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( switch (list_type) { case ListType::LargeList: - return getNestedArrowColumn(arrow_column); + return getNestedArrowColumn(arrow_column, column_name); case ListType::FixedSizeList: - return getNestedArrowColumn(arrow_column); + return getNestedArrowColumn(arrow_column, column_name); case ListType::List: - return getNestedArrowColumn(arrow_column); + return getNestedArrowColumn(arrow_column, column_name); } }(); @@ -1204,16 +1666,29 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( switch (list_type) { case ListType::LargeList: - return readOffsetsFromArrowListColumn(arrow_column); + return readOffsetsFromArrowListColumn(arrow_column, column_name); case ListType::FixedSizeList: { auto fixed_length = assert_cast(arrow_column->type().get())->list_size(); return readOffsetsFromFixedArrowListColumn(arrow_column, fixed_length); } case ListType::List: - return readOffsetsFromArrowListColumn(arrow_column); + return readOffsetsFromArrowListColumn(arrow_column, column_name); } }(); + /// Validate that the last offset matches the nested column size before constructing + /// ColumnArray. ColumnArray's constructor skips data->size() == last_offset when + /// data->empty() (the && !data->empty() short-circuit), so a crafted Arrow file + /// with an empty child but non-zero offsets would silently produce a column whose + /// interior offsets point past the inner allocation. + { + const auto & off = assert_cast &>(*offsets_column).getData(); + if (!off.empty() && off.back() != nested_column.column->size()) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow List column '{}': last offset {} does not match nested column size {}", + column_name, off.back(), nested_column.column->size()); + } auto array_column = ColumnArray::create(nested_column.column, offsets_column); DataTypePtr array_type; @@ -1237,9 +1712,30 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( std::vector nested_arrow_columns(arrow_struct_type->num_fields()); for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::StructArray & struct_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & struct_chunk = assert_cast(*(arrow_column->chunk(chunk_i))); for (int i = 0; i < arrow_struct_type->num_fields(); ++i) - nested_arrow_columns[i].emplace_back(struct_chunk.field(i)); + { + /// field() slices child[struct.offset : struct.offset + struct.length] (the + /// struct may be sliced, e.g. when nested in a list). A child shorter than that + /// range, including the negative-length case, would fail inside Arrow's + /// ArrayData::Slice, so validate the range here first. struct.offset/length are + /// already known non-negative (checked at readColumnFromArrowColumn entry). + const auto & child_data = struct_chunk.data()->child_data[i]; + if (unlikely( + child_data->length < 0 + || struct_chunk.offset() > child_data->length + || struct_chunk.length() > child_data->length - struct_chunk.offset())) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow Struct field {} (length {}) is too small for the struct slice " + "[offset {}, +{}) for column '{}'", + i, child_data->length, struct_chunk.offset(), struct_chunk.length(), column_name); + auto field_chunk = struct_chunk.field(i); + /// field() Slice-clamps children, producing kUnknownNullCount; validate the + /// child bitmap before arrow::ChunkedArray's constructor (below) scans it. + checkValidityBitmap(*field_chunk, column_name); + nested_arrow_columns[i].emplace_back(std::move(field_chunk)); + } } Columns tuple_elements; @@ -1312,6 +1808,27 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( tuple_names.emplace_back(std::move(column_with_type_and_name.name)); } + /// Validate that every field has exactly as many rows as the parent struct + /// declares. arrow::StructArray::field() silently Slices a short child to + /// the parent's reported length, so a crafted Arrow file can patch individual + /// fields' FieldNode.length without triggering an Arrow-level error. Without + /// this check, ColumnTuple would hold fields of unequal size, and any reader + /// that accesses a short field past its allocation triggers an OOB heap read. + /// Note: this also covers the Map case, Map entries are read through this + /// STRUCT branch, so mismatched key vs. value lengths are caught here. + if (!tuple_elements.empty()) + { + const size_t expected_rows = static_cast(arrow_column->length()); + for (size_t i = 0; i < tuple_elements.size(); ++i) + { + if (tuple_elements[i]->size() != expected_rows) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Arrow Struct column '{}': field '{}' has {} rows but parent struct declares {}", + column_name, tuple_names[i], tuple_elements[i]->size(), expected_rows); + } + } + ColumnPtr tuple_column; if (tuple_elements.empty()) tuple_column = ColumnTuple::create(arrow_column->length()); @@ -1331,7 +1848,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( arrow::ArrayVector dict_array; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::DictionaryArray & dict_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & dict_chunk = assert_cast(*(arrow_column->chunk(chunk_i))); dict_array.emplace_back(dict_chunk.dictionary()); } @@ -1373,7 +1890,7 @@ static ColumnWithTypeAndName readNonNullableColumnFromArrowColumn( arrow::ArrayVector indexes_array; for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) { - arrow::DictionaryArray & dict_chunk = dynamic_cast(*(arrow_column->chunk(chunk_i))); + auto & dict_chunk = assert_cast(*(arrow_column->chunk(chunk_i))); indexes_array.emplace_back(dict_chunk.indices()); } @@ -1445,6 +1962,18 @@ static ColumnWithTypeAndName readColumnFromArrowColumn( const std::optional> & parquet_columns_to_clickhouse, const std::optional> & clickhouse_columns_to_parquet) { + /// Validate each chunk up front, before anything reads the declared length: + /// - checkValidityBitmap rejects a negative length/offset and a validity bitmap (buffers[0]) + /// too small for the declared rows. It is scan-free (never calls null_count), so it must + /// run before the arrow_column->null_count() below: Arrow computes an unknown null_count + /// (kUnknownNullCount = -1) by scanning buffers[0] over the declared length, which reads + /// out of bounds when the bitmap is truncated. + /// - rejecting a negative length here also stops a reader reserving a huge column from a + /// wrapped-to-huge size_t length. + /// This runs for every nested level too, since the function recurses for nested types. + for (int chunk_i = 0, num_chunks = arrow_column->num_chunks(); chunk_i < num_chunks; ++chunk_i) + checkValidityBitmap(*arrow_column->chunk(chunk_i), column_name); + bool read_as_nullable_column = (arrow_column->null_count() || is_nullable_column || (type_hint && type_hint->isNullable())) && !geo_metadata && settings.allow_inferring_nullable_columns; if (read_as_nullable_column && arrow_column->type()->id() != arrow::Type::LIST && @@ -1473,7 +2002,7 @@ static ColumnWithTypeAndName readColumnFromArrowColumn( if (!nested_column.column) return {}; - auto nullmap_column = readByteMapFromArrowColumn(arrow_column); + auto nullmap_column = readByteMapFromArrowColumn(arrow_column, column_name); auto nullable_type = std::make_shared(std::move(nested_column.type)); auto nullable_column = ColumnNullable::create(nested_column.column, nullmap_column); @@ -1604,6 +2133,13 @@ ArrowColumnToCHColumn::ArrowColumnToCHColumn( { } +void ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(const arrow::RecordBatch & batch) +{ + const auto & schema = *batch.schema(); + for (int i = 0, num_columns = batch.num_columns(); i < num_columns; ++i) + checkArrayDataValidityBitmaps(*batch.column(i)->data(), schema.field(i)->name()); +} + Chunk ArrowColumnToCHColumn::arrowTableToCHChunk( const std::shared_ptr & table, size_t num_rows, diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h index f39becac56c1..7335849a47ba 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.h @@ -42,6 +42,13 @@ class ArrowColumnToCHColumn std::shared_ptr metadata, BlockMissingValues * block_missing_values = nullptr); + /// Validate that every validity bitmap in the record batch (recursively, including nested + /// children and dictionaries) covers its declared rows. Must be called before building an + /// arrow::Table from the batch: Arrow computes an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds when the bitmap is + /// truncated. Throws INCORRECT_DATA on a malformed bitmap. + static void checkRecordBatchValidityBitmaps(const arrow::RecordBatch & batch); + /// Transform arrow schema to ClickHouse header static Block arrowSchemaToCHHeader( const arrow::Schema & schema, diff --git a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp index 26fdbfe648c0..15aed8a8754c 100644 --- a/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/ORCBlockInputFormat.cpp @@ -59,6 +59,11 @@ Chunk ORCBlockInputFormat::read() if (!batch) return {}; + /// Validate validity bitmaps before building the table: Table::FromRecordBatches computes + /// each column's null_count, and Arrow derives an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds on a truncated bitmap. + ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(*batch); + auto table_result = arrow::Table::FromRecordBatches({batch}); if (!table_result.ok()) throw Exception( diff --git a/src/Processors/Sources/ArrowFlightSource.cpp b/src/Processors/Sources/ArrowFlightSource.cpp index f1c4acc1344a..8081b4c30741 100644 --- a/src/Processors/Sources/ArrowFlightSource.cpp +++ b/src/Processors/Sources/ArrowFlightSource.cpp @@ -106,6 +106,11 @@ Chunk ArrowFlightSource::generate() FormatSettings::DateTimeOverflowBehavior::Throw, /* allow_geoparquet_parser = */ false); + /// Validate validity bitmaps before building the table: Table::FromRecordBatches computes + /// each column's null_count, and Arrow derives an unknown FieldNode null_count by scanning + /// the bitmap over the declared length, which reads out of bounds on a truncated bitmap. + ArrowColumnToCHColumn::checkRecordBatchValidityBitmaps(*batch); + auto batch_result = arrow::Table::FromRecordBatches({batch}); if (!batch_result.ok()) { diff --git a/tests/queries/0_stateless/04307_arrow_oob_reads.reference b/tests/queries/0_stateless/04307_arrow_oob_reads.reference new file mode 100644 index 000000000000..97564127add2 --- /dev/null +++ b/tests/queries/0_stateless/04307_arrow_oob_reads.reference @@ -0,0 +1,7 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04307_arrow_oob_reads.sh b/tests/queries/0_stateless/04307_arrow_oob_reads.sh new file mode 100755 index 000000000000..5e234acd3bbe --- /dev/null +++ b/tests/queries/0_stateless/04307_arrow_oob_reads.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for heap out-of-bounds reads in Arrow IPC format readers +# (bulk memcpy readers — fixed-size buffers[1]). +# +# Each test crafts an Arrow IPC file where the RecordBatch declares many rows +# but the data buffer in the file body holds only a single element. On an +# unpatched build this causes a heap-buffer-overflow caught by ASan. The +# fixed build must reject every such file with INCORRECT_DATA. +# +# 1. readColumnWithNumericData – plain numeric (UInt32 / Int64 / …) +# 2. readColumnWithDurationData – Arrow Duration → Interval +# 3. readColumnWithFixedStringData – FixedSizeBinary → FixedString +# 4. readColumnWithBigIntegerFromFixedBinaryData – FixedSizeBinary → Int128/Int256 +# 5. readColumnWithDate32Data (fast path) – Date32 → numeric (no range check) +# 6. readColumnWithIndexesDataImpl – Dictionary index buffer +# 7. readIPv4ColumnWithInt32Data – Int32 → IPv4 + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +LARGE_N = 16384 + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def inflate_row_count(data, orig_n, large_n=LARGE_N): + needle = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check numeric $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/numeric.arrow', Arrow)" +check duration $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/duration.arrow', Arrow)" +check fixed_string $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/fixed_string.arrow', Arrow)" +check int128 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/int128.arrow', Arrow)" +# Date32 fast path: numeric type hint skips range checking, hits the raw buffer read +check date32 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/date32.arrow', Arrow, 'x Int32')" +# Dict indexes: integer-valued dictionary isolates the index-buffer read path +check dict_indexes $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/dict_indexes.arrow', Arrow)" +# IPv4: Arrow Int32 with CH IPv4 type hint routes through readIPv4ColumnWithInt32Data +check ipv4 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/ipv4.arrow', Arrow, 'x IPv4')" diff --git a/tests/queries/0_stateless/04308_arrow_oob_reads_value.reference b/tests/queries/0_stateless/04308_arrow_oob_reads_value.reference new file mode 100644 index 000000000000..6e3ef492598f --- /dev/null +++ b/tests/queries/0_stateless/04308_arrow_oob_reads_value.reference @@ -0,0 +1,9 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh b/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh new file mode 100755 index 000000000000..a633412acff6 --- /dev/null +++ b/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for heap out-of-bounds reads in Arrow IPC format readers +# (per-element Value() readers — checkedCast validates before the loop). +# +# 8. readColumnWithBooleanData – BooleanArray::Value() / bit-packed buffer +# 9. readColumnWithDate32Data (slow)– Date32Array::Value() +# 10. readColumnWithDate64Data – Date64Array::Value() +# 11. readColumnWithTimestampData – TimestampArray::Value() +# 12. readColumnWithTimeData (Time32)– Time32Array::Value() +# 13. readColumnWithTimeData (Time64)– Time64Array::Value() +# 14. readColumnWithFloat16Data – HalfFloatArray::Value() +# 15. readColumnWithDecimalDataImpl – DecimalArray::Value() +# 16. readColumnWithUUIDFromFixedBinaryData – FixedSizeBinaryArray::GetValue() + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +LARGE_N = 16384 + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def inflate_row_count(data, orig_n, large_n=LARGE_N): + needle = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check bool $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/bool.arrow', Arrow)" +# Date32 slow path: no numeric type hint → check_date_range=true → Value() loop +check date32_slow $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/date32_slow.arrow', Arrow)" +check date64 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/date64.arrow', Arrow)" +check timestamp $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/timestamp.arrow', Arrow)" +check time32 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/time32.arrow', Arrow)" +check time64 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/time64.arrow', Arrow)" +check float16 $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/float16.arrow', Arrow)" +check decimal $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/decimal.arrow', Arrow)" +# UUID: explicit type hint routes through readColumnWithUUIDFromFixedBinaryData +check uuid $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/uuid.arrow', Arrow, 'x UUID')" diff --git a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference new file mode 100644 index 000000000000..e99e3dad7246 --- /dev/null +++ b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference @@ -0,0 +1,15 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh new file mode 100755 index 000000000000..1c4a38394dd4 --- /dev/null +++ b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh @@ -0,0 +1,229 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for heap out-of-bounds reads in Arrow IPC format readers +# (view-struct buffer and offsets-buffer readers). +# +# 17. readColumnWithViewData (StringViewArray) – view-struct buffer (16 bytes/row) +# 18. readColumnWithViewData (BinaryViewArray) – view-struct buffer +# 19. readColumnWithStringData – offsets buffer over-read before per-row data check +# 20. readOffsetsFromArrowListColumn – List offsets Int32Array via Value() +# 21. getNestedArrowColumn (Map) – Map offsets array via ListArray::Flatten() +# 22. readColumnWithJSONData – BinaryArray offsets buffer (same path as 19) +# 23. readColumnWithViewData – view struct length field exceeds variadic data buffer +# 24. readColumnWithJSONData – data buffer over-read (value_offset+length > data size) +# 25. readColumnWithBigNumberFromBinaryData – offsets buffer read before size check +# 26. readColumnWithGeoData – offsets buffer read before per-row data-buffer check +# 27. readIPv6ColumnFromBinaryData – offsets buffer read before size check +# 28. checkViewStruct – negative view size passes is_inline(), wraps in accumulation +# 29. readColumnWithBigNumberFromBinaryData – data buffer over-read in copy loop +# 30. readIPv6ColumnFromBinaryData – data buffer over-read in copy loop +# 31. getNestedArrowColumn – nullable List: valid offsets/child but truncated parent bitmap + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +LARGE_N = 16384 + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def inflate_row_count(data, orig_n, large_n=LARGE_N): + needle = struct.pack('= 8 and 0 <= struct.unpack_from(' 12 bytes force non-inline view structs. +# 7 rows * 16 bytes = 112-byte buffer; shrink declared length to 16 (1 entry). +d = write_arrow(pa.array(['x'*13]*7, type=pa.string_view())) +open(f'{out}/strview.arrow', 'wb').write(shrink_first_buffer(d, 7*16, 16)) + +# 18. BinaryViewArray: same approach. +d = write_arrow(pa.array([b'x'*13]*7, type=pa.binary_view())) +open(f'{out}/binview.arrow', 'wb').write(shrink_first_buffer(d, 7*16, 16)) + +# 19. String (BinaryArray): value_offset(i) reads the offsets buffer (buffers[1]) +# before the per-row data check; checkBinaryOffsetsBuffer catches it first. +# 1 row → tiny offsets buffer, inflated to 16384 rows. +d = write_arrow(pa.array(['hi'], type=pa.string())) +open(f'{out}/string.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 20. List(Int32): readOffsetsFromArrowListColumn calls Value(i) on the offsets +# Int32Array; checkedCast validates the offsets buffer. +d = write_arrow(pa.array([[42]], type=pa.list_(pa.int32()))) +open(f'{out}/list.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 21. Map(Int32, Int32): MapArray subclasses ListArray; getNestedArrowColumn calls +# Flatten() which reads the offsets buffer. +d = write_arrow(pa.array([[(1, 2)]], type=pa.map_(pa.int32(), pa.int32()))) +open(f'{out}/map.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 22. readColumnWithJSONData: same offsets-buffer vulnerability as case 19, but the +# reader is invoked via a JSON type hint rather than plain String. +d = write_arrow(pa.array([b'{"a":1}'], type=pa.binary())) +open(f'{out}/json.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 23. View data-buffer: checkedCastView validates the view-struct buffer but the +# length field inside each view struct is attacker-controlled and used as the +# memcpy size against the variadic data buffer. +# 96-char non-inline string → patch last int32 of its view struct to ~512 MB. +d = write_arrow(pa.array(['X'*96], type=pa.string_view())) +def patch_last_i32(data, pattern, newval): + i = data.rfind(pattern) + assert i >= 0 + data[i:i+4] = struct.pack('size(). +# 1 row of 96 'A' bytes: offsets = [0, 96]. Patch the final offset (offset[1]) to +# ~512 MB so offset[0]=0 stays valid but value_length overruns the 96-byte data buffer. +# This exercises the "safe_length > data_buf_size - safe_offset" half of the per-row +# guard (patching offset[0] instead would only test the offset half). +d = write_arrow(pa.array([b'A'*96], type=pa.binary())) +i = d.rfind(struct.pack('= 0 +d[i+4:i+8] = struct.pack(' [0, ~512 MB] +open(f'{out}/json_dlen.arrow', 'wb').write(d) + +# 25. readColumnWithBigNumberFromBinaryData: value_length(i) reads the offsets buffer +# before any offsets-buffer check; checkBinaryOffsetsBuffer must fire first. +d = write_arrow(pa.array([b'\xcc'*16], type=pa.binary())) +open(f'{out}/bignum.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 26. readColumnWithGeoData: value_offset(i) and value_length(i) read the offsets +# buffer before the per-row data check; checkBinaryOffsetsBuffer must fire first. +d = write_arrow(pa.array([b'\x01\x01\x00\x00\x00' + b'\x00'*16], type=pa.binary())) +open(f'{out}/geo.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 27. readIPv6ColumnFromBinaryData: same offsets-buffer gap as case 25 but for IPv6. +d = write_arrow(pa.array([b'\x00'*16], type=pa.binary())) +open(f'{out}/ipv6_binary.arrow', 'wb').write(inflate_row_count(d, 1)) + +# 28. checkViewStruct: a view-struct with size = -1 satisfies is_inline() (-1 <= 12) +# and was previously returned without error; static_cast(-1) in the +# accumulation loop wraps to SIZE_MAX, corrupting total_bytes_size. +# Build a 2-row StringViewArray with valid inline rows, then patch row-0's size to -1. +d = write_arrow(pa.array(['a', 'b'], type=pa.string_view())) +needle = struct.pack('= 0 +d[idx:idx+4] = struct.pack('= 8 and struct.unpack_from('= 0: + d[idx:idx+8] = struct.pack('= 8 and struct.unpack_from('= 0: + d[idx:idx+8] = struct.pack('= 0, f"bitmap entry (size={bitmap_size}) not found" +d[idx+8:idx+16] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check strview $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/strview.arrow', Arrow)" +check binview $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/binview.arrow', Arrow)" +# String: offsets buffer over-read before per-row data check +check string $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/string.arrow', Arrow)" +# List: offsets Int32Array read via Value() in readOffsetsFromArrowListColumn +check list $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/list.arrow', Arrow)" +# Map: MapArray subclasses ListArray; offsets read via Flatten() in getNestedArrowColumn +check map $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/map.arrow', Arrow)" +# JSON: BinaryArray with JSON type hint routes through readColumnWithJSONData +check json $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/json.arrow', Arrow, 'x JSON') FORMAT Null" +# View data-buffer: view struct length field inflated beyond the variadic data buffer +check view_dlen $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/view_dlen.arrow', Arrow)" +# JSON data-buffer: data offset+length inflated beyond value_data() buffer +check json_dlen $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/json_dlen.arrow', Arrow, 'x JSON') FORMAT Null" +# BigNum: offsets buffer read via value_length() before checkBinaryOffsetsBuffer +check bignum $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/bignum.arrow', Arrow, 'x Int128')" +# Geo: offsets buffer read via value_offset()/value_length() before checkBinaryOffsetsBuffer +check geo $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/geo.arrow', Arrow, 'x Point')" \ + --input_format_parquet_allow_geoparquet_parser=1 +# IPv6: offsets buffer read via value_length() before checkBinaryOffsetsBuffer +check ipv6_binary $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/ipv6_binary.arrow', Arrow, 'x IPv6')" +# View negative size: size=-1 passes is_inline() and wraps SIZE_MAX in accumulation +check view_negsize $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/view_negsize.arrow', Arrow)" +# BigNum data-buffer: data buffer too small for value_offset + sizeof(ValueType) +check bignum_dlen $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/bignum_dlen.arrow', Arrow, 'x Int128')" +# IPv6 data-buffer: data buffer too small for value_offset + sizeof(IPv6) +check ipv6_dlen $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/ipv6_dlen.arrow', Arrow, 'x IPv6')" +# Nullable List bitmap: valid offsets + child but truncated parent validity bitmap +check list_bitmap $CLICKHOUSE_LOCAL --query "SELECT sum(length(x)) FROM file('${TMP_DIR}/list_bitmap.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.reference b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.reference new file mode 100644 index 000000000000..82c9e3f12c06 --- /dev/null +++ b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.reference @@ -0,0 +1,2 @@ +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.sh b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.sh new file mode 100755 index 000000000000..6ad98b8b62b9 --- /dev/null +++ b/tests/queries/0_stateless/04310_arrow_oob_reads_arithmetic.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for two additional Arrow IPC buffer-validation paths. +# +# Issue A — arithmetic overflow in checkArrowBuffer: a crafted row count near +# 2^62 makes elem_size * (offset + length) wrap to 0 mod 2^64, bypassing the +# buffer-size guard. The fixed build validates the data buffer (with +# __builtin_mul_overflow) before reserving the column, so it rejects the file with +# INCORRECT_DATA ("buffer size overflow") rather than reaching reserve(2^62) (which +# on a build that skipped the checked arithmetic throws CANNOT_ALLOCATE_MEMORY). +# +# Issue B — validity bitmap (buffers[0]) not validated: a file with a valid +# data buffer but a 1-byte bitmap for 64 rows lets IsNull() read past the +# bitmap for rows 8-63. The fixed build calls checkValidityBitmap before any +# IsNull / IsValid loop. +# Note: COUNT(*) bypasses column reads; use SUM to force value materialisation. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# Issue A: overflow. elem_size=4 (UInt32). 4 * 2^62 ≡ 0 (mod 2^64), so the +# unguarded multiply "elem_size * count" would wrap to 0 and pass the check. +OVERFLOW_N = 1 << 62 +d = write_arrow(pa.array([42], type=pa.uint32())) +needle = struct.pack('= 8 would read past the 1-byte bitmap without the fix. +# The bitmap buffer entry is {offset=0, length=8}; search for that specific pair +# to avoid patching the FieldNode null_count field which also equals 8. +arr = pa.array([None if i % 8 == 0 else i for i in range(64)], type=pa.int32()) +d = write_arrow(arr) +bitmap_entry = struct.pack('= 0, "could not find bitmap buffer entry" +d[idx+8 : idx+16] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +# Issue A: overflow — checkArrowBuffer validates the data buffer before the column is reserved, +# so __builtin_mul_overflow fires and rejects the file as INCORRECT_DATA ("buffer size overflow") +# rather than reaching reserve(2^62). Asserting INCORRECT_DATA proves the checked-arithmetic path +# (a build that skipped it would instead throw CANNOT_ALLOCATE_MEMORY and fail this assertion). +check_incorrect_data overflow $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/overflow.arrow', Arrow)" + +# Issue B: bitmap — checkValidityBitmap must produce INCORRECT_DATA before IsNull reads. +# Use sum() to force column materialisation; count(*) is optimised away and skips data reads. +check_incorrect_data bitmap $CLICKHOUSE_LOCAL --query "SELECT sum(x) FROM file('${TMP_DIR}/bitmap_shrink.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04326_arrow_oob_neg_length.reference b/tests/queries/0_stateless/04326_arrow_oob_neg_length.reference new file mode 100644 index 000000000000..d08d3c723e2e --- /dev/null +++ b/tests/queries/0_stateless/04326_arrow_oob_neg_length.reference @@ -0,0 +1 @@ +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04326_arrow_oob_neg_length.sh b/tests/queries/0_stateless/04326_arrow_oob_neg_length.sh new file mode 100755 index 000000000000..214c7a5c0daf --- /dev/null +++ b/tests/queries/0_stateless/04326_arrow_oob_neg_length.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test: FieldNode.length = -1 bypasses checkBinaryOffsetsBuffer. +# +# When FieldNode.length is set to -1 in an Arrow IPC file, checkBinaryOffsetsBuffer +# computes count_plus_one = static_cast(-1) + 1 = 0, required = 0, and the +# buffer-size check passes trivially. The subsequent per-row validation loop iterates +# as if chunk_length = SIZE_MAX, reaching beyond the actual 5-row offsets buffer and +# reading garbage as an offset entry. The per-row bounds check must throw INCORRECT_DATA +# before that garbage value is used to derive a read pointer. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='x'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# 5 rows of LargeBinaryArray with string lengths [1,2,3,4,6]. +# Cumulative offsets are [0,1,3,6,10,16] — none equals 5, so the only +# int64=5 occurrences in the file are RecordBatch.length and FieldNode.length. +# Patching both to -1 produces a consistent malformed file that Arrow's IPC +# reader accepts (it cross-checks RecordBatch.length == FieldNode.length but +# does not reject negative values) while our code must detect the anomaly. +arr = pa.array([b"a", b"bb", b"ccc", b"dddd", b"ffffff"], type=pa.large_binary()) +d = write_arrow(arr) + +needle = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT x FROM file('${TMP_DIR}/neg_length.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04327_arrow_oob_list_offsets.reference b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.reference new file mode 100644 index 000000000000..dbce9be2af41 --- /dev/null +++ b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.reference @@ -0,0 +1,5 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04327_arrow_oob_list_offsets.sh b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.sh new file mode 100755 index 000000000000..2d50f2762619 --- /dev/null +++ b/tests/queries/0_stateless/04327_arrow_oob_list_offsets.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads from malformed Arrow List/LargeList offsets: +# - non-monotonic offsets that underflow the uint64 element count and bypass the +# ColumnArray consistency check (offsets [0,64,65,64] over a 64-byte child); +# - a decreasing offset pair that reaches arrow::ListArray::Flatten before the +# monotonicity check (offsets [64,0,6], previously STD_EXCEPTION from ArrayData::Slice); +# - monotonic, non-negative offsets that point past the values array (offsets [1,1] over a +# zero-length child). +# Each must be rejected as INCORRECT_DATA. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# List(UInt8), int32 offsets. Inner size = 64 bytes (Arrow allocates exactly 64, no padding). +# Valid offsets [0,64,65,66]; patch the last entry 66->64 so they become [0,64,65,64]: row 1 +# starts at inner[64] (OOB) and the uint64 underflow at row 2 wraps last_offset back to 64. +arr = pa.array([[0xAA]*64, [0xBB], [0xCC]], type=pa.list_(pa.uint8())) +d = write_arrow(arr) +idx = d.rfind(struct.pack('= 0 and idx % 4 == 0, f"could not find last offset int32=66 (file={len(d)} bytes)" +d[idx:idx+4] = struct.pack('= 0 and idx64 % 8 == 0, "could not find last offset int64=66" +d64[idx64:idx64+8] = struct.pack(' with a decreasing offset pair that reaches Flatten before the offsets reader runs. +# Valid offsets [0,4,6] are patched to [64,0,6]: Flatten slices values[64..6], which fails inside +# Arrow's ArrayData::Slice when monotonicity is validated only later. The pre-Flatten check rejects it. +arr_decr = pa.array([[1,2,3,4],[5,6]], type=pa.list_(pa.int32())) # offsets [0,4,6] +d_decr = bytearray(write_arrow(arr_decr)) +idx_decr = d_decr.find(struct.pack('<3i', 0, 4, 6)) +assert idx_decr >= 0, "could not find List offsets [0,4,6] in decreasing-offset file" +d_decr[idx_decr:idx_decr+12] = struct.pack('<3i', 64, 0, 6) +open(f'{out}/list_decreasing_offset.arrow', 'wb').write(d_decr) + +# Monotonic, non-negative List/LargeList offsets that point past values.length: an empty list's +# offsets [0,0] are patched to [1,1] while values.length stays 0. Verified via pyarrow round-trip. +def patch_offsets_past_values(arr, packed): + base = bytearray(write_arrow(arr, name='x')) + pos = 0 + while True: + idx = base.find(b'\x00' * len(packed), pos) + assert idx >= 0, "offset buffer of zeros not found" + cand = bytearray(base) + cand[idx:idx+len(packed)] = packed + try: + with ipc.open_file(pa.py_buffer(bytes(cand))) as reader: + a = reader.read_all().column('x').chunks[0] + if a.offsets.to_pylist() == [1, 1] and len(a.values) == 0: + return cand + except Exception: + pass + pos = idx + 1 + +open(f'{out}/list_offset_past_values.arrow', 'wb').write( + patch_offsets_past_values(pa.array([[]], type=pa.list_(pa.int32())), struct.pack('<2i', 1, 1))) +open(f'{out}/largelist_offset_past_values.arrow', 'wb').write( + patch_offsets_past_values(pa.array([[]], type=pa.large_list(pa.int32())), struct.pack('<2q', 1, 1))) +PYEOF + +check_incorrect_data() { + local label="$1"; shift + local actual + actual=$("$@" 2>&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data list_nonmonotonic \ + $CLICKHOUSE_LOCAL --query "SELECT arrayElement(arr, 2) FROM file('${TMP_DIR}/list_nonmonotonic.arrow', Arrow)" + +check_incorrect_data largelist_nonmonotonic \ + $CLICKHOUSE_LOCAL --query "SELECT arrayElement(arr, 2) FROM file('${TMP_DIR}/largelist_nonmonotonic.arrow', Arrow)" + +check_incorrect_data list_decreasing_offset \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_decreasing_offset.arrow', Arrow)" + +check_incorrect_data list_offset_past_values \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_offset_past_values.arrow', Arrow)" + +check_incorrect_data largelist_offset_past_values \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_offset_past_values.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.reference b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.reference new file mode 100644 index 000000000000..97564127add2 --- /dev/null +++ b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.reference @@ -0,0 +1,7 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.sh b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.sh new file mode 100755 index 000000000000..a0a55577c3d1 --- /dev/null +++ b/tests/queries/0_stateless/04328_arrow_oob_nested_child_length.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads from a List/LargeList/FixedSizeList child whose declared length +# is inconsistent with the parent: +# - an empty child with non-zero parent offsets (child length patched to 0) that bypassed the +# ColumnArray empty-child consistency check; +# - a non-empty child shorter than length*stride for a FixedSizeList (child 21 -> 10); +# - a negative child FieldNode.length (-1) that reaches arrow's ArrayData::Slice. +# Each must be rejected as INCORRECT_DATA. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def patch_all_int64(data, old_val, new_val): + """Patch all 8-byte-aligned occurrences of old_val (int64) to new_val.""" + needle = struct.pack('[7] and List with 3 parent rows; child FieldNode.length patched +# 21 -> 0. The declared last offset (21) exceeds the empty child allocation; the ColumnArray +# empty-child short-circuit on unpatched code silently produced offsets past the allocation. +arr_fsl = pa.array([[i]*7 for i in range(3)], type=pa.list_(pa.int32(), 7)) +d_fsl = bytearray(write_arrow(arr_fsl)) +assert patch_all_int64(d_fsl, 21, 0) >= 1, f"no int64=21 found in FSL file ({len(d_fsl)} bytes)" +open(f'{out}/fsl_empty_child.arrow', 'wb').write(d_fsl) + +arr_list = pa.array([[i]*7 for i in range(3)], type=pa.list_(pa.int32())) +d_list = bytearray(write_arrow(arr_list)) +assert patch_all_int64(d_list, 21, 0) >= 1, f"no int64=21 found in List file ({len(d_list)} bytes)" +open(f'{out}/list_empty_child.arrow', 'wb').write(d_list) + +# FixedSizeList[7] with a non-empty child shorter than length*stride: child 21 -> 10. +# Flatten would slice values[0,21] out of a 10-element child; the pre-Flatten stride/size check +# rejects it before Arrow's ArrayData::Slice fails. +arr_f = pa.array([[i]*7 for i in range(3)], type=pa.list_(pa.int32(), 7)) +d_f = bytearray(write_arrow(arr_f, name='x')) +assert patch_all_int64(d_f, 21, 10) >= 1, "no int64=21 found in FSL-short-child file" +open(f'{out}/fsl_short_child.arrow', 'wb').write(d_f) + +# Negative child FieldNode.length (-1): Struct / List / LargeList / FixedSizeList would slice a +# negative-length array inside StructArray::field()/Flatten(). +def patch_fieldnode_length(data, pattern_qs, q_index, value): + pat = struct.pack('<' + 'q'*len(pattern_qs), *pattern_qs) + idx = data.find(pat) + assert idx >= 0, f"FieldNode pattern {pattern_qs} not found" + data[idx + 8*q_index : idx + 8*(q_index+1)] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data fsl_empty_child \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fsl_empty_child.arrow', Arrow)" + +check_incorrect_data list_empty_child \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_empty_child.arrow', Arrow)" + +check_incorrect_data fsl_short_child \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fsl_short_child.arrow', Arrow)" + +check_incorrect_data struct_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/struct_child_neg_length.arrow', Arrow)" + +check_incorrect_data list_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_child_neg_length.arrow', Arrow)" + +check_incorrect_data largelist_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_child_neg_length.arrow', Arrow)" + +check_incorrect_data fixedlist_child_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fixedlist_child_neg_length.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04329_arrow_oob_struct_fields.reference b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.reference new file mode 100644 index 000000000000..3b5cc179cd0b --- /dev/null +++ b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.reference @@ -0,0 +1,6 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04329_arrow_oob_struct_fields.sh b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.sh new file mode 100755 index 000000000000..8aa7d33ba4a8 --- /dev/null +++ b/tests/queries/0_stateless/04329_arrow_oob_struct_fields.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads from malformed Arrow Struct/Map columns: +# - a struct field shorter than the parent struct (field length 5 -> 3), which arrow's +# StructArray::field() silently Slice-clamps, leaving ColumnTuple fields of unequal size +# (also covers Map value vs key length mismatch); +# - a sliced struct whose child field is too short for the slice range (parent offsets [1,2] +# over a 0-length field) and would slice child[1:2] inside ArrayData::Slice; +# - a fields-less (zero-field) struct that declares a forged-huge length while carrying a +# validity bitmap too small for it (the bitmap is validated before the null map is built). +# Each must be rejected as INCORRECT_DATA. +# A fields-less struct with no bitmap is a legitimate empty Tuple() and is not rejected here; a +# forged huge length in that case has no backing buffer and is bounded by max_memory_usage. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +HUGE = 1 << 62 + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def write_struct_schema(arr, name, nullable=True): + sch = pa.schema([pa.field(name, arr.type, nullable=nullable)]) + buf = io.BytesIO() + with ipc.new_file(buf, sch) as w: + w.write_table(pa.Table.from_arrays([arr], schema=sch)) + return bytearray(buf.getvalue()) + +# Struct with 5 rows; field b FieldNode.length patched 5 -> 3. The FieldNode +# vector is [struct(5,0), a(5,0), b(5,0)]; b's length is the 5th int64 (+32 from the vector start). +a_col = pa.array([1,2,3,4,5], type=pa.int32()) +b_col = pa.array([10,20,30,40,50], type=pa.int32()) +d_struct = write_arrow(pa.StructArray.from_arrays([a_col, b_col], names=['a','b']), name='s') +idx_struct = d_struct.find(struct.pack('<6q', 5,0, 5,0, 5,0)) +assert idx_struct >= 0, "could not find Struct FieldNode pattern in struct file" +d_struct[idx_struct+32:idx_struct+40] = struct.pack(' with 1 row / 5 entries; value FieldNode.length patched 5 -> 3. The FieldNode +# vector is [map(1,0), entries(5,0), key(5,0), value(5,0)]; value's length is the 7th int64 (+48). +arr_map = pa.array([list(zip([1,2,3,4,5], [10,20,30,40,50]))], type=pa.map_(pa.int32(), pa.int32())) +d_map = write_arrow(arr_map, name='m') +idx_map = d_map.find(struct.pack('<8q', 1,0, 5,0, 5,0, 5,0)) +assert idx_map >= 0, "could not find Map FieldNode pattern in map file" +d_map[idx_map+48:idx_map+56] = struct.pack('= 0, f"FieldNode pattern {pattern_qs} not found" + data[idx + 8*struct_len_idx : idx + 8*(struct_len_idx+1)] = struct.pack(' 2 + data[idx + 8*child_len_idx : idx + 8*(child_len_idx+1)] = struct.pack(' 0 + old = struct.pack(off_fmt, 0, 1) + new = struct.pack(off_fmt, 1, 2) + pos = 0 + while True: + oi = data.find(old, pos) + assert oi >= 0, "list offsets [0,1] not found" + cand = bytearray(data) + cand[oi:oi+len(old)] = new + try: + with ipc.open_file(pa.py_buffer(bytes(cand))) as reader: + a = reader.read_all().column(name).chunks[0] + if a.offsets.to_pylist() == [1, 2]: + return cand + except Exception: + pass + pos = oi + 1 + +open(f'{out}/list_struct_offset_child_zero.arrow', 'wb').write( + patch_struct_slice(pa.array([[{'a': 20}]], type=pa.list_(pa.struct([('a', pa.int32())]))), 'x', [1,0,1,0,1,0], 2, 4, '<2i')) +open(f'{out}/largelist_struct_offset_child_zero.arrow', 'wb').write( + patch_struct_slice(pa.array([[{'a': 20}]], type=pa.large_list(pa.struct([('a', pa.int32())]))), 'x', [1,0,1,0,1,0], 2, 4, '<2q')) +open(f'{out}/map_offset_key_zero.arrow', 'wb').write( + patch_struct_slice(pa.array([[(1, 10)]], type=pa.map_(pa.int32(), pa.int32())), 'm', [1,0,1,0,1,0,1,0], 2, 4, '<2i')) + +# Fields-less Struct WITH a validity bitmap (null_count>0) but a forged-huge length; the null-map +# allocation must be rejected by validating the bitmap (too small) before allocating. +# (A fields-less struct with no bitmap is a legitimate empty Tuple() and is not rejected; a forged +# huge length there has no backing buffer and is bounded by max_memory_usage, like the null type.) +d = write_struct_schema(pa.array([{}, None, {}, None, {}], type=pa.struct([])), 's') +pos = [i for i in range(0, len(d) - 7, 8) if struct.unpack_from('= 2 +for p in pos: + d[p:p+8] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data struct_short_b \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/struct_short_b.arrow', Arrow)" + +check_incorrect_data map_value_short \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/map_value_short.arrow', Arrow)" + +check_incorrect_data list_struct_offset_child_zero \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_struct_offset_child_zero.arrow', Arrow)" + +check_incorrect_data largelist_struct_offset_child_zero \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_struct_offset_child_zero.arrow', Arrow)" + +check_incorrect_data map_offset_key_zero \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/map_offset_key_zero.arrow', Arrow)" + +check_incorrect_data empty_struct_huge_nullcount \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/empty_struct_huge_nullcount.arrow', Arrow)" diff --git a/tests/queries/0_stateless/04330_arrow_oob_declared_length.reference b/tests/queries/0_stateless/04330_arrow_oob_declared_length.reference new file mode 100644 index 000000000000..6e3ef492598f --- /dev/null +++ b/tests/queries/0_stateless/04330_arrow_oob_declared_length.reference @@ -0,0 +1,9 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04330_arrow_oob_declared_length.sh b/tests/queries/0_stateless/04330_arrow_oob_declared_length.sh new file mode 100755 index 000000000000..1e03f09b51e6 --- /dev/null +++ b/tests/queries/0_stateless/04330_arrow_oob_declared_length.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for forged top-level Arrow lengths that made a reader reserve column memory +# before validating buffers (previously CANNOT_ALLOCATE_MEMORY instead of INCORRECT_DATA): +# - fixed-width columns (Int32, Bool, Decimal) and an empty Struct whose RecordBatch/FieldNode +# length is patched negative or to 2^62; +# - a LargeList deriving a 2^62 flattened child length from 64-bit offsets over a one-element child; +# - the JSON reader (Binary/LargeBinary with JSON logical type) reserving from the declared +# length before validating the offsets buffer. +# Each must be rejected as INCORRECT_DATA before the reserve. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] +NEG = -1 +HUGE = 1 << 62 + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +# Fixed-width / empty-struct columns: patch every aligned int64 equal to the 5-row count +# (RecordBatch.length and FieldNode.length; the data values avoid 5) to a negative or huge value. +def patch_row_count(arr, new, name, count=5): + data = bytearray(write_arrow(arr, name=name)) + pos = [i for i in range(0, len(data) - 7, 8) if struct.unpack_from('= 2, f"expected >=2 aligned int64={count}, got {len(pos)}" + for p in pos: + data[p:p+8] = struct.pack(' [0,2^62] and child FieldNode.length -> 2^62. +ll = bytearray(write_arrow(pa.array([[123]], type=pa.large_list(pa.int32())), name='x')) +fn = ll.find(struct.pack('<4q', 1, 0, 1, 0)) +assert fn >= 0, "LargeList FieldNode pattern not found" +ll[fn+16:fn+24] = struct.pack('= 0, "LargeList offset buffer [0,1] not found" +ll[ob:ob+16] = struct.pack('<2q', 0, HUGE) +open(f'{out}/largelist_huge_child_length.arrow', 'wb').write(ll) + +# JSON reader: Binary/LargeBinary with JSON logical type and a 1-row file whose RecordBatch and +# FieldNode length are forged to 2^30. +def write_json_binary(binary_type): + field = pa.field('x', binary_type, metadata={b'PARQUET:logical_type': b'JSON'}) + sch = pa.schema([field]) + buf = io.BytesIO() + with ipc.new_file(buf, sch) as w: + w.write_table(pa.Table.from_arrays([pa.array([b'{"a":1}'], type=binary_type)], schema=sch)) + return bytearray(buf.getvalue()) + +def forge_one_row_to_huge(data, new_length): + positions = [i for i in range(0, len(data) - 7, 8) if struct.unpack_from(' a 16 MB reserve; the width check must reject it +# as INCORRECT_DATA before reserving (the read below uses a memory limit below that reserve). +open(f'{out}/fixedbinary1_as_uuid.arrow', 'wb').write( + write_arrow(pa.array([b'\x01'] * 1_000_000, type=pa.binary(1)), name='x')) +PYEOF + +check_incorrect_data() { + local label="$1"; shift + local actual + actual=$("$@" 2>&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data int32_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/int32_neg_length.arrow', Arrow)" + +check_incorrect_data int32_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/int32_huge_length.arrow', Arrow)" + +check_incorrect_data bool_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/bool_neg_length.arrow', Arrow)" + +check_incorrect_data decimal_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/decimal_huge_length.arrow', Arrow)" + +check_incorrect_data empty_struct_neg_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/empty_struct_neg_length.arrow', Arrow)" + +check_incorrect_data largelist_huge_child_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largelist_huge_child_length.arrow', Arrow)" + +check_incorrect_data binary_json_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/binary_json_huge_length.arrow', Arrow) FORMAT Null SETTINGS allow_experimental_json_type=1" + +check_incorrect_data largebinary_json_huge_length \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largebinary_json_huge_length.arrow', Arrow) FORMAT Null SETTINGS allow_experimental_json_type=1" + +# The 8 MB memory limit is below the 16 MB UUID-column reserve but above the 1 MB input, so an +# implementation that reserves before checking byte_width fails with MEMORY_LIMIT_EXCEEDED; the +# fixed reader rejects the type with INCORRECT_DATA before reserving. +check_incorrect_data fixedbinary1_as_uuid \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fixedbinary1_as_uuid.arrow', Arrow, 'x UUID') FORMAT Null SETTINGS max_memory_usage=8000000" diff --git a/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.reference b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.reference new file mode 100644 index 000000000000..35233a580cac --- /dev/null +++ b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.reference @@ -0,0 +1,4 @@ +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA +INCORRECT_DATA diff --git a/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.sh b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.sh new file mode 100755 index 000000000000..dfe9108c8a7c --- /dev/null +++ b/tests/queries/0_stateless/04331_arrow_oob_validity_bitmap.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression tests for OOB reads of an Arrow validity bitmap: +# - a truncated child bitmap after Flatten/Slice: a sliced child has an unknown null_count, and +# arrow::ChunkedArray's constructor scans the (shrunk) bitmap (List(Nullable(int32)) child +# bitmap 16 -> 1 byte; Struct field b sliced with bitmap 9 -> 1 byte); +# - an unknown FieldNode.null_count (-1) over a forged-huge length with a 1-byte bitmap, where +# building the arrow Table scans the bitmap over the declared length (heap OOB in CountSetBits). +# Each must be rejected as INCORRECT_DATA before any null_count scan. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import struct, io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(arr, name='arr'): + tbl = pa.table({name: arr}) + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return bytearray(buf.getvalue()) + +def shrink_buffer_len(data, old_len, new_len): + """Shrink the first buffer-length field equal to old_len (a Buffer in the IPC metadata is + {offset:int64, length:int64}, so the length is preceded by a valid offset).""" + needle = struct.pack('= 8: + prev = struct.unpack_from('= 8 and 0 <= struct.unpack_from(' with 65 rows: field b's FieldNode.length is patched 65 -> 70 +# so StructArray::field() Slice-clamps it (unknown null_count), and b's 9-byte bitmap is shrunk to 1. +a_e = pa.array(list(range(65)), type=pa.int32()) +b_e = pa.array([None if i % 7 == 0 else i for i in range(65)], type=pa.int32()) +d_e2 = bytearray(write_arrow(pa.StructArray.from_arrays([a_e, b_e], names=['a', 'b']), name='s')) +bnc = sum(1 for i in range(65) if i % 7 == 0) +idx_e2 = d_e2.find(struct.pack('<6q', 65,0, 65,0, 65,bnc)) +assert idx_e2 >= 0, "could not find Struct FieldNode pattern in struct-bitmap file" +d_e2[idx_e2+32:idx_e2+40] = struct.pack('&1) + local exit_code=$? + if echo "$actual" | grep -qF 'INCORRECT_DATA'; then + echo 'INCORRECT_DATA' + else + local first_line + first_line=$(echo "$actual" | head -1 | cut -c1-200) + echo "FAIL [$label] expected INCORRECT_DATA (exit=${exit_code}); got: ${first_line:-}" + fi +} + +check_incorrect_data list_child_bitmap \ + $CLICKHOUSE_LOCAL --query "SELECT sum(length(x)) FROM file('${TMP_DIR}/list_child_bitmap.arrow', Arrow)" + +check_incorrect_data struct_child_bitmap \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/struct_child_bitmap.arrow', Arrow)" + +check_incorrect_data int32_unknown_nullcount \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/int32_unknown_nullcount.arrow', Arrow)" + +check_incorrect_data list_unknown_nullcount \ + $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/list_unknown_nullcount.arrow', Arrow)" From 1e3dff0f95455460b880cc5206cb7f9156b20552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Fri, 12 Jun 2026 15:55:41 +0000 Subject: [PATCH 53/91] Adapt Arrow OOB regression tests to 25.8 25.8 has no BinaryView/StringView reader and no UUID FixedSizeBinary reader, so the cases targeting them are removed: view types are rejected at schema extraction and the FixedString(1)-to-UUID conversion is caught by the memory limit instead of the width check. (cherry picked from commit 77be75d4c65fe875096f3b0c257e23971a0404f1) --- .../04309_arrow_oob_reads_offsets.reference | 4 -- .../04309_arrow_oob_reads_offsets.sh | 48 +------------------ .../04330_arrow_oob_declared_length.reference | 1 - .../04330_arrow_oob_declared_length.sh | 12 ----- 4 files changed, 1 insertion(+), 64 deletions(-) diff --git a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference index e99e3dad7246..f9f273e5a142 100644 --- a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference +++ b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.reference @@ -9,7 +9,3 @@ INCORRECT_DATA INCORRECT_DATA INCORRECT_DATA INCORRECT_DATA -INCORRECT_DATA -INCORRECT_DATA -INCORRECT_DATA -INCORRECT_DATA diff --git a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh index 1c4a38394dd4..37f81177071a 100755 --- a/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh +++ b/tests/queries/0_stateless/04309_arrow_oob_reads_offsets.sh @@ -1,20 +1,16 @@ #!/usr/bin/env bash # Tags: no-fasttest # Regression tests for heap out-of-bounds reads in Arrow IPC format readers -# (view-struct buffer and offsets-buffer readers). +# (offsets-buffer readers). # -# 17. readColumnWithViewData (StringViewArray) – view-struct buffer (16 bytes/row) -# 18. readColumnWithViewData (BinaryViewArray) – view-struct buffer # 19. readColumnWithStringData – offsets buffer over-read before per-row data check # 20. readOffsetsFromArrowListColumn – List offsets Int32Array via Value() # 21. getNestedArrowColumn (Map) – Map offsets array via ListArray::Flatten() # 22. readColumnWithJSONData – BinaryArray offsets buffer (same path as 19) -# 23. readColumnWithViewData – view struct length field exceeds variadic data buffer # 24. readColumnWithJSONData – data buffer over-read (value_offset+length > data size) # 25. readColumnWithBigNumberFromBinaryData – offsets buffer read before size check # 26. readColumnWithGeoData – offsets buffer read before per-row data-buffer check # 27. readIPv6ColumnFromBinaryData – offsets buffer read before size check -# 28. checkViewStruct – negative view size passes is_inline(), wraps in accumulation # 29. readColumnWithBigNumberFromBinaryData – data buffer over-read in copy loop # 30. readIPv6ColumnFromBinaryData – data buffer over-read in copy loop # 31. getNestedArrowColumn – nullable List: valid offsets/child but truncated parent bitmap @@ -67,16 +63,6 @@ def shrink_first_buffer(data, full_len, new_len): return data pos = idx + 1 -# 17. StringViewArray: the view-struct buffer (buffers[1], 16 bytes/element) must fit -# all declared rows. Strings > 12 bytes force non-inline view structs. -# 7 rows * 16 bytes = 112-byte buffer; shrink declared length to 16 (1 entry). -d = write_arrow(pa.array(['x'*13]*7, type=pa.string_view())) -open(f'{out}/strview.arrow', 'wb').write(shrink_first_buffer(d, 7*16, 16)) - -# 18. BinaryViewArray: same approach. -d = write_arrow(pa.array([b'x'*13]*7, type=pa.binary_view())) -open(f'{out}/binview.arrow', 'wb').write(shrink_first_buffer(d, 7*16, 16)) - # 19. String (BinaryArray): value_offset(i) reads the offsets buffer (buffers[1]) # before the per-row data check; checkBinaryOffsetsBuffer catches it first. # 1 row → tiny offsets buffer, inflated to 16384 rows. @@ -98,21 +84,6 @@ open(f'{out}/map.arrow', 'wb').write(inflate_row_count(d, 1)) d = write_arrow(pa.array([b'{"a":1}'], type=pa.binary())) open(f'{out}/json.arrow', 'wb').write(inflate_row_count(d, 1)) -# 23. View data-buffer: checkedCastView validates the view-struct buffer but the -# length field inside each view struct is attacker-controlled and used as the -# memcpy size against the variadic data buffer. -# 96-char non-inline string → patch last int32 of its view struct to ~512 MB. -d = write_arrow(pa.array(['X'*96], type=pa.string_view())) -def patch_last_i32(data, pattern, newval): - i = data.rfind(pattern) - assert i >= 0 - data[i:i+4] = struct.pack('size(). # 1 row of 96 'A' bytes: offsets = [0, 96]. Patch the final offset (offset[1]) to @@ -139,17 +110,6 @@ open(f'{out}/geo.arrow', 'wb').write(inflate_row_count(d, 1)) d = write_arrow(pa.array([b'\x00'*16], type=pa.binary())) open(f'{out}/ipv6_binary.arrow', 'wb').write(inflate_row_count(d, 1)) -# 28. checkViewStruct: a view-struct with size = -1 satisfies is_inline() (-1 <= 12) -# and was previously returned without error; static_cast(-1) in the -# accumulation loop wraps to SIZE_MAX, corrupting total_bytes_size. -# Build a 2-row StringViewArray with valid inline rows, then patch row-0's size to -1. -d = write_arrow(pa.array(['a', 'b'], type=pa.string_view())) -needle = struct.pack('= 0 -d[idx:idx+4] = struct.pack(' a 16 MB reserve; the width check must reject it -# as INCORRECT_DATA before reserving (the read below uses a memory limit below that reserve). -open(f'{out}/fixedbinary1_as_uuid.arrow', 'wb').write( - write_arrow(pa.array([b'\x01'] * 1_000_000, type=pa.binary(1)), name='x')) PYEOF check_incorrect_data() { @@ -136,9 +130,3 @@ check_incorrect_data binary_json_huge_length \ check_incorrect_data largebinary_json_huge_length \ $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/largebinary_json_huge_length.arrow', Arrow) FORMAT Null SETTINGS allow_experimental_json_type=1" - -# The 8 MB memory limit is below the 16 MB UUID-column reserve but above the 1 MB input, so an -# implementation that reserves before checking byte_width fails with MEMORY_LIMIT_EXCEEDED; the -# fixed reader rejects the type with INCORRECT_DATA before reserving. -check_incorrect_data fixedbinary1_as_uuid \ - $CLICKHOUSE_LOCAL --query "SELECT * FROM file('${TMP_DIR}/fixedbinary1_as_uuid.arrow', Arrow, 'x UUID') FORMAT Null SETTINGS max_memory_usage=8000000" From e87546e12836217cf07cdc565ceb05073fc31e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Fri, 12 Jun 2026 16:09:42 +0000 Subject: [PATCH 54/91] Use np.float16 input in Arrow OOB test generator The pyarrow version in the 25.8 stateless test image cannot convert Python floats to halffloat directly, so the generator aborted and left float16.arrow and the following files missing. --- tests/queries/0_stateless/04308_arrow_oob_reads_value.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh b/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh index a633412acff6..28088c65c708 100755 --- a/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh +++ b/tests/queries/0_stateless/04308_arrow_oob_reads_value.sh @@ -23,6 +23,7 @@ trap 'rm -rf "$TMP_DIR"' EXIT python3 - "$TMP_DIR" <<'PYEOF' import struct, io, sys +import numpy as np import pyarrow as pa import pyarrow.ipc as ipc @@ -74,7 +75,8 @@ d = write_arrow(pa.array([3600000000], type=pa.time64('us'))) open(f'{out}/time64.arrow', 'wb').write(inflate_row_count(d, 1)) # 14. Float16: 1 row → 2-byte body, inflated to 16384 rows -d = write_arrow(pa.array([1.0], type=pa.float16())) +# np.float16 input: older pyarrow cannot convert Python floats to halffloat directly +d = write_arrow(pa.array(np.array([1.0], dtype=np.float16))) open(f'{out}/float16.arrow', 'wb').write(inflate_row_count(d, 1)) # 15. Decimal128: 1 row → 16-byte body, inflated to 16384 rows From 4f821bb5aceb076c04083c91308f8eeb77deb8e1 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 17 Jun 2026 10:02:15 +0000 Subject: [PATCH 55/91] Backport #107485 to 25.8: validate message length before size - 4 in postgres protocol --- src/Core/PostgreSQLProtocol.h | 30 ++- src/Core/tests/gtest_postgresql_protocol.cpp | 211 +++++++++++++++++++ 2 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 src/Core/tests/gtest_postgresql_protocol.cpp diff --git a/src/Core/PostgreSQLProtocol.h b/src/Core/PostgreSQLProtocol.h index 9c03e43c9db2..c7d0e1f16139 100644 --- a/src/Core/PostgreSQLProtocol.h +++ b/src/Core/PostgreSQLProtocol.h @@ -218,6 +218,9 @@ class MessageTransport { Int32 size; readBinaryBigEndian(size, *in); + if (size < 4) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong message length {} received from client, it must be at least 4", size); in->ignore(size - 4); } @@ -513,8 +516,15 @@ class SASLInitialResponse : public Messaging::FrontMessage readNullTerminated(auth_method, in); Int32 size_sasl_mechanism; readBinaryBigEndian(size_sasl_mechanism, in); - sasl_mechanism.resize(size_sasl_mechanism); - in.readStrict(sasl_mechanism.data(), size_sasl_mechanism); + /// -1 is the protocol sentinel for "no initial response"; any other negative value is malformed. + if (size_sasl_mechanism < -1) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong SASL mechanism length {} in SASLInitialResponse, it must not be less than -1", size_sasl_mechanism); + if (size_sasl_mechanism > 0) + { + sasl_mechanism.resize(size_sasl_mechanism); + in.readStrict(sasl_mechanism.data(), size_sasl_mechanism); + } } MessageType getMessageType() const override @@ -563,6 +573,9 @@ class SASLResponse : public Messaging::FrontMessage readBinaryBigEndian(message_type, in); Int32 size; readBinaryBigEndian(size, in); + if (size < 4) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong message length {} in SASLResponse, it must be at least 4", size); sasl_mechanism.resize(size - 4); in.readStrict(sasl_mechanism.data(), size - 4); } @@ -767,6 +780,16 @@ class BindQuery : FrontMessage { Int32 sz_param; readBinaryBigEndian(sz_param, in); + /// -1 is the protocol sentinel for a NULL parameter and no value bytes follow; + /// any other negative value is malformed. + if (sz_param < -1) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong parameter length {} in Bind message, it must not be less than -1", sz_param); + if (sz_param == -1) + { + parameters.emplace_back("NULL"); + continue; + } String current_param(sz_param, 0); in.readStrict(current_param.data(), sz_param); parameters.push_back(current_param); @@ -1141,6 +1164,9 @@ class CopyInData : FrontMessage { Int32 sz; readBinaryBigEndian(sz, in); + if (sz < static_cast(sizeof(Int32))) + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Wrong message length {} in CopyData, it must be at least 4", sz); query.reserve(sz - sizeof(Int32)); for (size_t i = 0; i < sz - sizeof(Int32); ++i) { diff --git a/src/Core/tests/gtest_postgresql_protocol.cpp b/src/Core/tests/gtest_postgresql_protocol.cpp new file mode 100644 index 000000000000..5c0d4c3c8e18 --- /dev/null +++ b/src/Core/tests/gtest_postgresql_protocol.cpp @@ -0,0 +1,211 @@ +#include + +#include +#include +#include +#include + +#include + +namespace DB::ErrorCodes +{ + extern const int UNKNOWN_PACKET_FROM_CLIENT; +} + +using namespace DB; +namespace Messaging = DB::PostgreSQLProtocol::Messaging; + +namespace +{ + +void putUInt8(std::string & s, UInt8 v) +{ + s.push_back(static_cast(v)); +} + +void putInt16(std::string & s, Int16 v) +{ + s.push_back(static_cast((v >> 8) & 0xFF)); + s.push_back(static_cast(v & 0xFF)); +} + +void putInt32(std::string & s, Int32 v) +{ + for (int i = 3; i >= 0; --i) + s.push_back(static_cast((v >> (8 * i)) & 0xFF)); +} + +/// Run `body` over the bytes and report whether it threw UNKNOWN_PACKET_FROM_CLIENT. +template +bool throwsUnknownPacket(const std::string & bytes, F && body) +{ + ReadBufferFromMemory in(bytes.data(), bytes.size()); + try + { + body(in); + return false; + } + catch (const Exception & e) + { + EXPECT_EQ(e.code(), ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT); + return e.code() == ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT; + } +} + +} + +TEST(PostgreSQLProtocol, DropMessageRejectsLengthBelowFour) +{ + /// The message-length field includes its own four bytes, so anything below 4 underflows `size - 4`. + for (Int32 size = 0; size < 4; ++size) + { + std::string bytes; + putInt32(bytes, size); + WriteBufferFromOwnString out; + EXPECT_TRUE(throwsUnknownPacket(bytes, [&](ReadBuffer & in) + { + Messaging::MessageTransport mt(&in, &out); + mt.dropMessage(); + })) << "size = " << size; + } + + /// A well-formed length skips the declared number of trailing bytes. + std::string bytes; + putInt32(bytes, 8); + bytes += "abcd"; + ReadBufferFromMemory in(bytes.data(), bytes.size()); + WriteBufferFromOwnString out; + Messaging::MessageTransport mt(&in, &out); + EXPECT_NO_THROW(mt.dropMessage()); +} + +TEST(PostgreSQLProtocol, SASLResponseRejectsLengthBelowFour) +{ + for (Int32 size = 0; size < 4; ++size) + { + std::string bytes; + putUInt8(bytes, 'p'); + putInt32(bytes, size); + EXPECT_TRUE(throwsUnknownPacket(bytes, [](ReadBuffer & in) + { + Messaging::SASLResponse msg; + msg.deserialize(in); + })) << "size = " << size; + } + + /// size == 4 means an empty SASL payload. + std::string bytes; + putUInt8(bytes, 'p'); + putInt32(bytes, 4); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::SASLResponse msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_TRUE(msg.sasl_mechanism.empty()); +} + +TEST(PostgreSQLProtocol, SASLInitialResponseHandlesMechanismLength) +{ + auto build = [](Int32 size_sasl_mechanism, const std::string & data) + { + std::string bytes; + putUInt8(bytes, 'p'); + putInt32(bytes, 0); /// the outer size field is not used for bounds here + bytes += "SCRAM-SHA-256"; + bytes.push_back('\0'); + putInt32(bytes, size_sasl_mechanism); + bytes += data; + return bytes; + }; + + /// Below -1 is malformed. + EXPECT_TRUE(throwsUnknownPacket(build(-2, ""), [](ReadBuffer & in) + { + Messaging::SASLInitialResponse msg; + msg.deserialize(in); + })); + + /// -1 is the protocol sentinel for "no initial response". + { + std::string bytes = build(-1, ""); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::SASLInitialResponse msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_TRUE(msg.sasl_mechanism.empty()); + } + + /// A non-negative length reads exactly that many bytes. + { + std::string bytes = build(3, "abc"); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::SASLInitialResponse msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_EQ(msg.sasl_mechanism, "abc"); + } +} + +TEST(PostgreSQLProtocol, BindHandlesParameterLength) +{ + auto build = [](Int32 sz_param, const std::string & data) + { + std::string bytes; + putInt32(bytes, 0); /// the outer size field is not used for bounds here + bytes.push_back('\0'); /// empty portal name + bytes.push_back('\0'); /// empty statement name + putInt16(bytes, 0); /// no parameter format codes + putInt16(bytes, 1); /// one parameter + putInt32(bytes, sz_param); + bytes += data; + putInt16(bytes, 0); /// no result format codes + return bytes; + }; + + /// Below -1 is malformed. + EXPECT_TRUE(throwsUnknownPacket(build(-2, ""), [](ReadBuffer & in) + { + Messaging::BindQuery msg; + msg.deserialize(in); + })); + + /// -1 is the protocol sentinel for a NULL parameter; no value bytes follow. + { + std::string bytes = build(-1, ""); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::BindQuery msg; + EXPECT_NO_THROW(msg.deserialize(in)); + ASSERT_EQ(msg.parameters.size(), 1u); + EXPECT_EQ(msg.parameters[0], "NULL"); + } + + /// A non-negative length reads exactly that many bytes. + { + std::string bytes = build(2, "hi"); + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::BindQuery msg; + EXPECT_NO_THROW(msg.deserialize(in)); + ASSERT_EQ(msg.parameters.size(), 1u); + EXPECT_EQ(msg.parameters[0], "hi"); + } +} + +TEST(PostgreSQLProtocol, CopyDataRejectsLengthBelowFour) +{ + for (Int32 size = 0; size < 4; ++size) + { + std::string bytes; + putInt32(bytes, size); + EXPECT_TRUE(throwsUnknownPacket(bytes, [](ReadBuffer & in) + { + Messaging::CopyInData msg; + msg.deserialize(in); + })) << "size = " << size; + } + + /// A well-formed length carries `size - 4` payload bytes. + std::string bytes; + putInt32(bytes, 6); + bytes += "ab"; + ReadBufferFromMemory in(bytes.data(), bytes.size()); + Messaging::CopyInData msg; + EXPECT_NO_THROW(msg.deserialize(in)); + EXPECT_EQ(msg.query, "ab"); +} From 526ac95a2b661ec32e90c03ac5159ee664721ab5 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Wed, 17 Jun 2026 17:20:32 +0000 Subject: [PATCH 56/91] Backport #100500 to 25.8: Sanitize query_id to prevent CRLF injection in HTTP response headers --- src/Server/HTTPHandler.cpp | 8 +++++- src/Server/PrometheusRequestHandler.cpp | 10 +++++++- ...04055_http_header_crlf_injection.reference | 5 ++++ .../04055_http_header_crlf_injection.sh | 25 +++++++++++++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 tests/queries/0_stateless/04055_http_header_crlf_injection.reference create mode 100755 tests/queries/0_stateless/04055_http_header_crlf_injection.sh diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index acb46c38a2d5..6c2daa1dc692 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -249,7 +249,13 @@ void HTTPHandler::processQuery( setReadOnlyIfHTTPMethodIdempotent(context, request.getMethod()); /// Set the query id supplied by the user, if any, and also update the OpenTelemetry fields. - context->setCurrentQueryId(params.get("query_id", request.get("X-ClickHouse-Query-Id", ""))); + String query_id = params.get("query_id", request.get("X-ClickHouse-Query-Id", "")); + + /// Sanitize query_id: remove ASCII control characters to prevent CRLF injection + /// into HTTP response headers (the query_id is reflected in X-ClickHouse-Query-Id). + std::erase_if(query_id, [](unsigned char c) { return isControlASCII(c) || c == 0x7F; }); + + context->setCurrentQueryId(query_id); bool has_external_data = startsWith(request.getContentType(), "multipart/form-data"); diff --git a/src/Server/PrometheusRequestHandler.cpp b/src/Server/PrometheusRequestHandler.cpp index fc7ccc4430ba..8ecb9889ad7f 100644 --- a/src/Server/PrometheusRequestHandler.cpp +++ b/src/Server/PrometheusRequestHandler.cpp @@ -15,6 +15,8 @@ #include #include +#include +#include #include #include #include @@ -181,7 +183,13 @@ class PrometheusRequestHandler::ImplWithContext : public Impl context->applySettingsChanges(settings_changes); /// Set the query id supplied by the user, if any, and also update the OpenTelemetry fields. - context->setCurrentQueryId(params->get("query_id", request.get("X-ClickHouse-Query-Id", ""))); + String query_id = params->get("query_id", request.get("X-ClickHouse-Query-Id", "")); + + /// Sanitize query_id: remove ASCII control characters to prevent CRLF injection + /// into HTTP response headers (the query_id is reflected in X-ClickHouse-Query-Id). + std::erase_if(query_id, [](unsigned char c) { return isControlASCII(c) || c == 0x7F; }); + + context->setCurrentQueryId(query_id); } void onException() override diff --git a/tests/queries/0_stateless/04055_http_header_crlf_injection.reference b/tests/queries/0_stateless/04055_http_header_crlf_injection.reference new file mode 100644 index 000000000000..3798e8f2fbea --- /dev/null +++ b/tests/queries/0_stateless/04055_http_header_crlf_injection.reference @@ -0,0 +1,5 @@ +--- CRLF in query_id via URL parameter --- +injectLocation: evil.com +no injected headers +--- Normal query_id --- +normal_test_id_04055 diff --git a/tests/queries/0_stateless/04055_http_header_crlf_injection.sh b/tests/queries/0_stateless/04055_http_header_crlf_injection.sh new file mode 100755 index 000000000000..5bc2cdcd1caa --- /dev/null +++ b/tests/queries/0_stateless/04055_http_header_crlf_injection.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Verify that CRLF characters in user-supplied HTTP parameters (like query_id) +# cannot be used to inject additional HTTP response headers. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +extract_query_id() { + grep '< X-ClickHouse-Query-Id:' | sed 's/\r$//' | sed 's/^< X-ClickHouse-Query-Id: //' +} + +count_injected_headers() { + grep -F -ci "< $1:" | sed 's/^0$/no injected headers/' | sed '/^[1-9]/s/.*/FAIL: injected header detected/' +} + +echo "--- CRLF in query_id via URL parameter ---" +RESPONSE=$(${CLICKHOUSE_CURL} -sS --globoff -v "${CLICKHOUSE_URL}&query=SELECT+1&query_id=inject%0d%0aLocation:%20evil.com" 2>&1) +echo "$RESPONSE" | extract_query_id +echo "$RESPONSE" | count_injected_headers Location + +echo "--- Normal query_id ---" +${CLICKHOUSE_CURL} -sS --globoff -v "${CLICKHOUSE_URL}&query=SELECT+1&query_id=normal_test_id_04055" 2>&1 \ + | extract_query_id From d251866bd89b130afcbe5fffc8d4c3830d6620a2 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 18 Jun 2026 09:48:02 +0000 Subject: [PATCH 57/91] Backport #106739 to 25.8: Fix memory-safety and resource-exhaustion issues in Parquet/Geo/Avro readers with untrusted input --- contrib/avro | 2 +- src/Functions/geometryConverters.h | 14 +- .../Formats/Impl/Parquet/Reader.cpp | 96 +++++++++- .../Formats/Impl/Parquet/SchemaConverter.cpp | 6 + ...04324_parquet_v3_datapage_v2_oob.reference | 10 + .../04324_parquet_v3_datapage_v2_oob.sh | 174 ++++++++++++++++++ ...parquet_v3_deep_schema_recursion.reference | 2 + .../04325_parquet_v3_deep_schema_recursion.sh | 96 ++++++++++ ..._parquet_v3_geoparquet_wkb_alloc.reference | 1 + .../04326_parquet_v3_geoparquet_wkb_alloc.sh | 47 +++++ .../04327_avro_string_length_alloc.reference | 1 + .../04327_avro_string_length_alloc.sh | 58 ++++++ 12 files changed, 495 insertions(+), 12 deletions(-) create mode 100644 tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.reference create mode 100755 tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.sh create mode 100644 tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.reference create mode 100755 tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.sh create mode 100644 tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.reference create mode 100755 tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.sh create mode 100644 tests/queries/0_stateless/04327_avro_string_length_alloc.reference create mode 100755 tests/queries/0_stateless/04327_avro_string_length_alloc.sh diff --git a/contrib/avro b/contrib/avro index 3b5d52bdf9f9..7b7f6a5bc42e 160000 --- a/contrib/avro +++ b/contrib/avro @@ -1 +1 @@ -Subproject commit 3b5d52bdf9f9f66121b663741f4270b33c91c1a6 +Subproject commit 7b7f6a5bc42e56b6f74de9fc8f52a2a629c53145 diff --git a/src/Functions/geometryConverters.h b/src/Functions/geometryConverters.h index c812c58db4e3..5565ef689972 100644 --- a/src/Functions/geometryConverters.h +++ b/src/Functions/geometryConverters.h @@ -28,20 +28,24 @@ namespace ErrorCodes extern const int ILLEGAL_TYPE_OF_ARGUMENT; } +/// Use AllocatorWithMemoryTracking so that building geometries (in particular parsing untrusted +/// WKB/WKT, where element counts come straight off the wire) charges the MemoryTracker through its +/// throwing path. Otherwise a declared-but-absent element count drives a large `reserve` that +/// `max_memory_usage` does not bound (the default container tracking is non-throwing). template -using LineString = boost::geometry::model::linestring; +using LineString = boost::geometry::model::linestring; template -using MultiLineString = boost::geometry::model::multi_linestring>; +using MultiLineString = boost::geometry::model::multi_linestring, std::vector, AllocatorWithMemoryTracking>; template -using Ring = boost::geometry::model::ring; +using Ring = boost::geometry::model::ring; template -using Polygon = boost::geometry::model::polygon; +using Polygon = boost::geometry::model::polygon; template -using MultiPolygon = boost::geometry::model::multi_polygon>; +using MultiPolygon = boost::geometry::model::multi_polygon, std::vector, AllocatorWithMemoryTracking>; using CartesianPoint = boost::geometry::model::d2::point_xy; using CartesianLineString = LineString; diff --git a/src/Processors/Formats/Impl/Parquet/Reader.cpp b/src/Processors/Formats/Impl/Parquet/Reader.cpp index 924c337f0aa5..764eb2ca4406 100644 --- a/src/Processors/Formats/Impl/Parquet/Reader.cpp +++ b/src/Processors/Formats/Impl/Parquet/Reader.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,25 @@ namespace DB::ErrorCodes namespace DB::Parquet { +/// Thrift deserialization can store an out-of-range value into an unscoped enum field when the +/// input file is malformed. Loading such an enum directly is undefined behavior (caught by +/// -fsanitize=enum); reading the raw underlying integer via memcpy is well-defined. We use it to +/// validate page-header enums up front, so the rest of the reader only ever loads valid values. +template +static int thriftEnumToInt(const E & e) +{ + std::underlying_type_t v; + memcpy(&v, &e, sizeof(v)); + return static_cast(v); +} + +template +static void checkThriftEnum(const E & e, const std::map & valid_values, const char * what) +{ + if (!valid_values.contains(thriftEnumToInt(e))) + throw Exception(ErrorCodes::INCORRECT_DATA, "Invalid {} in Parquet metadata", what); +} + static void decompressLZ4Raw(const char * data, size_t compressed_size, size_t uncompressed_size, char * out) { if (compressed_size > INT32_MAX || uncompressed_size > INT32_MAX) @@ -727,9 +747,12 @@ void Reader::decodeDictionaryPageImpl(const parq::PageHeader & header, std::span throw Exception(ErrorCodes::INCORRECT_DATA, "Dictionary page size out of bounds: {} > {}", header.compressed_page_size, data.size()); data = data.subspan(0, size_t(header.compressed_page_size)); + checkThriftEnum(column.meta->meta_data.codec, parq::_CompressionCodec_VALUES_TO_NAMES, "compression codec"); auto codec = column.meta->meta_data.codec; if (codec != parq::CompressionCodec::UNCOMPRESSED) { + if (header.uncompressed_page_size < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative uncompressed dictionary page size"); size_t uncompressed_size = size_t(header.uncompressed_page_size); auto & buf = column.dictionary.decompressed_buf; buf.resize(uncompressed_size); @@ -737,6 +760,10 @@ void Reader::decodeDictionaryPageImpl(const parq::PageHeader & header, std::span data = std::span(buf.data(), buf.size()); } + /// Signed i32 from the thrift header; a negative count would sign-extend to a huge size_t and + /// drive a huge `reserve`/`resize` inside Dictionary::decode. + if (header.dictionary_page_header.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in dictionary page"); column.dictionary.decode(header.dictionary_page_header.encoding, column_info.decoder, size_t(header.dictionary_page_header.num_values), data, *column_info.raw_decoded_type); } @@ -1371,6 +1398,27 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size parq::PageHeader header; data_ptr += deserializeThriftStruct(header, data_ptr, data_end - data_ptr); /// TODO [parquet]: Check checksum. + + /// Validate enum fields before anything loads them (a malformed file can carry out-of-range + /// values, and loading an unscoped enum out of range is undefined behavior). + checkThriftEnum(header.type, parq::_PageType_VALUES_TO_NAMES, "page type"); + switch (header.type) + { + case parq::PageType::DATA_PAGE: + checkThriftEnum(header.data_page_header.encoding, parq::_Encoding_VALUES_TO_NAMES, "encoding"); + checkThriftEnum(header.data_page_header.definition_level_encoding, parq::_Encoding_VALUES_TO_NAMES, "definition level encoding"); + checkThriftEnum(header.data_page_header.repetition_level_encoding, parq::_Encoding_VALUES_TO_NAMES, "repetition level encoding"); + break; + case parq::PageType::DATA_PAGE_V2: + checkThriftEnum(header.data_page_header_v2.encoding, parq::_Encoding_VALUES_TO_NAMES, "encoding"); + break; + case parq::PageType::DICTIONARY_PAGE: + checkThriftEnum(header.dictionary_page_header.encoding, parq::_Encoding_VALUES_TO_NAMES, "encoding"); + break; + default: + break; + } + size_t compressed_page_size = size_t(header.compressed_page_size); if (header.compressed_page_size < 0 || compressed_page_size > size_t(data_end - data_ptr)) throw Exception(ErrorCodes::INCORRECT_DATA, "Page size out of bounds: {} > {}", header.compressed_page_size, data_end - data_ptr); @@ -1379,12 +1427,24 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size /// Check if all rows of the page are filtered out, if we have enough information. + /// These signed i32 row counts are consumed below to compute `page.end_row_idx` (and the + /// row-skip shortcut returns before the later num_values check). A negative value would + /// sign-extend to a huge size_t and wrap `next_row_idx + num_rows`, moving the row cursor + /// backwards or skipping the page instead of failing, so reject it here. std::optional num_rows_in_page; if (header.type == parq::PageType::DATA_PAGE_V2) + { + if (header.data_page_header_v2.num_rows < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of rows in DataPageV2"); num_rows_in_page = header.data_page_header_v2.num_rows; + } else if (header.type == parq::PageType::DATA_PAGE && column_info.levels.back().rep == 0) // no arrays => num_values == num_rows + { + if (header.data_page_header.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in data page"); num_rows_in_page = header.data_page_header.num_values; + } if (num_rows_in_page.has_value()) { @@ -1402,8 +1462,13 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size /// Get information about page layout and encoding out of page header. + checkThriftEnum(column.meta->meta_data.codec, parq::_CompressionCodec_VALUES_TO_NAMES, "compression codec"); page.codec = column.meta->meta_data.codec; - page.values_uncompressed_size = header.uncompressed_page_size; + /// Signed i32 from the thrift header; a negative value would sign-extend to a huge size_t and + /// later cause a huge allocation in decompressPageIfCompressed. + if (header.uncompressed_page_size < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative uncompressed page size"); + page.values_uncompressed_size = size_t(header.uncompressed_page_size); if (page.codec == parq::CompressionCodec::UNCOMPRESSED && header.uncompressed_page_size != header.compressed_page_size) throw Exception(ErrorCodes::INCORRECT_DATA, "No compression, but compressed and uncompressed page size are different"); @@ -1417,7 +1482,9 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size if (header.type == parq::PageType::DATA_PAGE) { - page.num_values = header.data_page_header.num_values; + if (header.data_page_header.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in data page"); + page.num_values = size_t(header.data_page_header.num_values); page.encoding = header.data_page_header.encoding; def_encoding = header.data_page_header.definition_level_encoding; rep_encoding = header.data_page_header.repetition_level_encoding; @@ -1458,10 +1525,20 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size } else if (header.type == parq::PageType::DATA_PAGE_V2) { - page.num_values = header.data_page_header_v2.num_values; + if (header.data_page_header_v2.num_values < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative number of values in data page"); + page.num_values = size_t(header.data_page_header_v2.num_values); page.encoding = header.data_page_header_v2.encoding; - encoded_def_size = header.data_page_header_v2.definition_levels_byte_length; - encoded_rep_size = header.data_page_header_v2.repetition_levels_byte_length; + + /// These come from the thrift header as signed i32. A negative value would sign-extend to a + /// huge size_t, so reject it before assigning to the size_t fields. Otherwise the bounds + /// check below could be bypassed by integer overflow, and a huge std::span would reach the + /// rep/def level decoder, reading far past the page buffer (heap out-of-bounds read). + if (header.data_page_header_v2.definition_levels_byte_length < 0 || + header.data_page_header_v2.repetition_levels_byte_length < 0) + throw Exception(ErrorCodes::INCORRECT_DATA, "Negative definition/repetition levels byte length in DataPageV2"); + encoded_def_size = size_t(header.data_page_header_v2.definition_levels_byte_length); + encoded_rep_size = size_t(header.data_page_header_v2.repetition_levels_byte_length); if (header.data_page_header_v2.__isset.is_compressed && !header.data_page_header_v2.is_compressed) @@ -1469,12 +1546,15 @@ bool Reader::initializePage(const char * & data_ptr, const char * data_end, size page.codec = parq::CompressionCodec::UNCOMPRESSED; } - if (encoded_def_size + encoded_rep_size > compressed_page_size) + /// Non-wrapping bounds check: `encoded_def_size + encoded_rep_size` could overflow. + if (encoded_rep_size > page.data.size() || encoded_def_size > page.data.size() - encoded_rep_size) throw Exception(ErrorCodes::INCORRECT_DATA, "Page data is too short (def+rep)"); encoded_rep = page.data.data(); encoded_def = page.data.data() + encoded_rep_size; size_t uncompressed_part = encoded_def_size + encoded_rep_size; page.data = page.data.subspan(uncompressed_part); + if (page.values_uncompressed_size < uncompressed_part) + throw Exception(ErrorCodes::INCORRECT_DATA, "DataPageV2 uncompressed page size is smaller than the rep/def levels"); page.values_uncompressed_size -= uncompressed_part; } else if (header.type == parq::PageType::DICTIONARY_PAGE) @@ -1834,6 +1914,10 @@ void Reader::decompressPageIfCompressed(PageState & page) MutableColumnPtr Reader::formOutputColumn(RowSubgroup & row_subgroup, size_t output_column_idx, size_t num_rows) { + /// Recurses over nested output types; bound the depth so a deeply nested schema cannot + /// overflow the stack. + checkStackSize(); + const OutputColumnInfo & output_info = output_columns.at(output_column_idx); TypeIndex kind = output_info.type->getColumnType(); MutableColumnPtr res; diff --git a/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp b/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp index 2232adc7d42e..1890e008c4fb 100644 --- a/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp +++ b/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -121,6 +122,11 @@ NamesAndTypesList SchemaConverter::inferSchema() std::optional SchemaConverter::processSubtree(String name, bool requested, DataTypePtr type_hint, SchemaContext schema_context) { + /// A deeply nested schema (e.g. a long chain of REQUIRED groups) recurses here per level. + /// The definition-level cap below only counts OPTIONAL/REPEATED nesting, so without this an + /// untrusted file could overflow the stack (uncatchable crash) instead of throwing. + checkStackSize(); + if (type_hint) chassert(requested); if (schema_idx >= file_metadata.schema.size()) diff --git a/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.reference b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.reference new file mode 100644 index 000000000000..1cc545929d9b --- /dev/null +++ b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.reference @@ -0,0 +1,10 @@ +nint_wrap: rejected +nstr_wrap: rejected +arr_wrap: rejected +nint_negdef: rejected +nint_neguncomp: rejected +nint_badtype: rejected +nint_badenc: rejected +nint_negnumvals: rejected +strdict_negnumvals: rejected +multipage_negnrows: rejected diff --git a/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.sh b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.sh new file mode 100755 index 000000000000..f665fb605e8c --- /dev/null +++ b/tests/queries/0_stateless/04324_parquet_v3_datapage_v2_oob.sh @@ -0,0 +1,174 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: needs pyarrow to craft the malformed Parquet files. + +# Regression test for a heap out-of-bounds read in the Parquet V3 native reader. +# +# DataPageV2 headers carry definition_levels_byte_length / repetition_levels_byte_length +# as signed i32. A negative value sign-extended to size_t, and the bounds check used +# wrapping addition (`def + rep > page.data.size()`), so a pair like (def=-1, rep=1) +# wrapped the sum to 0 and bypassed the check. A 2^64-sized std::span then reached the +# RLE level decoder, whose raw memcpy read far past the page buffer (heap disclosure). +# +# The reader must reject every crafted file with a clean INCORRECT_DATA exception +# instead of reading out of bounds. On an unpatched ASan/UBSan build each "wrap" case +# triggers a sanitizer error. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +python3 - "$WORK_DIR" <<'PYEOF' +import io, sys +import pyarrow as pa +import pyarrow.parquet as pq + +work = sys.argv[1] + +# --- minimal Thrift compact protocol walker: record offset of every scalar field --- +CT_INT = {0x03, 0x04, 0x05, 0x06} # byte, i16, i32, i64 + +def zigzag_decode(n): return (n >> 1) ^ -(n & 1) +def zigzag_encode(n, bits=64): + m = (1 << bits) - 1; u = n & m + return ((u << 1) ^ (-(u >> (bits - 1)) & m)) & m +def encode_varint(n): + out = bytearray() + while True: + b = n & 0x7F; n >>= 7 + out.append(b | (0x80 if n else 0)) + if not n: break + return bytes(out) + +class Walker: + def __init__(self, buf, pos): self.buf, self.pos, self.rec = buf, pos, [] + def byte(self): b = self.buf[self.pos]; self.pos += 1; return b + def varint(self): + r = s = 0 + while True: + b = self.byte(); r |= (b & 0x7F) << s + if not (b & 0x80): return r + s += 7 + def zz(self): return zigzag_decode(self.varint()) + def struct(self, path): + last = 0 + while True: + h = self.byte() + if h == 0: return + d = (h & 0xF0) >> 4; ct = h & 0x0F + fid = self.zz() if d == 0 else last + d + last = fid + self.field(ct, path + [fid]) + def field(self, ct, path): + vs = self.pos; val = None + if ct in (0x01, 0x02): val = (ct == 0x01) + elif ct == 0x03: val = self.byte() + elif ct in (0x04, 0x05, 0x06): val = self.zz() + elif ct == 0x07: self.pos += 8 + elif ct == 0x08: self.pos += self.varint() + elif ct in (0x09, 0x0A): self.lst(path) + elif ct == 0x0C: self.struct(path) + else: raise ValueError(f"ctype {ct}") + if ct in CT_INT: self.rec.append((tuple(path), vs, self.pos, val)) + def lst(self, path): + st = self.byte(); n = (st & 0xF0) >> 4; et = st & 0x0F + if n == 0xF: n = self.varint() + for i in range(n): self.field(et, path + [i]) + +def first_page_offset(buf): + col = pq.ParquetFile(io.BytesIO(bytes(buf))).metadata.row_group(0).column(0) + off = col.data_page_offset + if col.has_dictionary_page and col.dictionary_page_offset is not None: + off = min(off, col.dictionary_page_offset) + return off + +def patch(buf, off, field_path, signed_value): + w = Walker(buf, off); w.struct([]) + for pi, vs, ve, val in w.rec: + if pi == tuple(field_path): + nb = encode_varint(zigzag_encode(signed_value)) + assert len(nb) == ve - vs, f"len change for {field_path}: {ve-vs}->{len(nb)} ({val}->{signed_value})" + buf[vs:ve] = nb + return buf + raise KeyError(field_path) + +def make(path, dtype, vals, compression="none", use_dictionary=False, data_page_size=None): + kw = {} if data_page_size is None else {"data_page_size": data_page_size} + pq.write_table(pa.table({"v": pa.array(vals, type=dtype)}), path, + data_page_version="2.0", compression=compression, + use_dictionary=use_dictionary, write_statistics=False, **kw) + +def page_offsets(buf): + """Offsets of every data page header (walks header + compressed_page_size), bounded by the + column chunk's compressed size so we never run into the file footer.""" + col = pq.ParquetFile(io.BytesIO(bytes(buf))).metadata.row_group(0).column(0) + p = col.data_page_offset + end = col.data_page_offset + col.total_compressed_size + offs = [] + while p < end: + w = Walker(buf, p); w.struct([]) + cps = next(v for (pi, vs, ve, v) in w.rec if pi == (3,)) # compressed_page_size + offs.append(p) + p = w.pos + cps + return offs + +# PageHeader field ids: 2=uncompressed_page_size; 8=data_page_header_v2 struct, +# whose 5=definition_levels_byte_length, 6=repetition_levels_byte_length. +NINT = [i if i % 3 else None for i in range(64)] +NSTR = [("x" * ((i % 7) + 1) if i % 3 else None) for i in range(64)] +ARR = [list(range(i % 5)) for i in range(64)] + +def craft(name, dtype, vals, patches, compression="none", use_dictionary=False): + base = f"{work}/{name}.parquet" + make(base, dtype, vals, compression, use_dictionary) + buf = bytearray(open(base, "rb").read()) + off = first_page_offset(buf) + for fp, v in patches: + patch(buf, off, fp, v) + open(f"{work}/{name}_evil.parquet", "wb").write(buf) + +# Wrapping bypass (def + rep wraps to a small value -> huge def/rep span -> OOB read). +craft("nint_wrap", pa.int32(), NINT, [((8, 5), -1), ((8, 6), 1)]) +craft("nstr_wrap", pa.string(), NSTR, [((8, 5), -2), ((8, 6), 2)]) +craft("arr_wrap", pa.list_(pa.int32()), ARR, [((8, 5), 1), ((8, 6), -1)]) +# Negative definition length alone (no wrap, must still be rejected). +craft("nint_negdef", pa.int32(), NINT, [((8, 5), -1)]) +# Negative uncompressed_page_size on a compressed page (sizes the decompression buffer). +craft("nint_neguncomp", pa.int32(), NINT, [((2,), -8192)], compression="snappy") +# Out-of-range enum values (loading an unscoped enum out of range is undefined behavior). +# PageHeader field 1 = type (PageType); data_page_header_v2 field 4 = encoding (Encoding). +craft("nint_badtype", pa.int32(), NINT, [((1,), -64)]) +craft("nint_badenc", pa.int32(), NINT, [((8, 4), -64)]) +# Negative num_values (data_page_header_v2 field 1). +craft("nint_negnumvals", pa.int32(), NINT, [((8, 1), -8192)]) +# Negative num_values in the DICTIONARY page header (dictionary_page_header field 1). The first page +# of a dictionary-encoded column is the DICTIONARY_PAGE, so this patches its header. +DICTSTR = [("v%d" % (i % 5)) for i in range(64)] # few distinct values -> small dict num_values +craft("strdict_negnumvals", pa.string(), DICTSTR, [((7, 1), -64)], use_dictionary=True) +# Negative num_rows in a NON-FIRST DataPageV2. num_rows is consumed early (before the num_values +# check) to compute the row cursor, so a negative value on a later page wraps it backwards. Build a +# multi-page file and patch the second page's num_rows (-1024 keeps the 2-byte varint length of 1024). +make(f"{work}/multipage.parquet", pa.int32(), list(range(4000)), data_page_size=256) +mp = bytearray(open(f"{work}/multipage.parquet", "rb").read()) +offs = page_offsets(mp) +assert len(offs) >= 2, f"expected multiple pages, got {len(offs)}" +patch(mp, offs[1], (8, 3), -1024) +open(f"{work}/multipage_negnrows_evil.parquet", "wb").write(mp) +PYEOF + +# Each crafted file must be rejected with INCORRECT_DATA (code 117), not crash or leak. +for f in nint_wrap nstr_wrap arr_wrap nint_negdef nint_neguncomp nint_badtype nint_badenc nint_negnumvals strdict_negnumvals multipage_negnrows; do + out=$(${CLICKHOUSE_LOCAL} --query " + SELECT * FROM file('${WORK_DIR}/${f}_evil.parquet', Parquet) FORMAT Null + SETTINGS input_format_parquet_use_native_reader_v3 = 1" 2>&1) + if echo "$out" | grep -q "INCORRECT_DATA"; then + echo "$f: rejected" + else + echo "$f: UNEXPECTED: $out" + fi +done diff --git a/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.reference b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.reference new file mode 100644 index 000000000000..29deae098da5 --- /dev/null +++ b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.reference @@ -0,0 +1,2 @@ +deep: rejected +shallow: ok diff --git a/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.sh b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.sh new file mode 100755 index 000000000000..c5feaaffc8e3 --- /dev/null +++ b/tests/queries/0_stateless/04325_parquet_v3_deep_schema_recursion.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: the Parquet format is not available in the fast test build. + +# Regression test for unbounded recursion in the Parquet V3 native reader's schema converter. +# A chain of nested REQUIRED groups maps to nested Tuples and recurses through +# SchemaConverter::processSubtree per level. The definition-level cap (255) only counts +# OPTIONAL/REPEATED nesting, so a deep REQUIRED chain recursed without bound and overflowed the +# stack -> uncatchable SIGSEGV (server crash / DoS), triggerable even by schema inference (DESC). +# checkStackSize() now turns it into a catchable TOO_DEEP_RECURSION exception. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +# Hand-build a Parquet file (PAR1 + FileMetaData footer, no row groups) whose schema is a root with +# N nested REQUIRED groups (num_children=1 each) and an INT32 leaf. Pure stdlib, no pyarrow. +python3 - "$WORK_DIR" <<'PYEOF' +import struct, sys +work = sys.argv[1] + +class W: + def __init__(s): s.out = bytearray() + def u8(s, v): s.out.append(v & 0xff) + def varint(s, v): + v &= (1 << 64) - 1 + while True: + b = v & 0x7f; v >>= 7 + s.out.append(b | 0x80) if v else s.out.append(b) + if not v: return + def zz(s, n): s.varint(((n << 1) ^ (n >> 63)) & ((1 << 64) - 1)) + +CT_I32, CT_I64, CT_BIN, CT_LIST, CT_STRUCT = 5, 6, 8, 9, 12 + +def field(w, last, fid, ctype): + d = fid - last + if 1 <= d <= 15: w.u8((d << 4) | ctype) + else: w.u8(ctype); w.zz(fid) + return fid + +def schema_elem(w, name, repetition=None, num_children=None, ptype=None): + last = 0 + if ptype is not None: + last = field(w, last, 1, CT_I32); w.zz(ptype) # type + if repetition is not None: + last = field(w, last, 3, CT_I32); w.zz(repetition) # repetition_type (REQUIRED=0) + last = field(w, last, 4, CT_BIN); w.varint(len(name)); w.out += name.encode() # name + if num_children is not None: + last = field(w, last, 5, CT_I32); w.zz(num_children) # num_children + w.u8(0) + +def build(n): + fmd = W(); last = 0 + last = field(fmd, last, 1, CT_I32); fmd.zz(2) # version + last = field(fmd, last, 2, CT_LIST) # schema list + total = n + 2 # root + n groups + leaf + if total < 15: fmd.u8((total << 4) | CT_STRUCT) + else: fmd.u8((15 << 4) | CT_STRUCT); fmd.varint(total) + schema_elem(fmd, "root", repetition=None, num_children=1) + for _ in range(n): + schema_elem(fmd, "g", repetition=0, num_children=1) # REQUIRED group + schema_elem(fmd, "leaf", repetition=0, ptype=1) # INT32 leaf + last = field(fmd, last, 3, CT_I64); fmd.zz(0) # num_rows + last = field(fmd, last, 4, CT_LIST); fmd.u8((0 << 4) | CT_STRUCT) # row_groups (empty) + fmd.u8(0) + meta = bytes(fmd.out) + return b'PAR1' + meta + struct.pack('&1) +if echo "$out" | grep -q "TOO_DEEP_RECURSION"; then + echo "deep: rejected" +else + echo "deep: UNEXPECTED: $out" +fi + +# A reasonably nested schema must still work. +shallow=$(${CLICKHOUSE_LOCAL} --query " + DESC file('${WORK_DIR}/shallow.parquet', Parquet) + SETTINGS input_format_parquet_use_native_reader_v3 = 1" 2>&1) +if echo "$shallow" | grep -q "Tuple"; then + echo "shallow: ok" +else + echo "shallow: UNEXPECTED: $shallow" +fi diff --git a/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.reference b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.reference new file mode 100644 index 000000000000..d070e1a4f42c --- /dev/null +++ b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.reference @@ -0,0 +1 @@ +geo_bomb: memory limit enforced diff --git a/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.sh b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.sh new file mode 100755 index 000000000000..ab20e680abd3 --- /dev/null +++ b/tests/queries/0_stateless/04326_parquet_v3_geoparquet_wkb_alloc.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: needs pyarrow to write the GeoParquet file. + +# Regression test for an untracked-allocation DoS in the Parquet V3 GeoParquet (WKB) reader. +# The WKB reader took an element count straight off the wire and `reserve`d a std::vector of that +# many points before reading any coordinate bytes. The default container tracking is non-throwing, +# so a 9-byte WKB value claiming 100M points forced a ~1.6 GB allocation that bypassed +# max_memory_usage (the query failed later with CANNOT_READ_ALL_DATA, never MEMORY_LIMIT_EXCEEDED). +# The geometry containers now use AllocatorWithMemoryTracking, so the oversized reserve is charged +# to the memory tracker and rejected with MEMORY_LIMIT_EXCEEDED under a small limit. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +python3 - "$WORK_DIR" <<'PYEOF' +import sys, struct, json +import pyarrow as pa +import pyarrow.parquet as pq +work = sys.argv[1] +# WKB LineString header: little-endian, type=2 (LineString), num_points=100M, no coordinates. +wkb = struct.pack('&1) +if echo "$out" | grep -q "MEMORY_LIMIT_EXCEEDED"; then + echo "geo_bomb: memory limit enforced" +else + echo "geo_bomb: UNEXPECTED: $out" +fi diff --git a/tests/queries/0_stateless/04327_avro_string_length_alloc.reference b/tests/queries/0_stateless/04327_avro_string_length_alloc.reference new file mode 100644 index 000000000000..13cd1855ba1e --- /dev/null +++ b/tests/queries/0_stateless/04327_avro_string_length_alloc.reference @@ -0,0 +1 @@ +strbomb: rejected diff --git a/tests/queries/0_stateless/04327_avro_string_length_alloc.sh b/tests/queries/0_stateless/04327_avro_string_length_alloc.sh new file mode 100755 index 000000000000..c657d8dfa8bb --- /dev/null +++ b/tests/queries/0_stateless/04327_avro_string_length_alloc.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# no-fasttest: Avro format is not available in the fast test build. + +# Regression test for an untracked-allocation DoS in the Avro reader. +# BinaryDecoder::decodeString / decodeBytes read a length prefix and resized a std::string/vector to +# that length BEFORE reading any bytes. A ~70-byte Avro file declaring a ~2 GB string length (with no +# data) forced a ~2 GB allocation that bypassed max_memory_usage (peak RSS ~2.9 GB; the query then +# failed with an Avro EOF error). The decoder now reads incrementally, so a truncated/over-declared +# value only allocates the bytes actually present (RSS stays bounded) and is rejected cleanly. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +WORK_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR" +trap 'rm -rf "$WORK_DIR"' EXIT + +# Hand-build a minimal Avro OCF whose single string value declares a ~2 GB length with no data bytes. +python3 - "$WORK_DIR" <<'PYEOF' +import json, sys +work = sys.argv[1] + +def vlong(n): # Avro zigzag varint long + u = ((n << 1) ^ (n >> 63)) & ((1 << 64) - 1) + out = bytearray() + while True: + b = u & 0x7f; u >>= 7 + out.append(b | 0x80) if u else out.append(b) + if not u: break + return bytes(out) + +def avstr(b): return vlong(len(b)) + b + +schema = json.dumps({"type": "record", "name": "r", + "fields": [{"name": "s", "type": "string"}]}).encode() +meta = (vlong(2) + avstr(b'avro.schema') + avstr(schema) + + avstr(b'avro.codec') + avstr(b'null') + vlong(0)) +sync = b'\x00' * 16 +header = b'Obj\x01' + meta + sync +payload = vlong(2_000_000_000) # string length prefix ~2 GB, no bytes follow +block = vlong(1) + vlong(len(payload)) + payload + sync +open(f"{work}/strbomb.avro", "wb").write(header + block) +PYEOF + +# The over-declared string must be rejected cleanly (and with bounded memory) instead of allocating +# ~2 GB up front. The data genuinely ends after the length prefix, so this surfaces as an Avro +# EOF / INCORRECT_DATA error. +out=$(${CLICKHOUSE_LOCAL} --input-format Avro -S "s String" \ + --query "SELECT s FROM table FORMAT Null SETTINGS max_memory_usage = 104857600" \ + < "${WORK_DIR}/strbomb.avro" 2>&1) +if echo "$out" | grep -qE "AVRO_EXCEPTION|EOF reached|INCORRECT_DATA|CANNOT_READ_ALL_DATA"; then + echo "strbomb: rejected" +else + echo "strbomb: UNEXPECTED: $out" +fi From 468eb89ead5a74774bef2a9b46f7939eb826d98f Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 18 Jun 2026 15:21:07 +0000 Subject: [PATCH 58/91] Backport #107606 to 25.8: Fix path traversal in replicated part fetch --- src/Storages/MergeTree/DataPartsExchange.cpp | 30 ++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Storages/MergeTree/DataPartsExchange.cpp b/src/Storages/MergeTree/DataPartsExchange.cpp index 15df3bfca504..f61bff5d3cdf 100644 --- a/src/Storages/MergeTree/DataPartsExchange.cpp +++ b/src/Storages/MergeTree/DataPartsExchange.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -110,6 +111,15 @@ struct ReplicatedFetchReadCallback } }; +/// Validate a projection name from an untrusted replica before it is used to build a path. +/// It becomes a single directory component (".proj"), so it must be non-empty and contain +/// no '/'. Standalone "." and ".." are safe here ("..proj"/"...proj" are single components). +bool isProjectionNameSafe(const std::string & projection_name) +{ + return !projection_name.empty() + && projection_name.find('/') == std::string::npos; +} + } @@ -709,14 +719,15 @@ void Fetcher::downloadBaseOrProjectionPartToDisk( readStringBinary(file_name, in); readBinary(file_size, in); - /// File must be inside "absolute_part_path" directory. - /// Otherwise malicious ClickHouse replica may force us to write to arbitrary path. - String absolute_file_path = fs::weakly_canonical(fs::path(data_part_storage->getRelativePath()) / file_name); - if (!startsWith(absolute_file_path, fs::weakly_canonical(data_part_storage->getRelativePath()).string())) + /// Guard against a malicious replica writing outside the part directory. + /// Runs for both the base part and projection parts. + const auto absolute_file_path = fs::weakly_canonical(fs::path(data_part_storage->getRelativePath()) / file_name); + if (!pathStartsWith(absolute_file_path, fs::path(data_part_storage->getRelativePath()))) throw Exception(ErrorCodes::INSECURE_PATH, "File path ({}) doesn't appear to be inside part path ({}). " "This may happen if we are trying to download part from malicious replica or logical error.", - absolute_file_path, data_part_storage->getRelativePath()); + absolute_file_path.string(), + data_part_storage->getRelativePath()); written_files.emplace_back(output_buffer_getter(*data_part_storage, file_name, file_size)); HashingWriteBuffer hashing_out(*written_files.back()); @@ -836,6 +847,15 @@ MergeTreeData::MutableDataPartPtr Fetcher::downloadPartToDisk( { String projection_name; readStringBinary(projection_name, in); + + /// Validate before getProjection()/createDirectories() so no attacker-named + /// directory is ever created from an untrusted replica's projection name. + if (!isProjectionNameSafe(projection_name)) + throw Exception(ErrorCodes::INSECURE_PATH, + "Projection name ({}) doesn't appear to be a valid name. " + "This may happen if we are trying to download part from malicious replica or logical error.", + projection_name); + MergeTreeData::DataPart::Checksums projection_checksum; auto projection_part_storage = part_storage_for_loading->getProjection(projection_name + ".proj"); From a79299a0e0da9f199305bb2e1d01863ba28fad9b Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Thu, 18 Jun 2026 17:19:33 +0000 Subject: [PATCH 59/91] Backport #107693 to 25.8: Length-encode the `info` field of the MySQL `OK` packet --- .../integration/mysql_java_client/Dockerfile | 8 +++- src/Core/MySQL/PacketsGeneric.cpp | 46 ++++++------------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/ci/docker/integration/mysql_java_client/Dockerfile b/ci/docker/integration/mysql_java_client/Dockerfile index 38fefac070e7..13e705db6b08 100644 --- a/ci/docker/integration/mysql_java_client/Dockerfile +++ b/ci/docker/integration/mysql_java_client/Dockerfile @@ -5,7 +5,13 @@ FROM openjdk:8-jdk-alpine RUN apk --no-cache add curl -ARG ver=8.1.0 +# Connector/J 8.2.0+ (including 9.x) reads the `info` field of the MySQL `OK` +# packet as a length-encoded string; it used to be pinned to 8.1.0 because +# ClickHouse wrote that field as a plain string and newer drivers failed to +# connect. Fixed by length-encoding `info` (see #84542), so test against a +# modern driver. CLASSPATH=. is required so javac-compiled .class files in the +# WORKDIR are found at runtime. +ARG ver=9.7.0 RUN curl -L -o /mysql-connector-j-${ver}.jar https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/${ver}/mysql-connector-j-${ver}.jar ENV CLASSPATH=$CLASSPATH:/mysql-connector-j-${ver}.jar diff --git a/src/Core/MySQL/PacketsGeneric.cpp b/src/Core/MySQL/PacketsGeneric.cpp index af80797d5c16..5e9b442ab176 100644 --- a/src/Core/MySQL/PacketsGeneric.cpp +++ b/src/Core/MySQL/PacketsGeneric.cpp @@ -46,16 +46,14 @@ size_t OKPacket::getPayloadSize() const result += 2; } - if (capabilities & CLIENT_SESSION_TRACK) - { - result += getLengthEncodedStringSize(info); - if (status_flags & SERVER_SESSION_STATE_CHANGED) - result += getLengthEncodedStringSize(session_state_changes); - } - else - { - result += info.size(); - } + /// `info` is always a length-encoded string, matching real MySQL. The protocol documentation + /// describes it as a rest-of-packet string when `CLIENT_SESSION_TRACK` is not negotiated, but the + /// MySQL server length-encodes it unconditionally, and `MySQL Connector/J` >= 8.2 reads it as a + /// length-encoded string regardless of the negotiated capabilities. Writing a plain string here + /// made `Connector/J` interpret the first byte of `info` as a length and fail to connect. + result += getLengthEncodedStringSize(info); + if ((capabilities & CLIENT_SESSION_TRACK) && (status_flags & SERVER_SESSION_STATE_CHANGED)) + result += getLengthEncodedStringSize(session_state_changes); return result; } @@ -77,18 +75,9 @@ void OKPacket::readPayloadImpl(ReadBuffer & payload) payload.readStrict(reinterpret_cast(&status_flags), 2); } - if (capabilities & CLIENT_SESSION_TRACK) - { - readLengthEncodedString(info, payload); - if (status_flags & SERVER_SESSION_STATE_CHANGED) - { - readLengthEncodedString(session_state_changes, payload); - } - } - else - { - readString(info, payload); - } + readLengthEncodedString(info, payload); + if ((capabilities & CLIENT_SESSION_TRACK) && (status_flags & SERVER_SESSION_STATE_CHANGED)) + readLengthEncodedString(session_state_changes, payload); } void OKPacket::writePayloadImpl(WriteBuffer & buffer) const @@ -108,16 +97,9 @@ void OKPacket::writePayloadImpl(WriteBuffer & buffer) const buffer.write(reinterpret_cast(&status_flags), 2); } - if (capabilities & CLIENT_SESSION_TRACK) - { - writeLengthEncodedString(info, buffer); - if (status_flags & SERVER_SESSION_STATE_CHANGED) - writeLengthEncodedString(session_state_changes, buffer); - } - else - { - writeString(info, buffer); - } + writeLengthEncodedString(info, buffer); + if ((capabilities & CLIENT_SESSION_TRACK) && (status_flags & SERVER_SESSION_STATE_CHANGED)) + writeLengthEncodedString(session_state_changes, buffer); } EOFPacket::EOFPacket() : warnings(0x00), status_flags(0x00) From 43532b4600112f7d8d0706b11599969deeb4a5d6 Mon Sep 17 00:00:00 2001 From: robot-clickhouse-ci-1 <118761991+robot-clickhouse-ci-1@users.noreply.github.com> Date: Fri, 19 Jun 2026 12:32:58 +0800 Subject: [PATCH 60/91] Backport #107580 to 25.8: Add missing bounds checks in ORC reader (#107874) Co-authored-by: robot-clickhouse --- .../Impl/NativeORCBlockInputFormat.cpp | 37 +++++++++++++++++-- ...0_orc_fast_decoder_char_overflow.reference | 0 .../04340_orc_fast_decoder_char_overflow.sql | 23 ++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 tests/queries/0_stateless/04340_orc_fast_decoder_char_overflow.reference create mode 100644 tests/queries/0_stateless/04340_orc_fast_decoder_char_overflow.sql diff --git a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp index 17e4a9426170..84ff91b9e3a9 100644 --- a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp @@ -1363,7 +1363,16 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( { const auto * buf = orc_dict.dictionaryBlob.data() + orc_dict.dictionaryOffset[i]; size_t buf_size = orc_dict.dictionaryOffset[i + 1] - orc_dict.dictionaryOffset[i]; + if (buf_size > n) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "ORC dictionary entry {} has size {} that exceeds the declared FixedString length {}", + i, buf_size, n); memcpy(&column_chars[curr_offset], buf, buf_size); + /// resize_exact does not zero-initialize, so pad shorter entries to keep FixedString values + /// deterministic and to avoid leaking uninitialized heap memory. + if (buf_size < n) + memset(&column_chars[curr_offset + buf_size], 0, n - buf_size); curr_offset += n; } } @@ -1392,6 +1401,16 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( auto index_column = dynamic_cast(dictionary_column.get())->uniqueInsertRangeFrom(*holder_column, 0, holder_column->size()); + auto check_index = [&](Int64 orc_index, size_t row) -> Int64 + { + if (orc_index < 0 || static_cast(orc_index) >= dict_size) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "ORC dictionary index {} at row {} is out of range [0, {})", + orc_index, row, dict_size); + return orc_index; + }; + /// Fill index_column and wrap it with LowCardinality auto call_by_type = [&](auto index_type) -> MutableColumnPtr { @@ -1409,7 +1428,7 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( for (size_t i = 0; i < rows; ++i) { /// First map row index to ORC dictionary index, then map ORC dictionary index to CH dictionary index - new_index_data[i] = index_data[orc_str_column.index[i]]; + new_index_data[i] = index_data[check_index(orc_str_column.index[i], i)]; } } else @@ -1418,7 +1437,7 @@ static ColumnWithTypeAndName readColumnWithEncodedStringOrFixedStringData( { /// Set index 0 if we meet null value. If dictionary_column is nullable, 0 represents null value. /// Otherwise 0 represents default string value, it is reasonable because null values are converted to default values when casting nullable column to non-nullable. - new_index_data[i] = orc_str_column.notNull[i] ? index_data[orc_str_column.index[i]] : 0; + new_index_data[i] = orc_str_column.notNull[i] ? index_data[check_index(orc_str_column.index[i], i)] : 0; } } @@ -1499,7 +1518,19 @@ readColumnWithFixedStringData(const orc::ColumnVectorBatch * orc_column, const o for (size_t i = 0; i < orc_str_column->numElements; ++i) { if (!orc_str_column->hasNulls || orc_str_column->notNull[i]) - column_chars.insert_assume_reserved(orc_str_column->data[i], orc_str_column->data[i] + orc_str_column->length[i]); + { + const Int64 length = orc_str_column->length[i]; + if (length < 0 || static_cast(length) > fixed_len) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "ORC string value at row {} has size {} that doesn't fit into FixedString({})", + i, length, fixed_len); + + column_chars.insert_assume_reserved(orc_str_column->data[i], orc_str_column->data[i] + length); + /// Zero-pad shorter values to the fixed width to keep the FixedString layout consistent. + if (static_cast(length) < fixed_len) + column_chars.resize_fill(column_chars.size() + (fixed_len - static_cast(length))); + } else column_chars.resize_fill(column_chars.size() + fixed_len); } diff --git a/tests/queries/0_stateless/04340_orc_fast_decoder_char_overflow.reference b/tests/queries/0_stateless/04340_orc_fast_decoder_char_overflow.reference new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/queries/0_stateless/04340_orc_fast_decoder_char_overflow.sql b/tests/queries/0_stateless/04340_orc_fast_decoder_char_overflow.sql new file mode 100644 index 000000000000..3460f19124b5 --- /dev/null +++ b/tests/queries/0_stateless/04340_orc_fast_decoder_char_overflow.sql @@ -0,0 +1,23 @@ +-- Tags: no-fasttest +-- no-fasttest: requires the ORC input format, which is not built in fasttest. + +-- Regression test for heap buffer overflows / out-of-bounds reads in the native ORC fast decoder +-- (`NativeORCBlockInputFormat`) when a crafted ORC file violates the invariants the decoder assumes +-- about CHAR-typed and dictionary-encoded columns. Before the fix these wrote/read past the bounds of +-- a heap buffer; now they are rejected with INCORRECT_DATA. The crafted files were produced by writing +-- a benign String column with a standard ORC writer and surgically patching the ORC metadata. + +SET input_format_orc_use_fast_decoder = 1; +SET input_format_orc_dictionary_as_low_cardinality = 1; + +-- A dictionary-encoded CHAR(1) column whose dictionary entry is 2 bytes long: the decoder allocated +-- dict_size * 1 bytes and memcpy'd the 2-byte entry into it. +SELECT * FROM format(ORC, unhex('4f52430a07120508800150000a180a0200001212088001220b0a026161120262621880045000407f55555555555555555555555555555555616162624201a00a060806100018090a0608061001181a0a060801100118120a060803100118040a060802100118031204080010001204080310021a03474d540a1b0a0508800150000a12088001220b0a026161120262621880045000080310751a0b0803102318192039288001220e080c1201011a0173200028003000220a081120002800300020013080013a0508800150003a12088001220b0a02616112026262188004500040904e48016205322e322e3208571000188080042202000c281d300682f403034f524317')) FORMAT Null; -- { serverError INCORRECT_DATA } + +-- A non-dictionary CHAR(1) column whose per-row value is longer than the declared width: the decoder +-- reserved numElements * 1 bytes and inserted the longer value without a capacity check. +SELECT * FROM format(ORC, unhex('4f52430a061204084050000a1c0a0300000012150840220f0a04303078781204363378781880045000c03f0400303078783031787830327878303378783034787830357878303678783037787830387878303978783130787831317878313278783133787831347878313578783136787831377878313878783139787832307878323178783232787832337878323478783235787832367878323778783238787832397878333078783331787833327878333378783334787833357878333678783337787833387878333978783430787834317878343278783433787834347878343578783436787834377878343878783439787835307878353178783532787835337878353478783535787835367878353778783538787835397878363078783631787836327878363378780a060806100018080a0608061001181e0a060802100118040a07080110011880021204080010001204080210001a03474d540a1d0a04084050000a150840220f0a04303078781204363378781880045000080310dc021a0b0803102618840220322840220e080c1201011a0173200028003000220a0811200028003000200130403a04084050003a150840220f0a0430307878120436337878188004500040904e48016205322e322e3208591000188080042202000c281f300682f403034f524317')) FORMAT Null; -- { serverError INCORRECT_DATA } + +-- A dictionary-encoded String column with a per-row dictionary index (255) past the end of the +-- dictionary (size 2): the decoder indexed the dictionary array without a bound check. +SELECT * FROM format(ORC, unhex('4f52430a061204080650000a140a020000120e080622080a0161120162180c50004e05ffffffffffff61624001c00a060806100018080a060806100118160a060801100118080a060803100118020a060802100118031204080010001204080310021a03474d540a160a04080650000a0e080622080a0161120162180c5000080310641a0a0803101e180d20392806220e080c1201011a01732000280030002208080720002800300030063a04080650003a0e080622080a0161120162180c500040904e48016205322e322e32084e1000188080042202000c2818300682f403034f524317')) FORMAT Null; -- { serverError INCORRECT_DATA } From 1abbc9af0968104d347d806f8a213c8f27536359 Mon Sep 17 00:00:00 2001 From: Pablo Marcos Date: Fri, 19 Jun 2026 14:04:52 +0200 Subject: [PATCH 61/91] Update PrometheusRequestHandler.cpp --- src/Server/PrometheusRequestHandler.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Server/PrometheusRequestHandler.cpp b/src/Server/PrometheusRequestHandler.cpp index 8ecb9889ad7f..c3ea26edf444 100644 --- a/src/Server/PrometheusRequestHandler.cpp +++ b/src/Server/PrometheusRequestHandler.cpp @@ -15,8 +15,6 @@ #include #include -#include -#include #include #include #include From ba2c5a5cd3aee407e82cefc48cba28a8b97a08f3 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Fri, 19 Jun 2026 12:38:13 +0000 Subject: [PATCH 62/91] Backport #106349 to 25.8: Fix crash in constraint optimization with correlated subqueries --- src/Analyzer/Passes/ConvertQueryToCNFPass.cpp | 55 +++++++++++++++++-- ...t_subst_correlated_subquery_root.reference | 2 + ...straint_subst_correlated_subquery_root.sql | 29 ++++++++++ ...substitution_correlated_subquery.reference | 2 + ...const_substitution_correlated_subquery.sql | 21 +++++++ 5 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.reference create mode 100644 tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql create mode 100644 tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.reference create mode 100644 tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.sql diff --git a/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp b/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp index 2eac795974dc..9268b5f8f88e 100644 --- a/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp +++ b/src/Analyzer/Passes/ConvertQueryToCNFPass.cpp @@ -30,6 +30,13 @@ namespace Setting namespace { +/// Constraint-based optimization is scoped to a single query node: each (sub)query is optimized +/// independently. Subqueries (`isSubqueryNodeType`) must therefore be treated as opaque boundaries, +/// both when one is a clause root (e.g. constraint reduction collapses `cond OR (subquery)` to just +/// the subquery) and when one is nested inside an expression (e.g. `exists((subquery))`). Crossing +/// the boundary would rewrite a subquery's correlated columns, which must stay plain ColumnNodes for +/// decorrelation. + std::optional tryConvertQueryToCNF(const QueryTreeNodePtr & node, const ContextPtr & context) { auto cnf_form = Analyzer::CNF::tryBuildCNF(node, context); @@ -158,6 +165,12 @@ bool checkIfAtomAlwaysFalseGraph(const Analyzer::CNFAtomicFormula & atom, const void replaceToConstants(QueryTreeNodePtr & term, const ComparisonGraph & graph) { + /// Do not cross into subqueries: replacing a correlated column with its constant equivalent + /// would corrupt the subquery's correlated_columns_list, which the planner expects to hold + /// ColumnNodes (see isSubqueryNodeType). + if (isSubqueryNodeType(term->getNodeType())) + return; + const auto equal_constant = graph.getEqualConst(term); if (equal_constant) { @@ -418,6 +431,11 @@ class ComponentCollectorVisitor : public ConstInDepthQueryTreeVisitorgetNodeType()); + } + void visitImpl(const QueryTreeNodePtr & node) { if (auto id = graph.getComponentId(node)) @@ -472,6 +490,11 @@ class SubstituteColumnVisitor : public InDepthQueryTreeVisitorgetNodeType()); + } + void visitImpl(QueryTreeNodePtr & node) { auto component_id_it = query_node_to_component.find(node); @@ -581,16 +604,24 @@ void substituteColumns(QueryNode & query_node, const QueryTreeNodes & table_expr auto run_for_all = [&](const auto function) { - function(query_node.getProjectionNode()); + /// The needChildVisit guards in the visitors only stop subqueries nested inside a larger + /// expression; a clause that is itself a subquery is the visit root, so guard it here. + const auto run_unless_subquery = [&](QueryTreeNodePtr & node) + { + if (!isSubqueryNodeType(node->getNodeType())) + function(node); + }; + + run_unless_subquery(query_node.getProjectionNode()); if (query_node.hasWhere()) - function(query_node.getWhere()); + run_unless_subquery(query_node.getWhere()); if (query_node.hasPrewhere()) - function(query_node.getPrewhere()); + run_unless_subquery(query_node.getPrewhere()); if (query_node.hasHaving()) - function(query_node.getHaving()); + run_unless_subquery(query_node.getHaving()); }; std::set components; @@ -704,6 +735,22 @@ void optimizeNode(QueryTreeNodePtr & node, const QueryTreeNodes & table_expressi optimizeWithConstraints(*cnf, table_expressions, context); auto new_node = cnf->toQueryTree(); + + /// Constraint reduction can collapse a filter into a standalone correlated subquery. For example, + /// with `CONSTRAINT c ASSUME (a <= b) AND (b <= c) AND (c <= d) AND (d <= a)` (so all columns are + /// equal), the filter + /// WHERE (b < d) OR (SELECT a < c) + /// reduces to + /// WHERE (SELECT a < c) + /// because `b < d` is always false. A standalone correlated subquery predicate is not always + /// decorrelated correctly today: the outer plan may not keep the captured columns (e.g. + /// `SELECT count() ... WHERE (SELECT a < c)` raises NOT_FOUND_COLUMN_IN_BLOCK, while `SELECT *` + /// works). Keep the original filter so the optimization never turns a working query into a + /// failing one. `new_node` is null when the filter reduces to a constant and is dropped, which is + /// fine to apply. + if (new_node && isCorrelatedQueryOrUnionNode(new_node)) + return; + node = std::move(new_node); } diff --git a/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.reference b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.reference new file mode 100644 index 000000000000..6ed281c757a9 --- /dev/null +++ b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.reference @@ -0,0 +1,2 @@ +1 +1 diff --git a/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql new file mode 100644 index 000000000000..cab011f5f783 --- /dev/null +++ b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql @@ -0,0 +1,29 @@ +-- Constraint reduction can collapse a filter into a bare correlated subquery +-- (here `b < d` is always false given the constraint, leaving only the subquery). +-- A correlated subquery used as a whole predicate cannot be decorrelated, so the +-- optimization is skipped for such a filter and the query runs as written. + +DROP TABLE IF EXISTS t_constraint_corr_root; + +CREATE TABLE t_constraint_corr_root +( + a Nullable(String), + b String, + c LowCardinality(String), + d String, + CONSTRAINT c1 ASSUME (a <= b) AND (b <= c) AND (c <= d) AND (d <= a) +) +ENGINE = TinyLog; + +INSERT INTO t_constraint_corr_root VALUES ('1', '2', '3', '4'); + +SELECT count() FROM t_constraint_corr_root +WHERE (b < d) OR (SELECT a < c) +SETTINGS enable_analyzer = 1, convert_query_to_cnf = 1, optimize_substitute_columns = 1, optimize_using_constraints = 1; + +-- The same query with the optimization disabled must return the same value. +SELECT count() FROM t_constraint_corr_root +WHERE (b < d) OR (SELECT a < c) +SETTINGS enable_analyzer = 1, convert_query_to_cnf = 0, optimize_substitute_columns = 0, optimize_using_constraints = 0; + +DROP TABLE t_constraint_corr_root; diff --git a/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.reference b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.reference new file mode 100644 index 000000000000..6ed281c757a9 --- /dev/null +++ b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.reference @@ -0,0 +1,2 @@ +1 +1 diff --git a/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.sql b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.sql new file mode 100644 index 000000000000..402e55ece639 --- /dev/null +++ b/tests/queries/0_stateless/04305_constraint_const_substitution_correlated_subquery.sql @@ -0,0 +1,21 @@ +-- Constraint-based constant substitution must not rewrite a correlated column inside a +-- subquery into a constant: correlated columns must stay ColumnNodes for decorrelation. + +DROP TABLE IF EXISTS t_const_outer; +DROP TABLE IF EXISTS t_const_inner; + +CREATE TABLE t_const_outer (a String, CONSTRAINT c1 ASSUME a = 'x') ENGINE = TinyLog; +INSERT INTO t_const_outer VALUES ('x'); + +CREATE TABLE t_const_inner (a String) ENGINE = TinyLog; +INSERT INTO t_const_inner VALUES ('x'); + +SELECT count() FROM t_const_outer WHERE EXISTS (SELECT 1 FROM t_const_inner WHERE t_const_inner.a = t_const_outer.a) +SETTINGS enable_analyzer = 1, optimize_using_constraints = 1, convert_query_to_cnf = 1; + +-- The same query with the optimization disabled must return the same value. +SELECT count() FROM t_const_outer WHERE EXISTS (SELECT 1 FROM t_const_inner WHERE t_const_inner.a = t_const_outer.a) +SETTINGS enable_analyzer = 1, optimize_using_constraints = 0, convert_query_to_cnf = 0; + +DROP TABLE t_const_inner; +DROP TABLE t_const_outer; From 2e22b81162891da3b2f3fd0a0861b54be6a96bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mar=C3=ADn?= Date: Fri, 19 Jun 2026 14:40:20 +0000 Subject: [PATCH 63/91] Use MergeTree in 04299 constraint correlated subquery test On 25.8, decorrelating a correlated subquery over a storage whose read step is not cloneable (e.g. TinyLog -> ReadFromStorageStep) fails with NOT_IMPLEMENTED 'Cannot clone ReadFromStorage plan step'. Switch the test table to MergeTree, whose read step is cloneable, so the query runs. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../04299_constraint_subst_correlated_subquery_root.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql index cab011f5f783..129409c5e2e7 100644 --- a/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql +++ b/tests/queries/0_stateless/04299_constraint_subst_correlated_subquery_root.sql @@ -13,7 +13,9 @@ CREATE TABLE t_constraint_corr_root d String, CONSTRAINT c1 ASSUME (a <= b) AND (b <= c) AND (c <= d) AND (d <= a) ) -ENGINE = TinyLog; +-- A read step that cannot be cloned (e.g. `TinyLog`) makes correlated-subquery decorrelation +-- fail with `NOT_IMPLEMENTED` on this version, so use `MergeTree`, whose read step is cloneable. +ENGINE = MergeTree ORDER BY tuple(); INSERT INTO t_constraint_corr_root VALUES ('1', '2', '3', '4'); From d42dd6070294ea05c3963648095fe0232a615eca Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 22 Jun 2026 16:00:15 +0000 Subject: [PATCH 64/91] Backport #107764 to 25.8: Fix regression: accept 0-byte offsets buffer for empty Arrow String/Binary columns --- .../Formats/Impl/ArrowColumnToCHColumn.cpp | 7 +- ...04356_arrow_empty_string_offsets.reference | 5 ++ .../04356_arrow_empty_string_offsets.sh | 73 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/04356_arrow_empty_string_offsets.reference create mode 100755 tests/queries/0_stateless/04356_arrow_empty_string_offsets.sh diff --git a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp index a9d137fa2071..c8f9846cad98 100644 --- a/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp +++ b/src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp @@ -209,6 +209,9 @@ const ArrowViewArray & checkedCastView(const arrow::Array & array, const String /// because value_length(i) = offset[i+1] - offset[i], so the last element needs /// offset[length]. This must be checked before any call to value_offset(i) or /// GetView(i) to prevent an over-read of the offsets buffer. +/// When length == 0, no offsets are accessed at all (every caller's iteration loop +/// is skipped), so no bytes are required. This accepts the 0-byte offsets buffers +/// that Apache Arrow Java < 19.0.0 emits for empty String/Binary columns. template void checkBinaryOffsetsBuffer(const ArrowBinaryArray & chunk, const String & column_name) { @@ -219,7 +222,9 @@ void checkBinaryOffsetsBuffer(const ArrowBinaryArray & chunk, const String & col column_name, chunk.length(), chunk.offset()); const auto & buffer = chunk.data()->buffers[1]; const size_t buffer_size = buffer ? static_cast(buffer->size()) : 0; - const size_t count_plus_one = static_cast(chunk.offset()) + static_cast(chunk.length()) + 1; + const size_t count_plus_one = chunk.length() > 0 + ? static_cast(chunk.offset()) + static_cast(chunk.length()) + 1 + : 0; size_t required = 0; if (unlikely(__builtin_mul_overflow(sizeof(typename ArrowBinaryArray::offset_type), count_plus_one, &required))) throw Exception( diff --git a/tests/queries/0_stateless/04356_arrow_empty_string_offsets.reference b/tests/queries/0_stateless/04356_arrow_empty_string_offsets.reference new file mode 100644 index 000000000000..4acbfebb8f24 --- /dev/null +++ b/tests/queries/0_stateless/04356_arrow_empty_string_offsets.reference @@ -0,0 +1,5 @@ +0 +1 {} +2 {} +1 [] +2 [] diff --git a/tests/queries/0_stateless/04356_arrow_empty_string_offsets.sh b/tests/queries/0_stateless/04356_arrow_empty_string_offsets.sh new file mode 100755 index 000000000000..fcbfcbb00013 --- /dev/null +++ b/tests/queries/0_stateless/04356_arrow_empty_string_offsets.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test for accepting empty String/Binary columns whose offsets buffer +# is 0 bytes. Apache Arrow Java < 19.0.0 (bundled with Apache Spark) emits a +# 0-byte offsets buffer when a String/Binary child column has zero elements +# (e.g. every map is empty, so the key child has length=0). Every other Arrow +# implementation (arrow-cpp, pyarrow, arrow-rs) accepts this; ClickHouse must +# too. The fix: when chunk.length() == 0, no offsets are ever accessed, so +# 0 bytes are required. +# +# Covers three shapes of empty String column: +# (a) standalone String column, length=0 +# (b) Map(String, Int32) where all entries are empty -> key child length=0 +# (c) Array(String) where all arrays are empty -> string child length=0 + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +python3 - "$TMP_DIR" <<'PYEOF' +import io, sys +import pyarrow as pa +import pyarrow.ipc as ipc + +out = sys.argv[1] + +def write_arrow(tbl): + buf = io.BytesIO() + with ipc.new_file(buf, tbl.schema) as w: + w.write_table(tbl) + return buf.getvalue() + +def zero_byte_string_array(): + """Build a String array with length=0 and a 0-byte offsets buffer, + as Apache Arrow Java < 19.0.0 produces for empty collections.""" + return pa.Array.from_buffers( + pa.string(), 0, + [None, pa.py_buffer(b""), pa.py_buffer(b"")] + ) + +# (a) Standalone String column, 0 rows, 0-byte offsets buffer. +tbl_a = pa.table({"s": zero_byte_string_array()}) +open(f"{out}/empty_string.arrow", "wb").write(write_arrow(tbl_a)) + +# (b) Map(String, Int32) with 2 rows of empty maps -> key child length=0. +offsets = pa.array([0, 0, 0], type=pa.int32()) # two empty maps +items = pa.array([], type=pa.int32()) +map_col = pa.MapArray.from_arrays(offsets, zero_byte_string_array(), items) +tbl_b = pa.table({"id": pa.array([1, 2], type=pa.int32()), "m": map_col}) +open(f"{out}/empty_map_keys.arrow", "wb").write(write_arrow(tbl_b)) + +# (c) Array(String) with 2 rows of empty arrays -> string child length=0. +list_offsets = pa.array([0, 0, 0], type=pa.int32()) +list_col = pa.ListArray.from_arrays(list_offsets, zero_byte_string_array()) +tbl_c = pa.table({"id": pa.array([1, 2], type=pa.int32()), "a": list_col}) +open(f"{out}/empty_list_strings.arrow", "wb").write(write_arrow(tbl_c)) +PYEOF + +# (a) Should return 0 rows with no exception. +$CLICKHOUSE_LOCAL --query \ + "SELECT count() FROM file('${TMP_DIR}/empty_string.arrow', Arrow)" + +# (b) Should return the two empty-map rows. +$CLICKHOUSE_LOCAL --query \ + "SELECT id, m FROM file('${TMP_DIR}/empty_map_keys.arrow', Arrow) ORDER BY id" + +# (c) Should return the two empty-array rows. +$CLICKHOUSE_LOCAL --query \ + "SELECT id, a FROM file('${TMP_DIR}/empty_list_strings.arrow', Arrow) ORDER BY id" From d0b1073ab74ecaa2e6483504de0c4789a568dd72 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 22 Jun 2026 19:25:56 +0000 Subject: [PATCH 65/91] Backport #107412 to 25.8: validate event type bounds in windowFunnel state deserialization --- .../AggregateFunctionWindowFunnel.cpp | 24 ++++++++++++++++++- ..._funnel_deserialize_event_bounds.reference | 3 +++ ...window_funnel_deserialize_event_bounds.sql | 17 +++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.reference create mode 100644 tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.sql diff --git a/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp b/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp index 650285661d5f..2c9976dd3e8e 100644 --- a/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp +++ b/src/AggregateFunctions/AggregateFunctionWindowFunnel.cpp @@ -24,6 +24,7 @@ namespace ErrorCodes extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; extern const int TOO_LARGE_ARRAY_SIZE; extern const int BAD_ARGUMENTS; + extern const int INCORRECT_DATA; } namespace @@ -539,7 +540,28 @@ class AggregateFunctionWindowFunnel final void deserialize(AggregateDataPtr __restrict place, ReadBuffer & buf, std::optional /* version */, Arena *) const override { - this->data(place).deserialize(buf); + auto & data = this->data(place); + data.deserialize(buf); + + /// Event types come from untrusted serialized state. getEventLevel* uses (event - 1) to index + /// events_timestamp / event_sequences, both sized events_size, so an out-of-range event would + /// read and write out of bounds. Valid event types are [1, events_size]; 0 is the no-event + /// sentinel produced only with strict_order, so it is accepted only in that mode. + const UInt8 min_event = strict_order ? 0 : 1; + for (const auto & event : data.events_list) + { + UInt8 event_type = 0; + if constexpr (Data::strict_once_enabled) + event_type = event.event_type; + else + event_type = event.second; + + if (event_type < min_event || event_type > events_size) + throw Exception( + ErrorCodes::INCORRECT_DATA, + "Invalid event type {} in the state of function {}, must be in range [{}, {}]", + static_cast(event_type), getName(), static_cast(min_event), static_cast(events_size)); + } } void insertResultInto(AggregateDataPtr __restrict place, IColumn & to, Arena *) const override diff --git a/tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.reference b/tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.reference new file mode 100644 index 000000000000..e22493782f08 --- /dev/null +++ b/tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.reference @@ -0,0 +1,3 @@ +1 +0 +0 diff --git a/tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.sql b/tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.sql new file mode 100644 index 000000000000..c75e6d9b7fce --- /dev/null +++ b/tests/queries/0_stateless/04338_window_funnel_deserialize_event_bounds.sql @@ -0,0 +1,17 @@ +-- A valid windowFunnel state (one event of condition 1) finalizes normally. +SELECT finalizeAggregation(CAST(unhex('0101000000000000000000000001') AS AggregateFunction(windowFunnel(1), UInt32, UInt8, UInt8))); + +-- An event type past the number of conditions (events_size = 2) used to index events_timestamp out of bounds. +SELECT finalizeAggregation(CAST(unhex('01010000000000000000000000FF') AS AggregateFunction(windowFunnel(1), UInt32, UInt8, UInt8))); -- { serverError INCORRECT_DATA } + +-- Event type 0 is a no-event sentinel only valid with strict_order; without it the index goes before the buffer. +SELECT finalizeAggregation(CAST(unhex('0101000000000000000000000000') AS AggregateFunction(windowFunnel(1), UInt32, UInt8, UInt8))); -- { serverError INCORRECT_DATA } + +-- With strict_order that same event type 0 is the legitimate no-event sentinel, so the stored state must still finalize. +SELECT finalizeAggregation(CAST(unhex('0101000000000000000000000000') AS AggregateFunction(windowFunnel(1, 'strict_order'), UInt32, UInt8, UInt8))); + +-- Same check for the strict_once variant, whose state carries a per-event unique id. +SELECT finalizeAggregation(CAST(unhex('01010000000000000000000000FF0100000000000000') AS AggregateFunction(windowFunnel(1, 'strict_once'), UInt32, UInt8, UInt8))); -- { serverError INCORRECT_DATA } + +-- The strict_once layout also keeps event type 0 valid together with strict_order. +SELECT finalizeAggregation(CAST(unhex('01010000000000000000000000000100000000000000') AS AggregateFunction(windowFunnel(1, 'strict_order', 'strict_once'), UInt32, UInt8, UInt8))); From 285f3f3ecd498ea944ff47bfde079eecf81a895c Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 22 Jun 2026 22:49:35 +0000 Subject: [PATCH 66/91] Backport #107579 to 25.8: Add missing bounds checks in Elf.cpp and DWARFBlockInputFormat --- src/Common/Elf.cpp | 50 ++++++++++---- src/Common/Elf.h | 1 + .../Formats/Impl/DWARFBlockInputFormat.cpp | 34 +++++++--- ...04340_malformed_elf_dwarf_bounds.reference | 4 ++ .../04340_malformed_elf_dwarf_bounds.sh | 65 +++++++++++++++++++ 5 files changed, 134 insertions(+), 20 deletions(-) create mode 100644 tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.reference create mode 100755 tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.sh diff --git a/src/Common/Elf.cpp b/src/Common/Elf.cpp index 769bd5b9c9ec..d5ebc070592a 100644 --- a/src/Common/Elf.cpp +++ b/src/Common/Elf.cpp @@ -14,6 +14,13 @@ namespace ErrorCodes } +/// Whether [offset, offset + length) is within `total` bytes, computed so it can't overflow. +static bool rangeWithin(uint64_t offset, uint64_t length, uint64_t total) +{ + return offset <= total && length <= total - offset; +} + + Elf::Elf(const std::string & path_) { in.emplace(path_, 0); @@ -46,7 +53,7 @@ void Elf::init(const char * data, size_t size, const std::string & path_) if (!section_header_offset || !section_header_num_entries - || section_header_offset + section_header_num_entries * sizeof(ElfSectionHeader) > elf_size) + || !rangeWithin(section_header_offset, section_header_num_entries * sizeof(ElfSectionHeader), elf_size)) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' is truncated (section header points after end of file)", path); section_headers = reinterpret_cast(mapped + section_header_offset); @@ -61,10 +68,16 @@ void Elf::init(const char * data, size_t size, const std::string & path_) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' doesn't have string table with section names", path); uint64_t section_names_offset = section_names_strtab->header.offset; - if (section_names_offset >= elf_size) + uint64_t section_names_table_size = section_names_strtab->header.size; + if (!rangeWithin(section_names_offset, section_names_table_size, elf_size)) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' is truncated (section names string table points after end of file)", path); section_names = reinterpret_cast(mapped + section_names_offset); + section_names_size = section_names_table_size; + + /// Require the trailing NUL (guaranteed by the ELF spec) so name() can return C strings without re-scanning. + if (section_names_size == 0 || section_names[section_names_size - 1] != '\0') + throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' has a section names string table that is not zero-terminated", path); /// Get program headers @@ -73,7 +86,7 @@ void Elf::init(const char * data, size_t size, const std::string & path_) if (!program_header_offset || !program_header_num_entries - || program_header_offset + program_header_num_entries * sizeof(ElfProgramHeader) > elf_size) + || !rangeWithin(program_header_offset, program_header_num_entries * sizeof(ElfProgramHeader), elf_size)) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "The ELF '{}' is truncated (program header points after end of file)", path); program_headers = reinterpret_cast(mapped + program_header_offset); @@ -92,8 +105,8 @@ bool Elf::iterateSections(std::function elf_size) + /// Skip sections that span past the end of file. + if (!rangeWithin(section.header.offset, section.header.size, elf_size)) continue; if (pred(section, idx)) @@ -152,7 +165,11 @@ String Elf::getBuildID() const const ElfProgramHeader & phdr = program_headers[idx]; if (phdr.type == ProgramHeaderType::NOTE) + { + if (!rangeWithin(phdr.offset, phdr.filesz, elf_size)) + continue; return getBuildID(mapped + phdr.offset, phdr.filesz); + } } return {}; @@ -164,14 +181,22 @@ String Elf::getBuildID(const char * nhdr_pos, size_t size) while (nhdr_pos < nhdr_end) { + if (static_cast(nhdr_end - nhdr_pos) < sizeof(ElfNameHeader)) + break; + ElfNameHeader nhdr = unalignedLoad(nhdr_pos); + nhdr_pos += sizeof(ElfNameHeader); + + if (nhdr.namesz > static_cast(nhdr_end - nhdr_pos)) + break; + nhdr_pos += nhdr.namesz; + + if (nhdr.descsz > static_cast(nhdr_end - nhdr_pos)) + break; - nhdr_pos += sizeof(ElfNameHeader) + nhdr.namesz; if (nhdr.type == NameHeaderType::GNU_BUILD_ID) - { - const char * build_id = nhdr_pos; - return {build_id, nhdr.descsz}; - } + return {nhdr_pos, nhdr.descsz}; + nhdr_pos += nhdr.descsz; } @@ -192,7 +217,10 @@ const char * Elf::Section::name() const if (!elf.section_names) throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "Section names are not initialized"); - /// TODO buffer overflow is possible, we may need to check strlen. + /// init() verified the table ends with a NUL, so a forward scan from any in-bounds offset stays in-bounds. + if (header.name >= elf.section_names_size) + throw Exception(ErrorCodes::CANNOT_PARSE_ELF, "Section name offset is out of bounds"); + return elf.section_names + header.name; } diff --git a/src/Common/Elf.h b/src/Common/Elf.h index f9782c375dbc..743f00cb0c7d 100644 --- a/src/Common/Elf.h +++ b/src/Common/Elf.h @@ -163,6 +163,7 @@ class Elf final const ElfSectionHeader * section_headers; const ElfProgramHeader * program_headers; const char * section_names = nullptr; + size_t section_names_size = 0; // bytes available starting at `section_names`, for bounds checking void init(const char * data, size_t size, const std::string & path_); }; diff --git a/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp b/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp index c82984068b80..80cdee9a8be3 100644 --- a/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp @@ -782,8 +782,18 @@ Chunk DWARFBlockInputFormat::parseEntries(UnitState & unit) cols.push_back(std::exchange(col_linkage_name, nullptr)); break; case COL_DECL_FILE: - cols.push_back(ColumnLowCardinality::create(unit.filename_table, col_decl_file.detachPositions(), /*is_shared*/ true)); + { + /// A unit without DW_AT_stmt_list has no filename table; use a minimal dictionary instead of null. + ColumnPtr filename_table = unit.filename_table; + if (filename_table == nullptr) + { + auto dict = ColumnString::create(); + dict->insertDefault(); + filename_table = ColumnUnique::create(std::move(dict), /*is_nullable*/ false); + } + cols.push_back(ColumnLowCardinality::create(filename_table, col_decl_file.detachPositions(), /*is_shared*/ true)); break; + } case COL_DECL_LINE: cols.push_back(std::exchange(col_decl_line, nullptr)); break; @@ -855,10 +865,11 @@ uint64_t DWARFBlockInputFormat::fetchFromDebugAddr(uint64_t addr_base, uint64_t throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "Missing .debug_addr section."); if (addr_base == UINT64_MAX) throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "Missing DW_AT_addr_base"); + uint64_t section_size = debug_addr_section->size(); + if (addr_base > section_size || idx >= (section_size - addr_base) / 8) + throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, ".debug_addr offset out of bounds: addr_base {}, idx {} vs {}.", addr_base, idx, section_size); uint64_t offset = addr_base + idx * 8; - if (offset + 8 > debug_addr_section->size()) - throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, ".debug_addr offset out of bounds: {} vs {}.", offset, debug_addr_section->size()); - uint64_t res; + uint64_t res = 0; memcpy(&res, debug_addr_section->data() + offset, 8); return res; } @@ -896,14 +907,19 @@ void DWARFBlockInputFormat::parseRanges( if (unit.rnglists_base == UINT64_MAX) throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "Missing DW_AT_rnglists_base"); uint64_t entry_size = unit.dwarf_unit->getFormParams().getDwarfOffsetByteSize(); + uint64_t section_size = debug_rnglists_extractor->size(); + if (entry_size == 0 || unit.rnglists_base > section_size + || offset >= (section_size - unit.rnglists_base) / entry_size) + throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "DW_FORM_rnglistx offset out of bounds: rnglists_base {}, idx {} vs {}", unit.rnglists_base, offset, section_size); uint64_t lists_offset = unit.rnglists_base + offset * entry_size; - if (lists_offset + entry_size > debug_rnglists_extractor->size()) - throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "DW_FORM_rnglistx offset out of bounds: {} vs {}", lists_offset, debug_rnglists_extractor->size()); - offset = 0; - memcpy(&offset, debug_rnglists_extractor->getData().data() + lists_offset, entry_size); + uint64_t list_entry = 0; + memcpy(&list_entry, debug_rnglists_extractor->getData().data() + lists_offset, entry_size); - offset += unit.rnglists_base; + /// The offset read from the table is untrusted; the subtraction also stops rnglists_base + list_entry from wrapping. + if (list_entry > section_size - unit.rnglists_base) + throw Exception(ErrorCodes::CANNOT_PARSE_DWARF, "DW_FORM_rnglistx points out of bounds: rnglists_base {}, entry {} vs {}", unit.rnglists_base, list_entry, section_size); + offset = unit.rnglists_base + list_entry; } llvm::DWARFDebugRnglist list; diff --git a/tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.reference b/tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.reference new file mode 100644 index 000000000000..0d72c661a03d --- /dev/null +++ b/tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.reference @@ -0,0 +1,4 @@ +overflow_shoff: rejected +overflow_phoff: rejected +too_small: rejected +no_sections: rejected diff --git a/tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.sh b/tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.sh new file mode 100755 index 000000000000..116a1287b2f2 --- /dev/null +++ b/tests/queries/0_stateless/04340_malformed_elf_dwarf_bounds.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# Tags: no-fasttest, no-msan +# no-fasttest: the DWARF format requires the DWARF parser, which is not built in fasttest. +# no-msan: the DWARF input format is not built under MSan (LLVM, which the DWARF parser depends on, is excluded from MSan builds), so the format is unknown there. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +# Regression test for bounds checking in Common/Elf (used by the DWARF input format). +# Feed deliberately malformed ELF files to the DWARF format and check that each is rejected +# with a clean exception instead of reading out of bounds. The crafted offsets are close to +# UINT64_MAX so that the unchecked `offset + size` additions would overflow and pass naive +# bounds checks, leading to wild pointer dereferences. All these inputs are rejected during +# ELF header validation, before any DWARF parsing, so the test is sanitizer-safe. + +WORK_DIR="${CLICKHOUSE_TMP}/malformed_elf_$$" +mkdir -p "$WORK_DIR" + +python3 - "$WORK_DIR" <<'PY' +import struct, sys, os +work = sys.argv[1] + +def elf_header(shoff, shnum, phoff, phnum, shstrndx=0): + # 64-byte ELF64 header. + return (b'\x7fELF' + bytes(12) + + struct.pack('/dev/null 2>"${WORK_DIR}/err" + then + echo "${name}: UNEXPECTED SUCCESS" + elif grep -q "CANNOT_PARSE_ELF" "${WORK_DIR}/err" + then + echo "${name}: rejected" + else + echo "${name}: UNEXPECTED ERROR" + cat "${WORK_DIR}/err" + fi +done + +rm -rf "$WORK_DIR" From 0ceb8764bcc362386da884e47de37fe8c90c2cfb Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Tue, 23 Jun 2026 11:20:09 +0000 Subject: [PATCH 67/91] Backport #107341 to 25.8: Reject deeply nested input in formats to prevent stack overflow --- base/poco/JSON/include/Poco/JSON/ParserImpl.h | 4 + base/poco/JSON/src/ParserImpl.cpp | 17 +++- contrib/orc | 2 +- src/Formats/SchemaInferenceUtils.cpp | 20 ++++- .../Impl/BSONEachRowRowInputFormat.cpp | 37 ++++++-- .../Formats/Impl/BSONEachRowRowInputFormat.h | 4 +- .../Formats/Impl/MsgPackRowInputFormat.cpp | 33 +++++-- .../Formats/Impl/MsgPackRowInputFormat.h | 2 +- .../Impl/NativeORCBlockInputFormat.cpp | 48 ++++++++-- .../Formats/Impl/Parquet/Reader.cpp | 4 +- .../Formats/Impl/Parquet/SchemaConverter.cpp | 16 +++- .../Formats/Impl/Parquet/SchemaConverter.h | 3 + ..._schema_inference_deep_recursion.reference | 4 + ...msgpack_schema_inference_deep_recursion.sh | 70 +++++++++++++++ ..._schema_inference_deep_recursion.reference | 3 + ...36_bson_schema_inference_deep_recursion.sh | 84 ++++++++++++++++++ ..._schema_inference_deep_recursion.reference | 3 + ...337_orc_schema_inference_deep_recursion.sh | 75 ++++++++++++++++ ..._schema_inference_deep_recursion.reference | 2 + ...parquet_schema_inference_deep_recursion.sh | 88 +++++++++++++++++++ ..._schema_inference_deep_recursion.reference | 2 + ...39_json_schema_inference_deep_recursion.sh | 56 ++++++++++++ ...0_datalake_schema_deep_recursion.reference | 3 + .../04340_datalake_schema_deep_recursion.sh | 72 +++++++++++++++ ...c_explicit_schema_deep_recursion.reference | 2 + ...4341_orc_explicit_schema_deep_recursion.sh | 54 ++++++++++++ 26 files changed, 677 insertions(+), 31 deletions(-) create mode 100644 tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.reference create mode 100755 tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.sh create mode 100644 tests/queries/0_stateless/04336_bson_schema_inference_deep_recursion.reference create mode 100755 tests/queries/0_stateless/04336_bson_schema_inference_deep_recursion.sh create mode 100644 tests/queries/0_stateless/04337_orc_schema_inference_deep_recursion.reference create mode 100755 tests/queries/0_stateless/04337_orc_schema_inference_deep_recursion.sh create mode 100644 tests/queries/0_stateless/04338_parquet_schema_inference_deep_recursion.reference create mode 100755 tests/queries/0_stateless/04338_parquet_schema_inference_deep_recursion.sh create mode 100644 tests/queries/0_stateless/04339_json_schema_inference_deep_recursion.reference create mode 100755 tests/queries/0_stateless/04339_json_schema_inference_deep_recursion.sh create mode 100644 tests/queries/0_stateless/04340_datalake_schema_deep_recursion.reference create mode 100755 tests/queries/0_stateless/04340_datalake_schema_deep_recursion.sh create mode 100644 tests/queries/0_stateless/04341_orc_explicit_schema_deep_recursion.reference create mode 100755 tests/queries/0_stateless/04341_orc_explicit_schema_deep_recursion.sh diff --git a/base/poco/JSON/include/Poco/JSON/ParserImpl.h b/base/poco/JSON/include/Poco/JSON/ParserImpl.h index 7a8ea647180c..6cf2451f5129 100644 --- a/base/poco/JSON/include/Poco/JSON/ParserImpl.h +++ b/base/poco/JSON/include/Poco/JSON/ParserImpl.h @@ -43,6 +43,9 @@ namespace JSON static const std::size_t JSON_PARSE_BUFFER_SIZE = 4096; static const std::size_t JSON_PARSER_STACK_SIZE = 128; static const int JSON_UNLIMITED_DEPTH = -1; + /// Default nesting limit so that parsing untrusted JSON cannot overflow the native stack via + /// Poco's recursive descent. Far above any legitimate JSON; raise per-parser with setDepth. + static const int JSON_DEFAULT_DEPTH = 1000; ParserImpl(const Handler::Ptr & pHandler = new ParseHandler, std::size_t bufSize = JSON_PARSE_BUFFER_SIZE); /// Creates JSON ParserImpl, using the given Handler and buffer size. @@ -109,6 +112,7 @@ namespace JSON struct json_stream * _pJSON; Handler::Ptr _pHandler; int _depth; + int _currentDepth = 0; char _decimalPoint; bool _allowNullByte; bool _allowComments; diff --git a/base/poco/JSON/src/ParserImpl.cpp b/base/poco/JSON/src/ParserImpl.cpp index 07e9f0a256da..b47f5c2430f0 100644 --- a/base/poco/JSON/src/ParserImpl.cpp +++ b/base/poco/JSON/src/ParserImpl.cpp @@ -37,7 +37,7 @@ namespace JSON { ParserImpl::ParserImpl(const Handler::Ptr& pHandler, std::size_t bufSize): _pJSON(new json_stream), _pHandler(pHandler), - _depth(JSON_UNLIMITED_DEPTH), + _depth(JSON_DEFAULT_DEPTH), _decimalPoint('.'), _allowNullByte(true), _allowComments(false) @@ -53,6 +53,7 @@ ParserImpl::~ParserImpl() void ParserImpl::handle(const std::string& json) { + _currentDepth = 0; if (!_allowNullByte && json.find("\\u0000") != json.npos) throw JSONException("Null bytes in strings not allowed."); @@ -139,6 +140,12 @@ void ParserImpl::stripComments(std::string& json) void ParserImpl::handleArray() { + // Enforce the configured depth limit (set via setDepth) to avoid a native-stack + // overflow on deeply nested input. _depth == JSON_UNLIMITED_DEPTH (-1) means no limit. + if (_depth != JSON_UNLIMITED_DEPTH && _currentDepth >= _depth) + throw JSONException("Maximum allowed JSON depth exceeded"); + ++_currentDepth; + json_type tok = json_peek(_pJSON); while (tok != JSON_ARRAY_END && checkError()) { @@ -148,11 +155,17 @@ void ParserImpl::handleArray() if (tok == JSON_ARRAY_END) handle(); else throw JSONException("JSON array end not found"); + + --_currentDepth; } void ParserImpl::handleObject() { + if (_depth != JSON_UNLIMITED_DEPTH && _currentDepth >= _depth) + throw JSONException("Maximum allowed JSON depth exceeded"); + ++_currentDepth; + json_type tok = json_peek(_pJSON); while (tok != JSON_OBJECT_END && checkError()) { @@ -166,6 +179,8 @@ void ParserImpl::handleObject() if (tok == JSON_OBJECT_END) handle(); else throw JSONException("JSON object end not found"); + + --_currentDepth; } diff --git a/contrib/orc b/contrib/orc index 1892a6539e65..49e965750a94 160000 --- a/contrib/orc +++ b/contrib/orc @@ -1 +1 @@ -Subproject commit 1892a6539e655280d38a8d0669214dbb9b1d0919 +Subproject commit 49e965750a94627d0ce0a3f3c781423b982cbc1d diff --git a/src/Formats/SchemaInferenceUtils.cpp b/src/Formats/SchemaInferenceUtils.cpp index 837947997fb2..61af04526755 100644 --- a/src/Formats/SchemaInferenceUtils.cpp +++ b/src/Formats/SchemaInferenceUtils.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -1156,7 +1157,10 @@ namespace bool tryReadJSONObject(ReadBuffer & buf, const FormatSettings & settings, DataTypeJSONPaths::Paths & paths, const std::vector & path, JSONInferenceInfo * json_info, size_t depth) { - if (depth > settings.max_parser_depth) + /// max_parser_depth is the primary bound but user-tunable; keep a checkStackSize backstop. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + checkStackSize(); + if (settings.max_parser_depth != 0 && depth > settings.max_parser_depth) throw Exception(ErrorCodes::TOO_DEEP_RECURSION, "Maximum parse depth ({}) exceeded. Consider raising max_parser_depth setting.", settings.max_parser_depth); @@ -1335,7 +1339,11 @@ namespace template DataTypePtr tryInferDataTypeForSingleFieldImpl(ReadBuffer & buf, const FormatSettings & settings, JSONInferenceInfo * json_info, size_t depth) { - if (depth > settings.max_parser_depth) + /// The max_parser_depth limit below is the primary bound, but it is user-tunable; keep a + /// checkStackSize backstop so a raised limit cannot turn deep nesting into a stack overflow. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + checkStackSize(); + if (settings.max_parser_depth != 0 && depth > settings.max_parser_depth) throw Exception(ErrorCodes::TOO_DEEP_RECURSION, "Maximum parse depth ({}) exceeded. Consider raising max_parser_depth setting.", settings.max_parser_depth); @@ -1438,6 +1446,8 @@ void transformInferredJSONTypesFromDifferentFilesIfNeeded(DataTypePtr & first, D void transformFinalInferredJSONTypeIfNeededImpl(DataTypePtr & data_type, const FormatSettings & settings, JSONInferenceInfo * json_info, bool remain_nothing_types = false) { + checkStackSize(); + if (!data_type) return; @@ -1631,6 +1641,10 @@ DataTypePtr tryInferDataTypeForSingleJSONField(std::string_view field, const For DataTypePtr makeNullableRecursively(DataTypePtr type, const FormatSettings & settings) { + /// The inferred type tree can be arbitrarily deep (e.g. a deeply nested Array/Map/Tuple from a + /// crafted input). This walk runs after the per-format schema reader, so guard the native stack. + checkStackSize(); + if (!type) return nullptr; @@ -1722,6 +1736,8 @@ NamesAndTypesList getNamesAndRecursivelyNullableTypes(const Block & header, cons bool checkIfTypeIsComplete(const DataTypePtr & type) { + checkStackSize(); + if (!type) return false; diff --git a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp index 3f2750b98d00..fd92182cbf77 100644 --- a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp +++ b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.cpp @@ -1,5 +1,7 @@ #include +#include + #include #include #include @@ -39,6 +41,7 @@ namespace ErrorCodes extern const int TOO_LARGE_STRING_SIZE; extern const int UNKNOWN_TYPE; extern const int TYPE_MISMATCH; + extern const int TOO_DEEP_RECURSION; } namespace @@ -357,6 +360,11 @@ static void readAndInsertUUID(ReadBuffer & in, IColumn & column, BSONType bson_t void BSONEachRowRowInputFormat::readArray(IColumn & column, const DataTypePtr & data_type, BSONType bson_type) { + /// Nested Array/Tuple/Map recurse through readField; the depth is bounded by the declared column + /// type, but guard the native stack here (on container entry, not on every primitive field) + /// against a pathologically deep declared type. + checkStackSize(); + if (bson_type != BSONType::ARRAY) throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Cannot insert BSON {} into Array column", getBSONTypeName(bson_type)); @@ -384,6 +392,8 @@ void BSONEachRowRowInputFormat::readArray(IColumn & column, const DataTypePtr & void BSONEachRowRowInputFormat::readTuple(IColumn & column, const DataTypePtr & data_type, BSONType bson_type) { + checkStackSize(); + if (bson_type != BSONType::ARRAY && bson_type != BSONType::DOCUMENT) throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Cannot insert BSON {} into Tuple column", getBSONTypeName(bson_type)); @@ -451,6 +461,8 @@ void BSONEachRowRowInputFormat::readTuple(IColumn & column, const DataTypePtr & void BSONEachRowRowInputFormat::readMap(IColumn & column, const DataTypePtr & data_type, BSONType bson_type) { + checkStackSize(); + if (bson_type != BSONType::DOCUMENT) throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Cannot insert BSON {} into Map column", getBSONTypeName(bson_type)); @@ -866,7 +878,7 @@ BSONEachRowSchemaReader::BSONEachRowSchemaReader(ReadBuffer & in_, const FormatS { } -DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, bool allow_to_skip_unsupported_types, bool & skip) +DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, bool allow_to_skip_unsupported_types, bool & skip, size_t depth) { switch (type) { @@ -911,7 +923,7 @@ DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, boo } case BSONType::DOCUMENT: { - auto nested_names_and_types = getDataTypesFromBSONDocument(false); + auto nested_names_and_types = getDataTypesFromBSONDocument(false, depth + 1); auto nested_types = nested_names_and_types.getTypes(); bool types_are_equal = true; if (nested_types.empty() || !nested_types[0]) @@ -933,7 +945,7 @@ DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, boo } case BSONType::ARRAY: { - auto nested_types = getDataTypesFromBSONDocument(false).getTypes(); + auto nested_types = getDataTypesFromBSONDocument(false, depth + 1).getTypes(); bool types_are_equal = true; if (nested_types.empty() || !nested_types[0]) return nullptr; @@ -985,8 +997,21 @@ DataTypePtr BSONEachRowSchemaReader::getDataTypeFromBSONField(BSONType type, boo } } -NamesAndTypesList BSONEachRowSchemaReader::getDataTypesFromBSONDocument(bool allow_to_skip_unsupported_types) +NamesAndTypesList BSONEachRowSchemaReader::getDataTypesFromBSONDocument(bool allow_to_skip_unsupported_types, size_t depth) { + /// BSON documents and arrays can be nested arbitrarily deep. Reject deep nesting early (before + /// building the type) with an explicit limit, so inference stays cheap and interruptible instead + /// of overflowing the native stack in this recursive descent. checkStackSize is a last-resort + /// backstop for when max_parser_depth is raised above the default. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + if (format_settings.max_parser_depth != 0 && depth > format_settings.max_parser_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Too deep recursion while inferring the BSON schema: the nesting depth exceeds the limit ({}). " + "It can be raised with the setting 'max_parser_depth', but a very deep schema is rarely intentional", + format_settings.max_parser_depth); + checkStackSize(); + size_t document_start = in.count(); BSONSizeT document_size; readBinaryLittleEndian(document_size, in); @@ -997,7 +1022,7 @@ NamesAndTypesList BSONEachRowSchemaReader::getDataTypesFromBSONDocument(bool all String name; readNullTerminated(name, in); bool skip = false; - auto type = getDataTypeFromBSONField(bson_type, allow_to_skip_unsupported_types, skip); + auto type = getDataTypeFromBSONField(bson_type, allow_to_skip_unsupported_types, skip, depth); if (!skip) names_and_types.emplace_back(name, type); } @@ -1015,7 +1040,7 @@ NamesAndTypesList BSONEachRowSchemaReader::readRowAndGetNamesAndDataTypes(bool & return {}; } - return getDataTypesFromBSONDocument(format_settings.bson.skip_fields_with_unsupported_types_in_schema_inference); + return getDataTypesFromBSONDocument(format_settings.bson.skip_fields_with_unsupported_types_in_schema_inference, 1); } void BSONEachRowSchemaReader::transformTypesIfNeeded(DataTypePtr & type, DataTypePtr & new_type) diff --git a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h index 8eacbd47715d..7b67fbf188bc 100644 --- a/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h +++ b/src/Processors/Formats/Impl/BSONEachRowRowInputFormat.h @@ -108,8 +108,8 @@ class BSONEachRowSchemaReader : public IRowWithNamesSchemaReader NamesAndTypesList readRowAndGetNamesAndDataTypes(bool & eof) override; void transformTypesIfNeeded(DataTypePtr & type, DataTypePtr & new_type) override; - NamesAndTypesList getDataTypesFromBSONDocument(bool skip_unsupported_types); - DataTypePtr getDataTypeFromBSONField(BSONType type, bool skip_unsupported_types, bool & skip); + NamesAndTypesList getDataTypesFromBSONDocument(bool skip_unsupported_types, size_t depth); + DataTypePtr getDataTypeFromBSONField(BSONType type, bool skip_unsupported_types, bool & skip, size_t depth); }; } diff --git a/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp b/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp index 1f6c09212693..f6baf66463cf 100644 --- a/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp +++ b/src/Processors/Formats/Impl/MsgPackRowInputFormat.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -46,6 +47,7 @@ namespace ErrorCodes extern const int INCORRECT_DATA; extern const int BAD_ARGUMENTS; extern const int UNEXPECTED_END_OF_FILE; + extern const int TOO_DEEP_RECURSION; } MsgPackRowInputFormat::MsgPackRowInputFormat(SharedHeader header_, ReadBuffer & in_, Params params_, const FormatSettings & settings) @@ -601,8 +603,23 @@ msgpack::object_handle MsgPackSchemaReader::readObject() return object_handle; } -DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object) +DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object, size_t depth) { + /// MsgPack arrays and maps can be nested arbitrarily deep, and msgpack::unpack builds the + /// whole object tree iteratively (heap), so a deeply nested object would overflow the native + /// stack during this recursive descent. Reject deep nesting early (before building the type) + /// with an explicit limit: this keeps inference cheap and interruptible instead of walking and + /// allocating a pathologically deep type that later code (e.g. makeNullableRecursively) would + /// also recurse over. checkStackSize is a last-resort backstop if max_parser_depth is raised. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + if (format_settings.max_parser_depth != 0 && depth > format_settings.max_parser_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Too deep recursion while inferring the MsgPack schema: the nesting depth exceeds the limit ({}). " + "It can be raised with the setting 'max_parser_depth', but a very deep schema is rarely intentional", + format_settings.max_parser_depth); + checkStackSize(); + switch (object.type) { case msgpack::type::object_type::POSITIVE_INTEGER: [[fallthrough]]; @@ -628,12 +645,16 @@ DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object) bool nested_types_are_equal = true; for (size_t i = 0; i != object_array.size; ++i) { - auto nested_type = getDataType(object_array.ptr[i]); + auto nested_type = getDataType(object_array.ptr[i], depth + 1); if (!nested_type) return nullptr; + /// Compare only against the first element. Comparing the first element to itself is + /// pointless and would recurse through the whole (possibly deeply nested) type via + /// DataTypeArray::equals, which is itself unguarded recursion. + if (!nested_types.empty()) + nested_types_are_equal &= nested_type->equals(*nested_types[0]); nested_types.push_back(nested_type); - nested_types_are_equal &= nested_type->equals(*nested_types[0]); } if (nested_types_are_equal) @@ -646,8 +667,8 @@ DataTypePtr MsgPackSchemaReader::getDataType(const msgpack::object & object) msgpack::object_map object_map = object.via.map; if (object_map.size) { - auto key_type = removeNullable(getDataType(object_map.ptr[0].key)); - auto value_type = getDataType(object_map.ptr[0].val); + auto key_type = removeNullable(getDataType(object_map.ptr[0].key, depth + 1)); + auto value_type = getDataType(object_map.ptr[0].val, depth + 1); if (key_type && value_type) return std::make_shared(key_type, value_type); } @@ -675,7 +696,7 @@ std::optional MsgPackSchemaReader::readRowAndGetDataTypes() for (size_t i = 0; i != number_of_columns; ++i) { auto object_handle = readObject(); - data_types.push_back(getDataType(object_handle.get())); + data_types.push_back(getDataType(object_handle.get(), 1)); } return data_types; diff --git a/src/Processors/Formats/Impl/MsgPackRowInputFormat.h b/src/Processors/Formats/Impl/MsgPackRowInputFormat.h index f96bf336c523..be9dd30d6e8f 100644 --- a/src/Processors/Formats/Impl/MsgPackRowInputFormat.h +++ b/src/Processors/Formats/Impl/MsgPackRowInputFormat.h @@ -94,7 +94,7 @@ class MsgPackSchemaReader : public IRowSchemaReader private: msgpack::object_handle readObject(); - DataTypePtr getDataType(const msgpack::object & object); + DataTypePtr getDataType(const msgpack::object & object, size_t depth); std::optional readRowAndGetDataTypes() override; PeekableReadBuffer buf; diff --git a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp index 84ff91b9e3a9..8c20f170f367 100644 --- a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp @@ -1,6 +1,9 @@ #include #if USE_ORC + +#include +#include #include #include #include @@ -88,6 +91,7 @@ extern const int VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE; extern const int THERE_IS_NO_COLUMN; extern const int INCORRECT_DATA; extern const int ARGUMENT_OUT_OF_BOUND; +extern const int TOO_DEEP_RECURSION; } @@ -209,10 +213,25 @@ static DataTypePtr parseORCType( bool skip_columns_with_unsupported_types, bool dictionary_as_low_cardinality, const orc::StripeInformation * stripe_info, - bool & skipped) + bool & skipped, + size_t max_depth = DBMS_DEFAULT_MAX_PARSER_DEPTH, + size_t depth = 0) { assert(orc_type != nullptr); + /// ORC LIST/MAP/STRUCT types can be nested arbitrarily deep and the ORC library does not bound + /// the nesting, so reject deep nesting early (before building the type) with an explicit limit. + /// This keeps schema inference cheap and interruptible instead of recursing over (and later + /// walking) a pathologically deep type. checkStackSize is a last-resort backstop. + /// max_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. + if (max_depth != 0 && depth > max_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Too deep recursion while parsing the ORC schema: the nesting depth exceeds the limit ({}). " + "It can be raised with the setting 'max_parser_depth', but a very deep schema is rarely intentional", + max_depth); + checkStackSize(); + const int subtype_count = static_cast(orc_type->getSubtypeCount()); switch (orc_type->getKind()) { @@ -267,7 +286,7 @@ static DataTypePtr parseORCType( throw Exception(ErrorCodes::LOGICAL_ERROR, "Invalid Orc List type {}", orc_type->toString()); DataTypePtr nested_type = parseORCType( - orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; @@ -278,12 +297,12 @@ static DataTypePtr parseORCType( throw Exception(ErrorCodes::LOGICAL_ERROR, "Invalid Orc Map type {}", orc_type->toString()); DataTypePtr key_type = parseORCType( - orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(0), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; DataTypePtr value_type = parseORCType( - orc_type->getSubtype(1), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(1), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; @@ -298,7 +317,7 @@ static DataTypePtr parseORCType( for (size_t i = 0; i < orc_type->getSubtypeCount(); ++i) { auto parsed_type = parseORCType( - orc_type->getSubtype(i), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped); + orc_type->getSubtype(i), skip_columns_with_unsupported_types, dictionary_as_low_cardinality, stripe_info, skipped, max_depth, depth + 1); if (skipped) return {}; @@ -600,7 +619,7 @@ static void buildORCSearchArgumentImpl( /// For queries with where condition like "a > 10", if a column contains negative values such as "-1", pushing or not pushing /// down filters would result in different outputs. bool skipped = false; - auto expect_type = makeNullableRecursively(parseORCType(orc_type, true, false, nullptr, skipped), format_settings); + auto expect_type = makeNullableRecursively(parseORCType(orc_type, true, false, nullptr, skipped, format_settings.max_parser_depth), format_settings); const ColumnWithTypeAndName * column = header.findByName(column_name, format_settings.orc.case_insensitive_column_matching); if (!expect_type || !column) { @@ -829,6 +848,11 @@ static void getFileReader( static const orc::Type * traverseDownORCTypeByName(const std::string & target, const orc::Type * orc_type, DataTypePtr & type, bool ignore_case) { + /// Recurses the file-controlled ORC type tree. The matching CH type (and the requested column + /// name) bound the depth in practice, but keep a stack backstop here too, since this runs in + /// prepareFileReader before the readColumnFromORCColumn guard is reached. + checkStackSize(); + if (target.empty()) return orc_type; @@ -883,6 +907,11 @@ traverseDownORCTypeByName(const std::string & target, const orc::Type * orc_type static void updateIncludeTypeIds(DataTypePtr type, const orc::Type * orc_type, bool ignore_case, std::unordered_set & include_typeids) { + /// Recurses the file-controlled ORC type tree in lockstep with the (parser-bounded) CH type. + /// Keep a stack backstop here too: this runs in prepareFileReader, before the + /// readColumnFromORCColumn guard is reached, also for explicit-schema reads. + checkStackSize(); + /// For primitive types, directly append column id into result if (orc_type->getSubtypeCount() == 0) { @@ -1198,7 +1227,8 @@ NamesAndTypesList NativeORCSchemaReader::readSchema() format_settings.orc.skip_columns_with_unsupported_types_in_schema_inference, format_settings.orc.dictionary_as_low_cardinality, stripe_info.get(), - skipped); + skipped, + format_settings.max_parser_depth); if (!skipped) header.insert(ColumnWithTypeAndName{type, name}); } @@ -1732,6 +1762,10 @@ ColumnWithTypeAndName ORCColumnToCHColumn::readColumnFromORCColumn( bool inside_nullable, DataTypePtr type_hint) const { + /// Reading a nested LIST/MAP/STRUCT recurses through this function over the ORC type tree, whose + /// depth is attacker-controlled, so guard the native stack on the data-read path as well. + checkStackSize(); + bool skipped = false; if (!inside_nullable && (orc_column->hasNulls || (type_hint && type_hint->isNullable())) && !orc_column->isEncoded diff --git a/src/Processors/Formats/Impl/Parquet/Reader.cpp b/src/Processors/Formats/Impl/Parquet/Reader.cpp index 764eb2ca4406..de905b612fc0 100644 --- a/src/Processors/Formats/Impl/Parquet/Reader.cpp +++ b/src/Processors/Formats/Impl/Parquet/Reader.cpp @@ -1914,8 +1914,8 @@ void Reader::decompressPageIfCompressed(PageState & page) MutableColumnPtr Reader::formOutputColumn(RowSubgroup & row_subgroup, size_t output_column_idx, size_t num_rows) { - /// Recurses over nested output types; bound the depth so a deeply nested schema cannot - /// overflow the stack. + /// Recurses over the nested output column tree, whose depth is bounded by SchemaConverter's + /// recursion limit; guard the native stack here too as defense in depth. checkStackSize(); const OutputColumnInfo & output_info = output_columns.at(output_column_idx); diff --git a/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp b/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp index 1890e008c4fb..67ffd2f9b346 100644 --- a/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp +++ b/src/Processors/Formats/Impl/Parquet/SchemaConverter.cpp @@ -122,10 +122,20 @@ NamesAndTypesList SchemaConverter::inferSchema() std::optional SchemaConverter::processSubtree(String name, bool requested, DataTypePtr type_hint, SchemaContext schema_context) { - /// A deeply nested schema (e.g. a long chain of REQUIRED groups) recurses here per level. - /// The definition-level cap below only counts OPTIONAL/REPEATED nesting, so without this an - /// untrusted file could overflow the stack (uncatchable crash) instead of throwing. + /// Reject deeply nested schemas before recursing. The def-level guard below (def == UINT8_MAX) + /// only counts OPTIONAL/REPEATED nodes, so a chain of REQUIRED groups would bypass it and + /// overflow the native stack. Track the real recursion depth unconditionally and reject early; + /// checkStackSize is a last-resort backstop if max_parser_depth is raised. + /// max_parser_depth == 0 means unlimited (matching the SQL parser), leaving only checkStackSize. checkStackSize(); + ++recursion_depth; + SCOPE_EXIT({ --recursion_depth; }); + if (options.format.max_parser_depth != 0 && recursion_depth > options.format.max_parser_depth) + throw Exception( + ErrorCodes::TOO_DEEP_RECURSION, + "Parquet schema is nested deeper than the limit ({}). It can be raised with the setting " + "'max_parser_depth', but a very deeply nested schema is rarely intentional", + options.format.max_parser_depth); if (type_hint) chassert(requested); diff --git a/src/Processors/Formats/Impl/Parquet/SchemaConverter.h b/src/Processors/Formats/Impl/Parquet/SchemaConverter.h index eb8bf807b350..ef42feb89cca 100644 --- a/src/Processors/Formats/Impl/Parquet/SchemaConverter.h +++ b/src/Processors/Formats/Impl/Parquet/SchemaConverter.h @@ -24,6 +24,9 @@ struct SchemaConverter size_t schema_idx = 1; size_t primitive_column_idx = 0; std::vector levels; + /// Actual recursion depth of processSubtree. Tracked unconditionally because the def-level + /// counter only advances for OPTIONAL/REPEATED nodes, so REQUIRED-group nesting would bypass it. + size_t recursion_depth = 0; std::unordered_map geo_columns; diff --git a/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.reference b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.reference new file mode 100644 index 000000000000..292b253eee30 --- /dev/null +++ b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.reference @@ -0,0 +1,4 @@ +explicit_limit: TOO_DEEP_RECURSION +stack_backstop: TOO_DEEP_RECURSION +multirow_merge: TOO_DEEP_RECURSION +unlimited_depth: accepted diff --git a/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.sh b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.sh new file mode 100755 index 000000000000..baf0909870d4 --- /dev/null +++ b/tests/queries/0_stateless/04335_msgpack_schema_inference_deep_recursion.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Regression test: MsgPack schema inference recursed over nested arrays/maps without a depth limit. +# msgpack::unpack builds the whole object tree iteratively (on the heap), so a tiny, deeply nested +# object overflowed the native stack and crashed the process - both in MsgPackSchemaReader::getDataType +# and, for moderate depths that slipped past it, in the shared makeNullableRecursively walk over the +# inferred type. Nesting must now be rejected as TOO_DEEP_RECURSION, never crash. + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CUR_DIR"/../shell_config.sh + +TMP_DIR="${CLICKHOUSE_TMP}/${CLICKHOUSE_TEST_UNIQUE_NAME}" +mkdir -p "$TMP_DIR" +trap 'rm -rf "$TMP_DIR"' EXIT + +# Reads a query's combined output from stdin. If it contains $2, print a stable "