diff --git a/.gitignore b/.gitignore index 3f3bed8ad1..7be47009b3 100644 --- a/.gitignore +++ b/.gitignore @@ -86,4 +86,4 @@ __pycache__/ /TODO.md unifont-15.0.03.ttf *.diff -goalc-report.html \ No newline at end of file +goalc-report.html diff --git a/.vscode/launch.json b/.vscode/launch.json index a5b8280bfc..0c44e384f5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,10 +8,10 @@ "name": "run python script", "type": "python", "request": "launch", - "program": "${workspaceFolder}/scripts/gsrc/compare-compilation-outputs.py", + "program": "${workspaceFolder}/scripts/ci/lint-characters.py", "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "args": [] + "args": ["--fix"] }, ] } diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index c71cd15432..90203686c9 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -83,7 +83,11 @@ add_library(common util/dialogs.cpp util/diff.cpp util/FileUtil.cpp - util/FontUtils.cpp + util/font/dbs/font_db_jak1.cpp + util/font/dbs/font_db_jak2.cpp + util/font/dbs/font_db_jak3.cpp + util/font/font_utils_korean.cpp + util/font/font_utils.cpp util/FrameLimiter.cpp util/json_util.cpp util/os.cpp diff --git a/common/goos/Reader.cpp b/common/goos/Reader.cpp index 4d2f56a5e4..7070b6946d 100644 --- a/common/goos/Reader.cpp +++ b/common/goos/Reader.cpp @@ -13,7 +13,7 @@ #include "common/log/log.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "fmt/format.h" #include "fmt/ranges.h" @@ -156,39 +156,6 @@ Reader::Reader() { for (const char* c = bonus; *c; c++) { m_valid_symbols_chars[(int)*c] = true; } - - // table of characters that are valid in source code: - for (auto& x : m_valid_source_text_chars) { - x = false; - } - for (int i = ' '; i <= '~'; i++) { - m_valid_source_text_chars[i] = true; - } - m_valid_source_text_chars[(int)'\n'] = true; - m_valid_source_text_chars[(int)'\t'] = true; - m_valid_source_text_chars[(int)'\r'] = true; - - // allow every character that gets transformed to something else - for (auto& [version, font] : g_font_banks) { - for (auto& remap : *font->encode_info()) { - for (auto rc : remap.chars) { - m_valid_source_text_chars[(u8)rc] = true; - } - } - for (auto& remap : *font->replace_info()) { - for (auto rc : remap.to) { - m_valid_source_text_chars[(u8)rc] = true; - } - for (auto rc : remap.from) { - m_valid_source_text_chars[(u8)rc] = true; - } - } - } - m_valid_source_text_chars[0] = false; -} - -bool Reader::is_valid_source_char(char c) const { - return m_valid_source_text_chars[(u8)c]; } /*! @@ -266,17 +233,6 @@ Object Reader::internal_read(std::shared_ptr text, fmt::format("Text file {} has invalid encoding", text->get_description())); } - // validate the input - for (int offset = check_encoding ? 3 : 0; offset < text->get_size(); offset++) { - if (!is_valid_source_char(text->get_text()[offset])) { - // failed. - int line_number = text->get_line_idx(offset) + 1; - throw std::runtime_error(fmt::format("Invalid character found on line {} of {}: 0x{:x}", - line_number, text->get_description(), - (u8)text->get_text()[offset])); - } - } - // first create stream TextStream ts(text); @@ -301,15 +257,6 @@ Object Reader::internal_read(std::shared_ptr text, } } -bool Reader::check_string_is_valid(const std::string& str) const { - for (auto c : str) { - if (!is_valid_source_char(c)) { - return false; - } - } - return true; -} - /*! * Given a stream starting at the first character of a token, get the token. Doesn't consume * whitespace at the end and leaves the stream on the first character after the token. @@ -905,4 +852,13 @@ std::string get_readable_string(const char* in) { } return result; } + +std::string get_byte_string(const char* in) { + std::string result; + while (*in) { + result += fmt::format("\\c{:02x}", uint8_t(*in)); + in++; + } + return result; +} } // namespace goos diff --git a/common/goos/Reader.h b/common/goos/Reader.h index c20071e1a3..9b6b1ea6fd 100644 --- a/common/goos/Reader.h +++ b/common/goos/Reader.h @@ -75,7 +75,6 @@ class Reader { const std::optional& string_name = {}); std::optional read_from_stdin(const std::string& prompt, REPL::Wrapper& repl); Object read_from_file(const std::vector& file_path, bool check_encoding = false); - bool check_string_is_valid(const std::string& str) const; SymbolTable symbolTable; TextDb db; @@ -101,12 +100,10 @@ class Reader { void add_reader_macro(const std::string& shortcut, std::string replacement); bool m_valid_symbols_chars[256]; - bool m_valid_source_text_chars[256]; - - bool is_valid_source_char(char c) const; std::unordered_map m_reader_macros; }; +std::string get_byte_string(const char* in); std::string get_readable_string(const char* in); } // namespace goos diff --git a/common/serialization/subtitles/subtitles_v2.h b/common/serialization/subtitles/subtitles_v2.h index 6023338f7e..f5c22e4bb5 100644 --- a/common/serialization/subtitles/subtitles_v2.h +++ b/common/serialization/subtitles/subtitles_v2.h @@ -2,7 +2,7 @@ #include "common/serialization/subtitles/subtitles.h" #include "common/util/Assert.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/json_util.h" struct SubtitleLineMetadata { diff --git a/common/serialization/text/text_ser.cpp b/common/serialization/text/text_ser.cpp index 6e579401b3..f11f2faa3c 100644 --- a/common/serialization/text/text_ser.cpp +++ b/common/serialization/text/text_ser.cpp @@ -2,6 +2,7 @@ #include "common/goos/ParseHelpers.h" #include "common/goos/Reader.h" +#include "common/util/font/font_utils_korean.h" int64_t get_int(const goos::Object& obj) { if (obj.is_int()) { @@ -44,7 +45,7 @@ std::string get_string(const goos::Object& x) { void parse_text_goal(const goos::Object& data, GameTextDB& db, const GameTextDefinitionFile& /*file_info*/) { - const GameTextFontBank* font = nullptr; + GameTextFontBank* font = nullptr; std::vector> banks; std::string possible_group_name; @@ -122,9 +123,15 @@ void parse_text_goal(const goos::Object& data, if (b_i >= int(banks.size())) { throw std::runtime_error(fmt::format("Too many strings in text id #x{:x}", id)); } - - auto line = font->convert_utf8_to_game(entry.as_string()->data); - banks[b_i++]->set_line(id, line); + if (font->is_language_id_korean(b_i)) { + // korean changes differently! + auto line = font->convert_utf8_to_game_korean(entry.as_string()->data); + banks[b_i]->set_line(id, line); + } else { + auto line = font->convert_utf8_to_game(entry.as_string()->data); + banks[b_i]->set_line(id, line); + } + b_i++; } else { throw std::runtime_error(fmt::format("Non-string value in text id #x{:x}", id)); } @@ -165,8 +172,15 @@ void parse_text_goal(const goos::Object& data, throw std::runtime_error(fmt::format("Too many strings in text id #x{:x}", id)); } - auto line = font->convert_utf8_to_game(entry.as_string()->data); - banks[i++]->set_line(id, line); + if (font->is_language_id_korean(i)) { + // handle korean differently! + auto line = font->convert_utf8_to_game_korean(entry.as_string()->data); + banks[i]->set_line(id, line); + } else { + auto line = font->convert_utf8_to_game(entry.as_string()->data); + banks[i]->set_line(id, line); + } + i++; } else { throw std::runtime_error(fmt::format("Non-string value in text id #x{:x}", id)); } @@ -230,15 +244,20 @@ void parse_text_json(const nlohmann::json& json, } else { bank = db.bank_by_id(file_info.group_name.value(), file_info.language_id); } - const GameTextFontBank* font = get_font_bank(file_info.text_version); + GameTextFontBank* font = get_font_bank(file_info.text_version); // Parse the file for (const auto& [text_id, text_value] : json.items()) { auto line_id = std::stoi(text_id, nullptr, 16); if (text_value.is_string()) { // single line replacement - auto line = font->convert_utf8_to_game(text_value); - // TODO - lint duplicate line definitions across text files - bank->set_line(line_id, line); + if (font->is_language_id_korean(file_info.language_id)) { + auto line = font->convert_utf8_to_game_korean(text_value); + bank->set_line(line_id, line); + } else { + auto line = font->convert_utf8_to_game(text_value); + bank->set_line(line_id, line); + } + } else if (text_value.is_array()) { // multi-line replacement starting from line_id // (e.g. for Jak 1 credits, start from x0b00) @@ -247,8 +266,14 @@ void parse_text_json(const nlohmann::json& json, throw std::runtime_error(fmt::format( "Non string provided for line {} / text id #x{} of _credits", idx, line_id)); } - auto line = font->convert_utf8_to_game(raw_line); - bank->set_line(line_id++, line); // increment line_id + + if (font->is_language_id_korean(file_info.language_id)) { + auto line = font->convert_utf8_to_game_korean(raw_line); + bank->set_line(line_id++, line); // increment line_id + } else { + auto line = font->convert_utf8_to_game(raw_line); + bank->set_line(line_id++, line); // increment line_id + } } } else { // Unexpected value type diff --git a/common/serialization/text/text_ser.h b/common/serialization/text/text_ser.h index 778aa3dac7..ec12de7ab6 100644 --- a/common/serialization/text/text_ser.h +++ b/common/serialization/text/text_ser.h @@ -11,7 +11,7 @@ #include "common/goos/Object.h" #include "common/log/log.h" #include "common/util/Assert.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/json_util.h" #include "common/versions/versions.h" diff --git a/common/util/FontUtils.cpp b/common/util/FontUtils.cpp deleted file mode 100644 index f936c2fc67..0000000000 --- a/common/util/FontUtils.cpp +++ /dev/null @@ -1,2047 +0,0 @@ -/*! - * @file FontUtils.cpp - * - * Code for handling text and strings in Jak 1's "large font" format. - * - * MAKE SURE THIS FILE IS ENCODED IN UTF-8!!! The various strings here depend on it. - * Always verify the encoding if string detection suddenly goes awry. - */ - -#include "FontUtils.h" - -#include -#include - -#include "string_util.h" - -#include "common/util/Assert.h" - -#include "fmt/format.h" - -const std::unordered_map sTextVerEnumMap = { - {"jak1-v1", GameTextVersion::JAK1_V1}, - {"jak1-v2", GameTextVersion::JAK1_V2}, - {"jak2", GameTextVersion::JAK2}, - {"jak3", GameTextVersion::JAK3}}; - -const std::string& get_text_version_name(GameTextVersion version) { - for (auto& [name, ver] : sTextVerEnumMap) { - if (ver == version) { - return name; - } - } - throw std::runtime_error(fmt::format("invalid text version {}", fmt::underlying(version))); -} - -GameTextVersion get_text_version_from_name(const std::string& name) { - return sTextVerEnumMap.at(name); -} - -GameTextFontBank::GameTextFontBank(GameTextVersion version, - std::vector* encode_info, - std::vector* replace_info, - std::unordered_set* passthrus) - : m_version(version), - m_encode_info(encode_info), - m_replace_info(replace_info), - m_passthrus(passthrus) { - std::sort( - m_encode_info->begin(), m_encode_info->end(), - [](const EncodeInfo& a, const EncodeInfo& b) { return a.bytes.size() > b.bytes.size(); }); - std::sort( - m_replace_info->begin(), m_replace_info->end(), - [](const ReplaceInfo& a, const ReplaceInfo& b) { return a.from.size() > b.from.size(); }); -} - -/*! - * Finds a remap info that best matches the byte sequence (is the longest match). - */ -const EncodeInfo* GameTextFontBank::find_encode_to_utf8(const char* in) const { - const EncodeInfo* best_info = nullptr; - for (auto& info : *m_encode_info) { - if (info.bytes.size() == 0) - continue; - - bool found = true; - for (int i = 0; found && i < (int)info.bytes.size(); ++i) { - if (uint8_t(in[i]) != info.bytes.at(i)) { - found = false; - } - } - - if (found && (!best_info || info.chars.length() > best_info->chars.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Finds a remap info that best matches the character sequence (is the longest match). - */ -const EncodeInfo* GameTextFontBank::find_encode_to_game(const std::string& in, int off) const { - const EncodeInfo* best_info = nullptr; - for (auto& info : *m_encode_info) { - if (info.chars.length() == 0) - continue; - - bool found = true; - for (int i = 0; found && i < (int)info.chars.length() && i + off < (int)in.size(); ++i) { - if (in.at(i + off) != info.chars.at(i)) { - found = false; - } - } - - if (found && (!best_info || info.chars.length() > best_info->chars.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Finds a remap info that best matches the character sequence (is the longest match). - */ -const ReplaceInfo* GameTextFontBank::find_replace_to_utf8(const std::string& in, int off) const { - const ReplaceInfo* best_info = nullptr; - for (auto& info : *m_replace_info) { - if (info.from.empty() || in.size() - off < info.from.size()) - continue; - - bool found = memcmp(in.data() + off, info.from.data(), info.from.size()) == 0; - if (found && (!best_info || info.from.length() > best_info->from.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Finds a remap info that best matches the character sequence (is the longest match). - */ -const ReplaceInfo* GameTextFontBank::find_replace_to_game(const std::string& in, int off) const { - const ReplaceInfo* best_info = nullptr; - for (auto& info : *m_replace_info) { - if (info.to.empty() || in.size() - off < info.to.size()) - continue; - - bool found = memcmp(in.data() + off, info.to.data(), info.to.size()) == 0; - if (found && (!best_info || info.to.length() > best_info->to.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Try to replace specific substrings with better variants. - * These are for hiding confusing text transforms. - */ -std::string GameTextFontBank::replace_to_utf8(std::string& str) const { - std::string newstr; - - for (int i = 0; i < (int)str.length();) { - auto remap = find_replace_to_utf8(str, i); - if (!remap) { - newstr.push_back(str.at(i)); - i += 1; - } else { - for (auto b : remap->to) { - newstr.push_back(b); - } - i += remap->from.length(); - } - } - - str = newstr; - return str; -} - -std::string GameTextFontBank::replace_to_game(std::string& str) const { - std::string newstr; - - for (int i = 0; i < (int)str.length();) { - auto remap = find_replace_to_game(str, i); - if (!remap) { - newstr.push_back(str.at(i)); - i += 1; - } else { - for (auto b : remap->from) { - newstr.push_back(b); - } - i += remap->to.length(); - } - } - - str = newstr; - return str; -} - -std::string GameTextFontBank::encode_utf8_to_game(std::string& str) const { - std::string newstr; - - for (int i = 0; i < (int)str.length();) { - auto remap = find_encode_to_game(str, i); - if (!remap) { - newstr.push_back(str.at(i)); - i += 1; - } else { - for (auto b : remap->bytes) { - newstr.push_back(b); - } - i += remap->chars.length(); - } - } - - str = newstr; - return str; -} - -/*! - * Turn a normal readable string into a string readable in the in-game font encoding and converts - * \cXX escape sequences - */ -// NOTE - the convert_utf8_to_game function is really really slow (about 80-90% of the -// time loading the text files) -// TODO - improve that as a follow up sometime in the future -std::string GameTextFontBank::convert_utf8_to_game(std::string str, bool escape) const { - std::string newstr; - - if (escape) { - for (size_t i = 0; i < str.size(); ++i) { - auto c = str.at(i); - if (c == '"') { - newstr.push_back('"'); - i += 1; - } else if (c == '\\') { - if (i + 1 >= str.size()) { - throw std::runtime_error("incomplete string escape code"); - } - auto p = str.at(i + 1); - if (p == 'c') { - if (i + 3 >= str.size()) { - throw std::runtime_error("incomplete string escape code"); - } - auto first = str.at(i + 2); - auto second = str.at(i + 3); - if (!str_util::hex_char(first) || !str_util::hex_char(second)) { - throw std::runtime_error("invalid character escape hex number"); - } - char hex_num[3] = {first, second, '\0'}; - std::size_t end = 0; - auto value = std::stoul(hex_num, &end, 16); - if (end != 2) { - throw std::runtime_error("invalid character escape"); - } - ASSERT(value < 256); - newstr.push_back(char(value)); - i += 3; - } else if (p == '"' || p == '\\') { - newstr.push_back(p); - i += 1; - } else { - throw std::runtime_error( - fmt::format("unknown string escape code '{}' (0x{:x})", p, u32(p))); - } - } else { - newstr.push_back(c); - } - } - } else { - newstr = str; - } - - replace_to_game(newstr); - encode_utf8_to_game(newstr); - return newstr; -} - -bool GameTextFontBank::valid_char_range(const char in) const { - if (m_version == GameTextVersion::JAK1_V1 || m_version == GameTextVersion::JAK1_V2) { - return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || - m_passthrus->find(in) != m_passthrus->end()) && - in != '\\'; - } else if (m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3 || - m_version == GameTextVersion::JAKX) { - return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || (in >= 'a' && in <= 'z') || - m_passthrus->find(in) != m_passthrus->end()) && - in != '\\'; - } - return false; -} - -/*! - * Convert a string from the game-text font encoding to something normal. - * Unprintable characters become escape sequences, including tab and newline. - */ -std::string GameTextFontBank::convert_game_to_utf8(const char* in) const { - std::string temp; - std::string result; - while (*in) { - auto remap = find_encode_to_utf8(in); - if (remap != nullptr) { - temp.append(remap->chars); - in += remap->bytes.size() - 1; - } else if (valid_char_range(*in) || *in == '\n' || *in == '\t' || *in == '\\' || *in == '\"') { - temp.push_back(*in); - } else { - temp += fmt::format("\\c{:02x}", uint8_t(*in)); - } - in++; - } - replace_to_utf8(temp); - for (size_t i = 0; i < temp.length(); ++i) { - auto c = temp.at(i); - if (c == '\n') { - result += "\\n"; - } else if (c == '\t') { - result += "\\t"; - } else if (c == '\\') { - if (i < temp.length() - 1 && temp.at(i + 1) == 'c') { - result.push_back(c); - } else { - result += "\\\\"; - } - } else if (c == '"') { - result += "\\\""; - } else { - result.push_back(c); - } - } - return replace_to_utf8(result); -} - -static std::vector s_encode_info_null = {}; -static std::vector s_replace_info_null = {}; - -/*! - * =========================== - * GAME TEXT FONT BANK - JAK 1 - * =========================== - * This font is used in: - * - Jak & Daxter: The Precursor Legacy (Black Label) - */ - -static std::unordered_set s_passthrus_jak1 = {'~', ' ', ',', '.', '-', '+', '(', ')', - '!', ':', '?', '=', '%', '*', '/', '#', - ';', '<', '>', '@', '[', '_'}; - -static std::vector s_encode_info_jak1 = { - // random - {"ˇ", {0x10}}, // caron - {"`", {0x11}}, // grave accent - {"'", {0x12}}, // apostrophe - {"^", {0x13}}, // circumflex - {"", {0x14}}, // tilde - {"¨", {0x15}}, // umlaut - {"º", {0x16}}, // numero/overring - {"¡", {0x17}}, // inverted exclamation mark - {"¿", {0x18}}, // inverted question mark - - {"海", {0x1a}}, // umi - {"Æ", {0x1b}}, // aesc - {"界", {0x1c}}, // kai - {"Ç", {0x1d}}, // c-cedilla - {"学", {0x1e}}, // gaku - {"ß", {0x1f}}, // eszett - - {"ワ", {0x24}}, // wa - - {"ヲ", {0x26}}, // wo - {"ン", {0x27}}, // -n - - {"岩", {0x5c}}, // iwa - {"旧", {0x5d}}, // kyuu - {"空", {0x5e}}, // sora - //{"掘", {0x5f}}, // horu - - {"ヮ", {0x60}}, // -wa - {"撃", {0x61}}, // utsu - {"賢", {0x62}}, // kashikoi - {"湖", {0x63}}, // mizuumi - {"口", {0x64}}, // kuchi - {"行", {0x65}}, // iku - {"合", {0x66}}, // ai - {"士", {0x67}}, // shi - {"寺", {0x68}}, // tera - {"山", {0x69}}, // yama - {"者", {0x6a}}, // mono - {"所", {0x6b}}, // tokoro - {"書", {0x6c}}, // kaku - {"小", {0x6d}}, // shou - {"沼", {0x6e}}, // numa - {"上", {0x6f}}, // ue - {"城", {0x70}}, // shiro - {"場", {0x71}}, // ba - {"出", {0x72}}, // shutsu - {"闇", {0x73}}, // yami - {"遺", {0x74}}, // nokosu - {"黄", {0x75}}, // ki - {"屋", {0x76}}, // ya - {"下", {0x77}}, // shita - {"家", {0x78}}, // ie - {"火", {0x79}}, // hi - {"花", {0x7a}}, // hana - {"レ", {0x7b}}, // re - {"Œ", {0x7c}}, // oe - {"ロ", {0x7d}}, // ro - - {"青", {0x7f}}, // ao - - {"・", {0x90}}, // nakaguro - {"゛", {0x91}}, // dakuten - {"゜", {0x92}}, // handakuten - {"ー", {0x93}}, // chouompu - {"『", {0x94}}, // nijuukagikakko left - {"』", {0x95}}, // nijuukagikakko right - // hiragana - {"ぁ", {0x96}}, // -a - {"あ", {0x97}}, // a - {"ぃ", {0x98}}, // -i - {"い", {0x99}}, // i - {"ぅ", {0x9a}}, // -u - {"う", {0x9b}}, // u - {"ぇ", {0x9c}}, // -e - {"え", {0x9d}}, // e - {"ぉ", {0x9e}}, // -o - {"お", {0x9f}}, // o - {"か", {0xa0}}, // ka - {"き", {0xa1}}, // ki - {"く", {0xa2}}, // ku - {"け", {0xa3}}, // ke - {"こ", {0xa4}}, // ko - {"さ", {0xa5}}, // sa - {"し", {0xa6}}, // shi - {"す", {0xa7}}, // su - {"せ", {0xa8}}, // se - {"そ", {0xa9}}, // so - {"た", {0xaa}}, // ta - {"ち", {0xab}}, // chi - {"っ", {0xac}}, // sokuon - {"つ", {0xad}}, // tsu - {"て", {0xae}}, // te - {"と", {0xaf}}, // to - {"な", {0xb0}}, // na - {"に", {0xb1}}, // ni - {"ぬ", {0xb2}}, // nu - {"ね", {0xb3}}, // ne - {"の", {0xb4}}, // no - {"は", {0xb5}}, // ha - {"ひ", {0xb6}}, // hi - {"ふ", {0xb7}}, // hu - {"へ", {0xb8}}, // he - {"ほ", {0xb9}}, // ho - {"ま", {0xba}}, // ma - {"み", {0xbb}}, // mi - {"む", {0xbc}}, // mu - {"め", {0xbd}}, // me - {"も", {0xbe}}, // mo - {"ゃ", {0xbf}}, // youon ya - {"や", {0xc0}}, // ya - {"ゅ", {0xc1}}, // youon yu - {"ゆ", {0xc2}}, // yu - {"ょ", {0xc3}}, // youon yo - {"よ", {0xc4}}, // yo - {"ら", {0xc5}}, // ra - {"り", {0xc6}}, // ri - {"る", {0xc7}}, // ru - {"れ", {0xc8}}, // re - {"ろ", {0xc9}}, // ro - {"ゎ", {0xca}}, // -wa - {"わ", {0xcb}}, // wa - {"を", {0xcc}}, // wo - {"ん", {0xcd}}, // -n - // katakana - {"ァ", {0xce}}, // -a - {"ア", {0xcf}}, // a - {"ィ", {0xd0}}, // -i - {"イ", {0xd1}}, // i - {"ゥ", {0xd2}}, // -u - {"ウ", {0xd3}}, // u - {"ェ", {0xd4}}, // -e - {"エ", {0xd5}}, // e - {"ォ", {0xd6}}, // -o - {"オ", {0xd7}}, // o - {"カ", {0xd8}}, // ka - {"キ", {0xd9}}, // ki - {"ク", {0xda}}, // ku - {"ケ", {0xdb}}, // ke - {"コ", {0xdc}}, // ko - {"サ", {0xdd}}, // sa - {"シ", {0xde}}, // shi - {"ス", {0xdf}}, // su - {"セ", {0xe0}}, // se - {"ソ", {0xe1}}, // so - {"タ", {0xe2}}, // ta - {"チ", {0xe3}}, // chi - {"ッ", {0xe4}}, // sokuon - {"ツ", {0xe5}}, // tsu - {"テ", {0xe6}}, // te - {"ト", {0xe7}}, // to - {"ナ", {0xe8}}, // na - {"ニ", {0xe9}}, // ni - {"ヌ", {0xea}}, // nu - {"ネ", {0xeb}}, // ne - {"ノ", {0xec}}, // no - {"ハ", {0xed}}, // ha - {"ヒ", {0xee}}, // hi - {"フ", {0xef}}, // hu - {"ヘ", {0xf0}}, // he - {"ホ", {0xf1}}, // ho - {"マ", {0xf2}}, // ma - {"ミ", {0xf3}}, // mi - {"ム", {0xf4}}, // mu - {"メ", {0xf5}}, // me - {"モ", {0xf6}}, // mo - {"ャ", {0xf7}}, // youon ya - {"ヤ", {0xf8}}, // ya - {"ュ", {0xf9}}, // youon yu - {"ユ", {0xfa}}, // yu - {"ョ", {0xfb}}, // youon yo - {"ヨ", {0xfc}}, // yo - {"ラ", {0xfd}}, // ra - {"リ", {0xfe}}, // ri - {"ル", {0xff}}, // ru - // kanji 2 - {"宝", {1, 0x01}}, // takara - - {"石", {1, 0x10}}, // ishi - {"赤", {1, 0x11}}, // aka - {"跡", {1, 0x12}}, // ato - {"川", {1, 0x13}}, // kawa - {"戦", {1, 0x14}}, // ikusa - {"村", {1, 0x15}}, // mura - {"隊", {1, 0x16}}, // tai - {"台", {1, 0x17}}, // utena - {"長", {1, 0x18}}, // osa - {"鳥", {1, 0x19}}, // tori - {"艇", {1, 0x1a}}, // tei - {"洞", {1, 0x1b}}, // hora - {"道", {1, 0x1c}}, // michi - {"発", {1, 0x1d}}, // hatsu - {"飛", {1, 0x1e}}, // tobu - {"噴", {1, 0x1f}}, // fuku - - {"池", {1, 0xa0}}, // ike - {"中", {1, 0xa1}}, // naka - {"塔", {1, 0xa2}}, // tou - {"島", {1, 0xa3}}, // shima - {"部", {1, 0xa4}}, // bu - {"砲", {1, 0xa5}}, // hou - {"産", {1, 0xa6}}, // san - {"眷", {1, 0xa7}}, // kaerimiru - {"力", {1, 0xa8}}, // chikara - {"緑", {1, 0xa9}}, // midori - {"岸", {1, 0xaa}}, // kishi - {"像", {1, 0xab}}, // zou - {"谷", {1, 0xac}}, // tani - {"心", {1, 0xad}}, // kokoro - {"森", {1, 0xae}}, // mori - {"水", {1, 0xaf}}, // mizu - {"船", {1, 0xb0}}, // fune - {"™", {1, 0xb1}}, // trademark -}; - -static std::vector s_replace_info_jak1 = { - // other - {"A~Y~-21H~-5Vº~Z", "Å"}, - {"N~Y~-6Hº~Z~+10H", "Nº"}, - {"O~Y~-16H~-1V/~Z", "Ø"}, - {"A~Y~-6H~+3V,~Z", "Ą"}, - {"E~Y~-6H~+2V,~Z", "Ę"}, - {"L~Y~-16H~+0V/~Z", "Ł"}, - {"Z~Y~-21H~-5Vº~Z", "Ż"}, - {"E~Y~-20H~-5Vº~Z", "Ė"}, - {"C~Y~-20H~-4Vˇ~Z", "Č"}, - {"S~Y~-22H~-4Vˇ~Z", "Š"}, - {"Z~Y~-22H~-4Vˇ~Z", "Ž"}, - {"U~Y~-13H~+2V,~Z", "Ų"}, - {"U~Y~-18H~-10V-~Z", "Ū"}, - {"D~Y~-25H~-1V-~Z", "Đ"}, - {"I~Y~-8H~+1V,~Z", "Į"}, - // czech specific - {"U~Y~-23H~-5Vº~Z", "Ů"}, - - // tildes - {"N~Y~-22H~-4V~Z", "Ñ"}, - {"A~Y~-21H~-5V~Z", "Ã"}, // custom - {"O~Y~-22H~-4V~Z", "Õ"}, // custom - - // acute accents - {"A~Y~-21H~-5V'~Z", "Á"}, - {"E~Y~-22H~-5V'~Z", "É"}, - {"I~Y~-19H~-5V'~Z", "Í"}, - {"O~Y~-22H~-4V'~Z", "Ó"}, - {"U~Y~-24H~-3V'~Z", "Ú"}, - {"C~Y~-21H~-5V'~Z", "Ć"}, - {"N~Y~-21H~-5V'~Z", "Ń"}, - {"S~Y~-21H~-5V'~Z", "Ś"}, - {"Z~Y~-21H~-5V'~Z", "Ź"}, - // czech specific - {"Y~Y~-25H~-4V'~Z", "Ý"}, - - // double acute accents - {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, // custom - {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, // custom - - // circumflex - {"A~Y~-20H~-4V^~Z", "Â"}, // custom - {"E~Y~-20H~-5V^~Z", "Ê"}, - {"I~Y~-19H~-5V^~Z", "Î"}, - {"O~Y~-20H~-4V^~Z", "Ô"}, // custom - {"U~Y~-24H~-3V^~Z", "Û"}, - - // grave accents - {"A~Y~-21H~-5V`~Z", "À"}, - {"E~Y~-22H~-5V`~Z", "È"}, - {"I~Y~-19H~-5V`~Z", "Ì"}, - {"O~Y~-22H~-4V`~Z", "Ò"}, // custom - {"U~Y~-24H~-3V`~Z", "Ù"}, - - // umlaut - {"A~Y~-21H~-5V¨~Z", "Ä"}, - {"E~Y~-20H~-5V¨~Z", "Ë"}, - {"I~Y~-19H~-5V¨~Z", "Ï"}, // custom - {"O~Y~-22H~-4V¨~Z", "Ö"}, - {"O~Y~-22H~-3V¨~Z", "ö"}, // dumb - {"U~Y~-22H~-3V¨~Z", "Ü"}, - - // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ - {"A~Y~-20H~-4Vˇ~Z", "Ǎ"}, - {"E~Y~-20H~-5Vˇ~Z", "Ě"}, - {"G~Y~-20H~-5Vˇ~Z", "Ǧ"}, - {"I~Y~-19H~-5Vˇ~Z", "Ǐ"}, - {"O~Y~-20H~-4Vˇ~Z", "Ǒ"}, - {"U~Y~-24H~-3Vˇ~Z", "Ǔ"}, - {"Y~Y~-24H~-3Vˇ~Z", "Y̌"}, - // czech specific - Č Ň Ř Š Ž Ť - {"C~Y~-25H~-9Vˇ~Z", "Č"}, - {"N~Y~-23H~-5Vˇ~Z", "Ň"}, - {"R~Y~-24H~-5Vˇ~Z", "Ř"}, - {"S~Y~-24H~-5Vˇ~Z", "Š"}, - {"T~Y~-23H~-5Vˇ~Z", "Ť"}, - {"Z~Y~-23H~-5Vˇ~Z", "Ž"}, - - // dakuten katakana - {"~Yウ~Z゛", "ヴ"}, - {"~Yカ~Z゛", "ガ"}, - {"~Yキ~Z゛", "ギ"}, - {"~Yク~Z゛", "グ"}, - {"~Yケ~Z゛", "ゲ"}, - {"~Yコ~Z゛", "ゴ"}, - {"~Yサ~Z゛", "ザ"}, - {"~Yシ~Z゛", "ジ"}, - {"~Yス~Z゛", "ズ"}, - {"~Yセ~Z゛", "ゼ"}, - {"~Yソ~Z゛", "ゾ"}, - {"~Yタ~Z゛", "ダ"}, - {"~Yチ~Z゛", "ヂ"}, - {"~Yツ~Z゛", "ヅ"}, - {"~Yテ~Z゛", "デ"}, - {"~Yト~Z゛", "ド"}, - {"~Yハ~Z゛", "バ"}, - {"~Yヒ~Z゛", "ビ"}, - {"~Yフ~Z゛", "ブ"}, - {"~Yヘ~Z゛", "ベ"}, - {"~Yホ~Z゛", "ボ"}, - // handakuten katakana - {"~Yハ~Z゜", "パ"}, - {"~Yヒ~Z゜", "ピ"}, - {"~Yフ~Z゜", "プ"}, - {"~Yヘ~Z゜", "ペ"}, - {"~Yホ~Z゜", "ポ"}, - // dakuten hiragana - {"~Yか~Z゛", "が"}, - {"~Yき~Z゛", "ぎ"}, - {"~Yく~Z゛", "ぐ"}, - {"~Yけ~Z゛", "げ"}, - {"~Yこ~Z゛", "ご"}, - {"~Yさ~Z゛", "ざ"}, - {"~Yし~Z゛", "じ"}, - {"~Yす~Z゛", "ず"}, - {"~Yせ~Z゛", "ぜ"}, - {"~Yそ~Z゛", "ぞ"}, - {"~Yた~Z゛", "だ"}, - {"~Yち~Z゛", "ぢ"}, - {"~Yつ~Z゛", "づ"}, - {"~Yて~Z゛", "で"}, - {"~Yと~Z゛", "ど"}, - {"~Yは~Z゛", "ば"}, - {"~Yひ~Z゛", "び"}, - {"~Yふ~Z゛", "ぶ"}, - {"~Yへ~Z゛", "べ"}, - {"~Yほ~Z゛", "ぼ"}, - // handakuten hiragana - {"~Yは~Z゜", "ぱ"}, - {"~Yひ~Z゜", "ぴ"}, - {"~Yふ~Z゜", "ぷ"}, - {"~Yへ~Z゜", "ぺ"}, - {"~Yほ~Z゜", "ぽ"}, - // japanese punctuation - {",~+8H", "、"}, - {"~+8H ", " "}, - - // (hack) special case kanji - {"~~", "世"}, - - // playstation buttons - {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, // custom -}; - -GameTextFontBank g_font_bank_jak1_v1(GameTextVersion::JAK1_V1, - &s_encode_info_jak1, - &s_replace_info_jak1, - &s_passthrus_jak1); - -/*! - * ================================ - * GAME TEXT FONT BANK - JAK 1 (v2) - * ================================ - * This font is used in: - * - Jak & Daxter: The Precursor Legacy (PAL) - * - ジャックXダクスター ~ 旧世界の遺産 - * - Jak & Daxter: The Precursor Legacy (NTSC-U v2) - * - * It is the same as v1, but _ has been fixed and no longer overlaps 掘 - */ - -static std::vector s_encode_info_jak1_v2 = { - // random - {"_", {0x03}}, // large space - {"ˇ", {0x10}}, // caron - {"`", {0x11}}, // grave accent - {"'", {0x12}}, // apostrophe - {"^", {0x13}}, // circumflex - {"", {0x14}}, // tilde - {"¨", {0x15}}, // umlaut - {"º", {0x16}}, // numero/overring - {"¡", {0x17}}, // inverted exclamation mark - {"¿", {0x18}}, // inverted question mark - - {"海", {0x1a}}, // umi - {"Æ", {0x1b}}, // aesc - {"界", {0x1c}}, // kai - {"Ç", {0x1d}}, // c-cedilla - {"学", {0x1e}}, // gaku - {"ß", {0x1f}}, // eszett - - {"ワ", {0x24}}, // wa - - {"ヲ", {0x26}}, // wo - {"ン", {0x27}}, // -n - - {"岩", {0x5c}}, // iwa - {"旧", {0x5d}}, // kyuu - {"空", {0x5e}}, // sora - {"掘", {0x5f}}, // horu - - {"ヮ", {0x60}}, // -wa - {"撃", {0x61}}, // utsu - {"賢", {0x62}}, // kashikoi - {"湖", {0x63}}, // mizuumi - {"口", {0x64}}, // kuchi - {"行", {0x65}}, // iku - {"合", {0x66}}, // ai - {"士", {0x67}}, // shi - {"寺", {0x68}}, // tera - {"山", {0x69}}, // yama - {"者", {0x6a}}, // mono - {"所", {0x6b}}, // tokoro - {"書", {0x6c}}, // kaku - {"小", {0x6d}}, // shou - {"沼", {0x6e}}, // numa - {"上", {0x6f}}, // ue - {"城", {0x70}}, // shiro - {"場", {0x71}}, // ba - {"出", {0x72}}, // shutsu - {"闇", {0x73}}, // yami - {"遺", {0x74}}, // nokosu - {"黄", {0x75}}, // ki - {"屋", {0x76}}, // ya - {"下", {0x77}}, // shita - {"家", {0x78}}, // ie - {"火", {0x79}}, // hi - {"花", {0x7a}}, // hana - {"レ", {0x7b}}, // re - {"Œ", {0x7c}}, // oe - {"ロ", {0x7d}}, // ro - - {"青", {0x7f}}, // ao - - {"・", {0x90}}, // nakaguro - {"゛", {0x91}}, // dakuten - {"゜", {0x92}}, // handakuten - {"ー", {0x93}}, // chouompu - {"『", {0x94}}, // nijuukagikakko left - {"』", {0x95}}, // nijuukagikakko right - // hiragana - {"ぁ", {0x96}}, // -a - {"あ", {0x97}}, // a - {"ぃ", {0x98}}, // -i - {"い", {0x99}}, // i - {"ぅ", {0x9a}}, // -u - {"う", {0x9b}}, // u - {"ぇ", {0x9c}}, // -e - {"え", {0x9d}}, // e - {"ぉ", {0x9e}}, // -o - {"お", {0x9f}}, // o - {"か", {0xa0}}, // ka - {"き", {0xa1}}, // ki - {"く", {0xa2}}, // ku - {"け", {0xa3}}, // ke - {"こ", {0xa4}}, // ko - {"さ", {0xa5}}, // sa - {"し", {0xa6}}, // shi - {"す", {0xa7}}, // su - {"せ", {0xa8}}, // se - {"そ", {0xa9}}, // so - {"た", {0xaa}}, // ta - {"ち", {0xab}}, // chi - {"っ", {0xac}}, // sokuon - {"つ", {0xad}}, // tsu - {"て", {0xae}}, // te - {"と", {0xaf}}, // to - {"な", {0xb0}}, // na - {"に", {0xb1}}, // ni - {"ぬ", {0xb2}}, // nu - {"ね", {0xb3}}, // ne - {"の", {0xb4}}, // no - {"は", {0xb5}}, // ha - {"ひ", {0xb6}}, // hi - {"ふ", {0xb7}}, // hu - {"へ", {0xb8}}, // he - {"ほ", {0xb9}}, // ho - {"ま", {0xba}}, // ma - {"み", {0xbb}}, // mi - {"む", {0xbc}}, // mu - {"め", {0xbd}}, // me - {"も", {0xbe}}, // mo - {"ゃ", {0xbf}}, // youon ya - {"や", {0xc0}}, // ya - {"ゅ", {0xc1}}, // youon yu - {"ゆ", {0xc2}}, // yu - {"ょ", {0xc3}}, // youon yo - {"よ", {0xc4}}, // yo - {"ら", {0xc5}}, // ra - {"り", {0xc6}}, // ri - {"る", {0xc7}}, // ru - {"れ", {0xc8}}, // re - {"ろ", {0xc9}}, // ro - {"ゎ", {0xca}}, // -wa - {"わ", {0xcb}}, // wa - {"を", {0xcc}}, // wo - {"ん", {0xcd}}, // -n - // katakana - {"ァ", {0xce}}, // -a - {"ア", {0xcf}}, // a - {"ィ", {0xd0}}, // -i - {"イ", {0xd1}}, // i - {"ゥ", {0xd2}}, // -u - {"ウ", {0xd3}}, // u - {"ェ", {0xd4}}, // -e - {"エ", {0xd5}}, // e - {"ォ", {0xd6}}, // -o - {"オ", {0xd7}}, // o - {"カ", {0xd8}}, // ka - {"キ", {0xd9}}, // ki - {"ク", {0xda}}, // ku - {"ケ", {0xdb}}, // ke - {"コ", {0xdc}}, // ko - {"サ", {0xdd}}, // sa - {"シ", {0xde}}, // shi - {"ス", {0xdf}}, // su - {"セ", {0xe0}}, // se - {"ソ", {0xe1}}, // so - {"タ", {0xe2}}, // ta - {"チ", {0xe3}}, // chi - {"ッ", {0xe4}}, // sokuon - {"ツ", {0xe5}}, // tsu - {"テ", {0xe6}}, // te - {"ト", {0xe7}}, // to - {"ナ", {0xe8}}, // na - {"ニ", {0xe9}}, // ni - {"ヌ", {0xea}}, // nu - {"ネ", {0xeb}}, // ne - {"ノ", {0xec}}, // no - {"ハ", {0xed}}, // ha - {"ヒ", {0xee}}, // hi - {"フ", {0xef}}, // hu - {"ヘ", {0xf0}}, // he - {"ホ", {0xf1}}, // ho - {"マ", {0xf2}}, // ma - {"ミ", {0xf3}}, // mi - {"ム", {0xf4}}, // mu - {"メ", {0xf5}}, // me - {"モ", {0xf6}}, // mo - {"ャ", {0xf7}}, // youon ya - {"ヤ", {0xf8}}, // ya - {"ュ", {0xf9}}, // youon yu - {"ユ", {0xfa}}, // yu - {"ョ", {0xfb}}, // youon yo - {"ヨ", {0xfc}}, // yo - {"ラ", {0xfd}}, // ra - {"リ", {0xfe}}, // ri - {"ル", {0xff}}, // ru - // kanji 2 - {"宝", {1, 0x01}}, // takara - - {"石", {1, 0x10}}, // ishi - {"赤", {1, 0x11}}, // aka - {"跡", {1, 0x12}}, // ato - {"川", {1, 0x13}}, // kawa - {"戦", {1, 0x14}}, // ikusa - {"村", {1, 0x15}}, // mura - {"隊", {1, 0x16}}, // tai - {"台", {1, 0x17}}, // utena - {"長", {1, 0x18}}, // osa - {"鳥", {1, 0x19}}, // tori - {"艇", {1, 0x1a}}, // tei - {"洞", {1, 0x1b}}, // hora - {"道", {1, 0x1c}}, // michi - {"発", {1, 0x1d}}, // hatsu - {"飛", {1, 0x1e}}, // tobu - {"噴", {1, 0x1f}}, // fuku - - {"池", {1, 0xa0}}, // ike - {"中", {1, 0xa1}}, // naka - {"塔", {1, 0xa2}}, // tou - {"島", {1, 0xa3}}, // shima - {"部", {1, 0xa4}}, // bu - {"砲", {1, 0xa5}}, // hou - {"産", {1, 0xa6}}, // san - {"眷", {1, 0xa7}}, // kaerimiru - {"力", {1, 0xa8}}, // chikara - {"緑", {1, 0xa9}}, // midori - {"岸", {1, 0xaa}}, // kishi - {"像", {1, 0xab}}, // zou - {"谷", {1, 0xac}}, // tani - {"心", {1, 0xad}}, // kokoro - {"森", {1, 0xae}}, // mori - {"水", {1, 0xaf}}, // mizu - {"船", {1, 0xb0}}, // fune - {"™", {1, 0xb1}}, // trademark -}; - -GameTextFontBank g_font_bank_jak1_v2(GameTextVersion::JAK1_V2, - &s_encode_info_jak1_v2, - &s_replace_info_jak1, - &s_passthrus_jak1); - -/*! - * ================================ - * GAME TEXT FONT BANK - JAK 2 - * ================================ - * This font is used in: - * - Jak II - * - Jak II: Renegade - * - ジャックXダクスター2 - */ - -static std::unordered_set s_passthrus_jak2 = {'~', ' ', ',', '.', '-', '+', '(', ')', - '!', ':', '?', '=', '%', '*', '/', '#', - ';', '<', '>', '@', '[', '_', ']'}; - -static std::vector s_replace_info_jak2 = { - // other - {"A~Y~-21H~-5Vº~Z", "Å"}, - {"N~Y~-6Hº~Z~+10H", "Nº"}, - {"~+4Vç~-4V", ",c"}, - - // added for translations TODO - check these for jak 2 - {"O~Y~-25H~-1V/~Z", "Ø"}, - {"o~Y~-23H~+4V/~Z", "ø"}, - {"A~Y~-13H~+8V,~Z", "Ą"}, - {"a~Y~-8H~+6V,~Z", "ą"}, - {"E~Y~-6H~+8V,~Z", "Ę"}, - {"e~Y~-10H~+7V,~Z", "ę"}, - {"L~Y~-21H~+0V/~Z", "Ł"}, - {"l~Y~-16H~+0V/~Z", "ł"}, // TODO - this one is ugly, font character addition (small slash) - {"Z~Y~-25H~-11Vº~Z", "Ż"}, - {"z~Y~-23H~-5Vº~Z", "ż"}, - {"a~Y~-25H~-5Vº~Z", "å"}, - {"S~Y~-21H~-5V'~Z", "Ś"}, - {"s~Y~-25H~-5V'~Z", "ś"}, - {"n~Y~-25H~-5V'~Z", "ń"}, - {"c~Y~-25H~-5V'~Z", "ć"}, - {"o~Y~-24H~-4V~Z", "õ"}, - {"a~Y~-24H~-4V~Z", "ã"}, - {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, - {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, - {"o~Y~-28H~-4V'~-9H'~Z", "ő"}, - {"u~Y~-28H~-4V'~-9H'~Z", "ű"}, - {"E~Y~-22H~-11Vº~Z", "Ė"}, - {"e~Y~-25H~-5Vº~Z", "ė"}, - {"C~Y~-27H~-10Vˇ~Z", "Č"}, - {"c~Y~-25H~-5Vˇ~Z", "č"}, - {"S~Y~-24H~-10Vˇ~Z", "Š"}, - {"s~Y~-22H~-4Vˇ~Z", "š"}, - {"Z~Y~-25H~-10Vˇ~Z", "Ž"}, - {"z~Y~-23H~-4Vˇ~Z", "ž"}, - {"U~Y~-15H~+5V,~Z", "Ų"}, - {"u~Y~-15H~+5V,~Z", "ų"}, - {"U~Y~-20H~-18V-~Z", "Ū"}, - {"u~Y~-18H~-15V-~Z", "ū"}, - {"D~Y~-28H~-1V-~Z", "Đ"}, - {"d~Y~-13H~-10V-~Z", "đ"}, - {"I~Y~-8H~+4V,~Z", "Į"}, - {"i~Y~-8H~+4V,~Z", "į"}, - // czech specific - {"U~Y~-24H~-7Vº~Z", "Ů"}, - {"u~Y~-23H~-5Vº~Z", "ů"}, - {"t~Y~-7H~-21V,~Z", "ť"}, - - // tildes - {"N~Y~-22H~-4V~Z", "Ñ"}, - {"n~Y~-24H~-4V~Z", "ñ"}, - {"A~Y~-21H~-5V~Z", "Ã"}, - {"O~Y~-22H~-4V~Z", "Õ"}, - - // acute accents - {"A~Y~-21H~-5V'~Z", "Á"}, - {"A~Y~-26H~-8V'~Z", "<Á_V2>"}, // unfortunate... - {"a~Y~-25H~-5V'~Z", "á"}, - {"E~Y~-23H~-9V'~Z", "É"}, - {"e~Y~-26H~-5V'~Z", "é"}, - {"I~Y~-19H~-5V'~Z", "Í"}, - {"i~Y~-19H~-8V'~Z", "í"}, - {"O~Y~-22H~-4V'~Z", "Ó"}, - {"o~Y~-26H~-4V'~Z", "ó"}, - {"U~Y~-24H~-3V'~Z", "Ú"}, - {"u~Y~-24H~-3V'~Z", "ú"}, - {"Z~Y~-24H~-3V'~Z", "Ź"}, - {"z~Y~-24H~-3V'~Z", "ź"}, - // czech specific - {"Y~Y~-26H~-5V'~Z", "Ý"}, - {"~+7Vy~-7V~Y~-24H~-3V'~Z", "ý"}, - - // circumflex - {"A~Y~-20H~-4V^~Z", "Â"}, - {"a~Y~-24H~-5V^~Z", "â"}, - {"E~Y~-20H~-5V^~Z", "Ê"}, - {"e~Y~-25H~-4V^~Z", "ê"}, - {"I~Y~-19H~-5V^~Z", "Î"}, - {"i~Y~-19H~-8V^~Z", "î"}, - {"O~Y~-20H~-4V^~Z", "Ô"}, - {"o~Y~-25H~-4V^~Z", "ô"}, - {"U~Y~-24H~-3V^~Z", "Û"}, - {"u~Y~-23H~-3V^~Z", "û"}, - - // grave accents - {"A~Y~-26H~-8V`~Z", "À"}, - {"a~Y~-25H~-5V`~Z", "à"}, - {"E~Y~-23H~-9V`~Z", "È"}, - {"e~Y~-26H~-5V`~Z", "è"}, - {"I~Y~-19H~-5V`~Z", "Ì"}, - {"i~Y~-19H~-8V`~Z", "ì"}, - {"O~Y~-22H~-4V`~Z", "Ò"}, - {"o~Y~-26H~-4V`~Z", "ò"}, - {"U~Y~-24H~-3V`~Z", "Ù"}, - {"u~Y~-24H~-3V`~Z", "ù"}, - - // umlaut - {"A~Y~-26H~-8V¨~Z", "Ä"}, - {"a~Y~-25H~-5V¨~Z", "ä"}, - {"E~Y~-20H~-5V¨~Z", "Ë"}, - {"e~Y~-25H~-5V¨~Z", "ë"}, - {"I~Y~-19H~-5V¨~Z", "Ï"}, - {"i~Y~-26H~-4V¨~Z", "ï"}, - {"O~Y~-26H~-8V¨~Z", "Ö"}, - {"o~Y~-26H~-4V¨~Z", "ö"}, - {"U~Y~-25H~-8V¨~Z", "Ü"}, - {"u~Y~-24H~-3V¨~Z", "ü"}, - - // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ - {"A~Y~-25H~-9Vˇ~Z", "Ǎ"}, - {"a~Y~-24H~-5Vˇ~Z", "ǎ"}, - {"E~Y~-22H~-8Vˇ~Z", "Ě"}, - {"e~Y~-25H~-4Vˇ~Z", "ě"}, - {"G~Y~-24H~-8Vˇ~Z", "Ǧ"}, - {"~+7Vg~-7V~Y~-25H~-4Vˇ~Z", "ǧ"}, - {"I~Y~-19H~-8Vˇ~Z", "Ǐ"}, - {"i~Y~-19H~-8Vˇ~Z", "ǐ"}, - {"O~Y~-25H~-7Vˇ~Z", "Ǒ"}, - {"o~Y~-25H~-4Vˇ~Z", "ǒ"}, - {"U~Y~-25H~-6Vˇ~Z", "Ǔ"}, - {"u~Y~-24H~-3Vˇ~Z", "ǔ"}, - {"Y~Y~-25H~-5Vˇ~Z", "Y̌"}, - {"~+7Vy~-7V~Y~-25H~-3Vˇ~Z", "y̌"}, - // czech specific - Č č Ň ň Ř ř Š š Ž ž Ť - {"C~Y~-25H~-9Vˇ~Z", "Č"}, - {"c~Y~-24H~-5Vˇ~Z", "č"}, - {"N~Y~-25H~-9Vˇ~Z", "Ň"}, - {"n~Y~-24H~-5Vˇ~Z", "ň"}, - {"R~Y~-25H~-9Vˇ~Z", "Ř"}, - {"r~Y~-22H~-5Vˇ~Z", "ř"}, - {"S~Y~-25H~-9Vˇ~Z", "Š"}, - {"s~Y~-22H~-5Vˇ~Z", "š"}, - {"T~Y~-24H~-7Vˇ~Z", "Ť"}, - {"Z~Y~-25H~-9Vˇ~Z", "Ž"}, - {"z~Y~-24H~-5Vˇ~Z", "ž"}, - - // dakuten katakana - {"~Yウ~Z゛", "ヴ"}, - {"~Yカ~Z゛", "ガ"}, - {"~Yキ~Z゛", "ギ"}, - {"~Yク~Z゛", "グ"}, - {"~Yケ~Z゛", "ゲ"}, - {"~Yコ~Z゛", "ゴ"}, - {"~Yサ~Z゛", "ザ"}, - {"~Yシ~Z゛", "ジ"}, - {"~Yス~Z゛", "ズ"}, - {"~Yセ~Z゛", "ゼ"}, - {"~Yソ~Z゛", "ゾ"}, - {"~Yタ~Z゛", "ダ"}, - {"~Yチ~Z゛", "ヂ"}, - {"~Yツ~Z゛", "ヅ"}, - {"~Yテ~Z゛", "デ"}, - {"~Yト~Z゛", "ド"}, - {"~Yハ~Z゛", "バ"}, - {"~Yヒ~Z゛", "ビ"}, - {"~Yフ~Z゛", "ブ"}, - {"~Yヘ~Z゛", "ベ"}, - {"~Yホ~Z゛", "ボ"}, - // handakuten katakana - {"~Yハ~Z゜", "パ"}, - {"~Yヒ~Z゜", "ピ"}, - {"~Yフ~Z゜", "プ"}, - {"~Yヘ~Z゜", "ペ"}, - {"~Yホ~Z゜", "ポ"}, - // dakuten hiragana - {"~Yか~Z゛", "が"}, - {"~Yき~Z゛", "ぎ"}, - {"~Yく~Z゛", "ぐ"}, - {"~Yけ~Z゛", "げ"}, - {"~Yこ~Z゛", "ご"}, - {"~Yさ~Z゛", "ざ"}, - {"~Yし~Z゛", "じ"}, - {"~Yす~Z゛", "ず"}, - {"~Yせ~Z゛", "ぜ"}, - {"~Yそ~Z゛", "ぞ"}, - {"~Yた~Z゛", "だ"}, - {"~Yち~Z゛", "ぢ"}, - {"~Yつ~Z゛", "づ"}, - {"~Yて~Z゛", "で"}, - {"~Yと~Z゛", "ど"}, - {"~Yは~Z゛", "ば"}, - {"~Yひ~Z゛", "び"}, - {"~Yふ~Z゛", "ぶ"}, - {"~Yへ~Z゛", "べ"}, - {"~Yほ~Z゛", "ぼ"}, - // handakuten hiragana - {"~Yは~Z゜", "ぱ"}, - {"~Yひ~Z゜", "ぴ"}, - {"~Yふ~Z゜", "ぷ"}, - {"~Yへ~Z゜", "ぺ"}, - {"~Yほ~Z゜", "ぽ"}, - // japanese punctuation - {",~+8H", "、"}, - {"~+8H ", " "}, - - // playstation buttons - // - face - {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - // - dpad - {"~Y~22L~Z~3L~+17H~-13V~Z~22L~+17H~+14V~Z~" - "22L~+32H~Z~+56H", - ""}, - {"~Y~22L~Z~3L~+17H~-13V~Z~3L~+17H~+14V~Z~" - "22L~+32H~Z~+56H", - ""}, - {"~Y~22L~Z~22L~+17H~-13V~Z~22L~+17H~+14V~Z~" - "22L~+32H~Z~+56H", - ""}, - // - shoulder - {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+4H~+3V~Z~+" - "38H", - ""}, - {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+6H~+3V~Z~+" - "38H", - ""}, - {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" - "38H", - ""}, - {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" - "38H", - ""}, - // - analog - {"~1L~+8H~Y~Z~6L~-16H~Z~+16h~6L~Z~" - "6L~-15V~Z~+13V~6L~Z~-10H~+9V~6L~Z~+10H~+9V~6L~Z~-10H~-11V~6L~Z~+10H~" - "-11V~6L~Z~+32H", - ""}, - {"~Y~1L~+8H~Z~6L~-8H~Z~+24H~6L~Z~+" - "40H", - ""}, - {"~Y~1L~Z~6L~-15V~Z~+13V~6L~Z~+26H", - ""}, - - // icons - {"~Y~6L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~3L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - - // flags - {"~Y~6L~Z~+15H~1L~Z~+30H~3L~Z~+45H", - ""}, - {"~Y~5L~Z~3L~]~-1H~Y~5L~Z~3L~Z~+26H", - ""}, - {"~Y~39L~~~Z~3L~Z~5L~]~-1H~Y~39L~~~" - "Z~3L~Z~5L~Z~+26H", - ""}, - {"~Y~7L~Z~+15H~1L~Z~+30H~3L~Z~+47H", - ""}, - {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" - "FLAG_PART_FILL>~Z~3L~Z~7L~Z~+26H", - ""}, - {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" - "FLAG_PART_FILL>~Z~3L~Z~+26H", - ""}, - {"~Y~1L~Z~39L~]~-1H~Y~1L~Z~39L<" - "FLAG_PART_KOREA_TRIGRAMS_RIGHT>~Z~-11H~7L~Z~-11H~3L~Z~+26H", - ""}, - {"~Y~1L~]~-1H~Y~1L~Z~-11H~3L~Z~+26H", - ""}, - {"~Y~1L~Z~7L~Z~7L~]" - "~-1H~Y~1L~Z~7L~Z~+26H", - ""}, - {"~Y~7L~Z~5L~Z~5L~]" - "~-1H~Y~7L~Z~5L~Z~+26H", - ""}, - {"~Y~3L~Z~1L~Z~1L~]" - "~-1H~Y~3L~Z~1L~Z~+26H", - ""}, - {"~Y~1L~Z~3L~]~-1H~Y~1L~Z~3L~Z~-19H~1L~Z~-23H~7L~Z~-23H~7L~Z~7L~Z~" - "+26H", - ""}, - {"~Y~1L~Z~7L~]~-1H~Y~1L~Z~7L~Z~-19H~1L~Z~-23H~3L~Z~-23H~3L~Z~3L~Z~" - "+26H", - ""}, - - // weird stuff - // - descenders - {"~+7Vp~-7V", "p"}, - {"~+7Vy~-7V", "y"}, - {"~+7Vg~-7V", "g"}, - {"~+7Vq~-7V", "q"}, - {"~+1Vj~-1V", "j"}, - - {"\\\\", - "~%"}, // this is 2 slashes, duplicated because we use an escape sequence when decompiling - - // - symbols and ligatures - {"~-4H~-3V~+3V~-4H", - ""}, // used for the 4<__> place in spanish. the 5th uses the same - // character but looks different...? - {"~Y~-6Hº~Z~+10H", "°"}, - - // Color / Emphasis - {"~[~0L", ""}, - {"~[~1L", ""}, - {"~[~2L", ""}, - {"~[~3L", ""}, - {"~[~4L", ""}, - {"~[~5L", ""}, - {"~[~6L", ""}, - {"~[~7L", ""}, - {"~[~8L", ""}, - {"~[~9L", ""}, - {"~[~10L", ""}, - {"~[~11L", ""}, - {"~[~12L", ""}, - {"~[~13L", ""}, - {"~[~14L", ""}, - {"~[~15L", ""}, - {"~[~16L", ""}, - {"~[~17L", ""}, - {"~[~18L", ""}, - {"~[~19L", ""}, - {"~[~20L", ""}, - {"~[~21L", ""}, - {"~[~22L", ""}, - {"~[~23L", ""}, - {"~[~24L", ""}, - {"~[~25L", ""}, - {"~[~26L", ""}, - {"~[~27L", ""}, - {"~[~28L", ""}, - {"~[~29L", ""}, - {"~[~30L", ""}, - {"~[~31L", ""}, - {"~[~32L", ""}, - {"~[~33L", ""}, - {"~[~34L", ""}, - {"~[~35L", ""}, - {"~[~36L", ""}, - {"~[~37L", ""}, - {"~[~38L", ""}, - {"~[~39L", ""}}; - -static std::vector s_encode_info_jak2 = { - {"ˇ", {0x10}}, // caron - {"`", {0x11}}, // grave accent - {"'", {0x12}}, // apostrophe - {"^", {0x13}}, // circumflex - {"", {0x14}}, // tilde - {"¨", {0x15}}, // umlaut - {"º", {0x16}}, // numero/overring - {"¡", {0x17}}, // inverted exclamation mark - {"¿", {0x18}}, // inverted question mark - {"", {0x19}}, - {"ç", {0x1d}}, // c-cedilla - {"Ç", {0x1e}}, // c-cedilla - {"ß", {0x1f}}, // eszett - - {"œ", {0x5e}}, // ligature o+e - - {"", {0x7f}}, - {"", {0x80}}, - {"", {0x81}}, - {"", {0x82}}, - {"", {0x83}}, - {"", {0x84}}, - {"", {0x85}}, - {"", {0x86}}, - {"", {0x87}}, - {"", {0x88}}, - {"", {0x89}}, - {"", {0x8a}}, - {"", {0x8b}}, - {"", {0x8c}}, - {"", {0x8d}}, - {"", {0x8e}}, - {"", {0x8f}}, - {"", {0x90}}, - {"", {0x91}}, - {"", {0x92}}, - {"", {0x93}}, - {"", {0x94}}, - {"", {0x95}}, - {"", {0x96}}, - {"", {0x97}}, - {"", {0x98}}, - {"", {0x99}}, - {"", {0x9a}}, - {"", {0x9b}}, - {"", {0x9c}}, - {"", {0x9d}}, - {"", {0x9e}}, - {"", {0x9f}}, - {"", {0xa0}}, - {"", {0xa1}}, - {"", {0xa2}}, - {"", {0xa3}}, - {"", {0xa4}}, - {"", {0xa5}}, - {"", {0xa6}}, - {"", {0xa7}}, - {"", {0xa8}}, - {"", {0xa9}}, - {"", {0xaa}}, - {"", {0xab}}, - {"", {0xac}}, - - {"", {0xb0}}, - {"", {0xb1}}, - {"", {0xb2}}, - {"", {0xb3}}, - // {"入", {1, 0x00}}, - // {"年", {1, 0x01}}, - // punctuation - {"・", {1, 0x10}}, - {"゛", {1, 0x11}}, - {"゜", {1, 0x12}}, - {"ー", {1, 0x13}}, - {"『", {1, 0x14}}, - {"』", {1, 0x15}}, - // hiragana - {"ぁ", {1, 0x16}}, // -a - {"あ", {1, 0x17}}, // a - {"ぃ", {1, 0x18}}, // -i - {"い", {1, 0x19}}, // i - {"ぅ", {1, 0x1a}}, // -u - {"う", {1, 0x1b}}, // u - {"ぇ", {1, 0x1c}}, // -e - {"え", {1, 0x1d}}, // e - {"ぉ", {1, 0x1e}}, // -o - {"お", {1, 0x1f}}, // o - {"か", {1, 0x20}}, // ka - {"き", {1, 0x21}}, // ki - {"く", {1, 0x22}}, // ku - {"け", {1, 0x23}}, // ke - {"こ", {1, 0x24}}, // ko - {"さ", {1, 0x25}}, // sa - {"し", {1, 0x26}}, // shi - {"す", {1, 0x27}}, // su - {"せ", {1, 0x28}}, // se - {"そ", {1, 0x29}}, // so - {"た", {1, 0x2a}}, // ta - {"ち", {1, 0x2b}}, // chi - {"っ", {1, 0x2c}}, // sokuon - {"つ", {1, 0x2d}}, // tsu - {"て", {1, 0x2e}}, // te - {"と", {1, 0x2f}}, // to - {"な", {1, 0x30}}, // na - {"に", {1, 0x31}}, // ni - {"ぬ", {1, 0x32}}, // nu - {"ね", {1, 0x33}}, // ne - {"の", {1, 0x34}}, // no - {"は", {1, 0x35}}, // ha - {"ひ", {1, 0x36}}, // hi - {"ふ", {1, 0x37}}, // fu - {"へ", {1, 0x38}}, // he - {"ほ", {1, 0x39}}, // ho - {"ま", {1, 0x3a}}, // ma - {"み", {1, 0x3b}}, // mi - {"む", {1, 0x3c}}, // mu - {"め", {1, 0x3d}}, // me - {"も", {1, 0x3e}}, // mo - {"ゃ", {1, 0x3f}}, // youon ya - {"や", {1, 0x40}}, // ya - {"ゅ", {1, 0x41}}, // youon yu - {"ゆ", {1, 0x42}}, // yu - {"ょ", {1, 0x43}}, // youon yo - {"よ", {1, 0x44}}, // yo - {"ら", {1, 0x45}}, // ra - {"り", {1, 0x46}}, // ri - {"る", {1, 0x47}}, // ru - {"れ", {1, 0x48}}, // re - {"ろ", {1, 0x49}}, // ro - {"ゎ", {1, 0x4a}}, // -wa - {"わ", {1, 0x4b}}, // wa - {"を", {1, 0x4c}}, // wo - {"ん", {1, 0x4d}}, // -n - // katakana - {"ァ", {1, 0x4e}}, // -a - {"ア", {1, 0x4f}}, // a - {"ィ", {1, 0x50}}, // -i - {"イ", {1, 0x51}}, // i - {"ゥ", {1, 0x52}}, // -u - {"ウ", {1, 0x53}}, // u - {"ェ", {1, 0x54}}, // -e - {"エ", {1, 0x55}}, // e - {"ォ", {1, 0x56}}, // -o - {"オ", {1, 0x57}}, // o - {"カ", {1, 0x58}}, // ka - {"キ", {1, 0x59}}, // ki - {"ク", {1, 0x5a}}, // ku - {"ケ", {1, 0x5b}}, // ke - {"コ", {1, 0x5c}}, // ko - {"サ", {1, 0x5d}}, // sa - {"シ", {1, 0x5e}}, // shi - {"ス", {1, 0x5f}}, // su - {"セ", {1, 0x60}}, // se - {"ソ", {1, 0x61}}, // so - {"タ", {1, 0x62}}, // ta - {"チ", {1, 0x63}}, // chi - {"ッ", {1, 0x64}}, // sokuon - {"ツ", {1, 0x65}}, // tsu - {"テ", {1, 0x66}}, // te - {"ト", {1, 0x67}}, // to - {"ナ", {1, 0x68}}, // na - {"ニ", {1, 0x69}}, // ni - {"ヌ", {1, 0x6a}}, // nu - {"ネ", {1, 0x6b}}, // ne - {"ノ", {1, 0x6c}}, // no - {"ハ", {1, 0x6d}}, // ha - {"ヒ", {1, 0x6e}}, // hi - {"フ", {1, 0x6f}}, // fu - {"ヘ", {1, 0x70}}, // he - {"ホ", {1, 0x71}}, // ho - {"マ", {1, 0x72}}, // ma - {"ミ", {1, 0x73}}, // mi - {"ム", {1, 0x74}}, // mu - {"メ", {1, 0x75}}, // me - {"モ", {1, 0x76}}, // mo - {"ャ", {1, 0x77}}, // youon ya - {"ヤ", {1, 0x78}}, // ya - {"ュ", {1, 0x79}}, // youon yu - {"ユ", {1, 0x7a}}, // yu - {"ョ", {1, 0x7b}}, // youon yo - {"ヨ", {1, 0x7c}}, // yo - {"ラ", {1, 0x7d}}, // ra - {"リ", {1, 0x7e}}, // ri - {"ル", {1, 0x7f}}, // ru - {"レ", {1, 0x80}}, // re - {"ロ", {1, 0x81}}, // ro - {"ヮ", {1, 0x82}}, // -wa - {"ワ", {1, 0x83}}, // wa - {"ヲ", {1, 0x84}}, // wo - {"ン", {1, 0x85}}, // -n - - {"位", {1, 0x8c}}, - {"遺", {1, 0x8d}}, - {"院", {1, 0x8e}}, - {"映", {1, 0x8f}}, - {"衛", {1, 0x90}}, - {"応", {1, 0x91}}, - {"下", {1, 0x92}}, - {"画", {1, 0x93}}, - {"解", {1, 0x94}}, - {"開", {1, 0x95}}, - {"外", {1, 0x96}}, - {"害", {1, 0x97}}, - {"蓋", {1, 0x98}}, - {"完", {1, 0x99}}, - {"換", {1, 0x9a}}, - {"監", {1, 0x9b}}, - {"間", {1, 0x9c}}, - {"器", {1, 0x9d}}, - {"記", {1, 0x9e}}, - {"逆", {1, 0x9f}}, - {"救", {1, 0xa0}}, - {"金", {1, 0xa1}}, - {"空", {1, 0xa2}}, - {"掘", {1, 0xa3}}, - {"警", {1, 0xa4}}, - {"迎", {1, 0xa5}}, - {"撃", {1, 0xa6}}, - {"建", {1, 0xa7}}, - {"源", {1, 0xa8}}, - {"現", {1, 0xa9}}, - {"言", {1, 0xaa}}, - {"限", {1, 0xab}}, - {"個", {1, 0xac}}, - {"庫", {1, 0xad}}, - {"後", {1, 0xae}}, - {"語", {1, 0xaf}}, - {"護", {1, 0xb0}}, - {"交", {1, 0xb1}}, - {"功", {1, 0xb2}}, - {"向", {1, 0xb3}}, - {"工", {1, 0xb4}}, - {"攻", {1, 0xb5}}, - {"溝", {1, 0xb6}}, - {"行", {1, 0xb7}}, - {"鉱", {1, 0xb8}}, - {"降", {1, 0xb9}}, - {"合", {1, 0xba}}, - {"告", {1, 0xbb}}, - {"獄", {1, 0xbc}}, - {"彩", {1, 0xbd}}, - {"作", {1, 0xbe}}, - {"山", {1, 0xbf}}, - {"使", {1, 0xc0}}, - {"始", {1, 0xc1}}, - {"試", {1, 0xc2}}, - {"字", {1, 0xc3}}, - {"寺", {1, 0xc4}}, - {"時", {1, 0xc5}}, - {"示", {1, 0xc6}}, - {"自", {1, 0xc7}}, - {"式", {1, 0xc8}}, - {"矢", {1, 0xc9}}, - {"射", {1, 0xca}}, - {"者", {1, 0xcb}}, - {"守", {1, 0xcc}}, - {"手", {1, 0xcd}}, - {"終", {1, 0xce}}, - {"週", {1, 0xcf}}, - {"出", {1, 0xd0}}, - {"所", {1, 0xd1}}, - {"書", {1, 0xd2}}, - {"勝", {1, 0xd3}}, - {"章", {1, 0xd4}}, - {"上", {1, 0xd5}}, - {"乗", {1, 0xd6}}, - {"場", {1, 0xd7}}, - {"森", {1, 0xd8}}, - {"進", {1, 0xd9}}, - {"人", {1, 0xda}}, - {"水", {1, 0xdb}}, - {"数", {1, 0xdc}}, - {"制", {1, 0xdd}}, - {"性", {1, 0xde}}, - {"成", {1, 0xdf}}, - {"聖", {1, 0xe0}}, - {"石", {1, 0xe1}}, - {"跡", {1, 0xe2}}, - {"先", {1, 0xe3}}, - {"戦", {1, 0xe4}}, - {"船", {1, 0xe5}}, - {"選", {1, 0xe6}}, - {"走", {1, 0xe7}}, - {"送", {1, 0xe8}}, - {"像", {1, 0xe9}}, - {"造", {1, 0xea}}, - {"続", {1, 0xeb}}, - {"対", {1, 0xec}}, - {"袋", {1, 0xed}}, - {"台", {1, 0xee}}, - {"弾", {1, 0xef}}, - {"地", {1, 0xf0}}, - {"中", {1, 0xf1}}, - {"敵", {1, 0xf2}}, - {"転", {1, 0xf3}}, - {"電", {1, 0xf4}}, - {"塔", {1, 0xf5}}, - {"頭", {1, 0xf6}}, - {"動", {1, 0xf7}}, - {"内", {1, 0xf8}}, - {"日", {1, 0xf9}}, - {"入", {1, 0xfa}}, - {"年", {1, 0xfb}}, - {"能", {1, 0xfc}}, - {"廃", {1, 0xfd}}, - {"排", {1, 0xfe}}, - {"敗", {1, 0xff}}, - - {"発", {2, 0x10}}, - {"反", {2, 0x11}}, - {"必", {2, 0x12}}, - {"表", {2, 0x13}}, - {"武", {2, 0x14}}, - {"壁", {2, 0x15}}, - {"墓", {2, 0x16}}, - {"放", {2, 0x17}}, - {"方", {2, 0x18}}, - {"砲", {2, 0x19}}, - {"妨", {2, 0x1a}}, - {"北", {2, 0x1b}}, - {"本", {2, 0x1c}}, - {"幕", {2, 0x1d}}, - {"無", {2, 0x1e}}, - {"迷", {2, 0x1f}}, - {"面", {2, 0x20}}, - {"戻", {2, 0x21}}, - {"紋", {2, 0x22}}, - {"薬", {2, 0x23}}, - {"輸", {2, 0x24}}, - {"勇", {2, 0x25}}, - {"友", {2, 0x26}}, - {"遊", {2, 0x27}}, - {"容", {2, 0x28}}, - {"要", {2, 0x29}}, - {"利", {2, 0x2a}}, - {"了", {2, 0x2b}}, - {"量", {2, 0x2c}}, - {"力", {2, 0x2d}}, - {"練", {2, 0x2e}}, - {"連", {2, 0x2f}}, - {"録", {2, 0x30}}, - {"話", {2, 0x31}}, - {"墟", {2, 0x32}}, - {"脱", {2, 0x33}}, - // {"成", {2, 0x34}}, - {"旗", {2, 0x35}}, - {"破", {2, 0x36}}, - {"壊", {2, 0x37}}, - {"全", {2, 0x38}}, - {"滅", {2, 0x39}}, - {"機", {2, 0x3a}}, - {"仲", {2, 0x3b}}, - {"渓", {2, 0x3c}}, - {"谷", {2, 0x3d}}, - {"優", {2, 0x3e}}, - {"探", {2, 0x3f}}, - {"部", {2, 0x40}}, - {"索", {2, 0x41}}, - // {"乗", {2, 0x42}}, - {"前", {2, 0x43}}, - {"右", {2, 0x44}}, - {"左", {2, 0x45}}, - {"会", {2, 0x46}}, - {"高", {2, 0x47}}, - {"低", {2, 0x48}}, - {"押", {2, 0x49}}, - {"切", {2, 0x4a}}, - {"替", {2, 0x4b}}, - // {"対", {2, 0x4c}}, - {"秒", {2, 0x4d}}, - {"箱", {2, 0x4e}}, - {"泳", {2, 0x4f}}, - {"~", {2, 0x50}}, - - {"闇", {2, 0x56}}, - {"以", {2, 0x57}}, - {"屋", {2, 0x58}}, - {"俺", {2, 0x59}}, - {"化", {2, 0x5a}}, - {"界", {2, 0x5b}}, - {"感", {2, 0x5c}}, - {"気", {2, 0x5d}}, - {"却", {2, 0x5e}}, - {"曲", {2, 0x5f}}, - {"継", {2, 0x60}}, - {"権", {2, 0x61}}, - {"見", {2, 0x62}}, - {"古", {2, 0x63}}, - {"好", {2, 0x64}}, - // {"高", {2, 0x65}}, - {"才", {2, 0x66}}, - {"士", {2, 0x67}}, - {"子", {2, 0x68}}, - {"次", {2, 0x69}}, - {"主", {2, 0x6a}}, - {"種", {2, 0x6b}}, - {"讐", {2, 0x6c}}, - {"女", {2, 0x6d}}, - {"小", {2, 0x6e}}, - {"焼", {2, 0x6f}}, - {"証", {2, 0x70}}, - {"神", {2, 0x71}}, - {"身", {2, 0x72}}, - {"寸", {2, 0x73}}, - {"世", {2, 0x74}}, - {"想", {2, 0x75}}, - {"退", {2, 0x76}}, - {"第", {2, 0x77}}, - {"着", {2, 0x78}}, - {"天", {2, 0x79}}, - {"倒", {2, 0x7a}}, - {"到", {2, 0x7b}}, - {"突", {2, 0x7c}}, - {"爆", {2, 0x7d}}, - {"番", {2, 0x7e}}, - {"負", {2, 0x7f}}, - {"復", {2, 0x80}}, - {"物", {2, 0x81}}, - {"眠", {2, 0x82}}, - {"予", {2, 0x83}}, - {"用", {2, 0x84}}, - {"落", {2, 0x85}}, - {"緑", {2, 0x86}}, - - {"封", {2, 0x88}}, - {"印", {2, 0x89}}, - {"扉", {2, 0x8a}}, - {"最", {2, 0x8b}}, - {"刻", {2, 0x8c}}, - {"足", {2, 0x8d}}, - - {"", {3, 0x00}}, - {"", {3, 0x01}}, - {"", {3, 0x02}}, - {"", {3, 0x03}}, - {"", {3, 0x04}}, - {"", {3, 0x05}}, - {"", {3, 0x06}}, - {"", {3, 0x07}}, - {"", {3, 0x08}}, - {"", {3, 0x09}}, - {"", {3, 0x0a}}, - {"", {3, 0x0b}}, - {"", {3, 0x0c}}, - {"", {3, 0x0d}}, - {"", {3, 0x0e}}, - {"", {3, 0x0f}}, - {"", {3, 0x10}}, - {"", {3, 0x11}}, - {"", {3, 0x12}}, - {"", {3, 0x13}}, - {"", {3, 0x14}}, - {"", {3, 0x15}}, - {"", {3, 0x16}}, - {"", {3, 0x17}}, - {"", {3, 0x18}}, - {"", {3, 0x19}}, - {"", {3, 0x1a}}, - {"", {3, 0x1b}}, - {"", {3, 0x1c}}, - {"", {3, 0x1d}}, - {"", {3, 0x1e}}, - {"", {3, 0x1f}}, - {"", {3, 0x20}}, - {"", {3, 0x21}}, - {"", {3, 0x22}}, - {"", {3, 0x23}}, - {"", {3, 0x24}}, - {"", {3, 0x25}}, - {"", {3, 0x26}}, - {"", {3, 0x27}}, - {"", {3, 0x28}}, - {"", {3, 0x29}}, - {"", {3, 0x2a}}, - {"", {3, 0x2b}}, - {"", {3, 0x2c}}, - {"", {3, 0x2d}}, - {"", {3, 0x2e}}, - {"", {3, 0x2f}}, - {"", {3, 0x30}}, - {"", {3, 0x31}}, - {"", {3, 0x32}}, - {"", {3, 0x33}}, - {"", {3, 0x34}}, - {"", {3, 0x35}}, - {"", {3, 0x36}}, - {"", {3, 0x37}}, - {"", {3, 0x38}}, - {"", {3, 0x39}}, - {"", {3, 0x3a}}, - {"", {3, 0x3b}}, - {"", {3, 0x3c}}, - {"", {3, 0x3d}}, - {"", {3, 0x3e}}, - {"", {3, 0x3f}}, - {"", {3, 0x40}}, - {"", {3, 0x41}}, - {"", {3, 0x42}}, - {"", {3, 0x43}}, - {"", {3, 0x44}}, - {"", {3, 0x45}}, - {"", {3, 0x46}}, - {"", {3, 0x47}}, - {"", {3, 0x48}}, - {"", {3, 0x49}}, - {"", {3, 0x4a}}, - {"", {3, 0x4b}}, - {"", {3, 0x4c}}, - {"", {3, 0x4d}}, - {"", {3, 0x4e}}, - {"", {3, 0x4f}}, - {"", {3, 0x50}}, - {"", {3, 0x51}}, - {"", {3, 0x52}}, - {"", {3, 0x53}}, - {"", {3, 0x54}}, - {"", {3, 0x55}}, - {"", {3, 0x56}}, - {"", {3, 0x57}}, - {"", {3, 0x58}}, - {"", {3, 0x59}}, - {"", {3, 0x5a}}, - {"", {3, 0x5b}}, - {"", {3, 0x5c}}, - {"", {3, 0x5d}}, - {"", {3, 0x5e}}, - {"", {3, 0x5f}}, - {"", {3, 0x60}}, - {"", {3, 0x61}}, - {"", {3, 0x62}}, - {"", {3, 0x63}}, - {"", {3, 0x64}}, - {"", {3, 0x65}}, - {"", {3, 0x66}}, - {"", {3, 0x67}}, - {"", {3, 0x68}}, - {"", {3, 0x69}}, - {"", {3, 0x6a}}, - {"", {3, 0x6b}}, - {"", {3, 0x6c}}, - {"", {3, 0x6d}}, - {"", {3, 0x6e}}, - {"", {3, 0x6f}}, - {"", {3, 0x70}}, - {"", {3, 0x71}}, - {"", {3, 0x72}}, - {"", {3, 0x73}}, - {"", {3, 0x74}}, - {"", {3, 0x75}}, - {"", {3, 0x76}}, - {"", {3, 0x77}}, - {"", {3, 0x78}}, - {"", {3, 0x79}}, - {"", {3, 0x7a}}, - {"", {3, 0x7b}}, - {"", {3, 0x7c}}, - {"", {3, 0x7d}}, - {"", {3, 0x7e}}, - {"", {3, 0x7f}}, - {"", {3, 0x80}}, - {"", {3, 0x81}}, - {"", {3, 0x82}}, - {"", {3, 0x83}}, - {"", {3, 0x84}}, - {"", {3, 0x85}}, - {"", {3, 0x86}}, - {"", {3, 0x87}}, - {"", {3, 0x88}}, - {"", {3, 0x89}}, - {"", {3, 0x8a}}, - {"", {3, 0x8b}}, - {"", {3, 0x8c}}, - {"", {3, 0x8d}}, - {"", {3, 0x8e}}, - {"", {3, 0x8f}}, - {"", {3, 0x90}}, - {"", {3, 0x91}}, - {"", {3, 0x92}}, - {"", {3, 0x93}}, - {"", {3, 0x94}}, - {"", {3, 0x95}}, - {"", {3, 0x96}}, - {"", {3, 0x97}}, - {"", {3, 0x98}}, - {"", {3, 0x99}}, - {"", {3, 0x9a}}, - {"", {3, 0x9b}}, - {"", {3, 0x9c}}, - {"", {3, 0x9d}}, - {"", {3, 0x9e}}, - {"", {3, 0x9f}}, - {"", {3, 0xa0}}, - {"", {3, 0xa1}}, - {"", {3, 0xa2}}, - {"", {3, 0xa3}}, - {"", {3, 0xa4}}, - {"", {3, 0xa5}}, - {"", {3, 0xa6}}, - {"", {3, 0xa7}}, - {"", {3, 0xa8}}, - {"", {3, 0xa9}}, - {"", {3, 0xaa}}, - {"", {3, 0xab}}, - {"", {3, 0xac}}, - {"", {3, 0xad}}, - {"", {3, 0xae}}, - {"", {3, 0xaf}}, - {"", {3, 0xb0}}, - {"", {3, 0xb1}}, - {"", {3, 0xb2}}, - {"", {3, 0xb3}}, - {"", {3, 0xb4}}, - {"", {3, 0xb5}}, - {"", {3, 0xb6}}, - {"", {3, 0xb7}}, - {"", {3, 0xb8}}, - {"", {3, 0xb9}}, - {"", {3, 0xba}}, - {"", {3, 0xbb}}, - {"", {3, 0xbc}}, - {"", {3, 0xbd}}, - {"", {3, 0xbe}}, - {"", {3, 0xbf}}, - {"", {3, 0xc0}}, - {"", {3, 0xc1}}, - {"", {3, 0xc2}}, - {"", {3, 0xc3}}, - {"", {3, 0xc4}}, - {"", {3, 0xc5}}, - {"", {3, 0xc6}}, - {"", {3, 0xc7}}, - {"", {3, 0xc8}}, - {"", {3, 0xc9}}, - {"", {3, 0xca}}, - {"", {3, 0xcb}}, - {"", {3, 0xcc}}, - {"", {3, 0xcd}}, - {"", {3, 0xce}}, - {"", {3, 0xcf}}, - {"", {3, 0xd0}}, - {"", {3, 0xd1}}, - {"", {3, 0xd2}}, - {"", {3, 0xd3}}, - {"", {3, 0xd4}}, - {"", {3, 0xd5}}, - {"", {3, 0xd6}}, - {"", {3, 0xd7}}, - {"", {3, 0xd8}}, - {"", {3, 0xd9}}, - {"", {3, 0xda}}, - {"", {3, 0xdb}}, - {"", {3, 0xdc}}, - {"", {3, 0xdd}}, - {"", {3, 0xde}}, - {"", {3, 0xdf}}, - {"", {3, 0xe0}}, - {"", {3, 0xe1}}, - {"", {3, 0xe2}}, - {"", {3, 0xe3}}, - {"", {3, 0xe4}}, - {"", {3, 0xe5}}, - {"", {3, 0xe6}}, - {"", {3, 0xe7}}, - {"", {3, 0xe8}}, - {"", {3, 0xe9}}, - {"", {3, 0xea}}, - {"", {3, 0xeb}}, - {"", {3, 0xec}}, - {"", {3, 0xed}}, - {"", {3, 0xee}}, - {"", {3, 0xef}}, - {"", {3, 0xf0}}, - {"", {3, 0xf1}}, - {"", {3, 0xf2}}, - {"", {3, 0xf3}}, - {"", {3, 0xf4}}, - {"", {3, 0xf5}}, - {"", {3, 0xf6}}, - {"", {3, 0xf7}}, - {"", {3, 0xf8}}, - {"", {3, 0xf9}}, - {"", {3, 0xfa}}, - {"", {3, 0xfb}}, - {"", {3, 0xfc}}, - {"", {3, 0xfd}}, - {"", {3, 0xfe}}, - {"", {3, 0xff}}, -}; - -GameTextFontBank g_font_bank_jak2(GameTextVersion::JAK2, - &s_encode_info_jak2, - &s_replace_info_jak2, - &s_passthrus_jak2); - -/*! - * ================================ - * GAME TEXT FONT BANK - JAK 3 - * ================================ - * This font is used in: - * - Jak 3 - */ - -// TODO cyrillic - -GameTextFontBank g_font_bank_jak3(GameTextVersion::JAK3, - &s_encode_info_jak2, - &s_replace_info_jak2, - &s_passthrus_jak2); - -/*! - * ======================== - * GAME TEXT FONT BANK LIST - * ======================== - * The list of available font banks and a couple of helper functions. - */ - -std::map g_font_banks = { - {GameTextVersion::JAK1_V1, &g_font_bank_jak1_v1}, - {GameTextVersion::JAK1_V2, &g_font_bank_jak1_v2}, - {GameTextVersion::JAK2, &g_font_bank_jak2}, - {GameTextVersion::JAK3, &g_font_bank_jak3}}; - -const GameTextFontBank* get_font_bank(GameTextVersion version) { - return g_font_banks.at(version); -} - -const GameTextFontBank* get_font_bank_from_game_version(GameVersion version) { - // Jak 1 has been patched to use V2 - switch (version) { - case GameVersion::Jak1: - return get_font_bank(GameTextVersion::JAK1_V2); - case GameVersion::Jak2: - return get_font_bank(GameTextVersion::JAK2); - case GameVersion::Jak3: - return get_font_bank(GameTextVersion::JAK3); - default: - ASSERT_MSG(false, "Unsupported game for get_font_bank_from_game_version"); - } -} - -const GameTextFontBank* get_font_bank(const std::string& name) { - if (auto it = sTextVerEnumMap.find(name); it == sTextVerEnumMap.end()) { - throw std::runtime_error(fmt::format("unknown text version {}", name)); - } else { - return get_font_bank(it->second); - } -} - -bool font_bank_exists(GameTextVersion version) { - return g_font_banks.find(version) != g_font_banks.cend(); -} diff --git a/common/util/Trie.h b/common/util/Trie.h index 76a6a86a6a..7f55170184 100644 --- a/common/util/Trie.h +++ b/common/util/Trie.h @@ -36,6 +36,9 @@ class Trie { // Get all objects starting with the given prefix. std::vector lookup_prefix(const std::string& str) const; + // Finds the longest prefix match starting at offset `off` in string `in`. + const T* find_longest_prefix(const std::string& in, int off) const; + // Get all nodes in the tree. std::vector get_all_nodes() const; ~Trie(); @@ -143,6 +146,23 @@ class Trie { } } } + + const T* find_longest_prefix(const std::string& in, int off) const { + const Node* node = this; + const T* best = nullptr; + + for (int j = off; j < (int)in.size(); ++j) { + unsigned char c = static_cast(in[j]); + node = node->children[c]; + if (!node) { + break; + } + if (node->value) { + best = node->value; + } + } + return best; + } }; Node m_root; @@ -182,9 +202,14 @@ std::vector Trie::lookup_prefix(const std::string& str) const { return m_root.lookup_prefix(str.c_str()); } +template +const T* Trie::find_longest_prefix(const std::string& in, int off) const { + return m_root.find_longest_prefix(in, off); +} + template std::vector Trie::get_all_nodes() const { std::vector result; m_root.get_all_children(result); return result; -} \ No newline at end of file +} diff --git a/common/util/font/dbs/font_db_jak1.cpp b/common/util/font/dbs/font_db_jak1.cpp new file mode 100644 index 0000000000..a212d51b4c --- /dev/null +++ b/common/util/font/dbs/font_db_jak1.cpp @@ -0,0 +1,596 @@ +#include "font_db_jak1.h" + +std::unordered_set passthrus_jak1 = {'~', ' ', ',', '.', '-', '+', '(', ')', '!', ':', '?', + '=', '%', '*', '/', '#', ';', '<', '>', '@', '[', '_'}; + +std::vector encode_info_jak1 = { + // random + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + + {"海", "\x1a"}, // umi + {"Æ", "\x1b"}, // aesc + {"界", "\x1c"}, // kai + {"Ç", "\x1d"}, // c-cedilla + {"学", "\x1e"}, // gaku + {"ß", "\x1f"}, // eszett + + {"ワ", "\x24"}, // wa + + {"ヲ", "\x26"}, // wo + {"ン", "\x27"}, // -n + + {"岩", "\x5c"}, // iwa + {"旧", "\x5d"}, // kyuu + {"空", "\x5e"}, // sora + //{"掘", "\x5f"}, // horu + + {"ヮ", "\x60"}, // -wa + {"撃", "\x61"}, // utsu + {"賢", "\x62"}, // kashikoi + {"湖", "\x63"}, // mizuumi + {"口", "\x64"}, // kuchi + {"行", "\x65"}, // iku + {"合", "\x66"}, // ai + {"士", "\x67"}, // shi + {"寺", "\x68"}, // tera + {"山", "\x69"}, // yama + {"者", "\x6a"}, // mono + {"所", "\x6b"}, // tokoro + {"書", "\x6c"}, // kaku + {"小", "\x6d"}, // shou + {"沼", "\x6e"}, // numa + {"上", "\x6f"}, // ue + {"城", "\x70"}, // shiro + {"場", "\x71"}, // ba + {"出", "\x72"}, // shutsu + {"闇", "\x73"}, // yami + {"遺", "\x74"}, // nokosu + {"黄", "\x75"}, // ki + {"屋", "\x76"}, // ya + {"下", "\x77"}, // shita + {"家", "\x78"}, // ie + {"火", "\x79"}, // hi + {"花", "\x7a"}, // hana + {"レ", "\x7b"}, // re + {"Œ", "\x7c"}, // oe + {"ロ", "\x7d"}, // ro + + {"青", "\x7f"}, // ao + + {"・", "\x90"}, // nakaguro + {"゛", "\x91"}, // dakuten + {"゜", "\x92"}, // handakuten + {"ー", "\x93"}, // chouompu + {"『", "\x94"}, // nijuukagikakko left + {"』", "\x95"}, // nijuukagikakko right + // hiragana + {"ぁ", "\x96"}, // -a + {"あ", "\x97"}, // a + {"ぃ", "\x98"}, // -i + {"い", "\x99"}, // i + {"ぅ", "\x9a"}, // -u + {"う", "\x9b"}, // u + {"ぇ", "\x9c"}, // -e + {"え", "\x9d"}, // e + {"ぉ", "\x9e"}, // -o + {"お", "\x9f"}, // o + {"か", "\xa0"}, // ka + {"き", "\xa1"}, // ki + {"く", "\xa2"}, // ku + {"け", "\xa3"}, // ke + {"こ", "\xa4"}, // ko + {"さ", "\xa5"}, // sa + {"し", "\xa6"}, // shi + {"す", "\xa7"}, // su + {"せ", "\xa8"}, // se + {"そ", "\xa9"}, // so + {"た", "\xaa"}, // ta + {"ち", "\xab"}, // chi + {"っ", "\xac"}, // sokuon + {"つ", "\xad"}, // tsu + {"て", "\xae"}, // te + {"と", "\xaf"}, // to + {"な", "\xb0"}, // na + {"に", "\xb1"}, // ni + {"ぬ", "\xb2"}, // nu + {"ね", "\xb3"}, // ne + {"の", "\xb4"}, // no + {"は", "\xb5"}, // ha + {"ひ", "\xb6"}, // hi + {"ふ", "\xb7"}, // hu + {"へ", "\xb8"}, // he + {"ほ", "\xb9"}, // ho + {"ま", "\xba"}, // ma + {"み", "\xbb"}, // mi + {"む", "\xbc"}, // mu + {"め", "\xbd"}, // me + {"も", "\xbe"}, // mo + {"ゃ", "\xbf"}, // youon ya + {"や", "\xc0"}, // ya + {"ゅ", "\xc1"}, // youon yu + {"ゆ", "\xc2"}, // yu + {"ょ", "\xc3"}, // youon yo + {"よ", "\xc4"}, // yo + {"ら", "\xc5"}, // ra + {"り", "\xc6"}, // ri + {"る", "\xc7"}, // ru + {"れ", "\xc8"}, // re + {"ろ", "\xc9"}, // ro + {"ゎ", "\xca"}, // -wa + {"わ", "\xcb"}, // wa + {"を", "\xcc"}, // wo + {"ん", "\xcd"}, // -n + // katakana + {"ァ", "\xce"}, // -a + {"ア", "\xcf"}, // a + {"ィ", "\xd0"}, // -i + {"イ", "\xd1"}, // i + {"ゥ", "\xd2"}, // -u + {"ウ", "\xd3"}, // u + {"ェ", "\xd4"}, // -e + {"エ", "\xd5"}, // e + {"ォ", "\xd6"}, // -o + {"オ", "\xd7"}, // o + {"カ", "\xd8"}, // ka + {"キ", "\xd9"}, // ki + {"ク", "\xda"}, // ku + {"ケ", "\xdb"}, // ke + {"コ", "\xdc"}, // ko + {"サ", "\xdd"}, // sa + {"シ", "\xde"}, // shi + {"ス", "\xdf"}, // su + {"セ", "\xe0"}, // se + {"ソ", "\xe1"}, // so + {"タ", "\xe2"}, // ta + {"チ", "\xe3"}, // chi + {"ッ", "\xe4"}, // sokuon + {"ツ", "\xe5"}, // tsu + {"テ", "\xe6"}, // te + {"ト", "\xe7"}, // to + {"ナ", "\xe8"}, // na + {"ニ", "\xe9"}, // ni + {"ヌ", "\xea"}, // nu + {"ネ", "\xeb"}, // ne + {"ノ", "\xec"}, // no + {"ハ", "\xed"}, // ha + {"ヒ", "\xee"}, // hi + {"フ", "\xef"}, // hu + {"ヘ", "\xf0"}, // he + {"ホ", "\xf1"}, // ho + {"マ", "\xf2"}, // ma + {"ミ", "\xf3"}, // mi + {"ム", "\xf4"}, // mu + {"メ", "\xf5"}, // me + {"モ", "\xf6"}, // mo + {"ャ", "\xf7"}, // youon ya + {"ヤ", "\xf8"}, // ya + {"ュ", "\xf9"}, // youon yu + {"ユ", "\xfa"}, // yu + {"ョ", "\xfb"}, // youon yo + {"ヨ", "\xfc"}, // yo + {"ラ", "\xfd"}, // ra + {"リ", "\xfe"}, // ri + {"ル", "\xff"}, // ru + // kanji 2 + {"宝", "\x1\x01"}, // takara + + {"石", "\x1\x10"}, // ishi + {"赤", "\x1\x11"}, // aka + {"跡", "\x1\x12"}, // ato + {"川", "\x1\x13"}, // kawa + {"戦", "\x1\x14"}, // ikusa + {"村", "\x1\x15"}, // mura + {"隊", "\x1\x16"}, // tai + {"台", "\x1\x17"}, // utena + {"長", "\x1\x18"}, // osa + {"鳥", "\x1\x19"}, // tori + {"艇", "\x1\x1a"}, // tei + {"洞", "\x1\x1b"}, // hora + {"道", "\x1\x1c"}, // michi + {"発", "\x1\x1d"}, // hatsu + {"飛", "\x1\x1e"}, // tobu + {"噴", "\x1\x1f"}, // fuku + + {"池", "\x1\xa0"}, // ike + {"中", "\x1\xa1"}, // naka + {"塔", "\x1\xa2"}, // tou + {"島", "\x1\xa3"}, // shima + {"部", "\x1\xa4"}, // bu + {"砲", "\x1\xa5"}, // hou + {"産", "\x1\xa6"}, // san + {"眷", "\x1\xa7"}, // kaerimiru + {"力", "\x1\xa8"}, // chikara + {"緑", "\x1\xa9"}, // midori + {"岸", "\x1\xaa"}, // kishi + {"像", "\x1\xab"}, // zou + {"谷", "\x1\xac"}, // tani + {"心", "\x1\xad"}, // kokoro + {"森", "\x1\xae"}, // mori + {"水", "\x1\xaf"}, // mizu + {"船", "\x1\xb0"}, // fune + {"™", "\x1\xb1"}, // trademark +}; + +std::vector replace_info_jak1 = { + // other + {"A~Y~-21H~-5Vº~Z", "Å"}, + {"N~Y~-6Hº~Z~+10H", "Nº"}, + {"O~Y~-16H~-1V/~Z", "Ø"}, + {"A~Y~-6H~+3V,~Z", "Ą"}, + {"E~Y~-6H~+2V,~Z", "Ę"}, + {"L~Y~-16H~+0V/~Z", "Ł"}, + {"Z~Y~-21H~-5Vº~Z", "Ż"}, + {"E~Y~-20H~-5Vº~Z", "Ė"}, + {"C~Y~-20H~-4Vˇ~Z", "Č"}, + {"S~Y~-22H~-4Vˇ~Z", "Š"}, + {"Z~Y~-22H~-4Vˇ~Z", "Ž"}, + {"U~Y~-13H~+2V,~Z", "Ų"}, + {"U~Y~-18H~-10V-~Z", "Ū"}, + {"D~Y~-25H~-1V-~Z", "Đ"}, + {"I~Y~-8H~+1V,~Z", "Į"}, + // czech specific + {"U~Y~-23H~-5Vº~Z", "Ů"}, + + // tildes + {"N~Y~-22H~-4V~Z", "Ñ"}, + {"A~Y~-21H~-5V~Z", "Ã"}, // custom + {"O~Y~-22H~-4V~Z", "Õ"}, // custom + + // acute accents + {"A~Y~-21H~-5V'~Z", "Á"}, + {"E~Y~-22H~-5V'~Z", "É"}, + {"I~Y~-19H~-5V'~Z", "Í"}, + {"O~Y~-22H~-4V'~Z", "Ó"}, + {"U~Y~-24H~-3V'~Z", "Ú"}, + {"C~Y~-21H~-5V'~Z", "Ć"}, + {"N~Y~-21H~-5V'~Z", "Ń"}, + {"S~Y~-21H~-5V'~Z", "Ś"}, + {"Z~Y~-21H~-5V'~Z", "Ź"}, + // czech specific + {"Y~Y~-25H~-4V'~Z", "Ý"}, + + // double acute accents + {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, // custom + {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, // custom + + // circumflex + {"A~Y~-20H~-4V^~Z", "Â"}, // custom + {"E~Y~-20H~-5V^~Z", "Ê"}, + {"I~Y~-19H~-5V^~Z", "Î"}, + {"O~Y~-20H~-4V^~Z", "Ô"}, // custom + {"U~Y~-24H~-3V^~Z", "Û"}, + + // grave accents + {"A~Y~-21H~-5V`~Z", "À"}, + {"E~Y~-22H~-5V`~Z", "È"}, + {"I~Y~-19H~-5V`~Z", "Ì"}, + {"O~Y~-22H~-4V`~Z", "Ò"}, // custom + {"U~Y~-24H~-3V`~Z", "Ù"}, + + // umlaut + {"A~Y~-21H~-5V¨~Z", "Ä"}, + {"E~Y~-20H~-5V¨~Z", "Ë"}, + {"I~Y~-19H~-5V¨~Z", "Ï"}, // custom + {"O~Y~-22H~-4V¨~Z", "Ö"}, + {"O~Y~-22H~-3V¨~Z", "ö"}, // dumb + {"U~Y~-22H~-3V¨~Z", "Ü"}, + + // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ + {"A~Y~-20H~-4Vˇ~Z", "Ǎ"}, + {"E~Y~-20H~-5Vˇ~Z", "Ě"}, + {"G~Y~-20H~-5Vˇ~Z", "Ǧ"}, + {"I~Y~-19H~-5Vˇ~Z", "Ǐ"}, + {"O~Y~-20H~-4Vˇ~Z", "Ǒ"}, + {"U~Y~-24H~-3Vˇ~Z", "Ǔ"}, + {"Y~Y~-24H~-3Vˇ~Z", "Y̌"}, + // czech specific - Č Ň Ř Š Ž Ť + {"C~Y~-25H~-9Vˇ~Z", "Č"}, + {"N~Y~-23H~-5Vˇ~Z", "Ň"}, + {"R~Y~-24H~-5Vˇ~Z", "Ř"}, + {"S~Y~-24H~-5Vˇ~Z", "Š"}, + {"T~Y~-23H~-5Vˇ~Z", "Ť"}, + {"Z~Y~-23H~-5Vˇ~Z", "Ž"}, + + // dakuten katakana + {"~Yウ~Z゛", "ヴ"}, + {"~Yカ~Z゛", "ガ"}, + {"~Yキ~Z゛", "ギ"}, + {"~Yク~Z゛", "グ"}, + {"~Yケ~Z゛", "ゲ"}, + {"~Yコ~Z゛", "ゴ"}, + {"~Yサ~Z゛", "ザ"}, + {"~Yシ~Z゛", "ジ"}, + {"~Yス~Z゛", "ズ"}, + {"~Yセ~Z゛", "ゼ"}, + {"~Yソ~Z゛", "ゾ"}, + {"~Yタ~Z゛", "ダ"}, + {"~Yチ~Z゛", "ヂ"}, + {"~Yツ~Z゛", "ヅ"}, + {"~Yテ~Z゛", "デ"}, + {"~Yト~Z゛", "ド"}, + {"~Yハ~Z゛", "バ"}, + {"~Yヒ~Z゛", "ビ"}, + {"~Yフ~Z゛", "ブ"}, + {"~Yヘ~Z゛", "ベ"}, + {"~Yホ~Z゛", "ボ"}, + // handakuten katakana + {"~Yハ~Z゜", "パ"}, + {"~Yヒ~Z゜", "ピ"}, + {"~Yフ~Z゜", "プ"}, + {"~Yヘ~Z゜", "ペ"}, + {"~Yホ~Z゜", "ポ"}, + // dakuten hiragana + {"~Yか~Z゛", "が"}, + {"~Yき~Z゛", "ぎ"}, + {"~Yく~Z゛", "ぐ"}, + {"~Yけ~Z゛", "げ"}, + {"~Yこ~Z゛", "ご"}, + {"~Yさ~Z゛", "ざ"}, + {"~Yし~Z゛", "じ"}, + {"~Yす~Z゛", "ず"}, + {"~Yせ~Z゛", "ぜ"}, + {"~Yそ~Z゛", "ぞ"}, + {"~Yた~Z゛", "だ"}, + {"~Yち~Z゛", "ぢ"}, + {"~Yつ~Z゛", "づ"}, + {"~Yて~Z゛", "で"}, + {"~Yと~Z゛", "ど"}, + {"~Yは~Z゛", "ば"}, + {"~Yひ~Z゛", "び"}, + {"~Yふ~Z゛", "ぶ"}, + {"~Yへ~Z゛", "べ"}, + {"~Yほ~Z゛", "ぼ"}, + // handakuten hiragana + {"~Yは~Z゜", "ぱ"}, + {"~Yひ~Z゜", "ぴ"}, + {"~Yふ~Z゜", "ぷ"}, + {"~Yへ~Z゜", "ぺ"}, + {"~Yほ~Z゜", "ぽ"}, + // japanese punctuation + {",~+8H", "、"}, + {"~+8H ", " "}, + + // (hack) special case kanji + {"~~", "世"}, + + // playstation buttons + {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, // custom +}; + +std::vector encode_info_jak1_v2 = { + // random + {"_", "\x03"}, // large space + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + + {"海", "\x1a"}, // umi + {"Æ", "\x1b"}, // aesc + {"界", "\x1c"}, // kai + {"Ç", "\x1d"}, // c-cedilla + {"学", "\x1e"}, // gaku + {"ß", "\x1f"}, // eszett + + {"ワ", "\x24"}, // wa + + {"ヲ", "\x26"}, // wo + {"ン", "\x27"}, // -n + + {"岩", "\x5c"}, // iwa + {"旧", "\x5d"}, // kyuu + {"空", "\x5e"}, // sora + {"掘", "\x5f"}, // horu + + {"ヮ", "\x60"}, // -wa + {"撃", "\x61"}, // utsu + {"賢", "\x62"}, // kashikoi + {"湖", "\x63"}, // mizuumi + {"口", "\x64"}, // kuchi + {"行", "\x65"}, // iku + {"合", "\x66"}, // ai + {"士", "\x67"}, // shi + {"寺", "\x68"}, // tera + {"山", "\x69"}, // yama + {"者", "\x6a"}, // mono + {"所", "\x6b"}, // tokoro + {"書", "\x6c"}, // kaku + {"小", "\x6d"}, // shou + {"沼", "\x6e"}, // numa + {"上", "\x6f"}, // ue + {"城", "\x70"}, // shiro + {"場", "\x71"}, // ba + {"出", "\x72"}, // shutsu + {"闇", "\x73"}, // yami + {"遺", "\x74"}, // nokosu + {"黄", "\x75"}, // ki + {"屋", "\x76"}, // ya + {"下", "\x77"}, // shita + {"家", "\x78"}, // ie + {"火", "\x79"}, // hi + {"花", "\x7a"}, // hana + {"レ", "\x7b"}, // re + {"Œ", "\x7c"}, // oe + {"ロ", "\x7d"}, // ro + + {"青", "\x7f"}, // ao + + {"・", "\x90"}, // nakaguro + {"゛", "\x91"}, // dakuten + {"゜", "\x92"}, // handakuten + {"ー", "\x93"}, // chouompu + {"『", "\x94"}, // nijuukagikakko left + {"』", "\x95"}, // nijuukagikakko right + // hiragana + {"ぁ", "\x96"}, // -a + {"あ", "\x97"}, // a + {"ぃ", "\x98"}, // -i + {"い", "\x99"}, // i + {"ぅ", "\x9a"}, // -u + {"う", "\x9b"}, // u + {"ぇ", "\x9c"}, // -e + {"え", "\x9d"}, // e + {"ぉ", "\x9e"}, // -o + {"お", "\x9f"}, // o + {"か", "\xa0"}, // ka + {"き", "\xa1"}, // ki + {"く", "\xa2"}, // ku + {"け", "\xa3"}, // ke + {"こ", "\xa4"}, // ko + {"さ", "\xa5"}, // sa + {"し", "\xa6"}, // shi + {"す", "\xa7"}, // su + {"せ", "\xa8"}, // se + {"そ", "\xa9"}, // so + {"た", "\xaa"}, // ta + {"ち", "\xab"}, // chi + {"っ", "\xac"}, // sokuon + {"つ", "\xad"}, // tsu + {"て", "\xae"}, // te + {"と", "\xaf"}, // to + {"な", "\xb0"}, // na + {"に", "\xb1"}, // ni + {"ぬ", "\xb2"}, // nu + {"ね", "\xb3"}, // ne + {"の", "\xb4"}, // no + {"は", "\xb5"}, // ha + {"ひ", "\xb6"}, // hi + {"ふ", "\xb7"}, // hu + {"へ", "\xb8"}, // he + {"ほ", "\xb9"}, // ho + {"ま", "\xba"}, // ma + {"み", "\xbb"}, // mi + {"む", "\xbc"}, // mu + {"め", "\xbd"}, // me + {"も", "\xbe"}, // mo + {"ゃ", "\xbf"}, // youon ya + {"や", "\xc0"}, // ya + {"ゅ", "\xc1"}, // youon yu + {"ゆ", "\xc2"}, // yu + {"ょ", "\xc3"}, // youon yo + {"よ", "\xc4"}, // yo + {"ら", "\xc5"}, // ra + {"り", "\xc6"}, // ri + {"る", "\xc7"}, // ru + {"れ", "\xc8"}, // re + {"ろ", "\xc9"}, // ro + {"ゎ", "\xca"}, // -wa + {"わ", "\xcb"}, // wa + {"を", "\xcc"}, // wo + {"ん", "\xcd"}, // -n + // katakana + {"ァ", "\xce"}, // -a + {"ア", "\xcf"}, // a + {"ィ", "\xd0"}, // -i + {"イ", "\xd1"}, // i + {"ゥ", "\xd2"}, // -u + {"ウ", "\xd3"}, // u + {"ェ", "\xd4"}, // -e + {"エ", "\xd5"}, // e + {"ォ", "\xd6"}, // -o + {"オ", "\xd7"}, // o + {"カ", "\xd8"}, // ka + {"キ", "\xd9"}, // ki + {"ク", "\xda"}, // ku + {"ケ", "\xdb"}, // ke + {"コ", "\xdc"}, // ko + {"サ", "\xdd"}, // sa + {"シ", "\xde"}, // shi + {"ス", "\xdf"}, // su + {"セ", "\xe0"}, // se + {"ソ", "\xe1"}, // so + {"タ", "\xe2"}, // ta + {"チ", "\xe3"}, // chi + {"ッ", "\xe4"}, // sokuon + {"ツ", "\xe5"}, // tsu + {"テ", "\xe6"}, // te + {"ト", "\xe7"}, // to + {"ナ", "\xe8"}, // na + {"ニ", "\xe9"}, // ni + {"ヌ", "\xea"}, // nu + {"ネ", "\xeb"}, // ne + {"ノ", "\xec"}, // no + {"ハ", "\xed"}, // ha + {"ヒ", "\xee"}, // hi + {"フ", "\xef"}, // hu + {"ヘ", "\xf0"}, // he + {"ホ", "\xf1"}, // ho + {"マ", "\xf2"}, // ma + {"ミ", "\xf3"}, // mi + {"ム", "\xf4"}, // mu + {"メ", "\xf5"}, // me + {"モ", "\xf6"}, // mo + {"ャ", "\xf7"}, // youon ya + {"ヤ", "\xf8"}, // ya + {"ュ", "\xf9"}, // youon yu + {"ユ", "\xfa"}, // yu + {"ョ", "\xfb"}, // youon yo + {"ヨ", "\xfc"}, // yo + {"ラ", "\xfd"}, // ra + {"リ", "\xfe"}, // ri + {"ル", "\xff"}, // ru + // kanji 2 + {"宝", "\x1\x01"}, // takara + + {"石", "\x1\x10"}, // ishi + {"赤", "\x1\x11"}, // aka + {"跡", "\x1\x12"}, // ato + {"川", "\x1\x13"}, // kawa + {"戦", "\x1\x14"}, // ikusa + {"村", "\x1\x15"}, // mura + {"隊", "\x1\x16"}, // tai + {"台", "\x1\x17"}, // utena + {"長", "\x1\x18"}, // osa + {"鳥", "\x1\x19"}, // tori + {"艇", "\x1\x1a"}, // tei + {"洞", "\x1\x1b"}, // hora + {"道", "\x1\x1c"}, // michi + {"発", "\x1\x1d"}, // hatsu + {"飛", "\x1\x1e"}, // tobu + {"噴", "\x1\x1f"}, // fuku + + {"池", "\x1\xa0"}, // ike + {"中", "\x1\xa1"}, // naka + {"塔", "\x1\xa2"}, // tou + {"島", "\x1\xa3"}, // shima + {"部", "\x1\xa4"}, // bu + {"砲", "\x1\xa5"}, // hou + {"産", "\x1\xa6"}, // san + {"眷", "\x1\xa7"}, // kaerimiru + {"力", "\x1\xa8"}, // chikara + {"緑", "\x1\xa9"}, // midori + {"岸", "\x1\xaa"}, // kishi + {"像", "\x1\xab"}, // zou + {"谷", "\x1\xac"}, // tani + {"心", "\x1\xad"}, // kokoro + {"森", "\x1\xae"}, // mori + {"水", "\x1\xaf"}, // mizu + {"船", "\x1\xb0"}, // fune + {"™", "\x1\xb1"}, // trademark +}; + +GameTextFontBank g_font_bank_jak1_v1(GameTextVersion::JAK1_V1, + &encode_info_jak1, + &replace_info_jak1, + &passthrus_jak1); + +GameTextFontBank g_font_bank_jak1_v2(GameTextVersion::JAK1_V2, + &encode_info_jak1_v2, + &replace_info_jak1, + &passthrus_jak1); diff --git a/common/util/font/dbs/font_db_jak1.h b/common/util/font/dbs/font_db_jak1.h new file mode 100644 index 0000000000..e28b83b696 --- /dev/null +++ b/common/util/font/dbs/font_db_jak1.h @@ -0,0 +1,25 @@ +#pragma once + +#include "common/util/font/font_utils.h" + +/*! + * =========================== + * GAME TEXT FONT BANK - JAK 1 + * =========================== + * This font is used in: + * - Jak & Daxter: The Precursor Legacy (Black Label) + */ + +extern GameTextFontBank g_font_bank_jak1_v1; +/*! + * ================================ + * GAME TEXT FONT BANK - JAK 1 (v2) + * ================================ + * This font is used in: + * - Jak & Daxter: The Precursor Legacy (PAL) + * - ジャックXダクスター ~ 旧世界の遺産 + * - Jak & Daxter: The Precursor Legacy (NTSC-U v2) + * + * It is the same as v1, but _ has been fixed and no longer overlaps 掘 + */ +extern GameTextFontBank g_font_bank_jak1_v2; diff --git a/common/util/font/dbs/font_db_jak2.cpp b/common/util/font/dbs/font_db_jak2.cpp new file mode 100644 index 0000000000..a25b90464d --- /dev/null +++ b/common/util/font/dbs/font_db_jak2.cpp @@ -0,0 +1,866 @@ +#include "font_db_jak2.h" + +std::unordered_set passthrus_jak2 = {'~', ' ', ',', '.', '-', '+', '(', ')', + '!', ':', '?', '=', '%', '*', '/', '#', + ';', '<', '>', '@', '[', '_', ']'}; + +std::vector replace_info_jak2 = { + // other + {"A~Y~-21H~-5Vº~Z", "Å"}, + {"N~Y~-6Hº~Z~+10H", "Nº"}, + {"~+4Vç~-4V", ",c"}, + + // added for translations TODO - check these for jak 2 + {"O~Y~-25H~-1V/~Z", "Ø"}, + {"o~Y~-23H~+4V/~Z", "ø"}, + {"A~Y~-13H~+8V,~Z", "Ą"}, + {"a~Y~-8H~+6V,~Z", "ą"}, + {"E~Y~-6H~+8V,~Z", "Ę"}, + {"e~Y~-10H~+7V,~Z", "ę"}, + {"L~Y~-21H~+0V/~Z", "Ł"}, + {"l~Y~-16H~+0V/~Z", "ł"}, // TODO - this one is ugly, font character addition (small slash) + {"Z~Y~-25H~-11Vº~Z", "Ż"}, + {"z~Y~-23H~-5Vº~Z", "ż"}, + {"a~Y~-25H~-5Vº~Z", "å"}, + {"S~Y~-21H~-5V'~Z", "Ś"}, + {"s~Y~-25H~-5V'~Z", "ś"}, + {"n~Y~-25H~-5V'~Z", "ń"}, + {"c~Y~-25H~-5V'~Z", "ć"}, + {"o~Y~-24H~-4V~Z", "õ"}, + {"a~Y~-24H~-4V~Z", "ã"}, + {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, + {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, + {"o~Y~-28H~-4V'~-9H'~Z", "ő"}, + {"u~Y~-28H~-4V'~-9H'~Z", "ű"}, + {"E~Y~-22H~-11Vº~Z", "Ė"}, + {"e~Y~-25H~-5Vº~Z", "ė"}, + {"C~Y~-27H~-10Vˇ~Z", "Č"}, + {"c~Y~-25H~-5Vˇ~Z", "č"}, + {"S~Y~-24H~-10Vˇ~Z", "Š"}, + {"s~Y~-22H~-4Vˇ~Z", "š"}, + {"Z~Y~-25H~-10Vˇ~Z", "Ž"}, + {"z~Y~-23H~-4Vˇ~Z", "ž"}, + {"U~Y~-15H~+5V,~Z", "Ų"}, + {"u~Y~-15H~+5V,~Z", "ų"}, + {"U~Y~-20H~-18V-~Z", "Ū"}, + {"u~Y~-18H~-15V-~Z", "ū"}, + {"D~Y~-28H~-1V-~Z", "Đ"}, + {"d~Y~-13H~-10V-~Z", "đ"}, + {"I~Y~-8H~+4V,~Z", "Į"}, + {"i~Y~-8H~+4V,~Z", "į"}, + // czech specific + {"U~Y~-24H~-7Vº~Z", "Ů"}, + {"u~Y~-23H~-5Vº~Z", "ů"}, + {"t~Y~-7H~-21V,~Z", "ť"}, + + // tildes + {"N~Y~-22H~-4V~Z", "Ñ"}, + {"n~Y~-24H~-4V~Z", "ñ"}, + {"A~Y~-21H~-5V~Z", "Ã"}, + {"O~Y~-22H~-4V~Z", "Õ"}, + + // acute accents + {"A~Y~-21H~-5V'~Z", "Á"}, + {"A~Y~-26H~-8V'~Z", "<Á_V2>"}, // unfortunate... + {"a~Y~-25H~-5V'~Z", "á"}, + {"E~Y~-23H~-9V'~Z", "É"}, + {"e~Y~-26H~-5V'~Z", "é"}, + {"I~Y~-19H~-5V'~Z", "Í"}, + {"i~Y~-19H~-8V'~Z", "í"}, + {"O~Y~-22H~-4V'~Z", "Ó"}, + {"o~Y~-26H~-4V'~Z", "ó"}, + {"U~Y~-24H~-3V'~Z", "Ú"}, + {"u~Y~-24H~-3V'~Z", "ú"}, + {"Z~Y~-24H~-3V'~Z", "Ź"}, + {"z~Y~-24H~-3V'~Z", "ź"}, + // czech specific + {"Y~Y~-26H~-5V'~Z", "Ý"}, + {"~+7Vy~-7V~Y~-24H~-3V'~Z", "ý"}, + + // circumflex + {"A~Y~-20H~-4V^~Z", "Â"}, + {"a~Y~-24H~-5V^~Z", "â"}, + {"E~Y~-20H~-5V^~Z", "Ê"}, + {"e~Y~-25H~-4V^~Z", "ê"}, + {"I~Y~-19H~-5V^~Z", "Î"}, + {"i~Y~-19H~-8V^~Z", "î"}, + {"O~Y~-20H~-4V^~Z", "Ô"}, + {"o~Y~-25H~-4V^~Z", "ô"}, + {"U~Y~-24H~-3V^~Z", "Û"}, + {"u~Y~-23H~-3V^~Z", "û"}, + + // grave accents + {"A~Y~-26H~-8V`~Z", "À"}, + {"a~Y~-25H~-5V`~Z", "à"}, + {"E~Y~-23H~-9V`~Z", "È"}, + {"e~Y~-26H~-5V`~Z", "è"}, + {"I~Y~-19H~-5V`~Z", "Ì"}, + {"i~Y~-19H~-8V`~Z", "ì"}, + {"O~Y~-22H~-4V`~Z", "Ò"}, + {"o~Y~-26H~-4V`~Z", "ò"}, + {"U~Y~-24H~-3V`~Z", "Ù"}, + {"u~Y~-24H~-3V`~Z", "ù"}, + + // umlaut + {"A~Y~-26H~-8V¨~Z", "Ä"}, + {"a~Y~-25H~-5V¨~Z", "ä"}, + {"E~Y~-20H~-5V¨~Z", "Ë"}, + {"e~Y~-25H~-5V¨~Z", "ë"}, + {"I~Y~-19H~-5V¨~Z", "Ï"}, + {"i~Y~-26H~-4V¨~Z", "ï"}, + {"O~Y~-26H~-8V¨~Z", "Ö"}, + {"o~Y~-26H~-4V¨~Z", "ö"}, + {"U~Y~-25H~-8V¨~Z", "Ü"}, + {"u~Y~-24H~-3V¨~Z", "ü"}, + + // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ + {"A~Y~-25H~-9Vˇ~Z", "Ǎ"}, + {"a~Y~-24H~-5Vˇ~Z", "ǎ"}, + {"E~Y~-22H~-8Vˇ~Z", "Ě"}, + {"e~Y~-25H~-4Vˇ~Z", "ě"}, + {"G~Y~-24H~-8Vˇ~Z", "Ǧ"}, + {"~+7Vg~-7V~Y~-25H~-4Vˇ~Z", "ǧ"}, + {"I~Y~-19H~-8Vˇ~Z", "Ǐ"}, + {"i~Y~-19H~-8Vˇ~Z", "ǐ"}, + {"O~Y~-25H~-7Vˇ~Z", "Ǒ"}, + {"o~Y~-25H~-4Vˇ~Z", "ǒ"}, + {"U~Y~-25H~-6Vˇ~Z", "Ǔ"}, + {"u~Y~-24H~-3Vˇ~Z", "ǔ"}, + {"Y~Y~-25H~-5Vˇ~Z", "Y̌"}, + {"~+7Vy~-7V~Y~-25H~-3Vˇ~Z", "y̌"}, + // czech specific - Č č Ň ň Ř ř Š š Ž ž Ť + {"C~Y~-25H~-9Vˇ~Z", "Č"}, + {"c~Y~-24H~-5Vˇ~Z", "č"}, + {"N~Y~-25H~-9Vˇ~Z", "Ň"}, + {"n~Y~-24H~-5Vˇ~Z", "ň"}, + {"R~Y~-25H~-9Vˇ~Z", "Ř"}, + {"r~Y~-22H~-5Vˇ~Z", "ř"}, + {"S~Y~-25H~-9Vˇ~Z", "Š"}, + {"s~Y~-22H~-5Vˇ~Z", "š"}, + {"T~Y~-24H~-7Vˇ~Z", "Ť"}, + {"Z~Y~-25H~-9Vˇ~Z", "Ž"}, + {"z~Y~-24H~-5Vˇ~Z", "ž"}, + + // dakuten katakana + {"~Yウ~Z゛", "ヴ"}, + {"~Yカ~Z゛", "ガ"}, + {"~Yキ~Z゛", "ギ"}, + {"~Yク~Z゛", "グ"}, + {"~Yケ~Z゛", "ゲ"}, + {"~Yコ~Z゛", "ゴ"}, + {"~Yサ~Z゛", "ザ"}, + {"~Yシ~Z゛", "ジ"}, + {"~Yス~Z゛", "ズ"}, + {"~Yセ~Z゛", "ゼ"}, + {"~Yソ~Z゛", "ゾ"}, + {"~Yタ~Z゛", "ダ"}, + {"~Yチ~Z゛", "ヂ"}, + {"~Yツ~Z゛", "ヅ"}, + {"~Yテ~Z゛", "デ"}, + {"~Yト~Z゛", "ド"}, + {"~Yハ~Z゛", "バ"}, + {"~Yヒ~Z゛", "ビ"}, + {"~Yフ~Z゛", "ブ"}, + {"~Yヘ~Z゛", "ベ"}, + {"~Yホ~Z゛", "ボ"}, + // handakuten katakana + {"~Yハ~Z゜", "パ"}, + {"~Yヒ~Z゜", "ピ"}, + {"~Yフ~Z゜", "プ"}, + {"~Yヘ~Z゜", "ペ"}, + {"~Yホ~Z゜", "ポ"}, + // dakuten hiragana + {"~Yか~Z゛", "が"}, + {"~Yき~Z゛", "ぎ"}, + {"~Yく~Z゛", "ぐ"}, + {"~Yけ~Z゛", "げ"}, + {"~Yこ~Z゛", "ご"}, + {"~Yさ~Z゛", "ざ"}, + {"~Yし~Z゛", "じ"}, + {"~Yす~Z゛", "ず"}, + {"~Yせ~Z゛", "ぜ"}, + {"~Yそ~Z゛", "ぞ"}, + {"~Yた~Z゛", "だ"}, + {"~Yち~Z゛", "ぢ"}, + {"~Yつ~Z゛", "づ"}, + {"~Yて~Z゛", "で"}, + {"~Yと~Z゛", "ど"}, + {"~Yは~Z゛", "ば"}, + {"~Yひ~Z゛", "び"}, + {"~Yふ~Z゛", "ぶ"}, + {"~Yへ~Z゛", "べ"}, + {"~Yほ~Z゛", "ぼ"}, + // handakuten hiragana + {"~Yは~Z゜", "ぱ"}, + {"~Yひ~Z゜", "ぴ"}, + {"~Yふ~Z゜", "ぷ"}, + {"~Yへ~Z゜", "ぺ"}, + {"~Yほ~Z゜", "ぽ"}, + // japanese punctuation + {",~+8H", "、"}, + {"~+8H ", " "}, + + // playstation buttons + // - face + {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + // - dpad + {"~Y~22L~Z~3L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~3L~+17H~-13V~Z~3L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~22L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + // - shoulder + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+4H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+6H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + // - analog + {"~1L~+8H~Y~Z~6L~-16H~Z~+16h~6L~Z~" + "6L~-15V~Z~+13V~6L~Z~-10H~+9V~6L~Z~+10H~+9V~6L~Z~-10H~-11V~6L~Z~+10H~" + "-11V~6L~Z~+32H", + ""}, + {"~Y~1L~+8H~Z~6L~-8H~Z~+24H~6L~Z~+" + "40H", + ""}, + {"~Y~1L~Z~6L~-15V~Z~+13V~6L~Z~+26H", + ""}, + + // icons + {"~Y~6L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~3L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + + // flags + {"~Y~6L~Z~+15H~1L~Z~+30H~3L~Z~+45H", + ""}, + {"~Y~5L~Z~3L~]~-1H~Y~5L~Z~3L~Z~+26H", + ""}, + {"~Y~39L~~~Z~3L~Z~5L~]~-1H~Y~39L~~~" + "Z~3L~Z~5L~Z~+26H", + ""}, + {"~Y~7L~Z~+15H~1L~Z~+30H~3L~Z~+47H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~7L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~+26H", + ""}, + {"~Y~1L~Z~39L~]~-1H~Y~1L~Z~39L<" + "FLAG_PART_KOREA_TRIGRAMS_RIGHT>~Z~-11H~7L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~]~-1H~Y~1L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~Z~7L~Z~7L~]" + "~-1H~Y~1L~Z~7L~Z~+26H", + ""}, + {"~Y~7L~Z~5L~Z~5L~]" + "~-1H~Y~7L~Z~5L~Z~+26H", + ""}, + {"~Y~3L~Z~1L~Z~1L~]" + "~-1H~Y~3L~Z~1L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~]~-1H~Y~1L~Z~3L~Z~-19H~1L~Z~-23H~7L~Z~-23H~7L~Z~7L~Z~" + "+26H", + ""}, + {"~Y~1L~Z~7L~]~-1H~Y~1L~Z~7L~Z~-19H~1L~Z~-23H~3L~Z~-23H~3L~Z~3L~Z~" + "+26H", + ""}, + + // korean jamo -- only relevant for the language selection since + // non-korean languages don't run through the `convert-korean-text` function and hence the + // encoding is "normal" + {"~Y~Z\\c03.~Z\\c03\\c1a~Z\\c03\\cc8~Y~Z\\c03œ~Z\\c03k~Z\\c03\\cde~Y~Z\\c03\\c0f~Z\\c03ç", + "", + "~Y~Z\x03.~Z\x03\x1a~Z\x03\xc8~Y~Z\x03œ~Z\x03k~Z\x03\xde~Y~Z\x03\x0f~Z\x03ç"}, + + // weird stuff + // - descenders + {"~+7Vp~-7V", "p"}, + {"~+7Vy~-7V", "y"}, + {"~+7Vg~-7V", "g"}, + {"~+7Vq~-7V", "q"}, + {"~+1Vj~-1V", "j"}, + + {"\\\\", + "~%"}, // this is 2 slashes, duplicated because we use an escape sequence when decompiling + + // - symbols and ligatures + {"~-4H~-3V~+3V~-4H", + ""}, // used for the 4<__> place in spanish. the 5th uses the same + // character but looks different...? + {"~Y~-6Hº~Z~+10H", "°"}, + + // Color / Emphasis + {"~[~0L", ""}, + {"~[~1L", ""}, + {"~[~2L", ""}, + {"~[~3L", ""}, + {"~[~4L", ""}, + {"~[~5L", ""}, + {"~[~6L", ""}, + {"~[~7L", ""}, + {"~[~8L", ""}, + {"~[~9L", ""}, + {"~[~10L", ""}, + {"~[~11L", ""}, + {"~[~12L", ""}, + {"~[~13L", ""}, + {"~[~14L", ""}, + {"~[~15L", ""}, + {"~[~16L", ""}, + {"~[~17L", ""}, + {"~[~18L", ""}, + {"~[~19L", ""}, + {"~[~20L", ""}, + {"~[~21L", ""}, + {"~[~22L", ""}, + {"~[~23L", ""}, + {"~[~24L", ""}, + {"~[~25L", ""}, + {"~[~26L", ""}, + {"~[~27L", ""}, + {"~[~28L", ""}, + {"~[~29L", ""}, + {"~[~30L", ""}, + {"~[~31L", ""}, + {"~[~32L", ""}, + {"~[~33L", ""}, + {"~[~34L", ""}, + {"~[~35L", ""}, + {"~[~36L", ""}, + {"~[~37L", ""}, + {"~[~38L", ""}, + {"~[~39L", ""}}; + +std::vector encode_info_jak2 = { + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + {"", "\x19"}, + {"ç", "\x1d"}, // c-cedilla + {"Ç", "\x1e"}, // c-cedilla + {"ß", "\x1f"}, // eszett + + {"œ", "\x5e"}, // ligature o+e + + {"", "\x7f"}, + {"", "\x80"}, + {"", "\x81"}, + {"", "\x82"}, + {"", "\x83"}, + {"", "\x84"}, + {"", "\x85"}, + {"", "\x86"}, + {"", "\x87"}, + {"", "\x88"}, + {"", "\x89"}, + {"", "\x8a"}, + {"", "\x8b"}, + {"", "\x8c"}, + {"", "\x8d"}, + {"", "\x8e"}, + {"", "\x8f"}, + {"", "\x90"}, + {"", "\x91"}, + {"", "\x92"}, + {"", "\x93"}, + {"", "\x94"}, + {"", "\x95"}, + {"", "\x96"}, + {"", "\x97"}, + {"", "\x98"}, + {"", "\x99"}, + {"", "\x9a"}, + {"", "\x9b"}, + {"", "\x9c"}, + {"", "\x9d"}, + {"", "\x9e"}, + {"", "\x9f"}, + {"", "\xa0"}, + {"", "\xa1"}, + {"", "\xa2"}, + {"", "\xa3"}, + {"", "\xa4"}, + {"", "\xa5"}, + {"", "\xa6"}, + {"", "\xa7"}, + {"", "\xa8"}, + {"", "\xa9"}, + {"", "\xaa"}, + {"", "\xab"}, + {"", "\xac"}, + + {"", "\xb0"}, + {"", "\xb1"}, + {"", "\xb2"}, + {"", "\xb3"}, + // {"入", "\x1\x00"}}, + // {"年", "\x1\x01"}}, + // punctuation + {"・", "\x1\x10"}, + {"゛", "\x1\x11"}, + {"゜", "\x1\x12"}, + {"ー", "\x1\x13"}, + {"『", "\x1\x14"}, + {"』", "\x1\x15"}, + // hiragana + {"ぁ", "\x1\x16"}, // -a + {"あ", "\x1\x17"}, // a + {"ぃ", "\x1\x18"}, // -i + {"い", "\x1\x19"}, // i + {"ぅ", "\x1\x1a"}, // -u + {"う", "\x1\x1b"}, // u + {"ぇ", "\x1\x1c"}, // -e + {"え", "\x1\x1d"}, // e + {"ぉ", "\x1\x1e"}, // -o + {"お", "\x1\x1f"}, // o + {"か", "\x1\x20"}, // ka + {"き", "\x1\x21"}, // ki + {"く", "\x1\x22"}, // ku + {"け", "\x1\x23"}, // ke + {"こ", "\x1\x24"}, // ko + {"さ", "\x1\x25"}, // sa + {"し", "\x1\x26"}, // shi + {"す", "\x1\x27"}, // su + {"せ", "\x1\x28"}, // se + {"そ", "\x1\x29"}, // so + {"た", "\x1\x2a"}, // ta + {"ち", "\x1\x2b"}, // chi + {"っ", "\x1\x2c"}, // sokuon + {"つ", "\x1\x2d"}, // tsu + {"て", "\x1\x2e"}, // te + {"と", "\x1\x2f"}, // to + {"な", "\x1\x30"}, // na + {"に", "\x1\x31"}, // ni + {"ぬ", "\x1\x32"}, // nu + {"ね", "\x1\x33"}, // ne + {"の", "\x1\x34"}, // no + {"は", "\x1\x35"}, // ha + {"ひ", "\x1\x36"}, // hi + {"ふ", "\x1\x37"}, // fu + {"へ", "\x1\x38"}, // he + {"ほ", "\x1\x39"}, // ho + {"ま", "\x1\x3a"}, // ma + {"み", "\x1\x3b"}, // mi + {"む", "\x1\x3c"}, // mu + {"め", "\x1\x3d"}, // me + {"も", "\x1\x3e"}, // mo + {"ゃ", "\x1\x3f"}, // youon ya + {"や", "\x1\x40"}, // ya + {"ゅ", "\x1\x41"}, // youon yu + {"ゆ", "\x1\x42"}, // yu + {"ょ", "\x1\x43"}, // youon yo + {"よ", "\x1\x44"}, // yo + {"ら", "\x1\x45"}, // ra + {"り", "\x1\x46"}, // ri + {"る", "\x1\x47"}, // ru + {"れ", "\x1\x48"}, // re + {"ろ", "\x1\x49"}, // ro + {"ゎ", "\x1\x4a"}, // -wa + {"わ", "\x1\x4b"}, // wa + {"を", "\x1\x4c"}, // wo + {"ん", "\x1\x4d"}, // -n + // katakana + {"ァ", "\x1\x4e"}, // -a + {"ア", "\x1\x4f"}, // a + {"ィ", "\x1\x50"}, // -i + {"イ", "\x1\x51"}, // i + {"ゥ", "\x1\x52"}, // -u + {"ウ", "\x1\x53"}, // u + {"ェ", "\x1\x54"}, // -e + {"エ", "\x1\x55"}, // e + {"ォ", "\x1\x56"}, // -o + {"オ", "\x1\x57"}, // o + {"カ", "\x1\x58"}, // ka + {"キ", "\x1\x59"}, // ki + {"ク", "\x1\x5a"}, // ku + {"ケ", "\x1\x5b"}, // ke + {"コ", "\x1\x5c"}, // ko + {"サ", "\x1\x5d"}, // sa + {"シ", "\x1\x5e"}, // shi + {"ス", "\x1\x5f"}, // su + {"セ", "\x1\x60"}, // se + {"ソ", "\x1\x61"}, // so + {"タ", "\x1\x62"}, // ta + {"チ", "\x1\x63"}, // chi + {"ッ", "\x1\x64"}, // sokuon + {"ツ", "\x1\x65"}, // tsu + {"テ", "\x1\x66"}, // te + {"ト", "\x1\x67"}, // to + {"ナ", "\x1\x68"}, // na + {"ニ", "\x1\x69"}, // ni + {"ヌ", "\x1\x6a"}, // nu + {"ネ", "\x1\x6b"}, // ne + {"ノ", "\x1\x6c"}, // no + {"ハ", "\x1\x6d"}, // ha + {"ヒ", "\x1\x6e"}, // hi + {"フ", "\x1\x6f"}, // fu + {"ヘ", "\x1\x70"}, // he + {"ホ", "\x1\x71"}, // ho + {"マ", "\x1\x72"}, // ma + {"ミ", "\x1\x73"}, // mi + {"ム", "\x1\x74"}, // mu + {"メ", "\x1\x75"}, // me + {"モ", "\x1\x76"}, // mo + {"ャ", "\x1\x77"}, // youon ya + {"ヤ", "\x1\x78"}, // ya + {"ュ", "\x1\x79"}, // youon yu + {"ユ", "\x1\x7a"}, // yu + {"ョ", "\x1\x7b"}, // youon yo + {"ヨ", "\x1\x7c"}, // yo + {"ラ", "\x1\x7d"}, // ra + {"リ", "\x1\x7e"}, // ri + {"ル", "\x1\x7f"}, // ru + {"レ", "\x1\x80"}, // re + {"ロ", "\x1\x81"}, // ro + {"ヮ", "\x1\x82"}, // -wa + {"ワ", "\x1\x83"}, // wa + {"ヲ", "\x1\x84"}, // wo + {"ン", "\x1\x85"}, // -n + + {"位", "\x1\x8c"}, + {"遺", "\x1\x8d"}, + {"院", "\x1\x8e"}, + {"映", "\x1\x8f"}, + {"衛", "\x1\x90"}, + {"応", "\x1\x91"}, + {"下", "\x1\x92"}, + {"画", "\x1\x93"}, + {"解", "\x1\x94"}, + {"開", "\x1\x95"}, + {"外", "\x1\x96"}, + {"害", "\x1\x97"}, + {"蓋", "\x1\x98"}, + {"完", "\x1\x99"}, + {"換", "\x1\x9a"}, + {"監", "\x1\x9b"}, + {"間", "\x1\x9c"}, + {"器", "\x1\x9d"}, + {"記", "\x1\x9e"}, + {"逆", "\x1\x9f"}, + {"救", "\x1\xa0"}, + {"金", "\x1\xa1"}, + {"空", "\x1\xa2"}, + {"掘", "\x1\xa3"}, + {"警", "\x1\xa4"}, + {"迎", "\x1\xa5"}, + {"撃", "\x1\xa6"}, + {"建", "\x1\xa7"}, + {"源", "\x1\xa8"}, + {"現", "\x1\xa9"}, + {"言", "\x1\xaa"}, + {"限", "\x1\xab"}, + {"個", "\x1\xac"}, + {"庫", "\x1\xad"}, + {"後", "\x1\xae"}, + {"語", "\x1\xaf"}, + {"護", "\x1\xb0"}, + {"交", "\x1\xb1"}, + {"功", "\x1\xb2"}, + {"向", "\x1\xb3"}, + {"工", "\x1\xb4"}, + {"攻", "\x1\xb5"}, + {"溝", "\x1\xb6"}, + {"行", "\x1\xb7"}, + {"鉱", "\x1\xb8"}, + {"降", "\x1\xb9"}, + {"合", "\x1\xba"}, + {"告", "\x1\xbb"}, + {"獄", "\x1\xbc"}, + {"彩", "\x1\xbd"}, + {"作", "\x1\xbe"}, + {"山", "\x1\xbf"}, + {"使", "\x1\xc0"}, + {"始", "\x1\xc1"}, + {"試", "\x1\xc2"}, + {"字", "\x1\xc3"}, + {"寺", "\x1\xc4"}, + {"時", "\x1\xc5"}, + {"示", "\x1\xc6"}, + {"自", "\x1\xc7"}, + {"式", "\x1\xc8"}, + {"矢", "\x1\xc9"}, + {"射", "\x1\xca"}, + {"者", "\x1\xcb"}, + {"守", "\x1\xcc"}, + {"手", "\x1\xcd"}, + {"終", "\x1\xce"}, + {"週", "\x1\xcf"}, + {"出", "\x1\xd0"}, + {"所", "\x1\xd1"}, + {"書", "\x1\xd2"}, + {"勝", "\x1\xd3"}, + {"章", "\x1\xd4"}, + {"上", "\x1\xd5"}, + {"乗", "\x1\xd6"}, + {"場", "\x1\xd7"}, + {"森", "\x1\xd8"}, + {"進", "\x1\xd9"}, + {"人", "\x1\xda"}, + {"水", "\x1\xdb"}, + {"数", "\x1\xdc"}, + {"制", "\x1\xdd"}, + {"性", "\x1\xde"}, + {"成", "\x1\xdf"}, + {"聖", "\x1\xe0"}, + {"石", "\x1\xe1"}, + {"跡", "\x1\xe2"}, + {"先", "\x1\xe3"}, + {"戦", "\x1\xe4"}, + {"船", "\x1\xe5"}, + {"選", "\x1\xe6"}, + {"走", "\x1\xe7"}, + {"送", "\x1\xe8"}, + {"像", "\x1\xe9"}, + {"造", "\x1\xea"}, + {"続", "\x1\xeb"}, + {"対", "\x1\xec"}, + {"袋", "\x1\xed"}, + {"台", "\x1\xee"}, + {"弾", "\x1\xef"}, + {"地", "\x1\xf0"}, + {"中", "\x1\xf1"}, + {"敵", "\x1\xf2"}, + {"転", "\x1\xf3"}, + {"電", "\x1\xf4"}, + {"塔", "\x1\xf5"}, + {"頭", "\x1\xf6"}, + {"動", "\x1\xf7"}, + {"内", "\x1\xf8"}, + {"日", "\x1\xf9"}, + {"入", "\x1\xfa"}, + {"年", "\x1\xfb"}, + {"能", "\x1\xfc"}, + {"廃", "\x1\xfd"}, + {"排", "\x1\xfe"}, + {"敗", "\x1\xff"}, + + {"発", "\x2\x10"}, + {"反", "\x2\x11"}, + {"必", "\x2\x12"}, + {"表", "\x2\x13"}, + {"武", "\x2\x14"}, + {"壁", "\x2\x15"}, + {"墓", "\x2\x16"}, + {"放", "\x2\x17"}, + {"方", "\x2\x18"}, + {"砲", "\x2\x19"}, + {"妨", "\x2\x1a"}, + {"北", "\x2\x1b"}, + {"本", "\x2\x1c"}, + {"幕", "\x2\x1d"}, + {"無", "\x2\x1e"}, + {"迷", "\x2\x1f"}, + {"面", "\x2\x20"}, + {"戻", "\x2\x21"}, + {"紋", "\x2\x22"}, + {"薬", "\x2\x23"}, + {"輸", "\x2\x24"}, + {"勇", "\x2\x25"}, + {"友", "\x2\x26"}, + {"遊", "\x2\x27"}, + {"容", "\x2\x28"}, + {"要", "\x2\x29"}, + {"利", "\x2\x2a"}, + {"了", "\x2\x2b"}, + {"量", "\x2\x2c"}, + {"力", "\x2\x2d"}, + {"練", "\x2\x2e"}, + {"連", "\x2\x2f"}, + {"録", "\x2\x30"}, + {"話", "\x2\x31"}, + {"墟", "\x2\x32"}, + {"脱", "\x2\x33"}, + // {"成", "\x2\x34"}, + {"旗", "\x2\x35"}, + {"破", "\x2\x36"}, + {"壊", "\x2\x37"}, + {"全", "\x2\x38"}, + {"滅", "\x2\x39"}, + {"機", "\x2\x3a"}, + {"仲", "\x2\x3b"}, + {"渓", "\x2\x3c"}, + {"谷", "\x2\x3d"}, + {"優", "\x2\x3e"}, + {"探", "\x2\x3f"}, + {"部", "\x2\x40"}, + {"索", "\x2\x41"}, + // {"乗", "\x2\x42"}, + {"前", "\x2\x43"}, + {"右", "\x2\x44"}, + {"左", "\x2\x45"}, + {"会", "\x2\x46"}, + {"高", "\x2\x47"}, + {"低", "\x2\x48"}, + {"押", "\x2\x49"}, + {"切", "\x2\x4a"}, + {"替", "\x2\x4b"}, + // {"対", "\x2\x4c"}, + {"秒", "\x2\x4d"}, + {"箱", "\x2\x4e"}, + {"泳", "\x2\x4f"}, + {"~", "\x2\x50"}, + + {"闇", "\x2\x56"}, + {"以", "\x2\x57"}, + {"屋", "\x2\x58"}, + {"俺", "\x2\x59"}, + {"化", "\x2\x5a"}, + {"界", "\x2\x5b"}, + {"感", "\x2\x5c"}, + {"気", "\x2\x5d"}, + {"却", "\x2\x5e"}, + {"曲", "\x2\x5f"}, + {"継", "\x2\x60"}, + {"権", "\x2\x61"}, + {"見", "\x2\x62"}, + {"古", "\x2\x63"}, + {"好", "\x2\x64"}, + // {"高", "\x2\x65"}, + {"才", "\x2\x66"}, + {"士", "\x2\x67"}, + {"子", "\x2\x68"}, + {"次", "\x2\x69"}, + {"主", "\x2\x6a"}, + {"種", "\x2\x6b"}, + {"讐", "\x2\x6c"}, + {"女", "\x2\x6d"}, + {"小", "\x2\x6e"}, + {"焼", "\x2\x6f"}, + {"証", "\x2\x70"}, + {"神", "\x2\x71"}, + {"身", "\x2\x72"}, + {"寸", "\x2\x73"}, + {"世", "\x2\x74"}, + {"想", "\x2\x75"}, + {"退", "\x2\x76"}, + {"第", "\x2\x77"}, + {"着", "\x2\x78"}, + {"天", "\x2\x79"}, + {"倒", "\x2\x7a"}, + {"到", "\x2\x7b"}, + {"突", "\x2\x7c"}, + {"爆", "\x2\x7d"}, + {"番", "\x2\x7e"}, + {"負", "\x2\x7f"}, + {"復", "\x2\x80"}, + {"物", "\x2\x81"}, + {"眠", "\x2\x82"}, + {"予", "\x2\x83"}, + {"用", "\x2\x84"}, + {"落", "\x2\x85"}, + {"緑", "\x2\x86"}, + + {"封", "\x2\x88"}, + {"印", "\x2\x89"}, + {"扉", "\x2\x8a"}, + {"最", "\x2\x8b"}, + {"刻", "\x2\x8c"}, + {"足", "\x2\x8d"}, +}; + +std::unordered_map> jamo_glyph_mappings_jak2 = { + {"0x06", {"ᄀ"}}, {"0x07", {"ᄁ"}}, {"0x08", {"ᄂ"}}, {"0x09", {"ᄃ"}}, + {"0x0a", {"ᄄ"}}, {"0x0b", {"ᄅ"}}, {"0x0c", {"ᄆ"}}, {"0x0d", {"ᄇ"}}, + {"0x0e", {"ᄈ"}}, {"0x0f", {"ᄋ"}}, {"0x10", {"ᄌ"}}, {"0x11", {"ᄍ"}}, + {"0x12", {"ᄏ"}}, {"0x13", {"ᄐ"}}, {"0x14", {"ᄑ"}}, {"0x15", {"ᅡ"}}, + {"0x16", {"ᅣ"}}, {"0x17", {"ᅵ"}}, {"0x18", {"ᅥ"}}, {"0x19", {"ᅧ"}}, + {"0x1a", {"ᅡ"}}, {"0x1b", {"ᅣ"}}, {"0x1c", {"ᅵ"}}, {"0x1d", {"ᅥ"}}, + {"0x1e", {"ᅧ"}}, {"0x1f", {"ᄂ"}}, {"0x20", {"ᄉ"}}, {"0x21", {"ᄊ"}}, + {"0x22", {"ᅥ"}}, {"0x23", {"ᅧ"}}, {"0x24", {"ᅥ"}}, {"0x25", {"ᅧ"}}, + {"0x26", {"ᄃ"}}, {"0x27", {"ᄄ"}}, {"0x28", {"ᄅ"}}, {"0x29", {"ᄐ"}}, + {"0x2a", {"ᄑ"}}, {"0x2b", {"ᅧ"}}, {"0x2c", {"ᅧ"}}, {"0x2d", {"ᄎ"}}, + {"0x2e", {"ᄒ"}}, {"0x2f", {"ᅥ"}}, {"0x30", {"ᅧ"}}, {"0x31", {"ᅥ"}}, + {"0x32", {"ᅧ"}}, {"0x33", {"ᄀ"}}, {"0x34", {"ᄁ"}}, {"0x35", {"ᄂ"}}, + {"0x36", {"ᄃ"}}, {"0x37", {"ᄄ"}}, {"0x38", {"ᄅ"}}, {"0x39", {"ᄆ"}}, + {"0x3a", {"ᄇ"}}, {"0x3b", {"ᄈ"}}, {"0x3c", {"ᄋ"}}, {"0x3d", {"ᄌ"}}, + {"0x3e", {"ᄍ"}}, {"0x3f", {"ᄏ"}}, {"0x40", {"ᄐ"}}, {"0x41", {"ᄑ"}}, + {"0x42", {"ᅢ"}}, {"0x43", {"ᅤ"}}, {"0x44", {"ᅦ"}}, {"0x45", {"ᅨ"}}, + {"0x46", {"ᅢ"}}, {"0x47", {"ᅤ"}}, {"0x48", {"ᅦ"}}, {"0x49", {"ᅨ"}}, + {"0x4a", {"ᄂ"}}, {"0x4b", {"ᄉ"}}, {"0x4c", {"ᄊ"}}, {"0x4d", {"ᅦ"}}, + {"0x4e", {"ᅨ"}}, {"0x4f", {"ᅦ"}}, {"0x50", {"ᅨ"}}, {"0x51", {"ᄃ"}}, + {"0x52", {"ᄄ"}}, {"0x53", {"ᄅ"}}, {"0x54", {"ᄐ"}}, {"0x55", {"ᄑ"}}, + {"0x56", {"ᅨ"}}, {"0x57", {"ᅨ"}}, {"0x58", {"ᄎ"}}, {"0x59", {"ᄒ"}}, + {"0x5a", {"ᅦ"}}, {"0x5b", {"ᅨ"}}, {"0x5c", {"ᅦ"}}, {"0x5d", {"ᅨ"}}, + {"0x5e", {"ᄀ"}}, {"0x5f", {"ᄏ"}}, {"0x60", {"ᅩ"}}, {"0x61", {"ᅭ"}}, + {"0x62", {"ᅩ"}}, {"0x63", {"ᅭ"}}, {"0x64", {"ᄁ", "ᅫ"}}, {"0x65", {"ᄁ", "ᅩ"}}, + {"0x66", {"ᄁ", "ᅩ"}}, {"0x67", {"ᄁ", "ᅭ"}}, {"0x68", {"ᄁ"}}, {"0x69", {"ᄂ"}}, + {"0x6a", {"ᅳ"}}, {"0x6b", {"ᅮ"}}, {"0x6c", {"ᅲ"}}, {"0x6d", {"ᅳ"}}, + {"0x6e", {"ᅮ"}}, {"0x6f", {"ᅲ"}}, {"0x70", {"ᄃ"}}, {"0x71", {"ᄄ"}}, + {"0x72", {"ᄅ"}}, {"0x73", {"ᄆ"}}, {"0x74", {"ᄇ"}}, {"0x75", {"ᄈ"}}, + {"0x76", {"ᄉ"}}, {"0x77", {"ᄊ"}}, {"0x78", {"ᄋ"}}, {"0x79", {"ᄌ"}}, + {"0x7a", {"ᄍ"}}, {"0x7b", {"ᄎ"}}, {"0x7c", {"ᄐ"}}, {"0x7d", {"ᄑ"}}, + {"0x7e", {"ᄒ"}}, {"0x7f", {"ᅩ"}}, {"0x80", {"ᅭ"}}, {"0x81", {"ᅳ"}}, + {"0x82", {"ᅩ"}}, {"0x83", {"ᅭ"}}, {"0x84", {"ᅳ"}}, {"0x85", {"ᅮ"}}, + {"0x86", {"ᅲ"}}, {"0x87", {"ᅮ"}}, {"0x88", {"ᅲ"}}, {"0x89", {"ᅮ", "ᆫ"}}, + {"0x8a", {"ᅲ", "ᆫ"}}, {"0x8b", {"ᄀ"}}, {"0x8c", {"ᄏ"}}, {"0x8d", {"ᅩ"}}, + {"0x8e", {"ᅩ"}}, {"0x8f", {"ᄁ", "ᅩ"}}, {"0x90", {"ᄁ", "ᅩ"}}, {"0x91", {"ᄁ"}}, + {"0x92", {"ᄂ"}}, {"0x93", {"ᄃ"}}, {"0x94", {"ᄄ"}}, {"0x95", {"ᄅ"}}, + {"0x96", {"ᄆ"}}, {"0x97", {"ᄇ"}}, {"0x98", {"ᄈ"}}, {"0x99", {"ᄉ"}}, + {"0x9a", {"ᄊ"}}, {"0x9b", {"ᄋ"}}, {"0x9c", {"ᄌ"}}, {"0x9d", {"ᄍ"}}, + {"0x9e", {"ᄎ"}}, {"0x9f", {"ᄐ"}}, {"0xa0", {"ᄑ"}}, {"0xa1", {"ᄒ"}}, + {"0xa2", {"ᅩ"}}, {"0xa3", {"ᅳ"}}, {"0xa4", {"ᅩ"}}, {"0xa5", {"ᅳ"}}, + {"0xa6", {"ᅡ"}}, {"0xa7", {"ᅵ"}}, {"0xa8", {"ᅡ"}}, {"0xa9", {"ᅵ"}}, + {"0xaa", {"ᅯ"}}, {"0xab", {"ᅱ"}}, {"0xac", {"ᅯ"}}, {"0xad", {"ᅱ"}}, + {"0xae", {"ᄀ"}}, {"0xaf", {"ᄏ"}}, {"0xb0", {"ᅫ"}}, {"0xb1", {"ᅫ"}}, + {"0xb2", {"ᄆ"}}, {"0xb3", {"ᄁ"}}, {"0xb4", {"ᄂ"}}, {"0xb5", {"ᄃ"}}, + {"0xb6", {"ᄄ"}}, {"0xb7", {"ᄅ"}}, {"0xb8", {"ᄇ"}}, {"0xb9", {"ᄉ"}}, + {"0xba", {"ᄊ"}}, {"0xbb", {"ᄋ"}}, {"0xbc", {"ᄌ"}}, {"0xbd", {"ᄍ"}}, + {"0xbe", {"ᄎ"}}, {"0xbf", {"ᄐ"}}, {"0xc0", {"ᄒ"}}, {"0xc1", {"ᅫ"}}, + {"0xc2", {"ᅫ"}}, {"0xc3", {"ᅰ"}}, {"0xc4", {"ᅰ"}}, {"0xc5", {"ᆨ"}}, + {"0xc6", {"ᆩ"}}, {"0xc7", {"ᆪ"}}, {"0xc8", {"ᆫ"}}, {"0xc9", {"ᆬ"}}, + {"0xca", {"ᆭ"}}, {"0xcb", {"ᆮ"}}, {"0xcc", {"ᆯ"}}, {"0xcd", {"ᆰ"}}, + {"0xce", {"ᆱ"}}, {"0xcf", {"ᆲ"}}, {"0xd0", {"ᆴ"}}, {"0xd1", {"ᆶ"}}, + {"0xd2", {"ᆷ"}}, {"0xd3", {"ᆸ"}}, {"0xd4", {"ᆹ"}}, {"0xd5", {"ᆺ"}}, + {"0xd6", {"ᆻ"}}, {"0xd7", {"ᆼ"}}, {"0xd8", {"ᆽ"}}, {"0xd9", {"ᆾ"}}, + {"0xda", {"ᆿ"}}, {"0xdb", {"ᇀ"}}, {"0xdc", {"ᇁ"}}, {"0xdd", {"ᇂ"}}, + {"0xde", {"ᆨ"}}, {"0xdf", {"ᆩ"}}, {"0xe0", {"ᆪ"}}, {"0xe1", {"ᆫ"}}, + {"0xe2", {"ᆭ"}}, {"0xe3", {"ᆮ"}}, {"0xe4", {"ᆯ"}}, {"0xe5", {"ᆰ"}}, + {"0xe6", {"ᆱ"}}, {"0xe7", {"ᆳ"}}, {"0xe8", {"ᆴ"}}, {"0xe9", {"ᆵ"}}, + {"0xea", {"ᆶ"}}, {"0xeb", {"ᆷ"}}, {"0xec", {"ᆸ"}}, {"0xed", {"ᆺ"}}, + {"0xee", {"ᆼ"}}, {"0xef", {"ᆽ"}}, {"0xf0", {"ᆾ"}}, {"0xf1", {"ᆿ"}}, + {"0xf2", {"ᇀ"}}, {"0xf3", {"ᇁ"}}, {"0xf4", {"ᇂ"}}, {"0xf5", {"ᆨ"}}, + {"0xf6", {"ᆫ"}}, {"0xf7", {"ᆯ"}}, {"0xf8", {"ᆱ"}}, {"0xf9", {"ᆷ"}}, + {"0xfa", {"ᆸ"}}, {"0xfb", {"ᆺ"}}, {"0xfc", {"ᆻ"}}, {"0xfd", {"ᆼ"}}, + {"0xfe", {"ᆨ"}}, {"0xff", {"ᆫ"}}, {"extra_0x86", {"ᆯ"}}, {"extra_0x87", {"ᆷ"}}, + {"extra_0x88", {"ᆸ"}}, {"extra_0x89", {"ᆺ"}}, {"extra_0x8a", {"ᆻ"}}, {"extra_0x8b", {"ᆼ"}}, +}; + +GameTextFontBank g_font_bank_jak2(GameTextVersion::JAK2, + &encode_info_jak2, + &replace_info_jak2, + &passthrus_jak2); diff --git a/common/util/font/dbs/font_db_jak2.h b/common/util/font/dbs/font_db_jak2.h new file mode 100644 index 0000000000..73a89e61ae --- /dev/null +++ b/common/util/font/dbs/font_db_jak2.h @@ -0,0 +1,16 @@ +#pragma once + +#include "common/util/font/font_utils.h" + +extern std::unordered_map> jamo_glyph_mappings_jak2; + +/*! + * ================================ + * GAME TEXT FONT BANK - JAK 2 + * ================================ + * This font is used in: + * - Jak II + * - Jak II: Renegade + * - ジャックXダクスター2 + */ +extern GameTextFontBank g_font_bank_jak2; \ No newline at end of file diff --git a/common/util/font/dbs/font_db_jak3.cpp b/common/util/font/dbs/font_db_jak3.cpp new file mode 100644 index 0000000000..41c5f90c5c --- /dev/null +++ b/common/util/font/dbs/font_db_jak3.cpp @@ -0,0 +1,794 @@ +#include "font_db_jak3.h" + +std::unordered_set passthrus_jak3 = {'~', ' ', ',', '.', '-', '+', '(', ')', + '!', ':', '?', '=', '%', '*', '/', '#', + ';', '<', '>', '@', '[', '_', ']'}; + +std::vector replace_info_jak3 = { + // other + {"A~Y~-21H~-5Vº~Z", "Å"}, + {"N~Y~-6Hº~Z~+10H", "Nº"}, + {"~+4Vç~-4V", ",c"}, + + // added for translations TODO - check these for jak 2 + {"O~Y~-25H~-1V/~Z", "Ø"}, + {"o~Y~-23H~+4V/~Z", "ø"}, + {"A~Y~-13H~+8V,~Z", "Ą"}, + {"a~Y~-8H~+6V,~Z", "ą"}, + {"E~Y~-6H~+8V,~Z", "Ę"}, + {"e~Y~-10H~+7V,~Z", "ę"}, + {"L~Y~-21H~+0V/~Z", "Ł"}, + {"l~Y~-16H~+0V/~Z", "ł"}, // TODO - this one is ugly, font character addition (small slash) + {"Z~Y~-25H~-11Vº~Z", "Ż"}, + {"z~Y~-23H~-5Vº~Z", "ż"}, + {"a~Y~-25H~-5Vº~Z", "å"}, + {"S~Y~-21H~-5V'~Z", "Ś"}, + {"s~Y~-25H~-5V'~Z", "ś"}, + {"n~Y~-25H~-5V'~Z", "ń"}, + {"c~Y~-25H~-5V'~Z", "ć"}, + {"o~Y~-24H~-4V~Z", "õ"}, + {"a~Y~-24H~-4V~Z", "ã"}, + {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, + {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, + {"o~Y~-28H~-4V'~-9H'~Z", "ő"}, + {"u~Y~-28H~-4V'~-9H'~Z", "ű"}, + {"E~Y~-22H~-11Vº~Z", "Ė"}, + {"e~Y~-25H~-5Vº~Z", "ė"}, + {"C~Y~-27H~-10Vˇ~Z", "Č"}, + {"c~Y~-25H~-5Vˇ~Z", "č"}, + {"S~Y~-24H~-10Vˇ~Z", "Š"}, + {"s~Y~-22H~-4Vˇ~Z", "š"}, + {"Z~Y~-25H~-10Vˇ~Z", "Ž"}, + {"z~Y~-23H~-4Vˇ~Z", "ž"}, + {"U~Y~-15H~+5V,~Z", "Ų"}, + {"u~Y~-15H~+5V,~Z", "ų"}, + {"U~Y~-20H~-18V-~Z", "Ū"}, + {"u~Y~-18H~-15V-~Z", "ū"}, + {"D~Y~-28H~-1V-~Z", "Đ"}, + {"d~Y~-13H~-10V-~Z", "đ"}, + {"I~Y~-8H~+4V,~Z", "Į"}, + {"i~Y~-8H~+4V,~Z", "į"}, + // czech specific + {"U~Y~-24H~-7Vº~Z", "Ů"}, + {"u~Y~-23H~-5Vº~Z", "ů"}, + {"t~Y~-7H~-21V,~Z", "ť"}, + + // tildes + {"N~Y~-22H~-4V~Z", "Ñ"}, + {"n~Y~-24H~-4V~Z", "ñ"}, + {"A~Y~-21H~-5V~Z", "Ã"}, + {"O~Y~-22H~-4V~Z", "Õ"}, + + // acute accents + {"A~Y~-21H~-5V'~Z", "Á"}, + {"A~Y~-26H~-8V'~Z", "<Á_V2>"}, // unfortunate... + {"a~Y~-25H~-5V'~Z", "á"}, + {"E~Y~-23H~-9V'~Z", "É"}, + {"e~Y~-26H~-5V'~Z", "é"}, + {"I~Y~-19H~-5V'~Z", "Í"}, + {"i~Y~-19H~-8V'~Z", "í"}, + {"O~Y~-22H~-4V'~Z", "Ó"}, + {"o~Y~-26H~-4V'~Z", "ó"}, + {"U~Y~-24H~-3V'~Z", "Ú"}, + {"u~Y~-24H~-3V'~Z", "ú"}, + {"Z~Y~-24H~-3V'~Z", "Ź"}, + {"z~Y~-24H~-3V'~Z", "ź"}, + // czech specific + {"Y~Y~-26H~-5V'~Z", "Ý"}, + {"~+7Vy~-7V~Y~-24H~-3V'~Z", "ý"}, + + // circumflex + {"A~Y~-20H~-4V^~Z", "Â"}, + {"a~Y~-24H~-5V^~Z", "â"}, + {"E~Y~-20H~-5V^~Z", "Ê"}, + {"e~Y~-25H~-4V^~Z", "ê"}, + {"I~Y~-19H~-5V^~Z", "Î"}, + {"i~Y~-19H~-8V^~Z", "î"}, + {"O~Y~-20H~-4V^~Z", "Ô"}, + {"o~Y~-25H~-4V^~Z", "ô"}, + {"U~Y~-24H~-3V^~Z", "Û"}, + {"u~Y~-23H~-3V^~Z", "û"}, + + // grave accents + {"A~Y~-26H~-8V`~Z", "À"}, + {"a~Y~-25H~-5V`~Z", "à"}, + {"E~Y~-23H~-9V`~Z", "È"}, + {"e~Y~-26H~-5V`~Z", "è"}, + {"I~Y~-19H~-5V`~Z", "Ì"}, + {"i~Y~-19H~-8V`~Z", "ì"}, + {"O~Y~-22H~-4V`~Z", "Ò"}, + {"o~Y~-26H~-4V`~Z", "ò"}, + {"U~Y~-24H~-3V`~Z", "Ù"}, + {"u~Y~-24H~-3V`~Z", "ù"}, + + // umlaut + {"A~Y~-26H~-8V¨~Z", "Ä"}, + {"a~Y~-25H~-5V¨~Z", "ä"}, + {"E~Y~-20H~-5V¨~Z", "Ë"}, + {"e~Y~-25H~-5V¨~Z", "ë"}, + {"I~Y~-19H~-5V¨~Z", "Ï"}, + {"i~Y~-26H~-4V¨~Z", "ï"}, + {"O~Y~-26H~-8V¨~Z", "Ö"}, + {"o~Y~-26H~-4V¨~Z", "ö"}, + {"U~Y~-25H~-8V¨~Z", "Ü"}, + {"u~Y~-24H~-3V¨~Z", "ü"}, + + // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ + {"A~Y~-25H~-9Vˇ~Z", "Ǎ"}, + {"a~Y~-24H~-5Vˇ~Z", "ǎ"}, + {"E~Y~-22H~-8Vˇ~Z", "Ě"}, + {"e~Y~-25H~-4Vˇ~Z", "ě"}, + {"G~Y~-24H~-8Vˇ~Z", "Ǧ"}, + {"~+7Vg~-7V~Y~-25H~-4Vˇ~Z", "ǧ"}, + {"I~Y~-19H~-8Vˇ~Z", "Ǐ"}, + {"i~Y~-19H~-8Vˇ~Z", "ǐ"}, + {"O~Y~-25H~-7Vˇ~Z", "Ǒ"}, + {"o~Y~-25H~-4Vˇ~Z", "ǒ"}, + {"U~Y~-25H~-6Vˇ~Z", "Ǔ"}, + {"u~Y~-24H~-3Vˇ~Z", "ǔ"}, + {"Y~Y~-25H~-5Vˇ~Z", "Y̌"}, + {"~+7Vy~-7V~Y~-25H~-3Vˇ~Z", "y̌"}, + // czech specific - Č č Ň ň Ř ř Š š Ž ž Ť + {"C~Y~-25H~-9Vˇ~Z", "Č"}, + {"c~Y~-24H~-5Vˇ~Z", "č"}, + {"N~Y~-25H~-9Vˇ~Z", "Ň"}, + {"n~Y~-24H~-5Vˇ~Z", "ň"}, + {"R~Y~-25H~-9Vˇ~Z", "Ř"}, + {"r~Y~-22H~-5Vˇ~Z", "ř"}, + {"S~Y~-25H~-9Vˇ~Z", "Š"}, + {"s~Y~-22H~-5Vˇ~Z", "š"}, + {"T~Y~-24H~-7Vˇ~Z", "Ť"}, + {"Z~Y~-25H~-9Vˇ~Z", "Ž"}, + {"z~Y~-24H~-5Vˇ~Z", "ž"}, + + // dakuten katakana + {"~Yウ~Z゛", "ヴ"}, + {"~Yカ~Z゛", "ガ"}, + {"~Yキ~Z゛", "ギ"}, + {"~Yク~Z゛", "グ"}, + {"~Yケ~Z゛", "ゲ"}, + {"~Yコ~Z゛", "ゴ"}, + {"~Yサ~Z゛", "ザ"}, + {"~Yシ~Z゛", "ジ"}, + {"~Yス~Z゛", "ズ"}, + {"~Yセ~Z゛", "ゼ"}, + {"~Yソ~Z゛", "ゾ"}, + {"~Yタ~Z゛", "ダ"}, + {"~Yチ~Z゛", "ヂ"}, + {"~Yツ~Z゛", "ヅ"}, + {"~Yテ~Z゛", "デ"}, + {"~Yト~Z゛", "ド"}, + {"~Yハ~Z゛", "バ"}, + {"~Yヒ~Z゛", "ビ"}, + {"~Yフ~Z゛", "ブ"}, + {"~Yヘ~Z゛", "ベ"}, + {"~Yホ~Z゛", "ボ"}, + // handakuten katakana + {"~Yハ~Z゜", "パ"}, + {"~Yヒ~Z゜", "ピ"}, + {"~Yフ~Z゜", "プ"}, + {"~Yヘ~Z゜", "ペ"}, + {"~Yホ~Z゜", "ポ"}, + // dakuten hiragana + {"~Yか~Z゛", "が"}, + {"~Yき~Z゛", "ぎ"}, + {"~Yく~Z゛", "ぐ"}, + {"~Yけ~Z゛", "げ"}, + {"~Yこ~Z゛", "ご"}, + {"~Yさ~Z゛", "ざ"}, + {"~Yし~Z゛", "じ"}, + {"~Yす~Z゛", "ず"}, + {"~Yせ~Z゛", "ぜ"}, + {"~Yそ~Z゛", "ぞ"}, + {"~Yた~Z゛", "だ"}, + {"~Yち~Z゛", "ぢ"}, + {"~Yつ~Z゛", "づ"}, + {"~Yて~Z゛", "で"}, + {"~Yと~Z゛", "ど"}, + {"~Yは~Z゛", "ば"}, + {"~Yひ~Z゛", "び"}, + {"~Yふ~Z゛", "ぶ"}, + {"~Yへ~Z゛", "べ"}, + {"~Yほ~Z゛", "ぼ"}, + // handakuten hiragana + {"~Yは~Z゜", "ぱ"}, + {"~Yひ~Z゜", "ぴ"}, + {"~Yふ~Z゜", "ぷ"}, + {"~Yへ~Z゜", "ぺ"}, + {"~Yほ~Z゜", "ぽ"}, + // japanese punctuation + {",~+8H", "、"}, + {"~+8H ", " "}, + + // playstation buttons + // - face + {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + // - dpad + {"~Y~22L~Z~3L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~3L~+17H~-13V~Z~3L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~22L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + // - shoulder + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+4H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+6H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + // - analog + {"~1L~+8H~Y~Z~6L~-16H~Z~+16h~6L~Z~" + "6L~-15V~Z~+13V~6L~Z~-10H~+9V~6L~Z~+10H~+9V~6L~Z~-10H~-11V~6L~Z~+10H~" + "-11V~6L~Z~+32H", + ""}, + {"~Y~1L~+8H~Z~6L~-8H~Z~+24H~6L~Z~+" + "40H", + ""}, + {"~Y~1L~Z~6L~-15V~Z~+13V~6L~Z~+26H", + ""}, + + // icons + {"~Y~6L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~3L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + + // flags + {"~Y~6L~Z~+15H~1L~Z~+30H~3L~Z~+45H", + ""}, + {"~Y~5L~Z~3L~]~-1H~Y~5L~Z~3L~Z~+26H", + ""}, + {"~Y~39L~~~Z~3L~Z~5L~]~-1H~Y~39L~~~" + "Z~3L~Z~5L~Z~+26H", + ""}, + {"~Y~7L~Z~+15H~1L~Z~+30H~3L~Z~+47H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~7L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~+26H", + ""}, + {"~Y~1L~Z~39L~]~-1H~Y~1L~Z~39L<" + "FLAG_PART_KOREA_TRIGRAMS_RIGHT>~Z~-11H~7L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~]~-1H~Y~1L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~Z~7L~Z~7L~]" + "~-1H~Y~1L~Z~7L~Z~+26H", + ""}, + {"~Y~7L~Z~5L~Z~5L~]" + "~-1H~Y~7L~Z~5L~Z~+26H", + ""}, + {"~Y~3L~Z~1L~Z~1L~]" + "~-1H~Y~3L~Z~1L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~]~-1H~Y~1L~Z~3L~Z~-19H~1L~Z~-23H~7L~Z~-23H~7L~Z~7L~Z~" + "+26H", + ""}, + {"~Y~1L~Z~7L~]~-1H~Y~1L~Z~7L~Z~-19H~1L~Z~-23H~3L~Z~-23H~3L~Z~3L~Z~" + "+26H", + ""}, + + // weird stuff + // - descenders + {"~+7Vp~-7V", "p"}, + {"~+7Vy~-7V", "y"}, + {"~+7Vg~-7V", "g"}, + {"~+7Vq~-7V", "q"}, + {"~+1Vj~-1V", "j"}, + + {"\\\\", + "~%"}, // this is 2 slashes, duplicated because we use an escape sequence when decompiling + + // - symbols and ligatures + {"~-4H~-3V~+3V~-4H", + ""}, // used for the 4<__> place in spanish. the 5th uses the same + // character but looks different...? + {"~Y~-6Hº~Z~+10H", "°"}, + + // Color / Emphasis + {"~[~0L", ""}, + {"~[~1L", ""}, + {"~[~2L", ""}, + {"~[~3L", ""}, + {"~[~4L", ""}, + {"~[~5L", ""}, + {"~[~6L", ""}, + {"~[~7L", ""}, + {"~[~8L", ""}, + {"~[~9L", ""}, + {"~[~10L", ""}, + {"~[~11L", ""}, + {"~[~12L", ""}, + {"~[~13L", ""}, + {"~[~14L", ""}, + {"~[~15L", ""}, + {"~[~16L", ""}, + {"~[~17L", ""}, + {"~[~18L", ""}, + {"~[~19L", ""}, + {"~[~20L", ""}, + {"~[~21L", ""}, + {"~[~22L", ""}, + {"~[~23L", ""}, + {"~[~24L", ""}, + {"~[~25L", ""}, + {"~[~26L", ""}, + {"~[~27L", ""}, + {"~[~28L", ""}, + {"~[~29L", ""}, + {"~[~30L", ""}, + {"~[~31L", ""}, + {"~[~32L", ""}, + {"~[~33L", ""}, + {"~[~34L", ""}, + {"~[~35L", ""}, + {"~[~36L", ""}, + {"~[~37L", ""}, + {"~[~38L", ""}, + {"~[~39L", ""}}; + +// TODO - cryllic + +std::vector encode_info_jak3 = { + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + {"", "\x19"}, + {"ç", "\x1d"}, // c-cedilla + {"Ç", "\x1e"}, // c-cedilla + {"ß", "\x1f"}, // eszett + + {"œ", "\x5e"}, // ligature o+e + + {"", "\x7f"}, + {"", "\x80"}, + {"", "\x81"}, + {"", "\x82"}, + {"", "\x83"}, + {"", "\x84"}, + {"", "\x85"}, + {"", "\x86"}, + {"", "\x87"}, + {"", "\x88"}, + {"", "\x89"}, + {"", "\x8a"}, + {"", "\x8b"}, + {"", "\x8c"}, + {"", "\x8d"}, + {"", "\x8e"}, + {"", "\x8f"}, + {"", "\x90"}, + {"", "\x91"}, + {"", "\x92"}, + {"", "\x93"}, + {"", "\x94"}, + {"", "\x95"}, + {"", "\x96"}, + {"", "\x97"}, + {"", "\x98"}, + {"", "\x99"}, + {"", "\x9a"}, + {"", "\x9b"}, + {"", "\x9c"}, + {"", "\x9d"}, + {"", "\x9e"}, + {"", "\x9f"}, + {"", "\xa0"}, + {"", "\xa1"}, + {"", "\xa2"}, + {"", "\xa3"}, + {"", "\xa4"}, + {"", "\xa5"}, + {"", "\xa6"}, + {"", "\xa7"}, + {"", "\xa8"}, + {"", "\xa9"}, + {"", "\xaa"}, + {"", "\xab"}, + {"", "\xac"}, + + {"", "\xb0"}, + {"", "\xb1"}, + {"", "\xb2"}, + {"", "\xb3"}, + // {"入", "\x1\x00"}}, + // {"年", "\x1\x01"}}, + // punctuation + {"・", "\x1\x10"}, + {"゛", "\x1\x11"}, + {"゜", "\x1\x12"}, + {"ー", "\x1\x13"}, + {"『", "\x1\x14"}, + {"』", "\x1\x15"}, + // hiragana + {"ぁ", "\x1\x16"}, // -a + {"あ", "\x1\x17"}, // a + {"ぃ", "\x1\x18"}, // -i + {"い", "\x1\x19"}, // i + {"ぅ", "\x1\x1a"}, // -u + {"う", "\x1\x1b"}, // u + {"ぇ", "\x1\x1c"}, // -e + {"え", "\x1\x1d"}, // e + {"ぉ", "\x1\x1e"}, // -o + {"お", "\x1\x1f"}, // o + {"か", "\x1\x20"}, // ka + {"き", "\x1\x21"}, // ki + {"く", "\x1\x22"}, // ku + {"け", "\x1\x23"}, // ke + {"こ", "\x1\x24"}, // ko + {"さ", "\x1\x25"}, // sa + {"し", "\x1\x26"}, // shi + {"す", "\x1\x27"}, // su + {"せ", "\x1\x28"}, // se + {"そ", "\x1\x29"}, // so + {"た", "\x1\x2a"}, // ta + {"ち", "\x1\x2b"}, // chi + {"っ", "\x1\x2c"}, // sokuon + {"つ", "\x1\x2d"}, // tsu + {"て", "\x1\x2e"}, // te + {"と", "\x1\x2f"}, // to + {"な", "\x1\x30"}, // na + {"に", "\x1\x31"}, // ni + {"ぬ", "\x1\x32"}, // nu + {"ね", "\x1\x33"}, // ne + {"の", "\x1\x34"}, // no + {"は", "\x1\x35"}, // ha + {"ひ", "\x1\x36"}, // hi + {"ふ", "\x1\x37"}, // fu + {"へ", "\x1\x38"}, // he + {"ほ", "\x1\x39"}, // ho + {"ま", "\x1\x3a"}, // ma + {"み", "\x1\x3b"}, // mi + {"む", "\x1\x3c"}, // mu + {"め", "\x1\x3d"}, // me + {"も", "\x1\x3e"}, // mo + {"ゃ", "\x1\x3f"}, // youon ya + {"や", "\x1\x40"}, // ya + {"ゅ", "\x1\x41"}, // youon yu + {"ゆ", "\x1\x42"}, // yu + {"ょ", "\x1\x43"}, // youon yo + {"よ", "\x1\x44"}, // yo + {"ら", "\x1\x45"}, // ra + {"り", "\x1\x46"}, // ri + {"る", "\x1\x47"}, // ru + {"れ", "\x1\x48"}, // re + {"ろ", "\x1\x49"}, // ro + {"ゎ", "\x1\x4a"}, // -wa + {"わ", "\x1\x4b"}, // wa + {"を", "\x1\x4c"}, // wo + {"ん", "\x1\x4d"}, // -n + // katakana + {"ァ", "\x1\x4e"}, // -a + {"ア", "\x1\x4f"}, // a + {"ィ", "\x1\x50"}, // -i + {"イ", "\x1\x51"}, // i + {"ゥ", "\x1\x52"}, // -u + {"ウ", "\x1\x53"}, // u + {"ェ", "\x1\x54"}, // -e + {"エ", "\x1\x55"}, // e + {"ォ", "\x1\x56"}, // -o + {"オ", "\x1\x57"}, // o + {"カ", "\x1\x58"}, // ka + {"キ", "\x1\x59"}, // ki + {"ク", "\x1\x5a"}, // ku + {"ケ", "\x1\x5b"}, // ke + {"コ", "\x1\x5c"}, // ko + {"サ", "\x1\x5d"}, // sa + {"シ", "\x1\x5e"}, // shi + {"ス", "\x1\x5f"}, // su + {"セ", "\x1\x60"}, // se + {"ソ", "\x1\x61"}, // so + {"タ", "\x1\x62"}, // ta + {"チ", "\x1\x63"}, // chi + {"ッ", "\x1\x64"}, // sokuon + {"ツ", "\x1\x65"}, // tsu + {"テ", "\x1\x66"}, // te + {"ト", "\x1\x67"}, // to + {"ナ", "\x1\x68"}, // na + {"ニ", "\x1\x69"}, // ni + {"ヌ", "\x1\x6a"}, // nu + {"ネ", "\x1\x6b"}, // ne + {"ノ", "\x1\x6c"}, // no + {"ハ", "\x1\x6d"}, // ha + {"ヒ", "\x1\x6e"}, // hi + {"フ", "\x1\x6f"}, // fu + {"ヘ", "\x1\x70"}, // he + {"ホ", "\x1\x71"}, // ho + {"マ", "\x1\x72"}, // ma + {"ミ", "\x1\x73"}, // mi + {"ム", "\x1\x74"}, // mu + {"メ", "\x1\x75"}, // me + {"モ", "\x1\x76"}, // mo + {"ャ", "\x1\x77"}, // youon ya + {"ヤ", "\x1\x78"}, // ya + {"ュ", "\x1\x79"}, // youon yu + {"ユ", "\x1\x7a"}, // yu + {"ョ", "\x1\x7b"}, // youon yo + {"ヨ", "\x1\x7c"}, // yo + {"ラ", "\x1\x7d"}, // ra + {"リ", "\x1\x7e"}, // ri + {"ル", "\x1\x7f"}, // ru + {"レ", "\x1\x80"}, // re + {"ロ", "\x1\x81"}, // ro + {"ヮ", "\x1\x82"}, // -wa + {"ワ", "\x1\x83"}, // wa + {"ヲ", "\x1\x84"}, // wo + {"ン", "\x1\x85"}, // -n + + {"位", "\x1\x8c"}, + {"遺", "\x1\x8d"}, + {"院", "\x1\x8e"}, + {"映", "\x1\x8f"}, + {"衛", "\x1\x90"}, + {"応", "\x1\x91"}, + {"下", "\x1\x92"}, + {"画", "\x1\x93"}, + {"解", "\x1\x94"}, + {"開", "\x1\x95"}, + {"外", "\x1\x96"}, + {"害", "\x1\x97"}, + {"蓋", "\x1\x98"}, + {"完", "\x1\x99"}, + {"換", "\x1\x9a"}, + {"監", "\x1\x9b"}, + {"間", "\x1\x9c"}, + {"器", "\x1\x9d"}, + {"記", "\x1\x9e"}, + {"逆", "\x1\x9f"}, + {"救", "\x1\xa0"}, + {"金", "\x1\xa1"}, + {"空", "\x1\xa2"}, + {"掘", "\x1\xa3"}, + {"警", "\x1\xa4"}, + {"迎", "\x1\xa5"}, + {"撃", "\x1\xa6"}, + {"建", "\x1\xa7"}, + {"源", "\x1\xa8"}, + {"現", "\x1\xa9"}, + {"言", "\x1\xaa"}, + {"限", "\x1\xab"}, + {"個", "\x1\xac"}, + {"庫", "\x1\xad"}, + {"後", "\x1\xae"}, + {"語", "\x1\xaf"}, + {"護", "\x1\xb0"}, + {"交", "\x1\xb1"}, + {"功", "\x1\xb2"}, + {"向", "\x1\xb3"}, + {"工", "\x1\xb4"}, + {"攻", "\x1\xb5"}, + {"溝", "\x1\xb6"}, + {"行", "\x1\xb7"}, + {"鉱", "\x1\xb8"}, + {"降", "\x1\xb9"}, + {"合", "\x1\xba"}, + {"告", "\x1\xbb"}, + {"獄", "\x1\xbc"}, + {"彩", "\x1\xbd"}, + {"作", "\x1\xbe"}, + {"山", "\x1\xbf"}, + {"使", "\x1\xc0"}, + {"始", "\x1\xc1"}, + {"試", "\x1\xc2"}, + {"字", "\x1\xc3"}, + {"寺", "\x1\xc4"}, + {"時", "\x1\xc5"}, + {"示", "\x1\xc6"}, + {"自", "\x1\xc7"}, + {"式", "\x1\xc8"}, + {"矢", "\x1\xc9"}, + {"射", "\x1\xca"}, + {"者", "\x1\xcb"}, + {"守", "\x1\xcc"}, + {"手", "\x1\xcd"}, + {"終", "\x1\xce"}, + {"週", "\x1\xcf"}, + {"出", "\x1\xd0"}, + {"所", "\x1\xd1"}, + {"書", "\x1\xd2"}, + {"勝", "\x1\xd3"}, + {"章", "\x1\xd4"}, + {"上", "\x1\xd5"}, + {"乗", "\x1\xd6"}, + {"場", "\x1\xd7"}, + {"森", "\x1\xd8"}, + {"進", "\x1\xd9"}, + {"人", "\x1\xda"}, + {"水", "\x1\xdb"}, + {"数", "\x1\xdc"}, + {"制", "\x1\xdd"}, + {"性", "\x1\xde"}, + {"成", "\x1\xdf"}, + {"聖", "\x1\xe0"}, + {"石", "\x1\xe1"}, + {"跡", "\x1\xe2"}, + {"先", "\x1\xe3"}, + {"戦", "\x1\xe4"}, + {"船", "\x1\xe5"}, + {"選", "\x1\xe6"}, + {"走", "\x1\xe7"}, + {"送", "\x1\xe8"}, + {"像", "\x1\xe9"}, + {"造", "\x1\xea"}, + {"続", "\x1\xeb"}, + {"対", "\x1\xec"}, + {"袋", "\x1\xed"}, + {"台", "\x1\xee"}, + {"弾", "\x1\xef"}, + {"地", "\x1\xf0"}, + {"中", "\x1\xf1"}, + {"敵", "\x1\xf2"}, + {"転", "\x1\xf3"}, + {"電", "\x1\xf4"}, + {"塔", "\x1\xf5"}, + {"頭", "\x1\xf6"}, + {"動", "\x1\xf7"}, + {"内", "\x1\xf8"}, + {"日", "\x1\xf9"}, + {"入", "\x1\xfa"}, + {"年", "\x1\xfb"}, + {"能", "\x1\xfc"}, + {"廃", "\x1\xfd"}, + {"排", "\x1\xfe"}, + {"敗", "\x1\xff"}, + + {"発", "\x2\x10"}, + {"反", "\x2\x11"}, + {"必", "\x2\x12"}, + {"表", "\x2\x13"}, + {"武", "\x2\x14"}, + {"壁", "\x2\x15"}, + {"墓", "\x2\x16"}, + {"放", "\x2\x17"}, + {"方", "\x2\x18"}, + {"砲", "\x2\x19"}, + {"妨", "\x2\x1a"}, + {"北", "\x2\x1b"}, + {"本", "\x2\x1c"}, + {"幕", "\x2\x1d"}, + {"無", "\x2\x1e"}, + {"迷", "\x2\x1f"}, + {"面", "\x2\x20"}, + {"戻", "\x2\x21"}, + {"紋", "\x2\x22"}, + {"薬", "\x2\x23"}, + {"輸", "\x2\x24"}, + {"勇", "\x2\x25"}, + {"友", "\x2\x26"}, + {"遊", "\x2\x27"}, + {"容", "\x2\x28"}, + {"要", "\x2\x29"}, + {"利", "\x2\x2a"}, + {"了", "\x2\x2b"}, + {"量", "\x2\x2c"}, + {"力", "\x2\x2d"}, + {"練", "\x2\x2e"}, + {"連", "\x2\x2f"}, + {"録", "\x2\x30"}, + {"話", "\x2\x31"}, + {"墟", "\x2\x32"}, + {"脱", "\x2\x33"}, + // {"成", "\x2\x34"}, + {"旗", "\x2\x35"}, + {"破", "\x2\x36"}, + {"壊", "\x2\x37"}, + {"全", "\x2\x38"}, + {"滅", "\x2\x39"}, + {"機", "\x2\x3a"}, + {"仲", "\x2\x3b"}, + {"渓", "\x2\x3c"}, + {"谷", "\x2\x3d"}, + {"優", "\x2\x3e"}, + {"探", "\x2\x3f"}, + {"部", "\x2\x40"}, + {"索", "\x2\x41"}, + // {"乗", "\x2\x42"}, + {"前", "\x2\x43"}, + {"右", "\x2\x44"}, + {"左", "\x2\x45"}, + {"会", "\x2\x46"}, + {"高", "\x2\x47"}, + {"低", "\x2\x48"}, + {"押", "\x2\x49"}, + {"切", "\x2\x4a"}, + {"替", "\x2\x4b"}, + // {"対", "\x2\x4c"}, + {"秒", "\x2\x4d"}, + {"箱", "\x2\x4e"}, + {"泳", "\x2\x4f"}, + {"~", "\x2\x50"}, + + {"闇", "\x2\x56"}, + {"以", "\x2\x57"}, + {"屋", "\x2\x58"}, + {"俺", "\x2\x59"}, + {"化", "\x2\x5a"}, + {"界", "\x2\x5b"}, + {"感", "\x2\x5c"}, + {"気", "\x2\x5d"}, + {"却", "\x2\x5e"}, + {"曲", "\x2\x5f"}, + {"継", "\x2\x60"}, + {"権", "\x2\x61"}, + {"見", "\x2\x62"}, + {"古", "\x2\x63"}, + {"好", "\x2\x64"}, + // {"高", "\x2\x65"}, + {"才", "\x2\x66"}, + {"士", "\x2\x67"}, + {"子", "\x2\x68"}, + {"次", "\x2\x69"}, + {"主", "\x2\x6a"}, + {"種", "\x2\x6b"}, + {"讐", "\x2\x6c"}, + {"女", "\x2\x6d"}, + {"小", "\x2\x6e"}, + {"焼", "\x2\x6f"}, + {"証", "\x2\x70"}, + {"神", "\x2\x71"}, + {"身", "\x2\x72"}, + {"寸", "\x2\x73"}, + {"世", "\x2\x74"}, + {"想", "\x2\x75"}, + {"退", "\x2\x76"}, + {"第", "\x2\x77"}, + {"着", "\x2\x78"}, + {"天", "\x2\x79"}, + {"倒", "\x2\x7a"}, + {"到", "\x2\x7b"}, + {"突", "\x2\x7c"}, + {"爆", "\x2\x7d"}, + {"番", "\x2\x7e"}, + {"負", "\x2\x7f"}, + {"復", "\x2\x80"}, + {"物", "\x2\x81"}, + {"眠", "\x2\x82"}, + {"予", "\x2\x83"}, + {"用", "\x2\x84"}, + {"落", "\x2\x85"}, + {"緑", "\x2\x86"}, + + {"封", "\x2\x88"}, + {"印", "\x2\x89"}, + {"扉", "\x2\x8a"}, + {"最", "\x2\x8b"}, + {"刻", "\x2\x8c"}, + {"足", "\x2\x8d"}, +}; + +GameTextFontBank g_font_bank_jak3(GameTextVersion::JAK3, + &encode_info_jak3, + &replace_info_jak3, + &passthrus_jak3); diff --git a/common/util/font/dbs/font_db_jak3.h b/common/util/font/dbs/font_db_jak3.h new file mode 100644 index 0000000000..0a81844f1d --- /dev/null +++ b/common/util/font/dbs/font_db_jak3.h @@ -0,0 +1,14 @@ +#pragma once + +#include "common/util/font/font_utils.h" + +/*! + * ================================ + * GAME TEXT FONT BANK - JAK 3 + * ================================ + * This font is used in: + * - Jak 3 + */ +// TODO cyrillic +// TODO - current just using the jak 2 stuff (hopefully it's identical?) +extern GameTextFontBank g_font_bank_jak3; \ No newline at end of file diff --git a/common/util/font/font_utils.cpp b/common/util/font/font_utils.cpp new file mode 100644 index 0000000000..23fdeaa982 --- /dev/null +++ b/common/util/font/font_utils.cpp @@ -0,0 +1,365 @@ +/*! + * @file FontUtils.cpp + * + * Code for handling text and strings in Jak 1's "large font" format. + * + * MAKE SURE THIS FILE IS ENCODED IN UTF-8!!! The various strings here depend on it. + * Always verify the encoding if string detection suddenly goes awry. + */ + +#include "font_utils.h" + +#include +#include +#include + +#include "common/util/Assert.h" +#include "common/util/FileUtil.h" +#include "common/util/font/dbs/font_db_jak1.h" +#include "common/util/font/dbs/font_db_jak2.h" +#include "common/util/font/dbs/font_db_jak3.h" +#include "common/util/font/font_utils_korean.h" +#include "common/util/string_util.h" +#include "common/versions/versions.h" + +#include "fmt/format.h" + +void from_json(const json& j, KoreanLookupEntry& obj) { + json_deserialize_if_exists(defaultGlyph); + json_deserialize_if_exists(alternatives); +} + +std::map g_font_banks = { + {GameTextVersion::JAK1_V1, &g_font_bank_jak1_v1}, + {GameTextVersion::JAK1_V2, &g_font_bank_jak1_v2}, + {GameTextVersion::JAK2, &g_font_bank_jak2}, + {GameTextVersion::JAK3, &g_font_bank_jak3}}; + +const std::unordered_map sTextVerEnumMap = { + {"jak1-v1", GameTextVersion::JAK1_V1}, + {"jak1-v2", GameTextVersion::JAK1_V2}, + {"jak2", GameTextVersion::JAK2}, + {"jak3", GameTextVersion::JAK3}}; + +const std::string& get_text_version_name(GameTextVersion version) { + for (auto& [name, ver] : sTextVerEnumMap) { + if (ver == version) { + return name; + } + } + throw std::runtime_error(fmt::format("invalid text version {}", fmt::underlying(version))); +} + +GameTextVersion get_text_version_from_name(const std::string& name) { + return sTextVerEnumMap.at(name); +} + +GameTextFontBank::GameTextFontBank(GameTextVersion version, + std::vector* encode_info, + std::vector* replace_info, + std::unordered_set* passthrus) + : m_version(version), m_passthrus(passthrus) { + // Insert the encode and replacement info into a Trie, much faster lookups that way + for (const auto& encoding : *encode_info) { + m_encode_to_utf8_trie.insert(encoding.game_bytes, encoding); + m_encode_to_game_trie.insert(encoding.utf8, encoding); + } + for (const auto& replacement : *replace_info) { + m_replace_to_utf8_trie.insert(replacement.game_encoding, replacement); + m_replace_to_game_trie.insert(replacement.utf8_string, replacement); + } +} + +bool GameTextFontBank::is_language_id_korean(const int language_id) const { + if (m_version == GameTextVersion::JAK2 && language_id == 6) { + return true; + } else if (m_version == GameTextVersion::JAK3 && language_id == 7) { + return true; + } + return false; +} + +GameTextFontBank* get_font_bank(GameTextVersion version) { + return g_font_banks.at(version); +} + +GameTextFontBank* get_font_bank_from_game_version(GameVersion version) { + if (version == GameVersion::Jak1) { + // Jak 1 has been patched to use V2 + return get_font_bank(GameTextVersion::JAK1_V2); + } else if (version == GameVersion::Jak2) { + auto font_bank = get_font_bank(GameTextVersion::JAK2); + return font_bank; + } else if (version == GameVersion::Jak3) { + return get_font_bank(GameTextVersion::JAK3); + } else { + ASSERT_MSG(false, "Unsupported game for get_font_bank_from_game_version"); + } +} + +GameTextFontBank* get_font_bank(const std::string& name) { + if (auto it = sTextVerEnumMap.find(name); it == sTextVerEnumMap.end()) { + throw std::runtime_error(fmt::format("unknown text version {}", name)); + } else { + return get_font_bank(it->second); + } +} + +bool font_bank_exists(GameTextVersion version) { + return g_font_banks.find(version) != g_font_banks.cend(); +} + +std::string GameTextFontBank::replace_to_game(const std::string& str) const { + std::string newstr; + newstr.reserve(str.size()); + for (int i = 0; i < str.length();) { + const ReplaceInfo* remap = m_replace_to_game_trie.find_longest_prefix(str, i); + if (!remap) { + newstr.push_back(str[i]); + i += 1; + } else { + if (!remap->utf8_alternative.empty()) { + newstr.append(remap->utf8_alternative); + } else { + newstr.append(remap->game_encoding); + } + i += remap->utf8_string.size(); + } + } + return newstr; +} + +std::string GameTextFontBank::encode_utf8_to_game(const std::string& str) const { + std::string newstr; + newstr.reserve(str.size()); + for (int i = 0; i < str.length();) { + auto match = m_encode_to_game_trie.find_longest_prefix(str, i); + if (!match) { + newstr.push_back(str[i]); + i += 1; + } else { + for (auto b : match->game_bytes) { + newstr.push_back(b); + } + i += match->utf8.size(); + } + } + return newstr; +} + +/*! + * Turn a normal readable string into a string readable in the in-game font encoding and converts + * \cXX escape sequences + */ +std::string GameTextFontBank::convert_utf8_to_game(const std::string& str) const { + return encode_utf8_to_game(replace_to_game(str)); +} + +std::string GameTextFontBank::replace_to_utf8(const std::string& str) const { + std::string result; + result.reserve(str.size()); + for (size_t i = 0; i < str.size();) { + const ReplaceInfo* remap = m_replace_to_utf8_trie.find_longest_prefix(str, i); + if (!remap) { + result.push_back(str[i]); + i += 1; + } else { + result.append(remap->utf8_string); + i += remap->game_encoding.size(); + } + } + return result; +} + +bool GameTextFontBank::valid_char_range(const char& in) const { + if (m_version == GameTextVersion::JAK1_V1 || m_version == GameTextVersion::JAK1_V2) { + return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || + m_passthrus->find(in) != m_passthrus->end()) && + in != '\\'; + } else if (m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3 || + m_version == GameTextVersion::JAKX) { + return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || (in >= 'a' && in <= 'z') || + m_passthrus->find(in) != m_passthrus->end()) && + in != '\\'; + } + return false; +} + +std::string GameTextFontBank::encode_game_to_utf8(const std::string& str) const { + std::string newstr; + newstr.reserve(str.size()); + for (size_t i = 0; i < str.size();) { + auto encoding = m_encode_to_utf8_trie.find_longest_prefix(str, i); + if (!encoding) { + // No match: copy valid characters as-is, or escape unknown bytes + unsigned char c = static_cast(str[i]); + if (valid_char_range(c) || c == '\n' || c == '\t' || c == '\\' || c == '"') { + newstr.push_back(c); + } else { + newstr += fmt::format("\\c{:02x}", c); + } + ++i; + } else { + // Found a match: append its UTF-8 sequence + newstr.append(encoding->utf8); + i += encoding->game_bytes.size(); // advance past matched game bytes + } + } + return newstr; +} + +std::string GameTextFontBank::convert_game_to_utf8(const char* in) const { + // Encode and apply replacement ONCE + std::string decoded = replace_to_utf8(encode_game_to_utf8(in)); + + // Escape special characters while writing directly into result + std::string result; + result.reserve(decoded.size()); + for (size_t i = 0; i < decoded.size(); ++i) { + char c = decoded[i]; + if (c == '\n') { + result += "\\n"; + } else if (c == '\t') { + result += "\\t"; + } else if (c == '\\') { + if (i < decoded.size() - 1 && decoded[i + 1] == 'c') { + result.push_back(c); // preserve \cXX + } else { + result += "\\\\"; + } + } else if (c == '"') { + result += "\\\""; + } else { + result.push_back(c); + } + } + + return result; +} + +std::string GameTextFontBank::convert_utf8_to_game_korean(const std::string& str) { + ASSERT_MSG(m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3, + "Korean is not supported for any game other than Jak 2 and Jak 3 right now"); + if (!m_korean_db.has_value()) { + const auto db_file_path = + file_util::get_file_path({"game/assets/fonts/jak2_jak3_korean_db.json"}); + if (file_util::file_exists(db_file_path)) { + auto raw_data = file_util::read_text_file(db_file_path); + auto json_data = parse_commented_json(raw_data, "jak2_jak3_korean_db.json"); + std::unordered_map temp_db; + json_data.get_to(temp_db); + m_korean_db = temp_db; + } + } + + std::string output; + output.reserve(str.size()); + std::string non_korean_buffer = ""; + size_t i = 0; + while (i < str.size()) { + char32_t cp = str_util::next_utf8_char(str, i); + if (font_util_korean::is_korean_syllable(cp)) { + // flush any non-korean buffer + if (!non_korean_buffer.empty()) { + output += 0x3; + // encode / remap it + output += encode_utf8_to_game(replace_to_game(non_korean_buffer)); + non_korean_buffer = ""; + } + // write out the korean character + output += font_util_korean::game_encode_korean_syllable(str, cp, m_korean_db.value()); + } else { + non_korean_buffer += str_util::utf8_encode(cp); + } + } + // flush any non-korean buffer + if (!non_korean_buffer.empty()) { + output += 0x3; + // encode / remap it + output += encode_utf8_to_game(replace_to_game(non_korean_buffer)); + non_korean_buffer = ""; + } + return output; +} + +std::string GameTextFontBank::convert_korean_game_to_utf8(const char* in) const { + ASSERT_MSG(m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3, + "Korean is not supported for any game other than Jak 2 and Jak 3 right now"); + // Korean strings are fully bitstrings, in other words, it's just a bunch of bytes + // Some info on the layout: + // - Every korean syllable block starts with a `4` + // - The following byte indicates how many glyphs are drawn for that syllable block + // - Each jamo that makes up the syllable block follows as a single byte + // - Unless the jamo is part of the "extra" texture page, in which case it's preceeded by a `5`. + // There are very few jamo that are and they are only applicable for the final consonant + // - The korean strings can contain non-korean characters. These are preceeded by a `3` + // - For example a space would be `3 20` + // - It might be more accurate to say that a 3 signifies "consume characters as normal until + // something else is encountered (ie. flags or more complex font encodings)" + std::string result; + std::string_view str(in); + + u64 index = 0; + u8 curr_byte = 0; + bool in_syllable_block = false; + std::string jamo_buffer = ""; + std::string non_korean_buffer = ""; + int num_syllable_glyphs = 0; + while (index < str.length()) { + curr_byte = str.at(index); + // new syllable block + if (curr_byte == 4) { + in_syllable_block = true; + if (index + 1 < str.length()) { + num_syllable_glyphs = str.at(index + 1); + index++; + } + index++; + // flush any non-korean characters + if (!non_korean_buffer.empty()) { + // handle remap + std::string remapped_str = replace_to_utf8(encode_game_to_utf8(non_korean_buffer)); + result += remapped_str; + non_korean_buffer = ""; + } + continue; + } + if (in_syllable_block) { + // extra page + std::string glyph_key; + u8 hex_byte = curr_byte; + if (curr_byte == 5 && index + 1 < str.length()) { + hex_byte = str.at(index + 1); + glyph_key = fmt::format("extra_0x{:02x}", hex_byte); + index++; + } else { + glyph_key = fmt::format("0x{:02x}", hex_byte); + } + const auto jamo_list = jamo_glyph_mappings_jak2.find(glyph_key); + ASSERT_MSG(jamo_list != jamo_glyph_mappings_jak2.end(), + fmt::format("{} not found in jamo glyph lookup table", glyph_key)); + for (const auto& jamo : jamo_list->second) { + jamo_buffer += jamo; + } + num_syllable_glyphs--; + if (num_syllable_glyphs == 0) { + in_syllable_block = false; + result += font_util_korean::compose_korean_containing_text(jamo_buffer); + jamo_buffer = ""; + } + } else { + if (curr_byte != 0x3) { + non_korean_buffer.push_back(curr_byte); + } + } + index++; + } + // flush any non-korean characters + if (!non_korean_buffer.empty()) { + // handle remap + std::string remapped_str = replace_to_utf8(encode_game_to_utf8(non_korean_buffer)); + result += remapped_str; + non_korean_buffer = ""; + } + return result; +} diff --git a/common/util/FontUtils.h b/common/util/font/font_utils.h similarity index 51% rename from common/util/FontUtils.h rename to common/util/font/font_utils.h index 5aa1627a22..a6934b1c5e 100644 --- a/common/util/FontUtils.h +++ b/common/util/font/font_utils.h @@ -1,23 +1,40 @@ #pragma once -/*! - * @file FontUtils.h - * - * Code for handling text and strings in Jak 1's "large font" format. - * - * MAKE SURE THIS FILE IS ENCODED IN UTF-8!!! The various strings here depend on it. - * Always verify the encoding if string detection suddenly goes awry. - */ - #include +#include #include #include #include #include #include "common/common_types.h" +#include "common/util/Trie.h" +#include "common/util/font/font_utils_korean.h" +#include "common/util/json_util.h" #include "common/versions/versions.h" +/*! + * What bytes a set of characters (UTF-8) correspond to. You can convert to and fro. + */ +struct EncodeInfo { + std::string utf8; + std::string game_bytes; +}; + +/*! + * Replace an unconventional string of characters with/from something more readable. + * For example, turns Ñ into N + ~ + a bunch of modifiers. + */ +struct ReplaceInfo { + std::string game_encoding; + std::string utf8_string; + // for some replacements, we want to replace with something different when going from utf8 than + // when we originally matched it this is mostly applicable for when we have to max a string with + // hex chars that have been converted into `\c00` format but we want to insert the actual raw hex + // bytes back. + std::string utf8_alternative = ""; +}; + // version of the game text file's text encoding. Not real, but we need to differentiate them // somehow, since the encoding changes. enum class GameTextVersion { @@ -28,44 +45,26 @@ enum class GameTextVersion { JAKX = 40 // jak x }; -extern const std::unordered_map sTextVerEnumMap; - -const std::string& get_text_version_name(GameTextVersion version); -GameTextVersion get_text_version_from_name(const std::string& name); - -/*! - * What bytes a set of characters (UTF-8) correspond to. You can convert to and fro. - */ -struct EncodeInfo { - std::string chars; - std::vector bytes; -}; -/*! - * Replace an unconventional string of characters with/from something more readable. - * For example, turns Ñ into N + ~ + a bunch of modifiers. - */ -struct ReplaceInfo { - std::string from; - std::string to; -}; - /*! * All the information to convert UTF-8 text into game text. */ class GameTextFontBank { GameTextVersion m_version; // the version of the game text. we determine this ourselves. - std::vector* m_encode_info; - std::vector* m_replace_info; + + Trie m_encode_to_utf8_trie; + Trie m_encode_to_game_trie; + Trie m_replace_to_utf8_trie; + Trie m_replace_to_game_trie; + std::unordered_set* m_passthrus; + // jamo=>6 orientations with their drawing info + std::optional> m_korean_db = + std::nullopt; - const EncodeInfo* find_encode_to_utf8(const char* in) const; - const EncodeInfo* find_encode_to_game(const std::string& in, int off = 0) const; - const ReplaceInfo* find_replace_to_utf8(const std::string& in, int off = 0) const; - const ReplaceInfo* find_replace_to_game(const std::string& in, int off = 0) const; - - std::string replace_to_utf8(std::string& str) const; - std::string replace_to_game(std::string& str) const; - std::string encode_utf8_to_game(std::string& str) const; + std::string replace_to_utf8(const std::string& str) const; + std::string replace_to_game(const std::string& str) const; + std::string encode_utf8_to_game(const std::string& str) const; + std::string encode_game_to_utf8(const std::string& str) const; public: GameTextFontBank(GameTextVersion version, @@ -73,26 +72,34 @@ class GameTextFontBank { std::vector* replace_info, std::unordered_set* passthrus); - const std::vector* encode_info() const { return m_encode_info; } - const std::vector* replace_info() const { return m_replace_info; } const std::unordered_set* passthrus() const { return m_passthrus; } GameTextVersion version() const { return m_version; } // TODO - methods would help make this code a lot better for different game versions // hacking it for now - bool valid_char_range(const char in) const; + bool valid_char_range(const char& in) const; + bool is_language_id_korean(const int language_id) const; - std::string convert_utf8_to_game(std::string str, bool escape = false) const; + std::string convert_utf8_to_game(const std::string& str) const; std::string convert_game_to_utf8(const char* in) const; + + std::string convert_utf8_to_game_korean(const std::string& str); + std::string convert_korean_game_to_utf8(const char* in) const; }; -extern GameTextFontBank g_font_bank_jak1_v1; -extern GameTextFontBank g_font_bank_jak1_v2; -extern GameTextFontBank g_font_bank_jak2; -extern std::map g_font_banks; +extern const std::unordered_map sTextVerEnumMap; +const std::string& get_text_version_name(GameTextVersion version); +GameTextVersion get_text_version_from_name(const std::string& name); -const GameTextFontBank* get_font_bank(GameTextVersion version); -const GameTextFontBank* get_font_bank_from_game_version(GameVersion version); -const GameTextFontBank* get_font_bank(const std::string& name); +/*! + * ======================== + * GAME TEXT FONT BANK LIST + * ======================== + * The list of available font banks and a couple of helper functions. + */ +extern std::map g_font_banks; +GameTextFontBank* get_font_bank(GameTextVersion version); +GameTextFontBank* get_font_bank_from_game_version(GameVersion version); +GameTextFontBank* get_font_bank(const std::string& name); bool font_bank_exists(GameTextVersion version); diff --git a/common/util/font/font_utils_korean.cpp b/common/util/font/font_utils_korean.cpp new file mode 100644 index 0000000000..6f7ef4ea19 --- /dev/null +++ b/common/util/font/font_utils_korean.cpp @@ -0,0 +1,403 @@ +/* + MIT License + + Copyright (c) 2017 Jonghwan Hyeon + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + https://github.com/jonghwanhyeon/hangul-jamo/blob/main/LICENSE + + Code converted to C++ and deals with UTF-8 input +*/ + +#include "font_utils_korean.h" + +#include +#include +#include +#include + +#include "common/log/log.h" +#include "common/util/Assert.h" +#include "common/util/string_util.h" + +#include "fmt/format.h" + +// +// Reference: http://www.unicode.org/versions/Unicode8.0.0/ch03.pdf#G24646 +// + +const int BASE_OF_SYLLABLES = 0xAC00; + +const int BASE_OF_LEADING_CONSONANTS = 0x1100; +const int BASE_OF_VOWELS = 0x1161; +// One less than the beginning of the range of trailing consonants (0x11A8) +const int BASE_OF_TRAILING_CONSONANTS = 0x11A7; + +const int NUMBER_OF_LEADING_CONSONANTS = 19; +const int NUMBER_OF_VOWELS = 21; +// One more than the number of trailing consonants +const int NUMBER_OF_TRAILING_CONSONANTS = 28; + +const int NUMBER_OF_SYLLABLES_FOR_EACH_LEADING_CONSONANT = + NUMBER_OF_VOWELS * NUMBER_OF_TRAILING_CONSONANTS; +const int NUMBER_OF_SYLLABLES = + NUMBER_OF_LEADING_CONSONANTS * NUMBER_OF_SYLLABLES_FOR_EACH_LEADING_CONSONANT; + +// TODO - fix all of these, these generated wrong +const std::vector LEADING_CONSONANTS = {"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", + "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", + "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}; + +const std::unordered_map INDEX_BY_LEADING_CONSONANT = []() { + std::unordered_map m; + for (size_t i = 0; i < LEADING_CONSONANTS.size(); ++i) { + m[LEADING_CONSONANTS[i]] = static_cast(i); + } + return m; +}(); + +const std::vector VOWELS = {"ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", + "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", + "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"}; + +const std::unordered_map INDEX_BY_VOWEL = []() { + std::unordered_map m; + for (size_t i = 0; i < VOWELS.size(); ++i) { + m[VOWELS[i]] = static_cast(i); + } + return m; +}(); + +const std::vector TRAILING_CONSONANTS = { + "", "ᆨ", "ᆩ", "ᆪ", "ᆫ", "ᆬ", "ᆭ", "ᆮ", "ᆯ", "ᆯ", "ᆱ", "ㄼ", "ㄽ", "ㄾ", + "ㄿ", "ㅀ", "ᆷ", "ᆸ", "ㅄ", "ᆺ", "ᆻ", "ᆼ", "ᆽ", "ᆾ", "ᆿ", "ᇀ", "ᇁ", "ᇂ"}; + +const std::unordered_map INDEX_BY_TRAILING_CONSONANT = []() { + std::unordered_map m; + for (size_t i = 0; i < TRAILING_CONSONANTS.size(); ++i) { + m[TRAILING_CONSONANTS[i]] = static_cast(i); + } + return m; +}(); + +bool font_util_korean::is_korean_syllable(char32_t syllable) { + int index_of_syllable = syllable - BASE_OF_SYLLABLES; + return 0 <= index_of_syllable && index_of_syllable < NUMBER_OF_SYLLABLES; +} + +inline bool is_jamo_character(const std::string& character) { + return (std::find(LEADING_CONSONANTS.begin(), LEADING_CONSONANTS.end(), character) != + LEADING_CONSONANTS.end()) || + (std::find(VOWELS.begin(), VOWELS.end(), character) != VOWELS.end()) || + (std::find(TRAILING_CONSONANTS.begin(), TRAILING_CONSONANTS.end(), character) != + TRAILING_CONSONANTS.end()); +} + +inline std::string codepoint_to_utf8(char32_t cp) { + std::string result; + if (cp <= 0x7F) { + result += static_cast(cp); + } else if (cp <= 0x7FF) { + result += static_cast(0xC0 | ((cp >> 6) & 0x1F)); + result += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0xFFFF) { + result += static_cast(0xE0 | ((cp >> 12) & 0x0F)); + result += static_cast(0x80 | ((cp >> 6) & 0x3F)); + result += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0x10FFFF) { + result += static_cast(0xF0 | ((cp >> 18) & 0x07)); + result += static_cast(0x80 | ((cp >> 12) & 0x3F)); + result += static_cast(0x80 | ((cp >> 6) & 0x3F)); + result += static_cast(0x80 | (cp & 0x3F)); + } + return result; +} + +inline std::string compose_jamo_characters(const std::string& leading_consonant, + const std::string& vowel, + const std::optional& trailing_consonant) { + const int index_of_leading_consonant = INDEX_BY_LEADING_CONSONANT.at(leading_consonant) * + NUMBER_OF_SYLLABLES_FOR_EACH_LEADING_CONSONANT; + const int index_of_vowel = INDEX_BY_VOWEL.at(vowel) * NUMBER_OF_TRAILING_CONSONANTS; + const int index_of_leading_consonant_and_vowel = index_of_leading_consonant + index_of_vowel; + + int index_of_trailing = trailing_consonant.has_value() + ? INDEX_BY_TRAILING_CONSONANT.at(trailing_consonant.value()) + : 0; + int index_of_syllable = index_of_leading_consonant_and_vowel + index_of_trailing; + + return codepoint_to_utf8(BASE_OF_SYLLABLES + index_of_syllable); +} + +std::vector utf8_to_codepoints(const std::string& text) { + std::vector codepoints; + size_t i = 0; + while (i < text.size()) { + char32_t cp = 0; + unsigned char c = text[i]; + if (c < 0x80) { + cp = c; + ++i; + } else if ((c >> 5) == 0x6) { + cp = ((c & 0x1F) << 6) | (text[i + 1] & 0x3F); + i += 2; + } else if ((c >> 4) == 0xE) { + cp = ((c & 0x0F) << 12) | ((text[i + 1] & 0x3F) << 6) | (text[i + 2] & 0x3F); + i += 3; + } else if ((c >> 3) == 0x1E) { + cp = ((c & 0x07) << 18) | ((text[i + 1] & 0x3F) << 12) | ((text[i + 2] & 0x3F) << 6) | + (text[i + 3] & 0x3F); + i += 4; + } else { + ++i; + } + codepoints.push_back(cp); + } + return codepoints; +} + +bool is_leading(char32_t c) { + // Replace with actual lookup (e.g. return LEADING_CONSONANTS.count(c) > 0;) + return (c >= 0x1100 && c <= 0x1112); +} + +bool is_vowel(char32_t c) { + return (c >= 0x1161 && c <= 0x1175); +} + +bool is_trailing(char32_t c) { + return (c >= 0x11A8 && c <= 0x11C2); +} + +// Compose jamo into a syllable block +char32_t compose_jamo(char32_t lead, char32_t vowel, std::optional trail = std::nullopt) { + char32_t l_index = lead - 0x1100; + char32_t v_index = vowel - 0x1161; + char32_t t_index = trail ? (*trail - 0x11A7) : 0; + return 0xAC00 + (l_index * 21 * 28) + (v_index * 28) + t_index; +} + +std::string font_util_korean::compose_korean_containing_text(const std::string& text) { + std::string output; + std::vector cps = utf8_to_codepoints(text); + + size_t i = 0; + while (i < cps.size()) { + char32_t first = cps[i]; + char32_t second = (i + 1 < cps.size()) ? cps[i + 1] : 0; + char32_t third = (i + 2 < cps.size()) ? cps[i + 2] : 0; + char32_t fourth = (i + 3 < cps.size()) ? cps[i + 3] : 0; + if (is_leading(first) && is_vowel(second) && is_leading(third) && is_vowel(fourth)) { + char32_t syllable = compose_jamo(first, second); + output += codepoint_to_utf8(syllable); + i += 2; // consume 2 codepoints + } else if (is_leading(first) && is_vowel(second) && is_trailing(third)) { + char32_t syllable = compose_jamo(first, second, third); + output += codepoint_to_utf8(syllable); + i += 3; // consume 3 codepoints + } else if (is_leading(first) && is_vowel(second)) { + char32_t syllable = compose_jamo(first, second); + output += codepoint_to_utf8(syllable); + i += 2; // consume 2 codepoints + } else { + output += codepoint_to_utf8(first); + i += 1; + } + } + + return output; +} + +// std::string font_util_korean::decompose_korean_containing_text(const std::string& text) { +// std::string output; +// size_t i = 0; +// while (i < text.size()) { +// char32_t cp = next_utf8_char(text, i); + +// if (is_syllable(cp)) { +// // Decompose Hangul syllable block into jamo +// char32_t SIndex = cp - 0xAC00; +// char32_t L = 0x1100 + SIndex / (21 * 28); +// char32_t V = 0x1161 + (SIndex % (21 * 28)) / 28; +// char32_t T = 0x11A7 + (SIndex % 28); + +// output += codepoint_to_utf8(L); +// output += codepoint_to_utf8(V); +// if (T != 0x11A7) { // has final consonant +// output += codepoint_to_utf8(T); +// } +// } else { +// // For other characters, re-encode as-is +// output += codepoint_to_utf8(cp); +// } +// } +// return output; +// } + +bool is_median_vowel_vertical(char32_t vowel) { + if ((vowel >= 0x1161 && vowel <= 0x1168) || vowel == 0x1175) { + return true; + } + return false; +} + +bool is_median_vowel_horizontal(char32_t vowel) { + if (vowel == 0x1169 || (vowel >= 0x116D && vowel <= 0x116E) || + (vowel >= 0x1172 && vowel <= 0x1173)) { + return true; + } + return false; +} + +bool is_median_vowel_combined(char32_t vowel) { + if (vowel >= 0x1161 && vowel <= 0x1175 && !is_median_vowel_vertical(vowel) && + !is_median_vowel_horizontal(vowel)) { + return true; + } + return false; +} + +std::string glyph_hex_string_to_int(const std::string& str) { + try { + std::string result; + if (str_util::starts_with(str, "extra_")) { + // handle glyphs on the secondary texture page + result += 0x5; + std::string temp = str; + str_util::replace(temp, "extra_", ""); + result += std::stoi(temp, nullptr, 0); + } else { + result += std::stoi(str, nullptr, 0); + } + return result; + } catch (std::exception& e) { + lg::error("Unable to convert hex_string_to_int: {}", str); + throw; + } +} + +std::string font_util_korean::game_encode_korean_syllable( + const std::string& context, + const char32_t cp, + const std::unordered_map& db) { + std::string output; + // Decompose Hangul syllable block into jamo + char32_t syllable_index = cp - BASE_OF_SYLLABLES; + char32_t initial = BASE_OF_LEADING_CONSONANTS + syllable_index / (21 * 28); + char32_t median = BASE_OF_VOWELS + (syllable_index % (21 * 28)) / 28; + char32_t final = BASE_OF_TRAILING_CONSONANTS + (syllable_index % 28); + + bool final_present = final != BASE_OF_TRAILING_CONSONANTS; + int orientation = -1; + // Figure out which orientation we are dealing with + if (!final_present) { + // orientations 0 - 2 + if (is_median_vowel_vertical(median)) { + orientation = 0; + } else if (is_median_vowel_horizontal(median)) { + orientation = 1; + } else if (is_median_vowel_combined(median)) { + orientation = 2; + } + } else { + // orientations 3 - 5 + if (is_median_vowel_vertical(median)) { + orientation = 3; + } else if (is_median_vowel_horizontal(median)) { + orientation = 4; + } else if (is_median_vowel_combined(median)) { + orientation = 5; + } + } + ASSERT_MSG(orientation != -1, + fmt::format("Unable to deduce drawing orientation for korean syllable block in '{}'", + context)); + + // now that we know the orientation, we can consult our lookup database to get the glyphs to + // use for all the involved jamo + // + // convert each jamo to utf-8 bytes since that is what our DB is encoded with. + // - first see if the jamo has an alternative drawing glyph, if not, use the default + // + // the order the glyphs are drawn in does not matter, as they all overlap anyway. + std::vector glyphs_to_draw = {}; + const auto initial_utf8 = codepoint_to_utf8(initial); + const auto median_utf8 = codepoint_to_utf8(median); + if (final == BASE_OF_TRAILING_CONSONANTS) { // no final consonant + const auto initial_alt_lookup_key = fmt::format(",{}", median_utf8); + const auto& initial_alts = db.at(initial_utf8).at(orientation).alternatives; + if (initial_alts.contains(initial_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(initial_alts.at(initial_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(initial_utf8).at(orientation).defaultGlyph)); + } + const auto median_alt_lookup_key = fmt::format("{},", initial_utf8); + const auto& median_alts = db.at(median_utf8).at(orientation).alternatives; + if (median_alts.contains(median_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(median_alts.at(median_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(median_utf8).at(orientation).defaultGlyph)); + } + } else { + const auto final_utf8 = codepoint_to_utf8(final); + const auto initial_alt_lookup_key = fmt::format(",{},{}", median_utf8, final_utf8); + const auto& initial_alts = db.at(initial_utf8).at(orientation).alternatives; + if (initial_alts.contains(initial_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(initial_alts.at(initial_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(initial_utf8).at(orientation).defaultGlyph)); + } + const auto median_alt_lookup_key = fmt::format("{},,{}", initial_utf8, final_utf8); + const auto& median_alts = db.at(median_utf8).at(orientation).alternatives; + if (median_alts.contains(median_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(median_alts.at(median_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(median_utf8).at(orientation).defaultGlyph)); + } + const auto final_alt_lookup_key = fmt::format("{},{},", initial_utf8, median_utf8); + const auto& final_alts = db.at(final_utf8).at(orientation).alternatives; + if (final_alts.contains(final_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(final_alts.at(final_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(final_utf8).at(orientation).defaultGlyph)); + } + } + + // Get rid of any duplicates in the glyphs + std::vector final_glyphs_to_draw = {}; + for (const auto& glyph : glyphs_to_draw) { + if (std::find(final_glyphs_to_draw.begin(), final_glyphs_to_draw.end(), glyph) == + final_glyphs_to_draw.end()) { + final_glyphs_to_draw.push_back(glyph); + } + } + + output += 0x4; + output += final_glyphs_to_draw.size(); + for (const auto& glyph : final_glyphs_to_draw) { + output += glyph; + } + return output; +} diff --git a/common/util/font/font_utils_korean.h b/common/util/font/font_utils_korean.h new file mode 100644 index 0000000000..7eefd9e549 --- /dev/null +++ b/common/util/font/font_utils_korean.h @@ -0,0 +1,54 @@ +/* + MIT License + + Copyright (c) 2017 Jonghwan Hyeon + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + https://github.com/jonghwanhyeon/hangul-jamo/blob/main/LICENSE + + Code converted to C++ +*/ + +#pragma once + +#include + +#include "common/util/json_util.h" + +struct KoreanLookupEntry { + // glyph to use if no relevant alternative exists + std::string defaultGlyph; + // context=>glyph + // ie. ",\u1166" + // when wanting to draw a specific jamo, it's spot is indicated by the + std::unordered_map alternatives; +}; +void from_json(const json& j, KoreanLookupEntry& obj); + +typedef std::vector KoreanLookupOrientations; + +namespace font_util_korean { +bool is_korean_syllable(char32_t syllable); +std::string compose_korean_containing_text(const std::string& text); +std::string game_encode_korean_syllable( + const std::string& context, + const char32_t cp, + const std::unordered_map& db); +}; // namespace font_util_korean diff --git a/common/util/string_util.cpp b/common/util/string_util.cpp index b4fd766121..0ac67ed900 100644 --- a/common/util/string_util.cpp +++ b/common/util/string_util.cpp @@ -254,4 +254,47 @@ std::string pad_right(const std::string& input, const int width, const char padd return input + std::string(padding_width, padding_char); } } + +char32_t next_utf8_char(const std::string& s, size_t& i) { + char32_t cp = 0; + unsigned char c = s[i]; + if (c < 0x80) { // 1-byte ASCII + cp = c; + ++i; + } else if ((c >> 5) == 0x6) { // 2-byte + cp = ((c & 0x1F) << 6) | (s[i + 1] & 0x3F); + i += 2; + } else if ((c >> 4) == 0xE) { // 3-byte + cp = ((c & 0x0F) << 12) | ((s[i + 1] & 0x3F) << 6) | (s[i + 2] & 0x3F); + i += 3; + } else if ((c >> 3) == 0x1E) { // 4-byte + cp = ((c & 0x07) << 18) | ((s[i + 1] & 0x3F) << 12) | ((s[i + 2] & 0x3F) << 6) | + (s[i + 3] & 0x3F); + i += 4; + } else { + // invalid + ++i; + } + return cp; +} + +std::string utf8_encode(char32_t cp) { + std::string out; + if (cp <= 0x7F) { + out += static_cast(cp); + } else if (cp <= 0x7FF) { + out += static_cast(0xC0 | ((cp >> 6) & 0x1F)); + out += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0xFFFF) { + out += static_cast(0xE0 | ((cp >> 12) & 0x0F)); + out += static_cast(0x80 | ((cp >> 6) & 0x3F)); + out += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0x10FFFF) { + out += static_cast(0xF0 | ((cp >> 18) & 0x07)); + out += static_cast(0x80 | ((cp >> 12) & 0x3F)); + out += static_cast(0x80 | ((cp >> 6) & 0x3F)); + out += static_cast(0x80 | (cp & 0x3F)); + } + return out; +} } // namespace str_util diff --git a/common/util/string_util.h b/common/util/string_util.h index 6b321411d0..4e3567989b 100644 --- a/common/util/string_util.h +++ b/common/util/string_util.h @@ -36,4 +36,6 @@ std::string to_lower(const std::string& str); bool hex_char(char c); std::string titlize(const std::string& str); std::string pad_right(const std::string& input, const int width, const char padding_char); +char32_t next_utf8_char(const std::string& s, size_t& i); +std::string utf8_encode(char32_t cp); } // namespace str_util diff --git a/decompiler/data/game_subs.h b/decompiler/data/game_subs.h index 3d9f0c3c8c..91a06d06f2 100644 --- a/decompiler/data/game_subs.h +++ b/decompiler/data/game_subs.h @@ -6,7 +6,7 @@ #include #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" namespace decompiler { struct ObjectFileData; diff --git a/decompiler/data/game_text.cpp b/decompiler/data/game_text.cpp index 1407dcb641..4c97e2b278 100644 --- a/decompiler/data/game_text.cpp +++ b/decompiler/data/game_text.cpp @@ -9,7 +9,8 @@ #include "common/goos/Reader.h" #include "common/util/BitUtils.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" +#include "common/util/font/font_utils_korean.h" #include "common/util/print_float.h" #include "decompiler/ObjectFile/ObjectFileDB.h" @@ -113,7 +114,10 @@ GameTextResult process_game_text(ObjectFileData& data, GameTextVersion version) } // escape characters - if (font_bank_exists(version)) { + if (get_font_bank(version)->is_language_id_korean(language)) { + // If we are doing korean, we process it differently + result.text[text_id] = get_font_bank(version)->convert_korean_game_to_utf8(text.c_str()); + } else if (font_bank_exists(version)) { result.text[text_id] = get_font_bank(version)->convert_game_to_utf8(text.c_str()); } else { result.text[text_id] = goos::get_readable_string(text.c_str()); // HACK! diff --git a/decompiler/data/game_text.h b/decompiler/data/game_text.h index a1b73458f2..c0d883b06e 100644 --- a/decompiler/data/game_text.h +++ b/decompiler/data/game_text.h @@ -2,7 +2,7 @@ #include #include -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" namespace decompiler { struct ObjectFileData; diff --git a/game/assets/fonts/jak2_jak3_korean_db.json b/game/assets/fonts/jak2_jak3_korean_db.json new file mode 100644 index 0000000000..47240aa621 --- /dev/null +++ b/game/assets/fonts/jak2_jak3_korean_db.json @@ -0,0 +1,11014 @@ +{ + "\u1100": [ + { + "defaultGlyph": "0x06", + "alternatives": { + ",\u1166": "0x33", + ",\u1168": "0x33", + ",\u1162": "0x33", + ",\u1164": "0x33" + } + }, + { + "defaultGlyph": "0x5e", + "alternatives": {} + }, + { + "defaultGlyph": "0x8b", + "alternatives": { + ",\u116b": "0xb3" + } + }, + { + "defaultGlyph": "0x06", + "alternatives": { + ",\u1166,\u11bb": "0x33", + ",\u1166,\u11b7": "0x33", + ",\u1166,\u11ba": "0x33", + ",\u1166,\u11ab": "0x33", + ",\u1164,\u11a8": "0x33", + ",\u1164,\u11a9": "0x33", + ",\u1164,\u11aa": "0x33", + ",\u1164,\u11ab": "0x33", + ",\u1164,\u11ac": "0x33", + ",\u1164,\u11ad": "0x33", + ",\u1164,\u11ae": "0x33", + ",\u1164,\u11af": "0x33", + ",\u1164,\u11b0": "0x33", + ",\u1164,\u11b1": "0x33", + ",\u1164,\u11b2": "0x33", + ",\u1164,\u11b3": "0x33", + ",\u1164,\u11b4": "0x33", + ",\u1164,\u11b5": "0x33", + ",\u1164,\u11b6": "0x33", + ",\u1164,\u11b7": "0x33", + ",\u1164,\u11b8": "0x33", + ",\u1164,\u11b9": "0x33", + ",\u1164,\u11ba": "0x33", + ",\u1164,\u11bb": "0x33", + ",\u1164,\u11bc": "0x33", + ",\u1164,\u11bd": "0x33", + ",\u1164,\u11be": "0x33", + ",\u1164,\u11bf": "0x33", + ",\u1164,\u11c0": "0x33", + ",\u1164,\u11c1": "0x33", + ",\u1164,\u11c2": "0x33", + ",\u1166,\u11a8": "0x33", + ",\u1166,\u11a9": "0x33", + ",\u1166,\u11aa": "0x33", + ",\u1166,\u11ac": "0x33", + ",\u1166,\u11ad": "0x33", + ",\u1166,\u11ae": "0x33", + ",\u1166,\u11af": "0x33", + ",\u1166,\u11b0": "0x33", + ",\u1166,\u11b1": "0x33", + ",\u1166,\u11b2": "0x33", + ",\u1166,\u11b3": "0x33", + ",\u1166,\u11b4": "0x33", + ",\u1166,\u11b5": "0x33", + ",\u1166,\u11b6": "0x33", + ",\u1166,\u11b8": "0x33", + ",\u1166,\u11b9": "0x33", + ",\u1166,\u11bc": "0x33", + ",\u1166,\u11bd": "0x33", + ",\u1166,\u11be": "0x33", + ",\u1166,\u11bf": "0x33", + ",\u1166,\u11c0": "0x33", + ",\u1166,\u11c1": "0x33", + ",\u1166,\u11c2": "0x33", + ",\u1168,\u11a8": "0x33", + ",\u1168,\u11a9": "0x33", + ",\u1168,\u11aa": "0x33", + ",\u1168,\u11ab": "0x33", + ",\u1168,\u11ac": "0x33", + ",\u1168,\u11ad": "0x33", + ",\u1168,\u11ae": "0x33", + ",\u1168,\u11af": "0x33", + ",\u1168,\u11b0": "0x33", + ",\u1168,\u11b1": "0x33", + ",\u1168,\u11b2": "0x33", + ",\u1168,\u11b3": "0x33", + ",\u1168,\u11b4": "0x33", + ",\u1168,\u11b5": "0x33", + ",\u1168,\u11b6": "0x33", + ",\u1168,\u11b7": "0x33", + ",\u1168,\u11b8": "0x33", + ",\u1168,\u11b9": "0x33", + ",\u1168,\u11ba": "0x33", + ",\u1168,\u11bb": "0x33", + ",\u1168,\u11bc": "0x33", + ",\u1168,\u11bd": "0x33", + ",\u1168,\u11be": "0x33", + ",\u1168,\u11bf": "0x33", + ",\u1168,\u11c0": "0x33", + ",\u1168,\u11c1": "0x33", + ",\u1168,\u11c2": "0x33" + } + }, + { + "defaultGlyph": "0x5e", + "alternatives": {} + }, + { + "defaultGlyph": "0x8b", + "alternatives": { + ",\u116b,\u11ab": "0xae", + ",\u1174,\u11a8": "0xae", + ",\u1174,\u11a9": "0xae", + ",\u1174,\u11aa": "0xae", + ",\u1174,\u11ab": "0xae", + ",\u1174,\u11ac": "0xae", + ",\u1174,\u11ad": "0xae", + ",\u1174,\u11ae": "0xae", + ",\u1174,\u11af": "0xae", + ",\u1174,\u11b0": "0xae", + ",\u1174,\u11b1": "0xae", + ",\u1174,\u11b2": "0xae", + ",\u1174,\u11b3": "0xae", + ",\u1174,\u11b4": "0xae", + ",\u1174,\u11b5": "0xae", + ",\u1174,\u11b6": "0xae", + ",\u1174,\u11b7": "0xae", + ",\u1174,\u11b8": "0xae", + ",\u1174,\u11b9": "0xae", + ",\u1174,\u11ba": "0xae", + ",\u1174,\u11bb": "0xae", + ",\u1174,\u11bc": "0xae", + ",\u1174,\u11bd": "0xae", + ",\u1174,\u11be": "0xae", + ",\u1174,\u11bf": "0xae", + ",\u1174,\u11c0": "0xae", + ",\u1174,\u11c1": "0xae", + ",\u1174,\u11c2": "0xae" + } + } + ], + "\u1101": [ + { + "defaultGlyph": "0x34", + "alternatives": { + ",\u1162": "0x34", + ",\u1166": "0x34", + ",\u1175": "0x07" + } + }, + { + "defaultGlyph": "0x68", + "alternatives": { + ",\u1169": "0x66", + ",\u116d": "0x67" + } + }, + { + "defaultGlyph": "0xb3", + "alternatives": { + ",\u116b": "0x64", + ",\u116f": "0x91" + } + }, + { + "defaultGlyph": "0x34", + "alternatives": { + ",\u1162,\u11af": "0x34" + } + }, + { + "defaultGlyph": "0x65", + "alternatives": { + ",\u1169,\u11bd": "0x65", + ",\u1169,\u11a8": "0x65", + ",\u1169,\u11af": "0x65", + ",\u1169,\u11b7": "0x65", + ",\u1169,\u11bc": "0x65", + ",\u116d,\u11a8": "0x68", + ",\u116d,\u11a9": "0x68", + ",\u116d,\u11aa": "0x68", + ",\u116d,\u11ab": "0x68", + ",\u116d,\u11ac": "0x68", + ",\u116d,\u11ad": "0x68", + ",\u116d,\u11ae": "0x68", + ",\u116d,\u11af": "0x68", + ",\u116d,\u11b0": "0x68", + ",\u116d,\u11b1": "0x68", + ",\u116d,\u11b2": "0x68", + ",\u116d,\u11b3": "0x68", + ",\u116d,\u11b4": "0x68", + ",\u116d,\u11b5": "0x68", + ",\u116d,\u11b6": "0x68", + ",\u116d,\u11b7": "0x68", + ",\u116d,\u11b8": "0x68", + ",\u116d,\u11b9": "0x68", + ",\u116d,\u11ba": "0x68", + ",\u116d,\u11bb": "0x68", + ",\u116d,\u11bc": "0x68", + ",\u116d,\u11bd": "0x68", + ",\u116d,\u11be": "0x68", + ",\u116d,\u11bf": "0x68", + ",\u116d,\u11c0": "0x68", + ",\u116d,\u11c1": "0x68", + ",\u116d,\u11c2": "0x68", + ",\u116e,\u11a8": "0x68", + ",\u116e,\u11a9": "0x68", + ",\u116e,\u11aa": "0x68", + ",\u116e,\u11ab": "0x68", + ",\u116e,\u11ac": "0x68", + ",\u116e,\u11ad": "0x68", + ",\u116e,\u11ae": "0x68", + ",\u116e,\u11af": "0x68", + ",\u116e,\u11b0": "0x68", + ",\u116e,\u11b1": "0x68", + ",\u116e,\u11b2": "0x68", + ",\u116e,\u11b3": "0x68", + ",\u116e,\u11b4": "0x68", + ",\u116e,\u11b5": "0x68", + ",\u116e,\u11b6": "0x68", + ",\u116e,\u11b7": "0x68", + ",\u116e,\u11b8": "0x68", + ",\u116e,\u11b9": "0x68", + ",\u116e,\u11ba": "0x68", + ",\u116e,\u11bb": "0x68", + ",\u116e,\u11bc": "0x68", + ",\u116e,\u11bd": "0x68", + ",\u116e,\u11be": "0x68", + ",\u116e,\u11bf": "0x68", + ",\u116e,\u11c0": "0x68", + ",\u116e,\u11c1": "0x68", + ",\u116e,\u11c2": "0x68", + ",\u1172,\u11a8": "0x68", + ",\u1172,\u11a9": "0x68", + ",\u1172,\u11aa": "0x68", + ",\u1172,\u11ab": "0x68", + ",\u1172,\u11ac": "0x68", + ",\u1172,\u11ad": "0x68", + ",\u1172,\u11ae": "0x68", + ",\u1172,\u11af": "0x68", + ",\u1172,\u11b0": "0x68", + ",\u1172,\u11b1": "0x68", + ",\u1172,\u11b2": "0x68", + ",\u1172,\u11b3": "0x68", + ",\u1172,\u11b4": "0x68", + ",\u1172,\u11b5": "0x68", + ",\u1172,\u11b6": "0x68", + ",\u1172,\u11b7": "0x68", + ",\u1172,\u11b8": "0x68", + ",\u1172,\u11b9": "0x68", + ",\u1172,\u11ba": "0x68", + ",\u1172,\u11bb": "0x68", + ",\u1172,\u11bc": "0x68", + ",\u1172,\u11bd": "0x68", + ",\u1172,\u11be": "0x68", + ",\u1172,\u11bf": "0x68", + ",\u1172,\u11c0": "0x68", + ",\u1172,\u11c1": "0x68", + ",\u1172,\u11c2": "0x68", + ",\u1173,\u11a8": "0x68", + ",\u1173,\u11a9": "0x68", + ",\u1173,\u11aa": "0x68", + ",\u1173,\u11ab": "0x68", + ",\u1173,\u11ac": "0x68", + ",\u1173,\u11ad": "0x68", + ",\u1173,\u11ae": "0x68", + ",\u1173,\u11af": "0x68", + ",\u1173,\u11b0": "0x68", + ",\u1173,\u11b1": "0x68", + ",\u1173,\u11b2": "0x68", + ",\u1173,\u11b3": "0x68", + ",\u1173,\u11b4": "0x68", + ",\u1173,\u11b5": "0x68", + ",\u1173,\u11b6": "0x68", + ",\u1173,\u11b7": "0x68", + ",\u1173,\u11b8": "0x68", + ",\u1173,\u11b9": "0x68", + ",\u1173,\u11ba": "0x68", + ",\u1173,\u11bb": "0x68", + ",\u1173,\u11bc": "0x68", + ",\u1173,\u11bd": "0x68", + ",\u1173,\u11be": "0x68", + ",\u1173,\u11bf": "0x68", + ",\u1173,\u11c0": "0x68", + ",\u1173,\u11c1": "0x68", + ",\u1173,\u11c2": "0x68" + } + }, + { + "defaultGlyph": "0x91", + "alternatives": { + ",\u1171,\u11b8": "0x91", + ",\u116a,\u11a8": "0x8f", + ",\u116a,\u11a9": "0x8f", + ",\u116a,\u11aa": "0x8f", + ",\u116a,\u11ab": "0x8f", + ",\u116a,\u11ac": "0x8f", + ",\u116a,\u11ad": "0x8f", + ",\u116a,\u11ae": "0x8f", + ",\u116a,\u11af": "0x8f", + ",\u116a,\u11b0": "0x8f", + ",\u116a,\u11b1": "0x8f", + ",\u116a,\u11b2": "0x8f", + ",\u116a,\u11b3": "0x8f", + ",\u116a,\u11b4": "0x8f", + ",\u116a,\u11b5": "0x8f", + ",\u116a,\u11b6": "0x8f", + ",\u116a,\u11b7": "0x8f", + ",\u116a,\u11b8": "0x8f", + ",\u116a,\u11b9": "0x8f", + ",\u116a,\u11ba": "0x8f", + ",\u116a,\u11bb": "0x8f", + ",\u116a,\u11bc": "0x8f", + ",\u116a,\u11bd": "0x8f", + ",\u116a,\u11be": "0x8f", + ",\u116a,\u11bf": "0x8f", + ",\u116a,\u11c0": "0x8f", + ",\u116a,\u11c1": "0x8f", + ",\u116a,\u11c2": "0x8f", + ",\u116b,\u11a8": "0x64", + ",\u116b,\u11a9": "0x64", + ",\u116b,\u11aa": "0x64", + ",\u116b,\u11ab": "0x64", + ",\u116b,\u11ac": "0x64", + ",\u116b,\u11ad": "0x64", + ",\u116b,\u11ae": "0x64", + ",\u116b,\u11af": "0x64", + ",\u116b,\u11b0": "0x64", + ",\u116b,\u11b1": "0x64", + ",\u116b,\u11b2": "0x64", + ",\u116b,\u11b3": "0x64", + ",\u116b,\u11b4": "0x64", + ",\u116b,\u11b5": "0x64", + ",\u116b,\u11b6": "0x64", + ",\u116b,\u11b7": "0x64", + ",\u116b,\u11b8": "0x64", + ",\u116b,\u11b9": "0x64", + ",\u116b,\u11ba": "0x64", + ",\u116b,\u11bb": "0x64", + ",\u116b,\u11bc": "0x64", + ",\u116b,\u11bd": "0x64", + ",\u116b,\u11be": "0x64", + ",\u116b,\u11bf": "0x64", + ",\u116b,\u11c0": "0x64", + ",\u116b,\u11c1": "0x64", + ",\u116b,\u11c2": "0x64", + ",\u1170,\u11a8": "0xb3", + ",\u1170,\u11a9": "0xb3", + ",\u1170,\u11aa": "0xb3", + ",\u1170,\u11ab": "0xb3", + ",\u1170,\u11ac": "0xb3", + ",\u1170,\u11ad": "0xb3", + ",\u1170,\u11ae": "0xb3", + ",\u1170,\u11af": "0xb3", + ",\u1170,\u11b0": "0xb3", + ",\u1170,\u11b1": "0xb3", + ",\u1170,\u11b2": "0xb3", + ",\u1170,\u11b3": "0xb3", + ",\u1170,\u11b4": "0xb3", + ",\u1170,\u11b5": "0xb3", + ",\u1170,\u11b6": "0xb3", + ",\u1170,\u11b7": "0xb3", + ",\u1170,\u11b8": "0xb3", + ",\u1170,\u11b9": "0xb3", + ",\u1170,\u11ba": "0xb3", + ",\u1170,\u11bb": "0xb3", + ",\u1170,\u11bc": "0xb3", + ",\u1170,\u11bd": "0xb3", + ",\u1170,\u11be": "0xb3", + ",\u1170,\u11bf": "0xb3", + ",\u1170,\u11c0": "0xb3", + ",\u1170,\u11c1": "0xb3", + ",\u1170,\u11c2": "0xb3", + ",\u116c,\u11a8": "0x8f", + ",\u116c,\u11a9": "0x8f", + ",\u116c,\u11aa": "0x8f", + ",\u116c,\u11ab": "0x8f", + ",\u116c,\u11ac": "0x8f", + ",\u116c,\u11ad": "0x8f", + ",\u116c,\u11ae": "0x8f", + ",\u116c,\u11af": "0x8f", + ",\u116c,\u11b0": "0x8f", + ",\u116c,\u11b1": "0x8f", + ",\u116c,\u11b2": "0x8f", + ",\u116c,\u11b3": "0x8f", + ",\u116c,\u11b4": "0x8f", + ",\u116c,\u11b5": "0x8f", + ",\u116c,\u11b6": "0x8f", + ",\u116c,\u11b7": "0x8f", + ",\u116c,\u11b8": "0x8f", + ",\u116c,\u11b9": "0x8f", + ",\u116c,\u11ba": "0x8f", + ",\u116c,\u11bb": "0x8f", + ",\u116c,\u11bc": "0x8f", + ",\u116c,\u11bd": "0x8f", + ",\u116c,\u11be": "0x8f", + ",\u116c,\u11bf": "0x8f", + ",\u116c,\u11c0": "0x8f", + ",\u116c,\u11c1": "0x8f", + ",\u116c,\u11c2": "0x8f" + } + } + ], + "\u1102": [ + { + "defaultGlyph": "0x08", + "alternatives": { + ",\u1162": "0x35", + ",\u1165": "0x1f", + ",\u1167": "0x1f", + ",\u1166": "0x4a", + ",\u1161": "0x1f", + ",\u1163": "0x1f", + ",\u1168": "0x4a", + ",\u1164": "0x35" + } + }, + { + "defaultGlyph": "0x69", + "alternatives": {} + }, + { + "defaultGlyph": "0x92", + "alternatives": { + ",\u116b": "0xb4", + ",\u1170": "0xb4" + } + }, + { + "defaultGlyph": "0x08", + "alternatives": { + ",\u1165,\u11c2": "0x1f", + ",\u1165,\u11af": "0x1f", + ",\u1167,\u11ab": "0x1f", + ",\u1165,\u11b7": "0x1f", + ",\u1167,\u11bc": "0x1f", + ",\u1167,\u11b7": "0x1f", + ",\u1165,\u11ab": "0x1f", + ",\u1167,\u11bb": "0x1f", + ",\u1162,\u11ab": "0x35", + ",\u1162,\u11b7": "0x35", + ",\u1162,\u11bb": "0x35", + ",\u1162,\u11af": "0x35", + ",\u1162,\u11a8": "0x35", + ",\u1162,\u11a9": "0x35", + ",\u1162,\u11aa": "0x35", + ",\u1162,\u11ac": "0x35", + ",\u1162,\u11ad": "0x35", + ",\u1162,\u11ae": "0x35", + ",\u1162,\u11b0": "0x35", + ",\u1162,\u11b1": "0x35", + ",\u1162,\u11b2": "0x35", + ",\u1162,\u11b3": "0x35", + ",\u1162,\u11b4": "0x35", + ",\u1162,\u11b5": "0x35", + ",\u1162,\u11b6": "0x35", + ",\u1162,\u11b8": "0x35", + ",\u1162,\u11b9": "0x35", + ",\u1162,\u11ba": "0x35", + ",\u1162,\u11bc": "0x35", + ",\u1162,\u11bd": "0x35", + ",\u1162,\u11be": "0x35", + ",\u1162,\u11bf": "0x35", + ",\u1162,\u11c0": "0x35", + ",\u1162,\u11c1": "0x35", + ",\u1162,\u11c2": "0x35", + ",\u1164,\u11a8": "0x35", + ",\u1164,\u11a9": "0x35", + ",\u1164,\u11aa": "0x35", + ",\u1164,\u11ab": "0x35", + ",\u1164,\u11ac": "0x35", + ",\u1164,\u11ad": "0x35", + ",\u1164,\u11ae": "0x35", + ",\u1164,\u11af": "0x35", + ",\u1164,\u11b0": "0x35", + ",\u1164,\u11b1": "0x35", + ",\u1164,\u11b2": "0x35", + ",\u1164,\u11b3": "0x35", + ",\u1164,\u11b4": "0x35", + ",\u1164,\u11b5": "0x35", + ",\u1164,\u11b6": "0x35", + ",\u1164,\u11b7": "0x35", + ",\u1164,\u11b8": "0x35", + ",\u1164,\u11b9": "0x35", + ",\u1164,\u11ba": "0x35", + ",\u1164,\u11bb": "0x35", + ",\u1164,\u11bc": "0x35", + ",\u1164,\u11bd": "0x35", + ",\u1164,\u11be": "0x35", + ",\u1164,\u11bf": "0x35", + ",\u1164,\u11c0": "0x35", + ",\u1164,\u11c1": "0x35", + ",\u1164,\u11c2": "0x35", + ",\u1166,\u11a8": "0x35", + ",\u1166,\u11a9": "0x35", + ",\u1166,\u11aa": "0x35", + ",\u1166,\u11ab": "0x35", + ",\u1166,\u11ac": "0x35", + ",\u1166,\u11ad": "0x35", + ",\u1166,\u11ae": "0x35", + ",\u1166,\u11af": "0x35", + ",\u1166,\u11b0": "0x35", + ",\u1166,\u11b1": "0x35", + ",\u1166,\u11b2": "0x35", + ",\u1166,\u11b3": "0x35", + ",\u1166,\u11b4": "0x35", + ",\u1166,\u11b5": "0x35", + ",\u1166,\u11b6": "0x35", + ",\u1166,\u11b7": "0x35", + ",\u1166,\u11b8": "0x35", + ",\u1166,\u11b9": "0x35", + ",\u1166,\u11ba": "0x35", + ",\u1166,\u11bb": "0x35", + ",\u1166,\u11bc": "0x35", + ",\u1166,\u11bd": "0x35", + ",\u1166,\u11be": "0x35", + ",\u1166,\u11bf": "0x35", + ",\u1166,\u11c0": "0x35", + ",\u1166,\u11c1": "0x35", + ",\u1166,\u11c2": "0x35", + ",\u1167,\u11a8": "0x1f", + ",\u1167,\u11a9": "0x1f", + ",\u1167,\u11aa": "0x1f", + ",\u1167,\u11ac": "0x1f", + ",\u1167,\u11ad": "0x1f", + ",\u1167,\u11ae": "0x1f", + ",\u1167,\u11af": "0x1f", + ",\u1167,\u11b0": "0x1f", + ",\u1167,\u11b1": "0x1f", + ",\u1167,\u11b2": "0x1f", + ",\u1167,\u11b3": "0x1f", + ",\u1167,\u11b4": "0x1f", + ",\u1167,\u11b5": "0x1f", + ",\u1167,\u11b6": "0x1f", + ",\u1167,\u11b8": "0x1f", + ",\u1167,\u11b9": "0x1f", + ",\u1167,\u11ba": "0x1f", + ",\u1167,\u11bd": "0x1f", + ",\u1167,\u11be": "0x1f", + ",\u1167,\u11bf": "0x1f", + ",\u1167,\u11c0": "0x1f", + ",\u1167,\u11c1": "0x1f", + ",\u1167,\u11c2": "0x1f", + ",\u1165,\u11a8": "0x1f", + ",\u1165,\u11a9": "0x1f", + ",\u1165,\u11aa": "0x1f", + ",\u1165,\u11ac": "0x1f", + ",\u1165,\u11ad": "0x1f", + ",\u1165,\u11ae": "0x1f", + ",\u1165,\u11b0": "0x1f", + ",\u1165,\u11b1": "0x1f", + ",\u1165,\u11b2": "0x1f", + ",\u1165,\u11b3": "0x1f", + ",\u1165,\u11b4": "0x1f", + ",\u1165,\u11b5": "0x1f", + ",\u1165,\u11b6": "0x1f", + ",\u1165,\u11b8": "0x1f", + ",\u1165,\u11b9": "0x1f", + ",\u1165,\u11ba": "0x1f", + ",\u1165,\u11bb": "0x1f", + ",\u1165,\u11bc": "0x1f", + ",\u1165,\u11bd": "0x1f", + ",\u1165,\u11be": "0x1f", + ",\u1165,\u11bf": "0x1f", + ",\u1165,\u11c0": "0x1f", + ",\u1165,\u11c1": "0x1f", + ",\u1168,\u11a8": "0x4a", + ",\u1168,\u11a9": "0x4a", + ",\u1168,\u11aa": "0x4a", + ",\u1168,\u11ab": "0x4a", + ",\u1168,\u11ac": "0x4a", + ",\u1168,\u11ad": "0x4a", + ",\u1168,\u11ae": "0x4a", + ",\u1168,\u11af": "0x4a", + ",\u1168,\u11b0": "0x4a", + ",\u1168,\u11b1": "0x4a", + ",\u1168,\u11b2": "0x4a", + ",\u1168,\u11b3": "0x4a", + ",\u1168,\u11b4": "0x4a", + ",\u1168,\u11b5": "0x4a", + ",\u1168,\u11b6": "0x4a", + ",\u1168,\u11b7": "0x4a", + ",\u1168,\u11b8": "0x4a", + ",\u1168,\u11b9": "0x4a", + ",\u1168,\u11ba": "0x4a", + ",\u1168,\u11bb": "0x4a", + ",\u1168,\u11bc": "0x4a", + ",\u1168,\u11bd": "0x4a", + ",\u1168,\u11be": "0x4a", + ",\u1168,\u11bf": "0x4a", + ",\u1168,\u11c0": "0x4a", + ",\u1168,\u11c1": "0x4a", + ",\u1168,\u11c2": "0x4a" + } + }, + { + "defaultGlyph": "0x69", + "alternatives": {} + }, + { + "defaultGlyph": "0x92", + "alternatives": { + ",\u116a,\u11a8": "0xb4", + ",\u116a,\u11a9": "0xb4", + ",\u116a,\u11aa": "0xb4", + ",\u116a,\u11ab": "0xb4", + ",\u116a,\u11ac": "0xb4", + ",\u116a,\u11ad": "0xb4", + ",\u116a,\u11ae": "0xb4", + ",\u116a,\u11af": "0xb4", + ",\u116a,\u11b0": "0xb4", + ",\u116a,\u11b1": "0xb4", + ",\u116a,\u11b2": "0xb4", + ",\u116a,\u11b3": "0xb4", + ",\u116a,\u11b4": "0xb4", + ",\u116a,\u11b5": "0xb4", + ",\u116a,\u11b6": "0xb4", + ",\u116a,\u11b7": "0xb4", + ",\u116a,\u11b8": "0xb4", + ",\u116a,\u11b9": "0xb4", + ",\u116a,\u11ba": "0xb4", + ",\u116a,\u11bb": "0xb4", + ",\u116a,\u11bc": "0xb4", + ",\u116a,\u11bd": "0xb4", + ",\u116a,\u11be": "0xb4", + ",\u116a,\u11bf": "0xb4", + ",\u116a,\u11c0": "0xb4", + ",\u116a,\u11c1": "0xb4", + ",\u116a,\u11c2": "0xb4", + ",\u116b,\u11a8": "0xb4", + ",\u116b,\u11a9": "0xb4", + ",\u116b,\u11aa": "0xb4", + ",\u116b,\u11ab": "0xb4", + ",\u116b,\u11ac": "0xb4", + ",\u116b,\u11ad": "0xb4", + ",\u116b,\u11ae": "0xb4", + ",\u116b,\u11af": "0xb4", + ",\u116b,\u11b0": "0xb4", + ",\u116b,\u11b1": "0xb4", + ",\u116b,\u11b2": "0xb4", + ",\u116b,\u11b3": "0xb4", + ",\u116b,\u11b4": "0xb4", + ",\u116b,\u11b5": "0xb4", + ",\u116b,\u11b6": "0xb4", + ",\u116b,\u11b7": "0xb4", + ",\u116b,\u11b8": "0xb4", + ",\u116b,\u11b9": "0xb4", + ",\u116b,\u11ba": "0xb4", + ",\u116b,\u11bb": "0xb4", + ",\u116b,\u11bc": "0xb4", + ",\u116b,\u11bd": "0xb4", + ",\u116b,\u11be": "0xb4", + ",\u116b,\u11bf": "0xb4", + ",\u116b,\u11c0": "0xb4", + ",\u116b,\u11c1": "0xb4", + ",\u116b,\u11c2": "0xb4", + ",\u1170,\u11a8": "0xb4", + ",\u1170,\u11a9": "0xb4", + ",\u1170,\u11aa": "0xb4", + ",\u1170,\u11ab": "0xb4", + ",\u1170,\u11ac": "0xb4", + ",\u1170,\u11ad": "0xb4", + ",\u1170,\u11ae": "0xb4", + ",\u1170,\u11af": "0xb4", + ",\u1170,\u11b0": "0xb4", + ",\u1170,\u11b1": "0xb4", + ",\u1170,\u11b2": "0xb4", + ",\u1170,\u11b3": "0xb4", + ",\u1170,\u11b4": "0xb4", + ",\u1170,\u11b5": "0xb4", + ",\u1170,\u11b6": "0xb4", + ",\u1170,\u11b7": "0xb4", + ",\u1170,\u11b8": "0xb4", + ",\u1170,\u11b9": "0xb4", + ",\u1170,\u11ba": "0xb4", + ",\u1170,\u11bb": "0xb4", + ",\u1170,\u11bc": "0xb4", + ",\u1170,\u11bd": "0xb4", + ",\u1170,\u11be": "0xb4", + ",\u1170,\u11bf": "0xb4", + ",\u1170,\u11c0": "0xb4", + ",\u1170,\u11c1": "0xb4", + ",\u1170,\u11c2": "0xb4" + } + } + ], + "\u1103": [ + { + "defaultGlyph": "0x09", + "alternatives": { + ",\u1166": "0x51", + ",\u1162": "0x36", + ",\u1165": "0x26", + ",\u1167": "0x36", + ",\u1161": "0x26", + ",\u1164": "0x36", + ",\u1163": "0x26", + ",\u1168": "0x51" + } + }, + { + "defaultGlyph": "0x70", + "alternatives": {} + }, + { + "defaultGlyph": "0x93", + "alternatives": { + ",\u116b": "0xb5", + ",\u116a": "0xb5", + ",\u1170": "0xb5" + } + }, + { + "defaultGlyph": "0x09", + "alternatives": { + ",\u1165,\u11c1": "0x26", + ",\u1165,\u11b7": "0x26", + ",\u1165,\u11ab": "0x26", + ",\u1165,\u11af": "0x26", + ",\u1165,\u11bc": "0x26", + ",\u1165,\u11be": "0x26", + ",\u1165,\u11a8": "0x26", + ",\u1166,\u11a8": "0x51", + ",\u1162,\u11a8": "0x36", + ",\u1162,\u11bb": "0x36", + ",\u1162,\u11a9": "0x36", + ",\u1162,\u11aa": "0x36", + ",\u1162,\u11ab": "0x36", + ",\u1162,\u11ac": "0x36", + ",\u1162,\u11ad": "0x36", + ",\u1162,\u11ae": "0x36", + ",\u1162,\u11af": "0x36", + ",\u1162,\u11b0": "0x36", + ",\u1162,\u11b1": "0x36", + ",\u1162,\u11b2": "0x36", + ",\u1162,\u11b3": "0x36", + ",\u1162,\u11b4": "0x36", + ",\u1162,\u11b5": "0x36", + ",\u1162,\u11b6": "0x36", + ",\u1162,\u11b7": "0x36", + ",\u1162,\u11b8": "0x36", + ",\u1162,\u11b9": "0x36", + ",\u1162,\u11ba": "0x36", + ",\u1162,\u11bc": "0x36", + ",\u1162,\u11bd": "0x36", + ",\u1162,\u11be": "0x36", + ",\u1162,\u11bf": "0x36", + ",\u1162,\u11c0": "0x36", + ",\u1162,\u11c1": "0x36", + ",\u1162,\u11c2": "0x36", + ",\u1164,\u11a8": "0x36", + ",\u1164,\u11a9": "0x36", + ",\u1164,\u11aa": "0x36", + ",\u1164,\u11ab": "0x36", + ",\u1164,\u11ac": "0x36", + ",\u1164,\u11ad": "0x36", + ",\u1164,\u11ae": "0x36", + ",\u1164,\u11af": "0x36", + ",\u1164,\u11b0": "0x36", + ",\u1164,\u11b1": "0x36", + ",\u1164,\u11b2": "0x36", + ",\u1164,\u11b3": "0x36", + ",\u1164,\u11b4": "0x36", + ",\u1164,\u11b5": "0x36", + ",\u1164,\u11b6": "0x36", + ",\u1164,\u11b7": "0x36", + ",\u1164,\u11b8": "0x36", + ",\u1164,\u11b9": "0x36", + ",\u1164,\u11ba": "0x36", + ",\u1164,\u11bb": "0x36", + ",\u1164,\u11bc": "0x36", + ",\u1164,\u11bd": "0x36", + ",\u1164,\u11be": "0x36", + ",\u1164,\u11bf": "0x36", + ",\u1164,\u11c0": "0x36", + ",\u1164,\u11c1": "0x36", + ",\u1164,\u11c2": "0x36", + ",\u1166,\u11a9": "0x51", + ",\u1166,\u11aa": "0x51", + ",\u1166,\u11ab": "0x51", + ",\u1166,\u11ac": "0x51", + ",\u1166,\u11ad": "0x51", + ",\u1166,\u11ae": "0x51", + ",\u1166,\u11af": "0x51", + ",\u1166,\u11b0": "0x51", + ",\u1166,\u11b1": "0x51", + ",\u1166,\u11b2": "0x51", + ",\u1166,\u11b3": "0x51", + ",\u1166,\u11b4": "0x51", + ",\u1166,\u11b5": "0x51", + ",\u1166,\u11b6": "0x51", + ",\u1166,\u11b7": "0x51", + ",\u1166,\u11b8": "0x51", + ",\u1166,\u11b9": "0x51", + ",\u1166,\u11ba": "0x51", + ",\u1166,\u11bb": "0x51", + ",\u1166,\u11bc": "0x51", + ",\u1166,\u11bd": "0x51", + ",\u1166,\u11be": "0x51", + ",\u1166,\u11bf": "0x51", + ",\u1166,\u11c0": "0x51", + ",\u1166,\u11c1": "0x51", + ",\u1166,\u11c2": "0x51", + ",\u1167,\u11a8": "0x26", + ",\u1167,\u11a9": "0x26", + ",\u1167,\u11aa": "0x26", + ",\u1167,\u11ab": "0x26", + ",\u1167,\u11ac": "0x26", + ",\u1167,\u11ad": "0x26", + ",\u1167,\u11ae": "0x26", + ",\u1167,\u11af": "0x26", + ",\u1167,\u11b0": "0x26", + ",\u1167,\u11b1": "0x26", + ",\u1167,\u11b2": "0x26", + ",\u1167,\u11b3": "0x26", + ",\u1167,\u11b4": "0x26", + ",\u1167,\u11b5": "0x26", + ",\u1167,\u11b6": "0x26", + ",\u1167,\u11b7": "0x26", + ",\u1167,\u11b8": "0x26", + ",\u1167,\u11b9": "0x26", + ",\u1167,\u11ba": "0x26", + ",\u1167,\u11bb": "0x26", + ",\u1167,\u11bc": "0x26", + ",\u1167,\u11bd": "0x26", + ",\u1167,\u11be": "0x26", + ",\u1167,\u11bf": "0x26", + ",\u1167,\u11c0": "0x26", + ",\u1167,\u11c1": "0x26", + ",\u1167,\u11c2": "0x26", + ",\u1168,\u11a8": "0x51", + ",\u1168,\u11a9": "0x51", + ",\u1168,\u11aa": "0x51", + ",\u1168,\u11ab": "0x51", + ",\u1168,\u11ac": "0x51", + ",\u1168,\u11ad": "0x51", + ",\u1168,\u11ae": "0x51", + ",\u1168,\u11af": "0x51", + ",\u1168,\u11b0": "0x51", + ",\u1168,\u11b1": "0x51", + ",\u1168,\u11b2": "0x51", + ",\u1168,\u11b3": "0x51", + ",\u1168,\u11b4": "0x51", + ",\u1168,\u11b5": "0x51", + ",\u1168,\u11b6": "0x51", + ",\u1168,\u11b7": "0x51", + ",\u1168,\u11b8": "0x51", + ",\u1168,\u11b9": "0x51", + ",\u1168,\u11ba": "0x51", + ",\u1168,\u11bb": "0x51", + ",\u1168,\u11bc": "0x51", + ",\u1168,\u11bd": "0x51", + ",\u1168,\u11be": "0x51", + ",\u1168,\u11bf": "0x51", + ",\u1168,\u11c0": "0x51", + ",\u1168,\u11c1": "0x51", + ",\u1168,\u11c2": "0x51" + } + }, + { + "defaultGlyph": "0x70", + "alternatives": {} + }, + { + "defaultGlyph": "0x93", + "alternatives": { + ",\u116b,\u11bb": "0xb5", + ",\u116a,\u11a8": "0xb5", + ",\u116a,\u11a9": "0xb5", + ",\u116a,\u11aa": "0xb5", + ",\u116a,\u11ab": "0xb5", + ",\u116a,\u11ac": "0xb5", + ",\u116a,\u11ad": "0xb5", + ",\u116a,\u11ae": "0xb5", + ",\u116a,\u11af": "0xb5", + ",\u116a,\u11b0": "0xb5", + ",\u116a,\u11b1": "0xb5", + ",\u116a,\u11b2": "0xb5", + ",\u116a,\u11b3": "0xb5", + ",\u116a,\u11b4": "0xb5", + ",\u116a,\u11b5": "0xb5", + ",\u116a,\u11b6": "0xb5", + ",\u116a,\u11b7": "0xb5", + ",\u116a,\u11b8": "0xb5", + ",\u116a,\u11b9": "0xb5", + ",\u116a,\u11ba": "0xb5", + ",\u116a,\u11bb": "0xb5", + ",\u116a,\u11bc": "0xb5", + ",\u116a,\u11bd": "0xb5", + ",\u116a,\u11be": "0xb5", + ",\u116a,\u11bf": "0xb5", + ",\u116a,\u11c0": "0xb5", + ",\u116a,\u11c1": "0xb5", + ",\u116a,\u11c2": "0xb5", + ",\u116b,\u11a8": "0xb5", + ",\u116b,\u11a9": "0xb5", + ",\u116b,\u11aa": "0xb5", + ",\u116b,\u11ab": "0xb5", + ",\u116b,\u11ac": "0xb5", + ",\u116b,\u11ad": "0xb5", + ",\u116b,\u11ae": "0xb5", + ",\u116b,\u11af": "0xb5", + ",\u116b,\u11b0": "0xb5", + ",\u116b,\u11b1": "0xb5", + ",\u116b,\u11b2": "0xb5", + ",\u116b,\u11b3": "0xb5", + ",\u116b,\u11b4": "0xb5", + ",\u116b,\u11b5": "0xb5", + ",\u116b,\u11b6": "0xb5", + ",\u116b,\u11b7": "0xb5", + ",\u116b,\u11b8": "0xb5", + ",\u116b,\u11b9": "0xb5", + ",\u116b,\u11ba": "0xb5", + ",\u116b,\u11bc": "0xb5", + ",\u116b,\u11bd": "0xb5", + ",\u116b,\u11be": "0xb5", + ",\u116b,\u11bf": "0xb5", + ",\u116b,\u11c0": "0xb5", + ",\u116b,\u11c1": "0xb5", + ",\u116b,\u11c2": "0xb5", + ",\u1170,\u11a8": "0xb5", + ",\u1170,\u11a9": "0xb5", + ",\u1170,\u11aa": "0xb5", + ",\u1170,\u11ab": "0xb5", + ",\u1170,\u11ac": "0xb5", + ",\u1170,\u11ad": "0xb5", + ",\u1170,\u11ae": "0xb5", + ",\u1170,\u11af": "0xb5", + ",\u1170,\u11b0": "0xb5", + ",\u1170,\u11b1": "0xb5", + ",\u1170,\u11b2": "0xb5", + ",\u1170,\u11b3": "0xb5", + ",\u1170,\u11b4": "0xb5", + ",\u1170,\u11b5": "0xb5", + ",\u1170,\u11b6": "0xb5", + ",\u1170,\u11b7": "0xb5", + ",\u1170,\u11b8": "0xb5", + ",\u1170,\u11b9": "0xb5", + ",\u1170,\u11ba": "0xb5", + ",\u1170,\u11bb": "0xb5", + ",\u1170,\u11bc": "0xb5", + ",\u1170,\u11bd": "0xb5", + ",\u1170,\u11be": "0xb5", + ",\u1170,\u11bf": "0xb5", + ",\u1170,\u11c0": "0xb5", + ",\u1170,\u11c1": "0xb5", + ",\u1170,\u11c2": "0xb5" + } + } + ], + "\u1104": [ + { + "defaultGlyph": "0x37", + "alternatives": { + ",\u1165": "0x27", + ",\u1161": "0x27", + ",\u1166": "0x52", + ",\u1162": "0x52", + ",\u1164": "0x52", + ",\u1163": "0x27", + ",\u1167": "0x27", + ",\u1168": "0x52", + ",\u1175": "0x27" + } + }, + { + "defaultGlyph": "0x71", + "alternatives": {} + }, + { + "defaultGlyph": "0x94", + "alternatives": { + ",\u116a": "0xb6", + ",\u116b": "0xb6", + ",\u1170": "0xb6" + } + }, + { + "defaultGlyph": "0x0a", + "alternatives": { + ",\u1161,\u11bc": "0x0a", + ",\u1161,\u11af": "0x0a", + ",\u1161,\u11ba": "0x0a", + ",\u1161,\u11a8": "0x0a", + ",\u1165,\u11a8": "0x27", + ",\u1165,\u11c2": "0x27", + ",\u1165,\u11ab": "0x27", + ",\u1165,\u11af": "0x27", + ",\u1162,\u11a8": "0x52", + ",\u1162,\u11a9": "0x52", + ",\u1162,\u11aa": "0x52", + ",\u1162,\u11ab": "0x52", + ",\u1162,\u11ac": "0x52", + ",\u1162,\u11ad": "0x52", + ",\u1162,\u11ae": "0x52", + ",\u1162,\u11af": "0x52", + ",\u1162,\u11b0": "0x52", + ",\u1162,\u11b1": "0x52", + ",\u1162,\u11b2": "0x52", + ",\u1162,\u11b3": "0x52", + ",\u1162,\u11b4": "0x52", + ",\u1162,\u11b5": "0x52", + ",\u1162,\u11b6": "0x52", + ",\u1162,\u11b7": "0x52", + ",\u1162,\u11b8": "0x52", + ",\u1162,\u11b9": "0x52", + ",\u1162,\u11ba": "0x52", + ",\u1162,\u11bb": "0x52", + ",\u1162,\u11bc": "0x52", + ",\u1162,\u11bd": "0x52", + ",\u1162,\u11be": "0x52", + ",\u1162,\u11bf": "0x52", + ",\u1162,\u11c0": "0x52", + ",\u1162,\u11c1": "0x52", + ",\u1162,\u11c2": "0x52", + ",\u1163,\u11a8": "0x52", + ",\u1163,\u11a9": "0x52", + ",\u1163,\u11aa": "0x52", + ",\u1163,\u11ab": "0x52", + ",\u1163,\u11ac": "0x52", + ",\u1163,\u11ad": "0x52", + ",\u1163,\u11ae": "0x52", + ",\u1163,\u11af": "0x52", + ",\u1163,\u11b0": "0x52", + ",\u1163,\u11b1": "0x52", + ",\u1163,\u11b2": "0x52", + ",\u1163,\u11b3": "0x52", + ",\u1163,\u11b4": "0x52", + ",\u1163,\u11b5": "0x52", + ",\u1163,\u11b6": "0x52", + ",\u1163,\u11b7": "0x52", + ",\u1163,\u11b8": "0x52", + ",\u1163,\u11b9": "0x52", + ",\u1163,\u11ba": "0x52", + ",\u1163,\u11bb": "0x52", + ",\u1163,\u11bc": "0x52", + ",\u1163,\u11bd": "0x52", + ",\u1163,\u11be": "0x52", + ",\u1163,\u11bf": "0x52", + ",\u1163,\u11c0": "0x52", + ",\u1163,\u11c1": "0x52", + ",\u1163,\u11c2": "0x52", + ",\u1164,\u11a8": "0x52", + ",\u1164,\u11a9": "0x52", + ",\u1164,\u11aa": "0x52", + ",\u1164,\u11ab": "0x52", + ",\u1164,\u11ac": "0x52", + ",\u1164,\u11ad": "0x52", + ",\u1164,\u11ae": "0x52", + ",\u1164,\u11af": "0x52", + ",\u1164,\u11b0": "0x52", + ",\u1164,\u11b1": "0x52", + ",\u1164,\u11b2": "0x52", + ",\u1164,\u11b3": "0x52", + ",\u1164,\u11b4": "0x52", + ",\u1164,\u11b5": "0x52", + ",\u1164,\u11b6": "0x52", + ",\u1164,\u11b7": "0x52", + ",\u1164,\u11b8": "0x52", + ",\u1164,\u11b9": "0x52", + ",\u1164,\u11ba": "0x52", + ",\u1164,\u11bb": "0x52", + ",\u1164,\u11bc": "0x52", + ",\u1164,\u11bd": "0x52", + ",\u1164,\u11be": "0x52", + ",\u1164,\u11bf": "0x52", + ",\u1164,\u11c0": "0x52", + ",\u1164,\u11c1": "0x52", + ",\u1164,\u11c2": "0x52", + ",\u1166,\u11a8": "0x52", + ",\u1166,\u11a9": "0x52", + ",\u1166,\u11aa": "0x52", + ",\u1166,\u11ab": "0x52", + ",\u1166,\u11ac": "0x52", + ",\u1166,\u11ad": "0x52", + ",\u1166,\u11ae": "0x52", + ",\u1166,\u11af": "0x52", + ",\u1166,\u11b0": "0x52", + ",\u1166,\u11b1": "0x52", + ",\u1166,\u11b2": "0x52", + ",\u1166,\u11b3": "0x52", + ",\u1166,\u11b4": "0x52", + ",\u1166,\u11b5": "0x52", + ",\u1166,\u11b6": "0x52", + ",\u1166,\u11b7": "0x52", + ",\u1166,\u11b8": "0x52", + ",\u1166,\u11b9": "0x52", + ",\u1166,\u11ba": "0x52", + ",\u1166,\u11bb": "0x52", + ",\u1166,\u11bc": "0x52", + ",\u1166,\u11bd": "0x52", + ",\u1166,\u11be": "0x52", + ",\u1166,\u11bf": "0x52", + ",\u1166,\u11c0": "0x52", + ",\u1166,\u11c1": "0x52", + ",\u1166,\u11c2": "0x52", + ",\u1167,\u11a8": "0x52", + ",\u1167,\u11a9": "0x52", + ",\u1167,\u11aa": "0x52", + ",\u1167,\u11ab": "0x52", + ",\u1167,\u11ac": "0x52", + ",\u1167,\u11ad": "0x52", + ",\u1167,\u11ae": "0x52", + ",\u1167,\u11af": "0x52", + ",\u1167,\u11b0": "0x52", + ",\u1167,\u11b1": "0x52", + ",\u1167,\u11b2": "0x52", + ",\u1167,\u11b3": "0x52", + ",\u1167,\u11b4": "0x52", + ",\u1167,\u11b5": "0x52", + ",\u1167,\u11b6": "0x52", + ",\u1167,\u11b7": "0x52", + ",\u1167,\u11b8": "0x52", + ",\u1167,\u11b9": "0x52", + ",\u1167,\u11ba": "0x52", + ",\u1167,\u11bb": "0x52", + ",\u1167,\u11bc": "0x52", + ",\u1167,\u11bd": "0x52", + ",\u1167,\u11be": "0x52", + ",\u1167,\u11bf": "0x52", + ",\u1167,\u11c0": "0x52", + ",\u1167,\u11c1": "0x52", + ",\u1167,\u11c2": "0x52", + ",\u1168,\u11a8": "0x52", + ",\u1168,\u11a9": "0x52", + ",\u1168,\u11aa": "0x52", + ",\u1168,\u11ab": "0x52", + ",\u1168,\u11ac": "0x52", + ",\u1168,\u11ad": "0x52", + ",\u1168,\u11ae": "0x52", + ",\u1168,\u11af": "0x52", + ",\u1168,\u11b0": "0x52", + ",\u1168,\u11b1": "0x52", + ",\u1168,\u11b2": "0x52", + ",\u1168,\u11b3": "0x52", + ",\u1168,\u11b4": "0x52", + ",\u1168,\u11b5": "0x52", + ",\u1168,\u11b6": "0x52", + ",\u1168,\u11b7": "0x52", + ",\u1168,\u11b8": "0x52", + ",\u1168,\u11b9": "0x52", + ",\u1168,\u11ba": "0x52", + ",\u1168,\u11bb": "0x52", + ",\u1168,\u11bc": "0x52", + ",\u1168,\u11bd": "0x52", + ",\u1168,\u11be": "0x52", + ",\u1168,\u11bf": "0x52", + ",\u1168,\u11c0": "0x52", + ",\u1168,\u11c1": "0x52", + ",\u1168,\u11c2": "0x52" + } + }, + { + "defaultGlyph": "0x71", + "alternatives": {} + }, + { + "defaultGlyph": "0x94", + "alternatives": { + ",\u116a,\u11a8": "0xb6", + ",\u116a,\u11a9": "0xb6", + ",\u116a,\u11aa": "0xb6", + ",\u116a,\u11ab": "0xb6", + ",\u116a,\u11ac": "0xb6", + ",\u116a,\u11ad": "0xb6", + ",\u116a,\u11ae": "0xb6", + ",\u116a,\u11af": "0xb6", + ",\u116a,\u11b0": "0xb6", + ",\u116a,\u11b1": "0xb6", + ",\u116a,\u11b2": "0xb6", + ",\u116a,\u11b3": "0xb6", + ",\u116a,\u11b4": "0xb6", + ",\u116a,\u11b5": "0xb6", + ",\u116a,\u11b6": "0xb6", + ",\u116a,\u11b7": "0xb6", + ",\u116a,\u11b8": "0xb6", + ",\u116a,\u11b9": "0xb6", + ",\u116a,\u11ba": "0xb6", + ",\u116a,\u11bb": "0xb6", + ",\u116a,\u11bc": "0xb6", + ",\u116a,\u11bd": "0xb6", + ",\u116a,\u11be": "0xb6", + ",\u116a,\u11bf": "0xb6", + ",\u116a,\u11c0": "0xb6", + ",\u116a,\u11c1": "0xb6", + ",\u116a,\u11c2": "0xb6", + ",\u116b,\u11a8": "0xb6", + ",\u116b,\u11a9": "0xb6", + ",\u116b,\u11aa": "0xb6", + ",\u116b,\u11ab": "0xb6", + ",\u116b,\u11ac": "0xb6", + ",\u116b,\u11ad": "0xb6", + ",\u116b,\u11ae": "0xb6", + ",\u116b,\u11af": "0xb6", + ",\u116b,\u11b0": "0xb6", + ",\u116b,\u11b1": "0xb6", + ",\u116b,\u11b2": "0xb6", + ",\u116b,\u11b3": "0xb6", + ",\u116b,\u11b4": "0xb6", + ",\u116b,\u11b5": "0xb6", + ",\u116b,\u11b6": "0xb6", + ",\u116b,\u11b7": "0xb6", + ",\u116b,\u11b8": "0xb6", + ",\u116b,\u11b9": "0xb6", + ",\u116b,\u11ba": "0xb6", + ",\u116b,\u11bb": "0xb6", + ",\u116b,\u11bc": "0xb6", + ",\u116b,\u11bd": "0xb6", + ",\u116b,\u11be": "0xb6", + ",\u116b,\u11bf": "0xb6", + ",\u116b,\u11c0": "0xb6", + ",\u116b,\u11c1": "0xb6", + ",\u116b,\u11c2": "0xb6", + ",\u1170,\u11a8": "0xb6", + ",\u1170,\u11a9": "0xb6", + ",\u1170,\u11aa": "0xb6", + ",\u1170,\u11ab": "0xb6", + ",\u1170,\u11ac": "0xb6", + ",\u1170,\u11ad": "0xb6", + ",\u1170,\u11ae": "0xb6", + ",\u1170,\u11af": "0xb6", + ",\u1170,\u11b0": "0xb6", + ",\u1170,\u11b1": "0xb6", + ",\u1170,\u11b2": "0xb6", + ",\u1170,\u11b3": "0xb6", + ",\u1170,\u11b4": "0xb6", + ",\u1170,\u11b5": "0xb6", + ",\u1170,\u11b6": "0xb6", + ",\u1170,\u11b7": "0xb6", + ",\u1170,\u11b8": "0xb6", + ",\u1170,\u11b9": "0xb6", + ",\u1170,\u11ba": "0xb6", + ",\u1170,\u11bb": "0xb6", + ",\u1170,\u11bc": "0xb6", + ",\u1170,\u11bd": "0xb6", + ",\u1170,\u11be": "0xb6", + ",\u1170,\u11bf": "0xb6", + ",\u1170,\u11c0": "0xb6", + ",\u1170,\u11c1": "0xb6", + ",\u1170,\u11c2": "0xb6" + } + } + ], + "\u1105": [ + { + "defaultGlyph": "0x53", + "alternatives": { + ",\u1161": "0x0b", + ",\u1175": "0x0b", + ",\u1162": "0x38", + ",\u1165": "0x28", + ",\u1167": "0x28", + ",\u1163": "0x0b", + ",\u1164": "0x38" + } + }, + { + "defaultGlyph": "0x72", + "alternatives": {} + }, + { + "defaultGlyph": "0x95", + "alternatives": { + ",\u116a": "0xb7", + ",\u116b": "0xb7", + ",\u1170": "0xb7" + } + }, + { + "defaultGlyph": "0x28", + "alternatives": { + ",\u1175,\u11ba": "0x0b", + ",\u1175,\u11ab": "0x0b", + ",\u1161,\u11b8": "0x0b", + ",\u1175,\u11b8": "0x0b", + ",\u1175,\u11af": "0x0b", + ",\u1161,\u11b7": "0x0b", + ",\u1161,\u11ab": "0x0b", + ",\u1161,\u11a8": "0x0b", + ",\u1175,\u11b7": "0x0b", + ",\u1161,\u11bc": "0x0b", + ",\u1161,\u11af": "0x0b", + ",\u1161,\u11bb": "0x0b", + ",\u1175,\u11bc": "0x0b", + ",\u1163,\u11bc": "0x0b", + ",\u1162,\u11b8": "0x38", + ",\u1162,\u11ba": "0x38", + ",\u1162,\u11ab": "0x38", + ",\u1162,\u11b7": "0x38", + ",\u1162,\u11bb": "0x38", + ",\u1162,\u11a8": "0x38", + ",\u1166,\u11ab": "0x53", + ",\u1166,\u11ba": "0x53", + ",\u1166,\u11b7": "0x53", + ",\u1175,\u11a8": "0x0b", + ",\u1175,\u11a9": "0x0b", + ",\u1175,\u11aa": "0x0b", + ",\u1175,\u11ac": "0x0b", + ",\u1175,\u11ad": "0x0b", + ",\u1175,\u11ae": "0x0b", + ",\u1175,\u11b0": "0x0b", + ",\u1175,\u11b1": "0x0b", + ",\u1175,\u11b2": "0x0b", + ",\u1175,\u11b3": "0x0b", + ",\u1175,\u11b4": "0x0b", + ",\u1175,\u11b5": "0x0b", + ",\u1175,\u11b6": "0x0b", + ",\u1175,\u11b9": "0x0b", + ",\u1175,\u11bb": "0x0b", + ",\u1175,\u11bd": "0x0b", + ",\u1175,\u11be": "0x0b", + ",\u1175,\u11bf": "0x0b", + ",\u1175,\u11c0": "0x0b", + ",\u1175,\u11c1": "0x0b", + ",\u1175,\u11c2": "0x0b", + ",\u1161,\u11a9": "0x0b", + ",\u1161,\u11aa": "0x0b", + ",\u1161,\u11ac": "0x0b", + ",\u1161,\u11ad": "0x0b", + ",\u1161,\u11ae": "0x0b", + ",\u1161,\u11b0": "0x0b", + ",\u1161,\u11b1": "0x0b", + ",\u1161,\u11b2": "0x0b", + ",\u1161,\u11b3": "0x0b", + ",\u1161,\u11b4": "0x0b", + ",\u1161,\u11b5": "0x0b", + ",\u1161,\u11b6": "0x0b", + ",\u1161,\u11b9": "0x0b", + ",\u1161,\u11ba": "0x0b", + ",\u1161,\u11bd": "0x0b", + ",\u1161,\u11be": "0x0b", + ",\u1161,\u11bf": "0x0b", + ",\u1161,\u11c0": "0x0b", + ",\u1161,\u11c1": "0x0b", + ",\u1161,\u11c2": "0x0b", + ",\u1162,\u11a9": "0x38", + ",\u1162,\u11aa": "0x38", + ",\u1162,\u11ac": "0x38", + ",\u1162,\u11ad": "0x38", + ",\u1162,\u11ae": "0x38", + ",\u1162,\u11af": "0x38", + ",\u1162,\u11b0": "0x38", + ",\u1162,\u11b1": "0x38", + ",\u1162,\u11b2": "0x38", + ",\u1162,\u11b3": "0x38", + ",\u1162,\u11b4": "0x38", + ",\u1162,\u11b5": "0x38", + ",\u1162,\u11b6": "0x38", + ",\u1162,\u11b9": "0x38", + ",\u1162,\u11bc": "0x38", + ",\u1162,\u11bd": "0x38", + ",\u1162,\u11be": "0x38", + ",\u1162,\u11bf": "0x38", + ",\u1162,\u11c0": "0x38", + ",\u1162,\u11c1": "0x38", + ",\u1162,\u11c2": "0x38", + ",\u1164,\u11a8": "0x38", + ",\u1164,\u11a9": "0x38", + ",\u1164,\u11aa": "0x38", + ",\u1164,\u11ab": "0x38", + ",\u1164,\u11ac": "0x38", + ",\u1164,\u11ad": "0x38", + ",\u1164,\u11ae": "0x38", + ",\u1164,\u11af": "0x38", + ",\u1164,\u11b0": "0x38", + ",\u1164,\u11b1": "0x38", + ",\u1164,\u11b2": "0x38", + ",\u1164,\u11b3": "0x38", + ",\u1164,\u11b4": "0x38", + ",\u1164,\u11b5": "0x38", + ",\u1164,\u11b6": "0x38", + ",\u1164,\u11b7": "0x38", + ",\u1164,\u11b8": "0x38", + ",\u1164,\u11b9": "0x38", + ",\u1164,\u11ba": "0x38", + ",\u1164,\u11bb": "0x38", + ",\u1164,\u11bc": "0x38", + ",\u1164,\u11bd": "0x38", + ",\u1164,\u11be": "0x38", + ",\u1164,\u11bf": "0x38", + ",\u1164,\u11c0": "0x38", + ",\u1164,\u11c1": "0x38", + ",\u1164,\u11c2": "0x38", + ",\u1166,\u11a8": "0x53", + ",\u1166,\u11a9": "0x53", + ",\u1166,\u11aa": "0x53", + ",\u1166,\u11ac": "0x53", + ",\u1166,\u11ad": "0x53", + ",\u1166,\u11ae": "0x53", + ",\u1166,\u11af": "0x53", + ",\u1166,\u11b0": "0x53", + ",\u1166,\u11b1": "0x53", + ",\u1166,\u11b2": "0x53", + ",\u1166,\u11b3": "0x53", + ",\u1166,\u11b4": "0x53", + ",\u1166,\u11b5": "0x53", + ",\u1166,\u11b6": "0x53", + ",\u1166,\u11b8": "0x53", + ",\u1166,\u11b9": "0x53", + ",\u1166,\u11bb": "0x53", + ",\u1166,\u11bc": "0x53", + ",\u1166,\u11bd": "0x53", + ",\u1166,\u11be": "0x53", + ",\u1166,\u11bf": "0x53", + ",\u1166,\u11c0": "0x53", + ",\u1166,\u11c1": "0x53", + ",\u1166,\u11c2": "0x53", + ",\u1168,\u11a8": "0x53", + ",\u1168,\u11a9": "0x53", + ",\u1168,\u11aa": "0x53", + ",\u1168,\u11ab": "0x53", + ",\u1168,\u11ac": "0x53", + ",\u1168,\u11ad": "0x53", + ",\u1168,\u11ae": "0x53", + ",\u1168,\u11af": "0x53", + ",\u1168,\u11b0": "0x53", + ",\u1168,\u11b1": "0x53", + ",\u1168,\u11b2": "0x53", + ",\u1168,\u11b3": "0x53", + ",\u1168,\u11b4": "0x53", + ",\u1168,\u11b5": "0x53", + ",\u1168,\u11b6": "0x53", + ",\u1168,\u11b7": "0x53", + ",\u1168,\u11b8": "0x53", + ",\u1168,\u11b9": "0x53", + ",\u1168,\u11ba": "0x53", + ",\u1168,\u11bb": "0x53", + ",\u1168,\u11bc": "0x53", + ",\u1168,\u11bd": "0x53", + ",\u1168,\u11be": "0x53", + ",\u1168,\u11bf": "0x53", + ",\u1168,\u11c0": "0x53", + ",\u1168,\u11c1": "0x53", + ",\u1168,\u11c2": "0x53" + } + }, + { + "defaultGlyph": "0x72", + "alternatives": {} + }, + { + "defaultGlyph": "0x95", + "alternatives": { + ",\u116a,\u11a8": "0xb7", + ",\u116a,\u11a9": "0xb7", + ",\u116a,\u11aa": "0xb7", + ",\u116a,\u11ab": "0xb7", + ",\u116a,\u11ac": "0xb7", + ",\u116a,\u11ad": "0xb7", + ",\u116a,\u11ae": "0xb7", + ",\u116a,\u11af": "0xb7", + ",\u116a,\u11b0": "0xb7", + ",\u116a,\u11b1": "0xb7", + ",\u116a,\u11b2": "0xb7", + ",\u116a,\u11b3": "0xb7", + ",\u116a,\u11b4": "0xb7", + ",\u116a,\u11b5": "0xb7", + ",\u116a,\u11b6": "0xb7", + ",\u116a,\u11b7": "0xb7", + ",\u116a,\u11b8": "0xb7", + ",\u116a,\u11b9": "0xb7", + ",\u116a,\u11ba": "0xb7", + ",\u116a,\u11bb": "0xb7", + ",\u116a,\u11bc": "0xb7", + ",\u116a,\u11bd": "0xb7", + ",\u116a,\u11be": "0xb7", + ",\u116a,\u11bf": "0xb7", + ",\u116a,\u11c0": "0xb7", + ",\u116a,\u11c1": "0xb7", + ",\u116a,\u11c2": "0xb7", + ",\u116b,\u11a8": "0xb7", + ",\u116b,\u11a9": "0xb7", + ",\u116b,\u11aa": "0xb7", + ",\u116b,\u11ab": "0xb7", + ",\u116b,\u11ac": "0xb7", + ",\u116b,\u11ad": "0xb7", + ",\u116b,\u11ae": "0xb7", + ",\u116b,\u11af": "0xb7", + ",\u116b,\u11b0": "0xb7", + ",\u116b,\u11b1": "0xb7", + ",\u116b,\u11b2": "0xb7", + ",\u116b,\u11b3": "0xb7", + ",\u116b,\u11b4": "0xb7", + ",\u116b,\u11b5": "0xb7", + ",\u116b,\u11b6": "0xb7", + ",\u116b,\u11b7": "0xb7", + ",\u116b,\u11b8": "0xb7", + ",\u116b,\u11b9": "0xb7", + ",\u116b,\u11ba": "0xb7", + ",\u116b,\u11bb": "0xb7", + ",\u116b,\u11bc": "0xb7", + ",\u116b,\u11bd": "0xb7", + ",\u116b,\u11be": "0xb7", + ",\u116b,\u11bf": "0xb7", + ",\u116b,\u11c0": "0xb7", + ",\u116b,\u11c1": "0xb7", + ",\u116b,\u11c2": "0xb7", + ",\u1170,\u11a8": "0xb7", + ",\u1170,\u11a9": "0xb7", + ",\u1170,\u11aa": "0xb7", + ",\u1170,\u11ab": "0xb7", + ",\u1170,\u11ac": "0xb7", + ",\u1170,\u11ad": "0xb7", + ",\u1170,\u11ae": "0xb7", + ",\u1170,\u11af": "0xb7", + ",\u1170,\u11b0": "0xb7", + ",\u1170,\u11b1": "0xb7", + ",\u1170,\u11b2": "0xb7", + ",\u1170,\u11b3": "0xb7", + ",\u1170,\u11b4": "0xb7", + ",\u1170,\u11b5": "0xb7", + ",\u1170,\u11b6": "0xb7", + ",\u1170,\u11b7": "0xb7", + ",\u1170,\u11b8": "0xb7", + ",\u1170,\u11b9": "0xb7", + ",\u1170,\u11ba": "0xb7", + ",\u1170,\u11bb": "0xb7", + ",\u1170,\u11bc": "0xb7", + ",\u1170,\u11bd": "0xb7", + ",\u1170,\u11be": "0xb7", + ",\u1170,\u11bf": "0xb7", + ",\u1170,\u11c0": "0xb7", + ",\u1170,\u11c1": "0xb7", + ",\u1170,\u11c2": "0xb7" + } + } + ], + "\u1106": [ + { + "defaultGlyph": "0x0c", + "alternatives": { + ",\u1166": "0x39", + ",\u1162": "0x39", + ",\u1164": "0x39", + ",\u1168": "0x39" + } + }, + { + "defaultGlyph": "0x73", + "alternatives": {} + }, + { + "defaultGlyph": "0x96", + "alternatives": { + ",\u116a": "0xb2", + ",\u116b": "0xb2", + ",\u1170": "0xb2" + } + }, + { + "defaultGlyph": "0x0c", + "alternatives": { + ",\u1162,\u11ba": "0x39", + ",\u1166,\u11ba": "0x39", + ",\u1162,\u11bc": "0x39", + ",\u1162,\u11ab": "0x39", + ",\u1162,\u11bd": "0x39", + ",\u1162,\u11bb": "0x39", + ",\u1162,\u11b7": "0x39", + ",\u1162,\u11a8": "0x39", + ",\u1162,\u11a9": "0x39", + ",\u1162,\u11aa": "0x39", + ",\u1162,\u11ac": "0x39", + ",\u1162,\u11ad": "0x39", + ",\u1162,\u11ae": "0x39", + ",\u1162,\u11af": "0x39", + ",\u1162,\u11b0": "0x39", + ",\u1162,\u11b1": "0x39", + ",\u1162,\u11b2": "0x39", + ",\u1162,\u11b3": "0x39", + ",\u1162,\u11b4": "0x39", + ",\u1162,\u11b5": "0x39", + ",\u1162,\u11b6": "0x39", + ",\u1162,\u11b8": "0x39", + ",\u1162,\u11b9": "0x39", + ",\u1162,\u11be": "0x39", + ",\u1162,\u11bf": "0x39", + ",\u1162,\u11c0": "0x39", + ",\u1162,\u11c1": "0x39", + ",\u1162,\u11c2": "0x39", + ",\u1164,\u11a8": "0x39", + ",\u1164,\u11a9": "0x39", + ",\u1164,\u11aa": "0x39", + ",\u1164,\u11ab": "0x39", + ",\u1164,\u11ac": "0x39", + ",\u1164,\u11ad": "0x39", + ",\u1164,\u11ae": "0x39", + ",\u1164,\u11af": "0x39", + ",\u1164,\u11b0": "0x39", + ",\u1164,\u11b1": "0x39", + ",\u1164,\u11b2": "0x39", + ",\u1164,\u11b3": "0x39", + ",\u1164,\u11b4": "0x39", + ",\u1164,\u11b5": "0x39", + ",\u1164,\u11b6": "0x39", + ",\u1164,\u11b7": "0x39", + ",\u1164,\u11b8": "0x39", + ",\u1164,\u11b9": "0x39", + ",\u1164,\u11ba": "0x39", + ",\u1164,\u11bb": "0x39", + ",\u1164,\u11bc": "0x39", + ",\u1164,\u11bd": "0x39", + ",\u1164,\u11be": "0x39", + ",\u1164,\u11bf": "0x39", + ",\u1164,\u11c0": "0x39", + ",\u1164,\u11c1": "0x39", + ",\u1164,\u11c2": "0x39", + ",\u1166,\u11a8": "0x39", + ",\u1166,\u11a9": "0x39", + ",\u1166,\u11aa": "0x39", + ",\u1166,\u11ab": "0x39", + ",\u1166,\u11ac": "0x39", + ",\u1166,\u11ad": "0x39", + ",\u1166,\u11ae": "0x39", + ",\u1166,\u11af": "0x39", + ",\u1166,\u11b0": "0x39", + ",\u1166,\u11b1": "0x39", + ",\u1166,\u11b2": "0x39", + ",\u1166,\u11b3": "0x39", + ",\u1166,\u11b4": "0x39", + ",\u1166,\u11b5": "0x39", + ",\u1166,\u11b6": "0x39", + ",\u1166,\u11b7": "0x39", + ",\u1166,\u11b8": "0x39", + ",\u1166,\u11b9": "0x39", + ",\u1166,\u11bb": "0x39", + ",\u1166,\u11bc": "0x39", + ",\u1166,\u11bd": "0x39", + ",\u1166,\u11be": "0x39", + ",\u1166,\u11bf": "0x39", + ",\u1166,\u11c0": "0x39", + ",\u1166,\u11c1": "0x39", + ",\u1166,\u11c2": "0x39", + ",\u1168,\u11a8": "0x39", + ",\u1168,\u11a9": "0x39", + ",\u1168,\u11aa": "0x39", + ",\u1168,\u11ab": "0x39", + ",\u1168,\u11ac": "0x39", + ",\u1168,\u11ad": "0x39", + ",\u1168,\u11ae": "0x39", + ",\u1168,\u11af": "0x39", + ",\u1168,\u11b0": "0x39", + ",\u1168,\u11b1": "0x39", + ",\u1168,\u11b2": "0x39", + ",\u1168,\u11b3": "0x39", + ",\u1168,\u11b4": "0x39", + ",\u1168,\u11b5": "0x39", + ",\u1168,\u11b6": "0x39", + ",\u1168,\u11b7": "0x39", + ",\u1168,\u11b8": "0x39", + ",\u1168,\u11b9": "0x39", + ",\u1168,\u11ba": "0x39", + ",\u1168,\u11bb": "0x39", + ",\u1168,\u11bc": "0x39", + ",\u1168,\u11bd": "0x39", + ",\u1168,\u11be": "0x39", + ",\u1168,\u11bf": "0x39", + ",\u1168,\u11c0": "0x39", + ",\u1168,\u11c1": "0x39", + ",\u1168,\u11c2": "0x39" + } + }, + { + "defaultGlyph": "0x73", + "alternatives": {} + }, + { + "defaultGlyph": "0x96", + "alternatives": { + ",\u116a,\u11a8": "0xb2", + ",\u116a,\u11a9": "0xb2", + ",\u116a,\u11aa": "0xb2", + ",\u116a,\u11ab": "0xb2", + ",\u116a,\u11ac": "0xb2", + ",\u116a,\u11ad": "0xb2", + ",\u116a,\u11ae": "0xb2", + ",\u116a,\u11af": "0xb2", + ",\u116a,\u11b0": "0xb2", + ",\u116a,\u11b1": "0xb2", + ",\u116a,\u11b2": "0xb2", + ",\u116a,\u11b3": "0xb2", + ",\u116a,\u11b4": "0xb2", + ",\u116a,\u11b5": "0xb2", + ",\u116a,\u11b6": "0xb2", + ",\u116a,\u11b7": "0xb2", + ",\u116a,\u11b8": "0xb2", + ",\u116a,\u11b9": "0xb2", + ",\u116a,\u11ba": "0xb2", + ",\u116a,\u11bb": "0xb2", + ",\u116a,\u11bc": "0xb2", + ",\u116a,\u11bd": "0xb2", + ",\u116a,\u11be": "0xb2", + ",\u116a,\u11bf": "0xb2", + ",\u116a,\u11c0": "0xb2", + ",\u116a,\u11c1": "0xb2", + ",\u116a,\u11c2": "0xb2", + ",\u116b,\u11a8": "0xb2", + ",\u116b,\u11a9": "0xb2", + ",\u116b,\u11aa": "0xb2", + ",\u116b,\u11ab": "0xb2", + ",\u116b,\u11ac": "0xb2", + ",\u116b,\u11ad": "0xb2", + ",\u116b,\u11ae": "0xb2", + ",\u116b,\u11af": "0xb2", + ",\u116b,\u11b0": "0xb2", + ",\u116b,\u11b1": "0xb2", + ",\u116b,\u11b2": "0xb2", + ",\u116b,\u11b3": "0xb2", + ",\u116b,\u11b4": "0xb2", + ",\u116b,\u11b5": "0xb2", + ",\u116b,\u11b6": "0xb2", + ",\u116b,\u11b7": "0xb2", + ",\u116b,\u11b8": "0xb2", + ",\u116b,\u11b9": "0xb2", + ",\u116b,\u11ba": "0xb2", + ",\u116b,\u11bb": "0xb2", + ",\u116b,\u11bc": "0xb2", + ",\u116b,\u11bd": "0xb2", + ",\u116b,\u11be": "0xb2", + ",\u116b,\u11bf": "0xb2", + ",\u116b,\u11c0": "0xb2", + ",\u116b,\u11c1": "0xb2", + ",\u116b,\u11c2": "0xb2", + ",\u1170,\u11a8": "0xb2", + ",\u1170,\u11a9": "0xb2", + ",\u1170,\u11aa": "0xb2", + ",\u1170,\u11ab": "0xb2", + ",\u1170,\u11ac": "0xb2", + ",\u1170,\u11ad": "0xb2", + ",\u1170,\u11ae": "0xb2", + ",\u1170,\u11af": "0xb2", + ",\u1170,\u11b0": "0xb2", + ",\u1170,\u11b1": "0xb2", + ",\u1170,\u11b2": "0xb2", + ",\u1170,\u11b3": "0xb2", + ",\u1170,\u11b4": "0xb2", + ",\u1170,\u11b5": "0xb2", + ",\u1170,\u11b6": "0xb2", + ",\u1170,\u11b7": "0xb2", + ",\u1170,\u11b8": "0xb2", + ",\u1170,\u11b9": "0xb2", + ",\u1170,\u11ba": "0xb2", + ",\u1170,\u11bb": "0xb2", + ",\u1170,\u11bc": "0xb2", + ",\u1170,\u11bd": "0xb2", + ",\u1170,\u11be": "0xb2", + ",\u1170,\u11bf": "0xb2", + ",\u1170,\u11c0": "0xb2", + ",\u1170,\u11c1": "0xb2", + ",\u1170,\u11c2": "0xb2" + } + } + ], + "\u1107": [ + { + "defaultGlyph": "0x0d", + "alternatives": { + ",\u1162": "0x3a", + ",\u1166": "0x3a", + ",\u1164": "0x3a", + ",\u1168": "0x3a" + } + }, + { + "defaultGlyph": "0x74", + "alternatives": {} + }, + { + "defaultGlyph": "0x97", + "alternatives": { + ",\u116a": "0xb8", + ",\u116b": "0xb8", + ",\u1170": "0xb8" + } + }, + { + "defaultGlyph": "0x0d", + "alternatives": { + ",\u1166,\u11af": "0x3a", + ",\u1162,\u11af": "0x3a", + ",\u1166,\u11ab": "0x3a", + ",\u1162,\u11b7": "0x3a", + ",\u1162,\u11ba": "0x3a", + ",\u1162,\u11a8": "0x3a", + ",\u1162,\u11a9": "0x3a", + ",\u1162,\u11aa": "0x3a", + ",\u1162,\u11ab": "0x3a", + ",\u1162,\u11ac": "0x3a", + ",\u1162,\u11ad": "0x3a", + ",\u1162,\u11ae": "0x3a", + ",\u1162,\u11b0": "0x3a", + ",\u1162,\u11b1": "0x3a", + ",\u1162,\u11b2": "0x3a", + ",\u1162,\u11b3": "0x3a", + ",\u1162,\u11b4": "0x3a", + ",\u1162,\u11b5": "0x3a", + ",\u1162,\u11b6": "0x3a", + ",\u1162,\u11b8": "0x3a", + ",\u1162,\u11b9": "0x3a", + ",\u1162,\u11bb": "0x3a", + ",\u1162,\u11bc": "0x3a", + ",\u1162,\u11bd": "0x3a", + ",\u1162,\u11be": "0x3a", + ",\u1162,\u11bf": "0x3a", + ",\u1162,\u11c0": "0x3a", + ",\u1162,\u11c1": "0x3a", + ",\u1162,\u11c2": "0x3a", + ",\u1164,\u11a8": "0x3a", + ",\u1164,\u11a9": "0x3a", + ",\u1164,\u11aa": "0x3a", + ",\u1164,\u11ab": "0x3a", + ",\u1164,\u11ac": "0x3a", + ",\u1164,\u11ad": "0x3a", + ",\u1164,\u11ae": "0x3a", + ",\u1164,\u11af": "0x3a", + ",\u1164,\u11b0": "0x3a", + ",\u1164,\u11b1": "0x3a", + ",\u1164,\u11b2": "0x3a", + ",\u1164,\u11b3": "0x3a", + ",\u1164,\u11b4": "0x3a", + ",\u1164,\u11b5": "0x3a", + ",\u1164,\u11b6": "0x3a", + ",\u1164,\u11b7": "0x3a", + ",\u1164,\u11b8": "0x3a", + ",\u1164,\u11b9": "0x3a", + ",\u1164,\u11ba": "0x3a", + ",\u1164,\u11bb": "0x3a", + ",\u1164,\u11bc": "0x3a", + ",\u1164,\u11bd": "0x3a", + ",\u1164,\u11be": "0x3a", + ",\u1164,\u11bf": "0x3a", + ",\u1164,\u11c0": "0x3a", + ",\u1164,\u11c1": "0x3a", + ",\u1164,\u11c2": "0x3a", + ",\u1166,\u11a8": "0x3a", + ",\u1166,\u11a9": "0x3a", + ",\u1166,\u11aa": "0x3a", + ",\u1166,\u11ac": "0x3a", + ",\u1166,\u11ad": "0x3a", + ",\u1166,\u11ae": "0x3a", + ",\u1166,\u11b0": "0x3a", + ",\u1166,\u11b1": "0x3a", + ",\u1166,\u11b2": "0x3a", + ",\u1166,\u11b3": "0x3a", + ",\u1166,\u11b4": "0x3a", + ",\u1166,\u11b5": "0x3a", + ",\u1166,\u11b6": "0x3a", + ",\u1166,\u11b7": "0x3a", + ",\u1166,\u11b8": "0x3a", + ",\u1166,\u11b9": "0x3a", + ",\u1166,\u11ba": "0x3a", + ",\u1166,\u11bb": "0x3a", + ",\u1166,\u11bc": "0x3a", + ",\u1166,\u11bd": "0x3a", + ",\u1166,\u11be": "0x3a", + ",\u1166,\u11bf": "0x3a", + ",\u1166,\u11c0": "0x3a", + ",\u1166,\u11c1": "0x3a", + ",\u1166,\u11c2": "0x3a", + ",\u1168,\u11a8": "0x3a", + ",\u1168,\u11a9": "0x3a", + ",\u1168,\u11aa": "0x3a", + ",\u1168,\u11ab": "0x3a", + ",\u1168,\u11ac": "0x3a", + ",\u1168,\u11ad": "0x3a", + ",\u1168,\u11ae": "0x3a", + ",\u1168,\u11af": "0x3a", + ",\u1168,\u11b0": "0x3a", + ",\u1168,\u11b1": "0x3a", + ",\u1168,\u11b2": "0x3a", + ",\u1168,\u11b3": "0x3a", + ",\u1168,\u11b4": "0x3a", + ",\u1168,\u11b5": "0x3a", + ",\u1168,\u11b6": "0x3a", + ",\u1168,\u11b7": "0x3a", + ",\u1168,\u11b8": "0x3a", + ",\u1168,\u11b9": "0x3a", + ",\u1168,\u11ba": "0x3a", + ",\u1168,\u11bb": "0x3a", + ",\u1168,\u11bc": "0x3a", + ",\u1168,\u11bd": "0x3a", + ",\u1168,\u11be": "0x3a", + ",\u1168,\u11bf": "0x3a", + ",\u1168,\u11c0": "0x3a", + ",\u1168,\u11c1": "0x3a", + ",\u1168,\u11c2": "0x3a" + } + }, + { + "defaultGlyph": "0x74", + "alternatives": {} + }, + { + "defaultGlyph": "0x97", + "alternatives": { + ",\u116a,\u11a8": "0xb8", + ",\u116a,\u11a9": "0xb8", + ",\u116a,\u11aa": "0xb8", + ",\u116a,\u11ab": "0xb8", + ",\u116a,\u11ac": "0xb8", + ",\u116a,\u11ad": "0xb8", + ",\u116a,\u11ae": "0xb8", + ",\u116a,\u11af": "0xb8", + ",\u116a,\u11b0": "0xb8", + ",\u116a,\u11b1": "0xb8", + ",\u116a,\u11b2": "0xb8", + ",\u116a,\u11b3": "0xb8", + ",\u116a,\u11b4": "0xb8", + ",\u116a,\u11b5": "0xb8", + ",\u116a,\u11b6": "0xb8", + ",\u116a,\u11b7": "0xb8", + ",\u116a,\u11b8": "0xb8", + ",\u116a,\u11b9": "0xb8", + ",\u116a,\u11ba": "0xb8", + ",\u116a,\u11bb": "0xb8", + ",\u116a,\u11bc": "0xb8", + ",\u116a,\u11bd": "0xb8", + ",\u116a,\u11be": "0xb8", + ",\u116a,\u11bf": "0xb8", + ",\u116a,\u11c0": "0xb8", + ",\u116a,\u11c1": "0xb8", + ",\u116a,\u11c2": "0xb8", + ",\u116b,\u11a8": "0xb8", + ",\u116b,\u11a9": "0xb8", + ",\u116b,\u11aa": "0xb8", + ",\u116b,\u11ab": "0xb8", + ",\u116b,\u11ac": "0xb8", + ",\u116b,\u11ad": "0xb8", + ",\u116b,\u11ae": "0xb8", + ",\u116b,\u11af": "0xb8", + ",\u116b,\u11b0": "0xb8", + ",\u116b,\u11b1": "0xb8", + ",\u116b,\u11b2": "0xb8", + ",\u116b,\u11b3": "0xb8", + ",\u116b,\u11b4": "0xb8", + ",\u116b,\u11b5": "0xb8", + ",\u116b,\u11b6": "0xb8", + ",\u116b,\u11b7": "0xb8", + ",\u116b,\u11b8": "0xb8", + ",\u116b,\u11b9": "0xb8", + ",\u116b,\u11ba": "0xb8", + ",\u116b,\u11bb": "0xb8", + ",\u116b,\u11bc": "0xb8", + ",\u116b,\u11bd": "0xb8", + ",\u116b,\u11be": "0xb8", + ",\u116b,\u11bf": "0xb8", + ",\u116b,\u11c0": "0xb8", + ",\u116b,\u11c1": "0xb8", + ",\u116b,\u11c2": "0xb8", + ",\u1170,\u11a8": "0xb8", + ",\u1170,\u11a9": "0xb8", + ",\u1170,\u11aa": "0xb8", + ",\u1170,\u11ab": "0xb8", + ",\u1170,\u11ac": "0xb8", + ",\u1170,\u11ad": "0xb8", + ",\u1170,\u11ae": "0xb8", + ",\u1170,\u11af": "0xb8", + ",\u1170,\u11b0": "0xb8", + ",\u1170,\u11b1": "0xb8", + ",\u1170,\u11b2": "0xb8", + ",\u1170,\u11b3": "0xb8", + ",\u1170,\u11b4": "0xb8", + ",\u1170,\u11b5": "0xb8", + ",\u1170,\u11b6": "0xb8", + ",\u1170,\u11b7": "0xb8", + ",\u1170,\u11b8": "0xb8", + ",\u1170,\u11b9": "0xb8", + ",\u1170,\u11ba": "0xb8", + ",\u1170,\u11bb": "0xb8", + ",\u1170,\u11bc": "0xb8", + ",\u1170,\u11bd": "0xb8", + ",\u1170,\u11be": "0xb8", + ",\u1170,\u11bf": "0xb8", + ",\u1170,\u11c0": "0xb8", + ",\u1170,\u11c1": "0xb8", + ",\u1170,\u11c2": "0xb8" + } + } + ], + "\u1108": [ + { + "defaultGlyph": "0x3b", + "alternatives": { + ",\u1162": "0x3b", + ",\u1165": "0x0e", + ",\u1175": "0x0e" + } + }, + { + "defaultGlyph": "0x75", + "alternatives": {} + }, + { + "defaultGlyph": "0x98", + "alternatives": {} + }, + { + "defaultGlyph": "0x0e", + "alternatives": { + ",\u1162,\u11bb": "0x3b", + ",\u1162,\u11a8": "0x3b", + ",\u1162,\u11a9": "0x3b", + ",\u1162,\u11aa": "0x3b", + ",\u1162,\u11ab": "0x3b", + ",\u1162,\u11ac": "0x3b", + ",\u1162,\u11ad": "0x3b", + ",\u1162,\u11ae": "0x3b", + ",\u1162,\u11af": "0x3b", + ",\u1162,\u11b0": "0x3b", + ",\u1162,\u11b1": "0x3b", + ",\u1162,\u11b2": "0x3b", + ",\u1162,\u11b3": "0x3b", + ",\u1162,\u11b4": "0x3b", + ",\u1162,\u11b5": "0x3b", + ",\u1162,\u11b6": "0x3b", + ",\u1162,\u11b7": "0x3b", + ",\u1162,\u11b8": "0x3b", + ",\u1162,\u11b9": "0x3b", + ",\u1162,\u11ba": "0x3b", + ",\u1162,\u11bc": "0x3b", + ",\u1162,\u11bd": "0x3b", + ",\u1162,\u11be": "0x3b", + ",\u1162,\u11bf": "0x3b", + ",\u1162,\u11c0": "0x3b", + ",\u1162,\u11c1": "0x3b", + ",\u1162,\u11c2": "0x3b", + ",\u1163,\u11a8": "0x3b", + ",\u1163,\u11a9": "0x3b", + ",\u1163,\u11aa": "0x3b", + ",\u1163,\u11ab": "0x3b", + ",\u1163,\u11ac": "0x3b", + ",\u1163,\u11ad": "0x3b", + ",\u1163,\u11ae": "0x3b", + ",\u1163,\u11af": "0x3b", + ",\u1163,\u11b0": "0x3b", + ",\u1163,\u11b1": "0x3b", + ",\u1163,\u11b2": "0x3b", + ",\u1163,\u11b3": "0x3b", + ",\u1163,\u11b4": "0x3b", + ",\u1163,\u11b5": "0x3b", + ",\u1163,\u11b6": "0x3b", + ",\u1163,\u11b7": "0x3b", + ",\u1163,\u11b8": "0x3b", + ",\u1163,\u11b9": "0x3b", + ",\u1163,\u11ba": "0x3b", + ",\u1163,\u11bb": "0x3b", + ",\u1163,\u11bc": "0x3b", + ",\u1163,\u11bd": "0x3b", + ",\u1163,\u11be": "0x3b", + ",\u1163,\u11bf": "0x3b", + ",\u1163,\u11c0": "0x3b", + ",\u1163,\u11c1": "0x3b", + ",\u1163,\u11c2": "0x3b", + ",\u1164,\u11a8": "0x3b", + ",\u1164,\u11a9": "0x3b", + ",\u1164,\u11aa": "0x3b", + ",\u1164,\u11ab": "0x3b", + ",\u1164,\u11ac": "0x3b", + ",\u1164,\u11ad": "0x3b", + ",\u1164,\u11ae": "0x3b", + ",\u1164,\u11af": "0x3b", + ",\u1164,\u11b0": "0x3b", + ",\u1164,\u11b1": "0x3b", + ",\u1164,\u11b2": "0x3b", + ",\u1164,\u11b3": "0x3b", + ",\u1164,\u11b4": "0x3b", + ",\u1164,\u11b5": "0x3b", + ",\u1164,\u11b6": "0x3b", + ",\u1164,\u11b7": "0x3b", + ",\u1164,\u11b8": "0x3b", + ",\u1164,\u11b9": "0x3b", + ",\u1164,\u11ba": "0x3b", + ",\u1164,\u11bb": "0x3b", + ",\u1164,\u11bc": "0x3b", + ",\u1164,\u11bd": "0x3b", + ",\u1164,\u11be": "0x3b", + ",\u1164,\u11bf": "0x3b", + ",\u1164,\u11c0": "0x3b", + ",\u1164,\u11c1": "0x3b", + ",\u1164,\u11c2": "0x3b", + ",\u1166,\u11a8": "0x3b", + ",\u1166,\u11a9": "0x3b", + ",\u1166,\u11aa": "0x3b", + ",\u1166,\u11ab": "0x3b", + ",\u1166,\u11ac": "0x3b", + ",\u1166,\u11ad": "0x3b", + ",\u1166,\u11ae": "0x3b", + ",\u1166,\u11af": "0x3b", + ",\u1166,\u11b0": "0x3b", + ",\u1166,\u11b1": "0x3b", + ",\u1166,\u11b2": "0x3b", + ",\u1166,\u11b3": "0x3b", + ",\u1166,\u11b4": "0x3b", + ",\u1166,\u11b5": "0x3b", + ",\u1166,\u11b6": "0x3b", + ",\u1166,\u11b7": "0x3b", + ",\u1166,\u11b8": "0x3b", + ",\u1166,\u11b9": "0x3b", + ",\u1166,\u11ba": "0x3b", + ",\u1166,\u11bb": "0x3b", + ",\u1166,\u11bc": "0x3b", + ",\u1166,\u11bd": "0x3b", + ",\u1166,\u11be": "0x3b", + ",\u1166,\u11bf": "0x3b", + ",\u1166,\u11c0": "0x3b", + ",\u1166,\u11c1": "0x3b", + ",\u1166,\u11c2": "0x3b", + ",\u1167,\u11a8": "0x3b", + ",\u1167,\u11a9": "0x3b", + ",\u1167,\u11aa": "0x3b", + ",\u1167,\u11ab": "0x3b", + ",\u1167,\u11ac": "0x3b", + ",\u1167,\u11ad": "0x3b", + ",\u1167,\u11ae": "0x3b", + ",\u1167,\u11af": "0x3b", + ",\u1167,\u11b0": "0x3b", + ",\u1167,\u11b1": "0x3b", + ",\u1167,\u11b2": "0x3b", + ",\u1167,\u11b3": "0x3b", + ",\u1167,\u11b4": "0x3b", + ",\u1167,\u11b5": "0x3b", + ",\u1167,\u11b6": "0x3b", + ",\u1167,\u11b7": "0x3b", + ",\u1167,\u11b8": "0x3b", + ",\u1167,\u11b9": "0x3b", + ",\u1167,\u11ba": "0x3b", + ",\u1167,\u11bb": "0x3b", + ",\u1167,\u11bc": "0x3b", + ",\u1167,\u11bd": "0x3b", + ",\u1167,\u11be": "0x3b", + ",\u1167,\u11bf": "0x3b", + ",\u1167,\u11c0": "0x3b", + ",\u1167,\u11c1": "0x3b", + ",\u1167,\u11c2": "0x3b", + ",\u1168,\u11a8": "0x3b", + ",\u1168,\u11a9": "0x3b", + ",\u1168,\u11aa": "0x3b", + ",\u1168,\u11ab": "0x3b", + ",\u1168,\u11ac": "0x3b", + ",\u1168,\u11ad": "0x3b", + ",\u1168,\u11ae": "0x3b", + ",\u1168,\u11af": "0x3b", + ",\u1168,\u11b0": "0x3b", + ",\u1168,\u11b1": "0x3b", + ",\u1168,\u11b2": "0x3b", + ",\u1168,\u11b3": "0x3b", + ",\u1168,\u11b4": "0x3b", + ",\u1168,\u11b5": "0x3b", + ",\u1168,\u11b6": "0x3b", + ",\u1168,\u11b7": "0x3b", + ",\u1168,\u11b8": "0x3b", + ",\u1168,\u11b9": "0x3b", + ",\u1168,\u11ba": "0x3b", + ",\u1168,\u11bb": "0x3b", + ",\u1168,\u11bc": "0x3b", + ",\u1168,\u11bd": "0x3b", + ",\u1168,\u11be": "0x3b", + ",\u1168,\u11bf": "0x3b", + ",\u1168,\u11c0": "0x3b", + ",\u1168,\u11c1": "0x3b", + ",\u1168,\u11c2": "0x3b" + } + }, + { + "defaultGlyph": "0x75", + "alternatives": {} + }, + { + "defaultGlyph": "0x98", + "alternatives": {} + } + ], + "\u1109": [ + { + "defaultGlyph": "0x20", + "alternatives": { + ",\u1162": "0x4b", + ",\u1166": "0x4b", + ",\u1164": "0x4b", + ",\u1168": "0x4b" + } + }, + { + "defaultGlyph": "0x76", + "alternatives": {} + }, + { + "defaultGlyph": "0x99", + "alternatives": { + ",\u116b": "0xb9", + ",\u116a": "0xb9", + ",\u1170": "0xb9" + } + }, + { + "defaultGlyph": "0x20", + "alternatives": { + ",\u1166,\u11ba": "0x4b", + ",\u1162,\u11bc": "0x4b", + ",\u1162,\u11a8": "0x4b", + ",\u1166,\u11b7": "0x4b", + ",\u1166,\u11a8": "0x4b", + ",\u1162,\u11ab": "0x4b", + ",\u1166,\u11ab": "0x4b", + ",\u1162,\u11a9": "0x4b", + ",\u1162,\u11aa": "0x4b", + ",\u1162,\u11ac": "0x4b", + ",\u1162,\u11ad": "0x4b", + ",\u1162,\u11ae": "0x4b", + ",\u1162,\u11af": "0x4b", + ",\u1162,\u11b0": "0x4b", + ",\u1162,\u11b1": "0x4b", + ",\u1162,\u11b2": "0x4b", + ",\u1162,\u11b3": "0x4b", + ",\u1162,\u11b4": "0x4b", + ",\u1162,\u11b5": "0x4b", + ",\u1162,\u11b6": "0x4b", + ",\u1162,\u11b7": "0x4b", + ",\u1162,\u11b8": "0x4b", + ",\u1162,\u11b9": "0x4b", + ",\u1162,\u11ba": "0x4b", + ",\u1162,\u11bb": "0x4b", + ",\u1162,\u11bd": "0x4b", + ",\u1162,\u11be": "0x4b", + ",\u1162,\u11bf": "0x4b", + ",\u1162,\u11c0": "0x4b", + ",\u1162,\u11c1": "0x4b", + ",\u1162,\u11c2": "0x4b", + ",\u1164,\u11a8": "0x4b", + ",\u1164,\u11a9": "0x4b", + ",\u1164,\u11aa": "0x4b", + ",\u1164,\u11ab": "0x4b", + ",\u1164,\u11ac": "0x4b", + ",\u1164,\u11ad": "0x4b", + ",\u1164,\u11ae": "0x4b", + ",\u1164,\u11af": "0x4b", + ",\u1164,\u11b0": "0x4b", + ",\u1164,\u11b1": "0x4b", + ",\u1164,\u11b2": "0x4b", + ",\u1164,\u11b3": "0x4b", + ",\u1164,\u11b4": "0x4b", + ",\u1164,\u11b5": "0x4b", + ",\u1164,\u11b6": "0x4b", + ",\u1164,\u11b7": "0x4b", + ",\u1164,\u11b8": "0x4b", + ",\u1164,\u11b9": "0x4b", + ",\u1164,\u11ba": "0x4b", + ",\u1164,\u11bb": "0x4b", + ",\u1164,\u11bc": "0x4b", + ",\u1164,\u11bd": "0x4b", + ",\u1164,\u11be": "0x4b", + ",\u1164,\u11bf": "0x4b", + ",\u1164,\u11c0": "0x4b", + ",\u1164,\u11c1": "0x4b", + ",\u1164,\u11c2": "0x4b", + ",\u1166,\u11a9": "0x4b", + ",\u1166,\u11aa": "0x4b", + ",\u1166,\u11ac": "0x4b", + ",\u1166,\u11ad": "0x4b", + ",\u1166,\u11ae": "0x4b", + ",\u1166,\u11af": "0x4b", + ",\u1166,\u11b0": "0x4b", + ",\u1166,\u11b1": "0x4b", + ",\u1166,\u11b2": "0x4b", + ",\u1166,\u11b3": "0x4b", + ",\u1166,\u11b4": "0x4b", + ",\u1166,\u11b5": "0x4b", + ",\u1166,\u11b6": "0x4b", + ",\u1166,\u11b8": "0x4b", + ",\u1166,\u11b9": "0x4b", + ",\u1166,\u11bb": "0x4b", + ",\u1166,\u11bc": "0x4b", + ",\u1166,\u11bd": "0x4b", + ",\u1166,\u11be": "0x4b", + ",\u1166,\u11bf": "0x4b", + ",\u1166,\u11c0": "0x4b", + ",\u1166,\u11c1": "0x4b", + ",\u1166,\u11c2": "0x4b", + ",\u1168,\u11a8": "0x4b", + ",\u1168,\u11a9": "0x4b", + ",\u1168,\u11aa": "0x4b", + ",\u1168,\u11ab": "0x4b", + ",\u1168,\u11ac": "0x4b", + ",\u1168,\u11ad": "0x4b", + ",\u1168,\u11ae": "0x4b", + ",\u1168,\u11af": "0x4b", + ",\u1168,\u11b0": "0x4b", + ",\u1168,\u11b1": "0x4b", + ",\u1168,\u11b2": "0x4b", + ",\u1168,\u11b3": "0x4b", + ",\u1168,\u11b4": "0x4b", + ",\u1168,\u11b5": "0x4b", + ",\u1168,\u11b6": "0x4b", + ",\u1168,\u11b7": "0x4b", + ",\u1168,\u11b8": "0x4b", + ",\u1168,\u11b9": "0x4b", + ",\u1168,\u11ba": "0x4b", + ",\u1168,\u11bb": "0x4b", + ",\u1168,\u11bc": "0x4b", + ",\u1168,\u11bd": "0x4b", + ",\u1168,\u11be": "0x4b", + ",\u1168,\u11bf": "0x4b", + ",\u1168,\u11c0": "0x4b", + ",\u1168,\u11c1": "0x4b", + ",\u1168,\u11c2": "0x4b" + } + }, + { + "defaultGlyph": "0x76", + "alternatives": {} + }, + { + "defaultGlyph": "0x99", + "alternatives": { + ",\u116a,\u11a8": "0xb9", + ",\u116a,\u11a9": "0xb9", + ",\u116a,\u11aa": "0xb9", + ",\u116a,\u11ab": "0xb9", + ",\u116a,\u11ac": "0xb9", + ",\u116a,\u11ad": "0xb9", + ",\u116a,\u11ae": "0xb9", + ",\u116a,\u11af": "0xb9", + ",\u116a,\u11b0": "0xb9", + ",\u116a,\u11b1": "0xb9", + ",\u116a,\u11b2": "0xb9", + ",\u116a,\u11b3": "0xb9", + ",\u116a,\u11b4": "0xb9", + ",\u116a,\u11b5": "0xb9", + ",\u116a,\u11b6": "0xb9", + ",\u116a,\u11b7": "0xb9", + ",\u116a,\u11b8": "0xb9", + ",\u116a,\u11b9": "0xb9", + ",\u116a,\u11ba": "0xb9", + ",\u116a,\u11bb": "0xb9", + ",\u116a,\u11bc": "0xb9", + ",\u116a,\u11bd": "0xb9", + ",\u116a,\u11be": "0xb9", + ",\u116a,\u11bf": "0xb9", + ",\u116a,\u11c0": "0xb9", + ",\u116a,\u11c1": "0xb9", + ",\u116a,\u11c2": "0xb9", + ",\u116b,\u11a8": "0xb9", + ",\u116b,\u11a9": "0xb9", + ",\u116b,\u11aa": "0xb9", + ",\u116b,\u11ab": "0xb9", + ",\u116b,\u11ac": "0xb9", + ",\u116b,\u11ad": "0xb9", + ",\u116b,\u11ae": "0xb9", + ",\u116b,\u11af": "0xb9", + ",\u116b,\u11b0": "0xb9", + ",\u116b,\u11b1": "0xb9", + ",\u116b,\u11b2": "0xb9", + ",\u116b,\u11b3": "0xb9", + ",\u116b,\u11b4": "0xb9", + ",\u116b,\u11b5": "0xb9", + ",\u116b,\u11b6": "0xb9", + ",\u116b,\u11b7": "0xb9", + ",\u116b,\u11b8": "0xb9", + ",\u116b,\u11b9": "0xb9", + ",\u116b,\u11ba": "0xb9", + ",\u116b,\u11bb": "0xb9", + ",\u116b,\u11bc": "0xb9", + ",\u116b,\u11bd": "0xb9", + ",\u116b,\u11be": "0xb9", + ",\u116b,\u11bf": "0xb9", + ",\u116b,\u11c0": "0xb9", + ",\u116b,\u11c1": "0xb9", + ",\u116b,\u11c2": "0xb9", + ",\u1170,\u11a8": "0xb9", + ",\u1170,\u11a9": "0xb9", + ",\u1170,\u11aa": "0xb9", + ",\u1170,\u11ab": "0xb9", + ",\u1170,\u11ac": "0xb9", + ",\u1170,\u11ad": "0xb9", + ",\u1170,\u11ae": "0xb9", + ",\u1170,\u11af": "0xb9", + ",\u1170,\u11b0": "0xb9", + ",\u1170,\u11b1": "0xb9", + ",\u1170,\u11b2": "0xb9", + ",\u1170,\u11b3": "0xb9", + ",\u1170,\u11b4": "0xb9", + ",\u1170,\u11b5": "0xb9", + ",\u1170,\u11b6": "0xb9", + ",\u1170,\u11b7": "0xb9", + ",\u1170,\u11b8": "0xb9", + ",\u1170,\u11b9": "0xb9", + ",\u1170,\u11ba": "0xb9", + ",\u1170,\u11bb": "0xb9", + ",\u1170,\u11bc": "0xb9", + ",\u1170,\u11bd": "0xb9", + ",\u1170,\u11be": "0xb9", + ",\u1170,\u11bf": "0xb9", + ",\u1170,\u11c0": "0xb9", + ",\u1170,\u11c1": "0xb9", + ",\u1170,\u11c2": "0xb9" + } + } + ], + "\u110a": [ + { + "defaultGlyph": "0x21", + "alternatives": { + ",\u1166": "0x4c", + ",\u1162": "0x4c", + ",\u1164": "0x4c", + ",\u1165": "0x4c", + ",\u1167": "0x4c", + ",\u1168": "0x4c" + } + }, + { + "defaultGlyph": "0x77", + "alternatives": {} + }, + { + "defaultGlyph": "0x9a", + "alternatives": { + ",\u116a": "0xba", + ",\u116b": "0xba", + ",\u1170": "0xba" + } + }, + { + "defaultGlyph": "0x21", + "alternatives": { + ",\u1166,\u11ab": "0x4c", + ",\u1162,\u11a8": "0x4c", + ",\u1162,\u11a9": "0x4c", + ",\u1162,\u11aa": "0x4c", + ",\u1162,\u11ab": "0x4c", + ",\u1162,\u11ac": "0x4c", + ",\u1162,\u11ad": "0x4c", + ",\u1162,\u11ae": "0x4c", + ",\u1162,\u11af": "0x4c", + ",\u1162,\u11b0": "0x4c", + ",\u1162,\u11b1": "0x4c", + ",\u1162,\u11b2": "0x4c", + ",\u1162,\u11b3": "0x4c", + ",\u1162,\u11b4": "0x4c", + ",\u1162,\u11b5": "0x4c", + ",\u1162,\u11b6": "0x4c", + ",\u1162,\u11b7": "0x4c", + ",\u1162,\u11b8": "0x4c", + ",\u1162,\u11b9": "0x4c", + ",\u1162,\u11ba": "0x4c", + ",\u1162,\u11bb": "0x4c", + ",\u1162,\u11bc": "0x4c", + ",\u1162,\u11bd": "0x4c", + ",\u1162,\u11be": "0x4c", + ",\u1162,\u11bf": "0x4c", + ",\u1162,\u11c0": "0x4c", + ",\u1162,\u11c1": "0x4c", + ",\u1162,\u11c2": "0x4c", + ",\u1163,\u11a8": "0x4c", + ",\u1163,\u11a9": "0x4c", + ",\u1163,\u11aa": "0x4c", + ",\u1163,\u11ab": "0x4c", + ",\u1163,\u11ac": "0x4c", + ",\u1163,\u11ad": "0x4c", + ",\u1163,\u11ae": "0x4c", + ",\u1163,\u11af": "0x4c", + ",\u1163,\u11b0": "0x4c", + ",\u1163,\u11b1": "0x4c", + ",\u1163,\u11b2": "0x4c", + ",\u1163,\u11b3": "0x4c", + ",\u1163,\u11b4": "0x4c", + ",\u1163,\u11b5": "0x4c", + ",\u1163,\u11b6": "0x4c", + ",\u1163,\u11b7": "0x4c", + ",\u1163,\u11b8": "0x4c", + ",\u1163,\u11b9": "0x4c", + ",\u1163,\u11ba": "0x4c", + ",\u1163,\u11bb": "0x4c", + ",\u1163,\u11bc": "0x4c", + ",\u1163,\u11bd": "0x4c", + ",\u1163,\u11be": "0x4c", + ",\u1163,\u11bf": "0x4c", + ",\u1163,\u11c0": "0x4c", + ",\u1163,\u11c1": "0x4c", + ",\u1163,\u11c2": "0x4c", + ",\u1164,\u11a8": "0x4c", + ",\u1164,\u11a9": "0x4c", + ",\u1164,\u11aa": "0x4c", + ",\u1164,\u11ab": "0x4c", + ",\u1164,\u11ac": "0x4c", + ",\u1164,\u11ad": "0x4c", + ",\u1164,\u11ae": "0x4c", + ",\u1164,\u11af": "0x4c", + ",\u1164,\u11b0": "0x4c", + ",\u1164,\u11b1": "0x4c", + ",\u1164,\u11b2": "0x4c", + ",\u1164,\u11b3": "0x4c", + ",\u1164,\u11b4": "0x4c", + ",\u1164,\u11b5": "0x4c", + ",\u1164,\u11b6": "0x4c", + ",\u1164,\u11b7": "0x4c", + ",\u1164,\u11b8": "0x4c", + ",\u1164,\u11b9": "0x4c", + ",\u1164,\u11ba": "0x4c", + ",\u1164,\u11bb": "0x4c", + ",\u1164,\u11bc": "0x4c", + ",\u1164,\u11bd": "0x4c", + ",\u1164,\u11be": "0x4c", + ",\u1164,\u11bf": "0x4c", + ",\u1164,\u11c0": "0x4c", + ",\u1164,\u11c1": "0x4c", + ",\u1164,\u11c2": "0x4c", + ",\u1166,\u11a8": "0x4c", + ",\u1166,\u11a9": "0x4c", + ",\u1166,\u11aa": "0x4c", + ",\u1166,\u11ac": "0x4c", + ",\u1166,\u11ad": "0x4c", + ",\u1166,\u11ae": "0x4c", + ",\u1166,\u11af": "0x4c", + ",\u1166,\u11b0": "0x4c", + ",\u1166,\u11b1": "0x4c", + ",\u1166,\u11b2": "0x4c", + ",\u1166,\u11b3": "0x4c", + ",\u1166,\u11b4": "0x4c", + ",\u1166,\u11b5": "0x4c", + ",\u1166,\u11b6": "0x4c", + ",\u1166,\u11b7": "0x4c", + ",\u1166,\u11b8": "0x4c", + ",\u1166,\u11b9": "0x4c", + ",\u1166,\u11ba": "0x4c", + ",\u1166,\u11bb": "0x4c", + ",\u1166,\u11bc": "0x4c", + ",\u1166,\u11bd": "0x4c", + ",\u1166,\u11be": "0x4c", + ",\u1166,\u11bf": "0x4c", + ",\u1166,\u11c0": "0x4c", + ",\u1166,\u11c1": "0x4c", + ",\u1166,\u11c2": "0x4c", + ",\u1167,\u11a8": "0x4c", + ",\u1167,\u11a9": "0x4c", + ",\u1167,\u11aa": "0x4c", + ",\u1167,\u11ab": "0x4c", + ",\u1167,\u11ac": "0x4c", + ",\u1167,\u11ad": "0x4c", + ",\u1167,\u11ae": "0x4c", + ",\u1167,\u11af": "0x4c", + ",\u1167,\u11b0": "0x4c", + ",\u1167,\u11b1": "0x4c", + ",\u1167,\u11b2": "0x4c", + ",\u1167,\u11b3": "0x4c", + ",\u1167,\u11b4": "0x4c", + ",\u1167,\u11b5": "0x4c", + ",\u1167,\u11b6": "0x4c", + ",\u1167,\u11b7": "0x4c", + ",\u1167,\u11b8": "0x4c", + ",\u1167,\u11b9": "0x4c", + ",\u1167,\u11ba": "0x4c", + ",\u1167,\u11bb": "0x4c", + ",\u1167,\u11bc": "0x4c", + ",\u1167,\u11bd": "0x4c", + ",\u1167,\u11be": "0x4c", + ",\u1167,\u11bf": "0x4c", + ",\u1167,\u11c0": "0x4c", + ",\u1167,\u11c1": "0x4c", + ",\u1167,\u11c2": "0x4c", + ",\u1168,\u11a8": "0x4c", + ",\u1168,\u11a9": "0x4c", + ",\u1168,\u11aa": "0x4c", + ",\u1168,\u11ab": "0x4c", + ",\u1168,\u11ac": "0x4c", + ",\u1168,\u11ad": "0x4c", + ",\u1168,\u11ae": "0x4c", + ",\u1168,\u11af": "0x4c", + ",\u1168,\u11b0": "0x4c", + ",\u1168,\u11b1": "0x4c", + ",\u1168,\u11b2": "0x4c", + ",\u1168,\u11b3": "0x4c", + ",\u1168,\u11b4": "0x4c", + ",\u1168,\u11b5": "0x4c", + ",\u1168,\u11b6": "0x4c", + ",\u1168,\u11b7": "0x4c", + ",\u1168,\u11b8": "0x4c", + ",\u1168,\u11b9": "0x4c", + ",\u1168,\u11ba": "0x4c", + ",\u1168,\u11bb": "0x4c", + ",\u1168,\u11bc": "0x4c", + ",\u1168,\u11bd": "0x4c", + ",\u1168,\u11be": "0x4c", + ",\u1168,\u11bf": "0x4c", + ",\u1168,\u11c0": "0x4c", + ",\u1168,\u11c1": "0x4c", + ",\u1168,\u11c2": "0x4c" + } + }, + { + "defaultGlyph": "0x77", + "alternatives": {} + }, + { + "defaultGlyph": "0x9a", + "alternatives": { + ",\u116a,\u11a8": "0xba", + ",\u116a,\u11a9": "0xba", + ",\u116a,\u11aa": "0xba", + ",\u116a,\u11ab": "0xba", + ",\u116a,\u11ac": "0xba", + ",\u116a,\u11ad": "0xba", + ",\u116a,\u11ae": "0xba", + ",\u116a,\u11af": "0xba", + ",\u116a,\u11b0": "0xba", + ",\u116a,\u11b1": "0xba", + ",\u116a,\u11b2": "0xba", + ",\u116a,\u11b3": "0xba", + ",\u116a,\u11b4": "0xba", + ",\u116a,\u11b5": "0xba", + ",\u116a,\u11b6": "0xba", + ",\u116a,\u11b7": "0xba", + ",\u116a,\u11b8": "0xba", + ",\u116a,\u11b9": "0xba", + ",\u116a,\u11ba": "0xba", + ",\u116a,\u11bb": "0xba", + ",\u116a,\u11bc": "0xba", + ",\u116a,\u11bd": "0xba", + ",\u116a,\u11be": "0xba", + ",\u116a,\u11bf": "0xba", + ",\u116a,\u11c0": "0xba", + ",\u116a,\u11c1": "0xba", + ",\u116a,\u11c2": "0xba", + ",\u116b,\u11a8": "0xba", + ",\u116b,\u11a9": "0xba", + ",\u116b,\u11aa": "0xba", + ",\u116b,\u11ab": "0xba", + ",\u116b,\u11ac": "0xba", + ",\u116b,\u11ad": "0xba", + ",\u116b,\u11ae": "0xba", + ",\u116b,\u11af": "0xba", + ",\u116b,\u11b0": "0xba", + ",\u116b,\u11b1": "0xba", + ",\u116b,\u11b2": "0xba", + ",\u116b,\u11b3": "0xba", + ",\u116b,\u11b4": "0xba", + ",\u116b,\u11b5": "0xba", + ",\u116b,\u11b6": "0xba", + ",\u116b,\u11b7": "0xba", + ",\u116b,\u11b8": "0xba", + ",\u116b,\u11b9": "0xba", + ",\u116b,\u11ba": "0xba", + ",\u116b,\u11bb": "0xba", + ",\u116b,\u11bc": "0xba", + ",\u116b,\u11bd": "0xba", + ",\u116b,\u11be": "0xba", + ",\u116b,\u11bf": "0xba", + ",\u116b,\u11c0": "0xba", + ",\u116b,\u11c1": "0xba", + ",\u116b,\u11c2": "0xba", + ",\u1170,\u11a8": "0xba", + ",\u1170,\u11a9": "0xba", + ",\u1170,\u11aa": "0xba", + ",\u1170,\u11ab": "0xba", + ",\u1170,\u11ac": "0xba", + ",\u1170,\u11ad": "0xba", + ",\u1170,\u11ae": "0xba", + ",\u1170,\u11af": "0xba", + ",\u1170,\u11b0": "0xba", + ",\u1170,\u11b1": "0xba", + ",\u1170,\u11b2": "0xba", + ",\u1170,\u11b3": "0xba", + ",\u1170,\u11b4": "0xba", + ",\u1170,\u11b5": "0xba", + ",\u1170,\u11b6": "0xba", + ",\u1170,\u11b7": "0xba", + ",\u1170,\u11b8": "0xba", + ",\u1170,\u11b9": "0xba", + ",\u1170,\u11ba": "0xba", + ",\u1170,\u11bb": "0xba", + ",\u1170,\u11bc": "0xba", + ",\u1170,\u11bd": "0xba", + ",\u1170,\u11be": "0xba", + ",\u1170,\u11bf": "0xba", + ",\u1170,\u11c0": "0xba", + ",\u1170,\u11c1": "0xba", + ",\u1170,\u11c2": "0xba" + } + } + ], + "\u110b": [ + { + "defaultGlyph": "0x0f", + "alternatives": { + ",\u1168": "0x3c", + ",\u1166": "0x3c", + ",\u1162": "0x3c", + ",\u1164": "0x3c" + } + }, + { + "defaultGlyph": "0x78", + "alternatives": {} + }, + { + "defaultGlyph": "0x9b", + "alternatives": { + ",\u116b": "0xbb", + ",\u1170": "0xbb", + ",\u116a": "0xbb" + } + }, + { + "defaultGlyph": "0x0f", + "alternatives": { + ",\u1166,\u11af": "0x3c", + ",\u1168,\u11ba": "0x3c", + ",\u1166,\u1100": "0x3c", + ",\u1166,\u11ab": "0x3c", + ",\u1162,\u11af": "0x3c", + ",\u1162,\u11a8": "0x3c", + ",\u1162,\u11a9": "0x3c", + ",\u1162,\u11aa": "0x3c", + ",\u1162,\u11ab": "0x3c", + ",\u1162,\u11ac": "0x3c", + ",\u1162,\u11ad": "0x3c", + ",\u1162,\u11ae": "0x3c", + ",\u1162,\u11b0": "0x3c", + ",\u1162,\u11b1": "0x3c", + ",\u1162,\u11b2": "0x3c", + ",\u1162,\u11b3": "0x3c", + ",\u1162,\u11b4": "0x3c", + ",\u1162,\u11b5": "0x3c", + ",\u1162,\u11b6": "0x3c", + ",\u1162,\u11b7": "0x3c", + ",\u1162,\u11b8": "0x3c", + ",\u1162,\u11b9": "0x3c", + ",\u1162,\u11ba": "0x3c", + ",\u1162,\u11bb": "0x3c", + ",\u1162,\u11bc": "0x3c", + ",\u1162,\u11bd": "0x3c", + ",\u1162,\u11be": "0x3c", + ",\u1162,\u11bf": "0x3c", + ",\u1162,\u11c0": "0x3c", + ",\u1162,\u11c1": "0x3c", + ",\u1162,\u11c2": "0x3c", + ",\u1164,\u11a8": "0x3c", + ",\u1164,\u11a9": "0x3c", + ",\u1164,\u11aa": "0x3c", + ",\u1164,\u11ab": "0x3c", + ",\u1164,\u11ac": "0x3c", + ",\u1164,\u11ad": "0x3c", + ",\u1164,\u11ae": "0x3c", + ",\u1164,\u11af": "0x3c", + ",\u1164,\u11b0": "0x3c", + ",\u1164,\u11b1": "0x3c", + ",\u1164,\u11b2": "0x3c", + ",\u1164,\u11b3": "0x3c", + ",\u1164,\u11b4": "0x3c", + ",\u1164,\u11b5": "0x3c", + ",\u1164,\u11b6": "0x3c", + ",\u1164,\u11b7": "0x3c", + ",\u1164,\u11b8": "0x3c", + ",\u1164,\u11b9": "0x3c", + ",\u1164,\u11ba": "0x3c", + ",\u1164,\u11bb": "0x3c", + ",\u1164,\u11bc": "0x3c", + ",\u1164,\u11bd": "0x3c", + ",\u1164,\u11be": "0x3c", + ",\u1164,\u11bf": "0x3c", + ",\u1164,\u11c0": "0x3c", + ",\u1164,\u11c1": "0x3c", + ",\u1164,\u11c2": "0x3c", + ",\u1166,\u11a8": "0x3c", + ",\u1166,\u11a9": "0x3c", + ",\u1166,\u11aa": "0x3c", + ",\u1166,\u11ac": "0x3c", + ",\u1166,\u11ad": "0x3c", + ",\u1166,\u11ae": "0x3c", + ",\u1166,\u11b0": "0x3c", + ",\u1166,\u11b1": "0x3c", + ",\u1166,\u11b2": "0x3c", + ",\u1166,\u11b3": "0x3c", + ",\u1166,\u11b4": "0x3c", + ",\u1166,\u11b5": "0x3c", + ",\u1166,\u11b6": "0x3c", + ",\u1166,\u11b7": "0x3c", + ",\u1166,\u11b8": "0x3c", + ",\u1166,\u11b9": "0x3c", + ",\u1166,\u11ba": "0x3c", + ",\u1166,\u11bb": "0x3c", + ",\u1166,\u11bc": "0x3c", + ",\u1166,\u11bd": "0x3c", + ",\u1166,\u11be": "0x3c", + ",\u1166,\u11bf": "0x3c", + ",\u1166,\u11c0": "0x3c", + ",\u1166,\u11c1": "0x3c", + ",\u1166,\u11c2": "0x3c", + ",\u1168,\u11a8": "0x3c", + ",\u1168,\u11a9": "0x3c", + ",\u1168,\u11aa": "0x3c", + ",\u1168,\u11ab": "0x3c", + ",\u1168,\u11ac": "0x3c", + ",\u1168,\u11ad": "0x3c", + ",\u1168,\u11ae": "0x3c", + ",\u1168,\u11af": "0x3c", + ",\u1168,\u11b0": "0x3c", + ",\u1168,\u11b1": "0x3c", + ",\u1168,\u11b2": "0x3c", + ",\u1168,\u11b3": "0x3c", + ",\u1168,\u11b4": "0x3c", + ",\u1168,\u11b5": "0x3c", + ",\u1168,\u11b6": "0x3c", + ",\u1168,\u11b7": "0x3c", + ",\u1168,\u11b8": "0x3c", + ",\u1168,\u11b9": "0x3c", + ",\u1168,\u11bb": "0x3c", + ",\u1168,\u11bc": "0x3c", + ",\u1168,\u11bd": "0x3c", + ",\u1168,\u11be": "0x3c", + ",\u1168,\u11bf": "0x3c", + ",\u1168,\u11c0": "0x3c", + ",\u1168,\u11c1": "0x3c", + ",\u1168,\u11c2": "0x3c" + } + }, + { + "defaultGlyph": "0x78", + "alternatives": {} + }, + { + "defaultGlyph": "0x9b", + "alternatives": { + ",\u1170,\u11a8": "0xbb", + ",\u116a,\u11a8": "0xbb", + ",\u116a,\u11a9": "0xbb", + ",\u116a,\u11aa": "0xbb", + ",\u116a,\u11ab": "0xbb", + ",\u116a,\u11ac": "0xbb", + ",\u116a,\u11ad": "0xbb", + ",\u116a,\u11ae": "0xbb", + ",\u116a,\u11af": "0xbb", + ",\u116a,\u11b0": "0xbb", + ",\u116a,\u11b1": "0xbb", + ",\u116a,\u11b2": "0xbb", + ",\u116a,\u11b3": "0xbb", + ",\u116a,\u11b4": "0xbb", + ",\u116a,\u11b5": "0xbb", + ",\u116a,\u11b6": "0xbb", + ",\u116a,\u11b7": "0xbb", + ",\u116a,\u11b8": "0xbb", + ",\u116a,\u11b9": "0xbb", + ",\u116a,\u11ba": "0xbb", + ",\u116a,\u11bb": "0xbb", + ",\u116a,\u11bc": "0xbb", + ",\u116a,\u11bd": "0xbb", + ",\u116a,\u11be": "0xbb", + ",\u116a,\u11bf": "0xbb", + ",\u116a,\u11c0": "0xbb", + ",\u116a,\u11c1": "0xbb", + ",\u116a,\u11c2": "0xbb", + ",\u116b,\u11a8": "0xbb", + ",\u116b,\u11a9": "0xbb", + ",\u116b,\u11aa": "0xbb", + ",\u116b,\u11ab": "0xbb", + ",\u116b,\u11ac": "0xbb", + ",\u116b,\u11ad": "0xbb", + ",\u116b,\u11ae": "0xbb", + ",\u116b,\u11af": "0xbb", + ",\u116b,\u11b0": "0xbb", + ",\u116b,\u11b1": "0xbb", + ",\u116b,\u11b2": "0xbb", + ",\u116b,\u11b3": "0xbb", + ",\u116b,\u11b4": "0xbb", + ",\u116b,\u11b5": "0xbb", + ",\u116b,\u11b6": "0xbb", + ",\u116b,\u11b7": "0xbb", + ",\u116b,\u11b8": "0xbb", + ",\u116b,\u11b9": "0xbb", + ",\u116b,\u11ba": "0xbb", + ",\u116b,\u11bb": "0xbb", + ",\u116b,\u11bc": "0xbb", + ",\u116b,\u11bd": "0xbb", + ",\u116b,\u11be": "0xbb", + ",\u116b,\u11bf": "0xbb", + ",\u116b,\u11c0": "0xbb", + ",\u116b,\u11c1": "0xbb", + ",\u116b,\u11c2": "0xbb", + ",\u1170,\u11a9": "0xbb", + ",\u1170,\u11aa": "0xbb", + ",\u1170,\u11ab": "0xbb", + ",\u1170,\u11ac": "0xbb", + ",\u1170,\u11ad": "0xbb", + ",\u1170,\u11ae": "0xbb", + ",\u1170,\u11af": "0xbb", + ",\u1170,\u11b0": "0xbb", + ",\u1170,\u11b1": "0xbb", + ",\u1170,\u11b2": "0xbb", + ",\u1170,\u11b3": "0xbb", + ",\u1170,\u11b4": "0xbb", + ",\u1170,\u11b5": "0xbb", + ",\u1170,\u11b6": "0xbb", + ",\u1170,\u11b7": "0xbb", + ",\u1170,\u11b8": "0xbb", + ",\u1170,\u11b9": "0xbb", + ",\u1170,\u11ba": "0xbb", + ",\u1170,\u11bb": "0xbb", + ",\u1170,\u11bc": "0xbb", + ",\u1170,\u11bd": "0xbb", + ",\u1170,\u11be": "0xbb", + ",\u1170,\u11bf": "0xbb", + ",\u1170,\u11c0": "0xbb", + ",\u1170,\u11c1": "0xbb", + ",\u1170,\u11c2": "0xbb" + } + } + ], + "\u110c": [ + { + "defaultGlyph": "0x10", + "alternatives": { + ",\u1166": "0x3d", + ",\u1162": "0x3d", + ",\u1164": "0x3d", + ",\u1168": "0x3d" + } + }, + { + "defaultGlyph": "0x79", + "alternatives": {} + }, + { + "defaultGlyph": "0x9c", + "alternatives": { + ",\u116a": "0xbc", + ",\u116b": "0xbc", + ",\u1170": "0xbc" + } + }, + { + "defaultGlyph": "0x10", + "alternatives": { + ",\u1162,\u11a8": "0x3d", + ",\u1166,\u11ba": "0x3d", + ",\u1162,\u11bc": "0x3d", + ",\u1166,\u11ab": "0x3d", + ",\u1166,\u11a8": "0x3d", + ",\u1166,\u11af": "0x3d", + ",\u1162,\u11ba": "0x3d", + ",\u1162,\u11a9": "0x3d", + ",\u1162,\u11aa": "0x3d", + ",\u1162,\u11ab": "0x3d", + ",\u1162,\u11ac": "0x3d", + ",\u1162,\u11ad": "0x3d", + ",\u1162,\u11ae": "0x3d", + ",\u1162,\u11af": "0x3d", + ",\u1162,\u11b0": "0x3d", + ",\u1162,\u11b1": "0x3d", + ",\u1162,\u11b2": "0x3d", + ",\u1162,\u11b3": "0x3d", + ",\u1162,\u11b4": "0x3d", + ",\u1162,\u11b5": "0x3d", + ",\u1162,\u11b6": "0x3d", + ",\u1162,\u11b7": "0x3d", + ",\u1162,\u11b8": "0x3d", + ",\u1162,\u11b9": "0x3d", + ",\u1162,\u11bb": "0x3d", + ",\u1162,\u11bd": "0x3d", + ",\u1162,\u11be": "0x3d", + ",\u1162,\u11bf": "0x3d", + ",\u1162,\u11c0": "0x3d", + ",\u1162,\u11c1": "0x3d", + ",\u1162,\u11c2": "0x3d", + ",\u1164,\u11a8": "0x3d", + ",\u1164,\u11a9": "0x3d", + ",\u1164,\u11aa": "0x3d", + ",\u1164,\u11ab": "0x3d", + ",\u1164,\u11ac": "0x3d", + ",\u1164,\u11ad": "0x3d", + ",\u1164,\u11ae": "0x3d", + ",\u1164,\u11af": "0x3d", + ",\u1164,\u11b0": "0x3d", + ",\u1164,\u11b1": "0x3d", + ",\u1164,\u11b2": "0x3d", + ",\u1164,\u11b3": "0x3d", + ",\u1164,\u11b4": "0x3d", + ",\u1164,\u11b5": "0x3d", + ",\u1164,\u11b6": "0x3d", + ",\u1164,\u11b7": "0x3d", + ",\u1164,\u11b8": "0x3d", + ",\u1164,\u11b9": "0x3d", + ",\u1164,\u11ba": "0x3d", + ",\u1164,\u11bb": "0x3d", + ",\u1164,\u11bc": "0x3d", + ",\u1164,\u11bd": "0x3d", + ",\u1164,\u11be": "0x3d", + ",\u1164,\u11bf": "0x3d", + ",\u1164,\u11c0": "0x3d", + ",\u1164,\u11c1": "0x3d", + ",\u1164,\u11c2": "0x3d", + ",\u1166,\u11a9": "0x3d", + ",\u1166,\u11aa": "0x3d", + ",\u1166,\u11ac": "0x3d", + ",\u1166,\u11ad": "0x3d", + ",\u1166,\u11ae": "0x3d", + ",\u1166,\u11b0": "0x3d", + ",\u1166,\u11b1": "0x3d", + ",\u1166,\u11b2": "0x3d", + ",\u1166,\u11b3": "0x3d", + ",\u1166,\u11b4": "0x3d", + ",\u1166,\u11b5": "0x3d", + ",\u1166,\u11b6": "0x3d", + ",\u1166,\u11b7": "0x3d", + ",\u1166,\u11b8": "0x3d", + ",\u1166,\u11b9": "0x3d", + ",\u1166,\u11bb": "0x3d", + ",\u1166,\u11bc": "0x3d", + ",\u1166,\u11bd": "0x3d", + ",\u1166,\u11be": "0x3d", + ",\u1166,\u11bf": "0x3d", + ",\u1166,\u11c0": "0x3d", + ",\u1166,\u11c1": "0x3d", + ",\u1166,\u11c2": "0x3d", + ",\u1168,\u11a8": "0x3d", + ",\u1168,\u11a9": "0x3d", + ",\u1168,\u11aa": "0x3d", + ",\u1168,\u11ab": "0x3d", + ",\u1168,\u11ac": "0x3d", + ",\u1168,\u11ad": "0x3d", + ",\u1168,\u11ae": "0x3d", + ",\u1168,\u11af": "0x3d", + ",\u1168,\u11b0": "0x3d", + ",\u1168,\u11b1": "0x3d", + ",\u1168,\u11b2": "0x3d", + ",\u1168,\u11b3": "0x3d", + ",\u1168,\u11b4": "0x3d", + ",\u1168,\u11b5": "0x3d", + ",\u1168,\u11b6": "0x3d", + ",\u1168,\u11b7": "0x3d", + ",\u1168,\u11b8": "0x3d", + ",\u1168,\u11b9": "0x3d", + ",\u1168,\u11ba": "0x3d", + ",\u1168,\u11bb": "0x3d", + ",\u1168,\u11bc": "0x3d", + ",\u1168,\u11bd": "0x3d", + ",\u1168,\u11be": "0x3d", + ",\u1168,\u11bf": "0x3d", + ",\u1168,\u11c0": "0x3d", + ",\u1168,\u11c1": "0x3d", + ",\u1168,\u11c2": "0x3d" + } + }, + { + "defaultGlyph": "0x79", + "alternatives": {} + }, + { + "defaultGlyph": "0x9c", + "alternatives": { + ",\u116a,\u11a8": "0xbc", + ",\u116a,\u11a9": "0xbc", + ",\u116a,\u11aa": "0xbc", + ",\u116a,\u11ab": "0xbc", + ",\u116a,\u11ac": "0xbc", + ",\u116a,\u11ad": "0xbc", + ",\u116a,\u11ae": "0xbc", + ",\u116a,\u11af": "0xbc", + ",\u116a,\u11b0": "0xbc", + ",\u116a,\u11b1": "0xbc", + ",\u116a,\u11b2": "0xbc", + ",\u116a,\u11b3": "0xbc", + ",\u116a,\u11b4": "0xbc", + ",\u116a,\u11b5": "0xbc", + ",\u116a,\u11b6": "0xbc", + ",\u116a,\u11b7": "0xbc", + ",\u116a,\u11b8": "0xbc", + ",\u116a,\u11b9": "0xbc", + ",\u116a,\u11ba": "0xbc", + ",\u116a,\u11bb": "0xbc", + ",\u116a,\u11bc": "0xbc", + ",\u116a,\u11bd": "0xbc", + ",\u116a,\u11be": "0xbc", + ",\u116a,\u11bf": "0xbc", + ",\u116a,\u11c0": "0xbc", + ",\u116a,\u11c1": "0xbc", + ",\u116a,\u11c2": "0xbc", + ",\u116b,\u11a8": "0xbc", + ",\u116b,\u11a9": "0xbc", + ",\u116b,\u11aa": "0xbc", + ",\u116b,\u11ab": "0xbc", + ",\u116b,\u11ac": "0xbc", + ",\u116b,\u11ad": "0xbc", + ",\u116b,\u11ae": "0xbc", + ",\u116b,\u11af": "0xbc", + ",\u116b,\u11b0": "0xbc", + ",\u116b,\u11b1": "0xbc", + ",\u116b,\u11b2": "0xbc", + ",\u116b,\u11b3": "0xbc", + ",\u116b,\u11b4": "0xbc", + ",\u116b,\u11b5": "0xbc", + ",\u116b,\u11b6": "0xbc", + ",\u116b,\u11b7": "0xbc", + ",\u116b,\u11b8": "0xbc", + ",\u116b,\u11b9": "0xbc", + ",\u116b,\u11ba": "0xbc", + ",\u116b,\u11bb": "0xbc", + ",\u116b,\u11bc": "0xbc", + ",\u116b,\u11bd": "0xbc", + ",\u116b,\u11be": "0xbc", + ",\u116b,\u11bf": "0xbc", + ",\u116b,\u11c0": "0xbc", + ",\u116b,\u11c1": "0xbc", + ",\u116b,\u11c2": "0xbc", + ",\u1170,\u11a8": "0xbc", + ",\u1170,\u11a9": "0xbc", + ",\u1170,\u11aa": "0xbc", + ",\u1170,\u11ab": "0xbc", + ",\u1170,\u11ac": "0xbc", + ",\u1170,\u11ad": "0xbc", + ",\u1170,\u11ae": "0xbc", + ",\u1170,\u11af": "0xbc", + ",\u1170,\u11b0": "0xbc", + ",\u1170,\u11b1": "0xbc", + ",\u1170,\u11b2": "0xbc", + ",\u1170,\u11b3": "0xbc", + ",\u1170,\u11b4": "0xbc", + ",\u1170,\u11b5": "0xbc", + ",\u1170,\u11b6": "0xbc", + ",\u1170,\u11b7": "0xbc", + ",\u1170,\u11b8": "0xbc", + ",\u1170,\u11b9": "0xbc", + ",\u1170,\u11ba": "0xbc", + ",\u1170,\u11bb": "0xbc", + ",\u1170,\u11bc": "0xbc", + ",\u1170,\u11bd": "0xbc", + ",\u1170,\u11be": "0xbc", + ",\u1170,\u11bf": "0xbc", + ",\u1170,\u11c0": "0xbc", + ",\u1170,\u11c1": "0xbc", + ",\u1170,\u11c2": "0xbc" + } + } + ], + "\u110d": [ + { + "defaultGlyph": "0x3e", + "alternatives": { + ",\u1162": "0x3e", + ",\u1175": "0x11" + } + }, + { + "defaultGlyph": "0x7a", + "alternatives": {} + }, + { + "defaultGlyph": "0x9d", + "alternatives": { + ",\u116a": "0xbd", + ",\u116b": "0xbd", + ",\u1170": "0xbd" + } + }, + { + "defaultGlyph": "0x11", + "alternatives": { + ",\u1162,\u11bb": "0x3e", + ",\u1162,\u11a8": "0x3e", + ",\u1162,\u11a9": "0x3e", + ",\u1162,\u11aa": "0x3e", + ",\u1162,\u11ab": "0x3e", + ",\u1162,\u11ac": "0x3e", + ",\u1162,\u11ad": "0x3e", + ",\u1162,\u11ae": "0x3e", + ",\u1162,\u11af": "0x3e", + ",\u1162,\u11b0": "0x3e", + ",\u1162,\u11b1": "0x3e", + ",\u1162,\u11b2": "0x3e", + ",\u1162,\u11b3": "0x3e", + ",\u1162,\u11b4": "0x3e", + ",\u1162,\u11b5": "0x3e", + ",\u1162,\u11b6": "0x3e", + ",\u1162,\u11b7": "0x3e", + ",\u1162,\u11b8": "0x3e", + ",\u1162,\u11b9": "0x3e", + ",\u1162,\u11ba": "0x3e", + ",\u1162,\u11bc": "0x3e", + ",\u1162,\u11bd": "0x3e", + ",\u1162,\u11be": "0x3e", + ",\u1162,\u11bf": "0x3e", + ",\u1162,\u11c0": "0x3e", + ",\u1162,\u11c1": "0x3e", + ",\u1162,\u11c2": "0x3e", + ",\u1163,\u11a8": "0x3e", + ",\u1163,\u11a9": "0x3e", + ",\u1163,\u11aa": "0x3e", + ",\u1163,\u11ab": "0x3e", + ",\u1163,\u11ac": "0x3e", + ",\u1163,\u11ad": "0x3e", + ",\u1163,\u11ae": "0x3e", + ",\u1163,\u11af": "0x3e", + ",\u1163,\u11b0": "0x3e", + ",\u1163,\u11b1": "0x3e", + ",\u1163,\u11b2": "0x3e", + ",\u1163,\u11b3": "0x3e", + ",\u1163,\u11b4": "0x3e", + ",\u1163,\u11b5": "0x3e", + ",\u1163,\u11b6": "0x3e", + ",\u1163,\u11b7": "0x3e", + ",\u1163,\u11b8": "0x3e", + ",\u1163,\u11b9": "0x3e", + ",\u1163,\u11ba": "0x3e", + ",\u1163,\u11bb": "0x3e", + ",\u1163,\u11bc": "0x3e", + ",\u1163,\u11bd": "0x3e", + ",\u1163,\u11be": "0x3e", + ",\u1163,\u11bf": "0x3e", + ",\u1163,\u11c0": "0x3e", + ",\u1163,\u11c1": "0x3e", + ",\u1163,\u11c2": "0x3e", + ",\u1164,\u11a8": "0x3e", + ",\u1164,\u11a9": "0x3e", + ",\u1164,\u11aa": "0x3e", + ",\u1164,\u11ab": "0x3e", + ",\u1164,\u11ac": "0x3e", + ",\u1164,\u11ad": "0x3e", + ",\u1164,\u11ae": "0x3e", + ",\u1164,\u11af": "0x3e", + ",\u1164,\u11b0": "0x3e", + ",\u1164,\u11b1": "0x3e", + ",\u1164,\u11b2": "0x3e", + ",\u1164,\u11b3": "0x3e", + ",\u1164,\u11b4": "0x3e", + ",\u1164,\u11b5": "0x3e", + ",\u1164,\u11b6": "0x3e", + ",\u1164,\u11b7": "0x3e", + ",\u1164,\u11b8": "0x3e", + ",\u1164,\u11b9": "0x3e", + ",\u1164,\u11ba": "0x3e", + ",\u1164,\u11bb": "0x3e", + ",\u1164,\u11bc": "0x3e", + ",\u1164,\u11bd": "0x3e", + ",\u1164,\u11be": "0x3e", + ",\u1164,\u11bf": "0x3e", + ",\u1164,\u11c0": "0x3e", + ",\u1164,\u11c1": "0x3e", + ",\u1164,\u11c2": "0x3e", + ",\u1166,\u11a8": "0x3e", + ",\u1166,\u11a9": "0x3e", + ",\u1166,\u11aa": "0x3e", + ",\u1166,\u11ab": "0x3e", + ",\u1166,\u11ac": "0x3e", + ",\u1166,\u11ad": "0x3e", + ",\u1166,\u11ae": "0x3e", + ",\u1166,\u11af": "0x3e", + ",\u1166,\u11b0": "0x3e", + ",\u1166,\u11b1": "0x3e", + ",\u1166,\u11b2": "0x3e", + ",\u1166,\u11b3": "0x3e", + ",\u1166,\u11b4": "0x3e", + ",\u1166,\u11b5": "0x3e", + ",\u1166,\u11b6": "0x3e", + ",\u1166,\u11b7": "0x3e", + ",\u1166,\u11b8": "0x3e", + ",\u1166,\u11b9": "0x3e", + ",\u1166,\u11ba": "0x3e", + ",\u1166,\u11bb": "0x3e", + ",\u1166,\u11bc": "0x3e", + ",\u1166,\u11bd": "0x3e", + ",\u1166,\u11be": "0x3e", + ",\u1166,\u11bf": "0x3e", + ",\u1166,\u11c0": "0x3e", + ",\u1166,\u11c1": "0x3e", + ",\u1166,\u11c2": "0x3e", + ",\u1167,\u11a8": "0x3e", + ",\u1167,\u11a9": "0x3e", + ",\u1167,\u11aa": "0x3e", + ",\u1167,\u11ab": "0x3e", + ",\u1167,\u11ac": "0x3e", + ",\u1167,\u11ad": "0x3e", + ",\u1167,\u11ae": "0x3e", + ",\u1167,\u11af": "0x3e", + ",\u1167,\u11b0": "0x3e", + ",\u1167,\u11b1": "0x3e", + ",\u1167,\u11b2": "0x3e", + ",\u1167,\u11b3": "0x3e", + ",\u1167,\u11b4": "0x3e", + ",\u1167,\u11b5": "0x3e", + ",\u1167,\u11b6": "0x3e", + ",\u1167,\u11b7": "0x3e", + ",\u1167,\u11b8": "0x3e", + ",\u1167,\u11b9": "0x3e", + ",\u1167,\u11ba": "0x3e", + ",\u1167,\u11bb": "0x3e", + ",\u1167,\u11bc": "0x3e", + ",\u1167,\u11bd": "0x3e", + ",\u1167,\u11be": "0x3e", + ",\u1167,\u11bf": "0x3e", + ",\u1167,\u11c0": "0x3e", + ",\u1167,\u11c1": "0x3e", + ",\u1167,\u11c2": "0x3e", + ",\u1168,\u11a8": "0x3e", + ",\u1168,\u11a9": "0x3e", + ",\u1168,\u11aa": "0x3e", + ",\u1168,\u11ab": "0x3e", + ",\u1168,\u11ac": "0x3e", + ",\u1168,\u11ad": "0x3e", + ",\u1168,\u11ae": "0x3e", + ",\u1168,\u11af": "0x3e", + ",\u1168,\u11b0": "0x3e", + ",\u1168,\u11b1": "0x3e", + ",\u1168,\u11b2": "0x3e", + ",\u1168,\u11b3": "0x3e", + ",\u1168,\u11b4": "0x3e", + ",\u1168,\u11b5": "0x3e", + ",\u1168,\u11b6": "0x3e", + ",\u1168,\u11b7": "0x3e", + ",\u1168,\u11b8": "0x3e", + ",\u1168,\u11b9": "0x3e", + ",\u1168,\u11ba": "0x3e", + ",\u1168,\u11bb": "0x3e", + ",\u1168,\u11bc": "0x3e", + ",\u1168,\u11bd": "0x3e", + ",\u1168,\u11be": "0x3e", + ",\u1168,\u11bf": "0x3e", + ",\u1168,\u11c0": "0x3e", + ",\u1168,\u11c1": "0x3e", + ",\u1168,\u11c2": "0x3e", + ",\u1175,\u11a8": "0x3e", + ",\u1175,\u11a9": "0x3e", + ",\u1175,\u11aa": "0x3e", + ",\u1175,\u11ab": "0x3e", + ",\u1175,\u11ac": "0x3e", + ",\u1175,\u11ad": "0x3e", + ",\u1175,\u11ae": "0x3e", + ",\u1175,\u11af": "0x3e", + ",\u1175,\u11b0": "0x3e", + ",\u1175,\u11b1": "0x3e", + ",\u1175,\u11b2": "0x3e", + ",\u1175,\u11b3": "0x3e", + ",\u1175,\u11b4": "0x3e", + ",\u1175,\u11b5": "0x3e", + ",\u1175,\u11b6": "0x3e", + ",\u1175,\u11b7": "0x3e", + ",\u1175,\u11b8": "0x3e", + ",\u1175,\u11b9": "0x3e", + ",\u1175,\u11ba": "0x3e", + ",\u1175,\u11bb": "0x3e", + ",\u1175,\u11bc": "0x3e", + ",\u1175,\u11bd": "0x3e", + ",\u1175,\u11be": "0x3e", + ",\u1175,\u11bf": "0x3e", + ",\u1175,\u11c0": "0x3e", + ",\u1175,\u11c1": "0x3e", + ",\u1175,\u11c2": "0x3e" + } + }, + { + "defaultGlyph": "0x7a", + "alternatives": {} + }, + { + "defaultGlyph": "0x9d", + "alternatives": { + ",\u116a,\u11a8": "0xbd", + ",\u116a,\u11a9": "0xbd", + ",\u116a,\u11aa": "0xbd", + ",\u116a,\u11ab": "0xbd", + ",\u116a,\u11ac": "0xbd", + ",\u116a,\u11ad": "0xbd", + ",\u116a,\u11ae": "0xbd", + ",\u116a,\u11af": "0xbd", + ",\u116a,\u11b0": "0xbd", + ",\u116a,\u11b1": "0xbd", + ",\u116a,\u11b2": "0xbd", + ",\u116a,\u11b3": "0xbd", + ",\u116a,\u11b4": "0xbd", + ",\u116a,\u11b5": "0xbd", + ",\u116a,\u11b6": "0xbd", + ",\u116a,\u11b7": "0xbd", + ",\u116a,\u11b8": "0xbd", + ",\u116a,\u11b9": "0xbd", + ",\u116a,\u11ba": "0xbd", + ",\u116a,\u11bb": "0xbd", + ",\u116a,\u11bc": "0xbd", + ",\u116a,\u11bd": "0xbd", + ",\u116a,\u11be": "0xbd", + ",\u116a,\u11bf": "0xbd", + ",\u116a,\u11c0": "0xbd", + ",\u116a,\u11c1": "0xbd", + ",\u116a,\u11c2": "0xbd", + ",\u116b,\u11a8": "0xbd", + ",\u116b,\u11a9": "0xbd", + ",\u116b,\u11aa": "0xbd", + ",\u116b,\u11ab": "0xbd", + ",\u116b,\u11ac": "0xbd", + ",\u116b,\u11ad": "0xbd", + ",\u116b,\u11ae": "0xbd", + ",\u116b,\u11af": "0xbd", + ",\u116b,\u11b0": "0xbd", + ",\u116b,\u11b1": "0xbd", + ",\u116b,\u11b2": "0xbd", + ",\u116b,\u11b3": "0xbd", + ",\u116b,\u11b4": "0xbd", + ",\u116b,\u11b5": "0xbd", + ",\u116b,\u11b6": "0xbd", + ",\u116b,\u11b7": "0xbd", + ",\u116b,\u11b8": "0xbd", + ",\u116b,\u11b9": "0xbd", + ",\u116b,\u11ba": "0xbd", + ",\u116b,\u11bb": "0xbd", + ",\u116b,\u11bc": "0xbd", + ",\u116b,\u11bd": "0xbd", + ",\u116b,\u11be": "0xbd", + ",\u116b,\u11bf": "0xbd", + ",\u116b,\u11c0": "0xbd", + ",\u116b,\u11c1": "0xbd", + ",\u116b,\u11c2": "0xbd", + ",\u1170,\u11a8": "0xbd", + ",\u1170,\u11a9": "0xbd", + ",\u1170,\u11aa": "0xbd", + ",\u1170,\u11ab": "0xbd", + ",\u1170,\u11ac": "0xbd", + ",\u1170,\u11ad": "0xbd", + ",\u1170,\u11ae": "0xbd", + ",\u1170,\u11af": "0xbd", + ",\u1170,\u11b0": "0xbd", + ",\u1170,\u11b1": "0xbd", + ",\u1170,\u11b2": "0xbd", + ",\u1170,\u11b3": "0xbd", + ",\u1170,\u11b4": "0xbd", + ",\u1170,\u11b5": "0xbd", + ",\u1170,\u11b6": "0xbd", + ",\u1170,\u11b7": "0xbd", + ",\u1170,\u11b8": "0xbd", + ",\u1170,\u11b9": "0xbd", + ",\u1170,\u11ba": "0xbd", + ",\u1170,\u11bb": "0xbd", + ",\u1170,\u11bc": "0xbd", + ",\u1170,\u11bd": "0xbd", + ",\u1170,\u11be": "0xbd", + ",\u1170,\u11bf": "0xbd", + ",\u1170,\u11c0": "0xbd", + ",\u1170,\u11c1": "0xbd", + ",\u1170,\u11c2": "0xbd" + } + } + ], + "\u110e": [ + { + "defaultGlyph": "0x2d", + "alternatives": { + ",\u1166": "0x58", + ",\u1162": "0x58", + ",\u1164": "0x58", + ",\u1168": "0x58" + } + }, + { + "defaultGlyph": "0x7b", + "alternatives": {} + }, + { + "defaultGlyph": "0x9e", + "alternatives": { + ",\u116a": "0xbe", + ",\u116b": "0xbe", + ",\u1170": "0xbe" + } + }, + { + "defaultGlyph": "0x2d", + "alternatives": { + ",\u1162,\u11af": "0x58", + ",\u1162,\u11bc": "0x58", + ",\u1162,\u11a8": "0x58", + ",\u1162,\u11bb": "0x58", + ",\u1162,\u11b7": "0x58", + ",\u1166,\u11ba": "0x58", + ",\u1162,\u11a9": "0x58", + ",\u1162,\u11aa": "0x58", + ",\u1162,\u11ab": "0x58", + ",\u1162,\u11ac": "0x58", + ",\u1162,\u11ad": "0x58", + ",\u1162,\u11ae": "0x58", + ",\u1162,\u11b0": "0x58", + ",\u1162,\u11b1": "0x58", + ",\u1162,\u11b2": "0x58", + ",\u1162,\u11b3": "0x58", + ",\u1162,\u11b4": "0x58", + ",\u1162,\u11b5": "0x58", + ",\u1162,\u11b6": "0x58", + ",\u1162,\u11b8": "0x58", + ",\u1162,\u11b9": "0x58", + ",\u1162,\u11ba": "0x58", + ",\u1162,\u11bd": "0x58", + ",\u1162,\u11be": "0x58", + ",\u1162,\u11bf": "0x58", + ",\u1162,\u11c0": "0x58", + ",\u1162,\u11c1": "0x58", + ",\u1162,\u11c2": "0x58", + ",\u1164,\u11a8": "0x58", + ",\u1164,\u11a9": "0x58", + ",\u1164,\u11aa": "0x58", + ",\u1164,\u11ab": "0x58", + ",\u1164,\u11ac": "0x58", + ",\u1164,\u11ad": "0x58", + ",\u1164,\u11ae": "0x58", + ",\u1164,\u11af": "0x58", + ",\u1164,\u11b0": "0x58", + ",\u1164,\u11b1": "0x58", + ",\u1164,\u11b2": "0x58", + ",\u1164,\u11b3": "0x58", + ",\u1164,\u11b4": "0x58", + ",\u1164,\u11b5": "0x58", + ",\u1164,\u11b6": "0x58", + ",\u1164,\u11b7": "0x58", + ",\u1164,\u11b8": "0x58", + ",\u1164,\u11b9": "0x58", + ",\u1164,\u11ba": "0x58", + ",\u1164,\u11bb": "0x58", + ",\u1164,\u11bc": "0x58", + ",\u1164,\u11bd": "0x58", + ",\u1164,\u11be": "0x58", + ",\u1164,\u11bf": "0x58", + ",\u1164,\u11c0": "0x58", + ",\u1164,\u11c1": "0x58", + ",\u1164,\u11c2": "0x58", + ",\u1166,\u11a8": "0x58", + ",\u1166,\u11a9": "0x58", + ",\u1166,\u11aa": "0x58", + ",\u1166,\u11ab": "0x58", + ",\u1166,\u11ac": "0x58", + ",\u1166,\u11ad": "0x58", + ",\u1166,\u11ae": "0x58", + ",\u1166,\u11af": "0x58", + ",\u1166,\u11b0": "0x58", + ",\u1166,\u11b1": "0x58", + ",\u1166,\u11b2": "0x58", + ",\u1166,\u11b3": "0x58", + ",\u1166,\u11b4": "0x58", + ",\u1166,\u11b5": "0x58", + ",\u1166,\u11b6": "0x58", + ",\u1166,\u11b7": "0x58", + ",\u1166,\u11b8": "0x58", + ",\u1166,\u11b9": "0x58", + ",\u1166,\u11bb": "0x58", + ",\u1166,\u11bc": "0x58", + ",\u1166,\u11bd": "0x58", + ",\u1166,\u11be": "0x58", + ",\u1166,\u11bf": "0x58", + ",\u1166,\u11c0": "0x58", + ",\u1166,\u11c1": "0x58", + ",\u1166,\u11c2": "0x58", + ",\u1168,\u11a8": "0x58", + ",\u1168,\u11a9": "0x58", + ",\u1168,\u11aa": "0x58", + ",\u1168,\u11ab": "0x58", + ",\u1168,\u11ac": "0x58", + ",\u1168,\u11ad": "0x58", + ",\u1168,\u11ae": "0x58", + ",\u1168,\u11af": "0x58", + ",\u1168,\u11b0": "0x58", + ",\u1168,\u11b1": "0x58", + ",\u1168,\u11b2": "0x58", + ",\u1168,\u11b3": "0x58", + ",\u1168,\u11b4": "0x58", + ",\u1168,\u11b5": "0x58", + ",\u1168,\u11b6": "0x58", + ",\u1168,\u11b7": "0x58", + ",\u1168,\u11b8": "0x58", + ",\u1168,\u11b9": "0x58", + ",\u1168,\u11ba": "0x58", + ",\u1168,\u11bb": "0x58", + ",\u1168,\u11bc": "0x58", + ",\u1168,\u11bd": "0x58", + ",\u1168,\u11be": "0x58", + ",\u1168,\u11bf": "0x58", + ",\u1168,\u11c0": "0x58", + ",\u1168,\u11c1": "0x58", + ",\u1168,\u11c2": "0x58" + } + }, + { + "defaultGlyph": "0x7b", + "alternatives": {} + }, + { + "defaultGlyph": "0x9e", + "alternatives": { + ",\u116a,\u11a8": "0xbe", + ",\u116a,\u11a9": "0xbe", + ",\u116a,\u11aa": "0xbe", + ",\u116a,\u11ab": "0xbe", + ",\u116a,\u11ac": "0xbe", + ",\u116a,\u11ad": "0xbe", + ",\u116a,\u11ae": "0xbe", + ",\u116a,\u11af": "0xbe", + ",\u116a,\u11b0": "0xbe", + ",\u116a,\u11b1": "0xbe", + ",\u116a,\u11b2": "0xbe", + ",\u116a,\u11b3": "0xbe", + ",\u116a,\u11b4": "0xbe", + ",\u116a,\u11b5": "0xbe", + ",\u116a,\u11b6": "0xbe", + ",\u116a,\u11b7": "0xbe", + ",\u116a,\u11b8": "0xbe", + ",\u116a,\u11b9": "0xbe", + ",\u116a,\u11ba": "0xbe", + ",\u116a,\u11bb": "0xbe", + ",\u116a,\u11bc": "0xbe", + ",\u116a,\u11bd": "0xbe", + ",\u116a,\u11be": "0xbe", + ",\u116a,\u11bf": "0xbe", + ",\u116a,\u11c0": "0xbe", + ",\u116a,\u11c1": "0xbe", + ",\u116a,\u11c2": "0xbe", + ",\u116b,\u11a8": "0xbe", + ",\u116b,\u11a9": "0xbe", + ",\u116b,\u11aa": "0xbe", + ",\u116b,\u11ab": "0xbe", + ",\u116b,\u11ac": "0xbe", + ",\u116b,\u11ad": "0xbe", + ",\u116b,\u11ae": "0xbe", + ",\u116b,\u11af": "0xbe", + ",\u116b,\u11b0": "0xbe", + ",\u116b,\u11b1": "0xbe", + ",\u116b,\u11b2": "0xbe", + ",\u116b,\u11b3": "0xbe", + ",\u116b,\u11b4": "0xbe", + ",\u116b,\u11b5": "0xbe", + ",\u116b,\u11b6": "0xbe", + ",\u116b,\u11b7": "0xbe", + ",\u116b,\u11b8": "0xbe", + ",\u116b,\u11b9": "0xbe", + ",\u116b,\u11ba": "0xbe", + ",\u116b,\u11bb": "0xbe", + ",\u116b,\u11bc": "0xbe", + ",\u116b,\u11bd": "0xbe", + ",\u116b,\u11be": "0xbe", + ",\u116b,\u11bf": "0xbe", + ",\u116b,\u11c0": "0xbe", + ",\u116b,\u11c1": "0xbe", + ",\u116b,\u11c2": "0xbe", + ",\u1170,\u11a8": "0xbe", + ",\u1170,\u11a9": "0xbe", + ",\u1170,\u11aa": "0xbe", + ",\u1170,\u11ab": "0xbe", + ",\u1170,\u11ac": "0xbe", + ",\u1170,\u11ad": "0xbe", + ",\u1170,\u11ae": "0xbe", + ",\u1170,\u11af": "0xbe", + ",\u1170,\u11b0": "0xbe", + ",\u1170,\u11b1": "0xbe", + ",\u1170,\u11b2": "0xbe", + ",\u1170,\u11b3": "0xbe", + ",\u1170,\u11b4": "0xbe", + ",\u1170,\u11b5": "0xbe", + ",\u1170,\u11b6": "0xbe", + ",\u1170,\u11b7": "0xbe", + ",\u1170,\u11b8": "0xbe", + ",\u1170,\u11b9": "0xbe", + ",\u1170,\u11ba": "0xbe", + ",\u1170,\u11bb": "0xbe", + ",\u1170,\u11bc": "0xbe", + ",\u1170,\u11bd": "0xbe", + ",\u1170,\u11be": "0xbe", + ",\u1170,\u11bf": "0xbe", + ",\u1170,\u11c0": "0xbe", + ",\u1170,\u11c1": "0xbe", + ",\u1170,\u11c2": "0xbe" + } + } + ], + "\u110f": [ + { + "defaultGlyph": "0x12", + "alternatives": { + ",\u1166": "0x3f", + ",\u1162": "0x3f", + ",\u1164": "0x3f", + ",\u1168": "0x3f" + } + }, + { + "defaultGlyph": "0x5f", + "alternatives": {} + }, + { + "defaultGlyph": "0x8c", + "alternatives": { + ",\u116a": "0xaf", + ",\u116b": "0xaf", + ",\u1170": "0xaf" + } + }, + { + "defaultGlyph": "0x12", + "alternatives": { + ",\u1162,\u11ab": "0x3f", + ",\u1162,\u11ba": "0x3f", + ",\u1166,\u11ba": "0x3f", + ",\u1162,\u11b8": "0x3f", + ",\u1162,\u11a8": "0x3f", + ",\u1162,\u11a9": "0x3f", + ",\u1162,\u11aa": "0x3f", + ",\u1162,\u11ac": "0x3f", + ",\u1162,\u11ad": "0x3f", + ",\u1162,\u11ae": "0x3f", + ",\u1162,\u11af": "0x3f", + ",\u1162,\u11b0": "0x3f", + ",\u1162,\u11b1": "0x3f", + ",\u1162,\u11b2": "0x3f", + ",\u1162,\u11b3": "0x3f", + ",\u1162,\u11b4": "0x3f", + ",\u1162,\u11b5": "0x3f", + ",\u1162,\u11b6": "0x3f", + ",\u1162,\u11b7": "0x3f", + ",\u1162,\u11b9": "0x3f", + ",\u1162,\u11bb": "0x3f", + ",\u1162,\u11bc": "0x3f", + ",\u1162,\u11bd": "0x3f", + ",\u1162,\u11be": "0x3f", + ",\u1162,\u11bf": "0x3f", + ",\u1162,\u11c0": "0x3f", + ",\u1162,\u11c1": "0x3f", + ",\u1162,\u11c2": "0x3f", + ",\u1164,\u11a8": "0x3f", + ",\u1164,\u11a9": "0x3f", + ",\u1164,\u11aa": "0x3f", + ",\u1164,\u11ab": "0x3f", + ",\u1164,\u11ac": "0x3f", + ",\u1164,\u11ad": "0x3f", + ",\u1164,\u11ae": "0x3f", + ",\u1164,\u11af": "0x3f", + ",\u1164,\u11b0": "0x3f", + ",\u1164,\u11b1": "0x3f", + ",\u1164,\u11b2": "0x3f", + ",\u1164,\u11b3": "0x3f", + ",\u1164,\u11b4": "0x3f", + ",\u1164,\u11b5": "0x3f", + ",\u1164,\u11b6": "0x3f", + ",\u1164,\u11b7": "0x3f", + ",\u1164,\u11b8": "0x3f", + ",\u1164,\u11b9": "0x3f", + ",\u1164,\u11ba": "0x3f", + ",\u1164,\u11bb": "0x3f", + ",\u1164,\u11bc": "0x3f", + ",\u1164,\u11bd": "0x3f", + ",\u1164,\u11be": "0x3f", + ",\u1164,\u11bf": "0x3f", + ",\u1164,\u11c0": "0x3f", + ",\u1164,\u11c1": "0x3f", + ",\u1164,\u11c2": "0x3f", + ",\u1166,\u11a8": "0x3f", + ",\u1166,\u11a9": "0x3f", + ",\u1166,\u11aa": "0x3f", + ",\u1166,\u11ab": "0x3f", + ",\u1166,\u11ac": "0x3f", + ",\u1166,\u11ad": "0x3f", + ",\u1166,\u11ae": "0x3f", + ",\u1166,\u11af": "0x3f", + ",\u1166,\u11b0": "0x3f", + ",\u1166,\u11b1": "0x3f", + ",\u1166,\u11b2": "0x3f", + ",\u1166,\u11b3": "0x3f", + ",\u1166,\u11b4": "0x3f", + ",\u1166,\u11b5": "0x3f", + ",\u1166,\u11b6": "0x3f", + ",\u1166,\u11b7": "0x3f", + ",\u1166,\u11b8": "0x3f", + ",\u1166,\u11b9": "0x3f", + ",\u1166,\u11bb": "0x3f", + ",\u1166,\u11bc": "0x3f", + ",\u1166,\u11bd": "0x3f", + ",\u1166,\u11be": "0x3f", + ",\u1166,\u11bf": "0x3f", + ",\u1166,\u11c0": "0x3f", + ",\u1166,\u11c1": "0x3f", + ",\u1166,\u11c2": "0x3f", + ",\u1168,\u11a8": "0x3f", + ",\u1168,\u11a9": "0x3f", + ",\u1168,\u11aa": "0x3f", + ",\u1168,\u11ab": "0x3f", + ",\u1168,\u11ac": "0x3f", + ",\u1168,\u11ad": "0x3f", + ",\u1168,\u11ae": "0x3f", + ",\u1168,\u11af": "0x3f", + ",\u1168,\u11b0": "0x3f", + ",\u1168,\u11b1": "0x3f", + ",\u1168,\u11b2": "0x3f", + ",\u1168,\u11b3": "0x3f", + ",\u1168,\u11b4": "0x3f", + ",\u1168,\u11b5": "0x3f", + ",\u1168,\u11b6": "0x3f", + ",\u1168,\u11b7": "0x3f", + ",\u1168,\u11b8": "0x3f", + ",\u1168,\u11b9": "0x3f", + ",\u1168,\u11ba": "0x3f", + ",\u1168,\u11bb": "0x3f", + ",\u1168,\u11bc": "0x3f", + ",\u1168,\u11bd": "0x3f", + ",\u1168,\u11be": "0x3f", + ",\u1168,\u11bf": "0x3f", + ",\u1168,\u11c0": "0x3f", + ",\u1168,\u11c1": "0x3f", + ",\u1168,\u11c2": "0x3f" + } + }, + { + "defaultGlyph": "0x5f", + "alternatives": {} + }, + { + "defaultGlyph": "0x8c", + "alternatives": { + ",\u116a,\u11a8": "0xaf", + ",\u116a,\u11a9": "0xaf", + ",\u116a,\u11aa": "0xaf", + ",\u116a,\u11ab": "0xaf", + ",\u116a,\u11ac": "0xaf", + ",\u116a,\u11ad": "0xaf", + ",\u116a,\u11ae": "0xaf", + ",\u116a,\u11af": "0xaf", + ",\u116a,\u11b0": "0xaf", + ",\u116a,\u11b1": "0xaf", + ",\u116a,\u11b2": "0xaf", + ",\u116a,\u11b3": "0xaf", + ",\u116a,\u11b4": "0xaf", + ",\u116a,\u11b5": "0xaf", + ",\u116a,\u11b6": "0xaf", + ",\u116a,\u11b7": "0xaf", + ",\u116a,\u11b8": "0xaf", + ",\u116a,\u11b9": "0xaf", + ",\u116a,\u11ba": "0xaf", + ",\u116a,\u11bb": "0xaf", + ",\u116a,\u11bc": "0xaf", + ",\u116a,\u11bd": "0xaf", + ",\u116a,\u11be": "0xaf", + ",\u116a,\u11bf": "0xaf", + ",\u116a,\u11c0": "0xaf", + ",\u116a,\u11c1": "0xaf", + ",\u116a,\u11c2": "0xaf", + ",\u116b,\u11a8": "0xaf", + ",\u116b,\u11a9": "0xaf", + ",\u116b,\u11aa": "0xaf", + ",\u116b,\u11ab": "0xaf", + ",\u116b,\u11ac": "0xaf", + ",\u116b,\u11ad": "0xaf", + ",\u116b,\u11ae": "0xaf", + ",\u116b,\u11af": "0xaf", + ",\u116b,\u11b0": "0xaf", + ",\u116b,\u11b1": "0xaf", + ",\u116b,\u11b2": "0xaf", + ",\u116b,\u11b3": "0xaf", + ",\u116b,\u11b4": "0xaf", + ",\u116b,\u11b5": "0xaf", + ",\u116b,\u11b6": "0xaf", + ",\u116b,\u11b7": "0xaf", + ",\u116b,\u11b8": "0xaf", + ",\u116b,\u11b9": "0xaf", + ",\u116b,\u11ba": "0xaf", + ",\u116b,\u11bb": "0xaf", + ",\u116b,\u11bc": "0xaf", + ",\u116b,\u11bd": "0xaf", + ",\u116b,\u11be": "0xaf", + ",\u116b,\u11bf": "0xaf", + ",\u116b,\u11c0": "0xaf", + ",\u116b,\u11c1": "0xaf", + ",\u116b,\u11c2": "0xaf", + ",\u1170,\u11a8": "0xaf", + ",\u1170,\u11a9": "0xaf", + ",\u1170,\u11aa": "0xaf", + ",\u1170,\u11ab": "0xaf", + ",\u1170,\u11ac": "0xaf", + ",\u1170,\u11ad": "0xaf", + ",\u1170,\u11ae": "0xaf", + ",\u1170,\u11af": "0xaf", + ",\u1170,\u11b0": "0xaf", + ",\u1170,\u11b1": "0xaf", + ",\u1170,\u11b2": "0xaf", + ",\u1170,\u11b3": "0xaf", + ",\u1170,\u11b4": "0xaf", + ",\u1170,\u11b5": "0xaf", + ",\u1170,\u11b6": "0xaf", + ",\u1170,\u11b7": "0xaf", + ",\u1170,\u11b8": "0xaf", + ",\u1170,\u11b9": "0xaf", + ",\u1170,\u11ba": "0xaf", + ",\u1170,\u11bb": "0xaf", + ",\u1170,\u11bc": "0xaf", + ",\u1170,\u11bd": "0xaf", + ",\u1170,\u11be": "0xaf", + ",\u1170,\u11bf": "0xaf", + ",\u1170,\u11c0": "0xaf", + ",\u1170,\u11c1": "0xaf", + ",\u1170,\u11c2": "0xaf" + } + } + ], + "\u1110": [ + { + "defaultGlyph": "0x29", + "alternatives": { + ",\u1166": "0x54", + ",\u1161": "0x13", + ",\u1175": "0x13", + ",\u1162": "0x40", + ",\u1163": "0x13", + ",\u1164": "0x40", + ",\u1168": "0x54" + } + }, + { + "defaultGlyph": "0x7c", + "alternatives": {} + }, + { + "defaultGlyph": "0x9f", + "alternatives": { + ",\u116a": "0xbf", + ",\u116b": "0xbf", + ",\u1170": "0xbf" + } + }, + { + "defaultGlyph": "0x13", + "alternatives": { + ",\u1162,\u11a8": "0x40", + ",\u1162,\u11bc": "0x40", + ",\u1166,\u11ab": "0x54", + ",\u1166,\u11af": "0x54", + ",\u1166,\u11b7": "0x54", + ",\u1165,\u11bc": "0x29", + ",\u1165,\u11af": "0x29", + ",\u1165,\u11a8": "0x29", + ",\u1162,\u11a9": "0x40", + ",\u1162,\u11aa": "0x40", + ",\u1162,\u11ab": "0x40", + ",\u1162,\u11ac": "0x40", + ",\u1162,\u11ad": "0x40", + ",\u1162,\u11ae": "0x40", + ",\u1162,\u11af": "0x40", + ",\u1162,\u11b0": "0x40", + ",\u1162,\u11b1": "0x40", + ",\u1162,\u11b2": "0x40", + ",\u1162,\u11b3": "0x40", + ",\u1162,\u11b4": "0x40", + ",\u1162,\u11b5": "0x40", + ",\u1162,\u11b6": "0x40", + ",\u1162,\u11b7": "0x40", + ",\u1162,\u11b8": "0x40", + ",\u1162,\u11b9": "0x40", + ",\u1162,\u11ba": "0x40", + ",\u1162,\u11bb": "0x40", + ",\u1162,\u11bd": "0x40", + ",\u1162,\u11be": "0x40", + ",\u1162,\u11bf": "0x40", + ",\u1162,\u11c0": "0x40", + ",\u1162,\u11c1": "0x40", + ",\u1162,\u11c2": "0x40", + ",\u1164,\u11a8": "0x40", + ",\u1164,\u11a9": "0x40", + ",\u1164,\u11aa": "0x40", + ",\u1164,\u11ab": "0x40", + ",\u1164,\u11ac": "0x40", + ",\u1164,\u11ad": "0x40", + ",\u1164,\u11ae": "0x40", + ",\u1164,\u11af": "0x40", + ",\u1164,\u11b0": "0x40", + ",\u1164,\u11b1": "0x40", + ",\u1164,\u11b2": "0x40", + ",\u1164,\u11b3": "0x40", + ",\u1164,\u11b4": "0x40", + ",\u1164,\u11b5": "0x40", + ",\u1164,\u11b6": "0x40", + ",\u1164,\u11b7": "0x40", + ",\u1164,\u11b8": "0x40", + ",\u1164,\u11b9": "0x40", + ",\u1164,\u11ba": "0x40", + ",\u1164,\u11bb": "0x40", + ",\u1164,\u11bc": "0x40", + ",\u1164,\u11bd": "0x40", + ",\u1164,\u11be": "0x40", + ",\u1164,\u11bf": "0x40", + ",\u1164,\u11c0": "0x40", + ",\u1164,\u11c1": "0x40", + ",\u1164,\u11c2": "0x40", + ",\u1166,\u11a8": "0x54", + ",\u1166,\u11a9": "0x54", + ",\u1166,\u11aa": "0x54", + ",\u1166,\u11ac": "0x54", + ",\u1166,\u11ad": "0x54", + ",\u1166,\u11ae": "0x54", + ",\u1166,\u11b0": "0x54", + ",\u1166,\u11b1": "0x54", + ",\u1166,\u11b2": "0x54", + ",\u1166,\u11b3": "0x54", + ",\u1166,\u11b4": "0x54", + ",\u1166,\u11b5": "0x54", + ",\u1166,\u11b6": "0x54", + ",\u1166,\u11b8": "0x54", + ",\u1166,\u11b9": "0x54", + ",\u1166,\u11ba": "0x54", + ",\u1166,\u11bb": "0x54", + ",\u1166,\u11bc": "0x54", + ",\u1166,\u11bd": "0x54", + ",\u1166,\u11be": "0x54", + ",\u1166,\u11bf": "0x54", + ",\u1166,\u11c0": "0x54", + ",\u1166,\u11c1": "0x54", + ",\u1166,\u11c2": "0x54", + ",\u1167,\u11a8": "0x40", + ",\u1167,\u11a9": "0x40", + ",\u1167,\u11aa": "0x40", + ",\u1167,\u11ab": "0x40", + ",\u1167,\u11ac": "0x40", + ",\u1167,\u11ad": "0x40", + ",\u1167,\u11ae": "0x40", + ",\u1167,\u11af": "0x40", + ",\u1167,\u11b0": "0x40", + ",\u1167,\u11b1": "0x40", + ",\u1167,\u11b2": "0x40", + ",\u1167,\u11b3": "0x40", + ",\u1167,\u11b4": "0x40", + ",\u1167,\u11b5": "0x40", + ",\u1167,\u11b6": "0x40", + ",\u1167,\u11b7": "0x40", + ",\u1167,\u11b8": "0x40", + ",\u1167,\u11b9": "0x40", + ",\u1167,\u11ba": "0x40", + ",\u1167,\u11bb": "0x40", + ",\u1167,\u11bc": "0x40", + ",\u1167,\u11bd": "0x40", + ",\u1167,\u11be": "0x40", + ",\u1167,\u11bf": "0x40", + ",\u1167,\u11c0": "0x40", + ",\u1167,\u11c1": "0x40", + ",\u1167,\u11c2": "0x40", + ",\u1168,\u11a8": "0x54", + ",\u1168,\u11a9": "0x54", + ",\u1168,\u11aa": "0x54", + ",\u1168,\u11ab": "0x54", + ",\u1168,\u11ac": "0x54", + ",\u1168,\u11ad": "0x54", + ",\u1168,\u11ae": "0x54", + ",\u1168,\u11af": "0x54", + ",\u1168,\u11b0": "0x54", + ",\u1168,\u11b1": "0x54", + ",\u1168,\u11b2": "0x54", + ",\u1168,\u11b3": "0x54", + ",\u1168,\u11b4": "0x54", + ",\u1168,\u11b5": "0x54", + ",\u1168,\u11b6": "0x54", + ",\u1168,\u11b7": "0x54", + ",\u1168,\u11b8": "0x54", + ",\u1168,\u11b9": "0x54", + ",\u1168,\u11ba": "0x54", + ",\u1168,\u11bb": "0x54", + ",\u1168,\u11bc": "0x54", + ",\u1168,\u11bd": "0x54", + ",\u1168,\u11be": "0x54", + ",\u1168,\u11bf": "0x54", + ",\u1168,\u11c0": "0x54", + ",\u1168,\u11c1": "0x54", + ",\u1168,\u11c2": "0x54" + } + }, + { + "defaultGlyph": "0x7c", + "alternatives": {} + }, + { + "defaultGlyph": "0x9f", + "alternatives": { + ",\u116a,\u11a8": "0xbf", + ",\u116a,\u11a9": "0xbf", + ",\u116a,\u11aa": "0xbf", + ",\u116a,\u11ab": "0xbf", + ",\u116a,\u11ac": "0xbf", + ",\u116a,\u11ad": "0xbf", + ",\u116a,\u11ae": "0xbf", + ",\u116a,\u11af": "0xbf", + ",\u116a,\u11b0": "0xbf", + ",\u116a,\u11b1": "0xbf", + ",\u116a,\u11b2": "0xbf", + ",\u116a,\u11b3": "0xbf", + ",\u116a,\u11b4": "0xbf", + ",\u116a,\u11b5": "0xbf", + ",\u116a,\u11b6": "0xbf", + ",\u116a,\u11b7": "0xbf", + ",\u116a,\u11b8": "0xbf", + ",\u116a,\u11b9": "0xbf", + ",\u116a,\u11ba": "0xbf", + ",\u116a,\u11bb": "0xbf", + ",\u116a,\u11bc": "0xbf", + ",\u116a,\u11bd": "0xbf", + ",\u116a,\u11be": "0xbf", + ",\u116a,\u11bf": "0xbf", + ",\u116a,\u11c0": "0xbf", + ",\u116a,\u11c1": "0xbf", + ",\u116a,\u11c2": "0xbf", + ",\u116b,\u11a8": "0xbf", + ",\u116b,\u11a9": "0xbf", + ",\u116b,\u11aa": "0xbf", + ",\u116b,\u11ab": "0xbf", + ",\u116b,\u11ac": "0xbf", + ",\u116b,\u11ad": "0xbf", + ",\u116b,\u11ae": "0xbf", + ",\u116b,\u11af": "0xbf", + ",\u116b,\u11b0": "0xbf", + ",\u116b,\u11b1": "0xbf", + ",\u116b,\u11b2": "0xbf", + ",\u116b,\u11b3": "0xbf", + ",\u116b,\u11b4": "0xbf", + ",\u116b,\u11b5": "0xbf", + ",\u116b,\u11b6": "0xbf", + ",\u116b,\u11b7": "0xbf", + ",\u116b,\u11b8": "0xbf", + ",\u116b,\u11b9": "0xbf", + ",\u116b,\u11ba": "0xbf", + ",\u116b,\u11bb": "0xbf", + ",\u116b,\u11bc": "0xbf", + ",\u116b,\u11bd": "0xbf", + ",\u116b,\u11be": "0xbf", + ",\u116b,\u11bf": "0xbf", + ",\u116b,\u11c0": "0xbf", + ",\u116b,\u11c1": "0xbf", + ",\u116b,\u11c2": "0xbf", + ",\u1170,\u11a8": "0xbf", + ",\u1170,\u11a9": "0xbf", + ",\u1170,\u11aa": "0xbf", + ",\u1170,\u11ab": "0xbf", + ",\u1170,\u11ac": "0xbf", + ",\u1170,\u11ad": "0xbf", + ",\u1170,\u11ae": "0xbf", + ",\u1170,\u11af": "0xbf", + ",\u1170,\u11b0": "0xbf", + ",\u1170,\u11b1": "0xbf", + ",\u1170,\u11b2": "0xbf", + ",\u1170,\u11b3": "0xbf", + ",\u1170,\u11b4": "0xbf", + ",\u1170,\u11b5": "0xbf", + ",\u1170,\u11b6": "0xbf", + ",\u1170,\u11b7": "0xbf", + ",\u1170,\u11b8": "0xbf", + ",\u1170,\u11b9": "0xbf", + ",\u1170,\u11ba": "0xbf", + ",\u1170,\u11bb": "0xbf", + ",\u1170,\u11bc": "0xbf", + ",\u1170,\u11bd": "0xbf", + ",\u1170,\u11be": "0xbf", + ",\u1170,\u11bf": "0xbf", + ",\u1170,\u11c0": "0xbf", + ",\u1170,\u11c1": "0xbf", + ",\u1170,\u11c2": "0xbf" + } + } + ], + "\u1111": [ + { + "defaultGlyph": "0x14", + "alternatives": { + ",\u1162": "0x41", + ",\u1166": "0x55", + ",\u1168": "0x55", + ",\u1165": "0x2a", + ",\u1161": "0x2a", + ",\u1164": "0x41", + ",\u1163": "0x2a", + ",\u1167": "0x2a" + } + }, + { + "defaultGlyph": "0x7d", + "alternatives": {} + }, + { + "defaultGlyph": "0xa0", + "alternatives": {} + }, + { + "defaultGlyph": "0x14", + "alternatives": { + ",\u1165,\u11b7": "0x2a", + ",\u1167,\u11ab": "0x41", + ",\u1167,\u11bc": "0x41", + ",\u1166,\u11ba": "0x55", + ",\u1162,\u11ab": "0x41", + ",\u1162,\u11a8": "0x41", + ",\u1162,\u11a9": "0x41", + ",\u1162,\u11aa": "0x41", + ",\u1162,\u11ac": "0x41", + ",\u1162,\u11ad": "0x41", + ",\u1162,\u11ae": "0x41", + ",\u1162,\u11af": "0x41", + ",\u1162,\u11b0": "0x41", + ",\u1162,\u11b1": "0x41", + ",\u1162,\u11b2": "0x41", + ",\u1162,\u11b3": "0x41", + ",\u1162,\u11b4": "0x41", + ",\u1162,\u11b5": "0x41", + ",\u1162,\u11b6": "0x41", + ",\u1162,\u11b7": "0x41", + ",\u1162,\u11b8": "0x41", + ",\u1162,\u11b9": "0x41", + ",\u1162,\u11ba": "0x41", + ",\u1162,\u11bb": "0x41", + ",\u1162,\u11bc": "0x41", + ",\u1162,\u11bd": "0x41", + ",\u1162,\u11be": "0x41", + ",\u1162,\u11bf": "0x41", + ",\u1162,\u11c0": "0x41", + ",\u1162,\u11c1": "0x41", + ",\u1162,\u11c2": "0x41", + ",\u1163,\u11a8": "0x41", + ",\u1163,\u11a9": "0x41", + ",\u1163,\u11aa": "0x41", + ",\u1163,\u11ab": "0x41", + ",\u1163,\u11ac": "0x41", + ",\u1163,\u11ad": "0x41", + ",\u1163,\u11ae": "0x41", + ",\u1163,\u11af": "0x41", + ",\u1163,\u11b0": "0x41", + ",\u1163,\u11b1": "0x41", + ",\u1163,\u11b2": "0x41", + ",\u1163,\u11b3": "0x41", + ",\u1163,\u11b4": "0x41", + ",\u1163,\u11b5": "0x41", + ",\u1163,\u11b6": "0x41", + ",\u1163,\u11b7": "0x41", + ",\u1163,\u11b8": "0x41", + ",\u1163,\u11b9": "0x41", + ",\u1163,\u11ba": "0x41", + ",\u1163,\u11bb": "0x41", + ",\u1163,\u11bc": "0x41", + ",\u1163,\u11bd": "0x41", + ",\u1163,\u11be": "0x41", + ",\u1163,\u11bf": "0x41", + ",\u1163,\u11c0": "0x41", + ",\u1163,\u11c1": "0x41", + ",\u1163,\u11c2": "0x41", + ",\u1164,\u11a8": "0x41", + ",\u1164,\u11a9": "0x41", + ",\u1164,\u11aa": "0x41", + ",\u1164,\u11ab": "0x41", + ",\u1164,\u11ac": "0x41", + ",\u1164,\u11ad": "0x41", + ",\u1164,\u11ae": "0x41", + ",\u1164,\u11af": "0x41", + ",\u1164,\u11b0": "0x41", + ",\u1164,\u11b1": "0x41", + ",\u1164,\u11b2": "0x41", + ",\u1164,\u11b3": "0x41", + ",\u1164,\u11b4": "0x41", + ",\u1164,\u11b5": "0x41", + ",\u1164,\u11b6": "0x41", + ",\u1164,\u11b7": "0x41", + ",\u1164,\u11b8": "0x41", + ",\u1164,\u11b9": "0x41", + ",\u1164,\u11ba": "0x41", + ",\u1164,\u11bb": "0x41", + ",\u1164,\u11bc": "0x41", + ",\u1164,\u11bd": "0x41", + ",\u1164,\u11be": "0x41", + ",\u1164,\u11bf": "0x41", + ",\u1164,\u11c0": "0x41", + ",\u1164,\u11c1": "0x41", + ",\u1164,\u11c2": "0x41", + ",\u1165,\u11a8": "0x2a", + ",\u1165,\u11a9": "0x2a", + ",\u1165,\u11aa": "0x2a", + ",\u1165,\u11ab": "0x2a", + ",\u1165,\u11ac": "0x2a", + ",\u1165,\u11ad": "0x2a", + ",\u1165,\u11ae": "0x2a", + ",\u1165,\u11af": "0x2a", + ",\u1165,\u11b0": "0x2a", + ",\u1165,\u11b1": "0x2a", + ",\u1165,\u11b2": "0x2a", + ",\u1165,\u11b3": "0x2a", + ",\u1165,\u11b4": "0x2a", + ",\u1165,\u11b5": "0x2a", + ",\u1165,\u11b6": "0x2a", + ",\u1165,\u11b8": "0x2a", + ",\u1165,\u11b9": "0x2a", + ",\u1165,\u11ba": "0x2a", + ",\u1165,\u11bb": "0x2a", + ",\u1165,\u11bc": "0x2a", + ",\u1165,\u11bd": "0x2a", + ",\u1165,\u11be": "0x2a", + ",\u1165,\u11bf": "0x2a", + ",\u1165,\u11c0": "0x2a", + ",\u1165,\u11c1": "0x2a", + ",\u1165,\u11c2": "0x2a", + ",\u1166,\u11a8": "0x55", + ",\u1166,\u11a9": "0x55", + ",\u1166,\u11aa": "0x55", + ",\u1166,\u11ab": "0x55", + ",\u1166,\u11ac": "0x55", + ",\u1166,\u11ad": "0x55", + ",\u1166,\u11ae": "0x55", + ",\u1166,\u11af": "0x55", + ",\u1166,\u11b0": "0x55", + ",\u1166,\u11b1": "0x55", + ",\u1166,\u11b2": "0x55", + ",\u1166,\u11b3": "0x55", + ",\u1166,\u11b4": "0x55", + ",\u1166,\u11b5": "0x55", + ",\u1166,\u11b6": "0x55", + ",\u1166,\u11b7": "0x55", + ",\u1166,\u11b8": "0x55", + ",\u1166,\u11b9": "0x55", + ",\u1166,\u11bb": "0x55", + ",\u1166,\u11bc": "0x55", + ",\u1166,\u11bd": "0x55", + ",\u1166,\u11be": "0x55", + ",\u1166,\u11bf": "0x55", + ",\u1166,\u11c0": "0x55", + ",\u1166,\u11c1": "0x55", + ",\u1166,\u11c2": "0x55", + ",\u1167,\u11a8": "0x41", + ",\u1167,\u11a9": "0x41", + ",\u1167,\u11aa": "0x41", + ",\u1167,\u11ac": "0x41", + ",\u1167,\u11ad": "0x41", + ",\u1167,\u11ae": "0x41", + ",\u1167,\u11af": "0x41", + ",\u1167,\u11b0": "0x41", + ",\u1167,\u11b1": "0x41", + ",\u1167,\u11b2": "0x41", + ",\u1167,\u11b3": "0x41", + ",\u1167,\u11b4": "0x41", + ",\u1167,\u11b5": "0x41", + ",\u1167,\u11b6": "0x41", + ",\u1167,\u11b7": "0x41", + ",\u1167,\u11b8": "0x41", + ",\u1167,\u11b9": "0x41", + ",\u1167,\u11ba": "0x41", + ",\u1167,\u11bb": "0x41", + ",\u1167,\u11bd": "0x41", + ",\u1167,\u11be": "0x41", + ",\u1167,\u11bf": "0x41", + ",\u1167,\u11c0": "0x41", + ",\u1167,\u11c1": "0x41", + ",\u1167,\u11c2": "0x41", + ",\u1168,\u11a8": "0x55", + ",\u1168,\u11a9": "0x55", + ",\u1168,\u11aa": "0x55", + ",\u1168,\u11ab": "0x55", + ",\u1168,\u11ac": "0x55", + ",\u1168,\u11ad": "0x55", + ",\u1168,\u11ae": "0x55", + ",\u1168,\u11af": "0x55", + ",\u1168,\u11b0": "0x55", + ",\u1168,\u11b1": "0x55", + ",\u1168,\u11b2": "0x55", + ",\u1168,\u11b3": "0x55", + ",\u1168,\u11b4": "0x55", + ",\u1168,\u11b5": "0x55", + ",\u1168,\u11b6": "0x55", + ",\u1168,\u11b7": "0x55", + ",\u1168,\u11b8": "0x55", + ",\u1168,\u11b9": "0x55", + ",\u1168,\u11ba": "0x55", + ",\u1168,\u11bb": "0x55", + ",\u1168,\u11bc": "0x55", + ",\u1168,\u11bd": "0x55", + ",\u1168,\u11be": "0x55", + ",\u1168,\u11bf": "0x55", + ",\u1168,\u11c0": "0x55", + ",\u1168,\u11c1": "0x55", + ",\u1168,\u11c2": "0x55" + } + }, + { + "defaultGlyph": "0x7d", + "alternatives": {} + }, + { + "defaultGlyph": "0xa0", + "alternatives": {} + } + ], + "\u1112": [ + { + "defaultGlyph": "0x2e", + "alternatives": { + ",\u1166": "0x59", + ",\u1162": "0x59", + ",\u1168": "0x59", + ",\u1164": "0x59" + } + }, + { + "defaultGlyph": "0x7e", + "alternatives": {} + }, + { + "defaultGlyph": "0xa1", + "alternatives": { + ",\u116a": "0xc0", + ",\u116b": "0xc0", + ",\u1170": "0xc0" + } + }, + { + "defaultGlyph": "0x2e", + "alternatives": { + ",\u1162,\u11bc": "0x59", + ",\u1162,\u11bb": "0x59", + ",\u1166,\u11af": "0x59", + ",\u1162,\u11b7": "0x59", + ",\u1166,\u11ba": "0x59", + ",\u1162,\u11ab": "0x59", + ",\u1166,\u11b7": "0x59", + ",\u1161,\u11a8": "0x59", + ",\u1161,\u11a9": "0x59", + ",\u1161,\u11aa": "0x59", + ",\u1161,\u11ab": "0x59", + ",\u1161,\u11ac": "0x59", + ",\u1161,\u11ad": "0x59", + ",\u1161,\u11ae": "0x59", + ",\u1161,\u11af": "0x59", + ",\u1161,\u11b0": "0x59", + ",\u1161,\u11b1": "0x59", + ",\u1161,\u11b2": "0x59", + ",\u1161,\u11b3": "0x59", + ",\u1161,\u11b4": "0x59", + ",\u1161,\u11b5": "0x59", + ",\u1161,\u11b6": "0x59", + ",\u1161,\u11b7": "0x59", + ",\u1161,\u11b8": "0x59", + ",\u1161,\u11b9": "0x59", + ",\u1161,\u11ba": "0x59", + ",\u1161,\u11bb": "0x59", + ",\u1161,\u11bc": "0x59", + ",\u1161,\u11bd": "0x59", + ",\u1161,\u11be": "0x59", + ",\u1161,\u11bf": "0x59", + ",\u1161,\u11c0": "0x59", + ",\u1161,\u11c1": "0x59", + ",\u1161,\u11c2": "0x59", + ",\u1162,\u11a8": "0x59", + ",\u1162,\u11a9": "0x59", + ",\u1162,\u11aa": "0x59", + ",\u1162,\u11ac": "0x59", + ",\u1162,\u11ad": "0x59", + ",\u1162,\u11ae": "0x59", + ",\u1162,\u11af": "0x59", + ",\u1162,\u11b0": "0x59", + ",\u1162,\u11b1": "0x59", + ",\u1162,\u11b2": "0x59", + ",\u1162,\u11b3": "0x59", + ",\u1162,\u11b4": "0x59", + ",\u1162,\u11b5": "0x59", + ",\u1162,\u11b6": "0x59", + ",\u1162,\u11b8": "0x59", + ",\u1162,\u11b9": "0x59", + ",\u1162,\u11ba": "0x59", + ",\u1162,\u11bd": "0x59", + ",\u1162,\u11be": "0x59", + ",\u1162,\u11bf": "0x59", + ",\u1162,\u11c0": "0x59", + ",\u1162,\u11c1": "0x59", + ",\u1162,\u11c2": "0x59", + ",\u1163,\u11a8": "0x59", + ",\u1163,\u11a9": "0x59", + ",\u1163,\u11aa": "0x59", + ",\u1163,\u11ab": "0x59", + ",\u1163,\u11ac": "0x59", + ",\u1163,\u11ad": "0x59", + ",\u1163,\u11ae": "0x59", + ",\u1163,\u11af": "0x59", + ",\u1163,\u11b0": "0x59", + ",\u1163,\u11b1": "0x59", + ",\u1163,\u11b2": "0x59", + ",\u1163,\u11b3": "0x59", + ",\u1163,\u11b4": "0x59", + ",\u1163,\u11b5": "0x59", + ",\u1163,\u11b6": "0x59", + ",\u1163,\u11b7": "0x59", + ",\u1163,\u11b8": "0x59", + ",\u1163,\u11b9": "0x59", + ",\u1163,\u11ba": "0x59", + ",\u1163,\u11bb": "0x59", + ",\u1163,\u11bc": "0x59", + ",\u1163,\u11bd": "0x59", + ",\u1163,\u11be": "0x59", + ",\u1163,\u11bf": "0x59", + ",\u1163,\u11c0": "0x59", + ",\u1163,\u11c1": "0x59", + ",\u1163,\u11c2": "0x59", + ",\u1164,\u11a8": "0x59", + ",\u1164,\u11a9": "0x59", + ",\u1164,\u11aa": "0x59", + ",\u1164,\u11ab": "0x59", + ",\u1164,\u11ac": "0x59", + ",\u1164,\u11ad": "0x59", + ",\u1164,\u11ae": "0x59", + ",\u1164,\u11af": "0x59", + ",\u1164,\u11b0": "0x59", + ",\u1164,\u11b1": "0x59", + ",\u1164,\u11b2": "0x59", + ",\u1164,\u11b3": "0x59", + ",\u1164,\u11b4": "0x59", + ",\u1164,\u11b5": "0x59", + ",\u1164,\u11b6": "0x59", + ",\u1164,\u11b7": "0x59", + ",\u1164,\u11b8": "0x59", + ",\u1164,\u11b9": "0x59", + ",\u1164,\u11ba": "0x59", + ",\u1164,\u11bb": "0x59", + ",\u1164,\u11bc": "0x59", + ",\u1164,\u11bd": "0x59", + ",\u1164,\u11be": "0x59", + ",\u1164,\u11bf": "0x59", + ",\u1164,\u11c0": "0x59", + ",\u1164,\u11c1": "0x59", + ",\u1164,\u11c2": "0x59", + ",\u1166,\u11a8": "0x59", + ",\u1166,\u11a9": "0x59", + ",\u1166,\u11aa": "0x59", + ",\u1166,\u11ab": "0x59", + ",\u1166,\u11ac": "0x59", + ",\u1166,\u11ad": "0x59", + ",\u1166,\u11ae": "0x59", + ",\u1166,\u11b0": "0x59", + ",\u1166,\u11b1": "0x59", + ",\u1166,\u11b2": "0x59", + ",\u1166,\u11b3": "0x59", + ",\u1166,\u11b4": "0x59", + ",\u1166,\u11b5": "0x59", + ",\u1166,\u11b6": "0x59", + ",\u1166,\u11b8": "0x59", + ",\u1166,\u11b9": "0x59", + ",\u1166,\u11bb": "0x59", + ",\u1166,\u11bc": "0x59", + ",\u1166,\u11bd": "0x59", + ",\u1166,\u11be": "0x59", + ",\u1166,\u11bf": "0x59", + ",\u1166,\u11c0": "0x59", + ",\u1166,\u11c1": "0x59", + ",\u1166,\u11c2": "0x59", + ",\u1167,\u11a8": "0x59", + ",\u1167,\u11a9": "0x59", + ",\u1167,\u11aa": "0x59", + ",\u1167,\u11ab": "0x59", + ",\u1167,\u11ac": "0x59", + ",\u1167,\u11ad": "0x59", + ",\u1167,\u11ae": "0x59", + ",\u1167,\u11af": "0x59", + ",\u1167,\u11b0": "0x59", + ",\u1167,\u11b1": "0x59", + ",\u1167,\u11b2": "0x59", + ",\u1167,\u11b3": "0x59", + ",\u1167,\u11b4": "0x59", + ",\u1167,\u11b5": "0x59", + ",\u1167,\u11b6": "0x59", + ",\u1167,\u11b7": "0x59", + ",\u1167,\u11b8": "0x59", + ",\u1167,\u11b9": "0x59", + ",\u1167,\u11ba": "0x59", + ",\u1167,\u11bb": "0x59", + ",\u1167,\u11bc": "0x59", + ",\u1167,\u11bd": "0x59", + ",\u1167,\u11be": "0x59", + ",\u1167,\u11bf": "0x59", + ",\u1167,\u11c0": "0x59", + ",\u1167,\u11c1": "0x59", + ",\u1167,\u11c2": "0x59", + ",\u1168,\u11a8": "0x59", + ",\u1168,\u11a9": "0x59", + ",\u1168,\u11aa": "0x59", + ",\u1168,\u11ab": "0x59", + ",\u1168,\u11ac": "0x59", + ",\u1168,\u11ad": "0x59", + ",\u1168,\u11ae": "0x59", + ",\u1168,\u11af": "0x59", + ",\u1168,\u11b0": "0x59", + ",\u1168,\u11b1": "0x59", + ",\u1168,\u11b2": "0x59", + ",\u1168,\u11b3": "0x59", + ",\u1168,\u11b4": "0x59", + ",\u1168,\u11b5": "0x59", + ",\u1168,\u11b6": "0x59", + ",\u1168,\u11b7": "0x59", + ",\u1168,\u11b8": "0x59", + ",\u1168,\u11b9": "0x59", + ",\u1168,\u11ba": "0x59", + ",\u1168,\u11bb": "0x59", + ",\u1168,\u11bc": "0x59", + ",\u1168,\u11bd": "0x59", + ",\u1168,\u11be": "0x59", + ",\u1168,\u11bf": "0x59", + ",\u1168,\u11c0": "0x59", + ",\u1168,\u11c1": "0x59", + ",\u1168,\u11c2": "0x59" + } + }, + { + "defaultGlyph": "0x7e", + "alternatives": {} + }, + { + "defaultGlyph": "0xa1", + "alternatives": { + ",\u116a,\u11a8": "0xc0", + ",\u116a,\u11a9": "0xc0", + ",\u116a,\u11aa": "0xc0", + ",\u116a,\u11ab": "0xc0", + ",\u116a,\u11ac": "0xc0", + ",\u116a,\u11ad": "0xc0", + ",\u116a,\u11ae": "0xc0", + ",\u116a,\u11af": "0xc0", + ",\u116a,\u11b0": "0xc0", + ",\u116a,\u11b1": "0xc0", + ",\u116a,\u11b2": "0xc0", + ",\u116a,\u11b3": "0xc0", + ",\u116a,\u11b4": "0xc0", + ",\u116a,\u11b5": "0xc0", + ",\u116a,\u11b6": "0xc0", + ",\u116a,\u11b7": "0xc0", + ",\u116a,\u11b8": "0xc0", + ",\u116a,\u11b9": "0xc0", + ",\u116a,\u11ba": "0xc0", + ",\u116a,\u11bb": "0xc0", + ",\u116a,\u11bc": "0xc0", + ",\u116a,\u11bd": "0xc0", + ",\u116a,\u11be": "0xc0", + ",\u116a,\u11bf": "0xc0", + ",\u116a,\u11c0": "0xc0", + ",\u116a,\u11c1": "0xc0", + ",\u116a,\u11c2": "0xc0", + ",\u116b,\u11a8": "0xc0", + ",\u116b,\u11a9": "0xc0", + ",\u116b,\u11aa": "0xc0", + ",\u116b,\u11ab": "0xc0", + ",\u116b,\u11ac": "0xc0", + ",\u116b,\u11ad": "0xc0", + ",\u116b,\u11ae": "0xc0", + ",\u116b,\u11af": "0xc0", + ",\u116b,\u11b0": "0xc0", + ",\u116b,\u11b1": "0xc0", + ",\u116b,\u11b2": "0xc0", + ",\u116b,\u11b3": "0xc0", + ",\u116b,\u11b4": "0xc0", + ",\u116b,\u11b5": "0xc0", + ",\u116b,\u11b6": "0xc0", + ",\u116b,\u11b7": "0xc0", + ",\u116b,\u11b8": "0xc0", + ",\u116b,\u11b9": "0xc0", + ",\u116b,\u11ba": "0xc0", + ",\u116b,\u11bb": "0xc0", + ",\u116b,\u11bc": "0xc0", + ",\u116b,\u11bd": "0xc0", + ",\u116b,\u11be": "0xc0", + ",\u116b,\u11bf": "0xc0", + ",\u116b,\u11c0": "0xc0", + ",\u116b,\u11c1": "0xc0", + ",\u116b,\u11c2": "0xc0", + ",\u1170,\u11a8": "0xc0", + ",\u1170,\u11a9": "0xc0", + ",\u1170,\u11aa": "0xc0", + ",\u1170,\u11ab": "0xc0", + ",\u1170,\u11ac": "0xc0", + ",\u1170,\u11ad": "0xc0", + ",\u1170,\u11ae": "0xc0", + ",\u1170,\u11af": "0xc0", + ",\u1170,\u11b0": "0xc0", + ",\u1170,\u11b1": "0xc0", + ",\u1170,\u11b2": "0xc0", + ",\u1170,\u11b3": "0xc0", + ",\u1170,\u11b4": "0xc0", + ",\u1170,\u11b5": "0xc0", + ",\u1170,\u11b6": "0xc0", + ",\u1170,\u11b7": "0xc0", + ",\u1170,\u11b8": "0xc0", + ",\u1170,\u11b9": "0xc0", + ",\u1170,\u11ba": "0xc0", + ",\u1170,\u11bb": "0xc0", + ",\u1170,\u11bc": "0xc0", + ",\u1170,\u11bd": "0xc0", + ",\u1170,\u11be": "0xc0", + ",\u1170,\u11bf": "0xc0", + ",\u1170,\u11c0": "0xc0", + ",\u1170,\u11c1": "0xc0", + ",\u1170,\u11c2": "0xc0" + } + } + ], + "\u1175": [ + { + "defaultGlyph": "0x1c", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x17", + "alternatives": { + "\u110c,,\u11ab": "0x1c", + "\u1112,,\u11ab": "0x1c", + "\u1102,,\u11ab": "0x1c", + "\u110b,,\u11ab": "0x1c", + "\u1105,,\u11ab": "0x1c", + "\u1109,,\u11ab": "0x1c", + "\u1107,,\u11ab": "0x1c", + "\u1110,,\u11ab": "0x1c", + "\u1106,,\u11ab": "0x1c", + "\u110e,,\u11ab": "0x1c", + "\u1111,,\u11ab": "0x1c", + "\u1103,,\u11ab": "0x1c", + "\u1100,,\u11ab": "0x1c", + "\u110f,,\u11ab": "0x1c", + "\u110a,,\u11ab": "0x1c", + "\u1101,,\u11ab": "0x1c", + "\u1104,,\u11ab": "0x1c", + "\u1108,,\u11ab": "0x1c", + "\u110d,,\u11ab": "0x1c" + } + }, + null, + null + ], + "\u1161": [ + { + "defaultGlyph": "0x1a", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x15", + "alternatives": { + "\u1112,,\u11ab": "0x1a", + "\u110f,,\u11ab": "0x1a", + "\u1100,,\u11ab": "0x1a", + "\u1106,,\u11ab": "0x1a", + "\u1110,,\u11ab": "0x1a", + "\u1109,,\u11ab": "0x1a", + "\u1103,,\u11ab": "0x1a", + "\u110b,,\u11ab": "0x1a", + "\u1111,,\u11ab": "0x1a", + "\u1105,,\u11ab": "0x1a", + "\u1107,,\u11ab": "0x1a", + "\u1102,,\u11ab": "0x1a", + "\u110c,,\u11ab": "0x1a", + "\u1101,,\u11ab": "0x1a", + "\u110e,,\u11ab": "0x1a", + "\u110a,,\u11ab": "0x1a", + "\u110d,,\u11ab": "0x1a", + "\u1104,,\u11ab": "0x1a", + "\u1108,,\u11ab": "0x1a" + } + }, + null, + null + ], + "\u1162": [ + { + "defaultGlyph": "0x46", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x42", + "alternatives": { + "\u110f,,\u11ab": "0x46", + "\u1105,,\u11ab": "0x46", + "\u1102,,\u11ab": "0x46", + "\u1106,,\u11ab": "0x46", + "\u1112,,\u11ab": "0x46", + "\u1109,,\u11ab": "0x46", + "\u1104,,\u11ab": "0x46", + "\u1111,,\u11ab": "0x46", + "\u1100,,\u11ab": "0x46", + "\u1101,,\u11ab": "0x46", + "\u1103,,\u11ab": "0x46", + "\u1107,,\u11ab": "0x46", + "\u1108,,\u11ab": "0x46", + "\u110a,,\u11ab": "0x46", + "\u110b,,\u11ab": "0x46", + "\u110c,,\u11ab": "0x46", + "\u110d,,\u11ab": "0x46", + "\u110e,,\u11ab": "0x46", + "\u1110,,\u11ab": "0x46" + } + }, + null, + null + ], + "\u1163": [ + { + "defaultGlyph": "0x1b", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x16", + "alternatives": {} + }, + null, + null + ], + "\u1164": [ + { + "defaultGlyph": "0x47", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x43", + "alternatives": { + "\u1100,,\u11ab": "0x47", + "\u1101,,\u11ab": "0x47", + "\u1102,,\u11ab": "0x47", + "\u1103,,\u11ab": "0x47", + "\u1104,,\u11ab": "0x47", + "\u1105,,\u11ab": "0x47", + "\u1106,,\u11ab": "0x47", + "\u1107,,\u11ab": "0x47", + "\u1108,,\u11ab": "0x47", + "\u1109,,\u11ab": "0x47", + "\u110a,,\u11ab": "0x47", + "\u110b,,\u11ab": "0x47", + "\u110c,,\u11ab": "0x47", + "\u110d,,\u11ab": "0x47", + "\u110e,,\u11ab": "0x47", + "\u110f,,\u11ab": "0x47", + "\u1110,,\u11ab": "0x47", + "\u1111,,\u11ab": "0x47", + "\u1112,,\u11ab": "0x47" + } + }, + null, + null + ], + "\u1165": [ + { + "defaultGlyph": "0x1d", + "alternatives": { + "\u1109,": "0x24", + "\u1102,": "0x24", + "\u110a,": "0x24", + "\u110e,": "0x31", + "\u1112,": "0x31" + } + }, + null, + null, + { + "defaultGlyph": "0x18", + "alternatives": { + "\u110b,,\u11ab": "0x1d", + "\u110c,,\u11ab": "0x1d", + "\u1100,,\u11ab": "0x1d", + "\u1105,,\u11ab": "0x1d", + "\u1107,,\u11ab": "0x1d", + "\u1103,,\u11ab": "0x1d", + "\u110f,,\u11ab": "0x1d", + "\u1106,,\u11ab": "0x1d", + "\u1108,,\u11ab": "0x1d", + "\u110d,,\u11ab": "0x1d", + "\u1104,,\u11ab": "0x1d", + "\u1109,,\u11ab": "0x24", + "\u1102,,\u11ab": "0x24", + "\u1102,,\u11c2": "0x22", + "\u1109,,\u11bc": "0x22", + "\u1102,,\u11af": "0x22", + "\u1109,,\u11a8": "0x22", + "\u1102,,\u11b7": "0x22", + "\u1109,,\u11af": "0x22", + "\u1109,,\u11ba": "0x22", + "\u110a,,\u11af": "0x22", + "\u110a,,\u11bc": "0x22", + "\u1109,,\u11b7": "0x22", + "\u1109,,\u11b8": "0x22", + "\u110e,,\u11ba": "0x2f", + "\u1112,,\u11b7": "0x2f", + "\u110e,,\u11bc": "0x2f", + "\u1112,,\u11a8": "0x2f", + "\u1112,,\u11af": "0x2f", + "\u1112,,\u11ba": "0x2f", + "\u110e,,\u11a8": "0x2f", + "\u110e,,\u11af": "0x2f", + "\u110e,,\u11b7": "0x2f", + "\u110e,,\u11ab": "0x2f", + "\u110e,,\u11a9": "0x2f", + "\u110e,,\u11aa": "0x2f", + "\u110e,,\u11ac": "0x2f", + "\u110e,,\u11ad": "0x2f", + "\u110e,,\u11ae": "0x2f", + "\u110e,,\u11b0": "0x2f", + "\u110e,,\u11b1": "0x2f", + "\u110e,,\u11b2": "0x2f", + "\u110e,,\u11b3": "0x2f", + "\u110e,,\u11b4": "0x2f", + "\u110e,,\u11b5": "0x2f", + "\u110e,,\u11b6": "0x2f", + "\u110e,,\u11b8": "0x2f", + "\u110e,,\u11b9": "0x2f", + "\u110e,,\u11bb": "0x2f", + "\u110e,,\u11bd": "0x2f", + "\u110e,,\u11be": "0x2f", + "\u110e,,\u11bf": "0x2f", + "\u110e,,\u11c0": "0x2f", + "\u110e,,\u11c1": "0x2f", + "\u110e,,\u11c2": "0x2f", + "\u1112,,\u11a9": "0x2f", + "\u1112,,\u11aa": "0x2f", + "\u1112,,\u11ab": "0x2f", + "\u1112,,\u11ac": "0x2f", + "\u1112,,\u11ad": "0x2f", + "\u1112,,\u11ae": "0x2f", + "\u1112,,\u11b0": "0x2f", + "\u1112,,\u11b1": "0x2f", + "\u1112,,\u11b2": "0x2f", + "\u1112,,\u11b3": "0x2f", + "\u1112,,\u11b4": "0x2f", + "\u1112,,\u11b5": "0x2f", + "\u1112,,\u11b6": "0x2f", + "\u1112,,\u11b8": "0x2f", + "\u1112,,\u11b9": "0x2f", + "\u1112,,\u11bb": "0x2f", + "\u1112,,\u11bc": "0x2f", + "\u1112,,\u11bd": "0x2f", + "\u1112,,\u11be": "0x2f", + "\u1112,,\u11bf": "0x2f", + "\u1112,,\u11c0": "0x2f", + "\u1112,,\u11c1": "0x2f", + "\u1112,,\u11c2": "0x2f", + "*[^\u110e;\u1110;\u1112],,\u11ab": "0x1d" + } + }, + null, + null + ], + "\u1166": [ + { + "defaultGlyph": "0x48", + "alternatives": { + "\u1109,": "0x4f", + "\u1102,": "0x4f", + "\u110a,": "0x4f", + "\u1112,": "0x5c", + "\u110e,": "0x5c" + } + }, + null, + null, + { + "defaultGlyph": "0x44", + "alternatives": { + "\u1110,,\u11ab": "0x48", + "\u1105,,\u11ab": "0x48", + "\u1107,,\u11ab": "0x48", + "\u110b,,\u1100": "0x48", + "\u110b,,\u11ab": "0x48", + "\u110c,,\u11ab": "0x48", + "\u1100,,\u11ab": "0x48", + "\u1109,,\u11ba": "0x4d", + "\u1109,,\u11b7": "0x4d", + "\u1109,,\u11a8": "0x4d", + "\u1112,,\u11af": "0x5a", + "\u1112,,\u11ba": "0x5a", + "\u110e,,\u11ba": "0x5a", + "\u1112,,\u11b7": "0x5a", + "\u110a,,\u11ab": "0x48", + "\u1109,,\u11ab": "0x48", + "\u1112,,\u11a8": "0x5a", + "\u1112,,\u11a9": "0x5a", + "\u1112,,\u11aa": "0x5a", + "\u1112,,\u11ab": "0x48", + "\u1112,,\u11ac": "0x5a", + "\u1112,,\u11ad": "0x5a", + "\u1112,,\u11ae": "0x5a", + "\u1112,,\u11b0": "0x5a", + "\u1112,,\u11b1": "0x5a", + "\u1112,,\u11b2": "0x5a", + "\u1112,,\u11b3": "0x5a", + "\u1112,,\u11b4": "0x5a", + "\u1112,,\u11b5": "0x5a", + "\u1112,,\u11b6": "0x5a", + "\u1112,,\u11b8": "0x5a", + "\u1112,,\u11b9": "0x5a", + "\u1112,,\u11bb": "0x5a", + "\u1112,,\u11bc": "0x5a", + "\u1112,,\u11bd": "0x5a", + "\u1112,,\u11be": "0x5a", + "\u1112,,\u11bf": "0x5a", + "\u1112,,\u11c0": "0x5a", + "\u1112,,\u11c1": "0x5a", + "\u1112,,\u11c2": "0x5a", + "\u1101,,\u11ab": "0x48", + "\u1102,,\u11ab": "0x48", + "\u1103,,\u11ab": "0x48", + "\u1104,,\u11ab": "0x48", + "\u1106,,\u11ab": "0x48", + "\u1108,,\u11ab": "0x48", + "\u110d,,\u11ab": "0x48", + "\u110e,,\u11ab": "0x48", + "\u110f,,\u11ab": "0x48", + "\u1111,,\u11ab": "0x48" + } + }, + null, + null + ], + "\u1167": [ + { + "defaultGlyph": "0x1e", + "alternatives": { + "\u1105,": "0x2c", + "\u1103,": "0x2c", + "\u1110,": "0x2c", + "\u1112,": "0x32", + "\u110e,": "0x32", + "\u1109,": "0x25", + "\u1102,": "0x25" + } + }, + null, + null, + { + "defaultGlyph": "0x19", + "alternatives": { + "\u1106,,\u11ab": "0x1e", + "\u110c,,\u11ab": "0x1e", + "\u1107,,\u11ab": "0x1e", + "\u110b,,\u11ab": "0x1e", + "\u110f,,\u11ab": "0x1e", + "\u1100,,\u11ab": "0x1e", + "\u1105,,\u11a8": "0x2b", + "\u1105,,\u11bc": "0x2b", + "\u1105,,\u11bb": "0x2b", + "\u1105,,\u11b8": "0x2b", + "\u1111,,\u11bc": "0x2b", + "\u1105,,\u11ba": "0x2b", + "\u1105,,\u11af": "0x2b", + "\u1109,,\u11ab": "0x1e", + "\u1102,,\u11ab": "0x1e", + "\u1112,,\u11bb": "0x30", + "\u1112,,\u11b8": "0x30", + "\u1112,,\u11b7": "0x30", + "\u1112,,\u11bc": "0x30", + "\u1112,,\u11a8": "0x30", + "\u1112,,\u11af": "0x30", + "\u110e,,\u11bb": "0x1e", + "\u1112,,\u11ab": "0x1e", + "\u1102,,\u11bc": "0x25", + "\u1109,,\u11bb": "0x23", + "\u1102,,\u11b7": "0x25", + "\u1102,,\u11bb": "0x25", + "\u1105,,\u11ab": "0x1e", + "\u1111,,\u11ab": "0x1e", + "\u1102,,\u11a8": "0x25", + "\u1102,,\u11a9": "0x25", + "\u1102,,\u11aa": "0x25", + "\u1102,,\u11ac": "0x25", + "\u1102,,\u11ad": "0x25", + "\u1102,,\u11ae": "0x25", + "\u1102,,\u11af": "0x25", + "\u1102,,\u11b0": "0x25", + "\u1102,,\u11b1": "0x25", + "\u1102,,\u11b2": "0x25", + "\u1102,,\u11b3": "0x25", + "\u1102,,\u11b4": "0x25", + "\u1102,,\u11b5": "0x25", + "\u1102,,\u11b6": "0x25", + "\u1102,,\u11b8": "0x25", + "\u1102,,\u11b9": "0x25", + "\u1102,,\u11ba": "0x25", + "\u1102,,\u11bd": "0x25", + "\u1102,,\u11be": "0x25", + "\u1102,,\u11bf": "0x25", + "\u1102,,\u11c0": "0x25", + "\u1102,,\u11c1": "0x25", + "\u1102,,\u11c2": "0x25", + "\u110e,,\u11a8": "0x1e", + "\u110e,,\u11a9": "0x1e", + "\u110e,,\u11aa": "0x1e", + "\u110e,,\u11ab": "0x1e", + "\u110e,,\u11ac": "0x1e", + "\u110e,,\u11ad": "0x1e", + "\u110e,,\u11ae": "0x1e", + "\u110e,,\u11af": "0x1e", + "\u110e,,\u11b0": "0x1e", + "\u110e,,\u11b1": "0x1e", + "\u110e,,\u11b2": "0x1e", + "\u110e,,\u11b3": "0x1e", + "\u110e,,\u11b4": "0x1e", + "\u110e,,\u11b5": "0x1e", + "\u110e,,\u11b6": "0x1e", + "\u110e,,\u11b7": "0x1e", + "\u110e,,\u11b8": "0x1e", + "\u110e,,\u11b9": "0x1e", + "\u110e,,\u11ba": "0x1e", + "\u110e,,\u11bc": "0x1e", + "\u110e,,\u11bd": "0x1e", + "\u110e,,\u11be": "0x1e", + "\u110e,,\u11bf": "0x1e", + "\u110e,,\u11c0": "0x1e", + "\u110e,,\u11c1": "0x1e", + "\u110e,,\u11c2": "0x1e", + "\u1112,,\u11a9": "0x30", + "\u1112,,\u11aa": "0x30", + "\u1112,,\u11ac": "0x30", + "\u1112,,\u11ad": "0x30", + "\u1112,,\u11ae": "0x30", + "\u1112,,\u11b0": "0x30", + "\u1112,,\u11b1": "0x30", + "\u1112,,\u11b2": "0x30", + "\u1112,,\u11b3": "0x30", + "\u1112,,\u11b4": "0x30", + "\u1112,,\u11b5": "0x30", + "\u1112,,\u11b6": "0x30", + "\u1112,,\u11b9": "0x30", + "\u1112,,\u11ba": "0x30", + "\u1112,,\u11bd": "0x30", + "\u1112,,\u11be": "0x30", + "\u1112,,\u11bf": "0x30", + "\u1112,,\u11c0": "0x30", + "\u1112,,\u11c1": "0x30", + "\u1112,,\u11c2": "0x30", + "\u1101,,\u11ab": "0x1e", + "\u1103,,\u11ab": "0x1e", + "\u1104,,\u11ab": "0x1e", + "\u1108,,\u11ab": "0x1e", + "\u110a,,\u11ab": "0x1e", + "\u110d,,\u11ab": "0x1e", + "\u1110,,\u11ab": "0x1e" + } + }, + null, + null + ], + "\u1168": [ + { + "defaultGlyph": "0x49", + "alternatives": { + "\u1112,": "0x5d", + "\u1105,": "0x50", + "\u1111,": "0x57", + "\u1102,": "0x50", + "\u1103,": "0x50", + "\u1104,": "0x5d", + "\u1106,": "0x50", + "\u1108,": "0x50" + } + }, + null, + null, + { + "defaultGlyph": "0x45", + "alternatives": { + "\u1100,,\u11ab": "0x49", + "\u1101,,\u11ab": "0x49", + "\u1102,,\u11ab": "0x49", + "\u1103,,\u11ab": "0x49", + "\u1104,,\u11ab": "0x49", + "\u1105,,\u11ab": "0x49", + "\u1106,,\u11ab": "0x49", + "\u1107,,\u11ab": "0x49", + "\u1108,,\u11ab": "0x49", + "\u1109,,\u11ab": "0x49", + "\u110a,,\u11ab": "0x49", + "\u110b,,\u11ab": "0x49", + "\u110c,,\u11ab": "0x49", + "\u110d,,\u11ab": "0x49", + "\u110e,,\u11ab": "0x49", + "\u110f,,\u11ab": "0x49", + "\u1110,,\u11ab": "0x49", + "\u1111,,\u11ab": "0x49", + "\u1112,,\u11ab": "0x49" + } + }, + null, + null + ], + "\u1169": [ + null, + { + "defaultGlyph": "0x82", + "alternatives": { + "\u1100,": "0x62", + "\u110f,": "0x62", + "\u1101,": "0x66", + "\u1102,": "0x62", + "\u1104,": "0x62", + "\u1105,": "0x62", + "\u110b,": "0x62", + "\u1110,": "0x62", + "\u1112,": "0x62" + } + }, + null, + null, + { + "defaultGlyph": "0x82", + "alternatives": { + "\u1100,,\u11bc": "0x82", + "\u1100,,\u11a8": "0x82", + "\u110f,,\u11b7": "0x82", + "\u1100,,\u11af": "0x82", + "\u1100,,\u11ba": "0x82", + "\u110f,,\u11bc": "0x82", + "\u1100,,\u11ab": "0x82", + "\u1100,,\u11ae": "0x82", + "\u1100,,\u11b7": "0x82", + "\u110f,,\u11af": "0x82", + "\u1101,,\u11bd": "0x82", + "\u1101,,\u11a8": "0x82", + "\u1101,,\u11af": "0x82", + "\u1101,,\u11b7": "0x82", + "\u1101,,\u11bc": "0x82", + "\u110f,,\u11ab": "0x82", + "\u1103,,\u11ab": "0x82", + "\u1105,,\u11ab": "0x82", + "\u1110,,\u11ab": "0x82", + "\u1109,,\u11ab": "0x82", + "\u110b,,\u11ab": "0x82", + "\u1112,,\u11ab": "0x82", + "\u1107,,\u11ab": "0x82", + "\u1111,,\u11ab": "0x82", + "\u110e,,\u11ab": "0x82", + "\u110c,,\u11ab": "0x82", + "\u1102,,\u11ab": "0x82", + "\u1100,,\u11a9": "0x82", + "\u1100,,\u11aa": "0x82", + "\u1100,,\u11ac": "0x82", + "\u1100,,\u11ad": "0x82", + "\u1100,,\u11b0": "0x82", + "\u1100,,\u11b1": "0x82", + "\u1100,,\u11b2": "0x82", + "\u1100,,\u11b3": "0x82", + "\u1100,,\u11b4": "0x82", + "\u1100,,\u11b5": "0x82", + "\u1100,,\u11b6": "0x82", + "\u1100,,\u11b8": "0x82", + "\u1100,,\u11b9": "0x82", + "\u1100,,\u11bb": "0x82", + "\u1100,,\u11bd": "0x82", + "\u1100,,\u11be": "0x82", + "\u1100,,\u11bf": "0x82", + "\u1100,,\u11c0": "0x82", + "\u1100,,\u11c1": "0x82", + "\u1100,,\u11c2": "0x82", + "\u1101,,\u11a9": "0x82", + "\u1101,,\u11aa": "0x82", + "\u1101,,\u11ab": "0x82", + "\u1101,,\u11ac": "0x82", + "\u1101,,\u11ad": "0x82", + "\u1101,,\u11ae": "0x82", + "\u1101,,\u11b0": "0x82", + "\u1101,,\u11b1": "0x82", + "\u1101,,\u11b2": "0x82", + "\u1101,,\u11b3": "0x82", + "\u1101,,\u11b4": "0x82", + "\u1101,,\u11b5": "0x82", + "\u1101,,\u11b6": "0x82", + "\u1101,,\u11b8": "0x82", + "\u1101,,\u11b9": "0x82", + "\u1101,,\u11ba": "0x82", + "\u1101,,\u11bb": "0x82", + "\u1101,,\u11be": "0x82", + "\u1101,,\u11bf": "0x82", + "\u1101,,\u11c0": "0x82", + "\u1101,,\u11c1": "0x82", + "\u1101,,\u11c2": "0x82", + "\u1102,,\u11a8": "0x82", + "\u1102,,\u11a9": "0x82", + "\u1102,,\u11aa": "0x82", + "\u1102,,\u11ac": "0x82", + "\u1102,,\u11ad": "0x82", + "\u1102,,\u11ae": "0x82", + "\u1102,,\u11af": "0x82", + "\u1102,,\u11b0": "0x82", + "\u1102,,\u11b1": "0x82", + "\u1102,,\u11b2": "0x82", + "\u1102,,\u11b3": "0x82", + "\u1102,,\u11b4": "0x82", + "\u1102,,\u11b5": "0x82", + "\u1102,,\u11b6": "0x82", + "\u1102,,\u11b7": "0x82", + "\u1102,,\u11b8": "0x82", + "\u1102,,\u11b9": "0x82", + "\u1102,,\u11ba": "0x82", + "\u1102,,\u11bb": "0x82", + "\u1102,,\u11bc": "0x82", + "\u1102,,\u11bd": "0x82", + "\u1102,,\u11be": "0x82", + "\u1102,,\u11bf": "0x82", + "\u1102,,\u11c0": "0x82", + "\u1102,,\u11c1": "0x82", + "\u1102,,\u11c2": "0x82", + "\u1103,,\u11a8": "0x82", + "\u1103,,\u11a9": "0x82", + "\u1103,,\u11aa": "0x82", + "\u1103,,\u11ac": "0x82", + "\u1103,,\u11ad": "0x82", + "\u1103,,\u11ae": "0x82", + "\u1103,,\u11af": "0x82", + "\u1103,,\u11b0": "0x82", + "\u1103,,\u11b1": "0x82", + "\u1103,,\u11b2": "0x82", + "\u1103,,\u11b3": "0x82", + "\u1103,,\u11b4": "0x82", + "\u1103,,\u11b5": "0x82", + "\u1103,,\u11b6": "0x82", + "\u1103,,\u11b7": "0x82", + "\u1103,,\u11b8": "0x82", + "\u1103,,\u11b9": "0x82", + "\u1103,,\u11ba": "0x82", + "\u1103,,\u11bb": "0x82", + "\u1103,,\u11bc": "0x82", + "\u1103,,\u11bd": "0x82", + "\u1103,,\u11be": "0x82", + "\u1103,,\u11bf": "0x82", + "\u1103,,\u11c0": "0x82", + "\u1103,,\u11c1": "0x82", + "\u1103,,\u11c2": "0x82", + "\u1104,,\u11a8": "0x82", + "\u1104,,\u11a9": "0x82", + "\u1104,,\u11aa": "0x82", + "\u1104,,\u11ab": "0x82", + "\u1104,,\u11ac": "0x82", + "\u1104,,\u11ad": "0x82", + "\u1104,,\u11ae": "0x82", + "\u1104,,\u11af": "0x82", + "\u1104,,\u11b0": "0x82", + "\u1104,,\u11b1": "0x82", + "\u1104,,\u11b2": "0x82", + "\u1104,,\u11b3": "0x82", + "\u1104,,\u11b4": "0x82", + "\u1104,,\u11b5": "0x82", + "\u1104,,\u11b6": "0x82", + "\u1104,,\u11b7": "0x82", + "\u1104,,\u11b8": "0x82", + "\u1104,,\u11b9": "0x82", + "\u1104,,\u11ba": "0x82", + "\u1104,,\u11bb": "0x82", + "\u1104,,\u11bc": "0x82", + "\u1104,,\u11bd": "0x82", + "\u1104,,\u11be": "0x82", + "\u1104,,\u11bf": "0x82", + "\u1104,,\u11c0": "0x82", + "\u1104,,\u11c1": "0x82", + "\u1104,,\u11c2": "0x82", + "\u1105,,\u11a8": "0x82", + "\u1105,,\u11a9": "0x82", + "\u1105,,\u11aa": "0x82", + "\u1105,,\u11ac": "0x82", + "\u1105,,\u11ad": "0x82", + "\u1105,,\u11ae": "0x82", + "\u1105,,\u11af": "0x82", + "\u1105,,\u11b0": "0x82", + "\u1105,,\u11b1": "0x82", + "\u1105,,\u11b2": "0x82", + "\u1105,,\u11b3": "0x82", + "\u1105,,\u11b4": "0x82", + "\u1105,,\u11b5": "0x82", + "\u1105,,\u11b6": "0x82", + "\u1105,,\u11b7": "0x82", + "\u1105,,\u11b8": "0x82", + "\u1105,,\u11b9": "0x82", + "\u1105,,\u11ba": "0x82", + "\u1105,,\u11bb": "0x82", + "\u1105,,\u11bc": "0x82", + "\u1105,,\u11bd": "0x82", + "\u1105,,\u11be": "0x82", + "\u1105,,\u11bf": "0x82", + "\u1105,,\u11c0": "0x82", + "\u1105,,\u11c1": "0x82", + "\u1105,,\u11c2": "0x82", + "\u1106,,\u11a8": "0x82", + "\u1106,,\u11a9": "0x82", + "\u1106,,\u11aa": "0x82", + "\u1106,,\u11ab": "0x82", + "\u1106,,\u11ac": "0x82", + "\u1106,,\u11ad": "0x82", + "\u1106,,\u11ae": "0x82", + "\u1106,,\u11af": "0x82", + "\u1106,,\u11b0": "0x82", + "\u1106,,\u11b1": "0x82", + "\u1106,,\u11b2": "0x82", + "\u1106,,\u11b3": "0x82", + "\u1106,,\u11b4": "0x82", + "\u1106,,\u11b5": "0x82", + "\u1106,,\u11b6": "0x82", + "\u1106,,\u11b7": "0x82", + "\u1106,,\u11b8": "0x82", + "\u1106,,\u11b9": "0x82", + "\u1106,,\u11ba": "0x82", + "\u1106,,\u11bb": "0x82", + "\u1106,,\u11bc": "0x82", + "\u1106,,\u11bd": "0x82", + "\u1106,,\u11be": "0x82", + "\u1106,,\u11bf": "0x82", + "\u1106,,\u11c0": "0x82", + "\u1106,,\u11c1": "0x82", + "\u1106,,\u11c2": "0x82", + "\u1107,,\u11a8": "0x82", + "\u1107,,\u11a9": "0x82", + "\u1107,,\u11aa": "0x82", + "\u1107,,\u11ac": "0x82", + "\u1107,,\u11ad": "0x82", + "\u1107,,\u11ae": "0x82", + "\u1107,,\u11af": "0x82", + "\u1107,,\u11b0": "0x82", + "\u1107,,\u11b1": "0x82", + "\u1107,,\u11b2": "0x82", + "\u1107,,\u11b3": "0x82", + "\u1107,,\u11b4": "0x82", + "\u1107,,\u11b5": "0x82", + "\u1107,,\u11b6": "0x82", + "\u1107,,\u11b7": "0x82", + "\u1107,,\u11b8": "0x82", + "\u1107,,\u11b9": "0x82", + "\u1107,,\u11ba": "0x82", + "\u1107,,\u11bb": "0x82", + "\u1107,,\u11bc": "0x82", + "\u1107,,\u11bd": "0x82", + "\u1107,,\u11be": "0x82", + "\u1107,,\u11bf": "0x82", + "\u1107,,\u11c0": "0x82", + "\u1107,,\u11c1": "0x82", + "\u1107,,\u11c2": "0x82", + "\u1108,,\u11a8": "0x82", + "\u1108,,\u11a9": "0x82", + "\u1108,,\u11aa": "0x82", + "\u1108,,\u11ab": "0x82", + "\u1108,,\u11ac": "0x82", + "\u1108,,\u11ad": "0x82", + "\u1108,,\u11ae": "0x82", + "\u1108,,\u11af": "0x82", + "\u1108,,\u11b0": "0x82", + "\u1108,,\u11b1": "0x82", + "\u1108,,\u11b2": "0x82", + "\u1108,,\u11b3": "0x82", + "\u1108,,\u11b4": "0x82", + "\u1108,,\u11b5": "0x82", + "\u1108,,\u11b6": "0x82", + "\u1108,,\u11b7": "0x82", + "\u1108,,\u11b8": "0x82", + "\u1108,,\u11b9": "0x82", + "\u1108,,\u11ba": "0x82", + "\u1108,,\u11bb": "0x82", + "\u1108,,\u11bc": "0x82", + "\u1108,,\u11bd": "0x82", + "\u1108,,\u11be": "0x82", + "\u1108,,\u11bf": "0x82", + "\u1108,,\u11c0": "0x82", + "\u1108,,\u11c1": "0x82", + "\u1108,,\u11c2": "0x82", + "\u1109,,\u11a8": "0x82", + "\u1109,,\u11a9": "0x82", + "\u1109,,\u11aa": "0x82", + "\u1109,,\u11ac": "0x82", + "\u1109,,\u11ad": "0x82", + "\u1109,,\u11ae": "0x82", + "\u1109,,\u11af": "0x82", + "\u1109,,\u11b0": "0x82", + "\u1109,,\u11b1": "0x82", + "\u1109,,\u11b2": "0x82", + "\u1109,,\u11b3": "0x82", + "\u1109,,\u11b4": "0x82", + "\u1109,,\u11b5": "0x82", + "\u1109,,\u11b6": "0x82", + "\u1109,,\u11b7": "0x82", + "\u1109,,\u11b8": "0x82", + "\u1109,,\u11b9": "0x82", + "\u1109,,\u11ba": "0x82", + "\u1109,,\u11bb": "0x82", + "\u1109,,\u11bc": "0x82", + "\u1109,,\u11bd": "0x82", + "\u1109,,\u11be": "0x82", + "\u1109,,\u11bf": "0x82", + "\u1109,,\u11c0": "0x82", + "\u1109,,\u11c1": "0x82", + "\u1109,,\u11c2": "0x82", + "\u110a,,\u11a8": "0x82", + "\u110a,,\u11a9": "0x82", + "\u110a,,\u11aa": "0x82", + "\u110a,,\u11ab": "0x82", + "\u110a,,\u11ac": "0x82", + "\u110a,,\u11ad": "0x82", + "\u110a,,\u11ae": "0x82", + "\u110a,,\u11af": "0x82", + "\u110a,,\u11b0": "0x82", + "\u110a,,\u11b1": "0x82", + "\u110a,,\u11b2": "0x82", + "\u110a,,\u11b3": "0x82", + "\u110a,,\u11b4": "0x82", + "\u110a,,\u11b5": "0x82", + "\u110a,,\u11b6": "0x82", + "\u110a,,\u11b7": "0x82", + "\u110a,,\u11b8": "0x82", + "\u110a,,\u11b9": "0x82", + "\u110a,,\u11ba": "0x82", + "\u110a,,\u11bb": "0x82", + "\u110a,,\u11bc": "0x82", + "\u110a,,\u11bd": "0x82", + "\u110a,,\u11be": "0x82", + "\u110a,,\u11bf": "0x82", + "\u110a,,\u11c0": "0x82", + "\u110a,,\u11c1": "0x82", + "\u110a,,\u11c2": "0x82", + "\u110b,,\u11a8": "0x82", + "\u110b,,\u11a9": "0x82", + "\u110b,,\u11aa": "0x82", + "\u110b,,\u11ac": "0x82", + "\u110b,,\u11ad": "0x82", + "\u110b,,\u11ae": "0x82", + "\u110b,,\u11af": "0x82", + "\u110b,,\u11b0": "0x82", + "\u110b,,\u11b1": "0x82", + "\u110b,,\u11b2": "0x82", + "\u110b,,\u11b3": "0x82", + "\u110b,,\u11b4": "0x82", + "\u110b,,\u11b5": "0x82", + "\u110b,,\u11b6": "0x82", + "\u110b,,\u11b7": "0x82", + "\u110b,,\u11b8": "0x82", + "\u110b,,\u11b9": "0x82", + "\u110b,,\u11ba": "0x82", + "\u110b,,\u11bb": "0x82", + "\u110b,,\u11bc": "0x82", + "\u110b,,\u11bd": "0x82", + "\u110b,,\u11be": "0x82", + "\u110b,,\u11bf": "0x82", + "\u110b,,\u11c0": "0x82", + "\u110b,,\u11c1": "0x82", + "\u110b,,\u11c2": "0x82", + "\u110c,,\u11a8": "0x82", + "\u110c,,\u11a9": "0x82", + "\u110c,,\u11aa": "0x82", + "\u110c,,\u11ac": "0x82", + "\u110c,,\u11ad": "0x82", + "\u110c,,\u11ae": "0x82", + "\u110c,,\u11af": "0x82", + "\u110c,,\u11b0": "0x82", + "\u110c,,\u11b1": "0x82", + "\u110c,,\u11b2": "0x82", + "\u110c,,\u11b3": "0x82", + "\u110c,,\u11b4": "0x82", + "\u110c,,\u11b5": "0x82", + "\u110c,,\u11b6": "0x82", + "\u110c,,\u11b7": "0x82", + "\u110c,,\u11b8": "0x82", + "\u110c,,\u11b9": "0x82", + "\u110c,,\u11ba": "0x82", + "\u110c,,\u11bb": "0x82", + "\u110c,,\u11bc": "0x82", + "\u110c,,\u11bd": "0x82", + "\u110c,,\u11be": "0x82", + "\u110c,,\u11bf": "0x82", + "\u110c,,\u11c0": "0x82", + "\u110c,,\u11c1": "0x82", + "\u110c,,\u11c2": "0x82", + "\u110d,,\u11a8": "0x82", + "\u110d,,\u11a9": "0x82", + "\u110d,,\u11aa": "0x82", + "\u110d,,\u11ab": "0x82", + "\u110d,,\u11ac": "0x82", + "\u110d,,\u11ad": "0x82", + "\u110d,,\u11ae": "0x82", + "\u110d,,\u11af": "0x82", + "\u110d,,\u11b0": "0x82", + "\u110d,,\u11b1": "0x82", + "\u110d,,\u11b2": "0x82", + "\u110d,,\u11b3": "0x82", + "\u110d,,\u11b4": "0x82", + "\u110d,,\u11b5": "0x82", + "\u110d,,\u11b6": "0x82", + "\u110d,,\u11b7": "0x82", + "\u110d,,\u11b8": "0x82", + "\u110d,,\u11b9": "0x82", + "\u110d,,\u11ba": "0x82", + "\u110d,,\u11bb": "0x82", + "\u110d,,\u11bc": "0x82", + "\u110d,,\u11bd": "0x82", + "\u110d,,\u11be": "0x82", + "\u110d,,\u11bf": "0x82", + "\u110d,,\u11c0": "0x82", + "\u110d,,\u11c1": "0x82", + "\u110d,,\u11c2": "0x82", + "\u110e,,\u11a8": "0x82", + "\u110e,,\u11a9": "0x82", + "\u110e,,\u11aa": "0x82", + "\u110e,,\u11ac": "0x82", + "\u110e,,\u11ad": "0x82", + "\u110e,,\u11ae": "0x82", + "\u110e,,\u11af": "0x82", + "\u110e,,\u11b0": "0x82", + "\u110e,,\u11b1": "0x82", + "\u110e,,\u11b2": "0x82", + "\u110e,,\u11b3": "0x82", + "\u110e,,\u11b4": "0x82", + "\u110e,,\u11b5": "0x82", + "\u110e,,\u11b6": "0x82", + "\u110e,,\u11b7": "0x82", + "\u110e,,\u11b8": "0x82", + "\u110e,,\u11b9": "0x82", + "\u110e,,\u11ba": "0x82", + "\u110e,,\u11bb": "0x82", + "\u110e,,\u11bc": "0x82", + "\u110e,,\u11bd": "0x82", + "\u110e,,\u11be": "0x82", + "\u110e,,\u11bf": "0x82", + "\u110e,,\u11c0": "0x82", + "\u110e,,\u11c1": "0x82", + "\u110e,,\u11c2": "0x82", + "\u110f,,\u11a8": "0x82", + "\u110f,,\u11a9": "0x82", + "\u110f,,\u11aa": "0x82", + "\u110f,,\u11ac": "0x82", + "\u110f,,\u11ad": "0x82", + "\u110f,,\u11ae": "0x82", + "\u110f,,\u11b0": "0x82", + "\u110f,,\u11b1": "0x82", + "\u110f,,\u11b2": "0x82", + "\u110f,,\u11b3": "0x82", + "\u110f,,\u11b4": "0x82", + "\u110f,,\u11b5": "0x82", + "\u110f,,\u11b6": "0x82", + "\u110f,,\u11b8": "0x82", + "\u110f,,\u11b9": "0x82", + "\u110f,,\u11ba": "0x82", + "\u110f,,\u11bb": "0x82", + "\u110f,,\u11bd": "0x82", + "\u110f,,\u11be": "0x82", + "\u110f,,\u11bf": "0x82", + "\u110f,,\u11c0": "0x82", + "\u110f,,\u11c1": "0x82", + "\u110f,,\u11c2": "0x82", + "\u1110,,\u11a8": "0x82", + "\u1110,,\u11a9": "0x82", + "\u1110,,\u11aa": "0x82", + "\u1110,,\u11ac": "0x82", + "\u1110,,\u11ad": "0x82", + "\u1110,,\u11ae": "0x82", + "\u1110,,\u11af": "0x82", + "\u1110,,\u11b0": "0x82", + "\u1110,,\u11b1": "0x82", + "\u1110,,\u11b2": "0x82", + "\u1110,,\u11b3": "0x82", + "\u1110,,\u11b4": "0x82", + "\u1110,,\u11b5": "0x82", + "\u1110,,\u11b6": "0x82", + "\u1110,,\u11b7": "0x82", + "\u1110,,\u11b8": "0x82", + "\u1110,,\u11b9": "0x82", + "\u1110,,\u11ba": "0x82", + "\u1110,,\u11bb": "0x82", + "\u1110,,\u11bc": "0x82", + "\u1110,,\u11bd": "0x82", + "\u1110,,\u11be": "0x82", + "\u1110,,\u11bf": "0x82", + "\u1110,,\u11c0": "0x82", + "\u1110,,\u11c1": "0x82", + "\u1110,,\u11c2": "0x82", + "\u1111,,\u11a8": "0x82", + "\u1111,,\u11a9": "0x82", + "\u1111,,\u11aa": "0x82", + "\u1111,,\u11ac": "0x82", + "\u1111,,\u11ad": "0x82", + "\u1111,,\u11ae": "0x82", + "\u1111,,\u11af": "0x82", + "\u1111,,\u11b0": "0x82", + "\u1111,,\u11b1": "0x82", + "\u1111,,\u11b2": "0x82", + "\u1111,,\u11b3": "0x82", + "\u1111,,\u11b4": "0x82", + "\u1111,,\u11b5": "0x82", + "\u1111,,\u11b6": "0x82", + "\u1111,,\u11b7": "0x82", + "\u1111,,\u11b8": "0x82", + "\u1111,,\u11b9": "0x82", + "\u1111,,\u11ba": "0x82", + "\u1111,,\u11bb": "0x82", + "\u1111,,\u11bc": "0x82", + "\u1111,,\u11bd": "0x82", + "\u1111,,\u11be": "0x82", + "\u1111,,\u11bf": "0x82", + "\u1111,,\u11c0": "0x82", + "\u1111,,\u11c1": "0x82", + "\u1111,,\u11c2": "0x82", + "\u1112,,\u11a8": "0x82", + "\u1112,,\u11a9": "0x82", + "\u1112,,\u11aa": "0x82", + "\u1112,,\u11ac": "0x82", + "\u1112,,\u11ad": "0x82", + "\u1112,,\u11ae": "0x82", + "\u1112,,\u11af": "0x82", + "\u1112,,\u11b0": "0x82", + "\u1112,,\u11b1": "0x82", + "\u1112,,\u11b2": "0x82", + "\u1112,,\u11b3": "0x82", + "\u1112,,\u11b4": "0x82", + "\u1112,,\u11b5": "0x82", + "\u1112,,\u11b6": "0x82", + "\u1112,,\u11b7": "0x82", + "\u1112,,\u11b8": "0x82", + "\u1112,,\u11b9": "0x82", + "\u1112,,\u11ba": "0x82", + "\u1112,,\u11bb": "0x82", + "\u1112,,\u11bc": "0x82", + "\u1112,,\u11bd": "0x82", + "\u1112,,\u11be": "0x82", + "\u1112,,\u11bf": "0x82", + "\u1112,,\u11c0": "0x82", + "\u1112,,\u11c1": "0x82", + "\u1112,,\u11c2": "0x82" + } + }, + null + ], + "\u116d": [ + null, + { + "defaultGlyph": "0x83", + "alternatives": { + "\u1100,": "0x61", + "\u1101,": "0x67", + "\u1102,": "0x63", + "\u1103,": "0x63", + "\u1104,": "0x63", + "\u1105,": "0x63", + "\u1108,": "0x63", + "\u110a,": "0x63", + "\u110b,": "0x63", + "\u110f,": "0x63", + "\u1110,": "0x63", + "\u1112,": "0x63" + } + }, + null, + null, + { + "defaultGlyph": "0x83", + "alternatives": {} + }, + null + ], + "\u116e": [ + null, + { + "defaultGlyph": "0x87", + "alternatives": { + "\u1102,": "0x6e", + "\u1100,": "0x6e", + "\u1101,": "0x6e", + "\u110f,": "0x6e", + "\u1112,": "0x6e" + } + }, + null, + null, + { + "defaultGlyph": "0x85", + "alternatives": { + "\u110b,,\u11ab": "0x89", + "\u1106,,\u11ab": "0x89", + "\u1100,,\u11ab": "0x89", + "\u110c,,\u11ab": "0x89", + "\u1107,,\u11ab": "0x89", + "\u1109,,\u11ab": "0x89", + "\u1101,,\u11ab": "0x89", + "\u1102,,\u11ab": "0x89", + "\u1103,,\u11ab": "0x89", + "\u1108,,\u11ab": "0x89", + "\u1100,,\u11a8": "0x85", + "\u1100,,\u11bc": "0x85", + "\u1100,,\u11af": "0x85", + "\u1102,,\u11af": "0x85", + "\u1101,,\u11b7": "0x85", + "\u1101,,\u11af": "0x85", + "\u110f,,\u11af": "0x85", + "\u1100,,\u11a9": "0x85", + "\u1100,,\u11aa": "0x85", + "\u1100,,\u11ac": "0x85", + "\u1100,,\u11ad": "0x85", + "\u1100,,\u11ae": "0x85", + "\u1100,,\u11b0": "0x85", + "\u1100,,\u11b1": "0x85", + "\u1100,,\u11b2": "0x85", + "\u1100,,\u11b3": "0x85", + "\u1100,,\u11b4": "0x85", + "\u1100,,\u11b5": "0x85", + "\u1100,,\u11b6": "0x85", + "\u1100,,\u11b7": "0x85", + "\u1100,,\u11b8": "0x85", + "\u1100,,\u11b9": "0x85", + "\u1100,,\u11ba": "0x85", + "\u1100,,\u11bb": "0x85", + "\u1100,,\u11bd": "0x85", + "\u1100,,\u11be": "0x85", + "\u1100,,\u11bf": "0x85", + "\u1100,,\u11c0": "0x85", + "\u1100,,\u11c1": "0x85", + "\u1100,,\u11c2": "0x85", + "\u1101,,\u11a8": "0x85", + "\u1101,,\u11a9": "0x85", + "\u1101,,\u11aa": "0x85", + "\u1101,,\u11ac": "0x85", + "\u1101,,\u11ad": "0x85", + "\u1101,,\u11ae": "0x85", + "\u1101,,\u11b0": "0x85", + "\u1101,,\u11b1": "0x85", + "\u1101,,\u11b2": "0x85", + "\u1101,,\u11b3": "0x85", + "\u1101,,\u11b4": "0x85", + "\u1101,,\u11b5": "0x85", + "\u1101,,\u11b6": "0x85", + "\u1101,,\u11b8": "0x85", + "\u1101,,\u11b9": "0x85", + "\u1101,,\u11ba": "0x85", + "\u1101,,\u11bb": "0x85", + "\u1101,,\u11bc": "0x85", + "\u1101,,\u11bd": "0x85", + "\u1101,,\u11be": "0x85", + "\u1101,,\u11bf": "0x85", + "\u1101,,\u11c0": "0x85", + "\u1101,,\u11c1": "0x85", + "\u1101,,\u11c2": "0x85", + "\u1102,,\u11a8": "0x85", + "\u1102,,\u11a9": "0x85", + "\u1102,,\u11aa": "0x85", + "\u1102,,\u11ac": "0x85", + "\u1102,,\u11ad": "0x85", + "\u1102,,\u11ae": "0x85", + "\u1102,,\u11b0": "0x85", + "\u1102,,\u11b1": "0x85", + "\u1102,,\u11b2": "0x85", + "\u1102,,\u11b3": "0x85", + "\u1102,,\u11b4": "0x85", + "\u1102,,\u11b5": "0x85", + "\u1102,,\u11b6": "0x85", + "\u1102,,\u11b7": "0x85", + "\u1102,,\u11b8": "0x85", + "\u1102,,\u11b9": "0x85", + "\u1102,,\u11ba": "0x85", + "\u1102,,\u11bb": "0x85", + "\u1102,,\u11bc": "0x85", + "\u1102,,\u11bd": "0x85", + "\u1102,,\u11be": "0x85", + "\u1102,,\u11bf": "0x85", + "\u1102,,\u11c0": "0x85", + "\u1102,,\u11c1": "0x85", + "\u1102,,\u11c2": "0x85", + "\u1103,,\u11a8": "0x85", + "\u1103,,\u11a9": "0x85", + "\u1103,,\u11aa": "0x85", + "\u1103,,\u11ac": "0x85", + "\u1103,,\u11ad": "0x85", + "\u1103,,\u11ae": "0x85", + "\u1103,,\u11af": "0x85", + "\u1103,,\u11b0": "0x85", + "\u1103,,\u11b1": "0x85", + "\u1103,,\u11b2": "0x85", + "\u1103,,\u11b3": "0x85", + "\u1103,,\u11b4": "0x85", + "\u1103,,\u11b5": "0x85", + "\u1103,,\u11b6": "0x85", + "\u1103,,\u11b7": "0x85", + "\u1103,,\u11b8": "0x85", + "\u1103,,\u11b9": "0x85", + "\u1103,,\u11ba": "0x85", + "\u1103,,\u11bb": "0x85", + "\u1103,,\u11bc": "0x85", + "\u1103,,\u11bd": "0x85", + "\u1103,,\u11be": "0x85", + "\u1103,,\u11bf": "0x85", + "\u1103,,\u11c0": "0x85", + "\u1103,,\u11c1": "0x85", + "\u1103,,\u11c2": "0x85", + "\u1104,,\u11a8": "0x85", + "\u1104,,\u11a9": "0x85", + "\u1104,,\u11aa": "0x85", + "\u1104,,\u11ab": "0x89", + "\u1104,,\u11ac": "0x85", + "\u1104,,\u11ad": "0x85", + "\u1104,,\u11ae": "0x85", + "\u1104,,\u11af": "0x85", + "\u1104,,\u11b0": "0x85", + "\u1104,,\u11b1": "0x85", + "\u1104,,\u11b2": "0x85", + "\u1104,,\u11b3": "0x85", + "\u1104,,\u11b4": "0x85", + "\u1104,,\u11b5": "0x85", + "\u1104,,\u11b6": "0x85", + "\u1104,,\u11b7": "0x85", + "\u1104,,\u11b8": "0x85", + "\u1104,,\u11b9": "0x85", + "\u1104,,\u11ba": "0x85", + "\u1104,,\u11bb": "0x85", + "\u1104,,\u11bc": "0x85", + "\u1104,,\u11bd": "0x85", + "\u1104,,\u11be": "0x85", + "\u1104,,\u11bf": "0x85", + "\u1104,,\u11c0": "0x85", + "\u1104,,\u11c1": "0x85", + "\u1104,,\u11c2": "0x85", + "\u1105,,\u11a8": "0x85", + "\u1105,,\u11a9": "0x85", + "\u1105,,\u11aa": "0x85", + "\u1105,,\u11ab": "0x89", + "\u1105,,\u11ac": "0x85", + "\u1105,,\u11ad": "0x85", + "\u1105,,\u11ae": "0x85", + "\u1105,,\u11af": "0x85", + "\u1105,,\u11b0": "0x85", + "\u1105,,\u11b1": "0x85", + "\u1105,,\u11b2": "0x85", + "\u1105,,\u11b3": "0x85", + "\u1105,,\u11b4": "0x85", + "\u1105,,\u11b5": "0x85", + "\u1105,,\u11b6": "0x85", + "\u1105,,\u11b7": "0x85", + "\u1105,,\u11b8": "0x85", + "\u1105,,\u11b9": "0x85", + "\u1105,,\u11ba": "0x85", + "\u1105,,\u11bb": "0x85", + "\u1105,,\u11bc": "0x85", + "\u1105,,\u11bd": "0x85", + "\u1105,,\u11be": "0x85", + "\u1105,,\u11bf": "0x85", + "\u1105,,\u11c0": "0x85", + "\u1105,,\u11c1": "0x85", + "\u1105,,\u11c2": "0x85", + "\u1106,,\u11a8": "0x85", + "\u1106,,\u11a9": "0x85", + "\u1106,,\u11aa": "0x85", + "\u1106,,\u11ac": "0x85", + "\u1106,,\u11ad": "0x85", + "\u1106,,\u11ae": "0x85", + "\u1106,,\u11af": "0x85", + "\u1106,,\u11b0": "0x85", + "\u1106,,\u11b1": "0x85", + "\u1106,,\u11b2": "0x85", + "\u1106,,\u11b3": "0x85", + "\u1106,,\u11b4": "0x85", + "\u1106,,\u11b5": "0x85", + "\u1106,,\u11b6": "0x85", + "\u1106,,\u11b7": "0x85", + "\u1106,,\u11b8": "0x85", + "\u1106,,\u11b9": "0x85", + "\u1106,,\u11ba": "0x85", + "\u1106,,\u11bb": "0x85", + "\u1106,,\u11bc": "0x85", + "\u1106,,\u11bd": "0x85", + "\u1106,,\u11be": "0x85", + "\u1106,,\u11bf": "0x85", + "\u1106,,\u11c0": "0x85", + "\u1106,,\u11c1": "0x85", + "\u1106,,\u11c2": "0x85", + "\u1107,,\u11a8": "0x85", + "\u1107,,\u11a9": "0x85", + "\u1107,,\u11aa": "0x85", + "\u1107,,\u11ac": "0x85", + "\u1107,,\u11ad": "0x85", + "\u1107,,\u11ae": "0x85", + "\u1107,,\u11af": "0x85", + "\u1107,,\u11b0": "0x85", + "\u1107,,\u11b1": "0x85", + "\u1107,,\u11b2": "0x85", + "\u1107,,\u11b3": "0x85", + "\u1107,,\u11b4": "0x85", + "\u1107,,\u11b5": "0x85", + "\u1107,,\u11b6": "0x85", + "\u1107,,\u11b7": "0x85", + "\u1107,,\u11b8": "0x85", + "\u1107,,\u11b9": "0x85", + "\u1107,,\u11ba": "0x85", + "\u1107,,\u11bb": "0x85", + "\u1107,,\u11bc": "0x85", + "\u1107,,\u11bd": "0x85", + "\u1107,,\u11be": "0x85", + "\u1107,,\u11bf": "0x85", + "\u1107,,\u11c0": "0x85", + "\u1107,,\u11c1": "0x85", + "\u1107,,\u11c2": "0x85", + "\u1108,,\u11a8": "0x85", + "\u1108,,\u11a9": "0x85", + "\u1108,,\u11aa": "0x85", + "\u1108,,\u11ac": "0x85", + "\u1108,,\u11ad": "0x85", + "\u1108,,\u11ae": "0x85", + "\u1108,,\u11af": "0x85", + "\u1108,,\u11b0": "0x85", + "\u1108,,\u11b1": "0x85", + "\u1108,,\u11b2": "0x85", + "\u1108,,\u11b3": "0x85", + "\u1108,,\u11b4": "0x85", + "\u1108,,\u11b5": "0x85", + "\u1108,,\u11b6": "0x85", + "\u1108,,\u11b7": "0x85", + "\u1108,,\u11b8": "0x85", + "\u1108,,\u11b9": "0x85", + "\u1108,,\u11ba": "0x85", + "\u1108,,\u11bb": "0x85", + "\u1108,,\u11bc": "0x85", + "\u1108,,\u11bd": "0x85", + "\u1108,,\u11be": "0x85", + "\u1108,,\u11bf": "0x85", + "\u1108,,\u11c0": "0x85", + "\u1108,,\u11c1": "0x85", + "\u1108,,\u11c2": "0x85", + "\u1109,,\u11a8": "0x85", + "\u1109,,\u11a9": "0x85", + "\u1109,,\u11aa": "0x85", + "\u1109,,\u11ac": "0x85", + "\u1109,,\u11ad": "0x85", + "\u1109,,\u11ae": "0x85", + "\u1109,,\u11af": "0x85", + "\u1109,,\u11b0": "0x85", + "\u1109,,\u11b1": "0x85", + "\u1109,,\u11b2": "0x85", + "\u1109,,\u11b3": "0x85", + "\u1109,,\u11b4": "0x85", + "\u1109,,\u11b5": "0x85", + "\u1109,,\u11b6": "0x85", + "\u1109,,\u11b7": "0x85", + "\u1109,,\u11b8": "0x85", + "\u1109,,\u11b9": "0x85", + "\u1109,,\u11ba": "0x85", + "\u1109,,\u11bb": "0x85", + "\u1109,,\u11bc": "0x85", + "\u1109,,\u11bd": "0x85", + "\u1109,,\u11be": "0x85", + "\u1109,,\u11bf": "0x85", + "\u1109,,\u11c0": "0x85", + "\u1109,,\u11c1": "0x85", + "\u1109,,\u11c2": "0x85", + "\u110a,,\u11a8": "0x85", + "\u110a,,\u11a9": "0x85", + "\u110a,,\u11aa": "0x85", + "\u110a,,\u11ab": "0x89", + "\u110a,,\u11ac": "0x85", + "\u110a,,\u11ad": "0x85", + "\u110a,,\u11ae": "0x85", + "\u110a,,\u11af": "0x85", + "\u110a,,\u11b0": "0x85", + "\u110a,,\u11b1": "0x85", + "\u110a,,\u11b2": "0x85", + "\u110a,,\u11b3": "0x85", + "\u110a,,\u11b4": "0x85", + "\u110a,,\u11b5": "0x85", + "\u110a,,\u11b6": "0x85", + "\u110a,,\u11b7": "0x85", + "\u110a,,\u11b8": "0x85", + "\u110a,,\u11b9": "0x85", + "\u110a,,\u11ba": "0x85", + "\u110a,,\u11bb": "0x85", + "\u110a,,\u11bc": "0x85", + "\u110a,,\u11bd": "0x85", + "\u110a,,\u11be": "0x85", + "\u110a,,\u11bf": "0x85", + "\u110a,,\u11c0": "0x85", + "\u110a,,\u11c1": "0x85", + "\u110a,,\u11c2": "0x85", + "\u110b,,\u11a8": "0x85", + "\u110b,,\u11a9": "0x85", + "\u110b,,\u11aa": "0x85", + "\u110b,,\u11ac": "0x85", + "\u110b,,\u11ad": "0x85", + "\u110b,,\u11ae": "0x85", + "\u110b,,\u11af": "0x85", + "\u110b,,\u11b0": "0x85", + "\u110b,,\u11b1": "0x85", + "\u110b,,\u11b2": "0x85", + "\u110b,,\u11b3": "0x85", + "\u110b,,\u11b4": "0x85", + "\u110b,,\u11b5": "0x85", + "\u110b,,\u11b6": "0x85", + "\u110b,,\u11b7": "0x85", + "\u110b,,\u11b8": "0x85", + "\u110b,,\u11b9": "0x85", + "\u110b,,\u11ba": "0x85", + "\u110b,,\u11bb": "0x85", + "\u110b,,\u11bc": "0x85", + "\u110b,,\u11bd": "0x85", + "\u110b,,\u11be": "0x85", + "\u110b,,\u11bf": "0x85", + "\u110b,,\u11c0": "0x85", + "\u110b,,\u11c1": "0x85", + "\u110b,,\u11c2": "0x85", + "\u110c,,\u11a8": "0x85", + "\u110c,,\u11a9": "0x85", + "\u110c,,\u11aa": "0x85", + "\u110c,,\u11ac": "0x85", + "\u110c,,\u11ad": "0x85", + "\u110c,,\u11ae": "0x85", + "\u110c,,\u11af": "0x85", + "\u110c,,\u11b0": "0x85", + "\u110c,,\u11b1": "0x85", + "\u110c,,\u11b2": "0x85", + "\u110c,,\u11b3": "0x85", + "\u110c,,\u11b4": "0x85", + "\u110c,,\u11b5": "0x85", + "\u110c,,\u11b6": "0x85", + "\u110c,,\u11b7": "0x85", + "\u110c,,\u11b8": "0x85", + "\u110c,,\u11b9": "0x85", + "\u110c,,\u11ba": "0x85", + "\u110c,,\u11bb": "0x85", + "\u110c,,\u11bc": "0x85", + "\u110c,,\u11bd": "0x85", + "\u110c,,\u11be": "0x85", + "\u110c,,\u11bf": "0x85", + "\u110c,,\u11c0": "0x85", + "\u110c,,\u11c1": "0x85", + "\u110c,,\u11c2": "0x85", + "\u110d,,\u11a8": "0x85", + "\u110d,,\u11a9": "0x85", + "\u110d,,\u11aa": "0x85", + "\u110d,,\u11ab": "0x89", + "\u110d,,\u11ac": "0x85", + "\u110d,,\u11ad": "0x85", + "\u110d,,\u11ae": "0x85", + "\u110d,,\u11af": "0x85", + "\u110d,,\u11b0": "0x85", + "\u110d,,\u11b1": "0x85", + "\u110d,,\u11b2": "0x85", + "\u110d,,\u11b3": "0x85", + "\u110d,,\u11b4": "0x85", + "\u110d,,\u11b5": "0x85", + "\u110d,,\u11b6": "0x85", + "\u110d,,\u11b7": "0x85", + "\u110d,,\u11b8": "0x85", + "\u110d,,\u11b9": "0x85", + "\u110d,,\u11ba": "0x85", + "\u110d,,\u11bb": "0x85", + "\u110d,,\u11bc": "0x85", + "\u110d,,\u11bd": "0x85", + "\u110d,,\u11be": "0x85", + "\u110d,,\u11bf": "0x85", + "\u110d,,\u11c0": "0x85", + "\u110d,,\u11c1": "0x85", + "\u110d,,\u11c2": "0x85", + "\u110e,,\u11a8": "0x85", + "\u110e,,\u11a9": "0x85", + "\u110e,,\u11aa": "0x85", + "\u110e,,\u11ab": "0x89", + "\u110e,,\u11ac": "0x85", + "\u110e,,\u11ad": "0x85", + "\u110e,,\u11ae": "0x85", + "\u110e,,\u11af": "0x85", + "\u110e,,\u11b0": "0x85", + "\u110e,,\u11b1": "0x85", + "\u110e,,\u11b2": "0x85", + "\u110e,,\u11b3": "0x85", + "\u110e,,\u11b4": "0x85", + "\u110e,,\u11b5": "0x85", + "\u110e,,\u11b6": "0x85", + "\u110e,,\u11b7": "0x85", + "\u110e,,\u11b8": "0x85", + "\u110e,,\u11b9": "0x85", + "\u110e,,\u11ba": "0x85", + "\u110e,,\u11bb": "0x85", + "\u110e,,\u11bc": "0x85", + "\u110e,,\u11bd": "0x85", + "\u110e,,\u11be": "0x85", + "\u110e,,\u11bf": "0x85", + "\u110e,,\u11c0": "0x85", + "\u110e,,\u11c1": "0x85", + "\u110e,,\u11c2": "0x85", + "\u110f,,\u11a8": "0x85", + "\u110f,,\u11a9": "0x85", + "\u110f,,\u11aa": "0x85", + "\u110f,,\u11ab": "0x89", + "\u110f,,\u11ac": "0x85", + "\u110f,,\u11ad": "0x85", + "\u110f,,\u11ae": "0x85", + "\u110f,,\u11b0": "0x85", + "\u110f,,\u11b1": "0x85", + "\u110f,,\u11b2": "0x85", + "\u110f,,\u11b3": "0x85", + "\u110f,,\u11b4": "0x85", + "\u110f,,\u11b5": "0x85", + "\u110f,,\u11b6": "0x85", + "\u110f,,\u11b7": "0x85", + "\u110f,,\u11b8": "0x85", + "\u110f,,\u11b9": "0x85", + "\u110f,,\u11ba": "0x85", + "\u110f,,\u11bb": "0x85", + "\u110f,,\u11bc": "0x85", + "\u110f,,\u11bd": "0x85", + "\u110f,,\u11be": "0x85", + "\u110f,,\u11bf": "0x85", + "\u110f,,\u11c0": "0x85", + "\u110f,,\u11c1": "0x85", + "\u110f,,\u11c2": "0x85", + "\u1110,,\u11a8": "0x85", + "\u1110,,\u11a9": "0x85", + "\u1110,,\u11aa": "0x85", + "\u1110,,\u11ab": "0x89", + "\u1110,,\u11ac": "0x85", + "\u1110,,\u11ad": "0x85", + "\u1110,,\u11ae": "0x85", + "\u1110,,\u11af": "0x85", + "\u1110,,\u11b0": "0x85", + "\u1110,,\u11b1": "0x85", + "\u1110,,\u11b2": "0x85", + "\u1110,,\u11b3": "0x85", + "\u1110,,\u11b4": "0x85", + "\u1110,,\u11b5": "0x85", + "\u1110,,\u11b6": "0x85", + "\u1110,,\u11b7": "0x85", + "\u1110,,\u11b8": "0x85", + "\u1110,,\u11b9": "0x85", + "\u1110,,\u11ba": "0x85", + "\u1110,,\u11bb": "0x85", + "\u1110,,\u11bc": "0x85", + "\u1110,,\u11bd": "0x85", + "\u1110,,\u11be": "0x85", + "\u1110,,\u11bf": "0x85", + "\u1110,,\u11c0": "0x85", + "\u1110,,\u11c1": "0x85", + "\u1110,,\u11c2": "0x85", + "\u1111,,\u11a8": "0x85", + "\u1111,,\u11a9": "0x85", + "\u1111,,\u11aa": "0x85", + "\u1111,,\u11ab": "0x89", + "\u1111,,\u11ac": "0x85", + "\u1111,,\u11ad": "0x85", + "\u1111,,\u11ae": "0x85", + "\u1111,,\u11af": "0x85", + "\u1111,,\u11b0": "0x85", + "\u1111,,\u11b1": "0x85", + "\u1111,,\u11b2": "0x85", + "\u1111,,\u11b3": "0x85", + "\u1111,,\u11b4": "0x85", + "\u1111,,\u11b5": "0x85", + "\u1111,,\u11b6": "0x85", + "\u1111,,\u11b7": "0x85", + "\u1111,,\u11b8": "0x85", + "\u1111,,\u11b9": "0x85", + "\u1111,,\u11ba": "0x85", + "\u1111,,\u11bb": "0x85", + "\u1111,,\u11bc": "0x85", + "\u1111,,\u11bd": "0x85", + "\u1111,,\u11be": "0x85", + "\u1111,,\u11bf": "0x85", + "\u1111,,\u11c0": "0x85", + "\u1111,,\u11c1": "0x85", + "\u1111,,\u11c2": "0x85", + "\u1112,,\u11a8": "0x85", + "\u1112,,\u11a9": "0x85", + "\u1112,,\u11aa": "0x85", + "\u1112,,\u11ab": "0x89", + "\u1112,,\u11ac": "0x85", + "\u1112,,\u11ad": "0x85", + "\u1112,,\u11ae": "0x85", + "\u1112,,\u11af": "0x85", + "\u1112,,\u11b0": "0x85", + "\u1112,,\u11b1": "0x85", + "\u1112,,\u11b2": "0x85", + "\u1112,,\u11b3": "0x85", + "\u1112,,\u11b4": "0x85", + "\u1112,,\u11b5": "0x85", + "\u1112,,\u11b6": "0x85", + "\u1112,,\u11b7": "0x85", + "\u1112,,\u11b8": "0x85", + "\u1112,,\u11b9": "0x85", + "\u1112,,\u11ba": "0x85", + "\u1112,,\u11bb": "0x85", + "\u1112,,\u11bc": "0x85", + "\u1112,,\u11bd": "0x85", + "\u1112,,\u11be": "0x85", + "\u1112,,\u11bf": "0x85", + "\u1112,,\u11c0": "0x85", + "\u1112,,\u11c1": "0x85", + "\u1112,,\u11c2": "0x85" + } + }, + null + ], + "\u1172": [ + null, + { + "defaultGlyph": "0x88", + "alternatives": { + "\u110f,": "0x6f", + "\u1102,": "0x6f", + "\u1104,": "0x6f", + "\u1105,": "0x6f", + "\u1106,": "0x6f", + "\u1107,": "0x6f", + "\u1108,": "0x6f", + "\u1109,": "0x6f", + "\u110a,": "0x6f", + "\u110b,": "0x6f", + "\u110c,": "0x6f", + "\u110d,": "0x6f", + "\u110e,": "0x6f", + "\u1110,": "0x6f", + "\u1111,": "0x6f", + "\u1112,": "0x6f" + } + }, + null, + null, + { + "defaultGlyph": "0x86", + "alternatives": { + "\u1100,,\u11ab": "0x8a", + "\u1101,,\u11ab": "0x8a", + "\u1102,,\u11ab": "0x8a", + "\u1103,,\u11ab": "0x8a", + "\u1104,,\u11ab": "0x8a", + "\u1105,,\u11ab": "0x8a", + "\u1106,,\u11ab": "0x8a", + "\u1107,,\u11ab": "0x8a", + "\u1108,,\u11ab": "0x8a", + "\u1109,,\u11ab": "0x8a", + "\u110a,,\u11ab": "0x8a", + "\u110b,,\u11ab": "0x8a", + "\u110c,,\u11ab": "0x8a", + "\u110d,,\u11ab": "0x8a", + "\u110e,,\u11ab": "0x8a", + "\u110f,,\u11ab": "0x8a", + "\u1110,,\u11ab": "0x8a", + "\u1111,,\u11ab": "0x8a", + "\u1112,,\u11ab": "0x8a" + } + }, + null + ], + "\u1173": [ + null, + { + "defaultGlyph": "0x84", + "alternatives": { + "\u1100,": "0x6d", + "\u110f,": "0x6d", + "\u1101,": "0x6d", + "\u1102,": "0x6d", + "\u1109,": "0x81", + "\u1110,": "0x6d", + "\u1112,": "0x6d" + } + }, + null, + null, + { + "defaultGlyph": "0x81", + "alternatives": { + "\u1110,,\u11ab": "0x84", + "\u110b,,\u11ab": "0x84", + "\u1107,,\u11ab": "0x84", + "\u1105,,\u11ab": "0x84", + "\u1108,,\u11ab": "0x84", + "\u1109,,\u11ab": "0x84", + "\u1103,,\u11ab": "0x84", + "\u110c,,\u11ab": "0x84", + "\u1111,,\u11ab": "0x84", + "\u1112,,\u11ab": "0x84", + "\u1100,,\u11b8": "0x84", + "\u1102,,\u11bc": "0x84", + "\u1100,,\u11b7": "0x84", + "\u110f,,\u11af": "0x84", + "\u1101,,\u11c0": "0x84", + "\u1101,,\u11b7": "0x84", + "\u1102,,\u11af": "0x84", + "\u1102,,\u11b0": "0x84", + "\u110f,,\u11b7": "0x84", + "\u1102,,\u11bd": "0x84", + "\u1101,,\u11af": "0x84", + "\u1100,,\u11ba": "0x84", + "\u1100,,\u11af": "0x84", + "\u1100,,\u11b0": "0x84", + "\u1100,,\u11a8": "0x84", + "\u110f,,\u11ab": "0x84", + "\u1102,,\u11ab": "0x84", + "\u1101,,\u11ab": "0x84", + "\u1100,,\u11ab": "0x84", + "\u1100,,\u11a9": "0x84", + "\u1100,,\u11aa": "0x84", + "\u1100,,\u11ac": "0x84", + "\u1100,,\u11ad": "0x84", + "\u1100,,\u11ae": "0x84", + "\u1100,,\u11b1": "0x84", + "\u1100,,\u11b2": "0x84", + "\u1100,,\u11b3": "0x84", + "\u1100,,\u11b4": "0x84", + "\u1100,,\u11b5": "0x84", + "\u1100,,\u11b6": "0x84", + "\u1100,,\u11b9": "0x84", + "\u1100,,\u11bb": "0x84", + "\u1100,,\u11bc": "0x84", + "\u1100,,\u11bd": "0x84", + "\u1100,,\u11be": "0x84", + "\u1100,,\u11bf": "0x84", + "\u1100,,\u11c0": "0x84", + "\u1100,,\u11c1": "0x84", + "\u1100,,\u11c2": "0x84", + "\u1101,,\u11a8": "0x84", + "\u1101,,\u11a9": "0x84", + "\u1101,,\u11aa": "0x84", + "\u1101,,\u11ac": "0x84", + "\u1101,,\u11ad": "0x84", + "\u1101,,\u11ae": "0x84", + "\u1101,,\u11b0": "0x84", + "\u1101,,\u11b1": "0x84", + "\u1101,,\u11b2": "0x84", + "\u1101,,\u11b3": "0x84", + "\u1101,,\u11b4": "0x84", + "\u1101,,\u11b5": "0x84", + "\u1101,,\u11b6": "0x84", + "\u1101,,\u11b8": "0x84", + "\u1101,,\u11b9": "0x84", + "\u1101,,\u11ba": "0x84", + "\u1101,,\u11bb": "0x84", + "\u1101,,\u11bc": "0x84", + "\u1101,,\u11bd": "0x84", + "\u1101,,\u11be": "0x84", + "\u1101,,\u11bf": "0x84", + "\u1101,,\u11c1": "0x84", + "\u1101,,\u11c2": "0x84", + "\u1102,,\u11a8": "0x84", + "\u1102,,\u11a9": "0x84", + "\u1102,,\u11aa": "0x84", + "\u1102,,\u11ac": "0x84", + "\u1102,,\u11ad": "0x84", + "\u1102,,\u11ae": "0x84", + "\u1102,,\u11b1": "0x84", + "\u1102,,\u11b2": "0x84", + "\u1102,,\u11b3": "0x84", + "\u1102,,\u11b4": "0x84", + "\u1102,,\u11b5": "0x84", + "\u1102,,\u11b6": "0x84", + "\u1102,,\u11b7": "0x84", + "\u1102,,\u11b8": "0x84", + "\u1102,,\u11b9": "0x84", + "\u1102,,\u11ba": "0x84", + "\u1102,,\u11bb": "0x84", + "\u1102,,\u11be": "0x84", + "\u1102,,\u11bf": "0x84", + "\u1102,,\u11c0": "0x84", + "\u1102,,\u11c1": "0x84", + "\u1102,,\u11c2": "0x84", + "\u1103,,\u11a8": "0x84", + "\u1103,,\u11a9": "0x84", + "\u1103,,\u11aa": "0x84", + "\u1103,,\u11ac": "0x84", + "\u1103,,\u11ad": "0x84", + "\u1103,,\u11ae": "0x84", + "\u1103,,\u11af": "0x84", + "\u1103,,\u11b0": "0x84", + "\u1103,,\u11b1": "0x84", + "\u1103,,\u11b2": "0x84", + "\u1103,,\u11b3": "0x84", + "\u1103,,\u11b4": "0x84", + "\u1103,,\u11b5": "0x84", + "\u1103,,\u11b6": "0x84", + "\u1103,,\u11b7": "0x84", + "\u1103,,\u11b8": "0x84", + "\u1103,,\u11b9": "0x84", + "\u1103,,\u11ba": "0x84", + "\u1103,,\u11bb": "0x84", + "\u1103,,\u11bc": "0x84", + "\u1103,,\u11bd": "0x84", + "\u1103,,\u11be": "0x84", + "\u1103,,\u11bf": "0x84", + "\u1103,,\u11c0": "0x84", + "\u1103,,\u11c1": "0x84", + "\u1103,,\u11c2": "0x84", + "\u1104,,\u11a8": "0x84", + "\u1104,,\u11a9": "0x84", + "\u1104,,\u11aa": "0x84", + "\u1104,,\u11ab": "0x84", + "\u1104,,\u11ac": "0x84", + "\u1104,,\u11ad": "0x84", + "\u1104,,\u11ae": "0x84", + "\u1104,,\u11af": "0x84", + "\u1104,,\u11b0": "0x84", + "\u1104,,\u11b1": "0x84", + "\u1104,,\u11b2": "0x84", + "\u1104,,\u11b3": "0x84", + "\u1104,,\u11b4": "0x84", + "\u1104,,\u11b5": "0x84", + "\u1104,,\u11b6": "0x84", + "\u1104,,\u11b7": "0x84", + "\u1104,,\u11b8": "0x84", + "\u1104,,\u11b9": "0x84", + "\u1104,,\u11ba": "0x84", + "\u1104,,\u11bb": "0x84", + "\u1104,,\u11bc": "0x84", + "\u1104,,\u11bd": "0x84", + "\u1104,,\u11be": "0x84", + "\u1104,,\u11bf": "0x84", + "\u1104,,\u11c0": "0x84", + "\u1104,,\u11c1": "0x84", + "\u1104,,\u11c2": "0x84", + "\u1105,,\u11a8": "0x84", + "\u1105,,\u11a9": "0x84", + "\u1105,,\u11aa": "0x84", + "\u1105,,\u11ac": "0x84", + "\u1105,,\u11ad": "0x84", + "\u1105,,\u11ae": "0x84", + "\u1105,,\u11af": "0x84", + "\u1105,,\u11b0": "0x84", + "\u1105,,\u11b1": "0x84", + "\u1105,,\u11b2": "0x84", + "\u1105,,\u11b3": "0x84", + "\u1105,,\u11b4": "0x84", + "\u1105,,\u11b5": "0x84", + "\u1105,,\u11b6": "0x84", + "\u1105,,\u11b7": "0x84", + "\u1105,,\u11b8": "0x84", + "\u1105,,\u11b9": "0x84", + "\u1105,,\u11ba": "0x84", + "\u1105,,\u11bb": "0x84", + "\u1105,,\u11bc": "0x84", + "\u1105,,\u11bd": "0x84", + "\u1105,,\u11be": "0x84", + "\u1105,,\u11bf": "0x84", + "\u1105,,\u11c0": "0x84", + "\u1105,,\u11c1": "0x84", + "\u1105,,\u11c2": "0x84", + "\u1106,,\u11a8": "0x84", + "\u1106,,\u11a9": "0x84", + "\u1106,,\u11aa": "0x84", + "\u1106,,\u11ab": "0x84", + "\u1106,,\u11ac": "0x84", + "\u1106,,\u11ad": "0x84", + "\u1106,,\u11ae": "0x84", + "\u1106,,\u11af": "0x84", + "\u1106,,\u11b0": "0x84", + "\u1106,,\u11b1": "0x84", + "\u1106,,\u11b2": "0x84", + "\u1106,,\u11b3": "0x84", + "\u1106,,\u11b4": "0x84", + "\u1106,,\u11b5": "0x84", + "\u1106,,\u11b6": "0x84", + "\u1106,,\u11b7": "0x84", + "\u1106,,\u11b8": "0x84", + "\u1106,,\u11b9": "0x84", + "\u1106,,\u11ba": "0x84", + "\u1106,,\u11bb": "0x84", + "\u1106,,\u11bc": "0x84", + "\u1106,,\u11bd": "0x84", + "\u1106,,\u11be": "0x84", + "\u1106,,\u11bf": "0x84", + "\u1106,,\u11c0": "0x84", + "\u1106,,\u11c1": "0x84", + "\u1106,,\u11c2": "0x84", + "\u1107,,\u11a8": "0x84", + "\u1107,,\u11a9": "0x84", + "\u1107,,\u11aa": "0x84", + "\u1107,,\u11ac": "0x84", + "\u1107,,\u11ad": "0x84", + "\u1107,,\u11ae": "0x84", + "\u1107,,\u11af": "0x84", + "\u1107,,\u11b0": "0x84", + "\u1107,,\u11b1": "0x84", + "\u1107,,\u11b2": "0x84", + "\u1107,,\u11b3": "0x84", + "\u1107,,\u11b4": "0x84", + "\u1107,,\u11b5": "0x84", + "\u1107,,\u11b6": "0x84", + "\u1107,,\u11b7": "0x84", + "\u1107,,\u11b8": "0x84", + "\u1107,,\u11b9": "0x84", + "\u1107,,\u11ba": "0x84", + "\u1107,,\u11bb": "0x84", + "\u1107,,\u11bc": "0x84", + "\u1107,,\u11bd": "0x84", + "\u1107,,\u11be": "0x84", + "\u1107,,\u11bf": "0x84", + "\u1107,,\u11c0": "0x84", + "\u1107,,\u11c1": "0x84", + "\u1107,,\u11c2": "0x84", + "\u1108,,\u11a8": "0x84", + "\u1108,,\u11a9": "0x84", + "\u1108,,\u11aa": "0x84", + "\u1108,,\u11ac": "0x84", + "\u1108,,\u11ad": "0x84", + "\u1108,,\u11ae": "0x84", + "\u1108,,\u11af": "0x84", + "\u1108,,\u11b0": "0x84", + "\u1108,,\u11b1": "0x84", + "\u1108,,\u11b2": "0x84", + "\u1108,,\u11b3": "0x84", + "\u1108,,\u11b4": "0x84", + "\u1108,,\u11b5": "0x84", + "\u1108,,\u11b6": "0x84", + "\u1108,,\u11b7": "0x84", + "\u1108,,\u11b8": "0x84", + "\u1108,,\u11b9": "0x84", + "\u1108,,\u11ba": "0x84", + "\u1108,,\u11bb": "0x84", + "\u1108,,\u11bc": "0x84", + "\u1108,,\u11bd": "0x84", + "\u1108,,\u11be": "0x84", + "\u1108,,\u11bf": "0x84", + "\u1108,,\u11c0": "0x84", + "\u1108,,\u11c1": "0x84", + "\u1108,,\u11c2": "0x84", + "\u1109,,\u11a8": "0x84", + "\u1109,,\u11a9": "0x84", + "\u1109,,\u11aa": "0x84", + "\u1109,,\u11ac": "0x84", + "\u1109,,\u11ad": "0x84", + "\u1109,,\u11ae": "0x84", + "\u1109,,\u11af": "0x84", + "\u1109,,\u11b0": "0x84", + "\u1109,,\u11b1": "0x84", + "\u1109,,\u11b2": "0x84", + "\u1109,,\u11b3": "0x84", + "\u1109,,\u11b4": "0x84", + "\u1109,,\u11b5": "0x84", + "\u1109,,\u11b6": "0x84", + "\u1109,,\u11b7": "0x84", + "\u1109,,\u11b8": "0x84", + "\u1109,,\u11b9": "0x84", + "\u1109,,\u11ba": "0x84", + "\u1109,,\u11bb": "0x84", + "\u1109,,\u11bc": "0x84", + "\u1109,,\u11bd": "0x84", + "\u1109,,\u11be": "0x84", + "\u1109,,\u11bf": "0x84", + "\u1109,,\u11c0": "0x84", + "\u1109,,\u11c1": "0x84", + "\u1109,,\u11c2": "0x84", + "\u110a,,\u11a8": "0x84", + "\u110a,,\u11a9": "0x84", + "\u110a,,\u11aa": "0x84", + "\u110a,,\u11ab": "0x84", + "\u110a,,\u11ac": "0x84", + "\u110a,,\u11ad": "0x84", + "\u110a,,\u11ae": "0x84", + "\u110a,,\u11af": "0x84", + "\u110a,,\u11b0": "0x84", + "\u110a,,\u11b1": "0x84", + "\u110a,,\u11b2": "0x84", + "\u110a,,\u11b3": "0x84", + "\u110a,,\u11b4": "0x84", + "\u110a,,\u11b5": "0x84", + "\u110a,,\u11b6": "0x84", + "\u110a,,\u11b7": "0x84", + "\u110a,,\u11b8": "0x84", + "\u110a,,\u11b9": "0x84", + "\u110a,,\u11ba": "0x84", + "\u110a,,\u11bb": "0x84", + "\u110a,,\u11bc": "0x84", + "\u110a,,\u11bd": "0x84", + "\u110a,,\u11be": "0x84", + "\u110a,,\u11bf": "0x84", + "\u110a,,\u11c0": "0x84", + "\u110a,,\u11c1": "0x84", + "\u110a,,\u11c2": "0x84", + "\u110b,,\u11a8": "0x84", + "\u110b,,\u11a9": "0x84", + "\u110b,,\u11aa": "0x84", + "\u110b,,\u11ac": "0x84", + "\u110b,,\u11ad": "0x84", + "\u110b,,\u11ae": "0x84", + "\u110b,,\u11af": "0x84", + "\u110b,,\u11b0": "0x84", + "\u110b,,\u11b1": "0x84", + "\u110b,,\u11b2": "0x84", + "\u110b,,\u11b3": "0x84", + "\u110b,,\u11b4": "0x84", + "\u110b,,\u11b5": "0x84", + "\u110b,,\u11b6": "0x84", + "\u110b,,\u11b7": "0x84", + "\u110b,,\u11b8": "0x84", + "\u110b,,\u11b9": "0x84", + "\u110b,,\u11ba": "0x84", + "\u110b,,\u11bb": "0x84", + "\u110b,,\u11bc": "0x84", + "\u110b,,\u11bd": "0x84", + "\u110b,,\u11be": "0x84", + "\u110b,,\u11bf": "0x84", + "\u110b,,\u11c0": "0x84", + "\u110b,,\u11c1": "0x84", + "\u110b,,\u11c2": "0x84", + "\u110c,,\u11a8": "0x84", + "\u110c,,\u11a9": "0x84", + "\u110c,,\u11aa": "0x84", + "\u110c,,\u11ac": "0x84", + "\u110c,,\u11ad": "0x84", + "\u110c,,\u11ae": "0x84", + "\u110c,,\u11af": "0x84", + "\u110c,,\u11b0": "0x84", + "\u110c,,\u11b1": "0x84", + "\u110c,,\u11b2": "0x84", + "\u110c,,\u11b3": "0x84", + "\u110c,,\u11b4": "0x84", + "\u110c,,\u11b5": "0x84", + "\u110c,,\u11b6": "0x84", + "\u110c,,\u11b7": "0x84", + "\u110c,,\u11b8": "0x84", + "\u110c,,\u11b9": "0x84", + "\u110c,,\u11ba": "0x84", + "\u110c,,\u11bb": "0x84", + "\u110c,,\u11bc": "0x84", + "\u110c,,\u11bd": "0x84", + "\u110c,,\u11be": "0x84", + "\u110c,,\u11bf": "0x84", + "\u110c,,\u11c0": "0x84", + "\u110c,,\u11c1": "0x84", + "\u110c,,\u11c2": "0x84", + "\u110d,,\u11a8": "0x84", + "\u110d,,\u11a9": "0x84", + "\u110d,,\u11aa": "0x84", + "\u110d,,\u11ab": "0x84", + "\u110d,,\u11ac": "0x84", + "\u110d,,\u11ad": "0x84", + "\u110d,,\u11ae": "0x84", + "\u110d,,\u11af": "0x84", + "\u110d,,\u11b0": "0x84", + "\u110d,,\u11b1": "0x84", + "\u110d,,\u11b2": "0x84", + "\u110d,,\u11b3": "0x84", + "\u110d,,\u11b4": "0x84", + "\u110d,,\u11b5": "0x84", + "\u110d,,\u11b6": "0x84", + "\u110d,,\u11b7": "0x84", + "\u110d,,\u11b8": "0x84", + "\u110d,,\u11b9": "0x84", + "\u110d,,\u11ba": "0x84", + "\u110d,,\u11bb": "0x84", + "\u110d,,\u11bc": "0x84", + "\u110d,,\u11bd": "0x84", + "\u110d,,\u11be": "0x84", + "\u110d,,\u11bf": "0x84", + "\u110d,,\u11c0": "0x84", + "\u110d,,\u11c1": "0x84", + "\u110d,,\u11c2": "0x84", + "\u110e,,\u11a8": "0x84", + "\u110e,,\u11a9": "0x84", + "\u110e,,\u11aa": "0x84", + "\u110e,,\u11ab": "0x84", + "\u110e,,\u11ac": "0x84", + "\u110e,,\u11ad": "0x84", + "\u110e,,\u11ae": "0x84", + "\u110e,,\u11af": "0x84", + "\u110e,,\u11b0": "0x84", + "\u110e,,\u11b1": "0x84", + "\u110e,,\u11b2": "0x84", + "\u110e,,\u11b3": "0x84", + "\u110e,,\u11b4": "0x84", + "\u110e,,\u11b5": "0x84", + "\u110e,,\u11b6": "0x84", + "\u110e,,\u11b7": "0x84", + "\u110e,,\u11b8": "0x84", + "\u110e,,\u11b9": "0x84", + "\u110e,,\u11ba": "0x84", + "\u110e,,\u11bb": "0x84", + "\u110e,,\u11bc": "0x84", + "\u110e,,\u11bd": "0x84", + "\u110e,,\u11be": "0x84", + "\u110e,,\u11bf": "0x84", + "\u110e,,\u11c0": "0x84", + "\u110e,,\u11c1": "0x84", + "\u110e,,\u11c2": "0x84", + "\u110f,,\u11a8": "0x84", + "\u110f,,\u11a9": "0x84", + "\u110f,,\u11aa": "0x84", + "\u110f,,\u11ac": "0x84", + "\u110f,,\u11ad": "0x84", + "\u110f,,\u11ae": "0x84", + "\u110f,,\u11b0": "0x84", + "\u110f,,\u11b1": "0x84", + "\u110f,,\u11b2": "0x84", + "\u110f,,\u11b3": "0x84", + "\u110f,,\u11b4": "0x84", + "\u110f,,\u11b5": "0x84", + "\u110f,,\u11b6": "0x84", + "\u110f,,\u11b8": "0x84", + "\u110f,,\u11b9": "0x84", + "\u110f,,\u11ba": "0x84", + "\u110f,,\u11bb": "0x84", + "\u110f,,\u11bc": "0x84", + "\u110f,,\u11bd": "0x84", + "\u110f,,\u11be": "0x84", + "\u110f,,\u11bf": "0x84", + "\u110f,,\u11c0": "0x84", + "\u110f,,\u11c1": "0x84", + "\u110f,,\u11c2": "0x84", + "\u1110,,\u11a8": "0x84", + "\u1110,,\u11a9": "0x84", + "\u1110,,\u11aa": "0x84", + "\u1110,,\u11ac": "0x84", + "\u1110,,\u11ad": "0x84", + "\u1110,,\u11ae": "0x84", + "\u1110,,\u11af": "0x84", + "\u1110,,\u11b0": "0x84", + "\u1110,,\u11b1": "0x84", + "\u1110,,\u11b2": "0x84", + "\u1110,,\u11b3": "0x84", + "\u1110,,\u11b4": "0x84", + "\u1110,,\u11b5": "0x84", + "\u1110,,\u11b6": "0x84", + "\u1110,,\u11b7": "0x84", + "\u1110,,\u11b8": "0x84", + "\u1110,,\u11b9": "0x84", + "\u1110,,\u11ba": "0x84", + "\u1110,,\u11bb": "0x84", + "\u1110,,\u11bc": "0x84", + "\u1110,,\u11bd": "0x84", + "\u1110,,\u11be": "0x84", + "\u1110,,\u11bf": "0x84", + "\u1110,,\u11c0": "0x84", + "\u1110,,\u11c1": "0x84", + "\u1110,,\u11c2": "0x84", + "\u1111,,\u11a8": "0x84", + "\u1111,,\u11a9": "0x84", + "\u1111,,\u11aa": "0x84", + "\u1111,,\u11ac": "0x84", + "\u1111,,\u11ad": "0x84", + "\u1111,,\u11ae": "0x84", + "\u1111,,\u11af": "0x84", + "\u1111,,\u11b0": "0x84", + "\u1111,,\u11b1": "0x84", + "\u1111,,\u11b2": "0x84", + "\u1111,,\u11b3": "0x84", + "\u1111,,\u11b4": "0x84", + "\u1111,,\u11b5": "0x84", + "\u1111,,\u11b6": "0x84", + "\u1111,,\u11b7": "0x84", + "\u1111,,\u11b8": "0x84", + "\u1111,,\u11b9": "0x84", + "\u1111,,\u11ba": "0x84", + "\u1111,,\u11bb": "0x84", + "\u1111,,\u11bc": "0x84", + "\u1111,,\u11bd": "0x84", + "\u1111,,\u11be": "0x84", + "\u1111,,\u11bf": "0x84", + "\u1111,,\u11c0": "0x84", + "\u1111,,\u11c1": "0x84", + "\u1111,,\u11c2": "0x84", + "\u1112,,\u11a8": "0x84", + "\u1112,,\u11a9": "0x84", + "\u1112,,\u11aa": "0x84", + "\u1112,,\u11ac": "0x84", + "\u1112,,\u11ad": "0x84", + "\u1112,,\u11ae": "0x84", + "\u1112,,\u11af": "0x84", + "\u1112,,\u11b0": "0x84", + "\u1112,,\u11b1": "0x84", + "\u1112,,\u11b2": "0x84", + "\u1112,,\u11b3": "0x84", + "\u1112,,\u11b4": "0x84", + "\u1112,,\u11b5": "0x84", + "\u1112,,\u11b6": "0x84", + "\u1112,,\u11b7": "0x84", + "\u1112,,\u11b8": "0x84", + "\u1112,,\u11b9": "0x84", + "\u1112,,\u11ba": "0x84", + "\u1112,,\u11bb": "0x84", + "\u1112,,\u11bc": "0x84", + "\u1112,,\u11bd": "0x84", + "\u1112,,\u11be": "0x84", + "\u1112,,\u11bf": "0x84", + "\u1112,,\u11c0": "0x84", + "\u1112,,\u11c1": "0x84", + "\u1112,,\u11c2": "0x84" + } + }, + null + ], + "\u116a": [ + null, + null, + { + "defaultGlyph": "0xa4,0xa8", + "alternatives": { + "\u1100,": "0x8e,0xa8", + "\u1101,": "0x8e,0xa8" + } + }, + null, + null, + { + "defaultGlyph": "0xa2,0xa6", + "alternatives": { + "\u110b,,\u11ab": "0xa4,0xa8", + "\u1112,,\u11ab": "0xa4,0xa8", + "\u1100,,\u11bc": "0x8e,0xa6", + "\u1100,,\u11ab": "0x8e,0xa8", + "\u110f,,\u11ab": "0x8e,0xa8", + "\u1101,,\u11bc": "0x8f,0xa6", + "\u1101,,\u11a8": "0x8f,0xa6", + "\u1100,,\u11a8": "0x8e,0xa6", + "\u1100,,\u11a9": "0x8e,0xa6", + "\u1100,,\u11aa": "0x8e,0xa6", + "\u1100,,\u11ac": "0x8e,0xa6", + "\u1100,,\u11ad": "0x8e,0xa6", + "\u1100,,\u11ae": "0x8e,0xa6", + "\u1100,,\u11af": "0x8e,0xa6", + "\u1100,,\u11b0": "0x8e,0xa6", + "\u1100,,\u11b1": "0x8e,0xa6", + "\u1100,,\u11b2": "0x8e,0xa6", + "\u1100,,\u11b3": "0x8e,0xa6", + "\u1100,,\u11b4": "0x8e,0xa6", + "\u1100,,\u11b5": "0x8e,0xa6", + "\u1100,,\u11b6": "0x8e,0xa6", + "\u1100,,\u11b7": "0x8e,0xa6", + "\u1100,,\u11b8": "0x8e,0xa6", + "\u1100,,\u11b9": "0x8e,0xa6", + "\u1100,,\u11ba": "0x8e,0xa6", + "\u1100,,\u11bb": "0x8e,0xa6", + "\u1100,,\u11bd": "0x8e,0xa6", + "\u1100,,\u11be": "0x8e,0xa6", + "\u1100,,\u11bf": "0x8e,0xa6", + "\u1100,,\u11c0": "0x8e,0xa6", + "\u1100,,\u11c1": "0x8e,0xa6", + "\u1100,,\u11c2": "0x8e,0xa6", + "\u1101,,\u11a9": "0x8f,0xa6", + "\u1101,,\u11aa": "0x8f,0xa6", + "\u1101,,\u11ab": "0x8f,0xa8", + "\u1101,,\u11ac": "0x8f,0xa6", + "\u1101,,\u11ad": "0x8f,0xa6", + "\u1101,,\u11ae": "0x8f,0xa6", + "\u1101,,\u11af": "0x8f,0xa6", + "\u1101,,\u11b0": "0x8f,0xa6", + "\u1101,,\u11b1": "0x8f,0xa6", + "\u1101,,\u11b2": "0x8f,0xa6", + "\u1101,,\u11b3": "0x8f,0xa6", + "\u1101,,\u11b4": "0x8f,0xa6", + "\u1101,,\u11b5": "0x8f,0xa6", + "\u1101,,\u11b6": "0x8f,0xa6", + "\u1101,,\u11b7": "0x8f,0xa6", + "\u1101,,\u11b8": "0x8f,0xa6", + "\u1101,,\u11b9": "0x8f,0xa6", + "\u1101,,\u11ba": "0x8f,0xa6", + "\u1101,,\u11bb": "0x8f,0xa6", + "\u1101,,\u11bd": "0x8f,0xa6", + "\u1101,,\u11be": "0x8f,0xa6", + "\u1101,,\u11bf": "0x8f,0xa6", + "\u1101,,\u11c0": "0x8f,0xa6", + "\u1101,,\u11c1": "0x8f,0xa6", + "\u1101,,\u11c2": "0x8f,0xa6" + } + } + ], + "\u116b": [ + null, + null, + { + "defaultGlyph": "0xc2", + "alternatives": { + "\u1101,": "0x64" + } + }, + null, + null, + { + "defaultGlyph": "0xc1", + "alternatives": { + "\u1103,,\u11bb": "0xc1", + "\u1100,,\u11ab": "0x8e,0x46", + "\u1101,,\u11ab": "0x64", + "\u1102,,\u11ab": "0xc2", + "\u1103,,\u11ab": "0xc2", + "\u1104,,\u11ab": "0xc2", + "\u1105,,\u11ab": "0xc2", + "\u1106,,\u11ab": "0xc2", + "\u1107,,\u11ab": "0xc2", + "\u1108,,\u11ab": "0xc2", + "\u1109,,\u11ab": "0xc2", + "\u110a,,\u11ab": "0xc2", + "\u110b,,\u11ab": "0xc2", + "\u110c,,\u11ab": "0xc2", + "\u110d,,\u11ab": "0xc2", + "\u110e,,\u11ab": "0xc2", + "\u110f,,\u11ab": "0xc2", + "\u1110,,\u11ab": "0xc2", + "\u1111,,\u11ab": "0xc2", + "\u1112,,\u11ab": "0xc2", + "\u1100,,\u11a8": "0x8e,0x42", + "\u1100,,\u11a9": "0x8e,0x42", + "\u1100,,\u11aa": "0x8e,0x42", + "\u1100,,\u11ac": "0x8e,0x42", + "\u1100,,\u11ad": "0x8e,0x42", + "\u1100,,\u11ae": "0x8e,0x42", + "\u1100,,\u11af": "0x8e,0x42", + "\u1100,,\u11b0": "0x8e,0x42", + "\u1100,,\u11b1": "0x8e,0x42", + "\u1100,,\u11b2": "0x8e,0x42", + "\u1100,,\u11b3": "0x8e,0x42", + "\u1100,,\u11b4": "0x8e,0x42", + "\u1100,,\u11b5": "0x8e,0x42", + "\u1100,,\u11b6": "0x8e,0x42", + "\u1100,,\u11b7": "0x8e,0x42", + "\u1100,,\u11b8": "0x8e,0x42", + "\u1100,,\u11b9": "0x8e,0x42", + "\u1100,,\u11ba": "0x8e,0x42", + "\u1100,,\u11bb": "0x8e,0x42", + "\u1100,,\u11bc": "0x8e,0x42", + "\u1100,,\u11bd": "0x8e,0x42", + "\u1100,,\u11be": "0x8e,0x42", + "\u1100,,\u11bf": "0x8e,0x42", + "\u1100,,\u11c0": "0x8e,0x42", + "\u1100,,\u11c1": "0x8e,0x42", + "\u1100,,\u11c2": "0x8e,0x42", + "\u1101,,\u11a8": "0x64", + "\u1101,,\u11a9": "0x64", + "\u1101,,\u11aa": "0x64", + "\u1101,,\u11ac": "0x64", + "\u1101,,\u11ad": "0x64", + "\u1101,,\u11ae": "0x64", + "\u1101,,\u11af": "0x64", + "\u1101,,\u11b0": "0x64", + "\u1101,,\u11b1": "0x64", + "\u1101,,\u11b2": "0x64", + "\u1101,,\u11b3": "0x64", + "\u1101,,\u11b4": "0x64", + "\u1101,,\u11b5": "0x64", + "\u1101,,\u11b6": "0x64", + "\u1101,,\u11b7": "0x64", + "\u1101,,\u11b8": "0x64", + "\u1101,,\u11b9": "0x64", + "\u1101,,\u11ba": "0x64", + "\u1101,,\u11bb": "0x64", + "\u1101,,\u11bc": "0x64", + "\u1101,,\u11bd": "0x64", + "\u1101,,\u11be": "0x64", + "\u1101,,\u11bf": "0x64", + "\u1101,,\u11c0": "0x64", + "\u1101,,\u11c1": "0x64", + "\u1101,,\u11c2": "0x64" + } + } + ], + "\u116c": [ + null, + null, + { + "defaultGlyph": "0xa4,0xa9", + "alternatives": { + "\u1100,": "0x8e,0xa9", + "\u1101,": "0x8e,0xa9" + } + }, + null, + null, + { + "defaultGlyph": "0xa2,0xa7", + "alternatives": { + "\u1103,,\u11ab": "0xa2,0xa9", + "\u1100,,\u11bc": "0x8e,0xa7", + "\u1100,,\u11ab": "0x8e,0xa9", + "\u1101,,\u11ab": "0x8f,0xa9", + "\u1102,,\u11ab": "0xa2,0xa9", + "\u1104,,\u11ab": "0xa2,0xa9", + "\u1105,,\u11ab": "0xa2,0xa9", + "\u1106,,\u11ab": "0xa2,0xa9", + "\u1107,,\u11ab": "0xa2,0xa9", + "\u1108,,\u11ab": "0xa2,0xa9", + "\u1109,,\u11ab": "0xa2,0xa9", + "\u110a,,\u11ab": "0xa2,0xa9", + "\u110b,,\u11ab": "0xa2,0xa9", + "\u110c,,\u11ab": "0xa2,0xa9", + "\u110d,,\u11ab": "0xa2,0xa9", + "\u110e,,\u11ab": "0xa2,0xa9", + "\u110f,,\u11ab": "0xa2,0xa9", + "\u1110,,\u11ab": "0xa2,0xa9", + "\u1111,,\u11ab": "0xa2,0xa9", + "\u1112,,\u11ab": "0xa2,0xa9", + "\u1100,,\u11a8": "0x8e,0xa7", + "\u1100,,\u11a9": "0x8e,0xa7", + "\u1100,,\u11aa": "0x8e,0xa7", + "\u1100,,\u11ac": "0x8e,0xa7", + "\u1100,,\u11ad": "0x8e,0xa7", + "\u1100,,\u11ae": "0x8e,0xa7", + "\u1100,,\u11af": "0x8e,0xa7", + "\u1100,,\u11b0": "0x8e,0xa7", + "\u1100,,\u11b1": "0x8e,0xa7", + "\u1100,,\u11b2": "0x8e,0xa7", + "\u1100,,\u11b3": "0x8e,0xa7", + "\u1100,,\u11b4": "0x8e,0xa7", + "\u1100,,\u11b5": "0x8e,0xa7", + "\u1100,,\u11b6": "0x8e,0xa7", + "\u1100,,\u11b7": "0x8e,0xa7", + "\u1100,,\u11b8": "0x8e,0xa7", + "\u1100,,\u11b9": "0x8e,0xa7", + "\u1100,,\u11ba": "0x8e,0xa7", + "\u1100,,\u11bb": "0x8e,0xa7", + "\u1100,,\u11bd": "0x8e,0xa7", + "\u1100,,\u11be": "0x8e,0xa7", + "\u1100,,\u11bf": "0x8e,0xa7", + "\u1100,,\u11c0": "0x8e,0xa7", + "\u1100,,\u11c1": "0x8e,0xa7", + "\u1100,,\u11c2": "0x8e,0xa7", + "\u1101,,\u11a8": "0x8f,0xa7", + "\u1101,,\u11a9": "0x8f,0xa7", + "\u1101,,\u11aa": "0x8f,0xa7", + "\u1101,,\u11ac": "0x8f,0xa7", + "\u1101,,\u11ad": "0x8f,0xa7", + "\u1101,,\u11ae": "0x8f,0xa7", + "\u1101,,\u11af": "0x8f,0xa7", + "\u1101,,\u11b0": "0x8f,0xa7", + "\u1101,,\u11b1": "0x8f,0xa7", + "\u1101,,\u11b2": "0x8f,0xa7", + "\u1101,,\u11b3": "0x8f,0xa7", + "\u1101,,\u11b4": "0x8f,0xa7", + "\u1101,,\u11b5": "0x8f,0xa7", + "\u1101,,\u11b6": "0x8f,0xa7", + "\u1101,,\u11b7": "0x8f,0xa7", + "\u1101,,\u11b8": "0x8f,0xa7", + "\u1101,,\u11b9": "0x8f,0xa7", + "\u1101,,\u11ba": "0x8f,0xa7", + "\u1101,,\u11bb": "0x8f,0xa7", + "\u1101,,\u11bc": "0x8f,0xa7", + "\u1101,,\u11bd": "0x8f,0xa7", + "\u1101,,\u11be": "0x8f,0xa7", + "\u1101,,\u11bf": "0x8f,0xa7", + "\u1101,,\u11c0": "0x8f,0xa7", + "\u1101,,\u11c1": "0x8f,0xa7", + "\u1101,,\u11c2": "0x8f,0xa7" + } + } + ], + "\u116f": [ + null, + null, + { + "defaultGlyph": "0xac", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xaa", + "alternatives": { + "\u110b,,\u11ab": "0xac", + "\u1106,,\u11ab": "0xac", + "\u1100,,\u11ab": "0xac", + "\u1100,,\u11a8": "0xaa", + "\u1100,,\u11a9": "0xaa", + "\u1100,,\u11aa": "0xaa", + "\u1100,,\u11ac": "0xaa", + "\u1100,,\u11ad": "0xaa", + "\u1100,,\u11ae": "0xaa", + "\u1100,,\u11af": "0xaa", + "\u1100,,\u11b0": "0xaa", + "\u1100,,\u11b1": "0xaa", + "\u1100,,\u11b2": "0xaa", + "\u1100,,\u11b3": "0xaa", + "\u1100,,\u11b4": "0xaa", + "\u1100,,\u11b5": "0xaa", + "\u1100,,\u11b6": "0xaa", + "\u1100,,\u11b7": "0xaa", + "\u1100,,\u11b8": "0xaa", + "\u1100,,\u11b9": "0xaa", + "\u1100,,\u11ba": "0xaa", + "\u1100,,\u11bb": "0xaa", + "\u1100,,\u11bc": "0xaa", + "\u1100,,\u11bd": "0xaa", + "\u1100,,\u11be": "0xaa", + "\u1100,,\u11bf": "0xaa", + "\u1100,,\u11c0": "0xaa", + "\u1100,,\u11c1": "0xaa", + "\u1100,,\u11c2": "0xaa", + "\u1101,,\u11a8": "0xaa", + "\u1101,,\u11a9": "0xaa", + "\u1101,,\u11aa": "0xaa", + "\u1101,,\u11ab": "0xac", + "\u1101,,\u11ac": "0xaa", + "\u1101,,\u11ad": "0xaa", + "\u1101,,\u11ae": "0xaa", + "\u1101,,\u11af": "0xaa", + "\u1101,,\u11b0": "0xaa", + "\u1101,,\u11b1": "0xaa", + "\u1101,,\u11b2": "0xaa", + "\u1101,,\u11b3": "0xaa", + "\u1101,,\u11b4": "0xaa", + "\u1101,,\u11b5": "0xaa", + "\u1101,,\u11b6": "0xaa", + "\u1101,,\u11b7": "0xaa", + "\u1101,,\u11b8": "0xaa", + "\u1101,,\u11b9": "0xaa", + "\u1101,,\u11ba": "0xaa", + "\u1101,,\u11bb": "0xaa", + "\u1101,,\u11bc": "0xaa", + "\u1101,,\u11bd": "0xaa", + "\u1101,,\u11be": "0xaa", + "\u1101,,\u11bf": "0xaa", + "\u1101,,\u11c0": "0xaa", + "\u1101,,\u11c1": "0xaa", + "\u1101,,\u11c2": "0xaa", + "\u1102,,\u11a8": "0xaa", + "\u1102,,\u11a9": "0xaa", + "\u1102,,\u11aa": "0xaa", + "\u1102,,\u11ab": "0xac", + "\u1102,,\u11ac": "0xaa", + "\u1102,,\u11ad": "0xaa", + "\u1102,,\u11ae": "0xaa", + "\u1102,,\u11af": "0xaa", + "\u1102,,\u11b0": "0xaa", + "\u1102,,\u11b1": "0xaa", + "\u1102,,\u11b2": "0xaa", + "\u1102,,\u11b3": "0xaa", + "\u1102,,\u11b4": "0xaa", + "\u1102,,\u11b5": "0xaa", + "\u1102,,\u11b6": "0xaa", + "\u1102,,\u11b7": "0xaa", + "\u1102,,\u11b8": "0xaa", + "\u1102,,\u11b9": "0xaa", + "\u1102,,\u11ba": "0xaa", + "\u1102,,\u11bb": "0xaa", + "\u1102,,\u11bc": "0xaa", + "\u1102,,\u11bd": "0xaa", + "\u1102,,\u11be": "0xaa", + "\u1102,,\u11bf": "0xaa", + "\u1102,,\u11c0": "0xaa", + "\u1102,,\u11c1": "0xaa", + "\u1102,,\u11c2": "0xaa", + "\u1103,,\u11a8": "0xaa", + "\u1103,,\u11a9": "0xaa", + "\u1103,,\u11aa": "0xaa", + "\u1103,,\u11ab": "0xac", + "\u1103,,\u11ac": "0xaa", + "\u1103,,\u11ad": "0xaa", + "\u1103,,\u11ae": "0xaa", + "\u1103,,\u11af": "0xaa", + "\u1103,,\u11b0": "0xaa", + "\u1103,,\u11b1": "0xaa", + "\u1103,,\u11b2": "0xaa", + "\u1103,,\u11b3": "0xaa", + "\u1103,,\u11b4": "0xaa", + "\u1103,,\u11b5": "0xaa", + "\u1103,,\u11b6": "0xaa", + "\u1103,,\u11b7": "0xaa", + "\u1103,,\u11b8": "0xaa", + "\u1103,,\u11b9": "0xaa", + "\u1103,,\u11ba": "0xaa", + "\u1103,,\u11bb": "0xaa", + "\u1103,,\u11bc": "0xaa", + "\u1103,,\u11bd": "0xaa", + "\u1103,,\u11be": "0xaa", + "\u1103,,\u11bf": "0xaa", + "\u1103,,\u11c0": "0xaa", + "\u1103,,\u11c1": "0xaa", + "\u1103,,\u11c2": "0xaa", + "\u1104,,\u11a8": "0xaa", + "\u1104,,\u11a9": "0xaa", + "\u1104,,\u11aa": "0xaa", + "\u1104,,\u11ab": "0xac", + "\u1104,,\u11ac": "0xaa", + "\u1104,,\u11ad": "0xaa", + "\u1104,,\u11ae": "0xaa", + "\u1104,,\u11af": "0xaa", + "\u1104,,\u11b0": "0xaa", + "\u1104,,\u11b1": "0xaa", + "\u1104,,\u11b2": "0xaa", + "\u1104,,\u11b3": "0xaa", + "\u1104,,\u11b4": "0xaa", + "\u1104,,\u11b5": "0xaa", + "\u1104,,\u11b6": "0xaa", + "\u1104,,\u11b7": "0xaa", + "\u1104,,\u11b8": "0xaa", + "\u1104,,\u11b9": "0xaa", + "\u1104,,\u11ba": "0xaa", + "\u1104,,\u11bb": "0xaa", + "\u1104,,\u11bc": "0xaa", + "\u1104,,\u11bd": "0xaa", + "\u1104,,\u11be": "0xaa", + "\u1104,,\u11bf": "0xaa", + "\u1104,,\u11c0": "0xaa", + "\u1104,,\u11c1": "0xaa", + "\u1104,,\u11c2": "0xaa", + "\u1105,,\u11a8": "0xaa", + "\u1105,,\u11a9": "0xaa", + "\u1105,,\u11aa": "0xaa", + "\u1105,,\u11ab": "0xac", + "\u1105,,\u11ac": "0xaa", + "\u1105,,\u11ad": "0xaa", + "\u1105,,\u11ae": "0xaa", + "\u1105,,\u11af": "0xaa", + "\u1105,,\u11b0": "0xaa", + "\u1105,,\u11b1": "0xaa", + "\u1105,,\u11b2": "0xaa", + "\u1105,,\u11b3": "0xaa", + "\u1105,,\u11b4": "0xaa", + "\u1105,,\u11b5": "0xaa", + "\u1105,,\u11b6": "0xaa", + "\u1105,,\u11b7": "0xaa", + "\u1105,,\u11b8": "0xaa", + "\u1105,,\u11b9": "0xaa", + "\u1105,,\u11ba": "0xaa", + "\u1105,,\u11bb": "0xaa", + "\u1105,,\u11bc": "0xaa", + "\u1105,,\u11bd": "0xaa", + "\u1105,,\u11be": "0xaa", + "\u1105,,\u11bf": "0xaa", + "\u1105,,\u11c0": "0xaa", + "\u1105,,\u11c1": "0xaa", + "\u1105,,\u11c2": "0xaa", + "\u1106,,\u11a8": "0xaa", + "\u1106,,\u11a9": "0xaa", + "\u1106,,\u11aa": "0xaa", + "\u1106,,\u11ac": "0xaa", + "\u1106,,\u11ad": "0xaa", + "\u1106,,\u11ae": "0xaa", + "\u1106,,\u11af": "0xaa", + "\u1106,,\u11b0": "0xaa", + "\u1106,,\u11b1": "0xaa", + "\u1106,,\u11b2": "0xaa", + "\u1106,,\u11b3": "0xaa", + "\u1106,,\u11b4": "0xaa", + "\u1106,,\u11b5": "0xaa", + "\u1106,,\u11b6": "0xaa", + "\u1106,,\u11b7": "0xaa", + "\u1106,,\u11b8": "0xaa", + "\u1106,,\u11b9": "0xaa", + "\u1106,,\u11ba": "0xaa", + "\u1106,,\u11bb": "0xaa", + "\u1106,,\u11bc": "0xaa", + "\u1106,,\u11bd": "0xaa", + "\u1106,,\u11be": "0xaa", + "\u1106,,\u11bf": "0xaa", + "\u1106,,\u11c0": "0xaa", + "\u1106,,\u11c1": "0xaa", + "\u1106,,\u11c2": "0xaa", + "\u1107,,\u11a8": "0xaa", + "\u1107,,\u11a9": "0xaa", + "\u1107,,\u11aa": "0xaa", + "\u1107,,\u11ab": "0xac", + "\u1107,,\u11ac": "0xaa", + "\u1107,,\u11ad": "0xaa", + "\u1107,,\u11ae": "0xaa", + "\u1107,,\u11af": "0xaa", + "\u1107,,\u11b0": "0xaa", + "\u1107,,\u11b1": "0xaa", + "\u1107,,\u11b2": "0xaa", + "\u1107,,\u11b3": "0xaa", + "\u1107,,\u11b4": "0xaa", + "\u1107,,\u11b5": "0xaa", + "\u1107,,\u11b6": "0xaa", + "\u1107,,\u11b7": "0xaa", + "\u1107,,\u11b8": "0xaa", + "\u1107,,\u11b9": "0xaa", + "\u1107,,\u11ba": "0xaa", + "\u1107,,\u11bb": "0xaa", + "\u1107,,\u11bc": "0xaa", + "\u1107,,\u11bd": "0xaa", + "\u1107,,\u11be": "0xaa", + "\u1107,,\u11bf": "0xaa", + "\u1107,,\u11c0": "0xaa", + "\u1107,,\u11c1": "0xaa", + "\u1107,,\u11c2": "0xaa", + "\u1108,,\u11a8": "0xaa", + "\u1108,,\u11a9": "0xaa", + "\u1108,,\u11aa": "0xaa", + "\u1108,,\u11ab": "0xac", + "\u1108,,\u11ac": "0xaa", + "\u1108,,\u11ad": "0xaa", + "\u1108,,\u11ae": "0xaa", + "\u1108,,\u11af": "0xaa", + "\u1108,,\u11b0": "0xaa", + "\u1108,,\u11b1": "0xaa", + "\u1108,,\u11b2": "0xaa", + "\u1108,,\u11b3": "0xaa", + "\u1108,,\u11b4": "0xaa", + "\u1108,,\u11b5": "0xaa", + "\u1108,,\u11b6": "0xaa", + "\u1108,,\u11b7": "0xaa", + "\u1108,,\u11b8": "0xaa", + "\u1108,,\u11b9": "0xaa", + "\u1108,,\u11ba": "0xaa", + "\u1108,,\u11bb": "0xaa", + "\u1108,,\u11bc": "0xaa", + "\u1108,,\u11bd": "0xaa", + "\u1108,,\u11be": "0xaa", + "\u1108,,\u11bf": "0xaa", + "\u1108,,\u11c0": "0xaa", + "\u1108,,\u11c1": "0xaa", + "\u1108,,\u11c2": "0xaa", + "\u1109,,\u11a8": "0xaa", + "\u1109,,\u11a9": "0xaa", + "\u1109,,\u11aa": "0xaa", + "\u1109,,\u11ab": "0xac", + "\u1109,,\u11ac": "0xaa", + "\u1109,,\u11ad": "0xaa", + "\u1109,,\u11ae": "0xaa", + "\u1109,,\u11af": "0xaa", + "\u1109,,\u11b0": "0xaa", + "\u1109,,\u11b1": "0xaa", + "\u1109,,\u11b2": "0xaa", + "\u1109,,\u11b3": "0xaa", + "\u1109,,\u11b4": "0xaa", + "\u1109,,\u11b5": "0xaa", + "\u1109,,\u11b6": "0xaa", + "\u1109,,\u11b7": "0xaa", + "\u1109,,\u11b8": "0xaa", + "\u1109,,\u11b9": "0xaa", + "\u1109,,\u11ba": "0xaa", + "\u1109,,\u11bb": "0xaa", + "\u1109,,\u11bc": "0xaa", + "\u1109,,\u11bd": "0xaa", + "\u1109,,\u11be": "0xaa", + "\u1109,,\u11bf": "0xaa", + "\u1109,,\u11c0": "0xaa", + "\u1109,,\u11c1": "0xaa", + "\u1109,,\u11c2": "0xaa", + "\u110a,,\u11a8": "0xaa", + "\u110a,,\u11a9": "0xaa", + "\u110a,,\u11aa": "0xaa", + "\u110a,,\u11ab": "0xac", + "\u110a,,\u11ac": "0xaa", + "\u110a,,\u11ad": "0xaa", + "\u110a,,\u11ae": "0xaa", + "\u110a,,\u11af": "0xaa", + "\u110a,,\u11b0": "0xaa", + "\u110a,,\u11b1": "0xaa", + "\u110a,,\u11b2": "0xaa", + "\u110a,,\u11b3": "0xaa", + "\u110a,,\u11b4": "0xaa", + "\u110a,,\u11b5": "0xaa", + "\u110a,,\u11b6": "0xaa", + "\u110a,,\u11b7": "0xaa", + "\u110a,,\u11b8": "0xaa", + "\u110a,,\u11b9": "0xaa", + "\u110a,,\u11ba": "0xaa", + "\u110a,,\u11bb": "0xaa", + "\u110a,,\u11bc": "0xaa", + "\u110a,,\u11bd": "0xaa", + "\u110a,,\u11be": "0xaa", + "\u110a,,\u11bf": "0xaa", + "\u110a,,\u11c0": "0xaa", + "\u110a,,\u11c1": "0xaa", + "\u110a,,\u11c2": "0xaa", + "\u110b,,\u11a8": "0xaa", + "\u110b,,\u11a9": "0xaa", + "\u110b,,\u11aa": "0xaa", + "\u110b,,\u11ac": "0xaa", + "\u110b,,\u11ad": "0xaa", + "\u110b,,\u11ae": "0xaa", + "\u110b,,\u11af": "0xaa", + "\u110b,,\u11b0": "0xaa", + "\u110b,,\u11b1": "0xaa", + "\u110b,,\u11b2": "0xaa", + "\u110b,,\u11b3": "0xaa", + "\u110b,,\u11b4": "0xaa", + "\u110b,,\u11b5": "0xaa", + "\u110b,,\u11b6": "0xaa", + "\u110b,,\u11b7": "0xaa", + "\u110b,,\u11b8": "0xaa", + "\u110b,,\u11b9": "0xaa", + "\u110b,,\u11ba": "0xaa", + "\u110b,,\u11bb": "0xaa", + "\u110b,,\u11bc": "0xaa", + "\u110b,,\u11bd": "0xaa", + "\u110b,,\u11be": "0xaa", + "\u110b,,\u11bf": "0xaa", + "\u110b,,\u11c0": "0xaa", + "\u110b,,\u11c1": "0xaa", + "\u110b,,\u11c2": "0xaa", + "\u110c,,\u11a8": "0xaa", + "\u110c,,\u11a9": "0xaa", + "\u110c,,\u11aa": "0xaa", + "\u110c,,\u11ab": "0xac", + "\u110c,,\u11ac": "0xaa", + "\u110c,,\u11ad": "0xaa", + "\u110c,,\u11ae": "0xaa", + "\u110c,,\u11af": "0xaa", + "\u110c,,\u11b0": "0xaa", + "\u110c,,\u11b1": "0xaa", + "\u110c,,\u11b2": "0xaa", + "\u110c,,\u11b3": "0xaa", + "\u110c,,\u11b4": "0xaa", + "\u110c,,\u11b5": "0xaa", + "\u110c,,\u11b6": "0xaa", + "\u110c,,\u11b7": "0xaa", + "\u110c,,\u11b8": "0xaa", + "\u110c,,\u11b9": "0xaa", + "\u110c,,\u11ba": "0xaa", + "\u110c,,\u11bb": "0xaa", + "\u110c,,\u11bc": "0xaa", + "\u110c,,\u11bd": "0xaa", + "\u110c,,\u11be": "0xaa", + "\u110c,,\u11bf": "0xaa", + "\u110c,,\u11c0": "0xaa", + "\u110c,,\u11c1": "0xaa", + "\u110c,,\u11c2": "0xaa", + "\u110d,,\u11a8": "0xaa", + "\u110d,,\u11a9": "0xaa", + "\u110d,,\u11aa": "0xaa", + "\u110d,,\u11ab": "0xac", + "\u110d,,\u11ac": "0xaa", + "\u110d,,\u11ad": "0xaa", + "\u110d,,\u11ae": "0xaa", + "\u110d,,\u11af": "0xaa", + "\u110d,,\u11b0": "0xaa", + "\u110d,,\u11b1": "0xaa", + "\u110d,,\u11b2": "0xaa", + "\u110d,,\u11b3": "0xaa", + "\u110d,,\u11b4": "0xaa", + "\u110d,,\u11b5": "0xaa", + "\u110d,,\u11b6": "0xaa", + "\u110d,,\u11b7": "0xaa", + "\u110d,,\u11b8": "0xaa", + "\u110d,,\u11b9": "0xaa", + "\u110d,,\u11ba": "0xaa", + "\u110d,,\u11bb": "0xaa", + "\u110d,,\u11bc": "0xaa", + "\u110d,,\u11bd": "0xaa", + "\u110d,,\u11be": "0xaa", + "\u110d,,\u11bf": "0xaa", + "\u110d,,\u11c0": "0xaa", + "\u110d,,\u11c1": "0xaa", + "\u110d,,\u11c2": "0xaa", + "\u110e,,\u11a8": "0xaa", + "\u110e,,\u11a9": "0xaa", + "\u110e,,\u11aa": "0xaa", + "\u110e,,\u11ab": "0xac", + "\u110e,,\u11ac": "0xaa", + "\u110e,,\u11ad": "0xaa", + "\u110e,,\u11ae": "0xaa", + "\u110e,,\u11af": "0xaa", + "\u110e,,\u11b0": "0xaa", + "\u110e,,\u11b1": "0xaa", + "\u110e,,\u11b2": "0xaa", + "\u110e,,\u11b3": "0xaa", + "\u110e,,\u11b4": "0xaa", + "\u110e,,\u11b5": "0xaa", + "\u110e,,\u11b6": "0xaa", + "\u110e,,\u11b7": "0xaa", + "\u110e,,\u11b8": "0xaa", + "\u110e,,\u11b9": "0xaa", + "\u110e,,\u11ba": "0xaa", + "\u110e,,\u11bb": "0xaa", + "\u110e,,\u11bc": "0xaa", + "\u110e,,\u11bd": "0xaa", + "\u110e,,\u11be": "0xaa", + "\u110e,,\u11bf": "0xaa", + "\u110e,,\u11c0": "0xaa", + "\u110e,,\u11c1": "0xaa", + "\u110e,,\u11c2": "0xaa", + "\u110f,,\u11a8": "0xaa", + "\u110f,,\u11a9": "0xaa", + "\u110f,,\u11aa": "0xaa", + "\u110f,,\u11ab": "0xac", + "\u110f,,\u11ac": "0xaa", + "\u110f,,\u11ad": "0xaa", + "\u110f,,\u11ae": "0xaa", + "\u110f,,\u11af": "0xaa", + "\u110f,,\u11b0": "0xaa", + "\u110f,,\u11b1": "0xaa", + "\u110f,,\u11b2": "0xaa", + "\u110f,,\u11b3": "0xaa", + "\u110f,,\u11b4": "0xaa", + "\u110f,,\u11b5": "0xaa", + "\u110f,,\u11b6": "0xaa", + "\u110f,,\u11b7": "0xaa", + "\u110f,,\u11b8": "0xaa", + "\u110f,,\u11b9": "0xaa", + "\u110f,,\u11ba": "0xaa", + "\u110f,,\u11bb": "0xaa", + "\u110f,,\u11bc": "0xaa", + "\u110f,,\u11bd": "0xaa", + "\u110f,,\u11be": "0xaa", + "\u110f,,\u11bf": "0xaa", + "\u110f,,\u11c0": "0xaa", + "\u110f,,\u11c1": "0xaa", + "\u110f,,\u11c2": "0xaa", + "\u1110,,\u11a8": "0xaa", + "\u1110,,\u11a9": "0xaa", + "\u1110,,\u11aa": "0xaa", + "\u1110,,\u11ab": "0xac", + "\u1110,,\u11ac": "0xaa", + "\u1110,,\u11ad": "0xaa", + "\u1110,,\u11ae": "0xaa", + "\u1110,,\u11af": "0xaa", + "\u1110,,\u11b0": "0xaa", + "\u1110,,\u11b1": "0xaa", + "\u1110,,\u11b2": "0xaa", + "\u1110,,\u11b3": "0xaa", + "\u1110,,\u11b4": "0xaa", + "\u1110,,\u11b5": "0xaa", + "\u1110,,\u11b6": "0xaa", + "\u1110,,\u11b7": "0xaa", + "\u1110,,\u11b8": "0xaa", + "\u1110,,\u11b9": "0xaa", + "\u1110,,\u11ba": "0xaa", + "\u1110,,\u11bb": "0xaa", + "\u1110,,\u11bc": "0xaa", + "\u1110,,\u11bd": "0xaa", + "\u1110,,\u11be": "0xaa", + "\u1110,,\u11bf": "0xaa", + "\u1110,,\u11c0": "0xaa", + "\u1110,,\u11c1": "0xaa", + "\u1110,,\u11c2": "0xaa", + "\u1111,,\u11a8": "0xaa", + "\u1111,,\u11a9": "0xaa", + "\u1111,,\u11aa": "0xaa", + "\u1111,,\u11ab": "0xac", + "\u1111,,\u11ac": "0xaa", + "\u1111,,\u11ad": "0xaa", + "\u1111,,\u11ae": "0xaa", + "\u1111,,\u11af": "0xaa", + "\u1111,,\u11b0": "0xaa", + "\u1111,,\u11b1": "0xaa", + "\u1111,,\u11b2": "0xaa", + "\u1111,,\u11b3": "0xaa", + "\u1111,,\u11b4": "0xaa", + "\u1111,,\u11b5": "0xaa", + "\u1111,,\u11b6": "0xaa", + "\u1111,,\u11b7": "0xaa", + "\u1111,,\u11b8": "0xaa", + "\u1111,,\u11b9": "0xaa", + "\u1111,,\u11ba": "0xaa", + "\u1111,,\u11bb": "0xaa", + "\u1111,,\u11bc": "0xaa", + "\u1111,,\u11bd": "0xaa", + "\u1111,,\u11be": "0xaa", + "\u1111,,\u11bf": "0xaa", + "\u1111,,\u11c0": "0xaa", + "\u1111,,\u11c1": "0xaa", + "\u1111,,\u11c2": "0xaa", + "\u1112,,\u11a8": "0xaa", + "\u1112,,\u11a9": "0xaa", + "\u1112,,\u11aa": "0xaa", + "\u1112,,\u11ab": "0xac", + "\u1112,,\u11ac": "0xaa", + "\u1112,,\u11ad": "0xaa", + "\u1112,,\u11ae": "0xaa", + "\u1112,,\u11af": "0xaa", + "\u1112,,\u11b0": "0xaa", + "\u1112,,\u11b1": "0xaa", + "\u1112,,\u11b2": "0xaa", + "\u1112,,\u11b3": "0xaa", + "\u1112,,\u11b4": "0xaa", + "\u1112,,\u11b5": "0xaa", + "\u1112,,\u11b6": "0xaa", + "\u1112,,\u11b7": "0xaa", + "\u1112,,\u11b8": "0xaa", + "\u1112,,\u11b9": "0xaa", + "\u1112,,\u11ba": "0xaa", + "\u1112,,\u11bb": "0xaa", + "\u1112,,\u11bc": "0xaa", + "\u1112,,\u11bd": "0xaa", + "\u1112,,\u11be": "0xaa", + "\u1112,,\u11bf": "0xaa", + "\u1112,,\u11c0": "0xaa", + "\u1112,,\u11c1": "0xaa", + "\u1112,,\u11c2": "0xaa" + } + } + ], + "\u1170": [ + null, + null, + { + "defaultGlyph": "0xc4", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xc3", + "alternatives": { + "\u1100,,\u11ab": "0xc4", + "\u1101,,\u11ab": "0xc4", + "\u1102,,\u11ab": "0xc4", + "\u1103,,\u11ab": "0xc4", + "\u1104,,\u11ab": "0xc4", + "\u1105,,\u11ab": "0xc4", + "\u1106,,\u11ab": "0xc4", + "\u1107,,\u11ab": "0xc4", + "\u1108,,\u11ab": "0xc4", + "\u1109,,\u11ab": "0xc4", + "\u110a,,\u11ab": "0xc4", + "\u110b,,\u11ab": "0xc4", + "\u110c,,\u11ab": "0xc4", + "\u110d,,\u11ab": "0xc4", + "\u110e,,\u11ab": "0xc4", + "\u110f,,\u11ab": "0xc4", + "\u1110,,\u11ab": "0xc4", + "\u1111,,\u11ab": "0xc4", + "\u1112,,\u11ab": "0xc4" + } + } + ], + "\u1171": [ + null, + null, + { + "defaultGlyph": "0xad", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xab", + "alternatives": { + "\u110b,,\u11ab": "0xad", + "\u1100,,\u11ab": "0xad", + "\u1101,,\u11ab": "0xad", + "\u1102,,\u11ab": "0xad", + "\u1103,,\u11ab": "0xad", + "\u1104,,\u11ab": "0xad", + "\u1105,,\u11ab": "0xad", + "\u1106,,\u11ab": "0xad", + "\u1107,,\u11ab": "0xad", + "\u1108,,\u11ab": "0xad", + "\u1109,,\u11ab": "0xad", + "\u110a,,\u11ab": "0xad", + "\u110c,,\u11ab": "0xad", + "\u110d,,\u11ab": "0xad", + "\u110e,,\u11ab": "0xad", + "\u110f,,\u11ab": "0xad", + "\u1110,,\u11ab": "0xad", + "\u1111,,\u11ab": "0xad", + "\u1112,,\u11ab": "0xad" + } + } + ], + "\u1174": [ + null, + null, + { + "defaultGlyph": "0xa5,0xa9", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xa3,0xa7", + "alternatives": { + "\u1104,,\u11af": "0xa3,0xa7", + "\u1100,,\u11ab": "0xa3,0xa9", + "\u1101,,\u11ab": "0xa3,0xa9", + "\u1102,,\u11ab": "0xa3,0xa9", + "\u1103,,\u11ab": "0xa3,0xa9", + "\u1104,,\u11ab": "0xa3,0xa9", + "\u1105,,\u11ab": "0xa3,0xa9", + "\u1106,,\u11ab": "0xa3,0xa9", + "\u1107,,\u11ab": "0xa3,0xa9", + "\u1108,,\u11ab": "0xa3,0xa9", + "\u1109,,\u11ab": "0xa3,0xa9", + "\u110a,,\u11ab": "0xa3,0xa9", + "\u110b,,\u11ab": "0xa3,0xa9", + "\u110c,,\u11ab": "0xa3,0xa9", + "\u110d,,\u11ab": "0xa3,0xa9", + "\u110e,,\u11ab": "0xa3,0xa9", + "\u110f,,\u11ab": "0xa3,0xa9", + "\u1110,,\u11ab": "0xa3,0xa9", + "\u1111,,\u11ab": "0xa3,0xa9", + "\u1112,,\u11ab": "0xa3,0xa9" + } + } + ], + "\u11a8": [ + null, + null, + null, + { + "defaultGlyph": "0xc5", + "alternatives": {} + }, + { + "defaultGlyph": "0xde", + "alternatives": {} + }, + { + "defaultGlyph": "0xfe", + "alternatives": { + "\u110b,\u1170,": "0xfe" + } + } + ], + "\u11a9": [ + null, + null, + null, + { + "defaultGlyph": "0xc6", + "alternatives": {} + }, + { + "defaultGlyph": "0xdf", + "alternatives": {} + }, + { + "defaultGlyph": "0xdf", + "alternatives": {} + } + ], + "\u11aa": [ + null, + null, + null, + { + "defaultGlyph": "0xc7", + "alternatives": {} + }, + { + "defaultGlyph": "0xe0", + "alternatives": {} + }, + { + "defaultGlyph": "0xe0", + "alternatives": {} + } + ], + "\u11ab": [ + null, + null, + null, + { + "defaultGlyph": "0xc8", + "alternatives": {} + }, + { + "defaultGlyph": "0xe1", + "alternatives": { + "\u110b,\u116e,": "0xe1", + "\u1106,\u116e,": "0xe1", + "\u1100,\u116e,": "0xe1", + "\u110c,\u116e,": "0xe1", + "\u1107,\u116e,": "0xe1", + "\u1109,\u116e,": "0xe1", + "\u1101,\u116e,": "0xe1", + "\u1102,\u116e,": "0xe1", + "\u1103,\u116e,": "0xe1", + "\u1108,\u116e,": "0xe1", + "\u1100,\u1161,": "0xe1", + "\u1100,\u1162,": "0xe1", + "\u1100,\u1163,": "0xe1", + "\u1100,\u1164,": "0xe1", + "\u1100,\u1165,": "0xe1", + "\u1100,\u1166,": "0xe1", + "\u1100,\u1167,": "0xe1", + "\u1100,\u1168,": "0xe1", + "\u1100,\u1169,": "0xe1", + "\u1100,\u116a,": "0xe1", + "\u1100,\u116b,": "0xe1", + "\u1100,\u116c,": "0xe1", + "\u1100,\u116d,": "0xe1", + "\u1100,\u116f,": "0xe1", + "\u1100,\u1170,": "0xe1", + "\u1100,\u1171,": "0xe1", + "\u1100,\u1172,": "0xe1", + "\u1100,\u1173,": "0xe1", + "\u1100,\u1174,": "0xe1", + "\u1100,\u1175,": "0xe1", + "\u1101,\u1161,": "0xe1", + "\u1101,\u1162,": "0xe1", + "\u1101,\u1163,": "0xe1", + "\u1101,\u1164,": "0xe1", + "\u1101,\u1165,": "0xe1", + "\u1101,\u1166,": "0xe1", + "\u1101,\u1167,": "0xe1", + "\u1101,\u1168,": "0xe1", + "\u1101,\u1169,": "0xe1", + "\u1101,\u116a,": "0xe1", + "\u1101,\u116b,": "0xe1", + "\u1101,\u116c,": "0xe1", + "\u1101,\u116d,": "0xe1", + "\u1101,\u116f,": "0xe1", + "\u1101,\u1170,": "0xe1", + "\u1101,\u1171,": "0xe1", + "\u1101,\u1172,": "0xe1", + "\u1101,\u1173,": "0xe1", + "\u1101,\u1174,": "0xe1", + "\u1101,\u1175,": "0xe1", + "\u1102,\u1161,": "0xe1", + "\u1102,\u1162,": "0xe1", + "\u1102,\u1163,": "0xe1", + "\u1102,\u1164,": "0xe1", + "\u1102,\u1165,": "0xe1", + "\u1102,\u1166,": "0xe1", + "\u1102,\u1167,": "0xe1", + "\u1102,\u1168,": "0xe1", + "\u1102,\u1169,": "0xe1", + "\u1102,\u116a,": "0xe1", + "\u1102,\u116b,": "0xe1", + "\u1102,\u116c,": "0xe1", + "\u1102,\u116d,": "0xe1", + "\u1102,\u116f,": "0xe1", + "\u1102,\u1170,": "0xe1", + "\u1102,\u1171,": "0xe1", + "\u1102,\u1172,": "0xe1", + "\u1102,\u1173,": "0xe1", + "\u1102,\u1174,": "0xe1", + "\u1102,\u1175,": "0xe1", + "\u1103,\u1161,": "0xe1", + "\u1103,\u1162,": "0xe1", + "\u1103,\u1163,": "0xe1", + "\u1103,\u1164,": "0xe1", + "\u1103,\u1165,": "0xe1", + "\u1103,\u1166,": "0xe1", + "\u1103,\u1167,": "0xe1", + "\u1103,\u1168,": "0xe1", + "\u1103,\u1169,": "0xe1", + "\u1103,\u116a,": "0xe1", + "\u1103,\u116b,": "0xe1", + "\u1103,\u116c,": "0xe1", + "\u1103,\u116d,": "0xe1", + "\u1103,\u116f,": "0xe1", + "\u1103,\u1170,": "0xe1", + "\u1103,\u1171,": "0xe1", + "\u1103,\u1172,": "0xe1", + "\u1103,\u1173,": "0xe1", + "\u1103,\u1174,": "0xe1", + "\u1103,\u1175,": "0xe1", + "\u1104,\u1161,": "0xe1", + "\u1104,\u1162,": "0xe1", + "\u1104,\u1163,": "0xe1", + "\u1104,\u1164,": "0xe1", + "\u1104,\u1165,": "0xe1", + "\u1104,\u1166,": "0xe1", + "\u1104,\u1167,": "0xe1", + "\u1104,\u1168,": "0xe1", + "\u1104,\u1169,": "0xe1", + "\u1104,\u116a,": "0xe1", + "\u1104,\u116b,": "0xe1", + "\u1104,\u116c,": "0xe1", + "\u1104,\u116d,": "0xe1", + "\u1104,\u116e,": "0xe1", + "\u1104,\u116f,": "0xe1", + "\u1104,\u1170,": "0xe1", + "\u1104,\u1171,": "0xe1", + "\u1104,\u1172,": "0xe1", + "\u1104,\u1173,": "0xe1", + "\u1104,\u1174,": "0xe1", + "\u1104,\u1175,": "0xe1", + "\u1105,\u1161,": "0xe1", + "\u1105,\u1162,": "0xe1", + "\u1105,\u1163,": "0xe1", + "\u1105,\u1164,": "0xe1", + "\u1105,\u1165,": "0xe1", + "\u1105,\u1166,": "0xe1", + "\u1105,\u1167,": "0xe1", + "\u1105,\u1168,": "0xe1", + "\u1105,\u1169,": "0xe1", + "\u1105,\u116a,": "0xe1", + "\u1105,\u116b,": "0xe1", + "\u1105,\u116c,": "0xe1", + "\u1105,\u116d,": "0xe1", + "\u1105,\u116e,": "0xe1", + "\u1105,\u116f,": "0xe1", + "\u1105,\u1170,": "0xe1", + "\u1105,\u1171,": "0xe1", + "\u1105,\u1172,": "0xe1", + "\u1105,\u1173,": "0xe1", + "\u1105,\u1174,": "0xe1", + "\u1105,\u1175,": "0xe1", + "\u1106,\u1161,": "0xe1", + "\u1106,\u1162,": "0xe1", + "\u1106,\u1163,": "0xe1", + "\u1106,\u1164,": "0xe1", + "\u1106,\u1165,": "0xe1", + "\u1106,\u1166,": "0xe1", + "\u1106,\u1167,": "0xe1", + "\u1106,\u1168,": "0xe1", + "\u1106,\u1169,": "0xe1", + "\u1106,\u116a,": "0xe1", + "\u1106,\u116b,": "0xe1", + "\u1106,\u116c,": "0xe1", + "\u1106,\u116d,": "0xe1", + "\u1106,\u116f,": "0xe1", + "\u1106,\u1170,": "0xe1", + "\u1106,\u1171,": "0xe1", + "\u1106,\u1172,": "0xe1", + "\u1106,\u1173,": "0xe1", + "\u1106,\u1174,": "0xe1", + "\u1106,\u1175,": "0xe1", + "\u1107,\u1161,": "0xe1", + "\u1107,\u1162,": "0xe1", + "\u1107,\u1163,": "0xe1", + "\u1107,\u1164,": "0xe1", + "\u1107,\u1165,": "0xe1", + "\u1107,\u1166,": "0xe1", + "\u1107,\u1167,": "0xe1", + "\u1107,\u1168,": "0xe1", + "\u1107,\u1169,": "0xe1", + "\u1107,\u116a,": "0xe1", + "\u1107,\u116b,": "0xe1", + "\u1107,\u116c,": "0xe1", + "\u1107,\u116d,": "0xe1", + "\u1107,\u116f,": "0xe1", + "\u1107,\u1170,": "0xe1", + "\u1107,\u1171,": "0xe1", + "\u1107,\u1172,": "0xe1", + "\u1107,\u1173,": "0xe1", + "\u1107,\u1174,": "0xe1", + "\u1107,\u1175,": "0xe1", + "\u1108,\u1161,": "0xe1", + "\u1108,\u1162,": "0xe1", + "\u1108,\u1163,": "0xe1", + "\u1108,\u1164,": "0xe1", + "\u1108,\u1165,": "0xe1", + "\u1108,\u1166,": "0xe1", + "\u1108,\u1167,": "0xe1", + "\u1108,\u1168,": "0xe1", + "\u1108,\u1169,": "0xe1", + "\u1108,\u116a,": "0xe1", + "\u1108,\u116b,": "0xe1", + "\u1108,\u116c,": "0xe1", + "\u1108,\u116d,": "0xe1", + "\u1108,\u116f,": "0xe1", + "\u1108,\u1170,": "0xe1", + "\u1108,\u1171,": "0xe1", + "\u1108,\u1172,": "0xe1", + "\u1108,\u1173,": "0xe1", + "\u1108,\u1174,": "0xe1", + "\u1108,\u1175,": "0xe1", + "\u1109,\u1161,": "0xe1", + "\u1109,\u1162,": "0xe1", + "\u1109,\u1163,": "0xe1", + "\u1109,\u1164,": "0xe1", + "\u1109,\u1165,": "0xe1", + "\u1109,\u1166,": "0xe1", + "\u1109,\u1167,": "0xe1", + "\u1109,\u1168,": "0xe1", + "\u1109,\u1169,": "0xe1", + "\u1109,\u116a,": "0xe1", + "\u1109,\u116b,": "0xe1", + "\u1109,\u116c,": "0xe1", + "\u1109,\u116d,": "0xe1", + "\u1109,\u116f,": "0xe1", + "\u1109,\u1170,": "0xe1", + "\u1109,\u1171,": "0xe1", + "\u1109,\u1172,": "0xe1", + "\u1109,\u1173,": "0xe1", + "\u1109,\u1174,": "0xe1", + "\u1109,\u1175,": "0xe1", + "\u110a,\u1161,": "0xe1", + "\u110a,\u1162,": "0xe1", + "\u110a,\u1163,": "0xe1", + "\u110a,\u1164,": "0xe1", + "\u110a,\u1165,": "0xe1", + "\u110a,\u1166,": "0xe1", + "\u110a,\u1167,": "0xe1", + "\u110a,\u1168,": "0xe1", + "\u110a,\u1169,": "0xe1", + "\u110a,\u116a,": "0xe1", + "\u110a,\u116b,": "0xe1", + "\u110a,\u116c,": "0xe1", + "\u110a,\u116d,": "0xe1", + "\u110a,\u116e,": "0xe1", + "\u110a,\u116f,": "0xe1", + "\u110a,\u1170,": "0xe1", + "\u110a,\u1171,": "0xe1", + "\u110a,\u1172,": "0xe1", + "\u110a,\u1173,": "0xe1", + "\u110a,\u1174,": "0xe1", + "\u110a,\u1175,": "0xe1", + "\u110b,\u1161,": "0xe1", + "\u110b,\u1162,": "0xe1", + "\u110b,\u1163,": "0xe1", + "\u110b,\u1164,": "0xe1", + "\u110b,\u1165,": "0xe1", + "\u110b,\u1166,": "0xe1", + "\u110b,\u1167,": "0xe1", + "\u110b,\u1168,": "0xe1", + "\u110b,\u1169,": "0xe1", + "\u110b,\u116a,": "0xe1", + "\u110b,\u116b,": "0xe1", + "\u110b,\u116c,": "0xe1", + "\u110b,\u116d,": "0xe1", + "\u110b,\u116f,": "0xe1", + "\u110b,\u1170,": "0xe1", + "\u110b,\u1171,": "0xe1", + "\u110b,\u1172,": "0xe1", + "\u110b,\u1173,": "0xe1", + "\u110b,\u1174,": "0xe1", + "\u110b,\u1175,": "0xe1", + "\u110c,\u1161,": "0xe1", + "\u110c,\u1162,": "0xe1", + "\u110c,\u1163,": "0xe1", + "\u110c,\u1164,": "0xe1", + "\u110c,\u1165,": "0xe1", + "\u110c,\u1166,": "0xe1", + "\u110c,\u1167,": "0xe1", + "\u110c,\u1168,": "0xe1", + "\u110c,\u1169,": "0xe1", + "\u110c,\u116a,": "0xe1", + "\u110c,\u116b,": "0xe1", + "\u110c,\u116c,": "0xe1", + "\u110c,\u116d,": "0xe1", + "\u110c,\u116f,": "0xe1", + "\u110c,\u1170,": "0xe1", + "\u110c,\u1171,": "0xe1", + "\u110c,\u1172,": "0xe1", + "\u110c,\u1173,": "0xe1", + "\u110c,\u1174,": "0xe1", + "\u110c,\u1175,": "0xe1", + "\u110d,\u1161,": "0xe1", + "\u110d,\u1162,": "0xe1", + "\u110d,\u1163,": "0xe1", + "\u110d,\u1164,": "0xe1", + "\u110d,\u1165,": "0xe1", + "\u110d,\u1166,": "0xe1", + "\u110d,\u1167,": "0xe1", + "\u110d,\u1168,": "0xe1", + "\u110d,\u1169,": "0xe1", + "\u110d,\u116a,": "0xe1", + "\u110d,\u116b,": "0xe1", + "\u110d,\u116c,": "0xe1", + "\u110d,\u116d,": "0xe1", + "\u110d,\u116e,": "0xe1", + "\u110d,\u116f,": "0xe1", + "\u110d,\u1170,": "0xe1", + "\u110d,\u1171,": "0xe1", + "\u110d,\u1172,": "0xe1", + "\u110d,\u1173,": "0xe1", + "\u110d,\u1174,": "0xe1", + "\u110d,\u1175,": "0xe1", + "\u110e,\u1161,": "0xe1", + "\u110e,\u1162,": "0xe1", + "\u110e,\u1163,": "0xe1", + "\u110e,\u1164,": "0xe1", + "\u110e,\u1165,": "0xe1", + "\u110e,\u1166,": "0xe1", + "\u110e,\u1167,": "0xe1", + "\u110e,\u1168,": "0xe1", + "\u110e,\u1169,": "0xe1", + "\u110e,\u116a,": "0xe1", + "\u110e,\u116b,": "0xe1", + "\u110e,\u116c,": "0xe1", + "\u110e,\u116d,": "0xe1", + "\u110e,\u116e,": "0xe1", + "\u110e,\u116f,": "0xe1", + "\u110e,\u1170,": "0xe1", + "\u110e,\u1171,": "0xe1", + "\u110e,\u1172,": "0xe1", + "\u110e,\u1173,": "0xe1", + "\u110e,\u1174,": "0xe1", + "\u110e,\u1175,": "0xe1", + "\u110f,\u1161,": "0xe1", + "\u110f,\u1162,": "0xe1", + "\u110f,\u1163,": "0xe1", + "\u110f,\u1164,": "0xe1", + "\u110f,\u1165,": "0xe1", + "\u110f,\u1166,": "0xe1", + "\u110f,\u1167,": "0xe1", + "\u110f,\u1168,": "0xe1", + "\u110f,\u1169,": "0xe1", + "\u110f,\u116a,": "0xe1", + "\u110f,\u116b,": "0xe1", + "\u110f,\u116c,": "0xe1", + "\u110f,\u116d,": "0xe1", + "\u110f,\u116e,": "0xe1", + "\u110f,\u116f,": "0xe1", + "\u110f,\u1170,": "0xe1", + "\u110f,\u1171,": "0xe1", + "\u110f,\u1172,": "0xe1", + "\u110f,\u1173,": "0xe1", + "\u110f,\u1174,": "0xe1", + "\u110f,\u1175,": "0xe1", + "\u1110,\u1161,": "0xe1", + "\u1110,\u1162,": "0xe1", + "\u1110,\u1163,": "0xe1", + "\u1110,\u1164,": "0xe1", + "\u1110,\u1165,": "0xe1", + "\u1110,\u1166,": "0xe1", + "\u1110,\u1167,": "0xe1", + "\u1110,\u1168,": "0xe1", + "\u1110,\u1169,": "0xe1", + "\u1110,\u116a,": "0xe1", + "\u1110,\u116b,": "0xe1", + "\u1110,\u116c,": "0xe1", + "\u1110,\u116d,": "0xe1", + "\u1110,\u116e,": "0xe1", + "\u1110,\u116f,": "0xe1", + "\u1110,\u1170,": "0xe1", + "\u1110,\u1171,": "0xe1", + "\u1110,\u1172,": "0xe1", + "\u1110,\u1173,": "0xe1", + "\u1110,\u1174,": "0xe1", + "\u1110,\u1175,": "0xe1", + "\u1111,\u1161,": "0xe1", + "\u1111,\u1162,": "0xe1", + "\u1111,\u1163,": "0xe1", + "\u1111,\u1164,": "0xe1", + "\u1111,\u1165,": "0xe1", + "\u1111,\u1166,": "0xe1", + "\u1111,\u1167,": "0xe1", + "\u1111,\u1168,": "0xe1", + "\u1111,\u1169,": "0xe1", + "\u1111,\u116a,": "0xe1", + "\u1111,\u116b,": "0xe1", + "\u1111,\u116c,": "0xe1", + "\u1111,\u116d,": "0xe1", + "\u1111,\u116e,": "0xe1", + "\u1111,\u116f,": "0xe1", + "\u1111,\u1170,": "0xe1", + "\u1111,\u1171,": "0xe1", + "\u1111,\u1172,": "0xe1", + "\u1111,\u1173,": "0xe1", + "\u1111,\u1174,": "0xe1", + "\u1111,\u1175,": "0xe1", + "\u1112,\u1161,": "0xe1", + "\u1112,\u1162,": "0xe1", + "\u1112,\u1163,": "0xe1", + "\u1112,\u1164,": "0xe1", + "\u1112,\u1165,": "0xe1", + "\u1112,\u1166,": "0xe1", + "\u1112,\u1167,": "0xe1", + "\u1112,\u1168,": "0xe1", + "\u1112,\u1169,": "0xe1", + "\u1112,\u116a,": "0xe1", + "\u1112,\u116b,": "0xe1", + "\u1112,\u116c,": "0xe1", + "\u1112,\u116d,": "0xe1", + "\u1112,\u116e,": "0xe1", + "\u1112,\u116f,": "0xe1", + "\u1112,\u1170,": "0xe1", + "\u1112,\u1171,": "0xe1", + "\u1112,\u1172,": "0xe1", + "\u1112,\u1173,": "0xe1", + "\u1112,\u1174,": "0xe1", + "\u1112,\u1175,": "0xe1" + } + }, + { + "defaultGlyph": "0xff", + "alternatives": { + "\u110b,\u116f,": "0xff", + "\u1106,\u116f,": "0xff", + "\u110b,\u1171,": "0xff", + "\u1100,\u116f,": "0xff" + } + } + ], + "\u11ac": [ + null, + null, + null, + { + "defaultGlyph": "0xc9", + "alternatives": {} + }, + { + "defaultGlyph": "0xc9", + "alternatives": {} + }, + { + "defaultGlyph": "0xc9", + "alternatives": {} + } + ], + "\u11ad": [ + null, + null, + null, + { + "defaultGlyph": "0xca", + "alternatives": {} + }, + { + "defaultGlyph": "0xe2", + "alternatives": {} + }, + { + "defaultGlyph": "0xe2", + "alternatives": {} + } + ], + "\u11ae": [ + null, + null, + null, + { + "defaultGlyph": "0xcb", + "alternatives": {} + }, + { + "defaultGlyph": "0xe3", + "alternatives": {} + }, + { + "defaultGlyph": "0xe3", + "alternatives": {} + } + ], + "\u11af": [ + null, + null, + null, + { + "defaultGlyph": "0xcc", + "alternatives": {} + }, + { + "defaultGlyph": "0xe4", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x86", + "alternatives": { + "\u1112,\u116a,": "extra_0x86", + "\u1103,\u116c,": "extra_0x86", + "\u1104,\u1174,": "extra_0x86", + "\u1100,\u1161,": "extra_0x86", + "\u1100,\u1162,": "extra_0x86", + "\u1100,\u1163,": "extra_0x86", + "\u1100,\u1164,": "extra_0x86", + "\u1100,\u1165,": "extra_0x86", + "\u1100,\u1166,": "extra_0x86", + "\u1100,\u1167,": "extra_0x86", + "\u1100,\u1168,": "extra_0x86", + "\u1100,\u1169,": "extra_0x86", + "\u1100,\u116a,": "extra_0x86", + "\u1100,\u116b,": "extra_0x86", + "\u1100,\u116c,": "extra_0x86", + "\u1100,\u116d,": "extra_0x86", + "\u1100,\u116e,": "extra_0x86", + "\u1100,\u116f,": "extra_0x86", + "\u1100,\u1170,": "extra_0x86", + "\u1100,\u1171,": "extra_0x86", + "\u1100,\u1172,": "extra_0x86", + "\u1100,\u1173,": "extra_0x86", + "\u1100,\u1174,": "extra_0x86", + "\u1100,\u1175,": "extra_0x86", + "\u1101,\u1161,": "extra_0x86", + "\u1101,\u1162,": "extra_0x86", + "\u1101,\u1163,": "extra_0x86", + "\u1101,\u1164,": "extra_0x86", + "\u1101,\u1165,": "extra_0x86", + "\u1101,\u1166,": "extra_0x86", + "\u1101,\u1167,": "extra_0x86", + "\u1101,\u1168,": "extra_0x86", + "\u1101,\u1169,": "extra_0x86", + "\u1101,\u116a,": "extra_0x86", + "\u1101,\u116b,": "extra_0x86", + "\u1101,\u116c,": "extra_0x86", + "\u1101,\u116d,": "extra_0x86", + "\u1101,\u116e,": "extra_0x86", + "\u1101,\u116f,": "extra_0x86", + "\u1101,\u1170,": "extra_0x86", + "\u1101,\u1171,": "extra_0x86", + "\u1101,\u1172,": "extra_0x86", + "\u1101,\u1173,": "extra_0x86", + "\u1101,\u1174,": "extra_0x86", + "\u1101,\u1175,": "extra_0x86", + "\u1102,\u1161,": "extra_0x86", + "\u1102,\u1162,": "extra_0x86", + "\u1102,\u1163,": "extra_0x86", + "\u1102,\u1164,": "extra_0x86", + "\u1102,\u1165,": "extra_0x86", + "\u1102,\u1166,": "extra_0x86", + "\u1102,\u1167,": "extra_0x86", + "\u1102,\u1168,": "extra_0x86", + "\u1102,\u1169,": "extra_0x86", + "\u1102,\u116a,": "extra_0x86", + "\u1102,\u116b,": "extra_0x86", + "\u1102,\u116c,": "extra_0x86", + "\u1102,\u116d,": "extra_0x86", + "\u1102,\u116e,": "extra_0x86", + "\u1102,\u116f,": "extra_0x86", + "\u1102,\u1170,": "extra_0x86", + "\u1102,\u1171,": "extra_0x86", + "\u1102,\u1172,": "extra_0x86", + "\u1102,\u1173,": "extra_0x86", + "\u1102,\u1174,": "extra_0x86", + "\u1102,\u1175,": "extra_0x86", + "\u1103,\u1161,": "extra_0x86", + "\u1103,\u1162,": "extra_0x86", + "\u1103,\u1163,": "extra_0x86", + "\u1103,\u1164,": "extra_0x86", + "\u1103,\u1165,": "extra_0x86", + "\u1103,\u1166,": "extra_0x86", + "\u1103,\u1167,": "extra_0x86", + "\u1103,\u1168,": "extra_0x86", + "\u1103,\u1169,": "extra_0x86", + "\u1103,\u116a,": "extra_0x86", + "\u1103,\u116b,": "extra_0x86", + "\u1103,\u116d,": "extra_0x86", + "\u1103,\u116e,": "extra_0x86", + "\u1103,\u116f,": "extra_0x86", + "\u1103,\u1170,": "extra_0x86", + "\u1103,\u1171,": "extra_0x86", + "\u1103,\u1172,": "extra_0x86", + "\u1103,\u1173,": "extra_0x86", + "\u1103,\u1174,": "extra_0x86", + "\u1103,\u1175,": "extra_0x86", + "\u1104,\u1161,": "extra_0x86", + "\u1104,\u1162,": "extra_0x86", + "\u1104,\u1163,": "extra_0x86", + "\u1104,\u1164,": "extra_0x86", + "\u1104,\u1165,": "extra_0x86", + "\u1104,\u1166,": "extra_0x86", + "\u1104,\u1167,": "extra_0x86", + "\u1104,\u1168,": "extra_0x86", + "\u1104,\u1169,": "extra_0x86", + "\u1104,\u116a,": "extra_0x86", + "\u1104,\u116b,": "extra_0x86", + "\u1104,\u116c,": "extra_0x86", + "\u1104,\u116d,": "extra_0x86", + "\u1104,\u116e,": "extra_0x86", + "\u1104,\u116f,": "extra_0x86", + "\u1104,\u1170,": "extra_0x86", + "\u1104,\u1171,": "extra_0x86", + "\u1104,\u1172,": "extra_0x86", + "\u1104,\u1173,": "extra_0x86", + "\u1104,\u1175,": "extra_0x86", + "\u1105,\u1161,": "extra_0x86", + "\u1105,\u1162,": "extra_0x86", + "\u1105,\u1163,": "extra_0x86", + "\u1105,\u1164,": "extra_0x86", + "\u1105,\u1165,": "extra_0x86", + "\u1105,\u1166,": "extra_0x86", + "\u1105,\u1167,": "extra_0x86", + "\u1105,\u1168,": "extra_0x86", + "\u1105,\u1169,": "extra_0x86", + "\u1105,\u116a,": "extra_0x86", + "\u1105,\u116b,": "extra_0x86", + "\u1105,\u116c,": "extra_0x86", + "\u1105,\u116d,": "extra_0x86", + "\u1105,\u116e,": "extra_0x86", + "\u1105,\u116f,": "extra_0x86", + "\u1105,\u1170,": "extra_0x86", + "\u1105,\u1171,": "extra_0x86", + "\u1105,\u1172,": "extra_0x86", + "\u1105,\u1173,": "extra_0x86", + "\u1105,\u1174,": "extra_0x86", + "\u1105,\u1175,": "extra_0x86", + "\u1106,\u1161,": "extra_0x86", + "\u1106,\u1162,": "extra_0x86", + "\u1106,\u1163,": "extra_0x86", + "\u1106,\u1164,": "extra_0x86", + "\u1106,\u1165,": "extra_0x86", + "\u1106,\u1166,": "extra_0x86", + "\u1106,\u1167,": "extra_0x86", + "\u1106,\u1168,": "extra_0x86", + "\u1106,\u1169,": "extra_0x86", + "\u1106,\u116a,": "extra_0x86", + "\u1106,\u116b,": "extra_0x86", + "\u1106,\u116c,": "extra_0x86", + "\u1106,\u116d,": "extra_0x86", + "\u1106,\u116e,": "extra_0x86", + "\u1106,\u116f,": "extra_0x86", + "\u1106,\u1170,": "extra_0x86", + "\u1106,\u1171,": "extra_0x86", + "\u1106,\u1172,": "extra_0x86", + "\u1106,\u1173,": "extra_0x86", + "\u1106,\u1174,": "extra_0x86", + "\u1106,\u1175,": "extra_0x86", + "\u1107,\u1161,": "extra_0x86", + "\u1107,\u1162,": "extra_0x86", + "\u1107,\u1163,": "extra_0x86", + "\u1107,\u1164,": "extra_0x86", + "\u1107,\u1165,": "extra_0x86", + "\u1107,\u1166,": "extra_0x86", + "\u1107,\u1167,": "extra_0x86", + "\u1107,\u1168,": "extra_0x86", + "\u1107,\u1169,": "extra_0x86", + "\u1107,\u116a,": "extra_0x86", + "\u1107,\u116b,": "extra_0x86", + "\u1107,\u116c,": "extra_0x86", + "\u1107,\u116d,": "extra_0x86", + "\u1107,\u116e,": "extra_0x86", + "\u1107,\u116f,": "extra_0x86", + "\u1107,\u1170,": "extra_0x86", + "\u1107,\u1171,": "extra_0x86", + "\u1107,\u1172,": "extra_0x86", + "\u1107,\u1173,": "extra_0x86", + "\u1107,\u1174,": "extra_0x86", + "\u1107,\u1175,": "extra_0x86", + "\u1108,\u1161,": "extra_0x86", + "\u1108,\u1162,": "extra_0x86", + "\u1108,\u1163,": "extra_0x86", + "\u1108,\u1164,": "extra_0x86", + "\u1108,\u1165,": "extra_0x86", + "\u1108,\u1166,": "extra_0x86", + "\u1108,\u1167,": "extra_0x86", + "\u1108,\u1168,": "extra_0x86", + "\u1108,\u1169,": "extra_0x86", + "\u1108,\u116a,": "extra_0x86", + "\u1108,\u116b,": "extra_0x86", + "\u1108,\u116c,": "extra_0x86", + "\u1108,\u116d,": "extra_0x86", + "\u1108,\u116e,": "extra_0x86", + "\u1108,\u116f,": "extra_0x86", + "\u1108,\u1170,": "extra_0x86", + "\u1108,\u1171,": "extra_0x86", + "\u1108,\u1172,": "extra_0x86", + "\u1108,\u1173,": "extra_0x86", + "\u1108,\u1174,": "extra_0x86", + "\u1108,\u1175,": "extra_0x86", + "\u1109,\u1161,": "extra_0x86", + "\u1109,\u1162,": "extra_0x86", + "\u1109,\u1163,": "extra_0x86", + "\u1109,\u1164,": "extra_0x86", + "\u1109,\u1165,": "extra_0x86", + "\u1109,\u1166,": "extra_0x86", + "\u1109,\u1167,": "extra_0x86", + "\u1109,\u1168,": "extra_0x86", + "\u1109,\u1169,": "extra_0x86", + "\u1109,\u116a,": "extra_0x86", + "\u1109,\u116b,": "extra_0x86", + "\u1109,\u116c,": "extra_0x86", + "\u1109,\u116d,": "extra_0x86", + "\u1109,\u116e,": "extra_0x86", + "\u1109,\u116f,": "extra_0x86", + "\u1109,\u1170,": "extra_0x86", + "\u1109,\u1171,": "extra_0x86", + "\u1109,\u1172,": "extra_0x86", + "\u1109,\u1173,": "extra_0x86", + "\u1109,\u1174,": "extra_0x86", + "\u1109,\u1175,": "extra_0x86", + "\u110a,\u1161,": "extra_0x86", + "\u110a,\u1162,": "extra_0x86", + "\u110a,\u1163,": "extra_0x86", + "\u110a,\u1164,": "extra_0x86", + "\u110a,\u1165,": "extra_0x86", + "\u110a,\u1166,": "extra_0x86", + "\u110a,\u1167,": "extra_0x86", + "\u110a,\u1168,": "extra_0x86", + "\u110a,\u1169,": "extra_0x86", + "\u110a,\u116a,": "extra_0x86", + "\u110a,\u116b,": "extra_0x86", + "\u110a,\u116c,": "extra_0x86", + "\u110a,\u116d,": "extra_0x86", + "\u110a,\u116e,": "extra_0x86", + "\u110a,\u116f,": "extra_0x86", + "\u110a,\u1170,": "extra_0x86", + "\u110a,\u1171,": "extra_0x86", + "\u110a,\u1172,": "extra_0x86", + "\u110a,\u1173,": "extra_0x86", + "\u110a,\u1174,": "extra_0x86", + "\u110a,\u1175,": "extra_0x86", + "\u110b,\u1161,": "extra_0x86", + "\u110b,\u1162,": "extra_0x86", + "\u110b,\u1163,": "extra_0x86", + "\u110b,\u1164,": "extra_0x86", + "\u110b,\u1165,": "extra_0x86", + "\u110b,\u1166,": "extra_0x86", + "\u110b,\u1167,": "extra_0x86", + "\u110b,\u1168,": "extra_0x86", + "\u110b,\u1169,": "extra_0x86", + "\u110b,\u116a,": "extra_0x86", + "\u110b,\u116b,": "extra_0x86", + "\u110b,\u116c,": "extra_0x86", + "\u110b,\u116d,": "extra_0x86", + "\u110b,\u116e,": "extra_0x86", + "\u110b,\u116f,": "extra_0x86", + "\u110b,\u1170,": "extra_0x86", + "\u110b,\u1171,": "extra_0x86", + "\u110b,\u1172,": "extra_0x86", + "\u110b,\u1173,": "extra_0x86", + "\u110b,\u1174,": "extra_0x86", + "\u110b,\u1175,": "extra_0x86", + "\u110c,\u1161,": "extra_0x86", + "\u110c,\u1162,": "extra_0x86", + "\u110c,\u1163,": "extra_0x86", + "\u110c,\u1164,": "extra_0x86", + "\u110c,\u1165,": "extra_0x86", + "\u110c,\u1166,": "extra_0x86", + "\u110c,\u1167,": "extra_0x86", + "\u110c,\u1168,": "extra_0x86", + "\u110c,\u1169,": "extra_0x86", + "\u110c,\u116a,": "extra_0x86", + "\u110c,\u116b,": "extra_0x86", + "\u110c,\u116c,": "extra_0x86", + "\u110c,\u116d,": "extra_0x86", + "\u110c,\u116e,": "extra_0x86", + "\u110c,\u116f,": "extra_0x86", + "\u110c,\u1170,": "extra_0x86", + "\u110c,\u1171,": "extra_0x86", + "\u110c,\u1172,": "extra_0x86", + "\u110c,\u1173,": "extra_0x86", + "\u110c,\u1174,": "extra_0x86", + "\u110c,\u1175,": "extra_0x86", + "\u110d,\u1161,": "extra_0x86", + "\u110d,\u1162,": "extra_0x86", + "\u110d,\u1163,": "extra_0x86", + "\u110d,\u1164,": "extra_0x86", + "\u110d,\u1165,": "extra_0x86", + "\u110d,\u1166,": "extra_0x86", + "\u110d,\u1167,": "extra_0x86", + "\u110d,\u1168,": "extra_0x86", + "\u110d,\u1169,": "extra_0x86", + "\u110d,\u116a,": "extra_0x86", + "\u110d,\u116b,": "extra_0x86", + "\u110d,\u116c,": "extra_0x86", + "\u110d,\u116d,": "extra_0x86", + "\u110d,\u116e,": "extra_0x86", + "\u110d,\u116f,": "extra_0x86", + "\u110d,\u1170,": "extra_0x86", + "\u110d,\u1171,": "extra_0x86", + "\u110d,\u1172,": "extra_0x86", + "\u110d,\u1173,": "extra_0x86", + "\u110d,\u1174,": "extra_0x86", + "\u110d,\u1175,": "extra_0x86", + "\u110e,\u1161,": "extra_0x86", + "\u110e,\u1162,": "extra_0x86", + "\u110e,\u1163,": "extra_0x86", + "\u110e,\u1164,": "extra_0x86", + "\u110e,\u1165,": "extra_0x86", + "\u110e,\u1166,": "extra_0x86", + "\u110e,\u1167,": "extra_0x86", + "\u110e,\u1168,": "extra_0x86", + "\u110e,\u1169,": "extra_0x86", + "\u110e,\u116a,": "extra_0x86", + "\u110e,\u116b,": "extra_0x86", + "\u110e,\u116c,": "extra_0x86", + "\u110e,\u116d,": "extra_0x86", + "\u110e,\u116e,": "extra_0x86", + "\u110e,\u116f,": "extra_0x86", + "\u110e,\u1170,": "extra_0x86", + "\u110e,\u1171,": "extra_0x86", + "\u110e,\u1172,": "extra_0x86", + "\u110e,\u1173,": "extra_0x86", + "\u110e,\u1174,": "extra_0x86", + "\u110e,\u1175,": "extra_0x86", + "\u110f,\u1161,": "extra_0x86", + "\u110f,\u1162,": "extra_0x86", + "\u110f,\u1163,": "extra_0x86", + "\u110f,\u1164,": "extra_0x86", + "\u110f,\u1165,": "extra_0x86", + "\u110f,\u1166,": "extra_0x86", + "\u110f,\u1167,": "extra_0x86", + "\u110f,\u1168,": "extra_0x86", + "\u110f,\u1169,": "extra_0x86", + "\u110f,\u116a,": "extra_0x86", + "\u110f,\u116b,": "extra_0x86", + "\u110f,\u116c,": "extra_0x86", + "\u110f,\u116d,": "extra_0x86", + "\u110f,\u116e,": "extra_0x86", + "\u110f,\u116f,": "extra_0x86", + "\u110f,\u1170,": "extra_0x86", + "\u110f,\u1171,": "extra_0x86", + "\u110f,\u1172,": "extra_0x86", + "\u110f,\u1173,": "extra_0x86", + "\u110f,\u1174,": "extra_0x86", + "\u110f,\u1175,": "extra_0x86", + "\u1110,\u1161,": "extra_0x86", + "\u1110,\u1162,": "extra_0x86", + "\u1110,\u1163,": "extra_0x86", + "\u1110,\u1164,": "extra_0x86", + "\u1110,\u1165,": "extra_0x86", + "\u1110,\u1166,": "extra_0x86", + "\u1110,\u1167,": "extra_0x86", + "\u1110,\u1168,": "extra_0x86", + "\u1110,\u1169,": "extra_0x86", + "\u1110,\u116a,": "extra_0x86", + "\u1110,\u116b,": "extra_0x86", + "\u1110,\u116c,": "extra_0x86", + "\u1110,\u116d,": "extra_0x86", + "\u1110,\u116e,": "extra_0x86", + "\u1110,\u116f,": "extra_0x86", + "\u1110,\u1170,": "extra_0x86", + "\u1110,\u1171,": "extra_0x86", + "\u1110,\u1172,": "extra_0x86", + "\u1110,\u1173,": "extra_0x86", + "\u1110,\u1174,": "extra_0x86", + "\u1110,\u1175,": "extra_0x86", + "\u1111,\u1161,": "extra_0x86", + "\u1111,\u1162,": "extra_0x86", + "\u1111,\u1163,": "extra_0x86", + "\u1111,\u1164,": "extra_0x86", + "\u1111,\u1165,": "extra_0x86", + "\u1111,\u1166,": "extra_0x86", + "\u1111,\u1167,": "extra_0x86", + "\u1111,\u1168,": "extra_0x86", + "\u1111,\u1169,": "extra_0x86", + "\u1111,\u116a,": "extra_0x86", + "\u1111,\u116b,": "extra_0x86", + "\u1111,\u116c,": "extra_0x86", + "\u1111,\u116d,": "extra_0x86", + "\u1111,\u116e,": "extra_0x86", + "\u1111,\u116f,": "extra_0x86", + "\u1111,\u1170,": "extra_0x86", + "\u1111,\u1171,": "extra_0x86", + "\u1111,\u1172,": "extra_0x86", + "\u1111,\u1173,": "extra_0x86", + "\u1111,\u1174,": "extra_0x86", + "\u1111,\u1175,": "extra_0x86", + "\u1112,\u1161,": "extra_0x86", + "\u1112,\u1162,": "extra_0x86", + "\u1112,\u1163,": "extra_0x86", + "\u1112,\u1164,": "extra_0x86", + "\u1112,\u1165,": "extra_0x86", + "\u1112,\u1166,": "extra_0x86", + "\u1112,\u1167,": "extra_0x86", + "\u1112,\u1168,": "extra_0x86", + "\u1112,\u1169,": "extra_0x86", + "\u1112,\u116b,": "extra_0x86", + "\u1112,\u116c,": "extra_0x86", + "\u1112,\u116d,": "extra_0x86", + "\u1112,\u116e,": "extra_0x86", + "\u1112,\u116f,": "extra_0x86", + "\u1112,\u1170,": "extra_0x86", + "\u1112,\u1171,": "extra_0x86", + "\u1112,\u1172,": "extra_0x86", + "\u1112,\u1173,": "extra_0x86", + "\u1112,\u1174,": "extra_0x86", + "\u1112,\u1175,": "extra_0x86" + } + } + ], + "\u11b0": [ + null, + null, + null, + { + "defaultGlyph": "0xcd", + "alternatives": {} + }, + { + "defaultGlyph": "0xe5", + "alternatives": {} + }, + { + "defaultGlyph": "0xe5", + "alternatives": {} + } + ], + "\u11b1": [ + null, + null, + null, + { + "defaultGlyph": "0xce", + "alternatives": {} + }, + { + "defaultGlyph": "0xe6", + "alternatives": {} + }, + { + "defaultGlyph": "0xf8", + "alternatives": {} + } + ], + "\u11b2": [ + null, + null, + null, + { + "defaultGlyph": "0xcf", + "alternatives": {} + }, + { + "defaultGlyph": "0xcf", + "alternatives": {} + }, + { + "defaultGlyph": "0xcf", + "alternatives": {} + } + ], + "\u11b3": [ + null, + null, + null, + { + "defaultGlyph": "0xe7", + "alternatives": {} + }, + { + "defaultGlyph": "0xe7", + "alternatives": {} + }, + { + "defaultGlyph": "0xe7", + "alternatives": {} + } + ], + "\u11b4": [ + null, + null, + null, + { + "defaultGlyph": "0xd0", + "alternatives": {} + }, + { + "defaultGlyph": "0xe8", + "alternatives": {} + }, + { + "defaultGlyph": "0xe8", + "alternatives": {} + } + ], + "\u11b5": [ + null, + null, + null, + { + "defaultGlyph": "0xe9", + "alternatives": {} + }, + { + "defaultGlyph": "0xe9", + "alternatives": {} + }, + { + "defaultGlyph": "0xe9", + "alternatives": {} + } + ], + "\u11b6": [ + null, + null, + null, + { + "defaultGlyph": "0xd1", + "alternatives": {} + }, + { + "defaultGlyph": "0xea", + "alternatives": {} + }, + { + "defaultGlyph": "0xea", + "alternatives": {} + } + ], + "\u11b7": [ + null, + null, + null, + { + "defaultGlyph": "0xd2", + "alternatives": {} + }, + { + "defaultGlyph": "0xeb", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x87", + "alternatives": { + "\u1100,\u1161,": "extra_0x87", + "\u1100,\u1162,": "extra_0x87", + "\u1100,\u1163,": "extra_0x87", + "\u1100,\u1164,": "extra_0x87", + "\u1100,\u1165,": "extra_0x87", + "\u1100,\u1166,": "extra_0x87", + "\u1100,\u1167,": "extra_0x87", + "\u1100,\u1168,": "extra_0x87", + "\u1100,\u1169,": "extra_0x87", + "\u1100,\u116a,": "extra_0x87", + "\u1100,\u116b,": "extra_0x87", + "\u1100,\u116c,": "extra_0x87", + "\u1100,\u116d,": "extra_0x87", + "\u1100,\u116e,": "extra_0x87", + "\u1100,\u116f,": "extra_0x87", + "\u1100,\u1170,": "extra_0x87", + "\u1100,\u1171,": "extra_0x87", + "\u1100,\u1172,": "extra_0x87", + "\u1100,\u1173,": "extra_0x87", + "\u1100,\u1174,": "extra_0x87", + "\u1100,\u1175,": "extra_0x87", + "\u1101,\u1161,": "extra_0x87", + "\u1101,\u1162,": "extra_0x87", + "\u1101,\u1163,": "extra_0x87", + "\u1101,\u1164,": "extra_0x87", + "\u1101,\u1165,": "extra_0x87", + "\u1101,\u1166,": "extra_0x87", + "\u1101,\u1167,": "extra_0x87", + "\u1101,\u1168,": "extra_0x87", + "\u1101,\u1169,": "extra_0x87", + "\u1101,\u116a,": "extra_0x87", + "\u1101,\u116b,": "extra_0x87", + "\u1101,\u116c,": "extra_0x87", + "\u1101,\u116d,": "extra_0x87", + "\u1101,\u116e,": "extra_0x87", + "\u1101,\u116f,": "extra_0x87", + "\u1101,\u1170,": "extra_0x87", + "\u1101,\u1171,": "extra_0x87", + "\u1101,\u1172,": "extra_0x87", + "\u1101,\u1173,": "extra_0x87", + "\u1101,\u1174,": "extra_0x87", + "\u1101,\u1175,": "extra_0x87", + "\u1102,\u1161,": "extra_0x87", + "\u1102,\u1162,": "extra_0x87", + "\u1102,\u1163,": "extra_0x87", + "\u1102,\u1164,": "extra_0x87", + "\u1102,\u1165,": "extra_0x87", + "\u1102,\u1166,": "extra_0x87", + "\u1102,\u1167,": "extra_0x87", + "\u1102,\u1168,": "extra_0x87", + "\u1102,\u1169,": "extra_0x87", + "\u1102,\u116a,": "extra_0x87", + "\u1102,\u116b,": "extra_0x87", + "\u1102,\u116c,": "extra_0x87", + "\u1102,\u116d,": "extra_0x87", + "\u1102,\u116e,": "extra_0x87", + "\u1102,\u116f,": "extra_0x87", + "\u1102,\u1170,": "extra_0x87", + "\u1102,\u1171,": "extra_0x87", + "\u1102,\u1172,": "extra_0x87", + "\u1102,\u1173,": "extra_0x87", + "\u1102,\u1174,": "extra_0x87", + "\u1102,\u1175,": "extra_0x87", + "\u1103,\u1161,": "extra_0x87", + "\u1103,\u1162,": "extra_0x87", + "\u1103,\u1163,": "extra_0x87", + "\u1103,\u1164,": "extra_0x87", + "\u1103,\u1165,": "extra_0x87", + "\u1103,\u1166,": "extra_0x87", + "\u1103,\u1167,": "extra_0x87", + "\u1103,\u1168,": "extra_0x87", + "\u1103,\u1169,": "extra_0x87", + "\u1103,\u116a,": "extra_0x87", + "\u1103,\u116b,": "extra_0x87", + "\u1103,\u116c,": "extra_0x87", + "\u1103,\u116d,": "extra_0x87", + "\u1103,\u116e,": "extra_0x87", + "\u1103,\u116f,": "extra_0x87", + "\u1103,\u1170,": "extra_0x87", + "\u1103,\u1171,": "extra_0x87", + "\u1103,\u1172,": "extra_0x87", + "\u1103,\u1173,": "extra_0x87", + "\u1103,\u1174,": "extra_0x87", + "\u1103,\u1175,": "extra_0x87", + "\u1104,\u1161,": "extra_0x87", + "\u1104,\u1162,": "extra_0x87", + "\u1104,\u1163,": "extra_0x87", + "\u1104,\u1164,": "extra_0x87", + "\u1104,\u1165,": "extra_0x87", + "\u1104,\u1166,": "extra_0x87", + "\u1104,\u1167,": "extra_0x87", + "\u1104,\u1168,": "extra_0x87", + "\u1104,\u1169,": "extra_0x87", + "\u1104,\u116a,": "extra_0x87", + "\u1104,\u116b,": "extra_0x87", + "\u1104,\u116c,": "extra_0x87", + "\u1104,\u116d,": "extra_0x87", + "\u1104,\u116e,": "extra_0x87", + "\u1104,\u116f,": "extra_0x87", + "\u1104,\u1170,": "extra_0x87", + "\u1104,\u1171,": "extra_0x87", + "\u1104,\u1172,": "extra_0x87", + "\u1104,\u1173,": "extra_0x87", + "\u1104,\u1174,": "extra_0x87", + "\u1104,\u1175,": "extra_0x87", + "\u1105,\u1161,": "extra_0x87", + "\u1105,\u1162,": "extra_0x87", + "\u1105,\u1163,": "extra_0x87", + "\u1105,\u1164,": "extra_0x87", + "\u1105,\u1165,": "extra_0x87", + "\u1105,\u1166,": "extra_0x87", + "\u1105,\u1167,": "extra_0x87", + "\u1105,\u1168,": "extra_0x87", + "\u1105,\u1169,": "extra_0x87", + "\u1105,\u116a,": "extra_0x87", + "\u1105,\u116b,": "extra_0x87", + "\u1105,\u116c,": "extra_0x87", + "\u1105,\u116d,": "extra_0x87", + "\u1105,\u116e,": "extra_0x87", + "\u1105,\u116f,": "extra_0x87", + "\u1105,\u1170,": "extra_0x87", + "\u1105,\u1171,": "extra_0x87", + "\u1105,\u1172,": "extra_0x87", + "\u1105,\u1173,": "extra_0x87", + "\u1105,\u1174,": "extra_0x87", + "\u1105,\u1175,": "extra_0x87", + "\u1106,\u1161,": "extra_0x87", + "\u1106,\u1162,": "extra_0x87", + "\u1106,\u1163,": "extra_0x87", + "\u1106,\u1164,": "extra_0x87", + "\u1106,\u1165,": "extra_0x87", + "\u1106,\u1166,": "extra_0x87", + "\u1106,\u1167,": "extra_0x87", + "\u1106,\u1168,": "extra_0x87", + "\u1106,\u1169,": "extra_0x87", + "\u1106,\u116a,": "extra_0x87", + "\u1106,\u116b,": "extra_0x87", + "\u1106,\u116c,": "extra_0x87", + "\u1106,\u116d,": "extra_0x87", + "\u1106,\u116e,": "extra_0x87", + "\u1106,\u116f,": "extra_0x87", + "\u1106,\u1170,": "extra_0x87", + "\u1106,\u1171,": "extra_0x87", + "\u1106,\u1172,": "extra_0x87", + "\u1106,\u1173,": "extra_0x87", + "\u1106,\u1174,": "extra_0x87", + "\u1106,\u1175,": "extra_0x87", + "\u1107,\u1161,": "extra_0x87", + "\u1107,\u1162,": "extra_0x87", + "\u1107,\u1163,": "extra_0x87", + "\u1107,\u1164,": "extra_0x87", + "\u1107,\u1165,": "extra_0x87", + "\u1107,\u1166,": "extra_0x87", + "\u1107,\u1167,": "extra_0x87", + "\u1107,\u1168,": "extra_0x87", + "\u1107,\u1169,": "extra_0x87", + "\u1107,\u116a,": "extra_0x87", + "\u1107,\u116b,": "extra_0x87", + "\u1107,\u116c,": "extra_0x87", + "\u1107,\u116d,": "extra_0x87", + "\u1107,\u116e,": "extra_0x87", + "\u1107,\u116f,": "extra_0x87", + "\u1107,\u1170,": "extra_0x87", + "\u1107,\u1171,": "extra_0x87", + "\u1107,\u1172,": "extra_0x87", + "\u1107,\u1173,": "extra_0x87", + "\u1107,\u1174,": "extra_0x87", + "\u1107,\u1175,": "extra_0x87", + "\u1108,\u1161,": "extra_0x87", + "\u1108,\u1162,": "extra_0x87", + "\u1108,\u1163,": "extra_0x87", + "\u1108,\u1164,": "extra_0x87", + "\u1108,\u1165,": "extra_0x87", + "\u1108,\u1166,": "extra_0x87", + "\u1108,\u1167,": "extra_0x87", + "\u1108,\u1168,": "extra_0x87", + "\u1108,\u1169,": "extra_0x87", + "\u1108,\u116a,": "extra_0x87", + "\u1108,\u116b,": "extra_0x87", + "\u1108,\u116c,": "extra_0x87", + "\u1108,\u116d,": "extra_0x87", + "\u1108,\u116e,": "extra_0x87", + "\u1108,\u116f,": "extra_0x87", + "\u1108,\u1170,": "extra_0x87", + "\u1108,\u1171,": "extra_0x87", + "\u1108,\u1172,": "extra_0x87", + "\u1108,\u1173,": "extra_0x87", + "\u1108,\u1174,": "extra_0x87", + "\u1108,\u1175,": "extra_0x87", + "\u1109,\u1161,": "extra_0x87", + "\u1109,\u1162,": "extra_0x87", + "\u1109,\u1163,": "extra_0x87", + "\u1109,\u1164,": "extra_0x87", + "\u1109,\u1165,": "extra_0x87", + "\u1109,\u1166,": "extra_0x87", + "\u1109,\u1167,": "extra_0x87", + "\u1109,\u1168,": "extra_0x87", + "\u1109,\u1169,": "extra_0x87", + "\u1109,\u116a,": "extra_0x87", + "\u1109,\u116b,": "extra_0x87", + "\u1109,\u116c,": "extra_0x87", + "\u1109,\u116d,": "extra_0x87", + "\u1109,\u116e,": "extra_0x87", + "\u1109,\u116f,": "extra_0x87", + "\u1109,\u1170,": "extra_0x87", + "\u1109,\u1171,": "extra_0x87", + "\u1109,\u1172,": "extra_0x87", + "\u1109,\u1173,": "extra_0x87", + "\u1109,\u1174,": "extra_0x87", + "\u1109,\u1175,": "extra_0x87", + "\u110a,\u1161,": "extra_0x87", + "\u110a,\u1162,": "extra_0x87", + "\u110a,\u1163,": "extra_0x87", + "\u110a,\u1164,": "extra_0x87", + "\u110a,\u1165,": "extra_0x87", + "\u110a,\u1166,": "extra_0x87", + "\u110a,\u1167,": "extra_0x87", + "\u110a,\u1168,": "extra_0x87", + "\u110a,\u1169,": "extra_0x87", + "\u110a,\u116a,": "extra_0x87", + "\u110a,\u116b,": "extra_0x87", + "\u110a,\u116c,": "extra_0x87", + "\u110a,\u116d,": "extra_0x87", + "\u110a,\u116e,": "extra_0x87", + "\u110a,\u116f,": "extra_0x87", + "\u110a,\u1170,": "extra_0x87", + "\u110a,\u1171,": "extra_0x87", + "\u110a,\u1172,": "extra_0x87", + "\u110a,\u1173,": "extra_0x87", + "\u110a,\u1174,": "extra_0x87", + "\u110a,\u1175,": "extra_0x87", + "\u110b,\u1161,": "extra_0x87", + "\u110b,\u1162,": "extra_0x87", + "\u110b,\u1163,": "extra_0x87", + "\u110b,\u1164,": "extra_0x87", + "\u110b,\u1165,": "extra_0x87", + "\u110b,\u1166,": "extra_0x87", + "\u110b,\u1167,": "extra_0x87", + "\u110b,\u1168,": "extra_0x87", + "\u110b,\u1169,": "extra_0x87", + "\u110b,\u116a,": "extra_0x87", + "\u110b,\u116b,": "extra_0x87", + "\u110b,\u116c,": "extra_0x87", + "\u110b,\u116d,": "extra_0x87", + "\u110b,\u116e,": "extra_0x87", + "\u110b,\u116f,": "extra_0x87", + "\u110b,\u1170,": "extra_0x87", + "\u110b,\u1171,": "extra_0x87", + "\u110b,\u1172,": "extra_0x87", + "\u110b,\u1173,": "extra_0x87", + "\u110b,\u1174,": "extra_0x87", + "\u110b,\u1175,": "extra_0x87", + "\u110c,\u1161,": "extra_0x87", + "\u110c,\u1162,": "extra_0x87", + "\u110c,\u1163,": "extra_0x87", + "\u110c,\u1164,": "extra_0x87", + "\u110c,\u1165,": "extra_0x87", + "\u110c,\u1166,": "extra_0x87", + "\u110c,\u1167,": "extra_0x87", + "\u110c,\u1168,": "extra_0x87", + "\u110c,\u1169,": "extra_0x87", + "\u110c,\u116a,": "extra_0x87", + "\u110c,\u116b,": "extra_0x87", + "\u110c,\u116c,": "extra_0x87", + "\u110c,\u116d,": "extra_0x87", + "\u110c,\u116e,": "extra_0x87", + "\u110c,\u116f,": "extra_0x87", + "\u110c,\u1170,": "extra_0x87", + "\u110c,\u1171,": "extra_0x87", + "\u110c,\u1172,": "extra_0x87", + "\u110c,\u1173,": "extra_0x87", + "\u110c,\u1174,": "extra_0x87", + "\u110c,\u1175,": "extra_0x87", + "\u110d,\u1161,": "extra_0x87", + "\u110d,\u1162,": "extra_0x87", + "\u110d,\u1163,": "extra_0x87", + "\u110d,\u1164,": "extra_0x87", + "\u110d,\u1165,": "extra_0x87", + "\u110d,\u1166,": "extra_0x87", + "\u110d,\u1167,": "extra_0x87", + "\u110d,\u1168,": "extra_0x87", + "\u110d,\u1169,": "extra_0x87", + "\u110d,\u116a,": "extra_0x87", + "\u110d,\u116b,": "extra_0x87", + "\u110d,\u116c,": "extra_0x87", + "\u110d,\u116d,": "extra_0x87", + "\u110d,\u116e,": "extra_0x87", + "\u110d,\u116f,": "extra_0x87", + "\u110d,\u1170,": "extra_0x87", + "\u110d,\u1171,": "extra_0x87", + "\u110d,\u1172,": "extra_0x87", + "\u110d,\u1173,": "extra_0x87", + "\u110d,\u1174,": "extra_0x87", + "\u110d,\u1175,": "extra_0x87", + "\u110e,\u1161,": "extra_0x87", + "\u110e,\u1162,": "extra_0x87", + "\u110e,\u1163,": "extra_0x87", + "\u110e,\u1164,": "extra_0x87", + "\u110e,\u1165,": "extra_0x87", + "\u110e,\u1166,": "extra_0x87", + "\u110e,\u1167,": "extra_0x87", + "\u110e,\u1168,": "extra_0x87", + "\u110e,\u1169,": "extra_0x87", + "\u110e,\u116a,": "extra_0x87", + "\u110e,\u116b,": "extra_0x87", + "\u110e,\u116c,": "extra_0x87", + "\u110e,\u116d,": "extra_0x87", + "\u110e,\u116e,": "extra_0x87", + "\u110e,\u116f,": "extra_0x87", + "\u110e,\u1170,": "extra_0x87", + "\u110e,\u1171,": "extra_0x87", + "\u110e,\u1172,": "extra_0x87", + "\u110e,\u1173,": "extra_0x87", + "\u110e,\u1174,": "extra_0x87", + "\u110e,\u1175,": "extra_0x87", + "\u110f,\u1161,": "extra_0x87", + "\u110f,\u1162,": "extra_0x87", + "\u110f,\u1163,": "extra_0x87", + "\u110f,\u1164,": "extra_0x87", + "\u110f,\u1165,": "extra_0x87", + "\u110f,\u1166,": "extra_0x87", + "\u110f,\u1167,": "extra_0x87", + "\u110f,\u1168,": "extra_0x87", + "\u110f,\u1169,": "extra_0x87", + "\u110f,\u116a,": "extra_0x87", + "\u110f,\u116b,": "extra_0x87", + "\u110f,\u116c,": "extra_0x87", + "\u110f,\u116d,": "extra_0x87", + "\u110f,\u116e,": "extra_0x87", + "\u110f,\u116f,": "extra_0x87", + "\u110f,\u1170,": "extra_0x87", + "\u110f,\u1171,": "extra_0x87", + "\u110f,\u1172,": "extra_0x87", + "\u110f,\u1173,": "extra_0x87", + "\u110f,\u1174,": "extra_0x87", + "\u110f,\u1175,": "extra_0x87", + "\u1110,\u1161,": "extra_0x87", + "\u1110,\u1162,": "extra_0x87", + "\u1110,\u1163,": "extra_0x87", + "\u1110,\u1164,": "extra_0x87", + "\u1110,\u1165,": "extra_0x87", + "\u1110,\u1166,": "extra_0x87", + "\u1110,\u1167,": "extra_0x87", + "\u1110,\u1168,": "extra_0x87", + "\u1110,\u1169,": "extra_0x87", + "\u1110,\u116a,": "extra_0x87", + "\u1110,\u116b,": "extra_0x87", + "\u1110,\u116c,": "extra_0x87", + "\u1110,\u116d,": "extra_0x87", + "\u1110,\u116e,": "extra_0x87", + "\u1110,\u116f,": "extra_0x87", + "\u1110,\u1170,": "extra_0x87", + "\u1110,\u1171,": "extra_0x87", + "\u1110,\u1172,": "extra_0x87", + "\u1110,\u1173,": "extra_0x87", + "\u1110,\u1174,": "extra_0x87", + "\u1110,\u1175,": "extra_0x87", + "\u1111,\u1161,": "extra_0x87", + "\u1111,\u1162,": "extra_0x87", + "\u1111,\u1163,": "extra_0x87", + "\u1111,\u1164,": "extra_0x87", + "\u1111,\u1165,": "extra_0x87", + "\u1111,\u1166,": "extra_0x87", + "\u1111,\u1167,": "extra_0x87", + "\u1111,\u1168,": "extra_0x87", + "\u1111,\u1169,": "extra_0x87", + "\u1111,\u116a,": "extra_0x87", + "\u1111,\u116b,": "extra_0x87", + "\u1111,\u116c,": "extra_0x87", + "\u1111,\u116d,": "extra_0x87", + "\u1111,\u116e,": "extra_0x87", + "\u1111,\u116f,": "extra_0x87", + "\u1111,\u1170,": "extra_0x87", + "\u1111,\u1171,": "extra_0x87", + "\u1111,\u1172,": "extra_0x87", + "\u1111,\u1173,": "extra_0x87", + "\u1111,\u1174,": "extra_0x87", + "\u1111,\u1175,": "extra_0x87", + "\u1112,\u1161,": "extra_0x87", + "\u1112,\u1162,": "extra_0x87", + "\u1112,\u1163,": "extra_0x87", + "\u1112,\u1164,": "extra_0x87", + "\u1112,\u1165,": "extra_0x87", + "\u1112,\u1166,": "extra_0x87", + "\u1112,\u1167,": "extra_0x87", + "\u1112,\u1168,": "extra_0x87", + "\u1112,\u1169,": "extra_0x87", + "\u1112,\u116a,": "extra_0x87", + "\u1112,\u116b,": "extra_0x87", + "\u1112,\u116c,": "extra_0x87", + "\u1112,\u116d,": "extra_0x87", + "\u1112,\u116e,": "extra_0x87", + "\u1112,\u116f,": "extra_0x87", + "\u1112,\u1170,": "extra_0x87", + "\u1112,\u1171,": "extra_0x87", + "\u1112,\u1172,": "extra_0x87", + "\u1112,\u1173,": "extra_0x87", + "\u1112,\u1174,": "extra_0x87", + "\u1112,\u1175,": "extra_0x87" + } + } + ], + "\u11b8": [ + null, + null, + null, + { + "defaultGlyph": "0xd3", + "alternatives": {} + }, + { + "defaultGlyph": "0xec", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x88", + "alternatives": { + "\u1103,\u116c,": "extra_0x88", + "\u1100,\u1161,": "extra_0x88", + "\u1100,\u1162,": "extra_0x88", + "\u1100,\u1163,": "extra_0x88", + "\u1100,\u1164,": "extra_0x88", + "\u1100,\u1165,": "extra_0x88", + "\u1100,\u1166,": "extra_0x88", + "\u1100,\u1167,": "extra_0x88", + "\u1100,\u1168,": "extra_0x88", + "\u1100,\u1169,": "extra_0x88", + "\u1100,\u116a,": "extra_0x88", + "\u1100,\u116b,": "extra_0x88", + "\u1100,\u116c,": "extra_0x88", + "\u1100,\u116d,": "extra_0x88", + "\u1100,\u116e,": "extra_0x88", + "\u1100,\u116f,": "extra_0x88", + "\u1100,\u1170,": "extra_0x88", + "\u1100,\u1171,": "extra_0x88", + "\u1100,\u1172,": "extra_0x88", + "\u1100,\u1173,": "extra_0x88", + "\u1100,\u1174,": "extra_0x88", + "\u1100,\u1175,": "extra_0x88", + "\u1101,\u1161,": "extra_0x88", + "\u1101,\u1162,": "extra_0x88", + "\u1101,\u1163,": "extra_0x88", + "\u1101,\u1164,": "extra_0x88", + "\u1101,\u1165,": "extra_0x88", + "\u1101,\u1166,": "extra_0x88", + "\u1101,\u1167,": "extra_0x88", + "\u1101,\u1168,": "extra_0x88", + "\u1101,\u1169,": "extra_0x88", + "\u1101,\u116a,": "extra_0x88", + "\u1101,\u116b,": "extra_0x88", + "\u1101,\u116c,": "extra_0x88", + "\u1101,\u116d,": "extra_0x88", + "\u1101,\u116e,": "extra_0x88", + "\u1101,\u116f,": "extra_0x88", + "\u1101,\u1170,": "extra_0x88", + "\u1101,\u1171,": "extra_0x88", + "\u1101,\u1172,": "extra_0x88", + "\u1101,\u1173,": "extra_0x88", + "\u1101,\u1174,": "extra_0x88", + "\u1101,\u1175,": "extra_0x88", + "\u1102,\u1161,": "extra_0x88", + "\u1102,\u1162,": "extra_0x88", + "\u1102,\u1163,": "extra_0x88", + "\u1102,\u1164,": "extra_0x88", + "\u1102,\u1165,": "extra_0x88", + "\u1102,\u1166,": "extra_0x88", + "\u1102,\u1167,": "extra_0x88", + "\u1102,\u1168,": "extra_0x88", + "\u1102,\u1169,": "extra_0x88", + "\u1102,\u116a,": "extra_0x88", + "\u1102,\u116b,": "extra_0x88", + "\u1102,\u116c,": "extra_0x88", + "\u1102,\u116d,": "extra_0x88", + "\u1102,\u116e,": "extra_0x88", + "\u1102,\u116f,": "extra_0x88", + "\u1102,\u1170,": "extra_0x88", + "\u1102,\u1171,": "extra_0x88", + "\u1102,\u1172,": "extra_0x88", + "\u1102,\u1173,": "extra_0x88", + "\u1102,\u1174,": "extra_0x88", + "\u1102,\u1175,": "extra_0x88", + "\u1103,\u1161,": "extra_0x88", + "\u1103,\u1162,": "extra_0x88", + "\u1103,\u1163,": "extra_0x88", + "\u1103,\u1164,": "extra_0x88", + "\u1103,\u1165,": "extra_0x88", + "\u1103,\u1166,": "extra_0x88", + "\u1103,\u1167,": "extra_0x88", + "\u1103,\u1168,": "extra_0x88", + "\u1103,\u1169,": "extra_0x88", + "\u1103,\u116a,": "extra_0x88", + "\u1103,\u116b,": "extra_0x88", + "\u1103,\u116d,": "extra_0x88", + "\u1103,\u116e,": "extra_0x88", + "\u1103,\u116f,": "extra_0x88", + "\u1103,\u1170,": "extra_0x88", + "\u1103,\u1171,": "extra_0x88", + "\u1103,\u1172,": "extra_0x88", + "\u1103,\u1173,": "extra_0x88", + "\u1103,\u1174,": "extra_0x88", + "\u1103,\u1175,": "extra_0x88", + "\u1104,\u1161,": "extra_0x88", + "\u1104,\u1162,": "extra_0x88", + "\u1104,\u1163,": "extra_0x88", + "\u1104,\u1164,": "extra_0x88", + "\u1104,\u1165,": "extra_0x88", + "\u1104,\u1166,": "extra_0x88", + "\u1104,\u1167,": "extra_0x88", + "\u1104,\u1168,": "extra_0x88", + "\u1104,\u1169,": "extra_0x88", + "\u1104,\u116a,": "extra_0x88", + "\u1104,\u116b,": "extra_0x88", + "\u1104,\u116c,": "extra_0x88", + "\u1104,\u116d,": "extra_0x88", + "\u1104,\u116e,": "extra_0x88", + "\u1104,\u116f,": "extra_0x88", + "\u1104,\u1170,": "extra_0x88", + "\u1104,\u1171,": "extra_0x88", + "\u1104,\u1172,": "extra_0x88", + "\u1104,\u1173,": "extra_0x88", + "\u1104,\u1174,": "extra_0x88", + "\u1104,\u1175,": "extra_0x88", + "\u1105,\u1161,": "extra_0x88", + "\u1105,\u1162,": "extra_0x88", + "\u1105,\u1163,": "extra_0x88", + "\u1105,\u1164,": "extra_0x88", + "\u1105,\u1165,": "extra_0x88", + "\u1105,\u1166,": "extra_0x88", + "\u1105,\u1167,": "extra_0x88", + "\u1105,\u1168,": "extra_0x88", + "\u1105,\u1169,": "extra_0x88", + "\u1105,\u116a,": "extra_0x88", + "\u1105,\u116b,": "extra_0x88", + "\u1105,\u116c,": "extra_0x88", + "\u1105,\u116d,": "extra_0x88", + "\u1105,\u116e,": "extra_0x88", + "\u1105,\u116f,": "extra_0x88", + "\u1105,\u1170,": "extra_0x88", + "\u1105,\u1171,": "extra_0x88", + "\u1105,\u1172,": "extra_0x88", + "\u1105,\u1173,": "extra_0x88", + "\u1105,\u1174,": "extra_0x88", + "\u1105,\u1175,": "extra_0x88", + "\u1106,\u1161,": "extra_0x88", + "\u1106,\u1162,": "extra_0x88", + "\u1106,\u1163,": "extra_0x88", + "\u1106,\u1164,": "extra_0x88", + "\u1106,\u1165,": "extra_0x88", + "\u1106,\u1166,": "extra_0x88", + "\u1106,\u1167,": "extra_0x88", + "\u1106,\u1168,": "extra_0x88", + "\u1106,\u1169,": "extra_0x88", + "\u1106,\u116a,": "extra_0x88", + "\u1106,\u116b,": "extra_0x88", + "\u1106,\u116c,": "extra_0x88", + "\u1106,\u116d,": "extra_0x88", + "\u1106,\u116e,": "extra_0x88", + "\u1106,\u116f,": "extra_0x88", + "\u1106,\u1170,": "extra_0x88", + "\u1106,\u1171,": "extra_0x88", + "\u1106,\u1172,": "extra_0x88", + "\u1106,\u1173,": "extra_0x88", + "\u1106,\u1174,": "extra_0x88", + "\u1106,\u1175,": "extra_0x88", + "\u1107,\u1161,": "extra_0x88", + "\u1107,\u1162,": "extra_0x88", + "\u1107,\u1163,": "extra_0x88", + "\u1107,\u1164,": "extra_0x88", + "\u1107,\u1165,": "extra_0x88", + "\u1107,\u1166,": "extra_0x88", + "\u1107,\u1167,": "extra_0x88", + "\u1107,\u1168,": "extra_0x88", + "\u1107,\u1169,": "extra_0x88", + "\u1107,\u116a,": "extra_0x88", + "\u1107,\u116b,": "extra_0x88", + "\u1107,\u116c,": "extra_0x88", + "\u1107,\u116d,": "extra_0x88", + "\u1107,\u116e,": "extra_0x88", + "\u1107,\u116f,": "extra_0x88", + "\u1107,\u1170,": "extra_0x88", + "\u1107,\u1171,": "extra_0x88", + "\u1107,\u1172,": "extra_0x88", + "\u1107,\u1173,": "extra_0x88", + "\u1107,\u1174,": "extra_0x88", + "\u1107,\u1175,": "extra_0x88", + "\u1108,\u1161,": "extra_0x88", + "\u1108,\u1162,": "extra_0x88", + "\u1108,\u1163,": "extra_0x88", + "\u1108,\u1164,": "extra_0x88", + "\u1108,\u1165,": "extra_0x88", + "\u1108,\u1166,": "extra_0x88", + "\u1108,\u1167,": "extra_0x88", + "\u1108,\u1168,": "extra_0x88", + "\u1108,\u1169,": "extra_0x88", + "\u1108,\u116a,": "extra_0x88", + "\u1108,\u116b,": "extra_0x88", + "\u1108,\u116c,": "extra_0x88", + "\u1108,\u116d,": "extra_0x88", + "\u1108,\u116e,": "extra_0x88", + "\u1108,\u116f,": "extra_0x88", + "\u1108,\u1170,": "extra_0x88", + "\u1108,\u1171,": "extra_0x88", + "\u1108,\u1172,": "extra_0x88", + "\u1108,\u1173,": "extra_0x88", + "\u1108,\u1174,": "extra_0x88", + "\u1108,\u1175,": "extra_0x88", + "\u1109,\u1161,": "extra_0x88", + "\u1109,\u1162,": "extra_0x88", + "\u1109,\u1163,": "extra_0x88", + "\u1109,\u1164,": "extra_0x88", + "\u1109,\u1165,": "extra_0x88", + "\u1109,\u1166,": "extra_0x88", + "\u1109,\u1167,": "extra_0x88", + "\u1109,\u1168,": "extra_0x88", + "\u1109,\u1169,": "extra_0x88", + "\u1109,\u116a,": "extra_0x88", + "\u1109,\u116b,": "extra_0x88", + "\u1109,\u116c,": "extra_0x88", + "\u1109,\u116d,": "extra_0x88", + "\u1109,\u116e,": "extra_0x88", + "\u1109,\u116f,": "extra_0x88", + "\u1109,\u1170,": "extra_0x88", + "\u1109,\u1171,": "extra_0x88", + "\u1109,\u1172,": "extra_0x88", + "\u1109,\u1173,": "extra_0x88", + "\u1109,\u1174,": "extra_0x88", + "\u1109,\u1175,": "extra_0x88", + "\u110a,\u1161,": "extra_0x88", + "\u110a,\u1162,": "extra_0x88", + "\u110a,\u1163,": "extra_0x88", + "\u110a,\u1164,": "extra_0x88", + "\u110a,\u1165,": "extra_0x88", + "\u110a,\u1166,": "extra_0x88", + "\u110a,\u1167,": "extra_0x88", + "\u110a,\u1168,": "extra_0x88", + "\u110a,\u1169,": "extra_0x88", + "\u110a,\u116a,": "extra_0x88", + "\u110a,\u116b,": "extra_0x88", + "\u110a,\u116c,": "extra_0x88", + "\u110a,\u116d,": "extra_0x88", + "\u110a,\u116e,": "extra_0x88", + "\u110a,\u116f,": "extra_0x88", + "\u110a,\u1170,": "extra_0x88", + "\u110a,\u1171,": "extra_0x88", + "\u110a,\u1172,": "extra_0x88", + "\u110a,\u1173,": "extra_0x88", + "\u110a,\u1174,": "extra_0x88", + "\u110a,\u1175,": "extra_0x88", + "\u110b,\u1161,": "extra_0x88", + "\u110b,\u1162,": "extra_0x88", + "\u110b,\u1163,": "extra_0x88", + "\u110b,\u1164,": "extra_0x88", + "\u110b,\u1165,": "extra_0x88", + "\u110b,\u1166,": "extra_0x88", + "\u110b,\u1167,": "extra_0x88", + "\u110b,\u1168,": "extra_0x88", + "\u110b,\u1169,": "extra_0x88", + "\u110b,\u116a,": "extra_0x88", + "\u110b,\u116b,": "extra_0x88", + "\u110b,\u116c,": "extra_0x88", + "\u110b,\u116d,": "extra_0x88", + "\u110b,\u116e,": "extra_0x88", + "\u110b,\u116f,": "extra_0x88", + "\u110b,\u1170,": "extra_0x88", + "\u110b,\u1171,": "extra_0x88", + "\u110b,\u1172,": "extra_0x88", + "\u110b,\u1173,": "extra_0x88", + "\u110b,\u1174,": "extra_0x88", + "\u110b,\u1175,": "extra_0x88", + "\u110c,\u1161,": "extra_0x88", + "\u110c,\u1162,": "extra_0x88", + "\u110c,\u1163,": "extra_0x88", + "\u110c,\u1164,": "extra_0x88", + "\u110c,\u1165,": "extra_0x88", + "\u110c,\u1166,": "extra_0x88", + "\u110c,\u1167,": "extra_0x88", + "\u110c,\u1168,": "extra_0x88", + "\u110c,\u1169,": "extra_0x88", + "\u110c,\u116a,": "extra_0x88", + "\u110c,\u116b,": "extra_0x88", + "\u110c,\u116c,": "extra_0x88", + "\u110c,\u116d,": "extra_0x88", + "\u110c,\u116e,": "extra_0x88", + "\u110c,\u116f,": "extra_0x88", + "\u110c,\u1170,": "extra_0x88", + "\u110c,\u1171,": "extra_0x88", + "\u110c,\u1172,": "extra_0x88", + "\u110c,\u1173,": "extra_0x88", + "\u110c,\u1174,": "extra_0x88", + "\u110c,\u1175,": "extra_0x88", + "\u110d,\u1161,": "extra_0x88", + "\u110d,\u1162,": "extra_0x88", + "\u110d,\u1163,": "extra_0x88", + "\u110d,\u1164,": "extra_0x88", + "\u110d,\u1165,": "extra_0x88", + "\u110d,\u1166,": "extra_0x88", + "\u110d,\u1167,": "extra_0x88", + "\u110d,\u1168,": "extra_0x88", + "\u110d,\u1169,": "extra_0x88", + "\u110d,\u116a,": "extra_0x88", + "\u110d,\u116b,": "extra_0x88", + "\u110d,\u116c,": "extra_0x88", + "\u110d,\u116d,": "extra_0x88", + "\u110d,\u116e,": "extra_0x88", + "\u110d,\u116f,": "extra_0x88", + "\u110d,\u1170,": "extra_0x88", + "\u110d,\u1171,": "extra_0x88", + "\u110d,\u1172,": "extra_0x88", + "\u110d,\u1173,": "extra_0x88", + "\u110d,\u1174,": "extra_0x88", + "\u110d,\u1175,": "extra_0x88", + "\u110e,\u1161,": "extra_0x88", + "\u110e,\u1162,": "extra_0x88", + "\u110e,\u1163,": "extra_0x88", + "\u110e,\u1164,": "extra_0x88", + "\u110e,\u1165,": "extra_0x88", + "\u110e,\u1166,": "extra_0x88", + "\u110e,\u1167,": "extra_0x88", + "\u110e,\u1168,": "extra_0x88", + "\u110e,\u1169,": "extra_0x88", + "\u110e,\u116a,": "extra_0x88", + "\u110e,\u116b,": "extra_0x88", + "\u110e,\u116c,": "extra_0x88", + "\u110e,\u116d,": "extra_0x88", + "\u110e,\u116e,": "extra_0x88", + "\u110e,\u116f,": "extra_0x88", + "\u110e,\u1170,": "extra_0x88", + "\u110e,\u1171,": "extra_0x88", + "\u110e,\u1172,": "extra_0x88", + "\u110e,\u1173,": "extra_0x88", + "\u110e,\u1174,": "extra_0x88", + "\u110e,\u1175,": "extra_0x88", + "\u110f,\u1161,": "extra_0x88", + "\u110f,\u1162,": "extra_0x88", + "\u110f,\u1163,": "extra_0x88", + "\u110f,\u1164,": "extra_0x88", + "\u110f,\u1165,": "extra_0x88", + "\u110f,\u1166,": "extra_0x88", + "\u110f,\u1167,": "extra_0x88", + "\u110f,\u1168,": "extra_0x88", + "\u110f,\u1169,": "extra_0x88", + "\u110f,\u116a,": "extra_0x88", + "\u110f,\u116b,": "extra_0x88", + "\u110f,\u116c,": "extra_0x88", + "\u110f,\u116d,": "extra_0x88", + "\u110f,\u116e,": "extra_0x88", + "\u110f,\u116f,": "extra_0x88", + "\u110f,\u1170,": "extra_0x88", + "\u110f,\u1171,": "extra_0x88", + "\u110f,\u1172,": "extra_0x88", + "\u110f,\u1173,": "extra_0x88", + "\u110f,\u1174,": "extra_0x88", + "\u110f,\u1175,": "extra_0x88", + "\u1110,\u1161,": "extra_0x88", + "\u1110,\u1162,": "extra_0x88", + "\u1110,\u1163,": "extra_0x88", + "\u1110,\u1164,": "extra_0x88", + "\u1110,\u1165,": "extra_0x88", + "\u1110,\u1166,": "extra_0x88", + "\u1110,\u1167,": "extra_0x88", + "\u1110,\u1168,": "extra_0x88", + "\u1110,\u1169,": "extra_0x88", + "\u1110,\u116a,": "extra_0x88", + "\u1110,\u116b,": "extra_0x88", + "\u1110,\u116c,": "extra_0x88", + "\u1110,\u116d,": "extra_0x88", + "\u1110,\u116e,": "extra_0x88", + "\u1110,\u116f,": "extra_0x88", + "\u1110,\u1170,": "extra_0x88", + "\u1110,\u1171,": "extra_0x88", + "\u1110,\u1172,": "extra_0x88", + "\u1110,\u1173,": "extra_0x88", + "\u1110,\u1174,": "extra_0x88", + "\u1110,\u1175,": "extra_0x88", + "\u1111,\u1161,": "extra_0x88", + "\u1111,\u1162,": "extra_0x88", + "\u1111,\u1163,": "extra_0x88", + "\u1111,\u1164,": "extra_0x88", + "\u1111,\u1165,": "extra_0x88", + "\u1111,\u1166,": "extra_0x88", + "\u1111,\u1167,": "extra_0x88", + "\u1111,\u1168,": "extra_0x88", + "\u1111,\u1169,": "extra_0x88", + "\u1111,\u116a,": "extra_0x88", + "\u1111,\u116b,": "extra_0x88", + "\u1111,\u116c,": "extra_0x88", + "\u1111,\u116d,": "extra_0x88", + "\u1111,\u116e,": "extra_0x88", + "\u1111,\u116f,": "extra_0x88", + "\u1111,\u1170,": "extra_0x88", + "\u1111,\u1171,": "extra_0x88", + "\u1111,\u1172,": "extra_0x88", + "\u1111,\u1173,": "extra_0x88", + "\u1111,\u1174,": "extra_0x88", + "\u1111,\u1175,": "extra_0x88", + "\u1112,\u1161,": "extra_0x88", + "\u1112,\u1162,": "extra_0x88", + "\u1112,\u1163,": "extra_0x88", + "\u1112,\u1164,": "extra_0x88", + "\u1112,\u1165,": "extra_0x88", + "\u1112,\u1166,": "extra_0x88", + "\u1112,\u1167,": "extra_0x88", + "\u1112,\u1168,": "extra_0x88", + "\u1112,\u1169,": "extra_0x88", + "\u1112,\u116a,": "extra_0x88", + "\u1112,\u116b,": "extra_0x88", + "\u1112,\u116c,": "extra_0x88", + "\u1112,\u116d,": "extra_0x88", + "\u1112,\u116e,": "extra_0x88", + "\u1112,\u116f,": "extra_0x88", + "\u1112,\u1170,": "extra_0x88", + "\u1112,\u1171,": "extra_0x88", + "\u1112,\u1172,": "extra_0x88", + "\u1112,\u1173,": "extra_0x88", + "\u1112,\u1174,": "extra_0x88", + "\u1112,\u1175,": "extra_0x88" + } + } + ], + "\u11b9": [ + null, + null, + null, + { + "defaultGlyph": "0xd4", + "alternatives": {} + }, + { + "defaultGlyph": "0xd4", + "alternatives": {} + }, + { + "defaultGlyph": "0xd4", + "alternatives": {} + } + ], + "\u11ba": [ + null, + null, + null, + { + "defaultGlyph": "0xd5", + "alternatives": {} + }, + { + "defaultGlyph": "0xed", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x89", + "alternatives": { + "\u110b,\u116a,": "extra_0x89", + "\u1100,\u1161,": "extra_0x89", + "\u1100,\u1162,": "extra_0x89", + "\u1100,\u1163,": "extra_0x89", + "\u1100,\u1164,": "extra_0x89", + "\u1100,\u1165,": "extra_0x89", + "\u1100,\u1166,": "extra_0x89", + "\u1100,\u1167,": "extra_0x89", + "\u1100,\u1168,": "extra_0x89", + "\u1100,\u1169,": "extra_0x89", + "\u1100,\u116a,": "extra_0x89", + "\u1100,\u116b,": "extra_0x89", + "\u1100,\u116c,": "extra_0x89", + "\u1100,\u116d,": "extra_0x89", + "\u1100,\u116e,": "extra_0x89", + "\u1100,\u116f,": "extra_0x89", + "\u1100,\u1170,": "extra_0x89", + "\u1100,\u1171,": "extra_0x89", + "\u1100,\u1172,": "extra_0x89", + "\u1100,\u1173,": "extra_0x89", + "\u1100,\u1174,": "extra_0x89", + "\u1100,\u1175,": "extra_0x89", + "\u1101,\u1161,": "extra_0x89", + "\u1101,\u1162,": "extra_0x89", + "\u1101,\u1163,": "extra_0x89", + "\u1101,\u1164,": "extra_0x89", + "\u1101,\u1165,": "extra_0x89", + "\u1101,\u1166,": "extra_0x89", + "\u1101,\u1167,": "extra_0x89", + "\u1101,\u1168,": "extra_0x89", + "\u1101,\u1169,": "extra_0x89", + "\u1101,\u116a,": "extra_0x89", + "\u1101,\u116b,": "extra_0x89", + "\u1101,\u116c,": "extra_0x89", + "\u1101,\u116d,": "extra_0x89", + "\u1101,\u116e,": "extra_0x89", + "\u1101,\u116f,": "extra_0x89", + "\u1101,\u1170,": "extra_0x89", + "\u1101,\u1171,": "extra_0x89", + "\u1101,\u1172,": "extra_0x89", + "\u1101,\u1173,": "extra_0x89", + "\u1101,\u1174,": "extra_0x89", + "\u1101,\u1175,": "extra_0x89", + "\u1102,\u1161,": "extra_0x89", + "\u1102,\u1162,": "extra_0x89", + "\u1102,\u1163,": "extra_0x89", + "\u1102,\u1164,": "extra_0x89", + "\u1102,\u1165,": "extra_0x89", + "\u1102,\u1166,": "extra_0x89", + "\u1102,\u1167,": "extra_0x89", + "\u1102,\u1168,": "extra_0x89", + "\u1102,\u1169,": "extra_0x89", + "\u1102,\u116a,": "extra_0x89", + "\u1102,\u116b,": "extra_0x89", + "\u1102,\u116c,": "extra_0x89", + "\u1102,\u116d,": "extra_0x89", + "\u1102,\u116e,": "extra_0x89", + "\u1102,\u116f,": "extra_0x89", + "\u1102,\u1170,": "extra_0x89", + "\u1102,\u1171,": "extra_0x89", + "\u1102,\u1172,": "extra_0x89", + "\u1102,\u1173,": "extra_0x89", + "\u1102,\u1174,": "extra_0x89", + "\u1102,\u1175,": "extra_0x89", + "\u1103,\u1161,": "extra_0x89", + "\u1103,\u1162,": "extra_0x89", + "\u1103,\u1163,": "extra_0x89", + "\u1103,\u1164,": "extra_0x89", + "\u1103,\u1165,": "extra_0x89", + "\u1103,\u1166,": "extra_0x89", + "\u1103,\u1167,": "extra_0x89", + "\u1103,\u1168,": "extra_0x89", + "\u1103,\u1169,": "extra_0x89", + "\u1103,\u116a,": "extra_0x89", + "\u1103,\u116b,": "extra_0x89", + "\u1103,\u116c,": "extra_0x89", + "\u1103,\u116d,": "extra_0x89", + "\u1103,\u116e,": "extra_0x89", + "\u1103,\u116f,": "extra_0x89", + "\u1103,\u1170,": "extra_0x89", + "\u1103,\u1171,": "extra_0x89", + "\u1103,\u1172,": "extra_0x89", + "\u1103,\u1173,": "extra_0x89", + "\u1103,\u1174,": "extra_0x89", + "\u1103,\u1175,": "extra_0x89", + "\u1104,\u1161,": "extra_0x89", + "\u1104,\u1162,": "extra_0x89", + "\u1104,\u1163,": "extra_0x89", + "\u1104,\u1164,": "extra_0x89", + "\u1104,\u1165,": "extra_0x89", + "\u1104,\u1166,": "extra_0x89", + "\u1104,\u1167,": "extra_0x89", + "\u1104,\u1168,": "extra_0x89", + "\u1104,\u1169,": "extra_0x89", + "\u1104,\u116a,": "extra_0x89", + "\u1104,\u116b,": "extra_0x89", + "\u1104,\u116c,": "extra_0x89", + "\u1104,\u116d,": "extra_0x89", + "\u1104,\u116e,": "extra_0x89", + "\u1104,\u116f,": "extra_0x89", + "\u1104,\u1170,": "extra_0x89", + "\u1104,\u1171,": "extra_0x89", + "\u1104,\u1172,": "extra_0x89", + "\u1104,\u1173,": "extra_0x89", + "\u1104,\u1174,": "extra_0x89", + "\u1104,\u1175,": "extra_0x89", + "\u1105,\u1161,": "extra_0x89", + "\u1105,\u1162,": "extra_0x89", + "\u1105,\u1163,": "extra_0x89", + "\u1105,\u1164,": "extra_0x89", + "\u1105,\u1165,": "extra_0x89", + "\u1105,\u1166,": "extra_0x89", + "\u1105,\u1167,": "extra_0x89", + "\u1105,\u1168,": "extra_0x89", + "\u1105,\u1169,": "extra_0x89", + "\u1105,\u116a,": "extra_0x89", + "\u1105,\u116b,": "extra_0x89", + "\u1105,\u116c,": "extra_0x89", + "\u1105,\u116d,": "extra_0x89", + "\u1105,\u116e,": "extra_0x89", + "\u1105,\u116f,": "extra_0x89", + "\u1105,\u1170,": "extra_0x89", + "\u1105,\u1171,": "extra_0x89", + "\u1105,\u1172,": "extra_0x89", + "\u1105,\u1173,": "extra_0x89", + "\u1105,\u1174,": "extra_0x89", + "\u1105,\u1175,": "extra_0x89", + "\u1106,\u1161,": "extra_0x89", + "\u1106,\u1162,": "extra_0x89", + "\u1106,\u1163,": "extra_0x89", + "\u1106,\u1164,": "extra_0x89", + "\u1106,\u1165,": "extra_0x89", + "\u1106,\u1166,": "extra_0x89", + "\u1106,\u1167,": "extra_0x89", + "\u1106,\u1168,": "extra_0x89", + "\u1106,\u1169,": "extra_0x89", + "\u1106,\u116a,": "extra_0x89", + "\u1106,\u116b,": "extra_0x89", + "\u1106,\u116c,": "extra_0x89", + "\u1106,\u116d,": "extra_0x89", + "\u1106,\u116e,": "extra_0x89", + "\u1106,\u116f,": "extra_0x89", + "\u1106,\u1170,": "extra_0x89", + "\u1106,\u1171,": "extra_0x89", + "\u1106,\u1172,": "extra_0x89", + "\u1106,\u1173,": "extra_0x89", + "\u1106,\u1174,": "extra_0x89", + "\u1106,\u1175,": "extra_0x89", + "\u1107,\u1161,": "extra_0x89", + "\u1107,\u1162,": "extra_0x89", + "\u1107,\u1163,": "extra_0x89", + "\u1107,\u1164,": "extra_0x89", + "\u1107,\u1165,": "extra_0x89", + "\u1107,\u1166,": "extra_0x89", + "\u1107,\u1167,": "extra_0x89", + "\u1107,\u1168,": "extra_0x89", + "\u1107,\u1169,": "extra_0x89", + "\u1107,\u116a,": "extra_0x89", + "\u1107,\u116b,": "extra_0x89", + "\u1107,\u116c,": "extra_0x89", + "\u1107,\u116d,": "extra_0x89", + "\u1107,\u116e,": "extra_0x89", + "\u1107,\u116f,": "extra_0x89", + "\u1107,\u1170,": "extra_0x89", + "\u1107,\u1171,": "extra_0x89", + "\u1107,\u1172,": "extra_0x89", + "\u1107,\u1173,": "extra_0x89", + "\u1107,\u1174,": "extra_0x89", + "\u1107,\u1175,": "extra_0x89", + "\u1108,\u1161,": "extra_0x89", + "\u1108,\u1162,": "extra_0x89", + "\u1108,\u1163,": "extra_0x89", + "\u1108,\u1164,": "extra_0x89", + "\u1108,\u1165,": "extra_0x89", + "\u1108,\u1166,": "extra_0x89", + "\u1108,\u1167,": "extra_0x89", + "\u1108,\u1168,": "extra_0x89", + "\u1108,\u1169,": "extra_0x89", + "\u1108,\u116a,": "extra_0x89", + "\u1108,\u116b,": "extra_0x89", + "\u1108,\u116c,": "extra_0x89", + "\u1108,\u116d,": "extra_0x89", + "\u1108,\u116e,": "extra_0x89", + "\u1108,\u116f,": "extra_0x89", + "\u1108,\u1170,": "extra_0x89", + "\u1108,\u1171,": "extra_0x89", + "\u1108,\u1172,": "extra_0x89", + "\u1108,\u1173,": "extra_0x89", + "\u1108,\u1174,": "extra_0x89", + "\u1108,\u1175,": "extra_0x89", + "\u1109,\u1161,": "extra_0x89", + "\u1109,\u1162,": "extra_0x89", + "\u1109,\u1163,": "extra_0x89", + "\u1109,\u1164,": "extra_0x89", + "\u1109,\u1165,": "extra_0x89", + "\u1109,\u1166,": "extra_0x89", + "\u1109,\u1167,": "extra_0x89", + "\u1109,\u1168,": "extra_0x89", + "\u1109,\u1169,": "extra_0x89", + "\u1109,\u116a,": "extra_0x89", + "\u1109,\u116b,": "extra_0x89", + "\u1109,\u116c,": "extra_0x89", + "\u1109,\u116d,": "extra_0x89", + "\u1109,\u116e,": "extra_0x89", + "\u1109,\u116f,": "extra_0x89", + "\u1109,\u1170,": "extra_0x89", + "\u1109,\u1171,": "extra_0x89", + "\u1109,\u1172,": "extra_0x89", + "\u1109,\u1173,": "extra_0x89", + "\u1109,\u1174,": "extra_0x89", + "\u1109,\u1175,": "extra_0x89", + "\u110a,\u1161,": "extra_0x89", + "\u110a,\u1162,": "extra_0x89", + "\u110a,\u1163,": "extra_0x89", + "\u110a,\u1164,": "extra_0x89", + "\u110a,\u1165,": "extra_0x89", + "\u110a,\u1166,": "extra_0x89", + "\u110a,\u1167,": "extra_0x89", + "\u110a,\u1168,": "extra_0x89", + "\u110a,\u1169,": "extra_0x89", + "\u110a,\u116a,": "extra_0x89", + "\u110a,\u116b,": "extra_0x89", + "\u110a,\u116c,": "extra_0x89", + "\u110a,\u116d,": "extra_0x89", + "\u110a,\u116e,": "extra_0x89", + "\u110a,\u116f,": "extra_0x89", + "\u110a,\u1170,": "extra_0x89", + "\u110a,\u1171,": "extra_0x89", + "\u110a,\u1172,": "extra_0x89", + "\u110a,\u1173,": "extra_0x89", + "\u110a,\u1174,": "extra_0x89", + "\u110a,\u1175,": "extra_0x89", + "\u110b,\u1161,": "extra_0x89", + "\u110b,\u1162,": "extra_0x89", + "\u110b,\u1163,": "extra_0x89", + "\u110b,\u1164,": "extra_0x89", + "\u110b,\u1165,": "extra_0x89", + "\u110b,\u1166,": "extra_0x89", + "\u110b,\u1167,": "extra_0x89", + "\u110b,\u1168,": "extra_0x89", + "\u110b,\u1169,": "extra_0x89", + "\u110b,\u116b,": "extra_0x89", + "\u110b,\u116c,": "extra_0x89", + "\u110b,\u116d,": "extra_0x89", + "\u110b,\u116e,": "extra_0x89", + "\u110b,\u116f,": "extra_0x89", + "\u110b,\u1170,": "extra_0x89", + "\u110b,\u1171,": "extra_0x89", + "\u110b,\u1172,": "extra_0x89", + "\u110b,\u1173,": "extra_0x89", + "\u110b,\u1174,": "extra_0x89", + "\u110b,\u1175,": "extra_0x89", + "\u110c,\u1161,": "extra_0x89", + "\u110c,\u1162,": "extra_0x89", + "\u110c,\u1163,": "extra_0x89", + "\u110c,\u1164,": "extra_0x89", + "\u110c,\u1165,": "extra_0x89", + "\u110c,\u1166,": "extra_0x89", + "\u110c,\u1167,": "extra_0x89", + "\u110c,\u1168,": "extra_0x89", + "\u110c,\u1169,": "extra_0x89", + "\u110c,\u116a,": "extra_0x89", + "\u110c,\u116b,": "extra_0x89", + "\u110c,\u116c,": "extra_0x89", + "\u110c,\u116d,": "extra_0x89", + "\u110c,\u116e,": "extra_0x89", + "\u110c,\u116f,": "extra_0x89", + "\u110c,\u1170,": "extra_0x89", + "\u110c,\u1171,": "extra_0x89", + "\u110c,\u1172,": "extra_0x89", + "\u110c,\u1173,": "extra_0x89", + "\u110c,\u1174,": "extra_0x89", + "\u110c,\u1175,": "extra_0x89", + "\u110d,\u1161,": "extra_0x89", + "\u110d,\u1162,": "extra_0x89", + "\u110d,\u1163,": "extra_0x89", + "\u110d,\u1164,": "extra_0x89", + "\u110d,\u1165,": "extra_0x89", + "\u110d,\u1166,": "extra_0x89", + "\u110d,\u1167,": "extra_0x89", + "\u110d,\u1168,": "extra_0x89", + "\u110d,\u1169,": "extra_0x89", + "\u110d,\u116a,": "extra_0x89", + "\u110d,\u116b,": "extra_0x89", + "\u110d,\u116c,": "extra_0x89", + "\u110d,\u116d,": "extra_0x89", + "\u110d,\u116e,": "extra_0x89", + "\u110d,\u116f,": "extra_0x89", + "\u110d,\u1170,": "extra_0x89", + "\u110d,\u1171,": "extra_0x89", + "\u110d,\u1172,": "extra_0x89", + "\u110d,\u1173,": "extra_0x89", + "\u110d,\u1174,": "extra_0x89", + "\u110d,\u1175,": "extra_0x89", + "\u110e,\u1161,": "extra_0x89", + "\u110e,\u1162,": "extra_0x89", + "\u110e,\u1163,": "extra_0x89", + "\u110e,\u1164,": "extra_0x89", + "\u110e,\u1165,": "extra_0x89", + "\u110e,\u1166,": "extra_0x89", + "\u110e,\u1167,": "extra_0x89", + "\u110e,\u1168,": "extra_0x89", + "\u110e,\u1169,": "extra_0x89", + "\u110e,\u116a,": "extra_0x89", + "\u110e,\u116b,": "extra_0x89", + "\u110e,\u116c,": "extra_0x89", + "\u110e,\u116d,": "extra_0x89", + "\u110e,\u116e,": "extra_0x89", + "\u110e,\u116f,": "extra_0x89", + "\u110e,\u1170,": "extra_0x89", + "\u110e,\u1171,": "extra_0x89", + "\u110e,\u1172,": "extra_0x89", + "\u110e,\u1173,": "extra_0x89", + "\u110e,\u1174,": "extra_0x89", + "\u110e,\u1175,": "extra_0x89", + "\u110f,\u1161,": "extra_0x89", + "\u110f,\u1162,": "extra_0x89", + "\u110f,\u1163,": "extra_0x89", + "\u110f,\u1164,": "extra_0x89", + "\u110f,\u1165,": "extra_0x89", + "\u110f,\u1166,": "extra_0x89", + "\u110f,\u1167,": "extra_0x89", + "\u110f,\u1168,": "extra_0x89", + "\u110f,\u1169,": "extra_0x89", + "\u110f,\u116a,": "extra_0x89", + "\u110f,\u116b,": "extra_0x89", + "\u110f,\u116c,": "extra_0x89", + "\u110f,\u116d,": "extra_0x89", + "\u110f,\u116e,": "extra_0x89", + "\u110f,\u116f,": "extra_0x89", + "\u110f,\u1170,": "extra_0x89", + "\u110f,\u1171,": "extra_0x89", + "\u110f,\u1172,": "extra_0x89", + "\u110f,\u1173,": "extra_0x89", + "\u110f,\u1174,": "extra_0x89", + "\u110f,\u1175,": "extra_0x89", + "\u1110,\u1161,": "extra_0x89", + "\u1110,\u1162,": "extra_0x89", + "\u1110,\u1163,": "extra_0x89", + "\u1110,\u1164,": "extra_0x89", + "\u1110,\u1165,": "extra_0x89", + "\u1110,\u1166,": "extra_0x89", + "\u1110,\u1167,": "extra_0x89", + "\u1110,\u1168,": "extra_0x89", + "\u1110,\u1169,": "extra_0x89", + "\u1110,\u116a,": "extra_0x89", + "\u1110,\u116b,": "extra_0x89", + "\u1110,\u116c,": "extra_0x89", + "\u1110,\u116d,": "extra_0x89", + "\u1110,\u116e,": "extra_0x89", + "\u1110,\u116f,": "extra_0x89", + "\u1110,\u1170,": "extra_0x89", + "\u1110,\u1171,": "extra_0x89", + "\u1110,\u1172,": "extra_0x89", + "\u1110,\u1173,": "extra_0x89", + "\u1110,\u1174,": "extra_0x89", + "\u1110,\u1175,": "extra_0x89", + "\u1111,\u1161,": "extra_0x89", + "\u1111,\u1162,": "extra_0x89", + "\u1111,\u1163,": "extra_0x89", + "\u1111,\u1164,": "extra_0x89", + "\u1111,\u1165,": "extra_0x89", + "\u1111,\u1166,": "extra_0x89", + "\u1111,\u1167,": "extra_0x89", + "\u1111,\u1168,": "extra_0x89", + "\u1111,\u1169,": "extra_0x89", + "\u1111,\u116a,": "extra_0x89", + "\u1111,\u116b,": "extra_0x89", + "\u1111,\u116c,": "extra_0x89", + "\u1111,\u116d,": "extra_0x89", + "\u1111,\u116e,": "extra_0x89", + "\u1111,\u116f,": "extra_0x89", + "\u1111,\u1170,": "extra_0x89", + "\u1111,\u1171,": "extra_0x89", + "\u1111,\u1172,": "extra_0x89", + "\u1111,\u1173,": "extra_0x89", + "\u1111,\u1174,": "extra_0x89", + "\u1111,\u1175,": "extra_0x89", + "\u1112,\u1161,": "extra_0x89", + "\u1112,\u1162,": "extra_0x89", + "\u1112,\u1163,": "extra_0x89", + "\u1112,\u1164,": "extra_0x89", + "\u1112,\u1165,": "extra_0x89", + "\u1112,\u1166,": "extra_0x89", + "\u1112,\u1167,": "extra_0x89", + "\u1112,\u1168,": "extra_0x89", + "\u1112,\u1169,": "extra_0x89", + "\u1112,\u116a,": "extra_0x89", + "\u1112,\u116b,": "extra_0x89", + "\u1112,\u116c,": "extra_0x89", + "\u1112,\u116d,": "extra_0x89", + "\u1112,\u116e,": "extra_0x89", + "\u1112,\u116f,": "extra_0x89", + "\u1112,\u1170,": "extra_0x89", + "\u1112,\u1171,": "extra_0x89", + "\u1112,\u1172,": "extra_0x89", + "\u1112,\u1173,": "extra_0x89", + "\u1112,\u1174,": "extra_0x89", + "\u1112,\u1175,": "extra_0x89" + } + } + ], + "\u11bb": [ + null, + null, + null, + { + "defaultGlyph": "0xd6", + "alternatives": {} + }, + { + "defaultGlyph": "0xfc", + "alternatives": {} + }, + { + "defaultGlyph": "0xfc", + "alternatives": { + "\u110c,\u116f,": "extra_0x8a", + "\u110b,\u116f,": "extra_0x8a", + "\u1100,\u1161,": "extra_0x8a", + "\u1100,\u1162,": "extra_0x8a", + "\u1100,\u1163,": "extra_0x8a", + "\u1100,\u1164,": "extra_0x8a", + "\u1100,\u1165,": "extra_0x8a", + "\u1100,\u1166,": "extra_0x8a", + "\u1100,\u1167,": "extra_0x8a", + "\u1100,\u1168,": "extra_0x8a", + "\u1100,\u1169,": "extra_0x8a", + "\u1100,\u116a,": "extra_0x8a", + "\u1100,\u116b,": "extra_0x8a", + "\u1100,\u116c,": "extra_0x8a", + "\u1100,\u116d,": "extra_0x8a", + "\u1100,\u116e,": "extra_0x8a", + "\u1100,\u116f,": "extra_0x8a", + "\u1100,\u1170,": "extra_0x8a", + "\u1100,\u1171,": "extra_0x8a", + "\u1100,\u1172,": "extra_0x8a", + "\u1100,\u1173,": "extra_0x8a", + "\u1100,\u1174,": "extra_0x8a", + "\u1100,\u1175,": "extra_0x8a", + "\u1101,\u1161,": "extra_0x8a", + "\u1101,\u1162,": "extra_0x8a", + "\u1101,\u1163,": "extra_0x8a", + "\u1101,\u1164,": "extra_0x8a", + "\u1101,\u1165,": "extra_0x8a", + "\u1101,\u1166,": "extra_0x8a", + "\u1101,\u1167,": "extra_0x8a", + "\u1101,\u1168,": "extra_0x8a", + "\u1101,\u1169,": "extra_0x8a", + "\u1101,\u116a,": "extra_0x8a", + "\u1101,\u116b,": "extra_0x8a", + "\u1101,\u116c,": "extra_0x8a", + "\u1101,\u116d,": "extra_0x8a", + "\u1101,\u116e,": "extra_0x8a", + "\u1101,\u116f,": "extra_0x8a", + "\u1101,\u1170,": "extra_0x8a", + "\u1101,\u1171,": "extra_0x8a", + "\u1101,\u1172,": "extra_0x8a", + "\u1101,\u1173,": "extra_0x8a", + "\u1101,\u1174,": "extra_0x8a", + "\u1101,\u1175,": "extra_0x8a", + "\u1102,\u1161,": "extra_0x8a", + "\u1102,\u1162,": "extra_0x8a", + "\u1102,\u1163,": "extra_0x8a", + "\u1102,\u1164,": "extra_0x8a", + "\u1102,\u1165,": "extra_0x8a", + "\u1102,\u1166,": "extra_0x8a", + "\u1102,\u1167,": "extra_0x8a", + "\u1102,\u1168,": "extra_0x8a", + "\u1102,\u1169,": "extra_0x8a", + "\u1102,\u116a,": "extra_0x8a", + "\u1102,\u116b,": "extra_0x8a", + "\u1102,\u116c,": "extra_0x8a", + "\u1102,\u116d,": "extra_0x8a", + "\u1102,\u116e,": "extra_0x8a", + "\u1102,\u116f,": "extra_0x8a", + "\u1102,\u1170,": "extra_0x8a", + "\u1102,\u1171,": "extra_0x8a", + "\u1102,\u1172,": "extra_0x8a", + "\u1102,\u1173,": "extra_0x8a", + "\u1102,\u1174,": "extra_0x8a", + "\u1102,\u1175,": "extra_0x8a", + "\u1103,\u1161,": "extra_0x8a", + "\u1103,\u1162,": "extra_0x8a", + "\u1103,\u1163,": "extra_0x8a", + "\u1103,\u1164,": "extra_0x8a", + "\u1103,\u1165,": "extra_0x8a", + "\u1103,\u1166,": "extra_0x8a", + "\u1103,\u1167,": "extra_0x8a", + "\u1103,\u1168,": "extra_0x8a", + "\u1103,\u1169,": "extra_0x8a", + "\u1103,\u116a,": "extra_0x8a", + "\u1103,\u116b,": "extra_0x8a", + "\u1103,\u116c,": "extra_0x8a", + "\u1103,\u116d,": "extra_0x8a", + "\u1103,\u116e,": "extra_0x8a", + "\u1103,\u116f,": "extra_0x8a", + "\u1103,\u1170,": "extra_0x8a", + "\u1103,\u1171,": "extra_0x8a", + "\u1103,\u1172,": "extra_0x8a", + "\u1103,\u1173,": "extra_0x8a", + "\u1103,\u1174,": "extra_0x8a", + "\u1103,\u1175,": "extra_0x8a", + "\u1104,\u1161,": "extra_0x8a", + "\u1104,\u1162,": "extra_0x8a", + "\u1104,\u1163,": "extra_0x8a", + "\u1104,\u1164,": "extra_0x8a", + "\u1104,\u1165,": "extra_0x8a", + "\u1104,\u1166,": "extra_0x8a", + "\u1104,\u1167,": "extra_0x8a", + "\u1104,\u1168,": "extra_0x8a", + "\u1104,\u1169,": "extra_0x8a", + "\u1104,\u116a,": "extra_0x8a", + "\u1104,\u116b,": "extra_0x8a", + "\u1104,\u116c,": "extra_0x8a", + "\u1104,\u116d,": "extra_0x8a", + "\u1104,\u116e,": "extra_0x8a", + "\u1104,\u116f,": "extra_0x8a", + "\u1104,\u1170,": "extra_0x8a", + "\u1104,\u1171,": "extra_0x8a", + "\u1104,\u1172,": "extra_0x8a", + "\u1104,\u1173,": "extra_0x8a", + "\u1104,\u1174,": "extra_0x8a", + "\u1104,\u1175,": "extra_0x8a", + "\u1105,\u1161,": "extra_0x8a", + "\u1105,\u1162,": "extra_0x8a", + "\u1105,\u1163,": "extra_0x8a", + "\u1105,\u1164,": "extra_0x8a", + "\u1105,\u1165,": "extra_0x8a", + "\u1105,\u1166,": "extra_0x8a", + "\u1105,\u1167,": "extra_0x8a", + "\u1105,\u1168,": "extra_0x8a", + "\u1105,\u1169,": "extra_0x8a", + "\u1105,\u116a,": "extra_0x8a", + "\u1105,\u116b,": "extra_0x8a", + "\u1105,\u116c,": "extra_0x8a", + "\u1105,\u116d,": "extra_0x8a", + "\u1105,\u116e,": "extra_0x8a", + "\u1105,\u116f,": "extra_0x8a", + "\u1105,\u1170,": "extra_0x8a", + "\u1105,\u1171,": "extra_0x8a", + "\u1105,\u1172,": "extra_0x8a", + "\u1105,\u1173,": "extra_0x8a", + "\u1105,\u1174,": "extra_0x8a", + "\u1105,\u1175,": "extra_0x8a", + "\u1106,\u1161,": "extra_0x8a", + "\u1106,\u1162,": "extra_0x8a", + "\u1106,\u1163,": "extra_0x8a", + "\u1106,\u1164,": "extra_0x8a", + "\u1106,\u1165,": "extra_0x8a", + "\u1106,\u1166,": "extra_0x8a", + "\u1106,\u1167,": "extra_0x8a", + "\u1106,\u1168,": "extra_0x8a", + "\u1106,\u1169,": "extra_0x8a", + "\u1106,\u116a,": "extra_0x8a", + "\u1106,\u116b,": "extra_0x8a", + "\u1106,\u116c,": "extra_0x8a", + "\u1106,\u116d,": "extra_0x8a", + "\u1106,\u116e,": "extra_0x8a", + "\u1106,\u116f,": "extra_0x8a", + "\u1106,\u1170,": "extra_0x8a", + "\u1106,\u1171,": "extra_0x8a", + "\u1106,\u1172,": "extra_0x8a", + "\u1106,\u1173,": "extra_0x8a", + "\u1106,\u1174,": "extra_0x8a", + "\u1106,\u1175,": "extra_0x8a", + "\u1107,\u1161,": "extra_0x8a", + "\u1107,\u1162,": "extra_0x8a", + "\u1107,\u1163,": "extra_0x8a", + "\u1107,\u1164,": "extra_0x8a", + "\u1107,\u1165,": "extra_0x8a", + "\u1107,\u1166,": "extra_0x8a", + "\u1107,\u1167,": "extra_0x8a", + "\u1107,\u1168,": "extra_0x8a", + "\u1107,\u1169,": "extra_0x8a", + "\u1107,\u116a,": "extra_0x8a", + "\u1107,\u116b,": "extra_0x8a", + "\u1107,\u116c,": "extra_0x8a", + "\u1107,\u116d,": "extra_0x8a", + "\u1107,\u116e,": "extra_0x8a", + "\u1107,\u116f,": "extra_0x8a", + "\u1107,\u1170,": "extra_0x8a", + "\u1107,\u1171,": "extra_0x8a", + "\u1107,\u1172,": "extra_0x8a", + "\u1107,\u1173,": "extra_0x8a", + "\u1107,\u1174,": "extra_0x8a", + "\u1107,\u1175,": "extra_0x8a", + "\u1108,\u1161,": "extra_0x8a", + "\u1108,\u1162,": "extra_0x8a", + "\u1108,\u1163,": "extra_0x8a", + "\u1108,\u1164,": "extra_0x8a", + "\u1108,\u1165,": "extra_0x8a", + "\u1108,\u1166,": "extra_0x8a", + "\u1108,\u1167,": "extra_0x8a", + "\u1108,\u1168,": "extra_0x8a", + "\u1108,\u1169,": "extra_0x8a", + "\u1108,\u116a,": "extra_0x8a", + "\u1108,\u116b,": "extra_0x8a", + "\u1108,\u116c,": "extra_0x8a", + "\u1108,\u116d,": "extra_0x8a", + "\u1108,\u116e,": "extra_0x8a", + "\u1108,\u116f,": "extra_0x8a", + "\u1108,\u1170,": "extra_0x8a", + "\u1108,\u1171,": "extra_0x8a", + "\u1108,\u1172,": "extra_0x8a", + "\u1108,\u1173,": "extra_0x8a", + "\u1108,\u1174,": "extra_0x8a", + "\u1108,\u1175,": "extra_0x8a", + "\u1109,\u1161,": "extra_0x8a", + "\u1109,\u1162,": "extra_0x8a", + "\u1109,\u1163,": "extra_0x8a", + "\u1109,\u1164,": "extra_0x8a", + "\u1109,\u1165,": "extra_0x8a", + "\u1109,\u1166,": "extra_0x8a", + "\u1109,\u1167,": "extra_0x8a", + "\u1109,\u1168,": "extra_0x8a", + "\u1109,\u1169,": "extra_0x8a", + "\u1109,\u116a,": "extra_0x8a", + "\u1109,\u116b,": "extra_0x8a", + "\u1109,\u116c,": "extra_0x8a", + "\u1109,\u116d,": "extra_0x8a", + "\u1109,\u116e,": "extra_0x8a", + "\u1109,\u116f,": "extra_0x8a", + "\u1109,\u1170,": "extra_0x8a", + "\u1109,\u1171,": "extra_0x8a", + "\u1109,\u1172,": "extra_0x8a", + "\u1109,\u1173,": "extra_0x8a", + "\u1109,\u1174,": "extra_0x8a", + "\u1109,\u1175,": "extra_0x8a", + "\u110a,\u1161,": "extra_0x8a", + "\u110a,\u1162,": "extra_0x8a", + "\u110a,\u1163,": "extra_0x8a", + "\u110a,\u1164,": "extra_0x8a", + "\u110a,\u1165,": "extra_0x8a", + "\u110a,\u1166,": "extra_0x8a", + "\u110a,\u1167,": "extra_0x8a", + "\u110a,\u1168,": "extra_0x8a", + "\u110a,\u1169,": "extra_0x8a", + "\u110a,\u116a,": "extra_0x8a", + "\u110a,\u116b,": "extra_0x8a", + "\u110a,\u116c,": "extra_0x8a", + "\u110a,\u116d,": "extra_0x8a", + "\u110a,\u116e,": "extra_0x8a", + "\u110a,\u116f,": "extra_0x8a", + "\u110a,\u1170,": "extra_0x8a", + "\u110a,\u1171,": "extra_0x8a", + "\u110a,\u1172,": "extra_0x8a", + "\u110a,\u1173,": "extra_0x8a", + "\u110a,\u1174,": "extra_0x8a", + "\u110a,\u1175,": "extra_0x8a", + "\u110b,\u1161,": "extra_0x8a", + "\u110b,\u1162,": "extra_0x8a", + "\u110b,\u1163,": "extra_0x8a", + "\u110b,\u1164,": "extra_0x8a", + "\u110b,\u1165,": "extra_0x8a", + "\u110b,\u1166,": "extra_0x8a", + "\u110b,\u1167,": "extra_0x8a", + "\u110b,\u1168,": "extra_0x8a", + "\u110b,\u1169,": "extra_0x8a", + "\u110b,\u116a,": "extra_0x8a", + "\u110b,\u116b,": "extra_0x8a", + "\u110b,\u116c,": "extra_0x8a", + "\u110b,\u116d,": "extra_0x8a", + "\u110b,\u116e,": "extra_0x8a", + "\u110b,\u1170,": "extra_0x8a", + "\u110b,\u1171,": "extra_0x8a", + "\u110b,\u1172,": "extra_0x8a", + "\u110b,\u1173,": "extra_0x8a", + "\u110b,\u1174,": "extra_0x8a", + "\u110b,\u1175,": "extra_0x8a", + "\u110c,\u1161,": "extra_0x8a", + "\u110c,\u1162,": "extra_0x8a", + "\u110c,\u1163,": "extra_0x8a", + "\u110c,\u1164,": "extra_0x8a", + "\u110c,\u1165,": "extra_0x8a", + "\u110c,\u1166,": "extra_0x8a", + "\u110c,\u1167,": "extra_0x8a", + "\u110c,\u1168,": "extra_0x8a", + "\u110c,\u1169,": "extra_0x8a", + "\u110c,\u116a,": "extra_0x8a", + "\u110c,\u116b,": "extra_0x8a", + "\u110c,\u116c,": "extra_0x8a", + "\u110c,\u116d,": "extra_0x8a", + "\u110c,\u116e,": "extra_0x8a", + "\u110c,\u1170,": "extra_0x8a", + "\u110c,\u1171,": "extra_0x8a", + "\u110c,\u1172,": "extra_0x8a", + "\u110c,\u1173,": "extra_0x8a", + "\u110c,\u1174,": "extra_0x8a", + "\u110c,\u1175,": "extra_0x8a", + "\u110d,\u1161,": "extra_0x8a", + "\u110d,\u1162,": "extra_0x8a", + "\u110d,\u1163,": "extra_0x8a", + "\u110d,\u1164,": "extra_0x8a", + "\u110d,\u1165,": "extra_0x8a", + "\u110d,\u1166,": "extra_0x8a", + "\u110d,\u1167,": "extra_0x8a", + "\u110d,\u1168,": "extra_0x8a", + "\u110d,\u1169,": "extra_0x8a", + "\u110d,\u116a,": "extra_0x8a", + "\u110d,\u116b,": "extra_0x8a", + "\u110d,\u116c,": "extra_0x8a", + "\u110d,\u116d,": "extra_0x8a", + "\u110d,\u116e,": "extra_0x8a", + "\u110d,\u116f,": "extra_0x8a", + "\u110d,\u1170,": "extra_0x8a", + "\u110d,\u1171,": "extra_0x8a", + "\u110d,\u1172,": "extra_0x8a", + "\u110d,\u1173,": "extra_0x8a", + "\u110d,\u1174,": "extra_0x8a", + "\u110d,\u1175,": "extra_0x8a", + "\u110e,\u1161,": "extra_0x8a", + "\u110e,\u1162,": "extra_0x8a", + "\u110e,\u1163,": "extra_0x8a", + "\u110e,\u1164,": "extra_0x8a", + "\u110e,\u1165,": "extra_0x8a", + "\u110e,\u1166,": "extra_0x8a", + "\u110e,\u1167,": "extra_0x8a", + "\u110e,\u1168,": "extra_0x8a", + "\u110e,\u1169,": "extra_0x8a", + "\u110e,\u116a,": "extra_0x8a", + "\u110e,\u116b,": "extra_0x8a", + "\u110e,\u116c,": "extra_0x8a", + "\u110e,\u116d,": "extra_0x8a", + "\u110e,\u116e,": "extra_0x8a", + "\u110e,\u116f,": "extra_0x8a", + "\u110e,\u1170,": "extra_0x8a", + "\u110e,\u1171,": "extra_0x8a", + "\u110e,\u1172,": "extra_0x8a", + "\u110e,\u1173,": "extra_0x8a", + "\u110e,\u1174,": "extra_0x8a", + "\u110e,\u1175,": "extra_0x8a", + "\u110f,\u1161,": "extra_0x8a", + "\u110f,\u1162,": "extra_0x8a", + "\u110f,\u1163,": "extra_0x8a", + "\u110f,\u1164,": "extra_0x8a", + "\u110f,\u1165,": "extra_0x8a", + "\u110f,\u1166,": "extra_0x8a", + "\u110f,\u1167,": "extra_0x8a", + "\u110f,\u1168,": "extra_0x8a", + "\u110f,\u1169,": "extra_0x8a", + "\u110f,\u116a,": "extra_0x8a", + "\u110f,\u116b,": "extra_0x8a", + "\u110f,\u116c,": "extra_0x8a", + "\u110f,\u116d,": "extra_0x8a", + "\u110f,\u116e,": "extra_0x8a", + "\u110f,\u116f,": "extra_0x8a", + "\u110f,\u1170,": "extra_0x8a", + "\u110f,\u1171,": "extra_0x8a", + "\u110f,\u1172,": "extra_0x8a", + "\u110f,\u1173,": "extra_0x8a", + "\u110f,\u1174,": "extra_0x8a", + "\u110f,\u1175,": "extra_0x8a", + "\u1110,\u1161,": "extra_0x8a", + "\u1110,\u1162,": "extra_0x8a", + "\u1110,\u1163,": "extra_0x8a", + "\u1110,\u1164,": "extra_0x8a", + "\u1110,\u1165,": "extra_0x8a", + "\u1110,\u1166,": "extra_0x8a", + "\u1110,\u1167,": "extra_0x8a", + "\u1110,\u1168,": "extra_0x8a", + "\u1110,\u1169,": "extra_0x8a", + "\u1110,\u116a,": "extra_0x8a", + "\u1110,\u116b,": "extra_0x8a", + "\u1110,\u116c,": "extra_0x8a", + "\u1110,\u116d,": "extra_0x8a", + "\u1110,\u116e,": "extra_0x8a", + "\u1110,\u116f,": "extra_0x8a", + "\u1110,\u1170,": "extra_0x8a", + "\u1110,\u1171,": "extra_0x8a", + "\u1110,\u1172,": "extra_0x8a", + "\u1110,\u1173,": "extra_0x8a", + "\u1110,\u1174,": "extra_0x8a", + "\u1110,\u1175,": "extra_0x8a", + "\u1111,\u1161,": "extra_0x8a", + "\u1111,\u1162,": "extra_0x8a", + "\u1111,\u1163,": "extra_0x8a", + "\u1111,\u1164,": "extra_0x8a", + "\u1111,\u1165,": "extra_0x8a", + "\u1111,\u1166,": "extra_0x8a", + "\u1111,\u1167,": "extra_0x8a", + "\u1111,\u1168,": "extra_0x8a", + "\u1111,\u1169,": "extra_0x8a", + "\u1111,\u116a,": "extra_0x8a", + "\u1111,\u116b,": "extra_0x8a", + "\u1111,\u116c,": "extra_0x8a", + "\u1111,\u116d,": "extra_0x8a", + "\u1111,\u116e,": "extra_0x8a", + "\u1111,\u116f,": "extra_0x8a", + "\u1111,\u1170,": "extra_0x8a", + "\u1111,\u1171,": "extra_0x8a", + "\u1111,\u1172,": "extra_0x8a", + "\u1111,\u1173,": "extra_0x8a", + "\u1111,\u1174,": "extra_0x8a", + "\u1111,\u1175,": "extra_0x8a", + "\u1112,\u1161,": "extra_0x8a", + "\u1112,\u1162,": "extra_0x8a", + "\u1112,\u1163,": "extra_0x8a", + "\u1112,\u1164,": "extra_0x8a", + "\u1112,\u1165,": "extra_0x8a", + "\u1112,\u1166,": "extra_0x8a", + "\u1112,\u1167,": "extra_0x8a", + "\u1112,\u1168,": "extra_0x8a", + "\u1112,\u1169,": "extra_0x8a", + "\u1112,\u116a,": "extra_0x8a", + "\u1112,\u116b,": "extra_0x8a", + "\u1112,\u116c,": "extra_0x8a", + "\u1112,\u116d,": "extra_0x8a", + "\u1112,\u116e,": "extra_0x8a", + "\u1112,\u116f,": "extra_0x8a", + "\u1112,\u1170,": "extra_0x8a", + "\u1112,\u1171,": "extra_0x8a", + "\u1112,\u1172,": "extra_0x8a", + "\u1112,\u1173,": "extra_0x8a", + "\u1112,\u1174,": "extra_0x8a", + "\u1112,\u1175,": "extra_0x8a" + } + } + ], + "\u11bc": [ + null, + null, + null, + { + "defaultGlyph": "0xd7", + "alternatives": {} + }, + { + "defaultGlyph": "0xee", + "alternatives": {} + }, + { + "defaultGlyph": "0xfd", + "alternatives": { + "\u1100,\u1161,": "extra_0x8b", + "\u1100,\u1162,": "extra_0x8b", + "\u1100,\u1163,": "extra_0x8b", + "\u1100,\u1164,": "extra_0x8b", + "\u1100,\u1165,": "extra_0x8b", + "\u1100,\u1166,": "extra_0x8b", + "\u1100,\u1167,": "extra_0x8b", + "\u1100,\u1168,": "extra_0x8b", + "\u1100,\u1169,": "extra_0x8b", + "\u1100,\u116a,": "extra_0x8b", + "\u1100,\u116b,": "extra_0x8b", + "\u1100,\u116c,": "extra_0x8b", + "\u1100,\u116d,": "extra_0x8b", + "\u1100,\u116e,": "extra_0x8b", + "\u1100,\u116f,": "extra_0x8b", + "\u1100,\u1170,": "extra_0x8b", + "\u1100,\u1171,": "extra_0x8b", + "\u1100,\u1172,": "extra_0x8b", + "\u1100,\u1173,": "extra_0x8b", + "\u1100,\u1174,": "extra_0x8b", + "\u1100,\u1175,": "extra_0x8b", + "\u1101,\u1161,": "extra_0x8b", + "\u1101,\u1162,": "extra_0x8b", + "\u1101,\u1163,": "extra_0x8b", + "\u1101,\u1164,": "extra_0x8b", + "\u1101,\u1165,": "extra_0x8b", + "\u1101,\u1166,": "extra_0x8b", + "\u1101,\u1167,": "extra_0x8b", + "\u1101,\u1168,": "extra_0x8b", + "\u1101,\u1169,": "extra_0x8b", + "\u1101,\u116a,": "extra_0x8b", + "\u1101,\u116b,": "extra_0x8b", + "\u1101,\u116c,": "extra_0x8b", + "\u1101,\u116d,": "extra_0x8b", + "\u1101,\u116e,": "extra_0x8b", + "\u1101,\u116f,": "extra_0x8b", + "\u1101,\u1170,": "extra_0x8b", + "\u1101,\u1171,": "extra_0x8b", + "\u1101,\u1172,": "extra_0x8b", + "\u1101,\u1173,": "extra_0x8b", + "\u1101,\u1174,": "extra_0x8b", + "\u1101,\u1175,": "extra_0x8b", + "\u1102,\u1161,": "extra_0x8b", + "\u1102,\u1162,": "extra_0x8b", + "\u1102,\u1163,": "extra_0x8b", + "\u1102,\u1164,": "extra_0x8b", + "\u1102,\u1165,": "extra_0x8b", + "\u1102,\u1166,": "extra_0x8b", + "\u1102,\u1167,": "extra_0x8b", + "\u1102,\u1168,": "extra_0x8b", + "\u1102,\u1169,": "extra_0x8b", + "\u1102,\u116a,": "extra_0x8b", + "\u1102,\u116b,": "extra_0x8b", + "\u1102,\u116c,": "extra_0x8b", + "\u1102,\u116d,": "extra_0x8b", + "\u1102,\u116e,": "extra_0x8b", + "\u1102,\u116f,": "extra_0x8b", + "\u1102,\u1170,": "extra_0x8b", + "\u1102,\u1171,": "extra_0x8b", + "\u1102,\u1172,": "extra_0x8b", + "\u1102,\u1173,": "extra_0x8b", + "\u1102,\u1174,": "extra_0x8b", + "\u1102,\u1175,": "extra_0x8b", + "\u1103,\u1161,": "extra_0x8b", + "\u1103,\u1162,": "extra_0x8b", + "\u1103,\u1163,": "extra_0x8b", + "\u1103,\u1164,": "extra_0x8b", + "\u1103,\u1165,": "extra_0x8b", + "\u1103,\u1166,": "extra_0x8b", + "\u1103,\u1167,": "extra_0x8b", + "\u1103,\u1168,": "extra_0x8b", + "\u1103,\u1169,": "extra_0x8b", + "\u1103,\u116a,": "extra_0x8b", + "\u1103,\u116b,": "extra_0x8b", + "\u1103,\u116c,": "extra_0x8b", + "\u1103,\u116d,": "extra_0x8b", + "\u1103,\u116e,": "extra_0x8b", + "\u1103,\u116f,": "extra_0x8b", + "\u1103,\u1170,": "extra_0x8b", + "\u1103,\u1171,": "extra_0x8b", + "\u1103,\u1172,": "extra_0x8b", + "\u1103,\u1173,": "extra_0x8b", + "\u1103,\u1174,": "extra_0x8b", + "\u1103,\u1175,": "extra_0x8b", + "\u1104,\u1161,": "extra_0x8b", + "\u1104,\u1162,": "extra_0x8b", + "\u1104,\u1163,": "extra_0x8b", + "\u1104,\u1164,": "extra_0x8b", + "\u1104,\u1165,": "extra_0x8b", + "\u1104,\u1166,": "extra_0x8b", + "\u1104,\u1167,": "extra_0x8b", + "\u1104,\u1168,": "extra_0x8b", + "\u1104,\u1169,": "extra_0x8b", + "\u1104,\u116a,": "extra_0x8b", + "\u1104,\u116b,": "extra_0x8b", + "\u1104,\u116c,": "extra_0x8b", + "\u1104,\u116d,": "extra_0x8b", + "\u1104,\u116e,": "extra_0x8b", + "\u1104,\u116f,": "extra_0x8b", + "\u1104,\u1170,": "extra_0x8b", + "\u1104,\u1171,": "extra_0x8b", + "\u1104,\u1172,": "extra_0x8b", + "\u1104,\u1173,": "extra_0x8b", + "\u1104,\u1174,": "extra_0x8b", + "\u1104,\u1175,": "extra_0x8b", + "\u1105,\u1161,": "extra_0x8b", + "\u1105,\u1162,": "extra_0x8b", + "\u1105,\u1163,": "extra_0x8b", + "\u1105,\u1164,": "extra_0x8b", + "\u1105,\u1165,": "extra_0x8b", + "\u1105,\u1166,": "extra_0x8b", + "\u1105,\u1167,": "extra_0x8b", + "\u1105,\u1168,": "extra_0x8b", + "\u1105,\u1169,": "extra_0x8b", + "\u1105,\u116a,": "extra_0x8b", + "\u1105,\u116b,": "extra_0x8b", + "\u1105,\u116c,": "extra_0x8b", + "\u1105,\u116d,": "extra_0x8b", + "\u1105,\u116e,": "extra_0x8b", + "\u1105,\u116f,": "extra_0x8b", + "\u1105,\u1170,": "extra_0x8b", + "\u1105,\u1171,": "extra_0x8b", + "\u1105,\u1172,": "extra_0x8b", + "\u1105,\u1173,": "extra_0x8b", + "\u1105,\u1174,": "extra_0x8b", + "\u1105,\u1175,": "extra_0x8b", + "\u1106,\u1161,": "extra_0x8b", + "\u1106,\u1162,": "extra_0x8b", + "\u1106,\u1163,": "extra_0x8b", + "\u1106,\u1164,": "extra_0x8b", + "\u1106,\u1165,": "extra_0x8b", + "\u1106,\u1166,": "extra_0x8b", + "\u1106,\u1167,": "extra_0x8b", + "\u1106,\u1168,": "extra_0x8b", + "\u1106,\u1169,": "extra_0x8b", + "\u1106,\u116a,": "extra_0x8b", + "\u1106,\u116b,": "extra_0x8b", + "\u1106,\u116c,": "extra_0x8b", + "\u1106,\u116d,": "extra_0x8b", + "\u1106,\u116e,": "extra_0x8b", + "\u1106,\u116f,": "extra_0x8b", + "\u1106,\u1170,": "extra_0x8b", + "\u1106,\u1171,": "extra_0x8b", + "\u1106,\u1172,": "extra_0x8b", + "\u1106,\u1173,": "extra_0x8b", + "\u1106,\u1174,": "extra_0x8b", + "\u1106,\u1175,": "extra_0x8b", + "\u1107,\u1161,": "extra_0x8b", + "\u1107,\u1162,": "extra_0x8b", + "\u1107,\u1163,": "extra_0x8b", + "\u1107,\u1164,": "extra_0x8b", + "\u1107,\u1165,": "extra_0x8b", + "\u1107,\u1166,": "extra_0x8b", + "\u1107,\u1167,": "extra_0x8b", + "\u1107,\u1168,": "extra_0x8b", + "\u1107,\u1169,": "extra_0x8b", + "\u1107,\u116a,": "extra_0x8b", + "\u1107,\u116b,": "extra_0x8b", + "\u1107,\u116c,": "extra_0x8b", + "\u1107,\u116d,": "extra_0x8b", + "\u1107,\u116e,": "extra_0x8b", + "\u1107,\u116f,": "extra_0x8b", + "\u1107,\u1170,": "extra_0x8b", + "\u1107,\u1171,": "extra_0x8b", + "\u1107,\u1172,": "extra_0x8b", + "\u1107,\u1173,": "extra_0x8b", + "\u1107,\u1174,": "extra_0x8b", + "\u1107,\u1175,": "extra_0x8b", + "\u1108,\u1161,": "extra_0x8b", + "\u1108,\u1162,": "extra_0x8b", + "\u1108,\u1163,": "extra_0x8b", + "\u1108,\u1164,": "extra_0x8b", + "\u1108,\u1165,": "extra_0x8b", + "\u1108,\u1166,": "extra_0x8b", + "\u1108,\u1167,": "extra_0x8b", + "\u1108,\u1168,": "extra_0x8b", + "\u1108,\u1169,": "extra_0x8b", + "\u1108,\u116a,": "extra_0x8b", + "\u1108,\u116b,": "extra_0x8b", + "\u1108,\u116c,": "extra_0x8b", + "\u1108,\u116d,": "extra_0x8b", + "\u1108,\u116e,": "extra_0x8b", + "\u1108,\u116f,": "extra_0x8b", + "\u1108,\u1170,": "extra_0x8b", + "\u1108,\u1171,": "extra_0x8b", + "\u1108,\u1172,": "extra_0x8b", + "\u1108,\u1173,": "extra_0x8b", + "\u1108,\u1174,": "extra_0x8b", + "\u1108,\u1175,": "extra_0x8b", + "\u1109,\u1161,": "extra_0x8b", + "\u1109,\u1162,": "extra_0x8b", + "\u1109,\u1163,": "extra_0x8b", + "\u1109,\u1164,": "extra_0x8b", + "\u1109,\u1165,": "extra_0x8b", + "\u1109,\u1166,": "extra_0x8b", + "\u1109,\u1167,": "extra_0x8b", + "\u1109,\u1168,": "extra_0x8b", + "\u1109,\u1169,": "extra_0x8b", + "\u1109,\u116a,": "extra_0x8b", + "\u1109,\u116b,": "extra_0x8b", + "\u1109,\u116c,": "extra_0x8b", + "\u1109,\u116d,": "extra_0x8b", + "\u1109,\u116e,": "extra_0x8b", + "\u1109,\u116f,": "extra_0x8b", + "\u1109,\u1170,": "extra_0x8b", + "\u1109,\u1171,": "extra_0x8b", + "\u1109,\u1172,": "extra_0x8b", + "\u1109,\u1173,": "extra_0x8b", + "\u1109,\u1174,": "extra_0x8b", + "\u1109,\u1175,": "extra_0x8b", + "\u110a,\u1161,": "extra_0x8b", + "\u110a,\u1162,": "extra_0x8b", + "\u110a,\u1163,": "extra_0x8b", + "\u110a,\u1164,": "extra_0x8b", + "\u110a,\u1165,": "extra_0x8b", + "\u110a,\u1166,": "extra_0x8b", + "\u110a,\u1167,": "extra_0x8b", + "\u110a,\u1168,": "extra_0x8b", + "\u110a,\u1169,": "extra_0x8b", + "\u110a,\u116a,": "extra_0x8b", + "\u110a,\u116b,": "extra_0x8b", + "\u110a,\u116c,": "extra_0x8b", + "\u110a,\u116d,": "extra_0x8b", + "\u110a,\u116e,": "extra_0x8b", + "\u110a,\u116f,": "extra_0x8b", + "\u110a,\u1170,": "extra_0x8b", + "\u110a,\u1171,": "extra_0x8b", + "\u110a,\u1172,": "extra_0x8b", + "\u110a,\u1173,": "extra_0x8b", + "\u110a,\u1174,": "extra_0x8b", + "\u110a,\u1175,": "extra_0x8b", + "\u110b,\u1161,": "extra_0x8b", + "\u110b,\u1162,": "extra_0x8b", + "\u110b,\u1163,": "extra_0x8b", + "\u110b,\u1164,": "extra_0x8b", + "\u110b,\u1165,": "extra_0x8b", + "\u110b,\u1166,": "extra_0x8b", + "\u110b,\u1167,": "extra_0x8b", + "\u110b,\u1168,": "extra_0x8b", + "\u110b,\u1169,": "extra_0x8b", + "\u110b,\u116a,": "extra_0x8b", + "\u110b,\u116b,": "extra_0x8b", + "\u110b,\u116c,": "extra_0x8b", + "\u110b,\u116d,": "extra_0x8b", + "\u110b,\u116e,": "extra_0x8b", + "\u110b,\u116f,": "extra_0x8b", + "\u110b,\u1170,": "extra_0x8b", + "\u110b,\u1171,": "extra_0x8b", + "\u110b,\u1172,": "extra_0x8b", + "\u110b,\u1173,": "extra_0x8b", + "\u110b,\u1174,": "extra_0x8b", + "\u110b,\u1175,": "extra_0x8b", + "\u110c,\u1161,": "extra_0x8b", + "\u110c,\u1162,": "extra_0x8b", + "\u110c,\u1163,": "extra_0x8b", + "\u110c,\u1164,": "extra_0x8b", + "\u110c,\u1165,": "extra_0x8b", + "\u110c,\u1166,": "extra_0x8b", + "\u110c,\u1167,": "extra_0x8b", + "\u110c,\u1168,": "extra_0x8b", + "\u110c,\u1169,": "extra_0x8b", + "\u110c,\u116a,": "extra_0x8b", + "\u110c,\u116b,": "extra_0x8b", + "\u110c,\u116c,": "extra_0x8b", + "\u110c,\u116d,": "extra_0x8b", + "\u110c,\u116e,": "extra_0x8b", + "\u110c,\u116f,": "extra_0x8b", + "\u110c,\u1170,": "extra_0x8b", + "\u110c,\u1171,": "extra_0x8b", + "\u110c,\u1172,": "extra_0x8b", + "\u110c,\u1173,": "extra_0x8b", + "\u110c,\u1174,": "extra_0x8b", + "\u110c,\u1175,": "extra_0x8b", + "\u110d,\u1161,": "extra_0x8b", + "\u110d,\u1162,": "extra_0x8b", + "\u110d,\u1163,": "extra_0x8b", + "\u110d,\u1164,": "extra_0x8b", + "\u110d,\u1165,": "extra_0x8b", + "\u110d,\u1166,": "extra_0x8b", + "\u110d,\u1167,": "extra_0x8b", + "\u110d,\u1168,": "extra_0x8b", + "\u110d,\u1169,": "extra_0x8b", + "\u110d,\u116a,": "extra_0x8b", + "\u110d,\u116b,": "extra_0x8b", + "\u110d,\u116c,": "extra_0x8b", + "\u110d,\u116d,": "extra_0x8b", + "\u110d,\u116e,": "extra_0x8b", + "\u110d,\u116f,": "extra_0x8b", + "\u110d,\u1170,": "extra_0x8b", + "\u110d,\u1171,": "extra_0x8b", + "\u110d,\u1172,": "extra_0x8b", + "\u110d,\u1173,": "extra_0x8b", + "\u110d,\u1174,": "extra_0x8b", + "\u110d,\u1175,": "extra_0x8b", + "\u110e,\u1161,": "extra_0x8b", + "\u110e,\u1162,": "extra_0x8b", + "\u110e,\u1163,": "extra_0x8b", + "\u110e,\u1164,": "extra_0x8b", + "\u110e,\u1165,": "extra_0x8b", + "\u110e,\u1166,": "extra_0x8b", + "\u110e,\u1167,": "extra_0x8b", + "\u110e,\u1168,": "extra_0x8b", + "\u110e,\u1169,": "extra_0x8b", + "\u110e,\u116a,": "extra_0x8b", + "\u110e,\u116b,": "extra_0x8b", + "\u110e,\u116c,": "extra_0x8b", + "\u110e,\u116d,": "extra_0x8b", + "\u110e,\u116e,": "extra_0x8b", + "\u110e,\u116f,": "extra_0x8b", + "\u110e,\u1170,": "extra_0x8b", + "\u110e,\u1171,": "extra_0x8b", + "\u110e,\u1172,": "extra_0x8b", + "\u110e,\u1173,": "extra_0x8b", + "\u110e,\u1174,": "extra_0x8b", + "\u110e,\u1175,": "extra_0x8b", + "\u110f,\u1161,": "extra_0x8b", + "\u110f,\u1162,": "extra_0x8b", + "\u110f,\u1163,": "extra_0x8b", + "\u110f,\u1164,": "extra_0x8b", + "\u110f,\u1165,": "extra_0x8b", + "\u110f,\u1166,": "extra_0x8b", + "\u110f,\u1167,": "extra_0x8b", + "\u110f,\u1168,": "extra_0x8b", + "\u110f,\u1169,": "extra_0x8b", + "\u110f,\u116a,": "extra_0x8b", + "\u110f,\u116b,": "extra_0x8b", + "\u110f,\u116c,": "extra_0x8b", + "\u110f,\u116d,": "extra_0x8b", + "\u110f,\u116e,": "extra_0x8b", + "\u110f,\u116f,": "extra_0x8b", + "\u110f,\u1170,": "extra_0x8b", + "\u110f,\u1171,": "extra_0x8b", + "\u110f,\u1172,": "extra_0x8b", + "\u110f,\u1173,": "extra_0x8b", + "\u110f,\u1174,": "extra_0x8b", + "\u110f,\u1175,": "extra_0x8b", + "\u1110,\u1161,": "extra_0x8b", + "\u1110,\u1162,": "extra_0x8b", + "\u1110,\u1163,": "extra_0x8b", + "\u1110,\u1164,": "extra_0x8b", + "\u1110,\u1165,": "extra_0x8b", + "\u1110,\u1166,": "extra_0x8b", + "\u1110,\u1167,": "extra_0x8b", + "\u1110,\u1168,": "extra_0x8b", + "\u1110,\u1169,": "extra_0x8b", + "\u1110,\u116a,": "extra_0x8b", + "\u1110,\u116b,": "extra_0x8b", + "\u1110,\u116c,": "extra_0x8b", + "\u1110,\u116d,": "extra_0x8b", + "\u1110,\u116e,": "extra_0x8b", + "\u1110,\u116f,": "extra_0x8b", + "\u1110,\u1170,": "extra_0x8b", + "\u1110,\u1171,": "extra_0x8b", + "\u1110,\u1172,": "extra_0x8b", + "\u1110,\u1173,": "extra_0x8b", + "\u1110,\u1174,": "extra_0x8b", + "\u1110,\u1175,": "extra_0x8b", + "\u1111,\u1161,": "extra_0x8b", + "\u1111,\u1162,": "extra_0x8b", + "\u1111,\u1163,": "extra_0x8b", + "\u1111,\u1164,": "extra_0x8b", + "\u1111,\u1165,": "extra_0x8b", + "\u1111,\u1166,": "extra_0x8b", + "\u1111,\u1167,": "extra_0x8b", + "\u1111,\u1168,": "extra_0x8b", + "\u1111,\u1169,": "extra_0x8b", + "\u1111,\u116a,": "extra_0x8b", + "\u1111,\u116b,": "extra_0x8b", + "\u1111,\u116c,": "extra_0x8b", + "\u1111,\u116d,": "extra_0x8b", + "\u1111,\u116e,": "extra_0x8b", + "\u1111,\u116f,": "extra_0x8b", + "\u1111,\u1170,": "extra_0x8b", + "\u1111,\u1171,": "extra_0x8b", + "\u1111,\u1172,": "extra_0x8b", + "\u1111,\u1173,": "extra_0x8b", + "\u1111,\u1174,": "extra_0x8b", + "\u1111,\u1175,": "extra_0x8b", + "\u1112,\u1161,": "extra_0x8b", + "\u1112,\u1162,": "extra_0x8b", + "\u1112,\u1163,": "extra_0x8b", + "\u1112,\u1164,": "extra_0x8b", + "\u1112,\u1165,": "extra_0x8b", + "\u1112,\u1166,": "extra_0x8b", + "\u1112,\u1167,": "extra_0x8b", + "\u1112,\u1168,": "extra_0x8b", + "\u1112,\u1169,": "extra_0x8b", + "\u1112,\u116a,": "extra_0x8b", + "\u1112,\u116b,": "extra_0x8b", + "\u1112,\u116c,": "extra_0x8b", + "\u1112,\u116d,": "extra_0x8b", + "\u1112,\u116e,": "extra_0x8b", + "\u1112,\u116f,": "extra_0x8b", + "\u1112,\u1170,": "extra_0x8b", + "\u1112,\u1171,": "extra_0x8b", + "\u1112,\u1172,": "extra_0x8b", + "\u1112,\u1173,": "extra_0x8b", + "\u1112,\u1174,": "extra_0x8b", + "\u1112,\u1175,": "extra_0x8b" + } + } + ], + "\u11bd": [ + null, + null, + null, + { + "defaultGlyph": "0xd8", + "alternatives": {} + }, + { + "defaultGlyph": "0xef", + "alternatives": {} + }, + { + "defaultGlyph": "0xef", + "alternatives": {} + } + ], + "\u11be": [ + null, + null, + null, + { + "defaultGlyph": "0xd9", + "alternatives": {} + }, + { + "defaultGlyph": "0xf0", + "alternatives": {} + }, + { + "defaultGlyph": "0xf0", + "alternatives": {} + } + ], + "\u11bf": [ + null, + null, + null, + { + "defaultGlyph": "0xda", + "alternatives": {} + }, + { + "defaultGlyph": "0xf1", + "alternatives": {} + }, + { + "defaultGlyph": "0xf1", + "alternatives": {} + } + ], + "\u11c0": [ + null, + null, + null, + { + "defaultGlyph": "0xdb", + "alternatives": {} + }, + { + "defaultGlyph": "0xf2", + "alternatives": {} + }, + { + "defaultGlyph": "0xf2", + "alternatives": {} + } + ], + "\u11c1": [ + null, + null, + null, + { + "defaultGlyph": "0xdc", + "alternatives": {} + }, + { + "defaultGlyph": "0xf3", + "alternatives": {} + }, + { + "defaultGlyph": "0xf3", + "alternatives": {} + } + ], + "\u11c2": [ + null, + null, + null, + { + "defaultGlyph": "0xdd", + "alternatives": {} + }, + { + "defaultGlyph": "0xf4", + "alternatives": {} + }, + { + "defaultGlyph": "0xf4", + "alternatives": {} + } + ] +} \ No newline at end of file diff --git a/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json b/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json index 06a3aa6304..595221dbb2 100644 --- a/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json +++ b/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json @@ -2840,4 +2840,4 @@ "WOMAN": "NAINEN", "YELLOW SAGE": "KELTAINEN TIETÄJÄ" } -} \ No newline at end of file +} diff --git a/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json b/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json index 76c33da665..2a5dc78628 100644 --- a/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json +++ b/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json @@ -9829,4 +9829,4 @@ "youngsamos": "Nuori Samos", "youngsamos-before-rescue": "Samos" } -} \ No newline at end of file +} diff --git a/game/assets/jak2/subtitle/subtitle_lines_it-IT.json b/game/assets/jak2/subtitle/subtitle_lines_it-IT.json index 561c8e11ad..a96e393c2b 100644 --- a/game/assets/jak2/subtitle/subtitle_lines_it-IT.json +++ b/game/assets/jak2/subtitle/subtitle_lines_it-IT.json @@ -7732,4 +7732,4 @@ "youngsamos": "Giovane Samos", "youngsamos-before-rescue": "Samos" } -} \ No newline at end of file +} diff --git a/game/assets/jak2/temp-text-id-mapping.json b/game/assets/jak2/temp-text-id-mapping.json deleted file mode 100644 index 1f25354bc6..0000000000 --- a/game/assets/jak2/temp-text-id-mapping.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "1a3": "138", - "1b5": "161", - "133a": "1113", - "1200": "1031", - "1201": "1032", - "1202": "1034", - "1203": "1033", - "120c": "10c0", - "120d": "103b", - "120e": "1042", - "1215": "10d0", - "123a": "1035", - "123c": "1070", - "123d": "1071", - "123f": "107b", - "1242": "107c", - "1240": "107d", - "1241": "107e", - "1248": "1050", - "1249": "1051", - "124e": "100c", - "124d": "100e", - "124f": "100d", - "125e": "1097", - "1280": "1000", - "1286": "1001", - "1287": "1002", - "1289": "1030", - "128f": "100f", - "1290": "1500", - "1291": "1600", - "1292": "1007", - "1293": "160d", - "1294": "1601", - "1295": "1602", - "1296": "1603", - "1297": "1604", - "1299": "160e", - "129a": "160f", - "129b": "1610", - "129c": "1606", - "129d": "1607", - "129e": "1608", - "129f": "1609", - "1300": "1613", - "1301": "1611", - "1302": "160a", - "1303": "160b", - "1304": "160c", - "1307": "1614", - "1308": "1615" -} diff --git a/game/assets/jak2/update-text-from-jak1.py b/game/assets/jak2/update-text-from-jak1.py deleted file mode 100644 index 432c8b28dd..0000000000 --- a/game/assets/jak2/update-text-from-jak1.py +++ /dev/null @@ -1,49 +0,0 @@ -# Jak 2 shares many of the same custom menu strings as jak 1 obviously -# this is to copy them over so they are already translated. - -import json -import os - - -with open("temp-text-id-mapping.json", "r", encoding="utf-8") as f: - mapping = json.load(f) - -with open("./text/game_custom_text_en-US.json", "r", encoding="utf-8") as f: - default_jak2_english = json.load(f) - -def create_text_file(locale): - if not os.path.exists(f"./text/game_custom_text_{locale}.json"): - with open(f"./text/game_custom_text_{locale}.json", "w", encoding="utf-8") as f: - json.dump(default_jak2_english, f, indent=2, ensure_ascii=False) - - with open(f"./text/game_custom_text_{locale}.json", "r", encoding="utf-8") as f: - jak2_file = json.load(f) - - with open( - f"../jak1/text/game_custom_text_{locale}.json", "r", encoding="utf-8" - ) as f: - jak1_file = json.load(f) - - for jak2_id, jak1_id in mapping.items(): - jak2_file[jak2_id] = jak1_file[jak1_id].title() - - with open(f"./text/game_custom_text_{locale}.json", "w", encoding="utf-8") as f: - json.dump(jak2_file, f, indent=2, ensure_ascii=False) - - -create_text_file("ca-ES") -create_text_file("da-DK") -create_text_file("de-DE") -create_text_file("es-ES") -create_text_file("fi-FI") -create_text_file("fr-FR") -create_text_file("hu-HU") -create_text_file("is-IS") -create_text_file("it-IT") -create_text_file("ja-JP") -create_text_file("nl-NL") -create_text_file("no-NO") -create_text_file("pl-PL") -create_text_file("pt-PT") -create_text_file("pt-BR") -create_text_file("sv-SE") diff --git a/game/kernel/common/kmachine.cpp b/game/kernel/common/kmachine.cpp index 4dba2d2b58..f775cca88d 100644 --- a/game/kernel/common/kmachine.cpp +++ b/game/kernel/common/kmachine.cpp @@ -6,8 +6,8 @@ #include "common/log/log.h" #include "common/symbols.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" #include "common/util/Timer.h" +#include "common/util/font/font_utils.h" #include "common/util/string_util.h" #include "game/external/discord.h" diff --git a/game/kernel/jak2/kmachine.cpp b/game/kernel/jak2/kmachine.cpp index 397eb1ba33..97af545e98 100644 --- a/game/kernel/jak2/kmachine.cpp +++ b/game/kernel/jak2/kmachine.cpp @@ -9,7 +9,7 @@ #include "common/log/log.h" #include "common/symbols.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/string_util.h" #include "game/external/discord_jak2.h" diff --git a/game/kernel/jak2/kmachine_extras.cpp b/game/kernel/jak2/kmachine_extras.cpp index 7faf3d806d..a96601314e 100644 --- a/game/kernel/jak2/kmachine_extras.cpp +++ b/game/kernel/jak2/kmachine_extras.cpp @@ -6,10 +6,9 @@ #include "kscheme.h" #include "common/symbols.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "game/external/discord.h" -#include "game/external/discord_jak1.h" #include "game/external/discord_jak2.h" #include "game/kernel/common/Symbol4.h" #include "game/kernel/common/kmachine.h" diff --git a/game/kernel/jak3/kmachine_extras.cpp b/game/kernel/jak3/kmachine_extras.cpp index 55a4e32b20..1ac38b1e43 100644 --- a/game/kernel/jak3/kmachine_extras.cpp +++ b/game/kernel/jak3/kmachine_extras.cpp @@ -6,7 +6,7 @@ #include "kscheme.h" #include "common/symbols.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "game/external/discord_jak3.h" #include "game/kernel/common/Symbol4.h" diff --git a/goal_src/jak2/engine/scene/scene.gc b/goal_src/jak2/engine/scene/scene.gc index 3a126fcab8..875e6ce39d 100644 --- a/goal_src/jak2/engine/scene/scene.gc +++ b/goal_src/jak2/engine/scene/scene.gc @@ -764,6 +764,16 @@ (case (-> s3-0 type) ((string) (when (= (-> *setting-control* user-default subtitle-language) (language-enum korean)) + ;; EXPORT SUBTITLE LINES + ;; dont export the same string multiple times + ;; (when (not (string= *pc-subtitle-export-temp-string* (the-as string s3-0))) + ;; (clear *pc-subtitle-export-temp-string*) + ;; (copy-string<-string *pc-subtitle-export-temp-string* (the-as string s3-0)) + ;; (format 0 "subtitle length: ~D~%" (length (the-as string s3-0))) + ;; (let ((file (new 'stack 'file-stream "/Users/tyler/repos/jak-project/decompiler_out/jak2/assets/subtitles.txt" 'append))) + ;; (format file "~S::~f::\"" (-> (the scene-player self) anim name) f30-0) + ;; (log-string-bytes (the-as string s3-0) file) + ;; (file-stream-close file))) (set! s3-0 (convert-korean-text (the-as string s3-0))) (let ((v1-27 s2-0)) (set! (-> v1-27 scale) 0.6) diff --git a/goal_src/jak2/engine/ui/text.gc b/goal_src/jak2/engine/ui/text.gc index 6b00ab1ec7..31a2a00e82 100644 --- a/goal_src/jak2/engine/ui/text.gc +++ b/goal_src/jak2/engine/ui/text.gc @@ -72,76 +72,98 @@ this ) -(defun convert-korean-text ((arg0 string)) +(defun convert-korean-text ((src-str string)) "Converts the provided [[string]] of [[game-text]] into korean. Returns a [[string]]" (local-vars (v1-21 int)) - (let ((charp (-> arg0 data))) - *expanded-text-line0* - (let ((s4-0 0)) - 0 - (let ((s1-0 0) - (s5-0 (length arg0)) - ) + ;; iterate through the bytes in the string + (let ((src-ptr (-> src-str data))) + (let ((src-i 0)) + (let ((dst-i 0) + (src-len (length src-str))) + ;; use line0 unless expand flag is set (set! *expand-buf-number* (logxor *expand-buf-number* 1)) - (let ((s3-0 (if (zero? *expand-buf-number*) - *expanded-text-line0* - *expanded-text-line1* - ) - ) - ) - (let ((s2-0 (+ (-> s3-0 allocated-length) -1))) - (clear s3-0) - (while (< s4-0 s5-0) + (let ((dst (if (zero? *expand-buf-number*) + *expanded-text-line0* + *expanded-text-line1*))) + (let ((dst-max (+ (-> dst allocated-length) -1))) + (clear dst) + (while (< src-i src-len) (cond - ((= (-> charp s4-0) 3) - (+! s4-0 1) - (while (and (< s4-0 s5-0) (!= (-> charp s4-0) 3) (!= (-> charp s4-0) 4)) - (set! (-> s3-0 data s1-0) (-> charp s4-0)) - (+! s4-0 1) - (+! s1-0 1) - ) - ) + ;; code 3 = copy chars into destination until we reach a code 3 or 4 + ;; i believe this handles non-syllable blocks, like spaces, which are represented like `0x3 0x20` + ((= (-> src-ptr src-i) 3) + (+! src-i 1) + (while (and (< src-i src-len) + (!= (-> src-ptr src-i) 3) + (!= (-> src-ptr src-i) 4)) + (set! (-> dst data dst-i) (-> src-ptr src-i)) + (+! src-i 1) + (+! dst-i 1))) + ;; any other byte (for example #4, which is the start of all syllable blocks) (else - (let ((v1-17 (+ s4-0 1))) - (-> charp v1-17) - (set! s4-0 (+ v1-17 1)) - ) - (set! (-> s3-0 data s1-0) (the-as uint 126)) - (let ((v1-19 (+ s1-0 1))) - (set! (-> s3-0 data v1-19) (the-as uint 89)) - (let ((v1-20 (+ v1-19 1))) - (while (and (< s4-0 s5-0) (< v1-20 s2-0) (!= (-> charp s4-0) 3) (!= (-> charp s4-0) 4)) + ;; look ahead 1 byte (bounds assumed) + (let ((next-byte (+ src-i 1))) + (-> src-ptr next-byte) ;; meaningless, left-over code? + ;; set the src-index to the value of `next-byte`+1 + ;; so this would be...the number of characters (or perhaps the number of syllable elements) + 1 + ;; this is very important i feel + (set! src-i (+ next-byte 1))) + ;; the idea here is we render the jamo all at the same position as the texture for each jamo accounts for their offset + ;; and then advance when we're done. + ;; we use a code of 4 to mark the beginning of a jamo sequence, a.k.a. one hangeul letter. + ;; there is jamo at code-page 1 (#x100-#x1ff) and code-page 3 (#x300-#x3ff), though only a handful are in code-page 1. + ;; since this requires two bytes per jamo, we assume the jamo is in code-page 3 by default and thus only have to read 1 byte per jamo. + ;; however, if we read a code of '5' then that means it is in code-page 1, which means we read 2 bytes. + ;; the jamo sequence terminates when we reach a code 3 (copy chars) or code 4 (new letter). + ;; when the sequence terminates, we move the font trans forwards and move on with our life. + ;; save font trans (~Y) + (set! (-> dst data dst-i) (the-as uint 126)) ;; ~ + (let ((v1-19 (+ dst-i 1))) + (set! (-> dst data v1-19) (the-as uint 89)) ;; Y + (let ((dest-index (+ v1-19 1))) + ;; inner while loop, go until 0x3 or 0x4, or end of the string + (while (and (< src-i src-len) + (< dest-index dst-max) + (!= (-> src-ptr src-i) 3) + (!= (-> src-ptr src-i) 4)) (cond - ((= (-> charp s4-0) 5) - (set! (-> s3-0 data v1-20) (the-as uint 1)) - (+! s4-0 1) - (set! v1-21 (+ v1-20 1)) + ;; we hit a 0x5 + ((= (-> src-ptr src-i) 5) + ;; code-page `0x1` byte + (set! (-> dst data dest-index) (the-as uint 1)) + ;; increment the src-index since we just manually wrote a `0x1` in place of the `0x5` + (+! src-i 1) + (set! v1-21 (+ dest-index 1)) ) (else - (set! (-> s3-0 data v1-20) (the-as uint 3)) - (set! v1-21 (+ v1-20 1)) + ;; code-page `0x3` byte + (set! (-> dst data dest-index) (the-as uint 3)) + (set! v1-21 (+ dest-index 1)) ) ) - (set! (-> s3-0 data v1-21) (-> charp s4-0)) - (+! s4-0 1) + ;; now add the byte that we are looking at the current index + (set! (-> dst data v1-21) (-> src-ptr src-i)) + (+! src-i 1) + ;; restore font trans (~Z) (let ((v1-22 (+ v1-21 1))) - (set! (-> s3-0 data v1-22) (the-as uint 126)) + (set! (-> dst data v1-22) (the-as uint 126)) ;; ~ (let ((v1-23 (+ v1-22 1))) - (set! (-> s3-0 data v1-23) (the-as uint 90)) - (set! v1-20 (+ v1-23 1)) + (set! (-> dst data v1-23) (the-as uint 90)) ;; Z + (set! dest-index (+ v1-23 1)) ) ) ) - (set! (-> s3-0 data v1-20) (the-as uint 126)) - (let ((v1-24 (+ v1-20 1))) - (set! (-> s3-0 data v1-24) (the-as uint 43)) + ;; advance font trans by 26 (~+26H) + (set! (-> dst data dest-index) (the-as uint 126)) ;; ~ + (let ((v1-24 (+ dest-index 1))) + (set! (-> dst data v1-24) (the-as uint 43)) ;; + (let ((v1-25 (+ v1-24 1))) - (set! (-> s3-0 data v1-25) (the-as uint 50)) + (set! (-> dst data v1-25) (the-as uint 50)) ;; 2 (let ((v1-26 (+ v1-25 1))) - (set! (-> s3-0 data v1-26) (the-as uint 54)) + (set! (-> dst data v1-26) (the-as uint 54)) ;; 6 (let ((v1-27 (+ v1-26 1))) - (set! (-> s3-0 data v1-27) (the-as uint 72)) - (set! s1-0 (+ v1-27 1)) + (set! (-> dst data v1-27) (the-as uint 72)) ;; H + (set! dst-i (+ v1-27 1)) ) ) ) @@ -152,8 +174,9 @@ ) ) ) - (set! (-> s3-0 data s1-0) (the-as uint 0)) - s3-0 + ;; null terminate string + (set! (-> dst data dst-i) (the-as uint 0)) + dst ) ) ) diff --git a/goal_src/jak2/kernel/gstring.gc b/goal_src/jak2/kernel/gstring.gc index 4b41e4ae7a..4d071498dc 100644 --- a/goal_src/jak2/kernel/gstring.gc +++ b/goal_src/jak2/kernel/gstring.gc @@ -5,6 +5,27 @@ ;; name in dgo: gstring ;; dgos: KERNEL +(defun print-string-bytes ((arg0 string)) + (let ((str-ptr (-> arg0 data)) + (first-line-break #f)) + (while (and (nonzero? (-> str-ptr 0))) + (when (and first-line-break (or (= (-> str-ptr 0) #x4) (= (-> str-ptr 0) #x59))) + (format #t "~%")) + (when (or (= (-> str-ptr 0) #x4) (= (-> str-ptr 0) #x59)) + (set! first-line-break #t)) + (format #t "0x~X " (-> str-ptr 0)) + (set! str-ptr (&-> str-ptr 1)))) + (format #t "\"~%") + (none)) + +(defun log-string-bytes ((arg0 string) (arg1 object)) + (let ((str-ptr (-> arg0 data))) + (while (and (nonzero? (-> str-ptr 0))) + (format arg1 "0x~X " (-> str-ptr 0)) + (set! str-ptr (&-> str-ptr 1)))) + (format arg1 "~%~%") + (none)) + ;; DECOMP BEGINS (defmethod length ((this string)) @@ -824,5 +845,6 @@ ) (define *pc-encoded-temp-string* (new 'global 'string 2048 (the-as string #f))) +;; (define *pc-subtitle-export-temp-string* (new 'global 'string 2048 (the-as string #f))) (kmemclose) diff --git a/goal_src/jak2/pc/subtitle2.gc b/goal_src/jak2/pc/subtitle2.gc index 0389f89ab2..96b467d471 100644 --- a/goal_src/jak2/pc/subtitle2.gc +++ b/goal_src/jak2/pc/subtitle2.gc @@ -332,18 +332,26 @@ (set! (-> line text) (-> obj movie-line)) (return (the string #f)))) - (cond - ((= (pc-subtitle2-speaker none) (-> line speaker)) - ;; there's no speaker so who cares. - (string-format "~S" (-> line text))) - ((or (= #t (-> *pc-settings* subtitle-speaker?)) - (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle2-flags? line offscreen))) - ;; there is a speaker and we do want it. - ;; we use color 33 which gets set at runtime to any color we want - (string-format "~33L~S:~0L ~S" (get-speaker *subtitle2-text* (-> line speaker)) (-> line text))) - (else - (string-format "~S" (-> line text))) - ) + ;; if we are in korean language mode and printing hint subtitles (which were never in the original game) + ;; then the text did NOT come from `scene.gc` so we must convert it + ;; + ;; this code is somewhat of a mess, but modifying the line text itself was proving to be a problem + ;; clean it up if you wish! + (let ((convert-to-korean? (and (not (-> obj movie-mode?)) + (= (-> *setting-control* user-default subtitle-language) (language-enum korean))))) + (cond + ((= (pc-subtitle2-speaker none) (-> line speaker)) + ;; there's no speaker so who cares. + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + ((or (= #t (-> *pc-settings* subtitle-speaker?)) + (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle2-flags? line offscreen))) + ;; there is a speaker and we do want it. + ;; we use color 33 which gets set at runtime to any color we want + (string-format "~33L~S:~0L ~S" + (if convert-to-korean? (convert-korean-text (get-speaker *subtitle2-text* (-> line speaker))) (get-speaker *subtitle2-text* (-> line speaker))) + (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + (else + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))))) *temp-string*) (defbehavior current-subtitle2-pos subtitle2 ((id sound-id)) @@ -480,9 +488,9 @@ (when (= (gui-status active) (get-status *gui-control* (-> self gui-id))) (true! subtitles-drawn?) (protect (*display-text-box*) - (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) - (set-speaker-color (-> line-queue elts i line speaker)) - (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) + (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) + (set-speaker-color (-> line-queue elts i line speaker)) + (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) ) ;; save this for later usage @@ -851,7 +859,7 @@ (set! (-> self have-subtitles?) #f) (set! (-> self movie-mode?) #f) - (set! (-> self movie-line) (new 'process 'string (+ 7 (* 15 16)) (the string #f))) + (set! (-> self movie-line) (new 'process 'string 1024 (the string #f))) (set! (-> self current-debug-scene) 0) (set! (-> self current-debug-line) 0) diff --git a/goal_src/jak2/pc/util/font-encode-test.gc b/goal_src/jak2/pc/util/font-encode-test.gc index 9cf58e4924..a0147414eb 100644 --- a/goal_src/jak2/pc/util/font-encode-test.gc +++ b/goal_src/jak2/pc/util/font-encode-test.gc @@ -98,6 +98,8 @@ (set-origin! fnt (get-screen-x 0.5) (+ FONT_ENCODE_TEXT_Y 75)) (set-scale! fnt 0.75) (draw-string (lookup-text! *common-text* (the text-id *text-id-val*) #f) buf fnt) + (set-origin! fnt (get-screen-x 0.5) (+ FONT_ENCODE_TEXT_Y 100)) + (draw-string (convert-korean-text "\\c04\\c03\\c79\\c7f\\cee\\c04\\c02\\c72\\c83\\c04\\c02\\c2e\\c1a\\c04\\c02\\c06\\c1c") buf fnt) ) ) ) diff --git a/goal_src/jak2/pc/util/korean-tester.gc b/goal_src/jak2/pc/util/korean-tester.gc new file mode 100644 index 0000000000..44f0d2e16c --- /dev/null +++ b/goal_src/jak2/pc/util/korean-tester.gc @@ -0,0 +1,155 @@ +;;-*-Lisp-*- +(in-package goal) + +;; To run this: + +#| +(mng) ;; build the engine +(lt) ;; connect to the runtime +(ml "goal_src/jak2/pc/util/korean-tester.gc") ;; build and load this file. +|# + +(declare-file (debug)) + +(defconstant KOREAN_TESTER_TEXT_Y (get-screen-y 0.5)) + +(defun korean-tester-test-stop () + "stop the encode test proc" + (kill-by-name "korean-tester" *active-pool*) + ) + +(define *korean-tester-initial-jamos-o1* (new 'static 'boxed-array :type int64 )) +(define *korean-tester-initial-jamos-o2* (new 'static 'boxed-array :type int64 )) +(define *korean-tester-initial-jamos-o3* (new 'static 'boxed-array :type int64 #x8b #xb3 #x92 #x93 #x94 #x95 #x96 #x97 #x98 #x99 #x9a #x9b #x9c #x9d #x9e #x8c #x9f #xa0 #xa1)) +(define *korean-tester-initial-jamos-o4* (new 'static 'boxed-array :type int64 #x6 #x34 #x8 #x9 #xa #xb #xc #x0d #xe #x20 #x21 #xf #x10 #x11 #x2d #x12 #x13 #x14 #x2e)) +(define *korean-tester-initial-jamos-o5* (new 'static 'boxed-array :type int64 #x5e #x65 #x69 #x70 #x71 #x72 #x73 #x74 #x75 #x76 #x77 #x78 #x79 #x7a #x7b #x5f #x7c #x7d #x7e)) +(define *korean-tester-initial-jamos-o6* (new 'static 'boxed-array :type int64 #x8b #x91 #x92 #x93 #x94 #x95 #x96 #x97 #x98 #x99 #x9a #x9b #x9c #x9d #x9e #x8c #x9f #xa0 #xa1)) +(define *korean-tester-initial-jamos-o6-alt* (new 'static 'boxed-array :type int64 #xae #xb3 #xb4 #xb5 #xb6 #xb7 #xb2 #xb8 #x98 #xb9 #xba #xbb #xbc #xbd #xbe #xaf #xbf #xa0 #xc0)) + +(define *korean-tester-middle-vertical-jamos-o1* (new 'static 'boxed-array :type int64 #x1a #x46 #x1b #x47 #x1d #x48 #x1e #x49 #x1c)) +(define *korean-tester-middle-horizontal-jamos-o2* (new 'static 'boxed-array :type int64 #x82 #x83 #x87 #x88 #x84)) +(define *korean-tester-middle-vertical-jamos-o4* (new 'static 'boxed-array :type int64 #x15 #x42 #x16 #x47 #x18 #x44 #x19 #x45 #x17)) +(define *korean-tester-middle-horizontal-jamos-o5* (new 'static 'boxed-array :type int64 #x7f #x80 #x85 #x86 #x81)) + +(define *korean-tester-final-jamos-o4* (new 'static 'boxed-array :type int64 #xc5 #xc6 #xc7 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf #xe7 #xd0 #xe9 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 #xd8 #xd9 #xda #xdb #xdc #xdd)) +(define *korean-tester-final-jamos-o5* (new 'static 'boxed-array :type int64 #xde #xdf #xe0 #xe1 #xc9 #xe2 #xe3 #xe4 #xe5 #xe6 #xcf #xe7 #xe8 #xe9 #xea #xeb #xec #xd4 #xed #xfc #xee #xef #xf0 #xf1 #xf2 #xf3 #xf4)) +(define *korean-tester-final-jamos-o6* (new 'static 'boxed-array :type int64 #xf5 #xdf #xe0 #xf6 #xc9 #xe2 #xe3 #xf7 #xe5 #xf8 #xcf #xe7 #xe8 #xe9 #xea #xf9 #xfa #xd4 #xfb #xfc #xfd #xef #xf0 #xf1 #xf2 #xf3 #xf4)) + +(define *korean-tester-tmp-str* (new 'global 'string 4 (the-as string #f))) +(define *korean-tester-static-combined-jamo* (new 'static 'boxed-array :type int64 #xa3 #xa7)) +(define *korean-tester-static-jamo-1* #x84) +(define *korean-tester-static-jamo-2* #x0) +(define *korean-tester-static-jamo-3* #x0) +(define *korean-tester-current-jamo-coll-1* *korean-tester-initial-jamos-o6-alt*) +(define *korean-tester-current-jamo-index-1* 0) + +(define *korean-tester-current-jamo-coll-2* *korean-tester-final-jamos-o6*) +(define *korean-tester-current-jamo-index-2* 0) + +(defun korean-tester-test-start () + "start the encode test proc" + (korean-tester-test-stop) + (process-spawn-function process :name "korean-tester" + (lambda :behavior process () + (let ((fnt (new 'stack 'font-context *font-default-matrix* (get-screen-x 0.35) (get-screen-y 0.4) 0.0 + (font-color red) (font-flags shadow kerning large middle))) + ) + + (set-width! fnt (get-screen-x 0.8)) + (set-height! fnt (get-screen-y 0.1)) + + (loop + (suspend) + + (if (or (cpad-pressed? 0 left)) + (-! *korean-tester-current-jamo-index-1* 1)) + (if (or (cpad-pressed? 0 right)) + (+! *korean-tester-current-jamo-index-1* 1)) + (minmax! *korean-tester-current-jamo-index-1* #x0 (dec (-> *korean-tester-current-jamo-coll-1* length))) + + (if (or (cpad-pressed? 0 down)) + (-! *korean-tester-current-jamo-index-2* 1)) + (if (or (cpad-pressed? 0 up)) + (+! *korean-tester-current-jamo-index-2* 1)) + (minmax! *korean-tester-current-jamo-index-2* #x0 (dec (-> *korean-tester-current-jamo-coll-2* length))) + + (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) + (bucket-id debug-no-zbuf2)) + ;; print out the current pure hex values + (set-scale! fnt 0.5) + (set-origin! fnt (get-screen-x 0.5) (- KOREAN_TESTER_TEXT_Y 10)) + ;; - 2 glyphs + ;; (draw-string (string-format "0x~X, 0x~X" *korean-tester-static-jamo-1* (-> *korean-tester-current-jamo-coll* *korean-tester-current-jamo-index*)) buf fnt) + ;; - 3 glyphs + ;; (draw-string (string-format "0x~X , 0x~X , 0x~X" + ;; *korean-tester-static-jamo-1* + ;; (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*) + ;; (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) buf fnt) + ;; - 3 glyphs combined + (draw-string (string-format "0x~X , 0x~X" + (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*) + (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) buf fnt) + + ;; print out the korean symbol now + (set-scale! fnt 1.0) + (clear *korean-tester-tmp-str*) + ;; - 2 glyphs + ;; (set! (-> *korean-tester-tmp-str* data 0) 4) + ;; (set! (-> *korean-tester-tmp-str* data 1) 2) + ;; (set! (-> *korean-tester-tmp-str* data 2) *korean-tester-static-jamo-1*) + ;; (if (= *korean-tester-static-jamo-2* #x0) + ;; (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-current-jamo-coll* *korean-tester-current-jamo-index*)) + ;; (set! (-> *korean-tester-tmp-str* data 3) *korean-tester-static-jamo-2*)) + ;; (set! (-> *korean-tester-tmp-str* data 4) 0) + + ;; - 3 glyphs + ;; (set! (-> *korean-tester-tmp-str* data 0) 4) + ;; (set! (-> *korean-tester-tmp-str* data 1) 3) + ;; (set! (-> *korean-tester-tmp-str* data 2) *korean-tester-static-jamo-1*) + ;; (if (= *korean-tester-static-jamo-2* #x0) + ;; (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*)) + ;; (set! (-> *korean-tester-tmp-str* data 3) *korean-tester-static-jamo-2*)) + ;; (if (= *korean-tester-static-jamo-3* #x0) + ;; (set! (-> *korean-tester-tmp-str* data 4) (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) + ;; (set! (-> *korean-tester-tmp-str* data 4) *korean-tester-static-jamo-3*)) + ;; (set! (-> *korean-tester-tmp-str* data 5) 0) + + ;; - 3 glyphs (combined static) + (set! (-> *korean-tester-tmp-str* data 0) 4) + (if (= 2 (-> *korean-tester-static-combined-jamo* length)) + (begin + (set! (-> *korean-tester-tmp-str* data 1) 4) + (set! (-> *korean-tester-tmp-str* data 2) (-> *korean-tester-static-combined-jamo* 0)) + (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-static-combined-jamo* 1)) + (if (= *korean-tester-static-jamo-2* #x0) + (set! (-> *korean-tester-tmp-str* data 4) (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*)) + (set! (-> *korean-tester-tmp-str* data 4) *korean-tester-static-jamo-2*)) + (if (= *korean-tester-static-jamo-3* #x0) + (set! (-> *korean-tester-tmp-str* data 5) (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) + (set! (-> *korean-tester-tmp-str* data 5) *korean-tester-static-jamo-3*)) + (set! (-> *korean-tester-tmp-str* data 6) 0)) + (begin + (set! (-> *korean-tester-tmp-str* data 1) 3) + (set! (-> *korean-tester-tmp-str* data 2) (-> *korean-tester-static-combined-jamo* 0)) + (if (= *korean-tester-static-jamo-2* #x0) + (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*)) + (set! (-> *korean-tester-tmp-str* data 3) *korean-tester-static-jamo-2*)) + (if (= *korean-tester-static-jamo-3* #x0) + (set! (-> *korean-tester-tmp-str* data 4) (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) + (set! (-> *korean-tester-tmp-str* data 4) *korean-tester-static-jamo-3*)) + (set! (-> *korean-tester-tmp-str* data 5) 0))) + + + ;; (log-string-bytes *korean-tester-tmp-str* 0) + (set-origin! fnt (get-screen-x 0.5) (+ KOREAN_TESTER_TEXT_Y 10)) + (draw-string (convert-korean-text *korean-tester-tmp-str*) buf fnt) + ) + ) + ) + + ) + ) + ) + +(korean-tester-test-start) + diff --git a/goal_src/jak2/pc/util/string-viewer.gc b/goal_src/jak2/pc/util/string-viewer.gc new file mode 100644 index 0000000000..e5fcecd470 --- /dev/null +++ b/goal_src/jak2/pc/util/string-viewer.gc @@ -0,0 +1,108 @@ +;;-*-Lisp-*- +(in-package goal) + +;; To run this: + +#| +(mng) ;; build the engine +(lt) ;; connect to the runtime +(ml "goal_src/jak2/pc/util/string-viewer.gc") ;; build and load this file. +|# + +(declare-file (debug)) + +(define *string-viewer-text-id-val* #x0100) +(defconstant STRING_VIEWER_TEXT_Y (get-screen-y 0.05)) + +(defun string-viewer-test-stop () + "stop the encode test proc" + (kill-by-name "string-viewer" *active-pool*) + ) + +(define *string-viewer-tmp-str* (new 'global 'string 128 (the-as string #f))) + +(defun string-viewer-test-start () + "start the encode test proc" + + (string-viewer-test-stop) + (process-spawn-function process :name "string-viewer" + (lambda :behavior process () + (let ((fnt (new 'stack 'font-context *font-default-matrix* (get-screen-x 0.35) (get-screen-y 0.4) 0.0 + (font-color red) (font-flags shadow kerning large middle))) + ) + + (set-width! fnt (get-screen-x 0.8)) + (set-height! fnt (get-screen-y 0.1)) + + (loop + (suspend) + + (if (or (cpad-pressed? 0 left) (cpad-hold? 0 l1)) + (-! *string-viewer-text-id-val* 1)) + (if (or (cpad-pressed? 0 right) (cpad-hold? 0 r1)) + (+! *string-viewer-text-id-val* 1)) + + (minmax! *string-viewer-text-id-val* #x0 #x134c) + + (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) + (bucket-id debug-no-zbuf2)) + (set-scale! fnt 0.5) + (set-origin! fnt (get-screen-x 0.5) (- STRING_VIEWER_TEXT_Y 10)) + (draw-string (string-format "Text ID: ~x" *string-viewer-text-id-val*) buf fnt) + + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 10)) + (draw-string "English:" buf fnt) + + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 30)) + (draw-string (lookup-text! *fallback-text* (the text-id *string-viewer-text-id-val*) #f) buf fnt) + + ;; Assumes you have your text set to korean + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 50)) + (draw-string "Korean:" buf fnt) + + (set-scale! fnt 1.0) + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 75)) + (draw-string (lookup-text! *common-text* (the text-id *string-viewer-text-id-val*) #f) buf fnt) + (lookup-text! *common-text* (the text-id *string-viewer-text-id-val*) #t) + + ;; draw the bytes of each character + (set-scale! fnt 0.35) + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 115)) + (clear *pc-cpp-temp-string*) + (clear *string-viewer-tmp-str*) + (let ((raw-str (lookup-text-string *common-text* (the text-id *string-viewer-text-id-val*)))) + (let ((str-ptr (-> raw-str data)) + (first-line-break #f) + (y-origin (+ STRING_VIEWER_TEXT_Y 115)) + (last-byte (the-as uint 0))) + (while (and (nonzero? (-> str-ptr 0))) + (when (and first-line-break (= (-> str-ptr 0) #x4)) + (draw-string (string-format "~S~S~S~S" "~[~1L" *string-viewer-tmp-str* "~[~6L" *pc-cpp-temp-string*) buf fnt) + (set! y-origin (+ y-origin 15)) + (set-origin! fnt (get-screen-x 0.5) y-origin) + (clear *pc-cpp-temp-string*) + (clear *string-viewer-tmp-str*)) + (when (= (-> str-ptr 0) #x4) + (set! first-line-break #t) + (format *string-viewer-tmp-str* "0x~X " (-> str-ptr 0))) + (when (and (or (= (-> str-ptr 0) #x3) (= (-> str-ptr 0) #x2)) (= last-byte #x4)) + (format *string-viewer-tmp-str* "0x~X " (-> str-ptr 0))) + (when (and (not (= (-> str-ptr 0) #x4)) + (not (and (or (= (-> str-ptr 0) #x3) (= (-> str-ptr 0) #x2)) (= last-byte #x4)))) + (format *pc-cpp-temp-string* "0x~X " (-> str-ptr 0))) + (set! last-byte (-> str-ptr 0)) + (set! str-ptr (&-> str-ptr 1))) + (draw-string (string-format "~S~S~S~S" "~[~1L" *string-viewer-tmp-str* "~[~6L" *pc-cpp-temp-string*) buf fnt) + ) + ) + (clear *temp-string*) + ) + ) + ) + + ) + ) + ) + +(string-viewer-test-start) + diff --git a/goal_src/jak3/pc/progress/progress-static-pc.gc b/goal_src/jak3/pc/progress/progress-static-pc.gc index f6e56a14a3..ece21f9774 100644 --- a/goal_src/jak3/pc/progress/progress-static-pc.gc +++ b/goal_src/jak3/pc/progress/progress-static-pc.gc @@ -461,24 +461,25 @@ This gives us more freedom to write code how we want. (text-id progress-language-portuguese) (text-id progress-language-dutch) (text-id progress-language-english-uk) - ; (text-id language-name-finnish) - ; (text-id language-name-swedish) - ; (text-id language-name-danish) - ; (text-id language-name-norwegian) - ; (text-id language-name-dutch) - ; (text-id language-name-br-portuguese) - ; (text-id language-name-hungarian) - ; (text-id language-name-catalan) - ; (text-id language-name-icelandic) - ; (text-id language-name-polish) - ; (text-id language-name-lithuanian) - ; (text-id language-name-czech) - ; (text-id language-name-croatian) - ; (text-id language-name-galician) + (text-id language-name-finnish) + (text-id language-name-swedish) + (text-id language-name-danish) + (text-id language-name-norwegian) + (text-id language-name-dutch) + (text-id language-name-br-portuguese) + (text-id language-name-hungarian) + (text-id language-name-catalan) + (text-id language-name-icelandic) + (text-id language-name-polish) + (text-id language-name-lithuanian) + (text-id language-name-czech) + (text-id language-name-croatian) + (text-id language-name-galician) ) :get-item-index-fn (lambda () (-> *pc-settings* subtitle-language)) :on-confirm (lambda ((index int) (the-progress progress)) (set! (-> *pc-settings* subtitle-language) (the-as pc-language index)) + (set! (-> *setting-control* user-default subtitle-language) (the-as language-enum index)) (pc-settings-save)))) (defmacro game-options-pc-sound-language () diff --git a/goal_src/jak3/pc/subtitle3.gc b/goal_src/jak3/pc/subtitle3.gc index b34c653e4a..43cad5e22d 100644 --- a/goal_src/jak3/pc/subtitle3.gc +++ b/goal_src/jak3/pc/subtitle3.gc @@ -327,18 +327,26 @@ (set! (-> line text) (-> obj movie-line)) (return (the string #f)))) - (cond - ((= (pc-subtitle3-speaker none) (-> line speaker)) - ;; there's no speaker so who cares. - (string-format "~S" (-> line text))) - ((or (= #t (-> *pc-settings* subtitle-speaker?)) - (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle3-flags? line offscreen))) - ;; there is a speaker and we do want it. - ;; we use color 42 which gets set at runtime to any color we want - (string-format "~42L~S:~0L ~S" (get-speaker *subtitle3-text* (-> line speaker)) (-> line text))) - (else - (string-format "~S" (-> line text))) - ) + ;; if we are in korean language mode and printing hint subtitles (which were never in the original game) + ;; then the text did NOT come from `scene.gc` so we must convert it + ;; + ;; this code is somewhat of a mess, but modifying the line text itself was proving to be a problem + ;; clean it up if you wish! + (let ((convert-to-korean? (and (not (-> obj movie-mode?)) + (= (-> *setting-control* user-default subtitle-language) (language-enum korean))))) + (cond + ((= (pc-subtitle3-speaker none) (-> line speaker)) + ;; there's no speaker so who cares. + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + ((or (= #t (-> *pc-settings* subtitle-speaker?)) + (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle3-flags? line offscreen))) + ;; there is a speaker and we do want it. + ;; we use color 33 which gets set at runtime to any color we want + (string-format "~33L~S:~0L ~S" + (if convert-to-korean? (convert-korean-text (get-speaker *subtitle3-text* (-> line speaker))) (get-speaker *subtitle3-text* (-> line speaker))) + (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + (else + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))))) *temp-string*) (defbehavior current-subtitle3-pos subtitle3 ((id sound-id)) @@ -475,9 +483,9 @@ (when (= (gui-status active) (get-status *gui-control* (-> self gui-id))) (true! subtitles-drawn?) (protect (*display-text-box*) - (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) - (set-speaker-color (-> line-queue elts i line speaker)) - (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) + (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) + (set-speaker-color (-> line-queue elts i line speaker)) + (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) ) ;; save this for later usage @@ -846,7 +854,7 @@ (set! (-> self have-subtitles?) #f) (set! (-> self movie-mode?) #f) - (set! (-> self movie-line) (new 'process 'string (+ 7 (* 15 16)) (the string #f))) + (set! (-> self movie-line) (new 'process 'string 1024 (the string #f))) (set! (-> self current-debug-scene) 0) (set! (-> self current-debug-line) 0) diff --git a/goalc/compiler/compilation/CompilerControl.cpp b/goalc/compiler/compilation/CompilerControl.cpp index 61929e5408..8c77c96b7a 100644 --- a/goalc/compiler/compilation/CompilerControl.cpp +++ b/goalc/compiler/compilation/CompilerControl.cpp @@ -619,19 +619,12 @@ std::vector Compiler::lookup_symbol_info_by_prefix( std::set Compiler::lookup_symbol_names_starting_with(const std::string& prefix, int max_count) const { - if (m_goos.reader.check_string_is_valid(prefix)) { - return m_symbol_info.lookup_names_starting_with(prefix, max_count); - } - return {}; + return m_symbol_info.lookup_names_starting_with(prefix, max_count); } std::vector Compiler::lookup_exact_name_info( const std::string& name) const { - if (m_goos.reader.check_string_is_valid(name)) { - return m_symbol_info.lookup_exact_name(name); - } else { - return {}; - } + return m_symbol_info.lookup_exact_name(name); } std::optional Compiler::lookup_typespec(const std::string& symbol_name) { diff --git a/goalc/data_compiler/game_text_common.cpp b/goalc/data_compiler/game_text_common.cpp index 91213a3399..1fc3c53339 100644 --- a/goalc/data_compiler/game_text_common.cpp +++ b/goalc/data_compiler/game_text_common.cpp @@ -21,8 +21,9 @@ #include "common/goos/ParseHelpers.h" #include "common/goos/Reader.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/json_util.h" +#include "common/util/string_util.h" #include "game/runtime.h" @@ -30,19 +31,6 @@ namespace { -// TODO - replace with str_util::to_upper? -std::string uppercase(const std::string& in) { - std::string result; - result.reserve(in.size()); - for (auto c : in) { - if (c >= 'a' && c <= 'z') { - c -= ('a' - 'A'); - } - result.push_back(c); - } - return result; -} - /* (deftype game-text (structure) ((id uint32 :offset-assert 0) @@ -86,8 +74,8 @@ void compile_text(GameTextDB& db, const std::string& output_prefix) { file_util::create_dir_if_needed(file_util::get_file_path({"out", output_prefix, "iso"})); file_util::write_binary_file( - file_util::get_file_path( - {"out", output_prefix, "iso", fmt::format("{}{}.TXT", lang, uppercase(group_name))}), + file_util::get_file_path({"out", output_prefix, "iso", + fmt::format("{}{}.TXT", lang, str_util::to_upper(group_name))}), data.data(), data.size()); } } @@ -157,8 +145,8 @@ void compile_subtitles_v1(GameSubtitleDB& db, const std::string& output_prefix) file_util::create_dir_if_needed(file_util::get_file_path({"out", output_prefix, "iso"})); file_util::write_binary_file( - file_util::get_file_path( - {"out", output_prefix, "iso", fmt::format("{}{}.TXT", lang, uppercase("subtit"))}), + file_util::get_file_path({"out", output_prefix, "iso", + fmt::format("{}{}.TXT", lang, str_util::to_upper("subtit"))}), data.data(), data.size()); } } @@ -202,7 +190,12 @@ void compile_subtitles_v2(GameSubtitleDB& db, const std::string& output_prefix) if (line.metadata.merge) { gen.add_symbol_link("#f"); } else { - gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(line.text)); // line text + if (font->is_language_id_korean(lang)) { + gen.add_ref_to_string_in_pool( + font->convert_utf8_to_game_korean(line.text)); // line text + } else { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(line.text)); // line text + } } u16 speaker = bank->speaker_enum_value_from_name(line.metadata.speaker); u16 flags = 0; @@ -218,7 +211,11 @@ void compile_subtitles_v2(GameSubtitleDB& db, const std::string& output_prefix) for (auto& speaker_localized : localized_speakers) { // No need to check for invalid speakers here, they are checked at the scene line level above // and throw an error - gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(speaker_localized)); + if (font->is_language_id_korean(lang)) { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game_korean(speaker_localized)); + } else { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(speaker_localized)); + } } auto data = gen.generate_v2(); @@ -226,8 +223,8 @@ void compile_subtitles_v2(GameSubtitleDB& db, const std::string& output_prefix) file_util::create_dir_if_needed(file_util::get_file_path({"out", output_prefix, "iso"})); auto file_name = get_text_version_name(bank->m_text_version) == "jak3" ? "subti3" : "subti2"; file_util::write_binary_file( - file_util::get_file_path( - {"out", output_prefix, "iso", fmt::format("{}{}.TXT", lang, uppercase(file_name))}), + file_util::get_file_path({"out", output_prefix, "iso", + fmt::format("{}{}.TXT", lang, str_util::to_upper(file_name))}), data.data(), data.size()); } } diff --git a/goalc/data_compiler/game_text_common.h b/goalc/data_compiler/game_text_common.h index 75b7e32303..0e490e4733 100644 --- a/goalc/data_compiler/game_text_common.h +++ b/goalc/data_compiler/game_text_common.h @@ -10,7 +10,7 @@ #include "common/serialization/subtitles/subtitles_v2.h" #include "common/serialization/text/text_ser.h" #include "common/util/Assert.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" void compile_game_text(const std::vector& filenames, GameTextDB& db, diff --git a/goalc/emitter/CodeTester.cpp b/goalc/emitter/CodeTester.cpp index 64f9da3fd8..fece3b8c69 100644 --- a/goalc/emitter/CodeTester.cpp +++ b/goalc/emitter/CodeTester.cpp @@ -119,7 +119,9 @@ void CodeTester::clear() { * Execute the buffered code with no arguments, return the value of RAX. */ u64 CodeTester::execute() { + // clang-format off return ((u64(*)())code_buffer)(); + // clang-format on } /*! @@ -127,7 +129,9 @@ u64 CodeTester::execute() { * arguments will appear in (will handle windows/linux differences) */ u64 CodeTester::execute(u64 in0, u64 in1, u64 in2, u64 in3) { + // clang-format off return ((u64(*)(u64, u64, u64, u64))code_buffer)(in0, in1, in2, in3); + // clang-format on } /*! diff --git a/goalc/emitter/CodeTester.h b/goalc/emitter/CodeTester.h index aaa9650856..a25abef5f0 100644 --- a/goalc/emitter/CodeTester.h +++ b/goalc/emitter/CodeTester.h @@ -40,7 +40,9 @@ class CodeTester { */ template T execute_ret(u64 in0, u64 in1, u64 in2, u64 in3) { + // clang-format off u64 result_u64 = ((u64(*)(u64, u64, u64, u64))code_buffer)(in0, in1, in2, in3); + // clang-format on T result_T; memcpy(&result_T, &result_u64, sizeof(T)); return result_T; diff --git a/goalc/main.cpp b/goalc/main.cpp index c9c54f5c62..c7e5952551 100644 --- a/goalc/main.cpp +++ b/goalc/main.cpp @@ -6,6 +6,7 @@ #include "common/repl/repl_wrapper.h" #include "common/util/FileUtil.h" #include "common/util/diff.h" +#include "common/util/font/font_utils_korean.h" #include "common/util/string_util.h" #include "common/util/term_util.h" #include "common/util/unicode_util.h" diff --git a/scripts/analyze_korean.py b/scripts/analyze_korean.py new file mode 100644 index 0000000000..2713b1e2cc --- /dev/null +++ b/scripts/analyze_korean.py @@ -0,0 +1,1400 @@ +# The idea is to parse through all of the game's korean strings and +# determine the glyph combinations that are used to construct the syllable blocks + +# In terms of font setting, korean syllable blocks have 6 main configurations +# not all jamos are relevant for all these configurations, which reduces the complexity +# For example, the first 3 configurations involve no third jamo. + +# 1 (2) - left -> right. For example 가 +# 2 (2) - top -> middle. For example 고 +# 3 (2) - left + right + middle. For example 과 +# +# 4 (3) - left + right + bottom (no combined middle). For example 갈 +# 5 (3) - top down. For example 골 +# 6 (3) - left + right + bottom with middle. For example 괄 + +# Thinking about the characters this way eliminates a ton of permutations +# and allows us to use existing glyphs to fill in the gaps + +# The hope is that by analyzing all of the korean text, we can atleast find where every glyph is used +# and then any glyphs left over we can do manually. + +# read in the `game_text.txt` file and extract all the korean strings +from itertools import product +from pprint import pprint +import json + +with open( + "../decompiler_out/jak2/assets/game_text.txt", mode="r", encoding="utf-8" +) as f: + game_text_lines = f.readlines() + +korean_lines = {} +i = 0 +while i < len(game_text_lines): + curr_line = game_text_lines[i].strip() + if curr_line.startswith("(#x"): + id = curr_line.split("(#x")[1] + korean_lines[id] = game_text_lines[i + 7].strip().replace("\\c", ",0x")[2:-1] + i = i + 1 + +# also parse subtitles +with open( + "../decompiler_out/jak2/assets/subtitles_raw.txt", mode="r", encoding="utf-8" +) as f: + subtitle_text_lines = f.readlines() +for line in subtitle_text_lines: + parts = line.split("::") + text = parts[2].replace('"', "").replace(" ", ",") + # pad with 0s for single hex digits + for c in [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "c", + "d", + "e", + "f", + ]: + text = text.replace(f"0x{c},", f"0x0{c},") + key = f"{parts[0]}_{parts[1]}" + korean_lines[key] = text[:-1] + +print(f"Analyzing {len(korean_lines)} lines of korean text") + +# we will fill up this structure, which will allow us to recreate / fill in the gaps in their korean encoding +jamo_combinations = { + # jamo : 6 orientations + # if the orientation is irrelvevant, null instead of a list + # the reason we use lists is because multiple glyphs may be used to represent the same jamo + # even in the same orientation, depending on the surrounding characters + # + # we will store these surrounding "context" characters to deduce a pattern at the end + # ie. 0x06 is always used for ᄀ unless if it becomes before ᅦ then it uses 0x33 + # + # Choseong (initial) + "ᄀ": [[], [], [], [], [], []], + "ᄁ": [[], [], [], [], [], []], + "ᄂ": [[], [], [], [], [], []], + "ᄃ": [[], [], [], [], [], []], + "ᄄ": [[], [], [], [], [], []], + "ᄅ": [[], [], [], [], [], []], + "ᄆ": [[], [], [], [], [], []], + "ᄇ": [[], [], [], [], [], []], + "ᄈ": [[], [], [], [], [], []], + "ᄉ": [[], [], [], [], [], []], + "ᄊ": [[], [], [], [], [], []], + "ᄋ": [[], [], [], [], [], []], + "ᄌ": [[], [], [], [], [], []], + "ᄍ": [[], [], [], [], [], []], + "ᄎ": [[], [], [], [], [], []], + "ᄏ": [[], [], [], [], [], []], + "ᄐ": [[], [], [], [], [], []], + "ᄑ": [[], [], [], [], [], []], + "ᄒ": [[], [], [], [], [], []], + # Jungseong (middle) + # - verticals + "ᅵ": [[], None, None, [], None, None], + "ᅡ": [[], None, None, [], None, None], + "ᅢ": [[], None, None, [], None, None], + "ᅣ": [[], None, None, [], None, None], + "ᅤ": [[], None, None, [], None, None], + "ᅥ": [[], None, None, [], None, None], + "ᅦ": [[], None, None, [], None, None], + "ᅧ": [[], None, None, [], None, None], + "ᅨ": [[], None, None, [], None, None], + # - horizontals + "ᅩ": [None, [], None, None, [], None], + "ᅭ": [None, [], None, None, [], None], + "ᅮ": [None, [], None, None, [], None], + "ᅲ": [None, [], None, None, [], None], + "ᅳ": [None, [], None, None, [], None], + # - combinations + "ᅪ": [None, None, [], None, None, []], + "ᅫ": [None, None, [], None, None, []], + "ᅬ": [None, None, [], None, None, []], + "ᅯ": [None, None, [], None, None, []], + "ᅰ": [None, None, [], None, None, []], + "ᅱ": [None, None, [], None, None, []], + "ᅴ": [None, None, [], None, None, []], + # Jongseong (final) + "ᆨ": [None, None, None, [], [], []], + "ᆩ": [None, None, None, [], [], []], + "ᆪ": [None, None, None, [], [], []], + "ᆫ": [None, None, None, [], [], []], + "ᆬ": [None, None, None, [], [], []], + "ᆭ": [None, None, None, [], [], []], + "ᆮ": [None, None, None, [], [], []], + "ᆯ": [None, None, None, [], [], []], + "ᆰ": [None, None, None, [], [], []], + "ᆱ": [None, None, None, [], [], []], + "ᆲ": [None, None, None, [], [], []], + "ᆳ": [None, None, None, [], [], []], + "ᆴ": [None, None, None, [], [], []], + "ᆵ": [None, None, None, [], [], []], + "ᆶ": [None, None, None, [], [], []], + "ᆷ": [None, None, None, [], [], []], + "ᆸ": [None, None, None, [], [], []], + "ᆹ": [None, None, None, [], [], []], + "ᆺ": [None, None, None, [], [], []], + "ᆻ": [None, None, None, [], [], []], + "ᆼ": [None, None, None, [], [], []], + "ᆽ": [None, None, None, [], [], []], + "ᆾ": [None, None, None, [], [], []], + "ᆿ": [None, None, None, [], [], []], + "ᇀ": [None, None, None, [], [], []], + "ᇁ": [None, None, None, [], [], []], + "ᇂ": [None, None, None, [], [], []], +} +# we will be reading byte strings from the game, these correspond to the font glyphs +# we can deduce all of these +jamo_glyph_mappings = { + "0x06": "ᄀ", + "0x07": "ᄁ", + "0x08": "ᄂ", + "0x09": "ᄃ", + "0x0a": "ᄄ", + "0x0b": "ᄅ", + "0x0c": "ᄆ", + "0x0d": "ᄇ", + "0x0e": "ᄈ", + "0x0f": "ᄋ", + "0x10": "ᄌ", + "0x11": "ᄍ", + "0x12": "ᄏ", + "0x13": "ᄐ", + "0x14": "ᄑ", + "0x15": "ᅡ", + "0x16": "ᅣ", + "0x17": "ᅵ", + "0x18": "ᅥ", + "0x19": "ᅧ", + "0x1a": "ᅡ", + "0x1b": "ᅣ", + "0x1c": "ᅵ", + "0x1d": "ᅥ", + "0x1e": "ᅧ", + "0x1f": "ᄂ", + "0x20": "ᄉ", + "0x21": "ᄊ", + "0x22": "ᅥ", + "0x23": "ᅧ", + "0x24": "ᅥ", + "0x25": "ᅧ", + "0x26": "ᄃ", + "0x27": "ᄄ", + "0x28": "ᄅ", + "0x29": "ᄐ", + "0x2a": "ᄑ", + "0x2b": "ᅧ", + "0x2c": "ᅧ", + "0x2d": "ᄎ", + "0x2e": "ᄒ", + "0x2f": "ᅥ", + "0x30": "ᅧ", + "0x31": "ᅥ", + "0x32": "ᅧ", + "0x33": "ᄀ", + "0x34": "ᄁ", + "0x35": "ᄂ", + "0x36": "ᄃ", + "0x37": "ᄄ", + "0x38": "ᄅ", + "0x39": "ᄆ", + "0x3a": "ᄇ", + "0x3b": "ᄈ", + "0x3c": "ᄋ", + "0x3d": "ᄌ", + "0x3e": "ᄍ", + "0x3f": "ᄏ", + "0x40": "ᄐ", + "0x41": "ᄑ", + "0x42": "ᅢ", + "0x43": "ᅤ", + "0x44": "ᅦ", + "0x45": "ᅨ", + "0x46": "ᅢ", + "0x47": "ᅤ", + "0x48": "ᅦ", + "0x49": "ᅨ", + "0x4a": "ᄂ", + "0x4b": "ᄉ", + "0x4c": "ᄊ", + "0x4d": "ᅦ", + "0x4e": "ᅨ", + "0x4f": "ᅦ", + "0x50": "ᅨ", + "0x51": "ᄃ", + "0x52": "ᄄ", + "0x53": "ᄅ", + "0x54": "ᄐ", + "0x55": "ᄑ", + "0x56": "ᅨ", + "0x57": "ᅨ", + "0x58": "ᄎ", + "0x59": "ᄒ", + "0x5a": "ᅦ", + "0x5b": "ᅨ", + "0x5c": "ᅦ", + "0x5d": "ᅨ", + "0x5e": "ᄀ", + "0x5f": "ᄏ", + "0x60": "ᅩ", + "0x61": "ᅭ", + "0x62": "ᅩ", + "0x63": "ᅭ", + "0x64": ["ᄁ", "ᅫ"], + "0x65": ["ᄁ", "ᅩ"], + "0x66": ["ᄁ", "ᅩ"], + "0x67": ["ᄁ", "ᅭ"], + "0x68": "ᄁ", + "0x69": "ᄂ", + "0x6a": "ᅳ", + "0x6b": "ᅮ", + "0x6c": "ᅲ", + "0x6d": "ᅳ", + "0x6e": "ᅮ", + "0x6f": "ᅲ", + "0x70": "ᄃ", + "0x71": "ᄄ", + "0x72": "ᄅ", + "0x73": "ᄆ", + "0x74": "ᄇ", + "0x75": "ᄈ", + "0x76": "ᄉ", + "0x77": "ᄊ", + "0x78": "ᄋ", + "0x79": "ᄌ", + "0x7a": "ᄍ", + "0x7b": "ᄎ", + "0x7c": "ᄐ", + "0x7d": "ᄑ", + "0x7e": "ᄒ", + "0x7f": "ᅩ", + "0x80": "ᅭ", + "0x81": "ᅳ", + "0x82": "ᅩ", + "0x83": "ᅭ", + "0x84": "ᅳ", + "0x85": "ᅮ", + "0x86": "ᅲ", + "0x87": "ᅮ", + "0x88": "ᅲ", + "0x89": ["ᅮ", "ᆫ"], + "0x8a": ["ᅲ", "ᆫ"], + "0x8b": "ᄀ", + "0x8c": "ᄏ", + "0x8d": "ᅩ", + "0x8e": "ᅩ", + "0x8f": ["ᄁ", "ᅩ"], + "0x90": ["ᄁ", "ᅩ"], + "0x91": "ᄁ", + "0x92": "ᄂ", + "0x93": "ᄃ", + "0x94": "ᄄ", + "0x95": "ᄅ", + "0x96": "ᄆ", + "0x97": "ᄇ", + "0x98": "ᄈ", + "0x99": "ᄉ", + "0x9a": "ᄊ", + "0x9b": "ᄋ", + "0x9c": "ᄌ", + "0x9d": "ᄍ", + "0x9e": "ᄎ", + "0x9f": "ᄐ", + "0xa0": "ᄑ", + "0xa1": "ᄒ", + "0xa2": "ᅩ", + "0xa3": "ᅳ", + "0xa4": "ᅩ", + "0xa5": "ᅳ", + "0xa6": "ᅡ", + "0xa7": "ᅵ", + "0xa8": "ᅡ", + "0xa9": "ᅵ", + "0xaa": "ᅯ", + "0xab": "ᅱ", + "0xac": "ᅯ", + "0xad": "ᅱ", + "0xae": "ᄀ", + "0xaf": "ᄏ", + "0xb0": "ᅫ", + "0xb1": "ᅫ", + "0xb2": "ᄆ", + "0xb3": "ᄁ", + "0xb4": "ᄂ", + "0xb5": "ᄃ", + "0xb6": "ᄄ", + "0xb7": "ᄅ", + "0xb8": "ᄇ", + "0xb9": "ᄉ", + "0xba": "ᄊ", + "0xbb": "ᄋ", + "0xbc": "ᄌ", + "0xbd": "ᄍ", + "0xbe": "ᄎ", + "0xbf": "ᄐ", + "0xc0": "ᄒ", + "0xc1": "ᅫ", + "0xc2": "ᅫ", + "0xc3": "ᅰ", + "0xc4": "ᅰ", + "0xc5": "ᆨ", + "0xc6": "ᆩ", + "0xc7": "ᆪ", + "0xc8": "ᆫ", + "0xc9": "ᆬ", + "0xca": "ᆭ", + "0xcb": "ᆮ", + "0xcc": "ᆯ", + "0xcd": "ᆰ", + "0xce": "ᆱ", + "0xcf": "ᆲ", + "0xd0": "ᆴ", + "0xd1": "ᆶ", + "0xd2": "ᆷ", + "0xd3": "ᆸ", + "0xd4": "ᆹ", + "0xd5": "ᆺ", + "0xd6": "ᆻ", + "0xd7": "ᆼ", + "0xd8": "ᆽ", + "0xd9": "ᆾ", + "0xda": "ᆿ", + "0xdb": "ᇀ", + "0xdc": "ᇁ", + "0xdd": "ᇂ", + "0xde": "ᆨ", + "0xdf": "ᆩ", + "0xe0": "ᆪ", + "0xe1": "ᆫ", + "0xe2": "ᆭ", + "0xe3": "ᆮ", + "0xe4": "ᆯ", + "0xe5": "ᆰ", + "0xe6": "ᆱ", + "0xe7": "ᆳ", + "0xe8": "ᆴ", + "0xe9": "ᆵ", + "0xea": "ᆶ", + "0xeb": "ᆷ", + "0xec": "ᆸ", + "0xed": "ᆺ", + "0xee": "ᆼ", + "0xef": "ᆽ", + "0xf0": "ᆾ", + "0xf1": "ᆿ", + "0xf2": "ᇀ", + "0xf3": "ᇁ", + "0xf4": "ᇂ", + "0xf5": "ᆨ", + "0xf6": "ᆫ", + "0xf7": "ᆯ", + "0xf8": "ᆱ", + "0xf9": "ᆷ", + "0xfa": "ᆸ", + "0xfb": "ᆺ", + "0xfc": "ᆻ", + "0xfd": "ᆼ", + "0xfe": "ᆨ", + "0xff": "ᆫ", + "extra_0x86": "ᆯ", + "extra_0x87": "ᆷ", + "extra_0x88": "ᆸ", + "extra_0x89": "ᆺ", + "extra_0x8a": "ᆻ", + "extra_0x8b": "ᆼ", +} +jamo_groupings = { + "initial": [ + "ᄀ", + "ᄁ", + "ᄂ", + "ᄃ", + "ᄄ", + "ᄅ", + "ᄆ", + "ᄇ", + "ᄈ", + "ᄉ", + "ᄊ", + "ᄋ", + "ᄌ", + "ᄍ", + "ᄎ", + "ᄏ", + "ᄐ", + "ᄑ", + "ᄒ", + ], + "median": [ + "ᅡ", + "ᅢ", + "ᅣ", + "ᅤ", + "ᅥ", + "ᅦ", + "ᅧ", + "ᅨ", + "ᅩ", + "ᅪ", + "ᅫ", + "ᅬ", + "ᅭ", + "ᅮ", + "ᅯ", + "ᅰ", + "ᅱ", + "ᅲ", + "ᅳ", + "ᅴ", + "ᅵ", + ], + "final": [ + "ᆨ", + "ᆩ", + "ᆪ", + "ᆫ", + "ᆬ", + "ᆭ", + "ᆮ", + "ᆯ", + "ᆰ", + "ᆱ", + "ᆲ", + "ᆳ", + "ᆴ", + "ᆵ", + "ᆶ", + "ᆷ", + "ᆸ", + "ᆹ", + "ᆺ", + "ᆻ", + "ᆼ", + "ᆽ", + "ᆾ", + "ᆿ", + "ᇀ", + "ᇁ", + "ᇂ", + ], +} +median_jamo_groupings = { + "right": ["ᅡ", "ᅢ", "ᅣ", "ᅤ", "ᅥ", "ᅦ", "ᅧ", "ᅨ", "ᅵ"], + "bottom": ["ᅩ", "ᅭ", "ᅮ", "ᅲ", "ᅳ"], + "combined": ["ᅪ", "ᅫ", "ᅬ", "ᅯ", "ᅰ", "ᅱ", "ᅴ"], +} +median_combos = { + "ᅪ": ["ᅩ", "ᅡ"], + "ᅫ": ["ᅩ", "ᅢ"], + "ᅬ": ["ᅩ", "ᅵ"], + "ᅯ": ["ᅮ", "ᅥ"], + "ᅰ": ["ᅮ", "ᅦ"], + "ᅱ": ["ᅮ", "ᅵ"], + "ᅴ": ["ᅳ", "ᅵ"], +} + + +def derive_syllable_block_info(glyph_list): + jamos = [] + # iterate the glyphs, convert them into their mappings + for glyph in glyph_list: + if glyph not in jamo_glyph_mappings: + print(f"{glyph} not in mapping dictionary, fix it") + exit(1) + mapping = jamo_glyph_mappings[glyph] + # TODO - ugly for figuring out what glyphs by jamo! + if isinstance(mapping, list): + # there are a few select glyphs that are multiple jamos + for jamo in mapping: + jamos.append([jamo, glyph]) + else: + jamos.append([mapping, glyph]) + # Associate each jamo with it's initial/median/final grouping + jamo_info = [] + found_medians = [] + for jamo_and_glyph in jamos: + jamo = jamo_and_glyph[0] + glyph = jamo_and_glyph[1] + for [grouping, jamos_in_group] in jamo_groupings.items(): + if jamo in jamos_in_group: + jamo_grouping = grouping + break + if jamo_grouping == "median": + found_medians.append([jamo, glyph]) + jamo_info.append({"jamo": jamo, "grouping": jamo_grouping, "glyph": glyph}) + if len(found_medians) > 2: + print(f"found more than 2 median vowels in {jamo_info}") + exit(1) + # Consolidate median vowels, as jak typically typically draws them as a combination of two + # glyphs + if len(found_medians) > 1: + combined_median = None + combined_glyphs = None + for [vowel, vowel_parts] in median_combos.items(): + if ( + found_medians[0][0] in vowel_parts + and found_medians[1][0] in vowel_parts + ): + combined_median = vowel + combined_glyphs = [found_medians[0][1], found_medians[1][1]] + break + if combined_median == None: + print(f"unable to combine median in {jamo_info}") + exit(1) + new_jamo_info = [] + skip_rest = False + for info in jamo_info: + if info["grouping"] != "median": + new_jamo_info.append(info) + elif not skip_rest: + new_jamo_info.append( + { + "jamo": combined_median, + "grouping": "median", + "glyph": combined_glyphs, + } + ) + skip_rest = True + jamo_info = new_jamo_info + # Now we can consolidate median vowels and determine the orientation + if len(jamo_info) == 2: + for [grouping, jamos_in_group] in median_jamo_groupings.items(): + if jamo_info[1]["jamo"] in jamos_in_group: + median_group = grouping + break + if median_group == "right": + writing_orientation = 0 + elif median_group == "bottom": + writing_orientation = 1 + elif median_group == "combined": + writing_orientation = 2 + else: + print(f"couldnt figure out median group for {jamo_info}") + exit(1) + elif len(jamo_info) == 3: + for [grouping, jamos_in_group] in median_jamo_groupings.items(): + if jamo_info[1]["jamo"] in jamos_in_group: + median_group = grouping + break + if median_group == "right": + writing_orientation = 3 + elif median_group == "bottom": + writing_orientation = 4 + elif median_group == "combined": + writing_orientation = 5 + else: + print(f"couldnt figure out median group for {jamo_info}") + exit(1) + else: + print(f"unhandled jamo configuration {jamo_info}") + exit(1) + return {"writingOrientation": writing_orientation, "jamos": jamo_info} + + +# finally start going through the real text to figure out the mappings +total_syllable_blocks = 0 +for [id, game_text_line] in korean_lines.items(): + # print() + # print(game_text_line) + # split the bytes into characters, sound the alarm if we see a `0x05` + # NOTE - hopefully this is not a hack (seems like the font textures dont start until 0x6...how conveniant!) + game_text_line = game_text_line.replace("0x05,", "extra_") + text_bytes = game_text_line.split(",") + syllable_blocks = [] + i = 0 + while i < len(text_bytes): + curr_byte = text_bytes[i] + if curr_byte == "0x04": + total_syllable_blocks = total_syllable_blocks + 1 + expected_num_glyphs = int(text_bytes[i + 1], 16) + syllable_blocks.append( + { + "numGlyphs": expected_num_glyphs, + "rawGlyphs": text_bytes[i + 2 : i + 2 + expected_num_glyphs], + } + ) + i = i + 2 + expected_num_glyphs + continue + i = i + 1 + # now we will inspect the choice of glyphs (which are individual jamo or jamo combinations) + # to determine the jamo and the writing orientation + for block in syllable_blocks: + jamo_info = derive_syllable_block_info(block["rawGlyphs"]) + block["jamos"] = jamo_info["jamos"] + block["writingOrientation"] = jamo_info["writingOrientation"] + + # pprint(syllable_blocks) + + # The (almost) final step, store this information in our big jamo combination + # "database" + # + # We now effectively have an encoding, and we can process that to further refine it and + # see what we have to do manually + for block in syllable_blocks: + writing_orientation = block["writingOrientation"] + for jamo in block["jamos"]: + jamo_entry = jamo_combinations[jamo["jamo"]] + if jamo_entry[writing_orientation] == None: + print(f"something is very wrong with {block}") + exit(1) + new_entry = {"glyph": jamo["glyph"], "context": block["jamos"]} + if new_entry not in jamo_entry[writing_orientation]: + jamo_entry[writing_orientation].append(new_entry) + +# Print some stats before finalizing the result +empty_cells = 0 +glyph_list = set(jamo_glyph_mappings.keys()) +for [jamo, orientations] in jamo_combinations.items(): + for orientation in orientations: + if orientation is not None: + if len(orientation) == 0: + empty_cells = empty_cells + 1 + for entry in orientation: + if isinstance(entry["glyph"], list): + for glyph in entry["glyph"]: + glyph_list.discard(glyph) + else: + glyph_list.discard(entry["glyph"]) + +print() +print(f"Analyzed {total_syllable_blocks} syllable blocks") +print(f"{empty_cells} empty jamo cells\n") +print(f"Did not see {len(glyph_list)} out of {len(jamo_glyph_mappings.keys())} glyphs:") + +# with open("./jamo-db-before.json", mode="w", encoding="utf-8") as f: +# f.write(json.dumps(jamo_combinations, indent=2)) + +def format_alternative(curr_jamo, curr_glyph, full_glyph_context): + # Make a string key that represents the unicode jamos with a placeholder to represent + # the jamo we are dealing with + # And the value is the glyph itself that gets used to draw this combination of jamos + key_parts = [] + for glyph in full_glyph_context: + if curr_jamo == glyph["jamo"]: + key_parts.append("") + else: + key_parts.append(glyph["jamo"]) + formatted_curr_glyph = curr_glyph + if isinstance(curr_glyph, list): + formatted_curr_glyph = ",".join(curr_glyph) + return [",".join(key_parts), formatted_curr_glyph] + + +# Enumerate through the db, and consolidate duplicates / find the most common +# jamo for each position +for [jamo, orientations] in jamo_combinations.items(): + for [index, orientation] in enumerate(orientations): + if orientation is not None: + result = {"defaultGlyph": "", "alternatives": {}} + glyph_frequencies = {} + alternatives = {} + if len(orientation) == 0: + empty_cells = empty_cells + 1 + continue + for entry in orientation: + glyph_key = entry["glyph"] + if isinstance(entry["glyph"], list): + glyph_key = ",".join(entry["glyph"]) + if glyph_key not in glyph_frequencies: + glyph_frequencies[glyph_key] = 0 + glyph_frequencies[glyph_key] = glyph_frequencies[glyph_key] + 1 + + if glyph_key not in alternatives: + alternatives[glyph_key] = [] + alternatives[glyph_key].append( + format_alternative(jamo, entry["glyph"], entry["context"]) + ) + # Consolidate + most_common_glyph = "" + most_common_glyph_times = -1 + for [glyph, freq] in glyph_frequencies.items(): + if freq > most_common_glyph_times: + most_common_glyph_times = freq + most_common_glyph = glyph + result["defaultGlyph"] = most_common_glyph + # TODO - handle if this is multiple glyphs + del alternatives[most_common_glyph] + # Flatten alternatives + for [glyph, alternatives] in alternatives.items(): + for alternative in alternatives: + result["alternatives"][alternative[0]] = alternative[1] + # Overwrite the db value + jamo_combinations[jamo][index] = result + +# These are found MANUALLY by iterating through all combinations and finding alternatives +# for jamo combinations to be legible +manual_encoding_additions = { + # Choseong (initial) + "ᄀ": [ + [], + [], + ["0xb3:,ᅫ"], + ["0x33:,ᅤ,*", "0x33:,ᅦ,*", "0x33:,ᅨ,*"], + [], + ["0xae:,ᅴ,*"], + ], + "ᄁ": [ + ["!0x34", "0x07:,ᅵ"], + ["0x67:,ᅭ"], + [], + ["!0x34"], + ["!0x65", "0x68:,ᅭ,*", "0x68:,ᅮ,*", "0x68:,ᅲ,*", "0x68:,ᅳ,*"], + [ + "!0x91", + "0x8f:,ᅪ,*", + "0x64:,ᅫ,*", + "0xb3:,ᅰ,*", + "0x8f:,ᅬ,*", + ], + ], + "ᄂ": [ + ["0x1f:,ᅡ", "0x1f:,ᅣ", "0x4a:,ᅨ", "0x35:,ᅤ"], + [], + ["0xb4:,ᅫ", "0xb4:,ᅰ"], + [ + "0x35:,ᅢ,*", + "0x35:,ᅤ,*", + "0x35:,ᅦ,*", + "0x1f:,ᅧ,*", + "0x1f:,ᅥ,*", + "0x4a:,ᅨ,*", + ], + [], + ["0xb4:,ᅪ,*", "0xb4:,ᅫ,*", "0xb4:,ᅰ,*"], + ], + "ᄃ": [ + ["0x26:,ᅡ", "0x36:,ᅤ", "0x26:,ᅣ", "0x36:,ᅧ", "0x51:,ᅨ"], + [], + ["0xb5:,ᅪ", "0xb5:,ᅰ"], + [ + "0x36:,ᅢ,*", + "0x36:,ᅤ,*", + "0x51:,ᅦ,*", + "0x26:,ᅧ,*", + "0x51:,ᅨ,*", + ], + [], + ["0xb5:,ᅪ,*", "0xb5:,ᅫ,*", "0xb5:,ᅰ,*"], + ], + "ᄄ": [ + [ + "0x27:,ᅡ", + "0x52:,ᅢ", + "0x52:,ᅤ", + "0x27:,ᅣ", + "0x27:,ᅧ", + "0x52:,ᅨ", + "0x27:,ᅵ", + ], + [], + ["0xb6:,ᅪ", "0xb6:,ᅫ", "0xb6:,ᅰ"], + [ + "!0x0a", + "0x52:,ᅢ,*", + "0x52:,ᅣ,*", + "0x52:,ᅤ,*", + "0x52:,ᅦ,*", + "0x52:,ᅧ,*", + "0x52:,ᅨ,*", + ], + [], + ["0xb6:,ᅪ,*", "0xb6:,ᅫ,*", "0xb6:,ᅰ,*"], + ], + "ᄅ": [ + ["0x0b:,ᅣ", "0x38:,ᅤ"], + [], + ["0xb7:,ᅪ", "0xb7:,ᅫ", "0xb7:,ᅰ"], + [ + "0x0b:,ᅵ,*", + "0x0b:,ᅡ,*", + "0x38:,ᅢ,*", + "0x38:,ᅤ,*", + "0x53:,ᅦ,*", + "0x53:,ᅨ,*", + ], + [], + ["0x95", "0xb7:,ᅪ,*", "0xb7:,ᅫ,*", "0xb7:,ᅰ,*"], + ], + "ᄆ": [ + ["0x39:,ᅤ", "0x39:,ᅨ"], + [], + ["0xb2:,ᅪ", "0xb2:,ᅫ", "0xb2:,ᅰ"], + ["0x39:,ᅢ,*", "0x39:,ᅤ,*", "0x39:,ᅦ,*", "0x39:,ᅨ,*"], + [], + ["0xb2:,ᅪ,*", "0xb2:,ᅫ,*", "0xb2:,ᅰ,*"], + ], + "ᄇ": [ + ["0x3a:,ᅤ", "0x3a:,ᅨ"], + [], + ["0xb8:,ᅪ", "0xb8:,ᅫ", "0xb8:,ᅰ"], + ["0x3a:,ᅢ,*", "0x3a:,ᅤ,*", "0x3a:,ᅦ,*", "0x3a:,ᅨ,*"], + [], + ["0xb8:,ᅪ,*", "0xb8:,ᅫ,*", "0xb8:,ᅰ,*"], + ], + "ᄈ": [ + ["!0x3b", "0x0e:,ᅥ", "0x0e:,ᅵ"], + [], + ["0x98"], + [ + "0x3b:,ᅢ,*", + "0x3b:,ᅣ,*", + "0x3b:,ᅤ,*", + "0x3b:,ᅦ,*", + "0x3b:,ᅧ,*", + "0x3b:,ᅨ,*", + ], + [], + ["0x98"], + ], + "ᄉ": [ + ["0x4b:,ᅤ", "0x4b:,ᅨ"], + [], + ["0xb9:,ᅪ", "0xb9:,ᅰ"], + ["0x4b:,ᅢ,*", "0x4b:,ᅤ,*", "0x4b:,ᅦ,*", "0x4b:,ᅨ,*"], + [], + ["0xb9:,ᅪ,*", "0xb9:,ᅫ,*", "0xb9:,ᅰ,*"], + ], + "ᄊ": [ + [ + "0x4c:,ᅢ", + "0x4c:,ᅤ", + "0x4c:,ᅥ", + "0x4c:,ᅧ", + "0x4c:,ᅨ", + ], + [], + ["0xba:,ᅪ", "0xba:,ᅫ", "0xba:,ᅰ"], + [ + "0x4c:,ᅢ,*", + "0x4c:,ᅣ,*", + "0x4c:,ᅤ,*", + "0x4c:,ᅦ,*", + "0x4c:,ᅧ,*", + "0x4c:,ᅨ,*", + ], + [], + ["0x9a", "0xba:,ᅪ,*", "0xba:,ᅫ,*", "0xba:,ᅰ,*"], + ], + "ᄋ": [ + [], + [], + ["0xbb:,ᅪ"], + ["0x3c:,ᅢ,*", "0x3c:,ᅤ,*", "0x3c:,ᅦ,*", "0x3c:,ᅨ,*"], + [], + ["0xbb:,ᅪ,*", "0xbb:,ᅫ,*", "0xbb:,ᅰ,*"], + ], + "ᄌ": [ + ["0x3d:,ᅨ"], + [], + ["0xbc:,ᅪ", "0xbc:,ᅫ", "0xbc:,ᅰ"], + ["0x3d:,ᅢ,*", "0x3d:,ᅤ,*", "0x3d:,ᅦ,*", "0x3d:,ᅨ,*"], + [], + ["0xbc:,ᅪ,*", "0xbc:,ᅫ,*", "0xbc:,ᅰ,*"], + ], + "ᄍ": [ + ["!0x3e", "0x11:,ᅵ"], + [], + ["0xbd:,ᅪ", "0xbd:,ᅫ", "0xbd:,ᅰ"], + [ + "0x3e:,ᅢ,*", + "0x3e:,ᅣ,*", + "0x3e:,ᅤ,*", + "0x3e:,ᅦ,*", + "0x3e:,ᅧ,*", + "0x3e:,ᅨ,*", + "0x3e:,ᅵ,*", + ], + [], + ["0xbd:,ᅪ,*", "0xbd:,ᅫ,*", "0xbd:,ᅰ,*"], + ], + "ᄎ": [ + ["0x58:,ᅤ", "0x58:,ᅨ"], + [], + ["0xbe:,ᅪ", "0xbe:,ᅫ", "0xbe:,ᅰ"], + ["0x58:,ᅢ,*", "0x58:,ᅤ,*", "0x58:,ᅦ,*", "0x58:,ᅨ,*"], + [], + ["0x9e", "0xbe:,ᅪ,*", "0xbe:,ᅫ,*", "0xbe:,ᅰ,*"], + ], + "ᄏ": [ + ["0x3f:,ᅤ", "0x3f:,ᅨ"], + [], + ["0xaf:,ᅪ", "0xaf:,ᅫ", "0xaf:,ᅰ"], + ["0x3f:,ᅢ,*", "0x3f:,ᅤ,*", "0x3f:,ᅦ,*", "0x3f:,ᅨ,*"], + [], + ["0xaf:,ᅪ,*", "0xaf:,ᅫ,*", "0xaf:,ᅰ,*"], + ], + "ᄐ": [ + ["0x13:,ᅣ", "0x40:,ᅤ", "0x54:,ᅨ"], + [], + ["0xbf:,ᅪ", "0xbf:,ᅫ", "0xbf:,ᅰ"], + [ + "0x40:,ᅢ,*", + "0x40:,ᅤ,*", + "0x54:,ᅦ,*", + "0x40:,ᅧ,*", + "0x54:,ᅨ,*", + ], + [], + ["0x9f", "0xbf:,ᅪ,*", "0xbf:,ᅫ,*", "0xbf:,ᅰ,*"], + ], + "ᄑ": [ + [ + "0x2a:,ᅡ", + "0x41:,ᅤ", + "0x2a:,ᅣ", + "0x2a:,ᅧ", + ], + [], + ["0xa0"], + [ + "0x41:,ᅢ,*", + "0x41:,ᅣ,*", + "0x41:,ᅤ,*", + "0x2a:,ᅥ,*", + "0x55:,ᅦ,*", + "0x41:,ᅧ,*", + "0x55:,ᅨ,*", + ], + [], + ["0xa0"], + ], + "ᄒ": [ + ["0x59:,ᅤ"], + [], + ["0xc0:,ᅪ", "0xc0:,ᅫ", "0xc0:,ᅰ"], + [ + "0x59:,ᅡ,*", + "0x59:,ᅢ,*", + "0x59:,ᅣ,*", + "0x59:,ᅤ,*", + "0x59:,ᅦ,*", + "0x59:,ᅧ,*", + "0x59:,ᅨ,*", + ], + [], + ["0xc0:,ᅪ,*", "0xc0:,ᅫ,*", "0xc0:,ᅰ,*"], + ], + # Jungseong (middle) + "ᅡ": [[], None, None, ["0x1a:*,,ᆫ"], None, None], + "ᅢ": [[], None, None, ["0x46:*,,ᆫ"], None, None], + "ᅣ": [ + [], + None, + None, + [], + None, + None, + ], + "ᅤ": [[], None, None, ["0x43", "0x47:*,,ᆫ"], None, None], + "ᅥ": [ + [], + None, + None, + ["0x2f:ᄎ,,*", "0x2f:ᄒ,,*", "0x1d:*[^ᄎ;ᄐ;ᄒ],,ᆫ"], + None, + None, + ], + "ᅦ": [[], None, None, ["0x5a:ᄒ,,*", "0x48:*,,ᆫ"], None, None], + "ᅧ": [ + [], + None, + None, + ["0x25:ᄂ,,*", "0x1e:ᄎ,,*", "0x30:ᄒ,,*", "0x1e:*,,ᆫ"], + None, + None, + ], + "ᅨ": [ + [ + "0x50:ᄂ,", + "0x50:ᄃ,", + "0x5d:ᄄ,", + "0x50:ᄅ,", + "0x50:ᄆ,", + "0x50:ᄈ,", + ], + None, + None, + ["0x49:*,,ᆫ"], + None, + None, + ], + "ᅩ": [ + None, + [ + "0x62:ᄂ,", + "0x62:ᄄ,", + "0x62:ᄅ,", + "0x62:ᄋ,", + "0x62:ᄐ,", + "0x62:ᄒ,", + ], + None, + None, + ["!0x82", "0x82:*,,*"], + None, + ], + "ᅪ": [ + None, + None, + ["0x8e,0xa8:ᄁ,"], + None, + None, + [ + "0x8e,0xa6:ᄀ,,*", + "0x8e,0xa8:ᄀ,,ᆫ", + "0x8f,0xa6:ᄁ,,*", + "0x8f,0xa8:ᄁ,,ᆫ", + ], + ], + "ᅫ": [ + None, + None, + [], + None, + None, + [ + "!0xc1", + "0xc2:*,,ᆫ", + "0x8e,0x42:ᄀ,,*", + "0x8e,0x46:ᄀ,,ᆫ", + "0x64:ᄁ,,*", + "0x64:ᄁ,,ᆫ", + ], + ], + "ᅬ": [ + None, + None, + ["0x8e,0xa9:ᄁ,"], + None, + None, + [ + "0xa2,0xa9:*,,ᆫ", + "0x8e,0xa7:ᄀ,,*", + "0x8e,0xa9:ᄀ,,ᆫ", + "0x8f,0xa7:ᄁ,,*", + "0x8f,0xa9:ᄁ,,ᆫ", + ], + ], + "ᅭ": [ + None, + [ + "0x61:ᄀ,", + "0x67:ᄁ,", + "0x63:ᄂ,", + "0x63:ᄃ,", + "0x63:ᄄ,", + "0x63:ᄅ,", + "0x63:ᄈ,", + "0x63:ᄊ,", + "0x63:ᄋ,", + "0x63:ᄏ,", + "0x63:ᄐ,", + "0x63:ᄒ,", + ], + None, + None, + ["!0x83"], + None, + ], + "ᅮ": [None, ["0x6e:ᄒ,"], None, None, ["0x85:*,,*", "0x89:*,,ᆫ"], None], + "ᅯ": [None, None, [], None, None, ["0xaa:*,,*", "0xac:*,,ᆫ"]], + "ᅰ": [None, None, [], None, None, ["0xc4:*,,ᆫ"]], + "ᅱ": [None, None, [], None, None, ["0xad:*,,ᆫ"]], + "ᅲ": [ + None, + [ + "0x6f:ᄂ,", + "0x6f:ᄄ,", + "0x6f:ᄅ,", + "0x6f:ᄆ,", + "0x6f:ᄇ,", + "0x6f:ᄈ,", + "0x6f:ᄉ,", + "0x6f:ᄊ,", + "0x6f:ᄋ,", + "0x6f:ᄌ,", + "0x6f:ᄍ,", + "0x6f:ᄎ,", + "0x6f:ᄏ,", + "0x6f:ᄐ,", + "0x6f:ᄑ,", + "0x6f:ᄒ,", + ], + None, + None, + ["0x8a:*,,ᆫ"], + None, + ], + "ᅳ": [None, ["0x6d:ᄐ,", "0x6d:ᄒ,"], None, None, ["0x84:*,,*"], None], + "ᅴ": [None, None, [], None, None, ["!0xa3,0xa7", "0xa3,0xa9:*,,ᆫ"]], + "ᅵ": [[], None, None, ["0x1c:*,,ᆫ"], None, None], + # Jongseong (final) + "ᆨ": [None, None, None, [], [], ["!0xfe"]], + "ᆩ": [None, None, None, [], [], ["0xdf"]], + "ᆪ": [None, None, None, ["0xc7"], [], ["0xe0"]], + "ᆫ": [None, None, None, [], ["0xe1:*,*,"], ["!0xff"]], + "ᆬ": [None, None, None, [], ["0xc9"], ["0xc9"]], + "ᆭ": [None, None, None, [], ["0xe2"], ["0xe2"]], + "ᆮ": [None, None, None, [], [], ["0xe3"]], + "ᆯ": [None, None, None, [], [], ["extra_0x86:*,*,"]], + "ᆰ": [None, None, None, [], [], ["0xe5"]], + "ᆱ": [None, None, None, [], [], ["0xf8"]], + "ᆲ": [None, None, None, [], ["0xcf"], ["0xcf"]], + "ᆳ": [None, None, None, ["0xe7"], ["0xe7"], ["0xe7"]], + "ᆴ": [None, None, None, ["0xd0"], ["0xe8"], ["0xe8"]], + "ᆵ": [None, None, None, ["0xe9"], ["0xe9"], ["0xe9"]], + "ᆶ": [None, None, None, [], [], ["0xea"]], + "ᆷ": [None, None, None, [], [], ["extra_0x87", "extra_0x87:*,*,"]], + "ᆸ": [None, None, None, [], [], ["extra_0x88:*,*,"]], + "ᆹ": [None, None, None, [], ["0xd4"], ["0xd4"]], + "ᆺ": [None, None, None, [], [], ["extra_0x89:*,*,"]], + "ᆻ": [None, None, None, [], ["0xfc"], ["extra_0x8a:*,*,"]], + "ᆼ": [None, None, None, [], [], ["extra_0x8b:*,*,"]], + "ᆽ": [None, None, None, [], [], ["0xef"]], + "ᆾ": [None, None, None, [], ["0xf0"], ["0xf0"]], + "ᆿ": [None, None, None, ["0xda"], ["0xf1"], ["0xf1"]], + "ᇀ": [None, None, None, [], [], ["0xf2"]], + "ᇁ": [None, None, None, [], [], ["0xf3"]], + "ᇂ": [None, None, None, [], [], ["0xf4"]], +} + +# Print the results +with open("./jamo-db.json", mode="w", encoding="utf-8") as f: + f.write(json.dumps(jamo_combinations, indent=2)) + +# Fill in the rest of the encoding table with manually identified alternatives / additions +# Most of these are additions, but some override the original encoding (because it looked terrible) +# +# These are provided in a specific formats: +# - 0x01:,ᅤ -- means use 0x01 glyph for drawing the jamo (in position shown, in this case, only before ᅤ +# - 0x01:,* -- means use 0x01 no matter what comes after +# - 0x01:,*[^ᄎ;ᄐ] -- means use 0x01 no matter what comes after (except ᄐ and ᄎ) +# - 0x01,0x02:,* -- sometimes a jamo requires multiple glyphs +# - !0x01 -- means to override the default glyph, this is used very rarely +# - 0x01 -- means to set the default -- some jamos never were used at all. If a default is already set, this should throw an error +# +# Note that all of these changes will override any existing alternatives, so order matters even in these lists +# - 0x01:,* and +# - 0x02:,ᄎ +# will replace the ᄎ involving entry that uses 0x01 because of ordering! +jamo_replacements = { + 0: jamo_groupings["initial"], + 1: jamo_groupings["median"], + 2: jamo_groupings["final"], +} + +added_defaults = 0 +replaced_defaults = 0 +for [jamo, orientations] in jamo_combinations.items(): + for [index, orientation] in enumerate(orientations): + if orientation is None: + continue + new_alternative_list = manual_encoding_additions[jamo][index] + if new_alternative_list is None or len(new_alternative_list) == 0: + continue + # enumerate new list and collect info / generate list of new alternatives + new_default = None + force_default = False + alternative_list = [] + for item in new_alternative_list: + # - !0x01 -- means to override the default glyph, this is used very rarely + # - 0x01 -- means to set the default -- some jamos never were used at all. If a default is already set, this should throw an error + if ":" not in item: + if item.startswith("!"): + force_default = True + new_default = item[1:] + else: + new_default = item + continue + parts = item.split(":") + glyph = parts[0] + pattern = parts[1] + # order matters, so we have to append to a list for now + # 0x01:,ᅤ + if "*" not in pattern: + alternative_list.append({"glyph": glyph, "jamo_combination": pattern}) + # 0x01:,* + else: + # 0x01:,*[^ᄎ;ᄐ] + # exclusion lists + exclusion_list = set() + # we generate all alternatives in order from left-to-right + tokens = pattern.split(",") + # cleanup each item first + new_tokens = [] + for token in tokens: + if token.startswith("*[^"): + for exclude_jamo in token[3:-1].split(","): + exclusion_list.add(exclude_jamo) + new_tokens.append("*") + else: + new_tokens.append(token) + wildcard_indices = [i for i, token in enumerate(tokens) if token == "*"] + filtered_replacements = { + idx: [val for val in lst if val not in exclusion_list] + for idx, lst in jamo_replacements.items() + } + replacement_lists = [filtered_replacements[i] for i in wildcard_indices] + for combo in product(*replacement_lists): + generated = tokens.copy() + for idx, val in zip(wildcard_indices, combo): + generated[idx] = val + alternative_list.append( + {"glyph": glyph, "jamo_combination": ",".join(generated)} + ) + # Ok, now we have our big list of new alternatives + # we go through them one by one, adding them to the existing list + # since alternatives is a map we don't have to concern ourselves with worrying about duplicates + # the last one wins + # + # We also must set the new default if applicable + new_orientation = orientation + if new_default is not None: + if isinstance(new_orientation, list) and len(new_orientation) == 0: + new_orientation = {"defaultGlyph": new_default, "alternatives": {}} + added_defaults = added_defaults + 1 + elif force_default: + new_orientation["defaultGlyph"] = new_default + replaced_defaults = replaced_defaults + 1 + else: + print( + f"Trying to replace the default {new_orientation["defaultGlyph"]} with {new_default} improperly" + ) + exit(1) + # Alternatives + if len(alternative_list) > 0: + for new_alt in alternative_list: + new_orientation["alternatives"][new_alt["jamo_combination"]] = new_alt[ + "glyph" + ] + # Finally, update the DB + jamo_combinations[jamo][index] = new_orientation + +# Print some Stats again! +empty_cells = 0 +new_glyph_list = set(jamo_glyph_mappings.keys()) +for [jamo, orientations] in jamo_combinations.items(): + for orientation in orientations: + if isinstance(orientation, dict): + new_glyph_list.discard(orientation["defaultGlyph"]) + for combo, glyph in orientation["alternatives"].items(): + new_glyph_list.discard(glyph) + elif orientation is not None: + print(f"{jamo} - {orientation}") + empty_cells = empty_cells + 1 + +print() +print(f"Added {added_defaults} defaults") +print(f"Replaced {replaced_defaults} defaults") +print(f"{empty_cells} empty jamo cells\n") +print( + f"Still did not see {len(new_glyph_list)} out of {len(jamo_glyph_mappings.keys())} glyphs:" +) +print( + f"Used an additional {len(new_glyph_list.difference(glyph_list))} glyphs, never seen in the original game!" +) +print("Never Used Glyphs:") +print(new_glyph_list) + +# Print the results +with open("./jamo-db.json", mode="w", encoding="utf-8") as f: + f.write(json.dumps(jamo_combinations, indent=None)) + +# pprint(jamo_combinations) + +# Export some CSV results so that we can fill in the rest of the encoding using excel (easier to keep track of +# what's missing) +# This CSV table will only include the most common for each as: +# - we already have the alternatives, we aren't going to check those +# - we will add a new alternative, only if the common glyphs don't match (and we don't already have one, which i can manually check) +# Use the lists so we have a consistent ordering +csv_lines = [] +for jamo in jamo_groupings["initial"]: + cells_in_line = [] + for orientation in jamo_combinations[jamo]: + if orientation is None: + cells_in_line.append("N/A") + elif isinstance(orientation, list) and len(orientation) == 0: + cells_in_line.append("") + else: + alternative_entries = [] + for [context, alternative_glyph] in orientation["alternatives"].items(): + alternative_entries.append( + f"- {alternative_glyph} for {context.replace("", "")}" + ) + alternatives = "\n".join(alternative_entries) + if len(alternatives) > 0: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\n{alternatives.replace(",", ";")}\"" + ) + else: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\"" + ) + csv_lines.append(",".join(cells_in_line) + "\n") +for jamo in jamo_groupings["median"]: + cells_in_line = [] + for orientation in jamo_combinations[jamo]: + if orientation is None: + cells_in_line.append("N/A") + elif isinstance(orientation, list) and len(orientation) == 0: + cells_in_line.append("") + else: + alternative_entries = [] + for [context, alternative_glyph] in orientation["alternatives"].items(): + alternative_entries.append( + f"- {alternative_glyph} for {context.replace("", "")}" + ) + alternatives = "\n".join(alternative_entries) + if len(alternatives) > 0: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\n{alternatives.replace(",", ";")}\"" + ) + else: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\"" + ) + csv_lines.append(",".join(cells_in_line) + "\n") +for jamo in jamo_groupings["final"]: + cells_in_line = [] + for orientation in jamo_combinations[jamo]: + if orientation is None: + cells_in_line.append("N/A") + elif isinstance(orientation, list) and len(orientation) == 0: + cells_in_line.append("") + else: + alternative_entries = [] + for [context, alternative_glyph] in orientation["alternatives"].items(): + alternative_entries.append( + f"- {alternative_glyph} for {context.replace("", "")}" + ) + alternatives = "\n".join(alternative_entries) + if len(alternatives) > 0: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\n{alternatives.replace(",", ";")}\"" + ) + else: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\"" + ) + csv_lines.append(",".join(cells_in_line) + "\n") +# with open("./jamo-db.csv", mode="w", encoding="utf-8") as f: +# f.writelines(csv_lines) + +# game -> UTF-8 +# - convert glyphs into individual jamo (and sometimes ascii) (lookup table) +# - compose jamo into syllable blocks (python lib) +# UTF-8 -> game +# - decompose syllable blocks into jamo (python lib) +# - convert jamo into glyphs using our lookup DB \ No newline at end of file diff --git a/scripts/ci/lint-characters.py b/scripts/ci/lint-characters.py index 20a42379ce..4f76733e49 100644 --- a/scripts/ci/lint-characters.py +++ b/scripts/ci/lint-characters.py @@ -9,8 +9,6 @@ parser.add_argument("--fix", action="store_true") parser.set_defaults(fix=False) args = parser.parse_args() -# TODO - trim strings - # fmt: off JAK1_ALLOWED_CHARACTERS = [ "_", # NOTE - not an actual underscore, adds a long space! @@ -52,7 +50,6 @@ JAK1_AUTO_REPLACEMENTS = { "?": "?" } -# TODO - check for korean text JAK2_ALLOWED_CHARACTERS = [ "_", # NOTE - not an actual underscore, adds a long space! "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", @@ -115,57 +112,57 @@ JAK2_AUTO_REPLACEMENTS = { } # fmt: on -invalid_characters_found = False +return_error = False -# TODO - reduce duplication +def is_korean_syllable(char): + return '\uAC00' <= char <= '\uD7A3' +def is_char_allowed(game_name, char, allowed_characters): + if game_name == "jak1": + return char in allowed_characters + return char in allowed_characters or is_korean_syllable(char) -def jak1_is_allowed_code(pos, text): +def is_allowed_code(pos, text, allowed_codes): # Find any occurences of allowed codes in the string # if the position overlaps with these occurrences, it's allowed - for code in JAK1_ALLOWED_CODES: + for code in allowed_codes: for match in re.finditer(code, text): if pos >= match.start() and pos <= match.end(): return match.end() return -1 - -def jak1_char_allowed(char): - return char in JAK1_ALLOWED_CHARACTERS - - -def jak1_fix_character(char): +def fix_character(game_name, char, allowed_characters, auto_replacements): # First let's try upper-casing it, if that's allowed, let's use that instead upper_case = char.upper() - if jak1_char_allowed(upper_case): + if is_char_allowed(game_name, upper_case, allowed_characters): return upper_case - if char in JAK1_AUTO_REPLACEMENTS: - return JAK1_AUTO_REPLACEMENTS[char] + if char in auto_replacements: + return auto_replacements[char] return char -def jak1_replace_character(string, position, new_character): +def replace_character(string, position, new_character): string_list = list(string) string_list[position] = new_character new_string = "".join(string_list) return new_string -def lint_jak1_characters(text): +def lint_characters(game_name, text, allowed_characters, allowed_codes, auto_replacements): invalid_characters_found = False pos = 0 while pos < len(text): character = text[pos] - if not jak1_char_allowed(character): + if not is_char_allowed(game_name, character, allowed_characters): # Check to see if it's an allowed code - code_end_pos = jak1_is_allowed_code(pos, text) + code_end_pos = is_allowed_code(pos, text, allowed_codes) if code_end_pos == -1: # If we are fixing instances, attempt to do so char_fixed = False if args.fix: - new_char = jak1_fix_character(character) + new_char = fix_character(game_name, character, allowed_characters, auto_replacements) if new_char != character: - text = jak1_replace_character(text, pos, new_char) + text = replace_character(text, pos, new_char) char_fixed = True if not char_fixed: print( @@ -173,7 +170,7 @@ def lint_jak1_characters(text): character, text, text ) ) - # text = jak1_replace_character(text, pos, "?") + # text = replace_character(text, pos, "?") invalid_characters_found = True pos = pos + 1 else: @@ -183,175 +180,75 @@ def lint_jak1_characters(text): pos = pos + 1 return invalid_characters_found, text +def fix_games_translations(game_name, allowed_characters, allowed_codes, auto_replacements): + global return_error + print(f"Checking {game_name} translations") + # Iterate through the translations making sure there are no characters that are not allowed + text_files = glob.glob(f"./game/assets/{game_name}/text/*.json") -# Iterate through the translations making sure there are no characters that are not allowed -text_files = glob.glob("./game/assets/jak1/text/*.json") - -for text_file in text_files: - print("Checking {}".format(text_file)) - with open(text_file, encoding="utf-8") as f: - file_data = json.load(f) - for id, text in file_data.items(): - invalid_chars_exist, new_text = lint_jak1_characters(text) + for text_file in text_files: + print("Checking {}".format(text_file)) + with open(text_file, encoding="utf-8") as f: + file_data = json.load(f) + for id, text in file_data.items(): + invalid_chars_exist, new_text = lint_characters(game_name, text, allowed_characters, allowed_codes, auto_replacements) + if args.fix: + file_data[id] = new_text + if invalid_chars_exist: + return_error = True if args.fix: - file_data[id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(text_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") + # save the modified file back out + with open(text_file, "w", encoding="utf-8") as f: + json.dump(file_data, f, indent=2, ensure_ascii=False) + f.write("\n") -subtitle_files = glob.glob("./game/assets/jak1/subtitle/*lines*.json") + subtitle_files = glob.glob(f"./game/assets/{game_name}/subtitle/*lines*.json") -for subtitle_file in subtitle_files: - print("Checking {}...".format(subtitle_file)) - with open(subtitle_file, encoding="utf-8") as f: - file_data = json.load(f) - # Check Speakers - for id, text in file_data["speakers"].items(): - invalid_chars_exist, new_text = lint_jak1_characters(text) - if args.fix and new_text != text: - file_data["speakers"][id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - # Check Lines - for id, lines in file_data["cutscenes"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak1_characters(line) - if args.fix and new_text != line: - lines[i] = new_text + for subtitle_file in subtitle_files: + print("Checking {}...".format(subtitle_file)) + with open(subtitle_file, encoding="utf-8") as f: + file_data = json.load(f) + # Check Speakers + for id, text in file_data["speakers"].items(): + invalid_chars_exist, new_text = lint_characters(game_name, text, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != text: + file_data["speakers"][id] = new_text if invalid_chars_exist: - invalid_characters_found = True - for id, lines in file_data["hints"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak1_characters(line) - if args.fix and new_text != line: - lines[i] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(subtitle_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") - - -def jak2_is_allowed_code(pos, text): - # Find any occurences of allowed codes in the string - # if the position overlaps with these occurrences, it's allowed - for code in JAK2_ALLOWED_CODES: - for match in re.finditer(code, text): - if pos >= match.start() and pos <= match.end(): - return match.end() - return -1 - - -def jak2_char_allowed(char): - return char in JAK2_ALLOWED_CHARACTERS - - -def jak2_fix_character(char): - if char in JAK2_AUTO_REPLACEMENTS: - return JAK2_AUTO_REPLACEMENTS[char] - return char - - -def jak2_replace_character(string, position, new_character): - string_list = list(string) - string_list[position] = new_character - new_string = "".join(string_list) - return new_string - - -def lint_jak2_characters(text): - invalid_characters_found = False - pos = 0 - while pos < len(text): - character = text[pos] - if not jak2_char_allowed(character): - # Check to see if it's an allowed code - code_end_pos = jak2_is_allowed_code(pos, text) - if code_end_pos == -1: - # If we are fixing instances, attempt to do so - char_fixed = False - if args.fix: - new_char = jak2_fix_character(character) - if new_char != character: - text = jak2_replace_character(text, pos, new_char) - char_fixed = True - if not char_fixed: - print( - "Character '{}' not allowed - Found in {} in string {}".format( - character, text, text - ) - ) - # text = jak2_replace_character(text, pos, "?") - invalid_characters_found = True - pos = pos + 1 - else: - # advance to the end of the code and continue checking - pos = code_end_pos + return_error = True + # Check Lines + for id, lines in file_data["cutscenes"].items(): + for i, line in enumerate(lines): + invalid_chars_exist, new_text = lint_characters(game_name, line, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != line: + lines[i] = new_text + if invalid_chars_exist: + return_error = True + if game_name == "jak1": + for id, lines in file_data["hints"].items(): + for i, line in enumerate(lines): + invalid_chars_exist, new_text = lint_characters(game_name, line, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != line: + lines[i] = new_text + if invalid_chars_exist: + return_error = True else: - pos = pos + 1 - return invalid_characters_found, text - - -# Iterate through the translations making sure there are no characters that are not allowed -text_files = glob.glob("./game/assets/jak2/text/*.json") - -for text_file in text_files: - print("Checking {}".format(text_file)) - with open(text_file, encoding="utf-8") as f: - file_data = json.load(f) - for id, text in file_data.items(): - invalid_chars_exist, new_text = lint_jak2_characters(text) + for id, lines in file_data["other"].items(): + for i, line in enumerate(lines): + invalid_chars_exist, new_text = lint_characters(game_name, line, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != line: + lines[i] = new_text + if invalid_chars_exist: + return_error = True if args.fix: - file_data[id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(text_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") + # save the modified file back out + with open(subtitle_file, "w", encoding="utf-8") as f: + json.dump(file_data, f, indent=2, ensure_ascii=False) + f.write("\n") -subtitle_files = glob.glob("./game/assets/jak2/subtitle/*lines*.json") +fix_games_translations("jak1", JAK1_ALLOWED_CHARACTERS, JAK1_ALLOWED_CODES, JAK1_AUTO_REPLACEMENTS) +fix_games_translations("jak2", JAK2_ALLOWED_CHARACTERS, JAK2_ALLOWED_CODES, JAK2_AUTO_REPLACEMENTS) -for subtitle_file in subtitle_files: - print("Checking {}...".format(subtitle_file)) - with open(subtitle_file, encoding="utf-8") as f: - file_data = json.load(f) - # Check Speakers - for id, text in file_data["speakers"].items(): - invalid_chars_exist, new_text = lint_jak2_characters(text) - if args.fix and new_text != text: - file_data["speakers"][id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - # Check Lines - for id, lines in file_data["cutscenes"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak2_characters(line) - if args.fix and new_text != line: - lines[i] = new_text - if invalid_chars_exist: - invalid_characters_found = True - for id, lines in file_data["other"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak2_characters(line) - if args.fix and new_text != line: - lines[i] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(subtitle_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") - -if invalid_characters_found: +if return_error: print("Invalid characters were found, see above") exit(1) else: diff --git a/scripts/jamos.png b/scripts/jamos.png new file mode 100644 index 0000000000..5c0d1e122c Binary files /dev/null and b/scripts/jamos.png differ