diff options
Diffstat (limited to 'src/storage')
26 files changed, 0 insertions, 16025 deletions
diff --git a/src/storage/CMakeLists.txt b/src/storage/CMakeLists.txt deleted file mode 100644 index e33e213..0000000 --- a/src/storage/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -set( - CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" -) - -set( - LIBSTORAGE_HEADERS - chewing_key.h - pinyin_custom2.h -) - -set( - LIBSTORAGE_SOURCES - phrase_index.cpp - phrase_large_table2.cpp - ngram.cpp - tag_utility.cpp - pinyin_parser2.cpp - chewing_large_table.cpp -) - -add_library( - storage - STATIC - ${LIBSTORAGE_SOURCES} -) - -target_link_libraries( - storage - ${GLIB2_LIBRARIES} - ${BERKELEY_DB_LIBRARIES} -) - -install( - FILES - ${LIBSTORAGE_HEADERS} - DESTINATION - ${DIR_INCLUDE_LIBPINYIN} -) diff --git a/src/storage/Makefile.am b/src/storage/Makefile.am deleted file mode 100644 index f39ce09..0000000 --- a/src/storage/Makefile.am +++ /dev/null @@ -1,58 +0,0 @@ -## Makefile.am -- Process this file with automake to produce Makefile.in -## Copyright (C) 2007 Peng Wu -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2, or (at your option) -## any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -INCLUDES = -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/src/storage \ - @GLIB2_CFLAGS@ - -libzhuyinincludedir = $(includedir)/libzhuyin-@VERSION@ - -libzhuyininclude_HEADERS= zhuyin_custom2.h - - -noinst_HEADERS = chewing_enum.h \ - chewing_key.h \ - pinyin_parser2.h \ - phrase_index.h \ - phrase_index_logger.h \ - phrase_large_table2.h \ - ngram.h \ - flexible_ngram.h \ - tag_utility.h \ - pinyin_parser_table.h \ - chewing_table.h \ - pinyin_phrase2.h \ - chewing_large_table.h \ - facade_chewing_table.h \ - facade_phrase_table2.h \ - table_info.h - - -noinst_LTLIBRARIES = libstorage.la - -libstorage_la_CXXFLAGS = "-fPIC" - -libstorage_la_LDFLAGS = -static - -libstorage_la_SOURCES = phrase_index.cpp \ - phrase_large_table2.cpp \ - ngram.cpp \ - tag_utility.cpp \ - pinyin_parser2.cpp \ - chewing_large_table.cpp \ - table_info.cpp - diff --git a/src/storage/chewing_enum.h b/src/storage/chewing_enum.h deleted file mode 100644 index 1140e93..0000000 --- a/src/storage/chewing_enum.h +++ /dev/null @@ -1,104 +0,0 @@ -/* This file is generated by python scripts. Don't edit this file directly. - */ - -#ifndef CHEWING_ENUM_H -#define CHEWING_ENUM_H - -namespace zhuyin{ - -/** - * @brief enums of chewing initial element. - */ - -enum ChewingInitial -{ -CHEWING_ZERO_INITIAL = 0, -CHEWING_B = 1, -CHEWING_C = 2, -CHEWING_CH = 3, -CHEWING_D = 4, -CHEWING_F = 5, -CHEWING_H = 6, -CHEWING_G = 7, -CHEWING_K = 8, -CHEWING_J = 9, -CHEWING_M = 10, -CHEWING_N = 11, -CHEWING_L = 12, -CHEWING_R = 13, -CHEWING_P = 14, -CHEWING_Q = 15, -CHEWING_S = 16, -CHEWING_SH = 17, -CHEWING_T = 18, -PINYIN_W = 19, -CHEWING_X = 20, -PINYIN_Y = 21, -CHEWING_Z = 22, -CHEWING_ZH = 23, -CHEWING_LAST_INITIAL = CHEWING_ZH, -CHEWING_NUMBER_OF_INITIALS = CHEWING_LAST_INITIAL + 1 -}; - - -/** - * @brief enums of chewing middle element. - */ - -enum ChewingMiddle -{ -CHEWING_ZERO_MIDDLE = 0, -CHEWING_I = 1, -CHEWING_U = 2, -CHEWING_V = 3, -CHEWING_LAST_MIDDLE = CHEWING_V, -CHEWING_NUMBER_OF_MIDDLES = CHEWING_LAST_MIDDLE + 1 -}; - - -/** - * @brief enums of chewing final element. - */ -enum ChewingFinal -{ -CHEWING_ZERO_FINAL = 0, -CHEWING_A = 1, -CHEWING_AI = 2, -CHEWING_AN = 3, -CHEWING_ANG = 4, -CHEWING_AO = 5, -CHEWING_E = 6, -INVALID_EA = 7, -CHEWING_EI = 8, -CHEWING_EN = 9, -CHEWING_ENG = 10, -CHEWING_ER = 11, -CHEWING_NG = 12, -CHEWING_O = 13, -PINYIN_ONG = 14, -CHEWING_OU = 15, -PINYIN_IN = 16, -PINYIN_ING = 17, -CHEWING_LAST_FINAL = PINYIN_ING, -CHEWING_NUMBER_OF_FINALS = CHEWING_LAST_FINAL + 1 -}; - - -/** - * @brief enums of chewing tone element. - */ -enum ChewingTone -{ -CHEWING_ZERO_TONE = 0, -CHEWING_1 = 1, -CHEWING_2 = 2, -CHEWING_3 = 3, -CHEWING_4 = 4, -CHEWING_5 = 5, -CHEWING_LAST_TONE = CHEWING_5, -CHEWING_NUMBER_OF_TONES = CHEWING_LAST_TONE + 1 -}; - -}; - -#endif diff --git a/src/storage/chewing_key.h b/src/storage/chewing_key.h deleted file mode 100644 index 47d45e1..0000000 --- a/src/storage/chewing_key.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef CHEWING_KEY_H -#define CHEWING_KEY_H - -#include <glib.h> -#include "chewing_enum.h" -#include "zhuyin_custom2.h" - -using namespace zhuyin; - -G_BEGIN_DECLS - -/** @file chewing_key.h - * @brief the definitions of chewing key related classes and structs. - */ - - -/** Note: The parsed pinyins are stored in the following two - * GArrays to speed up chewing table lookup. - * As the chewing large table only contains information of struct ChewingKey. - */ - -struct _ChewingKey -{ - guint16 m_initial : 5; - guint16 m_middle : 2; - guint16 m_final : 5; - guint16 m_tone : 3; - - _ChewingKey() { - m_initial = CHEWING_ZERO_INITIAL; - m_middle = CHEWING_ZERO_MIDDLE; - m_final = CHEWING_ZERO_FINAL; - m_tone = CHEWING_ZERO_TONE; - } - - _ChewingKey(ChewingInitial initial, ChewingMiddle middle, - ChewingFinal final) { - m_initial = initial; - m_middle = middle; - m_final = final; - m_tone = CHEWING_ZERO_TONE; - } - -public: - gint get_table_index(); - - /* Note: the return value should be freed by g_free. */ - gchar * get_pinyin_string(ZhuyinScheme scheme = FULL_PINYIN_DEFAULT); - gchar * get_bopomofo_string(); -}; - -typedef struct _ChewingKey ChewingKey; - -static inline bool operator == (ChewingKey lhs, ChewingKey rhs) { - if (lhs.m_initial != rhs.m_initial) - return false; - if (lhs.m_middle != rhs.m_middle) - return false; - if (lhs.m_final != rhs.m_final) - return false; - if (lhs.m_tone != rhs.m_tone) - return false; - return true; -} - -struct _ChewingKeyRest -{ - /* Note: the table index is removed, - * Please use get_table_index in ChewingKey. - */ - guint16 m_raw_begin; /* the begin of the raw input. */ - guint16 m_raw_end; /* the end of the raw input. */ - - _ChewingKeyRest() { - /* the 0th item in pinyin parser table is reserved for invalid. */ - m_raw_begin = 0; - m_raw_end = 0; - } - - guint16 length() { - return m_raw_end - m_raw_begin; - } -}; - -typedef struct _ChewingKeyRest ChewingKeyRest; - -G_END_DECLS - -#endif diff --git a/src/storage/chewing_large_table.cpp b/src/storage/chewing_large_table.cpp deleted file mode 100644 index c86e759..0000000 --- a/src/storage/chewing_large_table.cpp +++ /dev/null @@ -1,1047 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "chewing_large_table.h" -#include <assert.h> -#include "pinyin_phrase2.h" -#include "pinyin_parser2.h" - - -/* internal class definition */ - -namespace zhuyin{ -class ChewingLengthIndexLevel{ - -protected: - GArray * m_chewing_array_indexes; - -public: - /* constructor/destructor */ - ChewingLengthIndexLevel(); - ~ChewingLengthIndexLevel(); - - /* load/store method */ - bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end); - bool store(MemoryChunk * new_chunk, table_offset_t offset, - table_offset_t & end); - - /* search method */ - int search(pinyin_option_t options, int phrase_length, - /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const; - - /* add/remove index method */ - int add_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token); - int remove_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token); - - /* get length method */ - int get_length() const; - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - - -template<size_t phrase_length> -class ChewingArrayIndexLevel{ -protected: - typedef PinyinIndexItem2<phrase_length> IndexItem; - -protected: - MemoryChunk m_chunk; - - /* compress consecutive tokens */ - int convert(pinyin_option_t options, - const ChewingKey keys[], - IndexItem * begin, - IndexItem * end, - PhraseIndexRanges ranges) const; - -public: - /* load/store method */ - bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end); - bool store(MemoryChunk * new_chunk, table_offset_t offset, - table_offset_t & end); - - /* search method */ - int search(pinyin_option_t options, /* in */const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const; - - /* add/remove index method */ - int add_index(/* in */ const ChewingKey keys[], /* in */ phrase_token_t token); - int remove_index(/* in */ const ChewingKey keys[], - /* in */ phrase_token_t token); - - /* get length method */ - int get_length() const; - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - -}; - - -using namespace zhuyin; - -/* class implementation */ - -ChewingBitmapIndexLevel::ChewingBitmapIndexLevel(pinyin_option_t options) - : m_options(options) { - memset(m_chewing_length_indexes, 0, sizeof(m_chewing_length_indexes)); -} - -void ChewingBitmapIndexLevel::reset() { - for (int k = CHEWING_ZERO_INITIAL; k < CHEWING_NUMBER_OF_INITIALS; ++k) - for (int l = CHEWING_ZERO_MIDDLE; l < CHEWING_NUMBER_OF_MIDDLES; ++l) - for (int m = CHEWING_ZERO_FINAL; m < CHEWING_NUMBER_OF_FINALS; ++m) - for (int n = CHEWING_ZERO_TONE; n < CHEWING_NUMBER_OF_TONES; - ++n) { - ChewingLengthIndexLevel * & length_array = - m_chewing_length_indexes[k][l][m][n]; - if (length_array) - delete length_array; - length_array = NULL; - } -} - - -/* search method */ - -int ChewingBitmapIndexLevel::search(int phrase_length, - /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const { - assert(phrase_length > 0); - return initial_level_search(phrase_length, keys, ranges); -} - -int ChewingBitmapIndexLevel::initial_level_search (int phrase_length, - /* in */ const ChewingKey keys[], /* out */ PhraseIndexRanges ranges) const { - -/* macros */ -#define MATCH(AMBIGUITY, ORIGIN, ANOTHER) case ORIGIN: \ - { \ - result |= middle_and_final_level_search(ORIGIN, phrase_length, \ - keys, ranges); \ - if (m_options & AMBIGUITY) { \ - result |= middle_and_final_level_search(ANOTHER, \ - phrase_length, \ - keys, ranges); \ - } \ - return result; \ - } - - /* deal with ambiguities */ - int result = SEARCH_NONE; - const ChewingKey & first_key = keys[0]; - - switch(first_key.m_initial) { - MATCH(ZHUYIN_AMB_C_CH, CHEWING_C, CHEWING_CH); - MATCH(ZHUYIN_AMB_C_CH, CHEWING_CH, CHEWING_C); - MATCH(ZHUYIN_AMB_Z_ZH, CHEWING_Z, CHEWING_ZH); - MATCH(ZHUYIN_AMB_Z_ZH, CHEWING_ZH, CHEWING_Z); - MATCH(ZHUYIN_AMB_S_SH, CHEWING_S, CHEWING_SH); - MATCH(ZHUYIN_AMB_S_SH, CHEWING_SH, CHEWING_S); - MATCH(ZHUYIN_AMB_L_R, CHEWING_R, CHEWING_L); - MATCH(ZHUYIN_AMB_L_N, CHEWING_N, CHEWING_L); - MATCH(ZHUYIN_AMB_F_H, CHEWING_F, CHEWING_H); - MATCH(ZHUYIN_AMB_F_H, CHEWING_H, CHEWING_F); - MATCH(ZHUYIN_AMB_G_K, CHEWING_G, CHEWING_K); - MATCH(ZHUYIN_AMB_G_K, CHEWING_K, CHEWING_G); - - case CHEWING_L: - { - result |= middle_and_final_level_search - (CHEWING_L, phrase_length, keys, ranges); - - if (m_options & ZHUYIN_AMB_L_N) - result |= middle_and_final_level_search - (CHEWING_N, phrase_length, keys,ranges); - - if (m_options & ZHUYIN_AMB_L_R) - result |= middle_and_final_level_search - (CHEWING_R, phrase_length, keys, ranges); - return result; - } - default: - { - result |= middle_and_final_level_search - ((ChewingInitial) first_key.m_initial, - phrase_length, keys, ranges); - return result; - } - } -#undef MATCH - return result; -} - - -int ChewingBitmapIndexLevel::middle_and_final_level_search -(ChewingInitial initial, int phrase_length, /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const { - -/* macros */ -#define MATCH(AMBIGUITY, ORIGIN, ANOTHER) case ORIGIN: \ - { \ - result = tone_level_search \ - (initial, middle, \ - ORIGIN, phrase_length, keys, ranges); \ - if (m_options & AMBIGUITY) { \ - result |= tone_level_search \ - (initial, middle, \ - ANOTHER, phrase_length, keys, ranges); \ - } \ - return result; \ - } - - int result = SEARCH_NONE; - const ChewingKey & first_key = keys[0]; - const ChewingMiddle middle = (ChewingMiddle)first_key.m_middle; - - switch(first_key.m_final) { - case CHEWING_ZERO_FINAL: - { - if (middle == CHEWING_ZERO_MIDDLE) { /* in-complete pinyin */ - if (!(m_options & PINYIN_INCOMPLETE)) - return result; - for (int m = CHEWING_ZERO_MIDDLE; - m < CHEWING_NUMBER_OF_MIDDLES; ++m) - for (int n = CHEWING_ZERO_FINAL; - n < CHEWING_NUMBER_OF_FINALS; ++n) { - - if (CHEWING_ZERO_MIDDLE == m && - CHEWING_ZERO_FINAL == n) - continue; - - result |= tone_level_search - (initial, (ChewingMiddle) m, (ChewingFinal) n, - phrase_length, keys, ranges); - } - return result; - } else { /* normal pinyin */ - result |= tone_level_search - (initial, middle, CHEWING_ZERO_FINAL, - phrase_length, keys, ranges); - return result; - } - } - - MATCH(ZHUYIN_AMB_AN_ANG, CHEWING_AN, CHEWING_ANG); - MATCH(ZHUYIN_AMB_AN_ANG, CHEWING_ANG, CHEWING_AN); - MATCH(ZHUYIN_AMB_EN_ENG, CHEWING_EN, CHEWING_ENG); - MATCH(ZHUYIN_AMB_EN_ENG, CHEWING_ENG, CHEWING_EN); - MATCH(ZHUYIN_AMB_IN_ING, PINYIN_IN, PINYIN_ING); - MATCH(ZHUYIN_AMB_IN_ING, PINYIN_ING, PINYIN_IN); - - default: - { - result |= tone_level_search - (initial, middle, (ChewingFinal) first_key.m_final, - phrase_length, keys, ranges); - return result; - } - } -#undef MATCH - return result; -} - - -int ChewingBitmapIndexLevel::tone_level_search -(ChewingInitial initial, ChewingMiddle middle, ChewingFinal final, - int phrase_length, /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const { - - int result = SEARCH_NONE; - const ChewingKey & first_key = keys[0]; - - switch (first_key.m_tone) { - case CHEWING_ZERO_TONE: - { - /* deal with zero tone in chewing large table. */ - for (int i = CHEWING_ZERO_TONE; i < CHEWING_NUMBER_OF_TONES; ++i) { - ChewingLengthIndexLevel * phrases = - m_chewing_length_indexes - [initial][middle][final][(ChewingTone)i]; - if (phrases) - result |= phrases->search - (m_options, phrase_length - 1, keys + 1, ranges); - } - return result; - } - default: - { - ChewingLengthIndexLevel * phrases = - m_chewing_length_indexes - [initial][middle][final][CHEWING_ZERO_TONE]; - if (phrases) - result |= phrases->search - (m_options, phrase_length - 1, keys + 1, ranges); - - phrases = m_chewing_length_indexes - [initial][middle][final][(ChewingTone) first_key.m_tone]; - if (phrases) - result |= phrases->search - (m_options, phrase_length - 1, keys + 1, ranges); - return result; - } - } - return result; -} - - -ChewingLengthIndexLevel::ChewingLengthIndexLevel() { - m_chewing_array_indexes = g_array_new(FALSE, TRUE, sizeof(void *)); -} - -ChewingLengthIndexLevel::~ChewingLengthIndexLevel() { -#define CASE(len) case len: \ - { \ - ChewingArrayIndexLevel<len> * & array = g_array_index \ - (m_chewing_array_indexes, ChewingArrayIndexLevel<len> *, len); \ - if (array) \ - delete array; \ - array = NULL; \ - break; \ - } - - for (guint i = 0; i < m_chewing_array_indexes->len; ++i) { - switch (i){ - CASE(0); - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - default: - assert(false); - } - } -#undef CASE - g_array_free(m_chewing_array_indexes, TRUE); -} - - -int ChewingLengthIndexLevel::search(pinyin_option_t options, int phrase_length, - /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const { - int result = SEARCH_NONE; - if ((int) m_chewing_array_indexes->len < phrase_length + 1) - return result; - if ((int) m_chewing_array_indexes->len > phrase_length + 1) - result |= SEARCH_CONTINUED; - -#define CASE(len) case len: \ - { \ - ChewingArrayIndexLevel<len> * & array = g_array_index \ - (m_chewing_array_indexes, ChewingArrayIndexLevel<len> *, len); \ - if (!array) \ - return result; \ - result |= array->search(options, keys, ranges); \ - return result; \ - } - - switch (phrase_length) { - CASE(0); - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - default: - assert(false); - } - -#undef CASE -} - - -template<size_t phrase_length> -int ChewingArrayIndexLevel<phrase_length>::search -(pinyin_option_t options, /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const { - IndexItem * chunk_begin = NULL, * chunk_end = NULL; - chunk_begin = (IndexItem *) m_chunk.begin(); - chunk_end = (IndexItem *) m_chunk.end(); - - /* do the search */ - ChewingKey left_keys[phrase_length], right_keys[phrase_length]; - compute_lower_value2(options, keys, left_keys, phrase_length); - compute_upper_value2(options, keys, right_keys, phrase_length); - - IndexItem left(left_keys, -1), right(right_keys, -1); - - IndexItem * begin = std_lite::lower_bound - (chunk_begin, chunk_end, left, - phrase_exact_less_than2<phrase_length>); - IndexItem * end = std_lite::upper_bound - (chunk_begin, chunk_end, right, - phrase_exact_less_than2<phrase_length>); - - return convert(options, keys, begin, end, ranges); -} - -/* compress consecutive tokens */ -template<size_t phrase_length> -int ChewingArrayIndexLevel<phrase_length>::convert -(pinyin_option_t options, const ChewingKey keys[], - IndexItem * begin, IndexItem * end, - PhraseIndexRanges ranges) const { - IndexItem * iter = NULL; - PhraseIndexRange cursor; - GArray * head, * cursor_head = NULL; - - int result = SEARCH_NONE; - /* TODO: check the below code */ - cursor.m_range_begin = null_token; cursor.m_range_end = null_token; - for (iter = begin; iter != end; ++iter) { - if (0 != pinyin_compare_with_ambiguities2 - (options, keys, iter->m_keys, phrase_length)) - continue; - - phrase_token_t token = iter->m_token; - head = ranges[PHRASE_INDEX_LIBRARY_INDEX(token)]; - if (NULL == head) - continue; - - result |= SEARCH_OK; - - if (null_token == cursor.m_range_begin) { - cursor.m_range_begin = token; - cursor.m_range_end = token + 1; - cursor_head = head; - } else if (cursor.m_range_end == token && - PHRASE_INDEX_LIBRARY_INDEX(cursor.m_range_begin) == - PHRASE_INDEX_LIBRARY_INDEX(token)) { - ++cursor.m_range_end; - } else { - g_array_append_val(cursor_head, cursor); - cursor.m_range_begin = token; cursor.m_range_end = token + 1; - cursor_head = head; - } - } - - if (null_token == cursor.m_range_begin) - return result; - - g_array_append_val(cursor_head, cursor); - return result; -} - - -/* add/remove index method */ - -int ChewingBitmapIndexLevel::add_index(int phrase_length, - /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - const ChewingKey first_key = keys[0]; - ChewingLengthIndexLevel * & length_array = m_chewing_length_indexes - [first_key.m_initial][first_key.m_middle] - [first_key.m_final][first_key.m_tone]; - - if (NULL == length_array) { - length_array = new ChewingLengthIndexLevel(); - } - - return length_array->add_index(phrase_length - 1, keys + 1, token); -} - -int ChewingBitmapIndexLevel::remove_index(int phrase_length, - /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - const ChewingKey first_key = keys[0]; - ChewingLengthIndexLevel * & length_array = m_chewing_length_indexes - [first_key.m_initial][first_key.m_middle] - [first_key.m_final][first_key.m_tone]; - - if (NULL == length_array) - return ERROR_REMOVE_ITEM_DONOT_EXISTS; - - int retval = length_array->remove_index(phrase_length - 1, keys + 1, token); - - /* remove empty array. */ - if (0 == length_array->get_length()) { - delete length_array; - length_array = NULL; - } - - return retval; -} - -int ChewingLengthIndexLevel::add_index(int phrase_length, - /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - if (!(phrase_length + 1 < MAX_PHRASE_LENGTH)) - return ERROR_PHRASE_TOO_LONG; - - if ((int) m_chewing_array_indexes->len <= phrase_length) - g_array_set_size(m_chewing_array_indexes, phrase_length + 1); - -#define CASE(len) case len: \ - { \ - ChewingArrayIndexLevel<len> * & array = g_array_index \ - (m_chewing_array_indexes, \ - ChewingArrayIndexLevel<len> *, len); \ - if (NULL == array) \ - array = new ChewingArrayIndexLevel<len>; \ - return array->add_index(keys, token); \ - } - - switch(phrase_length) { - CASE(0); - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - default: - assert(false); - } - -#undef CASE -} - -int ChewingLengthIndexLevel::remove_index(int phrase_length, - /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - if (!(phrase_length + 1 < MAX_PHRASE_LENGTH)) - return ERROR_PHRASE_TOO_LONG; - - if ((int) m_chewing_array_indexes->len <= phrase_length) - return ERROR_REMOVE_ITEM_DONOT_EXISTS; - -#define CASE(len) case len: \ - { \ - ChewingArrayIndexLevel<len> * & array = g_array_index \ - (m_chewing_array_indexes, \ - ChewingArrayIndexLevel<len> *, len); \ - if (NULL == array) \ - return ERROR_REMOVE_ITEM_DONOT_EXISTS; \ - int retval = array->remove_index(keys, token); \ - \ - /* remove empty array. */ \ - if (0 == array->get_length()) { \ - delete array; \ - array = NULL; \ - \ - /* shrink self array. */ \ - g_array_set_size(m_chewing_array_indexes, \ - get_length()); \ - } \ - return retval; \ - } - - switch (phrase_length) { - CASE(0); - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - default: - assert(false); - } - -#undef CASE -} - -template<size_t phrase_length> -int ChewingArrayIndexLevel<phrase_length>::add_index -(/* in */ const ChewingKey keys[], /* in */ phrase_token_t token) { - IndexItem * begin, * end; - - IndexItem add_elem(keys, token); - begin = (IndexItem *) m_chunk.begin(); - end = (IndexItem *) m_chunk.end(); - - std_lite::pair<IndexItem *, IndexItem *> range; - range = std_lite::equal_range - (begin, end, add_elem, phrase_exact_less_than2<phrase_length>); - - IndexItem * cur_elem; - for (cur_elem = range.first; - cur_elem != range.second; ++cur_elem) { - if (cur_elem->m_token == token) - return ERROR_INSERT_ITEM_EXISTS; - if (cur_elem->m_token > token) - break; - } - - int offset = (cur_elem - begin) * sizeof(IndexItem); - m_chunk.insert_content(offset, &add_elem, sizeof(IndexItem)); - return ERROR_OK; -} - -template<size_t phrase_length> -int ChewingArrayIndexLevel<phrase_length>::remove_index -(/* in */ const ChewingKey keys[], /* in */ phrase_token_t token) { - IndexItem * begin, * end; - - IndexItem remove_elem(keys, token); - begin = (IndexItem *) m_chunk.begin(); - end = (IndexItem *) m_chunk.end(); - - std_lite::pair<IndexItem *, IndexItem *> range; - range = std_lite::equal_range - (begin, end, remove_elem, phrase_exact_less_than2<phrase_length>); - - IndexItem * cur_elem; - for (cur_elem = range.first; - cur_elem != range.second; ++cur_elem) { - if (cur_elem->m_token == token) - break; - } - - if (cur_elem == range.second) - return ERROR_REMOVE_ITEM_DONOT_EXISTS; - - int offset = (cur_elem - begin) * sizeof(IndexItem); - m_chunk.remove_content(offset, sizeof(IndexItem)); - return ERROR_OK; -} - - -/* load text method */ -bool ChewingLargeTable::load_text(FILE * infile) { - char pinyin[256]; - char phrase[256]; - phrase_token_t token; - size_t freq; - - while (!feof(infile)) { - int num = fscanf(infile, "%256s %256s %u %ld", - pinyin, phrase, &token, &freq); - - if (4 != num) - continue; - - if(feof(infile)) - break; - - glong len = g_utf8_strlen(phrase, -1); - - ChewingDirectParser2 parser; - ChewingKeyVector keys; - ChewingKeyRestVector key_rests; - - keys = g_array_new(FALSE, FALSE, sizeof(ChewingKey)); - key_rests = g_array_new(FALSE, FALSE, sizeof(ChewingKeyRest)); - - pinyin_option_t options = USE_TONE; - parser.parse(options, keys, key_rests, pinyin, strlen(pinyin)); - - if (len != keys->len) { - fprintf(stderr, "ChewingLargeTable::load_text:%s\t%s\t%u\t%ld\n", - pinyin, phrase, token, freq); - continue; - } - - add_index(keys->len, (ChewingKey *)keys->data, token); - - g_array_free(keys, TRUE); - g_array_free(key_rests, TRUE); - } - - return true; -} - - -/* load/store method */ - -bool ChewingBitmapIndexLevel::load(MemoryChunk * chunk, table_offset_t offset, - table_offset_t end) { - reset(); - char * begin = (char *) chunk->begin(); - table_offset_t phrase_begin, phrase_end; - table_offset_t * index = (table_offset_t *) (begin + offset); - phrase_end = *index; - - for (int k = 0; k < CHEWING_NUMBER_OF_INITIALS; ++k) - for (int l = 0; l < CHEWING_NUMBER_OF_MIDDLES; ++l) - for (int m = 0; m < CHEWING_NUMBER_OF_FINALS; ++m) - for (int n = 0; n < CHEWING_NUMBER_OF_TONES; ++n) { - phrase_begin = phrase_end; - index++; - phrase_end = *index; - - if (phrase_begin == phrase_end) /* null pointer */ - continue; - - /* after reset() all phrases are null pointer. */ - ChewingLengthIndexLevel * phrases = new ChewingLengthIndexLevel; - m_chewing_length_indexes[k][l][m][n] = phrases; - - phrases->load(chunk, phrase_begin, phrase_end - 1); - assert(phrase_end <= end); - assert(*(begin + phrase_end - 1) == c_separate); - } - - offset += (CHEWING_NUMBER_OF_INITIALS * CHEWING_NUMBER_OF_MIDDLES * CHEWING_NUMBER_OF_FINALS * CHEWING_NUMBER_OF_TONES + 1) * sizeof(table_offset_t); - assert(c_separate == *(begin + offset)); - return true; -} - -bool ChewingBitmapIndexLevel::store(MemoryChunk * new_chunk, - table_offset_t offset, - table_offset_t & end) { - table_offset_t phrase_end; - table_offset_t index = offset; - offset += (CHEWING_NUMBER_OF_INITIALS * CHEWING_NUMBER_OF_MIDDLES * CHEWING_NUMBER_OF_FINALS * CHEWING_NUMBER_OF_TONES + 1) * sizeof(table_offset_t); - - /* add '#' */ - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - - for (int k = 0; k < CHEWING_NUMBER_OF_INITIALS; ++k) - for (int l = 0; l < CHEWING_NUMBER_OF_MIDDLES; ++l) - for (int m = 0; m < CHEWING_NUMBER_OF_FINALS; ++m) - for (int n = 0; n < CHEWING_NUMBER_OF_TONES; ++n) { - ChewingLengthIndexLevel * phrases = - m_chewing_length_indexes[k][l][m][n]; - - if (NULL == phrases) { /* null pointer */ - new_chunk->set_content(index, &offset, - sizeof(table_offset_t)); - index += sizeof(table_offset_t); - continue; - } - - /* has a end '#' */ - phrases->store(new_chunk, offset, phrase_end); - offset = phrase_end; - - /* add '#' */ - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, - sizeof(table_offset_t)); - index += sizeof(table_offset_t); - } - - end = offset; - return true; -} - -bool ChewingLengthIndexLevel::load(MemoryChunk * chunk, table_offset_t offset, - table_offset_t end) { - char * begin = (char *) chunk->begin(); - guint32 nindex = *((guint32 *)(begin + offset)); /* number of index */ - table_offset_t * index = (table_offset_t *) - (begin + offset + sizeof(guint32)); - - table_offset_t phrase_begin, phrase_end = *index; - g_array_set_size(m_chewing_array_indexes, 0); - for (guint32 i = 0; i < nindex; ++i) { - phrase_begin = phrase_end; - index++; - phrase_end = *index; - - if (phrase_begin == phrase_end) { - void * null = NULL; - g_array_append_val(m_chewing_array_indexes, null); - continue; - } - -#define CASE(len) case len: \ - { \ - ChewingArrayIndexLevel<len> * phrase = \ - new ChewingArrayIndexLevel<len>; \ - phrase->load(chunk, phrase_begin, phrase_end - 1); \ - assert(*(begin + phrase_end - 1) == c_separate); \ - assert(phrase_end <= end); \ - g_array_append_val(m_chewing_array_indexes, phrase); \ - break; \ - } - - switch ( i ){ - CASE(0); - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - default: - assert(false); - } - -#undef CASE - } - - /* check '#' */ - offset += sizeof(guint32) + (nindex + 1) * sizeof(table_offset_t); - assert(c_separate == *(begin + offset)); - return true; -} - -bool ChewingLengthIndexLevel::store(MemoryChunk * new_chunk, - table_offset_t offset, - table_offset_t & end) { - guint32 nindex = m_chewing_array_indexes->len; /* number of index */ - new_chunk->set_content(offset, &nindex, sizeof(guint32)); - table_offset_t index = offset + sizeof(guint32); - - offset += sizeof(guint32) + (nindex + 1) * sizeof(table_offset_t); - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - - table_offset_t phrase_end; - for (guint32 i = 0; i < nindex; ++i) { -#define CASE(len) case len: \ - { \ - ChewingArrayIndexLevel<len> * phrase = g_array_index \ - (m_chewing_array_indexes, ChewingArrayIndexLevel<len> *, len); \ - if (NULL == phrase) { \ - new_chunk->set_content \ - (index, &offset, sizeof(table_offset_t)); \ - index += sizeof(table_offset_t); \ - continue; \ - } \ - phrase->store(new_chunk, offset, phrase_end); \ - offset = phrase_end; \ - break; \ - } - - switch ( i ){ - CASE(0); - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - default: - assert(false); - } -#undef CASE - - /* add '#' */ - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - } - - end = offset; - return true; -} - -template<size_t phrase_length> -bool ChewingArrayIndexLevel<phrase_length>:: -load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end) { - char * begin = (char *) chunk->begin(); - m_chunk.set_chunk(begin + offset, end - offset, NULL); - return true; -} - -template<size_t phrase_length> -bool ChewingArrayIndexLevel<phrase_length>:: -store(MemoryChunk * new_chunk, table_offset_t offset, table_offset_t & end) { - new_chunk->set_content(offset, m_chunk.begin(), m_chunk.size()); - end = offset + m_chunk.size(); - return true; -} - - -/* get length method */ - -int ChewingLengthIndexLevel::get_length() const { - int length = m_chewing_array_indexes->len; - - /* trim trailing zero. */ - for (int i = length - 1; i >= 0; --i) { - void * array = g_array_index(m_chewing_array_indexes, void *, i); - - if (NULL != array) - break; - - --length; - } - - return length; -} - -template<size_t phrase_length> -int ChewingArrayIndexLevel<phrase_length>::get_length() const { - IndexItem * chunk_begin = NULL, * chunk_end = NULL; - chunk_begin = (IndexItem *) m_chunk.begin(); - chunk_end = (IndexItem *) m_chunk.end(); - - return chunk_end - chunk_begin; -} - - -/* mask out method */ - -bool ChewingBitmapIndexLevel::mask_out(phrase_token_t mask, - phrase_token_t value) { - for (int k = CHEWING_ZERO_INITIAL; k < CHEWING_NUMBER_OF_INITIALS; ++k) - for (int l = CHEWING_ZERO_MIDDLE; l < CHEWING_NUMBER_OF_MIDDLES; ++l) - for (int m = CHEWING_ZERO_FINAL; m < CHEWING_NUMBER_OF_FINALS; ++m) - for (int n = CHEWING_ZERO_TONE; n < CHEWING_NUMBER_OF_TONES; - ++n) { - ChewingLengthIndexLevel * & length_array = - m_chewing_length_indexes[k][l][m][n]; - - if (NULL == length_array) - continue; - - length_array->mask_out(mask, value); - - if (0 == length_array->get_length()) { - delete length_array; - length_array = NULL; - } - } - return true; -} - -bool ChewingLengthIndexLevel::mask_out(phrase_token_t mask, - phrase_token_t value) { -#define CASE(len) case len: \ - { \ - ChewingArrayIndexLevel<len> * & array = g_array_index \ - (m_chewing_array_indexes, \ - ChewingArrayIndexLevel<len> *, len); \ - \ - if (NULL == array) \ - continue; \ - \ - array->mask_out(mask, value); \ - \ - if (0 == array->get_length()) { \ - delete array; \ - array = NULL; \ - } \ - break; \ - } - - for (guint i = 0; i < m_chewing_array_indexes->len; ++i) { - switch (i){ - CASE(0); - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - default: - assert(false); - } - } -#undef CASE - g_array_set_size(m_chewing_array_indexes, get_length()); - return true; -} - -template<size_t phrase_length> -bool ChewingArrayIndexLevel<phrase_length>::mask_out -(phrase_token_t mask, phrase_token_t value) { - IndexItem * begin = NULL, * end = NULL; - begin = (IndexItem *) m_chunk.begin(); - end = (IndexItem *) m_chunk.end(); - - for (IndexItem * cur = begin; cur != end; ++cur) { - if ((cur->m_token & mask) != value) - continue; - - int offset = (cur - begin) * sizeof(IndexItem); - m_chunk.remove_content(offset, sizeof(IndexItem)); - - /* update chunk end. */ - end = (IndexItem *) m_chunk.end(); - --cur; - } - - return true; -} diff --git a/src/storage/chewing_large_table.h b/src/storage/chewing_large_table.h deleted file mode 100644 index 96ca195..0000000 --- a/src/storage/chewing_large_table.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef CHEWING_LARGE_TABLE_H -#define CHEWING_LARGE_TABLE_H - - -#include <stdio.h> -#include "novel_types.h" -#include "memory_chunk.h" -#include "chewing_key.h" - -namespace zhuyin{ - -class ChewingLengthIndexLevel; - -class ChewingBitmapIndexLevel{ - -protected: - pinyin_option_t m_options; - -protected: - ChewingLengthIndexLevel * m_chewing_length_indexes - [CHEWING_NUMBER_OF_INITIALS][CHEWING_NUMBER_OF_MIDDLES] - [CHEWING_NUMBER_OF_FINALS][CHEWING_NUMBER_OF_TONES]; - - /* search functions */ - int initial_level_search(int phrase_length, - /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const; - - int middle_and_final_level_search(ChewingInitial initial, - int phrase_length, - /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const; - int tone_level_search(ChewingInitial initial, ChewingMiddle middle, - ChewingFinal final, int phrase_length, - /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const; - - void reset(); - -public: - /* constructor/destructor */ - ChewingBitmapIndexLevel(pinyin_option_t options); - ~ChewingBitmapIndexLevel() { reset(); } - - /* set options method */ - bool set_options(pinyin_option_t options) { - m_options = options; - return true; - } - - /* load/store method */ - bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end); - bool store(MemoryChunk * new_chunk, table_offset_t offset, - table_offset_t & end); - - /* search method */ - int search(int phrase_length, /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const; - - /* add/remove index method */ - int add_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token); - int remove_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token); - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - - -class ChewingLargeTable{ -protected: - ChewingBitmapIndexLevel m_bitmap_table; - MemoryChunk * m_chunk; - - void reset(){ - if (m_chunk) { - delete m_chunk; m_chunk = NULL; - } - } - -public: - /* constructor/destructor */ - ChewingLargeTable(pinyin_option_t options): - m_bitmap_table(options), m_chunk(NULL) {} - - ~ChewingLargeTable() { reset(); } - - /* set options method */ - bool set_options(pinyin_option_t options) { - return m_bitmap_table.set_options(options); - } - - /* load/store method */ - bool load(MemoryChunk * chunk) { - reset(); - m_chunk = chunk; - return m_bitmap_table.load(chunk, 0, chunk->size()); - } - - bool store(MemoryChunk * new_chunk) { - table_offset_t end; - return m_bitmap_table.store(new_chunk, 0, end); - } - - bool load_text(FILE * file); - - /* search method */ - int search(int phrase_length, /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const { - return m_bitmap_table.search(phrase_length, keys, ranges); - } - - /* add/remove index method */ - int add_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - return m_bitmap_table.add_index(phrase_length, keys, token); - } - - int remove_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - return m_bitmap_table.remove_index(phrase_length, keys, token); - } - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value) { - return m_bitmap_table.mask_out(mask, value); - } -}; - -}; - -#endif diff --git a/src/storage/chewing_table.h b/src/storage/chewing_table.h deleted file mode 100644 index fb36d64..0000000 --- a/src/storage/chewing_table.h +++ /dev/null @@ -1,502 +0,0 @@ -/* This file is generated by python scripts. Don't edit this file directly. - */ - -#ifndef CHEWING_TABLE_H -#define CHEWING_TABLE_H - -namespace zhuyin{ - -const chewing_symbol_item_t chewing_standard_symbols[] = { -{',' , "ㄝ"}, -{'-' , "ㄦ"}, -{'.' , "ㄡ"}, -{'/' , "ㄥ"}, -{'0' , "ㄢ"}, -{'1' , "ㄅ"}, -{'2' , "ㄉ"}, -{'5' , "ㄓ"}, -{'8' , "ㄚ"}, -{'9' , "ㄞ"}, -{';' , "ㄤ"}, -{'a' , "ㄇ"}, -{'b' , "ㄖ"}, -{'c' , "ㄏ"}, -{'d' , "ㄎ"}, -{'e' , "ㄍ"}, -{'f' , "ㄑ"}, -{'g' , "ㄕ"}, -{'h' , "ㄘ"}, -{'i' , "ㄛ"}, -{'j' , "ㄨ"}, -{'k' , "ㄜ"}, -{'l' , "ㄠ"}, -{'m' , "ㄩ"}, -{'n' , "ㄙ"}, -{'o' , "ㄟ"}, -{'p' , "ㄣ"}, -{'q' , "ㄆ"}, -{'r' , "ㄐ"}, -{'s' , "ㄋ"}, -{'t' , "ㄔ"}, -{'u' , "ㄧ"}, -{'v' , "ㄒ"}, -{'w' , "ㄊ"}, -{'x' , "ㄌ"}, -{'y' , "ㄗ"}, -{'z' , "ㄈ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_standard_tones[] = { -{' ' , 1}, -{'3' , 3}, -{'4' , 4}, -{'6' , 2}, -{'7' , 5}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_ginyieh_symbols[] = { -{'\'' , "ㄥ"}, -{',' , "ㄚ"}, -{'-' , "ㄣ"}, -{'.' , "ㄞ"}, -{'/' , "ㄢ"}, -{'0' , "ㄟ"}, -{'2' , "ㄅ"}, -{'3' , "ㄉ"}, -{'6' , "ㄓ"}, -{'8' , "ㄧ"}, -{'9' , "ㄛ"}, -{';' , "ㄡ"}, -{'=' , "ㄦ"}, -{'[' , "ㄤ"}, -{'b' , "ㄒ"}, -{'c' , "ㄌ"}, -{'d' , "ㄋ"}, -{'e' , "ㄊ"}, -{'f' , "ㄎ"}, -{'g' , "ㄑ"}, -{'h' , "ㄕ"}, -{'i' , "ㄨ"}, -{'j' , "ㄘ"}, -{'k' , "ㄩ"}, -{'l' , "ㄝ"}, -{'m' , "ㄙ"}, -{'n' , "ㄖ"}, -{'o' , "ㄜ"}, -{'p' , "ㄠ"}, -{'r' , "ㄍ"}, -{'s' , "ㄇ"}, -{'t' , "ㄐ"}, -{'u' , "ㄗ"}, -{'v' , "ㄏ"}, -{'w' , "ㄆ"}, -{'x' , "ㄈ"}, -{'y' , "ㄔ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_ginyieh_tones[] = { -{' ' , 1}, -{'1' , 5}, -{'a' , 3}, -{'q' , 2}, -{'z' , 4}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_eten_symbols[] = { -{'\'' , "ㄘ"}, -{',' , "ㄓ"}, -{'-' , "ㄥ"}, -{'.' , "ㄔ"}, -{'/' , "ㄕ"}, -{'0' , "ㄤ"}, -{'7' , "ㄑ"}, -{'8' , "ㄢ"}, -{'9' , "ㄣ"}, -{';' , "ㄗ"}, -{'=' , "ㄦ"}, -{'a' , "ㄚ"}, -{'b' , "ㄅ"}, -{'c' , "ㄒ"}, -{'d' , "ㄉ"}, -{'e' , "ㄧ"}, -{'f' , "ㄈ"}, -{'g' , "ㄐ"}, -{'h' , "ㄏ"}, -{'i' , "ㄞ"}, -{'j' , "ㄖ"}, -{'k' , "ㄎ"}, -{'l' , "ㄌ"}, -{'m' , "ㄇ"}, -{'n' , "ㄋ"}, -{'o' , "ㄛ"}, -{'p' , "ㄆ"}, -{'q' , "ㄟ"}, -{'r' , "ㄜ"}, -{'s' , "ㄙ"}, -{'t' , "ㄊ"}, -{'u' , "ㄩ"}, -{'v' , "ㄍ"}, -{'w' , "ㄝ"}, -{'x' , "ㄨ"}, -{'y' , "ㄡ"}, -{'z' , "ㄠ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_eten_tones[] = { -{' ' , 1}, -{'1' , 5}, -{'2' , 2}, -{'3' , 3}, -{'4' , 4}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_ibm_symbols[] = { -{'-' , "ㄏ"}, -{'0' , "ㄎ"}, -{'1' , "ㄅ"}, -{'2' , "ㄆ"}, -{'3' , "ㄇ"}, -{'4' , "ㄈ"}, -{'5' , "ㄉ"}, -{'6' , "ㄊ"}, -{'7' , "ㄋ"}, -{'8' , "ㄌ"}, -{'9' , "ㄍ"}, -{';' , "ㄠ"}, -{'a' , "ㄧ"}, -{'b' , "ㄥ"}, -{'c' , "ㄣ"}, -{'d' , "ㄩ"}, -{'e' , "ㄒ"}, -{'f' , "ㄚ"}, -{'g' , "ㄛ"}, -{'h' , "ㄜ"}, -{'i' , "ㄗ"}, -{'j' , "ㄝ"}, -{'k' , "ㄞ"}, -{'l' , "ㄟ"}, -{'n' , "ㄦ"}, -{'o' , "ㄘ"}, -{'p' , "ㄙ"}, -{'q' , "ㄐ"}, -{'r' , "ㄓ"}, -{'s' , "ㄨ"}, -{'t' , "ㄔ"}, -{'u' , "ㄖ"}, -{'v' , "ㄤ"}, -{'w' , "ㄑ"}, -{'x' , "ㄢ"}, -{'y' , "ㄕ"}, -{'z' , "ㄡ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_ibm_tones[] = { -{' ' , 1}, -{',' , 3}, -{'.' , 4}, -{'/' , 5}, -{'m' , 2}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_hsu_initials[] = { -{'a' , "ㄘ"}, -{'b' , "ㄅ"}, -{'c' , "ㄒ"}, -{'c' , "ㄕ"}, -{'d' , "ㄉ"}, -{'f' , "ㄈ"}, -{'g' , "ㄍ"}, -{'h' , "ㄏ"}, -{'j' , "ㄐ"}, -{'j' , "ㄓ"}, -{'k' , "ㄎ"}, -{'l' , "ㄌ"}, -{'m' , "ㄇ"}, -{'n' , "ㄋ"}, -{'p' , "ㄆ"}, -{'r' , "ㄖ"}, -{'s' , "ㄙ"}, -{'t' , "ㄊ"}, -{'v' , "ㄑ"}, -{'v' , "ㄔ"}, -{'z' , "ㄗ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_hsu_middles[] = { -{'e' , "ㄧ"}, -{'u' , "ㄩ"}, -{'x' , "ㄨ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_hsu_finals[] = { -{'a' , "ㄟ"}, -{'e' , "ㄝ"}, -{'g' , "ㄜ"}, -{'h' , "ㄛ"}, -{'i' , "ㄞ"}, -{'k' , "ㄤ"}, -{'l' , "ㄥ"}, -{'l' , "ㄦ"}, -{'m' , "ㄢ"}, -{'n' , "ㄣ"}, -{'o' , "ㄡ"}, -{'w' , "ㄠ"}, -{'y' , "ㄚ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_hsu_tones[] = { -{' ' , 1}, -{'d' , 2}, -{'f' , 3}, -{'j' , 4}, -{'s' , 5}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_eten26_initials[] = { -{'b' , "ㄅ"}, -{'c' , "ㄒ"}, -{'c' , "ㄕ"}, -{'d' , "ㄉ"}, -{'f' , "ㄈ"}, -{'g' , "ㄐ"}, -{'g' , "ㄓ"}, -{'h' , "ㄏ"}, -{'j' , "ㄖ"}, -{'k' , "ㄎ"}, -{'l' , "ㄌ"}, -{'m' , "ㄇ"}, -{'n' , "ㄋ"}, -{'p' , "ㄆ"}, -{'q' , "ㄗ"}, -{'s' , "ㄙ"}, -{'t' , "ㄊ"}, -{'v' , "ㄍ"}, -{'v' , "ㄑ"}, -{'w' , "ㄘ"}, -{'y' , "ㄔ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_eten26_middles[] = { -{'e' , "ㄧ"}, -{'u' , "ㄩ"}, -{'x' , "ㄨ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_eten26_finals[] = { -{'a' , "ㄚ"}, -{'h' , "ㄦ"}, -{'i' , "ㄞ"}, -{'l' , "ㄥ"}, -{'m' , "ㄢ"}, -{'n' , "ㄣ"}, -{'o' , "ㄛ"}, -{'p' , "ㄡ"}, -{'q' , "ㄟ"}, -{'r' , "ㄜ"}, -{'t' , "ㄤ"}, -{'w' , "ㄝ"}, -{'z' , "ㄠ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_eten26_tones[] = { -{' ' , 1}, -{'d' , 5}, -{'f' , 2}, -{'j' , 3}, -{'k' , 4}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_standard_dvorak_symbols[] = { -{'\'' , "ㄆ"}, -{',' , "ㄊ"}, -{'.' , "ㄍ"}, -{'0' , "ㄢ"}, -{'1' , "ㄅ"}, -{'2' , "ㄉ"}, -{'5' , "ㄓ"}, -{'8' , "ㄚ"}, -{'9' , "ㄞ"}, -{';' , "ㄈ"}, -{'[' , "ㄦ"}, -{'a' , "ㄇ"}, -{'b' , "ㄙ"}, -{'c' , "ㄛ"}, -{'d' , "ㄘ"}, -{'e' , "ㄎ"}, -{'f' , "ㄗ"}, -{'g' , "ㄧ"}, -{'h' , "ㄨ"}, -{'i' , "ㄕ"}, -{'j' , "ㄏ"}, -{'k' , "ㄒ"}, -{'l' , "ㄣ"}, -{'m' , "ㄩ"}, -{'n' , "ㄠ"}, -{'o' , "ㄋ"}, -{'p' , "ㄐ"}, -{'q' , "ㄌ"}, -{'r' , "ㄟ"}, -{'s' , "ㄤ"}, -{'t' , "ㄜ"}, -{'u' , "ㄑ"}, -{'v' , "ㄡ"}, -{'w' , "ㄝ"}, -{'x' , "ㄖ"}, -{'y' , "ㄔ"}, -{'z' , "ㄥ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_standard_dvorak_tones[] = { -{' ' , 1}, -{'3' , 3}, -{'4' , 4}, -{'6' , 2}, -{'7' , 5}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_hsu_dvorak_initials[] = { -{'a' , "ㄘ"}, -{'b' , "ㄅ"}, -{'c' , "ㄒ"}, -{'c' , "ㄕ"}, -{'d' , "ㄉ"}, -{'f' , "ㄈ"}, -{'g' , "ㄍ"}, -{'h' , "ㄏ"}, -{'j' , "ㄐ"}, -{'j' , "ㄓ"}, -{'k' , "ㄎ"}, -{'l' , "ㄌ"}, -{'m' , "ㄇ"}, -{'n' , "ㄋ"}, -{'p' , "ㄆ"}, -{'r' , "ㄖ"}, -{'s' , "ㄙ"}, -{'t' , "ㄊ"}, -{'v' , "ㄑ"}, -{'v' , "ㄔ"}, -{'z' , "ㄗ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_hsu_dvorak_middles[] = { -{'e' , "ㄧ"}, -{'u' , "ㄩ"}, -{'x' , "ㄨ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_hsu_dvorak_finals[] = { -{'a' , "ㄟ"}, -{'e' , "ㄝ"}, -{'g' , "ㄜ"}, -{'h' , "ㄛ"}, -{'i' , "ㄞ"}, -{'k' , "ㄤ"}, -{'l' , "ㄥ"}, -{'l' , "ㄦ"}, -{'m' , "ㄢ"}, -{'n' , "ㄣ"}, -{'o' , "ㄡ"}, -{'w' , "ㄠ"}, -{'y' , "ㄚ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_hsu_dvorak_tones[] = { -{' ' , 1}, -{'d' , 2}, -{'f' , 3}, -{'j' , 4}, -{'s' , 5}, -{'\0', 0} -}; - -const chewing_symbol_item_t chewing_dachen_cp26_initials[] = { -{'a' , "ㄇ"}, -{'b' , "ㄖ"}, -{'c' , "ㄏ"}, -{'d' , "ㄎ"}, -{'e' , "ㄍ"}, -{'f' , "ㄑ"}, -{'g' , "ㄕ"}, -{'h' , "ㄘ"}, -{'n' , "ㄙ"}, -{'q' , "ㄅ"}, -{'q' , "ㄆ"}, -{'r' , "ㄐ"}, -{'s' , "ㄋ"}, -{'t' , "ㄓ"}, -{'t' , "ㄔ"}, -{'v' , "ㄒ"}, -{'w' , "ㄉ"}, -{'w' , "ㄊ"}, -{'x' , "ㄌ"}, -{'y' , "ㄗ"}, -{'z' , "ㄈ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_dachen_cp26_middles[] = { -{'j' , "ㄨ"}, -{'m' , "ㄩ"}, -{'u' , "ㄧ"}, -{'\0', NULL} -}; - -const chewing_symbol_item_t chewing_dachen_cp26_finals[] = { -{'b' , "ㄝ"}, -{'i' , "ㄛ"}, -{'i' , "ㄞ"}, -{'k' , "ㄜ"}, -{'l' , "ㄠ"}, -{'l' , "ㄤ"}, -{'m' , "ㄡ"}, -{'n' , "ㄥ"}, -{'o' , "ㄟ"}, -{'o' , "ㄢ"}, -{'p' , "ㄣ"}, -{'p' , "ㄦ"}, -{'u' , "ㄚ"}, -{'\0', NULL} -}; - -const chewing_tone_item_t chewing_dachen_cp26_tones[] = { -{' ' , 1}, -{'d' , 4}, -{'e' , 2}, -{'r' , 3}, -{'y' , 5}, -{'\0', 0} -}; - -const char * chewing_tone_table[CHEWING_NUMBER_OF_TONES] = { -"", -" ", -"ˊ", -"ˇ", -"ˋ", -"˙" -}; - -}; - -#endif diff --git a/src/storage/facade_chewing_table.h b/src/storage/facade_chewing_table.h deleted file mode 100644 index 9e0bef6..0000000 --- a/src/storage/facade_chewing_table.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef FACADE_CHEWING_TABLE_H -#define FACADE_CHEWING_TABLE_H - -#include "novel_types.h" -#include "chewing_large_table.h" - -namespace zhuyin{ - -/** - * FacadeChewingTable: - * - * The facade class of chewing large table. - * - */ - -class FacadeChewingTable{ -private: - ChewingLargeTable * m_system_chewing_table; - ChewingLargeTable * m_user_chewing_table; - - void reset() { - if (m_system_chewing_table) { - delete m_system_chewing_table; - m_system_chewing_table = NULL; - } - - if (m_user_chewing_table) { - delete m_user_chewing_table; - m_user_chewing_table = NULL; - } - } -public: - /** - * FacadeChewingTable::FacadeChewingTable: - * - * The constructor of the FacadeChewingTable. - * - */ - FacadeChewingTable() { - m_system_chewing_table = NULL; - m_user_chewing_table = NULL; - } - - /** - * FacadeChewingTable::~FacadeChewingTable: - * - * The destructor of the FacadeChewingTable. - * - */ - ~FacadeChewingTable() { - reset(); - } - - /** - * FacadeChewingTable::set_options: - * @options: the pinyin options. - * @returns: whether the setting options is successful. - * - * Set the options of the system and user chewing table. - * - */ - bool set_options(pinyin_option_t options) { - bool result = false; - if (m_system_chewing_table) - result = m_system_chewing_table->set_options(options) || result; - if (m_user_chewing_table) - result = m_user_chewing_table->set_options(options) || result; - return result; - } - - /** - * FacadeChewingTable::load: - * @options: the pinyin options. - * @system: the memory chunk of the system chewing table. - * @user: the memory chunk of the user chewing table. - * @returns: whether the load operation is successful. - * - * Load the system or user chewing table from the memory chunks. - * - */ - bool load(pinyin_option_t options, MemoryChunk * system, - MemoryChunk * user){ - reset(); - - bool result = false; - if (system) { - m_system_chewing_table = new ChewingLargeTable(options); - result = m_system_chewing_table->load(system) || result; - } - if (user) { - m_user_chewing_table = new ChewingLargeTable(options); - result = m_user_chewing_table->load(user) || result; - } - return result; - } - - /** - * FacadeChewingTable::store: - * @new_user: the memory chunk to store the user chewing table. - * @returns: whether the store operation is successful. - * - * Store the user chewing table to the memory chunk. - * - */ - bool store(MemoryChunk * new_user) { - if (NULL == m_user_chewing_table) - return false; - return m_user_chewing_table->store(new_user); - } - - /** - * FacadeChewingTable::search: - * @phrase_length: the length of the phrase to be searched. - * @keys: the pinyin key of the phrase to be searched. - * @ranges: the array of GArrays to store the matched phrase token. - * @returns: the search result of enum SearchResult. - * - * Search the phrase tokens according to the pinyin keys. - * - */ - int search(int phrase_length, /* in */ const ChewingKey keys[], - /* out */ PhraseIndexRanges ranges) const { - - /* clear ranges. */ - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - if (ranges[i]) - g_array_set_size(ranges[i], 0); - } - - int result = SEARCH_NONE; - - if (NULL != m_system_chewing_table) - result |= m_system_chewing_table->search - (phrase_length, keys, ranges); - - if (NULL != m_user_chewing_table) - result |= m_user_chewing_table->search - (phrase_length, keys, ranges); - - return result; - } - - /** - * FacadeChewingTable::add_index: - * @phrase_length: the length of the phrase to be added. - * @keys: the pinyin keys of the phrase to be added. - * @token: the token of the phrase to be added. - * @returns: the add result of enum ErrorResult. - * - * Add the phrase token to the user chewing table. - * - */ - int add_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - if (NULL == m_user_chewing_table) - return ERROR_NO_USER_TABLE; - return m_user_chewing_table->add_index(phrase_length, keys, token); - } - - /** - * FacadeChewingTable::remove_index: - * @phrase_length: the length of the phrase to be removed. - * @keys: the pinyin keys of the phrase to be removed. - * @token: the token of the phrase to be removed. - * @returns: the remove result of enum ErrorResult. - * - * Remove the phrase token from the user chewing table. - * - */ - int remove_index(int phrase_length, /* in */ const ChewingKey keys[], - /* in */ phrase_token_t token) { - if (NULL == m_user_chewing_table) - return ERROR_NO_USER_TABLE; - return m_user_chewing_table->remove_index(phrase_length, keys, token); - } - - /** - * FacadeChewingTable::mask_out: - * @mask: the mask. - * @value: the value. - * @returns: whether the mask out operation is successful. - * - * Mask out the matched chewing index. - * - */ - bool mask_out(phrase_token_t mask, phrase_token_t value) { - if (NULL == m_user_chewing_table) - return false; - return m_user_chewing_table->mask_out(mask, value); - } -}; - -}; - -#endif diff --git a/src/storage/facade_phrase_table2.h b/src/storage/facade_phrase_table2.h deleted file mode 100644 index 17c774a..0000000 --- a/src/storage/facade_phrase_table2.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2012 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef FACADE_PHRASE_TABLE2_H -#define FACADE_PHRASE_TABLE2_H - -#include "phrase_large_table2.h" - -namespace zhuyin{ - -/** - * FacadePhraseTable2: - * - * The facade class of phrase large table2. - * - */ - -class FacadePhraseTable2{ -private: - PhraseLargeTable2 * m_system_phrase_table; - PhraseLargeTable2 * m_user_phrase_table; - - void reset(){ - if (m_system_phrase_table) { - delete m_system_phrase_table; - m_system_phrase_table = NULL; - } - - if (m_user_phrase_table) { - delete m_user_phrase_table; - m_user_phrase_table = NULL; - } - } - -public: - /** - * FacadePhraseTable2::FacadePhraseTable2: - * - * The constructor of the FacadePhraseTable2. - * - */ - FacadePhraseTable2() { - m_system_phrase_table = NULL; - m_user_phrase_table = NULL; - } - - /** - * FacadePhraseTable2::~FacadePhraseTable2: - * - * The destructor of the FacadePhraseTable2. - * - */ - ~FacadePhraseTable2() { - reset(); - } - - /** - * FacadePhraseTable2::load: - * @system: the memory chunk of the system phrase table. - * @user: the memory chunk of the user phrase table. - * @returns: whether the load operation is successful. - * - * Load the system or user phrase table from the memory chunks. - * - */ - bool load(MemoryChunk * system, MemoryChunk * user) { - reset(); - - bool result = false; - if (system) { - m_system_phrase_table = new PhraseLargeTable2; - result = m_system_phrase_table->load(system) || result; - } - if (user) { - m_user_phrase_table = new PhraseLargeTable2; - result = m_user_phrase_table->load(user) || result; - } - return result; - } - - /** - * FacadePhraseTable2::store: - * @new_user: the memory chunk to store the user phrase table. - * @returns: whether the store operation is successful. - * - * Store the user phrase table to the memory chunk. - * - */ - bool store(MemoryChunk * new_user) { - if (NULL == m_user_phrase_table) - return false; - return m_user_phrase_table->store(new_user); - } - - /** - * FacadePhraseTable2::search: - * @phrase_length: the length of the phrase to be searched. - * @phrase: the ucs4 characters of the phrase to be searched. - * @tokens: the GArray of tokens to store the matched phrases. - * @returns: the search result of enum SearchResult. - * - * Search the phrase tokens according to the ucs4 characters. - * - */ - int search(int phrase_length, /* in */ const ucs4_t phrase[], - /* out */ PhraseTokens tokens) const { - /* clear tokens. */ - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - if (tokens[i]) - g_array_set_size(tokens[i], 0); - } - - int result = SEARCH_NONE; - - if (NULL != m_system_phrase_table) - result |= m_system_phrase_table->search - (phrase_length, phrase, tokens); - - if (NULL != m_user_phrase_table) - result |= m_user_phrase_table->search - (phrase_length, phrase, tokens); - - return result; - } - - /** - * FacadePhraseTable2::add_index: - * @phrase_length: the length of the phrase to be added. - * @phrase: the ucs4 characters of the phrase to be added. - * @token: the token of the phrase to be added. - * @returns: the add result of enum ErrorResult. - * - * Add the phrase token to the user phrase table. - * - */ - int add_index(int phrase_length, /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token) { - if (NULL == m_user_phrase_table) - return ERROR_NO_USER_TABLE; - - return m_user_phrase_table->add_index - (phrase_length, phrase, token); - } - - /** - * FacadePhraseTable2::remove_index: - * @phrase_length: the length of the phrase to be removed. - * @phrase: the ucs4 characters of the phrase to be removed. - * @token: the token of the phrase to be removed. - * @returns: the remove result of enum ErrorResult. - * - * Remove the phrase token from the user phrase table. - * - */ - int remove_index(int phrase_length, /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token) { - if (NULL == m_user_phrase_table) - return ERROR_NO_USER_TABLE; - - return m_user_phrase_table->remove_index - (phrase_length, phrase, token); - } - - /** - * FacadePhraseTable2::mask_out: - * @mask: the mask. - * @value: the value. - * @returns: whether the mask out operation is successful. - * - * Mask out the matched phrase index. - * - */ - bool mask_out(phrase_token_t mask, phrase_token_t value) { - if (NULL == m_user_phrase_table) - return false; - - return m_user_phrase_table->mask_out - (mask, value); - } -}; - -}; - - -#endif diff --git a/src/storage/flexible_ngram.h b/src/storage/flexible_ngram.h deleted file mode 100644 index 3cfb338..0000000 --- a/src/storage/flexible_ngram.h +++ /dev/null @@ -1,719 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - - - -#ifndef FLEXIBLE_NGRAM_H -#define FLEXIBLE_NGRAM_H - -#include <db.h> -#include <errno.h> - -/* Note: the signature of the template parameters. - * struct MagicHeader, ArrayHeader, ArrayItem. - */ - -namespace zhuyin{ - -typedef GArray * FlexibleBigramPhraseArray; - -/** - * FlexibleSingleGram: - * @ArrayHeader: the struct ArrayHeader. - * @ArrayItem: the struct ArrayItem. - * - * The flexible single gram is mainly used for training purpose. - * - */ - -template<typename ArrayHeader, typename ArrayItem> -class FlexibleSingleGram{ - template<typename MH, typename AH, - typename AI> - friend class FlexibleBigram; -private: - MemoryChunk m_chunk; - FlexibleSingleGram(void * buffer, size_t length){ - m_chunk.set_chunk(buffer, length, NULL); - } -public: - /** - * ArrayItemWithToken: - * - * Define the struct ArrayItemWithToken type. - * - */ - typedef struct{ - phrase_token_t m_token; - ArrayItem m_item; - } ArrayItemWithToken; - -private: - static bool token_less_than(const ArrayItemWithToken & lhs, - const ArrayItemWithToken & rhs){ - return lhs.m_token < rhs.m_token; - } - -public: - /** - * FlexibleSingleGram::FlexibleSingleGram: - * - * The constructor of the FlexibleSingleGram. - * - */ - FlexibleSingleGram(){ - m_chunk.set_size(sizeof(ArrayHeader)); - memset(m_chunk.begin(), 0, sizeof(ArrayHeader)); - } - - /** - * FlexibleSingleGram::retrieve_all: - * @array: the array to store all items in this single gram. - * @returns: whether the retrieve operation is successful. - * - * Retrieve all items in this single gram. - * - */ - bool retrieve_all(/* out */ FlexibleBigramPhraseArray array){ - const ArrayItemWithToken * begin = (const ArrayItemWithToken *) - ((const char *)(m_chunk.begin()) + sizeof(ArrayHeader)); - const ArrayItemWithToken * end = (const ArrayItemWithToken *) - m_chunk.end(); - - ArrayItemWithToken item; - for ( const ArrayItemWithToken * cur_item = begin; - cur_item != end; - ++cur_item){ - /* Note: optimize this with g_array_append_vals? */ - item.m_token = cur_item->m_token; - item.m_item = cur_item->m_item; - g_array_append_val(array, item); - } - - return true; - } - - /** - * FlexibleSingleGram::search: - * @range: the token range. - * @array: the array to store the array items with token in the range. - * @returns: whether the search operation is successful. - * - * Search the array items with token in the range. - * - * Note: The array result may contain many items. - * - */ - bool search(/* in */ PhraseIndexRange * range, - /* out */ FlexibleBigramPhraseArray array){ - const ArrayItemWithToken * begin = (const ArrayItemWithToken *) - ((const char *)(m_chunk.begin()) + sizeof(ArrayHeader)); - const ArrayItemWithToken * end = (const ArrayItemWithToken *) - m_chunk.end(); - - ArrayItemWithToken compare_item; - compare_item.m_token = range->m_range_begin; - const ArrayItemWithToken * cur_item = std_lite::lower_bound - (begin, end, compare_item, token_less_than); - - ArrayItemWithToken item; - for ( ; cur_item != end; ++cur_item){ - if ( cur_item->m_token >= range->m_range_end ) - break; - item.m_token = cur_item->m_token; - item.m_item = cur_item->m_item; - g_array_append_val(array, item); - } - - return true; - } - - /** - * FlexibleSingleGram::insert_array_item: - * @token: the phrase token to be inserted. - * @item: the array item of this token. - * @returns: whether the insert operation is successful. - * - * Insert the array item of the token. - * - */ - bool insert_array_item(/* in */ phrase_token_t token, - /* in */ const ArrayItem & item){ - ArrayItemWithToken * begin = (ArrayItemWithToken *) - ((const char *)(m_chunk.begin()) + sizeof(ArrayHeader)); - ArrayItemWithToken * end = (ArrayItemWithToken *) - m_chunk.end(); - - ArrayItemWithToken compare_item; - compare_item.m_token = token; - ArrayItemWithToken * cur_item = std_lite::lower_bound - (begin, end, compare_item, token_less_than); - - ArrayItemWithToken insert_item; - insert_item.m_token = token; - insert_item.m_item = item; - - for ( ; cur_item != end; ++cur_item ){ - if ( cur_item->m_token > token ){ - size_t offset = sizeof(ArrayHeader) + - sizeof(ArrayItemWithToken) * (cur_item - begin); - m_chunk.insert_content(offset, &insert_item, - sizeof(ArrayItemWithToken)); - return true; - } - if ( cur_item->m_token == token ){ - return false; - } - } - m_chunk.insert_content(m_chunk.size(), &insert_item, - sizeof(ArrayItemWithToken)); - return true; - } - - /** - * FlexibleSingleGram::remove_array_item: - * @token: the phrase token to be removed. - * @item: the content of the removed array item. - * @returns: whether the remove operation is successful. - * - * Remove the array item of the token. - * - */ - bool remove_array_item(/* in */ phrase_token_t token, - /* out */ ArrayItem & item) - { - /* clear retval */ - memset(&item, 0, sizeof(ArrayItem)); - - const ArrayItemWithToken * begin = (const ArrayItemWithToken *) - ((const char *)(m_chunk.begin()) + sizeof(ArrayHeader)); - const ArrayItemWithToken * end = (const ArrayItemWithToken *) - m_chunk.end(); - - ArrayItemWithToken compare_item; - compare_item.m_token = token; - const ArrayItemWithToken * cur_item = std_lite::lower_bound - (begin, end, compare_item, token_less_than); - - for ( ; cur_item != end; ++cur_item){ - if ( cur_item->m_token > token ) - return false; - if ( cur_item->m_token == token ){ - memcpy(&item, &(cur_item->m_item), sizeof(ArrayItem)); - size_t offset = sizeof(ArrayHeader) + - sizeof(ArrayItemWithToken) * (cur_item - begin); - m_chunk.remove_content(offset, sizeof(ArrayItemWithToken)); - return true; - } - } - return false; - } - - /** - * FlexibleSingleGram::get_array_item: - * @token: the phrase token. - * @item: the array item of the token. - * @returns: whether the get operation is successful. - * - * Get the array item of the token. - * - */ - bool get_array_item(/* in */ phrase_token_t token, - /* out */ ArrayItem & item) - { - /* clear retval */ - memset(&item, 0, sizeof(ArrayItem)); - - const ArrayItemWithToken * begin = (const ArrayItemWithToken *) - ((const char *)(m_chunk.begin()) + sizeof(ArrayHeader)); - const ArrayItemWithToken * end = (const ArrayItemWithToken *) - m_chunk.end(); - - ArrayItemWithToken compare_item; - compare_item.m_token = token; - const ArrayItemWithToken * cur_item = std_lite::lower_bound - (begin, end, compare_item, token_less_than); - - for ( ; cur_item != end; ++cur_item){ - if ( cur_item->m_token > token ) - return false; - if ( cur_item->m_token == token ){ - memcpy(&item, &(cur_item->m_item), sizeof(ArrayItem)); - return true; - } - } - return false; - } - - /** - * FlexibleSingleGram::set_array_item: - * @token: the phrase token. - * @item: the array item of the token. - * @returns: whether the set operation is successful. - * - * Set the array item of the token. - * - */ - bool set_array_item(/* in */ phrase_token_t token, - /* in */ const ArrayItem & item){ - ArrayItemWithToken * begin = (ArrayItemWithToken *) - ((const char *)(m_chunk.begin()) + sizeof(ArrayHeader)); - ArrayItemWithToken * end = (ArrayItemWithToken *) - m_chunk.end(); - - ArrayItemWithToken compare_item; - compare_item.m_token = token; - ArrayItemWithToken * cur_item = std_lite::lower_bound - (begin, end, compare_item, token_less_than); - - for ( ; cur_item != end; ++cur_item ){ - if ( cur_item->m_token > token ){ - return false; - } - if ( cur_item->m_token == token ){ - memcpy(&(cur_item->m_item), &item, sizeof(ArrayItem)); - return true; - } - } - return false; - } - - /** - * FlexibleSingleGram::get_array_header: - * @header: the array header of this single gram. - * @returns: whether the get operation is successful. - * - * Get the array header of this single gram. - * - */ - bool get_array_header(/* out */ ArrayHeader & header){ - /* clear retval */ - memset(&header, 0, sizeof(ArrayHeader)); - char * buf_begin = (char *)m_chunk.begin(); - memcpy(&header, buf_begin, sizeof(ArrayHeader)); - return true; - } - - /** - * FlexibleSingleGram::set_array_header: - * @header: the array header of this single gram. - * @returns: whether the set operation is successful. - * - * Set the array header of this single gram. - * - */ - bool set_array_header(/* in */ const ArrayHeader & header){ - char * buf_begin = (char *)m_chunk.begin(); - memcpy(buf_begin, &header, sizeof(ArrayHeader)); - return true; - } -}; - -/** - * FlexibleBigram: - * @MagicHeader: the struct type of the magic header. - * @ArrayHeader: the struct type of the array header. - * @ArrayItem: the struct type of the array item. - * - * The flexible bi-gram is mainly used for training purpose. - * - */ -template<typename MagicHeader, typename ArrayHeader, - typename ArrayItem> -class FlexibleBigram{ - /* Note: some flexible bi-gram file format check should be here. */ -private: - DB * m_db; - - phrase_token_t m_magic_header_index[2]; - - char m_magic_number[4]; - - void reset(){ - if ( m_db ){ - m_db->sync(m_db, 0); - m_db->close(m_db, 0); - m_db = NULL; - } - } - -public: - /** - * FlexibleBigram::FlexibleBigram: - * @magic_number: the 4 bytes magic number of the flexible bi-gram. - * - * The constructor of the FlexibleBigram. - * - */ - FlexibleBigram(const char * magic_number){ - m_db = NULL; - m_magic_header_index[0] = null_token; - m_magic_header_index[1] = null_token; - - memcpy(m_magic_number, magic_number, sizeof(m_magic_number)); - } - - /** - * FlexibleBigram::~FlexibleBigram: - * - * The destructor of the FlexibleBigram. - * - */ - ~FlexibleBigram(){ - reset(); - } - - /** - * FlexibleBigram::attach: - * @dbfile: the path name of the flexible bi-gram. - * @flags: the attach flags for the Berkeley DB. - * @returns: whether the attach operation is successful. - * - * Attach Berkeley DB on filesystem for training purpose. - * - */ - bool attach(const char * dbfile, guint32 flags){ - reset(); - u_int32_t db_flags = 0; - - if ( flags & ATTACH_READONLY ) - db_flags |= DB_RDONLY; - if ( flags & ATTACH_READWRITE ) - assert( !(flags & ATTACH_READONLY ) ); - - if ( !dbfile ) - return false; - int ret = db_create(&m_db, NULL, 0); - if ( ret != 0 ) - assert(false); - - ret = m_db->open(m_db, NULL, dbfile, NULL, DB_HASH, db_flags, 0644); - if ( ret != 0 && (flags & ATTACH_CREATE) ) { - db_flags |= DB_CREATE; - /* Create database file here, and write the signature. */ - ret = m_db->open(m_db, NULL, dbfile, NULL, DB_HASH, db_flags, 0644); - if ( ret != 0 ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = m_magic_header_index; - db_key.size = sizeof(m_magic_header_index); - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.data = m_magic_number; - db_data.size = sizeof(m_magic_number); - db_data.flags = DB_DBT_PARTIAL; - db_data.doff = 0; - db_data.dlen = sizeof(m_magic_number); - - ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); - return ret == 0; - } - - /* check the signature. */ - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = m_magic_header_index; - db_key.size = sizeof(m_magic_header_index); - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.flags = DB_DBT_PARTIAL; - db_data.doff = 0; - db_data.dlen = sizeof(m_magic_number); - ret = m_db->get(m_db, NULL, &db_key, &db_data, 0); - if ( ret != 0 ) - return false; - if ( sizeof(m_magic_number) != db_data.size ) - return false; - if ( memcmp(db_data.data, m_magic_number, - sizeof(m_magic_number)) == 0 ) - return true; - return false; - } - - /** - * FlexibleBigram::load: - * @index: the previous token in the flexible bi-gram. - * @single_gram: the single gram of the previous token. - * @returns: whether the load operation is successful. - * - * Load the single gram of the previous token. - * - */ - bool load(phrase_token_t index, - FlexibleSingleGram<ArrayHeader, ArrayItem> * & single_gram){ - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - - single_gram = NULL; - - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - int ret = m_db->get(m_db, NULL, &db_key, &db_data, 0); - if ( ret != 0) - return false; - - single_gram = new FlexibleSingleGram<ArrayHeader, ArrayItem> - (db_data.data, db_data.size); - - return true; - } - - /** - * FlexibleBigram::store: - * @index: the previous token in the flexible bi-gram. - * @single_gram: the single gram of the previous token. - * @returns: whether the store operation is successful. - * - * Store the single gram of the previous token. - * - */ - bool store(phrase_token_t index, - FlexibleSingleGram<ArrayHeader, ArrayItem> * single_gram){ - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.data = single_gram->m_chunk.begin(); - db_data.size = single_gram->m_chunk.size(); - - int ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); - return ret == 0; - } - - /** - * FlexibleBigram::remove: - * @index: the previous token in the flexible bi-gram. - * @returns: whether the remove operation is successful. - * - * Remove the single gram of the previous token. - * - */ - bool remove(phrase_token_t index){ - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - - int ret = m_db->del(m_db, NULL, &db_key, 0); - return ret == 0; - } - - /** - * FlexibleBigram::get_all_items: - * @items: the GArray to store all previous tokens. - * @returns: whether the get operation is successful. - * - * Get the array of all previous tokens for parameter estimation. - * - */ - bool get_all_items(GArray * items){ - g_array_set_size(items, 0); - - if ( !m_db ) - return false; - - DBC * cursorp; - DBT key, data; - int ret; - - /* Get a cursor */ - m_db->cursor(m_db, NULL, &cursorp, 0); - - if (NULL == cursorp) - return false; - - /* Initialize our DBTs. */ - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - - /* Iterate over the database, retrieving each record in turn. */ - while ((ret = cursorp->c_get(cursorp, &key, &data, DB_NEXT)) == 0 ){ - if (key.size != sizeof(phrase_token_t)){ - /* skip magic header. */ - continue; - } - phrase_token_t * token = (phrase_token_t *) key.data; - g_array_append_val(items, *token); - } - - if ( ret != DB_NOTFOUND ){ - fprintf(stderr, "training db error, exit!"); - - if (cursorp != NULL) - cursorp->c_close(cursorp); - - exit(EIO); - } - - /* Cursors must be closed */ - if (cursorp != NULL) - cursorp->c_close(cursorp); - return true; - } - - /** - * FlexibleBigram::get_magic_header: - * @header: the magic header. - * @returns: whether the get operation is successful. - * - * Get the magic header of the flexible bi-gram. - * - */ - bool get_magic_header(MagicHeader & header){ - /* clear retval */ - memset(&header, 0, sizeof(MagicHeader)); - - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = m_magic_header_index; - db_key.size = sizeof(m_magic_header_index); - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.flags = DB_DBT_PARTIAL; - db_data.doff = sizeof(m_magic_number); - db_data.dlen = sizeof(MagicHeader); - - int ret = m_db->get(m_db, NULL, &db_key, &db_data, 0); - if ( ret != 0 ) - return false; - - if ( sizeof(MagicHeader) != db_data.size ) - return false; - - memcpy(&header, db_data.data, sizeof(MagicHeader)); - return true; - } - - /** - * FlexibleBigram::set_magic_header: - * @header: the magic header. - * @returns: whether the set operation is successful. - * - * Set the magic header of the flexible bi-gram. - * - */ - bool set_magic_header(const MagicHeader & header){ - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = m_magic_header_index; - db_key.size = sizeof(m_magic_header_index); - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.data = (void *) &header; - db_data.size = sizeof(MagicHeader); - db_data.flags = DB_DBT_PARTIAL; - db_data.doff = sizeof(m_magic_number); - db_data.dlen = sizeof(MagicHeader); - - int ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); - return ret == 0; - } - - /** - * FlexibleBigram::get_array_header: - * @index: the previous token in the flexible bi-gram. - * @header: the array header in the single gram of the previous token. - * @returns: whether the get operation is successful. - * - * Get the array header in the single gram of the previous token. - * - */ - bool get_array_header(phrase_token_t index, ArrayHeader & header){ - /* clear retval */ - memset(&header, 0, sizeof(ArrayHeader)); - - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.flags = DB_DBT_PARTIAL; - db_data.doff = 0; - db_data.dlen = sizeof(ArrayHeader); - int ret = m_db->get(m_db, NULL, &db_key, &db_data, 0); - if ( ret != 0 ) - return false; - - assert(db_data.size == sizeof(ArrayHeader)); - memcpy(&header, db_data.data, sizeof(ArrayHeader)); - return true; - } - - /** - * FlexibleBigram::set_array_header: - * @index: the previous token of the flexible bi-gram. - * @header: the array header in the single gram of the previous token. - * @returns: whether the set operation is successful. - * - * Set the array header in the single gram of the previous token. - * - */ - bool set_array_header(phrase_token_t index, const ArrayHeader & header){ - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.data = (void *)&header; - db_data.size = sizeof(ArrayHeader); - db_data.flags = DB_DBT_PARTIAL; - db_data.doff = 0; - db_data.dlen = sizeof(ArrayHeader); - - int ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); - return ret == 0; - } - -}; - -}; - -#endif diff --git a/src/storage/ngram.cpp b/src/storage/ngram.cpp deleted file mode 100644 index 4994b4d..0000000 --- a/src/storage/ngram.cpp +++ /dev/null @@ -1,602 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2006-2007 Peng Wu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include <stdio.h> -#include <errno.h> -#include <glib.h> -#include <glib/gstdio.h> -#include "memory_chunk.h" -#include "novel_types.h" -#include "ngram.h" - -using namespace zhuyin; - -struct SingleGramItem{ - phrase_token_t m_token; - guint32 m_freq; -}; - -SingleGram::SingleGram(){ - m_chunk.set_size(sizeof(guint32)); - memset(m_chunk.begin(), 0, sizeof(guint32)); -} - -SingleGram::SingleGram(void * buffer, size_t length){ - m_chunk.set_chunk(buffer, length, NULL); -} - -bool SingleGram::get_total_freq(guint32 & total) const{ - char * buf_begin = (char *)m_chunk.begin(); - total = *((guint32 *)buf_begin); - return true; -} - -bool SingleGram::set_total_freq(guint32 total){ - char * buf_begin = (char *)m_chunk.begin(); - *((guint32 *)buf_begin) = total; - return true; -} - -guint32 SingleGram::get_length(){ - /* get the number of items. */ - const SingleGramItem * begin = (const SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - const SingleGramItem * end = (const SingleGramItem *) m_chunk.end(); - - const guint32 length = end - begin; - - if (0 == length) { - /* no items here, total freq should be zero. */ - guint32 total_freq = 0; - assert(get_total_freq(total_freq)); - assert(0 == total_freq); - } - - return length; -} - -guint32 SingleGram::mask_out(phrase_token_t mask, phrase_token_t value){ - guint32 removed_items = 0; - - guint32 total_freq = 0; - assert(get_total_freq(total_freq)); - - const SingleGramItem * begin = (const SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - const SingleGramItem * end = (const SingleGramItem *) m_chunk.end(); - - for (const SingleGramItem * cur = begin; cur != end; ++cur) { - if ((cur->m_token & mask) != value) - continue; - - total_freq -= cur->m_freq; - size_t offset = sizeof(guint32) + - sizeof(SingleGramItem) * (cur - begin); - m_chunk.remove_content(offset, sizeof(SingleGramItem)); - - /* update chunk end. */ - end = (const SingleGramItem *) m_chunk.end(); - ++removed_items; - --cur; - } - - assert(set_total_freq(total_freq)); - return removed_items; -} - -bool SingleGram::prune(){ - assert(false); -#if 0 - SingleGramItem * begin = (SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - SingleGramItem * end = (SingleGramItem *)m_chunk.end(); - - size_t nitem = 0; - for ( SingleGramItem * cur = begin; cur != end; ++cur){ - cur->m_freq--; - nitem++; - if ( cur->m_freq == 0 ){ - size_t offset = sizeof(guint32) + (cur - begin) - * sizeof(SingleGramItem) ; - m_chunk.remove_content(offset, sizeof(SingleGramItem)); - } - } - guint32 total_freq; - assert(get_total_freq(total_freq)); - assert(set_total_freq(total_freq - nitem)); -#endif - return true; -} - -static bool token_less_than(const SingleGramItem & lhs,const SingleGramItem & rhs){ - return lhs.m_token < rhs.m_token; -} - -bool SingleGram::retrieve_all(/* out */ BigramPhraseWithCountArray array) - const { - const SingleGramItem * begin = (const SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - const SingleGramItem * end = (const SingleGramItem *) m_chunk.end(); - - guint32 total_freq; - BigramPhraseItemWithCount bigram_item_with_count; - assert(get_total_freq(total_freq)); - - for ( const SingleGramItem * cur_item = begin; cur_item != end; ++cur_item){ - bigram_item_with_count.m_token = cur_item->m_token; - bigram_item_with_count.m_count = cur_item->m_freq; - bigram_item_with_count.m_freq = cur_item->m_freq / (gfloat)total_freq; - g_array_append_val(array, bigram_item_with_count); - } - - return true; -} - -bool SingleGram::search(/* in */ PhraseIndexRange * range, - /* out */ BigramPhraseArray array) const { - const SingleGramItem * begin = (const SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - const SingleGramItem * end = (const SingleGramItem *)m_chunk.end(); - - SingleGramItem compare_item; - compare_item.m_token = range->m_range_begin; - const SingleGramItem * cur_item = std_lite::lower_bound(begin, end, compare_item, token_less_than); - - guint32 total_freq; - BigramPhraseItem bigram_item; - assert(get_total_freq(total_freq)); - - for ( ; cur_item != end; ++cur_item){ - if ( cur_item->m_token >= range->m_range_end ) - break; - bigram_item.m_token = cur_item->m_token; - bigram_item.m_freq = cur_item->m_freq / (gfloat)total_freq; - g_array_append_val(array, bigram_item); - } - - return true; -} - -bool SingleGram::insert_freq( /* in */ phrase_token_t token, - /* in */ guint32 freq){ - SingleGramItem * begin = (SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - SingleGramItem * end = (SingleGramItem *) m_chunk.end(); - SingleGramItem compare_item; - compare_item.m_token = token; - SingleGramItem * cur_item = std_lite::lower_bound(begin, end, compare_item, token_less_than); - - SingleGramItem insert_item; - insert_item.m_token = token; - insert_item.m_freq = freq; - for ( ; cur_item != end; ++cur_item ){ - if ( cur_item->m_token > token ){ - size_t offset = sizeof(guint32) + - sizeof(SingleGramItem) * (cur_item - begin); - m_chunk.insert_content(offset, &insert_item, - sizeof(SingleGramItem)); - return true; - } - if ( cur_item->m_token == token ){ - return false; - } - } - m_chunk.insert_content(m_chunk.size(), &insert_item, - sizeof(SingleGramItem)); - return true; -} - -bool SingleGram::remove_freq( /* in */ phrase_token_t token, - /* out */ guint32 & freq){ - freq = 0; - const SingleGramItem * begin = (const SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - const SingleGramItem * end = (const SingleGramItem *)m_chunk.end(); - SingleGramItem compare_item; - compare_item.m_token = token; - const SingleGramItem * cur_item = std_lite::lower_bound(begin, end, compare_item, token_less_than); - - for ( ; cur_item != end; ++cur_item ){ - if ( cur_item->m_token > token ) - return false; - if ( cur_item->m_token == token ){ - freq = cur_item -> m_freq; - size_t offset = sizeof(guint32) + - sizeof(SingleGramItem) * (cur_item - begin); - m_chunk.remove_content(offset, sizeof(SingleGramItem)); - return true; - } - } - return false; -} - -bool SingleGram::get_freq(/* in */ phrase_token_t token, - /* out */ guint32 & freq) const { - freq = 0; - const SingleGramItem * begin = (const SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - const SingleGramItem * end = (const SingleGramItem *)m_chunk.end(); - SingleGramItem compare_item; - compare_item.m_token = token; - const SingleGramItem * cur_item = std_lite::lower_bound(begin, end, compare_item, token_less_than); - - for ( ; cur_item != end; ++cur_item){ - if ( cur_item->m_token > token ) - return false; - if ( cur_item->m_token == token ){ - freq = cur_item -> m_freq; - return true; - } - } - return false; -} - -bool SingleGram::set_freq( /* in */ phrase_token_t token, - /* in */ guint32 freq){ - SingleGramItem * begin = (SingleGramItem *) - ((const char *)(m_chunk.begin()) + sizeof(guint32)); - SingleGramItem * end = (SingleGramItem *)m_chunk.end(); - SingleGramItem compare_item; - compare_item.m_token = token; - SingleGramItem * cur_item = std_lite::lower_bound(begin, end, compare_item, token_less_than); - - for ( ;cur_item != end; ++cur_item){ - if ( cur_item->m_token > token ){ - return false; - } - if ( cur_item->m_token == token ){ - cur_item -> m_freq = freq; - return true; - } - } - return false; -} - -bool Bigram::load_db(const char * dbfile){ - reset(); - - /* create in memory db. */ - int ret = db_create(&m_db, NULL, 0); - assert(ret == 0); - - ret = m_db->open(m_db, NULL, NULL, NULL, - DB_HASH, DB_CREATE, 0600); - if ( ret != 0 ) - return false; - - /* load db into memory. */ - DB * tmp_db = NULL; - ret = db_create(&tmp_db, NULL, 0); - assert(ret == 0); - - if (NULL == tmp_db) - return false; - - ret = tmp_db->open(tmp_db, NULL, dbfile, NULL, - DB_HASH, DB_RDONLY, 0600); - if ( ret != 0 ) - return false; - - DBC * cursorp = NULL; - DBT key, data; - - /* Get a cursor */ - tmp_db->cursor(tmp_db, NULL, &cursorp, 0); - - if (NULL == cursorp) - return false; - - /* Initialize our DBTs. */ - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - - /* Iterate over the database, retrieving each record in turn. */ - while ((ret = cursorp->c_get(cursorp, &key, &data, DB_NEXT)) == 0) { - int ret = m_db->put(m_db, NULL, &key, &data, 0); - assert(ret == 0); - } - assert (ret == DB_NOTFOUND); - - /* Cursors must be closed */ - if ( cursorp != NULL ) - cursorp->c_close(cursorp); - - if ( tmp_db != NULL ) - tmp_db->close(tmp_db, 0); - - return true; -} - -bool Bigram::save_db(const char * dbfile){ - DB * tmp_db = NULL; - - int ret = unlink(dbfile); - if ( ret != 0 && errno != ENOENT) - return false; - - ret = db_create(&tmp_db, NULL, 0); - assert(ret == 0); - - if (NULL == tmp_db) - return false; - - ret = tmp_db->open(tmp_db, NULL, dbfile, NULL, - DB_HASH, DB_CREATE, 0600); - if ( ret != 0 ) - return false; - - DBC * cursorp = NULL; - DBT key, data; - /* Get a cursor */ - m_db->cursor(m_db, NULL, &cursorp, 0); - - if (NULL == cursorp) - return false; - - /* Initialize our DBTs. */ - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - - /* Iterate over the database, retrieving each record in turn. */ - while ((ret = cursorp->c_get(cursorp, &key, &data, DB_NEXT)) == 0) { - int ret = tmp_db->put(tmp_db, NULL, &key, &data, 0); - assert(ret == 0); - } - assert (ret == DB_NOTFOUND); - - /* Cursors must be closed */ - if ( cursorp != NULL ) - cursorp->c_close(cursorp); - - if ( tmp_db != NULL ) - tmp_db->close(tmp_db, 0); - - return true; -} - -bool Bigram::attach(const char * dbfile, guint32 flags){ - reset(); - u_int32_t db_flags = 0; - - if ( flags & ATTACH_READONLY ) - db_flags |= DB_RDONLY; - if ( flags & ATTACH_READWRITE ) - assert( !( flags & ATTACH_READONLY ) ); - if ( flags & ATTACH_CREATE ) - db_flags |= DB_CREATE; - - if ( !dbfile ) - return false; - int ret = db_create(&m_db, NULL, 0); - if ( ret != 0 ) - assert(false); - - ret = m_db->open(m_db, NULL, dbfile, NULL, - DB_HASH, db_flags, 0644); - if ( ret != 0) - return false; - - return true; -} - -bool Bigram::load(phrase_token_t index, SingleGram * & single_gram){ - single_gram = NULL; - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - int ret = m_db->get(m_db, NULL, &db_key, &db_data, 0); - if ( ret != 0 ) - return false; - - single_gram = new SingleGram(db_data.data, db_data.size); - return true; -} - -bool Bigram::store(phrase_token_t index, SingleGram * single_gram){ - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - DBT db_data; - memset(&db_data, 0, sizeof(DBT)); - db_data.data = single_gram->m_chunk.begin(); - db_data.size = single_gram->m_chunk.size(); - - int ret = m_db->put(m_db, NULL, &db_key, &db_data, 0); - return ret == 0; -} - -bool Bigram::remove(/* in */ phrase_token_t index){ - if ( !m_db ) - return false; - - DBT db_key; - memset(&db_key, 0, sizeof(DBT)); - db_key.data = &index; - db_key.size = sizeof(phrase_token_t); - - int ret = m_db->del(m_db, NULL, &db_key, 0); - return 0 == ret; -} - -bool Bigram::get_all_items(GArray * items){ - g_array_set_size(items, 0); - - if ( !m_db ) - return false; - - DBC * cursorp = NULL; - DBT key, data; - int ret; - /* Get a cursor */ - m_db->cursor(m_db, NULL, &cursorp, 0); - - if (NULL == cursorp) - return false; - - /* Initialize our DBTs. */ - memset(&key, 0, sizeof(DBT)); - memset(&data, 0, sizeof(DBT)); - - /* Iterate over the database, retrieving each record in turn. */ - while ((ret = cursorp->c_get(cursorp, &key, &data, DB_NEXT)) == 0) { - assert(key.size == sizeof(phrase_token_t)); - phrase_token_t * token = (phrase_token_t *)key.data; - g_array_append_val(items, *token); - } - - assert (ret == DB_NOTFOUND); - - /* Cursors must be closed */ - if (cursorp != NULL) - cursorp->c_close(cursorp); - - return true; -} - -bool Bigram::mask_out(phrase_token_t mask, phrase_token_t value){ - GArray * items = g_array_new(FALSE, FALSE, sizeof(phrase_token_t)); - - if (!get_all_items(items)) { - g_array_free(items, TRUE); - return false; - } - - for (size_t i = 0; i < items->len; ++i) { - phrase_token_t index = g_array_index(items, phrase_token_t, i); - - if ((index & mask) == value) { - assert(remove(index)); - continue; - } - - SingleGram * gram = NULL; - assert(load(index, gram)); - - int num = gram->mask_out(mask, value); - if (0 == num) { - delete gram; - continue; - } - - if (0 == gram->get_length()) { - assert(remove(index)); - } else { - assert(store(index, gram)); - } - - delete gram; - } - - g_array_free(items, TRUE); - return true; -} - - -namespace zhuyin{ - -/* merge origin system info and delta user info */ -bool merge_single_gram(SingleGram * merged, const SingleGram * system, - const SingleGram * user){ - if (NULL == system && NULL == user) - return false; - - MemoryChunk & merged_chunk = merged->m_chunk; - - if (NULL == system) { - merged_chunk.set_chunk(user->m_chunk.begin(), - user->m_chunk.size(), NULL); - return true; - } - - if (NULL == user) { - merged_chunk.set_chunk(system->m_chunk.begin(), - system->m_chunk.size(), NULL); - return true; - } - - /* clear merged. */ - merged_chunk.set_size(sizeof(guint32)); - - /* merge the origin info and delta info */ - guint32 system_total, user_total; - assert(system->get_total_freq(system_total)); - assert(user->get_total_freq(user_total)); - const guint32 merged_total = system_total + user_total; - merged_chunk.set_content(0, &merged_total, sizeof(guint32)); - - const SingleGramItem * cur_system = (const SingleGramItem *) - (((const char *)(system->m_chunk.begin())) + sizeof(guint32)); - const SingleGramItem * system_end = (const SingleGramItem *) - system->m_chunk.end(); - - const SingleGramItem * cur_user = (const SingleGramItem *) - (((const char *)(user->m_chunk.begin())) + sizeof(guint32)); - const SingleGramItem * user_end = (const SingleGramItem *) - user->m_chunk.end(); - - while (cur_system < system_end && cur_user < user_end) { - - if (cur_system->m_token < cur_user->m_token) { - /* do append operation here */ - merged_chunk.append_content(cur_system, sizeof(SingleGramItem)); - cur_system++; - } else if (cur_system->m_token > cur_user->m_token) { - /* do append operation here */ - merged_chunk.append_content(cur_user, sizeof(SingleGramItem)); - cur_user++; - } else { - assert(cur_system->m_token == cur_user->m_token); - - SingleGramItem merged_item; - merged_item.m_token = cur_system->m_token; - merged_item.m_freq = cur_system->m_freq + cur_user->m_freq; - - merged_chunk.append_content(&merged_item, sizeof(SingleGramItem)); - cur_system++; cur_user++; - } - } - - /* add remained items. */ - while (cur_system < system_end) { - merged_chunk.append_content(cur_system, sizeof(SingleGramItem)); - cur_system++; - } - - while (cur_user < user_end) { - merged_chunk.append_content(cur_user, sizeof(SingleGramItem)); - cur_user++; - } - - return true; -} - -}; diff --git a/src/storage/ngram.h b/src/storage/ngram.h deleted file mode 100644 index a152063..0000000 --- a/src/storage/ngram.h +++ /dev/null @@ -1,329 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2006-2007 Peng Wu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef NGRAM_H -#define NGRAM_H - -#include <db.h> - -namespace zhuyin{ - -class Bigram; - -/** Note: - * The system single gram contains the trained freqs. - * The user single gram contains the delta freqs. - * During the Viterbi beam search, use merge_single_gram to merge the system - * single gram and the user single gram. - */ - - -/** - * SingleGram: - * - * The single gram in the bi-gram. - * - */ -class SingleGram{ - friend class Bigram; - friend bool merge_single_gram(SingleGram * merged, - const SingleGram * system, - const SingleGram * user); - -private: - MemoryChunk m_chunk; - SingleGram(void * buffer, size_t length); -public: - /** - * SingleGram::SingleGram: - * - * The constructor of the SingleGram. - * - */ - SingleGram(); - /** - * SingleGram::retrieve_all: - * @array: the GArray to store the retrieved bi-gram phrase item. - * @returns: whether the retrieve operation is successful. - * - * Retrieve all bi-gram phrase items in this single gram. - * - */ - bool retrieve_all(/* out */ BigramPhraseWithCountArray array) const; - - /** - * SingleGram::search: - * @range: the token range. - * @array: the GArray to store the matched bi-gram phrase item. - * @returns: whether the search operation is successful. - * - * Search the bi-gram phrase items according to the token range. - * - * Note: the array result may contain many items. - * - */ - bool search(/* in */ PhraseIndexRange * range, - /* out */ BigramPhraseArray array) const; - - /** - * SingleGram::insert_freq: - * @token: the phrase token. - * @freq: the freq of this token. - * @returns: whether the insert operation is successful. - * - * Insert the token with the freq. - * - */ - bool insert_freq(/* in */ phrase_token_t token, - /* in */ guint32 freq); - - /** - * SingleGram::remove_freq: - * @token: the phrase token. - * @freq: the freq of the removed token. - * @returns: whether the remove operation is successful. - * - * Remove the token. - * - */ - bool remove_freq(/* in */ phrase_token_t token, - /* out */ guint32 & freq); - - /** - * SingleGram::get_freq: - * @token: the phrase token. - * @freq: the freq of the token. - * @returns: whether the get operation is successful. - * - * Get the freq of the token. - * - */ - bool get_freq(/* in */ phrase_token_t token, - /* out */ guint32 & freq) const; - - /** - * SingleGram::set_freq: - * @token: the phrase token. - * @freq: the freq of the token. - * @returns: whether the set operation is successful. - * - * Set the freq of the token. - * - */ - bool set_freq(/* in */ phrase_token_t token, - /* in */ guint32 freq); - - /** - * SingleGram::get_total_freq: - * @total: the total freq of this single gram. - * @returns: whether the get operation is successful. - * - * Get the total freq of this single gram. - * - */ - bool get_total_freq(guint32 & total) const; - - /** - * SingleGram::set_total_freq: - * @total: the total freq of this single gram. - * @returns: whether the set operation is successful. - * - * Set the total freq of this single gram. - * - */ - bool set_total_freq(guint32 total); - - /** - * SingleGram::get_length: - * @returns: the number of items in this single gram. - * - * Get the number of items in this single gram. - * - */ - guint32 get_length(); - - /** - * SingleGram::mask_out: - * @mask: the mask. - * @value: the value. - * @returns: the number of removed items. - * - * Mask out the matched items in this single gram. - * - */ - guint32 mask_out(phrase_token_t mask, phrase_token_t value); - - /** - * SingleGram::prune: - * @returns: whether the prune operation is successful. - * - * Obsoleted by Katz k mixture model pruning. - * - */ - bool prune(); -}; - - -/** - * Bigram: - * - * The Bi-gram class. - * - */ -class Bigram{ -private: - DB * m_db; - - void reset(){ - if ( m_db ){ - m_db->sync(m_db, 0); - m_db->close(m_db, 0); - m_db = NULL; - } - } - -public: - /** - * Bigram::Bigram: - * - * The constructor of the Bigram. - * - */ - Bigram(){ - m_db = NULL; - } - - /** - * Bigram::~Bigram: - * - * The destructor of the Bigram. - * - */ - ~Bigram(){ - reset(); - } - - /** - * Bigram::load_db: - * @dbfile: the Berkeley DB file name. - * @returns: whether the load operation is successful. - * - * Load the Berkeley DB into memory. - * - */ - bool load_db(const char * dbfile); - - /** - * Bigram::save_db: - * @dbfile: the Berkeley DB file name. - * @returns: whether the save operation is successful. - * - * Save the in-memory Berkeley DB into disk. - * - */ - bool save_db(const char * dbfile); - - /** - * Bigram::attach: - * @dbfile: the Berkeley DB file name. - * @flags: the flags of enum ATTACH_FLAG. - * @returns: whether the attach operation is successful. - * - * Attach this Bigram with the Berkeley DB. - * - */ - bool attach(const char * dbfile, guint32 flags); - - /** - * Bigram::load: - * @index: the previous token in the bi-gram. - * @single_gram: the single gram of the previous token. - * @returns: whether the load operation is successful. - * - * Load the single gram of the previous token. - * - */ - bool load(/* in */ phrase_token_t index, - /* out */ SingleGram * & single_gram); - - /** - * Bigram::store: - * @index: the previous token in the bi-gram. - * @single_gram: the single gram of the previous token. - * @returns: whether the store operation is successful. - * - * Store the single gram of the previous token. - * - */ - bool store(/* in */ phrase_token_t index, - /* in */ SingleGram * single_gram); - - /** - * Bigram::remove: - * @index: the previous token in the bi-gram. - * @returns: whether the remove operation is successful. - * - * Remove the single gram of the previous token. - * - */ - bool remove(/* in */ phrase_token_t index); - - /** - * Bigram::get_all_items: - * @items: the GArray to store all previous tokens. - * @returns: whether the get operation is successful. - * - * Get the array of all previous tokens for parameter estimation. - * - */ - bool get_all_items(/* out */ GArray * items); - - /** - * Bigram::mask_out: - * @mask: the mask. - * @value: the value. - * @returns: whether the mask out operation is successful. - * - * Mask out the matched items. - * - */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - -/** - * merge_single_gram: - * @merged: the merged single gram of system and user single gram. - * @system: the system single gram to be merged. - * @user: the user single gram to be merged. - * @returns: whether the merge operation is successful. - * - * Merge the system and user single gram into one merged single gram. - * - * Note: Please keep system and user single gram - * when using merged single gram. - * - */ -bool merge_single_gram(SingleGram * merged, const SingleGram * system, - const SingleGram * user); - -}; - -#endif diff --git a/src/storage/phrase_index.cpp b/src/storage/phrase_index.cpp deleted file mode 100644 index 69ac938..0000000 --- a/src/storage/phrase_index.cpp +++ /dev/null @@ -1,860 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2006-2007 Peng Wu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "phrase_index.h" -#include "zhuyin_custom2.h" - -using namespace zhuyin; - -bool PhraseItem::set_n_pronunciation(guint8 n_prouns){ - m_chunk.set_content(sizeof(guint8), &n_prouns, sizeof(guint8)); - return true; -} - -bool PhraseItem::get_nth_pronunciation(size_t index, ChewingKey * keys, - guint32 & freq){ - guint8 phrase_length = get_phrase_length(); - table_offset_t offset = phrase_item_header + phrase_length * sizeof( ucs4_t) + index * ( phrase_length * sizeof (ChewingKey) + sizeof(guint32)); - - bool retval = m_chunk.get_content - (offset, keys, phrase_length * sizeof(ChewingKey)); - if ( !retval ) - return retval; - return m_chunk.get_content - (offset + phrase_length * sizeof(ChewingKey), &freq , sizeof(guint32)); -} - -#if 0 -void PhraseItem::append_pronunciation(ChewingKey * keys, guint32 freq){ - guint8 phrase_length = get_phrase_length(); - set_n_pronunciation(get_n_pronunciation() + 1); - m_chunk.set_content(m_chunk.size(), keys, - phrase_length * sizeof(ChewingKey)); - m_chunk.set_content(m_chunk.size(), &freq, sizeof(guint32)); -} -#endif - -bool PhraseItem::add_pronunciation(ChewingKey * keys, guint32 delta){ - guint8 phrase_length = get_phrase_length(); - guint8 npron = get_n_pronunciation(); - size_t offset = phrase_item_header + phrase_length * sizeof(ucs4_t); - char * buf_begin = (char *) m_chunk.begin(); - guint32 total_freq = 0; - - for (int i = 0; i < npron; ++i) { - char * chewing_begin = buf_begin + offset + - i * (phrase_length * sizeof(ChewingKey) + sizeof(guint32)); - guint32 * freq = (guint32 *)(chewing_begin + - phrase_length * sizeof(ChewingKey)); - - total_freq += *freq; - - if (0 == pinyin_exact_compare2 - (keys, (ChewingKey *)chewing_begin, phrase_length)) { - /* found the exact match pinyin keys. */ - - /* protect against total_freq overflow. */ - if (delta > 0 && total_freq > total_freq + delta) - return false; - - *freq += delta; - total_freq += delta; - return true; - } - } - - set_n_pronunciation(npron + 1); - m_chunk.set_content(m_chunk.size(), keys, - phrase_length * sizeof(ChewingKey)); - m_chunk.set_content(m_chunk.size(), &delta, sizeof(guint32)); - return true; -} - -void PhraseItem::remove_nth_pronunciation(size_t index){ - guint8 phrase_length = get_phrase_length(); - set_n_pronunciation(get_n_pronunciation() - 1); - size_t offset = phrase_item_header + phrase_length * sizeof(ucs4_t) + - index * (phrase_length * sizeof(ChewingKey) + sizeof(guint32)); - m_chunk.remove_content(offset, phrase_length * sizeof(ChewingKey) + sizeof(guint32)); -} - -bool PhraseItem::get_phrase_string(ucs4_t * phrase){ - guint8 phrase_length = get_phrase_length(); - return m_chunk.get_content(phrase_item_header, phrase, phrase_length * sizeof(ucs4_t)); -} - -bool PhraseItem::set_phrase_string(guint8 phrase_length, ucs4_t * phrase){ - m_chunk.set_content(0, &phrase_length, sizeof(guint8)); - m_chunk.set_content(phrase_item_header, phrase, phrase_length * sizeof(ucs4_t)); - return true; -} - -void PhraseItem::increase_pronunciation_possibility(pinyin_option_t options, - ChewingKey * keys, - gint32 delta){ - guint8 phrase_length = get_phrase_length(); - guint8 npron = get_n_pronunciation(); - size_t offset = phrase_item_header + phrase_length * sizeof(ucs4_t); - char * buf_begin = (char *) m_chunk.begin(); - guint32 total_freq = 0; - - for (int i = 0; i < npron; ++i) { - char * chewing_begin = buf_begin + offset + - i * (phrase_length * sizeof(ChewingKey) + sizeof(guint32)); - guint32 * freq = (guint32 *)(chewing_begin + - phrase_length * sizeof(ChewingKey)); - total_freq += *freq; - - if (0 == pinyin_compare_with_ambiguities2 - (options, keys, - (ChewingKey *)chewing_begin, phrase_length)) { - - /* protect against total_freq overflow. */ - if (delta > 0 && total_freq > total_freq + delta) - return; - - *freq += delta; - total_freq += delta; - } - } -} - - -guint32 SubPhraseIndex::get_phrase_index_total_freq(){ - return m_total_freq; -} - -int SubPhraseIndex::add_unigram_frequency(phrase_token_t token, guint32 delta){ - table_offset_t offset; - guint32 freq; - bool result = m_phrase_index.get_content - ((token & PHRASE_MASK) - * sizeof(table_offset_t), &offset, sizeof(table_offset_t)); - - if ( !result ) - return ERROR_OUT_OF_RANGE; - - if ( 0 == offset ) - return ERROR_NO_ITEM; - - result = m_phrase_content.get_content - (offset + sizeof(guint8) + sizeof(guint8), &freq, sizeof(guint32)); - - if ( !result ) - return ERROR_FILE_CORRUPTION; - - //protect total_freq overflow - if ( delta > 0 && m_total_freq > m_total_freq + delta ) - return ERROR_INTEGER_OVERFLOW; - - freq += delta; - m_total_freq += delta; - m_phrase_content.set_content(offset + sizeof(guint8) + sizeof(guint8), &freq, sizeof(guint32)); - - return ERROR_OK; -} - -int SubPhraseIndex::get_phrase_item(phrase_token_t token, PhraseItem & item){ - table_offset_t offset; - guint8 phrase_length; - guint8 n_prons; - - bool result = m_phrase_index.get_content - ((token & PHRASE_MASK) - * sizeof(table_offset_t), &offset, sizeof(table_offset_t)); - - if ( !result ) - return ERROR_OUT_OF_RANGE; - - if ( 0 == offset ) - return ERROR_NO_ITEM; - - result = m_phrase_content.get_content(offset, &phrase_length, sizeof(guint8)); - if ( !result ) - return ERROR_FILE_CORRUPTION; - - result = m_phrase_content.get_content(offset+sizeof(guint8), &n_prons, sizeof(guint8)); - if ( !result ) - return ERROR_FILE_CORRUPTION; - - size_t length = phrase_item_header + phrase_length * sizeof ( ucs4_t ) + n_prons * ( phrase_length * sizeof (ChewingKey) + sizeof(guint32) ); - item.m_chunk.set_chunk((char *)m_phrase_content.begin() + offset, length, NULL); - return ERROR_OK; -} - -int SubPhraseIndex::add_phrase_item(phrase_token_t token, PhraseItem * item){ - table_offset_t offset = m_phrase_content.size(); - if ( 0 == offset ) - offset = 8; - m_phrase_content.set_content(offset, item->m_chunk.begin(), item->m_chunk.size()); - m_phrase_index.set_content((token & PHRASE_MASK) - * sizeof(table_offset_t), &offset, sizeof(table_offset_t)); - m_total_freq += item->get_unigram_frequency(); - return ERROR_OK; -} - -int SubPhraseIndex::remove_phrase_item(phrase_token_t token, PhraseItem * & item){ - PhraseItem old_item; - - int result = get_phrase_item(token, old_item); - if (result != ERROR_OK) - return result; - - item = new PhraseItem; - //implictly copy data from m_chunk_content. - item->m_chunk.set_content(0, (char *) old_item.m_chunk.begin() , old_item.m_chunk.size()); - - const table_offset_t zero_const = 0; - m_phrase_index.set_content((token & PHRASE_MASK) - * sizeof(table_offset_t), &zero_const, sizeof(table_offset_t)); - m_total_freq -= item->get_unigram_frequency(); - return ERROR_OK; -} - -bool FacadePhraseIndex::load(guint8 phrase_index, MemoryChunk * chunk){ - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrases ){ - sub_phrases = new SubPhraseIndex; - } - - m_total_freq -= sub_phrases->get_phrase_index_total_freq(); - bool retval = sub_phrases->load(chunk, 0, chunk->size()); - if ( !retval ) - return retval; - m_total_freq += sub_phrases->get_phrase_index_total_freq(); - return retval; -} - -bool FacadePhraseIndex::store(guint8 phrase_index, MemoryChunk * new_chunk){ - table_offset_t end; - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrases ) - return false; - - sub_phrases->store(new_chunk, 0, end); - return true; -} - -bool FacadePhraseIndex::unload(guint8 phrase_index){ - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrases ) - return false; - m_total_freq -= sub_phrases->get_phrase_index_total_freq(); - delete sub_phrases; - sub_phrases = NULL; - return true; -} - -bool FacadePhraseIndex::diff(guint8 phrase_index, MemoryChunk * oldchunk, - MemoryChunk * newlog){ - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrases ) - return false; - - SubPhraseIndex old_sub_phrases; - old_sub_phrases.load(oldchunk, 0, oldchunk->size()); - PhraseIndexLogger logger; - - bool retval = sub_phrases->diff(&old_sub_phrases, &logger); - logger.store(newlog); - return retval; -} - -bool FacadePhraseIndex::merge(guint8 phrase_index, MemoryChunk * log){ - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrases ) - return false; - - m_total_freq -= sub_phrases->get_phrase_index_total_freq(); - PhraseIndexLogger logger; - logger.load(log); - - bool retval = sub_phrases->merge(&logger); - m_total_freq += sub_phrases->get_phrase_index_total_freq(); - - return retval; -} - -bool FacadePhraseIndex::merge_with_mask(guint8 phrase_index, - MemoryChunk * log, - phrase_token_t mask, - phrase_token_t value){ - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrases ) - return false; - - /* check mask and value. */ - phrase_token_t index_mask = PHRASE_INDEX_LIBRARY_INDEX(mask); - phrase_token_t index_value = PHRASE_INDEX_LIBRARY_INDEX(value); - if ((phrase_index & index_mask) != index_value) - return false; - - /* unload old sub phrase index */ - m_total_freq -= sub_phrases->get_phrase_index_total_freq(); - - /* calculate the sub phrase index mask and value. */ - mask &= PHRASE_MASK; value &= PHRASE_MASK; - - /* prepare the new logger. */ - PhraseIndexLogger oldlogger; - oldlogger.load(log); - PhraseIndexLogger * newlogger = mask_out_phrase_index_logger - (&oldlogger, mask, value); - - bool retval = sub_phrases->merge(newlogger); - m_total_freq += sub_phrases->get_phrase_index_total_freq(); - delete newlogger; - - return retval; -} - - -bool SubPhraseIndex::load(MemoryChunk * chunk, - table_offset_t offset, table_offset_t end){ - //save the memory chunk - if ( m_chunk ){ - delete m_chunk; - m_chunk = NULL; - } - m_chunk = chunk; - - char * buf_begin = (char *)chunk->begin(); - chunk->get_content(offset, &m_total_freq, sizeof(guint32)); - offset += sizeof(guint32); - table_offset_t index_one, index_two, index_three; - chunk->get_content(offset, &index_one, sizeof(table_offset_t)); - offset += sizeof(table_offset_t); - chunk->get_content(offset, &index_two, sizeof(table_offset_t)); - offset += sizeof(table_offset_t); - chunk->get_content(offset, &index_three, sizeof(table_offset_t)); - offset += sizeof(table_offset_t); - g_return_val_if_fail(*(buf_begin + offset) == c_separate, FALSE); - g_return_val_if_fail(*(buf_begin + index_two - 1) == c_separate, FALSE); - g_return_val_if_fail(*(buf_begin + index_three - 1) == c_separate, FALSE); - m_phrase_index.set_chunk(buf_begin + index_one, - index_two - 1 - index_one, NULL); - m_phrase_content.set_chunk(buf_begin + index_two, - index_three - 1 - index_two, NULL); - g_return_val_if_fail( index_three <= end, FALSE); - return true; -} - -bool SubPhraseIndex::store(MemoryChunk * new_chunk, - table_offset_t offset, table_offset_t& end){ - new_chunk->set_content(offset, &m_total_freq, sizeof(guint32)); - table_offset_t index = offset + sizeof(guint32); - - offset = index + sizeof(table_offset_t) * 3 ; - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - new_chunk->set_content(offset, m_phrase_index.begin(), m_phrase_index.size()); - offset += m_phrase_index.size(); - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - - new_chunk->set_content(offset, m_phrase_content.begin(), m_phrase_content.size()); - offset += m_phrase_content.size(); - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - return true; -} - -bool SubPhraseIndex::diff(SubPhraseIndex * oldone, PhraseIndexLogger * logger){ - /* diff the header */ - MemoryChunk oldheader, newheader; - guint32 total_freq = oldone->get_phrase_index_total_freq(); - oldheader.set_content(0, &total_freq, sizeof(guint32)); - total_freq = get_phrase_index_total_freq(); - newheader.set_content(0, &total_freq, sizeof(guint32)); - logger->append_record(LOG_MODIFY_HEADER, null_token, - &oldheader, &newheader); - - /* diff phrase items */ - PhraseIndexRange oldrange, currange, range; - oldone->get_range(oldrange); get_range(currange); - range.m_range_begin = std_lite::min(oldrange.m_range_begin, - currange.m_range_begin); - range.m_range_end = std_lite::max(oldrange.m_range_end, - currange.m_range_end); - PhraseItem olditem, newitem; - - for (phrase_token_t token = range.m_range_begin; - token < range.m_range_end; ++token ){ - bool oldretval = ERROR_OK == oldone->get_phrase_item(token, olditem); - bool newretval = ERROR_OK == get_phrase_item(token, newitem); - - if ( oldretval ){ - if ( newretval ) { /* compare phrase item. */ - if ( olditem == newitem ) - continue; - logger->append_record(LOG_MODIFY_RECORD, token, - &(olditem.m_chunk), &(newitem.m_chunk)); - } else { /* remove phrase item. */ - logger->append_record(LOG_REMOVE_RECORD, token, - &(olditem.m_chunk), NULL); - } - } else { - if ( newretval ){ /* add phrase item. */ - logger->append_record(LOG_ADD_RECORD, token, - NULL, &(newitem.m_chunk)); - } else { /* both empty. */ - /* do nothing. */ - } - } - } - - return true; -} - -bool SubPhraseIndex::merge(PhraseIndexLogger * logger){ - LOG_TYPE log_type; phrase_token_t token; - MemoryChunk oldchunk, newchunk; - PhraseItem olditem, newitem, item, * tmpitem; - - while(logger->has_next_record()){ - bool retval = logger->next_record - (log_type, token, &oldchunk, &newchunk); - - if (!retval) - break; - - switch(log_type){ - case LOG_ADD_RECORD:{ - assert( 0 == oldchunk.size() ); - newitem.m_chunk.set_chunk(newchunk.begin(), newchunk.size(), - NULL); - add_phrase_item(token, &newitem); - break; - } - case LOG_REMOVE_RECORD:{ - assert( 0 == newchunk.size() ); - tmpitem = NULL; - remove_phrase_item(token, tmpitem); - - olditem.m_chunk.set_chunk(oldchunk.begin(), oldchunk.size(), - NULL); - - if (olditem != *tmpitem) { - delete tmpitem; - return false; - } - - delete tmpitem; - - break; - } - case LOG_MODIFY_RECORD:{ - get_phrase_item(token, item); - olditem.m_chunk.set_chunk(oldchunk.begin(), oldchunk.size(), - NULL); - newitem.m_chunk.set_chunk(newchunk.begin(), newchunk.size(), - NULL); - if (item != olditem) - return false; - - if (newchunk.size() > item.m_chunk.size() ){ /* increase size. */ - tmpitem = NULL; - remove_phrase_item(token, tmpitem); - assert(olditem == *tmpitem); - add_phrase_item(token, &newitem); - delete tmpitem; - } else { /* in place editing. */ - /* newchunk.size() <= item.m_chunk.size() */ - /* Hack here: we assume the behaviour of get_phrase_item - * point to the actual data positon, so changes to item - * will be saved in SubPhraseIndex immediately. - */ - memmove(item.m_chunk.begin(), newchunk.begin(), - newchunk.size()); - } - break; - } - case LOG_MODIFY_HEADER:{ - guint32 total_freq = get_phrase_index_total_freq(); - guint32 tmp_freq = 0; - assert(null_token == token); - assert(oldchunk.size() == newchunk.size()); - oldchunk.get_content(0, &tmp_freq, sizeof(guint32)); - if (total_freq != tmp_freq) - return false; - newchunk.get_content(0, &tmp_freq, sizeof(guint32)); - m_total_freq = tmp_freq; - break; - } - default: - assert(false); - } - } - return true; -} - -bool FacadePhraseIndex::load_text(guint8 phrase_index, FILE * infile){ - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrases ){ - sub_phrases = new SubPhraseIndex; - } - - char pinyin[256]; - char phrase[256]; - phrase_token_t token; - size_t freq; - - PhraseItem * item_ptr = new PhraseItem; - phrase_token_t cur_token = 0; - - while (!feof(infile)){ - int num = fscanf(infile, "%256s %256s %u %ld", - pinyin, phrase, &token, &freq); - - if (4 != num) - continue; - - if (feof(infile)) - break; - - assert(PHRASE_INDEX_LIBRARY_INDEX(token) == phrase_index ); - - glong written; - ucs4_t * phrase_ucs4 = g_utf8_to_ucs4(phrase, -1, NULL, - &written, NULL); - - if ( 0 == cur_token ){ - cur_token = token; - item_ptr->set_phrase_string(written, phrase_ucs4); - } - - if ( cur_token != token ){ - add_phrase_item( cur_token, item_ptr); - delete item_ptr; - item_ptr = new PhraseItem; - cur_token = token; - item_ptr->set_phrase_string(written, phrase_ucs4); - } - - pinyin_option_t options = USE_TONE; - ChewingDirectParser2 parser; - ChewingKeyVector keys = g_array_new(FALSE, FALSE, sizeof(ChewingKey)); - ChewingKeyRestVector key_rests = - g_array_new(FALSE, FALSE, sizeof(ChewingKeyRest)); - - parser.parse(options, keys, key_rests, pinyin, strlen(pinyin)); - - if (item_ptr->get_phrase_length() == keys->len) { - item_ptr->add_pronunciation((ChewingKey *)keys->data, freq); - } else { - fprintf(stderr, "FacadePhraseIndex::load_text:%s\t%s\n", - pinyin, phrase); - } - - g_array_free(keys, TRUE); - g_array_free(key_rests, TRUE); - g_free(phrase_ucs4); - } - - add_phrase_item( cur_token, item_ptr); - delete item_ptr; -#if 0 - m_total_freq += m_sub_phrase_indices[phrase_index]->get_phrase_index_total_freq(); -#endif - return true; -} - -int FacadePhraseIndex::get_sub_phrase_range(guint8 & min_index, - guint8 & max_index){ - min_index = PHRASE_INDEX_LIBRARY_COUNT; max_index = 0; - for ( guint8 i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i ){ - if ( m_sub_phrase_indices[i] ) { - min_index = std_lite::min(min_index, i); - max_index = std_lite::max(max_index, i); - } - } - return ERROR_OK; -} - -int FacadePhraseIndex::get_range(guint8 phrase_index, /* out */ PhraseIndexRange & range){ - SubPhraseIndex * sub_phrase = m_sub_phrase_indices[phrase_index]; - if ( !sub_phrase ) - return ERROR_NO_SUB_PHRASE_INDEX; - - int result = sub_phrase->get_range(range); - if ( result ) - return result; - - range.m_range_begin = PHRASE_INDEX_MAKE_TOKEN(phrase_index, range.m_range_begin); - range.m_range_end = PHRASE_INDEX_MAKE_TOKEN(phrase_index, range.m_range_end); - return ERROR_OK; -} - -int SubPhraseIndex::get_range(/* out */ PhraseIndexRange & range){ - const table_offset_t * begin = (const table_offset_t *)m_phrase_index.begin(); - const table_offset_t * end = (const table_offset_t *)m_phrase_index.end(); - - if (begin == end) { - /* skip empty sub phrase index. */ - range.m_range_begin = 1; - range.m_range_end = 1; - return ERROR_OK; - } - - /* remove trailing zeros. */ - const table_offset_t * poffset = 0; - for (poffset = end - 1; poffset >= begin + 1; --poffset) { - if (0 != *poffset) - break; - } - - range.m_range_begin = 1; /* token starts with 1 in gen_pinyin_table. */ - range.m_range_end = poffset + 1 - begin; /* removed zeros. */ - - return ERROR_OK; -} - -bool FacadePhraseIndex::compact(){ - for ( size_t index = 0; index < PHRASE_INDEX_LIBRARY_COUNT; ++index) { - SubPhraseIndex * sub_phrase = m_sub_phrase_indices[index]; - if ( !sub_phrase ) - continue; - - PhraseIndexRange range; - int result = sub_phrase->get_range(range); - if ( result != ERROR_OK ) - continue; - - SubPhraseIndex * new_sub_phrase = new SubPhraseIndex; - - PhraseItem item; - for ( phrase_token_t token = range.m_range_begin; - token < range.m_range_end; - ++token ) { - result = sub_phrase->get_phrase_item(token, item); - if ( result != ERROR_OK ) - continue; - new_sub_phrase->add_phrase_item(token, &item); - } - - delete sub_phrase; - m_sub_phrase_indices[index] = new_sub_phrase; - } - return true; -} - -bool SubPhraseIndex::mask_out(phrase_token_t mask, phrase_token_t value){ - PhraseIndexRange range; - if (ERROR_OK != get_range(range)) - return false; - - /* calculate mask and value for sub phrase index. */ - mask &= PHRASE_MASK; value &= PHRASE_MASK; - - for (phrase_token_t token = range.m_range_begin; - token < range.m_range_end; ++token) { - if ((token & mask) != value) - continue; - - PhraseItem * item = NULL; - remove_phrase_item(token, item); - if (item) - delete item; - } - - return true; -} - -bool FacadePhraseIndex::mask_out(guint8 phrase_index, - phrase_token_t mask, - phrase_token_t value){ - SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index]; - if (!sub_phrases) - return false; - - /* check mask and value. */ - phrase_token_t index_mask = PHRASE_INDEX_LIBRARY_INDEX(mask); - phrase_token_t index_value = PHRASE_INDEX_LIBRARY_INDEX(value); - - if ((phrase_index & index_mask ) != index_value) - return false; - - m_total_freq -= sub_phrases->get_phrase_index_total_freq(); - bool retval = sub_phrases->mask_out(mask, value); - m_total_freq += sub_phrases->get_phrase_index_total_freq(); - - return retval; -} - -namespace zhuyin{ - - -static bool _peek_header(PhraseIndexLogger * logger, - guint32 & old_total_freq){ - old_total_freq = 0; - - size_t header_count = 0; - LOG_TYPE log_type; phrase_token_t token; - MemoryChunk oldchunk, newchunk; - - while (logger->has_next_record()) { - bool retval = logger->next_record - (log_type, token, &oldchunk, &newchunk); - - if (!retval) - break; - - if (LOG_MODIFY_HEADER != log_type) - continue; - - ++header_count; - - oldchunk.get_content(0, &old_total_freq, sizeof(guint32)); - } - - /* 1 for normal case, 0 for corrupted file. */ - assert(1 >= header_count); - - return 1 == header_count? true : false; -} - -bool _compute_new_header(PhraseIndexLogger * logger, - phrase_token_t mask, - phrase_token_t value, - guint32 & new_total_freq) { - - LOG_TYPE log_type; phrase_token_t token; - MemoryChunk oldchunk, newchunk; - PhraseItem olditem, newitem; - - while(logger->has_next_record()) { - bool retval = logger->next_record - (log_type, token, &oldchunk, &newchunk); - - if (!retval) - break; - - if (LOG_MODIFY_HEADER == log_type) - continue; - - if ((token & mask) == value) - continue; - - switch(log_type) { - case LOG_ADD_RECORD:{ - assert( 0 == oldchunk.size() ); - newitem.m_chunk.set_chunk(newchunk.begin(), newchunk.size(), - NULL); - new_total_freq += newitem.get_unigram_frequency(); - break; - } - case LOG_REMOVE_RECORD:{ - assert( 0 == newchunk.size() ); - olditem.m_chunk.set_chunk(oldchunk.begin(), oldchunk.size(), - NULL); - new_total_freq -= olditem.get_unigram_frequency(); - break; - } - case LOG_MODIFY_RECORD:{ - olditem.m_chunk.set_chunk(oldchunk.begin(), oldchunk.size(), - NULL); - new_total_freq -= olditem.get_unigram_frequency(); - - newitem.m_chunk.set_chunk(newchunk.begin(), newchunk.size(), - NULL); - new_total_freq += newitem.get_unigram_frequency(); - break; - } - default: - assert(false); - } - } - - return true; -} - -static bool _write_header(PhraseIndexLogger * logger, - guint32 & old_total_freq, - guint32 & new_total_freq) { - MemoryChunk oldheader, newheader; - oldheader.set_content(0, &old_total_freq, sizeof(guint32)); - newheader.set_content(0, &new_total_freq, sizeof(guint32)); - logger->append_record(LOG_MODIFY_HEADER, null_token, - &oldheader, &newheader); - return true; -} - -static bool _mask_out_records(PhraseIndexLogger * oldlogger, - phrase_token_t mask, - phrase_token_t value, - PhraseIndexLogger * newlogger) { - LOG_TYPE log_type; phrase_token_t token; - MemoryChunk oldchunk, newchunk; - - while(oldlogger->has_next_record()) { - bool retval = oldlogger->next_record - (log_type, token, &oldchunk, &newchunk); - - if (!retval) - break; - - if (LOG_MODIFY_HEADER == log_type) - continue; - - if ((token & mask) == value) - continue; - - newlogger->append_record(log_type, token, &oldchunk, &newchunk); - } - - return true; -} - -PhraseIndexLogger * mask_out_phrase_index_logger -(PhraseIndexLogger * oldlogger, phrase_token_t mask, - phrase_token_t value) { - PhraseIndexLogger * newlogger = new PhraseIndexLogger; - guint32 old_total_freq = 0, new_total_freq = 0; - - /* peek the header value. */ - if (!_peek_header(oldlogger, old_total_freq)) - return newlogger; - - new_total_freq = old_total_freq; - - /* compute the new header based on add/modify/remove records. */ - oldlogger->rewind(); - if (!_compute_new_header(oldlogger, mask, value, new_total_freq)) - return newlogger; - - /* write out the modify header record. */ - _write_header(newlogger, old_total_freq, new_total_freq); - - /* mask out the matched records. */ - oldlogger->rewind(); - _mask_out_records(oldlogger, mask, value, newlogger); - - return newlogger; -} - -}; diff --git a/src/storage/phrase_index.h b/src/storage/phrase_index.h deleted file mode 100644 index 068a19e..0000000 --- a/src/storage/phrase_index.h +++ /dev/null @@ -1,839 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2006-2007 Peng Wu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef PHRASE_INDEX_H -#define PHRASE_INDEX_H - -#include <stdio.h> -#include <glib.h> -#include "novel_types.h" -#include "chewing_key.h" -#include "pinyin_parser2.h" -#include "pinyin_phrase2.h" -#include "memory_chunk.h" -#include "phrase_index_logger.h" - -/** - * Phrase Index File Format - * - * Indirect Index: Index by Token - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * + Phrase Offset + Phrase Offset + Phrase Offset + ...... + - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * Phrase Content: - * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * + Phrase Length + number of Pronunciations + Uni-gram Frequency+ - * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * + Phrase String(UCS4) + n Pronunciations with Frequency + - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - */ - -namespace zhuyin{ - -/* Store delta info by phrase index logger in user home directory. - */ - -const size_t phrase_item_header = sizeof(guint8) + sizeof(guint8) + sizeof(guint32); - -/** - * PhraseItem: - * - * The PhraseItem to access the items in phrase index. - * - */ -class PhraseItem{ - friend class SubPhraseIndex; - friend bool _compute_new_header(PhraseIndexLogger * logger, - phrase_token_t mask, - phrase_token_t value, - guint32 & new_total_freq); - -private: - MemoryChunk m_chunk; - bool set_n_pronunciation(guint8 n_prouns); -public: - /** - * PhraseItem::PhraseItem: - * - * The constructor of the PhraseItem. - * - */ - PhraseItem(){ - m_chunk.set_size(phrase_item_header); - memset(m_chunk.begin(), 0, m_chunk.size()); - } - -#if 0 - PhraseItem(MemoryChunk & chunk){ - m_chunk.set_content(0, chunk->begin(), chunk->size()); - assert ( m_chunk.size() >= phrase_item_header); - } -#endif - - /** - * PhraseItem::get_phrase_length: - * @returns: the length of this phrase item. - * - * Get the length of this phrase item. - * - */ - guint8 get_phrase_length(){ - char * buf_begin = (char *)m_chunk.begin(); - return (*(guint8 *)buf_begin); - } - - /** - * PhraseItem::get_n_pronunciation: - * @returns: the number of the pronunciations. - * - * Get the number of the pronunciations. - * - */ - guint8 get_n_pronunciation(){ - char * buf_begin = ( char *) m_chunk.begin(); - return (*(guint8 *)(buf_begin + sizeof(guint8))); - } - - /** - * PhraseItem::get_unigram_frequency: - * @returns: the uni-gram frequency of this phrase item. - * - * Get the uni-gram frequency of this phrase item. - * - */ - guint32 get_unigram_frequency(){ - char * buf_begin = (char *)m_chunk.begin(); - return (*(guint32 *)(buf_begin + sizeof(guint8) + sizeof(guint8))); - } - - /** - * PhraseItem::get_pronunciation_possibility: - * @options: the pinyin options. - * @keys: the pronunciation keys. - * @returns: the possibility of this phrase item pronounces the pinyin. - * - * Get the possibility of this phrase item pronounces the pinyin. - * - */ - gfloat get_pronunciation_possibility(pinyin_option_t options, - ChewingKey * keys){ - guint8 phrase_length = get_phrase_length(); - guint8 npron = get_n_pronunciation(); - size_t offset = phrase_item_header + phrase_length * sizeof (ucs4_t); - char * buf_begin = (char *)m_chunk.begin(); - guint32 matched = 0, total_freq =0; - for ( int i = 0 ; i < npron ; ++i){ - char * chewing_begin = buf_begin + offset + - i * (phrase_length * sizeof(ChewingKey) + sizeof(guint32)); - guint32 * freq = (guint32 *)(chewing_begin + - phrase_length * sizeof(ChewingKey)); - total_freq += *freq; - if ( 0 == pinyin_compare_with_ambiguities2 - (options, keys, - (ChewingKey *)chewing_begin,phrase_length) ){ - matched += *freq; - } - } - -#if 1 - /* an additional safe guard for chewing. */ - if ( 0 == total_freq ) - return 0; -#endif - - /* used preprocessor to avoid zero freq, in gen_chewing_table. */ - gfloat retval = matched / (gfloat) total_freq; - return retval; - } - - /** - * PhraseItem::increase_pronunciation_possibility: - * @options: the pinyin options. - * @keys: the pronunciation keys. - * @delta: the delta to be added to the pronunciation keys. - * - * Add the delta to the pronunciation of the pronunciation keys. - * - */ - void increase_pronunciation_possibility(pinyin_option_t options, - ChewingKey * keys, - gint32 delta); - - /** - * PhraseItem::get_phrase_string: - * @phrase: the ucs4 character buffer. - * @returns: whether the get operation is successful. - * - * Get the ucs4 characters of this phrase item. - * - */ - bool get_phrase_string(ucs4_t * phrase); - - /** - * PhraseItem::set_phrase_string: - * @phrase_length: the ucs4 character length of this phrase item. - * @phrase: the ucs4 character buffer. - * @returns: whether the set operation is successful. - * - * Set the length and ucs4 characters of this phrase item. - * - */ - bool set_phrase_string(guint8 phrase_length, ucs4_t * phrase); - - /** - * PhraseItem::get_nth_pronunciation: - * @index: the pronunciation index. - * @keys: the pronunciation keys. - * @freq: the frequency of the pronunciation. - * @returns: whether the get operation is successful. - * - * Get the nth pronunciation of this phrase item. - * - */ - bool get_nth_pronunciation(size_t index, - /* out */ ChewingKey * keys, - /* out */ guint32 & freq); - - /** - * PhraseItem::add_pronunciation: - * @keys: the pronunciation keys. - * @delta: the delta of the frequency of the pronunciation. - * @returns: whether the add operation is successful. - * - * Add one pronunciation. - * - */ - bool add_pronunciation(ChewingKey * keys, guint32 delta); - - /** - * PhraseItem::remove_nth_pronunciation: - * @index: the pronunciation index. - * - * Remove the nth pronunciation. - * - * Note: Normally don't change the first pronunciation, - * which decides the token number. - * - */ - void remove_nth_pronunciation(size_t index); - - bool operator == (const PhraseItem & rhs) const{ - if (m_chunk.size() != rhs.m_chunk.size()) - return false; - return memcmp(m_chunk.begin(), rhs.m_chunk.begin(), - m_chunk.size()) == 0; - } - - bool operator != (const PhraseItem & rhs) const{ - return ! (*this == rhs); - } -}; - -/* - * In Sub Phrase Index, token == (token & PHRASE_MASK). - */ - -/** - * SubPhraseIndex: - * - * The SubPhraseIndex class for internal usage. - * - */ -class SubPhraseIndex{ -private: - guint32 m_total_freq; - MemoryChunk m_phrase_index; - MemoryChunk m_phrase_content; - MemoryChunk * m_chunk; - - void reset(){ - m_total_freq = 0; - m_phrase_index.set_size(0); - m_phrase_content.set_size(0); - if ( m_chunk ){ - delete m_chunk; - m_chunk = NULL; - } - } - -public: - /** - * SubPhraseIndex::SubPhraseIndex: - * - * The constructor of the SubPhraseIndex. - * - */ - SubPhraseIndex():m_total_freq(0){ - m_chunk = NULL; - } - - /** - * SubPhraseIndex::~SubPhraseIndex: - * - * The destructor of the SubPhraseIndex. - * - */ - ~SubPhraseIndex(){ - reset(); - } - - /** - * SubPhraseIndex::load: - * @chunk: the memory chunk of the binary sub phrase index. - * @offset: the begin of binary data in the memory chunk. - * @end: the end of binary data in the memory chunk. - * @returns: whether the load operation is successful. - * - * Load the sub phrase index from the memory chunk. - * - */ - bool load(MemoryChunk * chunk, - table_offset_t offset, table_offset_t end); - - /** - * SubPhraseIndex::store: - * @new_chunk: the new memory chunk to store this sub phrase index. - * @offset: the begin of binary data in the memory chunk. - * @end: the end of stored binary data in the memory chunk. - * @returns: whether the store operation is successful. - * - * Store the sub phrase index to the new memory chunk. - * - */ - bool store(MemoryChunk * new_chunk, - table_offset_t offset, table_offset_t & end); - - /** - * SubPhraseIndex::diff: - * @oldone: the original content of sub phrase index. - * @logger: the delta information of user self-learning data. - * @returns: whether the diff operation is successful. - * - * Compare this sub phrase index with the original content of the system - * sub phrase index to generate the logger of difference. - * - * Note: Switch to logger format to reduce user space storage. - * - */ - bool diff(SubPhraseIndex * oldone, PhraseIndexLogger * logger); - - /** - * SubPhraseIndex::merge: - * @logger: the logger of difference in user home directory. - * @returns: whether the merge operation is successful. - * - * Merge the user logger of difference with this sub phrase index. - * - */ - bool merge(PhraseIndexLogger * logger); - - /** - * SubPhraseIndex::get_range: - * @range: the token range. - * @returns: whether the get operation is successful. - * - * Get the token range in this sub phrase index. - * - */ - int get_range(/* out */ PhraseIndexRange & range); - - /** - * SubPhraseIndex::get_phrase_index_total_freq: - * @returns: the total frequency of this sub phrase index. - * - * Get the total frequency of this sub phrase index. - * - * Note: maybe call it "Zero-gram". - * - */ - guint32 get_phrase_index_total_freq(); - - /** - * SubPhraseIndex::add_unigram_frequency: - * @token: the phrase token. - * @delta: the delta value of the phrase token. - * @returns: the status of the add operation. - * - * Add delta value to the phrase of the token. - * - * Note: this method is a fast path to add delta value. - * Maybe use the get_phrase_item method instead in future. - * - */ - int add_unigram_frequency(phrase_token_t token, guint32 delta); - - /** - * SubPhraseIndex::get_phrase_item: - * @token: the phrase token. - * @item: the phrase item of the token. - * @returns: the status of the get operation. - * - * Get the phrase item from this sub phrase index. - * - * Note:get_phrase_item function can't modify the phrase item size, - * but can increment the freq of the special pronunciation, - * or change the content without size increasing. - * - */ - int get_phrase_item(phrase_token_t token, PhraseItem & item); - - /** - * SubPhraseIndex::add_phrase_item: - * @token: the phrase token. - * @item: the phrase item of the token. - * @returns: the status of the add operation. - * - * Add the phrase item to this sub phrase index. - * - */ - int add_phrase_item(phrase_token_t token, PhraseItem * item); - - /** - * SubPhraseIndex::remove_phrase_item: - * @token: the phrase token. - * @item: the removed phrase item of the token. - * @returns: the status of the remove operation. - * - * Remove the phrase item of the token. - * - * Note: this remove_phrase_item method will substract the unigram - * frequency of the removed item from m_total_freq. - * - */ - int remove_phrase_item(phrase_token_t token, /* out */ PhraseItem * & item); - - /** - * SubPhraseIndex::mask_out: - * @mask: the mask. - * @value: the value. - * @returns: whether the mask out operation is successful. - * - * Mask out the matched phrase items. - * - */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - -/** - * FacadePhraseIndex: - * - * The facade class of phrase index. - * - */ -class FacadePhraseIndex{ -private: - guint32 m_total_freq; - SubPhraseIndex * m_sub_phrase_indices[PHRASE_INDEX_LIBRARY_COUNT]; -public: - /** - * FacadePhraseIndex::FacadePhraseIndex: - * - * The constructor of the FacadePhraseIndex. - * - */ - FacadePhraseIndex(){ - m_total_freq = 0; - memset(m_sub_phrase_indices, 0, sizeof(m_sub_phrase_indices)); - } - - /** - * FacadePhraseIndex::~FacadePhraseIndex: - * - * The destructor of the FacadePhraseIndex. - * - */ - ~FacadePhraseIndex(){ - for ( size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i){ - if ( m_sub_phrase_indices[i] ){ - delete m_sub_phrase_indices[i]; - m_sub_phrase_indices[i] = NULL; - } - } - } - - /** - * FacadePhraseIndex::load_text: - * @phrase_index: the index of sub phrase index to be loaded. - * @infile: the textual format file of the phrase table. - * @returns: whether the load operation is successful. - * - * Load one sub phrase index from the textual format file. - * Note: load sub phrase index according to the config in future. - * - */ - bool load_text(guint8 phrase_index, FILE * infile); - - /** - * FacadePhraseIndex::load: - * @phrase_index: the index of sub phrase index to be loaded. - * @chunk: the memory chunk of sub phrase index to be loaded. - * @returns: whether the load operation is successful. - * - * Load one sub phrase index from the memory chunk. - * - */ - bool load(guint8 phrase_index, MemoryChunk * chunk); - - /** - * FacadePhraseIndex::store: - * @phrase_index: the index of sub phrase index to be stored. - * @new_chunk: the memory chunk of sub phrase index to be stored. - * @returns: whether the store operation is successful. - * - * Store one sub phrase index to the memory chunk. - * - */ - bool store(guint8 phrase_index, MemoryChunk * new_chunk); - - /** - * FacadePhraseIndex::unload: - * @phrase_index: the index of sub phrase index to be unloaded. - * @returns: whether the unload operation is successful. - * - * Unload one sub phrase index. - * - */ - bool unload(guint8 phrase_index); - - - /** - * FacadePhraseIndex::diff: - * @phrase_index: the index of sub phrase index to be differed. - * @oldchunk: the original content of sub phrase index. - * @newlog: the delta information of user self-learning data. - * @returns: whether the diff operation is successful. - * - * Store user delta information in the logger format. - * - * Note: the ownership of oldchunk is transfered here. - * - */ - bool diff(guint8 phrase_index, MemoryChunk * oldchunk, - MemoryChunk * newlog); - - /** - * FacadePhraseIndex::merge: - * @phrase_index: the index of sub phrase index to be merged. - * @log: the logger of difference in user home directory. - * @returns: whether the merge operation is successful. - * - * Merge the user logger of difference with the sub phrase index. - * - * Note: the ownership of log is transfered here. - * - */ - bool merge(guint8 phrase_index, MemoryChunk * log); - - /** - * FacadePhraseIndex::merge_with_mask: - * @phrase_index: the index of sub phrase index to be merged. - * @log: the logger of difference in user home directory. - * @mask: the mask. - * @value: the value. - * @returns: whether the merge operation is successful. - * - * Merge the user logger of difference with mask operation. - * - * Note: the ownership of log is transfered here. - * - */ - bool merge_with_mask(guint8 phrase_index, MemoryChunk * log, - phrase_token_t mask, phrase_token_t value); - - /** - * FacadePhraseIndex::compact: - * @returns: whether the compact operation is successful. - * - * Compat all sub phrase index memory usage. - * - */ - bool compact(); - - /** - * FacadePhraseIndex::mask_out: - * @phrase_index: the index of sub phrase index. - * @mask: the mask. - * @value: the value. - * @returns: whether the mask out operation is successful. - * - * Mask out the matched phrase items. - * - * Note: should call compact() after the mask out operation. - * - */ - bool mask_out(guint8 phrase_index, - phrase_token_t mask, phrase_token_t value); - - /** - * FacadePhraseIndex::get_sub_phrase_range: - * @min_index: the minimal sub phrase index. - * @max_index: the maximal sub phrase index. - * @returns: the status of the get operation. - * - * Get the minimum and maximum of the sub phrase index. - * - */ - int get_sub_phrase_range(guint8 & min_index, guint8 & max_index); - - /** - * FacadePhraseIndex::get_range: - * @phrase_index: the index of sub phrase index. - * @range: the token range of the sub phrase index. - * @returns: the status of the get operation. - * - * Get the token range of the sub phrase index. - * - */ - int get_range(guint8 phrase_index, /* out */ PhraseIndexRange & range); - - /** - * FacadePhraseIndex::get_phrase_index_total_freq: - * @returns: the total freq of the facade phrase index. - * - * Get the total freq of the facade phrase index. - * - * Note: maybe call it "Zero-gram". - * - */ - guint32 get_phrase_index_total_freq(){ - return m_total_freq; - } - - /** - * FacadePhraseIndex::add_unigram_frequency: - * @token: the phrase token. - * @delta: the delta value of the phrase token. - * @returns: the status of the add operation. - * - * Add delta value to the phrase of the token. - * - */ - int add_unigram_frequency(phrase_token_t token, guint32 delta){ - guint8 index = PHRASE_INDEX_LIBRARY_INDEX(token); - SubPhraseIndex * sub_phrase = m_sub_phrase_indices[index]; - if ( !sub_phrase ) - return ERROR_NO_SUB_PHRASE_INDEX; - m_total_freq += delta; - return sub_phrase->add_unigram_frequency(token, delta); - } - - /** - * FacadePhraseIndex::get_phrase_item: - * @token: the phrase token. - * @item: the phrase item of the token. - * @returns: the status of the get operation. - * - * Get the phrase item from the facade phrase index. - * - */ - int get_phrase_item(phrase_token_t token, PhraseItem & item){ - guint8 index = PHRASE_INDEX_LIBRARY_INDEX(token); - SubPhraseIndex * sub_phrase = m_sub_phrase_indices[index]; - if ( !sub_phrase ) - return ERROR_NO_SUB_PHRASE_INDEX; - return sub_phrase->get_phrase_item(token, item); - } - - /** - * FacadePhraseIndex::add_phrase_item: - * @token: the phrase token. - * @item: the phrase item of the token. - * @returns: the status of the add operation. - * - * Add the phrase item to the facade phrase index. - * - */ - int add_phrase_item(phrase_token_t token, PhraseItem * item){ - guint8 index = PHRASE_INDEX_LIBRARY_INDEX(token); - SubPhraseIndex * & sub_phrase = m_sub_phrase_indices[index]; - if ( !sub_phrase ){ - sub_phrase = new SubPhraseIndex; - } - m_total_freq += item->get_unigram_frequency(); - return sub_phrase->add_phrase_item(token, item); - } - - /** - * FacadePhraseIndex::remove_phrase_item: - * @token: the phrase token. - * @item: the removed phrase item of the token. - * @returns: the status of the remove operation. - * - * Remove the phrase item of the token. - * - */ - int remove_phrase_item(phrase_token_t token, PhraseItem * & item){ - guint8 index = PHRASE_INDEX_LIBRARY_INDEX(token); - SubPhraseIndex * & sub_phrase = m_sub_phrase_indices[index]; - if ( !sub_phrase ){ - return ERROR_NO_SUB_PHRASE_INDEX; - } - int result = sub_phrase->remove_phrase_item(token, item); - if ( result ) - return result; - m_total_freq -= item->get_unigram_frequency(); - return result; - } - - /** - * FacadePhraseIndex::prepare_ranges: - * @ranges: the ranges to be prepared. - * @returns: whether the prepare operation is successful. - * - * Prepare the ranges. - * - */ - bool prepare_ranges(PhraseIndexRanges ranges) { - /* assume memset(ranges, 0, sizeof(ranges)); */ - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - GArray * & range = ranges[i]; - assert(NULL == range); - - SubPhraseIndex * sub_phrase = m_sub_phrase_indices[i]; - if (sub_phrase) { - range = g_array_new(FALSE, FALSE, sizeof(PhraseIndexRange)); - } - } - return true; - } - - /** - * FacadePhraseIndex::clear_ranges: - * @ranges: the ranges to be cleared. - * @returns: whether the clear operation is successful. - * - * Clear the ranges. - * - */ - bool clear_ranges(PhraseIndexRanges ranges) { - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - GArray * range = ranges[i]; - if (range) { - g_array_set_size(range, 0); - } - } - return true; - } - - /** - * FacadePhraseIndex::destroy_ranges: - * @ranges: the ranges to be destroyed. - * @returns: whether the destroy operation is successful. - * - * Destroy the ranges. - * - */ - bool destroy_ranges(PhraseIndexRanges ranges) { - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - GArray * & range = ranges[i]; - if (range) { - g_array_free(range, TRUE); - range = NULL; - } - } - return true; - } - - /** - * FacadePhraseIndex::prepare_tokens: - * @tokens: the tokens to be prepared. - * @returns: whether the prepare operation is successful. - * - * Prepare the tokens. - * - */ - bool prepare_tokens(PhraseTokens tokens) { - /* assume memset(tokens, 0, sizeof(tokens)); */ - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - GArray * & token = tokens[i]; - assert(NULL == token); - - SubPhraseIndex * sub_phrase = m_sub_phrase_indices[i]; - if (sub_phrase) { - token = g_array_new(FALSE, FALSE, sizeof(phrase_token_t)); - } - } - return true; - } - - /** - * FacadePhraseIndex::clear_tokens: - * @tokens: the tokens to be cleared. - * @return: whether the clear operation is successful. - * - * Clear the tokens. - * - */ - bool clear_tokens(PhraseTokens tokens) { - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - GArray * token = tokens[i]; - if (token) { - g_array_set_size(token, 0); - } - } - return true; - } - - /** - * FacadePhraseIndex::destroy_tokens: - * @tokens: the tokens to be destroyed. - * @returns: whether the destroy operation is successful. - * - * Destroy the tokens. - * - */ - bool destroy_tokens(PhraseTokens tokens) { - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - GArray * & token = tokens[i]; - if (token) { - g_array_free(token, TRUE); - token = NULL; - } - } - return true; - } - - /** - * FacadePhraseIndex::create_sub_phrase: - * @index: the phrase index to be created. - * @returns: the result of the create operation. - * - * Create the sub phrase index. - * - */ - int create_sub_phrase(guint8 index) { - SubPhraseIndex * & sub_phrase = m_sub_phrase_indices[index]; - if (sub_phrase) { - return ERROR_ALREADY_EXISTS; - } - - sub_phrase = new SubPhraseIndex; - - return ERROR_OK; - } -}; - -PhraseIndexLogger * mask_out_phrase_index_logger -(PhraseIndexLogger * oldlogger, phrase_token_t mask, phrase_token_t value); - -}; - -#endif diff --git a/src/storage/phrase_index_logger.h b/src/storage/phrase_index_logger.h deleted file mode 100644 index 5319685..0000000 --- a/src/storage/phrase_index_logger.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - - -#ifndef PHRASE_LOGGER_H -#define PHRASE_LOGGER_H - -#include <assert.h> -#include "novel_types.h" -#include "memory_chunk.h" - -/** - * File Format - * Logger Record type: add/remove/modify - * - * Modify Header: header/null token/len/old data chunk/new data chunk - * - * Add Record: add/token/len/data chunk - * Remove Record: remove/token/len/data chunk - * Modify Record: modify/token/old len/new len/old data chunk/new data chunk - * - */ - -namespace zhuyin{ - -enum LOG_TYPE{ - LOG_ADD_RECORD = 1, - LOG_REMOVE_RECORD, - LOG_MODIFY_RECORD, - LOG_MODIFY_HEADER -}; - - -/** - * PhraseIndexLogger: - * - * The logger of phrase index changes. - * - */ -class PhraseIndexLogger{ -protected: - MemoryChunk * m_chunk; - size_t m_offset; - bool m_error; - - void reset(){ - if ( m_chunk ){ - delete m_chunk; - m_chunk = NULL; - } - m_offset = 0; - m_error = false; - } -public: - /** - * PhraseIndexLogger::PhraseIndexLogger: - * - * The constructor of the PhraseIndexLogger. - * - */ - PhraseIndexLogger():m_offset(0), m_error(false){ - m_chunk = new MemoryChunk; - } - - /** - * PhraseIndexLogger::~PhraseIndexLogger: - * - * The destructor of the PhraseIndexLogger. - * - */ - ~PhraseIndexLogger(){ - reset(); - } - - /** - * PhraseIndexLogger::load: - * @chunk: the memory chunk of the logs. - * @returns: whether the load operation is successful. - * - * Load the logs from the memory chunk. - * - */ - bool load(MemoryChunk * chunk) { - reset(); - m_chunk = chunk; - return true; - } - - /** - * PhraseIndexLogger::store: - * @new_chunk: the new memory chunk to store the logs. - * @returns: whether the store operation is successful. - * - * Store the logs to the new memory chunk. - * - */ - bool store(MemoryChunk * new_chunk){ - new_chunk->set_content(0, m_chunk->begin(), m_chunk->size()); - return true; - } - - /** - * PhraseIndexLogger::has_next_record: - * @returns: whether this logger has next record. - * - * Whether this logger has next record. - * - */ - bool has_next_record(){ - if (m_error) - return false; - - return m_offset < m_chunk->size(); - } - - /** - * PhraseIndexLogger::rewind: - * @returns: whether the rewind operation is successful. - * - * Rewind this logger to the begin of logs. - * - */ - bool rewind(){ - m_offset = 0; - return true; - } - - /** - * PhraseIndexLogger::next_record: - * @log_type: the type of this log record. - * @token: the token of this log record. - * @oldone: the original content of the phrase item. - * @newone: the new content of the phrase item. - * - * Read the next log record. - * - * Prolog: has_next_record() returned true. - * - */ - bool next_record(LOG_TYPE & log_type, phrase_token_t & token, - MemoryChunk * oldone, MemoryChunk * newone){ - size_t offset = m_offset; - m_chunk->get_content(offset, &log_type, sizeof(LOG_TYPE)); - offset += sizeof(LOG_TYPE); - m_chunk->get_content(offset, &token, sizeof(phrase_token_t)); - offset += sizeof(phrase_token_t); - - oldone->set_size(0); newone->set_size(0); - - switch(log_type){ - case LOG_ADD_RECORD:{ - guint16 len = 0; - m_chunk->get_content(offset, &len, sizeof(guint16)); - offset += sizeof(guint16); - newone->set_content(0, ((char *)m_chunk->begin()) + offset, len); - offset += len; - break; - } - case LOG_REMOVE_RECORD:{ - guint16 len = 0; - m_chunk->get_content(offset, &len, sizeof(guint16)); - offset += sizeof(guint16); - oldone->set_content(0, ((char *)m_chunk->begin()) + offset, len); - offset += len; - break; - } - case LOG_MODIFY_RECORD:{ - guint16 oldlen = 0, newlen = 0; - m_chunk->get_content(offset, &oldlen, sizeof(guint16)); - offset += sizeof(guint16); - m_chunk->get_content(offset, &newlen, sizeof(guint16)); - offset += sizeof(guint16); - oldone->set_content(0, ((char *)m_chunk->begin()) + offset, - oldlen); - offset += oldlen; - newone->set_content(0, ((char *)m_chunk->begin()) + offset, newlen); - offset += newlen; - break; - } - case LOG_MODIFY_HEADER:{ - assert(token == null_token); - guint16 len = 0; - m_chunk->get_content(offset, &len, sizeof(guint16)); - offset += sizeof(guint16); - oldone->set_content(0, ((char *)m_chunk->begin()) + offset, - len); - offset += len; - newone->set_content(0, ((char *)m_chunk->begin()) + offset, - len); - offset += len; - break; - } - default: - m_error = true; - return false; - } - - m_offset = offset; - return true; - } - - /** - * PhraseIndexLogger::append_record: - * @log_type: the type of this log record. - * @token: the token of this log record. - * @oldone: the original content of the phrase item. - * @newone: the new content of the phrase item. - * - * Append one log record to the logger. - * - */ - bool append_record(LOG_TYPE log_type, phrase_token_t token, - MemoryChunk * oldone, MemoryChunk * newone){ - - MemoryChunk chunk; - size_t offset = 0; - chunk.set_content(offset, &log_type, sizeof(LOG_TYPE)); - offset += sizeof(LOG_TYPE); - chunk.set_content(offset, &token, sizeof(phrase_token_t)); - offset += sizeof(phrase_token_t); - - switch(log_type){ - case LOG_ADD_RECORD:{ - assert( NULL == oldone ); - assert( NULL != newone ); - /* use newone chunk */ - guint16 len = newone->size(); - chunk.set_content(offset, &len, sizeof(guint16)); - offset += sizeof(guint16); - chunk.set_content(offset, newone->begin(), newone->size()); - offset += newone->size(); - break; - } - case LOG_REMOVE_RECORD:{ - assert(NULL != oldone); - assert(NULL == newone); - /* use oldone chunk */ - guint16 len = oldone->size(); - chunk.set_content(offset, &len, sizeof(guint16)); - offset += sizeof(guint16); - chunk.set_content(offset, oldone->begin(), oldone->size()); - offset += oldone->size(); - break; - } - case LOG_MODIFY_RECORD:{ - assert(NULL != oldone); - assert(NULL != newone); - guint16 oldlen = oldone->size(); - guint16 newlen = newone->size(); - chunk.set_content(offset, &oldlen, sizeof(guint16)); - offset += sizeof(guint16); - chunk.set_content(offset, &newlen, sizeof(guint16)); - offset += sizeof(guint16); - chunk.set_content(offset, oldone->begin(), oldone->size()); - offset += oldlen; - chunk.set_content(offset, newone->begin(), newone->size()); - offset += newlen; - break; - } - case LOG_MODIFY_HEADER:{ - assert(NULL != oldone); - assert(NULL != newone); - assert(null_token == token); - guint16 oldlen = oldone->size(); - guint16 newlen = newone->size(); - assert(oldlen == newlen); - chunk.set_content(offset, &oldlen, sizeof(guint16)); - offset += sizeof(guint16); - chunk.set_content(offset, oldone->begin(), oldone->size()); - offset += oldlen; - chunk.set_content(offset, newone->begin(), newone->size()); - offset += newlen; - break; - } - default: - assert(false); - } - - /* store log record. */ - m_chunk->set_content(m_chunk->size(), chunk.begin(), chunk.size()); - return true; - } -}; - -}; - -#endif diff --git a/src/storage/phrase_large_table2.cpp b/src/storage/phrase_large_table2.cpp deleted file mode 100644 index 8c2a923..0000000 --- a/src/storage/phrase_large_table2.cpp +++ /dev/null @@ -1,809 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2012 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include <assert.h> -#include <string.h> -#include "phrase_large_table2.h" - - -/* class definition */ - -namespace zhuyin{ - -class PhraseLengthIndexLevel2{ -protected: - GArray * m_phrase_array_indexes; -public: - PhraseLengthIndexLevel2(); - ~PhraseLengthIndexLevel2(); - - /* load/store method */ - bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end); - bool store(MemoryChunk * new_chunk, table_offset_t offset, table_offset_t & end); - - /* search method */ - int search(int phrase_length, /* in */ const ucs4_t phrase[], - /* out */ PhraseTokens tokens) const; - - /* add_index/remove_index method */ - int add_index(int phrase_length, /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token); - int remove_index(int phrase_length, /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token); - - /* get length method */ - int get_length() const; - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - - -template<size_t phrase_length> -struct PhraseIndexItem2{ - phrase_token_t m_token; - ucs4_t m_phrase[phrase_length]; -public: - PhraseIndexItem2<phrase_length>(const ucs4_t phrase[], phrase_token_t token){ - memmove(m_phrase, phrase, sizeof(ucs4_t) * phrase_length); - m_token = token; - } -}; - - -template<size_t phrase_length> -class PhraseArrayIndexLevel2{ -protected: - typedef PhraseIndexItem2<phrase_length> IndexItem; - -protected: - MemoryChunk m_chunk; -public: - bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end); - bool store(MemoryChunk * new_chunk, table_offset_t offset, table_offset_t & end); - - /* search method */ - int search(/* in */ const ucs4_t phrase[], /* out */ PhraseTokens tokens) const; - - /* add_index/remove_index method */ - int add_index(/* in */ const ucs4_t phrase[], /* in */ phrase_token_t token); - int remove_index(/* in */ const ucs4_t phrase[], /* in */ phrase_token_t token); - - /* get length method */ - int get_length() const; - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - -}; - -using namespace zhuyin; - -/* class implementation */ - -template<size_t phrase_length> -static int phrase_compare2(const PhraseIndexItem2<phrase_length> &lhs, - const PhraseIndexItem2<phrase_length> &rhs){ - ucs4_t * phrase_lhs = (ucs4_t *) lhs.m_phrase; - ucs4_t * phrase_rhs = (ucs4_t *) rhs.m_phrase; - - return memcmp(phrase_lhs, phrase_rhs, sizeof(ucs4_t) * phrase_length); -} - -template<size_t phrase_length> -static bool phrase_less_than2(const PhraseIndexItem2<phrase_length> & lhs, - const PhraseIndexItem2<phrase_length> & rhs){ - return 0 > phrase_compare2(lhs, rhs); -} - -PhraseBitmapIndexLevel2::PhraseBitmapIndexLevel2(){ - memset(m_phrase_length_indexes, 0, sizeof(m_phrase_length_indexes)); -} - -void PhraseBitmapIndexLevel2::reset(){ - for ( size_t i = 0; i < PHRASE_NUMBER_OF_BITMAP_INDEX; i++){ - PhraseLengthIndexLevel2 * & length_array = - m_phrase_length_indexes[i]; - if ( length_array ) - delete length_array; - length_array = NULL; - } -} - - -/* search method */ - -int PhraseBitmapIndexLevel2::search(int phrase_length, - /* in */ const ucs4_t phrase[], - /* out */ PhraseTokens tokens) const { - assert(phrase_length > 0); - - int result = SEARCH_NONE; - /* use the first 8-bit of the lower 16-bit for bitmap index, - * as most the higher 16-bit are zero. - */ - guint8 first_key = (phrase[0] & 0xFF00) >> 8; - - PhraseLengthIndexLevel2 * phrase_array = m_phrase_length_indexes[first_key]; - if ( phrase_array ) - return phrase_array->search(phrase_length, phrase, tokens); - return result; -} - -PhraseLengthIndexLevel2::PhraseLengthIndexLevel2(){ - m_phrase_array_indexes = g_array_new(FALSE, TRUE, sizeof(void *)); -} - -PhraseLengthIndexLevel2::~PhraseLengthIndexLevel2(){ -#define CASE(len) case len: \ - { \ - PhraseArrayIndexLevel2<len> * & array = g_array_index \ - (m_phrase_array_indexes, \ - PhraseArrayIndexLevel2<len> *, len - 1); \ - if ( array ) { \ - delete array; \ - array = NULL; \ - } \ - break; \ - } - - for (size_t i = 1; i <= m_phrase_array_indexes->len; ++i){ - switch (i){ - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - CASE(16); - default: - assert(false); - } - } - g_array_free(m_phrase_array_indexes, TRUE); -#undef CASE -} - -int PhraseLengthIndexLevel2::search(int phrase_length, - /* in */ const ucs4_t phrase[], - /* out */ PhraseTokens tokens) const { - int result = SEARCH_NONE; - if(m_phrase_array_indexes->len < phrase_length) - return result; - if (m_phrase_array_indexes->len > phrase_length) - result |= SEARCH_CONTINUED; - -#define CASE(len) case len: \ - { \ - PhraseArrayIndexLevel2<len> * array = g_array_index \ - (m_phrase_array_indexes, PhraseArrayIndexLevel2<len> *, len - 1); \ - if ( !array ) \ - return result; \ - result |= array->search(phrase, tokens); \ - return result; \ - } - - switch ( phrase_length ){ - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - CASE(16); - default: - assert(false); - } -#undef CASE -} - -template<size_t phrase_length> -int PhraseArrayIndexLevel2<phrase_length>::search -(/* in */ const ucs4_t phrase[], /* out */ PhraseTokens tokens) const { - int result = SEARCH_NONE; - - IndexItem * chunk_begin = NULL, * chunk_end = NULL; - chunk_begin = (IndexItem *) m_chunk.begin(); - chunk_end = (IndexItem *) m_chunk.end(); - - /* do the search */ - IndexItem search_elem(phrase, -1); - std_lite::pair<IndexItem *, IndexItem *> range; - range = std_lite::equal_range - (chunk_begin, chunk_end, search_elem, - phrase_less_than2<phrase_length>); - - const IndexItem * const begin = range.first; - const IndexItem * const end = range.second; - if (begin == end) - return result; - - const IndexItem * iter = NULL; - GArray * array = NULL; - - for (iter = begin; iter != end; ++iter) { - phrase_token_t token = iter->m_token; - - /* filter out disabled sub phrase indices. */ - array = tokens[PHRASE_INDEX_LIBRARY_INDEX(token)]; - if (NULL == array) - continue; - - result |= SEARCH_OK; - - g_array_append_val(array, token); - } - - return result; -} - - -/* add/remove index method */ - -int PhraseBitmapIndexLevel2::add_index(int phrase_length, - /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token){ - guint8 first_key = (phrase[0] & 0xFF00) >> 8; - - PhraseLengthIndexLevel2 * & length_array = - m_phrase_length_indexes[first_key]; - - if ( !length_array ){ - length_array = new PhraseLengthIndexLevel2(); - } - return length_array->add_index(phrase_length, phrase, token); -} - -int PhraseBitmapIndexLevel2::remove_index(int phrase_length, - /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token){ - guint8 first_key = (phrase[0] & 0xFF00) >> 8; - - PhraseLengthIndexLevel2 * & length_array = - m_phrase_length_indexes[first_key]; - - if (NULL == length_array) - return ERROR_REMOVE_ITEM_DONOT_EXISTS; - - int retval = length_array->remove_index(phrase_length, phrase, token); - - /* remove empty array. */ - if (0 == length_array->get_length()) { - delete length_array; - length_array = NULL; - } - - return retval; -} - -int PhraseLengthIndexLevel2::add_index(int phrase_length, - /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token) { - if (phrase_length >= MAX_PHRASE_LENGTH) - return ERROR_PHRASE_TOO_LONG; - - if (m_phrase_array_indexes->len < phrase_length) - g_array_set_size(m_phrase_array_indexes, phrase_length); - -#define CASE(len) case len: \ - { \ - PhraseArrayIndexLevel2<len> * & array = g_array_index \ - (m_phrase_array_indexes, PhraseArrayIndexLevel2<len> *, len - 1); \ - if ( !array ) \ - array = new PhraseArrayIndexLevel2<len>; \ - return array->add_index(phrase, token); \ - } - - switch(phrase_length){ - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - CASE(16); - default: - assert(false); - } - -#undef CASE -} - -int PhraseLengthIndexLevel2::remove_index(int phrase_length, - /* in */ const ucs4_t phrase[], - /* in */ phrase_token_t token) { - if (phrase_length >= MAX_PHRASE_LENGTH) - return ERROR_PHRASE_TOO_LONG; - - if (m_phrase_array_indexes->len < phrase_length) - return ERROR_REMOVE_ITEM_DONOT_EXISTS; - -#define CASE(len) case len: \ - { \ - PhraseArrayIndexLevel2<len> * & array = g_array_index \ - (m_phrase_array_indexes, \ - PhraseArrayIndexLevel2<len> *, len - 1); \ - if (NULL == array) \ - return ERROR_REMOVE_ITEM_DONOT_EXISTS; \ - int retval = array->remove_index(phrase, token); \ - \ - /* remove empty array. */ \ - if (0 == array->get_length()) { \ - delete array; \ - array = NULL; \ - \ - /* shrink self array. */ \ - g_array_set_size(m_phrase_array_indexes, \ - get_length()); \ - } \ - return retval; \ - } - - switch(phrase_length){ - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - CASE(16); - default: - assert(false); - } -#undef CASE -} - -template<size_t phrase_length> -int PhraseArrayIndexLevel2<phrase_length>::add_index -(/* in */ const ucs4_t phrase[], /* in */ phrase_token_t token){ - IndexItem * begin, * end; - - IndexItem add_elem(phrase, token); - begin = (IndexItem *) m_chunk.begin(); - end = (IndexItem *) m_chunk.end(); - - std_lite::pair<IndexItem *, IndexItem *> range; - range = std_lite::equal_range - (begin, end, add_elem, phrase_less_than2<phrase_length>); - - IndexItem * cur_elem; - for (cur_elem = range.first; - cur_elem != range.second; ++cur_elem) { - if (cur_elem->m_token == token) - return ERROR_INSERT_ITEM_EXISTS; - if (cur_elem->m_token > token) - break; - } - - int offset = (cur_elem - begin) * sizeof(IndexItem); - m_chunk.insert_content(offset, &add_elem, sizeof(IndexItem)); - return ERROR_OK; -} - -template<size_t phrase_length> -int PhraseArrayIndexLevel2<phrase_length>::remove_index -(/* in */ const ucs4_t phrase[], /* in */ phrase_token_t token) { - IndexItem * begin, * end; - - IndexItem remove_elem(phrase, token); - begin = (IndexItem *) m_chunk.begin(); - end = (IndexItem *) m_chunk.end(); - - std_lite::pair<IndexItem *, IndexItem *> range; - range = std_lite::equal_range - (begin, end, remove_elem, phrase_less_than2<phrase_length>); - - IndexItem * cur_elem; - for (cur_elem = range.first; - cur_elem != range.second; ++cur_elem) { - if (cur_elem->m_token == token) - break; - } - - if (cur_elem == range.second) - return ERROR_REMOVE_ITEM_DONOT_EXISTS; - - int offset = (cur_elem - begin) * sizeof(IndexItem); - m_chunk.remove_content(offset, sizeof(IndexItem)); - return ERROR_OK; -} - - -/* load text method */ - -bool PhraseLargeTable2::load_text(FILE * infile){ - char pinyin[256]; - char phrase[256]; - phrase_token_t token; - size_t freq; - - while (!feof(infile)) { - int num = fscanf(infile, "%256s %256s %u %ld", - pinyin, phrase, &token, &freq); - - if (4 != num) - continue; - - if (feof(infile)) - break; - - glong phrase_len = g_utf8_strlen(phrase, -1); - ucs4_t * new_phrase = g_utf8_to_ucs4(phrase, -1, NULL, NULL, NULL); - add_index(phrase_len, new_phrase, token); - - g_free(new_phrase); - } - return true; -} - - -/* load/store method */ - -bool PhraseBitmapIndexLevel2::load(MemoryChunk * chunk, - table_offset_t offset, - table_offset_t end){ - reset(); - char * buf_begin = (char *) chunk->begin(); - table_offset_t phrase_begin, phrase_end; - table_offset_t * index = (table_offset_t *) (buf_begin + offset); - phrase_end = *index; - - for ( size_t i = 0; i < PHRASE_NUMBER_OF_BITMAP_INDEX; ++i) { - phrase_begin = phrase_end; - index++; - phrase_end = *index; - if ( phrase_begin == phrase_end ) //null pointer - continue; - - /* after reset() all phrases are null pointer. */ - PhraseLengthIndexLevel2 * phrases = new PhraseLengthIndexLevel2; - m_phrase_length_indexes[i] = phrases; - - phrases->load(chunk, phrase_begin, phrase_end - 1); - assert( phrase_end <= end ); - assert( *(buf_begin + phrase_end - 1) == c_separate); - } - offset += (PHRASE_NUMBER_OF_BITMAP_INDEX + 1) * sizeof(table_offset_t); - assert( c_separate == *(buf_begin + offset) ); - return true; -} - -bool PhraseBitmapIndexLevel2::store(MemoryChunk * new_chunk, - table_offset_t offset, - table_offset_t & end){ - table_offset_t phrase_end; - table_offset_t index = offset; - offset += (PHRASE_NUMBER_OF_BITMAP_INDEX + 1) * sizeof(table_offset_t); - //add '#' - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset +=sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - for ( size_t i = 0; i < PHRASE_NUMBER_OF_BITMAP_INDEX; ++i) { - PhraseLengthIndexLevel2 * phrases = m_phrase_length_indexes[i]; - if ( !phrases ) { //null pointer - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - continue; - } - phrases->store(new_chunk, offset, phrase_end); //has a end '#' - offset = phrase_end; - //add '#' - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - } - end = offset; - return true; -} - -bool PhraseLengthIndexLevel2::load(MemoryChunk * chunk, - table_offset_t offset, - table_offset_t end) { - char * buf_begin = (char *) chunk->begin(); - guint32 nindex = *((guint32 *)(buf_begin + offset)); - table_offset_t * index = (table_offset_t *) - (buf_begin + offset + sizeof(guint32)); - - table_offset_t phrase_begin, phrase_end = *index; - g_array_set_size(m_phrase_array_indexes, 0); - for (size_t i = 1; i <= nindex; ++i) { - phrase_begin = phrase_end; - index++; - phrase_end = *index; - if ( phrase_begin == phrase_end ){ - void * null = NULL; - g_array_append_val(m_phrase_array_indexes, null); - continue; - } - -#define CASE(len) case len: \ - { \ - PhraseArrayIndexLevel2<len> * phrase = \ - new PhraseArrayIndexLevel2<len>; \ - phrase->load(chunk, phrase_begin, phrase_end - 1); \ - assert( *(buf_begin + phrase_end - 1) == c_separate ); \ - assert( phrase_end <= end ); \ - g_array_append_val(m_phrase_array_indexes, phrase); \ - break; \ - } - switch ( i ){ - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - CASE(16); - default: - assert(false); - } -#undef CASE - } - offset += sizeof(guint32) + (nindex + 1) * sizeof(table_offset_t); - assert ( c_separate == * (buf_begin + offset) ); - return true; -} - -bool PhraseLengthIndexLevel2::store(MemoryChunk * new_chunk, - table_offset_t offset, - table_offset_t & end) { - guint32 nindex = m_phrase_array_indexes->len; - new_chunk->set_content(offset, &nindex, sizeof(guint32)); - table_offset_t index = offset + sizeof(guint32); - - offset += sizeof(guint32) + (nindex + 1) * sizeof(table_offset_t); - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - - table_offset_t phrase_end; - for (size_t i = 1; i <= m_phrase_array_indexes->len; ++i) { -#define CASE(len) case len: \ - { \ - PhraseArrayIndexLevel2<len> * phrase = g_array_index \ - (m_phrase_array_indexes, PhraseArrayIndexLevel2<len> *, len - 1); \ - if ( !phrase ){ \ - new_chunk->set_content \ - (index, &offset, sizeof(table_offset_t)); \ - index += sizeof(table_offset_t); \ - continue; \ - } \ - phrase->store(new_chunk, offset, phrase_end); \ - offset = phrase_end; \ - break; \ - } - switch ( i ){ - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - CASE(16); - default: - assert(false); - } - //add '#' - new_chunk->set_content(offset, &c_separate, sizeof(char)); - offset += sizeof(char); - new_chunk->set_content(index, &offset, sizeof(table_offset_t)); - index += sizeof(table_offset_t); - -#undef CASE - } - end = offset; - return true; -} - -template<size_t phrase_length> -bool PhraseArrayIndexLevel2<phrase_length>:: -load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end){ - char * buf_begin = (char *) chunk->begin(); - m_chunk.set_chunk(buf_begin + offset, end - offset, NULL); - return true; -} - -template<size_t phrase_length> -bool PhraseArrayIndexLevel2<phrase_length>:: -store(MemoryChunk * new_chunk, table_offset_t offset, table_offset_t & end) { - new_chunk->set_content(offset, m_chunk.begin(), m_chunk.size()); - end = offset + m_chunk.size(); - return true; -} - - -/* get length method */ - -int PhraseLengthIndexLevel2::get_length() const { - int length = m_phrase_array_indexes->len; - - /* trim trailing zero. */ - for (int i = length - 1; i >= 0; --i) { - void * array = g_array_index(m_phrase_array_indexes, void *, i); - - if (NULL != array) - break; - - --length; - } - - return length; -} - -template<size_t phrase_length> -int PhraseArrayIndexLevel2<phrase_length>::get_length() const { - IndexItem * chunk_begin = NULL, * chunk_end = NULL; - chunk_begin = (IndexItem *) m_chunk.begin(); - chunk_end = (IndexItem *) m_chunk.end(); - - return chunk_end - chunk_begin; -} - - -/* mask out method */ - -bool PhraseBitmapIndexLevel2::mask_out(phrase_token_t mask, - phrase_token_t value){ - for (size_t i = 0; i < PHRASE_NUMBER_OF_BITMAP_INDEX; ++i) { - PhraseLengthIndexLevel2 * & length_array = - m_phrase_length_indexes[i]; - - if (NULL == length_array) - continue; - - length_array->mask_out(mask, value); - - if (0 == length_array->get_length()) { - delete length_array; - length_array = NULL; - } - } - - return true; -} - -bool PhraseLengthIndexLevel2::mask_out(phrase_token_t mask, - phrase_token_t value){ -#define CASE(len) case len: \ - { \ - PhraseArrayIndexLevel2<len> * & array = g_array_index \ - (m_phrase_array_indexes, \ - PhraseArrayIndexLevel2<len> *, len - 1); \ - \ - if (NULL == array) \ - continue; \ - \ - array->mask_out(mask, value); \ - \ - if (0 == array->get_length()) { \ - delete array; \ - array = NULL; \ - } \ - break; \ - } - - for (size_t i = 1; i <= m_phrase_array_indexes->len; ++i) { - switch (i) { - CASE(1); - CASE(2); - CASE(3); - CASE(4); - CASE(5); - CASE(6); - CASE(7); - CASE(8); - CASE(9); - CASE(10); - CASE(11); - CASE(12); - CASE(13); - CASE(14); - CASE(15); - CASE(16); - default: - assert(false); - } - } - /* shrink self array. */ - g_array_set_size(m_phrase_array_indexes, get_length()); -#undef CASE - return true; -} - -template<size_t phrase_length> -bool PhraseArrayIndexLevel2<phrase_length>::mask_out -(phrase_token_t mask, phrase_token_t value) { - IndexItem * begin = NULL, * end = NULL; - begin = (IndexItem *) m_chunk.begin(); - end = (IndexItem *) m_chunk.end(); - - for (IndexItem * cur = begin; cur != end; ++cur) { - if ((cur->m_token & mask) != value) - continue; - - int offset = (cur - begin) * sizeof(IndexItem); - m_chunk.remove_content(offset, sizeof(IndexItem)); - - /* update chunk end. */ - end = (IndexItem *) m_chunk.end(); - --cur; - } - - return true; -} diff --git a/src/storage/phrase_large_table2.h b/src/storage/phrase_large_table2.h deleted file mode 100644 index 9123a48..0000000 --- a/src/storage/phrase_large_table2.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2012 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef PHRASE_LARGE_TABLE2_H -#define PHRASE_LARGE_TABLE2_H - -#include <stdio.h> -#include "novel_types.h" -#include "memory_chunk.h" - -namespace zhuyin{ - -const size_t PHRASE_NUMBER_OF_BITMAP_INDEX = 1<<(sizeof(ucs4_t) / 4 * 8); - -class PhraseLengthIndexLevel2; - -class PhraseBitmapIndexLevel2{ -protected: - PhraseLengthIndexLevel2 * m_phrase_length_indexes[PHRASE_NUMBER_OF_BITMAP_INDEX]; - /* use the third byte of ucs4_t for class PhraseLengthIndexLevel2. */ - void reset(); -public: - PhraseBitmapIndexLevel2(); - ~PhraseBitmapIndexLevel2(){ - reset(); - } - - /* load/store method */ - bool load(MemoryChunk * chunk, table_offset_t offset, table_offset_t end); - bool store(MemoryChunk * new_chunk, table_offset_t offset, table_offset_t & end); - - /* search method */ - int search(int phrase_length, /* in */ const ucs4_t phrase[], - /* out */ PhraseTokens tokens) const; - - /* add_index/remove_index method */ - int add_index(int phrase_length, /* in */ const ucs4_t phrase[], /* in */ phrase_token_t token); - - int remove_index(int phrase_length, /* in */ const ucs4_t phrase[], /* in */ phrase_token_t token); - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value); -}; - - -class PhraseLargeTable2{ -protected: - PhraseBitmapIndexLevel2 m_bitmap_table; - MemoryChunk * m_chunk; - - void reset(){ - if ( m_chunk ){ - delete m_chunk; - m_chunk = NULL; - } - } -public: - PhraseLargeTable2(){ - m_chunk = NULL; - } - - ~PhraseLargeTable2(){ - reset(); - } - - /* load/store method */ - bool load(MemoryChunk * chunk){ - reset(); - m_chunk = chunk; - return m_bitmap_table.load(chunk, 0, chunk->size()); - } - - bool store(MemoryChunk * new_chunk){ - table_offset_t end; - return m_bitmap_table.store(new_chunk, 0, end); - } - - bool load_text(FILE * file); - - /* search method */ - int search(int phrase_length, /* in */ const ucs4_t phrase[], - /* out */ PhraseTokens tokens) const { - return m_bitmap_table.search(phrase_length, phrase, tokens); - } - - /* add_index/remove_index method */ - int add_index(int phrase_length, /* in */ const ucs4_t phrase[], /* in */ phrase_token_t token) { - return m_bitmap_table.add_index(phrase_length, phrase, token); - } - - int remove_index(int phrase_length, /* in */ const ucs4_t phrase[], /* in */ phrase_token_t token) { - return m_bitmap_table.remove_index(phrase_length, phrase, token); - } - - /* mask out method */ - bool mask_out(phrase_token_t mask, phrase_token_t value) { - return m_bitmap_table.mask_out(mask, value); - } -}; - - -static inline int reduce_tokens(const PhraseTokens tokens, - TokenVector tokenarray) { - int num = 0; - g_array_set_size(tokenarray, 0); - - for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - GArray * array = tokens[i]; - if (NULL == array) - continue; - - num += array->len; - - g_array_append_vals(tokenarray, array->data, array->len); - } - - /* the following line will be removed in future after code are verified. */ - assert(0 <= num && num <= 4); - - return num; -} - -/* for compatibility. */ -static inline int get_first_token(const PhraseTokens tokens, - /* out */ phrase_token_t & token){ - token = null_token; - - TokenVector tokenarray = g_array_new(FALSE, FALSE, sizeof(phrase_token_t)); - int num = reduce_tokens(tokens, tokenarray); - if (num) - token = g_array_index(tokenarray, phrase_token_t, 0); - g_array_free(tokenarray, TRUE); - - return num; -} - -}; - -#endif diff --git a/src/storage/pinyin_parser2.cpp b/src/storage/pinyin_parser2.cpp deleted file mode 100644 index 676f138..0000000 --- a/src/storage/pinyin_parser2.cpp +++ /dev/null @@ -1,1329 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - - -#include "pinyin_parser2.h" -#include <ctype.h> -#include <assert.h> -#include <stdio.h> -#include <string.h> -#include "stl_lite.h" -#include "pinyin_phrase2.h" -#include "zhuyin_custom2.h" -#include "chewing_key.h" -#include "pinyin_parser_table.h" -#include "chewing_table.h" - - -using namespace zhuyin; - - -#define FULL_PINYIN_SUPPORT_QUOTATION 0 - - -static bool check_pinyin_options(pinyin_option_t options, const pinyin_index_item_t * item) { - guint32 flags = item->m_flags; - assert (flags & IS_PINYIN); - - /* handle incomplete pinyin. */ - if (flags & PINYIN_INCOMPLETE) { - if (!(options & PINYIN_INCOMPLETE)) - return false; - } - -#if 0 - /* handle correct pinyin, currently only one flag per item. */ - flags &= PINYIN_CORRECT_ALL; - options &= PINYIN_CORRECT_ALL; - - if (flags) { - if ((flags & options) != flags) - return false; - } -#endif - - return true; -} - -static bool check_chewing_options(pinyin_option_t options, const chewing_index_item_t * item) { - guint32 flags = item->m_flags; - assert (flags & IS_BOPOMOFO); - - /* handle incomplete chewing. */ - if (flags & CHEWING_INCOMPLETE) { - if (!(options & CHEWING_INCOMPLETE)) - return false; - } - - /* handle correct chewing, currently only one flag per item. */ - flags &= ZHUYIN_CORRECT_ALL; - options &= ZHUYIN_CORRECT_ALL; - - if (flags) { - if ((flags & options) != flags) - return false; - } - - return true; -} - - -gint _ChewingKey::get_table_index() { - assert(m_initial < CHEWING_NUMBER_OF_INITIALS); - assert(m_middle < CHEWING_NUMBER_OF_MIDDLES); - assert(m_final < CHEWING_NUMBER_OF_FINALS); - - gint index = chewing_key_table[(m_initial * CHEWING_NUMBER_OF_MIDDLES + m_middle) * CHEWING_NUMBER_OF_FINALS + m_final]; - return index == -1 ? 0 : index; -} - -gchar * _ChewingKey::get_pinyin_string(ZhuyinScheme scheme) { - assert(m_tone < CHEWING_NUMBER_OF_TONES); - gint index = get_table_index(); - assert(index < (int) G_N_ELEMENTS(content_table)); - const content_table_item_t & item = content_table[index]; - - const char * pinyin_str = NULL; - - switch(scheme) { - case FULL_PINYIN_HANYU: - pinyin_str = item.m_hanyu_pinyin; - break; - case FULL_PINYIN_LUOMA: - pinyin_str = item.m_luoma_pinyin; - break; - case FULL_PINYIN_SECONDARY_BOPOMOFO: - pinyin_str = item.m_secondary_bopomofo; - break; - default: - assert(false); - } - - if (CHEWING_ZERO_TONE == m_tone) { - return g_strdup(pinyin_str); - } else { - return g_strdup_printf("%s%d", pinyin_str, m_tone); - } -} - -gchar * _ChewingKey::get_bopomofo_string() { - assert(m_tone < CHEWING_NUMBER_OF_TONES); - gint index = get_table_index(); - assert(index < (int) G_N_ELEMENTS(content_table)); - const content_table_item_t & item = content_table[index]; - - if (CHEWING_ZERO_TONE == m_tone) { - return g_strdup(item.m_bopomofo); - } else if (CHEWING_1 == m_tone) { - /* for first tone, usually not display it. */ - return g_strdup(item.m_bopomofo); - } else { - return g_strdup_printf("%s%s", item.m_bopomofo, - chewing_tone_table[m_tone]); - } -} - -/* Pinyin Parsers */ - -/* internal information for pinyin parsers. */ -struct parse_value_t{ - ChewingKey m_key; - ChewingKeyRest m_key_rest; - gint16 m_num_keys; - gint16 m_parsed_len; - gint16 m_last_step; - - /* constructor */ -public: - parse_value_t(){ - m_num_keys = 0; - m_parsed_len = 0; - m_last_step = -1; - } -}; - -const guint16 max_full_pinyin_length = 7; /* include tone. */ - -const guint16 max_double_pinyin_length = 3; /* include tone. */ - -const guint16 max_chewing_length = 4; /* include tone. */ - -const guint16 max_chewing_dachen26_length = 12; /* include tone. */ - -const guint16 max_utf8_length = 6; - -static bool compare_pinyin_less_than(const pinyin_index_item_t & lhs, - const pinyin_index_item_t & rhs){ - return 0 > strcmp(lhs.m_pinyin_input, rhs.m_pinyin_input); -} - -static inline bool search_pinyin_index(pinyin_option_t options, - const pinyin_index_item_t * pinyin_index, - size_t len, - const char * pinyin, - ChewingKey & key){ - pinyin_index_item_t item; - memset(&item, 0, sizeof(item)); - item.m_pinyin_input = pinyin; - - std_lite::pair<const pinyin_index_item_t *, - const pinyin_index_item_t *> range; - range = std_lite::equal_range - (pinyin_index, pinyin_index + len, - item, compare_pinyin_less_than); - - guint16 range_len = range.second - range.first; - assert(range_len <= 1); - if (range_len == 1) { - const pinyin_index_item_t * index = range.first; - - if (!check_pinyin_options(options, index)) - return false; - - key = content_table[index->m_table_index].m_chewing_key; - assert(key.get_table_index() == index->m_table_index); - return true; - } - - return false; -} - -static bool compare_chewing_less_than(const chewing_index_item_t & lhs, - const chewing_index_item_t & rhs){ - return 0 > strcmp(lhs.m_chewing_input, rhs.m_chewing_input); -} - -static inline bool search_chewing_index(pinyin_option_t options, - const chewing_index_item_t * chewing_index, - size_t len, - const char * chewing, - ChewingKey & key){ - chewing_index_item_t item; - memset(&item, 0, sizeof(item)); - item.m_chewing_input = chewing; - - std_lite::pair<const chewing_index_item_t *, - const chewing_index_item_t *> range; - range = std_lite::equal_range - (chewing_index, chewing_index + len, - item, compare_chewing_less_than); - - guint16 range_len = range.second - range.first; - assert (range_len <= 1); - - if (range_len == 1) { - const chewing_index_item_t * index = range.first; - - if (!check_chewing_options(options, index)) - return false; - - key = content_table[index->m_table_index].m_chewing_key; - assert(key.get_table_index() == index->m_table_index); - return true; - } - - return false; -} - -/* Full Pinyin Parser */ -FullPinyinParser2::FullPinyinParser2 (){ - m_pinyin_index = NULL; m_pinyin_index_len = 0; - m_parse_steps = g_array_new(TRUE, FALSE, sizeof(parse_value_t)); - - set_scheme(FULL_PINYIN_DEFAULT); -} - -bool FullPinyinParser2::parse_one_key (pinyin_option_t options, - ChewingKey & key, - const char * pinyin, int len) const { - /* "'" are not accepted in parse_one_key. */ - gchar * input = g_strndup(pinyin, len); - assert(NULL == strchr(input, '\'')); - - guint16 tone = CHEWING_ZERO_TONE; guint16 tone_pos = 0; - guint16 parsed_len = len; - key = ChewingKey(); - - if (options & USE_TONE) { - /* find the tone in the last character. */ - char chr = input[parsed_len - 1]; - if ( '0' < chr && chr <= '5' ) { - tone = chr - '0'; - parsed_len --; - tone_pos = parsed_len; - } - - /* check the force tone option. */ - if (options & FORCE_TONE && CHEWING_ZERO_TONE == tone) { - g_free(input); - return false; - } - } - - /* parse pinyin core staff here. */ - - /* Note: optimize here? */ - input[parsed_len] = '\0'; - if (!search_pinyin_index(options, m_pinyin_index, m_pinyin_index_len, - input, key)) { - g_free(input); - return false; - } - - if (options & USE_TONE) { - /* post processing tone. */ - if ( parsed_len == tone_pos ) { - if (tone != CHEWING_ZERO_TONE) { - key.m_tone = tone; - parsed_len ++; - } - } - } - - g_free(input); - return parsed_len == len; -} - - -int FullPinyinParser2::parse (pinyin_option_t options, ChewingKeyVector & keys, - ChewingKeyRestVector & key_rests, - const char *str, int len) const { - int i; - /* clear arrays. */ - g_array_set_size(keys, 0); - g_array_set_size(key_rests, 0); - - /* init m_parse_steps, and prepare dynamic programming. */ - int step_len = len + 1; - g_array_set_size(m_parse_steps, 0); - parse_value_t value; - for (i = 0; i < step_len; ++i) { - g_array_append_val(m_parse_steps, value); - } - - size_t next_sep = 0; - gchar * input = g_strndup(str, len); - parse_value_t * curstep = NULL, * nextstep = NULL; - - for (i = 0; i < len; ++i) { - -#if FULL_PINYIN_SUPPORT_QUOTATION - if (input[i] == '\'') { - curstep = &g_array_index(m_parse_steps, parse_value_t, i); - nextstep = &g_array_index(m_parse_steps, parse_value_t, i + 1); - - /* propagate current step into next step. */ - nextstep->m_key = ChewingKey(); - nextstep->m_key_rest = ChewingKeyRest(); - nextstep->m_num_keys = curstep->m_num_keys; - nextstep->m_parsed_len = curstep->m_parsed_len + 1; - nextstep->m_last_step = i; - next_sep = 0; - continue; - } -#else - if (input[i] == '\'') { - break; - } -#endif - - /* forward to next "'" */ - if ( 0 == next_sep ) { - int k; - for (k = i; k < len; ++k) { - if (input[k] == '\'') - break; - } - next_sep = k; - } - - /* dynamic programming here. */ - /* for (size_t m = i; m < next_sep; ++m) */ - { - size_t m = i; - curstep = &g_array_index(m_parse_steps, parse_value_t, m); - size_t try_len = std_lite::min - (m + max_full_pinyin_length, next_sep); - for (size_t n = m + 1; n < try_len + 1; ++n) { - nextstep = &g_array_index(m_parse_steps, parse_value_t, n); - - /* gen next step */ - const char * onepinyin = input + m; - gint16 onepinyinlen = n - m; - value = parse_value_t(); - - ChewingKey key; ChewingKeyRest rest; - bool parsed = parse_one_key - (options, key, onepinyin, onepinyinlen); - rest.m_raw_begin = m; rest.m_raw_end = n; - if (!parsed) - continue; - - //printf("onepinyin:%s len:%d\n", onepinyin, onepinyinlen); - - value.m_key = key; value.m_key_rest = rest; - value.m_num_keys = curstep->m_num_keys + 1; - value.m_parsed_len = curstep->m_parsed_len + onepinyinlen; - value.m_last_step = m; - - /* save next step */ - /* no previous result */ - if (-1 == nextstep->m_last_step) - *nextstep = value; - /* prefer the longest pinyin */ - if (value.m_parsed_len > nextstep->m_parsed_len) - *nextstep = value; - /* prefer the shortest keys with the same pinyin length */ - if (value.m_parsed_len == nextstep->m_parsed_len && - value.m_num_keys < nextstep->m_num_keys) - *nextstep = value; - - } - } - } - - /* final step for back tracing. */ - gint16 parsed_len = final_step(step_len, keys, key_rests); - - g_free(input); - return parsed_len; -} - -int FullPinyinParser2::final_step(size_t step_len, ChewingKeyVector & keys, - ChewingKeyRestVector & key_rests) const{ - int i; - gint16 parsed_len = 0; - parse_value_t * curstep = NULL; - - /* find longest match, which starts from the beginning of input. */ - for (i = step_len - 1; i >= 0; --i) { - curstep = &g_array_index(m_parse_steps, parse_value_t, i); - if (i == curstep->m_parsed_len) - break; - } - /* prepare saving. */ - parsed_len = curstep->m_parsed_len; - gint16 num_keys = curstep->m_num_keys; - g_array_set_size(keys, num_keys); - g_array_set_size(key_rests, num_keys); - - /* save the match. */ - while (curstep->m_last_step != -1) { - gint16 pos = curstep->m_num_keys - 1; - - /* skip "'" */ - if (0 != curstep->m_key.get_table_index()) { - ChewingKey * key = &g_array_index(keys, ChewingKey, pos); - ChewingKeyRest * rest = &g_array_index - (key_rests, ChewingKeyRest, pos); - *key = curstep->m_key; *rest = curstep->m_key_rest; - } - - /* back ward */ - curstep = &g_array_index(m_parse_steps, parse_value_t, - curstep->m_last_step); - } - return parsed_len; -} - -bool FullPinyinParser2::set_scheme(ZhuyinScheme scheme){ - switch(scheme){ - case FULL_PINYIN_HANYU: - m_pinyin_index = hanyu_pinyin_index; - m_pinyin_index_len = G_N_ELEMENTS(hanyu_pinyin_index); - break; - case FULL_PINYIN_LUOMA: - m_pinyin_index = luoma_pinyin_index; - m_pinyin_index_len = G_N_ELEMENTS(luoma_pinyin_index); - break; - case FULL_PINYIN_SECONDARY_BOPOMOFO: - m_pinyin_index = secondary_bopomofo_index; - m_pinyin_index_len = G_N_ELEMENTS(secondary_bopomofo_index); - break; - default: - assert(false); - } - return true; -} - -#if 0 - -static const char * pinyin_symbols[27] = { - "a", "b", "c", "d", "e", "f", "g", - "h", "i", "j", "k", "l", "m", "n", - "o", "p", "q", "r", "s", "t", - "u", "v", "w", "x", "y", "z", - "'" -}; - -bool FullPinyinParser2::in_chewing_scheme(pinyin_option_t options, - const char key, - const char ** symbol) const { - int id; - if ('a' <= key && key <= 'z') { - id = key - 'a'; - *symbol = pinyin_symbols[id]; - return true; - } - - if ('\'' == key) { - id = 26; - *symbol = pinyin_symbols[id]; - return true; - } - - return false; -} - -#endif - -/* the chewing string must be freed with g_free. */ -static bool search_chewing_symbols(const chewing_symbol_item_t * symbol_table, - const char key, const char ** chewing) { - *chewing = ""; - /* just iterate the table, as we only have < 50 items. */ - while (symbol_table->m_input != '\0') { - if (symbol_table->m_input == key) { - *chewing = symbol_table->m_chewing; - return true; - } - symbol_table ++; - } - return false; -} - -static bool search_chewing_tones(const chewing_tone_item_t * tone_table, - const char key, unsigned char * tone) { - *tone = CHEWING_ZERO_TONE; - /* just iterate the table, as we only have < 10 items. */ - while (tone_table->m_input != '\0') { - if (tone_table->m_input == key) { - *tone = tone_table->m_tone; - return true; - } - tone_table ++; - } - return false; -} - -static int search_chewing_symbols2(const chewing_symbol_item_t * symbol_table, - const char key, - const char ** first, - const char ** second) { - int num = 0; - *first = NULL; *second = NULL; - - /* just iterate the table, as we only have < 50 items. */ - while (symbol_table->m_input != '\0') { - if (symbol_table->m_input == key) { - ++num; - if (NULL == *first) { - *first = symbol_table->m_chewing; - } else { - *second = symbol_table->m_chewing; - } - } - - /* search done */ - if (symbol_table->m_input > key) - break; - - symbol_table++; - } - - assert(0 <= num && num <= 2); - return num; -} - -#if 1 -bool ChewingSimpleParser2::parse_one_key(pinyin_option_t options, - ChewingKey & key, - const char * str, int len) const { - options &= ~ZHUYIN_AMB_ALL; - unsigned char tone = CHEWING_ZERO_TONE; - - int symbols_len = len; - /* probe whether the last key is tone key in str. */ - if (options & USE_TONE) { - char ch = str[len - 1]; - /* remove tone from input */ - if (search_chewing_tones(m_tone_table, ch, &tone)) - symbols_len --; - - /* check the force tone option */ - if (options & FORCE_TONE && CHEWING_ZERO_TONE == tone) - return false; - } - - int i; - gchar * chewing = NULL; const char * onechar = NULL; - - /* probe the possible chewing map in the rest of str. */ - for (i = 0; i < symbols_len; ++i) { - if (!search_chewing_symbols(m_symbol_table, str[i], &onechar)) { - g_free(chewing); - return false; - } - - if (!chewing) { - chewing = g_strdup(onechar); - } else { - gchar * tmp = chewing; - chewing = g_strconcat(chewing, onechar, NULL); - g_free(tmp); - } - } - - /* search the chewing in the chewing index table. */ - if (chewing && search_chewing_index(options, bopomofo_index, - G_N_ELEMENTS(bopomofo_index), - chewing, key)) { - /* save back tone if available. */ - key.m_tone = tone; - g_free(chewing); - return true; - } - - g_free(chewing); - return false; -} - -#endif - -/* only characters in chewing keyboard scheme are accepted here. */ -int ChewingSimpleParser2::parse(pinyin_option_t options, - ChewingKeyVector & keys, - ChewingKeyRestVector & key_rests, - const char *str, int len) const { - /* add keyboard mapping specific options. */ - options |= m_options; - - g_array_set_size(keys, 0); - g_array_set_size(key_rests, 0); - - int maximum_len = 0; int i; - /* probe the longest possible chewing string. */ - for (i = 0; i < len; ++i) { - gchar ** symbols = NULL; - if (!in_chewing_scheme(options, str[i], symbols)) { - g_strfreev(symbols); - break; - } - g_strfreev(symbols); - } - maximum_len = i; - - /* maximum forward match for chewing. */ - int parsed_len = 0; - while (parsed_len < maximum_len) { - const char * cur_str = str + parsed_len; - i = std_lite::min(maximum_len - parsed_len, - (int)max_chewing_length); - - ChewingKey key; ChewingKeyRest key_rest; - for (; i > 0; --i) { - bool success = parse_one_key(options, key, cur_str, i); - if (success) - break; - } - - if (0 == i) /* no more possible chewings. */ - break; - - key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; - parsed_len += i; - - /* save the pinyin. */ - g_array_append_val(keys, key); - g_array_append_val(key_rests, key_rest); - } - - return parsed_len; -} - - -bool ChewingSimpleParser2::set_scheme(ZhuyinScheme scheme) { - m_options = SHUFFLE_CORRECT; - - switch(scheme) { - case CHEWING_STANDARD: - m_symbol_table = chewing_standard_symbols; - m_tone_table = chewing_standard_tones; - return true; - case CHEWING_IBM: - m_symbol_table = chewing_ibm_symbols; - m_tone_table = chewing_ibm_tones; - return true; - case CHEWING_GINYIEH: - m_symbol_table = chewing_ginyieh_symbols; - m_tone_table = chewing_ginyieh_tones; - return true; - case CHEWING_ETEN: - m_symbol_table = chewing_eten_symbols; - m_tone_table = chewing_eten_tones; - return true; - case CHEWING_STANDARD_DVORAK: - m_symbol_table = chewing_standard_dvorak_symbols; - m_tone_table = chewing_standard_dvorak_tones; - default: - assert(FALSE); - } - - return false; -} - -bool ChewingSimpleParser2::in_chewing_scheme(pinyin_option_t options, - const char key, - gchar ** & symbols) const { - symbols = NULL; - GPtrArray * array = g_ptr_array_new(); - - const gchar * chewing = NULL; - unsigned char tone = CHEWING_ZERO_TONE; - - if (search_chewing_symbols(m_symbol_table, key, &chewing)) { - g_ptr_array_add(array, g_strdup(chewing)); - g_ptr_array_add(array, NULL); - /* must be freed by g_strfreev. */ - symbols = (gchar **) g_ptr_array_free(array, FALSE); - return true; - } - - if (!(options & USE_TONE)) - return false; - - if (search_chewing_tones(m_tone_table, key, &tone)) { - g_ptr_array_add(array, g_strdup(chewing_tone_table[tone])); - g_ptr_array_add(array, NULL); - /* must be freed by g_strfreev. */ - symbols = (gchar **) g_ptr_array_free(array, FALSE); - return true; - } - - return false; -} - -bool ChewingDiscreteParser2::parse_one_key(pinyin_option_t options, - ChewingKey & key, - const char * str, int len) const { - if (0 == len) - return false; - - options &= ~ZHUYIN_AMB_ALL; - - int index = 0; - const char * initial = ""; - const char * middle = ""; - const char * final = ""; - unsigned char tone = CHEWING_ZERO_TONE; - - /* probe initial */ - if (search_chewing_symbols(m_initial_table, str[index], &initial)) { - index++; - } - - if (index == len) - goto probe; - - /* probe middle */ - if (search_chewing_symbols(m_middle_table, str[index], &middle)) { - index++; - } - - if (index == len) - goto probe; - - /* probe final */ - if (search_chewing_symbols(m_final_table, str[index], &final)) { - index++; - } - - if (index == len) { - /* check the force tone option. */ - if (options & USE_TONE && options & FORCE_TONE) - return false; - goto probe; - } - - /* probe tone */ - if (options & USE_TONE) { - if (search_chewing_tones(m_tone_table, str[index], &tone)) { - index ++; - } - } - -probe: - /* check the force tone option. */ - if (options & FORCE_TONE && CHEWING_ZERO_TONE == tone) { - return false; - } - - gchar * chewing = g_strconcat(initial, middle, final, NULL); - - /* search the chewing in the chewing index table. */ - if (index == len && search_chewing_index(options, m_chewing_index, - m_chewing_index_len, - chewing, key)) { - /* save back tone if available. */ - key.m_tone = tone; - g_free(chewing); - return true; - } - - g_free(chewing); - return false; -} - -/* only characters in chewing keyboard scheme are accepted here. */ -int ChewingDiscreteParser2::parse(pinyin_option_t options, - ChewingKeyVector & keys, - ChewingKeyRestVector & key_rests, - const char *str, int len) const { - /* add keyboard mapping specific options. */ - options |= m_options; - - g_array_set_size(keys, 0); - g_array_set_size(key_rests, 0); - - int maximum_len = 0; int i; - /* probe the longest possible chewing string. */ - for (i = 0; i < len; ++i) { - gchar ** symbols = NULL; - if (!in_chewing_scheme(options, str[i], symbols)) { - g_strfreev(symbols); - break; - } - g_strfreev(symbols); - } - maximum_len = i; - - /* maximum forward match for chewing. */ - int parsed_len = 0; - while (parsed_len < maximum_len) { - const char * cur_str = str + parsed_len; - i = std_lite::min(maximum_len - parsed_len, - (int)max_chewing_length); - - ChewingKey key; ChewingKeyRest key_rest; - for (; i > 0; --i) { - bool success = parse_one_key(options, key, cur_str, i); - if (success) - break; - } - - if (0 == i) /* no more possible chewings. */ - break; - - key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; - parsed_len += i; - - /* save the pinyin. */ - g_array_append_val(keys, key); - g_array_append_val(key_rests, key_rest); - } - - return parsed_len; -} - -bool ChewingDiscreteParser2::set_scheme(ZhuyinScheme scheme) { - m_options = 0; - -#define INIT_PARSER(index, table) { \ - m_chewing_index = index; \ - m_chewing_index_len = G_N_ELEMENTS(index); \ - m_initial_table = chewing_##table##_initials; \ - m_middle_table = chewing_##table##_middles; \ - m_final_table = chewing_##table##_finals; \ - m_tone_table = chewing_##table##_tones; \ - } - - switch(scheme) { - case CHEWING_HSU: - m_options = HSU_CORRECT; - INIT_PARSER(hsu_bopomofo_index, hsu); - break; - case CHEWING_ETEN26: - m_options = ETEN26_CORRECT; - INIT_PARSER(eten26_bopomofo_index, eten26); - break; - case CHEWING_HSU_DVORAK: - m_options = HSU_CORRECT; - INIT_PARSER(hsu_bopomofo_index, hsu_dvorak); - break; - default: - assert(FALSE); - } - -#undef INIT_PARSER - - return true; -} - -bool ChewingDiscreteParser2::in_chewing_scheme(pinyin_option_t options, - const char key, - gchar ** & symbols) const { - symbols = NULL; - GPtrArray * array = g_ptr_array_new(); - - const gchar * first = NULL, * second = NULL; - unsigned char tone = CHEWING_ZERO_TONE; - - if (search_chewing_symbols2(m_initial_table, key, &first, &second)) { - if (first) - g_ptr_array_add(array, g_strdup(first)); - if (second) - g_ptr_array_add(array, g_strdup(second)); - } - - if (search_chewing_symbols2(m_middle_table, key, &first, &second)) { - if (first) - g_ptr_array_add(array, g_strdup(first)); - if (second) - g_ptr_array_add(array, g_strdup(second)); - } - - if (search_chewing_symbols2(m_final_table, key, &first, &second)) { - if (first) - g_ptr_array_add(array, g_strdup(first)); - if (second) - g_ptr_array_add(array, g_strdup(second)); - } - - if (!(options & USE_TONE)) - goto end; - - if (search_chewing_tones(m_tone_table, key, &tone)) { - g_ptr_array_add(array, g_strdup(chewing_tone_table[tone])); - } - -end: - assert(array->len <= 3); - - if (array->len) { - g_ptr_array_add(array, NULL); - /* must be freed by g_strfreev. */ - symbols = (gchar **) g_ptr_array_free(array, FALSE); - return true; - } - - g_ptr_array_free(array, TRUE); - return false; -} - -ChewingDaChenCP26Parser2::ChewingDaChenCP26Parser2() { - m_chewing_index = bopomofo_index; - m_chewing_index_len = G_N_ELEMENTS(bopomofo_index); - - m_initial_table = chewing_dachen_cp26_initials; - m_middle_table = chewing_dachen_cp26_middles; - m_final_table = chewing_dachen_cp26_finals; - m_tone_table = chewing_dachen_cp26_tones; -} - -static int count_same_chars(const char * str, int len) { - assert(len > 0); - - int count = 0; - const char cur_char = str[0]; - - for (int i = 0; i < len; ++i) { - if (cur_char != str[i]) - break; - ++count; - } - - assert(count >= 1); - return count; -} - -bool ChewingDaChenCP26Parser2::parse_one_key(pinyin_option_t options, - ChewingKey & key, - const char *str, int len) const { - if (0 == len) - return false; - - options &= ~ZHUYIN_AMB_ALL; - - const char * initial = ""; - const char * middle = ""; - const char * final = ""; - unsigned char tone = CHEWING_ZERO_TONE; - - gchar * input = g_strndup(str, len); - int index = 0; - - char ch; - const char * first = NULL; - const char * second = NULL; - - /* probe whether the last key is tone key in input. */ - if (options & USE_TONE) { - ch = input[len - 1]; - /* remove tone from input */ - if (search_chewing_tones(m_tone_table, ch, &tone)) - len --; - - /* check the force tone option. */ - if (options & FORCE_TONE && CHEWING_ZERO_TONE == tone) { - g_free(input); - return false; - } - } - - if (0 == len) - return false; - - int choice; int count; - - /* probe initial */ - do { - ch = input[index]; - count = count_same_chars(input + index, len - index); - if (search_chewing_symbols2(m_initial_table, ch, &first, &second)) { - index += count; - if (NULL == second) { - initial = first; - break; - } else { - choice = (count - 1) % 2; - if (0 == choice) - initial = first; - if (1 == choice) - initial = second; - } - } - } while (0); - - if (index == len) - goto probe; - - first = NULL; second = NULL; - /* probe middle */ - do { - ch = input[index]; - count = count_same_chars(input + index, len - index); - /* handle 'u' */ - if ('u' == ch) { - choice = (count - 1) % 3; - if (0 == choice) - middle = "ㄧ"; - if (1 == choice) - final = "ㄚ"; - if (2 == choice) { - middle = "ㄧ"; - final = "ㄚ"; - } - } - /* handle 'm' */ - if ('m' == ch) { - choice = (count - 1) % 2; - if (0 == choice) - middle = "ㄩ"; - if (1 == choice) - final = "ㄡ"; - } - /* handle 'j' */ - if ('j' == ch) { - middle = "ㄨ"; - } - if (search_chewing_symbols2(m_middle_table, ch, &first, &second)) { - index += count; - assert(NULL == second); - } - } while(0); - - if (index == len) - goto probe; - - /* probe final */ - do { - /* for 'u' and 'm' */ - if (0 != strlen(final)) - break; - - ch = input[index]; - count = count_same_chars(input + index, len - index); - if (search_chewing_symbols2(m_final_table, ch, &first, &second)) { - index += count; - if (NULL == second) { - final = first; - break; - } else { - choice = (count - 1) % 2; - if (0 == choice) - final = first; - if (1 == choice) - final = second; - } - } - } while(0); - - if (index == len) - goto probe; - -probe: - gchar * chewing = g_strconcat(initial, middle, final, NULL); - - /* search the chewing in the chewing index table. */ - if (index == len && search_chewing_index(options, m_chewing_index, - m_chewing_index_len, - chewing, key)) { - /* save back tone if available. */ - key.m_tone = tone; - g_free(chewing); - g_free(input); - return true; - } - - g_free(chewing); - g_free(input); - return false; -} - -int ChewingDaChenCP26Parser2::parse(pinyin_option_t options, - ChewingKeyVector & keys, - ChewingKeyRestVector & key_rests, - const char *str, int len) const { - g_array_set_size(keys, 0); - g_array_set_size(key_rests, 0); - - int maximum_len = 0; int i; - /* probe the longest possible chewing string. */ - for (i = 0; i < len; ++i) { - gchar ** symbols = NULL; - if (!in_chewing_scheme(options, str[i], symbols)) { - g_strfreev(symbols); - break; - } - g_strfreev(symbols); - } - maximum_len = i; - - /* maximum forward match for chewing. */ - int parsed_len = 0; - const char * cur_str = NULL; - ChewingKey key; ChewingKeyRest key_rest; - - while (parsed_len < maximum_len) { - cur_str = str + parsed_len; - i = std_lite::min(maximum_len - parsed_len, - (int)max_chewing_dachen26_length); - - for (; i > 0; --i) { - bool success = parse_one_key(options, key, cur_str, i); - if (success) - break; - } - - if (0 == i) /* no more possible chewings. */ - break; - - key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; - parsed_len += i; - - /* save the pinyin. */ - g_array_append_val(keys, key); - g_array_append_val(key_rests, key_rest); - } - -#if 0 - /* for the last partial input */ - options |= CHEWING_INCOMPLETE; - - cur_str = str + parsed_len; - i = std_lite::min(maximum_len - parsed_len, - (int) max_chewing_dachen26_length); - for (; i > 0; --i) { - bool success = parse_one_key(options, key, cur_str, i); - if (success) - break; - } - - if (i > 0) { /* found one */ - key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; - parsed_len += i; - - /* save the pinyin. */ - g_array_append_val(keys, key); - g_array_append_val(key_rests, key_rest); - } -#endif - - return parsed_len; -} - - -bool ChewingDaChenCP26Parser2::in_chewing_scheme(pinyin_option_t options, - const char key, - gchar ** & symbols) const { - symbols = NULL; - GPtrArray * array = g_ptr_array_new(); - - const gchar * first = NULL, * second = NULL; - unsigned char tone = CHEWING_ZERO_TONE; - - if (search_chewing_symbols2(m_initial_table, key, &first, &second)) { - if (first) - g_ptr_array_add(array, g_strdup(first)); - if (second) - g_ptr_array_add(array, g_strdup(second)); - } - - if (search_chewing_symbols2(m_middle_table, key, &first, &second)) { - if (first) - g_ptr_array_add(array, g_strdup(first)); - if (second) - g_ptr_array_add(array, g_strdup(second)); - } - - if (search_chewing_symbols2(m_final_table, key, &first, &second)) { - if (first) - g_ptr_array_add(array, g_strdup(first)); - if (second) - g_ptr_array_add(array, g_strdup(second)); - } - - /* handles for "i" */ - if ('i' == key) { - g_ptr_array_add(array, g_strdup("ㄧㄚ")); - } - - if (!(options & USE_TONE)) - goto end; - - if (search_chewing_tones(m_tone_table, key, &tone)) { - g_ptr_array_add(array, g_strdup(chewing_tone_table[tone])); - } - -end: - assert(array->len <= 3); - - if (array->len) { - g_ptr_array_add(array, NULL); - /* must be freed by g_strfreev. */ - symbols = (gchar **) g_ptr_array_free(array, FALSE); - return true; - } - - g_ptr_array_free(array, TRUE); - return false; -} - -ChewingDirectParser2::ChewingDirectParser2 (){ - m_chewing_index = bopomofo_index; - m_chewing_index_len = G_N_ELEMENTS(bopomofo_index); -} - -bool ChewingDirectParser2::parse_one_key(pinyin_option_t options, - ChewingKey & key, - const char *str, int len) const { - options &= ~ZHUYIN_AMB_ALL; - /* by default, chewing will use the first tone. */ - unsigned char tone = CHEWING_1; - - if (0 == len) - return false; - - const gchar * last_char = NULL; - for (const char * p = str; p < str + len; p = g_utf8_next_char(p)) { - last_char = p; - } - - /* probe tone first. */ - if (options & USE_TONE) { - gchar buffer[max_utf8_length + 1]; - memset(buffer, 0, sizeof(buffer)); - g_utf8_strncpy(buffer, last_char, 1); - - /* for loop chewing_tone_table. */ - int i = 1; - for (; i < (int) G_N_ELEMENTS(chewing_tone_table); ++i) { - const char * symbol = chewing_tone_table[i]; - if (0 == strcmp(symbol, buffer)) { - tone = i; - len -= strlen(buffer); - break; - } - } - - /* check the force tone option. */ - if (options & FORCE_TONE && CHEWING_ZERO_TONE == tone) { - return false; - } - } - - gchar * chewing = g_strndup(str, len); - /* search the chewing in the chewing index table. */ - if (len && search_chewing_index(options, m_chewing_index, - m_chewing_index_len, chewing, key)) { - /* save back tone if available. */ - key.m_tone = tone; - g_free(chewing); - - assert(tone != CHEWING_ZERO_TONE); - return true; - } - - g_free(chewing); - return false; -} - -int ChewingDirectParser2::parse(pinyin_option_t options, - ChewingKeyVector & keys, - ChewingKeyRestVector & key_rests, - const char *str, int len) const { - g_array_set_size(keys, 0); - g_array_set_size(key_rests, 0); - - ChewingKey key; ChewingKeyRest key_rest; - - int parsed_len = 0; - int i = 0, cur = 0, next = 0; - while (cur < len) { - /* probe next position */ - for (i = cur; i < len; ++i) { - if (' ' == str[i] || '\'' == str[i]) - break; - } - next = i; - - if (parse_one_key(options, key, str + cur, next - cur)) { - key_rest.m_raw_begin = cur; key_rest.m_raw_end = next; - - /* save the pinyin. */ - g_array_append_val(keys, key); - g_array_append_val(key_rests, key_rest); - } else { - return parsed_len; - } - - /* skip consecutive spaces. */ - for (i = next; i < len; ++i) { - if (' ' != str[i] && '\'' != str[i]) - break; - } - - cur = i; - parsed_len = i; - } - - return parsed_len; -} diff --git a/src/storage/pinyin_parser2.h b/src/storage/pinyin_parser2.h deleted file mode 100644 index 9b9d78e..0000000 --- a/src/storage/pinyin_parser2.h +++ /dev/null @@ -1,407 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef PINYIN_PARSER2_H -#define PINYIN_PARSER2_H - -#include <glib.h> -#include "novel_types.h" -#include "chewing_key.h" -#include "zhuyin_custom2.h" - -namespace zhuyin{ - -typedef struct { - const char * m_hanyu_pinyin; - const char * m_bopomofo; - const char * m_luoma_pinyin; - const char * m_secondary_bopomofo; - ChewingKey m_chewing_key; -} content_table_item_t; - -typedef struct { - const char * m_pinyin_input; - guint32 m_flags; - guint16 m_table_index; -} pinyin_index_item_t; - -typedef struct { - const char * m_chewing_input; - guint32 m_flags; - guint16 m_table_index; -} chewing_index_item_t; - -typedef struct { - const char m_input; - const char * m_chewing; -} chewing_symbol_item_t; - -typedef struct { - const char m_input; - const char m_tone; -} chewing_tone_item_t; - -typedef GArray * ParseValueVector; - - -/** - * PhoneticParser2: - * - * Parse the ascii string into an array of the struct ChewingKeys. - * - */ -class PhoneticParser2 -{ -public: - /** - * PhoneticParser2::~PhoneticParser2: - * - * The destructor of the PhoneticParser2. - * - */ - virtual ~PhoneticParser2() {} - -public: - /** - * PhoneticParser2::parse_one_key: - * @options: the pinyin options. - * @key: the parsed result of struct ChewingKey. - * @str: the input of the ascii string. - * @len: the length of the str. - * @returns: whether the entire string is parsed as one key. - * - * Parse only one struct ChewingKey from a string. - * - */ - virtual bool parse_one_key(pinyin_option_t options, ChewingKey & key, const char *str, int len) const = 0; - - /** - * PhoneticParser2::parse: - * @options: the pinyin options. - * @keys: the parsed result of struct ChewingKeys. - * @str: the input of the ascii string. - * @len: the length of the str. - * @returns: the number of chars were actually used. - * - * Parse the ascii string into an array of struct ChewingKeys. - * - */ - virtual int parse(pinyin_option_t options, ChewingKeyVector & keys, ChewingKeyRestVector & key_rests, const char *str, int len) const = 0; - -}; - - -/** - * FullPinyinParser2: - * - * Parses the full pinyin string into an array of struct ChewingKeys. - * - */ -class FullPinyinParser2 : public PhoneticParser2 -{ -protected: - /* Note: some internal pointers to full pinyin table. */ - const pinyin_index_item_t * m_pinyin_index; - size_t m_pinyin_index_len; - -protected: - ParseValueVector m_parse_steps; - - int final_step(size_t step_len, ChewingKeyVector & keys, - ChewingKeyRestVector & key_rests) const; - -public: - FullPinyinParser2(); - virtual ~FullPinyinParser2() { - g_array_free(m_parse_steps, TRUE); - } - - virtual bool parse_one_key(pinyin_option_t options, ChewingKey & key, const char *str, int len) const; - - /* Note: - * the parse method will use dynamic programming to drive parse_one_key. - */ - virtual int parse(pinyin_option_t options, ChewingKeyVector & keys, ChewingKeyRestVector & key_rests, const char *str, int len) const; - -public: - bool set_scheme(ZhuyinScheme scheme); -}; - -/** - * ChewingParser2: - * - * Parse the chewing input string into an array of struct ChewingKeys. - * - */ -class ChewingParser2 : public PhoneticParser2 -{ -public: - virtual ~ChewingParser2() {} - -public: - /** - * ChewingParser2::in_chewing_scheme: - * @options: the pinyin options. - * @key: the user input ascii character. - * @symbol: the corresponding chewing symbol. - * @returns: whether the character is in the chewing scheme. - * - * Check whether the input character is in the chewing keyboard mapping. - * - */ - virtual bool in_chewing_scheme(pinyin_option_t options, const char key, gchar ** & symbols) const = 0; -}; - - - /** - * ChewingSimpleParser2: - * - * Parse the chewing string into an array of struct ChewingKeys. - * - * Several keyboard scheme are supported: - * * CHEWING_STANDARD Standard ZhuYin keyboard, which maps 1 to Bo(ㄅ), q to Po(ㄆ) etc. - * * CHEWING_IBM IBM ZhuYin keyboard, which maps 1 to Bo(ㄅ), 2 to Po(ㄆ) etc. - * * CHEWING_GINYIEH Gin-Yieh ZhuYin keyboard. - * * CHEWING_ETEN Eten (倚天) ZhuYin keyboard. - * * CHEWING_STANDARD_DVORAK Standard Dvorak ZhuYin keyboard - * - */ - -class ChewingSimpleParser2 : public ChewingParser2 -{ - /* internal options for chewing parsing. */ - pinyin_option_t m_options; - - /* Note: some internal pointers to chewing scheme table. */ -protected: - const chewing_symbol_item_t * m_symbol_table; - const chewing_tone_item_t * m_tone_table; - -public: - ChewingSimpleParser2() { - m_symbol_table = NULL; m_tone_table = NULL; - set_scheme(CHEWING_DEFAULT); - } - - virtual ~ChewingSimpleParser2() {} - - virtual bool parse_one_key(pinyin_option_t options, ChewingKey & key, const char *str, int len) const; - - virtual int parse(pinyin_option_t options, ChewingKeyVector & keys, ChewingKeyRestVector & key_rests, const char *str, int len) const; - -public: - bool set_scheme(ZhuyinScheme scheme); - virtual bool in_chewing_scheme(pinyin_option_t options, const char key, gchar ** & symbols) const; -}; - - -/** - * ChewingDiscreteParser2: - * - * Parse the chewing string into an array of struct ChewingKeys. - * - * Initially will support HSU, HSU Dvorak and ETEN26. - * - */ - -class ChewingDiscreteParser2 : public ChewingParser2 -{ -protected: - /* internal options for chewing parsing. */ - pinyin_option_t m_options; - - /* some internal pointers to chewing scheme table. */ - const chewing_index_item_t * m_chewing_index; - size_t m_chewing_index_len; - const chewing_symbol_item_t * m_initial_table; - const chewing_symbol_item_t * m_middle_table; - const chewing_symbol_item_t * m_final_table; - const chewing_tone_item_t * m_tone_table; - -public: - ChewingDiscreteParser2() { - m_options = 0; - m_chewing_index = NULL; m_chewing_index_len = 0; - m_initial_table = NULL; m_middle_table = NULL; - m_final_table = NULL; m_tone_table = NULL; - set_scheme(CHEWING_HSU); - } - - virtual ~ChewingDiscreteParser2() {} - - virtual bool parse_one_key(pinyin_option_t options, ChewingKey & key, const char *str, int len) const; - - virtual int parse(pinyin_option_t options, ChewingKeyVector & keys, ChewingKeyRestVector & key_rests, const char *str, int len) const; - -public: - bool set_scheme(ZhuyinScheme scheme); - virtual bool in_chewing_scheme(pinyin_option_t options, const char key, gchar ** & symbols) const; -}; - - -class ChewingDaChenCP26Parser2 : public ChewingParser2 -{ - /* some internal pointers to chewing scheme table. */ - const chewing_index_item_t * m_chewing_index; - size_t m_chewing_index_len; - const chewing_symbol_item_t * m_initial_table; - const chewing_symbol_item_t * m_middle_table; - const chewing_symbol_item_t * m_final_table; - const chewing_tone_item_t * m_tone_table; - -public: - ChewingDaChenCP26Parser2(); - - virtual ~ChewingDaChenCP26Parser2() {} - - virtual bool parse_one_key(pinyin_option_t options, ChewingKey & key, const char *str, int len) const; - - virtual int parse(pinyin_option_t options, ChewingKeyVector & keys, ChewingKeyRestVector & key_rests, const char *str, int len) const; - -public: - virtual bool in_chewing_scheme(pinyin_option_t options, const char key, gchar ** & symbols) const; -}; - - -/* Direct Parser for Chewing table load. */ -class ChewingDirectParser2 : public PhoneticParser2 -{ - const chewing_index_item_t * m_chewing_index; - size_t m_chewing_index_len; - -public: - ChewingDirectParser2(); - - virtual ~ChewingDirectParser2() {} - - virtual bool parse_one_key(pinyin_option_t options, ChewingKey & key, const char *str, int len) const; - - virtual int parse(pinyin_option_t options, ChewingKeyVector & keys, ChewingKeyRestVector & key_rests, const char *str, int len) const; -}; - -/* compare pinyins with chewing internal representations. */ -inline int pinyin_compare_initial2(pinyin_option_t options, - ChewingInitial lhs, - ChewingInitial rhs) { - if (lhs == rhs) - return 0; - - if ((options & ZHUYIN_AMB_C_CH) && - ((lhs == CHEWING_C && rhs == CHEWING_CH) || - (lhs == CHEWING_CH && rhs == CHEWING_C))) - return 0; - - if ((options & ZHUYIN_AMB_S_SH) && - ((lhs == CHEWING_S && rhs == CHEWING_SH) || - (lhs == CHEWING_SH && rhs == CHEWING_S))) - return 0; - - if ((options & ZHUYIN_AMB_Z_ZH) && - ((lhs == CHEWING_Z && rhs == CHEWING_ZH) || - (lhs == CHEWING_ZH && rhs == CHEWING_Z))) - return 0; - - if ((options & ZHUYIN_AMB_F_H) && - ((lhs == CHEWING_F && rhs == CHEWING_H) || - (lhs == CHEWING_H && rhs == CHEWING_F))) - return 0; - - if ((options & ZHUYIN_AMB_L_N) && - ((lhs == CHEWING_L && rhs == CHEWING_N) || - (lhs == CHEWING_N && rhs == CHEWING_L))) - return 0; - - if ((options & ZHUYIN_AMB_L_R) && - ((lhs == CHEWING_L && rhs == CHEWING_R) || - (lhs == CHEWING_R && rhs == CHEWING_L))) - return 0; - - if ((options & ZHUYIN_AMB_G_K) && - ((lhs == CHEWING_G && rhs == CHEWING_K) || - (lhs == CHEWING_K && rhs == CHEWING_G))) - return 0; - - return (lhs - rhs); -} - - -inline int pinyin_compare_middle_and_final2(pinyin_option_t options, - ChewingMiddle middle_lhs, - ChewingMiddle middle_rhs, - ChewingFinal final_lhs, - ChewingFinal final_rhs) { - if (middle_lhs == middle_rhs && final_lhs == final_rhs) - return 0; - - /* both pinyin and chewing incomplete options will enable this. */ - if (options & (PINYIN_INCOMPLETE | CHEWING_INCOMPLETE)) { - if (middle_lhs == CHEWING_ZERO_MIDDLE && - final_lhs == CHEWING_ZERO_FINAL) - return 0; - if (middle_rhs == CHEWING_ZERO_MIDDLE && - final_rhs == CHEWING_ZERO_FINAL) - return 0; - } - - /* compare chewing middle first. */ - int middle_diff = middle_lhs - middle_rhs; - if (middle_diff) - return middle_diff; - - if ((options & ZHUYIN_AMB_AN_ANG) && - ((final_lhs == CHEWING_AN && final_rhs == CHEWING_ANG) || - (final_lhs == CHEWING_ANG && final_rhs == CHEWING_AN))) - return 0; - - if ((options & ZHUYIN_AMB_EN_ENG) && - ((final_lhs == CHEWING_EN && final_rhs == CHEWING_ENG) || - (final_lhs == CHEWING_ENG && final_rhs == CHEWING_EN))) - return 0; - - if ((options & ZHUYIN_AMB_IN_ING) && - ((final_lhs == PINYIN_IN && final_rhs == PINYIN_ING) || - (final_lhs == PINYIN_ING && final_rhs == PINYIN_IN))) - return 0; - - return (final_lhs - final_rhs); -} - - -inline int pinyin_compare_tone2(pinyin_option_t options, - ChewingTone lhs, - ChewingTone rhs) { -#if 0 - if (lhs == rhs) - return 0; -#endif - if (options & FORCE_TONE) - return (lhs - rhs); - if (lhs == CHEWING_ZERO_TONE) - return 0; - if (rhs == CHEWING_ZERO_TONE) - return 0; - return (lhs - rhs); -} - - -}; - -#endif diff --git a/src/storage/pinyin_parser_table.h b/src/storage/pinyin_parser_table.h deleted file mode 100644 index fa7fc36..0000000 --- a/src/storage/pinyin_parser_table.h +++ /dev/null @@ -1,5931 +0,0 @@ -/* This file is generated by python scripts. Don't edit this file directly. - */ - -#ifndef PINYIN_PARSER_TABLE_H -#define PINYIN_PARSER_TABLE_H - -namespace zhuyin{ - -const pinyin_index_item_t hanyu_pinyin_index[] = { -{"a", IS_BOPOMOFO|IS_PINYIN, 1}, -{"ai", IS_BOPOMOFO|IS_PINYIN, 2}, -{"an", IS_BOPOMOFO|IS_PINYIN, 3}, -{"ang", IS_BOPOMOFO|IS_PINYIN, 4}, -{"ao", IS_BOPOMOFO|IS_PINYIN, 5}, -{"b", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 6}, -{"ba", IS_BOPOMOFO|IS_PINYIN, 7}, -{"bai", IS_BOPOMOFO|IS_PINYIN, 8}, -{"ban", IS_BOPOMOFO|IS_PINYIN, 9}, -{"bang", IS_BOPOMOFO|IS_PINYIN, 10}, -{"bao", IS_BOPOMOFO|IS_PINYIN, 11}, -{"bei", IS_BOPOMOFO|IS_PINYIN, 12}, -{"ben", IS_BOPOMOFO|IS_PINYIN, 13}, -{"beng", IS_BOPOMOFO|IS_PINYIN, 14}, -{"bi", IS_BOPOMOFO|IS_PINYIN, 15}, -{"bian", IS_BOPOMOFO|IS_PINYIN, 16}, -{"biao", IS_BOPOMOFO|IS_PINYIN, 17}, -{"bie", IS_BOPOMOFO|IS_PINYIN, 18}, -{"bin", IS_BOPOMOFO|IS_PINYIN, 19}, -{"bing", IS_BOPOMOFO|IS_PINYIN, 20}, -{"bo", IS_BOPOMOFO|IS_PINYIN, 21}, -{"bu", IS_BOPOMOFO|IS_PINYIN, 22}, -{"c", IS_PINYIN|PINYIN_INCOMPLETE, 23}, -{"ca", IS_BOPOMOFO|IS_PINYIN, 24}, -{"cai", IS_BOPOMOFO|IS_PINYIN, 25}, -{"can", IS_BOPOMOFO|IS_PINYIN, 26}, -{"cang", IS_BOPOMOFO|IS_PINYIN, 27}, -{"cao", IS_BOPOMOFO|IS_PINYIN, 28}, -{"ce", IS_BOPOMOFO|IS_PINYIN, 29}, -{"cen", IS_BOPOMOFO|IS_PINYIN, 30}, -{"ceng", IS_BOPOMOFO|IS_PINYIN, 31}, -{"ch", IS_PINYIN|PINYIN_INCOMPLETE, 32}, -{"cha", IS_BOPOMOFO|IS_PINYIN, 33}, -{"chai", IS_BOPOMOFO|IS_PINYIN, 34}, -{"chan", IS_BOPOMOFO|IS_PINYIN, 35}, -{"chang", IS_BOPOMOFO|IS_PINYIN, 36}, -{"chao", IS_BOPOMOFO|IS_PINYIN, 37}, -{"che", IS_BOPOMOFO|IS_PINYIN, 38}, -{"chen", IS_BOPOMOFO|IS_PINYIN, 39}, -{"cheng", IS_BOPOMOFO|IS_PINYIN, 40}, -{"chi", IS_BOPOMOFO|IS_PINYIN, 41}, -{"chong", IS_BOPOMOFO|IS_PINYIN, 42}, -{"chou", IS_BOPOMOFO|IS_PINYIN, 43}, -{"chu", IS_BOPOMOFO|IS_PINYIN, 44}, -{"chuai", IS_BOPOMOFO|IS_PINYIN, 46}, -{"chuan", IS_BOPOMOFO|IS_PINYIN, 47}, -{"chuang", IS_BOPOMOFO|IS_PINYIN, 48}, -{"chui", IS_BOPOMOFO|IS_PINYIN, 49}, -{"chun", IS_BOPOMOFO|IS_PINYIN, 50}, -{"chuo", IS_BOPOMOFO|IS_PINYIN, 51}, -{"ci", IS_BOPOMOFO|IS_PINYIN, 52}, -{"cong", IS_BOPOMOFO|IS_PINYIN, 53}, -{"cou", IS_BOPOMOFO|IS_PINYIN, 54}, -{"cu", IS_BOPOMOFO|IS_PINYIN, 55}, -{"cuan", IS_BOPOMOFO|IS_PINYIN, 56}, -{"cui", IS_BOPOMOFO|IS_PINYIN, 57}, -{"cun", IS_BOPOMOFO|IS_PINYIN, 58}, -{"cuo", IS_BOPOMOFO|IS_PINYIN, 59}, -{"d", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 60}, -{"da", IS_BOPOMOFO|IS_PINYIN, 61}, -{"dai", IS_BOPOMOFO|IS_PINYIN, 62}, -{"dan", IS_BOPOMOFO|IS_PINYIN, 63}, -{"dang", IS_BOPOMOFO|IS_PINYIN, 64}, -{"dao", IS_BOPOMOFO|IS_PINYIN, 65}, -{"de", IS_BOPOMOFO|IS_PINYIN, 66}, -{"dei", IS_BOPOMOFO|IS_PINYIN, 67}, -{"deng", IS_BOPOMOFO|IS_PINYIN, 69}, -{"di", IS_BOPOMOFO|IS_PINYIN, 70}, -{"dia", IS_BOPOMOFO|IS_PINYIN, 71}, -{"dian", IS_BOPOMOFO|IS_PINYIN, 72}, -{"diao", IS_BOPOMOFO|IS_PINYIN, 73}, -{"die", IS_BOPOMOFO|IS_PINYIN, 74}, -{"ding", IS_BOPOMOFO|IS_PINYIN, 76}, -{"diu", IS_BOPOMOFO|IS_PINYIN, 77}, -{"dong", IS_BOPOMOFO|IS_PINYIN, 78}, -{"dou", IS_BOPOMOFO|IS_PINYIN, 79}, -{"du", IS_BOPOMOFO|IS_PINYIN, 80}, -{"duan", IS_BOPOMOFO|IS_PINYIN, 81}, -{"dui", IS_BOPOMOFO|IS_PINYIN, 82}, -{"dun", IS_BOPOMOFO|IS_PINYIN, 83}, -{"duo", IS_BOPOMOFO|IS_PINYIN, 84}, -{"e", IS_BOPOMOFO|IS_PINYIN, 85}, -{"ei", IS_BOPOMOFO|IS_PINYIN, 86}, -{"en", IS_BOPOMOFO|IS_PINYIN, 87}, -{"er", IS_BOPOMOFO|IS_PINYIN, 89}, -{"f", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 90}, -{"fa", IS_BOPOMOFO|IS_PINYIN, 91}, -{"fan", IS_BOPOMOFO|IS_PINYIN, 92}, -{"fang", IS_BOPOMOFO|IS_PINYIN, 93}, -{"fei", IS_BOPOMOFO|IS_PINYIN, 95}, -{"fen", IS_BOPOMOFO|IS_PINYIN, 96}, -{"feng", IS_BOPOMOFO|IS_PINYIN, 97}, -{"fo", IS_BOPOMOFO|IS_PINYIN, 98}, -{"fou", IS_BOPOMOFO|IS_PINYIN, 99}, -{"fu", IS_BOPOMOFO|IS_PINYIN, 100}, -{"g", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 101}, -{"ga", IS_BOPOMOFO|IS_PINYIN, 102}, -{"gai", IS_BOPOMOFO|IS_PINYIN, 103}, -{"gan", IS_BOPOMOFO|IS_PINYIN, 104}, -{"gang", IS_BOPOMOFO|IS_PINYIN, 105}, -{"gao", IS_BOPOMOFO|IS_PINYIN, 106}, -{"ge", IS_BOPOMOFO|IS_PINYIN, 107}, -{"gei", IS_BOPOMOFO|IS_PINYIN, 108}, -{"gen", IS_BOPOMOFO|IS_PINYIN, 109}, -{"geng", IS_BOPOMOFO|IS_PINYIN, 110}, -{"gong", IS_BOPOMOFO|IS_PINYIN, 111}, -{"gou", IS_BOPOMOFO|IS_PINYIN, 112}, -{"gu", IS_BOPOMOFO|IS_PINYIN, 113}, -{"gua", IS_BOPOMOFO|IS_PINYIN, 114}, -{"guai", IS_BOPOMOFO|IS_PINYIN, 115}, -{"guan", IS_BOPOMOFO|IS_PINYIN, 116}, -{"guang", IS_BOPOMOFO|IS_PINYIN, 117}, -{"gui", IS_BOPOMOFO|IS_PINYIN, 118}, -{"gun", IS_BOPOMOFO|IS_PINYIN, 119}, -{"guo", IS_BOPOMOFO|IS_PINYIN, 120}, -{"h", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 121}, -{"ha", IS_BOPOMOFO|IS_PINYIN, 122}, -{"hai", IS_BOPOMOFO|IS_PINYIN, 123}, -{"han", IS_BOPOMOFO|IS_PINYIN, 124}, -{"hang", IS_BOPOMOFO|IS_PINYIN, 125}, -{"hao", IS_BOPOMOFO|IS_PINYIN, 126}, -{"he", IS_BOPOMOFO|IS_PINYIN, 127}, -{"hei", IS_BOPOMOFO|IS_PINYIN, 128}, -{"hen", IS_BOPOMOFO|IS_PINYIN, 129}, -{"heng", IS_BOPOMOFO|IS_PINYIN, 130}, -{"hong", IS_BOPOMOFO|IS_PINYIN, 131}, -{"hou", IS_BOPOMOFO|IS_PINYIN, 132}, -{"hu", IS_BOPOMOFO|IS_PINYIN, 133}, -{"hua", IS_BOPOMOFO|IS_PINYIN, 134}, -{"huai", IS_BOPOMOFO|IS_PINYIN, 135}, -{"huan", IS_BOPOMOFO|IS_PINYIN, 136}, -{"huang", IS_BOPOMOFO|IS_PINYIN, 137}, -{"hui", IS_BOPOMOFO|IS_PINYIN, 138}, -{"hun", IS_BOPOMOFO|IS_PINYIN, 139}, -{"huo", IS_BOPOMOFO|IS_PINYIN, 140}, -{"j", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 141}, -{"ji", IS_BOPOMOFO|IS_PINYIN, 142}, -{"jia", IS_BOPOMOFO|IS_PINYIN, 143}, -{"jian", IS_BOPOMOFO|IS_PINYIN, 144}, -{"jiang", IS_BOPOMOFO|IS_PINYIN, 145}, -{"jiao", IS_BOPOMOFO|IS_PINYIN, 146}, -{"jie", IS_BOPOMOFO|IS_PINYIN, 147}, -{"jin", IS_BOPOMOFO|IS_PINYIN, 148}, -{"jing", IS_BOPOMOFO|IS_PINYIN, 149}, -{"jiong", IS_BOPOMOFO|IS_PINYIN, 150}, -{"jiu", IS_BOPOMOFO|IS_PINYIN, 151}, -{"ju", IS_BOPOMOFO|IS_PINYIN, 152}, -{"juan", IS_BOPOMOFO|IS_PINYIN, 153}, -{"jue", IS_BOPOMOFO|IS_PINYIN, 154}, -{"jun", IS_BOPOMOFO|IS_PINYIN, 155}, -{"k", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 156}, -{"ka", IS_BOPOMOFO|IS_PINYIN, 157}, -{"kai", IS_BOPOMOFO|IS_PINYIN, 158}, -{"kan", IS_BOPOMOFO|IS_PINYIN, 159}, -{"kang", IS_BOPOMOFO|IS_PINYIN, 160}, -{"kao", IS_BOPOMOFO|IS_PINYIN, 161}, -{"ke", IS_BOPOMOFO|IS_PINYIN, 162}, -{"ken", IS_BOPOMOFO|IS_PINYIN, 164}, -{"keng", IS_BOPOMOFO|IS_PINYIN, 165}, -{"kong", IS_BOPOMOFO|IS_PINYIN, 166}, -{"kou", IS_BOPOMOFO|IS_PINYIN, 167}, -{"ku", IS_BOPOMOFO|IS_PINYIN, 168}, -{"kua", IS_BOPOMOFO|IS_PINYIN, 169}, -{"kuai", IS_BOPOMOFO|IS_PINYIN, 170}, -{"kuan", IS_BOPOMOFO|IS_PINYIN, 171}, -{"kuang", IS_BOPOMOFO|IS_PINYIN, 172}, -{"kui", IS_BOPOMOFO|IS_PINYIN, 173}, -{"kun", IS_BOPOMOFO|IS_PINYIN, 174}, -{"kuo", IS_BOPOMOFO|IS_PINYIN, 175}, -{"l", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 176}, -{"la", IS_BOPOMOFO|IS_PINYIN, 177}, -{"lai", IS_BOPOMOFO|IS_PINYIN, 178}, -{"lan", IS_BOPOMOFO|IS_PINYIN, 179}, -{"lang", IS_BOPOMOFO|IS_PINYIN, 180}, -{"lao", IS_BOPOMOFO|IS_PINYIN, 181}, -{"le", IS_BOPOMOFO|IS_PINYIN, 182}, -{"lei", IS_BOPOMOFO|IS_PINYIN, 183}, -{"leng", IS_BOPOMOFO|IS_PINYIN, 185}, -{"li", IS_BOPOMOFO|IS_PINYIN, 186}, -{"lia", IS_BOPOMOFO|IS_PINYIN, 187}, -{"lian", IS_BOPOMOFO|IS_PINYIN, 188}, -{"liang", IS_BOPOMOFO|IS_PINYIN, 189}, -{"liao", IS_BOPOMOFO|IS_PINYIN, 190}, -{"lie", IS_BOPOMOFO|IS_PINYIN, 191}, -{"lin", IS_BOPOMOFO|IS_PINYIN, 192}, -{"ling", IS_BOPOMOFO|IS_PINYIN, 193}, -{"liu", IS_BOPOMOFO|IS_PINYIN, 194}, -{"lo", IS_BOPOMOFO|IS_PINYIN, 195}, -{"long", IS_BOPOMOFO|IS_PINYIN, 196}, -{"lou", IS_BOPOMOFO|IS_PINYIN, 197}, -{"lu", IS_BOPOMOFO|IS_PINYIN, 198}, -{"luan", IS_BOPOMOFO|IS_PINYIN, 199}, -{"lun", IS_BOPOMOFO|IS_PINYIN, 200}, -{"luo", IS_BOPOMOFO|IS_PINYIN, 201}, -{"lv", IS_BOPOMOFO|IS_PINYIN, 202}, -{"lve", IS_BOPOMOFO|IS_PINYIN, 203}, -{"m", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 204}, -{"ma", IS_BOPOMOFO|IS_PINYIN, 205}, -{"mai", IS_BOPOMOFO|IS_PINYIN, 206}, -{"man", IS_BOPOMOFO|IS_PINYIN, 207}, -{"mang", IS_BOPOMOFO|IS_PINYIN, 208}, -{"mao", IS_BOPOMOFO|IS_PINYIN, 209}, -{"me", IS_BOPOMOFO|IS_PINYIN, 210}, -{"mei", IS_BOPOMOFO|IS_PINYIN, 211}, -{"men", IS_BOPOMOFO|IS_PINYIN, 212}, -{"meng", IS_BOPOMOFO|IS_PINYIN, 213}, -{"mi", IS_BOPOMOFO|IS_PINYIN, 214}, -{"mian", IS_BOPOMOFO|IS_PINYIN, 215}, -{"miao", IS_BOPOMOFO|IS_PINYIN, 216}, -{"mie", IS_BOPOMOFO|IS_PINYIN, 217}, -{"min", IS_BOPOMOFO|IS_PINYIN, 218}, -{"ming", IS_BOPOMOFO|IS_PINYIN, 219}, -{"miu", IS_BOPOMOFO|IS_PINYIN, 220}, -{"mo", IS_BOPOMOFO|IS_PINYIN, 221}, -{"mou", IS_BOPOMOFO|IS_PINYIN, 222}, -{"mu", IS_BOPOMOFO|IS_PINYIN, 223}, -{"n", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 224}, -{"na", IS_BOPOMOFO|IS_PINYIN, 225}, -{"nai", IS_BOPOMOFO|IS_PINYIN, 226}, -{"nan", IS_BOPOMOFO|IS_PINYIN, 227}, -{"nang", IS_BOPOMOFO|IS_PINYIN, 228}, -{"nao", IS_BOPOMOFO|IS_PINYIN, 229}, -{"ne", IS_BOPOMOFO|IS_PINYIN, 230}, -{"nei", IS_BOPOMOFO|IS_PINYIN, 231}, -{"nen", IS_BOPOMOFO|IS_PINYIN, 232}, -{"neng", IS_BOPOMOFO|IS_PINYIN, 233}, -{"ng", IS_BOPOMOFO|IS_PINYIN, 234}, -{"ni", IS_BOPOMOFO|IS_PINYIN, 235}, -{"nian", IS_BOPOMOFO|IS_PINYIN, 237}, -{"niang", IS_BOPOMOFO|IS_PINYIN, 238}, -{"niao", IS_BOPOMOFO|IS_PINYIN, 239}, -{"nie", IS_BOPOMOFO|IS_PINYIN, 240}, -{"nin", IS_BOPOMOFO|IS_PINYIN, 241}, -{"ning", IS_BOPOMOFO|IS_PINYIN, 242}, -{"niu", IS_BOPOMOFO|IS_PINYIN, 243}, -{"nong", IS_BOPOMOFO|IS_PINYIN, 244}, -{"nou", IS_BOPOMOFO|IS_PINYIN, 245}, -{"nu", IS_BOPOMOFO|IS_PINYIN, 246}, -{"nuan", IS_BOPOMOFO|IS_PINYIN, 247}, -{"nuo", IS_BOPOMOFO|IS_PINYIN, 249}, -{"nv", IS_BOPOMOFO|IS_PINYIN, 250}, -{"nve", IS_BOPOMOFO|IS_PINYIN, 251}, -{"o", IS_BOPOMOFO|IS_PINYIN, 252}, -{"ou", IS_BOPOMOFO|IS_PINYIN, 253}, -{"p", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 254}, -{"pa", IS_BOPOMOFO|IS_PINYIN, 255}, -{"pai", IS_BOPOMOFO|IS_PINYIN, 256}, -{"pan", IS_BOPOMOFO|IS_PINYIN, 257}, -{"pang", IS_BOPOMOFO|IS_PINYIN, 258}, -{"pao", IS_BOPOMOFO|IS_PINYIN, 259}, -{"pei", IS_BOPOMOFO|IS_PINYIN, 260}, -{"pen", IS_BOPOMOFO|IS_PINYIN, 261}, -{"peng", IS_BOPOMOFO|IS_PINYIN, 262}, -{"pi", IS_BOPOMOFO|IS_PINYIN, 263}, -{"pian", IS_BOPOMOFO|IS_PINYIN, 264}, -{"piao", IS_BOPOMOFO|IS_PINYIN, 265}, -{"pie", IS_BOPOMOFO|IS_PINYIN, 266}, -{"pin", IS_BOPOMOFO|IS_PINYIN, 267}, -{"ping", IS_BOPOMOFO|IS_PINYIN, 268}, -{"po", IS_BOPOMOFO|IS_PINYIN, 269}, -{"pou", IS_BOPOMOFO|IS_PINYIN, 270}, -{"pu", IS_BOPOMOFO|IS_PINYIN, 271}, -{"q", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 272}, -{"qi", IS_BOPOMOFO|IS_PINYIN, 273}, -{"qia", IS_BOPOMOFO|IS_PINYIN, 274}, -{"qian", IS_BOPOMOFO|IS_PINYIN, 275}, -{"qiang", IS_BOPOMOFO|IS_PINYIN, 276}, -{"qiao", IS_BOPOMOFO|IS_PINYIN, 277}, -{"qie", IS_BOPOMOFO|IS_PINYIN, 278}, -{"qin", IS_BOPOMOFO|IS_PINYIN, 279}, -{"qing", IS_BOPOMOFO|IS_PINYIN, 280}, -{"qiong", IS_BOPOMOFO|IS_PINYIN, 281}, -{"qiu", IS_BOPOMOFO|IS_PINYIN, 282}, -{"qu", IS_BOPOMOFO|IS_PINYIN, 283}, -{"quan", IS_BOPOMOFO|IS_PINYIN, 284}, -{"que", IS_BOPOMOFO|IS_PINYIN, 285}, -{"qun", IS_BOPOMOFO|IS_PINYIN, 286}, -{"r", IS_PINYIN|PINYIN_INCOMPLETE, 287}, -{"ran", IS_BOPOMOFO|IS_PINYIN, 288}, -{"rang", IS_BOPOMOFO|IS_PINYIN, 289}, -{"rao", IS_BOPOMOFO|IS_PINYIN, 290}, -{"re", IS_BOPOMOFO|IS_PINYIN, 291}, -{"ren", IS_BOPOMOFO|IS_PINYIN, 292}, -{"reng", IS_BOPOMOFO|IS_PINYIN, 293}, -{"ri", IS_BOPOMOFO|IS_PINYIN, 294}, -{"rong", IS_BOPOMOFO|IS_PINYIN, 295}, -{"rou", IS_BOPOMOFO|IS_PINYIN, 296}, -{"ru", IS_BOPOMOFO|IS_PINYIN, 297}, -{"ruan", IS_BOPOMOFO|IS_PINYIN, 299}, -{"rui", IS_BOPOMOFO|IS_PINYIN, 300}, -{"run", IS_BOPOMOFO|IS_PINYIN, 301}, -{"ruo", IS_BOPOMOFO|IS_PINYIN, 302}, -{"s", IS_PINYIN|PINYIN_INCOMPLETE, 303}, -{"sa", IS_BOPOMOFO|IS_PINYIN, 304}, -{"sai", IS_BOPOMOFO|IS_PINYIN, 305}, -{"san", IS_BOPOMOFO|IS_PINYIN, 306}, -{"sang", IS_BOPOMOFO|IS_PINYIN, 307}, -{"sao", IS_BOPOMOFO|IS_PINYIN, 308}, -{"se", IS_BOPOMOFO|IS_PINYIN, 309}, -{"sen", IS_BOPOMOFO|IS_PINYIN, 310}, -{"seng", IS_BOPOMOFO|IS_PINYIN, 311}, -{"sh", IS_PINYIN|PINYIN_INCOMPLETE, 312}, -{"sha", IS_BOPOMOFO|IS_PINYIN, 313}, -{"shai", IS_BOPOMOFO|IS_PINYIN, 314}, -{"shan", IS_BOPOMOFO|IS_PINYIN, 315}, -{"shang", IS_BOPOMOFO|IS_PINYIN, 316}, -{"shao", IS_BOPOMOFO|IS_PINYIN, 317}, -{"she", IS_BOPOMOFO|IS_PINYIN, 318}, -{"shei", IS_BOPOMOFO|IS_PINYIN, 319}, -{"shen", IS_BOPOMOFO|IS_PINYIN, 320}, -{"sheng", IS_BOPOMOFO|IS_PINYIN, 321}, -{"shi", IS_BOPOMOFO|IS_PINYIN, 322}, -{"shou", IS_BOPOMOFO|IS_PINYIN, 323}, -{"shu", IS_BOPOMOFO|IS_PINYIN, 324}, -{"shua", IS_BOPOMOFO|IS_PINYIN, 325}, -{"shuai", IS_BOPOMOFO|IS_PINYIN, 326}, -{"shuan", IS_BOPOMOFO|IS_PINYIN, 327}, -{"shuang", IS_BOPOMOFO|IS_PINYIN, 328}, -{"shui", IS_BOPOMOFO|IS_PINYIN, 329}, -{"shun", IS_BOPOMOFO|IS_PINYIN, 330}, -{"shuo", IS_BOPOMOFO|IS_PINYIN, 331}, -{"si", IS_BOPOMOFO|IS_PINYIN, 332}, -{"song", IS_BOPOMOFO|IS_PINYIN, 333}, -{"sou", IS_BOPOMOFO|IS_PINYIN, 334}, -{"su", IS_BOPOMOFO|IS_PINYIN, 335}, -{"suan", IS_BOPOMOFO|IS_PINYIN, 336}, -{"sui", IS_BOPOMOFO|IS_PINYIN, 337}, -{"sun", IS_BOPOMOFO|IS_PINYIN, 338}, -{"suo", IS_BOPOMOFO|IS_PINYIN, 339}, -{"t", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 340}, -{"ta", IS_BOPOMOFO|IS_PINYIN, 341}, -{"tai", IS_BOPOMOFO|IS_PINYIN, 342}, -{"tan", IS_BOPOMOFO|IS_PINYIN, 343}, -{"tang", IS_BOPOMOFO|IS_PINYIN, 344}, -{"tao", IS_BOPOMOFO|IS_PINYIN, 345}, -{"te", IS_BOPOMOFO|IS_PINYIN, 346}, -{"teng", IS_BOPOMOFO|IS_PINYIN, 347}, -{"ti", IS_BOPOMOFO|IS_PINYIN, 348}, -{"tian", IS_BOPOMOFO|IS_PINYIN, 349}, -{"tiao", IS_BOPOMOFO|IS_PINYIN, 350}, -{"tie", IS_BOPOMOFO|IS_PINYIN, 351}, -{"ting", IS_BOPOMOFO|IS_PINYIN, 352}, -{"tong", IS_BOPOMOFO|IS_PINYIN, 353}, -{"tou", IS_BOPOMOFO|IS_PINYIN, 354}, -{"tu", IS_BOPOMOFO|IS_PINYIN, 355}, -{"tuan", IS_BOPOMOFO|IS_PINYIN, 356}, -{"tui", IS_BOPOMOFO|IS_PINYIN, 357}, -{"tun", IS_BOPOMOFO|IS_PINYIN, 358}, -{"tuo", IS_BOPOMOFO|IS_PINYIN, 359}, -{"w", IS_PINYIN|PINYIN_INCOMPLETE, 360}, -{"wa", IS_BOPOMOFO|IS_PINYIN, 361}, -{"wai", IS_BOPOMOFO|IS_PINYIN, 362}, -{"wan", IS_BOPOMOFO|IS_PINYIN, 363}, -{"wang", IS_BOPOMOFO|IS_PINYIN, 364}, -{"wei", IS_BOPOMOFO|IS_PINYIN, 365}, -{"wen", IS_BOPOMOFO|IS_PINYIN, 366}, -{"weng", IS_BOPOMOFO|IS_PINYIN, 367}, -{"wo", IS_BOPOMOFO|IS_PINYIN, 368}, -{"wu", IS_BOPOMOFO|IS_PINYIN, 369}, -{"x", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 370}, -{"xi", IS_BOPOMOFO|IS_PINYIN, 371}, -{"xia", IS_BOPOMOFO|IS_PINYIN, 372}, -{"xian", IS_BOPOMOFO|IS_PINYIN, 373}, -{"xiang", IS_BOPOMOFO|IS_PINYIN, 374}, -{"xiao", IS_BOPOMOFO|IS_PINYIN, 375}, -{"xie", IS_BOPOMOFO|IS_PINYIN, 376}, -{"xin", IS_BOPOMOFO|IS_PINYIN, 377}, -{"xing", IS_BOPOMOFO|IS_PINYIN, 378}, -{"xiong", IS_BOPOMOFO|IS_PINYIN, 379}, -{"xiu", IS_BOPOMOFO|IS_PINYIN, 380}, -{"xu", IS_BOPOMOFO|IS_PINYIN, 381}, -{"xuan", IS_BOPOMOFO|IS_PINYIN, 382}, -{"xue", IS_BOPOMOFO|IS_PINYIN, 383}, -{"xun", IS_BOPOMOFO|IS_PINYIN, 384}, -{"y", IS_PINYIN|PINYIN_INCOMPLETE, 385}, -{"ya", IS_BOPOMOFO|IS_PINYIN, 386}, -{"yan", IS_BOPOMOFO|IS_PINYIN, 388}, -{"yang", IS_BOPOMOFO|IS_PINYIN, 389}, -{"yao", IS_BOPOMOFO|IS_PINYIN, 390}, -{"ye", IS_BOPOMOFO|IS_PINYIN, 391}, -{"yi", IS_BOPOMOFO|IS_PINYIN, 392}, -{"yin", IS_BOPOMOFO|IS_PINYIN, 393}, -{"ying", IS_BOPOMOFO|IS_PINYIN, 394}, -{"yo", IS_BOPOMOFO|IS_PINYIN, 395}, -{"yong", IS_BOPOMOFO|IS_PINYIN, 396}, -{"you", IS_BOPOMOFO|IS_PINYIN, 397}, -{"yu", IS_BOPOMOFO|IS_PINYIN, 398}, -{"yuan", IS_BOPOMOFO|IS_PINYIN, 399}, -{"yue", IS_BOPOMOFO|IS_PINYIN, 400}, -{"yun", IS_BOPOMOFO|IS_PINYIN, 401}, -{"z", IS_PINYIN|PINYIN_INCOMPLETE, 402}, -{"za", IS_BOPOMOFO|IS_PINYIN, 403}, -{"zai", IS_BOPOMOFO|IS_PINYIN, 404}, -{"zan", IS_BOPOMOFO|IS_PINYIN, 405}, -{"zang", IS_BOPOMOFO|IS_PINYIN, 406}, -{"zao", IS_BOPOMOFO|IS_PINYIN, 407}, -{"ze", IS_BOPOMOFO|IS_PINYIN, 408}, -{"zei", IS_BOPOMOFO|IS_PINYIN, 409}, -{"zen", IS_BOPOMOFO|IS_PINYIN, 410}, -{"zeng", IS_BOPOMOFO|IS_PINYIN, 411}, -{"zh", IS_PINYIN|PINYIN_INCOMPLETE, 412}, -{"zha", IS_BOPOMOFO|IS_PINYIN, 413}, -{"zhai", IS_BOPOMOFO|IS_PINYIN, 414}, -{"zhan", IS_BOPOMOFO|IS_PINYIN, 415}, -{"zhang", IS_BOPOMOFO|IS_PINYIN, 416}, -{"zhao", IS_BOPOMOFO|IS_PINYIN, 417}, -{"zhe", IS_BOPOMOFO|IS_PINYIN, 418}, -{"zhen", IS_BOPOMOFO|IS_PINYIN, 420}, -{"zheng", IS_BOPOMOFO|IS_PINYIN, 421}, -{"zhi", IS_BOPOMOFO|IS_PINYIN, 422}, -{"zhong", IS_BOPOMOFO|IS_PINYIN, 423}, -{"zhou", IS_BOPOMOFO|IS_PINYIN, 424}, -{"zhu", IS_BOPOMOFO|IS_PINYIN, 425}, -{"zhua", IS_BOPOMOFO|IS_PINYIN, 426}, -{"zhuai", IS_BOPOMOFO|IS_PINYIN, 427}, -{"zhuan", IS_BOPOMOFO|IS_PINYIN, 428}, -{"zhuang", IS_BOPOMOFO|IS_PINYIN, 429}, -{"zhui", IS_BOPOMOFO|IS_PINYIN, 430}, -{"zhun", IS_BOPOMOFO|IS_PINYIN, 431}, -{"zhuo", IS_BOPOMOFO|IS_PINYIN, 432}, -{"zi", IS_BOPOMOFO|IS_PINYIN, 433}, -{"zong", IS_BOPOMOFO|IS_PINYIN, 434}, -{"zou", IS_BOPOMOFO|IS_PINYIN, 435}, -{"zu", IS_BOPOMOFO|IS_PINYIN, 436}, -{"zuan", IS_BOPOMOFO|IS_PINYIN, 437}, -{"zui", IS_BOPOMOFO|IS_PINYIN, 438}, -{"zun", IS_BOPOMOFO|IS_PINYIN, 439}, -{"zuo", IS_BOPOMOFO|IS_PINYIN, 440} -}; - -const pinyin_index_item_t luoma_pinyin_index[] = { -{"a", IS_PINYIN, 1}, -{"ai", IS_PINYIN, 2}, -{"an", IS_PINYIN, 3}, -{"ang", IS_PINYIN, 4}, -{"ao", IS_PINYIN, 5}, -{"ba", IS_PINYIN, 7}, -{"bai", IS_PINYIN, 8}, -{"ban", IS_PINYIN, 9}, -{"bang", IS_PINYIN, 10}, -{"bao", IS_PINYIN, 11}, -{"bei", IS_PINYIN, 12}, -{"ben", IS_PINYIN, 13}, -{"beng", IS_PINYIN, 14}, -{"bi", IS_PINYIN, 15}, -{"bian", IS_PINYIN, 16}, -{"biao", IS_PINYIN, 17}, -{"bieh", IS_PINYIN, 18}, -{"bin", IS_PINYIN, 19}, -{"bing", IS_PINYIN, 20}, -{"bo", IS_PINYIN, 21}, -{"bu", IS_PINYIN, 22}, -{"cha", IS_PINYIN, 33}, -{"chai", IS_PINYIN, 34}, -{"chan", IS_PINYIN, 35}, -{"chang", IS_PINYIN, 36}, -{"chao", IS_PINYIN, 37}, -{"che", IS_PINYIN, 38}, -{"chen", IS_PINYIN, 39}, -{"cheng", IS_PINYIN, 40}, -{"chi", IS_PINYIN, 273}, -{"chia", IS_PINYIN, 274}, -{"chian", IS_PINYIN, 275}, -{"chiang", IS_PINYIN, 276}, -{"chiao", IS_PINYIN, 277}, -{"chieh", IS_PINYIN, 278}, -{"chih", IS_PINYIN, 32}, -{"chin", IS_PINYIN, 279}, -{"ching", IS_PINYIN, 280}, -{"chiou", IS_PINYIN, 282}, -{"chong", IS_PINYIN, 42}, -{"chou", IS_PINYIN, 43}, -{"chu", IS_PINYIN, 44}, -{"chuai", IS_PINYIN, 46}, -{"chuan", IS_PINYIN, 47}, -{"chuang", IS_PINYIN, 48}, -{"chuei", IS_PINYIN, 49}, -{"chun", IS_PINYIN, 50}, -{"chuo", IS_PINYIN, 51}, -{"chyong", IS_PINYIN, 281}, -{"chyu", IS_PINYIN, 283}, -{"chyuan", IS_PINYIN, 284}, -{"chyueh", IS_PINYIN, 285}, -{"chyun", IS_PINYIN, 286}, -{"da", IS_PINYIN, 61}, -{"dai", IS_PINYIN, 62}, -{"dan", IS_PINYIN, 63}, -{"dang", IS_PINYIN, 64}, -{"dao", IS_PINYIN, 65}, -{"de", IS_PINYIN, 66}, -{"dei", IS_PINYIN, 67}, -{"deng", IS_PINYIN, 69}, -{"di", IS_PINYIN, 70}, -{"dian", IS_PINYIN, 72}, -{"diao", IS_PINYIN, 73}, -{"dieh", IS_PINYIN, 74}, -{"ding", IS_PINYIN, 76}, -{"diou", IS_PINYIN, 77}, -{"dong", IS_PINYIN, 78}, -{"dou", IS_PINYIN, 79}, -{"du", IS_PINYIN, 80}, -{"duan", IS_PINYIN, 81}, -{"duei", IS_PINYIN, 82}, -{"dun", IS_PINYIN, 83}, -{"duo", IS_PINYIN, 84}, -{"e", IS_PINYIN, 85}, -{"ei", IS_PINYIN, 86}, -{"en", IS_PINYIN, 87}, -{"eng", IS_PINYIN, 88}, -{"er", IS_PINYIN, 89}, -{"fa", IS_PINYIN, 91}, -{"fan", IS_PINYIN, 92}, -{"fang", IS_PINYIN, 93}, -{"fei", IS_PINYIN, 95}, -{"fen", IS_PINYIN, 96}, -{"fo", IS_PINYIN, 98}, -{"fou", IS_PINYIN, 99}, -{"fu", IS_PINYIN, 100}, -{"ga", IS_PINYIN, 102}, -{"gai", IS_PINYIN, 103}, -{"gan", IS_PINYIN, 104}, -{"gang", IS_PINYIN, 105}, -{"gao", IS_PINYIN, 106}, -{"ge", IS_PINYIN, 107}, -{"gei", IS_PINYIN, 108}, -{"gen", IS_PINYIN, 109}, -{"geng", IS_PINYIN, 110}, -{"gong", IS_PINYIN, 111}, -{"gou", IS_PINYIN, 112}, -{"gu", IS_PINYIN, 113}, -{"gua", IS_PINYIN, 114}, -{"guai", IS_PINYIN, 115}, -{"guan", IS_PINYIN, 116}, -{"guang", IS_PINYIN, 117}, -{"guei", IS_PINYIN, 118}, -{"gun", IS_PINYIN, 119}, -{"guo", IS_PINYIN, 120}, -{"ha", IS_PINYIN, 122}, -{"hai", IS_PINYIN, 123}, -{"han", IS_PINYIN, 124}, -{"hang", IS_PINYIN, 125}, -{"hao", IS_PINYIN, 126}, -{"he", IS_PINYIN, 127}, -{"hei", IS_PINYIN, 128}, -{"hen", IS_PINYIN, 129}, -{"heng", IS_PINYIN, 130}, -{"hong", IS_PINYIN, 131}, -{"hou", IS_PINYIN, 132}, -{"hu", IS_PINYIN, 133}, -{"hua", IS_PINYIN, 134}, -{"huai", IS_PINYIN, 135}, -{"huan", IS_PINYIN, 136}, -{"huang", IS_PINYIN, 137}, -{"huei", IS_PINYIN, 138}, -{"hun", IS_PINYIN, 139}, -{"huo", IS_PINYIN, 140}, -{"jha", IS_PINYIN, 413}, -{"jhai", IS_PINYIN, 414}, -{"jhan", IS_PINYIN, 415}, -{"jhang", IS_PINYIN, 416}, -{"jhao", IS_PINYIN, 417}, -{"jhe", IS_PINYIN, 418}, -{"jhei", IS_PINYIN, 419}, -{"jhen", IS_PINYIN, 420}, -{"jheng", IS_PINYIN, 421}, -{"jhih", IS_PINYIN, 412}, -{"jhong", IS_PINYIN, 423}, -{"jhou", IS_PINYIN, 424}, -{"jhu", IS_PINYIN, 425}, -{"jhua", IS_PINYIN, 426}, -{"jhuai", IS_PINYIN, 427}, -{"jhuan", IS_PINYIN, 428}, -{"jhuang", IS_PINYIN, 429}, -{"jhuei", IS_PINYIN, 430}, -{"jhun", IS_PINYIN, 431}, -{"jhuo", IS_PINYIN, 432}, -{"ji", IS_PINYIN, 142}, -{"jia", IS_PINYIN, 143}, -{"jian", IS_PINYIN, 144}, -{"jiang", IS_PINYIN, 145}, -{"jiao", IS_PINYIN, 146}, -{"jieh", IS_PINYIN, 147}, -{"jin", IS_PINYIN, 148}, -{"jing", IS_PINYIN, 149}, -{"jiou", IS_PINYIN, 151}, -{"jyong", IS_PINYIN, 150}, -{"jyu", IS_PINYIN, 152}, -{"jyuan", IS_PINYIN, 153}, -{"jyueh", IS_PINYIN, 154}, -{"jyun", IS_PINYIN, 155}, -{"ka", IS_PINYIN, 157}, -{"kai", IS_PINYIN, 158}, -{"kan", IS_PINYIN, 159}, -{"kang", IS_PINYIN, 160}, -{"kao", IS_PINYIN, 161}, -{"ke", IS_PINYIN, 162}, -{"ken", IS_PINYIN, 164}, -{"keng", IS_PINYIN, 165}, -{"kong", IS_PINYIN, 166}, -{"kou", IS_PINYIN, 167}, -{"ku", IS_PINYIN, 168}, -{"kua", IS_PINYIN, 169}, -{"kuai", IS_PINYIN, 170}, -{"kuan", IS_PINYIN, 171}, -{"kuang", IS_PINYIN, 172}, -{"kuei", IS_PINYIN, 173}, -{"kun", IS_PINYIN, 174}, -{"kuo", IS_PINYIN, 175}, -{"la", IS_PINYIN, 177}, -{"lai", IS_PINYIN, 178}, -{"lan", IS_PINYIN, 179}, -{"lang", IS_PINYIN, 180}, -{"lao", IS_PINYIN, 181}, -{"le", IS_PINYIN, 182}, -{"lei", IS_PINYIN, 183}, -{"leng", IS_PINYIN, 185}, -{"li", IS_PINYIN, 186}, -{"lia", IS_PINYIN, 187}, -{"lian", IS_PINYIN, 188}, -{"liang", IS_PINYIN, 189}, -{"liao", IS_PINYIN, 190}, -{"lieh", IS_PINYIN, 191}, -{"lin", IS_PINYIN, 192}, -{"ling", IS_PINYIN, 193}, -{"liou", IS_PINYIN, 194}, -{"lo", IS_PINYIN, 195}, -{"long", IS_PINYIN, 196}, -{"lou", IS_PINYIN, 197}, -{"lu", IS_PINYIN, 198}, -{"luan", IS_PINYIN, 199}, -{"lun", IS_PINYIN, 200}, -{"luo", IS_PINYIN, 201}, -{"lyu", IS_PINYIN, 202}, -{"lyueh", IS_PINYIN, 203}, -{"ma", IS_PINYIN, 205}, -{"mai", IS_PINYIN, 206}, -{"man", IS_PINYIN, 207}, -{"mang", IS_PINYIN, 208}, -{"mao", IS_PINYIN, 209}, -{"me", IS_PINYIN, 210}, -{"mei", IS_PINYIN, 211}, -{"men", IS_PINYIN, 212}, -{"meng", IS_PINYIN, 213}, -{"mi", IS_PINYIN, 214}, -{"mian", IS_PINYIN, 215}, -{"miao", IS_PINYIN, 216}, -{"mieh", IS_PINYIN, 217}, -{"min", IS_PINYIN, 218}, -{"ming", IS_PINYIN, 219}, -{"miou", IS_PINYIN, 220}, -{"mo", IS_PINYIN, 221}, -{"mou", IS_PINYIN, 222}, -{"mu", IS_PINYIN, 223}, -{"na", IS_PINYIN, 225}, -{"nai", IS_PINYIN, 226}, -{"nan", IS_PINYIN, 227}, -{"nang", IS_PINYIN, 228}, -{"nao", IS_PINYIN, 229}, -{"ne", IS_PINYIN, 230}, -{"nei", IS_PINYIN, 231}, -{"nen", IS_PINYIN, 232}, -{"neng", IS_PINYIN, 233}, -{"ni", IS_PINYIN, 235}, -{"nian", IS_PINYIN, 237}, -{"niang", IS_PINYIN, 238}, -{"niao", IS_PINYIN, 239}, -{"nieh", IS_PINYIN, 240}, -{"nin", IS_PINYIN, 241}, -{"ning", IS_PINYIN, 242}, -{"niou", IS_PINYIN, 243}, -{"nong", IS_PINYIN, 244}, -{"nou", IS_PINYIN, 245}, -{"nu", IS_PINYIN, 246}, -{"nuan", IS_PINYIN, 247}, -{"nun", IS_PINYIN, 248}, -{"nuo", IS_PINYIN, 249}, -{"nyu", IS_PINYIN, 250}, -{"nyueh", IS_PINYIN, 251}, -{"o", IS_PINYIN, 252}, -{"ou", IS_PINYIN, 253}, -{"pa", IS_PINYIN, 255}, -{"pai", IS_PINYIN, 256}, -{"pan", IS_PINYIN, 257}, -{"pang", IS_PINYIN, 258}, -{"pao", IS_PINYIN, 259}, -{"pei", IS_PINYIN, 260}, -{"pen", IS_PINYIN, 261}, -{"peng", IS_PINYIN, 262}, -{"pi", IS_PINYIN, 263}, -{"pian", IS_PINYIN, 264}, -{"piao", IS_PINYIN, 265}, -{"pieh", IS_PINYIN, 266}, -{"pin", IS_PINYIN, 267}, -{"ping", IS_PINYIN, 268}, -{"po", IS_PINYIN, 269}, -{"pou", IS_PINYIN, 270}, -{"pu", IS_PINYIN, 271}, -{"ran", IS_PINYIN, 288}, -{"rang", IS_PINYIN, 289}, -{"rao", IS_PINYIN, 290}, -{"re", IS_PINYIN, 291}, -{"ren", IS_PINYIN, 292}, -{"reng", IS_PINYIN, 293}, -{"rih", IS_PINYIN, 287}, -{"rong", IS_PINYIN, 295}, -{"rou", IS_PINYIN, 296}, -{"ru", IS_PINYIN, 297}, -{"ruan", IS_PINYIN, 299}, -{"ruei", IS_PINYIN, 300}, -{"run", IS_PINYIN, 301}, -{"ruo", IS_PINYIN, 302}, -{"sa", IS_PINYIN, 304}, -{"sai", IS_PINYIN, 305}, -{"san", IS_PINYIN, 306}, -{"sang", IS_PINYIN, 307}, -{"sao", IS_PINYIN, 308}, -{"se", IS_PINYIN, 309}, -{"sen", IS_PINYIN, 310}, -{"seng", IS_PINYIN, 311}, -{"sha", IS_PINYIN, 313}, -{"shai", IS_PINYIN, 314}, -{"shan", IS_PINYIN, 315}, -{"shang", IS_PINYIN, 316}, -{"shao", IS_PINYIN, 317}, -{"she", IS_PINYIN, 318}, -{"shei", IS_PINYIN, 319}, -{"shen", IS_PINYIN, 320}, -{"sheng", IS_PINYIN, 321}, -{"shih", IS_PINYIN, 312}, -{"shou", IS_PINYIN, 323}, -{"shu", IS_PINYIN, 324}, -{"shua", IS_PINYIN, 325}, -{"shuai", IS_PINYIN, 326}, -{"shuan", IS_PINYIN, 327}, -{"shuang", IS_PINYIN, 328}, -{"shuei", IS_PINYIN, 329}, -{"shun", IS_PINYIN, 330}, -{"shuo", IS_PINYIN, 331}, -{"si", IS_PINYIN, 371}, -{"sia", IS_PINYIN, 372}, -{"sian", IS_PINYIN, 373}, -{"siang", IS_PINYIN, 374}, -{"siao", IS_PINYIN, 375}, -{"sieh", IS_PINYIN, 376}, -{"sih", IS_PINYIN, 303}, -{"sin", IS_PINYIN, 377}, -{"sing", IS_PINYIN, 378}, -{"siou", IS_PINYIN, 380}, -{"song", IS_PINYIN, 333}, -{"sou", IS_PINYIN, 334}, -{"su", IS_PINYIN, 335}, -{"suan", IS_PINYIN, 336}, -{"suei", IS_PINYIN, 337}, -{"sun", IS_PINYIN, 338}, -{"suo", IS_PINYIN, 339}, -{"syong", IS_PINYIN, 379}, -{"syu", IS_PINYIN, 381}, -{"syuan", IS_PINYIN, 382}, -{"syueh", IS_PINYIN, 383}, -{"syun", IS_PINYIN, 384}, -{"ta", IS_PINYIN, 341}, -{"tai", IS_PINYIN, 342}, -{"tan", IS_PINYIN, 343}, -{"tang", IS_PINYIN, 344}, -{"tao", IS_PINYIN, 345}, -{"te", IS_PINYIN, 346}, -{"teng", IS_PINYIN, 347}, -{"ti", IS_PINYIN, 348}, -{"tian", IS_PINYIN, 349}, -{"tiao", IS_PINYIN, 350}, -{"tieh", IS_PINYIN, 351}, -{"ting", IS_PINYIN, 352}, -{"tong", IS_PINYIN, 353}, -{"tou", IS_PINYIN, 354}, -{"tsa", IS_PINYIN, 24}, -{"tsai", IS_PINYIN, 25}, -{"tsan", IS_PINYIN, 26}, -{"tsang", IS_PINYIN, 27}, -{"tsao", IS_PINYIN, 28}, -{"tse", IS_PINYIN, 29}, -{"tsen", IS_PINYIN, 30}, -{"tseng", IS_PINYIN, 31}, -{"tsih", IS_PINYIN, 23}, -{"tsong", IS_PINYIN, 53}, -{"tsou", IS_PINYIN, 54}, -{"tsu", IS_PINYIN, 55}, -{"tsuan", IS_PINYIN, 56}, -{"tsuei", IS_PINYIN, 57}, -{"tsun", IS_PINYIN, 58}, -{"tsuo", IS_PINYIN, 59}, -{"tu", IS_PINYIN, 355}, -{"tuan", IS_PINYIN, 356}, -{"tuei", IS_PINYIN, 357}, -{"tun", IS_PINYIN, 358}, -{"tuo", IS_PINYIN, 359}, -{"wa", IS_PINYIN, 361}, -{"wai", IS_PINYIN, 362}, -{"wan", IS_PINYIN, 363}, -{"wang", IS_PINYIN, 364}, -{"wei", IS_PINYIN, 365}, -{"wo", IS_PINYIN, 368}, -{"wong", IS_PINYIN, 367}, -{"wu", IS_PINYIN, 369}, -{"wun", IS_PINYIN, 366}, -{"ya", IS_PINYIN, 386}, -{"yai", IS_PINYIN, 387}, -{"yan", IS_PINYIN, 388}, -{"yang", IS_PINYIN, 389}, -{"yao", IS_PINYIN, 390}, -{"yeh", IS_PINYIN, 391}, -{"yi", IS_PINYIN, 392}, -{"yin", IS_PINYIN, 393}, -{"ying", IS_PINYIN, 394}, -{"yo", IS_PINYIN, 395}, -{"yong", IS_PINYIN, 396}, -{"you", IS_PINYIN, 397}, -{"yu", IS_PINYIN, 398}, -{"yuan", IS_PINYIN, 399}, -{"yueh", IS_PINYIN, 400}, -{"yun", IS_PINYIN, 401}, -{"za", IS_PINYIN, 403}, -{"zai", IS_PINYIN, 404}, -{"zan", IS_PINYIN, 405}, -{"zang", IS_PINYIN, 406}, -{"zao", IS_PINYIN, 407}, -{"ze", IS_PINYIN, 408}, -{"zei", IS_PINYIN, 409}, -{"zen", IS_PINYIN, 410}, -{"zeng", IS_PINYIN, 411}, -{"zih", IS_PINYIN, 402}, -{"zong", IS_PINYIN, 434}, -{"zou", IS_PINYIN, 435}, -{"zu", IS_PINYIN, 436}, -{"zuan", IS_PINYIN, 437}, -{"zuei", IS_PINYIN, 438}, -{"zun", IS_PINYIN, 439}, -{"zuo", IS_PINYIN, 440} -}; - -const chewing_index_item_t bopomofo_index[] = { -{"ㄅ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 6}, -{"ㄅㄚ", IS_BOPOMOFO|IS_PINYIN, 7}, -{"ㄅㄛ", IS_BOPOMOFO|IS_PINYIN, 21}, -{"ㄅㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 18}, -{"ㄅㄞ", IS_BOPOMOFO|IS_PINYIN, 8}, -{"ㄅㄟ", IS_BOPOMOFO|IS_PINYIN, 12}, -{"ㄅㄠ", IS_BOPOMOFO|IS_PINYIN, 11}, -{"ㄅㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 17}, -{"ㄅㄢ", IS_BOPOMOFO|IS_PINYIN, 9}, -{"ㄅㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 16}, -{"ㄅㄣ", IS_BOPOMOFO|IS_PINYIN, 13}, -{"ㄅㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 19}, -{"ㄅㄤ", IS_BOPOMOFO|IS_PINYIN, 10}, -{"ㄅㄥ", IS_BOPOMOFO|IS_PINYIN, 14}, -{"ㄅㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 20}, -{"ㄅㄧ", IS_BOPOMOFO|IS_PINYIN, 15}, -{"ㄅㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 18}, -{"ㄅㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 17}, -{"ㄅㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 16}, -{"ㄅㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 19}, -{"ㄅㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 20}, -{"ㄅㄨ", IS_BOPOMOFO|IS_PINYIN, 22}, -{"ㄆ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 254}, -{"ㄆㄚ", IS_BOPOMOFO|IS_PINYIN, 255}, -{"ㄆㄛ", IS_BOPOMOFO|IS_PINYIN, 269}, -{"ㄆㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 266}, -{"ㄆㄞ", IS_BOPOMOFO|IS_PINYIN, 256}, -{"ㄆㄟ", IS_BOPOMOFO|IS_PINYIN, 260}, -{"ㄆㄠ", IS_BOPOMOFO|IS_PINYIN, 259}, -{"ㄆㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 265}, -{"ㄆㄡ", IS_BOPOMOFO|IS_PINYIN, 270}, -{"ㄆㄢ", IS_BOPOMOFO|IS_PINYIN, 257}, -{"ㄆㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 264}, -{"ㄆㄣ", IS_BOPOMOFO|IS_PINYIN, 261}, -{"ㄆㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 267}, -{"ㄆㄤ", IS_BOPOMOFO|IS_PINYIN, 258}, -{"ㄆㄥ", IS_BOPOMOFO|IS_PINYIN, 262}, -{"ㄆㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 268}, -{"ㄆㄧ", IS_BOPOMOFO|IS_PINYIN, 263}, -{"ㄆㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 266}, -{"ㄆㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 265}, -{"ㄆㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 264}, -{"ㄆㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 267}, -{"ㄆㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 268}, -{"ㄆㄨ", IS_BOPOMOFO|IS_PINYIN, 271}, -{"ㄇ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 204}, -{"ㄇㄚ", IS_BOPOMOFO|IS_PINYIN, 205}, -{"ㄇㄛ", IS_BOPOMOFO|IS_PINYIN, 221}, -{"ㄇㄜ", IS_BOPOMOFO|IS_PINYIN, 210}, -{"ㄇㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 217}, -{"ㄇㄞ", IS_BOPOMOFO|IS_PINYIN, 206}, -{"ㄇㄟ", IS_BOPOMOFO|IS_PINYIN, 211}, -{"ㄇㄠ", IS_BOPOMOFO|IS_PINYIN, 209}, -{"ㄇㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 216}, -{"ㄇㄡ", IS_BOPOMOFO|IS_PINYIN, 222}, -{"ㄇㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 220}, -{"ㄇㄢ", IS_BOPOMOFO|IS_PINYIN, 207}, -{"ㄇㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 215}, -{"ㄇㄣ", IS_BOPOMOFO|IS_PINYIN, 212}, -{"ㄇㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 218}, -{"ㄇㄤ", IS_BOPOMOFO|IS_PINYIN, 208}, -{"ㄇㄥ", IS_BOPOMOFO|IS_PINYIN, 213}, -{"ㄇㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 219}, -{"ㄇㄧ", IS_BOPOMOFO|IS_PINYIN, 214}, -{"ㄇㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 217}, -{"ㄇㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 216}, -{"ㄇㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 220}, -{"ㄇㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 215}, -{"ㄇㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 218}, -{"ㄇㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 219}, -{"ㄇㄨ", IS_BOPOMOFO|IS_PINYIN, 223}, -{"ㄈ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 90}, -{"ㄈㄚ", IS_BOPOMOFO|IS_PINYIN, 91}, -{"ㄈㄛ", IS_BOPOMOFO|IS_PINYIN, 98}, -{"ㄈㄜ", IS_BOPOMOFO, 94}, -{"ㄈㄟ", IS_BOPOMOFO|IS_PINYIN, 95}, -{"ㄈㄡ", IS_BOPOMOFO|IS_PINYIN, 99}, -{"ㄈㄢ", IS_BOPOMOFO|IS_PINYIN, 92}, -{"ㄈㄣ", IS_BOPOMOFO|IS_PINYIN, 96}, -{"ㄈㄤ", IS_BOPOMOFO|IS_PINYIN, 93}, -{"ㄈㄥ", IS_BOPOMOFO|IS_PINYIN, 97}, -{"ㄈㄨ", IS_BOPOMOFO|IS_PINYIN, 100}, -{"ㄉ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 60}, -{"ㄉㄚ", IS_BOPOMOFO|IS_PINYIN, 61}, -{"ㄉㄚㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 71}, -{"ㄉㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 84}, -{"ㄉㄜ", IS_BOPOMOFO|IS_PINYIN, 66}, -{"ㄉㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 74}, -{"ㄉㄞ", IS_BOPOMOFO|IS_PINYIN, 62}, -{"ㄉㄟ", IS_BOPOMOFO|IS_PINYIN, 67}, -{"ㄉㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 82}, -{"ㄉㄠ", IS_BOPOMOFO|IS_PINYIN, 65}, -{"ㄉㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 73}, -{"ㄉㄡ", IS_BOPOMOFO|IS_PINYIN, 79}, -{"ㄉㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 77}, -{"ㄉㄢ", IS_BOPOMOFO|IS_PINYIN, 63}, -{"ㄉㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 72}, -{"ㄉㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 81}, -{"ㄉㄣ", IS_BOPOMOFO, 68}, -{"ㄉㄣㄧ", IS_BOPOMOFO|SHUFFLE_CORRECT, 75}, -{"ㄉㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 83}, -{"ㄉㄤ", IS_BOPOMOFO|IS_PINYIN, 64}, -{"ㄉㄥ", IS_BOPOMOFO|IS_PINYIN, 69}, -{"ㄉㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 76}, -{"ㄉㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 78}, -{"ㄉㄧ", IS_BOPOMOFO|IS_PINYIN, 70}, -{"ㄉㄧㄚ", IS_BOPOMOFO|IS_PINYIN, 71}, -{"ㄉㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 74}, -{"ㄉㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 73}, -{"ㄉㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 77}, -{"ㄉㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 72}, -{"ㄉㄧㄣ", IS_BOPOMOFO, 75}, -{"ㄉㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 76}, -{"ㄉㄨ", IS_BOPOMOFO|IS_PINYIN, 80}, -{"ㄉㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 84}, -{"ㄉㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 82}, -{"ㄉㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 81}, -{"ㄉㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 83}, -{"ㄉㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 78}, -{"ㄊ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 340}, -{"ㄊㄚ", IS_BOPOMOFO|IS_PINYIN, 341}, -{"ㄊㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 359}, -{"ㄊㄜ", IS_BOPOMOFO|IS_PINYIN, 346}, -{"ㄊㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 351}, -{"ㄊㄞ", IS_BOPOMOFO|IS_PINYIN, 342}, -{"ㄊㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 357}, -{"ㄊㄠ", IS_BOPOMOFO|IS_PINYIN, 345}, -{"ㄊㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 350}, -{"ㄊㄡ", IS_BOPOMOFO|IS_PINYIN, 354}, -{"ㄊㄢ", IS_BOPOMOFO|IS_PINYIN, 343}, -{"ㄊㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 349}, -{"ㄊㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 356}, -{"ㄊㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 358}, -{"ㄊㄤ", IS_BOPOMOFO|IS_PINYIN, 344}, -{"ㄊㄥ", IS_BOPOMOFO|IS_PINYIN, 347}, -{"ㄊㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 352}, -{"ㄊㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 353}, -{"ㄊㄧ", IS_BOPOMOFO|IS_PINYIN, 348}, -{"ㄊㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 351}, -{"ㄊㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 350}, -{"ㄊㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 349}, -{"ㄊㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 352}, -{"ㄊㄨ", IS_BOPOMOFO|IS_PINYIN, 355}, -{"ㄊㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 359}, -{"ㄊㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 357}, -{"ㄊㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 356}, -{"ㄊㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 358}, -{"ㄊㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 353}, -{"ㄋ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 224}, -{"ㄋㄚ", IS_BOPOMOFO|IS_PINYIN, 225}, -{"ㄋㄚㄧ", IS_BOPOMOFO|SHUFFLE_CORRECT, 236}, -{"ㄋㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 249}, -{"ㄋㄜ", IS_BOPOMOFO|IS_PINYIN, 230}, -{"ㄋㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 240}, -{"ㄋㄝㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 251}, -{"ㄋㄞ", IS_BOPOMOFO|IS_PINYIN, 226}, -{"ㄋㄟ", IS_BOPOMOFO|IS_PINYIN, 231}, -{"ㄋㄠ", IS_BOPOMOFO|IS_PINYIN, 229}, -{"ㄋㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 239}, -{"ㄋㄡ", IS_BOPOMOFO|IS_PINYIN, 245}, -{"ㄋㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 243}, -{"ㄋㄢ", IS_BOPOMOFO|IS_PINYIN, 227}, -{"ㄋㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 237}, -{"ㄋㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 247}, -{"ㄋㄣ", IS_BOPOMOFO|IS_PINYIN, 232}, -{"ㄋㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 241}, -{"ㄋㄣㄨ", IS_BOPOMOFO|SHUFFLE_CORRECT, 248}, -{"ㄋㄤ", IS_BOPOMOFO|IS_PINYIN, 228}, -{"ㄋㄤㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 238}, -{"ㄋㄥ", IS_BOPOMOFO|IS_PINYIN, 233}, -{"ㄋㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 242}, -{"ㄋㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 244}, -{"ㄋㄧ", IS_BOPOMOFO|IS_PINYIN, 235}, -{"ㄋㄧㄚ", IS_BOPOMOFO, 236}, -{"ㄋㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 240}, -{"ㄋㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 239}, -{"ㄋㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 243}, -{"ㄋㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 237}, -{"ㄋㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 241}, -{"ㄋㄧㄤ", IS_BOPOMOFO|IS_PINYIN, 238}, -{"ㄋㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 242}, -{"ㄋㄨ", IS_BOPOMOFO|IS_PINYIN, 246}, -{"ㄋㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 249}, -{"ㄋㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 247}, -{"ㄋㄨㄣ", IS_BOPOMOFO, 248}, -{"ㄋㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 244}, -{"ㄋㄩ", IS_BOPOMOFO|IS_PINYIN, 250}, -{"ㄋㄩㄝ", IS_BOPOMOFO|IS_PINYIN, 251}, -{"ㄌ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 176}, -{"ㄌㄚ", IS_BOPOMOFO|IS_PINYIN, 177}, -{"ㄌㄚㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 187}, -{"ㄌㄛ", IS_BOPOMOFO|IS_PINYIN, 195}, -{"ㄌㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 201}, -{"ㄌㄜ", IS_BOPOMOFO|IS_PINYIN, 182}, -{"ㄌㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 191}, -{"ㄌㄝㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 203}, -{"ㄌㄞ", IS_BOPOMOFO|IS_PINYIN, 178}, -{"ㄌㄟ", IS_BOPOMOFO|IS_PINYIN, 183}, -{"ㄌㄠ", IS_BOPOMOFO|IS_PINYIN, 181}, -{"ㄌㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 190}, -{"ㄌㄡ", IS_BOPOMOFO|IS_PINYIN, 197}, -{"ㄌㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 194}, -{"ㄌㄢ", IS_BOPOMOFO|IS_PINYIN, 179}, -{"ㄌㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 188}, -{"ㄌㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 199}, -{"ㄌㄣ", IS_BOPOMOFO, 184}, -{"ㄌㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 192}, -{"ㄌㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 200}, -{"ㄌㄤ", IS_BOPOMOFO|IS_PINYIN, 180}, -{"ㄌㄤㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 189}, -{"ㄌㄥ", IS_BOPOMOFO|IS_PINYIN, 185}, -{"ㄌㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 193}, -{"ㄌㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 196}, -{"ㄌㄧ", IS_BOPOMOFO|IS_PINYIN, 186}, -{"ㄌㄧㄚ", IS_BOPOMOFO|IS_PINYIN, 187}, -{"ㄌㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 191}, -{"ㄌㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 190}, -{"ㄌㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 194}, -{"ㄌㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 188}, -{"ㄌㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 192}, -{"ㄌㄧㄤ", IS_BOPOMOFO|IS_PINYIN, 189}, -{"ㄌㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 193}, -{"ㄌㄨ", IS_BOPOMOFO|IS_PINYIN, 198}, -{"ㄌㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 201}, -{"ㄌㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 199}, -{"ㄌㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 200}, -{"ㄌㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 196}, -{"ㄌㄩ", IS_BOPOMOFO|IS_PINYIN, 202}, -{"ㄌㄩㄝ", IS_BOPOMOFO|IS_PINYIN, 203}, -{"ㄍ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 101}, -{"ㄍㄚ", IS_BOPOMOFO|IS_PINYIN, 102}, -{"ㄍㄚㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 114}, -{"ㄍㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 120}, -{"ㄍㄜ", IS_BOPOMOFO|IS_PINYIN, 107}, -{"ㄍㄞ", IS_BOPOMOFO|IS_PINYIN, 103}, -{"ㄍㄞㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 115}, -{"ㄍㄟ", IS_BOPOMOFO|IS_PINYIN, 108}, -{"ㄍㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 118}, -{"ㄍㄠ", IS_BOPOMOFO|IS_PINYIN, 106}, -{"ㄍㄡ", IS_BOPOMOFO|IS_PINYIN, 112}, -{"ㄍㄢ", IS_BOPOMOFO|IS_PINYIN, 104}, -{"ㄍㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 116}, -{"ㄍㄣ", IS_BOPOMOFO|IS_PINYIN, 109}, -{"ㄍㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 119}, -{"ㄍㄤ", IS_BOPOMOFO|IS_PINYIN, 105}, -{"ㄍㄤㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 117}, -{"ㄍㄥ", IS_BOPOMOFO|IS_PINYIN, 110}, -{"ㄍㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 111}, -{"ㄍㄨ", IS_BOPOMOFO|IS_PINYIN, 113}, -{"ㄍㄨㄚ", IS_BOPOMOFO|IS_PINYIN, 114}, -{"ㄍㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 120}, -{"ㄍㄨㄞ", IS_BOPOMOFO|IS_PINYIN, 115}, -{"ㄍㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 118}, -{"ㄍㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 116}, -{"ㄍㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 119}, -{"ㄍㄨㄤ", IS_BOPOMOFO|IS_PINYIN, 117}, -{"ㄍㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 111}, -{"ㄎ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 156}, -{"ㄎㄚ", IS_BOPOMOFO|IS_PINYIN, 157}, -{"ㄎㄚㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 169}, -{"ㄎㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 175}, -{"ㄎㄜ", IS_BOPOMOFO|IS_PINYIN, 162}, -{"ㄎㄞ", IS_BOPOMOFO|IS_PINYIN, 158}, -{"ㄎㄞㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 170}, -{"ㄎㄟ", IS_BOPOMOFO, 163}, -{"ㄎㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 173}, -{"ㄎㄠ", IS_BOPOMOFO|IS_PINYIN, 161}, -{"ㄎㄡ", IS_BOPOMOFO|IS_PINYIN, 167}, -{"ㄎㄢ", IS_BOPOMOFO|IS_PINYIN, 159}, -{"ㄎㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 171}, -{"ㄎㄣ", IS_BOPOMOFO|IS_PINYIN, 164}, -{"ㄎㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 174}, -{"ㄎㄤ", IS_BOPOMOFO|IS_PINYIN, 160}, -{"ㄎㄤㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 172}, -{"ㄎㄥ", IS_BOPOMOFO|IS_PINYIN, 165}, -{"ㄎㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 166}, -{"ㄎㄨ", IS_BOPOMOFO|IS_PINYIN, 168}, -{"ㄎㄨㄚ", IS_BOPOMOFO|IS_PINYIN, 169}, -{"ㄎㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 175}, -{"ㄎㄨㄞ", IS_BOPOMOFO|IS_PINYIN, 170}, -{"ㄎㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 173}, -{"ㄎㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 171}, -{"ㄎㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 174}, -{"ㄎㄨㄤ", IS_BOPOMOFO|IS_PINYIN, 172}, -{"ㄎㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 166}, -{"ㄏ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 121}, -{"ㄏㄚ", IS_BOPOMOFO|IS_PINYIN, 122}, -{"ㄏㄚㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 134}, -{"ㄏㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 140}, -{"ㄏㄜ", IS_BOPOMOFO|IS_PINYIN, 127}, -{"ㄏㄞ", IS_BOPOMOFO|IS_PINYIN, 123}, -{"ㄏㄞㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 135}, -{"ㄏㄟ", IS_BOPOMOFO|IS_PINYIN, 128}, -{"ㄏㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 138}, -{"ㄏㄠ", IS_BOPOMOFO|IS_PINYIN, 126}, -{"ㄏㄡ", IS_BOPOMOFO|IS_PINYIN, 132}, -{"ㄏㄢ", IS_BOPOMOFO|IS_PINYIN, 124}, -{"ㄏㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 136}, -{"ㄏㄣ", IS_BOPOMOFO|IS_PINYIN, 129}, -{"ㄏㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 139}, -{"ㄏㄤ", IS_BOPOMOFO|IS_PINYIN, 125}, -{"ㄏㄤㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 137}, -{"ㄏㄥ", IS_BOPOMOFO|IS_PINYIN, 130}, -{"ㄏㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 131}, -{"ㄏㄨ", IS_BOPOMOFO|IS_PINYIN, 133}, -{"ㄏㄨㄚ", IS_BOPOMOFO|IS_PINYIN, 134}, -{"ㄏㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 140}, -{"ㄏㄨㄞ", IS_BOPOMOFO|IS_PINYIN, 135}, -{"ㄏㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 138}, -{"ㄏㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 136}, -{"ㄏㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 139}, -{"ㄏㄨㄤ", IS_BOPOMOFO|IS_PINYIN, 137}, -{"ㄏㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 131}, -{"ㄐ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 141}, -{"ㄐㄚㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 143}, -{"ㄐㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 147}, -{"ㄐㄝㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 154}, -{"ㄐㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 146}, -{"ㄐㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 151}, -{"ㄐㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 144}, -{"ㄐㄢㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 153}, -{"ㄐㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 148}, -{"ㄐㄣㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 155}, -{"ㄐㄤㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 145}, -{"ㄐㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 149}, -{"ㄐㄥㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 150}, -{"ㄐㄧ", IS_BOPOMOFO|IS_PINYIN, 142}, -{"ㄐㄧㄚ", IS_BOPOMOFO|IS_PINYIN, 143}, -{"ㄐㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 147}, -{"ㄐㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 146}, -{"ㄐㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 151}, -{"ㄐㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 144}, -{"ㄐㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 148}, -{"ㄐㄧㄤ", IS_BOPOMOFO|IS_PINYIN, 145}, -{"ㄐㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 149}, -{"ㄐㄩ", IS_BOPOMOFO|IS_PINYIN, 152}, -{"ㄐㄩㄝ", IS_BOPOMOFO|IS_PINYIN, 154}, -{"ㄐㄩㄢ", IS_BOPOMOFO|IS_PINYIN, 153}, -{"ㄐㄩㄣ", IS_BOPOMOFO|IS_PINYIN, 155}, -{"ㄐㄩㄥ", IS_BOPOMOFO|IS_PINYIN, 150}, -{"ㄑ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 272}, -{"ㄑㄚㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 274}, -{"ㄑㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 278}, -{"ㄑㄝㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 285}, -{"ㄑㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 277}, -{"ㄑㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 282}, -{"ㄑㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 275}, -{"ㄑㄢㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 284}, -{"ㄑㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 279}, -{"ㄑㄣㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 286}, -{"ㄑㄤㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 276}, -{"ㄑㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 280}, -{"ㄑㄥㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 281}, -{"ㄑㄧ", IS_BOPOMOFO|IS_PINYIN, 273}, -{"ㄑㄧㄚ", IS_BOPOMOFO|IS_PINYIN, 274}, -{"ㄑㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 278}, -{"ㄑㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 277}, -{"ㄑㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 282}, -{"ㄑㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 275}, -{"ㄑㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 279}, -{"ㄑㄧㄤ", IS_BOPOMOFO|IS_PINYIN, 276}, -{"ㄑㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 280}, -{"ㄑㄩ", IS_BOPOMOFO|IS_PINYIN, 283}, -{"ㄑㄩㄝ", IS_BOPOMOFO|IS_PINYIN, 285}, -{"ㄑㄩㄢ", IS_BOPOMOFO|IS_PINYIN, 284}, -{"ㄑㄩㄣ", IS_BOPOMOFO|IS_PINYIN, 286}, -{"ㄑㄩㄥ", IS_BOPOMOFO|IS_PINYIN, 281}, -{"ㄒ", IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 370}, -{"ㄒㄚㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 372}, -{"ㄒㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 376}, -{"ㄒㄝㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 383}, -{"ㄒㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 375}, -{"ㄒㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 380}, -{"ㄒㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 373}, -{"ㄒㄢㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 382}, -{"ㄒㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 377}, -{"ㄒㄣㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 384}, -{"ㄒㄤㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 374}, -{"ㄒㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 378}, -{"ㄒㄥㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 379}, -{"ㄒㄧ", IS_BOPOMOFO|IS_PINYIN, 371}, -{"ㄒㄧㄚ", IS_BOPOMOFO|IS_PINYIN, 372}, -{"ㄒㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 376}, -{"ㄒㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 375}, -{"ㄒㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 380}, -{"ㄒㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 373}, -{"ㄒㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 377}, -{"ㄒㄧㄤ", IS_BOPOMOFO|IS_PINYIN, 374}, -{"ㄒㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 378}, -{"ㄒㄩ", IS_BOPOMOFO|IS_PINYIN, 381}, -{"ㄒㄩㄝ", IS_BOPOMOFO|IS_PINYIN, 383}, -{"ㄒㄩㄢ", IS_BOPOMOFO|IS_PINYIN, 382}, -{"ㄒㄩㄣ", IS_BOPOMOFO|IS_PINYIN, 384}, -{"ㄒㄩㄥ", IS_BOPOMOFO|IS_PINYIN, 379}, -{"ㄓ", IS_BOPOMOFO|IS_PINYIN, 422}, -{"ㄓㄚ", IS_BOPOMOFO|IS_PINYIN, 413}, -{"ㄓㄚㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 426}, -{"ㄓㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 432}, -{"ㄓㄜ", IS_BOPOMOFO|IS_PINYIN, 418}, -{"ㄓㄞ", IS_BOPOMOFO|IS_PINYIN, 414}, -{"ㄓㄞㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 427}, -{"ㄓㄟ", IS_BOPOMOFO, 419}, -{"ㄓㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 430}, -{"ㄓㄠ", IS_BOPOMOFO|IS_PINYIN, 417}, -{"ㄓㄡ", IS_BOPOMOFO|IS_PINYIN, 424}, -{"ㄓㄢ", IS_BOPOMOFO|IS_PINYIN, 415}, -{"ㄓㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 428}, -{"ㄓㄣ", IS_BOPOMOFO|IS_PINYIN, 420}, -{"ㄓㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 431}, -{"ㄓㄤ", IS_BOPOMOFO|IS_PINYIN, 416}, -{"ㄓㄤㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 429}, -{"ㄓㄥ", IS_BOPOMOFO|IS_PINYIN, 421}, -{"ㄓㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 423}, -{"ㄓㄨ", IS_BOPOMOFO|IS_PINYIN, 425}, -{"ㄓㄨㄚ", IS_BOPOMOFO|IS_PINYIN, 426}, -{"ㄓㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 432}, -{"ㄓㄨㄞ", IS_BOPOMOFO|IS_PINYIN, 427}, -{"ㄓㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 430}, -{"ㄓㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 428}, -{"ㄓㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 431}, -{"ㄓㄨㄤ", IS_BOPOMOFO|IS_PINYIN, 429}, -{"ㄓㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 423}, -{"ㄔ", IS_BOPOMOFO|IS_PINYIN, 41}, -{"ㄔㄚ", IS_BOPOMOFO|IS_PINYIN, 33}, -{"ㄔㄚㄨ", IS_BOPOMOFO|SHUFFLE_CORRECT, 45}, -{"ㄔㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 51}, -{"ㄔㄜ", IS_BOPOMOFO|IS_PINYIN, 38}, -{"ㄔㄞ", IS_BOPOMOFO|IS_PINYIN, 34}, -{"ㄔㄞㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 46}, -{"ㄔㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 49}, -{"ㄔㄠ", IS_BOPOMOFO|IS_PINYIN, 37}, -{"ㄔㄡ", IS_BOPOMOFO|IS_PINYIN, 43}, -{"ㄔㄢ", IS_BOPOMOFO|IS_PINYIN, 35}, -{"ㄔㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 47}, -{"ㄔㄣ", IS_BOPOMOFO|IS_PINYIN, 39}, -{"ㄔㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 50}, -{"ㄔㄤ", IS_BOPOMOFO|IS_PINYIN, 36}, -{"ㄔㄤㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 48}, -{"ㄔㄥ", IS_BOPOMOFO|IS_PINYIN, 40}, -{"ㄔㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 42}, -{"ㄔㄨ", IS_BOPOMOFO|IS_PINYIN, 44}, -{"ㄔㄨㄚ", IS_BOPOMOFO, 45}, -{"ㄔㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 51}, -{"ㄔㄨㄞ", IS_BOPOMOFO|IS_PINYIN, 46}, -{"ㄔㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 49}, -{"ㄔㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 47}, -{"ㄔㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 50}, -{"ㄔㄨㄤ", IS_BOPOMOFO|IS_PINYIN, 48}, -{"ㄔㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 42}, -{"ㄕ", IS_BOPOMOFO|IS_PINYIN, 322}, -{"ㄕㄚ", IS_BOPOMOFO|IS_PINYIN, 313}, -{"ㄕㄚㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 325}, -{"ㄕㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 331}, -{"ㄕㄜ", IS_BOPOMOFO|IS_PINYIN, 318}, -{"ㄕㄞ", IS_BOPOMOFO|IS_PINYIN, 314}, -{"ㄕㄞㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 326}, -{"ㄕㄟ", IS_BOPOMOFO|IS_PINYIN, 319}, -{"ㄕㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 329}, -{"ㄕㄠ", IS_BOPOMOFO|IS_PINYIN, 317}, -{"ㄕㄡ", IS_BOPOMOFO|IS_PINYIN, 323}, -{"ㄕㄢ", IS_BOPOMOFO|IS_PINYIN, 315}, -{"ㄕㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 327}, -{"ㄕㄣ", IS_BOPOMOFO|IS_PINYIN, 320}, -{"ㄕㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 330}, -{"ㄕㄤ", IS_BOPOMOFO|IS_PINYIN, 316}, -{"ㄕㄤㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 328}, -{"ㄕㄥ", IS_BOPOMOFO|IS_PINYIN, 321}, -{"ㄕㄨ", IS_BOPOMOFO|IS_PINYIN, 324}, -{"ㄕㄨㄚ", IS_BOPOMOFO|IS_PINYIN, 325}, -{"ㄕㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 331}, -{"ㄕㄨㄞ", IS_BOPOMOFO|IS_PINYIN, 326}, -{"ㄕㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 329}, -{"ㄕㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 327}, -{"ㄕㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 330}, -{"ㄕㄨㄤ", IS_BOPOMOFO|IS_PINYIN, 328}, -{"ㄖ", IS_BOPOMOFO|IS_PINYIN, 294}, -{"ㄖㄚㄨ", IS_BOPOMOFO|SHUFFLE_CORRECT, 298}, -{"ㄖㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 302}, -{"ㄖㄜ", IS_BOPOMOFO|IS_PINYIN, 291}, -{"ㄖㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 300}, -{"ㄖㄠ", IS_BOPOMOFO|IS_PINYIN, 290}, -{"ㄖㄡ", IS_BOPOMOFO|IS_PINYIN, 296}, -{"ㄖㄢ", IS_BOPOMOFO|IS_PINYIN, 288}, -{"ㄖㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 299}, -{"ㄖㄣ", IS_BOPOMOFO|IS_PINYIN, 292}, -{"ㄖㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 301}, -{"ㄖㄤ", IS_BOPOMOFO|IS_PINYIN, 289}, -{"ㄖㄥ", IS_BOPOMOFO|IS_PINYIN, 293}, -{"ㄖㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 295}, -{"ㄖㄨ", IS_BOPOMOFO|IS_PINYIN, 297}, -{"ㄖㄨㄚ", IS_BOPOMOFO, 298}, -{"ㄖㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 302}, -{"ㄖㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 300}, -{"ㄖㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 299}, -{"ㄖㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 301}, -{"ㄖㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 295}, -{"ㄗ", IS_BOPOMOFO|IS_PINYIN, 433}, -{"ㄗㄚ", IS_BOPOMOFO|IS_PINYIN, 403}, -{"ㄗㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 440}, -{"ㄗㄜ", IS_BOPOMOFO|IS_PINYIN, 408}, -{"ㄗㄞ", IS_BOPOMOFO|IS_PINYIN, 404}, -{"ㄗㄟ", IS_BOPOMOFO|IS_PINYIN, 409}, -{"ㄗㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 438}, -{"ㄗㄠ", IS_BOPOMOFO|IS_PINYIN, 407}, -{"ㄗㄡ", IS_BOPOMOFO|IS_PINYIN, 435}, -{"ㄗㄢ", IS_BOPOMOFO|IS_PINYIN, 405}, -{"ㄗㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 437}, -{"ㄗㄣ", IS_BOPOMOFO|IS_PINYIN, 410}, -{"ㄗㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 439}, -{"ㄗㄤ", IS_BOPOMOFO|IS_PINYIN, 406}, -{"ㄗㄥ", IS_BOPOMOFO|IS_PINYIN, 411}, -{"ㄗㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 434}, -{"ㄗㄨ", IS_BOPOMOFO|IS_PINYIN, 436}, -{"ㄗㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 440}, -{"ㄗㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 438}, -{"ㄗㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 437}, -{"ㄗㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 439}, -{"ㄗㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 434}, -{"ㄘ", IS_BOPOMOFO|IS_PINYIN, 52}, -{"ㄘㄚ", IS_BOPOMOFO|IS_PINYIN, 24}, -{"ㄘㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 59}, -{"ㄘㄜ", IS_BOPOMOFO|IS_PINYIN, 29}, -{"ㄘㄞ", IS_BOPOMOFO|IS_PINYIN, 25}, -{"ㄘㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 57}, -{"ㄘㄠ", IS_BOPOMOFO|IS_PINYIN, 28}, -{"ㄘㄡ", IS_BOPOMOFO|IS_PINYIN, 54}, -{"ㄘㄢ", IS_BOPOMOFO|IS_PINYIN, 26}, -{"ㄘㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 56}, -{"ㄘㄣ", IS_BOPOMOFO|IS_PINYIN, 30}, -{"ㄘㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 58}, -{"ㄘㄤ", IS_BOPOMOFO|IS_PINYIN, 27}, -{"ㄘㄥ", IS_BOPOMOFO|IS_PINYIN, 31}, -{"ㄘㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 53}, -{"ㄘㄨ", IS_BOPOMOFO|IS_PINYIN, 55}, -{"ㄘㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 59}, -{"ㄘㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 57}, -{"ㄘㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 56}, -{"ㄘㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 58}, -{"ㄘㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 53}, -{"ㄙ", IS_BOPOMOFO|IS_PINYIN, 332}, -{"ㄙㄚ", IS_BOPOMOFO|IS_PINYIN, 304}, -{"ㄙㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 339}, -{"ㄙㄜ", IS_BOPOMOFO|IS_PINYIN, 309}, -{"ㄙㄞ", IS_BOPOMOFO|IS_PINYIN, 305}, -{"ㄙㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 337}, -{"ㄙㄠ", IS_BOPOMOFO|IS_PINYIN, 308}, -{"ㄙㄡ", IS_BOPOMOFO|IS_PINYIN, 334}, -{"ㄙㄢ", IS_BOPOMOFO|IS_PINYIN, 306}, -{"ㄙㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 336}, -{"ㄙㄣ", IS_BOPOMOFO|IS_PINYIN, 310}, -{"ㄙㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 338}, -{"ㄙㄤ", IS_BOPOMOFO|IS_PINYIN, 307}, -{"ㄙㄥ", IS_BOPOMOFO|IS_PINYIN, 311}, -{"ㄙㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 333}, -{"ㄙㄨ", IS_BOPOMOFO|IS_PINYIN, 335}, -{"ㄙㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 339}, -{"ㄙㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 337}, -{"ㄙㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 336}, -{"ㄙㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 338}, -{"ㄙㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 333}, -{"ㄚ", IS_BOPOMOFO|IS_PINYIN, 1}, -{"ㄚㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 7}, -{"ㄚㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 255}, -{"ㄚㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 205}, -{"ㄚㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 91}, -{"ㄚㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 61}, -{"ㄚㄉㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 71}, -{"ㄚㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 341}, -{"ㄚㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 225}, -{"ㄚㄋㄧ", IS_BOPOMOFO|SHUFFLE_CORRECT, 236}, -{"ㄚㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 177}, -{"ㄚㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 187}, -{"ㄚㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 102}, -{"ㄚㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 114}, -{"ㄚㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 157}, -{"ㄚㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 169}, -{"ㄚㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 122}, -{"ㄚㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 134}, -{"ㄚㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 143}, -{"ㄚㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 274}, -{"ㄚㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 372}, -{"ㄚㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 413}, -{"ㄚㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 426}, -{"ㄚㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 33}, -{"ㄚㄔㄨ", IS_BOPOMOFO|SHUFFLE_CORRECT, 45}, -{"ㄚㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 313}, -{"ㄚㄕㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 325}, -{"ㄚㄖㄨ", IS_BOPOMOFO|SHUFFLE_CORRECT, 298}, -{"ㄚㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 403}, -{"ㄚㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 24}, -{"ㄚㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 304}, -{"ㄚㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 386}, -{"ㄚㄧㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 71}, -{"ㄚㄧㄋ", IS_BOPOMOFO|SHUFFLE_CORRECT, 236}, -{"ㄚㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 187}, -{"ㄚㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 143}, -{"ㄚㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 274}, -{"ㄚㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 372}, -{"ㄚㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 361}, -{"ㄚㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 114}, -{"ㄚㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 169}, -{"ㄚㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 134}, -{"ㄚㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 426}, -{"ㄚㄨㄔ", IS_BOPOMOFO|SHUFFLE_CORRECT, 45}, -{"ㄚㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 325}, -{"ㄚㄨㄖ", IS_BOPOMOFO|SHUFFLE_CORRECT, 298}, -{"ㄛ", IS_BOPOMOFO|IS_PINYIN, 252}, -{"ㄛㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 21}, -{"ㄛㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 269}, -{"ㄛㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 221}, -{"ㄛㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 98}, -{"ㄛㄉㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 84}, -{"ㄛㄊㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 359}, -{"ㄛㄋㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 249}, -{"ㄛㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 195}, -{"ㄛㄌㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 201}, -{"ㄛㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 120}, -{"ㄛㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 175}, -{"ㄛㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 140}, -{"ㄛㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 432}, -{"ㄛㄔㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 51}, -{"ㄛㄕㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 331}, -{"ㄛㄖㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 302}, -{"ㄛㄗㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 440}, -{"ㄛㄘㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 59}, -{"ㄛㄙㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 339}, -{"ㄛㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 395}, -{"ㄛㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 368}, -{"ㄛㄨㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 84}, -{"ㄛㄨㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 359}, -{"ㄛㄨㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 249}, -{"ㄛㄨㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 201}, -{"ㄛㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 120}, -{"ㄛㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 175}, -{"ㄛㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 140}, -{"ㄛㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 432}, -{"ㄛㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 51}, -{"ㄛㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 331}, -{"ㄛㄨㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 302}, -{"ㄛㄨㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 440}, -{"ㄛㄨㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 59}, -{"ㄛㄨㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 339}, -{"ㄜ", IS_BOPOMOFO|IS_PINYIN, 85}, -{"ㄜㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 210}, -{"ㄜㄈ", IS_BOPOMOFO|SHUFFLE_CORRECT, 94}, -{"ㄜㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 66}, -{"ㄜㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 346}, -{"ㄜㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 230}, -{"ㄜㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 182}, -{"ㄜㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 107}, -{"ㄜㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 162}, -{"ㄜㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 127}, -{"ㄜㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 418}, -{"ㄜㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 38}, -{"ㄜㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 318}, -{"ㄜㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 291}, -{"ㄜㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 408}, -{"ㄜㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 29}, -{"ㄜㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 309}, -{"ㄝㄅㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 18}, -{"ㄝㄆㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 266}, -{"ㄝㄇㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 217}, -{"ㄝㄉㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 74}, -{"ㄝㄊㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 351}, -{"ㄝㄋㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 240}, -{"ㄝㄋㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 251}, -{"ㄝㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 191}, -{"ㄝㄌㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 203}, -{"ㄝㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 147}, -{"ㄝㄐㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 154}, -{"ㄝㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 278}, -{"ㄝㄑㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 285}, -{"ㄝㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 376}, -{"ㄝㄒㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 383}, -{"ㄝㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 391}, -{"ㄝㄧㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 18}, -{"ㄝㄧㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 266}, -{"ㄝㄧㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 217}, -{"ㄝㄧㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 74}, -{"ㄝㄧㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 351}, -{"ㄝㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 240}, -{"ㄝㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 191}, -{"ㄝㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 147}, -{"ㄝㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 278}, -{"ㄝㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 376}, -{"ㄝㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 400}, -{"ㄝㄩㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 251}, -{"ㄝㄩㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 203}, -{"ㄝㄩㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 154}, -{"ㄝㄩㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 285}, -{"ㄝㄩㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 383}, -{"ㄞ", IS_BOPOMOFO|IS_PINYIN, 2}, -{"ㄞㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 8}, -{"ㄞㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 256}, -{"ㄞㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 206}, -{"ㄞㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 62}, -{"ㄞㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 342}, -{"ㄞㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 226}, -{"ㄞㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 178}, -{"ㄞㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 103}, -{"ㄞㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 115}, -{"ㄞㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 158}, -{"ㄞㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 170}, -{"ㄞㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 123}, -{"ㄞㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 135}, -{"ㄞㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 414}, -{"ㄞㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 427}, -{"ㄞㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 34}, -{"ㄞㄔㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 46}, -{"ㄞㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 314}, -{"ㄞㄕㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 326}, -{"ㄞㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 404}, -{"ㄞㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 25}, -{"ㄞㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 305}, -{"ㄞㄧ", IS_BOPOMOFO|SHUFFLE_CORRECT, 387}, -{"ㄞㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 362}, -{"ㄞㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 115}, -{"ㄞㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 170}, -{"ㄞㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 135}, -{"ㄞㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 427}, -{"ㄞㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 46}, -{"ㄞㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 326}, -{"ㄟ", IS_BOPOMOFO|IS_PINYIN, 86}, -{"ㄟㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 12}, -{"ㄟㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 260}, -{"ㄟㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 211}, -{"ㄟㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 95}, -{"ㄟㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 67}, -{"ㄟㄉㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 82}, -{"ㄟㄊㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 357}, -{"ㄟㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 231}, -{"ㄟㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 183}, -{"ㄟㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 108}, -{"ㄟㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 118}, -{"ㄟㄎ", IS_BOPOMOFO|SHUFFLE_CORRECT, 163}, -{"ㄟㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 173}, -{"ㄟㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 128}, -{"ㄟㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 138}, -{"ㄟㄓ", IS_BOPOMOFO|SHUFFLE_CORRECT, 419}, -{"ㄟㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 430}, -{"ㄟㄔㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 49}, -{"ㄟㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 319}, -{"ㄟㄕㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 329}, -{"ㄟㄖㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 300}, -{"ㄟㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 409}, -{"ㄟㄗㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 438}, -{"ㄟㄘㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 57}, -{"ㄟㄙㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 337}, -{"ㄟㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 365}, -{"ㄟㄨㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 82}, -{"ㄟㄨㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 357}, -{"ㄟㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 118}, -{"ㄟㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 173}, -{"ㄟㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 138}, -{"ㄟㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 430}, -{"ㄟㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 49}, -{"ㄟㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 329}, -{"ㄟㄨㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 300}, -{"ㄟㄨㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 438}, -{"ㄟㄨㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 57}, -{"ㄟㄨㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 337}, -{"ㄠ", IS_BOPOMOFO|IS_PINYIN, 5}, -{"ㄠㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 11}, -{"ㄠㄅㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 17}, -{"ㄠㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 259}, -{"ㄠㄆㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 265}, -{"ㄠㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 209}, -{"ㄠㄇㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 216}, -{"ㄠㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 65}, -{"ㄠㄉㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 73}, -{"ㄠㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 345}, -{"ㄠㄊㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 350}, -{"ㄠㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 229}, -{"ㄠㄋㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 239}, -{"ㄠㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 181}, -{"ㄠㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 190}, -{"ㄠㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 106}, -{"ㄠㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 161}, -{"ㄠㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 126}, -{"ㄠㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 146}, -{"ㄠㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 277}, -{"ㄠㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 375}, -{"ㄠㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 417}, -{"ㄠㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 37}, -{"ㄠㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 317}, -{"ㄠㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 290}, -{"ㄠㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 407}, -{"ㄠㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 28}, -{"ㄠㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 308}, -{"ㄠㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 390}, -{"ㄠㄧㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 17}, -{"ㄠㄧㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 265}, -{"ㄠㄧㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 216}, -{"ㄠㄧㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 73}, -{"ㄠㄧㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 350}, -{"ㄠㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 239}, -{"ㄠㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 190}, -{"ㄠㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 146}, -{"ㄠㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 277}, -{"ㄠㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 375}, -{"ㄡ", IS_BOPOMOFO|IS_PINYIN, 253}, -{"ㄡㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 270}, -{"ㄡㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 222}, -{"ㄡㄇㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 220}, -{"ㄡㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 99}, -{"ㄡㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 79}, -{"ㄡㄉㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 77}, -{"ㄡㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 354}, -{"ㄡㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 245}, -{"ㄡㄋㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 243}, -{"ㄡㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 197}, -{"ㄡㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 194}, -{"ㄡㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 112}, -{"ㄡㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 167}, -{"ㄡㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 132}, -{"ㄡㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 151}, -{"ㄡㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 282}, -{"ㄡㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 380}, -{"ㄡㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 424}, -{"ㄡㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 43}, -{"ㄡㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 323}, -{"ㄡㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 296}, -{"ㄡㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 435}, -{"ㄡㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 54}, -{"ㄡㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 334}, -{"ㄡㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 397}, -{"ㄡㄧㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 220}, -{"ㄡㄧㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 77}, -{"ㄡㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 243}, -{"ㄡㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 194}, -{"ㄡㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 151}, -{"ㄡㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 282}, -{"ㄡㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 380}, -{"ㄢ", IS_BOPOMOFO|IS_PINYIN, 3}, -{"ㄢㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 9}, -{"ㄢㄅㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 16}, -{"ㄢㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 257}, -{"ㄢㄆㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 264}, -{"ㄢㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 207}, -{"ㄢㄇㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 215}, -{"ㄢㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 92}, -{"ㄢㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 63}, -{"ㄢㄉㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 72}, -{"ㄢㄉㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 81}, -{"ㄢㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 343}, -{"ㄢㄊㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 349}, -{"ㄢㄊㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 356}, -{"ㄢㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 227}, -{"ㄢㄋㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 237}, -{"ㄢㄋㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 247}, -{"ㄢㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 179}, -{"ㄢㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 188}, -{"ㄢㄌㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 199}, -{"ㄢㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 104}, -{"ㄢㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 116}, -{"ㄢㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 159}, -{"ㄢㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 171}, -{"ㄢㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 124}, -{"ㄢㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 136}, -{"ㄢㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 144}, -{"ㄢㄐㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 153}, -{"ㄢㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 275}, -{"ㄢㄑㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 284}, -{"ㄢㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 373}, -{"ㄢㄒㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 382}, -{"ㄢㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 415}, -{"ㄢㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 428}, -{"ㄢㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 35}, -{"ㄢㄔㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 47}, -{"ㄢㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 315}, -{"ㄢㄕㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 327}, -{"ㄢㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 288}, -{"ㄢㄖㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 299}, -{"ㄢㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 405}, -{"ㄢㄗㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 437}, -{"ㄢㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 26}, -{"ㄢㄘㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 56}, -{"ㄢㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 306}, -{"ㄢㄙㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 336}, -{"ㄢㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 388}, -{"ㄢㄧㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 16}, -{"ㄢㄧㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 264}, -{"ㄢㄧㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 215}, -{"ㄢㄧㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 72}, -{"ㄢㄧㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 349}, -{"ㄢㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 237}, -{"ㄢㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 188}, -{"ㄢㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 144}, -{"ㄢㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 275}, -{"ㄢㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 373}, -{"ㄢㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 363}, -{"ㄢㄨㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 81}, -{"ㄢㄨㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 356}, -{"ㄢㄨㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 247}, -{"ㄢㄨㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 199}, -{"ㄢㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 116}, -{"ㄢㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 171}, -{"ㄢㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 136}, -{"ㄢㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 428}, -{"ㄢㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 47}, -{"ㄢㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 327}, -{"ㄢㄨㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 299}, -{"ㄢㄨㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 437}, -{"ㄢㄨㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 56}, -{"ㄢㄨㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 336}, -{"ㄢㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 399}, -{"ㄢㄩㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 153}, -{"ㄢㄩㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 284}, -{"ㄢㄩㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 382}, -{"ㄣ", IS_BOPOMOFO|IS_PINYIN, 87}, -{"ㄣㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 13}, -{"ㄣㄅㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 19}, -{"ㄣㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 261}, -{"ㄣㄆㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 267}, -{"ㄣㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 212}, -{"ㄣㄇㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 218}, -{"ㄣㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 96}, -{"ㄣㄉ", IS_BOPOMOFO|SHUFFLE_CORRECT, 68}, -{"ㄣㄉㄧ", IS_BOPOMOFO|SHUFFLE_CORRECT, 75}, -{"ㄣㄉㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 83}, -{"ㄣㄊㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 358}, -{"ㄣㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 232}, -{"ㄣㄋㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 241}, -{"ㄣㄋㄨ", IS_BOPOMOFO|SHUFFLE_CORRECT, 248}, -{"ㄣㄌ", IS_BOPOMOFO|SHUFFLE_CORRECT, 184}, -{"ㄣㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 192}, -{"ㄣㄌㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 200}, -{"ㄣㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 109}, -{"ㄣㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 119}, -{"ㄣㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 164}, -{"ㄣㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 174}, -{"ㄣㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 129}, -{"ㄣㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 139}, -{"ㄣㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 148}, -{"ㄣㄐㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 155}, -{"ㄣㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 279}, -{"ㄣㄑㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 286}, -{"ㄣㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 377}, -{"ㄣㄒㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 384}, -{"ㄣㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 420}, -{"ㄣㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 431}, -{"ㄣㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 39}, -{"ㄣㄔㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 50}, -{"ㄣㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 320}, -{"ㄣㄕㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 330}, -{"ㄣㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 292}, -{"ㄣㄖㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 301}, -{"ㄣㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 410}, -{"ㄣㄗㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 439}, -{"ㄣㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 30}, -{"ㄣㄘㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 58}, -{"ㄣㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 310}, -{"ㄣㄙㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 338}, -{"ㄣㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 393}, -{"ㄣㄧㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 19}, -{"ㄣㄧㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 267}, -{"ㄣㄧㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 218}, -{"ㄣㄧㄉ", IS_BOPOMOFO|SHUFFLE_CORRECT, 75}, -{"ㄣㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 241}, -{"ㄣㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 192}, -{"ㄣㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 148}, -{"ㄣㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 279}, -{"ㄣㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 377}, -{"ㄣㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 366}, -{"ㄣㄨㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 83}, -{"ㄣㄨㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 358}, -{"ㄣㄨㄋ", IS_BOPOMOFO|SHUFFLE_CORRECT, 248}, -{"ㄣㄨㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 200}, -{"ㄣㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 119}, -{"ㄣㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 174}, -{"ㄣㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 139}, -{"ㄣㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 431}, -{"ㄣㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 50}, -{"ㄣㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 330}, -{"ㄣㄨㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 301}, -{"ㄣㄨㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 439}, -{"ㄣㄨㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 58}, -{"ㄣㄨㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 338}, -{"ㄣㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 401}, -{"ㄣㄩㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 155}, -{"ㄣㄩㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 286}, -{"ㄣㄩㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 384}, -{"ㄤ", IS_BOPOMOFO|IS_PINYIN, 4}, -{"ㄤㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 10}, -{"ㄤㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 258}, -{"ㄤㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 208}, -{"ㄤㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 93}, -{"ㄤㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 64}, -{"ㄤㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 344}, -{"ㄤㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 228}, -{"ㄤㄋㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 238}, -{"ㄤㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 180}, -{"ㄤㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 189}, -{"ㄤㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 105}, -{"ㄤㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 117}, -{"ㄤㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 160}, -{"ㄤㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 172}, -{"ㄤㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 125}, -{"ㄤㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 137}, -{"ㄤㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 145}, -{"ㄤㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 276}, -{"ㄤㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 374}, -{"ㄤㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 416}, -{"ㄤㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 429}, -{"ㄤㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 36}, -{"ㄤㄔㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 48}, -{"ㄤㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 316}, -{"ㄤㄕㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 328}, -{"ㄤㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 289}, -{"ㄤㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 406}, -{"ㄤㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 27}, -{"ㄤㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 307}, -{"ㄤㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 389}, -{"ㄤㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 238}, -{"ㄤㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 189}, -{"ㄤㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 145}, -{"ㄤㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 276}, -{"ㄤㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 374}, -{"ㄤㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 364}, -{"ㄤㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 117}, -{"ㄤㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 172}, -{"ㄤㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 137}, -{"ㄤㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 429}, -{"ㄤㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 48}, -{"ㄤㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 328}, -{"ㄥ", IS_BOPOMOFO, 88}, -{"ㄥㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 14}, -{"ㄥㄅㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 20}, -{"ㄥㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 262}, -{"ㄥㄆㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 268}, -{"ㄥㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 213}, -{"ㄥㄇㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 219}, -{"ㄥㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 97}, -{"ㄥㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 69}, -{"ㄥㄉㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 76}, -{"ㄥㄉㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 78}, -{"ㄥㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 347}, -{"ㄥㄊㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 352}, -{"ㄥㄊㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 353}, -{"ㄥㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 233}, -{"ㄥㄋㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 242}, -{"ㄥㄋㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 244}, -{"ㄥㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 185}, -{"ㄥㄌㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 193}, -{"ㄥㄌㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 196}, -{"ㄥㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 110}, -{"ㄥㄍㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 111}, -{"ㄥㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 165}, -{"ㄥㄎㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 166}, -{"ㄥㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 130}, -{"ㄥㄏㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 131}, -{"ㄥㄐㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 149}, -{"ㄥㄐㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 150}, -{"ㄥㄑㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 280}, -{"ㄥㄑㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 281}, -{"ㄥㄒㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 378}, -{"ㄥㄒㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 379}, -{"ㄥㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 421}, -{"ㄥㄓㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 423}, -{"ㄥㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 40}, -{"ㄥㄔㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 42}, -{"ㄥㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 321}, -{"ㄥㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 293}, -{"ㄥㄖㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 295}, -{"ㄥㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 411}, -{"ㄥㄗㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 434}, -{"ㄥㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 31}, -{"ㄥㄘㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 53}, -{"ㄥㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 311}, -{"ㄥㄙㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 333}, -{"ㄥㄧ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 394}, -{"ㄥㄧㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 20}, -{"ㄥㄧㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 268}, -{"ㄥㄧㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 219}, -{"ㄥㄧㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 76}, -{"ㄥㄧㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 352}, -{"ㄥㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 242}, -{"ㄥㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 193}, -{"ㄥㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 149}, -{"ㄥㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 280}, -{"ㄥㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 378}, -{"ㄥㄨ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 367}, -{"ㄥㄨㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 78}, -{"ㄥㄨㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 353}, -{"ㄥㄨㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 244}, -{"ㄥㄨㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 196}, -{"ㄥㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 111}, -{"ㄥㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 166}, -{"ㄥㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 131}, -{"ㄥㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 423}, -{"ㄥㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 42}, -{"ㄥㄨㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 295}, -{"ㄥㄨㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 434}, -{"ㄥㄨㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 53}, -{"ㄥㄨㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 333}, -{"ㄥㄩ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 396}, -{"ㄥㄩㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 150}, -{"ㄥㄩㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 281}, -{"ㄥㄩㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 379}, -{"ㄦ", IS_BOPOMOFO|IS_PINYIN, 89}, -{"ㄧ", IS_BOPOMOFO|IS_PINYIN, 392}, -{"ㄧㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 15}, -{"ㄧㄅㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 18}, -{"ㄧㄅㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 17}, -{"ㄧㄅㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 16}, -{"ㄧㄅㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 19}, -{"ㄧㄅㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 20}, -{"ㄧㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 263}, -{"ㄧㄆㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 266}, -{"ㄧㄆㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 265}, -{"ㄧㄆㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 264}, -{"ㄧㄆㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 267}, -{"ㄧㄆㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 268}, -{"ㄧㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 214}, -{"ㄧㄇㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 217}, -{"ㄧㄇㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 216}, -{"ㄧㄇㄡ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 220}, -{"ㄧㄇㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 215}, -{"ㄧㄇㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 218}, -{"ㄧㄇㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 219}, -{"ㄧㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 70}, -{"ㄧㄉㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 71}, -{"ㄧㄉㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 74}, -{"ㄧㄉㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 73}, -{"ㄧㄉㄡ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 77}, -{"ㄧㄉㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 72}, -{"ㄧㄉㄣ", IS_BOPOMOFO|SHUFFLE_CORRECT, 75}, -{"ㄧㄉㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 76}, -{"ㄧㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 348}, -{"ㄧㄊㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 351}, -{"ㄧㄊㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 350}, -{"ㄧㄊㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 349}, -{"ㄧㄊㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 352}, -{"ㄧㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 235}, -{"ㄧㄋㄚ", IS_BOPOMOFO|SHUFFLE_CORRECT, 236}, -{"ㄧㄋㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 240}, -{"ㄧㄋㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 239}, -{"ㄧㄋㄡ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 243}, -{"ㄧㄋㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 237}, -{"ㄧㄋㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 241}, -{"ㄧㄋㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 238}, -{"ㄧㄋㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 242}, -{"ㄧㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 186}, -{"ㄧㄌㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 187}, -{"ㄧㄌㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 191}, -{"ㄧㄌㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 190}, -{"ㄧㄌㄡ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 194}, -{"ㄧㄌㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 188}, -{"ㄧㄌㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 192}, -{"ㄧㄌㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 189}, -{"ㄧㄌㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 193}, -{"ㄧㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 142}, -{"ㄧㄐㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 143}, -{"ㄧㄐㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 147}, -{"ㄧㄐㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 146}, -{"ㄧㄐㄡ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 151}, -{"ㄧㄐㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 144}, -{"ㄧㄐㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 148}, -{"ㄧㄐㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 145}, -{"ㄧㄐㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 149}, -{"ㄧㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 273}, -{"ㄧㄑㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 274}, -{"ㄧㄑㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 278}, -{"ㄧㄑㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 277}, -{"ㄧㄑㄡ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 282}, -{"ㄧㄑㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 275}, -{"ㄧㄑㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 279}, -{"ㄧㄑㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 276}, -{"ㄧㄑㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 280}, -{"ㄧㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 371}, -{"ㄧㄒㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 372}, -{"ㄧㄒㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 376}, -{"ㄧㄒㄠ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 375}, -{"ㄧㄒㄡ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 380}, -{"ㄧㄒㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 373}, -{"ㄧㄒㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 377}, -{"ㄧㄒㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 374}, -{"ㄧㄒㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 378}, -{"ㄧㄚ", IS_BOPOMOFO|IS_PINYIN, 386}, -{"ㄧㄚㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 71}, -{"ㄧㄚㄋ", IS_BOPOMOFO|SHUFFLE_CORRECT, 236}, -{"ㄧㄚㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 187}, -{"ㄧㄚㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 143}, -{"ㄧㄚㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 274}, -{"ㄧㄚㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 372}, -{"ㄧㄛ", IS_BOPOMOFO|IS_PINYIN, 395}, -{"ㄧㄝ", IS_BOPOMOFO|IS_PINYIN, 391}, -{"ㄧㄝㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 18}, -{"ㄧㄝㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 266}, -{"ㄧㄝㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 217}, -{"ㄧㄝㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 74}, -{"ㄧㄝㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 351}, -{"ㄧㄝㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 240}, -{"ㄧㄝㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 191}, -{"ㄧㄝㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 147}, -{"ㄧㄝㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 278}, -{"ㄧㄝㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 376}, -{"ㄧㄞ", IS_BOPOMOFO, 387}, -{"ㄧㄠ", IS_BOPOMOFO|IS_PINYIN, 390}, -{"ㄧㄠㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 17}, -{"ㄧㄠㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 265}, -{"ㄧㄠㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 216}, -{"ㄧㄠㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 73}, -{"ㄧㄠㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 350}, -{"ㄧㄠㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 239}, -{"ㄧㄠㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 190}, -{"ㄧㄠㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 146}, -{"ㄧㄠㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 277}, -{"ㄧㄠㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 375}, -{"ㄧㄡ", IS_BOPOMOFO|IS_PINYIN, 397}, -{"ㄧㄡㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 220}, -{"ㄧㄡㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 77}, -{"ㄧㄡㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 243}, -{"ㄧㄡㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 194}, -{"ㄧㄡㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 151}, -{"ㄧㄡㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 282}, -{"ㄧㄡㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 380}, -{"ㄧㄢ", IS_BOPOMOFO|IS_PINYIN, 388}, -{"ㄧㄢㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 16}, -{"ㄧㄢㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 264}, -{"ㄧㄢㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 215}, -{"ㄧㄢㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 72}, -{"ㄧㄢㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 349}, -{"ㄧㄢㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 237}, -{"ㄧㄢㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 188}, -{"ㄧㄢㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 144}, -{"ㄧㄢㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 275}, -{"ㄧㄢㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 373}, -{"ㄧㄣ", IS_BOPOMOFO|IS_PINYIN, 393}, -{"ㄧㄣㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 19}, -{"ㄧㄣㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 267}, -{"ㄧㄣㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 218}, -{"ㄧㄣㄉ", IS_BOPOMOFO|SHUFFLE_CORRECT, 75}, -{"ㄧㄣㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 241}, -{"ㄧㄣㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 192}, -{"ㄧㄣㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 148}, -{"ㄧㄣㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 279}, -{"ㄧㄣㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 377}, -{"ㄧㄤ", IS_BOPOMOFO|IS_PINYIN, 389}, -{"ㄧㄤㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 238}, -{"ㄧㄤㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 189}, -{"ㄧㄤㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 145}, -{"ㄧㄤㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 276}, -{"ㄧㄤㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 374}, -{"ㄧㄥ", IS_BOPOMOFO|IS_PINYIN, 394}, -{"ㄧㄥㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 20}, -{"ㄧㄥㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 268}, -{"ㄧㄥㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 219}, -{"ㄧㄥㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 76}, -{"ㄧㄥㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 352}, -{"ㄧㄥㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 242}, -{"ㄧㄥㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 193}, -{"ㄧㄥㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 149}, -{"ㄧㄥㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 280}, -{"ㄧㄥㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 378}, -{"ㄨ", IS_BOPOMOFO|IS_PINYIN, 369}, -{"ㄨㄅ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 22}, -{"ㄨㄆ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 271}, -{"ㄨㄇ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 223}, -{"ㄨㄈ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 100}, -{"ㄨㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 80}, -{"ㄨㄉㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 84}, -{"ㄨㄉㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 82}, -{"ㄨㄉㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 81}, -{"ㄨㄉㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 83}, -{"ㄨㄉㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 78}, -{"ㄨㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 355}, -{"ㄨㄊㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 359}, -{"ㄨㄊㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 357}, -{"ㄨㄊㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 356}, -{"ㄨㄊㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 358}, -{"ㄨㄊㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 353}, -{"ㄨㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 246}, -{"ㄨㄋㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 249}, -{"ㄨㄋㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 247}, -{"ㄨㄋㄣ", IS_BOPOMOFO|SHUFFLE_CORRECT, 248}, -{"ㄨㄋㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 244}, -{"ㄨㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 198}, -{"ㄨㄌㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 201}, -{"ㄨㄌㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 199}, -{"ㄨㄌㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 200}, -{"ㄨㄌㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 196}, -{"ㄨㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 113}, -{"ㄨㄍㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 114}, -{"ㄨㄍㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 120}, -{"ㄨㄍㄞ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 115}, -{"ㄨㄍㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 118}, -{"ㄨㄍㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 116}, -{"ㄨㄍㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 119}, -{"ㄨㄍㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 117}, -{"ㄨㄍㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 111}, -{"ㄨㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 168}, -{"ㄨㄎㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 169}, -{"ㄨㄎㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 175}, -{"ㄨㄎㄞ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 170}, -{"ㄨㄎㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 173}, -{"ㄨㄎㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 171}, -{"ㄨㄎㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 174}, -{"ㄨㄎㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 172}, -{"ㄨㄎㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 166}, -{"ㄨㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 133}, -{"ㄨㄏㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 134}, -{"ㄨㄏㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 140}, -{"ㄨㄏㄞ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 135}, -{"ㄨㄏㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 138}, -{"ㄨㄏㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 136}, -{"ㄨㄏㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 139}, -{"ㄨㄏㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 137}, -{"ㄨㄏㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 131}, -{"ㄨㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 425}, -{"ㄨㄓㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 426}, -{"ㄨㄓㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 432}, -{"ㄨㄓㄞ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 427}, -{"ㄨㄓㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 430}, -{"ㄨㄓㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 428}, -{"ㄨㄓㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 431}, -{"ㄨㄓㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 429}, -{"ㄨㄓㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 423}, -{"ㄨㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 44}, -{"ㄨㄔㄚ", IS_BOPOMOFO|SHUFFLE_CORRECT, 45}, -{"ㄨㄔㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 51}, -{"ㄨㄔㄞ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 46}, -{"ㄨㄔㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 49}, -{"ㄨㄔㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 47}, -{"ㄨㄔㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 50}, -{"ㄨㄔㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 48}, -{"ㄨㄔㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 42}, -{"ㄨㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 324}, -{"ㄨㄕㄚ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 325}, -{"ㄨㄕㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 331}, -{"ㄨㄕㄞ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 326}, -{"ㄨㄕㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 329}, -{"ㄨㄕㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 327}, -{"ㄨㄕㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 330}, -{"ㄨㄕㄤ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 328}, -{"ㄨㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 297}, -{"ㄨㄖㄚ", IS_BOPOMOFO|SHUFFLE_CORRECT, 298}, -{"ㄨㄖㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 302}, -{"ㄨㄖㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 300}, -{"ㄨㄖㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 299}, -{"ㄨㄖㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 301}, -{"ㄨㄖㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 295}, -{"ㄨㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 436}, -{"ㄨㄗㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 440}, -{"ㄨㄗㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 438}, -{"ㄨㄗㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 437}, -{"ㄨㄗㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 439}, -{"ㄨㄗㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 434}, -{"ㄨㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 55}, -{"ㄨㄘㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 59}, -{"ㄨㄘㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 57}, -{"ㄨㄘㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 56}, -{"ㄨㄘㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 58}, -{"ㄨㄘㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 53}, -{"ㄨㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 335}, -{"ㄨㄙㄛ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 339}, -{"ㄨㄙㄟ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 337}, -{"ㄨㄙㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 336}, -{"ㄨㄙㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 338}, -{"ㄨㄙㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 333}, -{"ㄨㄚ", IS_BOPOMOFO|IS_PINYIN, 361}, -{"ㄨㄚㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 114}, -{"ㄨㄚㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 169}, -{"ㄨㄚㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 134}, -{"ㄨㄚㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 426}, -{"ㄨㄚㄔ", IS_BOPOMOFO|SHUFFLE_CORRECT, 45}, -{"ㄨㄚㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 325}, -{"ㄨㄚㄖ", IS_BOPOMOFO|SHUFFLE_CORRECT, 298}, -{"ㄨㄛ", IS_BOPOMOFO|IS_PINYIN, 368}, -{"ㄨㄛㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 84}, -{"ㄨㄛㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 359}, -{"ㄨㄛㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 249}, -{"ㄨㄛㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 201}, -{"ㄨㄛㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 120}, -{"ㄨㄛㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 175}, -{"ㄨㄛㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 140}, -{"ㄨㄛㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 432}, -{"ㄨㄛㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 51}, -{"ㄨㄛㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 331}, -{"ㄨㄛㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 302}, -{"ㄨㄛㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 440}, -{"ㄨㄛㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 59}, -{"ㄨㄛㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 339}, -{"ㄨㄞ", IS_BOPOMOFO|IS_PINYIN, 362}, -{"ㄨㄞㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 115}, -{"ㄨㄞㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 170}, -{"ㄨㄞㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 135}, -{"ㄨㄞㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 427}, -{"ㄨㄞㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 46}, -{"ㄨㄞㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 326}, -{"ㄨㄟ", IS_BOPOMOFO|IS_PINYIN, 365}, -{"ㄨㄟㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 82}, -{"ㄨㄟㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 357}, -{"ㄨㄟㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 118}, -{"ㄨㄟㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 173}, -{"ㄨㄟㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 138}, -{"ㄨㄟㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 430}, -{"ㄨㄟㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 49}, -{"ㄨㄟㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 329}, -{"ㄨㄟㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 300}, -{"ㄨㄟㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 438}, -{"ㄨㄟㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 57}, -{"ㄨㄟㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 337}, -{"ㄨㄢ", IS_BOPOMOFO|IS_PINYIN, 363}, -{"ㄨㄢㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 81}, -{"ㄨㄢㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 356}, -{"ㄨㄢㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 247}, -{"ㄨㄢㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 199}, -{"ㄨㄢㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 116}, -{"ㄨㄢㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 171}, -{"ㄨㄢㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 136}, -{"ㄨㄢㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 428}, -{"ㄨㄢㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 47}, -{"ㄨㄢㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 327}, -{"ㄨㄢㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 299}, -{"ㄨㄢㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 437}, -{"ㄨㄢㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 56}, -{"ㄨㄢㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 336}, -{"ㄨㄣ", IS_BOPOMOFO|IS_PINYIN, 366}, -{"ㄨㄣㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 83}, -{"ㄨㄣㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 358}, -{"ㄨㄣㄋ", IS_BOPOMOFO|SHUFFLE_CORRECT, 248}, -{"ㄨㄣㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 200}, -{"ㄨㄣㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 119}, -{"ㄨㄣㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 174}, -{"ㄨㄣㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 139}, -{"ㄨㄣㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 431}, -{"ㄨㄣㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 50}, -{"ㄨㄣㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 330}, -{"ㄨㄣㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 301}, -{"ㄨㄣㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 439}, -{"ㄨㄣㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 58}, -{"ㄨㄣㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 338}, -{"ㄨㄤ", IS_BOPOMOFO|IS_PINYIN, 364}, -{"ㄨㄤㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 117}, -{"ㄨㄤㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 172}, -{"ㄨㄤㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 137}, -{"ㄨㄤㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 429}, -{"ㄨㄤㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 48}, -{"ㄨㄤㄕ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 328}, -{"ㄨㄥ", IS_BOPOMOFO|IS_PINYIN, 367}, -{"ㄨㄥㄉ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 78}, -{"ㄨㄥㄊ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 353}, -{"ㄨㄥㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 244}, -{"ㄨㄥㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 196}, -{"ㄨㄥㄍ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 111}, -{"ㄨㄥㄎ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 166}, -{"ㄨㄥㄏ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 131}, -{"ㄨㄥㄓ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 423}, -{"ㄨㄥㄔ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 42}, -{"ㄨㄥㄖ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 295}, -{"ㄨㄥㄗ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 434}, -{"ㄨㄥㄘ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 53}, -{"ㄨㄥㄙ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 333}, -{"ㄩ", IS_BOPOMOFO|IS_PINYIN, 398}, -{"ㄩㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 250}, -{"ㄩㄋㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 251}, -{"ㄩㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 202}, -{"ㄩㄌㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 203}, -{"ㄩㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 152}, -{"ㄩㄐㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 154}, -{"ㄩㄐㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 153}, -{"ㄩㄐㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 155}, -{"ㄩㄐㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 150}, -{"ㄩㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 283}, -{"ㄩㄑㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 285}, -{"ㄩㄑㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 284}, -{"ㄩㄑㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 286}, -{"ㄩㄑㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 281}, -{"ㄩㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 381}, -{"ㄩㄒㄝ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 383}, -{"ㄩㄒㄢ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 382}, -{"ㄩㄒㄣ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 384}, -{"ㄩㄒㄥ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 379}, -{"ㄩㄝ", IS_BOPOMOFO|IS_PINYIN, 400}, -{"ㄩㄝㄋ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 251}, -{"ㄩㄝㄌ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 203}, -{"ㄩㄝㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 154}, -{"ㄩㄝㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 285}, -{"ㄩㄝㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 383}, -{"ㄩㄢ", IS_BOPOMOFO|IS_PINYIN, 399}, -{"ㄩㄢㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 153}, -{"ㄩㄢㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 284}, -{"ㄩㄢㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 382}, -{"ㄩㄣ", IS_BOPOMOFO|IS_PINYIN, 401}, -{"ㄩㄣㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 155}, -{"ㄩㄣㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 286}, -{"ㄩㄣㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 384}, -{"ㄩㄥ", IS_BOPOMOFO|IS_PINYIN, 396}, -{"ㄩㄥㄐ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 150}, -{"ㄩㄥㄑ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 281}, -{"ㄩㄥㄒ", IS_BOPOMOFO|IS_PINYIN|SHUFFLE_CORRECT, 379}, -{"ㄫ", IS_BOPOMOFO|IS_PINYIN, 234} -}; - -const pinyin_index_item_t secondary_bopomofo_index[] = { -{"a", IS_PINYIN, 1}, -{"ai", IS_PINYIN, 2}, -{"an", IS_PINYIN, 3}, -{"ang", IS_PINYIN, 4}, -{"au", IS_PINYIN, 5}, -{"ba", IS_PINYIN, 7}, -{"bai", IS_PINYIN, 8}, -{"ban", IS_PINYIN, 9}, -{"bang", IS_PINYIN, 10}, -{"bau", IS_PINYIN, 11}, -{"bei", IS_PINYIN, 12}, -{"ben", IS_PINYIN, 13}, -{"beng", IS_PINYIN, 14}, -{"bi", IS_PINYIN, 15}, -{"bian", IS_PINYIN, 16}, -{"biau", IS_PINYIN, 17}, -{"bie", IS_PINYIN, 18}, -{"bin", IS_PINYIN, 19}, -{"bing", IS_PINYIN, 20}, -{"bo", IS_PINYIN, 21}, -{"bu", IS_PINYIN, 22}, -{"cha", IS_PINYIN, 33}, -{"chai", IS_PINYIN, 34}, -{"chan", IS_PINYIN, 35}, -{"chang", IS_PINYIN, 36}, -{"chau", IS_PINYIN, 37}, -{"che", IS_PINYIN, 38}, -{"chen", IS_PINYIN, 39}, -{"cheng", IS_PINYIN, 40}, -{"chi", IS_PINYIN, 273}, -{"chia", IS_PINYIN, 274}, -{"chian", IS_PINYIN, 275}, -{"chiang", IS_PINYIN, 276}, -{"chiau", IS_PINYIN, 277}, -{"chie", IS_PINYIN, 278}, -{"chin", IS_PINYIN, 279}, -{"ching", IS_PINYIN, 280}, -{"chiou", IS_PINYIN, 282}, -{"chiu", IS_PINYIN, 283}, -{"chiuan", IS_PINYIN, 284}, -{"chiue", IS_PINYIN, 285}, -{"chiun", IS_PINYIN, 286}, -{"chiung", IS_PINYIN, 281}, -{"chou", IS_PINYIN, 43}, -{"chr", IS_PINYIN, 32}, -{"chu", IS_PINYIN, 44}, -{"chuai", IS_PINYIN, 46}, -{"chuan", IS_PINYIN, 47}, -{"chuang", IS_PINYIN, 48}, -{"chuei", IS_PINYIN, 49}, -{"chuen", IS_PINYIN, 50}, -{"chung", IS_PINYIN, 42}, -{"chuo", IS_PINYIN, 51}, -{"da", IS_PINYIN, 61}, -{"dai", IS_PINYIN, 62}, -{"dan", IS_PINYIN, 63}, -{"dang", IS_PINYIN, 64}, -{"dau", IS_PINYIN, 65}, -{"de", IS_PINYIN, 66}, -{"dei", IS_PINYIN, 67}, -{"deng", IS_PINYIN, 69}, -{"di", IS_PINYIN, 70}, -{"dian", IS_PINYIN, 72}, -{"diau", IS_PINYIN, 73}, -{"die", IS_PINYIN, 74}, -{"ding", IS_PINYIN, 76}, -{"diou", IS_PINYIN, 77}, -{"dou", IS_PINYIN, 79}, -{"du", IS_PINYIN, 80}, -{"duan", IS_PINYIN, 81}, -{"duei", IS_PINYIN, 82}, -{"duen", IS_PINYIN, 83}, -{"dung", IS_PINYIN, 78}, -{"duo", IS_PINYIN, 84}, -{"e", IS_PINYIN, 85}, -{"ei", IS_PINYIN, 86}, -{"en", IS_PINYIN, 87}, -{"eng", IS_PINYIN, 88}, -{"er", IS_PINYIN, 89}, -{"fa", IS_PINYIN, 91}, -{"fan", IS_PINYIN, 92}, -{"fang", IS_PINYIN, 93}, -{"fei", IS_PINYIN, 95}, -{"fen", IS_PINYIN, 96}, -{"fo", IS_PINYIN, 98}, -{"fou", IS_PINYIN, 99}, -{"fu", IS_PINYIN, 100}, -{"ga", IS_PINYIN, 102}, -{"gai", IS_PINYIN, 103}, -{"gan", IS_PINYIN, 104}, -{"gang", IS_PINYIN, 105}, -{"gau", IS_PINYIN, 106}, -{"ge", IS_PINYIN, 107}, -{"gei", IS_PINYIN, 108}, -{"gen", IS_PINYIN, 109}, -{"geng", IS_PINYIN, 110}, -{"gou", IS_PINYIN, 112}, -{"gu", IS_PINYIN, 113}, -{"gua", IS_PINYIN, 114}, -{"guai", IS_PINYIN, 115}, -{"guan", IS_PINYIN, 116}, -{"guang", IS_PINYIN, 117}, -{"guei", IS_PINYIN, 118}, -{"guen", IS_PINYIN, 119}, -{"gung", IS_PINYIN, 111}, -{"guo", IS_PINYIN, 120}, -{"ha", IS_PINYIN, 122}, -{"hai", IS_PINYIN, 123}, -{"han", IS_PINYIN, 124}, -{"hang", IS_PINYIN, 125}, -{"hau", IS_PINYIN, 126}, -{"he", IS_PINYIN, 127}, -{"hei", IS_PINYIN, 128}, -{"hen", IS_PINYIN, 129}, -{"heng", IS_PINYIN, 130}, -{"hou", IS_PINYIN, 132}, -{"hu", IS_PINYIN, 133}, -{"hua", IS_PINYIN, 134}, -{"huai", IS_PINYIN, 135}, -{"huan", IS_PINYIN, 136}, -{"huang", IS_PINYIN, 137}, -{"huei", IS_PINYIN, 138}, -{"huen", IS_PINYIN, 139}, -{"hung", IS_PINYIN, 131}, -{"huo", IS_PINYIN, 140}, -{"ja", IS_PINYIN, 413}, -{"jai", IS_PINYIN, 414}, -{"jan", IS_PINYIN, 415}, -{"jang", IS_PINYIN, 416}, -{"jau", IS_PINYIN, 417}, -{"je", IS_PINYIN, 418}, -{"jei", IS_PINYIN, 419}, -{"jen", IS_PINYIN, 420}, -{"jeng", IS_PINYIN, 421}, -{"ji", IS_PINYIN, 142}, -{"jia", IS_PINYIN, 143}, -{"jian", IS_PINYIN, 144}, -{"jiang", IS_PINYIN, 145}, -{"jiau", IS_PINYIN, 146}, -{"jie", IS_PINYIN, 147}, -{"jin", IS_PINYIN, 148}, -{"jing", IS_PINYIN, 149}, -{"jiou", IS_PINYIN, 151}, -{"jiu", IS_PINYIN, 152}, -{"jiuan", IS_PINYIN, 153}, -{"jiue", IS_PINYIN, 154}, -{"jiun", IS_PINYIN, 155}, -{"jiung", IS_PINYIN, 150}, -{"jou", IS_PINYIN, 424}, -{"jr", IS_PINYIN, 412}, -{"ju", IS_PINYIN, 425}, -{"jua", IS_PINYIN, 426}, -{"juai", IS_PINYIN, 427}, -{"juan", IS_PINYIN, 428}, -{"juang", IS_PINYIN, 429}, -{"juei", IS_PINYIN, 430}, -{"juen", IS_PINYIN, 431}, -{"jung", IS_PINYIN, 423}, -{"juo", IS_PINYIN, 432}, -{"ka", IS_PINYIN, 157}, -{"kai", IS_PINYIN, 158}, -{"kan", IS_PINYIN, 159}, -{"kang", IS_PINYIN, 160}, -{"kau", IS_PINYIN, 161}, -{"ke", IS_PINYIN, 162}, -{"ken", IS_PINYIN, 164}, -{"keng", IS_PINYIN, 165}, -{"kou", IS_PINYIN, 167}, -{"ku", IS_PINYIN, 168}, -{"kua", IS_PINYIN, 169}, -{"kuai", IS_PINYIN, 170}, -{"kuan", IS_PINYIN, 171}, -{"kuang", IS_PINYIN, 172}, -{"kuei", IS_PINYIN, 173}, -{"kuen", IS_PINYIN, 174}, -{"kung", IS_PINYIN, 166}, -{"kuo", IS_PINYIN, 175}, -{"la", IS_PINYIN, 177}, -{"lai", IS_PINYIN, 178}, -{"lan", IS_PINYIN, 179}, -{"lang", IS_PINYIN, 180}, -{"lau", IS_PINYIN, 181}, -{"le", IS_PINYIN, 182}, -{"lei", IS_PINYIN, 183}, -{"leng", IS_PINYIN, 185}, -{"li", IS_PINYIN, 186}, -{"lia", IS_PINYIN, 187}, -{"lian", IS_PINYIN, 188}, -{"liang", IS_PINYIN, 189}, -{"liau", IS_PINYIN, 190}, -{"lie", IS_PINYIN, 191}, -{"lin", IS_PINYIN, 192}, -{"ling", IS_PINYIN, 193}, -{"liou", IS_PINYIN, 194}, -{"liu", IS_PINYIN, 202}, -{"liue", IS_PINYIN, 203}, -{"lo", IS_PINYIN, 195}, -{"lou", IS_PINYIN, 197}, -{"lu", IS_PINYIN, 198}, -{"luan", IS_PINYIN, 199}, -{"luen", IS_PINYIN, 200}, -{"lung", IS_PINYIN, 196}, -{"luo", IS_PINYIN, 201}, -{"ma", IS_PINYIN, 205}, -{"mai", IS_PINYIN, 206}, -{"man", IS_PINYIN, 207}, -{"mang", IS_PINYIN, 208}, -{"mau", IS_PINYIN, 209}, -{"me", IS_PINYIN, 210}, -{"mei", IS_PINYIN, 211}, -{"men", IS_PINYIN, 212}, -{"meng", IS_PINYIN, 213}, -{"mi", IS_PINYIN, 214}, -{"mian", IS_PINYIN, 215}, -{"miau", IS_PINYIN, 216}, -{"mie", IS_PINYIN, 217}, -{"min", IS_PINYIN, 218}, -{"ming", IS_PINYIN, 219}, -{"miou", IS_PINYIN, 220}, -{"mo", IS_PINYIN, 221}, -{"mou", IS_PINYIN, 222}, -{"mu", IS_PINYIN, 223}, -{"na", IS_PINYIN, 225}, -{"nai", IS_PINYIN, 226}, -{"nan", IS_PINYIN, 227}, -{"nang", IS_PINYIN, 228}, -{"nau", IS_PINYIN, 229}, -{"ne", IS_PINYIN, 230}, -{"nei", IS_PINYIN, 231}, -{"nen", IS_PINYIN, 232}, -{"neng", IS_PINYIN, 233}, -{"ni", IS_PINYIN, 235}, -{"nian", IS_PINYIN, 237}, -{"niang", IS_PINYIN, 238}, -{"niau", IS_PINYIN, 239}, -{"nie", IS_PINYIN, 240}, -{"nin", IS_PINYIN, 241}, -{"ning", IS_PINYIN, 242}, -{"niou", IS_PINYIN, 243}, -{"niu", IS_PINYIN, 250}, -{"niue", IS_PINYIN, 251}, -{"nou", IS_PINYIN, 245}, -{"nu", IS_PINYIN, 246}, -{"nuan", IS_PINYIN, 247}, -{"nuen", IS_PINYIN, 248}, -{"nung", IS_PINYIN, 244}, -{"nuo", IS_PINYIN, 249}, -{"o", IS_PINYIN, 252}, -{"ou", IS_PINYIN, 253}, -{"pa", IS_PINYIN, 255}, -{"pai", IS_PINYIN, 256}, -{"pan", IS_PINYIN, 257}, -{"pang", IS_PINYIN, 258}, -{"pau", IS_PINYIN, 259}, -{"pei", IS_PINYIN, 260}, -{"pen", IS_PINYIN, 261}, -{"peng", IS_PINYIN, 262}, -{"pi", IS_PINYIN, 263}, -{"pian", IS_PINYIN, 264}, -{"piau", IS_PINYIN, 265}, -{"pie", IS_PINYIN, 266}, -{"pin", IS_PINYIN, 267}, -{"ping", IS_PINYIN, 268}, -{"po", IS_PINYIN, 269}, -{"pou", IS_PINYIN, 270}, -{"pu", IS_PINYIN, 271}, -{"r", IS_PINYIN, 287}, -{"ran", IS_PINYIN, 288}, -{"rang", IS_PINYIN, 289}, -{"rau", IS_PINYIN, 290}, -{"re", IS_PINYIN, 291}, -{"ren", IS_PINYIN, 292}, -{"reng", IS_PINYIN, 293}, -{"rou", IS_PINYIN, 296}, -{"ru", IS_PINYIN, 297}, -{"ruan", IS_PINYIN, 299}, -{"ruei", IS_PINYIN, 300}, -{"ruen", IS_PINYIN, 301}, -{"rung", IS_PINYIN, 295}, -{"ruo", IS_PINYIN, 302}, -{"sa", IS_PINYIN, 304}, -{"sai", IS_PINYIN, 305}, -{"san", IS_PINYIN, 306}, -{"sang", IS_PINYIN, 307}, -{"sau", IS_PINYIN, 308}, -{"se", IS_PINYIN, 309}, -{"sen", IS_PINYIN, 310}, -{"seng", IS_PINYIN, 311}, -{"sha", IS_PINYIN, 313}, -{"shai", IS_PINYIN, 314}, -{"shan", IS_PINYIN, 315}, -{"shang", IS_PINYIN, 316}, -{"shau", IS_PINYIN, 317}, -{"she", IS_PINYIN, 318}, -{"shei", IS_PINYIN, 319}, -{"shen", IS_PINYIN, 320}, -{"sheng", IS_PINYIN, 321}, -{"shi", IS_PINYIN, 371}, -{"shia", IS_PINYIN, 372}, -{"shian", IS_PINYIN, 373}, -{"shiang", IS_PINYIN, 374}, -{"shiau", IS_PINYIN, 375}, -{"shie", IS_PINYIN, 376}, -{"shin", IS_PINYIN, 377}, -{"shing", IS_PINYIN, 378}, -{"shiou", IS_PINYIN, 380}, -{"shiu", IS_PINYIN, 381}, -{"shiuan", IS_PINYIN, 382}, -{"shiue", IS_PINYIN, 383}, -{"shiun", IS_PINYIN, 384}, -{"shiung", IS_PINYIN, 379}, -{"shou", IS_PINYIN, 323}, -{"shr", IS_PINYIN, 312}, -{"shu", IS_PINYIN, 324}, -{"shua", IS_PINYIN, 325}, -{"shuai", IS_PINYIN, 326}, -{"shuan", IS_PINYIN, 327}, -{"shuang", IS_PINYIN, 328}, -{"shuei", IS_PINYIN, 329}, -{"shuen", IS_PINYIN, 330}, -{"shuo", IS_PINYIN, 331}, -{"sou", IS_PINYIN, 334}, -{"su", IS_PINYIN, 335}, -{"suan", IS_PINYIN, 336}, -{"suei", IS_PINYIN, 337}, -{"suen", IS_PINYIN, 338}, -{"sung", IS_PINYIN, 333}, -{"suo", IS_PINYIN, 339}, -{"sz", IS_PINYIN, 303}, -{"ta", IS_PINYIN, 341}, -{"tai", IS_PINYIN, 342}, -{"tan", IS_PINYIN, 343}, -{"tang", IS_PINYIN, 344}, -{"tau", IS_PINYIN, 345}, -{"te", IS_PINYIN, 346}, -{"teng", IS_PINYIN, 347}, -{"ti", IS_PINYIN, 348}, -{"tian", IS_PINYIN, 349}, -{"tiau", IS_PINYIN, 350}, -{"tie", IS_PINYIN, 351}, -{"ting", IS_PINYIN, 352}, -{"tou", IS_PINYIN, 354}, -{"tsa", IS_PINYIN, 24}, -{"tsai", IS_PINYIN, 25}, -{"tsan", IS_PINYIN, 26}, -{"tsang", IS_PINYIN, 27}, -{"tsau", IS_PINYIN, 28}, -{"tse", IS_PINYIN, 29}, -{"tsen", IS_PINYIN, 30}, -{"tseng", IS_PINYIN, 31}, -{"tsou", IS_PINYIN, 54}, -{"tsu", IS_PINYIN, 55}, -{"tsuan", IS_PINYIN, 56}, -{"tsuei", IS_PINYIN, 57}, -{"tsun", IS_PINYIN, 58}, -{"tsung", IS_PINYIN, 53}, -{"tsuo", IS_PINYIN, 59}, -{"tsz", IS_PINYIN, 23}, -{"tu", IS_PINYIN, 355}, -{"tuan", IS_PINYIN, 356}, -{"tuei", IS_PINYIN, 357}, -{"tuen", IS_PINYIN, 358}, -{"tung", IS_PINYIN, 353}, -{"tuo", IS_PINYIN, 359}, -{"tz", IS_PINYIN, 402}, -{"tza", IS_PINYIN, 403}, -{"tzai", IS_PINYIN, 404}, -{"tzan", IS_PINYIN, 405}, -{"tzang", IS_PINYIN, 406}, -{"tzau", IS_PINYIN, 407}, -{"tze", IS_PINYIN, 408}, -{"tzei", IS_PINYIN, 409}, -{"tzen", IS_PINYIN, 410}, -{"tzeng", IS_PINYIN, 411}, -{"tzou", IS_PINYIN, 435}, -{"tzu", IS_PINYIN, 436}, -{"tzuan", IS_PINYIN, 437}, -{"tzuei", IS_PINYIN, 438}, -{"tzuen", IS_PINYIN, 439}, -{"tzung", IS_PINYIN, 434}, -{"tzuo", IS_PINYIN, 440}, -{"wa", IS_PINYIN, 361}, -{"wai", IS_PINYIN, 362}, -{"wan", IS_PINYIN, 363}, -{"wang", IS_PINYIN, 364}, -{"wei", IS_PINYIN, 365}, -{"wen", IS_PINYIN, 366}, -{"weng", IS_PINYIN, 367}, -{"wo", IS_PINYIN, 368}, -{"wu", IS_PINYIN, 369}, -{"ya", IS_PINYIN, 386}, -{"yai", IS_PINYIN, 387}, -{"yan", IS_PINYIN, 388}, -{"yang", IS_PINYIN, 389}, -{"yau", IS_PINYIN, 390}, -{"ye", IS_PINYIN, 391}, -{"yi", IS_PINYIN, 392}, -{"yin", IS_PINYIN, 393}, -{"ying", IS_PINYIN, 394}, -{"yo", IS_PINYIN, 395}, -{"you", IS_PINYIN, 397}, -{"yu", IS_PINYIN, 398}, -{"yuan", IS_PINYIN, 399}, -{"yue", IS_PINYIN, 400}, -{"yun", IS_PINYIN, 401}, -{"yung", IS_PINYIN, 396} -}; - -const chewing_index_item_t hsu_bopomofo_index[] = { -{"ㄅ" /* "b" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 6}, -{"ㄅㄚ" /* "ba" */, IS_BOPOMOFO|IS_PINYIN, 7}, -{"ㄅㄛ" /* "bo" */, IS_BOPOMOFO|IS_PINYIN, 21}, -{"ㄅㄞ" /* "bai" */, IS_BOPOMOFO|IS_PINYIN, 8}, -{"ㄅㄟ" /* "bei" */, IS_BOPOMOFO|IS_PINYIN, 12}, -{"ㄅㄠ" /* "bao" */, IS_BOPOMOFO|IS_PINYIN, 11}, -{"ㄅㄢ" /* "ban" */, IS_BOPOMOFO|IS_PINYIN, 9}, -{"ㄅㄣ" /* "ben" */, IS_BOPOMOFO|IS_PINYIN, 13}, -{"ㄅㄤ" /* "bang" */, IS_BOPOMOFO|IS_PINYIN, 10}, -{"ㄅㄥ" /* "beng" */, IS_BOPOMOFO|IS_PINYIN, 14}, -{"ㄅㄧ" /* "bi" */, IS_BOPOMOFO|IS_PINYIN, 15}, -{"ㄅㄧㄝ" /* "bie" */, IS_BOPOMOFO|IS_PINYIN, 18}, -{"ㄅㄧㄠ" /* "biao" */, IS_BOPOMOFO|IS_PINYIN, 17}, -{"ㄅㄧㄢ" /* "bian" */, IS_BOPOMOFO|IS_PINYIN, 16}, -{"ㄅㄧㄣ" /* "bin" */, IS_BOPOMOFO|IS_PINYIN, 19}, -{"ㄅㄧㄥ" /* "bing" */, IS_BOPOMOFO|IS_PINYIN, 20}, -{"ㄅㄨ" /* "bu" */, IS_BOPOMOFO|IS_PINYIN, 22}, -{"ㄆ" /* "p" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 254}, -{"ㄆㄚ" /* "pa" */, IS_BOPOMOFO|IS_PINYIN, 255}, -{"ㄆㄛ" /* "po" */, IS_BOPOMOFO|IS_PINYIN, 269}, -{"ㄆㄞ" /* "pai" */, IS_BOPOMOFO|IS_PINYIN, 256}, -{"ㄆㄟ" /* "pei" */, IS_BOPOMOFO|IS_PINYIN, 260}, -{"ㄆㄠ" /* "pao" */, IS_BOPOMOFO|IS_PINYIN, 259}, -{"ㄆㄡ" /* "pou" */, IS_BOPOMOFO|IS_PINYIN, 270}, -{"ㄆㄢ" /* "pan" */, IS_BOPOMOFO|IS_PINYIN, 257}, -{"ㄆㄣ" /* "pen" */, IS_BOPOMOFO|IS_PINYIN, 261}, -{"ㄆㄤ" /* "pang" */, IS_BOPOMOFO|IS_PINYIN, 258}, -{"ㄆㄥ" /* "peng" */, IS_BOPOMOFO|IS_PINYIN, 262}, -{"ㄆㄧ" /* "pi" */, IS_BOPOMOFO|IS_PINYIN, 263}, -{"ㄆㄧㄝ" /* "pie" */, IS_BOPOMOFO|IS_PINYIN, 266}, -{"ㄆㄧㄠ" /* "piao" */, IS_BOPOMOFO|IS_PINYIN, 265}, -{"ㄆㄧㄢ" /* "pian" */, IS_BOPOMOFO|IS_PINYIN, 264}, -{"ㄆㄧㄣ" /* "pin" */, IS_BOPOMOFO|IS_PINYIN, 267}, -{"ㄆㄧㄥ" /* "ping" */, IS_BOPOMOFO|IS_PINYIN, 268}, -{"ㄆㄨ" /* "pu" */, IS_BOPOMOFO|IS_PINYIN, 271}, -{"ㄇ" /* "an" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 3}, -{"ㄇㄚ" /* "ma" */, IS_BOPOMOFO|IS_PINYIN, 205}, -{"ㄇㄛ" /* "mo" */, IS_BOPOMOFO|IS_PINYIN, 221}, -{"ㄇㄜ" /* "me" */, IS_BOPOMOFO|IS_PINYIN, 210}, -{"ㄇㄞ" /* "mai" */, IS_BOPOMOFO|IS_PINYIN, 206}, -{"ㄇㄟ" /* "mei" */, IS_BOPOMOFO|IS_PINYIN, 211}, -{"ㄇㄠ" /* "mao" */, IS_BOPOMOFO|IS_PINYIN, 209}, -{"ㄇㄡ" /* "mou" */, IS_BOPOMOFO|IS_PINYIN, 222}, -{"ㄇㄢ" /* "man" */, IS_BOPOMOFO|IS_PINYIN, 207}, -{"ㄇㄣ" /* "men" */, IS_BOPOMOFO|IS_PINYIN, 212}, -{"ㄇㄤ" /* "mang" */, IS_BOPOMOFO|IS_PINYIN, 208}, -{"ㄇㄥ" /* "meng" */, IS_BOPOMOFO|IS_PINYIN, 213}, -{"ㄇㄧ" /* "mi" */, IS_BOPOMOFO|IS_PINYIN, 214}, -{"ㄇㄧㄝ" /* "mie" */, IS_BOPOMOFO|IS_PINYIN, 217}, -{"ㄇㄧㄠ" /* "miao" */, IS_BOPOMOFO|IS_PINYIN, 216}, -{"ㄇㄧㄡ" /* "miu" */, IS_BOPOMOFO|IS_PINYIN, 220}, -{"ㄇㄧㄢ" /* "mian" */, IS_BOPOMOFO|IS_PINYIN, 215}, -{"ㄇㄧㄣ" /* "min" */, IS_BOPOMOFO|IS_PINYIN, 218}, -{"ㄇㄧㄥ" /* "ming" */, IS_BOPOMOFO|IS_PINYIN, 219}, -{"ㄇㄨ" /* "mu" */, IS_BOPOMOFO|IS_PINYIN, 223}, -{"ㄈ" /* "f" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 90}, -{"ㄈㄚ" /* "fa" */, IS_BOPOMOFO|IS_PINYIN, 91}, -{"ㄈㄛ" /* "fo" */, IS_BOPOMOFO|IS_PINYIN, 98}, -{"ㄈㄜ" /* "fe" */, IS_BOPOMOFO, 94}, -{"ㄈㄟ" /* "fei" */, IS_BOPOMOFO|IS_PINYIN, 95}, -{"ㄈㄡ" /* "fou" */, IS_BOPOMOFO|IS_PINYIN, 99}, -{"ㄈㄢ" /* "fan" */, IS_BOPOMOFO|IS_PINYIN, 92}, -{"ㄈㄣ" /* "fen" */, IS_BOPOMOFO|IS_PINYIN, 96}, -{"ㄈㄤ" /* "fang" */, IS_BOPOMOFO|IS_PINYIN, 93}, -{"ㄈㄥ" /* "feng" */, IS_BOPOMOFO|IS_PINYIN, 97}, -{"ㄈㄨ" /* "fu" */, IS_BOPOMOFO|IS_PINYIN, 100}, -{"ㄉ" /* "d" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 60}, -{"ㄉㄚ" /* "da" */, IS_BOPOMOFO|IS_PINYIN, 61}, -{"ㄉㄜ" /* "de" */, IS_BOPOMOFO|IS_PINYIN, 66}, -{"ㄉㄞ" /* "dai" */, IS_BOPOMOFO|IS_PINYIN, 62}, -{"ㄉㄟ" /* "dei" */, IS_BOPOMOFO|IS_PINYIN, 67}, -{"ㄉㄠ" /* "dao" */, IS_BOPOMOFO|IS_PINYIN, 65}, -{"ㄉㄡ" /* "dou" */, IS_BOPOMOFO|IS_PINYIN, 79}, -{"ㄉㄢ" /* "dan" */, IS_BOPOMOFO|IS_PINYIN, 63}, -{"ㄉㄣ" /* "den" */, IS_BOPOMOFO, 68}, -{"ㄉㄤ" /* "dang" */, IS_BOPOMOFO|IS_PINYIN, 64}, -{"ㄉㄥ" /* "deng" */, IS_BOPOMOFO|IS_PINYIN, 69}, -{"ㄉㄧ" /* "di" */, IS_BOPOMOFO|IS_PINYIN, 70}, -{"ㄉㄧㄚ" /* "dia" */, IS_BOPOMOFO|IS_PINYIN, 71}, -{"ㄉㄧㄝ" /* "die" */, IS_BOPOMOFO|IS_PINYIN, 74}, -{"ㄉㄧㄠ" /* "diao" */, IS_BOPOMOFO|IS_PINYIN, 73}, -{"ㄉㄧㄡ" /* "diu" */, IS_BOPOMOFO|IS_PINYIN, 77}, -{"ㄉㄧㄢ" /* "dian" */, IS_BOPOMOFO|IS_PINYIN, 72}, -{"ㄉㄧㄣ" /* "din" */, IS_BOPOMOFO, 75}, -{"ㄉㄧㄥ" /* "ding" */, IS_BOPOMOFO|IS_PINYIN, 76}, -{"ㄉㄨ" /* "du" */, IS_BOPOMOFO|IS_PINYIN, 80}, -{"ㄉㄨㄛ" /* "duo" */, IS_BOPOMOFO|IS_PINYIN, 84}, -{"ㄉㄨㄟ" /* "dui" */, IS_BOPOMOFO|IS_PINYIN, 82}, -{"ㄉㄨㄢ" /* "duan" */, IS_BOPOMOFO|IS_PINYIN, 81}, -{"ㄉㄨㄣ" /* "dun" */, IS_BOPOMOFO|IS_PINYIN, 83}, -{"ㄉㄨㄥ" /* "dong" */, IS_BOPOMOFO|IS_PINYIN, 78}, -{"ㄊ" /* "t" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 340}, -{"ㄊㄚ" /* "ta" */, IS_BOPOMOFO|IS_PINYIN, 341}, -{"ㄊㄜ" /* "te" */, IS_BOPOMOFO|IS_PINYIN, 346}, -{"ㄊㄞ" /* "tai" */, IS_BOPOMOFO|IS_PINYIN, 342}, -{"ㄊㄠ" /* "tao" */, IS_BOPOMOFO|IS_PINYIN, 345}, -{"ㄊㄡ" /* "tou" */, IS_BOPOMOFO|IS_PINYIN, 354}, -{"ㄊㄢ" /* "tan" */, IS_BOPOMOFO|IS_PINYIN, 343}, -{"ㄊㄤ" /* "tang" */, IS_BOPOMOFO|IS_PINYIN, 344}, -{"ㄊㄥ" /* "teng" */, IS_BOPOMOFO|IS_PINYIN, 347}, -{"ㄊㄧ" /* "ti" */, IS_BOPOMOFO|IS_PINYIN, 348}, -{"ㄊㄧㄝ" /* "tie" */, IS_BOPOMOFO|IS_PINYIN, 351}, -{"ㄊㄧㄠ" /* "tiao" */, IS_BOPOMOFO|IS_PINYIN, 350}, -{"ㄊㄧㄢ" /* "tian" */, IS_BOPOMOFO|IS_PINYIN, 349}, -{"ㄊㄧㄥ" /* "ting" */, IS_BOPOMOFO|IS_PINYIN, 352}, -{"ㄊㄨ" /* "tu" */, IS_BOPOMOFO|IS_PINYIN, 355}, -{"ㄊㄨㄛ" /* "tuo" */, IS_BOPOMOFO|IS_PINYIN, 359}, -{"ㄊㄨㄟ" /* "tui" */, IS_BOPOMOFO|IS_PINYIN, 357}, -{"ㄊㄨㄢ" /* "tuan" */, IS_BOPOMOFO|IS_PINYIN, 356}, -{"ㄊㄨㄣ" /* "tun" */, IS_BOPOMOFO|IS_PINYIN, 358}, -{"ㄊㄨㄥ" /* "tong" */, IS_BOPOMOFO|IS_PINYIN, 353}, -{"ㄋ" /* "en" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 87}, -{"ㄋㄚ" /* "na" */, IS_BOPOMOFO|IS_PINYIN, 225}, -{"ㄋㄜ" /* "ne" */, IS_BOPOMOFO|IS_PINYIN, 230}, -{"ㄋㄞ" /* "nai" */, IS_BOPOMOFO|IS_PINYIN, 226}, -{"ㄋㄟ" /* "nei" */, IS_BOPOMOFO|IS_PINYIN, 231}, -{"ㄋㄠ" /* "nao" */, IS_BOPOMOFO|IS_PINYIN, 229}, -{"ㄋㄡ" /* "nou" */, IS_BOPOMOFO|IS_PINYIN, 245}, -{"ㄋㄢ" /* "nan" */, IS_BOPOMOFO|IS_PINYIN, 227}, -{"ㄋㄣ" /* "nen" */, IS_BOPOMOFO|IS_PINYIN, 232}, -{"ㄋㄤ" /* "nang" */, IS_BOPOMOFO|IS_PINYIN, 228}, -{"ㄋㄥ" /* "neng" */, IS_BOPOMOFO|IS_PINYIN, 233}, -{"ㄋㄧ" /* "ni" */, IS_BOPOMOFO|IS_PINYIN, 235}, -{"ㄋㄧㄚ" /* "nia" */, IS_BOPOMOFO, 236}, -{"ㄋㄧㄝ" /* "nie" */, IS_BOPOMOFO|IS_PINYIN, 240}, -{"ㄋㄧㄠ" /* "niao" */, IS_BOPOMOFO|IS_PINYIN, 239}, -{"ㄋㄧㄡ" /* "niu" */, IS_BOPOMOFO|IS_PINYIN, 243}, -{"ㄋㄧㄢ" /* "nian" */, IS_BOPOMOFO|IS_PINYIN, 237}, -{"ㄋㄧㄣ" /* "nin" */, IS_BOPOMOFO|IS_PINYIN, 241}, -{"ㄋㄧㄤ" /* "niang" */, IS_BOPOMOFO|IS_PINYIN, 238}, -{"ㄋㄧㄥ" /* "ning" */, IS_BOPOMOFO|IS_PINYIN, 242}, -{"ㄋㄨ" /* "nu" */, IS_BOPOMOFO|IS_PINYIN, 246}, -{"ㄋㄨㄛ" /* "nuo" */, IS_BOPOMOFO|IS_PINYIN, 249}, -{"ㄋㄨㄢ" /* "nuan" */, IS_BOPOMOFO|IS_PINYIN, 247}, -{"ㄋㄨㄣ" /* "nun" */, IS_BOPOMOFO, 248}, -{"ㄋㄨㄥ" /* "nong" */, IS_BOPOMOFO|IS_PINYIN, 244}, -{"ㄋㄩ" /* "nv" */, IS_BOPOMOFO|IS_PINYIN, 250}, -{"ㄋㄩㄝ" /* "nve" */, IS_BOPOMOFO|IS_PINYIN, 251}, -{"ㄌ" /* "er" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 89}, -{"ㄌㄚ" /* "la" */, IS_BOPOMOFO|IS_PINYIN, 177}, -{"ㄌㄛ" /* "lo" */, IS_BOPOMOFO|IS_PINYIN, 195}, -{"ㄌㄜ" /* "le" */, IS_BOPOMOFO|IS_PINYIN, 182}, -{"ㄌㄞ" /* "lai" */, IS_BOPOMOFO|IS_PINYIN, 178}, -{"ㄌㄟ" /* "lei" */, IS_BOPOMOFO|IS_PINYIN, 183}, -{"ㄌㄠ" /* "lao" */, IS_BOPOMOFO|IS_PINYIN, 181}, -{"ㄌㄡ" /* "lou" */, IS_BOPOMOFO|IS_PINYIN, 197}, -{"ㄌㄢ" /* "lan" */, IS_BOPOMOFO|IS_PINYIN, 179}, -{"ㄌㄣ" /* "len" */, IS_BOPOMOFO, 184}, -{"ㄌㄤ" /* "lang" */, IS_BOPOMOFO|IS_PINYIN, 180}, -{"ㄌㄥ" /* "leng" */, IS_BOPOMOFO|IS_PINYIN, 185}, -{"ㄌㄧ" /* "li" */, IS_BOPOMOFO|IS_PINYIN, 186}, -{"ㄌㄧㄚ" /* "lia" */, IS_BOPOMOFO|IS_PINYIN, 187}, -{"ㄌㄧㄝ" /* "lie" */, IS_BOPOMOFO|IS_PINYIN, 191}, -{"ㄌㄧㄠ" /* "liao" */, IS_BOPOMOFO|IS_PINYIN, 190}, -{"ㄌㄧㄡ" /* "liu" */, IS_BOPOMOFO|IS_PINYIN, 194}, -{"ㄌㄧㄢ" /* "lian" */, IS_BOPOMOFO|IS_PINYIN, 188}, -{"ㄌㄧㄣ" /* "lin" */, IS_BOPOMOFO|IS_PINYIN, 192}, -{"ㄌㄧㄤ" /* "liang" */, IS_BOPOMOFO|IS_PINYIN, 189}, -{"ㄌㄧㄥ" /* "ling" */, IS_BOPOMOFO|IS_PINYIN, 193}, -{"ㄌㄨ" /* "lu" */, IS_BOPOMOFO|IS_PINYIN, 198}, -{"ㄌㄨㄛ" /* "luo" */, IS_BOPOMOFO|IS_PINYIN, 201}, -{"ㄌㄨㄢ" /* "luan" */, IS_BOPOMOFO|IS_PINYIN, 199}, -{"ㄌㄨㄣ" /* "lun" */, IS_BOPOMOFO|IS_PINYIN, 200}, -{"ㄌㄨㄥ" /* "long" */, IS_BOPOMOFO|IS_PINYIN, 196}, -{"ㄌㄩ" /* "lv" */, IS_BOPOMOFO|IS_PINYIN, 202}, -{"ㄌㄩㄝ" /* "lve" */, IS_BOPOMOFO|IS_PINYIN, 203}, -{"ㄍ" /* "e" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 85}, -{"ㄍㄚ" /* "ga" */, IS_BOPOMOFO|IS_PINYIN, 102}, -{"ㄍㄜ" /* "ge" */, IS_BOPOMOFO|IS_PINYIN, 107}, -{"ㄍㄞ" /* "gai" */, IS_BOPOMOFO|IS_PINYIN, 103}, -{"ㄍㄟ" /* "gei" */, IS_BOPOMOFO|IS_PINYIN, 108}, -{"ㄍㄠ" /* "gao" */, IS_BOPOMOFO|IS_PINYIN, 106}, -{"ㄍㄡ" /* "gou" */, IS_BOPOMOFO|IS_PINYIN, 112}, -{"ㄍㄢ" /* "gan" */, IS_BOPOMOFO|IS_PINYIN, 104}, -{"ㄍㄣ" /* "gen" */, IS_BOPOMOFO|IS_PINYIN, 109}, -{"ㄍㄤ" /* "gang" */, IS_BOPOMOFO|IS_PINYIN, 105}, -{"ㄍㄥ" /* "geng" */, IS_BOPOMOFO|IS_PINYIN, 110}, -{"ㄍㄧ" /* "ji" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 142}, -{"ㄍㄧㄚ" /* "jia" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 143}, -{"ㄍㄧㄝ" /* "jie" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 147}, -{"ㄍㄧㄠ" /* "jiao" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 146}, -{"ㄍㄧㄡ" /* "jiu" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 151}, -{"ㄍㄧㄢ" /* "jian" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 144}, -{"ㄍㄧㄣ" /* "jin" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 148}, -{"ㄍㄧㄤ" /* "jiang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 145}, -{"ㄍㄧㄥ" /* "jing" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 149}, -{"ㄍㄨ" /* "gu" */, IS_BOPOMOFO|IS_PINYIN, 113}, -{"ㄍㄨㄚ" /* "gua" */, IS_BOPOMOFO|IS_PINYIN, 114}, -{"ㄍㄨㄛ" /* "guo" */, IS_BOPOMOFO|IS_PINYIN, 120}, -{"ㄍㄨㄞ" /* "guai" */, IS_BOPOMOFO|IS_PINYIN, 115}, -{"ㄍㄨㄟ" /* "gui" */, IS_BOPOMOFO|IS_PINYIN, 118}, -{"ㄍㄨㄢ" /* "guan" */, IS_BOPOMOFO|IS_PINYIN, 116}, -{"ㄍㄨㄣ" /* "gun" */, IS_BOPOMOFO|IS_PINYIN, 119}, -{"ㄍㄨㄤ" /* "guang" */, IS_BOPOMOFO|IS_PINYIN, 117}, -{"ㄍㄨㄥ" /* "gong" */, IS_BOPOMOFO|IS_PINYIN, 111}, -{"ㄍㄩ" /* "ju" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 152}, -{"ㄍㄩㄝ" /* "jue" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 154}, -{"ㄍㄩㄢ" /* "juan" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 153}, -{"ㄍㄩㄣ" /* "jun" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 155}, -{"ㄍㄩㄥ" /* "jiong" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 150}, -{"ㄎ" /* "ang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 4}, -{"ㄎㄚ" /* "ka" */, IS_BOPOMOFO|IS_PINYIN, 157}, -{"ㄎㄜ" /* "ke" */, IS_BOPOMOFO|IS_PINYIN, 162}, -{"ㄎㄞ" /* "kai" */, IS_BOPOMOFO|IS_PINYIN, 158}, -{"ㄎㄟ" /* "kei" */, IS_BOPOMOFO, 163}, -{"ㄎㄠ" /* "kao" */, IS_BOPOMOFO|IS_PINYIN, 161}, -{"ㄎㄡ" /* "kou" */, IS_BOPOMOFO|IS_PINYIN, 167}, -{"ㄎㄢ" /* "kan" */, IS_BOPOMOFO|IS_PINYIN, 159}, -{"ㄎㄣ" /* "ken" */, IS_BOPOMOFO|IS_PINYIN, 164}, -{"ㄎㄤ" /* "kang" */, IS_BOPOMOFO|IS_PINYIN, 160}, -{"ㄎㄥ" /* "keng" */, IS_BOPOMOFO|IS_PINYIN, 165}, -{"ㄎㄨ" /* "ku" */, IS_BOPOMOFO|IS_PINYIN, 168}, -{"ㄎㄨㄚ" /* "kua" */, IS_BOPOMOFO|IS_PINYIN, 169}, -{"ㄎㄨㄛ" /* "kuo" */, IS_BOPOMOFO|IS_PINYIN, 175}, -{"ㄎㄨㄞ" /* "kuai" */, IS_BOPOMOFO|IS_PINYIN, 170}, -{"ㄎㄨㄟ" /* "kui" */, IS_BOPOMOFO|IS_PINYIN, 173}, -{"ㄎㄨㄢ" /* "kuan" */, IS_BOPOMOFO|IS_PINYIN, 171}, -{"ㄎㄨㄣ" /* "kun" */, IS_BOPOMOFO|IS_PINYIN, 174}, -{"ㄎㄨㄤ" /* "kuang" */, IS_BOPOMOFO|IS_PINYIN, 172}, -{"ㄎㄨㄥ" /* "kong" */, IS_BOPOMOFO|IS_PINYIN, 166}, -{"ㄏ" /* "o" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 252}, -{"ㄏㄚ" /* "ha" */, IS_BOPOMOFO|IS_PINYIN, 122}, -{"ㄏㄜ" /* "he" */, IS_BOPOMOFO|IS_PINYIN, 127}, -{"ㄏㄞ" /* "hai" */, IS_BOPOMOFO|IS_PINYIN, 123}, -{"ㄏㄟ" /* "hei" */, IS_BOPOMOFO|IS_PINYIN, 128}, -{"ㄏㄠ" /* "hao" */, IS_BOPOMOFO|IS_PINYIN, 126}, -{"ㄏㄡ" /* "hou" */, IS_BOPOMOFO|IS_PINYIN, 132}, -{"ㄏㄢ" /* "han" */, IS_BOPOMOFO|IS_PINYIN, 124}, -{"ㄏㄣ" /* "hen" */, IS_BOPOMOFO|IS_PINYIN, 129}, -{"ㄏㄤ" /* "hang" */, IS_BOPOMOFO|IS_PINYIN, 125}, -{"ㄏㄥ" /* "heng" */, IS_BOPOMOFO|IS_PINYIN, 130}, -{"ㄏㄨ" /* "hu" */, IS_BOPOMOFO|IS_PINYIN, 133}, -{"ㄏㄨㄚ" /* "hua" */, IS_BOPOMOFO|IS_PINYIN, 134}, -{"ㄏㄨㄛ" /* "huo" */, IS_BOPOMOFO|IS_PINYIN, 140}, -{"ㄏㄨㄞ" /* "huai" */, IS_BOPOMOFO|IS_PINYIN, 135}, -{"ㄏㄨㄟ" /* "hui" */, IS_BOPOMOFO|IS_PINYIN, 138}, -{"ㄏㄨㄢ" /* "huan" */, IS_BOPOMOFO|IS_PINYIN, 136}, -{"ㄏㄨㄣ" /* "hun" */, IS_BOPOMOFO|IS_PINYIN, 139}, -{"ㄏㄨㄤ" /* "huang" */, IS_BOPOMOFO|IS_PINYIN, 137}, -{"ㄏㄨㄥ" /* "hong" */, IS_BOPOMOFO|IS_PINYIN, 131}, -{"ㄐ" /* "zhi" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 422}, -{"ㄐㄚ" /* "zha" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 413}, -{"ㄐㄜ" /* "zhe" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 418}, -{"ㄐㄞ" /* "zhai" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 414}, -{"ㄐㄟ" /* "zhei" */, IS_BOPOMOFO|HSU_CORRECT, 419}, -{"ㄐㄠ" /* "zhao" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 417}, -{"ㄐㄡ" /* "zhou" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 424}, -{"ㄐㄢ" /* "zhan" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 415}, -{"ㄐㄣ" /* "zhen" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 420}, -{"ㄐㄤ" /* "zhang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 416}, -{"ㄐㄥ" /* "zheng" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 421}, -{"ㄐㄧ" /* "ji" */, IS_BOPOMOFO|IS_PINYIN, 142}, -{"ㄐㄧㄚ" /* "jia" */, IS_BOPOMOFO|IS_PINYIN, 143}, -{"ㄐㄧㄝ" /* "jie" */, IS_BOPOMOFO|IS_PINYIN, 147}, -{"ㄐㄧㄠ" /* "jiao" */, IS_BOPOMOFO|IS_PINYIN, 146}, -{"ㄐㄧㄡ" /* "jiu" */, IS_BOPOMOFO|IS_PINYIN, 151}, -{"ㄐㄧㄢ" /* "jian" */, IS_BOPOMOFO|IS_PINYIN, 144}, -{"ㄐㄧㄣ" /* "jin" */, IS_BOPOMOFO|IS_PINYIN, 148}, -{"ㄐㄧㄤ" /* "jiang" */, IS_BOPOMOFO|IS_PINYIN, 145}, -{"ㄐㄧㄥ" /* "jing" */, IS_BOPOMOFO|IS_PINYIN, 149}, -{"ㄐㄨ" /* "zhu" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 425}, -{"ㄐㄨㄚ" /* "zhua" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 426}, -{"ㄐㄨㄛ" /* "zhuo" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 432}, -{"ㄐㄨㄞ" /* "zhuai" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 427}, -{"ㄐㄨㄟ" /* "zhui" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 430}, -{"ㄐㄨㄢ" /* "zhuan" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 428}, -{"ㄐㄨㄣ" /* "zhun" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 431}, -{"ㄐㄨㄤ" /* "zhuang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 429}, -{"ㄐㄨㄥ" /* "zhong" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 423}, -{"ㄐㄩ" /* "ju" */, IS_BOPOMOFO|IS_PINYIN, 152}, -{"ㄐㄩㄝ" /* "jue" */, IS_BOPOMOFO|IS_PINYIN, 154}, -{"ㄐㄩㄢ" /* "juan" */, IS_BOPOMOFO|IS_PINYIN, 153}, -{"ㄐㄩㄣ" /* "jun" */, IS_BOPOMOFO|IS_PINYIN, 155}, -{"ㄐㄩㄥ" /* "jiong" */, IS_BOPOMOFO|IS_PINYIN, 150}, -{"ㄑ" /* "chi" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 41}, -{"ㄑㄚ" /* "cha" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 33}, -{"ㄑㄜ" /* "che" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 38}, -{"ㄑㄞ" /* "chai" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 34}, -{"ㄑㄠ" /* "chao" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 37}, -{"ㄑㄡ" /* "chou" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 43}, -{"ㄑㄢ" /* "chan" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 35}, -{"ㄑㄣ" /* "chen" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 39}, -{"ㄑㄤ" /* "chang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 36}, -{"ㄑㄥ" /* "cheng" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 40}, -{"ㄑㄧ" /* "qi" */, IS_BOPOMOFO|IS_PINYIN, 273}, -{"ㄑㄧㄚ" /* "qia" */, IS_BOPOMOFO|IS_PINYIN, 274}, -{"ㄑㄧㄝ" /* "qie" */, IS_BOPOMOFO|IS_PINYIN, 278}, -{"ㄑㄧㄠ" /* "qiao" */, IS_BOPOMOFO|IS_PINYIN, 277}, -{"ㄑㄧㄡ" /* "qiu" */, IS_BOPOMOFO|IS_PINYIN, 282}, -{"ㄑㄧㄢ" /* "qian" */, IS_BOPOMOFO|IS_PINYIN, 275}, -{"ㄑㄧㄣ" /* "qin" */, IS_BOPOMOFO|IS_PINYIN, 279}, -{"ㄑㄧㄤ" /* "qiang" */, IS_BOPOMOFO|IS_PINYIN, 276}, -{"ㄑㄧㄥ" /* "qing" */, IS_BOPOMOFO|IS_PINYIN, 280}, -{"ㄑㄨ" /* "chu" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 44}, -{"ㄑㄨㄚ" /* "chua" */, IS_BOPOMOFO|HSU_CORRECT, 45}, -{"ㄑㄨㄛ" /* "chuo" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 51}, -{"ㄑㄨㄞ" /* "chuai" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 46}, -{"ㄑㄨㄟ" /* "chui" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 49}, -{"ㄑㄨㄢ" /* "chuan" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 47}, -{"ㄑㄨㄣ" /* "chun" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 50}, -{"ㄑㄨㄤ" /* "chuang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 48}, -{"ㄑㄨㄥ" /* "chong" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 42}, -{"ㄑㄩ" /* "qu" */, IS_BOPOMOFO|IS_PINYIN, 283}, -{"ㄑㄩㄝ" /* "que" */, IS_BOPOMOFO|IS_PINYIN, 285}, -{"ㄑㄩㄢ" /* "quan" */, IS_BOPOMOFO|IS_PINYIN, 284}, -{"ㄑㄩㄣ" /* "qun" */, IS_BOPOMOFO|IS_PINYIN, 286}, -{"ㄑㄩㄥ" /* "qiong" */, IS_BOPOMOFO|IS_PINYIN, 281}, -{"ㄒ" /* "shi" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 322}, -{"ㄒㄚ" /* "sha" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 313}, -{"ㄒㄜ" /* "she" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 318}, -{"ㄒㄞ" /* "shai" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 314}, -{"ㄒㄟ" /* "shei" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 319}, -{"ㄒㄠ" /* "shao" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 317}, -{"ㄒㄡ" /* "shou" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 323}, -{"ㄒㄢ" /* "shan" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 315}, -{"ㄒㄣ" /* "shen" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 320}, -{"ㄒㄤ" /* "shang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 316}, -{"ㄒㄥ" /* "sheng" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 321}, -{"ㄒㄧ" /* "xi" */, IS_BOPOMOFO|IS_PINYIN, 371}, -{"ㄒㄧㄚ" /* "xia" */, IS_BOPOMOFO|IS_PINYIN, 372}, -{"ㄒㄧㄝ" /* "xie" */, IS_BOPOMOFO|IS_PINYIN, 376}, -{"ㄒㄧㄠ" /* "xiao" */, IS_BOPOMOFO|IS_PINYIN, 375}, -{"ㄒㄧㄡ" /* "xiu" */, IS_BOPOMOFO|IS_PINYIN, 380}, -{"ㄒㄧㄢ" /* "xian" */, IS_BOPOMOFO|IS_PINYIN, 373}, -{"ㄒㄧㄣ" /* "xin" */, IS_BOPOMOFO|IS_PINYIN, 377}, -{"ㄒㄧㄤ" /* "xiang" */, IS_BOPOMOFO|IS_PINYIN, 374}, -{"ㄒㄧㄥ" /* "xing" */, IS_BOPOMOFO|IS_PINYIN, 378}, -{"ㄒㄨ" /* "shu" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 324}, -{"ㄒㄨㄚ" /* "shua" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 325}, -{"ㄒㄨㄛ" /* "shuo" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 331}, -{"ㄒㄨㄞ" /* "shuai" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 326}, -{"ㄒㄨㄟ" /* "shui" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 329}, -{"ㄒㄨㄢ" /* "shuan" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 327}, -{"ㄒㄨㄣ" /* "shun" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 330}, -{"ㄒㄨㄤ" /* "shuang" */, IS_BOPOMOFO|IS_PINYIN|HSU_CORRECT, 328}, -{"ㄒㄩ" /* "xu" */, IS_BOPOMOFO|IS_PINYIN, 381}, -{"ㄒㄩㄝ" /* "xue" */, IS_BOPOMOFO|IS_PINYIN, 383}, -{"ㄒㄩㄢ" /* "xuan" */, IS_BOPOMOFO|IS_PINYIN, 382}, -{"ㄒㄩㄣ" /* "xun" */, IS_BOPOMOFO|IS_PINYIN, 384}, -{"ㄒㄩㄥ" /* "xiong" */, IS_BOPOMOFO|IS_PINYIN, 379}, -{"ㄓ" /* "zhi" */, IS_BOPOMOFO|IS_PINYIN, 422}, -{"ㄓㄚ" /* "zha" */, IS_BOPOMOFO|IS_PINYIN, 413}, -{"ㄓㄜ" /* "zhe" */, IS_BOPOMOFO|IS_PINYIN, 418}, -{"ㄓㄞ" /* "zhai" */, IS_BOPOMOFO|IS_PINYIN, 414}, -{"ㄓㄟ" /* "zhei" */, IS_BOPOMOFO, 419}, -{"ㄓㄠ" /* "zhao" */, IS_BOPOMOFO|IS_PINYIN, 417}, -{"ㄓㄡ" /* "zhou" */, IS_BOPOMOFO|IS_PINYIN, 424}, -{"ㄓㄢ" /* "zhan" */, IS_BOPOMOFO|IS_PINYIN, 415}, -{"ㄓㄣ" /* "zhen" */, IS_BOPOMOFO|IS_PINYIN, 420}, -{"ㄓㄤ" /* "zhang" */, IS_BOPOMOFO|IS_PINYIN, 416}, -{"ㄓㄥ" /* "zheng" */, IS_BOPOMOFO|IS_PINYIN, 421}, -{"ㄓㄨ" /* "zhu" */, IS_BOPOMOFO|IS_PINYIN, 425}, -{"ㄓㄨㄚ" /* "zhua" */, IS_BOPOMOFO|IS_PINYIN, 426}, -{"ㄓㄨㄛ" /* "zhuo" */, IS_BOPOMOFO|IS_PINYIN, 432}, -{"ㄓㄨㄞ" /* "zhuai" */, IS_BOPOMOFO|IS_PINYIN, 427}, -{"ㄓㄨㄟ" /* "zhui" */, IS_BOPOMOFO|IS_PINYIN, 430}, -{"ㄓㄨㄢ" /* "zhuan" */, IS_BOPOMOFO|IS_PINYIN, 428}, -{"ㄓㄨㄣ" /* "zhun" */, IS_BOPOMOFO|IS_PINYIN, 431}, -{"ㄓㄨㄤ" /* "zhuang" */, IS_BOPOMOFO|IS_PINYIN, 429}, -{"ㄓㄨㄥ" /* "zhong" */, IS_BOPOMOFO|IS_PINYIN, 423}, -{"ㄔ" /* "chi" */, IS_BOPOMOFO|IS_PINYIN, 41}, -{"ㄔㄚ" /* "cha" */, IS_BOPOMOFO|IS_PINYIN, 33}, -{"ㄔㄜ" /* "che" */, IS_BOPOMOFO|IS_PINYIN, 38}, -{"ㄔㄞ" /* "chai" */, IS_BOPOMOFO|IS_PINYIN, 34}, -{"ㄔㄠ" /* "chao" */, IS_BOPOMOFO|IS_PINYIN, 37}, -{"ㄔㄡ" /* "chou" */, IS_BOPOMOFO|IS_PINYIN, 43}, -{"ㄔㄢ" /* "chan" */, IS_BOPOMOFO|IS_PINYIN, 35}, -{"ㄔㄣ" /* "chen" */, IS_BOPOMOFO|IS_PINYIN, 39}, -{"ㄔㄤ" /* "chang" */, IS_BOPOMOFO|IS_PINYIN, 36}, -{"ㄔㄥ" /* "cheng" */, IS_BOPOMOFO|IS_PINYIN, 40}, -{"ㄔㄨ" /* "chu" */, IS_BOPOMOFO|IS_PINYIN, 44}, -{"ㄔㄨㄚ" /* "chua" */, IS_BOPOMOFO, 45}, -{"ㄔㄨㄛ" /* "chuo" */, IS_BOPOMOFO|IS_PINYIN, 51}, -{"ㄔㄨㄞ" /* "chuai" */, IS_BOPOMOFO|IS_PINYIN, 46}, -{"ㄔㄨㄟ" /* "chui" */, IS_BOPOMOFO|IS_PINYIN, 49}, -{"ㄔㄨㄢ" /* "chuan" */, IS_BOPOMOFO|IS_PINYIN, 47}, -{"ㄔㄨㄣ" /* "chun" */, IS_BOPOMOFO|IS_PINYIN, 50}, -{"ㄔㄨㄤ" /* "chuang" */, IS_BOPOMOFO|IS_PINYIN, 48}, -{"ㄔㄨㄥ" /* "chong" */, IS_BOPOMOFO|IS_PINYIN, 42}, -{"ㄕ" /* "shi" */, IS_BOPOMOFO|IS_PINYIN, 322}, -{"ㄕㄚ" /* "sha" */, IS_BOPOMOFO|IS_PINYIN, 313}, -{"ㄕㄜ" /* "she" */, IS_BOPOMOFO|IS_PINYIN, 318}, -{"ㄕㄞ" /* "shai" */, IS_BOPOMOFO|IS_PINYIN, 314}, -{"ㄕㄟ" /* "shei" */, IS_BOPOMOFO|IS_PINYIN, 319}, -{"ㄕㄠ" /* "shao" */, IS_BOPOMOFO|IS_PINYIN, 317}, -{"ㄕㄡ" /* "shou" */, IS_BOPOMOFO|IS_PINYIN, 323}, -{"ㄕㄢ" /* "shan" */, IS_BOPOMOFO|IS_PINYIN, 315}, -{"ㄕㄣ" /* "shen" */, IS_BOPOMOFO|IS_PINYIN, 320}, -{"ㄕㄤ" /* "shang" */, IS_BOPOMOFO|IS_PINYIN, 316}, -{"ㄕㄥ" /* "sheng" */, IS_BOPOMOFO|IS_PINYIN, 321}, -{"ㄕㄨ" /* "shu" */, IS_BOPOMOFO|IS_PINYIN, 324}, -{"ㄕㄨㄚ" /* "shua" */, IS_BOPOMOFO|IS_PINYIN, 325}, -{"ㄕㄨㄛ" /* "shuo" */, IS_BOPOMOFO|IS_PINYIN, 331}, -{"ㄕㄨㄞ" /* "shuai" */, IS_BOPOMOFO|IS_PINYIN, 326}, -{"ㄕㄨㄟ" /* "shui" */, IS_BOPOMOFO|IS_PINYIN, 329}, -{"ㄕㄨㄢ" /* "shuan" */, IS_BOPOMOFO|IS_PINYIN, 327}, -{"ㄕㄨㄣ" /* "shun" */, IS_BOPOMOFO|IS_PINYIN, 330}, -{"ㄕㄨㄤ" /* "shuang" */, IS_BOPOMOFO|IS_PINYIN, 328}, -{"ㄖ" /* "ri" */, IS_BOPOMOFO|IS_PINYIN, 294}, -{"ㄖㄜ" /* "re" */, IS_BOPOMOFO|IS_PINYIN, 291}, -{"ㄖㄠ" /* "rao" */, IS_BOPOMOFO|IS_PINYIN, 290}, -{"ㄖㄡ" /* "rou" */, IS_BOPOMOFO|IS_PINYIN, 296}, -{"ㄖㄢ" /* "ran" */, IS_BOPOMOFO|IS_PINYIN, 288}, -{"ㄖㄣ" /* "ren" */, IS_BOPOMOFO|IS_PINYIN, 292}, -{"ㄖㄤ" /* "rang" */, IS_BOPOMOFO|IS_PINYIN, 289}, -{"ㄖㄥ" /* "reng" */, IS_BOPOMOFO|IS_PINYIN, 293}, -{"ㄖㄨ" /* "ru" */, IS_BOPOMOFO|IS_PINYIN, 297}, -{"ㄖㄨㄚ" /* "rua" */, IS_BOPOMOFO, 298}, -{"ㄖㄨㄛ" /* "ruo" */, IS_BOPOMOFO|IS_PINYIN, 302}, -{"ㄖㄨㄟ" /* "rui" */, IS_BOPOMOFO|IS_PINYIN, 300}, -{"ㄖㄨㄢ" /* "ruan" */, IS_BOPOMOFO|IS_PINYIN, 299}, -{"ㄖㄨㄣ" /* "run" */, IS_BOPOMOFO|IS_PINYIN, 301}, -{"ㄖㄨㄥ" /* "rong" */, IS_BOPOMOFO|IS_PINYIN, 295}, -{"ㄗ" /* "zi" */, IS_BOPOMOFO|IS_PINYIN, 433}, -{"ㄗㄚ" /* "za" */, IS_BOPOMOFO|IS_PINYIN, 403}, -{"ㄗㄜ" /* "ze" */, IS_BOPOMOFO|IS_PINYIN, 408}, -{"ㄗㄞ" /* "zai" */, IS_BOPOMOFO|IS_PINYIN, 404}, -{"ㄗㄟ" /* "zei" */, IS_BOPOMOFO|IS_PINYIN, 409}, -{"ㄗㄠ" /* "zao" */, IS_BOPOMOFO|IS_PINYIN, 407}, -{"ㄗㄡ" /* "zou" */, IS_BOPOMOFO|IS_PINYIN, 435}, -{"ㄗㄢ" /* "zan" */, IS_BOPOMOFO|IS_PINYIN, 405}, -{"ㄗㄣ" /* "zen" */, IS_BOPOMOFO|IS_PINYIN, 410}, -{"ㄗㄤ" /* "zang" */, IS_BOPOMOFO|IS_PINYIN, 406}, -{"ㄗㄥ" /* "zeng" */, IS_BOPOMOFO|IS_PINYIN, 411}, -{"ㄗㄨ" /* "zu" */, IS_BOPOMOFO|IS_PINYIN, 436}, -{"ㄗㄨㄛ" /* "zuo" */, IS_BOPOMOFO|IS_PINYIN, 440}, -{"ㄗㄨㄟ" /* "zui" */, IS_BOPOMOFO|IS_PINYIN, 438}, -{"ㄗㄨㄢ" /* "zuan" */, IS_BOPOMOFO|IS_PINYIN, 437}, -{"ㄗㄨㄣ" /* "zun" */, IS_BOPOMOFO|IS_PINYIN, 439}, -{"ㄗㄨㄥ" /* "zong" */, IS_BOPOMOFO|IS_PINYIN, 434}, -{"ㄘ" /* "ci" */, IS_BOPOMOFO|IS_PINYIN, 52}, -{"ㄘㄚ" /* "ca" */, IS_BOPOMOFO|IS_PINYIN, 24}, -{"ㄘㄜ" /* "ce" */, IS_BOPOMOFO|IS_PINYIN, 29}, -{"ㄘㄞ" /* "cai" */, IS_BOPOMOFO|IS_PINYIN, 25}, -{"ㄘㄠ" /* "cao" */, IS_BOPOMOFO|IS_PINYIN, 28}, -{"ㄘㄡ" /* "cou" */, IS_BOPOMOFO|IS_PINYIN, 54}, -{"ㄘㄢ" /* "can" */, IS_BOPOMOFO|IS_PINYIN, 26}, -{"ㄘㄣ" /* "cen" */, IS_BOPOMOFO|IS_PINYIN, 30}, -{"ㄘㄤ" /* "cang" */, IS_BOPOMOFO|IS_PINYIN, 27}, -{"ㄘㄥ" /* "ceng" */, IS_BOPOMOFO|IS_PINYIN, 31}, -{"ㄘㄨ" /* "cu" */, IS_BOPOMOFO|IS_PINYIN, 55}, -{"ㄘㄨㄛ" /* "cuo" */, IS_BOPOMOFO|IS_PINYIN, 59}, -{"ㄘㄨㄟ" /* "cui" */, IS_BOPOMOFO|IS_PINYIN, 57}, -{"ㄘㄨㄢ" /* "cuan" */, IS_BOPOMOFO|IS_PINYIN, 56}, -{"ㄘㄨㄣ" /* "cun" */, IS_BOPOMOFO|IS_PINYIN, 58}, -{"ㄘㄨㄥ" /* "cong" */, IS_BOPOMOFO|IS_PINYIN, 53}, -{"ㄙ" /* "si" */, IS_BOPOMOFO|IS_PINYIN, 332}, -{"ㄙㄚ" /* "sa" */, IS_BOPOMOFO|IS_PINYIN, 304}, -{"ㄙㄜ" /* "se" */, IS_BOPOMOFO|IS_PINYIN, 309}, -{"ㄙㄞ" /* "sai" */, IS_BOPOMOFO|IS_PINYIN, 305}, -{"ㄙㄠ" /* "sao" */, IS_BOPOMOFO|IS_PINYIN, 308}, -{"ㄙㄡ" /* "sou" */, IS_BOPOMOFO|IS_PINYIN, 334}, -{"ㄙㄢ" /* "san" */, IS_BOPOMOFO|IS_PINYIN, 306}, -{"ㄙㄣ" /* "sen" */, IS_BOPOMOFO|IS_PINYIN, 310}, -{"ㄙㄤ" /* "sang" */, IS_BOPOMOFO|IS_PINYIN, 307}, -{"ㄙㄥ" /* "seng" */, IS_BOPOMOFO|IS_PINYIN, 311}, -{"ㄙㄨ" /* "su" */, IS_BOPOMOFO|IS_PINYIN, 335}, -{"ㄙㄨㄛ" /* "suo" */, IS_BOPOMOFO|IS_PINYIN, 339}, -{"ㄙㄨㄟ" /* "sui" */, IS_BOPOMOFO|IS_PINYIN, 337}, -{"ㄙㄨㄢ" /* "suan" */, IS_BOPOMOFO|IS_PINYIN, 336}, -{"ㄙㄨㄣ" /* "sun" */, IS_BOPOMOFO|IS_PINYIN, 338}, -{"ㄙㄨㄥ" /* "song" */, IS_BOPOMOFO|IS_PINYIN, 333}, -{"ㄚ" /* "a" */, IS_BOPOMOFO|IS_PINYIN, 1}, -{"ㄛ" /* "o" */, IS_BOPOMOFO|IS_PINYIN, 252}, -{"ㄜ" /* "e" */, IS_BOPOMOFO|IS_PINYIN, 85}, -{"ㄞ" /* "ai" */, IS_BOPOMOFO|IS_PINYIN, 2}, -{"ㄟ" /* "ei" */, IS_BOPOMOFO|IS_PINYIN, 86}, -{"ㄠ" /* "ao" */, IS_BOPOMOFO|IS_PINYIN, 5}, -{"ㄡ" /* "ou" */, IS_BOPOMOFO|IS_PINYIN, 253}, -{"ㄢ" /* "an" */, IS_BOPOMOFO|IS_PINYIN, 3}, -{"ㄣ" /* "en" */, IS_BOPOMOFO|IS_PINYIN, 87}, -{"ㄤ" /* "ang" */, IS_BOPOMOFO|IS_PINYIN, 4}, -{"ㄥ" /* "eng" */, IS_BOPOMOFO, 88}, -{"ㄦ" /* "er" */, IS_BOPOMOFO|IS_PINYIN, 89}, -{"ㄧ" /* "yi" */, IS_BOPOMOFO|IS_PINYIN, 392}, -{"ㄧㄚ" /* "ya" */, IS_BOPOMOFO|IS_PINYIN, 386}, -{"ㄧㄛ" /* "yo" */, IS_BOPOMOFO|IS_PINYIN, 395}, -{"ㄧㄝ" /* "ye" */, IS_BOPOMOFO|IS_PINYIN, 391}, -{"ㄧㄞ" /* "yai" */, IS_BOPOMOFO, 387}, -{"ㄧㄠ" /* "yao" */, IS_BOPOMOFO|IS_PINYIN, 390}, -{"ㄧㄡ" /* "you" */, IS_BOPOMOFO|IS_PINYIN, 397}, -{"ㄧㄢ" /* "yan" */, IS_BOPOMOFO|IS_PINYIN, 388}, -{"ㄧㄣ" /* "yin" */, IS_BOPOMOFO|IS_PINYIN, 393}, -{"ㄧㄤ" /* "yang" */, IS_BOPOMOFO|IS_PINYIN, 389}, -{"ㄧㄥ" /* "ying" */, IS_BOPOMOFO|IS_PINYIN, 394}, -{"ㄨ" /* "wu" */, IS_BOPOMOFO|IS_PINYIN, 369}, -{"ㄨㄚ" /* "wa" */, IS_BOPOMOFO|IS_PINYIN, 361}, -{"ㄨㄛ" /* "wo" */, IS_BOPOMOFO|IS_PINYIN, 368}, -{"ㄨㄞ" /* "wai" */, IS_BOPOMOFO|IS_PINYIN, 362}, -{"ㄨㄟ" /* "wei" */, IS_BOPOMOFO|IS_PINYIN, 365}, -{"ㄨㄢ" /* "wan" */, IS_BOPOMOFO|IS_PINYIN, 363}, -{"ㄨㄣ" /* "wen" */, IS_BOPOMOFO|IS_PINYIN, 366}, -{"ㄨㄤ" /* "wang" */, IS_BOPOMOFO|IS_PINYIN, 364}, -{"ㄨㄥ" /* "weng" */, IS_BOPOMOFO|IS_PINYIN, 367}, -{"ㄩ" /* "yu" */, IS_BOPOMOFO|IS_PINYIN, 398}, -{"ㄩㄝ" /* "yue" */, IS_BOPOMOFO|IS_PINYIN, 400}, -{"ㄩㄢ" /* "yuan" */, IS_BOPOMOFO|IS_PINYIN, 399}, -{"ㄩㄣ" /* "yun" */, IS_BOPOMOFO|IS_PINYIN, 401}, -{"ㄩㄥ" /* "yong" */, IS_BOPOMOFO|IS_PINYIN, 396}, -{"ㄫ" /* "ng" */, IS_BOPOMOFO|IS_PINYIN, 234} -}; - -const chewing_index_item_t eten26_bopomofo_index[] = { -{"ㄅ" /* "b" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 6}, -{"ㄅㄚ" /* "ba" */, IS_BOPOMOFO|IS_PINYIN, 7}, -{"ㄅㄛ" /* "bo" */, IS_BOPOMOFO|IS_PINYIN, 21}, -{"ㄅㄞ" /* "bai" */, IS_BOPOMOFO|IS_PINYIN, 8}, -{"ㄅㄟ" /* "bei" */, IS_BOPOMOFO|IS_PINYIN, 12}, -{"ㄅㄠ" /* "bao" */, IS_BOPOMOFO|IS_PINYIN, 11}, -{"ㄅㄢ" /* "ban" */, IS_BOPOMOFO|IS_PINYIN, 9}, -{"ㄅㄣ" /* "ben" */, IS_BOPOMOFO|IS_PINYIN, 13}, -{"ㄅㄤ" /* "bang" */, IS_BOPOMOFO|IS_PINYIN, 10}, -{"ㄅㄥ" /* "beng" */, IS_BOPOMOFO|IS_PINYIN, 14}, -{"ㄅㄧ" /* "bi" */, IS_BOPOMOFO|IS_PINYIN, 15}, -{"ㄅㄧㄝ" /* "bie" */, IS_BOPOMOFO|IS_PINYIN, 18}, -{"ㄅㄧㄠ" /* "biao" */, IS_BOPOMOFO|IS_PINYIN, 17}, -{"ㄅㄧㄢ" /* "bian" */, IS_BOPOMOFO|IS_PINYIN, 16}, -{"ㄅㄧㄣ" /* "bin" */, IS_BOPOMOFO|IS_PINYIN, 19}, -{"ㄅㄧㄥ" /* "bing" */, IS_BOPOMOFO|IS_PINYIN, 20}, -{"ㄅㄨ" /* "bu" */, IS_BOPOMOFO|IS_PINYIN, 22}, -{"ㄆ" /* "ou" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 253}, -{"ㄆㄚ" /* "pa" */, IS_BOPOMOFO|IS_PINYIN, 255}, -{"ㄆㄛ" /* "po" */, IS_BOPOMOFO|IS_PINYIN, 269}, -{"ㄆㄞ" /* "pai" */, IS_BOPOMOFO|IS_PINYIN, 256}, -{"ㄆㄟ" /* "pei" */, IS_BOPOMOFO|IS_PINYIN, 260}, -{"ㄆㄠ" /* "pao" */, IS_BOPOMOFO|IS_PINYIN, 259}, -{"ㄆㄡ" /* "pou" */, IS_BOPOMOFO|IS_PINYIN, 270}, -{"ㄆㄢ" /* "pan" */, IS_BOPOMOFO|IS_PINYIN, 257}, -{"ㄆㄣ" /* "pen" */, IS_BOPOMOFO|IS_PINYIN, 261}, -{"ㄆㄤ" /* "pang" */, IS_BOPOMOFO|IS_PINYIN, 258}, -{"ㄆㄥ" /* "peng" */, IS_BOPOMOFO|IS_PINYIN, 262}, -{"ㄆㄧ" /* "pi" */, IS_BOPOMOFO|IS_PINYIN, 263}, -{"ㄆㄧㄝ" /* "pie" */, IS_BOPOMOFO|IS_PINYIN, 266}, -{"ㄆㄧㄠ" /* "piao" */, IS_BOPOMOFO|IS_PINYIN, 265}, -{"ㄆㄧㄢ" /* "pian" */, IS_BOPOMOFO|IS_PINYIN, 264}, -{"ㄆㄧㄣ" /* "pin" */, IS_BOPOMOFO|IS_PINYIN, 267}, -{"ㄆㄧㄥ" /* "ping" */, IS_BOPOMOFO|IS_PINYIN, 268}, -{"ㄆㄨ" /* "pu" */, IS_BOPOMOFO|IS_PINYIN, 271}, -{"ㄇ" /* "an" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 3}, -{"ㄇㄚ" /* "ma" */, IS_BOPOMOFO|IS_PINYIN, 205}, -{"ㄇㄛ" /* "mo" */, IS_BOPOMOFO|IS_PINYIN, 221}, -{"ㄇㄜ" /* "me" */, IS_BOPOMOFO|IS_PINYIN, 210}, -{"ㄇㄞ" /* "mai" */, IS_BOPOMOFO|IS_PINYIN, 206}, -{"ㄇㄟ" /* "mei" */, IS_BOPOMOFO|IS_PINYIN, 211}, -{"ㄇㄠ" /* "mao" */, IS_BOPOMOFO|IS_PINYIN, 209}, -{"ㄇㄡ" /* "mou" */, IS_BOPOMOFO|IS_PINYIN, 222}, -{"ㄇㄢ" /* "man" */, IS_BOPOMOFO|IS_PINYIN, 207}, -{"ㄇㄣ" /* "men" */, IS_BOPOMOFO|IS_PINYIN, 212}, -{"ㄇㄤ" /* "mang" */, IS_BOPOMOFO|IS_PINYIN, 208}, -{"ㄇㄥ" /* "meng" */, IS_BOPOMOFO|IS_PINYIN, 213}, -{"ㄇㄧ" /* "mi" */, IS_BOPOMOFO|IS_PINYIN, 214}, -{"ㄇㄧㄝ" /* "mie" */, IS_BOPOMOFO|IS_PINYIN, 217}, -{"ㄇㄧㄠ" /* "miao" */, IS_BOPOMOFO|IS_PINYIN, 216}, -{"ㄇㄧㄡ" /* "miu" */, IS_BOPOMOFO|IS_PINYIN, 220}, -{"ㄇㄧㄢ" /* "mian" */, IS_BOPOMOFO|IS_PINYIN, 215}, -{"ㄇㄧㄣ" /* "min" */, IS_BOPOMOFO|IS_PINYIN, 218}, -{"ㄇㄧㄥ" /* "ming" */, IS_BOPOMOFO|IS_PINYIN, 219}, -{"ㄇㄨ" /* "mu" */, IS_BOPOMOFO|IS_PINYIN, 223}, -{"ㄈ" /* "f" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 90}, -{"ㄈㄚ" /* "fa" */, IS_BOPOMOFO|IS_PINYIN, 91}, -{"ㄈㄛ" /* "fo" */, IS_BOPOMOFO|IS_PINYIN, 98}, -{"ㄈㄜ" /* "fe" */, IS_BOPOMOFO, 94}, -{"ㄈㄟ" /* "fei" */, IS_BOPOMOFO|IS_PINYIN, 95}, -{"ㄈㄡ" /* "fou" */, IS_BOPOMOFO|IS_PINYIN, 99}, -{"ㄈㄢ" /* "fan" */, IS_BOPOMOFO|IS_PINYIN, 92}, -{"ㄈㄣ" /* "fen" */, IS_BOPOMOFO|IS_PINYIN, 96}, -{"ㄈㄤ" /* "fang" */, IS_BOPOMOFO|IS_PINYIN, 93}, -{"ㄈㄥ" /* "feng" */, IS_BOPOMOFO|IS_PINYIN, 97}, -{"ㄈㄨ" /* "fu" */, IS_BOPOMOFO|IS_PINYIN, 100}, -{"ㄉ" /* "d" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 60}, -{"ㄉㄚ" /* "da" */, IS_BOPOMOFO|IS_PINYIN, 61}, -{"ㄉㄜ" /* "de" */, IS_BOPOMOFO|IS_PINYIN, 66}, -{"ㄉㄞ" /* "dai" */, IS_BOPOMOFO|IS_PINYIN, 62}, -{"ㄉㄟ" /* "dei" */, IS_BOPOMOFO|IS_PINYIN, 67}, -{"ㄉㄠ" /* "dao" */, IS_BOPOMOFO|IS_PINYIN, 65}, -{"ㄉㄡ" /* "dou" */, IS_BOPOMOFO|IS_PINYIN, 79}, -{"ㄉㄢ" /* "dan" */, IS_BOPOMOFO|IS_PINYIN, 63}, -{"ㄉㄣ" /* "den" */, IS_BOPOMOFO, 68}, -{"ㄉㄤ" /* "dang" */, IS_BOPOMOFO|IS_PINYIN, 64}, -{"ㄉㄥ" /* "deng" */, IS_BOPOMOFO|IS_PINYIN, 69}, -{"ㄉㄧ" /* "di" */, IS_BOPOMOFO|IS_PINYIN, 70}, -{"ㄉㄧㄚ" /* "dia" */, IS_BOPOMOFO|IS_PINYIN, 71}, -{"ㄉㄧㄝ" /* "die" */, IS_BOPOMOFO|IS_PINYIN, 74}, -{"ㄉㄧㄠ" /* "diao" */, IS_BOPOMOFO|IS_PINYIN, 73}, -{"ㄉㄧㄡ" /* "diu" */, IS_BOPOMOFO|IS_PINYIN, 77}, -{"ㄉㄧㄢ" /* "dian" */, IS_BOPOMOFO|IS_PINYIN, 72}, -{"ㄉㄧㄣ" /* "din" */, IS_BOPOMOFO, 75}, -{"ㄉㄧㄥ" /* "ding" */, IS_BOPOMOFO|IS_PINYIN, 76}, -{"ㄉㄨ" /* "du" */, IS_BOPOMOFO|IS_PINYIN, 80}, -{"ㄉㄨㄛ" /* "duo" */, IS_BOPOMOFO|IS_PINYIN, 84}, -{"ㄉㄨㄟ" /* "dui" */, IS_BOPOMOFO|IS_PINYIN, 82}, -{"ㄉㄨㄢ" /* "duan" */, IS_BOPOMOFO|IS_PINYIN, 81}, -{"ㄉㄨㄣ" /* "dun" */, IS_BOPOMOFO|IS_PINYIN, 83}, -{"ㄉㄨㄥ" /* "dong" */, IS_BOPOMOFO|IS_PINYIN, 78}, -{"ㄊ" /* "ang" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 4}, -{"ㄊㄚ" /* "ta" */, IS_BOPOMOFO|IS_PINYIN, 341}, -{"ㄊㄜ" /* "te" */, IS_BOPOMOFO|IS_PINYIN, 346}, -{"ㄊㄞ" /* "tai" */, IS_BOPOMOFO|IS_PINYIN, 342}, -{"ㄊㄠ" /* "tao" */, IS_BOPOMOFO|IS_PINYIN, 345}, -{"ㄊㄡ" /* "tou" */, IS_BOPOMOFO|IS_PINYIN, 354}, -{"ㄊㄢ" /* "tan" */, IS_BOPOMOFO|IS_PINYIN, 343}, -{"ㄊㄤ" /* "tang" */, IS_BOPOMOFO|IS_PINYIN, 344}, -{"ㄊㄥ" /* "teng" */, IS_BOPOMOFO|IS_PINYIN, 347}, -{"ㄊㄧ" /* "ti" */, IS_BOPOMOFO|IS_PINYIN, 348}, -{"ㄊㄧㄝ" /* "tie" */, IS_BOPOMOFO|IS_PINYIN, 351}, -{"ㄊㄧㄠ" /* "tiao" */, IS_BOPOMOFO|IS_PINYIN, 350}, -{"ㄊㄧㄢ" /* "tian" */, IS_BOPOMOFO|IS_PINYIN, 349}, -{"ㄊㄧㄥ" /* "ting" */, IS_BOPOMOFO|IS_PINYIN, 352}, -{"ㄊㄨ" /* "tu" */, IS_BOPOMOFO|IS_PINYIN, 355}, -{"ㄊㄨㄛ" /* "tuo" */, IS_BOPOMOFO|IS_PINYIN, 359}, -{"ㄊㄨㄟ" /* "tui" */, IS_BOPOMOFO|IS_PINYIN, 357}, -{"ㄊㄨㄢ" /* "tuan" */, IS_BOPOMOFO|IS_PINYIN, 356}, -{"ㄊㄨㄣ" /* "tun" */, IS_BOPOMOFO|IS_PINYIN, 358}, -{"ㄊㄨㄥ" /* "tong" */, IS_BOPOMOFO|IS_PINYIN, 353}, -{"ㄋ" /* "en" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 87}, -{"ㄋㄚ" /* "na" */, IS_BOPOMOFO|IS_PINYIN, 225}, -{"ㄋㄜ" /* "ne" */, IS_BOPOMOFO|IS_PINYIN, 230}, -{"ㄋㄞ" /* "nai" */, IS_BOPOMOFO|IS_PINYIN, 226}, -{"ㄋㄟ" /* "nei" */, IS_BOPOMOFO|IS_PINYIN, 231}, -{"ㄋㄠ" /* "nao" */, IS_BOPOMOFO|IS_PINYIN, 229}, -{"ㄋㄡ" /* "nou" */, IS_BOPOMOFO|IS_PINYIN, 245}, -{"ㄋㄢ" /* "nan" */, IS_BOPOMOFO|IS_PINYIN, 227}, -{"ㄋㄣ" /* "nen" */, IS_BOPOMOFO|IS_PINYIN, 232}, -{"ㄋㄤ" /* "nang" */, IS_BOPOMOFO|IS_PINYIN, 228}, -{"ㄋㄥ" /* "neng" */, IS_BOPOMOFO|IS_PINYIN, 233}, -{"ㄋㄧ" /* "ni" */, IS_BOPOMOFO|IS_PINYIN, 235}, -{"ㄋㄧㄚ" /* "nia" */, IS_BOPOMOFO, 236}, -{"ㄋㄧㄝ" /* "nie" */, IS_BOPOMOFO|IS_PINYIN, 240}, -{"ㄋㄧㄠ" /* "niao" */, IS_BOPOMOFO|IS_PINYIN, 239}, -{"ㄋㄧㄡ" /* "niu" */, IS_BOPOMOFO|IS_PINYIN, 243}, -{"ㄋㄧㄢ" /* "nian" */, IS_BOPOMOFO|IS_PINYIN, 237}, -{"ㄋㄧㄣ" /* "nin" */, IS_BOPOMOFO|IS_PINYIN, 241}, -{"ㄋㄧㄤ" /* "niang" */, IS_BOPOMOFO|IS_PINYIN, 238}, -{"ㄋㄧㄥ" /* "ning" */, IS_BOPOMOFO|IS_PINYIN, 242}, -{"ㄋㄨ" /* "nu" */, IS_BOPOMOFO|IS_PINYIN, 246}, -{"ㄋㄨㄛ" /* "nuo" */, IS_BOPOMOFO|IS_PINYIN, 249}, -{"ㄋㄨㄢ" /* "nuan" */, IS_BOPOMOFO|IS_PINYIN, 247}, -{"ㄋㄨㄣ" /* "nun" */, IS_BOPOMOFO, 248}, -{"ㄋㄨㄥ" /* "nong" */, IS_BOPOMOFO|IS_PINYIN, 244}, -{"ㄋㄩ" /* "nv" */, IS_BOPOMOFO|IS_PINYIN, 250}, -{"ㄋㄩㄝ" /* "nve" */, IS_BOPOMOFO|IS_PINYIN, 251}, -{"ㄌ" /* "eng" */, IS_BOPOMOFO|ETEN26_CORRECT, 88}, -{"ㄌㄚ" /* "la" */, IS_BOPOMOFO|IS_PINYIN, 177}, -{"ㄌㄛ" /* "lo" */, IS_BOPOMOFO|IS_PINYIN, 195}, -{"ㄌㄜ" /* "le" */, IS_BOPOMOFO|IS_PINYIN, 182}, -{"ㄌㄞ" /* "lai" */, IS_BOPOMOFO|IS_PINYIN, 178}, -{"ㄌㄟ" /* "lei" */, IS_BOPOMOFO|IS_PINYIN, 183}, -{"ㄌㄠ" /* "lao" */, IS_BOPOMOFO|IS_PINYIN, 181}, -{"ㄌㄡ" /* "lou" */, IS_BOPOMOFO|IS_PINYIN, 197}, -{"ㄌㄢ" /* "lan" */, IS_BOPOMOFO|IS_PINYIN, 179}, -{"ㄌㄣ" /* "len" */, IS_BOPOMOFO, 184}, -{"ㄌㄤ" /* "lang" */, IS_BOPOMOFO|IS_PINYIN, 180}, -{"ㄌㄥ" /* "leng" */, IS_BOPOMOFO|IS_PINYIN, 185}, -{"ㄌㄧ" /* "li" */, IS_BOPOMOFO|IS_PINYIN, 186}, -{"ㄌㄧㄚ" /* "lia" */, IS_BOPOMOFO|IS_PINYIN, 187}, -{"ㄌㄧㄝ" /* "lie" */, IS_BOPOMOFO|IS_PINYIN, 191}, -{"ㄌㄧㄠ" /* "liao" */, IS_BOPOMOFO|IS_PINYIN, 190}, -{"ㄌㄧㄡ" /* "liu" */, IS_BOPOMOFO|IS_PINYIN, 194}, -{"ㄌㄧㄢ" /* "lian" */, IS_BOPOMOFO|IS_PINYIN, 188}, -{"ㄌㄧㄣ" /* "lin" */, IS_BOPOMOFO|IS_PINYIN, 192}, -{"ㄌㄧㄤ" /* "liang" */, IS_BOPOMOFO|IS_PINYIN, 189}, -{"ㄌㄧㄥ" /* "ling" */, IS_BOPOMOFO|IS_PINYIN, 193}, -{"ㄌㄨ" /* "lu" */, IS_BOPOMOFO|IS_PINYIN, 198}, -{"ㄌㄨㄛ" /* "luo" */, IS_BOPOMOFO|IS_PINYIN, 201}, -{"ㄌㄨㄢ" /* "luan" */, IS_BOPOMOFO|IS_PINYIN, 199}, -{"ㄌㄨㄣ" /* "lun" */, IS_BOPOMOFO|IS_PINYIN, 200}, -{"ㄌㄨㄥ" /* "long" */, IS_BOPOMOFO|IS_PINYIN, 196}, -{"ㄌㄩ" /* "lv" */, IS_BOPOMOFO|IS_PINYIN, 202}, -{"ㄌㄩㄝ" /* "lve" */, IS_BOPOMOFO|IS_PINYIN, 203}, -{"ㄍ" /* "g" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 101}, -{"ㄍㄚ" /* "ga" */, IS_BOPOMOFO|IS_PINYIN, 102}, -{"ㄍㄜ" /* "ge" */, IS_BOPOMOFO|IS_PINYIN, 107}, -{"ㄍㄞ" /* "gai" */, IS_BOPOMOFO|IS_PINYIN, 103}, -{"ㄍㄟ" /* "gei" */, IS_BOPOMOFO|IS_PINYIN, 108}, -{"ㄍㄠ" /* "gao" */, IS_BOPOMOFO|IS_PINYIN, 106}, -{"ㄍㄡ" /* "gou" */, IS_BOPOMOFO|IS_PINYIN, 112}, -{"ㄍㄢ" /* "gan" */, IS_BOPOMOFO|IS_PINYIN, 104}, -{"ㄍㄣ" /* "gen" */, IS_BOPOMOFO|IS_PINYIN, 109}, -{"ㄍㄤ" /* "gang" */, IS_BOPOMOFO|IS_PINYIN, 105}, -{"ㄍㄥ" /* "geng" */, IS_BOPOMOFO|IS_PINYIN, 110}, -{"ㄍㄧ" /* "qi" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 273}, -{"ㄍㄧㄚ" /* "qia" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 274}, -{"ㄍㄧㄝ" /* "qie" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 278}, -{"ㄍㄧㄠ" /* "qiao" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 277}, -{"ㄍㄧㄡ" /* "qiu" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 282}, -{"ㄍㄧㄢ" /* "qian" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 275}, -{"ㄍㄧㄣ" /* "qin" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 279}, -{"ㄍㄧㄤ" /* "qiang" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 276}, -{"ㄍㄧㄥ" /* "qing" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 280}, -{"ㄍㄨ" /* "gu" */, IS_BOPOMOFO|IS_PINYIN, 113}, -{"ㄍㄨㄚ" /* "gua" */, IS_BOPOMOFO|IS_PINYIN, 114}, -{"ㄍㄨㄛ" /* "guo" */, IS_BOPOMOFO|IS_PINYIN, 120}, -{"ㄍㄨㄞ" /* "guai" */, IS_BOPOMOFO|IS_PINYIN, 115}, -{"ㄍㄨㄟ" /* "gui" */, IS_BOPOMOFO|IS_PINYIN, 118}, -{"ㄍㄨㄢ" /* "guan" */, IS_BOPOMOFO|IS_PINYIN, 116}, -{"ㄍㄨㄣ" /* "gun" */, IS_BOPOMOFO|IS_PINYIN, 119}, -{"ㄍㄨㄤ" /* "guang" */, IS_BOPOMOFO|IS_PINYIN, 117}, -{"ㄍㄨㄥ" /* "gong" */, IS_BOPOMOFO|IS_PINYIN, 111}, -{"ㄍㄩ" /* "qu" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 283}, -{"ㄍㄩㄝ" /* "que" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 285}, -{"ㄍㄩㄢ" /* "quan" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 284}, -{"ㄍㄩㄣ" /* "qun" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 286}, -{"ㄍㄩㄥ" /* "qiong" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 281}, -{"ㄎ" /* "k" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 156}, -{"ㄎㄚ" /* "ka" */, IS_BOPOMOFO|IS_PINYIN, 157}, -{"ㄎㄜ" /* "ke" */, IS_BOPOMOFO|IS_PINYIN, 162}, -{"ㄎㄞ" /* "kai" */, IS_BOPOMOFO|IS_PINYIN, 158}, -{"ㄎㄟ" /* "kei" */, IS_BOPOMOFO, 163}, -{"ㄎㄠ" /* "kao" */, IS_BOPOMOFO|IS_PINYIN, 161}, -{"ㄎㄡ" /* "kou" */, IS_BOPOMOFO|IS_PINYIN, 167}, -{"ㄎㄢ" /* "kan" */, IS_BOPOMOFO|IS_PINYIN, 159}, -{"ㄎㄣ" /* "ken" */, IS_BOPOMOFO|IS_PINYIN, 164}, -{"ㄎㄤ" /* "kang" */, IS_BOPOMOFO|IS_PINYIN, 160}, -{"ㄎㄥ" /* "keng" */, IS_BOPOMOFO|IS_PINYIN, 165}, -{"ㄎㄨ" /* "ku" */, IS_BOPOMOFO|IS_PINYIN, 168}, -{"ㄎㄨㄚ" /* "kua" */, IS_BOPOMOFO|IS_PINYIN, 169}, -{"ㄎㄨㄛ" /* "kuo" */, IS_BOPOMOFO|IS_PINYIN, 175}, -{"ㄎㄨㄞ" /* "kuai" */, IS_BOPOMOFO|IS_PINYIN, 170}, -{"ㄎㄨㄟ" /* "kui" */, IS_BOPOMOFO|IS_PINYIN, 173}, -{"ㄎㄨㄢ" /* "kuan" */, IS_BOPOMOFO|IS_PINYIN, 171}, -{"ㄎㄨㄣ" /* "kun" */, IS_BOPOMOFO|IS_PINYIN, 174}, -{"ㄎㄨㄤ" /* "kuang" */, IS_BOPOMOFO|IS_PINYIN, 172}, -{"ㄎㄨㄥ" /* "kong" */, IS_BOPOMOFO|IS_PINYIN, 166}, -{"ㄏ" /* "er" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 89}, -{"ㄏㄚ" /* "ha" */, IS_BOPOMOFO|IS_PINYIN, 122}, -{"ㄏㄜ" /* "he" */, IS_BOPOMOFO|IS_PINYIN, 127}, -{"ㄏㄞ" /* "hai" */, IS_BOPOMOFO|IS_PINYIN, 123}, -{"ㄏㄟ" /* "hei" */, IS_BOPOMOFO|IS_PINYIN, 128}, -{"ㄏㄠ" /* "hao" */, IS_BOPOMOFO|IS_PINYIN, 126}, -{"ㄏㄡ" /* "hou" */, IS_BOPOMOFO|IS_PINYIN, 132}, -{"ㄏㄢ" /* "han" */, IS_BOPOMOFO|IS_PINYIN, 124}, -{"ㄏㄣ" /* "hen" */, IS_BOPOMOFO|IS_PINYIN, 129}, -{"ㄏㄤ" /* "hang" */, IS_BOPOMOFO|IS_PINYIN, 125}, -{"ㄏㄥ" /* "heng" */, IS_BOPOMOFO|IS_PINYIN, 130}, -{"ㄏㄨ" /* "hu" */, IS_BOPOMOFO|IS_PINYIN, 133}, -{"ㄏㄨㄚ" /* "hua" */, IS_BOPOMOFO|IS_PINYIN, 134}, -{"ㄏㄨㄛ" /* "huo" */, IS_BOPOMOFO|IS_PINYIN, 140}, -{"ㄏㄨㄞ" /* "huai" */, IS_BOPOMOFO|IS_PINYIN, 135}, -{"ㄏㄨㄟ" /* "hui" */, IS_BOPOMOFO|IS_PINYIN, 138}, -{"ㄏㄨㄢ" /* "huan" */, IS_BOPOMOFO|IS_PINYIN, 136}, -{"ㄏㄨㄣ" /* "hun" */, IS_BOPOMOFO|IS_PINYIN, 139}, -{"ㄏㄨㄤ" /* "huang" */, IS_BOPOMOFO|IS_PINYIN, 137}, -{"ㄏㄨㄥ" /* "hong" */, IS_BOPOMOFO|IS_PINYIN, 131}, -{"ㄐ" /* "zhi" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 422}, -{"ㄐㄚ" /* "zha" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 413}, -{"ㄐㄜ" /* "zhe" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 418}, -{"ㄐㄞ" /* "zhai" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 414}, -{"ㄐㄟ" /* "zhei" */, IS_BOPOMOFO|ETEN26_CORRECT, 419}, -{"ㄐㄠ" /* "zhao" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 417}, -{"ㄐㄡ" /* "zhou" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 424}, -{"ㄐㄢ" /* "zhan" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 415}, -{"ㄐㄣ" /* "zhen" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 420}, -{"ㄐㄤ" /* "zhang" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 416}, -{"ㄐㄥ" /* "zheng" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 421}, -{"ㄐㄧ" /* "ji" */, IS_BOPOMOFO|IS_PINYIN, 142}, -{"ㄐㄧㄚ" /* "jia" */, IS_BOPOMOFO|IS_PINYIN, 143}, -{"ㄐㄧㄝ" /* "jie" */, IS_BOPOMOFO|IS_PINYIN, 147}, -{"ㄐㄧㄠ" /* "jiao" */, IS_BOPOMOFO|IS_PINYIN, 146}, -{"ㄐㄧㄡ" /* "jiu" */, IS_BOPOMOFO|IS_PINYIN, 151}, -{"ㄐㄧㄢ" /* "jian" */, IS_BOPOMOFO|IS_PINYIN, 144}, -{"ㄐㄧㄣ" /* "jin" */, IS_BOPOMOFO|IS_PINYIN, 148}, -{"ㄐㄧㄤ" /* "jiang" */, IS_BOPOMOFO|IS_PINYIN, 145}, -{"ㄐㄧㄥ" /* "jing" */, IS_BOPOMOFO|IS_PINYIN, 149}, -{"ㄐㄨ" /* "zhu" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 425}, -{"ㄐㄨㄚ" /* "zhua" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 426}, -{"ㄐㄨㄛ" /* "zhuo" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 432}, -{"ㄐㄨㄞ" /* "zhuai" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 427}, -{"ㄐㄨㄟ" /* "zhui" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 430}, -{"ㄐㄨㄢ" /* "zhuan" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 428}, -{"ㄐㄨㄣ" /* "zhun" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 431}, -{"ㄐㄨㄤ" /* "zhuang" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 429}, -{"ㄐㄨㄥ" /* "zhong" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 423}, -{"ㄐㄩ" /* "ju" */, IS_BOPOMOFO|IS_PINYIN, 152}, -{"ㄐㄩㄝ" /* "jue" */, IS_BOPOMOFO|IS_PINYIN, 154}, -{"ㄐㄩㄢ" /* "juan" */, IS_BOPOMOFO|IS_PINYIN, 153}, -{"ㄐㄩㄣ" /* "jun" */, IS_BOPOMOFO|IS_PINYIN, 155}, -{"ㄐㄩㄥ" /* "jiong" */, IS_BOPOMOFO|IS_PINYIN, 150}, -{"ㄑ" /* "q" */, IS_BOPOMOFO|IS_PINYIN|PINYIN_INCOMPLETE|CHEWING_INCOMPLETE, 272}, -{"ㄑㄧ" /* "qi" */, IS_BOPOMOFO|IS_PINYIN, 273}, -{"ㄑㄧㄚ" /* "qia" */, IS_BOPOMOFO|IS_PINYIN, 274}, -{"ㄑㄧㄝ" /* "qie" */, IS_BOPOMOFO|IS_PINYIN, 278}, -{"ㄑㄧㄠ" /* "qiao" */, IS_BOPOMOFO|IS_PINYIN, 277}, -{"ㄑㄧㄡ" /* "qiu" */, IS_BOPOMOFO|IS_PINYIN, 282}, -{"ㄑㄧㄢ" /* "qian" */, IS_BOPOMOFO|IS_PINYIN, 275}, -{"ㄑㄧㄣ" /* "qin" */, IS_BOPOMOFO|IS_PINYIN, 279}, -{"ㄑㄧㄤ" /* "qiang" */, IS_BOPOMOFO|IS_PINYIN, 276}, -{"ㄑㄧㄥ" /* "qing" */, IS_BOPOMOFO|IS_PINYIN, 280}, -{"ㄑㄩ" /* "qu" */, IS_BOPOMOFO|IS_PINYIN, 283}, -{"ㄑㄩㄝ" /* "que" */, IS_BOPOMOFO|IS_PINYIN, 285}, -{"ㄑㄩㄢ" /* "quan" */, IS_BOPOMOFO|IS_PINYIN, 284}, -{"ㄑㄩㄣ" /* "qun" */, IS_BOPOMOFO|IS_PINYIN, 286}, -{"ㄑㄩㄥ" /* "qiong" */, IS_BOPOMOFO|IS_PINYIN, 281}, -{"ㄒ" /* "shi" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 322}, -{"ㄒㄚ" /* "sha" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 313}, -{"ㄒㄜ" /* "she" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 318}, -{"ㄒㄞ" /* "shai" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 314}, -{"ㄒㄟ" /* "shei" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 319}, -{"ㄒㄠ" /* "shao" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 317}, -{"ㄒㄡ" /* "shou" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 323}, -{"ㄒㄢ" /* "shan" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 315}, -{"ㄒㄣ" /* "shen" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 320}, -{"ㄒㄤ" /* "shang" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 316}, -{"ㄒㄥ" /* "sheng" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 321}, -{"ㄒㄧ" /* "xi" */, IS_BOPOMOFO|IS_PINYIN, 371}, -{"ㄒㄧㄚ" /* "xia" */, IS_BOPOMOFO|IS_PINYIN, 372}, -{"ㄒㄧㄝ" /* "xie" */, IS_BOPOMOFO|IS_PINYIN, 376}, -{"ㄒㄧㄠ" /* "xiao" */, IS_BOPOMOFO|IS_PINYIN, 375}, -{"ㄒㄧㄡ" /* "xiu" */, IS_BOPOMOFO|IS_PINYIN, 380}, -{"ㄒㄧㄢ" /* "xian" */, IS_BOPOMOFO|IS_PINYIN, 373}, -{"ㄒㄧㄣ" /* "xin" */, IS_BOPOMOFO|IS_PINYIN, 377}, -{"ㄒㄧㄤ" /* "xiang" */, IS_BOPOMOFO|IS_PINYIN, 374}, -{"ㄒㄧㄥ" /* "xing" */, IS_BOPOMOFO|IS_PINYIN, 378}, -{"ㄒㄨ" /* "shu" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 324}, -{"ㄒㄨㄚ" /* "shua" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 325}, -{"ㄒㄨㄛ" /* "shuo" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 331}, -{"ㄒㄨㄞ" /* "shuai" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 326}, -{"ㄒㄨㄟ" /* "shui" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 329}, -{"ㄒㄨㄢ" /* "shuan" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 327}, -{"ㄒㄨㄣ" /* "shun" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 330}, -{"ㄒㄨㄤ" /* "shuang" */, IS_BOPOMOFO|IS_PINYIN|ETEN26_CORRECT, 328}, -{"ㄒㄩ" /* "xu" */, IS_BOPOMOFO|IS_PINYIN, 381}, -{"ㄒㄩㄝ" /* "xue" */, IS_BOPOMOFO|IS_PINYIN, 383}, -{"ㄒㄩㄢ" /* "xuan" */, IS_BOPOMOFO|IS_PINYIN, 382}, -{"ㄒㄩㄣ" /* "xun" */, IS_BOPOMOFO|IS_PINYIN, 384}, -{"ㄒㄩㄥ" /* "xiong" */, IS_BOPOMOFO|IS_PINYIN, 379}, -{"ㄓ" /* "zhi" */, IS_BOPOMOFO|IS_PINYIN, 422}, -{"ㄓㄚ" /* "zha" */, IS_BOPOMOFO|IS_PINYIN, 413}, -{"ㄓㄜ" /* "zhe" */, IS_BOPOMOFO|IS_PINYIN, 418}, -{"ㄓㄞ" /* "zhai" */, IS_BOPOMOFO|IS_PINYIN, 414}, -{"ㄓㄟ" /* "zhei" */, IS_BOPOMOFO, 419}, -{"ㄓㄠ" /* "zhao" */, IS_BOPOMOFO|IS_PINYIN, 417}, -{"ㄓㄡ" /* "zhou" */, IS_BOPOMOFO|IS_PINYIN, 424}, -{"ㄓㄢ" /* "zhan" */, IS_BOPOMOFO|IS_PINYIN, 415}, -{"ㄓㄣ" /* "zhen" */, IS_BOPOMOFO|IS_PINYIN, 420}, -{"ㄓㄤ" /* "zhang" */, IS_BOPOMOFO|IS_PINYIN, 416}, -{"ㄓㄥ" /* "zheng" */, IS_BOPOMOFO|IS_PINYIN, 421}, -{"ㄓㄨ" /* "zhu" */, IS_BOPOMOFO|IS_PINYIN, 425}, -{"ㄓㄨㄚ" /* "zhua" */, IS_BOPOMOFO|IS_PINYIN, 426}, -{"ㄓㄨㄛ" /* "zhuo" */, IS_BOPOMOFO|IS_PINYIN, 432}, -{"ㄓㄨㄞ" /* "zhuai" */, IS_BOPOMOFO|IS_PINYIN, 427}, -{"ㄓㄨㄟ" /* "zhui" */, IS_BOPOMOFO|IS_PINYIN, 430}, -{"ㄓㄨㄢ" /* "zhuan" */, IS_BOPOMOFO|IS_PINYIN, 428}, -{"ㄓㄨㄣ" /* "zhun" */, IS_BOPOMOFO|IS_PINYIN, 431}, -{"ㄓㄨㄤ" /* "zhuang" */, IS_BOPOMOFO|IS_PINYIN, 429}, -{"ㄓㄨㄥ" /* "zhong" */, IS_BOPOMOFO|IS_PINYIN, 423}, -{"ㄔ" /* "chi" */, IS_BOPOMOFO|IS_PINYIN, 41}, -{"ㄔㄚ" /* "cha" */, IS_BOPOMOFO|IS_PINYIN, 33}, -{"ㄔㄜ" /* "che" */, IS_BOPOMOFO|IS_PINYIN, 38}, -{"ㄔㄞ" /* "chai" */, IS_BOPOMOFO|IS_PINYIN, 34}, -{"ㄔㄠ" /* "chao" */, IS_BOPOMOFO|IS_PINYIN, 37}, -{"ㄔㄡ" /* "chou" */, IS_BOPOMOFO|IS_PINYIN, 43}, -{"ㄔㄢ" /* "chan" */, IS_BOPOMOFO|IS_PINYIN, 35}, -{"ㄔㄣ" /* "chen" */, IS_BOPOMOFO|IS_PINYIN, 39}, -{"ㄔㄤ" /* "chang" */, IS_BOPOMOFO|IS_PINYIN, 36}, -{"ㄔㄥ" /* "cheng" */, IS_BOPOMOFO|IS_PINYIN, 40}, -{"ㄔㄨ" /* "chu" */, IS_BOPOMOFO|IS_PINYIN, 44}, -{"ㄔㄨㄚ" /* "chua" */, IS_BOPOMOFO, 45}, -{"ㄔㄨㄛ" /* "chuo" */, IS_BOPOMOFO|IS_PINYIN, 51}, -{"ㄔㄨㄞ" /* "chuai" */, IS_BOPOMOFO|IS_PINYIN, 46}, -{"ㄔㄨㄟ" /* "chui" */, IS_BOPOMOFO|IS_PINYIN, 49}, -{"ㄔㄨㄢ" /* "chuan" */, IS_BOPOMOFO|IS_PINYIN, 47}, -{"ㄔㄨㄣ" /* "chun" */, IS_BOPOMOFO|IS_PINYIN, 50}, -{"ㄔㄨㄤ" /* "chuang" */, IS_BOPOMOFO|IS_PINYIN, 48}, -{"ㄔㄨㄥ" /* "chong" */, IS_BOPOMOFO|IS_PINYIN, 42}, -{"ㄕ" /* "shi" */, IS_BOPOMOFO|IS_PINYIN, 322}, -{"ㄕㄚ" /* "sha" */, IS_BOPOMOFO|IS_PINYIN, 313}, -{"ㄕㄜ" /* "she" */, IS_BOPOMOFO|IS_PINYIN, 318}, -{"ㄕㄞ" /* "shai" */, IS_BOPOMOFO|IS_PINYIN, 314}, -{"ㄕㄟ" /* "shei" */, IS_BOPOMOFO|IS_PINYIN, 319}, -{"ㄕㄠ" /* "shao" */, IS_BOPOMOFO|IS_PINYIN, 317}, -{"ㄕㄡ" /* "shou" */, IS_BOPOMOFO|IS_PINYIN, 323}, -{"ㄕㄢ" /* "shan" */, IS_BOPOMOFO|IS_PINYIN, 315}, -{"ㄕㄣ" /* "shen" */, IS_BOPOMOFO|IS_PINYIN, 320}, -{"ㄕㄤ" /* "shang" */, IS_BOPOMOFO|IS_PINYIN, 316}, -{"ㄕㄥ" /* "sheng" */, IS_BOPOMOFO|IS_PINYIN, 321}, -{"ㄕㄨ" /* "shu" */, IS_BOPOMOFO|IS_PINYIN, 324}, -{"ㄕㄨㄚ" /* "shua" */, IS_BOPOMOFO|IS_PINYIN, 325}, -{"ㄕㄨㄛ" /* "shuo" */, IS_BOPOMOFO|IS_PINYIN, 331}, -{"ㄕㄨㄞ" /* "shuai" */, IS_BOPOMOFO|IS_PINYIN, 326}, -{"ㄕㄨㄟ" /* "shui" */, IS_BOPOMOFO|IS_PINYIN, 329}, -{"ㄕㄨㄢ" /* "shuan" */, IS_BOPOMOFO|IS_PINYIN, 327}, -{"ㄕㄨㄣ" /* "shun" */, IS_BOPOMOFO|IS_PINYIN, 330}, -{"ㄕㄨㄤ" /* "shuang" */, IS_BOPOMOFO|IS_PINYIN, 328}, -{"ㄖ" /* "ri" */, IS_BOPOMOFO|IS_PINYIN, 294}, -{"ㄖㄜ" /* "re" */, IS_BOPOMOFO|IS_PINYIN, 291}, -{"ㄖㄠ" /* "rao" */, IS_BOPOMOFO|IS_PINYIN, 290}, -{"ㄖㄡ" /* "rou" */, IS_BOPOMOFO|IS_PINYIN, 296}, -{"ㄖㄢ" /* "ran" */, IS_BOPOMOFO|IS_PINYIN, 288}, -{"ㄖㄣ" /* "ren" */, IS_BOPOMOFO|IS_PINYIN, 292}, -{"ㄖㄤ" /* "rang" */, IS_BOPOMOFO|IS_PINYIN, 289}, -{"ㄖㄥ" /* "reng" */, IS_BOPOMOFO|IS_PINYIN, 293}, -{"ㄖㄨ" /* "ru" */, IS_BOPOMOFO|IS_PINYIN, 297}, -{"ㄖㄨㄚ" /* "rua" */, IS_BOPOMOFO, 298}, -{"ㄖㄨㄛ" /* "ruo" */, IS_BOPOMOFO|IS_PINYIN, 302}, -{"ㄖㄨㄟ" /* "rui" */, IS_BOPOMOFO|IS_PINYIN, 300}, -{"ㄖㄨㄢ" /* "ruan" */, IS_BOPOMOFO|IS_PINYIN, 299}, -{"ㄖㄨㄣ" /* "run" */, IS_BOPOMOFO|IS_PINYIN, 301}, -{"ㄖㄨㄥ" /* "rong" */, IS_BOPOMOFO|IS_PINYIN, 295}, -{"ㄗ" /* "zi" */, IS_BOPOMOFO|IS_PINYIN, 433}, -{"ㄗㄚ" /* "za" */, IS_BOPOMOFO|IS_PINYIN, 403}, -{"ㄗㄜ" /* "ze" */, IS_BOPOMOFO|IS_PINYIN, 408}, -{"ㄗㄞ" /* "zai" */, IS_BOPOMOFO|IS_PINYIN, 404}, -{"ㄗㄟ" /* "zei" */, IS_BOPOMOFO|IS_PINYIN, 409}, -{"ㄗㄠ" /* "zao" */, IS_BOPOMOFO|IS_PINYIN, 407}, -{"ㄗㄡ" /* "zou" */, IS_BOPOMOFO|IS_PINYIN, 435}, -{"ㄗㄢ" /* "zan" */, IS_BOPOMOFO|IS_PINYIN, 405}, -{"ㄗㄣ" /* "zen" */, IS_BOPOMOFO|IS_PINYIN, 410}, -{"ㄗㄤ" /* "zang" */, IS_BOPOMOFO|IS_PINYIN, 406}, -{"ㄗㄥ" /* "zeng" */, IS_BOPOMOFO|IS_PINYIN, 411}, -{"ㄗㄨ" /* "zu" */, IS_BOPOMOFO|IS_PINYIN, 436}, -{"ㄗㄨㄛ" /* "zuo" */, IS_BOPOMOFO|IS_PINYIN, 440}, -{"ㄗㄨㄟ" /* "zui" */, IS_BOPOMOFO|IS_PINYIN, 438}, -{"ㄗㄨㄢ" /* "zuan" */, IS_BOPOMOFO|IS_PINYIN, 437}, -{"ㄗㄨㄣ" /* "zun" */, IS_BOPOMOFO|IS_PINYIN, 439}, -{"ㄗㄨㄥ" /* "zong" */, IS_BOPOMOFO|IS_PINYIN, 434}, -{"ㄘ" /* "ci" */, IS_BOPOMOFO|IS_PINYIN, 52}, -{"ㄘㄚ" /* "ca" */, IS_BOPOMOFO|IS_PINYIN, 24}, -{"ㄘㄜ" /* "ce" */, IS_BOPOMOFO|IS_PINYIN, 29}, -{"ㄘㄞ" /* "cai" */, IS_BOPOMOFO|IS_PINYIN, 25}, -{"ㄘㄠ" /* "cao" */, IS_BOPOMOFO|IS_PINYIN, 28}, -{"ㄘㄡ" /* "cou" */, IS_BOPOMOFO|IS_PINYIN, 54}, -{"ㄘㄢ" /* "can" */, IS_BOPOMOFO|IS_PINYIN, 26}, -{"ㄘㄣ" /* "cen" */, IS_BOPOMOFO|IS_PINYIN, 30}, -{"ㄘㄤ" /* "cang" */, IS_BOPOMOFO|IS_PINYIN, 27}, -{"ㄘㄥ" /* "ceng" */, IS_BOPOMOFO|IS_PINYIN, 31}, -{"ㄘㄨ" /* "cu" */, IS_BOPOMOFO|IS_PINYIN, 55}, -{"ㄘㄨㄛ" /* "cuo" */, IS_BOPOMOFO|IS_PINYIN, 59}, -{"ㄘㄨㄟ" /* "cui" */, IS_BOPOMOFO|IS_PINYIN, 57}, -{"ㄘㄨㄢ" /* "cuan" */, IS_BOPOMOFO|IS_PINYIN, 56}, -{"ㄘㄨㄣ" /* "cun" */, IS_BOPOMOFO|IS_PINYIN, 58}, -{"ㄘㄨㄥ" /* "cong" */, IS_BOPOMOFO|IS_PINYIN, 53}, -{"ㄙ" /* "si" */, IS_BOPOMOFO|IS_PINYIN, 332}, -{"ㄙㄚ" /* "sa" */, IS_BOPOMOFO|IS_PINYIN, 304}, -{"ㄙㄜ" /* "se" */, IS_BOPOMOFO|IS_PINYIN, 309}, -{"ㄙㄞ" /* "sai" */, IS_BOPOMOFO|IS_PINYIN, 305}, -{"ㄙㄠ" /* "sao" */, IS_BOPOMOFO|IS_PINYIN, 308}, -{"ㄙㄡ" /* "sou" */, IS_BOPOMOFO|IS_PINYIN, 334}, -{"ㄙㄢ" /* "san" */, IS_BOPOMOFO|IS_PINYIN, 306}, -{"ㄙㄣ" /* "sen" */, IS_BOPOMOFO|IS_PINYIN, 310}, -{"ㄙㄤ" /* "sang" */, IS_BOPOMOFO|IS_PINYIN, 307}, -{"ㄙㄥ" /* "seng" */, IS_BOPOMOFO|IS_PINYIN, 311}, -{"ㄙㄨ" /* "su" */, IS_BOPOMOFO|IS_PINYIN, 335}, -{"ㄙㄨㄛ" /* "suo" */, IS_BOPOMOFO|IS_PINYIN, 339}, -{"ㄙㄨㄟ" /* "sui" */, IS_BOPOMOFO|IS_PINYIN, 337}, -{"ㄙㄨㄢ" /* "suan" */, IS_BOPOMOFO|IS_PINYIN, 336}, -{"ㄙㄨㄣ" /* "sun" */, IS_BOPOMOFO|IS_PINYIN, 338}, -{"ㄙㄨㄥ" /* "song" */, IS_BOPOMOFO|IS_PINYIN, 333}, -{"ㄚ" /* "a" */, IS_BOPOMOFO|IS_PINYIN, 1}, -{"ㄛ" /* "o" */, IS_BOPOMOFO|IS_PINYIN, 252}, -{"ㄜ" /* "e" */, IS_BOPOMOFO|IS_PINYIN, 85}, -{"ㄞ" /* "ai" */, IS_BOPOMOFO|IS_PINYIN, 2}, -{"ㄟ" /* "ei" */, IS_BOPOMOFO|IS_PINYIN, 86}, -{"ㄠ" /* "ao" */, IS_BOPOMOFO|IS_PINYIN, 5}, -{"ㄡ" /* "ou" */, IS_BOPOMOFO|IS_PINYIN, 253}, -{"ㄢ" /* "an" */, IS_BOPOMOFO|IS_PINYIN, 3}, -{"ㄣ" /* "en" */, IS_BOPOMOFO|IS_PINYIN, 87}, -{"ㄤ" /* "ang" */, IS_BOPOMOFO|IS_PINYIN, 4}, -{"ㄥ" /* "eng" */, IS_BOPOMOFO, 88}, -{"ㄦ" /* "er" */, IS_BOPOMOFO|IS_PINYIN, 89}, -{"ㄧ" /* "yi" */, IS_BOPOMOFO|IS_PINYIN, 392}, -{"ㄧㄚ" /* "ya" */, IS_BOPOMOFO|IS_PINYIN, 386}, -{"ㄧㄛ" /* "yo" */, IS_BOPOMOFO|IS_PINYIN, 395}, -{"ㄧㄝ" /* "ye" */, IS_BOPOMOFO|IS_PINYIN, 391}, -{"ㄧㄞ" /* "yai" */, IS_BOPOMOFO, 387}, -{"ㄧㄠ" /* "yao" */, IS_BOPOMOFO|IS_PINYIN, 390}, -{"ㄧㄡ" /* "you" */, IS_BOPOMOFO|IS_PINYIN, 397}, -{"ㄧㄢ" /* "yan" */, IS_BOPOMOFO|IS_PINYIN, 388}, -{"ㄧㄣ" /* "yin" */, IS_BOPOMOFO|IS_PINYIN, 393}, -{"ㄧㄤ" /* "yang" */, IS_BOPOMOFO|IS_PINYIN, 389}, -{"ㄧㄥ" /* "ying" */, IS_BOPOMOFO|IS_PINYIN, 394}, -{"ㄨ" /* "wu" */, IS_BOPOMOFO|IS_PINYIN, 369}, -{"ㄨㄚ" /* "wa" */, IS_BOPOMOFO|IS_PINYIN, 361}, -{"ㄨㄛ" /* "wo" */, IS_BOPOMOFO|IS_PINYIN, 368}, -{"ㄨㄞ" /* "wai" */, IS_BOPOMOFO|IS_PINYIN, 362}, -{"ㄨㄟ" /* "wei" */, IS_BOPOMOFO|IS_PINYIN, 365}, -{"ㄨㄢ" /* "wan" */, IS_BOPOMOFO|IS_PINYIN, 363}, -{"ㄨㄣ" /* "wen" */, IS_BOPOMOFO|IS_PINYIN, 366}, -{"ㄨㄤ" /* "wang" */, IS_BOPOMOFO|IS_PINYIN, 364}, -{"ㄨㄥ" /* "weng" */, IS_BOPOMOFO|IS_PINYIN, 367}, -{"ㄩ" /* "yu" */, IS_BOPOMOFO|IS_PINYIN, 398}, -{"ㄩㄝ" /* "yue" */, IS_BOPOMOFO|IS_PINYIN, 400}, -{"ㄩㄢ" /* "yuan" */, IS_BOPOMOFO|IS_PINYIN, 399}, -{"ㄩㄣ" /* "yun" */, IS_BOPOMOFO|IS_PINYIN, 401}, -{"ㄩㄥ" /* "yong" */, IS_BOPOMOFO|IS_PINYIN, 396}, -{"ㄫ" /* "ng" */, IS_BOPOMOFO|IS_PINYIN, 234} -}; - -const content_table_item_t content_table[] = { -{"", "", "", "" ,ChewingKey()}, -{"a", "ㄚ", "a", "a" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"ai", "ㄞ", "ai", "ai" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"an", "ㄢ", "an", "an" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"ang", "ㄤ", "ang", "ang" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"ao", "ㄠ", "ao", "au" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"b", "ㄅ", "None", "None" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ba", "ㄅㄚ", "ba", "ba" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"bai", "ㄅㄞ", "bai", "bai" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"ban", "ㄅㄢ", "ban", "ban" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"bang", "ㄅㄤ", "bang", "bang" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"bao", "ㄅㄠ", "bao", "bau" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"bei", "ㄅㄟ", "bei", "bei" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"ben", "ㄅㄣ", "ben", "ben" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"beng", "ㄅㄥ", "beng", "beng" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"bi", "ㄅㄧ", "bi", "bi" ,ChewingKey(CHEWING_B, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"bian", "ㄅㄧㄢ", "bian", "bian" ,ChewingKey(CHEWING_B, CHEWING_I, CHEWING_AN)}, -{"biao", "ㄅㄧㄠ", "biao", "biau" ,ChewingKey(CHEWING_B, CHEWING_I, CHEWING_AO)}, -{"bie", "ㄅㄧㄝ", "bieh", "bie" ,ChewingKey(CHEWING_B, CHEWING_I, CHEWING_E)}, -{"bin", "ㄅㄧㄣ", "bin", "bin" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"bing", "ㄅㄧㄥ", "bing", "bing" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"bo", "ㄅㄛ", "bo", "bo" ,ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_O)}, -{"bu", "ㄅㄨ", "bu", "bu" ,ChewingKey(CHEWING_B, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"c", "ㄘ", "tsih", "tsz" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ca", "ㄘㄚ", "tsa", "tsa" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"cai", "ㄘㄞ", "tsai", "tsai" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"can", "ㄘㄢ", "tsan", "tsan" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"cang", "ㄘㄤ", "tsang", "tsang" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"cao", "ㄘㄠ", "tsao", "tsau" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"ce", "ㄘㄜ", "tse", "tse" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"cen", "ㄘㄣ", "tsen", "tsen" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"ceng", "ㄘㄥ", "tseng", "tseng" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"ch", "ㄔ", "chih", "chr" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"cha", "ㄔㄚ", "cha", "cha" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"chai", "ㄔㄞ", "chai", "chai" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"chan", "ㄔㄢ", "chan", "chan" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"chang", "ㄔㄤ", "chang", "chang" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"chao", "ㄔㄠ", "chao", "chau" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"che", "ㄔㄜ", "che", "che" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"chen", "ㄔㄣ", "chen", "chen" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"cheng", "ㄔㄥ", "cheng", "cheng" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"chi", "ㄔ", "chih", "chr" ,ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"chong", "ㄔㄨㄥ", "chong", "chung" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"chou", "ㄔㄡ", "chou", "chou" ,ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"chu", "ㄔㄨ", "chu", "chu" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"chua", "ㄔㄨㄚ", "None", "None" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_A)}, -{"chuai", "ㄔㄨㄞ", "chuai", "chuai" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_AI)}, -{"chuan", "ㄔㄨㄢ", "chuan", "chuan" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_AN)}, -{"chuang", "ㄔㄨㄤ", "chuang", "chuang" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_ANG)}, -{"chui", "ㄔㄨㄟ", "chuei", "chuei" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_EI)}, -{"chun", "ㄔㄨㄣ", "chun", "chuen" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_EN)}, -{"chuo", "ㄔㄨㄛ", "chuo", "chuo" ,ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_O)}, -{"ci", "ㄘ", "tsih", "tsz" ,ChewingKey(CHEWING_C, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"cong", "ㄘㄨㄥ", "tsong", "tsung" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"cou", "ㄘㄡ", "tsou", "tsou" ,ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"cu", "ㄘㄨ", "tsu", "tsu" ,ChewingKey(CHEWING_C, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"cuan", "ㄘㄨㄢ", "tsuan", "tsuan" ,ChewingKey(CHEWING_C, CHEWING_U, CHEWING_AN)}, -{"cui", "ㄘㄨㄟ", "tsuei", "tsuei" ,ChewingKey(CHEWING_C, CHEWING_U, CHEWING_EI)}, -{"cun", "ㄘㄨㄣ", "tsun", "tsun" ,ChewingKey(CHEWING_C, CHEWING_U, CHEWING_EN)}, -{"cuo", "ㄘㄨㄛ", "tsuo", "tsuo" ,ChewingKey(CHEWING_C, CHEWING_U, CHEWING_O)}, -{"d", "ㄉ", "None", "None" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"da", "ㄉㄚ", "da", "da" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"dai", "ㄉㄞ", "dai", "dai" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"dan", "ㄉㄢ", "dan", "dan" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"dang", "ㄉㄤ", "dang", "dang" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"dao", "ㄉㄠ", "dao", "dau" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"de", "ㄉㄜ", "de", "de" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"dei", "ㄉㄟ", "dei", "dei" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"den", "ㄉㄣ", "None", "None" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"deng", "ㄉㄥ", "deng", "deng" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"di", "ㄉㄧ", "di", "di" ,ChewingKey(CHEWING_D, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"dia", "ㄉㄧㄚ", "None", "None" ,ChewingKey(CHEWING_D, CHEWING_I, CHEWING_A)}, -{"dian", "ㄉㄧㄢ", "dian", "dian" ,ChewingKey(CHEWING_D, CHEWING_I, CHEWING_AN)}, -{"diao", "ㄉㄧㄠ", "diao", "diau" ,ChewingKey(CHEWING_D, CHEWING_I, CHEWING_AO)}, -{"die", "ㄉㄧㄝ", "dieh", "die" ,ChewingKey(CHEWING_D, CHEWING_I, CHEWING_E)}, -{"din", "ㄉㄧㄣ", "None", "None" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"ding", "ㄉㄧㄥ", "ding", "ding" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"diu", "ㄉㄧㄡ", "diou", "diou" ,ChewingKey(CHEWING_D, CHEWING_I, CHEWING_OU)}, -{"dong", "ㄉㄨㄥ", "dong", "dung" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"dou", "ㄉㄡ", "dou", "dou" ,ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"du", "ㄉㄨ", "du", "du" ,ChewingKey(CHEWING_D, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"duan", "ㄉㄨㄢ", "duan", "duan" ,ChewingKey(CHEWING_D, CHEWING_U, CHEWING_AN)}, -{"dui", "ㄉㄨㄟ", "duei", "duei" ,ChewingKey(CHEWING_D, CHEWING_U, CHEWING_EI)}, -{"dun", "ㄉㄨㄣ", "dun", "duen" ,ChewingKey(CHEWING_D, CHEWING_U, CHEWING_EN)}, -{"duo", "ㄉㄨㄛ", "duo", "duo" ,ChewingKey(CHEWING_D, CHEWING_U, CHEWING_O)}, -{"e", "ㄜ", "e", "e" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"ei", "ㄟ", "ei", "ei" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"en", "ㄣ", "en", "en" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"eng", "ㄥ", "eng", "eng" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"er", "ㄦ", "er", "er" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_ER)}, -{"f", "ㄈ", "None", "None" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"fa", "ㄈㄚ", "fa", "fa" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"fan", "ㄈㄢ", "fan", "fan" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"fang", "ㄈㄤ", "fang", "fang" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"fe", "ㄈㄜ", "None", "None" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"fei", "ㄈㄟ", "fei", "fei" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"fen", "ㄈㄣ", "fen", "fen" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"feng", "ㄈㄥ", "None", "None" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"fo", "ㄈㄛ", "fo", "fo" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_O)}, -{"fou", "ㄈㄡ", "fou", "fou" ,ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"fu", "ㄈㄨ", "fu", "fu" ,ChewingKey(CHEWING_F, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"g", "ㄍ", "None", "None" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ga", "ㄍㄚ", "ga", "ga" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"gai", "ㄍㄞ", "gai", "gai" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"gan", "ㄍㄢ", "gan", "gan" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"gang", "ㄍㄤ", "gang", "gang" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"gao", "ㄍㄠ", "gao", "gau" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"ge", "ㄍㄜ", "ge", "ge" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"gei", "ㄍㄟ", "gei", "gei" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"gen", "ㄍㄣ", "gen", "gen" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"geng", "ㄍㄥ", "geng", "geng" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"gong", "ㄍㄨㄥ", "gong", "gung" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"gou", "ㄍㄡ", "gou", "gou" ,ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"gu", "ㄍㄨ", "gu", "gu" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"gua", "ㄍㄨㄚ", "gua", "gua" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_A)}, -{"guai", "ㄍㄨㄞ", "guai", "guai" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_AI)}, -{"guan", "ㄍㄨㄢ", "guan", "guan" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_AN)}, -{"guang", "ㄍㄨㄤ", "guang", "guang" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_ANG)}, -{"gui", "ㄍㄨㄟ", "guei", "guei" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_EI)}, -{"gun", "ㄍㄨㄣ", "gun", "guen" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_EN)}, -{"guo", "ㄍㄨㄛ", "guo", "guo" ,ChewingKey(CHEWING_G, CHEWING_U, CHEWING_O)}, -{"h", "ㄏ", "None", "None" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ha", "ㄏㄚ", "ha", "ha" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"hai", "ㄏㄞ", "hai", "hai" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"han", "ㄏㄢ", "han", "han" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"hang", "ㄏㄤ", "hang", "hang" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"hao", "ㄏㄠ", "hao", "hau" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"he", "ㄏㄜ", "he", "he" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"hei", "ㄏㄟ", "hei", "hei" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"hen", "ㄏㄣ", "hen", "hen" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"heng", "ㄏㄥ", "heng", "heng" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"hong", "ㄏㄨㄥ", "hong", "hung" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"hou", "ㄏㄡ", "hou", "hou" ,ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"hu", "ㄏㄨ", "hu", "hu" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"hua", "ㄏㄨㄚ", "hua", "hua" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_A)}, -{"huai", "ㄏㄨㄞ", "huai", "huai" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_AI)}, -{"huan", "ㄏㄨㄢ", "huan", "huan" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_AN)}, -{"huang", "ㄏㄨㄤ", "huang", "huang" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_ANG)}, -{"hui", "ㄏㄨㄟ", "huei", "huei" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_EI)}, -{"hun", "ㄏㄨㄣ", "hun", "huen" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_EN)}, -{"huo", "ㄏㄨㄛ", "huo", "huo" ,ChewingKey(CHEWING_H, CHEWING_U, CHEWING_O)}, -{"j", "ㄐ", "None", "None" ,ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ji", "ㄐㄧ", "ji", "ji" ,ChewingKey(CHEWING_J, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"jia", "ㄐㄧㄚ", "jia", "jia" ,ChewingKey(CHEWING_J, CHEWING_I, CHEWING_A)}, -{"jian", "ㄐㄧㄢ", "jian", "jian" ,ChewingKey(CHEWING_J, CHEWING_I, CHEWING_AN)}, -{"jiang", "ㄐㄧㄤ", "jiang", "jiang" ,ChewingKey(CHEWING_J, CHEWING_I, CHEWING_ANG)}, -{"jiao", "ㄐㄧㄠ", "jiao", "jiau" ,ChewingKey(CHEWING_J, CHEWING_I, CHEWING_AO)}, -{"jie", "ㄐㄧㄝ", "jieh", "jie" ,ChewingKey(CHEWING_J, CHEWING_I, CHEWING_E)}, -{"jin", "ㄐㄧㄣ", "jin", "jin" ,ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"jing", "ㄐㄧㄥ", "jing", "jing" ,ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"jiong", "ㄐㄩㄥ", "jyong", "jiung" ,ChewingKey(CHEWING_J, CHEWING_I, PINYIN_ONG)}, -{"jiu", "ㄐㄧㄡ", "jiou", "jiou" ,ChewingKey(CHEWING_J, CHEWING_I, CHEWING_OU)}, -{"ju", "ㄐㄩ", "jyu", "jiu" ,ChewingKey(CHEWING_J, CHEWING_V, CHEWING_ZERO_FINAL)}, -{"juan", "ㄐㄩㄢ", "jyuan", "jiuan" ,ChewingKey(CHEWING_J, CHEWING_V, CHEWING_AN)}, -{"jue", "ㄐㄩㄝ", "jyueh", "jiue" ,ChewingKey(CHEWING_J, CHEWING_V, CHEWING_E)}, -{"jun", "ㄐㄩㄣ", "jyun", "jiun" ,ChewingKey(CHEWING_J, CHEWING_V, CHEWING_EN)}, -{"k", "ㄎ", "None", "None" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ka", "ㄎㄚ", "ka", "ka" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"kai", "ㄎㄞ", "kai", "kai" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"kan", "ㄎㄢ", "kan", "kan" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"kang", "ㄎㄤ", "kang", "kang" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"kao", "ㄎㄠ", "kao", "kau" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"ke", "ㄎㄜ", "ke", "ke" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"kei", "ㄎㄟ", "None", "None" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"ken", "ㄎㄣ", "ken", "ken" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"keng", "ㄎㄥ", "keng", "keng" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"kong", "ㄎㄨㄥ", "kong", "kung" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"kou", "ㄎㄡ", "kou", "kou" ,ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"ku", "ㄎㄨ", "ku", "ku" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"kua", "ㄎㄨㄚ", "kua", "kua" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_A)}, -{"kuai", "ㄎㄨㄞ", "kuai", "kuai" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_AI)}, -{"kuan", "ㄎㄨㄢ", "kuan", "kuan" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_AN)}, -{"kuang", "ㄎㄨㄤ", "kuang", "kuang" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_ANG)}, -{"kui", "ㄎㄨㄟ", "kuei", "kuei" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_EI)}, -{"kun", "ㄎㄨㄣ", "kun", "kuen" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_EN)}, -{"kuo", "ㄎㄨㄛ", "kuo", "kuo" ,ChewingKey(CHEWING_K, CHEWING_U, CHEWING_O)}, -{"l", "ㄌ", "None", "None" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"la", "ㄌㄚ", "la", "la" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"lai", "ㄌㄞ", "lai", "lai" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"lan", "ㄌㄢ", "lan", "lan" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"lang", "ㄌㄤ", "lang", "lang" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"lao", "ㄌㄠ", "lao", "lau" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"le", "ㄌㄜ", "le", "le" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"lei", "ㄌㄟ", "lei", "lei" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"len", "ㄌㄣ", "None", "None" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"leng", "ㄌㄥ", "leng", "leng" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"li", "ㄌㄧ", "li", "li" ,ChewingKey(CHEWING_L, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"lia", "ㄌㄧㄚ", "lia", "lia" ,ChewingKey(CHEWING_L, CHEWING_I, CHEWING_A)}, -{"lian", "ㄌㄧㄢ", "lian", "lian" ,ChewingKey(CHEWING_L, CHEWING_I, CHEWING_AN)}, -{"liang", "ㄌㄧㄤ", "liang", "liang" ,ChewingKey(CHEWING_L, CHEWING_I, CHEWING_ANG)}, -{"liao", "ㄌㄧㄠ", "liao", "liau" ,ChewingKey(CHEWING_L, CHEWING_I, CHEWING_AO)}, -{"lie", "ㄌㄧㄝ", "lieh", "lie" ,ChewingKey(CHEWING_L, CHEWING_I, CHEWING_E)}, -{"lin", "ㄌㄧㄣ", "lin", "lin" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"ling", "ㄌㄧㄥ", "ling", "ling" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"liu", "ㄌㄧㄡ", "liou", "liou" ,ChewingKey(CHEWING_L, CHEWING_I, CHEWING_OU)}, -{"lo", "ㄌㄛ", "lo", "lo" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_O)}, -{"long", "ㄌㄨㄥ", "long", "lung" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"lou", "ㄌㄡ", "lou", "lou" ,ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"lu", "ㄌㄨ", "lu", "lu" ,ChewingKey(CHEWING_L, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"luan", "ㄌㄨㄢ", "luan", "luan" ,ChewingKey(CHEWING_L, CHEWING_U, CHEWING_AN)}, -{"lun", "ㄌㄨㄣ", "lun", "luen" ,ChewingKey(CHEWING_L, CHEWING_U, CHEWING_EN)}, -{"luo", "ㄌㄨㄛ", "luo", "luo" ,ChewingKey(CHEWING_L, CHEWING_U, CHEWING_O)}, -{"lv", "ㄌㄩ", "lyu", "liu" ,ChewingKey(CHEWING_L, CHEWING_V, CHEWING_ZERO_FINAL)}, -{"lve", "ㄌㄩㄝ", "lyueh", "liue" ,ChewingKey(CHEWING_L, CHEWING_V, CHEWING_E)}, -{"m", "ㄇ", "None", "None" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ma", "ㄇㄚ", "ma", "ma" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"mai", "ㄇㄞ", "mai", "mai" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"man", "ㄇㄢ", "man", "man" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"mang", "ㄇㄤ", "mang", "mang" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"mao", "ㄇㄠ", "mao", "mau" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"me", "ㄇㄜ", "me", "me" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"mei", "ㄇㄟ", "mei", "mei" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"men", "ㄇㄣ", "men", "men" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"meng", "ㄇㄥ", "meng", "meng" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"mi", "ㄇㄧ", "mi", "mi" ,ChewingKey(CHEWING_M, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"mian", "ㄇㄧㄢ", "mian", "mian" ,ChewingKey(CHEWING_M, CHEWING_I, CHEWING_AN)}, -{"miao", "ㄇㄧㄠ", "miao", "miau" ,ChewingKey(CHEWING_M, CHEWING_I, CHEWING_AO)}, -{"mie", "ㄇㄧㄝ", "mieh", "mie" ,ChewingKey(CHEWING_M, CHEWING_I, CHEWING_E)}, -{"min", "ㄇㄧㄣ", "min", "min" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"ming", "ㄇㄧㄥ", "ming", "ming" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"miu", "ㄇㄧㄡ", "miou", "miou" ,ChewingKey(CHEWING_M, CHEWING_I, CHEWING_OU)}, -{"mo", "ㄇㄛ", "mo", "mo" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_O)}, -{"mou", "ㄇㄡ", "mou", "mou" ,ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"mu", "ㄇㄨ", "mu", "mu" ,ChewingKey(CHEWING_M, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"n", "ㄋ", "None", "None" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"na", "ㄋㄚ", "na", "na" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"nai", "ㄋㄞ", "nai", "nai" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"nan", "ㄋㄢ", "nan", "nan" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"nang", "ㄋㄤ", "nang", "nang" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"nao", "ㄋㄠ", "nao", "nau" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"ne", "ㄋㄜ", "ne", "ne" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"nei", "ㄋㄟ", "nei", "nei" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"nen", "ㄋㄣ", "nen", "nen" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"neng", "ㄋㄥ", "neng", "neng" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"ng", "ㄫ", "None", "None" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_NG)}, -{"ni", "ㄋㄧ", "ni", "ni" ,ChewingKey(CHEWING_N, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"nia", "ㄋㄧㄚ", "None", "None" ,ChewingKey(CHEWING_N, CHEWING_I, CHEWING_A)}, -{"nian", "ㄋㄧㄢ", "nian", "nian" ,ChewingKey(CHEWING_N, CHEWING_I, CHEWING_AN)}, -{"niang", "ㄋㄧㄤ", "niang", "niang" ,ChewingKey(CHEWING_N, CHEWING_I, CHEWING_ANG)}, -{"niao", "ㄋㄧㄠ", "niao", "niau" ,ChewingKey(CHEWING_N, CHEWING_I, CHEWING_AO)}, -{"nie", "ㄋㄧㄝ", "nieh", "nie" ,ChewingKey(CHEWING_N, CHEWING_I, CHEWING_E)}, -{"nin", "ㄋㄧㄣ", "nin", "nin" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"ning", "ㄋㄧㄥ", "ning", "ning" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"niu", "ㄋㄧㄡ", "niou", "niou" ,ChewingKey(CHEWING_N, CHEWING_I, CHEWING_OU)}, -{"nong", "ㄋㄨㄥ", "nong", "nung" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"nou", "ㄋㄡ", "nou", "nou" ,ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"nu", "ㄋㄨ", "nu", "nu" ,ChewingKey(CHEWING_N, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"nuan", "ㄋㄨㄢ", "nuan", "nuan" ,ChewingKey(CHEWING_N, CHEWING_U, CHEWING_AN)}, -{"nun", "ㄋㄨㄣ", "nun", "nuen" ,ChewingKey(CHEWING_N, CHEWING_U, CHEWING_EN)}, -{"nuo", "ㄋㄨㄛ", "nuo", "nuo" ,ChewingKey(CHEWING_N, CHEWING_U, CHEWING_O)}, -{"nv", "ㄋㄩ", "nyu", "niu" ,ChewingKey(CHEWING_N, CHEWING_V, CHEWING_ZERO_FINAL)}, -{"nve", "ㄋㄩㄝ", "nyueh", "niue" ,ChewingKey(CHEWING_N, CHEWING_V, CHEWING_E)}, -{"o", "ㄛ", "o", "o" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_O)}, -{"ou", "ㄡ", "ou", "ou" ,ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"p", "ㄆ", "None", "None" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"pa", "ㄆㄚ", "pa", "pa" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"pai", "ㄆㄞ", "pai", "pai" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"pan", "ㄆㄢ", "pan", "pan" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"pang", "ㄆㄤ", "pang", "pang" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"pao", "ㄆㄠ", "pao", "pau" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"pei", "ㄆㄟ", "pei", "pei" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"pen", "ㄆㄣ", "pen", "pen" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"peng", "ㄆㄥ", "peng", "peng" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"pi", "ㄆㄧ", "pi", "pi" ,ChewingKey(CHEWING_P, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"pian", "ㄆㄧㄢ", "pian", "pian" ,ChewingKey(CHEWING_P, CHEWING_I, CHEWING_AN)}, -{"piao", "ㄆㄧㄠ", "piao", "piau" ,ChewingKey(CHEWING_P, CHEWING_I, CHEWING_AO)}, -{"pie", "ㄆㄧㄝ", "pieh", "pie" ,ChewingKey(CHEWING_P, CHEWING_I, CHEWING_E)}, -{"pin", "ㄆㄧㄣ", "pin", "pin" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"ping", "ㄆㄧㄥ", "ping", "ping" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"po", "ㄆㄛ", "po", "po" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_O)}, -{"pou", "ㄆㄡ", "pou", "pou" ,ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"pu", "ㄆㄨ", "pu", "pu" ,ChewingKey(CHEWING_P, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"q", "ㄑ", "None", "None" ,ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"qi", "ㄑㄧ", "chi", "chi" ,ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"qia", "ㄑㄧㄚ", "chia", "chia" ,ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_A)}, -{"qian", "ㄑㄧㄢ", "chian", "chian" ,ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_AN)}, -{"qiang", "ㄑㄧㄤ", "chiang", "chiang" ,ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_ANG)}, -{"qiao", "ㄑㄧㄠ", "chiao", "chiau" ,ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_AO)}, -{"qie", "ㄑㄧㄝ", "chieh", "chie" ,ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_E)}, -{"qin", "ㄑㄧㄣ", "chin", "chin" ,ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"qing", "ㄑㄧㄥ", "ching", "ching" ,ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"qiong", "ㄑㄩㄥ", "chyong", "chiung" ,ChewingKey(CHEWING_Q, CHEWING_I, PINYIN_ONG)}, -{"qiu", "ㄑㄧㄡ", "chiou", "chiou" ,ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_OU)}, -{"qu", "ㄑㄩ", "chyu", "chiu" ,ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_ZERO_FINAL)}, -{"quan", "ㄑㄩㄢ", "chyuan", "chiuan" ,ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_AN)}, -{"que", "ㄑㄩㄝ", "chyueh", "chiue" ,ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_E)}, -{"qun", "ㄑㄩㄣ", "chyun", "chiun" ,ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_EN)}, -{"r", "ㄖ", "rih", "r" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ran", "ㄖㄢ", "ran", "ran" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"rang", "ㄖㄤ", "rang", "rang" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"rao", "ㄖㄠ", "rao", "rau" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"re", "ㄖㄜ", "re", "re" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"ren", "ㄖㄣ", "ren", "ren" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"reng", "ㄖㄥ", "reng", "reng" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"ri", "ㄖ", "rih", "r" ,ChewingKey(CHEWING_R, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"rong", "ㄖㄨㄥ", "rong", "rung" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"rou", "ㄖㄡ", "rou", "rou" ,ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"ru", "ㄖㄨ", "ru", "ru" ,ChewingKey(CHEWING_R, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"rua", "ㄖㄨㄚ", "None", "None" ,ChewingKey(CHEWING_R, CHEWING_U, CHEWING_A)}, -{"ruan", "ㄖㄨㄢ", "ruan", "ruan" ,ChewingKey(CHEWING_R, CHEWING_U, CHEWING_AN)}, -{"rui", "ㄖㄨㄟ", "ruei", "ruei" ,ChewingKey(CHEWING_R, CHEWING_U, CHEWING_EI)}, -{"run", "ㄖㄨㄣ", "run", "ruen" ,ChewingKey(CHEWING_R, CHEWING_U, CHEWING_EN)}, -{"ruo", "ㄖㄨㄛ", "ruo", "ruo" ,ChewingKey(CHEWING_R, CHEWING_U, CHEWING_O)}, -{"s", "ㄙ", "sih", "sz" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"sa", "ㄙㄚ", "sa", "sa" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"sai", "ㄙㄞ", "sai", "sai" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"san", "ㄙㄢ", "san", "san" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"sang", "ㄙㄤ", "sang", "sang" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"sao", "ㄙㄠ", "sao", "sau" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"se", "ㄙㄜ", "se", "se" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"sen", "ㄙㄣ", "sen", "sen" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"seng", "ㄙㄥ", "seng", "seng" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"sh", "ㄕ", "shih", "shr" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"sha", "ㄕㄚ", "sha", "sha" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"shai", "ㄕㄞ", "shai", "shai" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"shan", "ㄕㄢ", "shan", "shan" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"shang", "ㄕㄤ", "shang", "shang" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"shao", "ㄕㄠ", "shao", "shau" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"she", "ㄕㄜ", "she", "she" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"shei", "ㄕㄟ", "shei", "shei" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"shen", "ㄕㄣ", "shen", "shen" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"sheng", "ㄕㄥ", "sheng", "sheng" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"shi", "ㄕ", "shih", "shr" ,ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"shou", "ㄕㄡ", "shou", "shou" ,ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"shu", "ㄕㄨ", "shu", "shu" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"shua", "ㄕㄨㄚ", "shua", "shua" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_A)}, -{"shuai", "ㄕㄨㄞ", "shuai", "shuai" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_AI)}, -{"shuan", "ㄕㄨㄢ", "shuan", "shuan" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_AN)}, -{"shuang", "ㄕㄨㄤ", "shuang", "shuang" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_ANG)}, -{"shui", "ㄕㄨㄟ", "shuei", "shuei" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_EI)}, -{"shun", "ㄕㄨㄣ", "shun", "shuen" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_EN)}, -{"shuo", "ㄕㄨㄛ", "shuo", "shuo" ,ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_O)}, -{"si", "ㄙ", "sih", "sz" ,ChewingKey(CHEWING_S, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"song", "ㄙㄨㄥ", "song", "sung" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"sou", "ㄙㄡ", "sou", "sou" ,ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"su", "ㄙㄨ", "su", "su" ,ChewingKey(CHEWING_S, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"suan", "ㄙㄨㄢ", "suan", "suan" ,ChewingKey(CHEWING_S, CHEWING_U, CHEWING_AN)}, -{"sui", "ㄙㄨㄟ", "suei", "suei" ,ChewingKey(CHEWING_S, CHEWING_U, CHEWING_EI)}, -{"sun", "ㄙㄨㄣ", "sun", "suen" ,ChewingKey(CHEWING_S, CHEWING_U, CHEWING_EN)}, -{"suo", "ㄙㄨㄛ", "suo", "suo" ,ChewingKey(CHEWING_S, CHEWING_U, CHEWING_O)}, -{"t", "ㄊ", "None", "None" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ta", "ㄊㄚ", "ta", "ta" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"tai", "ㄊㄞ", "tai", "tai" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"tan", "ㄊㄢ", "tan", "tan" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"tang", "ㄊㄤ", "tang", "tang" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"tao", "ㄊㄠ", "tao", "tau" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"te", "ㄊㄜ", "te", "te" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"teng", "ㄊㄥ", "teng", "teng" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"ti", "ㄊㄧ", "ti", "ti" ,ChewingKey(CHEWING_T, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"tian", "ㄊㄧㄢ", "tian", "tian" ,ChewingKey(CHEWING_T, CHEWING_I, CHEWING_AN)}, -{"tiao", "ㄊㄧㄠ", "tiao", "tiau" ,ChewingKey(CHEWING_T, CHEWING_I, CHEWING_AO)}, -{"tie", "ㄊㄧㄝ", "tieh", "tie" ,ChewingKey(CHEWING_T, CHEWING_I, CHEWING_E)}, -{"ting", "ㄊㄧㄥ", "ting", "ting" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"tong", "ㄊㄨㄥ", "tong", "tung" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"tou", "ㄊㄡ", "tou", "tou" ,ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"tu", "ㄊㄨ", "tu", "tu" ,ChewingKey(CHEWING_T, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"tuan", "ㄊㄨㄢ", "tuan", "tuan" ,ChewingKey(CHEWING_T, CHEWING_U, CHEWING_AN)}, -{"tui", "ㄊㄨㄟ", "tuei", "tuei" ,ChewingKey(CHEWING_T, CHEWING_U, CHEWING_EI)}, -{"tun", "ㄊㄨㄣ", "tun", "tuen" ,ChewingKey(CHEWING_T, CHEWING_U, CHEWING_EN)}, -{"tuo", "ㄊㄨㄛ", "tuo", "tuo" ,ChewingKey(CHEWING_T, CHEWING_U, CHEWING_O)}, -{"w", "PINYIN_W", "None", "None" ,ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"wa", "ㄨㄚ", "wa", "wa" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_A)}, -{"wai", "ㄨㄞ", "wai", "wai" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_AI)}, -{"wan", "ㄨㄢ", "wan", "wan" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_AN)}, -{"wang", "ㄨㄤ", "wang", "wang" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_ANG)}, -{"wei", "ㄨㄟ", "wei", "wei" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_EI)}, -{"wen", "ㄨㄣ", "wun", "wen" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_EN)}, -{"weng", "ㄨㄥ", "wong", "weng" ,ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"wo", "ㄨㄛ", "wo", "wo" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_O)}, -{"wu", "ㄨ", "wu", "wu" ,ChewingKey(PINYIN_W, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"x", "ㄒ", "None", "None" ,ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"xi", "ㄒㄧ", "si", "shi" ,ChewingKey(CHEWING_X, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"xia", "ㄒㄧㄚ", "sia", "shia" ,ChewingKey(CHEWING_X, CHEWING_I, CHEWING_A)}, -{"xian", "ㄒㄧㄢ", "sian", "shian" ,ChewingKey(CHEWING_X, CHEWING_I, CHEWING_AN)}, -{"xiang", "ㄒㄧㄤ", "siang", "shiang" ,ChewingKey(CHEWING_X, CHEWING_I, CHEWING_ANG)}, -{"xiao", "ㄒㄧㄠ", "siao", "shiau" ,ChewingKey(CHEWING_X, CHEWING_I, CHEWING_AO)}, -{"xie", "ㄒㄧㄝ", "sieh", "shie" ,ChewingKey(CHEWING_X, CHEWING_I, CHEWING_E)}, -{"xin", "ㄒㄧㄣ", "sin", "shin" ,ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"xing", "ㄒㄧㄥ", "sing", "shing" ,ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"xiong", "ㄒㄩㄥ", "syong", "shiung" ,ChewingKey(CHEWING_X, CHEWING_I, PINYIN_ONG)}, -{"xiu", "ㄒㄧㄡ", "siou", "shiou" ,ChewingKey(CHEWING_X, CHEWING_I, CHEWING_OU)}, -{"xu", "ㄒㄩ", "syu", "shiu" ,ChewingKey(CHEWING_X, CHEWING_V, CHEWING_ZERO_FINAL)}, -{"xuan", "ㄒㄩㄢ", "syuan", "shiuan" ,ChewingKey(CHEWING_X, CHEWING_V, CHEWING_AN)}, -{"xue", "ㄒㄩㄝ", "syueh", "shiue" ,ChewingKey(CHEWING_X, CHEWING_V, CHEWING_E)}, -{"xun", "ㄒㄩㄣ", "syun", "shiun" ,ChewingKey(CHEWING_X, CHEWING_V, CHEWING_EN)}, -{"y", "PINYIN_Y", "None", "None" ,ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"ya", "ㄧㄚ", "ya", "ya" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_A)}, -{"yai", "ㄧㄞ", "yai", "yai" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_AI)}, -{"yan", "ㄧㄢ", "yan", "yan" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_AN)}, -{"yang", "ㄧㄤ", "yang", "yang" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_ANG)}, -{"yao", "ㄧㄠ", "yao", "yau" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_AO)}, -{"ye", "ㄧㄝ", "yeh", "ye" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_E)}, -{"yi", "ㄧ", "yi", "yi" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"yin", "ㄧㄣ", "yin", "yin" ,ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, PINYIN_IN)}, -{"ying", "ㄧㄥ", "ying", "ying" ,ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, PINYIN_ING)}, -{"yo", "ㄧㄛ", "yo", "yo" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_O)}, -{"yong", "ㄩㄥ", "yong", "yung" ,ChewingKey(PINYIN_Y, CHEWING_I, PINYIN_ONG)}, -{"you", "ㄧㄡ", "you", "you" ,ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_OU)}, -{"yu", "ㄩ", "yu", "yu" ,ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_ZERO_FINAL)}, -{"yuan", "ㄩㄢ", "yuan", "yuan" ,ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_AN)}, -{"yue", "ㄩㄝ", "yueh", "yue" ,ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_E)}, -{"yun", "ㄩㄣ", "yun", "yun" ,ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_EN)}, -{"z", "ㄗ", "zih", "tz" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"za", "ㄗㄚ", "za", "tza" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"zai", "ㄗㄞ", "zai", "tzai" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"zan", "ㄗㄢ", "zan", "tzan" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"zang", "ㄗㄤ", "zang", "tzang" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"zao", "ㄗㄠ", "zao", "tzau" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"ze", "ㄗㄜ", "ze", "tze" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"zei", "ㄗㄟ", "zei", "tzei" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"zen", "ㄗㄣ", "zen", "tzen" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"zeng", "ㄗㄥ", "zeng", "tzeng" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"zh", "ㄓ", "jhih", "jr" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL)}, -{"zha", "ㄓㄚ", "jha", "ja" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_A)}, -{"zhai", "ㄓㄞ", "jhai", "jai" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_AI)}, -{"zhan", "ㄓㄢ", "jhan", "jan" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_AN)}, -{"zhang", "ㄓㄤ", "jhang", "jang" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_ANG)}, -{"zhao", "ㄓㄠ", "jhao", "jau" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_AO)}, -{"zhe", "ㄓㄜ", "jhe", "je" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_E)}, -{"zhei", "ㄓㄟ", "jhei", "jei" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_EI)}, -{"zhen", "ㄓㄣ", "jhen", "jen" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_EN)}, -{"zheng", "ㄓㄥ", "jheng", "jeng" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_ENG)}, -{"zhi", "ㄓ", "jhih", "jr" ,ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"zhong", "ㄓㄨㄥ", "jhong", "jung" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"zhou", "ㄓㄡ", "jhou", "jou" ,ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"zhu", "ㄓㄨ", "jhu", "ju" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"zhua", "ㄓㄨㄚ", "jhua", "jua" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_A)}, -{"zhuai", "ㄓㄨㄞ", "jhuai", "juai" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_AI)}, -{"zhuan", "ㄓㄨㄢ", "jhuan", "juan" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_AN)}, -{"zhuang", "ㄓㄨㄤ", "jhuang", "juang" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_ANG)}, -{"zhui", "ㄓㄨㄟ", "jhuei", "juei" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_EI)}, -{"zhun", "ㄓㄨㄣ", "jhun", "juen" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_EN)}, -{"zhuo", "ㄓㄨㄛ", "jhuo", "juo" ,ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_O)}, -{"zi", "ㄗ", "zih", "tz" ,ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_ZERO_FINAL)}, -{"zong", "ㄗㄨㄥ", "zong", "tzung" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, PINYIN_ONG)}, -{"zou", "ㄗㄡ", "zou", "tzou" ,ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_OU)}, -{"zu", "ㄗㄨ", "zu", "tzu" ,ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_ZERO_FINAL)}, -{"zuan", "ㄗㄨㄢ", "zuan", "tzuan" ,ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_AN)}, -{"zui", "ㄗㄨㄟ", "zuei", "tzuei" ,ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_EI)}, -{"zun", "ㄗㄨㄣ", "zun", "tzuen" ,ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_EN)}, -{"zuo", "ㄗㄨㄛ", "zuo", "tzuo" ,ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_O)} -}; - -#if 0 -const divided_table_item_t divided_table[] = { - -}; - -const resplit_table_item_t resplit_table[] = { - -}; -#endif - -const gint chewing_key_table[CHEWING_NUMBER_OF_INITIALS * - CHEWING_NUMBER_OF_MIDDLES * - CHEWING_NUMBER_OF_FINALS] = { --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -2 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -3 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -4 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -5 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -85 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -86 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -87 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -88 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, -89 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, -234 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, -252 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -253 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_I, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZERO_INITIAL, CHEWING_V, PINYIN_ING) */, -6 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -7 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -8 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -9 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -10 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -11 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -12 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -13 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -14 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, -21 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -19 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -20 /* ChewingKey(CHEWING_B, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -15 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_AI) */, -16 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_ANG) */, -17 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_AO) */, -18 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_I, PINYIN_ING) */, -22 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_B, CHEWING_V, PINYIN_ING) */, -23 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -24 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -25 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -26 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -27 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -28 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -29 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -30 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -31 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -53 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -54 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -52 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_I, PINYIN_ING) */, -55 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_AI) */, -56 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, INVALID_EA) */, -57 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_EI) */, -58 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_NG) */, -59 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_C, CHEWING_V, PINYIN_ING) */, -32 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -33 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -34 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -35 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -36 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -37 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -38 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -39 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -40 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -42 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -43 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -41 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_I, PINYIN_ING) */, -44 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_ZERO_FINAL) */, -45 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_A) */, -46 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_AI) */, -47 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_AN) */, -48 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, INVALID_EA) */, -49 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_EI) */, -50 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_NG) */, -51 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_CH, CHEWING_V, PINYIN_ING) */, -60 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -61 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -62 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -63 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -64 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -65 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -66 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -67 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -68 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -69 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -78 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -79 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -75 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -76 /* ChewingKey(CHEWING_D, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -70 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_ZERO_FINAL) */, -71 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_AI) */, -72 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_ANG) */, -73 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_AO) */, -74 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, PINYIN_ONG) */, -77 /* ChewingKey(CHEWING_D, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_I, PINYIN_ING) */, -80 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_AI) */, -81 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, INVALID_EA) */, -82 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_EI) */, -83 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_NG) */, -84 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_D, CHEWING_V, PINYIN_ING) */, -90 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -91 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_A) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -92 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -93 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -94 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -95 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -96 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -97 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, -98 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -99 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_I, PINYIN_ING) */, -100 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_F, CHEWING_V, PINYIN_ING) */, -121 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -122 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -123 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -124 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -125 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -126 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -127 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -128 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -129 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -130 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -131 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -132 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_I, PINYIN_ING) */, -133 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_ZERO_FINAL) */, -134 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_A) */, -135 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_AI) */, -136 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_AN) */, -137 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, INVALID_EA) */, -138 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_EI) */, -139 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_NG) */, -140 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_H, CHEWING_V, PINYIN_ING) */, -101 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -102 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -103 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -104 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -105 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -106 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -107 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -108 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -109 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -110 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -111 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -112 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_I, PINYIN_ING) */, -113 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_ZERO_FINAL) */, -114 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_A) */, -115 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_AI) */, -116 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_AN) */, -117 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, INVALID_EA) */, -118 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_EI) */, -119 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_NG) */, -120 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_G, CHEWING_V, PINYIN_ING) */, -156 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -157 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -158 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -159 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -160 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -161 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -162 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -163 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -164 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -165 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -166 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -167 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_I, PINYIN_ING) */, -168 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_ZERO_FINAL) */, -169 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_A) */, -170 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_AI) */, -171 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_AN) */, -172 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, INVALID_EA) */, -173 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_EI) */, -174 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_NG) */, -175 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_K, CHEWING_V, PINYIN_ING) */, -141 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_A) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -148 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -149 /* ChewingKey(CHEWING_J, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -142 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_ZERO_FINAL) */, -143 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_AI) */, -144 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_AN) */, -145 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_ANG) */, -146 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_AO) */, -147 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_O) */, -150 /* ChewingKey(CHEWING_J, CHEWING_I, PINYIN_ONG) */, -151 /* ChewingKey(CHEWING_J, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_I, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_U, PINYIN_ING) */, -152 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_AI) */, -153 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_AO) */, -154 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_EI) */, -155 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_J, CHEWING_V, PINYIN_ING) */, -204 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -205 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -206 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -207 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -208 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -209 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -210 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -211 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -212 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -213 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, -221 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -222 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -218 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -219 /* ChewingKey(CHEWING_M, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -214 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_AI) */, -215 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_ANG) */, -216 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_AO) */, -217 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, PINYIN_ONG) */, -220 /* ChewingKey(CHEWING_M, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_I, PINYIN_ING) */, -223 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_M, CHEWING_V, PINYIN_ING) */, -224 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -225 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -226 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -227 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -228 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -229 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -230 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -231 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -232 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -233 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -244 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -245 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -241 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -242 /* ChewingKey(CHEWING_N, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -235 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_ZERO_FINAL) */, -236 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_AI) */, -237 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_AN) */, -238 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_ANG) */, -239 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_AO) */, -240 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, PINYIN_ONG) */, -243 /* ChewingKey(CHEWING_N, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_I, PINYIN_ING) */, -246 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_AI) */, -247 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_EI) */, -248 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_NG) */, -249 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_U, PINYIN_ING) */, -250 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_AO) */, -251 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_N, CHEWING_V, PINYIN_ING) */, -176 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -177 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -178 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -179 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -180 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -181 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -182 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -183 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -184 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -185 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, -195 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -196 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -197 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -192 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -193 /* ChewingKey(CHEWING_L, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -186 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_ZERO_FINAL) */, -187 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_AI) */, -188 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_AN) */, -189 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_ANG) */, -190 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_AO) */, -191 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, PINYIN_ONG) */, -194 /* ChewingKey(CHEWING_L, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_I, PINYIN_ING) */, -198 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_AI) */, -199 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_EI) */, -200 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_NG) */, -201 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_U, PINYIN_ING) */, -202 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_AO) */, -203 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_L, CHEWING_V, PINYIN_ING) */, -287 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_A) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -288 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -289 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -290 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -291 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -292 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -293 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -295 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -296 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -294 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_I, PINYIN_ING) */, -297 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_ZERO_FINAL) */, -298 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_AI) */, -299 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, INVALID_EA) */, -300 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_EI) */, -301 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_NG) */, -302 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_R, CHEWING_V, PINYIN_ING) */, -254 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -255 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -256 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -257 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -258 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -259 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -260 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -261 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -262 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, -269 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -270 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -267 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -268 /* ChewingKey(CHEWING_P, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -263 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_AI) */, -264 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_ANG) */, -265 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_AO) */, -266 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_I, PINYIN_ING) */, -271 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_P, CHEWING_V, PINYIN_ING) */, -272 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_A) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -279 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -280 /* ChewingKey(CHEWING_Q, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -273 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_ZERO_FINAL) */, -274 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_AI) */, -275 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_AN) */, -276 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_ANG) */, -277 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_AO) */, -278 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_O) */, -281 /* ChewingKey(CHEWING_Q, CHEWING_I, PINYIN_ONG) */, -282 /* ChewingKey(CHEWING_Q, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_I, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_U, PINYIN_ING) */, -283 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_AI) */, -284 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_AO) */, -285 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_EI) */, -286 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_Q, CHEWING_V, PINYIN_ING) */, -303 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -304 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -305 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -306 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -307 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -308 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -309 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -310 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -311 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -333 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -334 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -332 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_I, PINYIN_ING) */, -335 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_AI) */, -336 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, INVALID_EA) */, -337 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_EI) */, -338 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_NG) */, -339 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_S, CHEWING_V, PINYIN_ING) */, -312 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -313 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -314 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -315 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -316 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -317 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -318 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -319 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -320 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -321 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -323 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -322 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_I, PINYIN_ING) */, -324 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_ZERO_FINAL) */, -325 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_A) */, -326 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_AI) */, -327 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_AN) */, -328 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, INVALID_EA) */, -329 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_EI) */, -330 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_NG) */, -331 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_SH, CHEWING_V, PINYIN_ING) */, -340 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -341 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -342 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -343 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -344 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -345 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -346 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -347 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -353 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -354 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -352 /* ChewingKey(CHEWING_T, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -348 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_AI) */, -349 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_ANG) */, -350 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_AO) */, -351 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_I, PINYIN_ING) */, -355 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_AI) */, -356 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, INVALID_EA) */, -357 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_EI) */, -358 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_NG) */, -359 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_T, CHEWING_V, PINYIN_ING) */, -360 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_A) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -367 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_I, PINYIN_ING) */, -369 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_ZERO_FINAL) */, -361 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_A) */, -362 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_AI) */, -363 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_AN) */, -364 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, INVALID_EA) */, -365 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_EI) */, -366 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_NG) */, -368 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(PINYIN_W, CHEWING_V, PINYIN_ING) */, -370 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_A) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -377 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -378 /* ChewingKey(CHEWING_X, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -371 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_ZERO_FINAL) */, -372 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_AI) */, -373 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_AN) */, -374 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_ANG) */, -375 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_AO) */, -376 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_O) */, -379 /* ChewingKey(CHEWING_X, CHEWING_I, PINYIN_ONG) */, -380 /* ChewingKey(CHEWING_X, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_I, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_U, PINYIN_ING) */, -381 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_AI) */, -382 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_AO) */, -383 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_EI) */, -384 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_X, CHEWING_V, PINYIN_ING) */, -385 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_A) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, INVALID_EA) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_O) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, -393 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, -394 /* ChewingKey(PINYIN_Y, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -392 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_ZERO_FINAL) */, -386 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_A) */, -387 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_AI) */, -388 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_AN) */, -389 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_ANG) */, -390 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_AO) */, -391 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_NG) */, -395 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_O) */, -396 /* ChewingKey(PINYIN_Y, CHEWING_I, PINYIN_ONG) */, -397 /* ChewingKey(PINYIN_Y, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_I, PINYIN_ING) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_AI) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, INVALID_EA) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_EI) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_NG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_U, PINYIN_ING) */, -398 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_AI) */, -399 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_AO) */, -400 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_EI) */, -401 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(PINYIN_Y, CHEWING_V, PINYIN_ING) */, -402 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -403 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -404 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -405 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -406 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -407 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -408 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -409 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -410 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -411 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -434 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -435 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -433 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_I, PINYIN_ING) */, -436 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_A) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_AI) */, -437 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, INVALID_EA) */, -438 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_EI) */, -439 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_NG) */, -440 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_Z, CHEWING_V, PINYIN_ING) */, -412 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_ZERO_FINAL) */, -413 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_A) */, -414 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_AI) */, -415 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_AN) */, -416 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_ANG) */, -417 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_AO) */, -418 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, INVALID_EA) */, -419 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_EI) */, -420 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_EN) */, -421 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_O) */, -423 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, PINYIN_ONG) */, -424 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_ZERO_MIDDLE, PINYIN_ING) */, -422 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_A) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, INVALID_EA) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_O) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_I, PINYIN_ING) */, -425 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_ZERO_FINAL) */, -426 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_A) */, -427 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_AI) */, -428 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_AN) */, -429 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, INVALID_EA) */, -430 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_EI) */, -431 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_NG) */, -432 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_O) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_U, PINYIN_ING) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_ZERO_FINAL) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_A) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_AI) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_AN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_ANG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_AO) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_E) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, INVALID_EA) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_EI) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_EN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_ENG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_ER) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_NG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_O) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, PINYIN_ONG) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, CHEWING_OU) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, PINYIN_IN) */, --1 /* ChewingKey(CHEWING_ZH, CHEWING_V, PINYIN_ING) */ -}; - -}; - -#endif diff --git a/src/storage/pinyin_phrase2.h b/src/storage/pinyin_phrase2.h deleted file mode 100644 index 85b9fc2..0000000 --- a/src/storage/pinyin_phrase2.h +++ /dev/null @@ -1,267 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef PINYIN_PHRASE2_H -#define PINYIN_PHRASE2_H - -#include "novel_types.h" -#include "chewing_key.h" -#include "zhuyin_custom2.h" -#include "pinyin_parser2.h" - -namespace zhuyin{ - -inline int pinyin_exact_compare2(const ChewingKey * key_lhs, - const ChewingKey * key_rhs, - int phrase_length){ - int i; - int result; - - /* compare initial */ - for (i = 0; i < phrase_length; ++i) { - result = key_lhs[i].m_initial - key_rhs[i].m_initial; - if (0 != result) - return result; - } - - /* compare middle and final */ - for (i = 0; i < phrase_length; ++i) { - result = key_lhs[i].m_middle - key_rhs[i].m_middle; - if (0 != result) - return result; - result = key_lhs[i].m_final - key_rhs[i].m_final; - if (0 != result) - return result; - } - - /* compare tone */ - for (i = 0; i < phrase_length; ++i) { - result = key_lhs[i].m_tone - key_rhs[i].m_tone; - if (0 != result) - return result; - } - - return 0; -} - - -inline int pinyin_compare_with_ambiguities2(pinyin_option_t options, - const ChewingKey * key_lhs, - const ChewingKey * key_rhs, - int phrase_length){ - int i; - int result; - - /* compare initial */ - for (i = 0; i < phrase_length; ++i) { - result = pinyin_compare_initial2 - (options, - (ChewingInitial)key_lhs[i].m_initial, - (ChewingInitial)key_rhs[i].m_initial); - if (0 != result) - return result; - } - - /* compare middle and final */ - for (i = 0; i < phrase_length; ++i) { - result = pinyin_compare_middle_and_final2 - (options, - (ChewingMiddle)key_lhs[i].m_middle, - (ChewingMiddle)key_rhs[i].m_middle, - (ChewingFinal) key_lhs[i].m_final, - (ChewingFinal) key_rhs[i].m_final); - if (0 != result) - return result; - } - - /* compare tone */ - for (i = 0; i < phrase_length; ++i) { - result = pinyin_compare_tone2 - (options, - (ChewingTone)key_lhs[i].m_tone, - (ChewingTone)key_rhs[i].m_tone); - if (0 != result) - return result; - } - - return 0; -} - -/* compute pinyin lower bound */ -inline void compute_lower_value2(pinyin_option_t options, - const ChewingKey * in_keys, - ChewingKey * out_keys, - int phrase_length) { - ChewingKey aKey; - - for (int i = 0; i < phrase_length; ++i) { - int k; int sel; - aKey = in_keys[i]; - - /* compute lower initial */ - sel = aKey.m_initial; - for (k = aKey.m_initial - 1; k >= CHEWING_ZERO_INITIAL; --k) { - if (0 != pinyin_compare_initial2 - (options, (ChewingInitial)aKey.m_initial, (ChewingInitial)k)) - break; - else - sel = k; - } - aKey.m_initial = (ChewingInitial)sel; - - /* compute lower middle, skipped as no fuzzy pinyin here. - * if needed in future, still use pinyin_compare_middle_and_final2 - * to check lower bound. - */ - - /* as chewing zero middle is the first item, and its value is zero, - * no need to adjust it for incomplete pinyin. - */ - - /* compute lower final */ - sel = aKey.m_final; - for (k = aKey.m_final - 1; k >= CHEWING_ZERO_FINAL; --k) { - if (0 != pinyin_compare_middle_and_final2 - (options, - (ChewingMiddle)aKey.m_middle, (ChewingMiddle) aKey.m_middle, - (ChewingFinal)aKey.m_final, (ChewingFinal)k)) - break; - else - sel = k; - } - aKey.m_final = (ChewingFinal)sel; - - /* compute lower tone */ - sel = aKey.m_tone; - for (k = aKey.m_tone - 1; k >= CHEWING_ZERO_TONE; --k) { - if (0 != pinyin_compare_tone2 - (options, (ChewingTone)aKey.m_tone, (ChewingTone)k)) - break; - else - sel = k; - } - aKey.m_tone = (ChewingTone)sel; - - /* save the result */ - out_keys[i] = aKey; - } -} - -/* compute pinyin upper bound */ -inline void compute_upper_value2(pinyin_option_t options, - const ChewingKey * in_keys, - ChewingKey * out_keys, - int phrase_length) { - ChewingKey aKey; - - for (int i = 0; i < phrase_length; ++i) { - int k; int sel; - aKey = in_keys[i]; - - /* compute upper initial */ - sel = aKey.m_initial; - for (k = aKey.m_initial + 1; k <= CHEWING_LAST_INITIAL; ++k) { - if (0 != pinyin_compare_initial2 - (options, (ChewingInitial)aKey.m_initial, (ChewingInitial)k)) - break; - else - sel = k; - } - aKey.m_initial = (ChewingInitial)sel; - - /* adjust it for incomplete pinyin. */ - - /* compute upper middle */ - sel = aKey.m_middle; - for (k = aKey.m_middle + 1; k <= CHEWING_LAST_MIDDLE; ++k) { - if (0 != pinyin_compare_middle_and_final2 - (options, - (ChewingMiddle)aKey.m_middle, (ChewingMiddle)k, - (ChewingFinal)aKey.m_final, (ChewingFinal)aKey.m_final)) - break; - else - sel = k; - } - aKey.m_middle = (ChewingMiddle)sel; - - /* compute upper final */ - sel = aKey.m_final; - for (k = aKey.m_final + 1; k <= CHEWING_LAST_FINAL; ++k) { - if (0 != pinyin_compare_middle_and_final2 - (options, - (ChewingMiddle)aKey.m_middle, (ChewingMiddle)aKey.m_middle, - (ChewingFinal)aKey.m_final, (ChewingFinal)k)) - break; - else - sel = k; - } - aKey.m_final = (ChewingFinal)sel; - - /* compute upper tone */ - sel = aKey.m_tone; - for (k = aKey.m_tone + 1; k <= CHEWING_LAST_TONE; ++k) { - if (0 != pinyin_compare_tone2 - (options, (ChewingTone)aKey.m_tone, (ChewingTone)k)) - break; - else - sel = k; - } - aKey.m_tone = (ChewingTone)sel; - - /* save the result */ - out_keys[i] = aKey; - } -} - - -template<size_t phrase_length> -struct PinyinIndexItem2{ - phrase_token_t m_token; - ChewingKey m_keys[phrase_length]; -public: - PinyinIndexItem2<phrase_length> (const ChewingKey * keys, - phrase_token_t token) { - memmove(m_keys, keys, sizeof(ChewingKey) * phrase_length); - m_token = token; - } -}; - - -/* for find the element in the phrase array */ -template<size_t phrase_length> -inline int phrase_exact_compare2(const PinyinIndexItem2<phrase_length> &lhs, - const PinyinIndexItem2<phrase_length> &rhs) -{ - ChewingKey * keys_lhs = (ChewingKey *) lhs.m_keys; - ChewingKey * keys_rhs = (ChewingKey *) rhs.m_keys; - return pinyin_exact_compare2(keys_lhs, keys_rhs, phrase_length); -} - -template<size_t phrase_length> -inline bool phrase_exact_less_than2(const PinyinIndexItem2<phrase_length> &lhs, - const PinyinIndexItem2<phrase_length> &rhs) -{ - return 0 > phrase_exact_compare2<phrase_length>(lhs, rhs); -} - -}; - -#endif diff --git a/src/storage/table_info.cpp b/src/storage/table_info.cpp deleted file mode 100644 index da240dc..0000000 --- a/src/storage/table_info.cpp +++ /dev/null @@ -1,282 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2013 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "table_info.h" -#include <stdio.h> -#include <assert.h> -#include <string.h> -#include <locale.h> - -using namespace zhuyin; - - -static const pinyin_table_info_t reserved_tables[] = { - {RESERVED, NULL, NULL, NULL, NOT_USED}, - {TSI_DICTIONARY, "tsi.table", "tsi.bin", "tsi.dbin", SYSTEM_FILE}, - {USER_DICTIONARY, NULL, NULL, "user.bin", USER_FILE} -}; - - -SystemTableInfo::SystemTableInfo() { - m_binary_format_version = 0; - m_model_data_version = 0; - m_lambda = 0.; - - size_t i; - for (i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - pinyin_table_info_t * table_info = &m_table_info[i]; - - table_info->m_dict_index = i; - table_info->m_table_filename = NULL; - table_info->m_system_filename = NULL; - table_info->m_user_filename = NULL; - table_info->m_file_type = NOT_USED; - } -} - -SystemTableInfo::~SystemTableInfo() { - reset(); -} - -void SystemTableInfo::reset() { - m_binary_format_version = 0; - m_model_data_version = 0; - m_lambda = 0.; - - size_t i; - for (i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) { - pinyin_table_info_t * table_info = &m_table_info[i]; - - g_free((gchar *)table_info->m_table_filename); - table_info->m_table_filename = NULL; - g_free((gchar *)table_info->m_system_filename); - table_info->m_system_filename = NULL; - g_free((gchar *)table_info->m_user_filename); - table_info->m_user_filename = NULL; - - table_info->m_file_type = NOT_USED; - } -} - -void SystemTableInfo::postfix_tables() { - size_t i; - for (i = 0; i < G_N_ELEMENTS(reserved_tables); ++i) { - const pinyin_table_info_t * postfix = &reserved_tables[i]; - - guint8 index = postfix->m_dict_index; - pinyin_table_info_t * table_info = &m_table_info[index]; - assert(table_info->m_dict_index == index); - - table_info->m_table_filename = g_strdup(postfix->m_table_filename); - table_info->m_system_filename = g_strdup(postfix->m_system_filename); - table_info->m_user_filename = g_strdup(postfix->m_user_filename); - table_info->m_file_type = postfix->m_file_type; - } -} - -static gchar * to_string(const char * str) { - if (0 == strcmp(str, "NULL")) - return NULL; - - return g_strdup(str); -} - -static PHRASE_FILE_TYPE to_file_type(const char * str) { -#define HANDLE(x) { \ - if (0 == strcmp(str, #x)) \ - return x; \ - } - - HANDLE(NOT_USED); - HANDLE(SYSTEM_FILE); - HANDLE(DICTIONARY); - HANDLE(USER_FILE); - - assert(false); - -#undef HANDLE -} - -bool SystemTableInfo::load(const char * filename) { - reset(); - - char * locale = setlocale(LC_NUMERIC, "C"); - - FILE * input = fopen(filename, "r"); - if (NULL == input) { - fprintf(stderr, "open %s failed.\n", filename); - return false; - } - - int binver = 0, modelver = 0; - gfloat lambda = 0.; - - int num = fscanf(input, "binary format version:%d\n", &binver); - if (1 != num) { - fclose(input); - return false; - } - - num = fscanf(input, "model data version:%d\n", &modelver); - if (1 != num) { - fclose(input); - return false; - } - - num = fscanf(input, "lambda parameter:%f\n", &lambda); - if (1 != num) { - fclose(input); - return false; - } - -#if 0 - printf("binver:%d modelver:%d lambda:%f\n", binver, modelver, lambda); -#endif - - m_binary_format_version = binver; - m_model_data_version = modelver; - m_lambda = lambda; - - int index = 0; - char tablefile[256], sysfile[256], userfile[256], filetype[256]; - while (!feof(input)) { - num = fscanf(input, "%d %256s %256s %256s %256s\n", - &index, tablefile, sysfile, userfile, filetype); - - if (5 != num) - continue; - - if (!(0 <= index && index < PHRASE_INDEX_LIBRARY_COUNT)) - continue; - - /* save into m_table_info. */ - pinyin_table_info_t * table_info = &m_table_info[index]; - assert(index == table_info->m_dict_index); - - table_info->m_table_filename = to_string(tablefile); - table_info->m_system_filename = to_string(sysfile); - table_info->m_user_filename = to_string(userfile); - - table_info->m_file_type = to_file_type(filetype); - } - - fclose(input); - - /* postfix reserved tables. */ - postfix_tables(); - - setlocale(LC_NUMERIC, locale); - - return true; -} - -const pinyin_table_info_t * SystemTableInfo::get_table_info() { - return m_table_info; -} - -gfloat SystemTableInfo::get_lambda() { - return m_lambda; -} - - -UserTableInfo::UserTableInfo() { - m_binary_format_version = 0; - m_model_data_version = 0; -} - -void UserTableInfo::reset() { - m_binary_format_version = 0; - m_model_data_version = 0; -} - -bool UserTableInfo::load(const char * filename) { - reset(); - - char * locale = setlocale(LC_NUMERIC, "C"); - - FILE * input = fopen(filename, "r"); - if (NULL == input) { - fprintf(stderr, "open %s failed.", filename); - return false; - } - - int binver = 0, modelver = 0; - - int num = fscanf(input, "binary format version:%d\n", &binver); - if (1 != num) { - fclose(input); - return false; - } - - num = fscanf(input, "model data version:%d\n", &modelver); - if (1 != num) { - fclose(input); - return false; - } - -#if 0 - printf("binver:%d modelver:%d\n", binver, modelver); -#endif - - m_binary_format_version = binver; - m_model_data_version = modelver; - - fclose(input); - - setlocale(LC_NUMERIC, locale); - - return true; -} - -bool UserTableInfo::save(const char * filename) { - char * locale = setlocale(LC_NUMERIC, "C"); - - FILE * output = fopen(filename, "w"); - if (NULL == output) { - fprintf(stderr, "write %s failed.\n", filename); - return false; - } - - fprintf(output, "binary format version:%d\n", m_binary_format_version); - fprintf(output, "model data version:%d\n", m_model_data_version); - - fclose(output); - - setlocale(LC_NUMERIC, locale); - - return true; -} - -bool UserTableInfo::is_conform(const SystemTableInfo * sysinfo) { - if (sysinfo->m_binary_format_version != m_binary_format_version) - return false; - - if (sysinfo->m_model_data_version != m_model_data_version) - return false; - - return true; -} - -bool UserTableInfo::make_conform(const SystemTableInfo * sysinfo) { - m_binary_format_version = sysinfo->m_binary_format_version; - m_model_data_version = sysinfo->m_model_data_version; - return true; -} diff --git a/src/storage/table_info.h b/src/storage/table_info.h deleted file mode 100644 index 170395e..0000000 --- a/src/storage/table_info.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2013 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef TABLE_INFO_H -#define TABLE_INFO_H - -#include "novel_types.h" - - -namespace zhuyin{ - -typedef enum { - NOT_USED, /* not used. */ - SYSTEM_FILE, /* system phrase file. */ - DICTIONARY, /* professional dictionary. */ - USER_FILE, /* user only phrase file. */ -} PHRASE_FILE_TYPE; - -typedef struct { - guint8 m_dict_index; /* for assert purpose. */ - const gchar * m_table_filename; - const gchar * m_system_filename; - const gchar * m_user_filename; - PHRASE_FILE_TYPE m_file_type; -} pinyin_table_info_t; - - -class UserTableInfo; - -class SystemTableInfo{ - friend class UserTableInfo; -private: - int m_binary_format_version; - int m_model_data_version; - gfloat m_lambda; - - pinyin_table_info_t m_table_info[PHRASE_INDEX_LIBRARY_COUNT]; - -private: - void reset(); - - void postfix_tables(); - -public: - SystemTableInfo(); - - ~SystemTableInfo(); - - bool load(const char * filename); - - const pinyin_table_info_t * get_table_info(); - - gfloat get_lambda(); -}; - -class UserTableInfo{ -private: - int m_binary_format_version; - int m_model_data_version; - -private: - void reset(); - -public: - UserTableInfo(); - - bool load(const char * filename); - - bool save(const char * filename); - - bool is_conform(const SystemTableInfo * sysinfo); - - bool make_conform(const SystemTableInfo * sysinfo); -}; - -}; - - -#endif diff --git a/src/storage/tag_utility.cpp b/src/storage/tag_utility.cpp deleted file mode 100644 index a2655c1..0000000 --- a/src/storage/tag_utility.cpp +++ /dev/null @@ -1,420 +0,0 @@ -#include <glib.h> -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include "novel_types.h" -#include "phrase_index.h" -#include "phrase_large_table2.h" -#include "tag_utility.h" - -namespace zhuyin{ - -/* internal taglib structure */ -struct tag_entry{ - int m_line_type; - char * m_line_tag; - int m_num_of_values; - char ** m_required_tags; - /* char ** m_optional_tags; */ - /* int m_optional_count = 0; */ - char ** m_ignored_tags; -}; - -tag_entry tag_entry_copy(int line_type, const char * line_tag, - int num_of_values, - char * required_tags[], - char * ignored_tags[]){ - tag_entry entry; - entry.m_line_type = line_type; - entry.m_line_tag = g_strdup( line_tag ); - entry.m_num_of_values = num_of_values; - entry.m_required_tags = g_strdupv( required_tags ); - entry.m_ignored_tags = g_strdupv( ignored_tags ); - return entry; -} - -tag_entry tag_entry_clone(tag_entry * entry){ - return tag_entry_copy(entry->m_line_type, entry->m_line_tag, - entry->m_num_of_values, - entry->m_required_tags, entry->m_ignored_tags); -} - -void tag_entry_reclaim(tag_entry * entry){ - g_free( entry->m_line_tag ); - g_strfreev( entry->m_required_tags ); - g_strfreev(entry->m_ignored_tags); -} - -static bool taglib_free_tag_array(GArray * tag_array){ - for ( size_t i = 0; i < tag_array->len; ++i) { - tag_entry * entry = &g_array_index(tag_array, tag_entry, i); - tag_entry_reclaim(entry); - } - g_array_free(tag_array, TRUE); - return true; -} - -/* special unichar to be handled in split_line. */ -static gunichar backslash = 0; -static gunichar quote = 0; - -static gboolean split_line_init(){ - backslash = g_utf8_get_char("\\"); - quote = g_utf8_get_char("\""); - return TRUE; -} - -/* Pointer Array of Array of tag_entry */ -static GPtrArray * g_tagutils_stack = NULL; - -bool taglib_init(){ - assert( g_tagutils_stack == NULL); - g_tagutils_stack = g_ptr_array_new(); - GArray * tag_array = g_array_new(TRUE, TRUE, sizeof(tag_entry)); - g_ptr_array_add(g_tagutils_stack, tag_array); - - /* init split_line. */ - split_line_init(); - return true; -} - -bool taglib_add_tag(int line_type, const char * line_tag, int num_of_values, - const char * required_tags, const char * ignored_tags){ - GArray * tag_array = (GArray *) g_ptr_array_index(g_tagutils_stack, - g_tagutils_stack->len - 1); - - /* some duplicate tagname or line_type check here. */ - for ( size_t i = 0; i < tag_array->len; ++i) { - tag_entry * entry = &g_array_index(tag_array, tag_entry, i); - if ( entry->m_line_type == line_type || - strcmp( entry->m_line_tag, line_tag ) == 0 ) - return false; - } - - char ** required = g_strsplit_set(required_tags, ",:", -1); - char ** ignored = g_strsplit_set(ignored_tags, ",:", -1); - - tag_entry entry = tag_entry_copy(line_type, line_tag, num_of_values, - required, ignored); - g_array_append_val(tag_array, entry); - - g_strfreev(required); - g_strfreev(ignored); - return true; -} - -static void ptr_array_entry_free(gpointer data, gpointer user_data){ - g_free(data); -} - -static gboolean hash_table_key_value_free(gpointer key, gpointer value, - gpointer user_data){ - g_free(key); - g_free(value); - return TRUE; -} - -/* split the line into tokens. */ -static gchar ** split_line(const gchar * line){ - /* array for tokens. */ - GArray * tokens = g_array_new(TRUE, TRUE, sizeof(gchar *)); - - for ( const gchar * cur = line; *cur; cur = g_utf8_next_char(cur) ){ - gunichar unichar = g_utf8_get_char(cur); - const gchar * begin = cur; - gchar * token = NULL; - - if ( g_unichar_isspace (unichar) ) { - continue; - }else if ( unichar == quote ) { - /* handles "\"". */ - /* skip the first '"'. */ - begin = cur = g_utf8_next_char(cur); - while (*cur) { - unichar = g_utf8_get_char(cur); - if ( unichar == backslash ) { - cur = g_utf8_next_char(cur); - g_return_val_if_fail(*cur, NULL); - } else if ( unichar == quote ){ - break; - } - cur = g_utf8_next_char(cur); - } - gchar * tmp = g_strndup( begin, cur - begin); - /* TODO: switch to own strdup_escape implementation - for \"->" transforming. */ - token = g_strdup_printf("%s", tmp); - g_free(tmp); - } else { - /* handles other tokens. */ - while(*cur) { - unichar = g_utf8_get_char(cur); - if ( g_unichar_isgraph(unichar) ) { - /* next unichar */ - cur = g_utf8_next_char(cur); - } else { - /* space and other characters handles. */ - break; - } - } - token = g_strndup( begin, cur - begin ); - } - - g_array_append_val(tokens, token); - if ( !*cur ) - break; - } - - return (gchar **)g_array_free(tokens, FALSE); -} - -bool taglib_read(const char * input_line, int & line_type, GPtrArray * values, - GHashTable * required){ - /* reset values and required. */ - g_ptr_array_foreach(values, ptr_array_entry_free, NULL); - g_ptr_array_set_size(values, 0); - g_hash_table_foreach_steal(required, hash_table_key_value_free, NULL); - - /* use own version of split_line - instead of g_strsplit_set for special token.*/ - char ** tokens = split_line(input_line); - int num_of_tokens = g_strv_length(tokens); - - char * line_tag = tokens[0]; - GArray * tag_array = (GArray *) g_ptr_array_index(g_tagutils_stack, g_tagutils_stack->len - 1); - - tag_entry * cur_entry = NULL; - /* find line type. */ - for ( size_t i = 0; i < tag_array->len; ++i) { - tag_entry * entry = &g_array_index(tag_array, tag_entry, i); - if ( strcmp( entry->m_line_tag, line_tag ) == 0 ) { - cur_entry = entry; - break; - } - } - - if ( !cur_entry ) - return false; - - line_type = cur_entry->m_line_type; - - for ( int i = 1; i < cur_entry->m_num_of_values + 1; ++i) { - g_return_val_if_fail(i < num_of_tokens, false); - char * value = g_strdup( tokens[i] ); - g_ptr_array_add(values, value); - } - - int ignored_len = g_strv_length( cur_entry->m_ignored_tags ); - int required_len = g_strv_length( cur_entry->m_required_tags); - - for ( int i = cur_entry->m_num_of_values + 1; i < num_of_tokens; ++i){ - g_return_val_if_fail(i < num_of_tokens, false); - const char * tmp = tokens[i]; - - /* check ignored tags. */ - bool tag_ignored = false; - for ( int m = 0; m < ignored_len; ++m) { - if ( strcmp(tmp, cur_entry->m_ignored_tags[m]) == 0) { - tag_ignored = true; - break; - } - } - - if ( tag_ignored ) { - ++i; - continue; - } - - /* check required tags. */ - bool tag_required = false; - for ( int m = 0; m < required_len; ++m) { - if ( strcmp(tmp, cur_entry->m_required_tags[m]) == 0) { - tag_required = true; - break; - } - } - - /* warning on the un-expected tags. */ - if ( !tag_required ) { - g_warning("un-expected tags:%s.\n", tmp); - ++i; - continue; - } - - char * key = g_strdup(tokens[i]); - ++i; - g_return_val_if_fail(i < num_of_tokens, false); - char * value = g_strdup(tokens[i]); - g_hash_table_insert(required, key, value); - } - - /* check for all required tags. */ - for ( int i = 0; i < required_len; ++i) { - const char * required_tag_str = cur_entry->m_required_tags[i]; - gboolean result = g_hash_table_lookup_extended(required, required_tag_str, NULL, NULL); - if ( !result ) { - g_warning("missed required tags: %s.\n", required_tag_str); - g_strfreev(tokens); - return false; - } - } - - g_strfreev(tokens); - return true; -} - -bool taglib_remove_tag(int line_type){ - /* Note: duplicate entry check is in taglib_add_tag. */ - GArray * tag_array = (GArray *) g_ptr_array_index(g_tagutils_stack, g_tagutils_stack->len - 1); - for ( size_t i = 0; i < tag_array->len; ++i) { - tag_entry * entry = &g_array_index(tag_array, tag_entry, i); - if (entry->m_line_type != line_type) - continue; - tag_entry_reclaim(entry); - g_array_remove_index(tag_array, i); - return true; - } - return false; -} - -bool taglib_push_state(){ - assert(g_tagutils_stack->len >= 1); - GArray * next_tag_array = g_array_new(TRUE, TRUE, sizeof(tag_entry)); - GArray * prev_tag_array = (GArray *) g_ptr_array_index(g_tagutils_stack, g_tagutils_stack->len - 1); - for ( size_t i = 0; i < prev_tag_array->len; ++i) { - tag_entry * entry = &g_array_index(prev_tag_array, tag_entry, i); - tag_entry new_entry = tag_entry_clone(entry); - g_array_append_val(next_tag_array, new_entry); - } - g_ptr_array_add(g_tagutils_stack, next_tag_array); - return true; -} - -bool taglib_pop_state(){ - assert(g_tagutils_stack->len > 1); - GArray * tag_array = (GArray *) g_ptr_array_index(g_tagutils_stack, g_tagutils_stack->len - 1); - g_ptr_array_remove_index(g_tagutils_stack, g_tagutils_stack->len - 1); - taglib_free_tag_array(tag_array); - return true; -} - -bool taglib_fini(){ - for ( size_t i = 0; i < g_tagutils_stack->len; ++i){ - GArray * tag_array = (GArray *) g_ptr_array_index(g_tagutils_stack, i); - taglib_free_tag_array(tag_array); - } - g_ptr_array_free(g_tagutils_stack, TRUE); - g_tagutils_stack = NULL; - return true; -} - -#if 0 - -static phrase_token_t taglib_special_string_to_token(const char * string){ - struct token_pair{ - phrase_token_t token; - const char * string; - }; - - static const token_pair tokens [] = { - {sentence_start, "<start>"}, - {0, NULL} - }; - - const token_pair * pair = tokens; - while (pair->string) { - if ( strcmp(string, pair->string ) == 0 ) - return pair->token; - pair++; - } - - fprintf(stderr, "error: unknown token:%s.\n", string); - return 0; -} - -phrase_token_t taglib_string_to_token(PhraseLargeTable2 * phrase_table, - FacadePhraseIndex * phrase_index, - const char * string){ - phrase_token_t token = null_token; - if ( string[0] == '<' ) { - return taglib_special_string_to_token(string); - } - - glong phrase_len = g_utf8_strlen(string, -1); - ucs4_t * phrase = g_utf8_to_ucs4(string, -1, NULL, NULL, NULL); - - PhraseTokens tokens; - memset(tokens, 0, sizeof(PhraseTokens)); - phrase_index->prepare_tokens(tokens); - int result = phrase_table->search(phrase_len, phrase, tokens); - int num = get_first_token(tokens, token); - phrase_index->destroy_tokens(tokens); - - if ( !(result & SEARCH_OK) ) - fprintf(stderr, "error: unknown token:%s.\n", string); - - g_free(phrase); - return token; -} - -#endif - -static const char * taglib_special_token_to_string(phrase_token_t token){ - struct token_pair{ - phrase_token_t token; - const char * string; - }; - - static const token_pair tokens [] = { - {sentence_start, "<start>"}, - {0, NULL} - }; - - const token_pair * pair = tokens; - while (pair->token) { - if ( token == pair->token ) - return pair->string; - pair++; - } - - fprintf(stderr, "error: unknown token:%d.\n", token); - return NULL; -} - -char * taglib_token_to_string(FacadePhraseIndex * phrase_index, - phrase_token_t token) { - PhraseItem item; - ucs4_t buffer[MAX_PHRASE_LENGTH]; - - gchar * phrase; - /* deal with the special phrase index, for "<start>..." */ - if ( PHRASE_INDEX_LIBRARY_INDEX(token) == 0 ) { - return g_strdup(taglib_special_token_to_string(token)); - } - - int result = phrase_index->get_phrase_item(token, item); - if (result != ERROR_OK) { - fprintf(stderr, "error: unknown token:%d.\n", token); - return NULL; - } - - item.get_phrase_string(buffer); - guint8 length = item.get_phrase_length(); - phrase = g_ucs4_to_utf8(buffer, length, NULL, NULL, NULL); - return phrase; -} - -bool taglib_validate_token_with_string(FacadePhraseIndex * phrase_index, - phrase_token_t token, - const char * string){ - bool result = false; - - char * str = taglib_token_to_string(phrase_index, token); - result = (0 == strcmp(str, string)); - g_free(str); - - return result; -} - - -}; diff --git a/src/storage/tag_utility.h b/src/storage/tag_utility.h deleted file mode 100644 index c1a2c16..0000000 --- a/src/storage/tag_utility.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2010 Peng Wu - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef TAG_UTILITY_H -#define TAG_UTILITY_H - -#include "novel_types.h" - -/* Note: the optional tag has been removed from the first implementation. - * Maybe the optional tag will be added back later. - */ - -namespace zhuyin{ - -/** - * taglib_init: - * @returns: whether the initialize operation is successful. - * - * Initialize the n-gram tag parse library. - * - */ -bool taglib_init(); - -/** - * taglib_add_tag: - * @line_type: the line type. - * @line_tag: the line tag. - * @num_of_values: the number of values following the line tag. - * @required_tags: the required tags of the line. - * @ignored_tags: the ignored tags of the line. - * @returns: whether the add operation is successful. - * - * Add one line tag to the tag parse library. - * - * Note: the required and ignored tags are separated by ',' or ':' . - * - */ -bool taglib_add_tag(int line_type, const char * line_tag, int num_of_values, const char * required_tags, const char * ignored_tags); - -/** - * taglib_read: - * @input_line: one input line. - * @line_type: the line type. - * @values: the values following the line tag. - * @required: the required tags of the line type. - * @returns: whether the line is parsed ok. - * - * Parse one input line into line_type, values and required tags. - * - * Note: most parameters are hash table of string (const char *). - * - */ -bool taglib_read(const char * input_line, int & line_type, - GPtrArray * values, GHashTable * required); - -/** - * taglib_remove_tag: - * @line_type: the type of the line tag. - * @returns: whether the remove operation is successful. - * - * Remove one line tag. - * - */ -bool taglib_remove_tag(int line_type); - -/** - * taglib_push_state: - * @returns: whether the push operation is successful. - * - * Push the current state onto the stack. - * - * Note: the taglib_push/pop_state functions are used to save - * the current known tag list in stack. - * Used when the parsing context is changed. - */ -bool taglib_push_state(); - -/** - * taglib_pop_state: - * @returns: whether the pop operation is successful. - * - * Pop the current state off the stack. - * - */ -bool taglib_pop_state(); - -/** - * taglib_fini: - * @returns: whether the finish operation is successful. - * - * Finish the n-gram tag parse library. - * - */ -bool taglib_fini(); - -class PhraseLargeTable2; -class FacadePhraseIndex; - - -/** - * taglib_token_to_string: - * @phrase_index: the phrase index for phrase string lookup. - * @token: the phrase token. - * @returns: the phrase string found in phrase index. - * - * Translate one token into the phrase string. - * - */ -char * taglib_token_to_string(FacadePhraseIndex * phrase_index, - phrase_token_t token); - -/** - * taglib_validate_token_with_string: - * @phrase_index: the phrase index. - * @token: the phrase token. - * @string: the phrase string. - * @returns: whether the token is validated with the phrase string. - * - * Validate the token with the phrase string. - * - */ -bool taglib_validate_token_with_string(FacadePhraseIndex * phrase_index, - phrase_token_t token, - const char * string); - -/* Note: the following function is only available when the optional tag exists. - bool taglib_report_status(int line_type); */ - -/* Note: taglib_write is omited, as printf is more suitable for this. */ - -}; - -#endif diff --git a/src/storage/zhuyin_custom2.h b/src/storage/zhuyin_custom2.h deleted file mode 100644 index e505c8d..0000000 --- a/src/storage/zhuyin_custom2.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * libzhuyin - * Library to deal with zhuyin. - * - * Copyright (C) 2011 Peng Wu <alexepico@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ZHUYIN_CUSTOM2_H -#define ZHUYIN_CUSTOM2_H - -#include <glib.h> - -G_BEGIN_DECLS - -/** - * ZhuyinTableFlag: - */ -enum ZhuyinTableFlag{ - IS_BOPOMOFO = 1U << 1, - IS_PINYIN = 1U << 2, - PINYIN_INCOMPLETE = 1U << 3, - CHEWING_INCOMPLETE = 1U << 4, - USE_TONE = 1U << 5, - FORCE_TONE = 1U << 6, - HSU_CORRECT = 1U << 7, - ETEN26_CORRECT = 1U << 8, - DYNAMIC_ADJUST = 1U << 9, - SHUFFLE_CORRECT = 1U << 10, - ZHUYIN_CORRECT_ALL = HSU_CORRECT|ETEN26_CORRECT|SHUFFLE_CORRECT -}; - -/** - * ZhuyinAmbiguity2: - * - * The enums of zhuyin ambiguities. - * - */ -enum ZhuyinAmbiguity2{ - ZHUYIN_AMB_C_CH = 1U << 12, - ZHUYIN_AMB_S_SH = 1U << 13, - ZHUYIN_AMB_Z_ZH = 1U << 14, - ZHUYIN_AMB_F_H = 1U << 15, - ZHUYIN_AMB_G_K = 1U << 16, - ZHUYIN_AMB_L_N = 1U << 17, - ZHUYIN_AMB_L_R = 1U << 18, - ZHUYIN_AMB_AN_ANG = 1U << 19, - ZHUYIN_AMB_EN_ENG = 1U << 20, - ZHUYIN_AMB_IN_ING = 1U << 21, - ZHUYIN_AMB_ALL = 0x3FFU << 12 -}; - -/** - * @brief enums of Zhuyin Schemes. - */ -enum ZhuyinScheme -{ - CHEWING_STANDARD = 1, - CHEWING_HSU = 2, - CHEWING_IBM = 3, - CHEWING_GINYIEH = 4, - CHEWING_ETEN = 5, - CHEWING_ETEN26 = 6, - CHEWING_STANDARD_DVORAK = 7, - CHEWING_HSU_DVORAK = 8, - CHEWING_DACHEN_CP26 = 9, - FULL_PINYIN_HANYU = 10, - FULL_PINYIN_LUOMA = 11, - FULL_PINYIN_SECONDARY_BOPOMOFO = 12, - CHEWING_DEFAULT = CHEWING_STANDARD, - FULL_PINYIN_DEFAULT = FULL_PINYIN_HANYU -}; - -G_END_DECLS - -#endif |