From cd0149b305da3f5b403a274e16b18c0a0acc1686 Mon Sep 17 00:00:00 2001 From: Caleb Hearon Date: Mon, 11 Sep 2023 21:47:14 -0400 Subject: [PATCH] internal script iterator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit zero dependencies 🎉 --- build.sh | 3 +- gen.js | 37 +++++++++- gen/script-names.ts | 167 ++++++++++++++++++++++++++++++++++++++++++++ gen/script-trie.cc | 4 ++ overflow.wasm | Bin 561557 -> 626265 bytes package.json | 5 +- src/deps.ts | 3 - src/itemize.ts | 167 ++++++++++++++++++++++++++++++++++++++++++++ src/text.ts | 7 +- yarn.lock | 39 ----------- 10 files changed, 380 insertions(+), 52 deletions(-) create mode 100644 gen/script-names.ts create mode 100644 gen/script-trie.cc delete mode 100644 src/deps.ts diff --git a/build.sh b/build.sh index 521c8a2..f9ff56e 100644 --- a/build.sh +++ b/build.sh @@ -97,4 +97,5 @@ em++ \ gen/lang-script-database.cc \ gen/grapheme-break-trie.cc \ gen/line-break-trie.cc \ - gen/emoji-trie.cc + gen/emoji-trie.cc \ + gen/script-trie.cc diff --git a/gen.js b/gen.js index 5e9fb64..ab32fd4 100644 --- a/gen.js +++ b/gen.js @@ -374,19 +374,54 @@ async function generateEmojiTrie() { writeTrie(path.join(__dirname, 'gen/emoji-trie.cc'), 'emoji_trie', trie); } +async function generateScriptTrie() { + const res = await fetch('https://www.unicode.org/Public/15.0.0/ucd/Scripts.txt'); + const re = /^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*([A-Za-z_]+)/gm; + const trie = new UnicodeTrieBuilder(); + /** @type {Map} */ + const names = new Map(); + let js = '// generated from gen.js\nexport default [\n undefined,\n'; + let nextId = 1; + + if (res.status !== 200) throw new Error(res.status); + + const text = await res.text(); + + let match; + + while ((match = re.exec(text))) { + const start = match[1]; + const end = match[2] != null ? match[2] : start; + const name = match[3]; + if (!names.has(name)) { + const id = nextId++; + js += ` '${name}',\n` + names.set(name, id); + } + const id = names.get(name); + trie.setRange(parseInt(start, 16), parseInt(end, 16), id); + } + + writeTrie(path.join(__dirname, 'gen/script-trie.cc'), 'script_trie', trie); + js += '];'; + fs.writeFileSync(path.join(__dirname, 'gen/script-names.ts'), js); +} + const fns = process.argv.slice(2).map(command => { if (command === 'line-break-trie') return generateLineBreakTrie; if (command === 'grapheme-break-trie') return generateGraphemeBreakTrie; if (command === 'lang-script-database') return generateLangScriptDatabase; if (command === 'entity-trie') return generateEntityTrie; if (command === 'emoji-trie') return generateEmojiTrie; + if (command === 'script-trie') return generateScriptTrie; console.error(`Usage: node gen.js (cmd )+ Available commands: line-break-trie grapheme-break-trie lang-script-database entity-trie - emoji-trie`); + emoji-trie + script-trie`); process.exit(1); }); diff --git a/gen/script-names.ts b/gen/script-names.ts new file mode 100644 index 0000000..1295685 --- /dev/null +++ b/gen/script-names.ts @@ -0,0 +1,167 @@ +// generated from gen.js +export default [ + undefined, + 'Common', + 'Latin', + 'Greek', + 'Cyrillic', + 'Armenian', + 'Hebrew', + 'Arabic', + 'Syriac', + 'Thaana', + 'Devanagari', + 'Bengali', + 'Gurmukhi', + 'Gujarati', + 'Oriya', + 'Tamil', + 'Telugu', + 'Kannada', + 'Malayalam', + 'Sinhala', + 'Thai', + 'Lao', + 'Tibetan', + 'Myanmar', + 'Georgian', + 'Hangul', + 'Ethiopic', + 'Cherokee', + 'Canadian_Aboriginal', + 'Ogham', + 'Runic', + 'Khmer', + 'Mongolian', + 'Hiragana', + 'Katakana', + 'Bopomofo', + 'Han', + 'Yi', + 'Old_Italic', + 'Gothic', + 'Deseret', + 'Inherited', + 'Tagalog', + 'Hanunoo', + 'Buhid', + 'Tagbanwa', + 'Limbu', + 'Tai_Le', + 'Linear_B', + 'Ugaritic', + 'Shavian', + 'Osmanya', + 'Cypriot', + 'Braille', + 'Buginese', + 'Coptic', + 'New_Tai_Lue', + 'Glagolitic', + 'Tifinagh', + 'Syloti_Nagri', + 'Old_Persian', + 'Kharoshthi', + 'Balinese', + 'Cuneiform', + 'Phoenician', + 'Phags_Pa', + 'Nko', + 'Sundanese', + 'Lepcha', + 'Ol_Chiki', + 'Vai', + 'Saurashtra', + 'Kayah_Li', + 'Rejang', + 'Lycian', + 'Carian', + 'Lydian', + 'Cham', + 'Tai_Tham', + 'Tai_Viet', + 'Avestan', + 'Egyptian_Hieroglyphs', + 'Samaritan', + 'Lisu', + 'Bamum', + 'Javanese', + 'Meetei_Mayek', + 'Imperial_Aramaic', + 'Old_South_Arabian', + 'Inscriptional_Parthian', + 'Inscriptional_Pahlavi', + 'Old_Turkic', + 'Kaithi', + 'Batak', + 'Brahmi', + 'Mandaic', + 'Chakma', + 'Meroitic_Cursive', + 'Meroitic_Hieroglyphs', + 'Miao', + 'Sharada', + 'Sora_Sompeng', + 'Takri', + 'Caucasian_Albanian', + 'Bassa_Vah', + 'Duployan', + 'Elbasan', + 'Grantha', + 'Pahawh_Hmong', + 'Khojki', + 'Linear_A', + 'Mahajani', + 'Manichaean', + 'Mende_Kikakui', + 'Modi', + 'Mro', + 'Old_North_Arabian', + 'Nabataean', + 'Palmyrene', + 'Pau_Cin_Hau', + 'Old_Permic', + 'Psalter_Pahlavi', + 'Siddham', + 'Khudawadi', + 'Tirhuta', + 'Warang_Citi', + 'Ahom', + 'Anatolian_Hieroglyphs', + 'Hatran', + 'Multani', + 'Old_Hungarian', + 'SignWriting', + 'Adlam', + 'Bhaiksuki', + 'Marchen', + 'Newa', + 'Osage', + 'Tangut', + 'Masaram_Gondi', + 'Nushu', + 'Soyombo', + 'Zanabazar_Square', + 'Dogra', + 'Gunjala_Gondi', + 'Makasar', + 'Medefaidrin', + 'Hanifi_Rohingya', + 'Sogdian', + 'Old_Sogdian', + 'Elymaic', + 'Nandinagari', + 'Nyiakeng_Puachue_Hmong', + 'Wancho', + 'Chorasmian', + 'Dives_Akuru', + 'Khitan_Small_Script', + 'Yezidi', + 'Cypro_Minoan', + 'Old_Uyghur', + 'Tangsa', + 'Toto', + 'Vithkuqi', + 'Kawi', + 'Nag_Mundari', +]; \ No newline at end of file diff --git a/gen/script-trie.cc b/gen/script-trie.cc new file mode 100644 index 0000000..b05e16b --- /dev/null +++ b/gen/script-trie.cc @@ -0,0 +1,4 @@ +// generated from gen.js +#include +__attribute__((used)) +uint32_t script_trie[] = {18839, 919552, 0, 1042, 1050, 1058, 1066, 1042, 1082, 1090, 1090, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1096, 1042, 1104, 3015, 3015, 3015, 1112, 1120, 1898, 1899, 1907, 1967, 1967, 1967, 1967, 1974, 1967, 1967, 1967, 1967, 1978, 2012, 2019, 2025, 2030, 2036, 2042, 1128, 2062, 1136, 2066, 2062, 2062, 1142, 2062, 2185, 2189, 2074, 2062, 2197, 2201, 3372, 3374, 3565, 3570, 3732, 2082, 2087, 2062, 2062, 1150, 2209, 2209, 2213, 1158, 2227, 2233, 2240, 2248, 2256, 2262, 2270, 2278, 2286, 2292, 2299, 2307, 2315, 2321, 2328, 2336, 2344, 2352, 2360, 2367, 2387, 2393, 2400, 2408, 2416, 2422, 2429, 2437, 2445, 2450, 2457, 2464, 2472, 2479, 2487, 2495, 2511, 1166, 2512, 1074, 2520, 2527, 2535, 1074, 2543, 2543, 2549, 2554, 2545, 2559, 1174, 1074, 2567, 2567, 2567, 2567, 2567, 2576, 2583, 1182, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2658, 2658, 2664, 2658, 2672, 2662, 2680, 2658, 2676, 2658, 2686, 2694, 2702, 2742, 2742, 2745, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2781, 2789, 2789, 1190, 3064, 1198, 3072, 3080, 2797, 2797, 2798, 2803, 1206, 2811, 2811, 2813, 2811, 2761, 2753, 2765, 3088, 3096, 3104, 3109, 3217, 3222, 3228, 2797, 3198, 3502, 3503, 3511, 3519, 3023, 3028, 1074, 3311, 3311, 3316, 3320, 3382, 3382, 3703, 3706, 3390, 3392, 3399, 3403, 1986, 2587, 1214, 1222, 1807, 1814, 1817, 1825, 1807, 1832, 3015, 3015, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1911, 1899, 1915, 1923, 1899, 1931, 1935, 1943, 1230, 1042, 1042, 1237, 1245, 1042, 1253, 3036, 1042, 1261, 1266, 1807, 1274, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1281, 1280, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 3190, 3190, 3190, 3190, 3190, 3190, 3190, 3190, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1289, 1295, 1042, 1042, 1042, 3236, 3236, 3236, 1807, 3206, 3206, 3206, 3209, 2576, 2595, 3251, 3257, 2710, 2718, 2718, 1967, 1042, 1042, 1301, 1074, 2888, 2895, 2895, 2898, 2895, 2895, 2895, 2895, 2895, 2895, 2906, 1309, 1317, 1325, 2824, 2825, 1333, 1341, 2854, 1343, 2878, 2611, 2603, 2603, 1351, 2880, 1042, 1358, 2616, 1042, 1042, 1366, 1042, 1042, 1374, 1342, 2854, 2854, 1378, 1042, 1042, 1042, 1042, 1042, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 1042, 1042, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2962, 2967, 2962, 2974, 3578, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3411, 3416, 1967, 1967, 1967, 3594, 3594, 3596, 1042, 1386, 1807, 1807, 1392, 1807, 1840, 1847, 3265, 1400, 3362, 3364, 3424, 3424, 3431, 2209, 3439, 1408, 3447, 2624, 3612, 3612, 1416, 2568, 3483, 3486, 3494, 2567, 3527, 3527, 3535, 3620, 2726, 1855, 1424, 1431, 2742, 2742, 3628, 3633, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2632, 2639, 2642, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2914, 2895, 2895, 2918, 1074, 1862, 2050, 2058, 2062, 2062, 2062, 2095, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 1439, 2062, 2062, 2100, 2062, 2106, 2110, 1447, 1455, 1459, 1466, 2062, 2062, 2062, 1472, 1480, 1058, 1058, 1487, 1492, 2616, 2650, 1500, 2465, 3077, 3205, 3141, 3833, 4102, 3897, 1728, 3932, 1728, 1728, 1728, 1728, 3357, 3996, 3996, 3997, 4061, 1728, 1728, 1728, 3293, 3269, 2527, 1728, 2565, 2629, 2949, 3013, 2693, 2757, 2821, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 3421, 416, 3477, 3541, 416, 3552, 416, 416, 416, 3606, 1728, 3670, 416, 416, 3734, 416, 3769, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 2885, 3117, 3124, 3132, 1074, 3140, 3140, 3140, 3142, 1508, 1511, 1899, 1899, 1519, 1951, 1285, 1527, 1074, 1074, 1074, 1074, 3455, 3463, 3467, 1535, 2982, 2989, 2995, 4105, 3150, 3273, 3280, 1074, 3003, 3003, 3007, 3158, 3166, 3171, 4342, 4348, 3886, 3835, 3839, 3846, 4663, 4668, 1074, 1074, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3970, 3978, 3986, 1870, 1874, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 3867, 3867, 3867, 3873, 3878, 1073, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 3015, 3052, 1543, 1042, 1042, 1042, 1073, 1074, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1303, 1042, 1550, 1042, 1557, 1565, 1571, 1042, 1280, 1899, 1899, 1959, 1074, 1074, 1074, 1575, 1575, 1042, 1042, 1583, 1591, 1074, 1074, 1074, 1074, 1042, 1042, 1599, 1042, 1605, 1613, 1621, 1042, 1628, 1623, 1636, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1643, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1291, 1042, 4017, 4017, 4017, 4017, 4017, 4017, 4024, 1074, 4279, 4279, 4284, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1651, 1042, 1656, 1074, 1074, 1480, 1301, 1074, 1074, 1074, 1074, 1074, 1074, 2130, 2138, 2146, 2154, 2162, 2170, 1074, 2177, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1042, 1664, 1042, 1042, 1575, 1548, 1672, 1303, 1042, 1042, 1042, 1042, 1042, 1305, 1074, 1680, 1688, 1692, 1700, 1708, 1074, 1074, 1074, 1074, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1693, 1716, 1042, 1042, 1042, 1724, 1042, 1042, 1302, 1731, 1664, 1042, 1739, 1042, 1747, 1752, 1074, 1074, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1575, 1760, 1595, 1768, 1776, 1784, 1042, 1042, 1042, 1042, 1459, 1042, 1280, 1791, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1799, 1042, 1042, 1042, 1074, 1074, 1074, 1074, 3015, 3015, 3015, 3015, 3015, 3015, 3015, 3056, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4263, 4271, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1882, 1890, 1074, 1074, 1074, 1074, 1074, 1074, 3243, 1994, 1967, 1999, 2004, 1074, 1074, 1074, 4530, 4535, 4540, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4650, 4655, 4548, 4550, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4696, 4700, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 2734, 3179, 3182, 3641, 4087, 4071, 4079, 1074, 4222, 3354, 3475, 1074, 1074, 3777, 3757, 3764, 3769, 3288, 3295, 3303, 3649, 4063, 1074, 4002, 4009, 3543, 3546, 3657, 3665, 4113, 4121, 1074, 1074, 3673, 3673, 3679, 1074, 4238, 4242, 4238, 4250, 4470, 4476, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 2114, 4603, 4609, 1074, 2122, 4496, 4484, 4488, 4627, 4633, 4558, 4563, 4504, 4422, 4423, 1074, 1074, 1074, 4172, 4172, 4176, 4571, 4577, 4584, 1074, 1074, 4512, 4515, 4522, 4414, 4414, 4402, 4406, 4406, 2773, 4095, 4097, 2219, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4292, 4295, 4302, 4307, 4311, 4317, 1074, 1074, 4374, 4377, 4385, 4431, 4436, 4444, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4452, 4676, 4681, 4689, 1074, 1074, 3586, 2375, 2379, 3714, 3714, 3719, 3724, 3687, 3687, 3695, 3813, 3740, 3743, 3749, 3994, 3805, 3805, 3805, 2503, 3946, 3951, 3959, 1074, 4230, 4140, 4144, 4150, 3894, 3044, 3901, 3909, 1074, 1074, 1074, 1074, 4325, 4325, 4326, 4334, 4158, 4158, 4164, 1074, 1074, 1074, 1074, 1074, 4129, 4132, 4130, 1074, 4032, 4032, 4039, 2816, 3821, 3823, 3827, 1074, 4184, 4192, 4199, 1074, 1074, 1074, 1074, 1074, 2833, 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2825, 2841, 2846, 2870, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4394, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 2862, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3594, 3604, 4047, 4055, 4641, 4642, 3854, 3859, 3917, 3917, 3924, 3930, 3938, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4460, 4460, 4462, 1074, 1074, 1074, 3785, 3785, 3791, 3785, 3797, 1074, 1074, 2926, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 1074, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2918, 2895, 2895, 2895, 2895, 2895, 2895, 2934, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2930, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2942, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2934, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2950, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2954, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3330, 1074, 1074, 1074, 3328, 3328, 3328, 3338, 3328, 3328, 3328, 3328, 3328, 3328, 3346, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3554, 3557, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4207, 4214, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4358, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4592, 4595, 1074, 4366, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 4614, 4618, 4618, 4622, 66577, 66577, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 35, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 3, 3, 3, 3, 1, 3, 3, 3, 0, 0, 3, 3, 3, 3, 1, 3, 0, 0, 0, 0, 3, 1, 3, 1, 3, 3, 3, 0, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 1, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, 1, 1, 1, 1, 22, 22, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 1, 24, 24, 24, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 1, 1, 1, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 1, 1, 32, 1, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 1, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 41, 41, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 36, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 36, 36, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 25, 25, 1, 1, 1, 1, 1, 1, 1, 1, 36, 36, 36, 36, 1, 1, 1, 1, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 41, 41, 1, 1, 33, 33, 33, 1, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, 34, 34, 34, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 1, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 1, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0, 85, 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 0, 0, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 41, 41, 41, 41, 1, 1, 41, 41, 41, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41, 41, 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 33, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 6, 6, 6, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 41, 41, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 57, 57, 0, 57, 57, 0, 57, 57, 57, 57, 57, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 0, 6, 6, 0, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, 7, 7, 7, 0, 7, 7, 0, 7, 0, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 7, 0, 7, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 41, 41, 41, 41, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 0, 0, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 0, 0, 11, 11, 0, 0, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 11, 11, 0, 11, 11, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 0, 12, 12, 0, 12, 12, 0, 0, 12, 0, 12, 12, 12, 12, 12, 0, 0, 0, 0, 12, 12, 0, 0, 12, 12, 12, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 0, 12, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 13, 13, 13, 13, 0, 13, 13, 0, 13, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 0, 13, 13, 13, 0, 13, 13, 13, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 0, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, 0, 0, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 0, 15, 15, 0, 15, 0, 15, 15, 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 15, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 16, 16, 16, 16, 16, 0, 16, 16, 16, 0, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, 16, 16, 16, 0, 0, 16, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, 17, 0, 17, 17, 17, 0, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 17, 17, 0, 0, 0, 0, 0, 0, 17, 17, 0, 17, 17, 17, 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 18, 18, 18, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 0, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 21, 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 0, 0, 0, 0, 0, 24, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 0, 0, 0, 0, 0, 24, 0, 0, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 0, 26, 0, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 0, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 0, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 33, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 0, 34, 34, 34, 34, 34, 34, 34, 0, 34, 34, 0, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 137, 139, 36, 36, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 0, 0, 0, 0, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 0, 107, 107, 107, 107, 107, 0, 41, 107, 107, 107, 107, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 45, 45, 45, 0, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 46, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 52, 52, 52, 52, 52, 52, 0, 0, 52, 0, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, 52, 52, 0, 0, 0, 52, 0, 0, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 0, 0, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0, 0, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 0, 0, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 0, 0, 0, 0, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 61, 61, 61, 0, 61, 61, 0, 0, 0, 0, 0, 61, 61, 61, 61, 61, 61, 61, 61, 0, 61, 61, 61, 0, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 61, 61, 61, 0, 0, 0, 0, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 0, 0, 0, 0, 0, 0, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 0, 0, 0, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 0, 63, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 0, 0, 0, 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 0, 0, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 0, 0, 0, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, 0, 0, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 0, 0, 0, 0, 0, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 0, 0, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 0, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 0, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, 0, 89, 89, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, 0, 0, 0, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 0, 161, 161, 161, 161, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 0, 0, 0, 0, 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 105, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 107, 107, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 107, 107, 0, 0, 107, 107, 107, 0, 0, 107, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 0, 0, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, 0, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 0, 0, 0, 0, 0, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 0, 0, 0, 0, 115, 115, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, 0, 0, 0, 0, 0, 0, 0, 117, 117, 117, 117, 117, 117, 117, 117, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 0, 0, 0, 0, 0, 0, 0, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, 0, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 0, 0, 0, 0, 0, 0, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, 0, 0, 0, 0, 0, 0, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, 0, 0, 0, 0, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 128, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 0, 129, 0, 129, 129, 129, 129, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 0, 129, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 0, 138, 138, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 138, 0, 138, 138, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, 0, 143, 143, 143, 143, 143, 143, 0, 143, 143, 0, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, 143, 143, 0, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, 0, 0, 0, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 150, 150, 150, 150, 150, 150, 150, 0, 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 0, 0, 150, 150, 150, 150, 150, 150, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, 0, 151, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, 154, 0, 0, 154, 0, 0, 154, 154, 154, 154, 154, 154, 154, 154, 0, 154, 154, 0, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 0, 154, 154, 0, 0, 154, 154, 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 0, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 0, 156, 156, 156, 0, 0, 156, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 0, 161, 161, 161, 161, 161, 161, 161, 0, 161, 161, 0, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 0, 161, 161, 161, 161, 161, 161, 161, 0, 161, 161, 0, 0, 0, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 0, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 0, 0, 0, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/overflow.wasm b/overflow.wasm index 61930c025ac0055800f6d231d597ed72f5a5d40a..6afe514e8f10dfd6b6ee31b4444a4225aaf9a960 100755 GIT binary patch delta 81393 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 MFc0qi&HVTO01||UcK`qY delta 30863 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 cN=j", - "license": "MIT", - "dependencies": { - "itemizer": "^1.0.6" - } + "license": "MIT" } diff --git a/src/deps.ts b/src/deps.ts deleted file mode 100644 index e8b061f..0000000 --- a/src/deps.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ItemizerInit from 'itemizer'; - -export const itemizer = await ItemizerInit; diff --git a/src/itemize.ts b/src/itemize.ts index 935c348..eb64141 100644 --- a/src/itemize.ts +++ b/src/itemize.ts @@ -1,5 +1,6 @@ import {createTrie} from './unicode-trie.js'; import wasm from './wasm.js'; +import SCRIPT_NAMES from '../gen/script-names.js'; // I don't know why the pointer value is stored directly in the .value here. // It must be an emscripten weirdness, so watch out in the future @@ -8,6 +9,11 @@ const emojiTrie = createTrie( wasm.instance.exports.emoji_trie.value ); +const scriptTrie = createTrie( + wasm.instance.exports.memory.buffer, + wasm.instance.exports.script_trie.value +); + const { // SheenBidi SBAlgorithmCreate, @@ -176,3 +182,164 @@ export function* emojiIterator(str: Uint16Array) { yield* scan(types, offsets); } + +const pairedChars = [ + 0x0028, 0x0029, /* ascii paired punctuation */ + 0x003c, 0x003e, + 0x005b, 0x005d, + 0x007b, 0x007d, + 0x00ab, 0x00bb, /* guillemets */ + 0x0f3a, 0x0f3b, /* tibetan */ + 0x0f3c, 0x0f3d, + 0x169b, 0x169c, /* ogham */ + 0x2018, 0x2019, /* general punctuation */ + 0x201c, 0x201d, + 0x2039, 0x203a, + 0x2045, 0x2046, + 0x207d, 0x207e, + 0x208d, 0x208e, + 0x27e6, 0x27e7, /* math */ + 0x27e8, 0x27e9, + 0x27ea, 0x27eb, + 0x27ec, 0x27ed, + 0x27ee, 0x27ef, + 0x2983, 0x2984, + 0x2985, 0x2986, + 0x2987, 0x2988, + 0x2989, 0x298a, + 0x298b, 0x298c, + 0x298d, 0x298e, + 0x298f, 0x2990, + 0x2991, 0x2992, + 0x2993, 0x2994, + 0x2995, 0x2996, + 0x2997, 0x2998, + 0x29fc, 0x29fd, + 0x2e02, 0x2e03, + 0x2e04, 0x2e05, + 0x2e09, 0x2e0a, + 0x2e0c, 0x2e0d, + 0x2e1c, 0x2e1d, + 0x2e20, 0x2e21, + 0x2e22, 0x2e23, + 0x2e24, 0x2e25, + 0x2e26, 0x2e27, + 0x2e28, 0x2e29, + 0x3008, 0x3009, /* chinese paired punctuation */ + 0x300a, 0x300b, + 0x300c, 0x300d, + 0x300e, 0x300f, + 0x3010, 0x3011, + 0x3014, 0x3015, + 0x3016, 0x3017, + 0x3018, 0x3019, + 0x301a, 0x301b, + 0xfe59, 0xfe5a, + 0xfe5b, 0xfe5c, + 0xfe5d, 0xfe5e, + 0xff08, 0xff09, + 0xff3b, 0xff3d, + 0xff5b, 0xff5d, + 0xff5f, 0xff60, + 0xff62, 0xff63 +]; + +function getPairIndex(ch: number) { + let lower = 0; + let upper = pairedChars.length - 1; + + while (lower <= upper) { + const mid = Math.floor((lower + upper) / 2); + + if (ch < pairedChars[mid]) { + upper = mid - 1; + } else if (ch > pairedChars[mid]) { + lower = mid + 1; + } else { + return mid; + } + } + + return -1; +} + +export function* scriptIterator(text: string) { + let textEnd = text.length; + let scriptEnd = 0; + let runningScript = 'Common'; + let startParen = -1; + const parens = []; + + if (!text.length) return; + + while (scriptEnd < textEnd) { + let jump = 1; + let code = text.charCodeAt(scriptEnd); + const next = text.charCodeAt(scriptEnd + 1); + + // If a surrogate pair + if ((0xd800 <= code && code <= 0xdbff) && (0xdc00 <= next && next <= 0xdfff)) { + jump += 1; + code = ((code - 0xd800) * 0xd400) + (next - 0xdc00) + 0x10000; + } + + let script = SCRIPT_NAMES[scriptTrie.get(code)] || 'Common'; + const pairIndex = script !== 'Common' ? -1 : getPairIndex(code); + + // Paired character handling: + // if it's an open character, push it onto the stack + // if it's a close character, find the matching open on the stack, and use + // that script code. Any non-matching open characters above it on the stack + // will be popped. + if (pairIndex >= 0) { + if ((pairIndex & 1) === 0) { + parens.push({index: pairIndex, script: runningScript}); + } else if (parens.length > 0) { + const pi = pairIndex & ~1; + + while (parens.length && parens[parens.length - 1].index !== pi) { + parens.pop(); + } + + if (parens.length - 1 < startParen) { + startParen = parens.length - 1; + } + + if (parens.length > 0) { + script = parens[parens.length - 1].script; + } + } + } + + const runningIsReal = runningScript !== 'Common' && runningScript !== 'Inherited'; + const isReal = script !== 'Common' && script !== 'Inherited'; + const isSame = !runningIsReal || !isReal || script === runningScript; + + if (isSame) { + if (!runningIsReal && isReal) { + runningScript = script; + + // Now that we have a final script code, fix any open characters we + // pushed before we knew the real script code. + while (parens[startParen + 1]) parens[++startParen].script = script; + + if (pairIndex >= 0 && pairIndex & 1 && parens.length > 0) { + parens.pop(); + + if (parens.length - 1 < startParen) { + startParen = parens.length - 1; + } + } + } + + scriptEnd += jump; + } else { + yield {i: scriptEnd, script: runningScript}; + + startParen = parens.length - 1; + runningScript = 'Common'; + } + } + + yield {i: scriptEnd, script: runningScript}; +} diff --git a/src/text.ts b/src/text.ts index e79f406..aaebf9d 100644 --- a/src/text.ts +++ b/src/text.ts @@ -4,8 +4,7 @@ import {Style, initialStyle, createComputedStyle, Color, TextAlign, WhiteSpace} import {IfcInline, Inline, BlockContainer, LayoutContext, createInlineIterator, createPreorderInlineIterator, IfcVacancy, layoutFloatBox} from './flow.js'; import LineBreak from './line-break.js'; import {nextGraphemeBreak, previousGraphemeBreak} from './grapheme-break.js'; -import {itemizer} from './deps.js'; -import {bidiIterator, emojiIterator} from './itemize.js'; +import {bidiIterator, emojiIterator, scriptIterator} from './itemize.js'; import * as hb from './harfbuzz.js'; import {getCascade} from './font.js'; @@ -1661,7 +1660,7 @@ export class Paragraph { let iStyle: ReturnType | undefined; let iEmoji: ReturnType | undefined; let iBidi: ReturnType | undefined; - let iScript: ReturnType | undefined; + let iScript: ReturnType | undefined; let free = () => {}; if (this.ifc.hasInlines() || this.ifc.hasBreaks()) { @@ -1675,7 +1674,7 @@ export class Paragraph { for (let i = 0; i < this.string.length; i++) buf[i] = this.string.charCodeAt(i); iEmoji = emojiIterator(buf); iBidi = bidiIterator(buf, this.ifc.style.direction === 'ltr' ? 0 : 1); - iScript = itemizer.script(this.string); + iScript = scriptIterator(this.string); } let emoji = iEmoji?.next(); diff --git a/yarn.lock b/yarn.lock index f506c2e..1d11131 100644 --- a/yarn.lock +++ b/yarn.lock @@ -97,11 +97,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -488,14 +483,6 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -itemizer@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/itemizer/-/itemizer-1.0.6.tgz#fafa1ec65d071ac115795cf2f465973aef52c06e" - integrity sha512-gXqu6lz48UiPczy9Ur4jVevECJpcu79jlDn2k9CElkDzYXZZDE28pmTAG4NkzzjIssLzRpNvZUGaz2WN0P3A3w== - dependencies: - unicode-properties "^1.4.1" - unicode-trie "^2.0.0" - js-yaml@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -698,11 +685,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -pako@^0.2.5: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -895,11 +877,6 @@ tar@^6.1.11: mkdirp "^1.0.3" yallist "^4.0.0" -tiny-inflate@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" - integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -932,22 +909,6 @@ typescript@^4.9.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== -unicode-properties@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.4.1.tgz#96a9cffb7e619a0dc7368c28da27e05fc8f9be5f" - integrity sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg== - dependencies: - base64-js "^1.3.0" - unicode-trie "^2.0.0" - -unicode-trie@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" - integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== - dependencies: - pako "^0.2.5" - tiny-inflate "^1.0.0" - util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"