From 48a6d17fa8383d01a66a35e3f704680d79077443 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Mon, 16 Jan 2023 19:08:01 +0800 Subject: [PATCH] feat: try lambda in ShortCode tiny codec --- src/main.cc | 77 +- src/short_code/convert.cc | 163 +++-- src/short_code/data_loader.cc | 2 +- src/short_code/short_code_mark.h | 1181 ------------------------------ 4 files changed, 96 insertions(+), 1327 deletions(-) delete mode 100644 src/short_code/short_code_mark.h diff --git a/src/main.cc b/src/main.cc index ebfd555..3b46dc2 100644 --- a/src/main.cc +++ b/src/main.cc @@ -178,13 +178,13 @@ int main() { // AllCases::build(); BasicRanges::build(); - std::vector all_cases; - for (uint64_t head = 0; head < 16; ++head) { - for (const auto &range : AllCases::fetch()[head]) { - all_cases.emplace_back(head << 32 | range); - } - } - std::cout << "test data size: " << all_cases.size() << std::endl; +// std::vector all_cases; +// for (uint64_t head = 0; head < 16; ++head) { +// for (const auto &range : AllCases::fetch()[head]) { +// all_cases.emplace_back(head << 32 | range); +// } +// } +// std::cout << "test data size: " << all_cases.size() << std::endl; // std::cout << "start benchmark" << std::endl; auto start_time = clock(); @@ -271,67 +271,12 @@ int main() { // } // } -// for (uint32_t i = 0; i < 29334498; ++i) { -// if (ShortCode::fast_encode(ShortCode::fast_decode(i)) != i) { -// std::cout << "error" << std::endl; -// } -// ShortCode::fast_encode_legacy(i); -// ShortCode::fast_decode(i); -// ShortCode::fast_encode(all_cases[i]); -// } - -// for (uint32_t i = 1000000; i < 1100000; ++i) { -// ShortCode::tiny_decode(i); -// ShortCode::tiny_decode_10b(i); -// ShortCode::tiny_encode(all_cases[i]); -// ShortCode::tiny_encode_10b(all_cases[i]); -// } - + for (uint32_t i = 1000000; i < 1010000; ++i) { + ShortCode::tiny_decode(i); + } // printf("%09lX\n", ShortCode::tiny_decode(14323231)); -// std::cout << ShortCode::tiny_encode_demo(0x6EC0F8800) << std::endl; - -// printf("%09lX\n", ShortCode::tiny_decode_10b(14323231)); -// std::cout << ShortCode::tiny_encode_10b(0x6EC0F8800) << std::endl; - -// auto br = BasicRanges::fetch(); -// for (auto &range : br) { -// range = Common::range_reverse(range); -// } - /// 1017983: 0FFFFFFF - /// 1017984: 10000000 - /// 1017985: 1000000C -// int sum = 0; -// printf(" "); -// for (uint32_t prefix = 0; prefix < 0x400; ++prefix) { -// printf("%7td, ", std::lower_bound(br.begin(), br.end(), prefix << 22) - br.begin()); -// if (sum++ % 8 == 7) { -// printf("\n "); -// } -// } - -// const uint32_t TEST[3][4] = { -// {1,1,1,1}, {2,2,}, {3,3,3,} -// }; -// for (auto &x : TEST) { -// for (auto &y: x) { -// std::cout << y << std::endl; -// } -// } - -// int sum = 0; -// for (int head = 0; head < 16; ++head) { -// auto &a = AllCases::fetch()[head]; -// printf("\n/// --------------------------------- 0x%X ---------------------------------\n ", head); -// printf("\n/// --------------------------------------------------------------------- 0x%X ---------------------------------------------------------------------\n ", head); -// for (uint32_t prefix = 0; prefix < 0x1000; ++prefix) { -// printf("%7td, ", std::lower_bound(a.begin(), a.end(), prefix << 20) - a.begin()); -// if (sum++ % 16 == 15 and prefix != 0xFFF) { -// printf("\n "); -// } -// } -// } -// printf("\n"); +// std::cout << ShortCode::tiny_encode(0x6EC0F8800) << std::endl; // printf("%09lX\n", ShortCode::fast_decode(14323231)); // std::cout << ShortCode::fast_encode(0x6EC0F8800) << std::endl; diff --git a/src/short_code/convert.cc b/src/short_code/convert.cc index b48cd5e..11759fd 100644 --- a/src/short_code/convert.cc +++ b/src/short_code/convert.cc @@ -1,9 +1,13 @@ #include +#include #include "common.h" #include "short_code.h" #include "basic_ranges.h" -//#include "short_code_mark.h" +#include "all_cases.h" +#include "all_cases_offset.h" +#include "basic_ranges_offset.h" +#include "range_prefix_offset.h" CommonCode ShortCode::to_common_code() const { // convert to common code if (ShortCode::check_mode() == ShortCode::NORMAL) { @@ -20,12 +24,7 @@ ShortCode::ShortCode(const CommonCode &common_code) { // convert from common cod } } -#include "all_cases.h" -#include "all_cases_offset.h" -#include "basic_ranges_offset.h" -#include "range_prefix_offset.h" - -uint64_t ShortCode::fast_decode(uint32_t short_code) { // short code => common code +uint64_t ShortCode::fast_decode(uint32_t short_code) { // short code --> common code auto offset = std::upper_bound( // using binary search ALL_CASES_OFFSET, ALL_CASES_OFFSET + 16, short_code ) - 1; @@ -33,114 +32,120 @@ uint64_t ShortCode::fast_decode(uint32_t short_code) { // short code => common c return (head << 32) | AllCases::fetch()[head][short_code - *offset]; // release common code } -uint32_t ShortCode::fast_encode(uint64_t common_code) { // common code => short code +uint32_t ShortCode::fast_encode(uint64_t common_code) { // common code --> short code auto head = common_code >> 32; // head index const auto &ranges = AllCases::fetch()[head]; // available ranges auto offset = std::lower_bound(ranges.begin(), ranges.end(), (uint32_t)common_code) - ranges.begin(); return ALL_CASES_OFFSET[head] + offset; // release short code } -/// ensure that input common code is valid -//uint32_t ShortCode::tiny_encode(uint64_t common_code) { // common_code --low-memory--> short_code -// uint32_t offset = 0; -// uint32_t head = common_code >> 32; // common code head -// uint32_t prefix = (common_code >> 24) & 0xFF; // common code range prefix -// auto target = Common::range_reverse((uint32_t)common_code); // target range -// -// for (int index = 0; index < BASIC_RANGES_INDEX[prefix]; ++index) { // traverse basic ranges -// uint32_t range = BasicRanges::fetch()[index + BASIC_RANGES_OFFSET[prefix]]; -// if (range == target) { -// break; // found target range -// } -// if (Common::check_case(head, range)) { // search for valid cases -// ++offset; // record sub offset -// } -// } -// return ALL_CASES_OFFSET[head] + RANGE_PREFIX_OFFSET[head][prefix] + offset; -//} - -/// ensure that input short code is valid -//uint64_t ShortCode::tiny_decode(uint32_t short_code) { // short_code --low-memory--> common_code -// uint32_t head = 0, prefix = 0; -// for (; head < 16; ++head) { -// if (short_code < ALL_CASES_INDEX[head]) { // match head -// break; -// } -// short_code -= ALL_CASES_INDEX[head]; // short code approximate -// } -// for (; prefix < 256; ++prefix) { -// if (short_code < RANGE_PREFIX_INDEX[head][prefix]) { // match range prefix -// break; -// } -// short_code -= RANGE_PREFIX_INDEX[head][prefix]; // short code approximate -// } -// -// uint32_t range; -// for (int index = 0; index < BASIC_RANGES_INDEX[prefix]; ++index) { // traverse basic ranges -// range = BasicRanges::fetch()[index + BASIC_RANGES_OFFSET[prefix]]; -// if (Common::check_case(head, range)) { // search for valid cases -// if (short_code == 0) { -// break; // found target range -// } -// --short_code; // short code approximate -// } -// } -// return (uint64_t)head << 32 | Common::range_reverse(range); // release common code -//} +void run(uint32_t head, uint32_t prefix, const std::function& f) { + + + const auto &basic_ranges = BasicRanges::fetch(); + for (auto index = BASIC_RANGES_OFFSET[prefix]; index < basic_ranges.size(); ++index) { + + auto broken_offset = Common::check_range(head, basic_ranges[index]); + if (broken_offset) { // case invalid + auto delta = (uint32_t)1 << (32 - broken_offset * 2); // delta to next possible range + /// !! -> broken + /// ( xx xx xx ) xx xx xx ... (reversed range) + /// +1 00 00 00 ... (delta) + auto next_min = (Common::range_reverse(basic_ranges[index]) & ~(delta - 1)) + delta; + while (Common::range_reverse(basic_ranges[++index]) < next_min); // located next range + --index; + } else { + + if (f(basic_ranges[index])) { + +// printf("ret -> %09lX\n", (uint64_t)head << 32 | Common::range_reverse(basic_ranges[index])); -// TODO: try to using 10-bits range prefix -> less static data + return; + } + } + + + } +} + +#include -uint64_t ShortCode::tiny_decode(uint32_t short_code) { +/// NOTE: ensure that input short code is valid +uint64_t ShortCode::tiny_decode(uint32_t short_code) { // short code --> common code /// match head index auto offset = std::upper_bound( // binary search - ALL_CASES_OFFSET, ALL_CASES_OFFSET + 16, short_code + ALL_CASES_OFFSET, ALL_CASES_OFFSET + 16, short_code ) - 1; uint64_t head = offset - ALL_CASES_OFFSET; // head index short_code -= *offset; /// match range prefix offset = std::upper_bound( // binary search - RANGE_PREFIX_OFFSET[head], RANGE_PREFIX_OFFSET[head] + 4096, short_code + RANGE_PREFIX_OFFSET[head], RANGE_PREFIX_OFFSET[head] + 4096, short_code ) - 1; uint32_t prefix = offset - RANGE_PREFIX_OFFSET[head]; // range prefix short_code -= *offset; /// search target range - const auto &basic_ranges = BasicRanges::fetch(); - for (auto index = BASIC_RANGES_OFFSET[prefix]; index < basic_ranges.size(); ++index) { - - uint32_t range = basic_ranges[index]; // traverse basic ranges +// const auto &basic_ranges = BasicRanges::fetch(); +// for (auto index = BASIC_RANGES_OFFSET[prefix]; index < basic_ranges.size(); ++index) { +// +// auto broken_offset = Common::check_range(head, basic_ranges[index]); +// if (broken_offset) { // case invalid +// auto delta = (uint32_t)1 << (32 - broken_offset * 2); // delta to next possible range +// /// !! -> broken +// /// ( xx xx xx ) xx xx xx ... (reversed range) +// /// +1 00 00 00 ... (delta) +// auto next_min = (Common::range_reverse(basic_ranges[index]) & ~(delta - 1)) + delta; +// while (Common::range_reverse(basic_ranges[++index]) < next_min); // located next range +// --index; +// } else { +// +// if (!short_code--) { // short code approximate +// +// /// found target range +// return head << 32 | Common::range_reverse(basic_ranges[index]); +// +// } +// +// } +// +// +// } - uint32_t broken = Common::check_range(head, basic_ranges[index]); // check and get broken address +// std::cout << "short code = " << short_code << std::endl; +// return 0; - auto range_rev = Common::range_reverse(basic_ranges[index]); // reversed range + uint32_t range; - if (broken) { // invalid case - auto delta = (uint32_t)1 << (32 - broken * 2); // this --delta--> next possible range - auto next_min = (range_rev & ~(delta - 1)) + delta; - while (Common::range_reverse(basic_ranges[++index]) < next_min); // located next range - --index; - } else { + auto lambda = [&short_code, &range](uint32_t dat) -> bool { - if (!short_code--) { // short code approximate +// return (!short_code--); +// std::cout << "short code = " << short_code << std::endl; + if (!short_code--) { // short code approximate +// std::cout << "short code reach 0" << std::endl; + range = dat; + return true; /// found target range - return head << 32 | range_rev; - - } +// return head << 32 | Common::range_reverse(basic_ranges[index]); } + return false; + }; + run(head, prefix, lambda); + + return (uint64_t)head << 32 | Common::range_reverse(range); + printf("ret -> %09lX\n", (uint64_t)head << 32 | Common::range_reverse(range)); - } printf("error\n"); return 0; // never reach when input valid } -#include - -uint32_t ShortCode::tiny_encode(uint64_t common_code) { +/// NOTE: ensure that input common code is valid +uint32_t ShortCode::tiny_encode(uint64_t common_code) { // common code --> short code diff --git a/src/short_code/data_loader.cc b/src/short_code/data_loader.cc index 679b853..382f54e 100644 --- a/src/short_code/data_loader.cc +++ b/src/short_code/data_loader.cc @@ -1,7 +1,7 @@ #include "all_cases.h" #include "short_code.h" #include "basic_ranges.h" -#include "short_code_mark.h" +//#include "short_code_mark.h" //std::mutex ShortCode::map_building; bool ShortCode::fast_mode_available = false; diff --git a/src/short_code/short_code_mark.h b/src/short_code/short_code_mark.h deleted file mode 100644 index fd51b07..0000000 --- a/src/short_code/short_code_mark.h +++ /dev/null @@ -1,1181 +0,0 @@ -#pragma once - -#include - -//const uint32_t ALL_CASES_INDEX[16] = { -// 2942906, 2260392, 2942906, 0, -// 2322050, 1876945, 2322050, 0, -// 2322050, 1876945, 2322050, 0, -// 2942906, 2260392, 2942906, 0, -//}; - -//const uint32_t ALL_CASES_OFFSET[16] = { -// 0, 2942906, 5203298, 8146204, -// 8146204, 10468254, 12345199, 14667249, -// 14667249, 16989299, 18866244, 21188294, -// 21188294, 24131200, 26391592, 29334498, -//}; - -//const uint32_t BASIC_RANGES_INDEX[256] = { -// 136384, 49920, 49920, 136384, 49920, 18272, 18272, 49920, -// 49920, 18272, 18272, 49920, 136384, 49920, 49920, 136384, -// 49920, 18272, 18272, 49920, 18272, 6347, 6347, 17589, -// 18272, 6347, 6347, 17589, 49920, 17589, 17589, 48555, -// 49920, 18272, 18272, 49920, 18272, 6347, 6347, 17589, -// 18272, 6347, 6347, 17589, 49920, 17589, 17589, 48555, -// 136384, 49920, 49920, 136384, 49920, 17589, 17589, 48555, -// 49920, 17589, 17589, 48555, 136384, 48555, 48555, 133653, -// 49920, 18272, 18272, 49920, 18272, 6347, 6347, 17589, -// 18272, 6347, 6347, 17589, 49920, 17589, 17589, 48555, -// 18272, 6347, 6347, 17589, 6347, 1785, 1785, 5246, -// 6347, 1785, 1785, 5246, 17589, 5246, 5246, 15163, -// 18272, 6347, 6347, 17589, 6347, 1785, 1785, 5246, -// 6347, 1785, 1785, 5246, 17589, 5246, 5246, 15163, -// 49920, 17589, 17589, 48555, 17589, 5246, 5246, 15163, -// 17589, 5246, 5246, 15163, 48555, 15163, 15163, 43244, -// 49920, 18272, 18272, 49920, 18272, 6347, 6347, 17589, -// 18272, 6347, 6347, 17589, 49920, 17589, 17589, 48555, -// 18272, 6347, 6347, 17589, 6347, 1785, 1785, 5246, -// 6347, 1785, 1785, 5246, 17589, 5246, 5246, 15163, -// 18272, 6347, 6347, 17589, 6347, 1785, 1785, 5246, -// 6347, 1785, 1785, 5246, 17589, 5246, 5246, 15163, -// 49920, 17589, 17589, 48555, 17589, 5246, 5246, 15163, -// 17589, 5246, 5246, 15163, 48555, 15163, 15163, 43244, -// 136384, 49920, 49920, 136384, 49920, 17589, 17589, 48555, -// 49920, 17589, 17589, 48555, 136384, 48555, 48555, 133653, -// 49920, 17589, 17589, 48555, 17589, 5246, 5246, 15163, -// 17589, 5246, 5246, 15163, 48555, 15163, 15163, 43244, -// 49920, 17589, 17589, 48555, 17589, 5246, 5246, 15163, -// 17589, 5246, 5246, 15163, 48555, 15163, 15163, 43244, -// 136384, 48555, 48555, 133653, 48555, 15163, 15163, 43244, -// 48555, 15163, 15163, 43244, 133653, 43244, 43244, 122125, -//}; - -const uint32_t BASIC_RANGES_OFFSET_8bits[256] = { - 0, 136384, 186304, 236224, 372608, 422528, 440800, 459072, - 508992, 558912, 577184, 595456, 645376, 781760, 831680, 881600, - 1017984, 1067904, 1086176, 1104448, 1154368, 1172640, 1178987, 1185334, - 1202923, 1221195, 1227542, 1233889, 1251478, 1301398, 1318987, 1336576, - 1385131, 1435051, 1453323, 1471595, 1521515, 1539787, 1546134, 1552481, - 1570070, 1588342, 1594689, 1601036, 1618625, 1668545, 1686134, 1703723, - 1752278, 1888662, 1938582, 1988502, 2124886, 2174806, 2192395, 2209984, - 2258539, 2308459, 2326048, 2343637, 2392192, 2528576, 2577131, 2625686, - 2759339, 2809259, 2827531, 2845803, 2895723, 2913995, 2920342, 2926689, - 2944278, 2962550, 2968897, 2975244, 2992833, 3042753, 3060342, 3077931, - 3126486, 3144758, 3151105, 3157452, 3175041, 3181388, 3183173, 3184958, - 3190204, 3196551, 3198336, 3200121, 3205367, 3222956, 3228202, 3233448, - 3248611, 3266883, 3273230, 3279577, 3297166, 3303513, 3305298, 3307083, - 3312329, 3318676, 3320461, 3322246, 3327492, 3345081, 3350327, 3355573, - 3370736, 3420656, 3438245, 3455834, 3504389, 3521978, 3527224, 3532470, - 3547633, 3565222, 3570468, 3575714, 3590877, 3639432, 3654595, 3669758, - 3713002, 3762922, 3781194, 3799466, 3849386, 3867658, 3874005, 3880352, - 3897941, 3916213, 3922560, 3928907, 3946496, 3996416, 4014005, 4031594, - 4080149, 4098421, 4104768, 4111115, 4128704, 4135051, 4136836, 4138621, - 4143867, 4150214, 4151999, 4153784, 4159030, 4176619, 4181865, 4187111, - 4202274, 4220546, 4226893, 4233240, 4250829, 4257176, 4258961, 4260746, - 4265992, 4272339, 4274124, 4275909, 4281155, 4298744, 4303990, 4309236, - 4324399, 4374319, 4391908, 4409497, 4458052, 4475641, 4480887, 4486133, - 4501296, 4518885, 4524131, 4529377, 4544540, 4593095, 4608258, 4623421, - 4666665, 4803049, 4852969, 4902889, 5039273, 5089193, 5106782, 5124371, - 5172926, 5222846, 5240435, 5258024, 5306579, 5442963, 5491518, 5540073, - 5673726, 5723646, 5741235, 5758824, 5807379, 5824968, 5830214, 5835460, - 5850623, 5868212, 5873458, 5878704, 5893867, 5942422, 5957585, 5972748, - 6015992, 6065912, 6083501, 6101090, 6149645, 6167234, 6172480, 6177726, - 6192889, 6210478, 6215724, 6220970, 6236133, 6284688, 6299851, 6315014, - 6358258, 6494642, 6543197, 6591752, 6725405, 6773960, 6789123, 6804286, - 6847530, 6896085, 6911248, 6926411, 6969655, 7103308, 7146552, 7189796, -}; - -const uint32_t RANGE_PREFIX_INDEX[16][256] = { - { - 70039, 0, 25594, 70039, 25594, 9527, 9324, 25594, - 22458, 0, 9527, 22458, 70039, 0, 25594, 70039, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 8028, 3361, 2867, 7887, 25594, 9309, 9126, 25187, - 70039, 0, 25594, 70039, 25594, 9309, 9126, 25187, - 22458, 0, 9309, 22143, 70039, 0, 25187, 69216, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 9386, 3308, 3316, 9177, 25594, 9309, 9126, 25187, - 9527, 3361, 2990, 9309, 3361, 1162, 926, 2952, - 3307, 1016, 1031, 2914, 9309, 2952, 2644, 8401, - 8028, 3361, 2867, 7887, 0, 0, 0, 0, - 3308, 1162, 1017, 2914, 7887, 2952, 2560, 7225, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 9177, 2914, 2918, 8297, 25187, 8401, 8268, 23306, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 9386, 3308, 3316, 9177, 25594, 9309, 9126, 25187, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 9527, 3361, 2990, 9309, 3361, 1162, 926, 2952, - 3307, 1016, 1031, 2914, 9309, 2952, 2644, 8401, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 9177, 2914, 2918, 8297, 25187, 8401, 8268, 23306, - 70039, 0, 25594, 70039, 25594, 9309, 9126, 25187, - 22458, 0, 9309, 22143, 70039, 0, 25187, 69216, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 7887, 2952, 2560, 7225, 25187, 8401, 8268, 23306, - 70039, 0, 25187, 69216, 25187, 8401, 8268, 23306, - 22143, 0, 8401, 20624, 69216, 0, 23306, 65162, - }, - { - 70039, 0, 25594, 70039, 0, 0, 0, 0, - 25594, 0, 9386, 25594, 70039, 0, 25594, 70039, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 9527, 3361, 2990, 9309, 25594, 9309, 9126, 25187, - 70039, 0, 25594, 70039, 0, 0, 0, 0, - 25594, 0, 9177, 25187, 70039, 0, 25187, 69216, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 9386, 3308, 3316, 9177, 25594, 9309, 9126, 25187, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 9527, 3361, 2990, 9309, 3361, 1162, 926, 2952, - 3307, 1016, 1031, 2914, 9309, 2952, 2644, 8401, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 9177, 2914, 2918, 8297, 25187, 8401, 8268, 23306, - 70039, 0, 25594, 70039, 0, 0, 0, 0, - 25594, 0, 9177, 25187, 70039, 0, 25187, 69216, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 9309, 2952, 2644, 8401, 25187, 8401, 8268, 23306, - 70039, 0, 25187, 69216, 0, 0, 0, 0, - 25187, 0, 8297, 23306, 69216, 0, 23306, 65162, - }, - { - 70039, 0, 22458, 70039, 25594, 9527, 9324, 25594, - 25594, 0, 9527, 25594, 70039, 0, 22458, 70039, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 9527, 3361, 2990, 9309, 25594, 9309, 9126, 25187, - 70039, 0, 22458, 70039, 25594, 9309, 9126, 25187, - 25594, 0, 9309, 25187, 70039, 0, 22143, 69216, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 9527, 0, 3307, 9309, 25594, 9309, 9126, 25187, - 9527, 3361, 2990, 9309, 3361, 1162, 926, 2952, - 3307, 1016, 1031, 2914, 9309, 2952, 2644, 8401, - 9527, 3361, 2990, 9309, 0, 0, 0, 0, - 3361, 1162, 926, 2952, 9309, 2952, 2644, 8401, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 9309, 0, 2914, 8401, 25187, 8401, 8268, 23306, - 25594, 9527, 9324, 25594, 0, 0, 0, 0, - 9527, 0, 3307, 9309, 25594, 9309, 9126, 25187, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 9527, 3361, 2990, 9309, 3361, 1162, 926, 2952, - 3307, 1016, 1031, 2914, 9309, 2952, 2644, 8401, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 9309, 0, 2914, 8401, 25187, 8401, 8268, 23306, - 70039, 0, 22458, 70039, 25594, 9309, 9126, 25187, - 25594, 0, 9309, 25187, 70039, 0, 22143, 69216, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 25594, 9309, 9126, 25187, 0, 0, 0, 0, - 9309, 2952, 2644, 8401, 25187, 8401, 8268, 23306, - 70039, 0, 22143, 69216, 25187, 8401, 8268, 23306, - 25187, 0, 8401, 23306, 69216, 0, 20624, 65162, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - { - 62844, 0, 22518, 62844, 22460, 9527, 8397, 22460, - 22460, 0, 9527, 22460, 62844, 0, 22518, 62844, - 22460, 9527, 8397, 22460, 0, 0, 0, 0, - 9527, 0, 3361, 9309, 22460, 9309, 8223, 22144, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 62844, 0, 22518, 62844, 22460, 9309, 8223, 22144, - 22460, 0, 9309, 22144, 62844, 0, 22197, 62136, - 22460, 9527, 8397, 22460, 0, 0, 0, 0, - 9527, 0, 3361, 9309, 22460, 9309, 8223, 22144, - 9527, 0, 3308, 9309, 3361, 1162, 926, 2952, - 3361, 0, 1162, 2952, 9309, 0, 2914, 8401, - 9527, 0, 3308, 9309, 0, 0, 0, 0, - 3361, 1162, 926, 2952, 9309, 0, 2914, 8401, - 22460, 9309, 8223, 22144, 0, 0, 0, 0, - 9309, 0, 2952, 8401, 22144, 8401, 7475, 20624, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 62844, 0, 22518, 62844, 22460, 9309, 8223, 22144, - 22460, 0, 9309, 22144, 62844, 0, 22197, 62136, - 22460, 9309, 8223, 22144, 0, 0, 0, 0, - 9309, 0, 2952, 8401, 22144, 8401, 7475, 20624, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 62844, 0, 22197, 62136, 22144, 8401, 7475, 20624, - 22144, 0, 8401, 20624, 62136, 0, 20662, 58644, - }, - { - 48001, 0, 19802, 48001, 19802, 0, 8397, 19802, - 0, 0, 0, 0, 48001, 0, 19802, 48001, - 19802, 0, 8397, 19802, 0, 0, 0, 0, - 8169, 0, 3361, 8019, 19802, 0, 8223, 19549, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 48001, 0, 19802, 48001, 19802, 0, 8223, 19549, - 0, 0, 0, 0, 48001, 0, 19549, 47574, - 19802, 0, 8397, 19802, 0, 0, 0, 0, - 8169, 0, 3361, 8019, 19802, 0, 8223, 19549, - 8169, 0, 3361, 8019, 0, 0, 0, 0, - 3361, 0, 1162, 2952, 8019, 0, 2952, 7329, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19802, 0, 8223, 19549, 0, 0, 0, 0, - 8019, 0, 2952, 7329, 19549, 0, 7475, 18300, - 19802, 0, 8169, 19802, 8169, 0, 3361, 8019, - 0, 0, 0, 0, 19802, 0, 8019, 19549, - 8169, 0, 3361, 8019, 0, 0, 0, 0, - 3361, 0, 1016, 2952, 8019, 0, 2952, 7329, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 19802, 0, 8019, 19549, 8019, 0, 2952, 7329, - 0, 0, 0, 0, 19549, 0, 7329, 18300, - 48001, 0, 19802, 48001, 19802, 0, 8223, 19549, - 0, 0, 0, 0, 48001, 0, 19549, 47574, - 19802, 0, 8223, 19549, 0, 0, 0, 0, - 8019, 0, 2952, 7329, 19549, 0, 7475, 18300, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 48001, 0, 19549, 47574, 19549, 0, 7475, 18300, - 0, 0, 0, 0, 47574, 0, 18300, 45324, - }, - { - 62844, 0, 0, 62844, 22518, 9527, 8281, 22518, - 0, 0, 0, 0, 62844, 0, 0, 62844, - 22518, 9527, 8281, 22518, 0, 0, 0, 0, - 0, 0, 0, 0, 22518, 9309, 8112, 22197, - 22460, 0, 0, 22460, 9527, 0, 3308, 9309, - 0, 0, 0, 0, 22460, 0, 0, 22144, - 62844, 0, 0, 62844, 22518, 9309, 8112, 22197, - 0, 0, 0, 0, 62844, 0, 0, 62136, - 22518, 9527, 8281, 22518, 0, 0, 0, 0, - 0, 0, 0, 0, 22518, 9309, 8112, 22197, - 9527, 0, 3361, 9309, 3308, 1162, 1017, 2914, - 3308, 0, 1162, 2914, 9309, 0, 2952, 8401, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 22518, 9309, 8112, 22197, 0, 0, 0, 0, - 0, 0, 0, 0, 22197, 8401, 7384, 20662, - 22518, 0, 0, 22518, 9527, 0, 3361, 9309, - 0, 0, 0, 0, 22518, 0, 0, 22197, - 9527, 0, 3361, 9309, 0, 0, 0, 0, - 0, 0, 0, 0, 9309, 0, 2952, 8401, - 9527, 0, 0, 9309, 3308, 1162, 1017, 2914, - 0, 0, 0, 0, 9309, 0, 0, 8401, - 22518, 0, 0, 22197, 9309, 0, 2952, 8401, - 0, 0, 0, 0, 22197, 0, 0, 20662, - 62844, 0, 0, 62844, 22518, 9309, 8112, 22197, - 0, 0, 0, 0, 62844, 0, 0, 62136, - 22518, 9309, 8112, 22197, 0, 0, 0, 0, - 0, 0, 0, 0, 22197, 8401, 7384, 20662, - 22460, 0, 0, 22144, 9309, 0, 2914, 8401, - 0, 0, 0, 0, 22144, 0, 0, 20624, - 62844, 0, 0, 62136, 22197, 8401, 7384, 20662, - 0, 0, 0, 0, 62136, 0, 0, 58644, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - { - 48001, 0, 17580, 48001, 19802, 8397, 0, 19802, - 15040, 0, 6375, 15040, 48001, 0, 17580, 48001, - 19802, 8397, 0, 19802, 0, 0, 0, 0, - 7287, 2928, 0, 7155, 19802, 8223, 0, 19549, - 16794, 0, 6012, 16794, 8397, 0, 0, 8223, - 6016, 0, 2496, 5937, 16794, 0, 5934, 16620, - 48001, 0, 17580, 48001, 19802, 8223, 0, 19549, - 15040, 0, 6267, 14882, 48001, 0, 17370, 47574, - 19802, 8397, 0, 19802, 0, 0, 0, 0, - 7287, 2928, 0, 7155, 19802, 8223, 0, 19549, - 8397, 2929, 0, 8223, 2929, 1031, 913, 2602, - 0, 0, 0, 0, 8223, 2602, 0, 7475, - 6016, 2929, 0, 5937, 0, 0, 0, 0, - 2496, 1031, 0, 2252, 5937, 2602, 0, 5531, - 19802, 8223, 0, 19549, 0, 0, 0, 0, - 7155, 2602, 0, 6561, 19549, 7475, 0, 18300, - 19802, 0, 7287, 19802, 8397, 2929, 0, 8223, - 6016, 0, 2496, 5937, 19802, 0, 7155, 19549, - 8397, 2929, 0, 8223, 0, 0, 0, 0, - 2928, 1031, 0, 2602, 8223, 2602, 0, 7475, - 8397, 0, 2928, 8223, 2929, 1031, 913, 2602, - 2929, 0, 1031, 2602, 8223, 0, 2602, 7475, - 19802, 0, 7155, 19549, 8223, 2602, 0, 7475, - 5937, 0, 2252, 5531, 19549, 0, 6561, 18300, - 48001, 0, 17580, 48001, 19802, 8223, 0, 19549, - 15040, 0, 6267, 14882, 48001, 0, 17370, 47574, - 19802, 8223, 0, 19549, 0, 0, 0, 0, - 7155, 2602, 0, 6561, 19549, 7475, 0, 18300, - 16794, 0, 5934, 16620, 8223, 0, 0, 7475, - 5937, 0, 2252, 5531, 16620, 0, 5530, 15698, - 48001, 0, 17370, 47574, 19549, 7475, 0, 18300, - 14882, 0, 5779, 14070, 47574, 0, 16318, 45324, - }, - { - 39202, 0, 13860, 39202, 13860, 5741, 5741, 13860, - 13860, 0, 5741, 13860, 39202, 0, 13860, 39202, - 13860, 5741, 5741, 13860, 0, 0, 0, 0, - 4925, 1936, 1998, 4857, 13860, 5652, 5652, 13716, - 13860, 0, 4756, 13860, 5741, 0, 2323, 5652, - 5741, 0, 2323, 5652, 13860, 0, 4701, 13716, - 39202, 0, 13860, 39202, 13860, 5652, 5652, 13716, - 13860, 0, 5652, 13716, 39202, 0, 13716, 38880, - 13860, 5741, 5741, 13860, 0, 0, 0, 0, - 4925, 1936, 1998, 4857, 13860, 5652, 5652, 13716, - 5741, 2323, 0, 5652, 2323, 821, 0, 2088, - 2323, 821, 0, 2088, 5652, 2088, 0, 5232, - 4756, 2323, 1936, 4701, 0, 0, 0, 0, - 1936, 821, 703, 1772, 4701, 2088, 1772, 4411, - 13860, 5652, 5652, 13716, 0, 0, 0, 0, - 4857, 1772, 1814, 4529, 13716, 5232, 5232, 12972, - 13860, 0, 4925, 13860, 5741, 2323, 0, 5652, - 4756, 0, 1936, 4701, 13860, 0, 4857, 13716, - 5741, 2323, 0, 5652, 0, 0, 0, 0, - 1936, 821, 0, 1772, 5652, 2088, 0, 5232, - 5741, 0, 1936, 5652, 2323, 821, 0, 2088, - 2323, 0, 821, 2088, 5652, 0, 1772, 5232, - 13860, 0, 4857, 13716, 5652, 2088, 0, 5232, - 4701, 0, 1772, 4411, 13716, 0, 4529, 12972, - 39202, 0, 13860, 39202, 13860, 5652, 5652, 13716, - 13860, 0, 5652, 13716, 39202, 0, 13716, 38880, - 13860, 5652, 5652, 13716, 0, 0, 0, 0, - 4857, 1772, 1814, 4529, 13716, 5232, 5232, 12972, - 13860, 0, 4701, 13716, 5652, 0, 2088, 5232, - 5652, 0, 2088, 5232, 13716, 0, 4411, 12972, - 39202, 0, 13716, 38880, 13716, 5232, 5232, 12972, - 13716, 0, 5232, 12972, 38880, 0, 12972, 37152, - }, - { - 48001, 0, 19802, 48001, 17580, 6375, 6466, 17580, - 16794, 0, 8397, 16794, 48001, 0, 19802, 48001, - 17580, 6375, 6466, 17580, 0, 0, 0, 0, - 7287, 2496, 2611, 7155, 17580, 6267, 6357, 17370, - 15040, 0, 6016, 15040, 6375, 0, 2240, 6267, - 6016, 0, 2929, 5937, 15040, 0, 5937, 14882, - 48001, 0, 19802, 48001, 17580, 6267, 6357, 17370, - 16794, 0, 8223, 16620, 48001, 0, 19549, 47574, - 17580, 6375, 6466, 17580, 0, 0, 0, 0, - 7287, 2496, 2611, 7155, 17580, 6267, 6357, 17370, - 6375, 2496, 2232, 6267, 2496, 1031, 0, 2252, - 2240, 783, 810, 2024, 6267, 2252, 2020, 5779, - 6012, 2496, 2178, 5934, 0, 0, 0, 0, - 2928, 1031, 914, 2602, 5934, 2252, 1982, 5530, - 17580, 6267, 6357, 17370, 0, 0, 0, 0, - 7155, 2252, 2332, 6561, 17370, 5779, 5857, 16318, - 17580, 0, 7287, 17580, 6375, 2496, 2232, 6267, - 6012, 0, 2928, 5934, 17580, 0, 7155, 17370, - 6375, 2496, 2232, 6267, 0, 0, 0, 0, - 2496, 1031, 782, 2252, 6267, 2252, 2020, 5779, - 6375, 0, 2496, 6267, 2496, 1031, 0, 2252, - 2496, 0, 1031, 2252, 6267, 0, 2252, 5779, - 17580, 0, 7155, 17370, 6267, 2252, 2020, 5779, - 5934, 0, 2602, 5530, 17370, 0, 6561, 16318, - 48001, 0, 19802, 48001, 17580, 6267, 6357, 17370, - 16794, 0, 8223, 16620, 48001, 0, 19549, 47574, - 17580, 6267, 6357, 17370, 0, 0, 0, 0, - 7155, 2252, 2332, 6561, 17370, 5779, 5857, 16318, - 15040, 0, 5937, 14882, 6267, 0, 2024, 5779, - 5937, 0, 2602, 5531, 14882, 0, 5531, 14070, - 48001, 0, 19549, 47574, 17370, 5779, 5857, 16318, - 16620, 0, 7475, 15698, 47574, 0, 18300, 45324, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - { - 62844, 0, 22880, 62844, 22518, 8281, 9527, 22518, - 20212, 0, 8542, 20212, 62844, 0, 22880, 62844, - 22518, 8281, 9527, 22518, 0, 0, 0, 0, - 8227, 2876, 3370, 8067, 22518, 8112, 9309, 22197, - 19968, 0, 7112, 19968, 8281, 0, 3308, 8112, - 7282, 0, 2990, 7152, 19968, 0, 6996, 19701, - 62844, 0, 22880, 62844, 22518, 8112, 9309, 22197, - 20212, 0, 8358, 19937, 62844, 0, 22540, 62136, - 22518, 8281, 9527, 22518, 0, 0, 0, 0, - 8227, 2876, 3370, 8067, 22518, 8112, 9309, 22197, - 8281, 2937, 2867, 8112, 2937, 1031, 810, 2606, - 3308, 1017, 1162, 2914, 8112, 2606, 2560, 7384, - 7088, 2937, 2937, 6975, 0, 0, 0, 0, - 2920, 1031, 1031, 2598, 6975, 2606, 2606, 6429, - 22518, 8112, 9309, 22197, 0, 0, 0, 0, - 8067, 2564, 2956, 7357, 22197, 7384, 8401, 20662, - 22518, 0, 8227, 22518, 8281, 2937, 2867, 8112, - 7088, 0, 2920, 6975, 22518, 0, 8067, 22197, - 8281, 2937, 2867, 8112, 0, 0, 0, 0, - 2876, 1031, 886, 2564, 8112, 2606, 2560, 7384, - 8281, 0, 2876, 8112, 2937, 1031, 810, 2606, - 2937, 0, 1031, 2606, 8112, 0, 2564, 7384, - 22518, 0, 8067, 22197, 8112, 2606, 2560, 7384, - 6975, 0, 2598, 6429, 22197, 0, 7357, 20662, - 62844, 0, 22880, 62844, 22518, 8112, 9309, 22197, - 20212, 0, 8358, 19937, 62844, 0, 22540, 62136, - 22518, 8112, 9309, 22197, 0, 0, 0, 0, - 8067, 2564, 2956, 7357, 22197, 7384, 8401, 20662, - 19968, 0, 6996, 19701, 8112, 0, 2914, 7384, - 7152, 0, 2644, 6560, 19701, 0, 6442, 18410, - 62844, 0, 22540, 62136, 22197, 7384, 8401, 20662, - 19937, 0, 7580, 18616, 62136, 0, 20944, 58644, - }, - { - 48001, 0, 17580, 48001, 17580, 6466, 6375, 17580, - 15222, 0, 6466, 15222, 48001, 0, 17580, 48001, - 17580, 6466, 6375, 17580, 0, 0, 0, 0, - 6461, 2269, 2286, 6354, 17580, 6357, 6267, 17370, - 15222, 0, 5456, 15222, 6466, 0, 2240, 6357, - 5465, 0, 2270, 5391, 15222, 0, 5385, 15063, - 48001, 0, 17580, 48001, 17580, 6357, 6267, 17370, - 15222, 0, 6357, 15063, 48001, 0, 17370, 47574, - 17580, 6466, 6375, 17580, 0, 0, 0, 0, - 6461, 2269, 2286, 6354, 17580, 6357, 6267, 17370, - 6466, 2270, 2277, 6357, 2270, 821, 716, 2050, - 2240, 705, 810, 2024, 6357, 2050, 2054, 5857, - 5456, 2270, 1952, 5385, 0, 0, 0, 0, - 2269, 821, 717, 2050, 5385, 2050, 1780, 5023, - 17580, 6357, 6267, 17370, 0, 0, 0, 0, - 6354, 2050, 2058, 5856, 17370, 5857, 5779, 16318, - 17580, 0, 6461, 17580, 6466, 2270, 2277, 6357, - 5456, 0, 2269, 5385, 17580, 0, 6354, 17370, - 6466, 2270, 2277, 6357, 0, 0, 0, 0, - 2269, 821, 716, 2050, 6357, 2050, 2054, 5857, - 6466, 0, 2269, 6357, 2270, 821, 716, 2050, - 2270, 0, 821, 2050, 6357, 0, 2050, 5857, - 17580, 0, 6354, 17370, 6357, 2050, 2054, 5857, - 5385, 0, 2050, 5023, 17370, 0, 5856, 16318, - 48001, 0, 17580, 48001, 17580, 6357, 6267, 17370, - 15222, 0, 6357, 15063, 48001, 0, 17370, 47574, - 17580, 6357, 6267, 17370, 0, 0, 0, 0, - 6354, 2050, 2058, 5856, 17370, 5857, 5779, 16318, - 15222, 0, 5385, 15063, 6357, 0, 2024, 5857, - 5391, 0, 2050, 5025, 15063, 0, 5023, 14238, - 48001, 0, 17370, 47574, 17370, 5857, 5779, 16318, - 15063, 0, 5857, 14238, 47574, 0, 16318, 45324, - }, - { - 62844, 0, 22518, 62844, 22880, 8542, 8542, 22880, - 19968, 0, 8281, 19968, 62844, 0, 22518, 62844, - 22880, 8542, 8542, 22880, 0, 0, 0, 0, - 8227, 2920, 2983, 8067, 22880, 8358, 8358, 22540, - 20212, 0, 7088, 20212, 8542, 0, 3037, 8358, - 7282, 0, 2937, 7152, 20212, 0, 6975, 19937, - 62844, 0, 22518, 62844, 22880, 8358, 8358, 22540, - 19968, 0, 8112, 19701, 62844, 0, 22197, 62136, - 22880, 8542, 8542, 22880, 0, 0, 0, 0, - 8227, 2920, 2983, 8067, 22880, 8358, 8358, 22540, - 8542, 2990, 2650, 8358, 2990, 1031, 915, 2644, - 3037, 926, 939, 2678, 8358, 2644, 2362, 7580, - 7112, 2990, 2603, 6996, 0, 0, 0, 0, - 2876, 1031, 913, 2564, 6996, 2644, 2328, 6442, - 22880, 8358, 8358, 22540, 0, 0, 0, 0, - 8067, 2598, 2640, 7357, 22540, 7580, 7580, 20944, - 22880, 0, 8227, 22880, 8542, 2990, 2650, 8358, - 7112, 0, 2876, 6996, 22880, 0, 8067, 22540, - 8542, 2990, 2650, 8358, 0, 0, 0, 0, - 2920, 1031, 808, 2598, 8358, 2644, 2362, 7580, - 8542, 0, 2920, 8358, 2990, 1031, 915, 2644, - 2990, 0, 1031, 2644, 8358, 0, 2598, 7580, - 22880, 0, 8067, 22540, 8358, 2644, 2362, 7580, - 6996, 0, 2564, 6442, 22540, 0, 7357, 20944, - 62844, 0, 22518, 62844, 22880, 8358, 8358, 22540, - 19968, 0, 8112, 19701, 62844, 0, 22197, 62136, - 22880, 8358, 8358, 22540, 0, 0, 0, 0, - 8067, 2598, 2640, 7357, 22540, 7580, 7580, 20944, - 20212, 0, 6975, 19937, 8358, 0, 2678, 7580, - 7152, 0, 2606, 6560, 19937, 0, 6429, 18616, - 62844, 0, 22197, 62136, 22540, 7580, 7580, 20944, - 19701, 0, 7384, 18410, 62136, 0, 20662, 58644, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, -}; - -const uint32_t RANGE_PREFIX_OFFSET_8bits[16][256] = { - { - 0, 70039, 70039, 95633, 165672, 191266, 200793, 210117, - 235711, 258169, 258169, 267696, 290154, 360193, 360193, 385787, - 455826, 455826, 455826, 455826, 455826, 455826, 455826, 455826, - 455826, 455826, 455826, 455826, 455826, 455826, 455826, 455826, - 455826, 481420, 490947, 500271, 525865, 525865, 525865, 525865, - 525865, 533893, 537254, 540121, 548008, 573602, 582911, 592037, - 617224, 687263, 687263, 712857, 782896, 808490, 817799, 826925, - 852112, 874570, 874570, 883879, 906022, 976061, 976061, 1001248, - 1070464, 1096058, 1105585, 1114909, 1140503, 1140503, 1140503, 1140503, - 1140503, 1149889, 1153197, 1156513, 1165690, 1191284, 1200593, 1209719, - 1234906, 1244433, 1247794, 1250784, 1260093, 1263454, 1264616, 1265542, - 1268494, 1271801, 1272817, 1273848, 1276762, 1286071, 1289023, 1291667, - 1300068, 1308096, 1311457, 1314324, 1322211, 1322211, 1322211, 1322211, - 1322211, 1325519, 1326681, 1327698, 1330612, 1338499, 1341451, 1344011, - 1351236, 1376830, 1386139, 1395265, 1420452, 1420452, 1420452, 1420452, - 1420452, 1429629, 1432543, 1435461, 1443758, 1468945, 1477346, 1485614, - 1508920, 1534514, 1544041, 1553365, 1578959, 1578959, 1578959, 1578959, - 1578959, 1588345, 1591653, 1594969, 1604146, 1629740, 1639049, 1648175, - 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, - 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, - 1673362, 1682889, 1686250, 1689240, 1698549, 1701910, 1703072, 1703998, - 1706950, 1710257, 1711273, 1712304, 1715218, 1724527, 1727479, 1730123, - 1738524, 1764118, 1773427, 1782553, 1807740, 1807740, 1807740, 1807740, - 1807740, 1816917, 1819831, 1822749, 1831046, 1856233, 1864634, 1872902, - 1896208, 1966247, 1966247, 1991841, 2061880, 2087474, 2096783, 2105909, - 2131096, 2153554, 2153554, 2162863, 2185006, 2255045, 2255045, 2280232, - 2349448, 2349448, 2349448, 2349448, 2349448, 2349448, 2349448, 2349448, - 2349448, 2349448, 2349448, 2349448, 2349448, 2349448, 2349448, 2349448, - 2349448, 2375042, 2384351, 2393477, 2418664, 2418664, 2418664, 2418664, - 2418664, 2426551, 2429503, 2432063, 2439288, 2464475, 2472876, 2481144, - 2504450, 2574489, 2574489, 2599676, 2668892, 2694079, 2702480, 2710748, - 2734054, 2756197, 2756197, 2764598, 2785222, 2854438, 2854438, 2877744, - }, - { - 0, 70039, 70039, 95633, 165672, 165672, 165672, 165672, - 165672, 191266, 191266, 200652, 226246, 296285, 296285, 321879, - 391918, 391918, 391918, 391918, 391918, 391918, 391918, 391918, - 391918, 391918, 391918, 391918, 391918, 391918, 391918, 391918, - 391918, 417512, 427039, 436363, 461957, 461957, 461957, 461957, - 461957, 471484, 474845, 477835, 487144, 512738, 522047, 531173, - 556360, 626399, 626399, 651993, 722032, 722032, 722032, 722032, - 722032, 747626, 747626, 756803, 781990, 852029, 852029, 877216, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 946432, 946432, 946432, 946432, 946432, 946432, 946432, - 946432, 972026, 981553, 990877, 1016471, 1016471, 1016471, 1016471, - 1016471, 1025857, 1029165, 1032481, 1041658, 1067252, 1076561, 1085687, - 1110874, 1110874, 1110874, 1110874, 1110874, 1110874, 1110874, 1110874, - 1110874, 1110874, 1110874, 1110874, 1110874, 1110874, 1110874, 1110874, - 1110874, 1120401, 1123762, 1126752, 1136061, 1139422, 1140584, 1141510, - 1144462, 1147769, 1148785, 1149816, 1152730, 1162039, 1164991, 1167635, - 1176036, 1201630, 1210939, 1220065, 1245252, 1245252, 1245252, 1245252, - 1245252, 1254429, 1257343, 1260261, 1268558, 1293745, 1302146, 1310414, - 1333720, 1403759, 1403759, 1429353, 1499392, 1499392, 1499392, 1499392, - 1499392, 1524986, 1524986, 1534163, 1559350, 1629389, 1629389, 1654576, - 1723792, 1723792, 1723792, 1723792, 1723792, 1723792, 1723792, 1723792, - 1723792, 1723792, 1723792, 1723792, 1723792, 1723792, 1723792, 1723792, - 1723792, 1749386, 1758695, 1767821, 1793008, 1793008, 1793008, 1793008, - 1793008, 1802317, 1805269, 1807913, 1816314, 1841501, 1849902, 1858170, - 1881476, 1951515, 1951515, 1976702, 2045918, 2045918, 2045918, 2045918, - 2045918, 2071105, 2071105, 2079402, 2102708, 2171924, 2171924, 2195230, - }, - { - 0, 70039, 70039, 92497, 162536, 188130, 197657, 206981, - 232575, 258169, 258169, 267696, 293290, 363329, 363329, 385787, - 455826, 455826, 455826, 455826, 455826, 455826, 455826, 455826, - 455826, 455826, 455826, 455826, 455826, 455826, 455826, 455826, - 455826, 481420, 490947, 500271, 525865, 525865, 525865, 525865, - 525865, 535392, 538753, 541743, 551052, 576646, 585955, 595081, - 620268, 690307, 690307, 712765, 782804, 808398, 817707, 826833, - 852020, 877614, 877614, 886923, 912110, 982149, 982149, 1004292, - 1073508, 1099102, 1108629, 1117953, 1143547, 1143547, 1143547, 1143547, - 1143547, 1153074, 1153074, 1156381, 1165690, 1191284, 1200593, 1209719, - 1234906, 1244433, 1247794, 1250784, 1260093, 1263454, 1264616, 1265542, - 1268494, 1271801, 1272817, 1273848, 1276762, 1286071, 1289023, 1291667, - 1300068, 1309595, 1312956, 1315946, 1325255, 1325255, 1325255, 1325255, - 1325255, 1328616, 1329778, 1330704, 1333656, 1342965, 1345917, 1348561, - 1356962, 1382556, 1391865, 1400991, 1426178, 1426178, 1426178, 1426178, - 1426178, 1435487, 1435487, 1438401, 1446802, 1471989, 1480390, 1488658, - 1511964, 1537558, 1547085, 1556409, 1582003, 1582003, 1582003, 1582003, - 1582003, 1591530, 1591530, 1594837, 1604146, 1629740, 1639049, 1648175, - 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, - 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, 1673362, - 1673362, 1682889, 1686250, 1689240, 1698549, 1701910, 1703072, 1703998, - 1706950, 1710257, 1711273, 1712304, 1715218, 1724527, 1727479, 1730123, - 1738524, 1764118, 1773427, 1782553, 1807740, 1807740, 1807740, 1807740, - 1807740, 1817049, 1817049, 1819963, 1828364, 1853551, 1861952, 1870220, - 1893526, 1963565, 1963565, 1986023, 2056062, 2081656, 2090965, 2100091, - 2125278, 2150872, 2150872, 2160181, 2185368, 2255407, 2255407, 2277550, - 2346766, 2346766, 2346766, 2346766, 2346766, 2346766, 2346766, 2346766, - 2346766, 2346766, 2346766, 2346766, 2346766, 2346766, 2346766, 2346766, - 2346766, 2372360, 2381669, 2390795, 2415982, 2415982, 2415982, 2415982, - 2415982, 2425291, 2428243, 2430887, 2439288, 2464475, 2472876, 2481144, - 2504450, 2574489, 2574489, 2596632, 2665848, 2691035, 2699436, 2707704, - 2731010, 2756197, 2756197, 2764598, 2787904, 2857120, 2857120, 2877744, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - { - 0, 62844, 62844, 85362, 148206, 170666, 180193, 188590, - 211050, 233510, 233510, 243037, 265497, 328341, 328341, 350859, - 413703, 436163, 445690, 454087, 476547, 476547, 476547, 476547, - 476547, 486074, 486074, 489435, 498744, 521204, 530513, 538736, - 560880, 560880, 560880, 560880, 560880, 560880, 560880, 560880, - 560880, 560880, 560880, 560880, 560880, 560880, 560880, 560880, - 560880, 623724, 623724, 646242, 709086, 731546, 740855, 749078, - 771222, 793682, 793682, 802991, 825135, 887979, 887979, 910176, - 972312, 994772, 1004299, 1012696, 1035156, 1035156, 1035156, 1035156, - 1035156, 1044683, 1044683, 1048044, 1057353, 1079813, 1089122, 1097345, - 1119489, 1129016, 1129016, 1132324, 1141633, 1144994, 1146156, 1147082, - 1150034, 1153395, 1153395, 1154557, 1157509, 1166818, 1166818, 1169732, - 1178133, 1187660, 1187660, 1190968, 1200277, 1200277, 1200277, 1200277, - 1200277, 1203638, 1204800, 1205726, 1208678, 1217987, 1217987, 1220901, - 1229302, 1251762, 1261071, 1269294, 1291438, 1291438, 1291438, 1291438, - 1291438, 1300747, 1300747, 1303699, 1312100, 1334244, 1342645, 1350120, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, 1370744, - 1370744, 1433588, 1433588, 1456106, 1518950, 1541410, 1550719, 1558942, - 1581086, 1603546, 1603546, 1612855, 1634999, 1697843, 1697843, 1720040, - 1782176, 1804636, 1813945, 1822168, 1844312, 1844312, 1844312, 1844312, - 1844312, 1853621, 1853621, 1856573, 1864974, 1887118, 1895519, 1902994, - 1923618, 1923618, 1923618, 1923618, 1923618, 1923618, 1923618, 1923618, - 1923618, 1923618, 1923618, 1923618, 1923618, 1923618, 1923618, 1923618, - 1923618, 1986462, 1986462, 2008659, 2070795, 2092939, 2101340, 2108815, - 2129439, 2151583, 2151583, 2159984, 2180608, 2242744, 2242744, 2263406, - }, - { - 0, 48001, 48001, 67803, 115804, 135606, 135606, 144003, - 163805, 163805, 163805, 163805, 163805, 211806, 211806, 231608, - 279609, 299411, 299411, 307808, 327610, 327610, 327610, 327610, - 327610, 335779, 335779, 339140, 347159, 366961, 366961, 375184, - 394733, 394733, 394733, 394733, 394733, 394733, 394733, 394733, - 394733, 394733, 394733, 394733, 394733, 394733, 394733, 394733, - 394733, 442734, 442734, 462536, 510537, 530339, 530339, 538562, - 558111, 558111, 558111, 558111, 558111, 606112, 606112, 625661, - 673235, 693037, 693037, 701434, 721236, 721236, 721236, 721236, - 721236, 729405, 729405, 732766, 740785, 760587, 760587, 768810, - 788359, 796528, 796528, 799889, 807908, 807908, 807908, 807908, - 807908, 811269, 811269, 812431, 815383, 823402, 823402, 826354, - 833683, 833683, 833683, 833683, 833683, 833683, 833683, 833683, - 833683, 833683, 833683, 833683, 833683, 833683, 833683, 833683, - 833683, 853485, 853485, 861708, 881257, 881257, 881257, 881257, - 881257, 889276, 889276, 892228, 899557, 919106, 919106, 926581, - 944881, 964683, 964683, 972852, 992654, 1000823, 1000823, 1004184, - 1012203, 1012203, 1012203, 1012203, 1012203, 1032005, 1032005, 1040024, - 1059573, 1067742, 1067742, 1071103, 1079122, 1079122, 1079122, 1079122, - 1079122, 1082483, 1082483, 1083499, 1086451, 1094470, 1094470, 1097422, - 1104751, 1104751, 1104751, 1104751, 1104751, 1104751, 1104751, 1104751, - 1104751, 1104751, 1104751, 1104751, 1104751, 1104751, 1104751, 1104751, - 1104751, 1124553, 1124553, 1132572, 1152121, 1160140, 1160140, 1163092, - 1170421, 1170421, 1170421, 1170421, 1170421, 1189970, 1189970, 1197299, - 1215599, 1263600, 1263600, 1283402, 1331403, 1351205, 1351205, 1359428, - 1378977, 1378977, 1378977, 1378977, 1378977, 1426978, 1426978, 1446527, - 1494101, 1513903, 1513903, 1522126, 1541675, 1541675, 1541675, 1541675, - 1541675, 1549694, 1549694, 1552646, 1559975, 1579524, 1579524, 1586999, - 1605299, 1605299, 1605299, 1605299, 1605299, 1605299, 1605299, 1605299, - 1605299, 1605299, 1605299, 1605299, 1605299, 1605299, 1605299, 1605299, - 1605299, 1653300, 1653300, 1672849, 1720423, 1739972, 1739972, 1747447, - 1765747, 1765747, 1765747, 1765747, 1765747, 1813321, 1813321, 1831621, - }, - { - 0, 62844, 62844, 62844, 125688, 148206, 157733, 166014, - 188532, 188532, 188532, 188532, 188532, 251376, 251376, 251376, - 314220, 336738, 346265, 354546, 377064, 377064, 377064, 377064, - 377064, 377064, 377064, 377064, 377064, 399582, 408891, 417003, - 439200, 461660, 461660, 461660, 484120, 493647, 493647, 496955, - 506264, 506264, 506264, 506264, 506264, 528724, 528724, 528724, - 550868, 613712, 613712, 613712, 676556, 699074, 708383, 716495, - 738692, 738692, 738692, 738692, 738692, 801536, 801536, 801536, - 863672, 886190, 895717, 903998, 926516, 926516, 926516, 926516, - 926516, 926516, 926516, 926516, 926516, 949034, 958343, 966455, - 988652, 998179, 998179, 1001540, 1010849, 1014157, 1015319, 1016336, - 1019250, 1022558, 1022558, 1023720, 1026634, 1035943, 1035943, 1038895, - 1047296, 1047296, 1047296, 1047296, 1047296, 1047296, 1047296, 1047296, - 1047296, 1047296, 1047296, 1047296, 1047296, 1047296, 1047296, 1047296, - 1047296, 1069814, 1079123, 1087235, 1109432, 1109432, 1109432, 1109432, - 1109432, 1109432, 1109432, 1109432, 1109432, 1131629, 1140030, 1147414, - 1168076, 1190594, 1190594, 1190594, 1213112, 1222639, 1222639, 1226000, - 1235309, 1235309, 1235309, 1235309, 1235309, 1257827, 1257827, 1257827, - 1280024, 1289551, 1289551, 1292912, 1302221, 1302221, 1302221, 1302221, - 1302221, 1302221, 1302221, 1302221, 1302221, 1311530, 1311530, 1314482, - 1322883, 1332410, 1332410, 1332410, 1341719, 1345027, 1346189, 1347206, - 1350120, 1350120, 1350120, 1350120, 1350120, 1359429, 1359429, 1359429, - 1367830, 1390348, 1390348, 1390348, 1412545, 1421854, 1421854, 1424806, - 1433207, 1433207, 1433207, 1433207, 1433207, 1455404, 1455404, 1455404, - 1476066, 1538910, 1538910, 1538910, 1601754, 1624272, 1633581, 1641693, - 1663890, 1663890, 1663890, 1663890, 1663890, 1726734, 1726734, 1726734, - 1788870, 1811388, 1820697, 1828809, 1851006, 1851006, 1851006, 1851006, - 1851006, 1851006, 1851006, 1851006, 1851006, 1873203, 1881604, 1888988, - 1909650, 1932110, 1932110, 1932110, 1954254, 1963563, 1963563, 1966477, - 1974878, 1974878, 1974878, 1974878, 1974878, 1997022, 1997022, 1997022, - 2017646, 2080490, 2080490, 2080490, 2142626, 2164823, 2173224, 2180608, - 2201270, 2201270, 2201270, 2201270, 2201270, 2263406, 2263406, 2263406, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - { - 0, 48001, 48001, 65581, 113582, 133384, 141781, 141781, - 161583, 176623, 176623, 182998, 198038, 246039, 246039, 263619, - 311620, 331422, 339819, 339819, 359621, 359621, 359621, 359621, - 359621, 366908, 369836, 369836, 376991, 396793, 405016, 405016, - 424565, 441359, 441359, 447371, 464165, 472562, 472562, 472562, - 480785, 486801, 486801, 489297, 495234, 512028, 512028, 517962, - 534582, 582583, 582583, 600163, 648164, 667966, 676189, 676189, - 695738, 710778, 710778, 717045, 731927, 779928, 779928, 797298, - 844872, 864674, 873071, 873071, 892873, 892873, 892873, 892873, - 892873, 900160, 903088, 903088, 910243, 930045, 938268, 938268, - 957817, 966214, 969143, 969143, 977366, 980295, 981326, 982239, - 984841, 984841, 984841, 984841, 984841, 993064, 995666, 995666, - 1003141, 1009157, 1012086, 1012086, 1018023, 1018023, 1018023, 1018023, - 1018023, 1020519, 1021550, 1021550, 1023802, 1029739, 1032341, 1032341, - 1037872, 1057674, 1065897, 1065897, 1085446, 1085446, 1085446, 1085446, - 1085446, 1092601, 1095203, 1095203, 1101764, 1121313, 1128788, 1128788, - 1147088, 1166890, 1166890, 1174177, 1193979, 1202376, 1205305, 1205305, - 1213528, 1219544, 1219544, 1222040, 1227977, 1247779, 1247779, 1254934, - 1274483, 1282880, 1285809, 1285809, 1294032, 1294032, 1294032, 1294032, - 1294032, 1296960, 1297991, 1297991, 1300593, 1308816, 1311418, 1311418, - 1318893, 1327290, 1327290, 1330218, 1338441, 1341370, 1342401, 1343314, - 1345916, 1348845, 1348845, 1349876, 1352478, 1360701, 1360701, 1363303, - 1370778, 1390580, 1390580, 1397735, 1417284, 1425507, 1428109, 1428109, - 1435584, 1441521, 1441521, 1443773, 1449304, 1468853, 1468853, 1475414, - 1493714, 1541715, 1541715, 1559295, 1607296, 1627098, 1635321, 1635321, - 1654870, 1669910, 1669910, 1676177, 1691059, 1739060, 1739060, 1756430, - 1804004, 1823806, 1832029, 1832029, 1851578, 1851578, 1851578, 1851578, - 1851578, 1858733, 1861335, 1861335, 1867896, 1887445, 1894920, 1894920, - 1913220, 1930014, 1930014, 1935948, 1952568, 1960791, 1960791, 1960791, - 1968266, 1974203, 1974203, 1976455, 1981986, 1998606, 1998606, 2004136, - 2019834, 2067835, 2067835, 2085205, 2132779, 2152328, 2159803, 2159803, - 2178103, 2192985, 2192985, 2198764, 2212834, 2260408, 2260408, 2276726, - }, - { - 0, 39202, 39202, 53062, 92264, 106124, 111865, 117606, - 131466, 145326, 145326, 151067, 164927, 204129, 204129, 217989, - 257191, 271051, 276792, 282533, 296393, 296393, 296393, 296393, - 296393, 301318, 303254, 305252, 310109, 323969, 329621, 335273, - 348989, 362849, 362849, 367605, 381465, 387206, 387206, 389529, - 395181, 400922, 400922, 403245, 408897, 422757, 422757, 427458, - 441174, 480376, 480376, 494236, 533438, 547298, 552950, 558602, - 572318, 586178, 586178, 591830, 605546, 644748, 644748, 658464, - 697344, 711204, 716945, 722686, 736546, 736546, 736546, 736546, - 736546, 741471, 743407, 745405, 750262, 764122, 769774, 775426, - 789142, 794883, 797206, 797206, 802858, 805181, 806002, 806002, - 808090, 810413, 811234, 811234, 813322, 818974, 821062, 821062, - 826294, 831050, 833373, 835309, 840010, 840010, 840010, 840010, - 840010, 841946, 842767, 843470, 845242, 849943, 852031, 853803, - 858214, 872074, 877726, 883378, 897094, 897094, 897094, 897094, - 897094, 901951, 903723, 905537, 910066, 923782, 929014, 934246, - 947218, 961078, 961078, 966003, 979863, 985604, 987927, 987927, - 993579, 998335, 998335, 1000271, 1004972, 1018832, 1018832, 1023689, - 1037405, 1043146, 1045469, 1045469, 1051121, 1051121, 1051121, 1051121, - 1051121, 1053057, 1053878, 1053878, 1055650, 1061302, 1063390, 1063390, - 1068622, 1074363, 1074363, 1076299, 1081951, 1084274, 1085095, 1085095, - 1087183, 1089506, 1089506, 1090327, 1092415, 1098067, 1098067, 1099839, - 1105071, 1118931, 1118931, 1123788, 1137504, 1143156, 1145244, 1145244, - 1150476, 1155177, 1155177, 1156949, 1161360, 1175076, 1175076, 1179605, - 1192577, 1231779, 1231779, 1245639, 1284841, 1298701, 1304353, 1310005, - 1323721, 1337581, 1337581, 1343233, 1356949, 1396151, 1396151, 1409867, - 1448747, 1462607, 1468259, 1473911, 1487627, 1487627, 1487627, 1487627, - 1487627, 1492484, 1494256, 1496070, 1500599, 1514315, 1519547, 1524779, - 1537751, 1551611, 1551611, 1556312, 1570028, 1575680, 1575680, 1577768, - 1583000, 1588652, 1588652, 1590740, 1595972, 1609688, 1609688, 1614099, - 1627071, 1666273, 1666273, 1679989, 1718869, 1732585, 1737817, 1743049, - 1756021, 1769737, 1769737, 1774969, 1787941, 1826821, 1826821, 1839793, - }, - { - 0, 48001, 48001, 67803, 115804, 133384, 139759, 146225, - 163805, 180599, 180599, 188996, 205790, 253791, 253791, 273593, - 321594, 339174, 345549, 352015, 369595, 369595, 369595, 369595, - 369595, 376882, 379378, 381989, 389144, 406724, 412991, 419348, - 436718, 451758, 451758, 457774, 472814, 479189, 479189, 481429, - 487696, 493712, 493712, 496641, 502578, 517618, 517618, 523555, - 538437, 586438, 586438, 606240, 654241, 671821, 678088, 684445, - 701815, 718609, 718609, 726832, 743452, 791453, 791453, 811002, - 858576, 876156, 882531, 888997, 906577, 906577, 906577, 906577, - 906577, 913864, 916360, 918971, 926126, 943706, 949973, 956330, - 973700, 980075, 982571, 984803, 991070, 993566, 994597, 994597, - 996849, 999089, 999872, 1000682, 1002706, 1008973, 1011225, 1013245, - 1019024, 1025036, 1027532, 1029710, 1035644, 1035644, 1035644, 1035644, - 1035644, 1038572, 1039603, 1040517, 1043119, 1049053, 1051305, 1053287, - 1058817, 1076397, 1082664, 1089021, 1106391, 1106391, 1106391, 1106391, - 1106391, 1113546, 1115798, 1118130, 1124691, 1142061, 1147840, 1153697, - 1170015, 1187595, 1187595, 1194882, 1212462, 1218837, 1221333, 1223565, - 1229832, 1235844, 1235844, 1238772, 1244706, 1262286, 1262286, 1269441, - 1286811, 1293186, 1295682, 1297914, 1304181, 1304181, 1304181, 1304181, - 1304181, 1306677, 1307708, 1308490, 1310742, 1317009, 1319261, 1321281, - 1327060, 1333435, 1333435, 1335931, 1342198, 1344694, 1345725, 1345725, - 1347977, 1350473, 1350473, 1351504, 1353756, 1360023, 1360023, 1362275, - 1368054, 1385634, 1385634, 1392789, 1410159, 1416426, 1418678, 1420698, - 1426477, 1432411, 1432411, 1435013, 1440543, 1457913, 1457913, 1464474, - 1480792, 1528793, 1528793, 1548595, 1596596, 1614176, 1620443, 1626800, - 1644170, 1660964, 1660964, 1669187, 1685807, 1733808, 1733808, 1753357, - 1800931, 1818511, 1824778, 1831135, 1848505, 1848505, 1848505, 1848505, - 1848505, 1855660, 1857912, 1860244, 1866805, 1884175, 1889954, 1895811, - 1912129, 1927169, 1927169, 1933106, 1947988, 1954255, 1954255, 1956279, - 1962058, 1967995, 1967995, 1970597, 1976128, 1991010, 1991010, 1996541, - 2010611, 2058612, 2058612, 2078161, 2125735, 2143105, 2148884, 2154741, - 2171059, 2187679, 2187679, 2195154, 2210852, 2258426, 2258426, 2276726, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - { - 0, 62844, 62844, 85724, 148568, 171086, 179367, 188894, - 211412, 231624, 231624, 240166, 260378, 323222, 323222, 346102, - 408946, 431464, 439745, 449272, 471790, 471790, 471790, 471790, - 471790, 480017, 482893, 486263, 494330, 516848, 524960, 534269, - 556466, 576434, 576434, 583546, 603514, 611795, 611795, 615103, - 623215, 630497, 630497, 633487, 640639, 660607, 660607, 667603, - 687304, 750148, 750148, 773028, 835872, 858390, 866502, 875811, - 898008, 918220, 918220, 926578, 946515, 1009359, 1009359, 1031899, - 1094035, 1116553, 1124834, 1134361, 1156879, 1156879, 1156879, 1156879, - 1156879, 1165106, 1167982, 1171352, 1179419, 1201937, 1210049, 1219358, - 1241555, 1249836, 1252773, 1255640, 1263752, 1266689, 1267720, 1268530, - 1271136, 1274444, 1275461, 1276623, 1279537, 1287649, 1290255, 1292815, - 1300199, 1307287, 1310224, 1313161, 1320136, 1320136, 1320136, 1320136, - 1320136, 1323056, 1324087, 1325118, 1327716, 1334691, 1337297, 1339903, - 1346332, 1368850, 1376962, 1386271, 1408468, 1408468, 1408468, 1408468, - 1408468, 1416535, 1419099, 1422055, 1429412, 1451609, 1458993, 1467394, - 1488056, 1510574, 1510574, 1518801, 1541319, 1549600, 1552537, 1555404, - 1563516, 1570604, 1570604, 1573524, 1580499, 1603017, 1603017, 1611084, - 1633281, 1641562, 1644499, 1647366, 1655478, 1655478, 1655478, 1655478, - 1655478, 1658354, 1659385, 1660271, 1662835, 1670947, 1673553, 1676113, - 1683497, 1691778, 1691778, 1694654, 1702766, 1705703, 1706734, 1707544, - 1710150, 1713087, 1713087, 1714118, 1716724, 1724836, 1724836, 1727400, - 1734784, 1757302, 1757302, 1765369, 1787566, 1795678, 1798284, 1800844, - 1808228, 1815203, 1815203, 1817801, 1824230, 1846427, 1846427, 1853784, - 1874446, 1937290, 1937290, 1960170, 2023014, 2045532, 2053644, 2062953, - 2085150, 2105362, 2105362, 2113720, 2133657, 2196501, 2196501, 2219041, - 2281177, 2303695, 2311807, 2321116, 2343313, 2343313, 2343313, 2343313, - 2343313, 2351380, 2353944, 2356900, 2364257, 2386454, 2393838, 2402239, - 2422901, 2442869, 2442869, 2449865, 2469566, 2477678, 2477678, 2480592, - 2487976, 2495128, 2495128, 2497772, 2504332, 2524033, 2524033, 2530475, - 2548885, 2611729, 2611729, 2634269, 2696405, 2718602, 2725986, 2734387, - 2755049, 2774986, 2774986, 2782566, 2801182, 2863318, 2863318, 2884262, - }, - { - 0, 48001, 48001, 65581, 113582, 131162, 137628, 144003, - 161583, 176805, 176805, 183271, 198493, 246494, 246494, 264074, - 312075, 329655, 336121, 342496, 360076, 360076, 360076, 360076, - 360076, 366537, 368806, 371092, 377446, 395026, 401383, 407650, - 425020, 440242, 440242, 445698, 460920, 467386, 467386, 469626, - 475983, 481448, 481448, 483718, 489109, 504331, 504331, 509716, - 524779, 572780, 572780, 590360, 638361, 655941, 662298, 668565, - 685935, 701157, 701157, 707514, 722577, 770578, 770578, 787948, - 835522, 853102, 859568, 865943, 883523, 883523, 883523, 883523, - 883523, 889984, 892253, 894539, 900893, 918473, 924830, 931097, - 948467, 954933, 957203, 959480, 965837, 968107, 968928, 969644, - 971694, 973934, 974639, 975449, 977473, 983830, 985880, 987934, - 993791, 999247, 1001517, 1003469, 1008854, 1008854, 1008854, 1008854, - 1008854, 1011123, 1011944, 1012661, 1014711, 1020096, 1022146, 1023926, - 1028949, 1046529, 1052886, 1059153, 1076523, 1076523, 1076523, 1076523, - 1076523, 1082877, 1084927, 1086985, 1092841, 1110211, 1116068, 1121847, - 1138165, 1155745, 1155745, 1162206, 1179786, 1186252, 1188522, 1190799, - 1197156, 1202612, 1202612, 1204881, 1210266, 1227846, 1227846, 1234200, - 1251570, 1258036, 1260306, 1262583, 1268940, 1268940, 1268940, 1268940, - 1268940, 1271209, 1272030, 1272746, 1274796, 1281153, 1283203, 1285257, - 1291114, 1297580, 1297580, 1299849, 1306206, 1308476, 1309297, 1310013, - 1312063, 1314333, 1314333, 1315154, 1317204, 1323561, 1323561, 1325611, - 1331468, 1349048, 1349048, 1355402, 1372772, 1379129, 1381179, 1383233, - 1389090, 1394475, 1394475, 1396525, 1401548, 1418918, 1418918, 1424774, - 1441092, 1489093, 1489093, 1506673, 1554674, 1572254, 1578611, 1584878, - 1602248, 1617470, 1617470, 1623827, 1638890, 1686891, 1686891, 1704261, - 1751835, 1769415, 1775772, 1782039, 1799409, 1799409, 1799409, 1799409, - 1799409, 1805763, 1807813, 1809871, 1815727, 1833097, 1838954, 1844733, - 1861051, 1876273, 1876273, 1881658, 1896721, 1903078, 1903078, 1905102, - 1910959, 1916350, 1916350, 1918400, 1923425, 1938488, 1938488, 1943511, - 1957749, 2005750, 2005750, 2023120, 2070694, 2088064, 2093921, 2099700, - 2116018, 2131081, 2131081, 2136938, 2151176, 2198750, 2198750, 2215068, - }, - { - 0, 62844, 62844, 85362, 148206, 171086, 179628, 188170, - 211050, 231018, 231018, 239299, 259267, 322111, 322111, 344629, - 407473, 430353, 438895, 447437, 470317, 470317, 470317, 470317, - 470317, 478544, 481464, 484447, 492514, 515394, 523752, 532110, - 554650, 574862, 574862, 581950, 602162, 610704, 610704, 613741, - 622099, 629381, 629381, 632318, 639470, 659682, 659682, 666657, - 686594, 749438, 749438, 771956, 834800, 857680, 866038, 874396, - 896936, 916904, 916904, 925016, 944717, 1007561, 1007561, 1029758, - 1091894, 1114774, 1123316, 1131858, 1154738, 1154738, 1154738, 1154738, - 1154738, 1162965, 1165885, 1168868, 1176935, 1199815, 1208173, 1216531, - 1239071, 1247613, 1250603, 1253253, 1261611, 1264601, 1265632, 1266547, - 1269191, 1272228, 1273154, 1274093, 1276771, 1285129, 1287773, 1290135, - 1297715, 1304827, 1307817, 1310420, 1317416, 1317416, 1317416, 1317416, - 1317416, 1320292, 1321323, 1322236, 1324800, 1331796, 1334440, 1336768, - 1343210, 1366090, 1374448, 1382806, 1405346, 1405346, 1405346, 1405346, - 1405346, 1413413, 1416011, 1418651, 1426008, 1448548, 1456128, 1463708, - 1484652, 1507532, 1507532, 1515759, 1538639, 1547181, 1550171, 1552821, - 1561179, 1568291, 1568291, 1571167, 1578163, 1601043, 1601043, 1609110, - 1631650, 1640192, 1643182, 1645832, 1654190, 1654190, 1654190, 1654190, - 1654190, 1657110, 1658141, 1658949, 1661547, 1669905, 1672549, 1674911, - 1682491, 1691033, 1691033, 1693953, 1702311, 1705301, 1706332, 1707247, - 1709891, 1712881, 1712881, 1713912, 1716556, 1724914, 1724914, 1727512, - 1735092, 1757972, 1757972, 1766039, 1788579, 1796937, 1799581, 1801943, - 1809523, 1816519, 1816519, 1819083, 1825525, 1848065, 1848065, 1855422, - 1876366, 1939210, 1939210, 1961728, 2024572, 2047452, 2055810, 2064168, - 2086708, 2106676, 2106676, 2114788, 2134489, 2197333, 2197333, 2219530, - 2281666, 2304546, 2312904, 2321262, 2343802, 2343802, 2343802, 2343802, - 2343802, 2351869, 2354467, 2357107, 2364464, 2387004, 2394584, 2402164, - 2423108, 2443320, 2443320, 2450295, 2470232, 2478590, 2478590, 2481268, - 2488848, 2496000, 2496000, 2498606, 2505166, 2525103, 2525103, 2531532, - 2550148, 2612992, 2612992, 2635189, 2697325, 2719865, 2727445, 2735025, - 2755969, 2775670, 2775670, 2783054, 2801464, 2863600, 2863600, 2884262, - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, -};