/*
Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.

The MySQL Connector/C++ is licensed under the terms of the GPLv2
<http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
MySQL Connectors. There are special exceptions to the terms and
conditions of the GPLv2 as it is applied to this software, see the
FLOSS License Exception
<http://www.mysql.com/about/legal/licensing/foss-exception.html>.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
*/



#include <string.h>
#include <stdlib.h>
#include <memory>
#include <sstream>

#include <cppconn/datatype.h>
#include <cppconn/exception.h>
#include "mysql_util.h"
#include "mysql_debug.h"
#include "nativeapi/native_connection_wrapper.h"
#include "nativeapi/native_statement_wrapper.h"

namespace sql {
namespace mysql {
namespace util {

/* just for cases when we need to return const empty string reference */
const char *EMPTYSTR= "";
const char *LOCALHOST= "localhost";


/* {{{ throwSQLException -I- */
void throwSQLException(::sql::mysql::NativeAPI::NativeConnectionWrapper & proxy)
{
	throw sql::SQLException(proxy.error(), proxy.sqlstate(), proxy.errNo());
}
/* }}} */


/* {{{ throwSQLException -I- */
void throwSQLException(::sql::mysql::NativeAPI::NativeStatementWrapper & proxy)
{
	throw sql::SQLException(proxy.error(), proxy.sqlstate(), proxy.errNo());
}
/* }}} */


#define cppconn_mbcharlen_big5		NULL
#define check_mb_big5				NULL
#define cppconn_mbcharlen_ujis		NULL
#define check_mb_ujis				NULL
#define cppconn_mbcharlen_sjis		NULL
#define check_mb_sjis				NULL
#define cppconn_mbcharlen_euckr		NULL
#define check_mb_euckr				NULL
#define cppconn_mbcharlen_gb2312	NULL
#define check_mb_gb2312				NULL
#define cppconn_mbcharlen_gbk		NULL
#define check_mb_gbk				NULL
#define cppconn_mbcharlen_utf8		NULL
#define check_mb_utf8_valid			NULL
#define cppconn_mbcharlen_ucs2		NULL
#define check_mb_ucs2				NULL
#define cppconn_mbcharlen_cp932		NULL
#define check_mb_cp932				NULL
#define cppconn_mbcharlen_eucjpms	NULL
#define check_mb_eucjpms			NULL
#define cppconn_mbcharlen_utf8		NULL
#define check_mb_utf8_valid			NULL
#define cppconn_mbcharlen_utf8mb4	cppconn_mbcharlen_utf8
#define check_mb_utf8mb4_valid		check_mb_utf8_valid
#define cppconn_mbcharlen_utf16		NULL
#define check_mb_utf16_valid		NULL
#define cppconn_mbcharlen_utf32		NULL
#define check_mb_utf32_valid		NULL

/* {{{ our_charsets60 */
const OUR_CHARSET our_charsets60[] =
{
	{   1, "big5","big5_chinese_ci", 1, 2, "", cppconn_mbcharlen_big5, check_mb_big5},
	{   3, "dec8", "dec8_swedisch_ci", 1, 1, "", NULL, NULL},
	{   4, "cp850", "cp850_general_ci", 1, 1, "", NULL, NULL},
	{   6, "hp8", "hp8_english_ci", 1, 1, "", NULL, NULL},
	{   7, "koi8r", "koi8r_general_ci", 1, 1, "", NULL, NULL},
	{   8, "latin1", "latin1_swedish_ci", 1, 1, "", NULL, NULL},
	{   9, "latin2", "latin2_general_ci", 1, 1, "", NULL, NULL},
	{  10, "swe7", "swe7_swedish_ci", 1, 1, "", NULL, NULL},
	{  11, "ascii", "ascii_general_ci", 1, 1, "", NULL, NULL},
	{  12, "ujis", "ujis_japanese_ci", 1, 3, "", cppconn_mbcharlen_ujis, check_mb_ujis},
	{  13, "sjis", "sjis_japanese_ci", 1, 2, "", cppconn_mbcharlen_sjis, check_mb_sjis},
	{  16, "hebrew", "hebrew_general_ci", 1, 1, "", NULL, NULL},
	{  18, "tis620", "tis620_thai_ci", 1, 1, "", NULL, NULL},
	{  19, "euckr", "euckr_korean_ci", 1, 2, "", cppconn_mbcharlen_euckr, check_mb_euckr},
	{  22, "koi8u", "koi8u_general_ci", 1, 1, "", NULL, NULL},
	{  24, "gb2312", "gb2312_chinese_ci", 1, 2, "", cppconn_mbcharlen_gb2312, check_mb_gb2312},
	{  25, "greek", "greek_general_ci", 1, 1, "", NULL, NULL},
	{  26, "cp1250", "cp1250_general_ci", 1, 1, "", NULL, NULL},
	{  28, "gbk", "gbk_chinese_ci", 1, 2, "", cppconn_mbcharlen_gbk, check_mb_gbk},
	{  30, "latin5", "latin5_turkish_ci", 1, 1, "", NULL, NULL},
	{  32, "armscii8", "armscii8_general_ci", 1, 1, "", NULL, NULL},
	{  33, "utf8", "utf8_general_ci", 1, 3, "UTF-8 Unicode", cppconn_mbcharlen_utf8,  check_mb_utf8_valid},
	{  35, "ucs2", "ucs2_general_ci", 2, 2, "UCS-2 Unicode", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{  36, "cp866", "cp866_general_ci", 1, 1, "", NULL, NULL},
	{  37, "keybcs2", "keybcs2_general_ci", 1, 1, "", NULL, NULL},
	{  38, "macce", "macce_general_ci", 1, 1, "", NULL, NULL},
	{  39, "macroman", "macroman_general_ci", 1, 1, "", NULL, NULL},
	{  40, "cp852", "cp852_general_ci", 1, 1, "", NULL, NULL},
	{  41, "latin7", "latin7_general_ci", 1, 1, "", NULL, NULL},
	{  51, "cp1251", "cp1251_general_ci", 1, 1, "", NULL, NULL},
	{  57, "cp1256", "cp1256_general_ci", 1, 1, "", NULL, NULL},
	{  59, "cp1257", "cp1257_general_ci", 1, 1, "", NULL, NULL},
	{  63, "binary", "binary", 1, 1, "", NULL, NULL},
	{  92, "geostd8", "geostd8_general_ci", 1, 1, "", NULL, NULL},
	{  95, "cp932", "cp932_japanese_ci", 1, 2, "", cppconn_mbcharlen_cp932, check_mb_cp932},
	{  97, "eucjpms", "eucjpms_japanese_ci", 1, 3, "", cppconn_mbcharlen_eucjpms, check_mb_eucjpms},
	{   2, "latin2", "latin2_czech_cs", 1, 1, "", NULL, NULL},
	{   5, "latin1", "latin1_german_ci", 1, 1, "", NULL, NULL},
	{  14, "cp1251", "cp1251_bulgarian_ci", 1, 1, "", NULL, NULL},
	{  15, "latin1", "latin1_danish_ci", 1, 1, "", NULL, NULL},
	{  17, "filename", "filename", 1, 5, "", NULL, NULL},
	{  20, "latin7", "latin7_estonian_cs", 1, 1, "", NULL, NULL},
	{  21, "latin2", "latin2_hungarian_ci", 1, 1, "", NULL, NULL},
	{  23, "cp1251", "cp1251_ukrainian_ci", 1, 1, "", NULL, NULL},
	{  27, "latin2", "latin2_croatian_ci", 1, 1, "", NULL, NULL},
	{  29, "cp1257", "cp1257_lithunian_ci", 1, 1, "", NULL, NULL},
	{  31, "latin1", "latin1_german2_ci", 1, 1, "", NULL, NULL},
	{  34, "cp1250", "cp1250_czech_cs", 1, 1, "", NULL, NULL},
	{  42, "latin7", "latin7_general_cs", 1, 1, "", NULL, NULL},
	{  43, "macce", "macce_bin", 1, 1, "", NULL, NULL},
	{  44, "cp1250", "cp1250_croatian_ci", 1, 1, "", NULL, NULL},
	{  47, "latin1", "latin1_bin", 1, 1, "", NULL, NULL},
	{  48, "latin1", "latin1_general_ci", 1, 1, "", NULL, NULL},
	{  49, "latin1", "latin1_general_cs", 1, 1, "", NULL, NULL},
	{  50, "cp1251", "cp1251_bin", 1, 1, "", NULL, NULL},
	{  52, "cp1251", "cp1251_general_cs", 1, 1, "", NULL, NULL},
	{  53, "macroman", "macroman_bin", 1, 1, "", NULL, NULL},
	{  58, "cp1257", "cp1257_bin", 1, 1, "", NULL, NULL},
	{  60, "armascii8", "armascii8_bin", 1, 1, "", NULL, NULL},
	{  65, "ascii", "ascii_bin", 1, 1, "", NULL, NULL},
	{  66, "cp1250", "cp1250_bin", 1, 1, "", NULL, NULL},
	{  67, "cp1256", "cp1256_bin", 1, 1, "", NULL, NULL},
	{  68, "cp866", "cp866_bin", 1, 1, "", NULL, NULL},
	{  69, "dec8", "dec8_bin", 1, 1, "", NULL, NULL},
	{  70, "greek", "greek_bin", 1, 1, "", NULL, NULL},
	{  71, "hebrew", "hebrew_bin", 1, 1, "", NULL, NULL},
	{  72, "hp8", "hp8_bin", 1, 1, "", NULL, NULL},
	{  73, "keybcs2", "keybcs2_bin", 1, 1, "", NULL, NULL},
	{  74, "koi8r", "koi8r_bin", 1, 1, "", NULL, NULL},
	{  75, "koi8u", "koi8u_bin", 1, 1, "", NULL, NULL},
	{  77, "latin2", "latin2_bin", 1, 1, "", NULL, NULL},
	{  78, "latin5", "latin5_bin", 1, 1, "", NULL, NULL},
	{  79, "latin7", "latin7_bin", 1, 1, "", NULL, NULL},
	{  80, "cp850", "cp850_bin", 1, 1, "", NULL, NULL},
	{  81, "cp852", "cp852_bin", 1, 1, "", NULL, NULL},
	{  82, "swe7", "swe7_bin", 1, 1, "", NULL, NULL},
	{  93, "geostd8", "geostd8_bin", 1, 1, "", NULL, NULL},
	{  83, "utf8", "utf8_bin", 1, 3, "UTF-8 Unicode", cppconn_mbcharlen_utf8,  check_mb_utf8_valid},
	{  84, "big5", "big5_bin", 1, 2, "", cppconn_mbcharlen_big5, check_mb_big5},
	{  85, "euckr", "euckr_bin", 1, 2, "", cppconn_mbcharlen_euckr, check_mb_euckr},
	{  86, "gb2312", "gb2312_bin", 1, 2, "", cppconn_mbcharlen_gb2312, check_mb_gb2312},
	{  87, "gbk", "gbk_bin", 1, 2, "", cppconn_mbcharlen_gbk, check_mb_gbk},
	{  88, "sjis", "sjis_bin", 1, 2, "", cppconn_mbcharlen_sjis, check_mb_sjis},
	{  89, "tis620", "tis620_bin", 1, 1, "", NULL, NULL},
	{  90, "ucs2", "ucs2_bin", 2, 2, "UCS-2 Unicode", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{  91, "ujis", "ujis_bin", 1, 3, "", cppconn_mbcharlen_ujis, check_mb_ujis},
	{  94, "latin1", "latin1_spanish_ci", 1, 1, "", NULL, NULL},
	{  96, "cp932", "cp932_bin", 1, 2, "", cppconn_mbcharlen_cp932, check_mb_cp932},
	{  99, "cp1250", "cp1250_polish_ci", 1, 1, "", NULL, NULL},
	{  98, "eucjpms", "eucjpms_bin", 1, 3, "", cppconn_mbcharlen_eucjpms, check_mb_eucjpms},
	{ 128, "ucs2", "ucs2_unicode_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 129, "ucs2", "ucs2_icelandic_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 130, "ucs2", "ucs2_latvian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 131, "ucs2", "ucs2_romanian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 132, "ucs2", "ucs2_slovenian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 133, "ucs2", "ucs2_polish_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 134, "ucs2", "ucs2_estonian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 135, "ucs2", "ucs2_spanish_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 136, "ucs2", "ucs2_swedish_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 137, "ucs2", "ucs2_turkish_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 138, "ucs2", "ucs2_czech_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 139, "ucs2", "ucs2_danish_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 140, "ucs2", "ucs2_lithunian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 141, "ucs2", "ucs2_slovak_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 142, "ucs2", "ucs2_spanish2_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 143, "ucs2", "ucs2_roman_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 144, "ucs2", "ucs2_persian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 145, "ucs2", "ucs2_esperanto_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 146, "ucs2", "ucs2_hungarian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 147, "ucs2", "ucs2_sinhala_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 148, "ucs2", "ucs2_german2_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 149, "ucs2", "ucs2_croatian_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 150, "ucs2", "ucs2_unicode_520_ci", 2, 2, "", cppconn_mbcharlen_ucs2, check_mb_ucs2},
	{ 192, "utf8", "utf8_unicode_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 193, "utf8", "utf8_icelandic_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 194, "utf8", "utf8_latvian_ci", 1, 3, "", cppconn_mbcharlen_utf8,  check_mb_utf8_valid},
	{ 195, "utf8", "utf8_romanian_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 196, "utf8", "utf8_slovenian_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 197, "utf8", "utf8_polish_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 198, "utf8", "utf8_estonian_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 199, "utf8", "utf8_spanish_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 200, "utf8", "utf8_swedish_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 201, "utf8", "utf8_turkish_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 202, "utf8", "utf8_czech_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 203, "utf8", "utf8_danish_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid },
	{ 204, "utf8", "utf8_lithunian_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid },
	{ 205, "utf8", "utf8_slovak_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 206, "utf8", "utf8_spanish2_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 207, "utf8", "utf8_roman_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 208, "utf8", "utf8_persian_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 209, "utf8", "utf8_esperanto_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 210, "utf8", "utf8_hungarian_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 211, "utf8", "utf8_sinhala_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 212, "utf8", "utf8_german2_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 213, "utf8", "utf8_croatian_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 214, "utf8", "utf8_unicode_520_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 215, "utf8", "utf8_vietnamese_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 223, "utf8", "utf8_general_mysql500_ci", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},
	{ 45, "utf8mb4", "utf8mb4_general_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 46, "utf8mb4", "utf8mb4_bin", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 224, "utf8mb4", "utf8mb4_unicode_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 225, "utf8mb4", "utf8mb4_icelandic_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 226, "utf8mb4", "utf8mb4_latvian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 227, "utf8mb4", "utf8mb4_romanian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 228, "utf8mb4", "utf8mb4_slovenian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 229, "utf8mb4", "utf8mb4_polish_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 230, "utf8mb4", "utf8mb4_estonian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 231, "utf8mb4", "utf8mb4_spanish_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 232, "utf8mb4", "utf8mb4_swedish_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 233, "utf8mb4", "utf8mb4_turkish_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 234, "utf8mb4", "utf8mb4_czech_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 235, "utf8mb4", "utf8mb4_danish_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 236, "utf8mb4", "utf8mb4_lithuanian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 237, "utf8mb4", "utf8mb4_slovak_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 238, "utf8mb4", "utf8mb4_spanish2_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 239, "utf8mb4", "utf8mb4_roman_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 240, "utf8mb4", "utf8mb4_persian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 241, "utf8mb4", "utf8mb4_esperanto_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 242, "utf8mb4", "utf8mb4_hungarian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 243, "utf8mb4", "utf8mb4_sinhala_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 244, "utf8mb4", "utf8mb4_german2_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 245, "utf8mb4", "utf8mb4_croatian_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 246, "utf8mb4", "utf8mb4_unicode_520_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},
	{ 247, "utf8mb4", "utf8mb4_vietnamese_ci", 1, 4, "", cppconn_mbcharlen_utf8mb4, check_mb_utf8mb4_valid},

	/*Should not really happen, but adding them */
	{ 254, "utf8", "utf8_general_cs", 1, 3, "", cppconn_mbcharlen_utf8, check_mb_utf8_valid},

	{ 101, "utf16", "utf16_unicode_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 102, "utf16", "utf16_icelandic_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 103, "utf16", "utf16_latvian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 104, "utf16", "utf16_romanian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 105, "utf16", "utf16_slovenian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 106, "utf16", "utf16_polish_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 107, "utf16", "utf16_estonian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 108, "utf16", "utf16_spanish_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 109, "utf16", "utf16_swedish_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 110, "utf16", "utf16_turkish_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 111, "utf16", "utf16_czech_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 112, "utf16", "utf16_danish_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 113, "utf16", "utf16_lithuanian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 114, "utf16", "utf16_slovak_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 115, "utf16", "utf16_spanish2_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 116, "utf16", "utf16_roman_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 117, "utf16", "utf16_persian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 118, "utf16", "utf16_esperanto_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 119, "utf16", "utf16_hungarian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 120, "utf16", "utf16_sinhala_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 121, "utf16", "utf16_german2_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 122, "utf16", "utf16_croatian_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 123, "utf16", "utf16_unicode_520_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},
	{ 124, "utf16", "utf16_vietnamese_ci", 2, 4, "", cppconn_mbcharlen_utf16, check_mb_utf16_valid},

	{ 160, "utf32", "utf32_unicode_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 161, "utf32", "utf32_icelandic_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 162, "utf32", "utf32_latvian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 163, "utf32", "utf32_romanian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 164, "utf32", "utf32_slovenian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 165, "utf32", "utf32_polish_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 166, "utf32", "utf32_estonian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 167, "utf32", "utf32_spanish_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 168, "utf32", "utf32_swedish_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 169, "utf32", "utf32_turkish_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 170, "utf32", "utf32_czech_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 171, "utf32", "utf32_danish_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 172, "utf32", "utf32_lithuanian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 173, "utf32", "utf32_slovak_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 174, "utf32", "utf32_spanish2_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 175, "utf32", "utf32_roman_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 176, "utf32", "utf32_persian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 177, "utf32", "utf32_esperanto_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 178, "utf32", "utf32_hungarian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 179, "utf32", "utf32_sinhala_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 180, "utf32", "utf32_german2_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 181, "utf32", "utf32_croatian_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 182, "utf32", "utf32_unicode_520_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},
	{ 183, "utf32", "utf32_vietnamese_ci", 4, 4, "", cppconn_mbcharlen_utf32, check_mb_utf32_valid},

	{   0, NULL, NULL, 0, 0, NULL, NULL, NULL}
};
/* }}} */


/* {{{ find_charset */
const OUR_CHARSET * find_charset(unsigned int charsetnr)
{
	const OUR_CHARSET * c = our_charsets60;

	do {
		if (c->nr == charsetnr) {
			return c;
		}
		++c;
	} while (c[0].nr != 0);
	return NULL;
}
/* }}} */


#define MAGIC_BINARY_CHARSET_NR 63

/* {{{ mysql_to_datatype() -I- */
int
mysql_type_to_datatype(const MYSQL_FIELD * const field)
{
	switch (field->type) {
		case MYSQL_TYPE_BIT:
			return sql::DataType::BIT;
		case MYSQL_TYPE_DECIMAL:
		case MYSQL_TYPE_NEWDECIMAL:
			return sql::DataType::DECIMAL;
		case MYSQL_TYPE_TINY:
			return sql::DataType::TINYINT;
		case MYSQL_TYPE_SHORT:
			return sql::DataType::SMALLINT;
		case MYSQL_TYPE_INT24:
			return sql::DataType::MEDIUMINT;
		case MYSQL_TYPE_LONG:
			return sql::DataType::INTEGER;
		case MYSQL_TYPE_LONGLONG:
			return sql::DataType::BIGINT;
		case MYSQL_TYPE_FLOAT:
			return sql::DataType::REAL;
		case MYSQL_TYPE_DOUBLE:
			return sql::DataType::DOUBLE;
		case MYSQL_TYPE_NULL:
			return sql::DataType::SQLNULL;
		case MYSQL_TYPE_TIMESTAMP:
			return sql::DataType::TIMESTAMP;
		case MYSQL_TYPE_DATE:
			return sql::DataType::DATE;
		case MYSQL_TYPE_TIME:
			return sql::DataType::TIME;
		case MYSQL_TYPE_YEAR:
			return sql::DataType::YEAR;
		case MYSQL_TYPE_DATETIME:
			return sql::DataType::TIMESTAMP;
		case MYSQL_TYPE_TINY_BLOB:// should no appear over the wire
		{
			bool isBinary = (field->flags & BINARY_FLAG) &&
							field->charsetnr == MAGIC_BINARY_CHARSET_NR;
			const sql::mysql::util::OUR_CHARSET * const cs =
							sql::mysql::util::find_charset(field->charsetnr);
			if (!cs) {
				std::ostringstream msg("Server sent unknown charsetnr (");
				msg << field->charsetnr << ") . Please report";
				throw SQLException(msg.str());
			}
			return isBinary ? sql::DataType::VARBINARY : sql::DataType::VARCHAR;
		}
		case MYSQL_TYPE_MEDIUM_BLOB:// should no appear over the wire
		case MYSQL_TYPE_LONG_BLOB:// should no appear over the wire
		case MYSQL_TYPE_BLOB:
		{
			bool isBinary = (field->flags & BINARY_FLAG) &&
							field->charsetnr == MAGIC_BINARY_CHARSET_NR;
			const sql::mysql::util::OUR_CHARSET * const cs =
							sql::mysql::util::find_charset(field->charsetnr);
			if (!cs) {
				std::ostringstream msg("Server sent unknown charsetnr (");
				msg << field->charsetnr << ") . Please report";
				throw SQLException(msg.str());
			}
			return isBinary ? sql::DataType::LONGVARBINARY : sql::DataType::LONGVARCHAR;
		}
		case MYSQL_TYPE_VARCHAR:
		case MYSQL_TYPE_VAR_STRING:
			if (field->flags & SET_FLAG) {
				return sql::DataType::SET;
			}
			if (field->flags & ENUM_FLAG) {
				return sql::DataType::ENUM;
			}
			if ((field->flags & BINARY_FLAG) && field->charsetnr == MAGIC_BINARY_CHARSET_NR) {
				return sql::DataType::VARBINARY;
			}
			return sql::DataType::VARCHAR;
		case MYSQL_TYPE_STRING:
			if (field->flags & SET_FLAG) {
				return sql::DataType::SET;
			}
			if (field->flags & ENUM_FLAG) {
				return sql::DataType::ENUM;
			}
			if ((field->flags & BINARY_FLAG) && field->charsetnr == MAGIC_BINARY_CHARSET_NR) {
				return sql::DataType::BINARY;
			}
			return sql::DataType::CHAR;
		case MYSQL_TYPE_ENUM:
			/* This hould never happen - MYSQL_TYPE_ENUM is not sent over the wire, just used in the server */
			return sql::DataType::ENUM;
		case MYSQL_TYPE_SET:
			/* This hould never happen - MYSQL_TYPE_SET is not sent over the wire, just used in the server */
			return sql::DataType::SET;
		case MYSQL_TYPE_GEOMETRY:
			return sql::DataType::GEOMETRY;
		default:
			return sql::DataType::UNKNOWN;
	}
}
/* }}} */


/* {{{ mysql_to_datatype() -I- */
int
mysql_string_type_to_datatype(const sql::SQLString & name)
{
	/*
	  I_S.COLUMNS is buggy, because it deflivers (float|double) unsigned
	  but not (tinyint|smallint|mediumint|int|bigint) unsigned
	*/
	if (!name.compare("bit")) {
		return sql::DataType::BIT;
	} else if (!name.compare("decimal") || !name.compare("decimal unsigned")) {
		return sql::DataType::DECIMAL;
	} else if (!name.compare("tinyint") || !name.compare("tinyint unsigned")) {
		return sql::DataType::TINYINT;
	} else if (!name.compare("smallint") || !name.compare("smallint unsigned")) {
		return sql::DataType::SMALLINT;
	} else if (!name.compare("mediumint") || !name.compare("mediumint unsigned")) {
		return sql::DataType::MEDIUMINT;
	} else if (!name.compare("int") || !name.compare("int unsigned")) {
		return sql::DataType::INTEGER;
	} else if (!name.compare("bigint") || !name.compare("bigint unsigned")) {
		return sql::DataType::BIGINT;
	} else if (!name.compare("float") || !name.compare("float unsigned")) {
		return sql::DataType::REAL;
	} else if (!name.compare("double") || !name.compare("double unsigned")) {
		return sql::DataType::DOUBLE;
	} else if (!name.compare("timestamp")) {
		return sql::DataType::TIMESTAMP;
	} else if (!name.compare("date")) {
		return sql::DataType::DATE;
	} else if (!name.compare("time")) {
		return sql::DataType::TIME;
	} else if (!name.compare("year")) {
		return sql::DataType::YEAR;
	} else if (!name.compare("datetime")) {
		return sql::DataType::TIMESTAMP;
	} else if (!name.compare("tinytext")) {
		return sql::DataType::VARCHAR;
	} else if (!name.compare("mediumtext") || !name.compare("text") || !name.compare("longtext")) {
		return sql::DataType::LONGVARCHAR;
	} else if (!name.compare("tinyblob")) {
		return sql::DataType::VARBINARY;
	} else if (!name.compare("mediumblob") || !name.compare("blob") || !name.compare("longblob")) {
		return sql::DataType::LONGVARBINARY;
	} else if (!name.compare("char")) {
		return sql::DataType::CHAR;
	} else if (!name.compare("binary")) {
		return sql::DataType::BINARY;
	} else if (!name.compare("varchar")) {
		return sql::DataType::VARCHAR;
	} else if (!name.compare("varbinary")) {
		return sql::DataType::VARBINARY;
	} else if (!name.compare("enum")) {
		return sql::DataType::ENUM;
	} else if (!name.compare("set")) {
		return sql::DataType::SET;
	} else if (!name.compare("geometry")) {
		return sql::DataType::GEOMETRY;
	} else {
		return sql::DataType::UNKNOWN;
	}
}
/* }}} */


/* {{{ mysql_to_datatype() -I- */
const char *
mysql_type_to_string(const MYSQL_FIELD * const field, boost::shared_ptr< sql::mysql::MySQL_DebugLogger > & l)
{
	CPP_ENTER_WL(l, "mysql_type_to_string");

	bool isUnsigned = (field->flags & UNSIGNED_FLAG) != 0;
	bool isZerofill = (field->flags & ZEROFILL_FLAG) != 0;
	switch (field->type) {
		case MYSQL_TYPE_BIT:
			return "BIT";
		case MYSQL_TYPE_DECIMAL:
		case MYSQL_TYPE_NEWDECIMAL:
			return isUnsigned ? (isZerofill? "DECIMAL UNSIGNED ZEROFILL" : "DECIMAL UNSIGNED"): "DECIMAL";
		case MYSQL_TYPE_TINY:
			return isUnsigned ? (isZerofill? "TINYINT UNSIGNED ZEROFILL" : "TINYINT UNSIGNED"): "TINYINT";
		case MYSQL_TYPE_SHORT:
			return isUnsigned ? (isZerofill? "SMALLINT UNSIGNED ZEROFILL" : "SMALLINT UNSIGNED"): "SMALLINT";
		case MYSQL_TYPE_LONG:
			return isUnsigned ? (isZerofill? "INT UNSIGNED ZEROFILL" : "INT UNSIGNED"): "INT";
		case MYSQL_TYPE_FLOAT:
			return isUnsigned ? (isZerofill? "FLOAT UNSIGNED ZEROFILL" : "FLOAT UNSIGNED"): "FLOAT";
		case MYSQL_TYPE_DOUBLE:
			return isUnsigned ? (isZerofill? "DOUBLE UNSIGNED ZEROFILL" : "DOUBLE UNSIGNED"): "DOUBLE";
		case MYSQL_TYPE_NULL:
			return "NULL";
		case MYSQL_TYPE_TIMESTAMP:
			return "TIMESTAMP";
		case MYSQL_TYPE_LONGLONG:
			return isUnsigned ? (isZerofill? "BIGINT UNSIGNED ZEROFILL" : "BIGINT UNSIGNED") : "BIGINT";
		case MYSQL_TYPE_INT24:
			return isUnsigned ? (isZerofill? "MEDIUMINT UNSIGNED ZEROFILL" : "MEDIUMINT UNSIGNED") : "MEDIUMINT";
		case MYSQL_TYPE_DATE:
			return "DATE";
		case MYSQL_TYPE_TIME:
			return "TIME";
		case MYSQL_TYPE_DATETIME:
			return "DATETIME";
		case MYSQL_TYPE_TINY_BLOB:// should no appear over the wire
		{
			bool isBinary = field->charsetnr == MAGIC_BINARY_CHARSET_NR;
			unsigned int char_maxlen = 1;
			if (!isBinary) {
				const sql::mysql::util::OUR_CHARSET * cset = find_charset(field->charsetnr);
				if (!cset) {
					std::ostringstream msg("Server sent unknown charsetnr (");
					msg << field->charsetnr << ") . Please report";
					throw SQLException(msg.str());
				}
				char_maxlen = cset->char_maxlen;
			}
			CPP_INFO_FMT("char_maxlen=%u field->length=%lu", char_maxlen, field->length);

			return isBinary? "TINYBLOB":"TINYTEXT";
		}
		case MYSQL_TYPE_MEDIUM_BLOB:// should no appear over the wire
		{
			bool isBinary = field->charsetnr == MAGIC_BINARY_CHARSET_NR;
			unsigned int char_maxlen = 1;
			if (!isBinary) {
				const sql::mysql::util::OUR_CHARSET * cset = find_charset(field->charsetnr);
				if (!cset) {
					std::ostringstream msg("Server sent unknown charsetnr (");
					msg << field->charsetnr << ") . Please report";
					throw SQLException(msg.str());
				}
				char_maxlen = cset->char_maxlen;
			}
			CPP_INFO_FMT("char_maxlen=%u field->length=%lu", char_maxlen, field->length);

			return isBinary? "MEDIUMBLOB":"MEDIUMTEXT";
		}
		case MYSQL_TYPE_LONG_BLOB:// should no appear over the wire
		{
			bool isBinary = field->charsetnr == MAGIC_BINARY_CHARSET_NR;
			unsigned int char_maxlen = 1;
			if (!isBinary) {
				const sql::mysql::util::OUR_CHARSET * cset = find_charset(field->charsetnr);
				if (!cset) {
					std::ostringstream msg("Server sent unknown charsetnr (");
					msg << field->charsetnr << ") . Please report";
					throw SQLException(msg.str());
				}
				char_maxlen = cset->char_maxlen;
			}
			CPP_INFO_FMT("char_maxlen=%u field->length=%lu", char_maxlen, field->length);

			return isBinary? "LONGBLOB":"LONGTEXT";
		}
		case MYSQL_TYPE_BLOB:
		{
			bool isBinary= field->charsetnr == MAGIC_BINARY_CHARSET_NR;
			unsigned int char_maxlen = 1;
			if (!isBinary) {
				const sql::mysql::util::OUR_CHARSET * cset = find_charset(field->charsetnr);
				if (!cset) {
					std::ostringstream msg("Server sent unknown charsetnr (");
					msg << field->charsetnr << ") . Please report";
					throw SQLException(msg.str());
				}
				char_maxlen = cset->char_maxlen;
			}
			CPP_INFO_FMT("char_maxlen=%u field->length=%lu", char_maxlen, field->length);
			return isBinary? "BLOB":"TEXT";
		}
		case MYSQL_TYPE_VARCHAR:
		case MYSQL_TYPE_VAR_STRING:
			if (field->flags & ENUM_FLAG) {
				return "ENUM";
			}
			if (field->flags & SET_FLAG) {
				return "SET";
			}
			if (field->charsetnr == MAGIC_BINARY_CHARSET_NR) {
				return "VARBINARY";
			}
			return "VARCHAR";
		case MYSQL_TYPE_STRING:
			if (field->flags & ENUM_FLAG) {
				return "ENUM";
			}
			if (field->flags & SET_FLAG) {
				return "SET";
			}
			if ((field->flags & BINARY_FLAG) && field->charsetnr == MAGIC_BINARY_CHARSET_NR) {
				return "BINARY";
			}
			return "CHAR";
		case MYSQL_TYPE_ENUM:
			/* This should never happen */
			return "ENUM";
		case MYSQL_TYPE_YEAR:
			return "YEAR";
		case MYSQL_TYPE_SET:
			/* This should never happen */
			return "SET";
		case MYSQL_TYPE_GEOMETRY:
			return "GEOMETRY";
		default:
			return "UNKNOWN";
	}
}
/* }}} */


/* The following code is from libmysql and is under the following license */

/*
   Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.

  The MySQL Connector/C++ is licensed under the terms of the GPLv2
  <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
  MySQL Connectors. There are special exceptions to the terms and
  conditions of the GPLv2 as it is applied to this software, see the
  FLOSS License Exception
  <http://www.mysql.com/about/legal/licensing/foss-exception.html>.

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published
  by the Free Software Foundation; version 2 of the License.

  This program is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
*/

/* UTF8 according RFC 2279 */
/* Written by Alexander Barkov <bar@udm.net> */


typedef struct unicase_info_st
{
	uint16_t toupper;
	uint16_t tolower;
	uint16_t sort;
} MY_UNICASE_INFO;


static MY_UNICASE_INFO plane00[]={
	{0x0000,0x0000,0x0000},	{0x0001,0x0001,0x0001},
	{0x0002,0x0002,0x0002},	{0x0003,0x0003,0x0003},
	{0x0004,0x0004,0x0004},	{0x0005,0x0005,0x0005},
	{0x0006,0x0006,0x0006},	{0x0007,0x0007,0x0007},
	{0x0008,0x0008,0x0008},	{0x0009,0x0009,0x0009},
	{0x000A,0x000A,0x000A},	{0x000B,0x000B,0x000B},
	{0x000C,0x000C,0x000C},	{0x000D,0x000D,0x000D},
	{0x000E,0x000E,0x000E},	{0x000F,0x000F,0x000F},
	{0x0010,0x0010,0x0010},	{0x0011,0x0011,0x0011},
	{0x0012,0x0012,0x0012},	{0x0013,0x0013,0x0013},
	{0x0014,0x0014,0x0014},	{0x0015,0x0015,0x0015},
	{0x0016,0x0016,0x0016},	{0x0017,0x0017,0x0017},
	{0x0018,0x0018,0x0018},	{0x0019,0x0019,0x0019},
	{0x001A,0x001A,0x001A},	{0x001B,0x001B,0x001B},
	{0x001C,0x001C,0x001C},	{0x001D,0x001D,0x001D},
	{0x001E,0x001E,0x001E},	{0x001F,0x001F,0x001F},
	{0x0020,0x0020,0x0020},	{0x0021,0x0021,0x0021},
	{0x0022,0x0022,0x0022},	{0x0023,0x0023,0x0023},
	{0x0024,0x0024,0x0024},	{0x0025,0x0025,0x0025},
	{0x0026,0x0026,0x0026},	{0x0027,0x0027,0x0027},
	{0x0028,0x0028,0x0028},	{0x0029,0x0029,0x0029},
	{0x002A,0x002A,0x002A},	{0x002B,0x002B,0x002B},
	{0x002C,0x002C,0x002C},	{0x002D,0x002D,0x002D},
	{0x002E,0x002E,0x002E},	{0x002F,0x002F,0x002F},
	{0x0030,0x0030,0x0030},	{0x0031,0x0031,0x0031},
	{0x0032,0x0032,0x0032},	{0x0033,0x0033,0x0033},
	{0x0034,0x0034,0x0034},	{0x0035,0x0035,0x0035},
	{0x0036,0x0036,0x0036},	{0x0037,0x0037,0x0037},
	{0x0038,0x0038,0x0038},	{0x0039,0x0039,0x0039},
	{0x003A,0x003A,0x003A},	{0x003B,0x003B,0x003B},
	{0x003C,0x003C,0x003C},	{0x003D,0x003D,0x003D},
	{0x003E,0x003E,0x003E},	{0x003F,0x003F,0x003F},
	{0x0040,0x0040,0x0040},	{0x0041,0x0061,0x0041},
	{0x0042,0x0062,0x0042},	{0x0043,0x0063,0x0043},
	{0x0044,0x0064,0x0044},	{0x0045,0x0065,0x0045},
	{0x0046,0x0066,0x0046},	{0x0047,0x0067,0x0047},
	{0x0048,0x0068,0x0048},	{0x0049,0x0069,0x0049},
	{0x004A,0x006A,0x004A},	{0x004B,0x006B,0x004B},
	{0x004C,0x006C,0x004C},	{0x004D,0x006D,0x004D},
	{0x004E,0x006E,0x004E},	{0x004F,0x006F,0x004F},
	{0x0050,0x0070,0x0050},	{0x0051,0x0071,0x0051},
	{0x0052,0x0072,0x0052},	{0x0053,0x0073,0x0053},
	{0x0054,0x0074,0x0054},	{0x0055,0x0075,0x0055},
	{0x0056,0x0076,0x0056},	{0x0057,0x0077,0x0057},
	{0x0058,0x0078,0x0058},	{0x0059,0x0079,0x0059},
	{0x005A,0x007A,0x005A},	{0x005B,0x005B,0x005B},
	{0x005C,0x005C,0x005C},	{0x005D,0x005D,0x005D},
	{0x005E,0x005E,0x005E},	{0x005F,0x005F,0x005F},
	{0x0060,0x0060,0x0060},	{0x0041,0x0061,0x0041},
	{0x0042,0x0062,0x0042},	{0x0043,0x0063,0x0043},
	{0x0044,0x0064,0x0044},	{0x0045,0x0065,0x0045},
	{0x0046,0x0066,0x0046},	{0x0047,0x0067,0x0047},
	{0x0048,0x0068,0x0048},	{0x0049,0x0069,0x0049},
	{0x004A,0x006A,0x004A},	{0x004B,0x006B,0x004B},
	{0x004C,0x006C,0x004C},	{0x004D,0x006D,0x004D},
	{0x004E,0x006E,0x004E},	{0x004F,0x006F,0x004F},
	{0x0050,0x0070,0x0050},	{0x0051,0x0071,0x0051},
	{0x0052,0x0072,0x0052},	{0x0053,0x0073,0x0053},
	{0x0054,0x0074,0x0054},	{0x0055,0x0075,0x0055},
	{0x0056,0x0076,0x0056},	{0x0057,0x0077,0x0057},
	{0x0058,0x0078,0x0058},	{0x0059,0x0079,0x0059},
	{0x005A,0x007A,0x005A},	{0x007B,0x007B,0x007B},
	{0x007C,0x007C,0x007C},	{0x007D,0x007D,0x007D},
	{0x007E,0x007E,0x007E},	{0x007F,0x007F,0x007F},
	{0x0080,0x0080,0x0080},	{0x0081,0x0081,0x0081},
	{0x0082,0x0082,0x0082},	{0x0083,0x0083,0x0083},
	{0x0084,0x0084,0x0084},	{0x0085,0x0085,0x0085},
	{0x0086,0x0086,0x0086},	{0x0087,0x0087,0x0087},
	{0x0088,0x0088,0x0088},	{0x0089,0x0089,0x0089},
	{0x008A,0x008A,0x008A},	{0x008B,0x008B,0x008B},
	{0x008C,0x008C,0x008C},	{0x008D,0x008D,0x008D},
	{0x008E,0x008E,0x008E},	{0x008F,0x008F,0x008F},
	{0x0090,0x0090,0x0090},	{0x0091,0x0091,0x0091},
	{0x0092,0x0092,0x0092},	{0x0093,0x0093,0x0093},
	{0x0094,0x0094,0x0094},	{0x0095,0x0095,0x0095},
	{0x0096,0x0096,0x0096},	{0x0097,0x0097,0x0097},
	{0x0098,0x0098,0x0098},	{0x0099,0x0099,0x0099},
	{0x009A,0x009A,0x009A},	{0x009B,0x009B,0x009B},
	{0x009C,0x009C,0x009C},	{0x009D,0x009D,0x009D},
	{0x009E,0x009E,0x009E},	{0x009F,0x009F,0x009F},
	{0x00A0,0x00A0,0x00A0},	{0x00A1,0x00A1,0x00A1},
	{0x00A2,0x00A2,0x00A2},	{0x00A3,0x00A3,0x00A3},
	{0x00A4,0x00A4,0x00A4},	{0x00A5,0x00A5,0x00A5},
	{0x00A6,0x00A6,0x00A6},	{0x00A7,0x00A7,0x00A7},
	{0x00A8,0x00A8,0x00A8},	{0x00A9,0x00A9,0x00A9},
	{0x00AA,0x00AA,0x00AA},	{0x00AB,0x00AB,0x00AB},
	{0x00AC,0x00AC,0x00AC},	{0x00AD,0x00AD,0x00AD},
	{0x00AE,0x00AE,0x00AE},	{0x00AF,0x00AF,0x00AF},
	{0x00B0,0x00B0,0x00B0},	{0x00B1,0x00B1,0x00B1},
	{0x00B2,0x00B2,0x00B2},	{0x00B3,0x00B3,0x00B3},
	{0x00B4,0x00B4,0x00B4},	{0x039C,0x00B5,0x039C},
	{0x00B6,0x00B6,0x00B6},	{0x00B7,0x00B7,0x00B7},
	{0x00B8,0x00B8,0x00B8},	{0x00B9,0x00B9,0x00B9},
	{0x00BA,0x00BA,0x00BA},	{0x00BB,0x00BB,0x00BB},
	{0x00BC,0x00BC,0x00BC},	{0x00BD,0x00BD,0x00BD},
	{0x00BE,0x00BE,0x00BE},	{0x00BF,0x00BF,0x00BF},
	{0x00C0,0x00E0,0x0041},	{0x00C1,0x00E1,0x0041},
	{0x00C2,0x00E2,0x0041},	{0x00C3,0x00E3,0x0041},
	{0x00C4,0x00E4,0x0041},	{0x00C5,0x00E5,0x0041},
	{0x00C6,0x00E6,0x00C6},	{0x00C7,0x00E7,0x0043},
	{0x00C8,0x00E8,0x0045},	{0x00C9,0x00E9,0x0045},
	{0x00CA,0x00EA,0x0045},	{0x00CB,0x00EB,0x0045},
	{0x00CC,0x00EC,0x0049},	{0x00CD,0x00ED,0x0049},
	{0x00CE,0x00EE,0x0049},	{0x00CF,0x00EF,0x0049},
	{0x00D0,0x00F0,0x00D0},	{0x00D1,0x00F1,0x004E},
	{0x00D2,0x00F2,0x004F},	{0x00D3,0x00F3,0x004F},
	{0x00D4,0x00F4,0x004F},	{0x00D5,0x00F5,0x004F},
	{0x00D6,0x00F6,0x004F},	{0x00D7,0x00D7,0x00D7},
	{0x00D8,0x00F8,0x00D8},	{0x00D9,0x00F9,0x0055},
	{0x00DA,0x00FA,0x0055},	{0x00DB,0x00FB,0x0055},
	{0x00DC,0x00FC,0x0055},	{0x00DD,0x00FD,0x0059},
	{0x00DE,0x00FE,0x00DE},	{0x00DF,0x00DF,0x00DF},
	{0x00C0,0x00E0,0x0041},	{0x00C1,0x00E1,0x0041},
	{0x00C2,0x00E2,0x0041},	{0x00C3,0x00E3,0x0041},
	{0x00C4,0x00E4,0x0041},	{0x00C5,0x00E5,0x0041},
	{0x00C6,0x00E6,0x00C6},	{0x00C7,0x00E7,0x0043},
	{0x00C8,0x00E8,0x0045},	{0x00C9,0x00E9,0x0045},
	{0x00CA,0x00EA,0x0045},	{0x00CB,0x00EB,0x0045},
	{0x00CC,0x00EC,0x0049},	{0x00CD,0x00ED,0x0049},
	{0x00CE,0x00EE,0x0049},	{0x00CF,0x00EF,0x0049},
	{0x00D0,0x00F0,0x00D0},	{0x00D1,0x00F1,0x004E},
	{0x00D2,0x00F2,0x004F},	{0x00D3,0x00F3,0x004F},
	{0x00D4,0x00F4,0x004F},	{0x00D5,0x00F5,0x004F},
	{0x00D6,0x00F6,0x004F},	{0x00F7,0x00F7,0x00F7},
	{0x00D8,0x00F8,0x00D8},	{0x00D9,0x00F9,0x0055},
	{0x00DA,0x00FA,0x0055},	{0x00DB,0x00FB,0x0055},
	{0x00DC,0x00FC,0x0055},	{0x00DD,0x00FD,0x0059},
	{0x00DE,0x00FE,0x00DE},	{0x0178,0x00FF,0x0059}
};



static MY_UNICASE_INFO plane01[]={
	{0x0100,0x0101,0x0041},	{0x0100,0x0101,0x0041},
	{0x0102,0x0103,0x0041},	{0x0102,0x0103,0x0041},
	{0x0104,0x0105,0x0041},	{0x0104,0x0105,0x0041},
	{0x0106,0x0107,0x0043},	{0x0106,0x0107,0x0043},
	{0x0108,0x0109,0x0043},	{0x0108,0x0109,0x0043},
	{0x010A,0x010B,0x0043},	{0x010A,0x010B,0x0043},
	{0x010C,0x010D,0x0043},	{0x010C,0x010D,0x0043},
	{0x010E,0x010F,0x0044},	{0x010E,0x010F,0x0044},
	{0x0110,0x0111,0x0110},	{0x0110,0x0111,0x0110},
	{0x0112,0x0113,0x0045},	{0x0112,0x0113,0x0045},
	{0x0114,0x0115,0x0045},	{0x0114,0x0115,0x0045},
	{0x0116,0x0117,0x0045},	{0x0116,0x0117,0x0045},
	{0x0118,0x0119,0x0045},	{0x0118,0x0119,0x0045},
	{0x011A,0x011B,0x0045},	{0x011A,0x011B,0x0045},
	{0x011C,0x011D,0x0047},	{0x011C,0x011D,0x0047},
	{0x011E,0x011F,0x0047},	{0x011E,0x011F,0x0047},
	{0x0120,0x0121,0x0047},	{0x0120,0x0121,0x0047},
	{0x0122,0x0123,0x0047},	{0x0122,0x0123,0x0047},
	{0x0124,0x0125,0x0048},	{0x0124,0x0125,0x0048},
	{0x0126,0x0127,0x0126},	{0x0126,0x0127,0x0126},
	{0x0128,0x0129,0x0049},	{0x0128,0x0129,0x0049},
	{0x012A,0x012B,0x0049},	{0x012A,0x012B,0x0049},
	{0x012C,0x012D,0x0049},	{0x012C,0x012D,0x0049},
	{0x012E,0x012F,0x0049},	{0x012E,0x012F,0x0049},
	{0x0130,0x0069,0x0049},	{0x0049,0x0131,0x0049},
	{0x0132,0x0133,0x0132},	{0x0132,0x0133,0x0132},
	{0x0134,0x0135,0x004A},	{0x0134,0x0135,0x004A},
	{0x0136,0x0137,0x004B},	{0x0136,0x0137,0x004B},
	{0x0138,0x0138,0x0138},	{0x0139,0x013A,0x004C},
	{0x0139,0x013A,0x004C},	{0x013B,0x013C,0x004C},
	{0x013B,0x013C,0x004C},	{0x013D,0x013E,0x004C},
	{0x013D,0x013E,0x004C},	{0x013F,0x0140,0x013F},
	{0x013F,0x0140,0x013F},	{0x0141,0x0142,0x0141},
	{0x0141,0x0142,0x0141},	{0x0143,0x0144,0x004E},
	{0x0143,0x0144,0x004E},	{0x0145,0x0146,0x004E},
	{0x0145,0x0146,0x004E},	{0x0147,0x0148,0x004E},
	{0x0147,0x0148,0x004E},	{0x0149,0x0149,0x0149},
	{0x014A,0x014B,0x014A},	{0x014A,0x014B,0x014A},
	{0x014C,0x014D,0x004F},	{0x014C,0x014D,0x004F},
	{0x014E,0x014F,0x004F},	{0x014E,0x014F,0x004F},
	{0x0150,0x0151,0x004F},	{0x0150,0x0151,0x004F},
	{0x0152,0x0153,0x0152},	{0x0152,0x0153,0x0152},
	{0x0154,0x0155,0x0052},	{0x0154,0x0155,0x0052},
	{0x0156,0x0157,0x0052},	{0x0156,0x0157,0x0052},
	{0x0158,0x0159,0x0052},	{0x0158,0x0159,0x0052},
	{0x015A,0x015B,0x0053},	{0x015A,0x015B,0x0053},
	{0x015C,0x015D,0x0053},	{0x015C,0x015D,0x0053},
	{0x015E,0x015F,0x0053},	{0x015E,0x015F,0x0053},
	{0x0160,0x0161,0x0053},	{0x0160,0x0161,0x0053},
	{0x0162,0x0163,0x0054},	{0x0162,0x0163,0x0054},
	{0x0164,0x0165,0x0054},	{0x0164,0x0165,0x0054},
	{0x0166,0x0167,0x0166},	{0x0166,0x0167,0x0166},
	{0x0168,0x0169,0x0055},	{0x0168,0x0169,0x0055},
	{0x016A,0x016B,0x0055},	{0x016A,0x016B,0x0055},
	{0x016C,0x016D,0x0055},	{0x016C,0x016D,0x0055},
	{0x016E,0x016F,0x0055},	{0x016E,0x016F,0x0055},
	{0x0170,0x0171,0x0055},	{0x0170,0x0171,0x0055},
	{0x0172,0x0173,0x0055},	{0x0172,0x0173,0x0055},
	{0x0174,0x0175,0x0057},	{0x0174,0x0175,0x0057},
	{0x0176,0x0177,0x0059},	{0x0176,0x0177,0x0059},
	{0x0178,0x00FF,0x0059},	{0x0179,0x017A,0x005A},
	{0x0179,0x017A,0x005A},	{0x017B,0x017C,0x005A},
	{0x017B,0x017C,0x005A},	{0x017D,0x017E,0x005A},
	{0x017D,0x017E,0x005A},	{0x0053,0x017F,0x0053},
	{0x0180,0x0180,0x0180},	{0x0181,0x0253,0x0181},
	{0x0182,0x0183,0x0182},	{0x0182,0x0183,0x0182},
	{0x0184,0x0185,0x0184},	{0x0184,0x0185,0x0184},
	{0x0186,0x0254,0x0186},	{0x0187,0x0188,0x0187},
	{0x0187,0x0188,0x0187},	{0x0189,0x0256,0x0189},
	{0x018A,0x0257,0x018A},	{0x018B,0x018C,0x018B},
	{0x018B,0x018C,0x018B},	{0x018D,0x018D,0x018D},
	{0x018E,0x01DD,0x018E},	{0x018F,0x0259,0x018F},
	{0x0190,0x025B,0x0190},	{0x0191,0x0192,0x0191},
	{0x0191,0x0192,0x0191},	{0x0193,0x0260,0x0193},
	{0x0194,0x0263,0x0194},	{0x01F6,0x0195,0x01F6},
	{0x0196,0x0269,0x0196},	{0x0197,0x0268,0x0197},
	{0x0198,0x0199,0x0198},	{0x0198,0x0199,0x0198},
	{0x019A,0x019A,0x019A},	{0x019B,0x019B,0x019B},
	{0x019C,0x026F,0x019C},	{0x019D,0x0272,0x019D},
	{0x019E,0x019E,0x019E},	{0x019F,0x0275,0x019F},
	{0x01A0,0x01A1,0x004F},	{0x01A0,0x01A1,0x004F},
	{0x01A2,0x01A3,0x01A2},	{0x01A2,0x01A3,0x01A2},
	{0x01A4,0x01A5,0x01A4},	{0x01A4,0x01A5,0x01A4},
	{0x01A6,0x0280,0x01A6},	{0x01A7,0x01A8,0x01A7},
	{0x01A7,0x01A8,0x01A7},	{0x01A9,0x0283,0x01A9},
	{0x01AA,0x01AA,0x01AA},	{0x01AB,0x01AB,0x01AB},
	{0x01AC,0x01AD,0x01AC},	{0x01AC,0x01AD,0x01AC},
	{0x01AE,0x0288,0x01AE},	{0x01AF,0x01B0,0x0055},
	{0x01AF,0x01B0,0x0055},	{0x01B1,0x028A,0x01B1},
	{0x01B2,0x028B,0x01B2},	{0x01B3,0x01B4,0x01B3},
	{0x01B3,0x01B4,0x01B3},	{0x01B5,0x01B6,0x01B5},
	{0x01B5,0x01B6,0x01B5},	{0x01B7,0x0292,0x01B7},
	{0x01B8,0x01B9,0x01B8},	{0x01B8,0x01B9,0x01B8},
	{0x01BA,0x01BA,0x01BA},	{0x01BB,0x01BB,0x01BB},
	{0x01BC,0x01BD,0x01BC},	{0x01BC,0x01BD,0x01BC},
	{0x01BE,0x01BE,0x01BE},	{0x01F7,0x01BF,0x01F7},
	{0x01C0,0x01C0,0x01C0},	{0x01C1,0x01C1,0x01C1},
	{0x01C2,0x01C2,0x01C2},	{0x01C3,0x01C3,0x01C3},
	{0x01C4,0x01C6,0x01C4},	{0x01C4,0x01C6,0x01C4},
	{0x01C4,0x01C6,0x01C4},	{0x01C7,0x01C9,0x01C7},
	{0x01C7,0x01C9,0x01C7},	{0x01C7,0x01C9,0x01C7},
	{0x01CA,0x01CC,0x01CA},	{0x01CA,0x01CC,0x01CA},
	{0x01CA,0x01CC,0x01CA},	{0x01CD,0x01CE,0x0041},
	{0x01CD,0x01CE,0x0041},	{0x01CF,0x01D0,0x0049},
	{0x01CF,0x01D0,0x0049},	{0x01D1,0x01D2,0x004F},
	{0x01D1,0x01D2,0x004F},	{0x01D3,0x01D4,0x0055},
	{0x01D3,0x01D4,0x0055},	{0x01D5,0x01D6,0x0055},
	{0x01D5,0x01D6,0x0055},	{0x01D7,0x01D8,0x0055},
	{0x01D7,0x01D8,0x0055},	{0x01D9,0x01DA,0x0055},
	{0x01D9,0x01DA,0x0055},	{0x01DB,0x01DC,0x0055},
	{0x01DB,0x01DC,0x0055},	{0x018E,0x01DD,0x018E},
	{0x01DE,0x01DF,0x0041},	{0x01DE,0x01DF,0x0041},
	{0x01E0,0x01E1,0x0041},	{0x01E0,0x01E1,0x0041},
	{0x01E2,0x01E3,0x00C6},	{0x01E2,0x01E3,0x00C6},
	{0x01E4,0x01E5,0x01E4},	{0x01E4,0x01E5,0x01E4},
	{0x01E6,0x01E7,0x0047},	{0x01E6,0x01E7,0x0047},
	{0x01E8,0x01E9,0x004B},	{0x01E8,0x01E9,0x004B},
	{0x01EA,0x01EB,0x004F},	{0x01EA,0x01EB,0x004F},
	{0x01EC,0x01ED,0x004F},	{0x01EC,0x01ED,0x004F},
	{0x01EE,0x01EF,0x01B7},	{0x01EE,0x01EF,0x01B7},
	{0x01F0,0x01F0,0x004A},	{0x01F1,0x01F3,0x01F1},
	{0x01F1,0x01F3,0x01F1},	{0x01F1,0x01F3,0x01F1},
	{0x01F4,0x01F5,0x0047},	{0x01F4,0x01F5,0x0047},
	{0x01F6,0x0195,0x01F6},	{0x01F7,0x01BF,0x01F7},
	{0x01F8,0x01F9,0x004E},	{0x01F8,0x01F9,0x004E},
	{0x01FA,0x01FB,0x0041},	{0x01FA,0x01FB,0x0041},
	{0x01FC,0x01FD,0x00C6},	{0x01FC,0x01FD,0x00C6},
	{0x01FE,0x01FF,0x00D8},	{0x01FE,0x01FF,0x00D8}
};

static MY_UNICASE_INFO plane02[]={
	{0x0200,0x0201,0x0041},	{0x0200,0x0201,0x0041},
	{0x0202,0x0203,0x0041},	{0x0202,0x0203,0x0041},
	{0x0204,0x0205,0x0045},	{0x0204,0x0205,0x0045},
	{0x0206,0x0207,0x0045},	{0x0206,0x0207,0x0045},
	{0x0208,0x0209,0x0049},	{0x0208,0x0209,0x0049},
	{0x020A,0x020B,0x0049},	{0x020A,0x020B,0x0049},
	{0x020C,0x020D,0x004F},	{0x020C,0x020D,0x004F},
	{0x020E,0x020F,0x004F},	{0x020E,0x020F,0x004F},
	{0x0210,0x0211,0x0052},	{0x0210,0x0211,0x0052},
	{0x0212,0x0213,0x0052},	{0x0212,0x0213,0x0052},
	{0x0214,0x0215,0x0055},	{0x0214,0x0215,0x0055},
	{0x0216,0x0217,0x0055},	{0x0216,0x0217,0x0055},
	{0x0218,0x0219,0x0053},	{0x0218,0x0219,0x0053},
	{0x021A,0x021B,0x0054},	{0x021A,0x021B,0x0054},
	{0x021C,0x021D,0x021C},	{0x021C,0x021D,0x021C},
	{0x021E,0x021F,0x0048},	{0x021E,0x021F,0x0048},
	{0x0220,0x0220,0x0220},	{0x0221,0x0221,0x0221},
	{0x0222,0x0223,0x0222},	{0x0222,0x0223,0x0222},
	{0x0224,0x0225,0x0224},	{0x0224,0x0225,0x0224},
	{0x0226,0x0227,0x0041},	{0x0226,0x0227,0x0041},
	{0x0228,0x0229,0x0045},	{0x0228,0x0229,0x0045},
	{0x022A,0x022B,0x004F},	{0x022A,0x022B,0x004F},
	{0x022C,0x022D,0x004F},	{0x022C,0x022D,0x004F},
	{0x022E,0x022F,0x004F},	{0x022E,0x022F,0x004F},
	{0x0230,0x0231,0x004F},	{0x0230,0x0231,0x004F},
	{0x0232,0x0233,0x0059},	{0x0232,0x0233,0x0059},
	{0x0234,0x0234,0x0234},	{0x0235,0x0235,0x0235},
	{0x0236,0x0236,0x0236},	{0x0237,0x0237,0x0237},
	{0x0238,0x0238,0x0238},	{0x0239,0x0239,0x0239},
	{0x023A,0x023A,0x023A},	{0x023B,0x023B,0x023B},
	{0x023C,0x023C,0x023C},	{0x023D,0x023D,0x023D},
	{0x023E,0x023E,0x023E},	{0x023F,0x023F,0x023F},
	{0x0240,0x0240,0x0240},	{0x0241,0x0241,0x0241},
	{0x0242,0x0242,0x0242},	{0x0243,0x0243,0x0243},
	{0x0244,0x0244,0x0244},	{0x0245,0x0245,0x0245},
	{0x0246,0x0246,0x0246},	{0x0247,0x0247,0x0247},
	{0x0248,0x0248,0x0248},	{0x0249,0x0249,0x0249},
	{0x024A,0x024A,0x024A},	{0x024B,0x024B,0x024B},
	{0x024C,0x024C,0x024C},	{0x024D,0x024D,0x024D},
	{0x024E,0x024E,0x024E},	{0x024F,0x024F,0x024F},
	{0x0250,0x0250,0x0250},	{0x0251,0x0251,0x0251},
	{0x0252,0x0252,0x0252},	{0x0181,0x0253,0x0181},
	{0x0186,0x0254,0x0186},	{0x0255,0x0255,0x0255},
	{0x0189,0x0256,0x0189},	{0x018A,0x0257,0x018A},
	{0x0258,0x0258,0x0258},	{0x018F,0x0259,0x018F},
	{0x025A,0x025A,0x025A},	{0x0190,0x025B,0x0190},
	{0x025C,0x025C,0x025C},	{0x025D,0x025D,0x025D},
	{0x025E,0x025E,0x025E},	{0x025F,0x025F,0x025F},
	{0x0193,0x0260,0x0193},	{0x0261,0x0261,0x0261},
	{0x0262,0x0262,0x0262},	{0x0194,0x0263,0x0194},
	{0x0264,0x0264,0x0264},	{0x0265,0x0265,0x0265},
	{0x0266,0x0266,0x0266},	{0x0267,0x0267,0x0267},
	{0x0197,0x0268,0x0197},	{0x0196,0x0269,0x0196},
	{0x026A,0x026A,0x026A},	{0x026B,0x026B,0x026B},
	{0x026C,0x026C,0x026C},	{0x026D,0x026D,0x026D},
	{0x026E,0x026E,0x026E},	{0x019C,0x026F,0x019C},
	{0x0270,0x0270,0x0270},	{0x0271,0x0271,0x0271},
	{0x019D,0x0272,0x019D},	{0x0273,0x0273,0x0273},
	{0x0274,0x0274,0x0274},	{0x019F,0x0275,0x019F},
	{0x0276,0x0276,0x0276},	{0x0277,0x0277,0x0277},
	{0x0278,0x0278,0x0278},	{0x0279,0x0279,0x0279},
	{0x027A,0x027A,0x027A},	{0x027B,0x027B,0x027B},
	{0x027C,0x027C,0x027C},	{0x027D,0x027D,0x027D},
	{0x027E,0x027E,0x027E},	{0x027F,0x027F,0x027F},
	{0x01A6,0x0280,0x01A6},	{0x0281,0x0281,0x0281},
	{0x0282,0x0282,0x0282},	{0x01A9,0x0283,0x01A9},
	{0x0284,0x0284,0x0284},	{0x0285,0x0285,0x0285},
	{0x0286,0x0286,0x0286},	{0x0287,0x0287,0x0287},
	{0x01AE,0x0288,0x01AE},	{0x0289,0x0289,0x0289},
	{0x01B1,0x028A,0x01B1},	{0x01B2,0x028B,0x01B2},
	{0x028C,0x028C,0x028C},	{0x028D,0x028D,0x028D},
	{0x028E,0x028E,0x028E},	{0x028F,0x028F,0x028F},
	{0x0290,0x0290,0x0290},	{0x0291,0x0291,0x0291},
	{0x01B7,0x0292,0x01B7},	{0x0293,0x0293,0x0293},
	{0x0294,0x0294,0x0294},	{0x0295,0x0295,0x0295},
	{0x0296,0x0296,0x0296},	{0x0297,0x0297,0x0297},
	{0x0298,0x0298,0x0298},	{0x0299,0x0299,0x0299},
	{0x029A,0x029A,0x029A},	{0x029B,0x029B,0x029B},
	{0x029C,0x029C,0x029C},	{0x029D,0x029D,0x029D},
	{0x029E,0x029E,0x029E},	{0x029F,0x029F,0x029F},
	{0x02A0,0x02A0,0x02A0},	{0x02A1,0x02A1,0x02A1},
	{0x02A2,0x02A2,0x02A2},	{0x02A3,0x02A3,0x02A3},
	{0x02A4,0x02A4,0x02A4},	{0x02A5,0x02A5,0x02A5},
	{0x02A6,0x02A6,0x02A6},	{0x02A7,0x02A7,0x02A7},
	{0x02A8,0x02A8,0x02A8},	{0x02A9,0x02A9,0x02A9},
	{0x02AA,0x02AA,0x02AA},	{0x02AB,0x02AB,0x02AB},
	{0x02AC,0x02AC,0x02AC},	{0x02AD,0x02AD,0x02AD},
	{0x02AE,0x02AE,0x02AE},	{0x02AF,0x02AF,0x02AF},
	{0x02B0,0x02B0,0x02B0},	{0x02B1,0x02B1,0x02B1},
	{0x02B2,0x02B2,0x02B2},	{0x02B3,0x02B3,0x02B3},
	{0x02B4,0x02B4,0x02B4},	{0x02B5,0x02B5,0x02B5},
	{0x02B6,0x02B6,0x02B6},	{0x02B7,0x02B7,0x02B7},
	{0x02B8,0x02B8,0x02B8},	{0x02B9,0x02B9,0x02B9},
	{0x02BA,0x02BA,0x02BA},	{0x02BB,0x02BB,0x02BB},
	{0x02BC,0x02BC,0x02BC},	{0x02BD,0x02BD,0x02BD},
	{0x02BE,0x02BE,0x02BE},	{0x02BF,0x02BF,0x02BF},
	{0x02C0,0x02C0,0x02C0},	{0x02C1,0x02C1,0x02C1},
	{0x02C2,0x02C2,0x02C2},	{0x02C3,0x02C3,0x02C3},
	{0x02C4,0x02C4,0x02C4},	{0x02C5,0x02C5,0x02C5},
	{0x02C6,0x02C6,0x02C6},	{0x02C7,0x02C7,0x02C7},
	{0x02C8,0x02C8,0x02C8},	{0x02C9,0x02C9,0x02C9},
	{0x02CA,0x02CA,0x02CA},	{0x02CB,0x02CB,0x02CB},
	{0x02CC,0x02CC,0x02CC},	{0x02CD,0x02CD,0x02CD},
	{0x02CE,0x02CE,0x02CE},	{0x02CF,0x02CF,0x02CF},
	{0x02D0,0x02D0,0x02D0},	{0x02D1,0x02D1,0x02D1},
	{0x02D2,0x02D2,0x02D2},	{0x02D3,0x02D3,0x02D3},
	{0x02D4,0x02D4,0x02D4},	{0x02D5,0x02D5,0x02D5},
	{0x02D6,0x02D6,0x02D6},	{0x02D7,0x02D7,0x02D7},
	{0x02D8,0x02D8,0x02D8},	{0x02D9,0x02D9,0x02D9},
	{0x02DA,0x02DA,0x02DA},	{0x02DB,0x02DB,0x02DB},
	{0x02DC,0x02DC,0x02DC},	{0x02DD,0x02DD,0x02DD},
	{0x02DE,0x02DE,0x02DE},	{0x02DF,0x02DF,0x02DF},
	{0x02E0,0x02E0,0x02E0},	{0x02E1,0x02E1,0x02E1},
	{0x02E2,0x02E2,0x02E2},	{0x02E3,0x02E3,0x02E3},
	{0x02E4,0x02E4,0x02E4},	{0x02E5,0x02E5,0x02E5},
	{0x02E6,0x02E6,0x02E6},	{0x02E7,0x02E7,0x02E7},
	{0x02E8,0x02E8,0x02E8},	{0x02E9,0x02E9,0x02E9},
	{0x02EA,0x02EA,0x02EA},	{0x02EB,0x02EB,0x02EB},
	{0x02EC,0x02EC,0x02EC},	{0x02ED,0x02ED,0x02ED},
	{0x02EE,0x02EE,0x02EE},	{0x02EF,0x02EF,0x02EF},
	{0x02F0,0x02F0,0x02F0},	{0x02F1,0x02F1,0x02F1},
	{0x02F2,0x02F2,0x02F2},	{0x02F3,0x02F3,0x02F3},
	{0x02F4,0x02F4,0x02F4},	{0x02F5,0x02F5,0x02F5},
	{0x02F6,0x02F6,0x02F6},	{0x02F7,0x02F7,0x02F7},
	{0x02F8,0x02F8,0x02F8},	{0x02F9,0x02F9,0x02F9},
	{0x02FA,0x02FA,0x02FA},	{0x02FB,0x02FB,0x02FB},
	{0x02FC,0x02FC,0x02FC},	{0x02FD,0x02FD,0x02FD},
	{0x02FE,0x02FE,0x02FE},	{0x02FF,0x02FF,0x02FF}
};

static MY_UNICASE_INFO plane03[]={
	{0x0300,0x0300,0x0300},	{0x0301,0x0301,0x0301},
	{0x0302,0x0302,0x0302},	{0x0303,0x0303,0x0303},
	{0x0304,0x0304,0x0304},	{0x0305,0x0305,0x0305},
	{0x0306,0x0306,0x0306},	{0x0307,0x0307,0x0307},
	{0x0308,0x0308,0x0308},	{0x0309,0x0309,0x0309},
	{0x030A,0x030A,0x030A},	{0x030B,0x030B,0x030B},
	{0x030C,0x030C,0x030C},	{0x030D,0x030D,0x030D},
	{0x030E,0x030E,0x030E},	{0x030F,0x030F,0x030F},
	{0x0310,0x0310,0x0310},	{0x0311,0x0311,0x0311},
	{0x0312,0x0312,0x0312},	{0x0313,0x0313,0x0313},
	{0x0314,0x0314,0x0314},	{0x0315,0x0315,0x0315},
	{0x0316,0x0316,0x0316},	{0x0317,0x0317,0x0317},
	{0x0318,0x0318,0x0318},	{0x0319,0x0319,0x0319},
	{0x031A,0x031A,0x031A},	{0x031B,0x031B,0x031B},
	{0x031C,0x031C,0x031C},	{0x031D,0x031D,0x031D},
	{0x031E,0x031E,0x031E},	{0x031F,0x031F,0x031F},
	{0x0320,0x0320,0x0320},	{0x0321,0x0321,0x0321},
	{0x0322,0x0322,0x0322},	{0x0323,0x0323,0x0323},
	{0x0324,0x0324,0x0324},	{0x0325,0x0325,0x0325},
	{0x0326,0x0326,0x0326},	{0x0327,0x0327,0x0327},
	{0x0328,0x0328,0x0328},	{0x0329,0x0329,0x0329},
	{0x032A,0x032A,0x032A},	{0x032B,0x032B,0x032B},
	{0x032C,0x032C,0x032C},	{0x032D,0x032D,0x032D},
	{0x032E,0x032E,0x032E},	{0x032F,0x032F,0x032F},
	{0x0330,0x0330,0x0330},	{0x0331,0x0331,0x0331},
	{0x0332,0x0332,0x0332},	{0x0333,0x0333,0x0333},
	{0x0334,0x0334,0x0334},	{0x0335,0x0335,0x0335},
	{0x0336,0x0336,0x0336},	{0x0337,0x0337,0x0337},
	{0x0338,0x0338,0x0338},	{0x0339,0x0339,0x0339},
	{0x033A,0x033A,0x033A},	{0x033B,0x033B,0x033B},
	{0x033C,0x033C,0x033C},	{0x033D,0x033D,0x033D},
	{0x033E,0x033E,0x033E},	{0x033F,0x033F,0x033F},
	{0x0340,0x0340,0x0340},	{0x0341,0x0341,0x0341},
	{0x0342,0x0342,0x0342},	{0x0343,0x0343,0x0343},
	{0x0344,0x0344,0x0344},	{0x0399,0x0345,0x0399},
	{0x0346,0x0346,0x0346},	{0x0347,0x0347,0x0347},
	{0x0348,0x0348,0x0348},	{0x0349,0x0349,0x0349},
	{0x034A,0x034A,0x034A},	{0x034B,0x034B,0x034B},
	{0x034C,0x034C,0x034C},	{0x034D,0x034D,0x034D},
	{0x034E,0x034E,0x034E},	{0x034F,0x034F,0x034F},
	{0x0350,0x0350,0x0350},	{0x0351,0x0351,0x0351},
	{0x0352,0x0352,0x0352},	{0x0353,0x0353,0x0353},
	{0x0354,0x0354,0x0354},	{0x0355,0x0355,0x0355},
	{0x0356,0x0356,0x0356},	{0x0357,0x0357,0x0357},
	{0x0358,0x0358,0x0358},	{0x0359,0x0359,0x0359},
	{0x035A,0x035A,0x035A},	{0x035B,0x035B,0x035B},
	{0x035C,0x035C,0x035C},	{0x035D,0x035D,0x035D},
	{0x035E,0x035E,0x035E},	{0x035F,0x035F,0x035F},
	{0x0360,0x0360,0x0360},	{0x0361,0x0361,0x0361},
	{0x0362,0x0362,0x0362},	{0x0363,0x0363,0x0363},
	{0x0364,0x0364,0x0364},	{0x0365,0x0365,0x0365},
	{0x0366,0x0366,0x0366},	{0x0367,0x0367,0x0367},
	{0x0368,0x0368,0x0368},	{0x0369,0x0369,0x0369},
	{0x036A,0x036A,0x036A},	{0x036B,0x036B,0x036B},
	{0x036C,0x036C,0x036C},	{0x036D,0x036D,0x036D},
	{0x036E,0x036E,0x036E},	{0x036F,0x036F,0x036F},
	{0x0370,0x0370,0x0370},	{0x0371,0x0371,0x0371},
	{0x0372,0x0372,0x0372},	{0x0373,0x0373,0x0373},
	{0x0374,0x0374,0x0374},	{0x0375,0x0375,0x0375},
	{0x0376,0x0376,0x0376},	{0x0377,0x0377,0x0377},
	{0x0378,0x0378,0x0378},	{0x0379,0x0379,0x0379},
	{0x037A,0x037A,0x037A},	{0x037B,0x037B,0x037B},
	{0x037C,0x037C,0x037C},	{0x037D,0x037D,0x037D},
	{0x037E,0x037E,0x037E},	{0x037F,0x037F,0x037F},
	{0x0380,0x0380,0x0380},	{0x0381,0x0381,0x0381},
	{0x0382,0x0382,0x0382},	{0x0383,0x0383,0x0383},
	{0x0384,0x0384,0x0384},	{0x0385,0x0385,0x0385},
	{0x0386,0x03AC,0x0391},	{0x0387,0x0387,0x0387},
	{0x0388,0x03AD,0x0395},	{0x0389,0x03AE,0x0397},
	{0x038A,0x03AF,0x0399},	{0x038B,0x038B,0x038B},
	{0x038C,0x03CC,0x039F},	{0x038D,0x038D,0x038D},
	{0x038E,0x03CD,0x03A5},	{0x038F,0x03CE,0x03A9},
	{0x0390,0x0390,0x0399},	{0x0391,0x03B1,0x0391},
	{0x0392,0x03B2,0x0392},	{0x0393,0x03B3,0x0393},
	{0x0394,0x03B4,0x0394},	{0x0395,0x03B5,0x0395},
	{0x0396,0x03B6,0x0396},	{0x0397,0x03B7,0x0397},
	{0x0398,0x03B8,0x0398},	{0x0399,0x03B9,0x0399},
	{0x039A,0x03BA,0x039A},	{0x039B,0x03BB,0x039B},
	{0x039C,0x03BC,0x039C},	{0x039D,0x03BD,0x039D},
	{0x039E,0x03BE,0x039E},	{0x039F,0x03BF,0x039F},
	{0x03A0,0x03C0,0x03A0},	{0x03A1,0x03C1,0x03A1},
	{0x03A2,0x03A2,0x03A2},	{0x03A3,0x03C3,0x03A3},
	{0x03A4,0x03C4,0x03A4},	{0x03A5,0x03C5,0x03A5},
	{0x03A6,0x03C6,0x03A6},	{0x03A7,0x03C7,0x03A7},
	{0x03A8,0x03C8,0x03A8},	{0x03A9,0x03C9,0x03A9},
	{0x03AA,0x03CA,0x0399},	{0x03AB,0x03CB,0x03A5},
	{0x0386,0x03AC,0x0391},	{0x0388,0x03AD,0x0395},
	{0x0389,0x03AE,0x0397},	{0x038A,0x03AF,0x0399},
	{0x03B0,0x03B0,0x03A5},	{0x0391,0x03B1,0x0391},
	{0x0392,0x03B2,0x0392},	{0x0393,0x03B3,0x0393},
	{0x0394,0x03B4,0x0394},	{0x0395,0x03B5,0x0395},
	{0x0396,0x03B6,0x0396},	{0x0397,0x03B7,0x0397},
	{0x0398,0x03B8,0x0398},	{0x0399,0x03B9,0x0399},
	{0x039A,0x03BA,0x039A},	{0x039B,0x03BB,0x039B},
	{0x039C,0x03BC,0x039C},	{0x039D,0x03BD,0x039D},
	{0x039E,0x03BE,0x039E},	{0x039F,0x03BF,0x039F},
	{0x03A0,0x03C0,0x03A0},	{0x03A1,0x03C1,0x03A1},
	{0x03A3,0x03C2,0x03A3},	{0x03A3,0x03C3,0x03A3},
	{0x03A4,0x03C4,0x03A4},	{0x03A5,0x03C5,0x03A5},
	{0x03A6,0x03C6,0x03A6},	{0x03A7,0x03C7,0x03A7},
	{0x03A8,0x03C8,0x03A8},	{0x03A9,0x03C9,0x03A9},
	{0x03AA,0x03CA,0x0399},	{0x03AB,0x03CB,0x03A5},
	{0x038C,0x03CC,0x039F},	{0x038E,0x03CD,0x03A5},
	{0x038F,0x03CE,0x03A9},	{0x03CF,0x03CF,0x03CF},
	{0x0392,0x03D0,0x0392},	{0x0398,0x03D1,0x0398},
	{0x03D2,0x03D2,0x03D2},	{0x03D3,0x03D3,0x03D2},
	{0x03D4,0x03D4,0x03D2},	{0x03A6,0x03D5,0x03A6},
	{0x03A0,0x03D6,0x03A0},	{0x03D7,0x03D7,0x03D7},
	{0x03D8,0x03D8,0x03D8},	{0x03D9,0x03D9,0x03D9},
	{0x03DA,0x03DB,0x03DA},	{0x03DA,0x03DB,0x03DA},
	{0x03DC,0x03DD,0x03DC},	{0x03DC,0x03DD,0x03DC},
	{0x03DE,0x03DF,0x03DE},	{0x03DE,0x03DF,0x03DE},
	{0x03E0,0x03E1,0x03E0},	{0x03E0,0x03E1,0x03E0},
	{0x03E2,0x03E3,0x03E2},	{0x03E2,0x03E3,0x03E2},
	{0x03E4,0x03E5,0x03E4},	{0x03E4,0x03E5,0x03E4},
	{0x03E6,0x03E7,0x03E6},	{0x03E6,0x03E7,0x03E6},
	{0x03E8,0x03E9,0x03E8},	{0x03E8,0x03E9,0x03E8},
	{0x03EA,0x03EB,0x03EA},	{0x03EA,0x03EB,0x03EA},
	{0x03EC,0x03ED,0x03EC},	{0x03EC,0x03ED,0x03EC},
	{0x03EE,0x03EF,0x03EE},	{0x03EE,0x03EF,0x03EE},
	{0x039A,0x03F0,0x039A},	{0x03A1,0x03F1,0x03A1},
	{0x03A3,0x03F2,0x03A3},	{0x03F3,0x03F3,0x03F3},
	{0x03F4,0x03F4,0x03F4},	{0x03F5,0x03F5,0x03F5},
	{0x03F6,0x03F6,0x03F6},	{0x03F7,0x03F7,0x03F7},
	{0x03F8,0x03F8,0x03F8},	{0x03F9,0x03F9,0x03F9},
	{0x03FA,0x03FA,0x03FA},	{0x03FB,0x03FB,0x03FB},
	{0x03FC,0x03FC,0x03FC},	{0x03FD,0x03FD,0x03FD},
	{0x03FE,0x03FE,0x03FE},	{0x03FF,0x03FF,0x03FF}
};

static MY_UNICASE_INFO plane04[]={
	{0x0400,0x0450,0x0415},	{0x0401,0x0451,0x0415},
	{0x0402,0x0452,0x0402},	{0x0403,0x0453,0x0413},
	{0x0404,0x0454,0x0404},	{0x0405,0x0455,0x0405},
	{0x0406,0x0456,0x0406},	{0x0407,0x0457,0x0406},
	{0x0408,0x0458,0x0408},	{0x0409,0x0459,0x0409},
	{0x040A,0x045A,0x040A},	{0x040B,0x045B,0x040B},
	{0x040C,0x045C,0x041A},	{0x040D,0x045D,0x0418},
	{0x040E,0x045E,0x0423},	{0x040F,0x045F,0x040F},
	{0x0410,0x0430,0x0410},	{0x0411,0x0431,0x0411},
	{0x0412,0x0432,0x0412},	{0x0413,0x0433,0x0413},
	{0x0414,0x0434,0x0414},	{0x0415,0x0435,0x0415},
	{0x0416,0x0436,0x0416},	{0x0417,0x0437,0x0417},
	{0x0418,0x0438,0x0418},	{0x0419,0x0439,0x0419},
	{0x041A,0x043A,0x041A},	{0x041B,0x043B,0x041B},
	{0x041C,0x043C,0x041C},	{0x041D,0x043D,0x041D},
	{0x041E,0x043E,0x041E},	{0x041F,0x043F,0x041F},
	{0x0420,0x0440,0x0420},	{0x0421,0x0441,0x0421},
	{0x0422,0x0442,0x0422},	{0x0423,0x0443,0x0423},
	{0x0424,0x0444,0x0424},	{0x0425,0x0445,0x0425},
	{0x0426,0x0446,0x0426},	{0x0427,0x0447,0x0427},
	{0x0428,0x0448,0x0428},	{0x0429,0x0449,0x0429},
	{0x042A,0x044A,0x042A},	{0x042B,0x044B,0x042B},
	{0x042C,0x044C,0x042C},	{0x042D,0x044D,0x042D},
	{0x042E,0x044E,0x042E},	{0x042F,0x044F,0x042F},
	{0x0410,0x0430,0x0410},	{0x0411,0x0431,0x0411},
	{0x0412,0x0432,0x0412},	{0x0413,0x0433,0x0413},
	{0x0414,0x0434,0x0414},	{0x0415,0x0435,0x0415},
	{0x0416,0x0436,0x0416},	{0x0417,0x0437,0x0417},
	{0x0418,0x0438,0x0418},	{0x0419,0x0439,0x0419},
	{0x041A,0x043A,0x041A},	{0x041B,0x043B,0x041B},
	{0x041C,0x043C,0x041C},	{0x041D,0x043D,0x041D},
	{0x041E,0x043E,0x041E},	{0x041F,0x043F,0x041F},
	{0x0420,0x0440,0x0420},	{0x0421,0x0441,0x0421},
	{0x0422,0x0442,0x0422},	{0x0423,0x0443,0x0423},
	{0x0424,0x0444,0x0424},	{0x0425,0x0445,0x0425},
	{0x0426,0x0446,0x0426},	{0x0427,0x0447,0x0427},
	{0x0428,0x0448,0x0428},	{0x0429,0x0449,0x0429},
	{0x042A,0x044A,0x042A},	{0x042B,0x044B,0x042B},
	{0x042C,0x044C,0x042C},	{0x042D,0x044D,0x042D},
	{0x042E,0x044E,0x042E},	{0x042F,0x044F,0x042F},
	{0x0400,0x0450,0x0415},	{0x0401,0x0451,0x0415},
	{0x0402,0x0452,0x0402},	{0x0403,0x0453,0x0413},
	{0x0404,0x0454,0x0404},	{0x0405,0x0455,0x0405},
	{0x0406,0x0456,0x0406},	{0x0407,0x0457,0x0406},
	{0x0408,0x0458,0x0408},	{0x0409,0x0459,0x0409},
	{0x040A,0x045A,0x040A},	{0x040B,0x045B,0x040B},
	{0x040C,0x045C,0x041A},	{0x040D,0x045D,0x0418},
	{0x040E,0x045E,0x0423},	{0x040F,0x045F,0x040F},
	{0x0460,0x0461,0x0460},	{0x0460,0x0461,0x0460},
	{0x0462,0x0463,0x0462},	{0x0462,0x0463,0x0462},
	{0x0464,0x0465,0x0464},	{0x0464,0x0465,0x0464},
	{0x0466,0x0467,0x0466},	{0x0466,0x0467,0x0466},
	{0x0468,0x0469,0x0468},	{0x0468,0x0469,0x0468},
	{0x046A,0x046B,0x046A},	{0x046A,0x046B,0x046A},
	{0x046C,0x046D,0x046C},	{0x046C,0x046D,0x046C},
	{0x046E,0x046F,0x046E},	{0x046E,0x046F,0x046E},
	{0x0470,0x0471,0x0470},	{0x0470,0x0471,0x0470},
	{0x0472,0x0473,0x0472},	{0x0472,0x0473,0x0472},
	{0x0474,0x0475,0x0474},	{0x0474,0x0475,0x0474},
	{0x0476,0x0477,0x0474},	{0x0476,0x0477,0x0474},
	{0x0478,0x0479,0x0478},	{0x0478,0x0479,0x0478},
	{0x047A,0x047B,0x047A},	{0x047A,0x047B,0x047A},
	{0x047C,0x047D,0x047C},	{0x047C,0x047D,0x047C},
	{0x047E,0x047F,0x047E},	{0x047E,0x047F,0x047E},
	{0x0480,0x0481,0x0480},	{0x0480,0x0481,0x0480},
	{0x0482,0x0482,0x0482},	{0x0483,0x0483,0x0483},
	{0x0484,0x0484,0x0484},	{0x0485,0x0485,0x0485},
	{0x0486,0x0486,0x0486},	{0x0487,0x0487,0x0487},
	{0x0488,0x0488,0x0488},	{0x0489,0x0489,0x0489},
	{0x048A,0x048A,0x048A},	{0x048B,0x048B,0x048B},
	{0x048C,0x048D,0x048C},	{0x048C,0x048D,0x048C},
	{0x048E,0x048F,0x048E},	{0x048E,0x048F,0x048E},
	{0x0490,0x0491,0x0490},	{0x0490,0x0491,0x0490},
	{0x0492,0x0493,0x0492},	{0x0492,0x0493,0x0492},
	{0x0494,0x0495,0x0494},	{0x0494,0x0495,0x0494},
	{0x0496,0x0497,0x0496},	{0x0496,0x0497,0x0496},
	{0x0498,0x0499,0x0498},	{0x0498,0x0499,0x0498},
	{0x049A,0x049B,0x049A},	{0x049A,0x049B,0x049A},
	{0x049C,0x049D,0x049C},	{0x049C,0x049D,0x049C},
	{0x049E,0x049F,0x049E},	{0x049E,0x049F,0x049E},
	{0x04A0,0x04A1,0x04A0},	{0x04A0,0x04A1,0x04A0},
	{0x04A2,0x04A3,0x04A2},	{0x04A2,0x04A3,0x04A2},
	{0x04A4,0x04A5,0x04A4},	{0x04A4,0x04A5,0x04A4},
	{0x04A6,0x04A7,0x04A6},	{0x04A6,0x04A7,0x04A6},
	{0x04A8,0x04A9,0x04A8},	{0x04A8,0x04A9,0x04A8},
	{0x04AA,0x04AB,0x04AA},	{0x04AA,0x04AB,0x04AA},
	{0x04AC,0x04AD,0x04AC},	{0x04AC,0x04AD,0x04AC},
	{0x04AE,0x04AF,0x04AE},	{0x04AE,0x04AF,0x04AE},
	{0x04B0,0x04B1,0x04B0},	{0x04B0,0x04B1,0x04B0},
	{0x04B2,0x04B3,0x04B2},	{0x04B2,0x04B3,0x04B2},
	{0x04B4,0x04B5,0x04B4},	{0x04B4,0x04B5,0x04B4},
	{0x04B6,0x04B7,0x04B6},	{0x04B6,0x04B7,0x04B6},
	{0x04B8,0x04B9,0x04B8},	{0x04B8,0x04B9,0x04B8},
	{0x04BA,0x04BB,0x04BA},	{0x04BA,0x04BB,0x04BA},
	{0x04BC,0x04BD,0x04BC},	{0x04BC,0x04BD,0x04BC},
	{0x04BE,0x04BF,0x04BE},	{0x04BE,0x04BF,0x04BE},
	{0x04C0,0x04C0,0x04C0},	{0x04C1,0x04C2,0x0416},
	{0x04C1,0x04C2,0x0416},	{0x04C3,0x04C4,0x04C3},
	{0x04C3,0x04C4,0x04C3},	{0x04C5,0x04C5,0x04C5},
	{0x04C6,0x04C6,0x04C6},	{0x04C7,0x04C8,0x04C7},
	{0x04C7,0x04C8,0x04C7},	{0x04C9,0x04C9,0x04C9},
	{0x04CA,0x04CA,0x04CA},	{0x04CB,0x04CC,0x04CB},
	{0x04CB,0x04CC,0x04CB},	{0x04CD,0x04CD,0x04CD},
	{0x04CE,0x04CE,0x04CE},	{0x04CF,0x04CF,0x04CF},
	{0x04D0,0x04D1,0x0410},	{0x04D0,0x04D1,0x0410},
	{0x04D2,0x04D3,0x0410},	{0x04D2,0x04D3,0x0410},
	{0x04D4,0x04D5,0x04D4},	{0x04D4,0x04D5,0x04D4},
	{0x04D6,0x04D7,0x0415},	{0x04D6,0x04D7,0x0415},
	{0x04D8,0x04D9,0x04D8},	{0x04D8,0x04D9,0x04D8},
	{0x04DA,0x04DB,0x04D8},	{0x04DA,0x04DB,0x04D8},
	{0x04DC,0x04DD,0x0416},	{0x04DC,0x04DD,0x0416},
	{0x04DE,0x04DF,0x0417},	{0x04DE,0x04DF,0x0417},
	{0x04E0,0x04E1,0x04E0},	{0x04E0,0x04E1,0x04E0},
	{0x04E2,0x04E3,0x0418},	{0x04E2,0x04E3,0x0418},
	{0x04E4,0x04E5,0x0418},	{0x04E4,0x04E5,0x0418},
	{0x04E6,0x04E7,0x041E},	{0x04E6,0x04E7,0x041E},
	{0x04E8,0x04E9,0x04E8},	{0x04E8,0x04E9,0x04E8},
	{0x04EA,0x04EB,0x04E8},	{0x04EA,0x04EB,0x04E8},
	{0x04EC,0x04ED,0x042D},	{0x04EC,0x04ED,0x042D},
	{0x04EE,0x04EF,0x0423},	{0x04EE,0x04EF,0x0423},
	{0x04F0,0x04F1,0x0423},	{0x04F0,0x04F1,0x0423},
	{0x04F2,0x04F3,0x0423},	{0x04F2,0x04F3,0x0423},
	{0x04F4,0x04F5,0x0427},	{0x04F4,0x04F5,0x0427},
	{0x04F6,0x04F6,0x04F6},	{0x04F7,0x04F7,0x04F7},
	{0x04F8,0x04F9,0x042B},	{0x04F8,0x04F9,0x042B},
	{0x04FA,0x04FA,0x04FA},	{0x04FB,0x04FB,0x04FB},
	{0x04FC,0x04FC,0x04FC},	{0x04FD,0x04FD,0x04FD},
	{0x04FE,0x04FE,0x04FE},	{0x04FF,0x04FF,0x04FF}
};

static MY_UNICASE_INFO plane05[]={
	{0x0500,0x0500,0x0500},	{0x0501,0x0501,0x0501},
	{0x0502,0x0502,0x0502},	{0x0503,0x0503,0x0503},
	{0x0504,0x0504,0x0504},	{0x0505,0x0505,0x0505},
	{0x0506,0x0506,0x0506},	{0x0507,0x0507,0x0507},
	{0x0508,0x0508,0x0508},	{0x0509,0x0509,0x0509},
	{0x050A,0x050A,0x050A},	{0x050B,0x050B,0x050B},
	{0x050C,0x050C,0x050C},	{0x050D,0x050D,0x050D},
	{0x050E,0x050E,0x050E},	{0x050F,0x050F,0x050F},
	{0x0510,0x0510,0x0510},	{0x0511,0x0511,0x0511},
	{0x0512,0x0512,0x0512},	{0x0513,0x0513,0x0513},
	{0x0514,0x0514,0x0514},	{0x0515,0x0515,0x0515},
	{0x0516,0x0516,0x0516},	{0x0517,0x0517,0x0517},
	{0x0518,0x0518,0x0518},	{0x0519,0x0519,0x0519},
	{0x051A,0x051A,0x051A},	{0x051B,0x051B,0x051B},
	{0x051C,0x051C,0x051C},	{0x051D,0x051D,0x051D},
	{0x051E,0x051E,0x051E},	{0x051F,0x051F,0x051F},
	{0x0520,0x0520,0x0520},	{0x0521,0x0521,0x0521},
	{0x0522,0x0522,0x0522},	{0x0523,0x0523,0x0523},
	{0x0524,0x0524,0x0524},	{0x0525,0x0525,0x0525},
	{0x0526,0x0526,0x0526},	{0x0527,0x0527,0x0527},
	{0x0528,0x0528,0x0528},	{0x0529,0x0529,0x0529},
	{0x052A,0x052A,0x052A},	{0x052B,0x052B,0x052B},
	{0x052C,0x052C,0x052C},	{0x052D,0x052D,0x052D},
	{0x052E,0x052E,0x052E},	{0x052F,0x052F,0x052F},
	{0x0530,0x0530,0x0530},	{0x0531,0x0561,0x0531},
	{0x0532,0x0562,0x0532},	{0x0533,0x0563,0x0533},
	{0x0534,0x0564,0x0534},	{0x0535,0x0565,0x0535},
	{0x0536,0x0566,0x0536},	{0x0537,0x0567,0x0537},
	{0x0538,0x0568,0x0538},	{0x0539,0x0569,0x0539},
	{0x053A,0x056A,0x053A},	{0x053B,0x056B,0x053B},
	{0x053C,0x056C,0x053C},	{0x053D,0x056D,0x053D},
	{0x053E,0x056E,0x053E},	{0x053F,0x056F,0x053F},
	{0x0540,0x0570,0x0540},	{0x0541,0x0571,0x0541},
	{0x0542,0x0572,0x0542},	{0x0543,0x0573,0x0543},
	{0x0544,0x0574,0x0544},	{0x0545,0x0575,0x0545},
	{0x0546,0x0576,0x0546},	{0x0547,0x0577,0x0547},
	{0x0548,0x0578,0x0548},	{0x0549,0x0579,0x0549},
	{0x054A,0x057A,0x054A},	{0x054B,0x057B,0x054B},
	{0x054C,0x057C,0x054C},	{0x054D,0x057D,0x054D},
	{0x054E,0x057E,0x054E},	{0x054F,0x057F,0x054F},
	{0x0550,0x0580,0x0550},	{0x0551,0x0581,0x0551},
	{0x0552,0x0582,0x0552},	{0x0553,0x0583,0x0553},
	{0x0554,0x0584,0x0554},	{0x0555,0x0585,0x0555},
	{0x0556,0x0586,0x0556},	{0x0557,0x0557,0x0557},
	{0x0558,0x0558,0x0558},	{0x0559,0x0559,0x0559},
	{0x055A,0x055A,0x055A},	{0x055B,0x055B,0x055B},
	{0x055C,0x055C,0x055C},	{0x055D,0x055D,0x055D},
	{0x055E,0x055E,0x055E},	{0x055F,0x055F,0x055F},
	{0x0560,0x0560,0x0560},	{0x0531,0x0561,0x0531},
	{0x0532,0x0562,0x0532},	{0x0533,0x0563,0x0533},
	{0x0534,0x0564,0x0534},	{0x0535,0x0565,0x0535},
	{0x0536,0x0566,0x0536},	{0x0537,0x0567,0x0537},
	{0x0538,0x0568,0x0538},	{0x0539,0x0569,0x0539},
	{0x053A,0x056A,0x053A},	{0x053B,0x056B,0x053B},
	{0x053C,0x056C,0x053C},	{0x053D,0x056D,0x053D},
	{0x053E,0x056E,0x053E},	{0x053F,0x056F,0x053F},
	{0x0540,0x0570,0x0540},	{0x0541,0x0571,0x0541},
	{0x0542,0x0572,0x0542},	{0x0543,0x0573,0x0543},
	{0x0544,0x0574,0x0544},	{0x0545,0x0575,0x0545},
	{0x0546,0x0576,0x0546},	{0x0547,0x0577,0x0547},
	{0x0548,0x0578,0x0548},	{0x0549,0x0579,0x0549},
	{0x054A,0x057A,0x054A},	{0x054B,0x057B,0x054B},
	{0x054C,0x057C,0x054C},	{0x054D,0x057D,0x054D},
	{0x054E,0x057E,0x054E},	{0x054F,0x057F,0x054F},
	{0x0550,0x0580,0x0550},	{0x0551,0x0581,0x0551},
	{0x0552,0x0582,0x0552},	{0x0553,0x0583,0x0553},
	{0x0554,0x0584,0x0554},	{0x0555,0x0585,0x0555},
	{0x0556,0x0586,0x0556},	{0x0587,0x0587,0x0587},
	{0x0588,0x0588,0x0588},	{0x0589,0x0589,0x0589},
	{0x058A,0x058A,0x058A},	{0x058B,0x058B,0x058B},
	{0x058C,0x058C,0x058C},	{0x058D,0x058D,0x058D},
	{0x058E,0x058E,0x058E},	{0x058F,0x058F,0x058F},
	{0x0590,0x0590,0x0590},	{0x0591,0x0591,0x0591},
	{0x0592,0x0592,0x0592},	{0x0593,0x0593,0x0593},
	{0x0594,0x0594,0x0594},	{0x0595,0x0595,0x0595},
	{0x0596,0x0596,0x0596},	{0x0597,0x0597,0x0597},
	{0x0598,0x0598,0x0598},	{0x0599,0x0599,0x0599},
	{0x059A,0x059A,0x059A},	{0x059B,0x059B,0x059B},
	{0x059C,0x059C,0x059C},	{0x059D,0x059D,0x059D},
	{0x059E,0x059E,0x059E},	{0x059F,0x059F,0x059F},
	{0x05A0,0x05A0,0x05A0},	{0x05A1,0x05A1,0x05A1},
	{0x05A2,0x05A2,0x05A2},	{0x05A3,0x05A3,0x05A3},
	{0x05A4,0x05A4,0x05A4},	{0x05A5,0x05A5,0x05A5},
	{0x05A6,0x05A6,0x05A6},	{0x05A7,0x05A7,0x05A7},
	{0x05A8,0x05A8,0x05A8},	{0x05A9,0x05A9,0x05A9},
	{0x05AA,0x05AA,0x05AA},	{0x05AB,0x05AB,0x05AB},
	{0x05AC,0x05AC,0x05AC},	{0x05AD,0x05AD,0x05AD},
	{0x05AE,0x05AE,0x05AE},	{0x05AF,0x05AF,0x05AF},
	{0x05B0,0x05B0,0x05B0},	{0x05B1,0x05B1,0x05B1},
	{0x05B2,0x05B2,0x05B2},	{0x05B3,0x05B3,0x05B3},
	{0x05B4,0x05B4,0x05B4},	{0x05B5,0x05B5,0x05B5},
	{0x05B6,0x05B6,0x05B6},	{0x05B7,0x05B7,0x05B7},
	{0x05B8,0x05B8,0x05B8},	{0x05B9,0x05B9,0x05B9},
	{0x05BA,0x05BA,0x05BA},	{0x05BB,0x05BB,0x05BB},
	{0x05BC,0x05BC,0x05BC},	{0x05BD,0x05BD,0x05BD},
	{0x05BE,0x05BE,0x05BE},	{0x05BF,0x05BF,0x05BF},
	{0x05C0,0x05C0,0x05C0},	{0x05C1,0x05C1,0x05C1},
	{0x05C2,0x05C2,0x05C2},	{0x05C3,0x05C3,0x05C3},
	{0x05C4,0x05C4,0x05C4},	{0x05C5,0x05C5,0x05C5},
	{0x05C6,0x05C6,0x05C6},	{0x05C7,0x05C7,0x05C7},
	{0x05C8,0x05C8,0x05C8},	{0x05C9,0x05C9,0x05C9},
	{0x05CA,0x05CA,0x05CA},	{0x05CB,0x05CB,0x05CB},
	{0x05CC,0x05CC,0x05CC},	{0x05CD,0x05CD,0x05CD},
	{0x05CE,0x05CE,0x05CE},	{0x05CF,0x05CF,0x05CF},
	{0x05D0,0x05D0,0x05D0},	{0x05D1,0x05D1,0x05D1},
	{0x05D2,0x05D2,0x05D2},	{0x05D3,0x05D3,0x05D3},
	{0x05D4,0x05D4,0x05D4},	{0x05D5,0x05D5,0x05D5},
	{0x05D6,0x05D6,0x05D6},	{0x05D7,0x05D7,0x05D7},
	{0x05D8,0x05D8,0x05D8},	{0x05D9,0x05D9,0x05D9},
	{0x05DA,0x05DA,0x05DA},	{0x05DB,0x05DB,0x05DB},
	{0x05DC,0x05DC,0x05DC},	{0x05DD,0x05DD,0x05DD},
	{0x05DE,0x05DE,0x05DE},	{0x05DF,0x05DF,0x05DF},
	{0x05E0,0x05E0,0x05E0},	{0x05E1,0x05E1,0x05E1},
	{0x05E2,0x05E2,0x05E2},	{0x05E3,0x05E3,0x05E3},
	{0x05E4,0x05E4,0x05E4},	{0x05E5,0x05E5,0x05E5},
	{0x05E6,0x05E6,0x05E6},	{0x05E7,0x05E7,0x05E7},
	{0x05E8,0x05E8,0x05E8},	{0x05E9,0x05E9,0x05E9},
	{0x05EA,0x05EA,0x05EA},	{0x05EB,0x05EB,0x05EB},
	{0x05EC,0x05EC,0x05EC},	{0x05ED,0x05ED,0x05ED},
	{0x05EE,0x05EE,0x05EE},	{0x05EF,0x05EF,0x05EF},
	{0x05F0,0x05F0,0x05F0},	{0x05F1,0x05F1,0x05F1},
	{0x05F2,0x05F2,0x05F2},	{0x05F3,0x05F3,0x05F3},
	{0x05F4,0x05F4,0x05F4},	{0x05F5,0x05F5,0x05F5},
	{0x05F6,0x05F6,0x05F6},	{0x05F7,0x05F7,0x05F7},
	{0x05F8,0x05F8,0x05F8},	{0x05F9,0x05F9,0x05F9},
	{0x05FA,0x05FA,0x05FA},	{0x05FB,0x05FB,0x05FB},
	{0x05FC,0x05FC,0x05FC},	{0x05FD,0x05FD,0x05FD},
	{0x05FE,0x05FE,0x05FE},	{0x05FF,0x05FF,0x05FF}
};

static MY_UNICASE_INFO plane1E[]={
	{0x1E00,0x1E01,0x0041},	{0x1E00,0x1E01,0x0041},
	{0x1E02,0x1E03,0x0042},	{0x1E02,0x1E03,0x0042},
	{0x1E04,0x1E05,0x0042},	{0x1E04,0x1E05,0x0042},
	{0x1E06,0x1E07,0x0042},	{0x1E06,0x1E07,0x0042},
	{0x1E08,0x1E09,0x0043},	{0x1E08,0x1E09,0x0043},
	{0x1E0A,0x1E0B,0x0044},	{0x1E0A,0x1E0B,0x0044},
	{0x1E0C,0x1E0D,0x0044},	{0x1E0C,0x1E0D,0x0044},
	{0x1E0E,0x1E0F,0x0044},	{0x1E0E,0x1E0F,0x0044},
	{0x1E10,0x1E11,0x0044},	{0x1E10,0x1E11,0x0044},
	{0x1E12,0x1E13,0x0044},	{0x1E12,0x1E13,0x0044},
	{0x1E14,0x1E15,0x0045},	{0x1E14,0x1E15,0x0045},
	{0x1E16,0x1E17,0x0045},	{0x1E16,0x1E17,0x0045},
	{0x1E18,0x1E19,0x0045},	{0x1E18,0x1E19,0x0045},
	{0x1E1A,0x1E1B,0x0045},	{0x1E1A,0x1E1B,0x0045},
	{0x1E1C,0x1E1D,0x0045},	{0x1E1C,0x1E1D,0x0045},
	{0x1E1E,0x1E1F,0x0046},	{0x1E1E,0x1E1F,0x0046},
	{0x1E20,0x1E21,0x0047},	{0x1E20,0x1E21,0x0047},
	{0x1E22,0x1E23,0x0048},	{0x1E22,0x1E23,0x0048},
	{0x1E24,0x1E25,0x0048},	{0x1E24,0x1E25,0x0048},
	{0x1E26,0x1E27,0x0048},	{0x1E26,0x1E27,0x0048},
	{0x1E28,0x1E29,0x0048},	{0x1E28,0x1E29,0x0048},
	{0x1E2A,0x1E2B,0x0048},	{0x1E2A,0x1E2B,0x0048},
	{0x1E2C,0x1E2D,0x0049},	{0x1E2C,0x1E2D,0x0049},
	{0x1E2E,0x1E2F,0x0049},	{0x1E2E,0x1E2F,0x0049},
	{0x1E30,0x1E31,0x004B},	{0x1E30,0x1E31,0x004B},
	{0x1E32,0x1E33,0x004B},	{0x1E32,0x1E33,0x004B},
	{0x1E34,0x1E35,0x004B},	{0x1E34,0x1E35,0x004B},
	{0x1E36,0x1E37,0x004C},	{0x1E36,0x1E37,0x004C},
	{0x1E38,0x1E39,0x004C},	{0x1E38,0x1E39,0x004C},
	{0x1E3A,0x1E3B,0x004C},	{0x1E3A,0x1E3B,0x004C},
	{0x1E3C,0x1E3D,0x004C},	{0x1E3C,0x1E3D,0x004C},
	{0x1E3E,0x1E3F,0x004D},	{0x1E3E,0x1E3F,0x004D},
	{0x1E40,0x1E41,0x004D},	{0x1E40,0x1E41,0x004D},
	{0x1E42,0x1E43,0x004D},	{0x1E42,0x1E43,0x004D},
	{0x1E44,0x1E45,0x004E},	{0x1E44,0x1E45,0x004E},
	{0x1E46,0x1E47,0x004E},	{0x1E46,0x1E47,0x004E},
	{0x1E48,0x1E49,0x004E},	{0x1E48,0x1E49,0x004E},
	{0x1E4A,0x1E4B,0x004E},	{0x1E4A,0x1E4B,0x004E},
	{0x1E4C,0x1E4D,0x004F},	{0x1E4C,0x1E4D,0x004F},
	{0x1E4E,0x1E4F,0x004F},	{0x1E4E,0x1E4F,0x004F},
	{0x1E50,0x1E51,0x004F},	{0x1E50,0x1E51,0x004F},
	{0x1E52,0x1E53,0x004F},	{0x1E52,0x1E53,0x004F},
	{0x1E54,0x1E55,0x0050},	{0x1E54,0x1E55,0x0050},
	{0x1E56,0x1E57,0x0050},	{0x1E56,0x1E57,0x0050},
	{0x1E58,0x1E59,0x0052},	{0x1E58,0x1E59,0x0052},
	{0x1E5A,0x1E5B,0x0052},	{0x1E5A,0x1E5B,0x0052},
	{0x1E5C,0x1E5D,0x0052},	{0x1E5C,0x1E5D,0x0052},
	{0x1E5E,0x1E5F,0x0052},	{0x1E5E,0x1E5F,0x0052},
	{0x1E60,0x1E61,0x0053},	{0x1E60,0x1E61,0x0053},
	{0x1E62,0x1E63,0x0053},	{0x1E62,0x1E63,0x0053},
	{0x1E64,0x1E65,0x0053},	{0x1E64,0x1E65,0x0053},
	{0x1E66,0x1E67,0x0053},	{0x1E66,0x1E67,0x0053},
	{0x1E68,0x1E69,0x0053},	{0x1E68,0x1E69,0x0053},
	{0x1E6A,0x1E6B,0x0054},	{0x1E6A,0x1E6B,0x0054},
	{0x1E6C,0x1E6D,0x0054},	{0x1E6C,0x1E6D,0x0054},
	{0x1E6E,0x1E6F,0x0054},	{0x1E6E,0x1E6F,0x0054},
	{0x1E70,0x1E71,0x0054},	{0x1E70,0x1E71,0x0054},
	{0x1E72,0x1E73,0x0055},	{0x1E72,0x1E73,0x0055},
	{0x1E74,0x1E75,0x0055},	{0x1E74,0x1E75,0x0055},
	{0x1E76,0x1E77,0x0055},	{0x1E76,0x1E77,0x0055},
	{0x1E78,0x1E79,0x0055},	{0x1E78,0x1E79,0x0055},
	{0x1E7A,0x1E7B,0x0055},	{0x1E7A,0x1E7B,0x0055},
	{0x1E7C,0x1E7D,0x0056},	{0x1E7C,0x1E7D,0x0056},
	{0x1E7E,0x1E7F,0x0056},	{0x1E7E,0x1E7F,0x0056},
	{0x1E80,0x1E81,0x0057},	{0x1E80,0x1E81,0x0057},
	{0x1E82,0x1E83,0x0057},	{0x1E82,0x1E83,0x0057},
	{0x1E84,0x1E85,0x0057},	{0x1E84,0x1E85,0x0057},
	{0x1E86,0x1E87,0x0057},	{0x1E86,0x1E87,0x0057},
	{0x1E88,0x1E89,0x0057},	{0x1E88,0x1E89,0x0057},
	{0x1E8A,0x1E8B,0x0058},	{0x1E8A,0x1E8B,0x0058},
	{0x1E8C,0x1E8D,0x0058},	{0x1E8C,0x1E8D,0x0058},
	{0x1E8E,0x1E8F,0x0059},	{0x1E8E,0x1E8F,0x0059},
	{0x1E90,0x1E91,0x005A},	{0x1E90,0x1E91,0x005A},
	{0x1E92,0x1E93,0x005A},	{0x1E92,0x1E93,0x005A},
	{0x1E94,0x1E95,0x005A},	{0x1E94,0x1E95,0x005A},
	{0x1E96,0x1E96,0x0048},	{0x1E97,0x1E97,0x0054},
	{0x1E98,0x1E98,0x0057},	{0x1E99,0x1E99,0x0059},
	{0x1E9A,0x1E9A,0x1E9A},	{0x1E60,0x1E9B,0x0053},
	{0x1E9C,0x1E9C,0x1E9C},	{0x1E9D,0x1E9D,0x1E9D},
	{0x1E9E,0x1E9E,0x1E9E},	{0x1E9F,0x1E9F,0x1E9F},
	{0x1EA0,0x1EA1,0x0041},	{0x1EA0,0x1EA1,0x0041},
	{0x1EA2,0x1EA3,0x0041},	{0x1EA2,0x1EA3,0x0041},
	{0x1EA4,0x1EA5,0x0041},	{0x1EA4,0x1EA5,0x0041},
	{0x1EA6,0x1EA7,0x0041},	{0x1EA6,0x1EA7,0x0041},
	{0x1EA8,0x1EA9,0x0041},	{0x1EA8,0x1EA9,0x0041},
	{0x1EAA,0x1EAB,0x0041},	{0x1EAA,0x1EAB,0x0041},
	{0x1EAC,0x1EAD,0x0041},	{0x1EAC,0x1EAD,0x0041},
	{0x1EAE,0x1EAF,0x0041},	{0x1EAE,0x1EAF,0x0041},
	{0x1EB0,0x1EB1,0x0041},	{0x1EB0,0x1EB1,0x0041},
	{0x1EB2,0x1EB3,0x0041},	{0x1EB2,0x1EB3,0x0041},
	{0x1EB4,0x1EB5,0x0041},	{0x1EB4,0x1EB5,0x0041},
	{0x1EB6,0x1EB7,0x0041},	{0x1EB6,0x1EB7,0x0041},
	{0x1EB8,0x1EB9,0x0045},	{0x1EB8,0x1EB9,0x0045},
	{0x1EBA,0x1EBB,0x0045},	{0x1EBA,0x1EBB,0x0045},
	{0x1EBC,0x1EBD,0x0045},	{0x1EBC,0x1EBD,0x0045},
	{0x1EBE,0x1EBF,0x0045},	{0x1EBE,0x1EBF,0x0045},
	{0x1EC0,0x1EC1,0x0045},	{0x1EC0,0x1EC1,0x0045},
	{0x1EC2,0x1EC3,0x0045},	{0x1EC2,0x1EC3,0x0045},
	{0x1EC4,0x1EC5,0x0045},	{0x1EC4,0x1EC5,0x0045},
	{0x1EC6,0x1EC7,0x0045},	{0x1EC6,0x1EC7,0x0045},
	{0x1EC8,0x1EC9,0x0049},	{0x1EC8,0x1EC9,0x0049},
	{0x1ECA,0x1ECB,0x0049},	{0x1ECA,0x1ECB,0x0049},
	{0x1ECC,0x1ECD,0x004F},	{0x1ECC,0x1ECD,0x004F},
	{0x1ECE,0x1ECF,0x004F},	{0x1ECE,0x1ECF,0x004F},
	{0x1ED0,0x1ED1,0x004F},	{0x1ED0,0x1ED1,0x004F},
	{0x1ED2,0x1ED3,0x004F},	{0x1ED2,0x1ED3,0x004F},
	{0x1ED4,0x1ED5,0x004F},	{0x1ED4,0x1ED5,0x004F},
	{0x1ED6,0x1ED7,0x004F},	{0x1ED6,0x1ED7,0x004F},
	{0x1ED8,0x1ED9,0x004F},	{0x1ED8,0x1ED9,0x004F},
	{0x1EDA,0x1EDB,0x004F},	{0x1EDA,0x1EDB,0x004F},
	{0x1EDC,0x1EDD,0x004F},	{0x1EDC,0x1EDD,0x004F},
	{0x1EDE,0x1EDF,0x004F},	{0x1EDE,0x1EDF,0x004F},
	{0x1EE0,0x1EE1,0x004F},	{0x1EE0,0x1EE1,0x004F},
	{0x1EE2,0x1EE3,0x004F},	{0x1EE2,0x1EE3,0x004F},
	{0x1EE4,0x1EE5,0x0055},	{0x1EE4,0x1EE5,0x0055},
	{0x1EE6,0x1EE7,0x0055},	{0x1EE6,0x1EE7,0x0055},
	{0x1EE8,0x1EE9,0x0055},	{0x1EE8,0x1EE9,0x0055},
	{0x1EEA,0x1EEB,0x0055},	{0x1EEA,0x1EEB,0x0055},
	{0x1EEC,0x1EED,0x0055},	{0x1EEC,0x1EED,0x0055},
	{0x1EEE,0x1EEF,0x0055},	{0x1EEE,0x1EEF,0x0055},
	{0x1EF0,0x1EF1,0x0055},	{0x1EF0,0x1EF1,0x0055},
	{0x1EF2,0x1EF3,0x0059},	{0x1EF2,0x1EF3,0x0059},
	{0x1EF4,0x1EF5,0x0059},	{0x1EF4,0x1EF5,0x0059},
	{0x1EF6,0x1EF7,0x0059},	{0x1EF6,0x1EF7,0x0059},
	{0x1EF8,0x1EF9,0x0059},	{0x1EF8,0x1EF9,0x0059},
	{0x1EFA,0x1EFA,0x1EFA},	{0x1EFB,0x1EFB,0x1EFB},
	{0x1EFC,0x1EFC,0x1EFC},	{0x1EFD,0x1EFD,0x1EFD},
	{0x1EFE,0x1EFE,0x1EFE},	{0x1EFF,0x1EFF,0x1EFF}
};

static MY_UNICASE_INFO plane1F[]={
	{0x1F08,0x1F00,0x0391},	{0x1F09,0x1F01,0x0391},
	{0x1F0A,0x1F02,0x0391},	{0x1F0B,0x1F03,0x0391},
	{0x1F0C,0x1F04,0x0391},	{0x1F0D,0x1F05,0x0391},
	{0x1F0E,0x1F06,0x0391},	{0x1F0F,0x1F07,0x0391},
	{0x1F08,0x1F00,0x0391},	{0x1F09,0x1F01,0x0391},
	{0x1F0A,0x1F02,0x0391},	{0x1F0B,0x1F03,0x0391},
	{0x1F0C,0x1F04,0x0391},	{0x1F0D,0x1F05,0x0391},
	{0x1F0E,0x1F06,0x0391},	{0x1F0F,0x1F07,0x0391},
	{0x1F18,0x1F10,0x0395},	{0x1F19,0x1F11,0x0395},
	{0x1F1A,0x1F12,0x0395},	{0x1F1B,0x1F13,0x0395},
	{0x1F1C,0x1F14,0x0395},	{0x1F1D,0x1F15,0x0395},
	{0x1F16,0x1F16,0x1F16},	{0x1F17,0x1F17,0x1F17},
	{0x1F18,0x1F10,0x0395},	{0x1F19,0x1F11,0x0395},
	{0x1F1A,0x1F12,0x0395},	{0x1F1B,0x1F13,0x0395},
	{0x1F1C,0x1F14,0x0395},	{0x1F1D,0x1F15,0x0395},
	{0x1F1E,0x1F1E,0x1F1E},	{0x1F1F,0x1F1F,0x1F1F},
	{0x1F28,0x1F20,0x0397},	{0x1F29,0x1F21,0x0397},
	{0x1F2A,0x1F22,0x0397},	{0x1F2B,0x1F23,0x0397},
	{0x1F2C,0x1F24,0x0397},	{0x1F2D,0x1F25,0x0397},
	{0x1F2E,0x1F26,0x0397},	{0x1F2F,0x1F27,0x0397},
	{0x1F28,0x1F20,0x0397},	{0x1F29,0x1F21,0x0397},
	{0x1F2A,0x1F22,0x0397},	{0x1F2B,0x1F23,0x0397},
	{0x1F2C,0x1F24,0x0397},	{0x1F2D,0x1F25,0x0397},
	{0x1F2E,0x1F26,0x0397},	{0x1F2F,0x1F27,0x0397},
	{0x1F38,0x1F30,0x0399},	{0x1F39,0x1F31,0x0399},
	{0x1F3A,0x1F32,0x0399},	{0x1F3B,0x1F33,0x0399},
	{0x1F3C,0x1F34,0x0399},	{0x1F3D,0x1F35,0x0399},
	{0x1F3E,0x1F36,0x0399},	{0x1F3F,0x1F37,0x0399},
	{0x1F38,0x1F30,0x0399},	{0x1F39,0x1F31,0x0399},
	{0x1F3A,0x1F32,0x0399},	{0x1F3B,0x1F33,0x0399},
	{0x1F3C,0x1F34,0x0399},	{0x1F3D,0x1F35,0x0399},
	{0x1F3E,0x1F36,0x0399},	{0x1F3F,0x1F37,0x0399},
	{0x1F48,0x1F40,0x039F},	{0x1F49,0x1F41,0x039F},
	{0x1F4A,0x1F42,0x039F},	{0x1F4B,0x1F43,0x039F},
	{0x1F4C,0x1F44,0x039F},	{0x1F4D,0x1F45,0x039F},
	{0x1F46,0x1F46,0x1F46},	{0x1F47,0x1F47,0x1F47},
	{0x1F48,0x1F40,0x039F},	{0x1F49,0x1F41,0x039F},
	{0x1F4A,0x1F42,0x039F},	{0x1F4B,0x1F43,0x039F},
	{0x1F4C,0x1F44,0x039F},	{0x1F4D,0x1F45,0x039F},
	{0x1F4E,0x1F4E,0x1F4E},	{0x1F4F,0x1F4F,0x1F4F},
	{0x1F50,0x1F50,0x03A5},	{0x1F59,0x1F51,0x03A5},
	{0x1F52,0x1F52,0x03A5},	{0x1F5B,0x1F53,0x03A5},
	{0x1F54,0x1F54,0x03A5},	{0x1F5D,0x1F55,0x03A5},
	{0x1F56,0x1F56,0x03A5},	{0x1F5F,0x1F57,0x03A5},
	{0x1F58,0x1F58,0x1F58},	{0x1F59,0x1F51,0x03A5},
	{0x1F5A,0x1F5A,0x1F5A},	{0x1F5B,0x1F53,0x03A5},
	{0x1F5C,0x1F5C,0x1F5C},	{0x1F5D,0x1F55,0x03A5},
	{0x1F5E,0x1F5E,0x1F5E},	{0x1F5F,0x1F57,0x03A5},
	{0x1F68,0x1F60,0x03A9},	{0x1F69,0x1F61,0x03A9},
	{0x1F6A,0x1F62,0x03A9},	{0x1F6B,0x1F63,0x03A9},
	{0x1F6C,0x1F64,0x03A9},	{0x1F6D,0x1F65,0x03A9},
	{0x1F6E,0x1F66,0x03A9},	{0x1F6F,0x1F67,0x03A9},
	{0x1F68,0x1F60,0x03A9},	{0x1F69,0x1F61,0x03A9},
	{0x1F6A,0x1F62,0x03A9},	{0x1F6B,0x1F63,0x03A9},
	{0x1F6C,0x1F64,0x03A9},	{0x1F6D,0x1F65,0x03A9},
	{0x1F6E,0x1F66,0x03A9},	{0x1F6F,0x1F67,0x03A9},
	{0x1FBA,0x1F70,0x0391},	{0x1FBB,0x1F71,0x1FBB},
	{0x1FC8,0x1F72,0x0395},	{0x1FC9,0x1F73,0x1FC9},
	{0x1FCA,0x1F74,0x0397},	{0x1FCB,0x1F75,0x1FCB},
	{0x1FDA,0x1F76,0x0399},	{0x1FDB,0x1F77,0x1FDB},
	{0x1FF8,0x1F78,0x039F},	{0x1FF9,0x1F79,0x1FF9},
	{0x1FEA,0x1F7A,0x03A5},	{0x1FEB,0x1F7B,0x1FEB},
	{0x1FFA,0x1F7C,0x03A9},	{0x1FFB,0x1F7D,0x1FFB},
	{0x1F7E,0x1F7E,0x1F7E},	{0x1F7F,0x1F7F,0x1F7F},
	{0x1F88,0x1F80,0x0391},	{0x1F89,0x1F81,0x0391},
	{0x1F8A,0x1F82,0x0391},	{0x1F8B,0x1F83,0x0391},
	{0x1F8C,0x1F84,0x0391},	{0x1F8D,0x1F85,0x0391},
	{0x1F8E,0x1F86,0x0391},	{0x1F8F,0x1F87,0x0391},
	{0x1F88,0x1F80,0x0391},	{0x1F89,0x1F81,0x0391},
	{0x1F8A,0x1F82,0x0391},	{0x1F8B,0x1F83,0x0391},
	{0x1F8C,0x1F84,0x0391},	{0x1F8D,0x1F85,0x0391},
	{0x1F8E,0x1F86,0x0391},	{0x1F8F,0x1F87,0x0391},
	{0x1F98,0x1F90,0x0397},	{0x1F99,0x1F91,0x0397},
	{0x1F9A,0x1F92,0x0397},	{0x1F9B,0x1F93,0x0397},
	{0x1F9C,0x1F94,0x0397},	{0x1F9D,0x1F95,0x0397},
	{0x1F9E,0x1F96,0x0397},	{0x1F9F,0x1F97,0x0397},
	{0x1F98,0x1F90,0x0397},	{0x1F99,0x1F91,0x0397},
	{0x1F9A,0x1F92,0x0397},	{0x1F9B,0x1F93,0x0397},
	{0x1F9C,0x1F94,0x0397},	{0x1F9D,0x1F95,0x0397},
	{0x1F9E,0x1F96,0x0397},	{0x1F9F,0x1F97,0x0397},
	{0x1FA8,0x1FA0,0x03A9},	{0x1FA9,0x1FA1,0x03A9},
	{0x1FAA,0x1FA2,0x03A9},	{0x1FAB,0x1FA3,0x03A9},
	{0x1FAC,0x1FA4,0x03A9},	{0x1FAD,0x1FA5,0x03A9},
	{0x1FAE,0x1FA6,0x03A9},	{0x1FAF,0x1FA7,0x03A9},
	{0x1FA8,0x1FA0,0x03A9},	{0x1FA9,0x1FA1,0x03A9},
	{0x1FAA,0x1FA2,0x03A9},	{0x1FAB,0x1FA3,0x03A9},
	{0x1FAC,0x1FA4,0x03A9},	{0x1FAD,0x1FA5,0x03A9},
	{0x1FAE,0x1FA6,0x03A9},	{0x1FAF,0x1FA7,0x03A9},
	{0x1FB8,0x1FB0,0x0391},	{0x1FB9,0x1FB1,0x0391},
	{0x1FB2,0x1FB2,0x0391},	{0x1FBC,0x1FB3,0x0391},
	{0x1FB4,0x1FB4,0x0391},	{0x1FB5,0x1FB5,0x1FB5},
	{0x1FB6,0x1FB6,0x0391},	{0x1FB7,0x1FB7,0x0391},
	{0x1FB8,0x1FB0,0x0391},	{0x1FB9,0x1FB1,0x0391},
	{0x1FBA,0x1F70,0x0391},	{0x1FBB,0x1F71,0x1FBB},
	{0x1FBC,0x1FB3,0x0391},	{0x1FBD,0x1FBD,0x1FBD},
	{0x0399,0x1FBE,0x0399},	{0x1FBF,0x1FBF,0x1FBF},
	{0x1FC0,0x1FC0,0x1FC0},	{0x1FC1,0x1FC1,0x1FC1},
	{0x1FC2,0x1FC2,0x0397},	{0x1FCC,0x1FC3,0x0397},
	{0x1FC4,0x1FC4,0x0397},	{0x1FC5,0x1FC5,0x1FC5},
	{0x1FC6,0x1FC6,0x0397},	{0x1FC7,0x1FC7,0x0397},
	{0x1FC8,0x1F72,0x0395},	{0x1FC9,0x1F73,0x1FC9},
	{0x1FCA,0x1F74,0x0397},	{0x1FCB,0x1F75,0x1FCB},
	{0x1FCC,0x1FC3,0x0397},	{0x1FCD,0x1FCD,0x1FCD},
	{0x1FCE,0x1FCE,0x1FCE},	{0x1FCF,0x1FCF,0x1FCF},
	{0x1FD8,0x1FD0,0x0399},	{0x1FD9,0x1FD1,0x0399},
	{0x1FD2,0x1FD2,0x0399},	{0x1FD3,0x1FD3,0x1FD3},
	{0x1FD4,0x1FD4,0x1FD4},	{0x1FD5,0x1FD5,0x1FD5},
	{0x1FD6,0x1FD6,0x0399},	{0x1FD7,0x1FD7,0x0399},
	{0x1FD8,0x1FD0,0x0399},	{0x1FD9,0x1FD1,0x0399},
	{0x1FDA,0x1F76,0x0399},	{0x1FDB,0x1F77,0x1FDB},
	{0x1FDC,0x1FDC,0x1FDC},	{0x1FDD,0x1FDD,0x1FDD},
	{0x1FDE,0x1FDE,0x1FDE},	{0x1FDF,0x1FDF,0x1FDF},
	{0x1FE8,0x1FE0,0x03A5},	{0x1FE9,0x1FE1,0x03A5},
	{0x1FE2,0x1FE2,0x03A5},	{0x1FE3,0x1FE3,0x1FE3},
	{0x1FE4,0x1FE4,0x03A1},	{0x1FEC,0x1FE5,0x03A1},
	{0x1FE6,0x1FE6,0x03A5},	{0x1FE7,0x1FE7,0x03A5},
	{0x1FE8,0x1FE0,0x03A5},	{0x1FE9,0x1FE1,0x03A5},
	{0x1FEA,0x1F7A,0x03A5},	{0x1FEB,0x1F7B,0x1FEB},
	{0x1FEC,0x1FE5,0x03A1},	{0x1FED,0x1FED,0x1FED},
	{0x1FEE,0x1FEE,0x1FEE},	{0x1FEF,0x1FEF,0x1FEF},
	{0x1FF0,0x1FF0,0x1FF0},	{0x1FF1,0x1FF1,0x1FF1},
	{0x1FF2,0x1FF2,0x03A9},	{0x1FFC,0x1FF3,0x03A9},
	{0x1FF4,0x1FF4,0x03A9},	{0x1FF5,0x1FF5,0x1FF5},
	{0x1FF6,0x1FF6,0x03A9},	{0x1FF7,0x1FF7,0x03A9},
	{0x1FF8,0x1F78,0x039F},	{0x1FF9,0x1F79,0x1FF9},
	{0x1FFA,0x1F7C,0x03A9},	{0x1FFB,0x1F7D,0x1FFB},
	{0x1FFC,0x1FF3,0x03A9},	{0x1FFD,0x1FFD,0x1FFD},
	{0x1FFE,0x1FFE,0x1FFE},	{0x1FFF,0x1FFF,0x1FFF}
};

static MY_UNICASE_INFO plane21[]={
	{0x2100,0x2100,0x2100},	{0x2101,0x2101,0x2101},
	{0x2102,0x2102,0x2102},	{0x2103,0x2103,0x2103},
	{0x2104,0x2104,0x2104},	{0x2105,0x2105,0x2105},
	{0x2106,0x2106,0x2106},	{0x2107,0x2107,0x2107},
	{0x2108,0x2108,0x2108},	{0x2109,0x2109,0x2109},
	{0x210A,0x210A,0x210A},	{0x210B,0x210B,0x210B},
	{0x210C,0x210C,0x210C},	{0x210D,0x210D,0x210D},
	{0x210E,0x210E,0x210E},	{0x210F,0x210F,0x210F},
	{0x2110,0x2110,0x2110},	{0x2111,0x2111,0x2111},
	{0x2112,0x2112,0x2112},	{0x2113,0x2113,0x2113},
	{0x2114,0x2114,0x2114},	{0x2115,0x2115,0x2115},
	{0x2116,0x2116,0x2116},	{0x2117,0x2117,0x2117},
	{0x2118,0x2118,0x2118},	{0x2119,0x2119,0x2119},
	{0x211A,0x211A,0x211A},	{0x211B,0x211B,0x211B},
	{0x211C,0x211C,0x211C},	{0x211D,0x211D,0x211D},
	{0x211E,0x211E,0x211E},	{0x211F,0x211F,0x211F},
	{0x2120,0x2120,0x2120},	{0x2121,0x2121,0x2121},
	{0x2122,0x2122,0x2122},	{0x2123,0x2123,0x2123},
	{0x2124,0x2124,0x2124},	{0x2125,0x2125,0x2125},
	{0x2126,0x03C9,0x2126},	{0x2127,0x2127,0x2127},
	{0x2128,0x2128,0x2128},	{0x2129,0x2129,0x2129},
	{0x212A,0x006B,0x212A},	{0x212B,0x00E5,0x212B},
	{0x212C,0x212C,0x212C},	{0x212D,0x212D,0x212D},
	{0x212E,0x212E,0x212E},	{0x212F,0x212F,0x212F},
	{0x2130,0x2130,0x2130},	{0x2131,0x2131,0x2131},
	{0x2132,0x2132,0x2132},	{0x2133,0x2133,0x2133},
	{0x2134,0x2134,0x2134},	{0x2135,0x2135,0x2135},
	{0x2136,0x2136,0x2136},	{0x2137,0x2137,0x2137},
	{0x2138,0x2138,0x2138},	{0x2139,0x2139,0x2139},
	{0x213A,0x213A,0x213A},	{0x213B,0x213B,0x213B},
	{0x213C,0x213C,0x213C},	{0x213D,0x213D,0x213D},
	{0x213E,0x213E,0x213E},	{0x213F,0x213F,0x213F},
	{0x2140,0x2140,0x2140},	{0x2141,0x2141,0x2141},
	{0x2142,0x2142,0x2142},	{0x2143,0x2143,0x2143},
	{0x2144,0x2144,0x2144},	{0x2145,0x2145,0x2145},
	{0x2146,0x2146,0x2146},	{0x2147,0x2147,0x2147},
	{0x2148,0x2148,0x2148},	{0x2149,0x2149,0x2149},
	{0x214A,0x214A,0x214A},	{0x214B,0x214B,0x214B},
	{0x214C,0x214C,0x214C},	{0x214D,0x214D,0x214D},
	{0x214E,0x214E,0x214E},	{0x214F,0x214F,0x214F},
	{0x2150,0x2150,0x2150},	{0x2151,0x2151,0x2151},
	{0x2152,0x2152,0x2152},	{0x2153,0x2153,0x2153},
	{0x2154,0x2154,0x2154},	{0x2155,0x2155,0x2155},
	{0x2156,0x2156,0x2156},	{0x2157,0x2157,0x2157},
	{0x2158,0x2158,0x2158},	{0x2159,0x2159,0x2159},
	{0x215A,0x215A,0x215A},	{0x215B,0x215B,0x215B},
	{0x215C,0x215C,0x215C},	{0x215D,0x215D,0x215D},
	{0x215E,0x215E,0x215E},	{0x215F,0x215F,0x215F},
	{0x2160,0x2170,0x2160},	{0x2161,0x2171,0x2161},
	{0x2162,0x2172,0x2162},	{0x2163,0x2173,0x2163},
	{0x2164,0x2174,0x2164},	{0x2165,0x2175,0x2165},
	{0x2166,0x2176,0x2166},	{0x2167,0x2177,0x2167},
	{0x2168,0x2178,0x2168},	{0x2169,0x2179,0x2169},
	{0x216A,0x217A,0x216A},	{0x216B,0x217B,0x216B},
	{0x216C,0x217C,0x216C},	{0x216D,0x217D,0x216D},
	{0x216E,0x217E,0x216E},	{0x216F,0x217F,0x216F},
	{0x2160,0x2170,0x2160},	{0x2161,0x2171,0x2161},
	{0x2162,0x2172,0x2162},	{0x2163,0x2173,0x2163},
	{0x2164,0x2174,0x2164},	{0x2165,0x2175,0x2165},
	{0x2166,0x2176,0x2166},	{0x2167,0x2177,0x2167},
	{0x2168,0x2178,0x2168},	{0x2169,0x2179,0x2169},
	{0x216A,0x217A,0x216A},	{0x216B,0x217B,0x216B},
	{0x216C,0x217C,0x216C},	{0x216D,0x217D,0x216D},
	{0x216E,0x217E,0x216E},	{0x216F,0x217F,0x216F},
	{0x2180,0x2180,0x2180},	{0x2181,0x2181,0x2181},
	{0x2182,0x2182,0x2182},	{0x2183,0x2183,0x2183},
	{0x2184,0x2184,0x2184},	{0x2185,0x2185,0x2185},
	{0x2186,0x2186,0x2186},	{0x2187,0x2187,0x2187},
	{0x2188,0x2188,0x2188},	{0x2189,0x2189,0x2189},
	{0x218A,0x218A,0x218A},	{0x218B,0x218B,0x218B},
	{0x218C,0x218C,0x218C},	{0x218D,0x218D,0x218D},
	{0x218E,0x218E,0x218E},	{0x218F,0x218F,0x218F},
	{0x2190,0x2190,0x2190},	{0x2191,0x2191,0x2191},
	{0x2192,0x2192,0x2192},	{0x2193,0x2193,0x2193},
	{0x2194,0x2194,0x2194},	{0x2195,0x2195,0x2195},
	{0x2196,0x2196,0x2196},	{0x2197,0x2197,0x2197},
	{0x2198,0x2198,0x2198},	{0x2199,0x2199,0x2199},
	{0x219A,0x219A,0x219A},	{0x219B,0x219B,0x219B},
	{0x219C,0x219C,0x219C},	{0x219D,0x219D,0x219D},
	{0x219E,0x219E,0x219E},	{0x219F,0x219F,0x219F},
	{0x21A0,0x21A0,0x21A0},	{0x21A1,0x21A1,0x21A1},
	{0x21A2,0x21A2,0x21A2},	{0x21A3,0x21A3,0x21A3},
	{0x21A4,0x21A4,0x21A4},	{0x21A5,0x21A5,0x21A5},
	{0x21A6,0x21A6,0x21A6},	{0x21A7,0x21A7,0x21A7},
	{0x21A8,0x21A8,0x21A8},	{0x21A9,0x21A9,0x21A9},
	{0x21AA,0x21AA,0x21AA},	{0x21AB,0x21AB,0x21AB},
	{0x21AC,0x21AC,0x21AC},	{0x21AD,0x21AD,0x21AD},
	{0x21AE,0x21AE,0x21AE},	{0x21AF,0x21AF,0x21AF},
	{0x21B0,0x21B0,0x21B0},	{0x21B1,0x21B1,0x21B1},
	{0x21B2,0x21B2,0x21B2},	{0x21B3,0x21B3,0x21B3},
	{0x21B4,0x21B4,0x21B4},	{0x21B5,0x21B5,0x21B5},
	{0x21B6,0x21B6,0x21B6},	{0x21B7,0x21B7,0x21B7},
	{0x21B8,0x21B8,0x21B8},	{0x21B9,0x21B9,0x21B9},
	{0x21BA,0x21BA,0x21BA},	{0x21BB,0x21BB,0x21BB},
	{0x21BC,0x21BC,0x21BC},	{0x21BD,0x21BD,0x21BD},
	{0x21BE,0x21BE,0x21BE},	{0x21BF,0x21BF,0x21BF},
	{0x21C0,0x21C0,0x21C0},	{0x21C1,0x21C1,0x21C1},
	{0x21C2,0x21C2,0x21C2},	{0x21C3,0x21C3,0x21C3},
	{0x21C4,0x21C4,0x21C4},	{0x21C5,0x21C5,0x21C5},
	{0x21C6,0x21C6,0x21C6},	{0x21C7,0x21C7,0x21C7},
	{0x21C8,0x21C8,0x21C8},	{0x21C9,0x21C9,0x21C9},
	{0x21CA,0x21CA,0x21CA},	{0x21CB,0x21CB,0x21CB},
	{0x21CC,0x21CC,0x21CC},	{0x21CD,0x21CD,0x21CD},
	{0x21CE,0x21CE,0x21CE},	{0x21CF,0x21CF,0x21CF},
	{0x21D0,0x21D0,0x21D0},	{0x21D1,0x21D1,0x21D1},
	{0x21D2,0x21D2,0x21D2},	{0x21D3,0x21D3,0x21D3},
	{0x21D4,0x21D4,0x21D4},	{0x21D5,0x21D5,0x21D5},
	{0x21D6,0x21D6,0x21D6},	{0x21D7,0x21D7,0x21D7},
	{0x21D8,0x21D8,0x21D8},	{0x21D9,0x21D9,0x21D9},
	{0x21DA,0x21DA,0x21DA},	{0x21DB,0x21DB,0x21DB},
	{0x21DC,0x21DC,0x21DC},	{0x21DD,0x21DD,0x21DD},
	{0x21DE,0x21DE,0x21DE},	{0x21DF,0x21DF,0x21DF},
	{0x21E0,0x21E0,0x21E0},	{0x21E1,0x21E1,0x21E1},
	{0x21E2,0x21E2,0x21E2},	{0x21E3,0x21E3,0x21E3},
	{0x21E4,0x21E4,0x21E4},	{0x21E5,0x21E5,0x21E5},
	{0x21E6,0x21E6,0x21E6},	{0x21E7,0x21E7,0x21E7},
	{0x21E8,0x21E8,0x21E8},	{0x21E9,0x21E9,0x21E9},
	{0x21EA,0x21EA,0x21EA},	{0x21EB,0x21EB,0x21EB},
	{0x21EC,0x21EC,0x21EC},	{0x21ED,0x21ED,0x21ED},
	{0x21EE,0x21EE,0x21EE},	{0x21EF,0x21EF,0x21EF},
	{0x21F0,0x21F0,0x21F0},	{0x21F1,0x21F1,0x21F1},
	{0x21F2,0x21F2,0x21F2},	{0x21F3,0x21F3,0x21F3},
	{0x21F4,0x21F4,0x21F4},	{0x21F5,0x21F5,0x21F5},
	{0x21F6,0x21F6,0x21F6},	{0x21F7,0x21F7,0x21F7},
	{0x21F8,0x21F8,0x21F8},	{0x21F9,0x21F9,0x21F9},
	{0x21FA,0x21FA,0x21FA},	{0x21FB,0x21FB,0x21FB},
	{0x21FC,0x21FC,0x21FC},	{0x21FD,0x21FD,0x21FD},
	{0x21FE,0x21FE,0x21FE},	{0x21FF,0x21FF,0x21FF}
};

static MY_UNICASE_INFO plane24[]={
	{0x2400,0x2400,0x2400},	{0x2401,0x2401,0x2401},
	{0x2402,0x2402,0x2402},	{0x2403,0x2403,0x2403},
	{0x2404,0x2404,0x2404},	{0x2405,0x2405,0x2405},
	{0x2406,0x2406,0x2406},	{0x2407,0x2407,0x2407},
	{0x2408,0x2408,0x2408},	{0x2409,0x2409,0x2409},
	{0x240A,0x240A,0x240A},	{0x240B,0x240B,0x240B},
	{0x240C,0x240C,0x240C},	{0x240D,0x240D,0x240D},
	{0x240E,0x240E,0x240E},	{0x240F,0x240F,0x240F},
	{0x2410,0x2410,0x2410},	{0x2411,0x2411,0x2411},
	{0x2412,0x2412,0x2412},	{0x2413,0x2413,0x2413},
	{0x2414,0x2414,0x2414},	{0x2415,0x2415,0x2415},
	{0x2416,0x2416,0x2416},	{0x2417,0x2417,0x2417},
	{0x2418,0x2418,0x2418},	{0x2419,0x2419,0x2419},
	{0x241A,0x241A,0x241A},	{0x241B,0x241B,0x241B},
	{0x241C,0x241C,0x241C},	{0x241D,0x241D,0x241D},
	{0x241E,0x241E,0x241E},	{0x241F,0x241F,0x241F},
	{0x2420,0x2420,0x2420},	{0x2421,0x2421,0x2421},
	{0x2422,0x2422,0x2422},	{0x2423,0x2423,0x2423},
	{0x2424,0x2424,0x2424},	{0x2425,0x2425,0x2425},
	{0x2426,0x2426,0x2426},	{0x2427,0x2427,0x2427},
	{0x2428,0x2428,0x2428},	{0x2429,0x2429,0x2429},
	{0x242A,0x242A,0x242A},	{0x242B,0x242B,0x242B},
	{0x242C,0x242C,0x242C},	{0x242D,0x242D,0x242D},
	{0x242E,0x242E,0x242E},	{0x242F,0x242F,0x242F},
	{0x2430,0x2430,0x2430},	{0x2431,0x2431,0x2431},
	{0x2432,0x2432,0x2432},	{0x2433,0x2433,0x2433},
	{0x2434,0x2434,0x2434},	{0x2435,0x2435,0x2435},
	{0x2436,0x2436,0x2436},	{0x2437,0x2437,0x2437},
	{0x2438,0x2438,0x2438},	{0x2439,0x2439,0x2439},
	{0x243A,0x243A,0x243A},	{0x243B,0x243B,0x243B},
	{0x243C,0x243C,0x243C},	{0x243D,0x243D,0x243D},
	{0x243E,0x243E,0x243E},	{0x243F,0x243F,0x243F},
	{0x2440,0x2440,0x2440},	{0x2441,0x2441,0x2441},
	{0x2442,0x2442,0x2442},	{0x2443,0x2443,0x2443},
	{0x2444,0x2444,0x2444},	{0x2445,0x2445,0x2445},
	{0x2446,0x2446,0x2446},	{0x2447,0x2447,0x2447},
	{0x2448,0x2448,0x2448},	{0x2449,0x2449,0x2449},
	{0x244A,0x244A,0x244A},	{0x244B,0x244B,0x244B},
	{0x244C,0x244C,0x244C},	{0x244D,0x244D,0x244D},
	{0x244E,0x244E,0x244E},	{0x244F,0x244F,0x244F},
	{0x2450,0x2450,0x2450},	{0x2451,0x2451,0x2451},
	{0x2452,0x2452,0x2452},	{0x2453,0x2453,0x2453},
	{0x2454,0x2454,0x2454},	{0x2455,0x2455,0x2455},
	{0x2456,0x2456,0x2456},	{0x2457,0x2457,0x2457},
	{0x2458,0x2458,0x2458},	{0x2459,0x2459,0x2459},
	{0x245A,0x245A,0x245A},	{0x245B,0x245B,0x245B},
	{0x245C,0x245C,0x245C},	{0x245D,0x245D,0x245D},
	{0x245E,0x245E,0x245E},	{0x245F,0x245F,0x245F},
	{0x2460,0x2460,0x2460},	{0x2461,0x2461,0x2461},
	{0x2462,0x2462,0x2462},	{0x2463,0x2463,0x2463},
	{0x2464,0x2464,0x2464},	{0x2465,0x2465,0x2465},
	{0x2466,0x2466,0x2466},	{0x2467,0x2467,0x2467},
	{0x2468,0x2468,0x2468},	{0x2469,0x2469,0x2469},
	{0x246A,0x246A,0x246A},	{0x246B,0x246B,0x246B},
	{0x246C,0x246C,0x246C},	{0x246D,0x246D,0x246D},
	{0x246E,0x246E,0x246E},	{0x246F,0x246F,0x246F},
	{0x2470,0x2470,0x2470},	{0x2471,0x2471,0x2471},
	{0x2472,0x2472,0x2472},	{0x2473,0x2473,0x2473},
	{0x2474,0x2474,0x2474},	{0x2475,0x2475,0x2475},
	{0x2476,0x2476,0x2476},	{0x2477,0x2477,0x2477},
	{0x2478,0x2478,0x2478},	{0x2479,0x2479,0x2479},
	{0x247A,0x247A,0x247A},	{0x247B,0x247B,0x247B},
	{0x247C,0x247C,0x247C},	{0x247D,0x247D,0x247D},
	{0x247E,0x247E,0x247E},	{0x247F,0x247F,0x247F},
	{0x2480,0x2480,0x2480},	{0x2481,0x2481,0x2481},
	{0x2482,0x2482,0x2482},	{0x2483,0x2483,0x2483},
	{0x2484,0x2484,0x2484},	{0x2485,0x2485,0x2485},
	{0x2486,0x2486,0x2486},	{0x2487,0x2487,0x2487},
	{0x2488,0x2488,0x2488},	{0x2489,0x2489,0x2489},
	{0x248A,0x248A,0x248A},	{0x248B,0x248B,0x248B},
	{0x248C,0x248C,0x248C},	{0x248D,0x248D,0x248D},
	{0x248E,0x248E,0x248E},	{0x248F,0x248F,0x248F},
	{0x2490,0x2490,0x2490},	{0x2491,0x2491,0x2491},
	{0x2492,0x2492,0x2492},	{0x2493,0x2493,0x2493},
	{0x2494,0x2494,0x2494},	{0x2495,0x2495,0x2495},
	{0x2496,0x2496,0x2496},	{0x2497,0x2497,0x2497},
	{0x2498,0x2498,0x2498},	{0x2499,0x2499,0x2499},
	{0x249A,0x249A,0x249A},	{0x249B,0x249B,0x249B},
	{0x249C,0x249C,0x249C},	{0x249D,0x249D,0x249D},
	{0x249E,0x249E,0x249E},	{0x249F,0x249F,0x249F},
	{0x24A0,0x24A0,0x24A0},	{0x24A1,0x24A1,0x24A1},
	{0x24A2,0x24A2,0x24A2},	{0x24A3,0x24A3,0x24A3},
	{0x24A4,0x24A4,0x24A4},	{0x24A5,0x24A5,0x24A5},
	{0x24A6,0x24A6,0x24A6},	{0x24A7,0x24A7,0x24A7},
	{0x24A8,0x24A8,0x24A8},	{0x24A9,0x24A9,0x24A9},
	{0x24AA,0x24AA,0x24AA},	{0x24AB,0x24AB,0x24AB},
	{0x24AC,0x24AC,0x24AC},	{0x24AD,0x24AD,0x24AD},
	{0x24AE,0x24AE,0x24AE},	{0x24AF,0x24AF,0x24AF},
	{0x24B0,0x24B0,0x24B0},	{0x24B1,0x24B1,0x24B1},
	{0x24B2,0x24B2,0x24B2},	{0x24B3,0x24B3,0x24B3},
	{0x24B4,0x24B4,0x24B4},	{0x24B5,0x24B5,0x24B5},
	{0x24B6,0x24D0,0x24B6},	{0x24B7,0x24D1,0x24B7},
	{0x24B8,0x24D2,0x24B8},	{0x24B9,0x24D3,0x24B9},
	{0x24BA,0x24D4,0x24BA},	{0x24BB,0x24D5,0x24BB},
	{0x24BC,0x24D6,0x24BC},	{0x24BD,0x24D7,0x24BD},
	{0x24BE,0x24D8,0x24BE},	{0x24BF,0x24D9,0x24BF},
	{0x24C0,0x24DA,0x24C0},	{0x24C1,0x24DB,0x24C1},
	{0x24C2,0x24DC,0x24C2},	{0x24C3,0x24DD,0x24C3},
	{0x24C4,0x24DE,0x24C4},	{0x24C5,0x24DF,0x24C5},
	{0x24C6,0x24E0,0x24C6},	{0x24C7,0x24E1,0x24C7},
	{0x24C8,0x24E2,0x24C8},	{0x24C9,0x24E3,0x24C9},
	{0x24CA,0x24E4,0x24CA},	{0x24CB,0x24E5,0x24CB},
	{0x24CC,0x24E6,0x24CC},	{0x24CD,0x24E7,0x24CD},
	{0x24CE,0x24E8,0x24CE},	{0x24CF,0x24E9,0x24CF},
	{0x24B6,0x24D0,0x24B6},	{0x24B7,0x24D1,0x24B7},
	{0x24B8,0x24D2,0x24B8},	{0x24B9,0x24D3,0x24B9},
	{0x24BA,0x24D4,0x24BA},	{0x24BB,0x24D5,0x24BB},
	{0x24BC,0x24D6,0x24BC},	{0x24BD,0x24D7,0x24BD},
	{0x24BE,0x24D8,0x24BE},	{0x24BF,0x24D9,0x24BF},
	{0x24C0,0x24DA,0x24C0},	{0x24C1,0x24DB,0x24C1},
	{0x24C2,0x24DC,0x24C2},	{0x24C3,0x24DD,0x24C3},
	{0x24C4,0x24DE,0x24C4},	{0x24C5,0x24DF,0x24C5},
	{0x24C6,0x24E0,0x24C6},	{0x24C7,0x24E1,0x24C7},
	{0x24C8,0x24E2,0x24C8},	{0x24C9,0x24E3,0x24C9},
	{0x24CA,0x24E4,0x24CA},	{0x24CB,0x24E5,0x24CB},
	{0x24CC,0x24E6,0x24CC},	{0x24CD,0x24E7,0x24CD},
	{0x24CE,0x24E8,0x24CE},	{0x24CF,0x24E9,0x24CF},
	{0x24EA,0x24EA,0x24EA},	{0x24EB,0x24EB,0x24EB},
	{0x24EC,0x24EC,0x24EC},	{0x24ED,0x24ED,0x24ED},
	{0x24EE,0x24EE,0x24EE},	{0x24EF,0x24EF,0x24EF},
	{0x24F0,0x24F0,0x24F0},	{0x24F1,0x24F1,0x24F1},
	{0x24F2,0x24F2,0x24F2},	{0x24F3,0x24F3,0x24F3},
	{0x24F4,0x24F4,0x24F4},	{0x24F5,0x24F5,0x24F5},
	{0x24F6,0x24F6,0x24F6},	{0x24F7,0x24F7,0x24F7},
	{0x24F8,0x24F8,0x24F8},	{0x24F9,0x24F9,0x24F9},
	{0x24FA,0x24FA,0x24FA},	{0x24FB,0x24FB,0x24FB},
	{0x24FC,0x24FC,0x24FC},	{0x24FD,0x24FD,0x24FD},
	{0x24FE,0x24FE,0x24FE},	{0x24FF,0x24FF,0x24FF}
};

static MY_UNICASE_INFO planeFF[]={
	{0xFF00,0xFF00,0xFF00},	{0xFF01,0xFF01,0xFF01},
	{0xFF02,0xFF02,0xFF02},	{0xFF03,0xFF03,0xFF03},
	{0xFF04,0xFF04,0xFF04},	{0xFF05,0xFF05,0xFF05},
	{0xFF06,0xFF06,0xFF06},	{0xFF07,0xFF07,0xFF07},
	{0xFF08,0xFF08,0xFF08},	{0xFF09,0xFF09,0xFF09},
	{0xFF0A,0xFF0A,0xFF0A},	{0xFF0B,0xFF0B,0xFF0B},
	{0xFF0C,0xFF0C,0xFF0C},	{0xFF0D,0xFF0D,0xFF0D},
	{0xFF0E,0xFF0E,0xFF0E},	{0xFF0F,0xFF0F,0xFF0F},
	{0xFF10,0xFF10,0xFF10},	{0xFF11,0xFF11,0xFF11},
	{0xFF12,0xFF12,0xFF12},	{0xFF13,0xFF13,0xFF13},
	{0xFF14,0xFF14,0xFF14},	{0xFF15,0xFF15,0xFF15},
	{0xFF16,0xFF16,0xFF16},	{0xFF17,0xFF17,0xFF17},
	{0xFF18,0xFF18,0xFF18},	{0xFF19,0xFF19,0xFF19},
	{0xFF1A,0xFF1A,0xFF1A},	{0xFF1B,0xFF1B,0xFF1B},
	{0xFF1C,0xFF1C,0xFF1C},	{0xFF1D,0xFF1D,0xFF1D},
	{0xFF1E,0xFF1E,0xFF1E},	{0xFF1F,0xFF1F,0xFF1F},
	{0xFF20,0xFF20,0xFF20},	{0xFF21,0xFF41,0xFF21},
	{0xFF22,0xFF42,0xFF22},	{0xFF23,0xFF43,0xFF23},
	{0xFF24,0xFF44,0xFF24},	{0xFF25,0xFF45,0xFF25},
	{0xFF26,0xFF46,0xFF26},	{0xFF27,0xFF47,0xFF27},
	{0xFF28,0xFF48,0xFF28},	{0xFF29,0xFF49,0xFF29},
	{0xFF2A,0xFF4A,0xFF2A},	{0xFF2B,0xFF4B,0xFF2B},
	{0xFF2C,0xFF4C,0xFF2C},	{0xFF2D,0xFF4D,0xFF2D},
	{0xFF2E,0xFF4E,0xFF2E},	{0xFF2F,0xFF4F,0xFF2F},
	{0xFF30,0xFF50,0xFF30},	{0xFF31,0xFF51,0xFF31},
	{0xFF32,0xFF52,0xFF32},	{0xFF33,0xFF53,0xFF33},
	{0xFF34,0xFF54,0xFF34},	{0xFF35,0xFF55,0xFF35},
	{0xFF36,0xFF56,0xFF36},	{0xFF37,0xFF57,0xFF37},
	{0xFF38,0xFF58,0xFF38},	{0xFF39,0xFF59,0xFF39},
	{0xFF3A,0xFF5A,0xFF3A},	{0xFF3B,0xFF3B,0xFF3B},
	{0xFF3C,0xFF3C,0xFF3C},	{0xFF3D,0xFF3D,0xFF3D},
	{0xFF3E,0xFF3E,0xFF3E},	{0xFF3F,0xFF3F,0xFF3F},
	{0xFF40,0xFF40,0xFF40},	{0xFF21,0xFF41,0xFF21},
	{0xFF22,0xFF42,0xFF22},	{0xFF23,0xFF43,0xFF23},
	{0xFF24,0xFF44,0xFF24},	{0xFF25,0xFF45,0xFF25},
	{0xFF26,0xFF46,0xFF26},	{0xFF27,0xFF47,0xFF27},
	{0xFF28,0xFF48,0xFF28},	{0xFF29,0xFF49,0xFF29},
	{0xFF2A,0xFF4A,0xFF2A},	{0xFF2B,0xFF4B,0xFF2B},
	{0xFF2C,0xFF4C,0xFF2C},	{0xFF2D,0xFF4D,0xFF2D},
	{0xFF2E,0xFF4E,0xFF2E},	{0xFF2F,0xFF4F,0xFF2F},
	{0xFF30,0xFF50,0xFF30},	{0xFF31,0xFF51,0xFF31},
	{0xFF32,0xFF52,0xFF32},	{0xFF33,0xFF53,0xFF33},
	{0xFF34,0xFF54,0xFF34},	{0xFF35,0xFF55,0xFF35},
	{0xFF36,0xFF56,0xFF36},	{0xFF37,0xFF57,0xFF37},
	{0xFF38,0xFF58,0xFF38},	{0xFF39,0xFF59,0xFF39},
	{0xFF3A,0xFF5A,0xFF3A},	{0xFF5B,0xFF5B,0xFF5B},
	{0xFF5C,0xFF5C,0xFF5C},	{0xFF5D,0xFF5D,0xFF5D},
	{0xFF5E,0xFF5E,0xFF5E},	{0xFF5F,0xFF5F,0xFF5F},
	{0xFF60,0xFF60,0xFF60},	{0xFF61,0xFF61,0xFF61},
	{0xFF62,0xFF62,0xFF62},	{0xFF63,0xFF63,0xFF63},
	{0xFF64,0xFF64,0xFF64},	{0xFF65,0xFF65,0xFF65},
	{0xFF66,0xFF66,0xFF66},	{0xFF67,0xFF67,0xFF67},
	{0xFF68,0xFF68,0xFF68},	{0xFF69,0xFF69,0xFF69},
	{0xFF6A,0xFF6A,0xFF6A},	{0xFF6B,0xFF6B,0xFF6B},
	{0xFF6C,0xFF6C,0xFF6C},	{0xFF6D,0xFF6D,0xFF6D},
	{0xFF6E,0xFF6E,0xFF6E},	{0xFF6F,0xFF6F,0xFF6F},
	{0xFF70,0xFF70,0xFF70},	{0xFF71,0xFF71,0xFF71},
	{0xFF72,0xFF72,0xFF72},	{0xFF73,0xFF73,0xFF73},
	{0xFF74,0xFF74,0xFF74},	{0xFF75,0xFF75,0xFF75},
	{0xFF76,0xFF76,0xFF76},	{0xFF77,0xFF77,0xFF77},
	{0xFF78,0xFF78,0xFF78},	{0xFF79,0xFF79,0xFF79},
	{0xFF7A,0xFF7A,0xFF7A},	{0xFF7B,0xFF7B,0xFF7B},
	{0xFF7C,0xFF7C,0xFF7C},	{0xFF7D,0xFF7D,0xFF7D},
	{0xFF7E,0xFF7E,0xFF7E},	{0xFF7F,0xFF7F,0xFF7F},
	{0xFF80,0xFF80,0xFF80},	{0xFF81,0xFF81,0xFF81},
	{0xFF82,0xFF82,0xFF82},	{0xFF83,0xFF83,0xFF83},
	{0xFF84,0xFF84,0xFF84},	{0xFF85,0xFF85,0xFF85},
	{0xFF86,0xFF86,0xFF86},	{0xFF87,0xFF87,0xFF87},
	{0xFF88,0xFF88,0xFF88},	{0xFF89,0xFF89,0xFF89},
	{0xFF8A,0xFF8A,0xFF8A},	{0xFF8B,0xFF8B,0xFF8B},
	{0xFF8C,0xFF8C,0xFF8C},	{0xFF8D,0xFF8D,0xFF8D},
	{0xFF8E,0xFF8E,0xFF8E},	{0xFF8F,0xFF8F,0xFF8F},
	{0xFF90,0xFF90,0xFF90},	{0xFF91,0xFF91,0xFF91},
	{0xFF92,0xFF92,0xFF92},	{0xFF93,0xFF93,0xFF93},
	{0xFF94,0xFF94,0xFF94},	{0xFF95,0xFF95,0xFF95},
	{0xFF96,0xFF96,0xFF96},	{0xFF97,0xFF97,0xFF97},
	{0xFF98,0xFF98,0xFF98},	{0xFF99,0xFF99,0xFF99},
	{0xFF9A,0xFF9A,0xFF9A},	{0xFF9B,0xFF9B,0xFF9B},
	{0xFF9C,0xFF9C,0xFF9C},	{0xFF9D,0xFF9D,0xFF9D},
	{0xFF9E,0xFF9E,0xFF9E},	{0xFF9F,0xFF9F,0xFF9F},
	{0xFFA0,0xFFA0,0xFFA0},	{0xFFA1,0xFFA1,0xFFA1},
	{0xFFA2,0xFFA2,0xFFA2},	{0xFFA3,0xFFA3,0xFFA3},
	{0xFFA4,0xFFA4,0xFFA4},	{0xFFA5,0xFFA5,0xFFA5},
	{0xFFA6,0xFFA6,0xFFA6},	{0xFFA7,0xFFA7,0xFFA7},
	{0xFFA8,0xFFA8,0xFFA8},	{0xFFA9,0xFFA9,0xFFA9},
	{0xFFAA,0xFFAA,0xFFAA},	{0xFFAB,0xFFAB,0xFFAB},
	{0xFFAC,0xFFAC,0xFFAC},	{0xFFAD,0xFFAD,0xFFAD},
	{0xFFAE,0xFFAE,0xFFAE},	{0xFFAF,0xFFAF,0xFFAF},
	{0xFFB0,0xFFB0,0xFFB0},	{0xFFB1,0xFFB1,0xFFB1},
	{0xFFB2,0xFFB2,0xFFB2},	{0xFFB3,0xFFB3,0xFFB3},
	{0xFFB4,0xFFB4,0xFFB4},	{0xFFB5,0xFFB5,0xFFB5},
	{0xFFB6,0xFFB6,0xFFB6},	{0xFFB7,0xFFB7,0xFFB7},
	{0xFFB8,0xFFB8,0xFFB8},	{0xFFB9,0xFFB9,0xFFB9},
	{0xFFBA,0xFFBA,0xFFBA},	{0xFFBB,0xFFBB,0xFFBB},
	{0xFFBC,0xFFBC,0xFFBC},	{0xFFBD,0xFFBD,0xFFBD},
	{0xFFBE,0xFFBE,0xFFBE},	{0xFFBF,0xFFBF,0xFFBF},
	{0xFFC0,0xFFC0,0xFFC0},	{0xFFC1,0xFFC1,0xFFC1},
	{0xFFC2,0xFFC2,0xFFC2},	{0xFFC3,0xFFC3,0xFFC3},
	{0xFFC4,0xFFC4,0xFFC4},	{0xFFC5,0xFFC5,0xFFC5},
	{0xFFC6,0xFFC6,0xFFC6},	{0xFFC7,0xFFC7,0xFFC7},
	{0xFFC8,0xFFC8,0xFFC8},	{0xFFC9,0xFFC9,0xFFC9},
	{0xFFCA,0xFFCA,0xFFCA},	{0xFFCB,0xFFCB,0xFFCB},
	{0xFFCC,0xFFCC,0xFFCC},	{0xFFCD,0xFFCD,0xFFCD},
	{0xFFCE,0xFFCE,0xFFCE},	{0xFFCF,0xFFCF,0xFFCF},
	{0xFFD0,0xFFD0,0xFFD0},	{0xFFD1,0xFFD1,0xFFD1},
	{0xFFD2,0xFFD2,0xFFD2},	{0xFFD3,0xFFD3,0xFFD3},
	{0xFFD4,0xFFD4,0xFFD4},	{0xFFD5,0xFFD5,0xFFD5},
	{0xFFD6,0xFFD6,0xFFD6},	{0xFFD7,0xFFD7,0xFFD7},
	{0xFFD8,0xFFD8,0xFFD8},	{0xFFD9,0xFFD9,0xFFD9},
	{0xFFDA,0xFFDA,0xFFDA},	{0xFFDB,0xFFDB,0xFFDB},
	{0xFFDC,0xFFDC,0xFFDC},	{0xFFDD,0xFFDD,0xFFDD},
	{0xFFDE,0xFFDE,0xFFDE},	{0xFFDF,0xFFDF,0xFFDF},
	{0xFFE0,0xFFE0,0xFFE0},	{0xFFE1,0xFFE1,0xFFE1},
	{0xFFE2,0xFFE2,0xFFE2},	{0xFFE3,0xFFE3,0xFFE3},
	{0xFFE4,0xFFE4,0xFFE4},	{0xFFE5,0xFFE5,0xFFE5},
	{0xFFE6,0xFFE6,0xFFE6},	{0xFFE7,0xFFE7,0xFFE7},
	{0xFFE8,0xFFE8,0xFFE8},	{0xFFE9,0xFFE9,0xFFE9},
	{0xFFEA,0xFFEA,0xFFEA},	{0xFFEB,0xFFEB,0xFFEB},
	{0xFFEC,0xFFEC,0xFFEC},	{0xFFED,0xFFED,0xFFED},
	{0xFFEE,0xFFEE,0xFFEE},	{0xFFEF,0xFFEF,0xFFEF},
	{0xFFF0,0xFFF0,0xFFF0},	{0xFFF1,0xFFF1,0xFFF1},
	{0xFFF2,0xFFF2,0xFFF2},	{0xFFF3,0xFFF3,0xFFF3},
	{0xFFF4,0xFFF4,0xFFF4},	{0xFFF5,0xFFF5,0xFFF5},
	{0xFFF6,0xFFF6,0xFFF6},	{0xFFF7,0xFFF7,0xFFF7},
	{0xFFF8,0xFFF8,0xFFF8},	{0xFFF9,0xFFF9,0xFFF9},
	{0xFFFA,0xFFFA,0xFFFA},	{0xFFFB,0xFFFB,0xFFFB},
	{0xFFFC,0xFFFC,0xFFFC},	{0xFFFD,0xFFFD,0xFFFD},
	{0xFFFE,0xFFFE,0xFFFE},	{0xFFFF,0xFFFF,0xFFFF}
};

MY_UNICASE_INFO *my_unicase_default[256]={
 plane00, plane01, plane02, plane03, plane04, plane05,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL, plane1E, plane1F,
	NULL, plane21,	NULL,	NULL, plane24,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,
	NULL,	NULL,	NULL,	NULL,	NULL,	NULL,	NULL, planeFF

};

#define MY_CS_ILSEQ	0		 /* Wrong by sequence: wb_wc	*/
#define MY_CS_TOOSMALL	-101	/* Need at least one byte:		wc_mb and mb_wc */
#define MY_CS_TOOSMALL2 -102	/* Need at least two bytes:	 wc_mb and mb_wc */
#define MY_CS_TOOSMALL3 -103	/* Need at least three bytes: wc_mb and mb_wc */
#define MY_CS_TOOSMALL4 -104	/* Need at least 4 bytes: wc_mb and mb_wc */
#define MY_CS_TOOSMALL5 -105	/* Need at least 5 bytes: wc_mb and mb_wc */
#define MY_CS_TOOSMALL6 -106	/* Need at least 6 bytes: wc_mb and mb_wc */


static int my_utf8_uni(unsigned long * pwc, const unsigned char *s, const unsigned char *e)
{
	unsigned char c;

	if (s >= e)
		return MY_CS_TOOSMALL;

	c= s[0];
	if (c < 0x80)
	{
		*pwc = c;
		return 1;
	}
	else if (c < 0xc2)
		return MY_CS_ILSEQ;
	else if (c < 0xe0)
	{
		if (s+2 > e) /* We need 2 characters */
			return MY_CS_TOOSMALL2;

		if (!((s[1] ^ 0x80) < 0x40))
			return MY_CS_ILSEQ;

		*pwc = ((unsigned long) (c & 0x1f) << 6) | (unsigned long) (s[1] ^ 0x80);
		return 2;
	}
	else if (c < 0xf0)
	{
		if (s+3 > e) /* We need 3 characters */
			return MY_CS_TOOSMALL3;

		if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 &&
					(c >= 0xe1 || s[1] >= 0xa0)))
			return MY_CS_ILSEQ;

		*pwc = ((unsigned long) (c & 0x0f) << 12)	 |
					 ((unsigned long) (s[1] ^ 0x80) << 6) |
						(unsigned long) (s[2] ^ 0x80);

		return 3;
	}
#ifdef UNICODE_32BIT
	else if (c < 0xf8 && sizeof(my_wc_t)*8 >= 32)
	{
		if (s+4 > e) /* We need 4 characters */
			return MY_CS_TOOSMALL4;

		if (!((s[1] ^ 0x80) < 0x40 &&
					(s[2] ^ 0x80) < 0x40 &&
					(s[3] ^ 0x80) < 0x40 &&
					(c >= 0xf1 || s[1] >= 0x90)))
			return MY_CS_ILSEQ;

		*pwc = ((unsigned long) (c & 0x07) << 18)		|
					 ((unsigned long) (s[1] ^ 0x80) << 12) |
					 ((unsigned long) (s[2] ^ 0x80) << 6)	|
						(unsigned long) (s[3] ^ 0x80);

		return 4;
	}
	else if (c < 0xfc && sizeof(my_wc_t)*8 >= 32)
	{
		if (s+5 >e) /* We need 5 characters */
			return MY_CS_TOOSMALL5;

		if (!((s[1] ^ 0x80) < 0x40 &&
					(s[2] ^ 0x80) < 0x40 &&
					(s[3] ^ 0x80) < 0x40 &&
					(s[4] ^ 0x80) < 0x40 &&
					(c >= 0xf9 || s[1] >= 0x88)))
			return MY_CS_ILSEQ;

		*pwc = ((unsigned long) (c & 0x03) << 24) |
					 ((unsigned long) (s[1] ^ 0x80) << 18) |
					 ((unsigned long) (s[2] ^ 0x80) << 12) |
					 ((unsigned long) (s[3] ^ 0x80) << 6) |
						(unsigned long) (s[4] ^ 0x80);
		return 5;
	}
	else if (c < 0xfe && sizeof(my_wc_t)*8 >= 32)
	{
		if ( s+6 >e ) /* We need 6 characters */
			return MY_CS_TOOSMALL6;

		if (!((s[1] ^ 0x80) < 0x40	 &&
					(s[2] ^ 0x80) < 0x40	 &&
					(s[3] ^ 0x80) < 0x40	 &&
					(s[4] ^ 0x80) < 0x40	 &&
					(s[5] ^ 0x80) < 0x40	 &&
					(c >= 0xfd || s[1] >= 0x84)))
			return MY_CS_ILSEQ;

		*pwc = ((unsigned long) (c & 0x01) << 30)
			| ((unsigned long) (s[1] ^ 0x80) << 24)
			| ((unsigned long) (s[2] ^ 0x80) << 18)
			| ((unsigned long) (s[3] ^ 0x80) << 12)
			| ((unsigned long) (s[4] ^ 0x80) << 6)
			| (unsigned long) (s[5] ^ 0x80);
		return 6;
	}
#endif
	return MY_CS_ILSEQ;
}

#define MY_CS_ILUNI	0		 /* Cannot encode Unicode to charset: wc_mb		*/
#define MY_CS_TOOSMALLN(n)		(-100-(n))

static int my_uni_utf8(unsigned long wc, unsigned char *r, unsigned char *e)
{
	int count;

	if (r >= e)
		return MY_CS_TOOSMALL;

	if (wc < 0x80)
		count = 1;
	else if (wc < 0x800)
		count = 2;
	else if (wc < 0x10000)
		count = 3;
#ifdef UNICODE_32BIT
	else if (wc < 0x200000)
		count = 4;
	else if (wc < 0x4000000)
		count = 5;
	else if (wc <= 0x7fffffff)
		count = 6;
#endif
		else return MY_CS_ILUNI;

	/*
		e is a character after the string r, not the last character of it.
		Because of it (r+count > e), not (r+count-1 >e )
	 */
	if ( r+count > e )
		return MY_CS_TOOSMALLN(count);

	switch (count) {
		/* Fall through all cases!!! */
#ifdef UNICODE_32BIT
		case 6: r[5] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x4000000;
		case 5: r[4] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x200000;
		case 4: r[3] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x10000;
#endif
		case 3: r[2] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x800;
		case 2: r[1] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0xc0;
		case 1: r[0] = (unsigned char) wc;
	}
	return count;
}


static int cppmysql_caseup_utf8(const char * src, size_t srclen, char *dst, size_t dstlen)
{
	unsigned long wc;
	int srcres, dstres;
	const char *srcend = src + srclen;
	char *dstend = dst + dstlen, *dst0 = dst;
	MY_UNICASE_INFO **uni_plane= my_unicase_default;

	while ((src < srcend) && (srcres= my_utf8_uni(&wc, (unsigned char *) src, (unsigned char*) srcend)) > 0) {
		int plane = (wc>>8) & 0xFF;
		wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].toupper : wc;
		if ((dstres = my_uni_utf8(wc, (unsigned char*) dst, (unsigned char*) dstend)) <= 0) {
			break;
		}
		src += srcres;
		dst += dstres;
	}
	return static_cast<int>((dst - dst0));
}


char * utf8_strup(const char * const src, size_t srclen)
{
	size_t dstlen;
	char * dst;
	if (srclen == 0) {
		srclen = strlen(src);
	}
	dst = new char[(dstlen = srclen * 4) + 1];
	if (!dst) {
		return NULL;
	}
	dst[cppmysql_caseup_utf8(src, srclen, dst, dstlen)] = '\0';
	return dst;
}


/*
  HPUX has some problems with long double : http://docs.hp.com/en/B3782-90716/ch02s02.html

  strtold() has implementations that return struct long_double, 128bit one,
  which contains four 32bit words.
  Fix described :
  --------
  union {
	long_double l_d;
	long double ld;
  } u;
  // convert str to a long_double; store return val in union
  //(Putting value into union enables converted value to be
  // accessed as an ANSI C long double)
  u.l_d = strtold( (const char *)str, (char **)NULL);
  --------
  reinterpret_cast doesn't work :(
*/


long double strtold(const char *nptr, char **endptr)
{
/*
 * Experienced odd compilation errors on one of windows build hosts -
 * cmake reported there is strold function. Since double and long double on windows
 * are of the same size - we are using strtod on those platforms regardless
 * to the HAVE_FUNCTION_STRTOLD value
 */
#ifdef _WIN32
  return ::strtod(nptr, endptr);
#else
# ifndef HAVE_FUNCTION_STRTOLD
	return ::strtod(nptr, endptr);
# else
#  if defined(__hpux) && defined(_LONG_DOUBLE)
	union {
		long_double l_d;
		long double ld;
	} u;
	u.l_d = ::strtold( nptr, endptr);
	return u.ld;
#  else
	return ::strtold(nptr, endptr);
#  endif
# endif
#endif

}


} /* namespace util */
} /* namespace mysql */
} /* namespace sql */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */
