maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #06259
Re: Review of base64.diff and german2.diff
Hi Monty,
thanks for review.
Btw, I did not tell you what the german2 patch actually includes:
1. WL#4013 Unicode german2 collation
itself.
2. WL#5624 Collation customization improvements
(prerequisite for german2)
http://dev.mysql.com/worklog/task/?id=5624
3. Joro's patch for "Bug#62429 XML: ExtractValue, UpdateXML max arg
length 127 chars."
(prerequisite for WL#5624)
4. Partially, mtr tests for WL#5624.
The other part of the WL#5624 tests depends on the WEIGHT_STRING()
function which we have not merged yet.
Comparing to the first version of the patch,
the second version additionally includes:
- Monty's review suggestions addressed.
- Added *partially* tests for WL#5624 (those not needing WEIGHT_STRING)
- Added "WL#5624 Part 13. More verbosity when reading character set
definition file" which I somehow missed in the first version.
Please also see comments inline:
On 09/12/2013 04:32 PM, Michael Widenius wrote:
Review of german2.diff
=== modified file 'include/my_global.h'
--- include/my_global.h 2013-07-21 14:39:19 +0000
+++ include/my_global.h 2013-08-29 08:27:09 +0000
@@ -1218,4 +1218,11 @@ static inline double rint(double x)
#define HAVE_EXTERNAL_CLIENT
#endif /* EMBEDDED_LIBRARY */
+
+enum loglevel {
+ ERROR_LEVEL= 0,
+ WARNING_LEVEL= 1,
+ INFORMATION_LEVEL= 2
+};
+
#endif /* my_global_h */
Not sure why the above, which is a my_sys construct, should be in
my_global.h. Please add at least a comment about this.
my_sys.h includes m_ctype.h.
The definition of loglevel was in my_sys.h,
but now it's needed in m_ctype.h as well.
So I just moved the definition of loglevel to my_global.h,
which is seen in both m_ctype.h and my_sys.h.
That solved the problem, but as you say, introduced
extra visibility of "loglevel", which is not good.
In the second version of the patch (attached) I
just moved the definition of loglevel from my_sys.h
to m_ctype.h instead.
It solves all definition dependencies and does not
introduce extra visibility.
=== modified file 'mysys/charset.c'
--- mysys/charset.c 2012-08-14 14:23:34 +0000
+++ mysys/charset.c 2013-08-29 12:38:44 +0000
@@ -66,6 +66,9 @@ static my_bool init_state_maps(struct ch
if (!(cs->ident_map= ident_map= (uchar*) my_once_alloc(256, MYF(MY_WME))))
return 1;
+ state_map= (uchar *) cs->state_map;
+ ident_map= (uchar *) cs->ident_map;
Why is the above needed?
They are already set one line above.
(In addition cs->state_map and cs->ident_map are already uchar *)
Thanks for noticing this. Removed.
--- strings/ctype-simple.c 2013-07-21 14:39:19 +0000
+++ strings/ctype-simple.c 2013-08-29 09:05:07 +0000
@@ -1163,12 +1163,12 @@ static int pcmp(const void * f, const vo
return res;
}
-static my_bool create_fromuni(struct charset_info_st *cs,
- void *(*alloc)(size_t))
+static my_bool
+create_fromuni(struct charset_info_st *cs,
+ MY_CHARSET_LOADER *loader)
{
uni_idx idx[PLANE_NUM];
int i,n;
- struct my_uni_idx_st *tab_from_uni;
/*
Check that Unicode map is loaded.
@@ -1209,18 +1209,18 @@ static my_bool create_fromuni(struct cha
for (i=0; i < PLANE_NUM; i++)
{
int ch,numchars;
- uchar *tab;
/* Skip empty plane */
if (!idx[i].nchars)
break;
numchars=idx[i].uidx.to-idx[i].uidx.from+1;
- if (!(idx[i].uidx.tab= tab= (uchar*)
- alloc(numchars * sizeof(*idx[i].uidx.tab))))
+ if (!(idx[i].uidx.tab= (uchar *)
+ (loader->once_alloc) (numchars *
+ sizeof(*idx[i].uidx.tab))))
return TRUE;
- bzero(tab,numchars*sizeof(*tab));
+ bzero((char*) idx[i].uidx.tab, numchars * sizeof(*idx[i].uidx.tab));
for (ch=1; ch < PLANE_SIZE; ch++)
{
@@ -1228,32 +1228,32 @@ static my_bool create_fromuni(struct cha
if (wc >= idx[i].uidx.from && wc <= idx[i].uidx.to && wc)
{
int ofs= wc - idx[i].uidx.from;
- tab[ofs]= ch;
+ ((char *) idx[i].uidx.tab)[ofs]= ch;
}
}
}
Why remove tab to be a shortcut for idx[i].uidx.from ?
Shouldn't it be faster and shorter to use tab than using idx[i].uidx.from?
(At least in this place)
I guess you mean idx[i].uidx.tab.
Okey, I restored the variable.
But generally I don't like pointer aliases (as it's bug prone).
Moreover, having an alias in this code does not improve performance,
because this code is called only once per collation during mysqld life
time.
The best choice would probably be to move the loop inside a function
and pass idx[i].uidx.tab into the function.
-static const uint16 page0FCdata[]= { /* FC00 (3 weights per char) */
+static uint16 page0FCdata[]= { /* FC00 (3 weights per char) */
0x134F,0x135E,0x0000, 0x134F,0x1364,0x0000, 0x134F,0x13B0,0x0000,
0x134F,0x13C7,0x0000, 0x134F,0x13C8,0x0000, 0x1352,0x135E,0x0000,
0x1352,0x1364,0x0000, 0x1352,0x1365,0x0000, 0x1352,0x13B0,0x0000,
@@ -6006,7 +6005,7 @@ static const uint16 page0FCdata[]= { /*
0x1381,0x13C8,0x0000, 0x1382,0x13C7,0x0000, 0x1382,0x13C8,0x0000,
0x1364,0x13C7,0x0000 };
If we are not going to change the above, better to keep these as
const!
They will then be in the const segment and you will have protection
from anyone trying to change these!
Changed back to const.
I had to do two casts though, in this variable definition,
to resolve const/non-const conflict:
MY_UCA_INFO my_uca_v400=
{
{
{
0xFFFF, /* maxchar */
(uchar *) uca_length,
(uint16 **) uca_weight,
{ /* Contractions: */
0, /* nitems */
NULL, /* item */
NULL /* flags */
}
},
},
which should be fine.
<cut>
+my_uca_add_contraction(MY_CONTRACTIONS *list, my_wc_t *wc, size_t len,
+ my_bool with_context)
{
- MY_CONTRACTIONS *list= (MY_CONTRACTIONS*) cs->contractions;
MY_CONTRACTION *next= &list->item[list->nitems];
- DBUG_ASSERT(len == 2); /* We currently support only contraction2 */
- next->ch[0]= wc[0];
- next->ch[1]= wc[1];
+ size_t i;
+ /*
+ Contraction is always at least 2 characters.
+ Contraction is never longer than MY_UCA_MAX_CONTRACTION,
+ which is guaranteed by using my_coll_rule_expand() with proper limit.
+ */
+ DBUG_ASSERT(len > 1 && len <= MY_UCA_MAX_CONTRACTION);
+ for (i= 0; i < len; i++)
+ {
+ /*
+ We don't support contractions with U+0000.
+ my_coll_rule_expand() guarantees there're no U+0000 in a contraction.
+ */
+ DBUG_ASSERT(wc[i] != 0);
+ next->ch[i]= wc[i];
+ }
+ if (i < MY_UCA_MAX_CONTRACTION)
+ next->ch[i]= 0; /* Add end-of-line marker */
Wouldn't it make life easier to always have the marker there?
(Ie, always have place for the marker).
At least you can remove one if from the code. If there is more than
one if to remove, then it's a simple optimzation do to...
The Unicode Collation Algorithm tables are quite huge.
See ctype-uca.c. Adding a space for 0-terminator for every
character weight would make the tables even huger.
Not sure if we should do this.
Originally, in mysql-4.1 times, I intentionally made this to reduce
table sizes.
<cut>
+static int
+my_coll_parser_too_long_error(MY_COLL_RULE_PARSER *p, const char *name)
+{
+ my_snprintf(p->errstr, sizeof(p->errstr), "%s is too long", name);
+ return 0;
+}
You should limit '%s' to 64 characters so that one gets the name in
the output even if it's over sizeof()...
>
> %-.64s ....
The list of possible values that are passed to this functions is:
"Contraction"
"Expansion"
"Context"
"logical position"
No needs for %-.64s.
<cut>
Regards,
Monty
=== modified file 'include/m_ctype.h'
--- include/m_ctype.h 2013-08-07 15:40:25 +0000
+++ include/m_ctype.h 2013-09-17 11:21:50 +0000
@@ -23,6 +23,12 @@
#include <my_attribute.h>
#include "my_global.h" /* uint16, uchar */
+enum loglevel {
+ ERROR_LEVEL= 0,
+ WARNING_LEVEL= 1,
+ INFORMATION_LEVEL= 2
+};
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -57,28 +63,39 @@ extern "C" {
typedef const struct my_charset_handler_st MY_CHARSET_HANDLER;
typedef const struct my_collation_handler_st MY_COLLATION_HANDLER;
-typedef const struct unicase_info_st MY_UNICASE_INFO;
+typedef struct unicase_info_st MY_UNICASE_INFO;
typedef const struct uni_ctype_st MY_UNI_CTYPE;
typedef const struct my_uni_idx_st MY_UNI_IDX;
-struct unicase_info_st
+typedef struct unicase_info_char_st
{
uint32 toupper;
uint32 tolower;
uint32 sort;
+} MY_UNICASE_CHARACTER;
+
+
+struct unicase_info_st
+{
+ my_wc_t maxchar;
+ MY_UNICASE_CHARACTER **page;
};
-extern MY_UNICASE_INFO *const my_unicase_default[256];
-extern MY_UNICASE_INFO *const my_unicase_turkish[256];
-extern MY_UNICASE_INFO *const my_unicase_mysql500[256];
-#define MY_UCA_MAX_CONTRACTION 4
+extern MY_UNICASE_INFO my_unicase_default;
+extern MY_UNICASE_INFO my_unicase_turkish;
+extern MY_UNICASE_INFO my_unicase_mysql500;
+extern MY_UNICASE_INFO my_unicase_unicode520;
+
+#define MY_UCA_MAX_CONTRACTION 6
#define MY_UCA_MAX_WEIGHT_SIZE 8
+#define MY_UCA_WEIGHT_LEVELS 1
typedef struct my_contraction_t
{
my_wc_t ch[MY_UCA_MAX_CONTRACTION]; /* Character sequence */
uint16 weight[MY_UCA_MAX_WEIGHT_SIZE];/* Its weight string, 0-terminated */
+ my_bool with_context;
} MY_CONTRACTION;
@@ -89,6 +106,46 @@ typedef struct my_contraction_list_t
char *flags; /* Character flags, e.g. "is contraction head") */
} MY_CONTRACTIONS;
+my_bool my_uca_can_be_contraction_head(const MY_CONTRACTIONS *c, my_wc_t wc);
+my_bool my_uca_can_be_contraction_tail(const MY_CONTRACTIONS *c, my_wc_t wc);
+uint16 *my_uca_contraction2_weight(const MY_CONTRACTIONS *c,
+ my_wc_t wc1, my_wc_t wc2);
+
+
+/* Collation weights on a single level (e.g. primary, secondary, tertiarty) */
+typedef struct my_uca_level_info_st
+{
+ my_wc_t maxchar;
+ uchar *lengths;
+ uint16 **weights;
+ MY_CONTRACTIONS contractions;
+} MY_UCA_WEIGHT_LEVEL;
+
+
+typedef struct uca_info_st
+{
+ MY_UCA_WEIGHT_LEVEL level[MY_UCA_WEIGHT_LEVELS];
+
+ /* Logical positions */
+ my_wc_t first_non_ignorable;
+ my_wc_t last_non_ignorable;
+ my_wc_t first_primary_ignorable;
+ my_wc_t last_primary_ignorable;
+ my_wc_t first_secondary_ignorable;
+ my_wc_t last_secondary_ignorable;
+ my_wc_t first_tertiary_ignorable;
+ my_wc_t last_tertiary_ignorable;
+ my_wc_t first_trailing;
+ my_wc_t last_trailing;
+ my_wc_t first_variable;
+ my_wc_t last_variable;
+
+} MY_UCA_INFO;
+
+
+
+extern MY_UCA_INFO my_uca_v400;
+
struct uni_ctype_st
{
@@ -122,7 +179,7 @@ extern MY_UNI_CTYPE my_uni_ctype[256];
#define MY_CS_BINSORT 16 /* if binary sort order */
#define MY_CS_PRIMARY 32 /* if primary collation */
#define MY_CS_STRNXFRM 64 /* if strnxfrm is used for sort */
-#define MY_CS_UNICODE 128 /* is a charset is full unicode */
+#define MY_CS_UNICODE 128 /* is a charset is BMP Unicode */
#define MY_CS_READY 256 /* if a charset is initialized */
#define MY_CS_AVAILABLE 512 /* If either compiled-in or loaded*/
#define MY_CS_CSSORT 1024 /* if case sensitive sort order */
@@ -130,6 +187,7 @@ extern MY_UNI_CTYPE my_uni_ctype[256];
#define MY_CS_PUREASCII 4096 /* if a charset is pure ascii */
#define MY_CS_NONASCII 8192 /* if not ASCII-compatible */
#define MY_CS_UNICODE_SUPPLEMENT 16384 /* Non-BMP Unicode characters */
+#define MY_CS_LOWER_SORT 32768 /* If use lower case as weight */
#define MY_CHARSET_UNDEFINED 0
/* Character repertoire flags */
@@ -202,13 +260,24 @@ enum my_lex_states
struct charset_info_st;
+typedef struct my_charset_loader_st
+{
+ char error[128];
+ void *(*once_alloc)(size_t);
+ void *(*malloc)(size_t);
+ void *(*realloc)(void *, size_t);
+ void (*free)(void *);
+ void (*reporter)(enum loglevel, const char *format, ...);
+ int (*add_collation)(struct charset_info_st *cs);
+} MY_CHARSET_LOADER;
+
extern int (*my_string_stack_guard)(int);
/* See strings/CHARSET_INFO.txt for information about this structure */
struct my_collation_handler_st
{
- my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t));
+ my_bool (*init)(struct charset_info_st *, MY_CHARSET_LOADER *);
/* Collation routines */
int (*strnncoll)(CHARSET_INFO *,
const uchar *, size_t, const uchar *, size_t, my_bool);
@@ -259,7 +328,7 @@ typedef size_t (*my_charset_conv_case)(C
/* See strings/CHARSET_INFO.txt about information on this structure */
struct my_charset_handler_st
{
- my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t));
+ my_bool (*init)(struct charset_info_st *, MY_CHARSET_LOADER *loader);
/* Multibyte routines */
uint (*ismbchar)(CHARSET_INFO *, const char *, const char *);
uint (*mbcharlen)(CHARSET_INFO *, uint c);
@@ -322,6 +391,13 @@ struct my_charset_handler_st
extern MY_CHARSET_HANDLER my_charset_8bit_handler;
extern MY_CHARSET_HANDLER my_charset_ucs2_handler;
+
+/*
+ We define this CHARSET_INFO_DEFINED here to prevent a repeat of the
+ typedef in hash.c, which will cause a compiler error.
+*/
+#define CHARSET_INFO_DEFINED
+
/* See strings/CHARSET_INFO.txt about information on this structure */
struct charset_info_st
{
@@ -337,11 +413,10 @@ struct charset_info_st
const uchar *to_lower;
const uchar *to_upper;
const uchar *sort_order;
- const MY_CONTRACTIONS *contractions;
- const uint16 *const *sort_order_big;
+ MY_UCA_INFO *uca;
const uint16 *tab_to_uni;
- MY_UNI_IDX *tab_from_uni;
- MY_UNICASE_INFO *const *caseinfo;
+ MY_UNI_IDX *tab_from_uni;
+ MY_UNICASE_INFO *caseinfo;
const uchar *state_map;
const uchar *ident_map;
uint strxfrm_multiply;
@@ -349,8 +424,8 @@ struct charset_info_st
uchar casedn_multiply;
uint mbminlen;
uint mbmaxlen;
- uint16 min_sort_char;
- uint16 max_sort_char; /* For LIKE optimization */
+ my_wc_t min_sort_char;
+ my_wc_t max_sort_char; /* For LIKE optimization */
uchar pad_char;
my_bool escape_with_backslash_is_dangerous;
@@ -600,10 +675,10 @@ int my_wildcmp_unicode(CHARSET_INFO *cs,
const char *str, const char *str_end,
const char *wildstr, const char *wildend,
int escape, int w_one, int w_many,
- MY_UNICASE_INFO *const *weights);
+ MY_UNICASE_INFO *weights);
-extern my_bool my_parse_charset_xml(const char *bug, size_t len,
- int (*add)(struct charset_info_st *cs));
+extern my_bool my_parse_charset_xml(MY_CHARSET_LOADER *loader,
+ const char *buf, size_t buflen);
extern char *my_strchr(CHARSET_INFO *cs, const char *str, const char *end,
pchar c);
extern size_t my_strcspn(CHARSET_INFO *cs, const char *str, const char *end,
@@ -620,6 +695,9 @@ uint my_charset_repertoire(CHARSET_INFO
my_bool my_charset_is_ascii_compatible(CHARSET_INFO *cs);
+const MY_CONTRACTIONS *my_charset_get_contractions(const CHARSET_INFO *cs,
+ int level);
+
extern size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n,
const char* fmt, va_list ap);
=== modified file 'include/m_string.h'
--- include/m_string.h 2013-07-21 14:39:19 +0000
+++ include/m_string.h 2013-08-29 10:01:47 +0000
@@ -73,10 +73,12 @@ extern "C" {
#endif
/*
- my_str_malloc() and my_str_free() are assigned to implementations in
- strings/alloc.c, but can be overridden in the calling program.
+ my_str_malloc(), my_str_realloc() and my_str_free() are assigned to
+ implementations in strings/alloc.c, but can be overridden in
+ the calling program.
*/
extern void *(*my_str_malloc)(size_t);
+extern void *(*my_str_realloc)(void *, size_t);
extern void (*my_str_free)(void *);
#if defined(HAVE_STPCPY) && MY_GNUC_PREREQ(3, 4) && !defined(__INTEL_COMPILER)
=== modified file 'include/my_sys.h'
--- include/my_sys.h 2013-07-21 14:39:19 +0000
+++ include/my_sys.h 2013-09-17 12:37:26 +0000
@@ -270,12 +270,6 @@ extern char wild_many,wild_one,wild_pref
extern const char *charsets_dir;
extern my_bool timed_mutexes;
-enum loglevel {
- ERROR_LEVEL,
- WARNING_LEVEL,
- INFORMATION_LEVEL
-};
-
enum cache_type
{
TYPE_NOT_SET= 0, READ_CACHE, WRITE_CACHE,
@@ -946,15 +940,20 @@ void my_uuid2str(const uchar *guid, char
void my_uuid_end();
/* character sets */
+extern void my_charset_loader_init_mysys(MY_CHARSET_LOADER *loader);
extern uint get_charset_number(const char *cs_name, uint cs_flags);
extern uint get_collation_number(const char *name);
extern const char *get_charset_name(uint cs_number);
extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
+extern CHARSET_INFO *my_collation_get_by_name(MY_CHARSET_LOADER *loader,
+ const char *name, myf flags);
extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
uint cs_flags, myf my_flags);
-
+extern CHARSET_INFO *my_charset_get_by_name(MY_CHARSET_LOADER *loader,
+ const char *name,
+ uint cs_flags, myf my_flags);
extern my_bool resolve_charset(const char *cs_name,
CHARSET_INFO *default_cs,
CHARSET_INFO **cs);
=== modified file 'include/my_xml.h'
--- include/my_xml.h 2013-03-19 14:53:48 +0000
+++ include/my_xml.h 2013-08-29 09:58:41 +0000
@@ -52,8 +52,15 @@ typedef struct xml_stack_st
int flags;
enum my_xml_node_type current_node_type;
char errstr[128];
- char attr[128];
- char *attrend;
+
+ struct {
+ char static_buffer[128];
+ char *buffer;
+ size_t buffer_size;
+ char *start;
+ char *end;
+ } attr;
+
const char *beg;
const char *cur;
const char *end;
=== modified file 'mysql-test/r/ctype_ldml.result'
--- mysql-test/r/ctype_ldml.result 2010-03-24 15:03:44 +0000
+++ mysql-test/r/ctype_ldml.result 2013-09-17 16:22:29 +0000
@@ -411,10 +411,19 @@ select * from information_schema.collati
COLLATION_NAME CHARACTER_SET_NAME ID IS_DEFAULT IS_COMPILED SORTLEN
utf8mb4_test_ci utf8mb4 326 8
utf16_test_ci utf16 327 8
+utf8mb4_test_400_ci utf8mb4 328 8
+utf8_bengali_standard_ci utf8 336 8
+utf8_bengali_traditional_ci utf8 337 8
utf8_phone_ci utf8 352 8
utf8_test_ci utf8 353 8
+utf8_5624_1 utf8 354 8
+utf8_5624_2 utf8 355 8
+utf8_5624_3 utf8 356 8
+utf8_5624_4 utf8 357 8
ucs2_test_ci ucs2 358 8
ucs2_vn_ci ucs2 359 8
+ucs2_5624_1 ucs2 360 8
+utf8_5624_5 utf8 368 8
utf32_test_ci utf32 391 8
utf8_maxuserid_ci utf8 2047 8
show collation like '%test%';
@@ -423,6 +432,7 @@ latin1_test latin1 99 Yes 1
utf8_test_ci utf8 353 8
ucs2_test_ci ucs2 358 8
utf8mb4_test_ci utf8mb4 326 8
+utf8mb4_test_400_ci utf8mb4 328 8
utf16_test_ci utf16 327 8
utf32_test_ci utf32 391 8
show collation like 'ucs2_vn_ci';
@@ -449,3 +459,631 @@ SHOW COLLATION LIKE 'utf8_phone_ci';
Collation Charset Id Default Compiled Sortlen
utf8_phone_ci utf8 352 8
SET NAMES utf8;
+SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a));
+hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci) hex(lower(@a))
+F0909080 F0909080
+SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a));
+hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci) hex(upper(@a))
+F09090A8 F09090A8
+SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a));
+hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci) hex(lower(@a))
+E2B080 E2B080
+SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a));
+hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci) hex(upper(@a))
+E2B0B0 E2B0B0
+#
+# WL#5624 Collation customization improvements
+#
+SET NAMES utf8 COLLATE utf8_5624_1;
+CREATE TABLE t1 AS SELECT REPEAT(' ', 16) AS a LIMIT 0;
+INSERT INTO t1 VALUES ('012345'),('001234'),('000123'),('000012'),('000001');
+INSERT INTO t1 VALUES ('12345'),('01234'),('00123'),('00012'),('00001');
+INSERT INTO t1 VALUES ('1234'),('0123'),('0012'),('0001');
+INSERT INTO t1 VALUES ('123'),('012'),('001');
+INSERT INTO t1 VALUES ('12'),('01');
+INSERT INTO t1 VALUES ('1'),('9');
+INSERT INTO t1 VALUES ('ÐÐÐ'),('ÐÐÐÐÐ');
+INSERT INTO t1 VALUES ('a'),('b'),('c'),('d'),('e');
+INSERT INTO t1 VALUES ('cz'),('Ä'),('Ä');
+INSERT INTO t1 VALUES ('f'),('fz'),('g'),('Ä '),('Ä¡');
+INSERT INTO t1 VALUES ('h'),('hz'),('GĦ'),('Għ'),('gĦ'),('għ');
+INSERT INTO t1 VALUES ('i'),('iz'),('Ħ'),('ħ');
+INSERT INTO t1 VALUES ('y'),('yz'),('z'),('Ż'),('ż');
+INSERT INTO t1 VALUES ('Ä'),('Ä'),('á'),('Ã'),('à '),('Ã');
+INSERT INTO t1 VALUES ('Ä'),('é'),('Ä'),('ê'),('Ä'),('Ã'),('Ä'),('Ã');
+INSERT INTO t1 VALUES ('a'),('~'),('!'),('@'),('#'),('$'),('%'),('^');
+INSERT INTO t1 VALUES ('('),(')'),('-'),('+'),('|'),('='),(':'),(';');
+INSERT INTO t1 VALUES ('"'),('\''),('?');
+INSERT INTO t1 VALUES ('ch'),('k'),('cs'),('ccs'),('cscs');
+INSERT INTO t1 VALUES ('aa-'),('ab-'),('ac-'),('ad-'),('ae-'),('af-'),('az-');
+INSERT INTO t1 VALUES ('lp-fni'),('lp-lni');
+INSERT INTO t1 VALUES ('lp-fpi'),('lp-lpi');
+INSERT INTO t1 VALUES ('lp-fsi'),('lp-lsi');
+INSERT INTO t1 VALUES ('lp-fti'),('lp-lti');
+INSERT INTO t1 VALUES ('lp-ft'),('lp-lt');
+INSERT INTO t1 VALUES ('lp-fv'),('lp-lv');
+INSERT INTO t1 VALUES ('lb-fni'),('lb-lni');
+INSERT INTO t1 VALUES ('lb-fv'),('lb-lv');
+INSERT INTO t1 VALUES (_ucs2 0x3106),(_ucs2 0x3110), (_ucs2 0x3111), (_ucs2 0x3112);
+INSERT INTO t1 VALUES (_ucs2 0x32A3), (_ucs2 0x3231);
+INSERT INTO t1 VALUES (_ucs2 0x84D9), (_ucs2 0x98F5), (_ucs2 0x7CF3), (_ucs2 0x5497);
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY a;
+a
+lp-ft
+lp-lt
+lp-fpi
+lp-fsi
+lp-fti
+lp-lpi
+lp-lsi
+lp-lti
+lb-fv
+lb-fni
+lp-fv
+lp-fni
+-
+=
+|
+lb-lv
+lp-lv
+1
+01
+001
+0001
+00001
+000001
+12
+012
+0012
+00012
+000012
+123
+0123
+00123
+000123
+1234
+01234
+001234
+12345
+012345
+9
+~
+!
+@
+#
+$
+%
+^
+(
+)
++
+:
+;
+"
+'
+?
+a
+a
+aa-
+ab-
+ac-
+ad-
+ae-
+af-
+az-
+b
+Ã
+Ã
+Ã
+á
+Ä
+Ä
+c
+k
+ch
+cs
+ccs
+cscs
+cz
+Ä
+Ä
+d
+Ã
+Ã
+é
+ê
+Ä
+Ä
+Ä
+Ä
+e
+f
+fz
+Ä
+Ä¡
+g
+GĦ
+Għ
+gĦ
+għ
+h
+hz
+Ħ
+ħ
+i
+iz
+y
+yz
+Å»
+ż
+z
+ÐÐÐ
+ÐÐÐÐÐ
+lb-lni
+lp-lni
+ã
+ã
+ã
+ã
+ã£
+ã±
+è
+飵
+ç³³
+å
+#
+# WL#5624, the same test with UCS2
+#
+ALTER TABLE t1 CONVERT TO CHARACTER SET ucs2 COLLATE ucs2_5624_1;
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY(a);
+a
+lp-ft
+lp-lt
+lp-fpi
+lp-fsi
+lp-fti
+lp-lpi
+lp-lsi
+lp-lti
+lb-fv
+lb-fni
+lp-fv
+lp-fni
+-
+=
+|
+lb-lv
+lp-lv
+1
+01
+001
+0001
+00001
+000001
+12
+012
+0012
+00012
+000012
+123
+0123
+00123
+000123
+1234
+01234
+001234
+12345
+012345
+9
+~
+!
+@
+#
+$
+%
+^
+(
+)
++
+:
+;
+"
+'
+?
+a
+a
+aa-
+ab-
+ac-
+ad-
+ae-
+af-
+az-
+b
+Ã
+Ã
+Ã
+á
+Ä
+Ä
+c
+k
+ch
+cs
+ccs
+cscs
+cz
+Ä
+Ä
+d
+Ã
+Ã
+é
+ê
+Ä
+Ä
+Ä
+Ä
+e
+f
+fz
+Ä
+Ä¡
+g
+GĦ
+Għ
+gĦ
+għ
+h
+hz
+Ħ
+ħ
+i
+iz
+y
+yz
+Å»
+ż
+z
+ÐÐÐ
+ÐÐÐÐÐ
+lb-lni
+lp-lni
+ã
+ã
+ã
+ã
+ã£
+ã±
+è
+飵
+ç³³
+å
+DROP TABLE t1;
+#
+# WL#5624, unsupported features
+#
+SET NAMES utf8 COLLATE utf8_5624_2;
+ERROR HY000: Unknown collation: 'utf8_5624_2'
+SHOW WARNINGS;
+Level Code Message
+Error 1273 Unknown collation: 'utf8_5624_2'
+Warning 1273 Syntax error at '[strength tertiary]'
+#
+# WL#5624, reset before primary ignorable
+#
+SET NAMES utf8 COLLATE utf8_5624_3;
+ERROR HY000: Unknown collation: 'utf8_5624_3'
+SHOW WARNINGS;
+Level Code Message
+Error 1273 Unknown collation: 'utf8_5624_3'
+Warning 1273 Can't reset before a primary ignorable character U+A48C
+#
+# WL#5624, \u without hex digits is equal to {'\', 'u'}
+#
+SET NAMES utf8 COLLATE utf8_5624_4;
+CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES ('\\'),('u'),('x'),('X');
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY(a);
+a
+\
+x
+u
+X
+DROP TABLE t1;
+#
+# WL#5624, testing Bengali collations
+#
+SET NAMES utf8, collation_connection=utf8_bengali_standard_ci;
+CREATE TABLE t1 AS SELECT REPEAT (' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES (_ucs2 0x09FA), (_ucs2 0x09F8), (_ucs2 0x09F9), (_ucs2 0x09F2);
+INSERT INTO t1 VALUES (_ucs2 0x09DC), (_ucs2 0x09A109BC);
+INSERT INTO t1 VALUES (_ucs2 0x09A2), (_ucs2 0x09DD), (_ucs2 0x09A209BC);
+INSERT INTO t1 VALUES (_ucs2 0x09A3);
+SELECT HEX(CONVERT(a USING ucs2)), HEX(a)
+FROM t1 ORDER BY a, BINARY a;
+HEX(CONVERT(a USING ucs2)) HEX(a)
+09FA E0A7BA
+09F8 E0A7B8
+09F9 E0A7B9
+09F2 E0A7B2
+09A109BC E0A6A1E0A6BC
+09DC E0A79C
+09A2 E0A6A2
+09A209BC E0A6A2E0A6BC
+09DD E0A79D
+09A3 E0A6A3
+DROP TABLE t1;
+SET NAMES utf8, collation_connection=utf8_bengali_traditional_ci;
+CREATE TABLE t1 AS SELECT REPEAT (' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES
+(_ucs2 0x0985),(_ucs2 0x0986),(_ucs2 0x0987),(_ucs2 0x0988),
+(_ucs2 0x0989),(_ucs2 0x098A),(_ucs2 0x098B),(_ucs2 0x09E0),
+(_ucs2 0x098C),(_ucs2 0x09E1),(_ucs2 0x098F),(_ucs2 0x0990),
+(_ucs2 0x0993);
+INSERT INTO t1 VALUES
+(_ucs2 0x0994),(_ucs2 0x0982),(_ucs2 0x0983),(_ucs2 0x0981),
+(_ucs2 0x099509CD), (_ucs2 0x099609CD), (_ucs2 0x099709CD), (_ucs2 0x099809CD),
+(_ucs2 0x099909CD), (_ucs2 0x099A09CD), (_ucs2 0x099B09CD), (_ucs2 0x099C09CD),
+(_ucs2 0x099D09CD), (_ucs2 0x099E09CD), (_ucs2 0x099F09CD), (_ucs2 0x09A009CD),
+(_ucs2 0x09A109CD), (_ucs2 0x09A209CD), (_ucs2 0x09A309CD),
+(_ucs2 0x09CE), (_ucs2 0x09A409CD200D), (_ucs2 0x09A409CD),
+(_ucs2 0x09A509CD),(_ucs2 0x09A609CD),
+(_ucs2 0x09A709CD), (_ucs2 0x09A809CD), (_ucs2 0x09AA09CD), (_ucs2 0x09AB09CD),
+(_ucs2 0x09AC09CD), (_ucs2 0x09AD09CD), (_ucs2 0x09AE09CD), (_ucs2 0x09AF09CD),
+(_ucs2 0x09B009CD), (_ucs2 0x09F009CD), (_ucs2 0x09B209CD), (_ucs2 0x09F109CD),
+(_ucs2 0x09B609CD), (_ucs2 0x09B709CD), (_ucs2 0x09B809CD), (_ucs2 0x09B909CD);
+INSERT INTO t1 VALUES
+(_ucs2 0x099509CD0985),(_ucs2 0x0995),
+(_ucs2 0x099509CD0986),(_ucs2 0x099509BE),
+(_ucs2 0x099509CD0987),(_ucs2 0x099509BF),
+(_ucs2 0x099509CD0988),(_ucs2 0x099509C0),
+(_ucs2 0x099509CD0989),(_ucs2 0x099509C1),
+(_ucs2 0x099509CD098A),(_ucs2 0x099509C2),
+(_ucs2 0x099509CD098B),(_ucs2 0x099509C3),
+(_ucs2 0x099509CD09E0),(_ucs2 0x099509C4),
+(_ucs2 0x099509CD098C),(_ucs2 0x099509E2),
+(_ucs2 0x099509CD09E1),(_ucs2 0x099509E3),
+(_ucs2 0x099509CD098F),(_ucs2 0x099509C7),
+(_ucs2 0x099509CD0990),(_ucs2 0x099509C8),
+(_ucs2 0x099509CD0993),(_ucs2 0x099509CB),
+(_ucs2 0x099509CD0994),(_ucs2 0x099509CC);
+SELECT HEX(CONVERT(a USING ucs2)), HEX(a)
+FROM t1 ORDER BY a, BINARY(a);
+HEX(CONVERT(a USING ucs2)) HEX(a)
+0985 E0A685
+0986 E0A686
+0987 E0A687
+0988 E0A688
+0989 E0A689
+098A E0A68A
+098B E0A68B
+09E0 E0A7A0
+098C E0A68C
+09E1 E0A7A1
+098F E0A68F
+0990 E0A690
+0993 E0A693
+0994 E0A694
+0982 E0A682
+0983 E0A683
+0981 E0A681
+099509CD E0A695E0A78D
+0995 E0A695
+099509CD0985 E0A695E0A78DE0A685
+099509BE E0A695E0A6BE
+099509CD0986 E0A695E0A78DE0A686
+099509BF E0A695E0A6BF
+099509CD0987 E0A695E0A78DE0A687
+099509C0 E0A695E0A780
+099509CD0988 E0A695E0A78DE0A688
+099509C1 E0A695E0A781
+099509CD0989 E0A695E0A78DE0A689
+099509C2 E0A695E0A782
+099509CD098A E0A695E0A78DE0A68A
+099509C3 E0A695E0A783
+099509CD098B E0A695E0A78DE0A68B
+099509C4 E0A695E0A784
+099509CD09E0 E0A695E0A78DE0A7A0
+099509CD098C E0A695E0A78DE0A68C
+099509E2 E0A695E0A7A2
+099509CD09E1 E0A695E0A78DE0A7A1
+099509E3 E0A695E0A7A3
+099509C7 E0A695E0A787
+099509CD098F E0A695E0A78DE0A68F
+099509C8 E0A695E0A788
+099509CD0990 E0A695E0A78DE0A690
+099509CB E0A695E0A78B
+099509CD0993 E0A695E0A78DE0A693
+099509CC E0A695E0A78C
+099509CD0994 E0A695E0A78DE0A694
+099609CD E0A696E0A78D
+099709CD E0A697E0A78D
+099809CD E0A698E0A78D
+099909CD E0A699E0A78D
+099A09CD E0A69AE0A78D
+099B09CD E0A69BE0A78D
+099C09CD E0A69CE0A78D
+099D09CD E0A69DE0A78D
+099E09CD E0A69EE0A78D
+099F09CD E0A69FE0A78D
+09A009CD E0A6A0E0A78D
+09A109CD E0A6A1E0A78D
+09A209CD E0A6A2E0A78D
+09A309CD E0A6A3E0A78D
+09A409CD E0A6A4E0A78D
+09A409CD200D E0A6A4E0A78DE2808D
+09CE E0A78E
+09A509CD E0A6A5E0A78D
+09A609CD E0A6A6E0A78D
+09A709CD E0A6A7E0A78D
+09A809CD E0A6A8E0A78D
+09AA09CD E0A6AAE0A78D
+09AB09CD E0A6ABE0A78D
+09AC09CD E0A6ACE0A78D
+09AD09CD E0A6ADE0A78D
+09AE09CD E0A6AEE0A78D
+09AF09CD E0A6AFE0A78D
+09B009CD E0A6B0E0A78D
+09F009CD E0A7B0E0A78D
+09B209CD E0A6B2E0A78D
+09F109CD E0A7B1E0A78D
+09B609CD E0A6B6E0A78D
+09B709CD E0A6B7E0A78D
+09B809CD E0A6B8E0A78D
+09B909CD E0A6B9E0A78D
+SELECT
+GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a)
+FROM t1 GROUP BY a ORDER BY a;
+GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a)
+0985
+0986
+0987
+0988
+0989
+098A
+098B
+09E0
+098C
+09E1
+098F
+0990
+0993
+0994
+0982
+0983
+0981
+099509CD
+0995,099509CD0985
+099509BE,099509CD0986
+099509BF,099509CD0987
+099509C0,099509CD0988
+099509C1,099509CD0989
+099509C2,099509CD098A
+099509C3,099509CD098B
+099509C4,099509CD09E0
+099509E2,099509CD098C
+099509E3,099509CD09E1
+099509C7,099509CD098F
+099509C8,099509CD0990
+099509CB,099509CD0993
+099509CC,099509CD0994
+099609CD
+099709CD
+099809CD
+099909CD
+099A09CD
+099B09CD
+099C09CD
+099D09CD
+099E09CD
+099F09CD
+09A009CD
+09A109CD
+09A209CD
+09A309CD
+09CE,09A409CD,09A409CD200D
+09A509CD
+09A609CD
+09A709CD
+09A809CD
+09AA09CD
+09AB09CD
+09AC09CD
+09AD09CD
+09AE09CD
+09AF09CD
+09B009CD
+09F009CD
+09B209CD
+09F109CD
+09B609CD
+09B709CD
+09B809CD
+09B909CD
+DROP TABLE t1;
+#
+# WL#5624, shift after, using expansion
+#
+SET NAMES utf8 COLLATE utf8_5624_5;
+CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES ('0'),('1'),('0z'),(_ucs2 0x0030FF9D);
+INSERT INTO t1 VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i');
+INSERT INTO t1 VALUES ('j'),('k'),('l'),('m'),('n'),('o'),('p'),('q'),('r');
+INSERT INTO t1 VALUES ('s'),('t'),('u'),('v'),('w'),('x'),('y'),('z');
+INSERT INTO t1 VALUES ('aa'),('aaa');
+INSERT INTO t1 VALUES ('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I');
+INSERT INTO t1 VALUES ('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R');
+INSERT INTO t1 VALUES ('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z');
+INSERT INTO t1 VALUES ('AA'),('AAA');
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY(a);
+a
+0
+0z
+0ï¾
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+aa
+aaa
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+AA
+AAA
+1
+DROP TABLE t1;
+#
+# End of WL#5624
+#
+#
+# Bug#14197426 PARSE ERRORS IN LOADABLE UCA / LDML COLLATIONS ARE SILENTLY IGNORED
+#
+# Search for occurrences of [ERROR] Syntax error at '[strength tertiary]'
+Occurances : 1
=== modified file 'mysql-test/r/ctype_uca.result'
--- mysql-test/r/ctype_uca.result 2012-02-29 20:55:04 +0000
+++ mysql-test/r/ctype_uca.result 2013-08-29 12:56:12 +0000
@@ -2240,6 +2240,112 @@ Z,z,Ź,ź,Ż,ż
Ç
Ç
Ç
+select group_concat(c1 order by c1) from t1 group by c1 collate utf8_german2_ci;
+group_concat(c1 order by c1)
+÷
+Ã
+A,a,Ã,Ã,Ã,Ã,Ã
,à ,á,â,ã,Ã¥,Ä,Ä,Ä,Ä,Ä,Ä
,Ç,Ç,Ç,Ç,Ç ,Ç¡,Ǻ,Ç»
+AA,Aa,aA,aa
+Ã,Ã,ä,æ
+Ǣ,ǣ,Ǽ,ǽ
+B,b
+Æ
+Æ
+Æ,Æ
+C,c,Ã,ç,Ä,Ä,Ä,Ä,Ä,Ä,Ä,Ä
+CH,Ch,cH,ch
+Æ,Æ
+D,d,Ä,Ä
+DZ,Dz,DŽ,Dž,dZ,dz,dŽ,dž,Ç,Ç
,Ç,DZ,Dz,dz
+Ä,Ä
+Æ
+Æ
+Æ,Æ
+Ã,ð
+E,e,Ã,Ã,Ã,Ã,è,é,ê,ë,Ä,Ä,Ä,Ä,Ä,Ä,Ä,Ä,Ä,Ä
+Æ,Ç
+Æ
+Æ
+F,f
+Æ,Æ
+G,g,Ä,Ä,Ä,Ä,Ä ,Ä¡,Ä¢,Ä£,Ǧ,ǧ,Ç´,ǵ
+Ǥ,ǥ
+Æ
+Æ
+Æ¢,Æ£
+H,h,Ĥ,ĥ
+Æ,Ƕ
+Ħ,ħ
+I,i,Ã,Ã,Ã,Ã,ì,Ã,î,ï,Ĩ,Ä©,Ī,Ä«,Ĭ,Ä,Ä®,į,Ä°,Ç,Ç
+IJ,Ij,iJ,ij,IJ,ij
+ı
+Æ
+Æ
+J,j,Ĵ,ĵ,ǰ
+K,k,Ķ,ķ,Ǩ,ǩ
+Æ,Æ
+L,l,Ĺ,ĺ,Ļ,ļ,Ľ,ľ
+Ä¿,Å
+LJ,Lj,lJ,lj,Ç,Ç,Ç
+LL,Ll,lL,ll
+Å,Å
+Æ
+Æ
+M,m
+N,n,Ã,ñ,Å,Å,Å
,Å,Å,Å,Ǹ,ǹ
+NJ,Nj,nJ,nj,Ç,Ç,Ç
+Æ
+Æ
+Å,Å
+O,o,Ã,Ã,Ã,Ã,ò,ó,ô,õ,Å,Å,Å,Å,Å,Å,Æ ,Æ¡,Ç,Ç,Ǫ,Ç«,Ǭ,Ç
+OE,Oe,oE,oe,Ã,ö,Å,Å
+Ã,ø,Ǿ,Ç¿
+Æ
+Æ
+P,p
+Ƥ,ƥ
+Q,q
+ĸ
+R,r,Å,Å,Å,Å,Å,Å
+RR,Rr,rR,rr
+Ʀ
+S,s,Å,Å,Å,Å,Å,Å,Å ,Å¡,Å¿
+SS,Ss,sS,ss,Ã
+Æ©
+ƪ
+T,t,Ţ,ţ,Ť,ť
+ƾ
+Ŧ,ŧ
+Æ«
+Ƭ,Æ
+Æ®
+U,u,Ã,Ã,Ã,ù,ú,û,Ũ,Å©,Ū,Å«,Ŭ,Å,Å®,ů,Å°,ű,Ų,ų,Ư,Æ°,Ç,Ç,Ç,Ç,Ç,Ç,Ç,Ç,Ç,Ç
+Ã,ü
+Æ
+Ʊ
+V,v
+Ʋ
+W,w,Ŵ,ŵ
+X,x
+Y,y,Ã,ý,ÿ,Ŷ,Å·,Ÿ
+Ƴ,ƴ
+Z,z,Ź,ź,Ż,ż,Ž,ž
+Æ
+Ƶ,ƶ
+Ʒ,Ǯ,ǯ
+Ƹ,ƹ
+ƺ
+Ã,þ
+Æ¿,Ç·
+Æ»
+Ƨ,ƨ
+Ƽ,ƽ
+Æ,Æ
+Å
+Ç
+Ç
+Ç
+Ç
drop table t1;
SET NAMES utf8;
CREATE TABLE t1 (c varchar(255) NOT NULL COLLATE utf8_general_ci, INDEX (c));
@@ -3192,3 +3298,45 @@ drop table t1;
#
# End of 5.5 tests
#
+#
+# WL#4013 Unicode german2 collation
+#
+SET collation_connection=utf8_german2_ci;
+drop table if exists t1;
+create table t1 as select repeat(' ', 64) as s1;
+select collation(s1) from t1;
+collation(s1)
+utf8_german2_ci
+delete from t1;
+insert into t1 values ('a'),('ae'),(_latin1 0xE4);
+insert into t1 values ('o'),('oe'),(_latin1 0xF6);
+insert into t1 values ('s'),('ss'),(_latin1 0xDF);
+insert into t1 values ('u'),('ue'),(_latin1 0xFC);
+select s1, hex(s1) from t1 order by s1, binary s1;
+s1 hex(s1)
+a 61
+ae 6165
+ä C3A4
+o 6F
+oe 6F65
+ö C3B6
+s 73
+ss 7373
+Ã C39F
+u 75
+ue 7565
+ü C3BC
+select group_concat(s1 order by binary s1) from t1 group by s1;
+group_concat(s1 order by binary s1)
+a
+ae,ä
+o
+oe,ö
+s
+ss,Ã
+u
+ue,ü
+drop table t1;
+#
+# End of 5.6 tests
+#
=== modified file 'mysql-test/std_data/Index.xml'
--- mysql-test/std_data/Index.xml 2010-02-24 09:15:34 +0000
+++ mysql-test/std_data/Index.xml 2013-09-17 12:16:40 +0000
@@ -18,6 +18,109 @@
</rules>
</collation>
+ <collation name="utf8_5624_1" id="354">
+ <rules>
+ <!-- long contractions and expansions -->
+ <reset>12345</reset><q>012345</q><q>12345</q>
+ <reset>1234</reset><q>001234</q><q>01234</q>
+ <reset>123</reset><q>000123</q><q>00123</q><q>0123</q>
+ <reset>12</reset><q>000012</q><q>00012</q><q>0012</q><q>012</q>
+ <reset>1</reset><q>000001</q><q>00001</q><q>0001</q><q>001</q><q>01</q>
+ <!-- some non-latin contractions and expansions -->
+ <reset>ÐÐÐ</reset><i>ÐÐÐÐÐ</i>
+
+ <!-- reset before: Maltese -->
+ <reset before="primary">d</reset><p>Ä</p><t>Ä</t>
+ <reset before="primary">g</reset><p>Ä </p><t>Ä¡</t>
+ <reset before="primary">h</reset><p>GĦ</p><t>Għ</t><t>gĦ</t><t>għ</t>
+ <reset before="primary">i</reset><p>Ħ</p><t>ħ</t>
+ <reset before="primary">z</reset><p>Ż</p><t>ż</t>
+ <!-- higher levels -->
+ <reset before="secondary">b</reset><s>Ä</s><t>Ä</t>
+ <reset before="tertiary">b</reset><t>á</t><t>Ã</t>
+ <reset before="quaternary">b</reset><q>Ã </q><q>Ã</q>
+
+ <!-- abbreviated syntax: put some punctuation immediately before a -->
+ <reset before="primary">a</reset><pc>~!@#$%^*()+:;"'?</pc>
+ <reset>d</reset><sc>Äé</sc>
+ <reset>d</reset><tc>ÄÃ</tc>
+ <reset>d</reset><qc>Äê</qc>
+ <reset>d</reset><ic>ÄÃ</ic>
+
+ <!-- normal expansion syntax -->
+ <reset>c</reset><x><s>k</s><extend>h</extend></x>
+ <reset>cs</reset><x><t>ccs</t><extend>cs</extend></x>
+
+ <!-- previous context -->
+ <reset>a</reset><x><context>b</context><p>-</p></x>
+ <reset>c</reset><x><context>c</context><s>-</s></x>
+ <reset>d</reset><x><context>d</context><t>-</t></x>
+ <reset>e</reset><x><context>e</context><q>-</q></x>
+ <reset>f</reset><x><context>f</context><i>-</i></x>
+
+ <!-- logical reset positions -->
+ <reset><first_non_ignorable/></reset><p>lp-fni</p>
+ <reset><last_non_ignorable/></reset><p>lp-lni</p>
+ <reset><first_primary_ignorable/></reset><p>lp-fpi</p>
+ <reset><last_primary_ignorable/></reset><p>lp-lpi</p>
+ <reset><first_secondary_ignorable/></reset><p>lp-fsi</p>
+ <reset><last_secondary_ignorable/></reset><p>lp-lsi</p>
+ <reset><first_tertiary_ignorable/></reset><p>lp-fti</p>
+ <reset><last_tertiary_ignorable/></reset><p>lp-lti</p>
+ <reset><first_trailing/></reset><p>lp-ft</p>
+ <reset><last_trailing/></reset><p>lp-lt</p>
+ <reset><first_variable/></reset><p>lp-fv</p>
+ <reset><last_variable/></reset><p>lp-lv</p>
+
+ <!-- logical positions and reset before -->
+ <reset before="primary"><first_non_ignorable/></reset><p>lb-fni</p>
+ <reset before="primary"><last_non_ignorable/></reset><p>lb-lni</p>
+ <reset before="primary"><first_variable/></reset><p>lb-fv</p>
+ <reset before="primary"><last_variable/></reset><p>lb-lv</p>
+
+ <!-- long tailoring: pinyin order from CLDR's zh.xml -->
+ <reset><last_non_ignorable/></reset>
+ <pc>ã
ããããããããããããããããããããããããããã ã¡ã¢ã£ã¤ã¥ã¦ã§ã¨ã©åé¿åééååååååæ¨æ¬¸æº¾é¿éåæ±çå嵦溰åæ±æ³ççæ¯æ¹å¨¾å³ç®è¼èº·å¯æ¿ï¨è¹èªééè¾ä¼ç±ç ¹ç¡éå塧å«æç¢åæ§ç·å¾å£å¬¡æèææç¦è³¹é¤²é´±ç§ç¹é¦¤ç¤èºé鱫éå®ä¾å³æ¡æ°¨åºµè´è°åªè»èç·è
¤é¹èèªééç¦è«³é馣é®ç«éµªé½é¶çµå½é¸åµä¿ºåµå¯éµéææ»ç½¯é¨ç´å²¸ææ´èæ¡èºè±»å å©©æè²åé黯è®éª¯å²ææ»æçé å¹å³åæªè»ªçæå«éå·å¸å¶
å»æ»¶ççé¨æ®ç¬çèç£ç¿±è±è¯ç¿¶è¬·ç¿ºé³éé°²é·é¼æèºæè¢åªªéºåª¼è¥å²æ·å²°å²å¥¡å¥¥å«¯æ
éªå¥§æ¾å¢ºå¶´æ¾³ææ謸éé©å
«ä»å·´åææ³çå§å¤¿å²èç¤åµæç¬ç²ç´¦ç¾èéè±é²éåç®æåºå¦æèç¦ç¹èéèè©è·è»·é¢°é墢鼥æé¯éé¶åå¼ç¸å»ç½¢î ½è·é²
ç½·î ¼é®è¦ç²é¸å£©çæ¬ææ°ç½ç¾ä½°ææ ¢æ竡粨çµææºè¥¬ååºæè´¥æåæçç¨ç²ºéèè´éå
¡ç¸æ³æ½æçè¬é¢ææ¬æé ç¢èè褩ç辬éªåå²
ææ¿ççªé£ç²è¨éèé¬éååä¼´æ®å§
ææç»ç§æ¹´çµé¡é½è¾¦ç£é¦å³å¹å¸®æ æ¢æµé«å¹å¹ç¸å¹«é¤ç»ç¶æ¦çèç¤èåæ£æ£ç¡¥è°¤å¡å¾¬ç¨è¡è¯ç£
éèè¬éå¹å
佨å¢èèå笣ç
²é¾
èè¤éè¥é½çªå«é¹å®æ饱ä¿é¸¨ç¤å ¡å ¢åª¬èå¯é£¹é£½è¤é§é³µç·¥é´è³²èµå¯³å¯¶éå½æ¥æ±è±¹è¶µéè¢è¢å ±éé²é¤éª²æ´é«±è£é®å¤æçå¿é¤è¡éåæ¯çæ¡®æ²æ¹ç¢é¹è£éµ¯åºåé³è´çè²é¶å¤æç¬èèé¡ä¿»åæç½è¢«åå¹æ¢ç¼éååæ«çç²è»°è¾æç¢ç¦èè½çè¤èªéª³è¼©éæç³é´é¾å¥æ³è´²å´æ¸é©çè³ééæ¬è¯å¥çæ¥åæ¹æ¡³ç¬¨æªç輽伻ç¥å¥å´©ç»·çµ£éåµçå£ç¶³ç¹çåå²è¶ç£ç«é泵迸é¬è·°å¡´çé蹦é°çå±åªæ¯´é¼è±èé²¾ééµé°æ²è¸é¼»å¬¶åæ¯å¤¶æ¼ä½å¡å¦£æ²çå½¼æç§ä¿¾ç¬ç²ç²èåçéèè²åå¸å¿
æ¯éä½ååºè¯é²å¦¼ææççè¾åæ¯ççªèèéæ¯ç´ç¢è¢é婢庳ææ¢èèééå 弻弼æææ¹¢çç¦çè©è²±èµå¶å½æ¥
æ»æ»ç
ç¹çºè
·èè½è裨跸è¾éé飶幣å¼çç碧稫ç®
ç®ç¶¼è½éªé¦å¹¤æ½·çç½¼è¥
é§é«²å£å¬å»¦ç¯¦ç¯³ç¸ªè觱é¿é®
ææ¿èè¹éé«å¥°ç§é¨é¥ç¹´è¥è¥£éé¸é èºèºéè´é´é©é·é·©é¼è¾¹ç 笾çµç¼è¹ç
¸çç箯編èç±éé½é³éé鯾鯿籩çè´¬æçªå¾è²¶æ¼ç¢¥ç¨¨è¤ç³é´èåå¼å¿æ汳汴èéå³
æ便åå¤æªè¦å¾§æç¼éé辡緶èé ¨è¾§è¾¨è¾©è¾ªè¾«è¾®è¾¯è®ç¬æ彪æ é£éªé«æ·²çè¿å¢å¹æ»®èé¢®éª æ¨çèéºçéé£é£å¦é¢·çè¨è¬¤çèè´é¢ç©®é³é£é£é£é£é©é£é©«è¡¨å©è£±è«è¤¾é¶æª¦ä¿µæ½é³é°¾æé³é±é¼èé¾å¥å«åèè徶è¥è蹩çªçå½æ±é ç 宾彬å§ææ¤æ»¨ç¼¤æ§ç¸è±©è³è³éåæ¿æ¿±æ¿µè¨è±³ç¸çé¦ç¹½è éé¡®æ°æ殡èé«©æ¯é¬æ®¯èé«é¬é«é¬¢å«ä»æ°·å°å
µæ æ¤æ¢¹é²æª³ä¸é´éæ²æ¦ç§èªææºæç³é¥¼çªçªèæ£
ç¦éµé¼éé¤
é¤ ç·å¹¶ä¸¦ä½µå¹·åªåº°åæ ¤ç
ç«åå¡å¯æèªé®©éç¶æ¨æ³¢ç·ç»å¥çç µè¢è¢¯éµé¥½åµç´´ç¼½èè 袰ç¢é¢å å¶æ¥æé¤ç£»è¹³é©é±ä»¢ä¼¯åç»é©³å¸æ³ççè©ä¾¼åæèé£äº³æ¬æµ¡ç秡é¹î¡é桲淿è¶å渤æ¹è§é¹æ½æç¼é¸éé¦é²å°ç
¿çç®èèé¦é§è¸£ééå£èé¦é§®é®è¥è±°åæªç¤¡ç°é餺éµç¦é«é«æ¬è¥®ç¤´é®è¾è·ç®¥ç°¸å¹ææªç³ªèèè峬庯éé¸æ¡é½èª§é¤è½éååè¡¥åºæè£é³ªçéµé¸ä¸å¸ä½å¥æ¥åææ¨æ©éååææè¹é¨å ç¿éå»èè¸é¶ç¯°é¤¢ç°¿åæ¦æ礤礸éªåå²çææ财財æè£çºéå¸å°å©å¯å½©æ¡ç¬è·´ç¶µè¸©èæ£è¡ç¸©ä¹²ååå飡éªå
å°æ¹åªå¬ é¤é©æ®èææ®æ
è
æ
è ¶è ºæ¨ææ
åæ¯î µç©é»ªé»²ç¿ç²²å澯èç¦ç¨è¬²çä»ä»ºä¼§æ²§è鸧åè±åååµ¢æ»çè¼æ¿¸èè¥ç½é¶¬å¨èµèæ¬é¶è³¶æ¡æç³æºæ¹åå¶æ¼è¸æ§½è¤¿èè¬éªè¹è¸èæºæ騲èéµè¥é¼åå侧åæ»æºæµèæçå´å 笧粣èå»æ»æ¸¬çè´çç´èå¢ç®£æ¡ç°åµ¾è¥å²æ¢£æ¶ç¬åå±å±¤å¶ç«²é©è¹ç¡ç¡³å²¾ç ä¹½åæ æ±èæèè¿æ¿è¨ååææ·é¦éé¸èçé¤é餷ç§
åæ¥æ»è¬è¶åµæ½ç¹é«æ§è©§å¯ç¢´è¤¨æª«è¡©è¹
é²é奼æ±å²ä¾è¯§å姹差ç´è©«æééµç²ä¾ªæ´ç¥¡è±ºååèè¿åè¢ç¥è å辿è§æ¢´æºæè¦è£§æ»é幨è¥æ婵è°å±æ£æ¹¹ç¦
é¦å¬ç
ç¼ åçèèèªéåå»æ½¹æ½ºç·¾ç£ç¦ªæ¯é½é¡çè¬å³åç¹µè¾é
åµå£¥å·çºæ¬çºçºèºéµè¬è®é±é¥äº§å¬æµä¸³æµåè°ç¢ç£é²éèå·åµ¼ææ»»å¹èè«é³çç°
åç¹é¦èéé¡å
çè®å¿ç¡æ²æ´é¢¤æºç¾¼éé¡«ä¼¥æå娼æ·çèéæ¿æ¤ç©è£®é é©é¶é²³é¯§é¼é¿ä»§å
è èé·é¸å°å¿å¸¸å¾çºèçè
¸å塲嫦çºèé¿ååè鲿é鱨ååºæ¶æå ´æåå°å» æ°
é¹æ
çç
å¡é¬¯å±æµçæ¢ç¼èª¯éæ弨æ欩é訬ç¯è¶
éç¹çæ巢巣æéé¼æ¼
å²æ¨æ½®çª²ç½ºè½é¼è¬¿åµçç§ç
¼éº¨å·ä»¦ä»¯èè§è½¦ä¼¡è»ä¿¥ç åè硨è¼æ¯åæ¦å¥²å±®å½»å¼è¿ ç¢ç²è
æ£ç¡©é å¾¹æ¤æ¾å¶ç®ç¡æ»é´æ£½çåç¶çè«è³è¬å°è£å¿±æ²è¾°é迧è宸ç¥èèé³ææ¨è¨¦è°è»ææ¨éç
è¯å¡µæ¨çéè´è«¶è¼éºæé·è¶»ç¡¶ç¢å¢å¤¦ç££è¸¸è´é¯è¡¬ç¢ç§°é¾è¶è¶æ¦ç¨±é½é½åå«è°¶æ«¬è¥¯è®é·æ³è°æ½ç¯æ£¦æµ¾åèéçç¤èµªææéææç·½æ©ç èµ¬é ³æªç«ç©ªè¶é³é¿é¥éºä¸ææ¾åæ¿æ¨è¯éä¹åå¨å®¬å³¸æ´è¿ä¹åæ°ç¹èæçµçªèéå æ©æ£æ¤ç¨ç¬çµ¾è£å¡å¡æºç¢èª ç»é
²é®ææ¾æ¾æ©æªé¯çæ²é¨¬ä¾±å¾æééªåº±çé¨ç§¤åå¦æä¾å§å½¨èµè©é¸±ç»çµç¬ç²å«è¨µå¤åª¸æç´çµºåç誺èé´éµç¡éé½æ¡éº¶å½²é»å¼æ± é©°åè¿å²»æ³èæ竾èä¿¿æåæ·èè³èµ¿çè²¾é
è¶é馳å¢æ¼¦è¸é²ç¯ªè¬å°ºåºåèä¾å¶é½¿åæ¸è£æ¥è»è袳è±æ¬¼æ¯è¢²è£é¹è¤«é½å½³å±æ¥ç»èµ¤é¥¬æ¶è¿£å
æç½ç¿ç¿
æç¾çå»æ¹é£åºç¸è
è·®éé´æ翤é«éæ
ç翨ç¾æ糦趩é¥é¶é·å
å²å¿¡æ²èºæµºç«ç¿èåæ徸ææ§è¡ç½¿èè¹è«å´å´éæ¼´è¤ç·è©è²çå® å«å¯µé³æ°éæ½î ·ç´¬æç³ç¯ç¨ç«ä»ä¿¦å¸±æ ¦æ绸èæ¤ç´çµæçç¨ ç¹è£¯è©¶é
§é
¬ç¶¢è¸åé嬦幬æ¤èµç½é çç±èºé»è®è®ä¸ä¸åæ½ä¾´å¢ç
éçéèè°éæ® åºå²åæ´æ¨è²é½£åé¤è»å¨æ»è¢è± éæ¦è¡èèè¶ééçèå»ç¯¨é¤æ©±æ¨å¹®æ«èµèºé櫥蹰鶵èºæµç¡æ¤å¨æ¥®ç¦æ¥è¤æ¿å²æªç´ç¤é½é½¼äºå¦å¤ç«æµæç»è±æ¬ªç«ä¿¶æå±ç¿çµèåç¡éææ»è§¦è¸é¦åå¼è«æ·æ©»æ¶æè
é»è§¸çæèæ£î¡î¡åå¬è¸¹å·å·æ°ç©¿å¶çä¼ è¡è©è¹åçéå³æ¤½ææ·ç¯
è¼²èèåå¢æ±ä¸²çéé§è³é¶¨å
å±ç®çªçªçæçç¡çª»åºçåå¸æ¼ºç£¢éåæå±åååµæ´å¹ç龡åååæ¡é²æ¶èæ¥æ£°è
æ§é¤ç® ééé¡æ¾æ¶æ¥è
å ¾åªæ椿æ§ç箺è½æ©è¼´æ«î¡é°é¶çº¯éåæµ±ç´è¼æ·³è£æ¹»ç滣èé¹æ¼è´éééé¯é¶åè¶æ·ç¶è³°è¸³è ¢è¸æ³è¾¶è¾µå¨å¨æ涰绰é´è
è¾é
«ç¶½è¶ è¼é¾æç£æ å½é½ªé¡é½±å²ç¼çµè¶å¨ç¸éª´è¯çåæç¥ èè¨å ²ç·è©è¾æ
çè¾é¶ç£éé¹ç³è¾¤é£ºé¤å¬¨æ¿¨èé´ç¤ è è¾é¶¿é·æ¤ä½æ³çè·æ¿æ¬¡ä½½åºå¾åºè¦æ ¨è¿çµèèµèè³åä»ååªèå¿©æèæ±å¾æ¤æ£ç§è±æ¥¤æ¼è¡è¯è¥éª¢æ°æ¨
樬çç½çç·«è¦èªç篵è°èç¹±é¦é¨é©ä¸å¾å©å®å¾æ°æ·ç®æ
æ¼æ½æ½æ½¨èª´è³¨è³©æ¨·èå¢çæ¬çæ謥åæ¹æ¥±è
è¾è¼³ç²è§éºéºéº¤å¾æ®ä¿ç媨é
¢çèèªè¶åæ±è¸§éç¯ç°ç¸¬è¹é¼è¹´è¹µé¡£æ±æºé©è¹¿æ躥é¹æ
æ«å·æ¬ç©³çªç¶ç¯¡æ®©ç¯¹ç°ç«ç¨å´å¬åç¼å¢å¶æ
æ§æ¦±æ§¯ç磪ç¸é乼漼ç趡ç ä¼å¿°ç©å
ç´£ç¿èèååæ´æ·¬è毳ç çç²¹ç¶·ç¿ èµè¬ç«è¥é¡èé¨æç´å¢«æ¾ç«´åæµè¸åå¿å¯¸å籿æç³é³ç£æ®è¹éé«è嵯嵳ç¤çç¬è«è鹾鹺齹èåååå¤æ«èè¡æªéªæ£¤éèéé¼é¯ååè·ç£æå褡å 墶æéè¾¾è¿è¿å¾å¦²ææ²å¯çç¾è
èå³å笪é¹æºçè©éè·¶ç©é¼èéçµç¹¨è½éèºé½éé¾é¾æ大亣ç橽ååçææ¹å£ä»£æ±è½ªä¾¢åå²±å¸çç»è¿¨å¸¦å¾
æ ææ®ç³è´·å¸¯è»å帶紿è®è¢è»é®è²¸è»©çå»åæç·¿é®é´æ´èé»ç°¤è¹ç»é´è¥¶é»±é丹å¦åæ
åçç è¼è½é¸èèºé
å®åª
æ®ç
å°ç®ªè¤é²é åå¯æ殫çè¥ç°è¸ä¼åçç¬çèè¡´ç¸ç´æ¸äº¶é¦¾æ£æ¾¸é»è½æ¦ä½å¸æ²æ³¹è¯æ¦çè¨ååå¼¹æ®æ·¡èèå¿æ°®è
èè§çªèªå¤å髧å¾å½ææºæ¾¹ç¦«é¤¤é§³é´ ççåªè´é®é¥å½ç°è£çç¶å
å¹æ¾¢ç«è¥ ç°¹è¡è·æ¡å
è° æè¡é»¨æ©çæ¬è®æ°¹å¼åµå®ç å±è¡æ¡£èªå©¸ç½é¿é¼æ½ç¢çè©è¶¤å£æªççªç¤ç°è¯é£ååå¨å±¶å¿æ·æ°è éé±½éæ¯å¯¼å²é¦å宲島æ£ç¥·ç¦æéå¶å¶æ§å°é¯å£å¶¹æ£è¹ç¦±å°æ¼ççè¿æ¤¡çé稲翢åµç¨»è¡æª¤è¡ç¾ç¿¿è»ççºæ´å¾æ·æ³æªéå徳德éçæ¼æ¥æ½ç¯ç»è±åå¬çç竳簦è 覴蹬çæ¥éåå³é§é¥å¢±å¶çªç£´é«æ«é仾ä½å¥å½½è¢å²åç¾éå ¤è¶åæ»´é磾éé®é廸çèç±´è迪åæ涤è»æ¢ç¬è§é®æ»é«¢å«¡èèé é¡æµç¯´åè¡è±´ç³´è¦¿é¸æ°åè¯é¸éºå§å»åºå¼¤æµææ¢ç´ç ¥æè§è§è©è»§è骶鯳å°å¼åå¼æ³æçææ¤è俤å¸å娣ééååæ¢çç±ç¥¶ç¬¬èè°é±åªæ££çç¼èåç¦è
£ééªé¦°å¢å¢¬æ碲èèé°æ
¸çç· å¶³è«¦è¸¶è®å²ææåå§åµ®æ»æ§ç¨é¢ è¹å·
é¡é¡ç«å·å·æ§ç²é½»å
¸å¥ç¹å©°æ椣ç¢è§è踮é»çµä½ç¸é½å«åºå«æç·é¿å¸å©æ¦æ·å¥ ç殿èé¿é»å¢å£æ©æ¾±é磹çç°é©åå¼æ±åèåå¥å¼´å½«èç±è²ç¢é³æ®¦çéé®é²·ç°é¼¦é¯éµ°æå±å¼ä¼åéçªè¨è°æé£éé竨è§é±é¿èª¿ç¹çªµé½èéç¹è·è¤ºèµè¿å¤å³ææç»è
çç£èåæè°åå å¹æµæ²ç³çµ°èè·è©è¶å æ®ççé»åµ½ç¢è¨è¤èè¶çè«è¹é²½æ¡æ¢é°ççæ°åæ³ç°å¸ä¸ä»å®å¸çç¼çç¯éèµé
ééªå¥µé¡¶é é¼åµ¿é¼è¡é¤è®¢å¿é¥¤ç´å®è¨é££å¶è£æ¤è
ç¢éç¢ è¢è£é 磸é¡ä¸ä¸¢é¥é¢©é©ä¸å¬åå²½æ±è³æ¸æ°¡å²é¸«å¬å¨»å´¬æ¶·ç¬èæ°èé®é¼é¯é¶é¶«è£å¢¥å¬æ箽è«è«å¨å»ä¾åå§å³å³æ«ææ æ´è¨è¿µåæè´åå´ ç¡æ£æ¹©è
å詷駧éåºå
åé½å
å
è¸æ©·ç¯¼èæ乧é§ææéé¡èªéè±éæµ¢è³é饾鬥梪æ¯è°é
çé窦鬦éé¤æ£éç«é¬ªé¬¬é¬å¢éåç£ééæ¯æ¶è¯»æ¸æ¤çç裻èªè³ç¨éååµå¬»çæ«æ®°çç¢çç¾é¨³é»©è®è±è´é£é«ééé¥é»·è®å¾ç¬ç¬å µå¸¾ç½èµç¹è¦©è³ç¯¤èå¦æè妬度è°ç§ºæ¸¡é¯éè殬éè §è ¹èå³åªç«¯è¤é´ç段æå¡
ç¼è®æ¤´ç
çè
¶ç¢«é»ç·æ¯ç°éæ·èºç±ªå¾åå å¡ åµç½ç£é §é´éé对å
å
å
対ç¥æ¼é®éç¢ç¶å°æ濧è±é¦æç©èéèµå¨ææ¦è³å¢©å¢ªå£¿æ´ç¤å¸ææ©çç¤
蹲蹾é©ç¹è¶¸èºä¼
å¤åºæ²çç¾ç ééé¡¿ééè
é 碷é¯æ潡ç踲å¤å¤ååè¤åå´æ 毲裰åä»å¤ºéå«æææå¥æªç¥é¬å¥ªå踱鮵é¸æµæ¶ååæ
æåµç¼æ¤¯è¶èº±èº²ç¶äº¸è»é¬å²å´åæ²²éé饳åå°®æ®æ¡å èµæ°è·¢è·¥è·ºé£¿å¢®å¶æ墯鵽妸妿娿å±è®¹åªå®è¿ä¿å¨¥å³¨å³©æ¶èªç´è¨ççééé¹
è¾ç£èªé¨é é¢é¤é¡éµéµèæç å©æ¡åé¨éµåæºå±µæ¹å²é¨åæ¼èé¸åç è½å¢å¹å©å§¶å³åæ¶ç ¨è
饿åå¾å æªç¡è°è»ééå ®å´¿ææ¹è¼è±è»¶ééå»
æ¤æ¹ç§è
è©»å«èé·é¹èé»é é¢é¤å©æ覨諤é¼é¤©éé³æé¡æ«®é°é¶è®é©é½¶é±·å¥æ©è½ç
¾å³æé¥ä»ä¹»æå¿èå
ä¾å
éå³æ´èèæ è¹å²è¢»é¸¸ç²«èè¼é²é髵é®é´¯è½å°å°å°è³è¿©æ´±é¥µæ ®æ¯¦ç¥éç¾éºé¤é§¬è¾é趰äºå¼å¼ä½´åµå¡è´°è²®è¡è²³èªæ¨²åæ²·çºç¼å½é«ªæ©éä¹ä¼å§å¡çºç½è·éæ °å ççç½°é¥ç½¸è
ä½±æ³ç é
çççºé«®å¸å¿ç¿çªå«å墦å¬å¹¡æ£ææç¿»è©è½é¢¿ç±é£é±å¡å¢å£å¥ææç¾ç±µéè¤ç¦è§ç¬²é©æ£¥ç
©ç·æ¨èæ©çç è°è ç¹è¥ç¹ç¾³è¹¯ç¿ç¤¬è©éè é·åä»®æ辺è¿æ°¾ç¯å¥¿æ±æ³é¥èè´©çè¨è»æ¢µç笵販軬飯飰滼å¬ç¯å¬çªåæ¹é¡åè³æç¥é«æ·èå 趽ééºé´é²å¦¨æ¿èªå
é²é´ä»¿è®¿å½·çººææç¬çå£æç´¡è«è¨ªé«£é¶æ¾é£å¦éé£å¡å©å©æ¸ç»¯è²æçé裶ç·èé鲱餥馡é¨é¨é¯¡é£è¥æ·æè
è°è¦æèåªè¯½å¥æ±ææ£æ¦§ç¿¡è誹ç¯å åºæ®æ²¸çèºæ²è´¹ä¿·ååç¿å±èå»è²»ç±é廢èæçé¼£æ¿·æ« é¨é
åå©å¸çº·è¬ææ°ç¢ç«è¡¯ç´ç¿æ£»è¨èº®é
éé°æ餴é¥åå妢å²æ±¾æçè¦æ¢¤ç¾è è¡æ£¼çè¶é¦é«å¢³å¹©è¡éµé³»æ©¨çç豮鼢羵é¼è±¶è½é¼é¦©é»ç²ç黺份åå¼
å¥å¿¿ç§å¾æ¤ç²ªå¨æ¤å¥®è¹ç³é²¼çµé±ä¸°é£ä»¹å¨å¬å¦¦æ²£æ²¨å®æ«å°ç¯ç½ç 風峯峰åæ¡»ç½ç崶渢æºç¦èéæ¥çèç碸å¼ç¯é·éæªè±é½é é
寷çè´éé£éº·å¯å¤ææµ²é¢å ¸é¦®æç¶ç¼è縫讽è¦åªè«·å¤å¥ç®ä¿¸æ¹ç¨ç
èµé³¯é³³é´è³µèç°è¦
ä»ä½å²æ¢»åºç´ç¼¶å¦å¦ç¼¹ç¼»é¬é´å¤«ä¼éåå¦å§æçè¤æ¤æç èèè¡å¨å°è´æ紨趺é
麸ç¨è·éçç¶éåµè±§æ·è鳺麩ç³éº¬éº±æ¯ä¹å·¿å¼ä¼å«ç¶å¹ååæ¶èè£è¾å岪å¸å½¿æ«æææ³ç»ç»è»èä¿åæ¹æ«æ°æ´ç¥ç¸ççç¥ç½è¯éé¨é³¬å¹æ ¿æµ®çç ©è©è¨å桴涪ç°ç符笰紱紼ç¿è´èè袱å¹
棴絥罦èç¦ç²°ç¶èèè¾éé颫鳧æ¦ç¨ªç®è¤éå¹æ¾è é«´é´è«¨è¸¾è¼»é®çè¥é®²é»»è¥¥éµ©é¶åæç«åºå¼£ææ§ä¿é俯éé¡æ¬è¯è¾
椨ç¤çè
æ»è
è
è¼æ«é¬´ç° 黼éç¶è®£ä»å¦è´éåå¿ç«é驸å¤å³ç¥è¨è² èµ´è¥è¢éå©å¨å¯å©å©¦è¹å
åªå¯å¾©ç§¿è¯èè¦è©èµæ¤±ç¼è
¹é²ç¦£è¤èµç·®è§èè®è³¦é§ç¸è¼¹é®è³»éé¢é³è¦é¦¥é°ç¤æ®ä¼½å éå°éåå¶é·å°çå°¬éä¾
该ééåå§å³èæèµ
ç¡ç¥´çµ¯é該豥è³
è³å¿æ¹çµ é
ä¸ä¹¢ååæéçæ¡æºè¢é£æ¤æ¦è槩槪æ¼çå¹²çå¿èè¿æ¼æçèå©æ³è·æç«¿ç³é
ç²äºå²å°²å°´ç¸æ¼§é³±å°¶å°·éä» ç¯ç§è¡¦èµ¶æ¢æ¡¿ç¬´ç¨ææ¾è¶æ©æ簳鳡鱤æ°æ±µç°ç¸ç»åå淦紺è©éªå¹¹æ¦¦æªèµ£è´ç¨åç½å®åé¬å²çº²è岡ç¨çç¼ç¼¸é¢åç½¡î §î å æé棡ç
å ½ç¶±ç½é¼é å´æ¸¯æ çµç»æ§ææçç¾ç¾é«çé«è¯æ»çªæ§ç¾è槹橰ç¯ç³é¤»æ«éé·é¼é·±å¤°æ²èç¨æç¼æ§æ§ç稾稿éç¸è檺è³é¬å¿åå诰é峼祮祰éç¶æ ç¦èª¥é¯æåªçµçº¥æèç«çç±ç´å¥è³è¢¼é¸½å²æå½ææ»æ¨é¤é´é´æ±è¬é´¿é¶åä½®åæèéé©ææ ¼é¬²æ
èµèèè¤è£éåå¡¥æ»è§¡æ¿æ§
èé£ééé骼諽輵鮯æ«ééè½é·é¨é°ªå¿è¸ä¸ªåè¼åç¡é¬ç®é»ç¦ç»çµ¦æ ¹è·åäºè®èæ¯ææ´å¯åºçæµèæ¶è®æ¤©ç¿çµèµé¹ç·ªç¸ç¾®è³¡ç¾¹é¶é å½å峺æç» è¿èæ¢ç¶é² 骾é¯äºå ©å¹å¼å°å·¥å¼å
¬å·åæ»æä¾ç³¼è±å®«å®®æè£èº¬é¾å塨å¹æ©è§¥èº³å碽篢髸觵é¾é¾å»¾å·©æ±æ±åæ²æ ±çè¼éå
±è´¡ç¾¾è²¢æ
çè´å
å
£å¾ä½æ²é©è¢§ç¼éæºé¤ç·±è¤ ç¯ç°¼é²éå²£çèæ¸ç½èè笱èè¼è±¿å¸æè¯è´å¢å§¤è©åå¤å¤ 訽媾å½æ詬ééæ§ç
¹è§æ覯購估åå§å¤æ²½æ³æ§è½±ååç½é¸ªç¬èè°èèè§è»±è»²è¾é
¤æ¯é²ç®ç®å«´ç¯æ©é®é´£è½é¹é¶»å¤å¤æ¢æ±©è¯è°·è¡å³ ç¯éª¨ç½ç¾é§é´å¦åæ·èµèèå°³æ²ç¸ç¡²è©é¦é¹æ¦¾é·é¼é¼åæ¦ç·ç©ç¸ç³è£æ¿²è餶çç¬ç½éµ è ±åºææ
å
顾å å´å´®æ¢ç¿æ£ç¥»éç¼ç¨é¢é å±é®é²´é¯é¡§çå®è½è鸹æç»ç
±é¢ªè¶åç·ºé½é¢³é´°é¨§åå§å±åå®å©å¯¡å¦å¬è¯ææç½£çµç½«è¤è©¿ä¹ææ´æºç®å¤¬åæªæ å
³è§å®å è¦åè棺è窤é¢çç観éé³éé°¥è§é±é¦ç¯ç¯ç¦ç®¡è¼¨èé§é¤¨èºé³¤åæ¯ä¸±è´¯æ³´æºæ¯æ¼æ¶«è²«æ¹ç¥¼æ
£ææ½
é¦æ¨ç¥ç½ééçççç礶鹳ç½éµé¸é±¹å
ç®ä¾çççå£å姯洸èªæ¡ç¡çè±ç¡åè¼é§é»æ¬å¹¿åºç·å»£ç·è©ä¿éè¦æå½å妫é¾è§é½çè¥éºå¸°çªè¿äºç¡
çªè¢¿è¦åª¯æ¤ç°éå«¢æ«é¨é²å¬å¶²æ§»æ§¼çç¡èé®é¾å·æ¸é¬¶é¨©ç鬹櫷å®æ°¿è½¨åºä½¹å¦è¯¡éå姽æç¸è»é¬¼åºªç¥ªåæ·æ¹è«è§¤è©å¬ç°è¡å½å¿æ°ææç
æ±è´µæ¡æ¤¢çè²´æºèè·ªçååæ槶ç¶ç¦¬ç°æ«è¥é³é¼é±é±¥ä¸¨è¡®æ绲è¢è¾æ»è裷滾ç·èç£ç··è¼¥é²§é®é¯æ£æ£çç´ç謴åå¼åéå¯å å´æ¥èéé
å¢çåå½æ¿èéå½èå¯å¶å»å½åå帼æ´è
å¹æ
ææ¼èè®èè¢é¦æææ·çèé¦æ¤è¤æ§¨ç²¿ç¶¶è¾è£¹è¼ é¤é¹è¿éè
å¦éªé¿ä¸·ååå¨å©éª¸æµ·è²ç¸å¡°é
¼é¢äº¥éªå®³æ°¦åé¤é§é§´å¡é¥ä¹¤å
¯ä½é¡¸å»è¶é
£é 嫨谽æ¨é¦ é½é¼¾éå«é¯å½åè£å¾è·å
å
娢æµå´¡ææ¢æ¶µçå¯åµ
é©çç¨ç³è¬æ¾é¡éåç½æµ«åèè±é¬«æ±å±½ææ±é¬æ±å¾ææææ¶çèæ¥æ·ççè¡é¬éçç
å¼è¿é¢é¦¯ææ¼¢èæµç¯é²éæ¾æ¼ç¿°èé ·é¡é§»èî ¡î éçè«é¶¾å¤¯é§å¦èè¿æ»æå³ç»ç¬èªè¢é¢è²¥ççµé æ²è è¿åè
è§ç«è毫æ¤å¥çå豪å·çå«æåå£æ¿ ç±è è¹å¥½éå·ææ¦ç§å ææ浩èæ§æ·åçæ»èèæ¤ææ¾ççç¡èç¥é¢¢çé¡¥é°çå
è¯åµæ²æ¬±å訶å¬è 禾åä½å¾ååå§æ²³éå³æ·æç¢ç籺é饸å¬ææ ¸ççè·å涸渮ç秴èèèµé¾æç²è¨¸é¢æ¥æ¯¼è©¥è²è²ééé²çé¡é¹éº§æ¾é ç¯ç¿®èéºç¤éé¨é½è¦é¶¡ç¬é龢佫åè´ºè¢éºå¯çæ¹¼è³åç
ç¢çè¤èµ«é¹¤ç¿¯å£ççºç鶴é½ééé¸éé»é»å¿æ½¶å¬æ«çéä½·å¾ç 詪æ¨äº¨å¼æ涥è姮æææ¡çç©è»é¸»æ¨ªæ©«è¡¡é´´éµè
é
åå ¼åä¹ä¹¥å¿ç´è½°åè¨ç軣æ渹ç¢ç¡¡è°¾è¨è¼·åé§è½ä»å¼å¦
红å°å®æ±¯ç纮é³å®æ³çè°å¬å¨æ´ªç«ç´
èè¹æµ¤ç´ç¿è¾ç¡ç´è°¹é¸¿æ¸±ç«¤ç² èèééç¶ç¿è°¼æ½é·ééç¯éå½è»éé»éé´»é»æå讧è¨é§ææ¾æ¾é¾éé鬨é½ä¾¯ç¦å帿ç´èççºéç¯ç³ç¿éªºé餱鯸å¼å½ç¼åéååå¾æ´é
åéå è±é²é²é®é±ä¹å¢èå¼å忽ææ¶æ³è¸æçè½·å«å¿ææ·´è軤é½å寣滹éå¹ æè´è¬¼å«æ弧çç³è¡å£¶å£·æçå壺媩æ°æ¹ç¢çµè«æ¥ç
³çåèé¹æ§²ç®¶ç³è´è¡é±ç¸ èéé ¶è§³é¸é¤¬ç«é¬é°é¶é¶¦é¶®ä¹æ±»èæµå¬èç¥è滸ç®é¿é¯±äºå¼æ¶æ·æ¸å±å´èå¸æ¤æ²æ²ªå²µææ½ææç¥ç¬ç²å©æç ç¶é å«å«®æ¢æ»¬è°æ§´ç©é³¸ç°éåé¹±è·é³ éé 鱯é¸è±è²å婲æ¤ç¡´ç³èª®éµè¤åå姡éª
è¯é§æ»ç¾å©æ¶çç£èèéèéµé©é·¨ååæ¹ç»è¯å´æ¡¦å©³ç«å¬
çµè§è©±åæ¦æ§¬æ¨ºå«¿æ¾
è«è«£é»ç¹£èè³æå¾æ·®æ§è¤¢è¸æ褱æ·ç¤æ«°è²è¹åå¶å£å£è¾æ¬¢æ¬¥æé´
æéµé
å¾æ½ç¾æ¡è²è®é©©è¿ç¯éå³æ´¹çèæ¡èèå å¯çµéç¶ç¾¦è²é¾é寰澴缳éç°è±²é°é®é¹®ç³«ç¹¯è½é¤é¶é¬ççç¼è¼ç·©æå¹»å¥èå¥å®¦å¤æ¢æµ£æ¶£çæ£æ¢çéåååµæææ¸çªç
¥ç豢漶ç槵鲩ææ¾£ç£è§é¯é¯¶é°å·èèè¡æå¡æ
çåå°éé»é»å¤å åªå´²å¾¨æ¶ææ¹èé楻ç
ç墴潢çé½ç¿çç¯èèç磺ç©è«»ç°§è¥é é¤é³è¶ªé¹éé¨é°é±é·¬æ³æç¾å®ºææå¥è°å¹æ°è©¤ç縨è¬æ«ç©å
¤æ»æ¦¥æçé¤ç°ç³è¯å´æ¢æ»æ¥æ´èºè¢æç£ç²è±å©åªæ®ç¿è¾éææ¥ç
ç¿ç¦è©¼å¹ç³è¤å
åæ翬è¼éº¾å¾½é³çé°´ååå¬ä½ªå»»å»½ææ´è´è¿´ç èé¥çèèèé®°æèæ¯æªç¬èåå±·æ±ä¼è®³æ³åæµç»èè诲ææµæ¡§ç©çªè´¿å½æ¦ç§½åæ æ¹çµµç¼ç¿éå¯å½å½ææ¯æ¯æ»è©¯è³å¡åç£è§èª¨åå¯æ
§ææ³æ§¥æ½èå¦å¾»æ©æ¾®ç©ç¤èèè«±é ®æª
æªç´ç¯ç¯²è±é¤¯åæ³çºç©¢ç¹¢èªæ«ç¹ªç¿½èå¶è®é¸é åé¬é§é¢è¿é¡ªææ¬è¤å©æ涽éæ½æ£æ®è·ç§ç¯é½å¿¶æµé¦æ¸¾éé¤ç¹è½é¼²è¯¨ä¿å±åææ··ç溷æ
觨諢åè éªåéè±æé¨ä½¸æ´»ç§®ç§³ç«ä¼é©é¬é¥æ¼·å¤¥æ²æè´§åä¿°æçè·éå¨æ祸貨ææ¤æ¹±ç¦åè¦å奯ææ¿©ç²é檴è¬éçç©«é¬å¯çè¯è§è¿è å¿æ¤èç¨çéé夻ä¸è®¥å»åå½é¥¥ä¹©åå¾æºçèè¨ç¶é¸¡æ
å迹åå§å§¬å±ç§¯ç¬é£¢åºç»©ååµåµæ²æ§ççç¼èµå£åç¸ç¨è·»é³®åæ¯ç®éå°æ槣æ¨ç¿ç¨½ç·è§è³«èº¸é½å¢¼æ¿æ©æ¿ç£ç¦¨ç©é¤é®æ磯ç°ç¸¾ç¾è³·é¿æ«
èéèé²é¶è¤éé¥çªèºé¿é·é½ç¾èéè¦éé½ç¾é¸è¦äº¼åä¼åå²å½¶å¿£æ±²çº§å³æäºä½¶éå½åå§æ¥ç¤çç¬ç´æ¤ç¾è§å®å庴æ¥çè¨è°»æ¢æ£æ¥µæ®æ¹éå¡å«æ±æ¥«èºèè¶è¾æ§è¤èé¡å¶¯æ½ç 箿èèºè¸é鹡橶æªæ¿è輯è¥è¹éè¥ç±è½é¶éµé¶ºé·èº¤é¦é§å 己丮å¦ç±æ³²è®æ¤èæ鱾幾æåµ´éºé¢æ æ ç©è£å½å½æ¡è®¡è®°ä¼çºªåå¦å¿æè°è¶é
åå£ååå³æ¢æ´æµç´èè¨å¤ç´ç»§è§è¨åå¯å¯å¾æ¸æ£æ¢æ¸ç¥èæè®èªèå
¾çµç¶èè£è·¡éå¢æ¨æ¼æ¼ç¦ç¨©ç©èªè·½éé²æ©ç¨·è«
鲫ååæç©ç¸èè¥é«»åæªæ¿ç¹ç½½è¦¬é®æªµç¾è¹é¯½éµé½å»æ»ç 穧ç³ç¹«è骥é¯ç±ç¹¼è®é±è»é½é°¶é°¿é±é©¥å 夹夾å®æ¸ä½³ææ³è¿¦æ·æ¯ æµçå家浹çæ¢ç¬³èè¢è¢·å¢ç³èè£è·çè
µé«åéç³è±è²éµéºå¿æ´å²¬éèéåæè¢æè¥éæè±é¢èºè·²é¤éé ¬é °é´¶éµç²åç¾èæè´¾é¾å©½å¾¦æ椵è³éæ¦æ§çæªä»·é©¾æ¶åå«å¹æ¦¢å¹ç¨¼é§å§æ奸å°å¹µåæ¼é´å¿æçªè©è°å§¦å§§å
¼çå
æ¤ç笺è
èºè±æ¹ççç¼èèéé¬æ椷椾ç
çç·ç¢ç¼£è¹è±£ç£ç®æ¨«çç·èè³é²£é³½é¹£ç¸ç¯¯ç¸é»è±é¬é¤°é¦¢éºçé¯é³æ®±ç¤è¦¸éµ³ç¸é°æ«¼æ®²è¼é°é¶¼ç±éé°¹åèé¯éåæ£æ§ä¿æ¬è§å¹æ¸æ¡ç¬ååªå¸´æ¢æ£æ¹è¶¼æææ¤æ¸ç硷裥è©é弿æçç§ç®çµ¸è°«å½
æ©æ¬ç¢±å翦æ¿æª¢èè¥è¥è¬è¹ç¼ç¤ç°¡ç¹è¬é¬é°é¹¸ç½è éé§é¹»è¾è¥ºé¹¼è§ä»¶è¦ä¾å»ºé¥¯åæ´ç®è贱俴å¥å£æ «æ¶§çè°å±å¾¤æ¸è¢¸è°é¼å¯ææ¥æ¯½æº
è
±è¶è¥è·è·µéè³é´é®åæ¦æ§æ¼¸åå墹æ¾ç®ç³è«è³¤è¶è¸è¸ºåå橺è¦è««éµé¤ç¯ç·ç£µç¤è¹é³æ¶æª»æ¿ºç¹ç³è¦µé©è»è¦è½ééé¬é³æ±å§å°è³æµçè±èæªç¿åµæ¼¿èå£å½ç¼°èæ©¿æ®è¿é³ç
ç¤çç¹®éé±è®²å¥æ¡¨åèå¥å¥¨å¥¬è£æ§³çè©èè¬é¡åå å¤
å¼æ¢éæ´ç»å°å¼¶è¢¶çµ³çºé
±æ¾æ»°åµ¹ç糡é¤ç³¨é¬æ«¤è¬½è½è交é姣å¨å³§æµèè®éªè¶æ¤ç¦ç³èè·¤å¬åè é²å¬å¶å¶£ææ¾è èçè²ç¤ç©é®«î¡éµé¹ªç°¥èè½éé©é·¦é·®æ«µè«è§ä½¼ä¾¥æ¢ç¡ç»é¥ºææçç¬
çç«èé°æ
湫ççµå¿å¦æ«æ¹¬ç
è
³è³å¥æ·æè¸é¸é¤ååææ¹å¾¼æ½æ¿ç¼´æç¬ç¯ç¦è鵤繳èåçºæªçé±å«å峤æè¨ççªè½¿è¾ææçªæ»è¼åå¦æ æ¼é
µåå¶ æ½åå¬ç¥è è¶è½é®è¥çéé¶ççæ¥æ²ç秸è¨éååå ¦åªå«
ææ¤æ¹è»è¡ç
¯ç¨éèæç¤é¶å©åªåå°è讦å¦å§å«å²æ
å¼å¼æ°ç衱è¯æ®æ´ç»è¿¼å¢æ¡æ¡èè¨å¼å©å´¨æ·è¢ºå媫çµè£é¢åµ¥æ¥¬æ¥¶æ»ç«ç¯èè©°é£éæªæ¦¤ç¢£ç«èµé²æ½ç¾¯èª±è¸é ¡å¹¯æ³å¶»æ®ç¤é»é®å·æ«è è è ½å¥¹å§æ¯åªè§£è§§é£·æªä¸¯ä»å¤å²åºå¿¦æè¥å±å±æºç ççç¥ç 衸诫åæè§å¾£å ºæ¥ç¾è¶éª±ç誡褯éªè繲巾ä»æ¤é
å
ééæ´¥çç èè¡¿è§åçç´æçå »ç»çå¶ç¡é¹¶é»
è¥ä»
åºå·¹ç´§å è«å
åªè°¨é¦å«¤å»æ¼ç¡ç·è³é¦æ§¿ç¾é¦è¬¹é¥ä¼å¤å°½å²å¦è¿è¿ä¾æåæµè©ææ浸ç¬èµç¥²é²ç
¡ç¼å¯æ¢æºç¦é³å¢æ
¬ç¨å¸åæ殣è§åå¤æ¿
ç¸è³®åå£å¬§æ¿èç¼ç¶è¦²è´é½½ååå· äº¬æ³¾ç»è亰ç§èèæ¶èå©æææççµèæ¶ç¨è
çç²³ç¶å
¢ç²¾è橸鲸éµé¯¨é¶î¡é¶éºé¼±é©éº äºä¸¼é±ååå®æ±«æ±¬è¼å穽é¢æ¯åå¹æ¬çæ¼æ»çççç¥é ¸è¼è¦å¦å弪å¾è¿³ä¿æµè«ååå¼³å¾çç«éå©å©§æ¡±æ¢·æ·¨ç«ç««èæ¬ç竧éå¹éå¢ç誩è¸éé éæééçé¡ç«¶ç«¸ååå°æåçµ
é§é§«èåå§æ³è¿¥ä¾°ç¯éæµ»ç±ç
çªé¢ç¶åç
ç²æ¾çç褧é¡è丩å¼çº æ»çç©¶ç³ºé¸ ç³¾èµ³éèå¾ææªæ«é³©ææ¨é¬é¬®ä¹ä¹
ä¹ä¹£å¥ºæ±£æ¦ç¸çèéç´¤é
é¹é®åæ§è¼åççæ©æ¾åæ¡å©æå°±å»åè
å¦å»å»æ
¦æ®§è鹫鯦éºå¶é½¨é·²æ¬å¥å§æ
åå±
ææ³çè´é©¹å¶æ¶æç½ççç ç½é±å¨µå©
å©®å´æ¬æ¢®æ¶ºæ¤çè
è¶è·é裾éèèè«è¸é¦é§é®é´¡é é«é¶å±æ³¦ä¾·çæ¡æ¯©æ·çèé¹æ¤æ¯±æ¹¨çè¼åªç²·è»è·¼è¶èº¹é°æ©æªé§¶éµè¹«éµ´å·èî¡ é¶ªé¼°é¼³é©§åå¼æ²®ä¸¾ç©èææ¤ç¥æ¦æ¦èé¾è¥è踽æ§æ«¸é½æ¬
襷å¥å·¨è®µå§å² æææ´°è£éå
·ææ ææ«ç¬ç§¬é俱å¨å£å§ç²èè·è¢å§å¾æ§æ®è©è·ç£çè·é
é£è¡è±¦é¯å¯ æ³çªèé§åå®å±¦è¸é®å£æ
æ澽窶é½é¸å±¨é¢¶ç¿è²ç°´èºéµæ¼é»ç 姢å¨ææ¶è§è£é¹å¬éééé¸éµé«è ²å·å帣åæ²è¤é©èéå¥åµå¼®å¦åæ¡ç·ç»¢é½æ·ç¹ç·éççµç½¥éç 絹飬æ
»è¨é¤ç§ç¾åæ
æ§å±©å±«äº
ååå³åæ°è¯å¦æ決èµæ³¬ç¦ç¨æçç ç»è³è§åæ欮èå´æææ¡·æ®çè¦è§è¨£èµ½è¶¹é«åå¥çµçµ¶è¦è¶éååªç´è°²é§å¶¡å¶¥æ°æ½ç¦ç´ççèè¨é´é´å±æ æ©æ©é¼çµèé¢è¨è©çè蹶蹷é¶å¼ç覺ééçç觼å½ææ«çé·¢æ¬ç¡é¾£è²èº©î¡éååå汮姰è¢è»é§èè桾ç²èéç¢
ç ç¸ç¹è¦ éé鲪éºé鮶éºéºåä¿é¡éåå³»æææµé¦éªççºç¯ç«£ç®ç®è å寯æé¤ç濬駿éµéµéµæåååå¡ä½§å°è©è£é²å¼å¥æ©è¡ééé¦å¯åå²æºé¿é å±å´æ
¨èå¡æ·æ¥·è¼æé´éé§é颽忾çç欬çåå
æ¾é乫åæ åé¾å ªåµæ¡é¾ååä¾ç è°åå³æå ¿æ¬¿å¡ªæ輡è½é¡ç«·è½çè¡å´å¢éç°ç£¡éç忼ç ç²åº·å«åµ»æ
·æ¼®æ§ºç©
ç³ èº¿é®é±ææ亢ä¼åéå¥æçºé¶çéªé§éå°»é«ä¸æ·èæ·æ´æ ²ç¤éçé¬é²é 鮳é¯å¼å·èæ¯ççç§è¢è½²ç´è¶·é¶åµæ£µç¾èªè»»é¢æçç¨çª é³æ¦¼èé¢æ¨çç£èé ¦éé¡é«ç¤å£³å³æ®»æ¢ç¿å¶±å¯å²¢ç£æ¸åµæ¤æ¸´å
å»ååå客å³æªå¨å°
课å æ°ªéªç¼åææºé碦ç·èª²éç¤é¨èè¯è»å¦æ³å豤è²å¢¾é¹ææ¯è£è¤å¥åååæ³ç¡ç¼ç¡é¿ç¡»èªéµéé巪乬åå¼æ¾ç©ºå¥åªå´æ¾æ¶³ç¡¿ç®èº»èº¼ééµ¼åææ§é廤æ è¤çå¾å½æ³çå£å¶å©æ£ææå¦å®¼å¯é¦çªçæ»±è²è»çç°é·æå³ç»éæ¯åæ¡å å´«åè·çªéª·é®¬çè¦æ¥åºä¿ç»åº«ç§ç
袴å¾çµè£¤çé
·è¤²å³å¤¸å§±æè¿èªä¾åµå®éæè¯è·¨éª»è¯æå·å·å¦å快侩éåç¯èå¡ç·î ¨é²å墤é¶å²å»¥çªè¾æç³©é± å®½å¯å¯¬é«é§é«æ¢¡æ¬µæ¬¾æ窽窾å¡å»è¯é¼å©åææ´ççºèªè»æçç
诳è»è» èªéµå¤¼å£æéå¹çº©åµæ·å²²æ³ç¿æ¿è´¶æ¡çç ¿ç¶çµçµè²ºè»¦é±ééºå£é»æ¬æ çç礦穬çºéäºå²å²¿æç窥è§çªºè§éé¡å·è¬å¥æéµéé é¦å¹æèµéªæ£ææ¥æ¥éç½è°é ¯æ«èé¨é·é¨¤å¤è·èå·èº¨å¼åç
è·¬é ç£è¹å°¯å®æ¬³å媿æ¦æ§æºèèé¦å±å³î ®å¬ææ½°ç¯è©î¡èè¢æ¨»æ®¨è¬é¤½ç°£î¡èµç±éé¥éå¤ææå å å©«å´å´çèè£çç¨é« 裩éé«¡é¹å°¡æ½è«è¤é«¨ç´ç»ééé²²èé¨é¯¤éµ¾é¶¤ææé壸梱祵硱ç¨è£å£¼ç¨ç¶é«é¸å°æ¶çæ©æ¡æ¬ææ æ¡°çè¿èèéå»åé ¢é«ºæ´æ¿¶éééæé©é¹é¬ ç©åææå¦ç¿èæéæ¯ç ¬æ¦ç£åèå¹åæºè
æ§æ¥çè¡è辢辣è²èæçèé¬æ«´çé´é¯»è éé¡æ¥ä¾ä¿«åå´å¾æ¶è±é²å©¡å´åº²å¾ 梾淶çèé¨æ£¶ççé¼ç®é¸é¨é¯ é¶éº³å»èµççèµè³æ¿è³´é ¼é¡çéµ£ç¨ç¬ç±è¾ç©è¥°ç±å
°å²æ¦æ 婪åµè»éèèè°°å±æ¾è¤´åæ篮æ¢ç£èè¥é§éç¼è¥¤èå¹±æç¾çç±ç¹¿èææ¬ç¤·è¥´åç¡ç±£æ¬è®èºè¥½éééè§æµ¨æ½ç¼æ¦æ¼¤ç½±éå£æ覧æ¥å¬¾æ¶å覽åæ¬æ¬ç¦çºç滥çåå£æ¿«ççç¤çç ç³·å·åéé欴ç¼è¨å«å»æ¡¹ç
èæ¦ç¯ç¡ ç¨éç¤èèéè躴éé¯é§ºæ¢æéæçºå¡±è¢æ¨èªé¬æ¤åå´æµªèå¥æ粩æå³å´ç¢ç«çªå°å å´æµ¶åç¨é¹åå®å¶æ¥æ¥ç磱簩è§éªéé¡é«èè佬å¾å§¥æ
èæ ³ç¯ç¡éè¯é 潦æ©é®±è½æ¶çå è¢é
ªå«ªæ¦æ¾æ©¯è®è»ä»éä¹å»å¿ææ°»è»çæ³ç«»ç ³å楽é·æ¨ç°é³é°³é¥¹é¤é·å«ç¼§èæ¨ç¾æªç¸²éæ«ç羸礧çºç½è²é³è½ 壨ééè鱩æ¬çºé¼ºå½èè¯åå¡çµ«å«èªç£è磥è¾å¡å£çèæ«ç礨ç
è è½è®å½é¸é¸è泪洡类æ¶æ·ç´¯é
¹éé é ªæéæç¤é¢£é¡çºè±ç¦·åè·å¡æ£±æ¥ç¢ç¨è¸èå·å°å æ£çåååå梨ç¸ç¦»è²èéªæ¡æ¢¸çèå±æ£çé¹åºæ¼çç£ç¼¡èè èå« å·æ¨çç ç«°è²æ°çç³è¾è¤µé«é²¡é»ç¯±ç¸ç½¹é
è謧é¨åèééé¢é¯æé«é¯¬éµ¹é»§åçèºè ¡è «å廲åé穲籬驪鱺é¸ç¤¼æéä¿å³å©å¨å³²æµ¬é¦ç裡éç²´è£è±é°é²¤æ¾§ç¦®é¯è¸é´é³¢é鱧æ¬åååå±´ç«åæ¸ä¸½å©å±ååæ²¥èä¾å²¦æ¾æ¥æ²´ç èé¶ä¿ä¿ªæ æ ç¬ç
èè赲轹é¦å¨³æ§æ æ æ µæ¶ççç ºç ¾ç§è
å³å©¯æ·çç¬ ç²ç²è¸èååå¤æ£ç¢è è©è·é³å¡æ
æ®æº§èèé鳨å¯å²æ¦æ´ç®ç¶è§åµææ·ç¯¥é·é´å·æªªæ¿¿ç磿é¸é¬å®ææ«çç¡ç¦²è å¦å£¢ææ«çç
礪è¶éºæ«ªçççªçç¤«ç³²è £å·ç§ç¤°é
é·
éºåæ¦èºè½¢æ¬è®è½£æç¥éé±±éçä¿©å嫾å¥è¿å¸ææ¶è²é£æ¢¿è裢亷å¹å»æ
©æºæ¼£è®å²å¥©çè¦åå³åæç£è¨è«è¤³é²¢æ¿æ¿ç¸ºç¿´è®èèæ«£ç«è¯è蹥謰éé°ç°¾è è§é¬é®é°±ç±¢ç±¨æçè¸è££æ槤çè¹å¬ææèé»è¥ç¾·èèç»å¨ç¼ææµ°æ®å 媡æ¹
è°é¾åæ¥ç
çæ½ç¨´ç·´æ¾°é¬æ®®ééç²é°æçºç°è¯ä¿åæ¢æ¶¼æ¤è¾ç²®ç²±å¢ç¶¡è¸æ¨è¼¬ç³§ä¸¡ä¸¤å
©å¡å¢æè¼è£²ç·è½éé亮å´è°
è¾å¨æ¾æ¹¸éç
·è¼è«è¼é蹽辽çèå寥嵺å»ææ¼»èå¹å«½å¯®å¶å¶ææ©æ¹ç ç¼é¼æ¸çç窷è«çç«é£é¹©å±ªå»«ç°ç¹èè±è³¿è¹çéé«é£é·¯éééè¼çé½äºå°¥å°¦çæå°æçå§æ¯æååå£å½å½å§´å³¢ææ´è¢è¿¾åæµçç®æ©ççèèè£ç
çèè¶å·¤é¢²å 鮤î¡é´·æ¸çµç£èºé¬é¬£é±²å¸é»æ临åå´ææ·æ½ç³ç²¦ç³ç¢ç®ç²¼é°é£å¶æ½¾çé´æ´æ½ççè¾éçµç£·è¨ç¹ç¿·éºè½å££ç¶é»é³é©éºé±è»äºç¨å¯ååæ廩廪æææ¾æªæª©çç顲åæ¡æèµçè³èºæ©çè¦éµçèºè¹¸èºèºèºªè½¥æ伶å¢çµå¹å½å¤å§å²å²ºå½¾æ³ çèæ¤ææç²ç´åçç ±ç§¢ç«ééµé¸°å©å´ææ£æ·©çç¬ç´·ç»«ç¾ç¿èè²è±èè¡ç¥¾è©
è·è»¨è¤è£¬é´éé¶é¾ç¶¾èè¼éé§æ¾ªè¶ééé¿é²®é´é¹·ç¯ééé½¢ç®é
鯪åè¦é½¡æ«ºé½éæ¬ç§éº¢é¾é¾è¢é¢é 嶺令å¦å¤ç©æºçåæ² çæµæµçæçç±ç¡«è£åª¹åµ§æè¥è
éé¦éªæ¦´ç é£åç¬ç¤ç£éé§ é¹ æ©ç¢çé ç
è駵å æ°çè°éé¦é¤¾éºéé£é騮é£
鰡鶹é©æ³æ æ¡ç桺绺é綹ç®ç½¶é¶æ©®ç¾å¬¼å
ç¿å¡¯å»æ¾ç£é¹¨è¹é¤é¡é£é¬¸é·ç¼ç
åå¯é¾å±¸åæ³·èæ½æ çè§ç¬ç »ç«ç¬¼èéæ¹°å¶æ§æ¼è¯ç窿ç¯é¾å¨å·å·ç§è¢é§é³æ¨æ§æ«³ççç礱礲襱é¾ç± è¾è ªè ¬é¾è±
èºé¨éé©¡é¸éåå
æ¢å±é´å£å£ æç«å¢æ¢ç¡¦è¡å¾¿è´å¨å»å©å½æºèå楼åå»æ
ºèé±æ¨ç¡è§è¼çè¬èè»è¬±è»é«
é»é«åµæå¡¿å¶ææ¼çç¯ç°éå±æ¼çéî ´çºç»é¤é²åæ¸åæ¼å¢åºè¦åæ¦æ³¸çæ èªè½³è®é¸¬çè»é¢
é©é²é²ç§å§å£å»¬æçç¹ç·è櫨ççèçç±çºç½è«è ¦è½¤éªé¡±é«é±¸é¸é»¸å¤èæææ³é¹µç¡µé²èå¡·æ»·è¾æ¨æ¾é¯ææ©¹ç£ é¥çæ«æ°è£éèªéªé¥å¥çªéä¾å´å½å½å³åèµè¾é¸å¨½æ·æ·¥æ¸ç¡èé¯é¹¿æ¤ç祿ç¦åå¹å 滤çç©ç¢ç¨è³è·¯è¼
塶å»ææ¼ç®ç²¶èæ®æ¨çèè觮趢è¸è¾éæ½ç©èéé²é´çç°è°é´¼æ¿¾ç°¶è¹è½é¨é¹ç°¬ç°µé鯥鵦鵱éºé´é¨¼ç±è§»èé·ºæ°é©´é¾æ¦é馿æ°è¢æ«èæ¥é·é©¢ååä¾£é侶æ
æ¢ ç祣ç¨é屡絽ç¼å±¢èèè¤é履褸å¢ç©ç¸·ç©å¯½åå¾å·èç绿åµæ°¯èç¶ ç·æ
®ç®»å´ç¹æ«çé¢åªå³¦ææ ¾é¸¾è滦é®éµå奱åå¿å·æ£æ«æ¬çç¾è åç¤èé¾ç´çµé¸åµä¹±é äºæ ç¥ç§é稤稥åéé¢æ½æ¡æä»ä¼¦åµæ²¦çº¶ä¾è½®å«é¯å婨å´å´ææ·ªèæ£è
ç¢ç¶¸è¦è¸è¼ªç£®é鯩ç¨è£è®ºå¨æº£è«æé ±åç½å°ç¡è¶èé»æ¤¤è
¡é£ç®©éª¡éèºç¾
覶éå¸è¦¼é¨¾çè¿éæ¬é¸ç±®é¼é¥ é©åå®ç ¢è裸躶ç°è èææªç³æ³ºå³æ´ç»è¦éªæ´ç笿絡è½æ漯çé駱鮥éµ
濼çºé±³å¸å£å¦åª½å¬¤å¬·éº»ç²å«²è´çèè马ç¸çç è馬溤çé¤çªç¢¼èé·é·é°¢äºæ©ç¥ééªååç°å榪禡罵駡礣é¬ååååè¶é¾ä¹°è¬è²·åªèé·¶å¢è¿ä½
売麦åèè麥è¡å±è³£éé¡é¢é¢é¡¢å§æè®æ
²æ±é¦æ§¾æ¨ ççéé¥
é³é¬é¬é°»è »å±æºç满滿è¨è¥èéçæ¼åè°©é¤å¢å«å¹æ
¢æ¼«ç缦èèç³æ¾«æ¾·é縵è謾éè°ç¤éåå¿æ±èå°¨ææ§ç²åæ¾ç¬è«å¤å¨æµçµç»ç¡é¯éçèé©é§¹èè½è¾è»å£¾æ¼èè åç«è²æ¯çæ¯æ¯æç¦è
æ渵è»é
å ¥èé緢髦è¥é«³é¨èé¶åå¯å¤æ¼å³æ³èæ´é笷è©éåçè¼åèåçè´¸è袤è¦åª¢å¸½è²¿éæææ¥æ¯·ççè²é®èæååº
å濹å°ä¹ç¦å
æ²æ²¡æç«èºæ çèèæ¢
ç»è¢é¿å ³åªåµæ¹æ¹ç¸çè¿æ¥£æ¥³ç
¤çç¦è
塺æ§é
¶é
é¹ééå¾¾éçæèªé¶¥æé»´æ¯æ¯åç¾æ´æµ¼åªåµæ¸¼åªºéå¬ç躾é黣妹æºæ²¬æ§ç¥è¢çåªå¯çè·é¬½ç
ç¸éé
ç¯èåæ¤é¨æªç£ééé
æ«èçç©éèé·çæ¶æªçææ£ä»¬åæ¹ææ°ç¿è»å¡åº¬ç½èèè 夢æºçéºçåæ©ç¢èè±é³é¸å¹ªææ¿ç´ææ¦æª¬æ°çç¤é¯è¨é¹²çéé¥é¡é¸åçç¾èé°èè¢é³æµè é¯é¼å梦夣æé¥é¿è¸åªçå弥祢迷袮çè°è¾è©¸è¬éå½æç³ç¸»éºéºç¦°é¡ç¼éºç¢ææ çè¼é¾é¾é¿é¸éç±³ç¾èä¾æ²µå¼æ´£æç«ç²èç¯æ¸³èèèé¤æ¿ç°åçå糸汨æ²å®æ³è§
å³ç¥å®»ç§å¯æ·§è¦è¦å¹è°§å¡å¹è¦å§æ¦æ»µæ¼çè¤èé¼åªæ¨å¹¦æ¿èè¬æ«ç°ç¾å®èç å©ç»µåªæ£ç¶¿ç·è±è嬵檰æ«çççä¸æ±
å
æ²é»¾ä¿åç娩ååååææ¹ç¼
èè
¼ç·¬é®¸é£é¢ç³éºªéº«éººéºµåµèåªæçé¹å«¹é¶é±æªçç§æ·¼æ¸ºç¼ç¯ç·²èéå¦åºç
ç«åº¿å»ä¹åå©å¶åçè¦æ£æ»
èèé´å¹æ±ç篾æ«è è¡éé±´ç±æ°åå§å²·å¿ææ»æ¼çè çç¿å§ç½ å´æªççç¼æçç»ç¢é±ç·ç·¡è³¯éé´é²ç¿åºå¡éµæ¿æ³¯åæé½æ¯æ笢笽湣éææ¯é»½é©å¶æ
æ«æ½£ç°¢é³è é°µåæ鸣洺çèå¥æç³ééå«æºç½èææ¦ éé³´çèè¦ä½²å§³åæ
é
©å½æµè©ºè°¬ç¼ªç¹è¬¬æ¸å¤å°è°å««é¦æ¹æ¨¡è麼麽æ©é¹æ©
磨糢謨謩æµé¥å©èèé«éåé¥æ¹æ¡éº¿æ«å°å½å¦ºå¸æ½æ¾æ¿æ®æ²«èéå¸æ©æºççç¿ç 秣èè«ç½ç²çµè¢¹è¨è²å¼å¡»å¯æ¼ è¦è²ééºå¢¨å«¼æ¯ç¼ççéé©é»ç¸¸é»è²è¦èéç
é©ç¤³çºè±ä¹®åçä¾åºææ´ æ¡ç¸è°é¾è¬ç´éªé´¾éº°è±ææ¯æ¯ªç墲æ°äº©ç¡å§æå³ç³ççèå¨ççç ªç®é§è¸æ¨ä»«ç®å©æ²çå¶çç§è毣è¯èé¼åèºé®å¢å¹å¹æ
æ¥ç¦é¬æ
æ®æ¨¢èéç©éªæä¸æ¤§ææ¿æ誽éé¿ä¹¸åªé«å
é£å¶å¦ 纳èå¨è¡²é ç´è¢¦æºç¬è±½è»è²éå±è³é¹é¶è
çæ¨å»ä¹å¥¶è¿æ°ç妳廼迺å·é¢å¬å¥æ°èè渿é¼è¤¦èé¼å¡ç·æ©ææ¬ä¾½åæå¨çè®é¾åéææ¥ ç
µè«µé£èµ§ææ¹³è³è
©è»æå©»å乪å¢åè °é¬é¦æ¬é¥¢ææ©æ®ç¢å¾é½å¬æªå¶ææ å³±ç¡éç±è²è©ç¢æ嶩ç¶è¯å¤èéå·ç¿å´æ¼æ©èåè³å æ±å«çè
¦ç¢¯é¹å©¥æ·é鬧èçè®·åæç²è¨¥å¢å¨é¦è
é¤é®¾é¯å
§æ°ç¾å«©è½è»å¯éªé°å±å¦®å°¼åæ©æ³¥ç±¾åªå±ç§é³éå¿å©æ·£çè棿è·é®èºè§¬è²è¼é鲵鯢éºé½¯è¡ä¼±ä¼²ä½ ææ³çè¨æ
æææ²å´é¨é¦ååé¬æ¬è¿æª·é屰氼迡æµèéå¿çç¤å æå«æµæººç¨è
»æ±ç¸è©å¬ºæå¹´ç§å秥é²é®é²¶éµé»é¯°æ¶æ»æ·°è¾ææµç¢¾è¼¦ç°æ蹨èºå廿念姩åèå¨å¬¢åé
¿é¸éé¸èèè¢
é³¥å«è£è¦å¬è¤å¬²å°¿è²ææèå¸å¼è¶æ¿é§æ¶
èè¬å®æèéå¦æå«åµ²é©è¸åæ°æ§·è¸è¸ééå¶ç¯è²éé¢è¹åè¶é³éå¼å½æ«±ç±èå齧å·ç³±ç³µè ¥åè®èº¡é·é¡³éèåæ¨æ°å®åæ§çæ èå¯å¯å¯å¯§ååå嬣æ°ç°è´æª¸è¹é鬡é¸æ©£çä½ä¾«æ³ç¯å¯æ¾æ¿å¦çç汼忸ææ²ç纽æ»çé®ç´è¥ééµå侬åæµè秾農åè¾³å¥æ¹æ¿è½ç¦¯è¿ç© è¥é²æ¬ç¹·å¼ææµçé½ç¾ºè¨åæ§è¨ç³æª½ééè³å¥´ä¼å¥é©½ç¬¯é§ä¼®åªå¼©ç ®è¬æåæ女éç±¹é¹è¡æ§æè¡çèç§å¥»æ¸æç
ç
餪硸é»ç¶éæªæ¢å©æ»åºæ© 诺åæ¿é½æ¦éæ¦ç¨¬è«¾è¹ç³é©æ¦æ§ç³¥ç©¤ç³¯æ¡å¢å¦ç½æ¯®å¤ä¹¯é°è®´æ¬§æ®´ç¯é¸¥å¡¸ææ¯ç°çèé´æ«è²è¬³éé·é½µååå¶è
¢åè¦è
èæ沤æ
ªæ¼å¦ç
趴è¥åªè©æ·ç¬èæ±ç¶ç¢æ½å¸å¸æè¢æ俳å¾æç
æ£çç®è¼«ç°°ç¤åæ´¾æ¹èéç£ç
ç¨æ½æç¿æçè·åª»å¹è°æ«æ§ç¤ç£ç¸è¹çè è¹£éé¶å¢å¸å¤æ²æ³®çåçç¼ç袢è©æº¿é é¬éµ¥è¥»é»ä¹æ±¸æ²è¨è®é±æ»èé¶ååºéæè½å«ç¯£èé³é¾é¾é°è åèªè¦«é«çèææè¬å¨åååºçç®ç°ç®è¢åè«è»³éè¤éº
è·å¥
泡ç±ç°ç ²è¢éºç¤ç¤®å¸æè§æ¸èè¡é
é«éªé«å¹æ¯°èµé«è£´è£µè³ éä¿ä¼æ²ä½©å¸å§µæ¾æ浿ç®é
笩èè¾é¦·å¶é轡å·å´æ¿æç«çæ¹èå ç¿ç¿¸å¯åæ¦æ¨æ³æ²èç °æ¢ç¹ç¡è»¯éæ¼°åé§ç£èææ·ç«¼åèå 弸å½æ£æ¤å°å¡å¡³æ漨硼ç¨è¬é¹æ§°æ¨¥ç¢ææ¾è¼£ç¯·è¨éé¸é«¼èèé¬
çºé¼éµ¬é¨¯é¬éæ§æ·çå»æ½æ¤ªç¢°è¸«æµå·¼é乶å¸ä¸ä¼ä¼¾æ¹çº°é³å¯æ¶æ«æ·çççç æç§ç§ ç´éæç¿èè±¾é½éé¹ééåç£é§é«¬å¼ééé¾æµç¤ç¤é¢é¹ç®é°è岯ææ¯è¶æ¯æ¯ç²ç¬èé«é´å¤å¤å´¥è½è±¼æ¤ç·çµè¾è
æ¦é²ç½´èè±é¦é®å£é®ç¯ºè·è²ç°²ç¾éµ§æé¼è ¯å¹åºä»³å®èè´çé¢è«é´æå½çåå±æ· æ¸æ媲å«ç¤ç¥æ½å»æ¾¼åççè¬é·¿î¡¢é¸çå¨å媥çç¯ç¿©é¶£éªè¼è
æ¥æ¥©è³è«éª¿è¹é§¢é¨è¦è°è²µè«éªé¸é¨é¨å½å½¯æ¼ç¼¥é£ç£¦æ縹翲èµç¥é£é£éç¢è¸éæ®ç篻é¥ç«é¡ 票åå¡åå«å¾±æ
æ°æææ¼ç¥ä¸¿è¤é
嫳å§æ¼ç¤ç©¦é¦ªé©ç贫貧çå«é¢é »å¬ªè²å¬ç颦顰åæ¦æ©çæ±å¨èä¹ç¹ä¿æ¶ç ¯èµç«®é ©å¹³è¯åå¯åªå²¼è¹é±å±å¸¡æ°æ´´ç¶è娦ç¶å±å¸²æ·èè²å¡å¹ç©çç¼¾è è±è¢è©è»¿é²å´æ
¿ç®³è¼§æé®æªç°èéå¡å²¥æ³¼å¨éé¢æºé
¦æ½é±éºå©åè¢é±ç¤è¬æ«åµå°é·ç¬¸éé§å»¹å²¶è¿«ææ¢æ´¦çå±çç ´ç ¶ç²å¥¤èªé éåé¢ææææè£ç®å
å£å©å ·çå
ºåä»æ´æµææªçå·¬å·æ¨é ç¡éºé§åæ²éªæé¯å¤åèè©èè¡è±è²åé
ºå¢£çæ¿®ç¨ç©é¤è´çºé·æ´åå浦ç³æ®å溥æ谱潽樸æ°è«©æªé¨èè¹¼é èèçæä¸è¿æ²å¦»ææååæ 桤缼éªå¨¸æ½ææ¿æ¡¼æ·èææ棲欺紪è¤ååæ
½æ¦¿æ§æ¼ç·æ
¼ç£è«è¸¦è«¿éè¹ééé¶äºç¥é½å»å²å²å¿¯èªäºå
¶å¥ææ§ç¥ç¥èµç§ç«åææèèèèèé¢å¼å´å¸ºææ·æ¸çç¦èè·è»é®éªéªåµæ£æ£ç¦çªç¥ºè´æç¢ç¢è¤éé 鬾鬿æ粸綥綦綨ç·èèé½ç禥è²è¸è§é¡é²¯æ æ¿è檱æ«ç°±èé¨é¨é³èé¯éµ¸é¶éºç±çºè©è é¬é¨¹éé°ç麡ä¹éä¼å±ºå²èå¯åæççåè±èµ·åååå©ç»®æµæ£¨è£¿ç¶®ç¶ºè«¬ç°¯éæ°è®«æ°æ±è¿å¼æ±½çµèå®æ³£ççµå å¥ç è æ æ°£è¨å欫夡ææ£æ¹æ¹èºç¢ææ£ç碶åæå¨æ©ç£ç£§ç£©èºç¤ç½è¿æèæ¤è·é
éå¶å¾å¸¢æ°æ´½æ®ç¡æé«åä»é¡å±å²å¥·æ¦æ±èè¿ä½¥å²æ汧è¾æ¬¦ç«è¤éæªçµç²æèè°¸é
å©å¯ç½éºæè°¦ééåæç¾ééªé¹æ
³æ´æ¼æç®è«é·è¤°è¬é¡
檶æææ«ç°½é²éµ®æ騫é±é¬é¬ç±¤éä»±å²å¿´æ²æä¹¹åè¨é¤æ¬èé±é³ä¹¾åæ®æµè»¡åªéééå¢æ¦©ç®éæ½ç¾¬è橬é¢é»éé»é¨æ¿³é¨çç±é°¬åµæµ
è·æ·ºåµ°æ
é£æ§èè¸æ½è°´ç¼±ç¹¾è´éæ¬ åä¼£è¡ä¿èå©æå ååµæ£æ¤ åçè¨å¡¹æ綪è³å槧ç¯è¼¤ç¯å£å¬±ç¸´åç¾æææ¨æªç±ç¾çç·è·å´æ¤çè
å溬è£éå¶æ§æ§çç²ç¾«éµç¯¬éè¹éªè¹¡ééé¹å¼·å¼ºå¢å«±è·æ¨¯æ¼è墻å¬å»§è檣çè¬è¢è æ¢ç¾æ¶ç¾¥å¢æ¤ç¹è¥ç¹¦çå´çç¾»å
ç©æç¡é»é嵪跷é¡é¥åæ²è¸é¹å¢ç¢»é 骹墽幧æ©ç缲磽é«é¬ç¹ç¹°è¶¬è¹ºè¹»é°ä¹ä¾¨èèæ¡¥ç¡è¬å¬çåæ§è°¯åºå«¶æèé樵æ©ççç§ç¤è®è趫éé½é¡¦å·§é¥æé«ä¿è¯®éå³å¸©çªæ®¼ç¿èªé«åºæ¬æ½ééç«
翹é©èºåèç¿èèºä¸å妾æ¯å§çªå¿æææ´¯æ¬æ·ç¬¡æèªæ
箧ç·é²é¥ç¯è¸¥ç©èé¥é¯éç«ç±¡äº²ä¾µé¦è¡¾éªè³åªåµç¶
èªå¶è¦ªé¡é§¸é®¼å¯´åºè©è¹åç¡ç秦è¹è¦èæ¦ç´ç¹ç¦½ééå¤åªå«æº±é²åææ³é³¹ææªæ¾¿ç½èæè å
æç¬æ¢«èµºèµ¾å¯éå¯å¯¢éè¼å¢å£ææ²åè£æ¿æ¬½ææ³çè½éé氢轻å¾å¿é¬åå¥æ°«æ·¸æ¸
軽å¾å»è»è¼é²é¯éå¤ç å åæ
æ®ç¡æ´î¡æ£¾æ°°èæææ¨ææª é»¥è顷请庼é æ¼è«î¡æª¾è¬¦åºåæ
殸ç¢ç®éæ
¶ç£¬å¬æ¿ªç½æ«¦å®è·«éåéç©·î¡ç©¹èæ¡ç¬»çèµ¹æ¸çªçç¼è¼è©è¬ç
¢ççç窮åææ©©çèçç«èçä¸ä¸ é±åµæç§ç§å¯è¯åªè©æ¥¸è²é¹ç¯ç·§èµç©è¶¥é³
èé¦é§èî¡é°é°é¶é±é¾å´åæç°çæ¹æ±èæ±è¬æ³
è¯ä¿
è§è¨è¨
é
åæµç´èéééæ¢æ®æ¯¬çèµé»å´·å·¯æ¸æ¹ç³çéç
ªçµ¿è·è£å·°è§©è³çè¤é¶éé®é¼½é¯éµè ¤é°½æç³åºæ²ä¼¹ä½å¤å²è¯é¹é©±å¥å±å²¨å²´æ¾æµç¥è 袪åè躯ç粬èè©è¶å¶é§ææºèª³é§éº¹é«·é¼è¶¨éº¯è»éº´é»¢é©
é°¸é±ä½¢å¬æªææèèè¡é¸²æ·æ¸ çµç¿è軥èç磲è¶é´ç©ç¿µè鼩è§å·å¿çæµæ¬æ°ç±§èç¯è ·è¡¢èº£è ¼éºé¸åç«å¨¶ç´¶è©ç«¬èºé¾é½²åºå»åå¿è¿²é¥èéè§è¶£é´éº®é覰覷é¼è¦»å³æ®æåå棬駩騡éå
¨æä½ºè¯ å§¾æ³æ´¤èæ³ç·è¾å³å¢å©æçç¡é¨æ¹¶çççµè
è²æ¼æ¥¾çè§ è©®è·§è¼è·é権踡ç¸ééé³é¬åå·é°æ¬é½¤è ¸é¢§é¡´çç¬æ±±ç½çç绻綣èåå¸å·»ç¶æ¤¦å§éå¸ç缺èç¸å´å»åå´
æ«éç¡ç¡®èéå¡æçµç¢éé¹æ¨æ¦·å¢§æ
¤æ¯ç¢ºè¶ç©éç¤ééµ²ç¤å¤å·å³®é¡è¼å®å¸¬è£ç¾£ç¾¤è£ 亽ç½åå¥è°è¡»è¢è¦è¢¡èºç¶é«¥å«é«¯çç¹ååå§èæç媣è
橪穣å´å·ç¼ç½è禳ç¤ç©°èºé¬¤å£å·å£¤æççºè®©æ¹è²è®è饶桡èæ©è¥é¥çªæ°å¨é¢å¬æ¾ç»é¶ç¹æ¹çç±äººäº»ä»å£¬å¿æ²å¿ç§è¢ééééµå¿èæ æ £èµç§¹æ£¯ç¨ç¶èºµåå认ä»ä»è®±ä»»å±»æ¨çº«å¦æç£çº´è轫é§é¥ªå§ç´è¡½æç´è¨è»æ¢è¢µçµè
èéé±é飪èªé¤æä»è¾¸ç¤½è¿é¾æ¥é©²å¸é°é¤é¦¹æèæ ç¨ç»èè¸è£å®¹å³µæ¯§ç¿åª¶åµçµ¨ç¾¢å«åµ¤æææ榵溶èæ¦æ¦®çç¢ç©è¾è¤£éæ°ç¸èè駥髶嬫嶸çéçæ§è åå®å軵ç©å¹ç¦¸æç²åªææ¸èçè
¬ç³
èè¹è¼®éé£ç騥é°é¶æ¥ºç
£éèå®å¶¿éå¦ä¾å¸¤è¹æ¡è¢½é·æ¸ªçèé£è åé´å
嬬åºæ¿¡è·é´½æç¸è¥¦ç¹»è 颥é¹é¡¬é±¬æ±è乳辱éå
¥æè¾¼ææ´³å媷溽ç¼è鳰褥ç¸æ©å §æå£é®æ软èåè»åªæçè
å«°ç¢ç·è¡è¼çç¤æ¡µç¤ç·è¤èèæ©¤ç¹ èèæ±è®æèéçè¹ç¿é³éå¡å£¡é°æ¶¦éé 潤æ©æ¼æ¼åè¥åå¼±é婼æ¸ç«æ¥åµ¶è»ç®¬ç¯çé°é°¯é¶¸ä»¨æ¡¬ææ´è¨¯é¸æ½µçå
éé£èè¨éæé¡é¦ºé¢¯è©æ«æ 毢æ¢æå¡æ¯¸è
®å¥å»é³é¡é°å®èµå¿è³½ç°ºèä¸å¼å毵毶å毿çé¬å£ä¼åæ£ç³ç³é¦æ©µç³ç³£ç³¤ç¹éé¥ä¿éæ¡æ¡æ§¡åæ¡ç£è¤¬é¢¡éé¡ä¸§åªæ»æ
ææºéªç¼«ç¹
èé³é¢¾é¨é¨·é° é±¢æ«æå«å½çæ°çé«è²æ´æ 涩å¬æ¸é¯éæ®çåçæ°é«æ¾æææ¿æ¿ç·ç©æ¾ç±ç穡繬穯è½é¼è
é£è£è森槮è¥ç¯¸å§é¬éªç¸ææ²çº±ä¹·å¹ç å¦æ±æ®ºçç²ç´èé©ç§ç¡°è±è£æ¦æ¨§é¦é²¨é·é©é¯é¯ç¹ºå»åç¹å½å¼å¥å¸¹èå¢æç
ç¿ç®ç¿£é¯éç篩ç°ç°ææ¬å±±å½¡éå¸å åªææ£èå§å§è¡«éåæ»ç¦çè¢ç»çè è»ç¬é¤éè·å¼æ§åå¹ç
½èªæ½¸æ¾ææªç¸¿è»é¯
羴羶éªéç¶ééæ±ç
çç覢讪æ±çè«å¡æè¨èµ¸åå椫ééªåé¯å¢ 墡缮å¬æ
æ¾æ¨¿è³ç£°è¬î¡î¡èµ¡ç¹è®èºè±è´î¡é¥é¥é¨¸é³çé±é±ä¼¤æ®åæè§å·å¢æ
¯æ»³æ¼¡è殤çµèªè§´è¬ªé¬ºè£³å§ææèµè³éä¸ä¸ä»©å°å°æ¦ç»±ç·å¼°æ梢ç§è¦ç¼ç½ç¨æç²èè¸è¼è±ç颵髾鮹åºèèæç¿èé¶å°åå²éµç»å¨å¨è¢ç´¹ç¶¤æ½²å¥¢çèµç²è¼è³è³æª¨èä½èµèè¥èæ¨å设社èåå°æ¶æ¶»æ¸è¨èµ¦å¼½æ
æææ» æ
´æµèè éé¨æ¾æçéºæ¬ç³å±¾æ伸身ä¾å»å¦½ç±¶ç»
ç½è¯å§ºææ° ç
ç©¼ç±¸å¨ å³·ç¡çç ·å 深紳å
椮è è£è¨·ç½§è¡è©µç§èçè駪鲹é¯éµ¢é¯µé°ºç¥æ¦é®é°°é¥å¼ææ²å®¡ç¤åç§å®·è°è°å©¶æ¸è¨ 審è«é £é«æç«å¬¸ç覾è®
è¾ä¾ºæçèæ¶çæ¸ç¥³è¤è
æ¼æ
椹çè滲é ç®åçé©å声æææ¡æ³©è¼æ®
ç²çç«èéæ»é¹ç¬æ¹¦çºç¥éè²é鼪鵿æ¸ç»³ç¸æ´æ¾ 繩è鱦ççå渻å£ææ å°çå©åçè²¹åµèå¢æ¦ºè橳賸尸失å¸åè±è²è¯é¿é¸¤å±æ½æµç®å¸«çµé¶æ¹¤æ¹¿è¹æº®æº¼ç
èèè©©éç¡é
¾é³²ç®·è¨î¡é³¾è¤·é²ºæ¿é¦é¯´é°¤é¶³è¥¹ç±éå饣ä»ç³è¾»ä½¦æ¶ç«è¯å®å®æ¹é£ 姼å³æ¾ç»ç¥èé£åæè³å¯æ¹éå¡åµµæº¡èé實榯èé½ç¯é²¥é®é¼«èé¼é°£å²ç¢ä¹¨è±ä½¿å§é©¶å
宩å±ç¬¶æ¦éé§å£«æ°ç¤»ä¸ä¸ä»å¸ç¤ºåå¼å¿äºåæºäºä¾å¿å©æ¹è§è¯é¥°å室ææææ¯æ°æ¾æ¿çè´³éæ »ççç¡èè½¼éé笹è¦éå´¼å¼å¾¥æ谥貰éå¢åå¼ç
¶çç®è§¢è©¦è»¾é°é飾èè¤èªé©å¥é´å¬å¬æ¾¨è«è«¡é¾é¤æª¡è«è¬ç°ç±è¥«éé°é½å
ç§åæ¶ææå®å¨é¦è寿åç©å
½å®ææ¶ç»¶ç©è壽ç¦ç¶¬å¤ç£ç¸é书殳æ纾åæ¸æ¢éå§æååæ¸æ®ç´æ梳æ·çè½è»éççèæ
毹毺ç¶è¾ç¹è·¾è¸æ¨è¬è¼¸æ©¾é®åµæç鵨å°ç§«å©å°èµå¡¾çç¹è´ææé»ç½²é¼ å±é¼¡èæ½»è¥è¯æçè·è¥¡ç³¬è¥©ç±è ´é±ªé¸é±°æ®æ¯æææ²è¿°ä¾¸å°æ·æ ç«èæ庶庻çµèè¡å°è£æ°ç«ªè
§é¥å¢
æ¼±æ½æ¸æ¾è±æ¨¹æ¿é°é£é¶é¶èªå·å°èèªè¡°æç©å¸
帥èåé©æ´éæ 涮è
¨åæ»ééå骦å騻æ¬ç¤µé·é¹´è驦é¸ç½å¡½æ
¡æ¨ç¸é¯çè°è½èª°æ°µæ°´æ°ºé帨æ¶æ¶ç¥±ç¨
ç¨è£ç¡å®æ¥¯é¡ºèé è£æ©çç¤ç¬é¬è¯´å¾èªªèª¬å¦çæé欶ç¡çåæ è´å½æ§ç¢©ç¡ç®¾éçé å¶çºä¸å¸ç³¹ç§åæ³ä¿¬ææè鸶媤æ¯çµ²ç¼è³æ¥ç¦é°é£åå®æ¦¹ç¦ ç½³è¤é¯é¶å¶åå»ææ¾ç£ç·¦è¬éçèé¶èè´é¢¸é¨¦é鷥鼶æ»å·³äºåç½å¯ºæ±ä¼ºä¼¼ä½å
å§æ³¤ç¥ä¾¡å æ³é¥²é©·ä¿å¨°æ±æ¶ç梩æ´æ¶è飤笥èé²ç«¢è¦å£èè²é»é£¼ç¦©é§è¼å©é¨çè¦ä¹ºå¿ªæ¾ææ©å¨æå¯å梥崧庺æ·è嵩硹èæ½æª§æ¿é¬æææè¸ç«¦å±æ¯åµ·æ
«è³é§·è®¼å®î ªè¯µéé¢è¨é 誦餸é¹î ©åæéåå»å»æ溲çèèé¦é£æé¼èèééªé¤¿é¢¼é¨ªåååå¾çæè®æ»èªæ«¢ç¶èç¦é
¥ç¨£çª£ç©é¯èè櫯åä¿çå¤è¯æ³èæ´¬æ¶çç´ é宿æ¢æ®ç²éªåç²è¨´è°¡åå¡å¡å«æ«æº¯æº¸è
é¡é¹å³æ¬æ¦¡èè觫è¶é¬ææ¨æ¨æ½¥ç¢¿éé¤æ½ç¸¤æ©çç°èè¬è¹é©é±é·«ç»ç é
¸å´ç¥ç¬çèç®å¤èè½å å¸æµ½è½è¾çè°æ»ç¢ç£æ¿éé绥éééç¶é¨çè¸ç¡é«é«äºå²ç ç¥ç²è°å£åµèºéæ²æ³ç
«çç¢é§å¬æ¾»ç©èª¶è³¥æªç§ç²ç¦ç©ç©ç¹è¥éæç¹ç¹¸éè¢é©åç²èªå«é£§æç»è飱æ§èµèçæç¬é¼çæ榫箰簨é¨é¶½å·ºæ½ åå¨èåæ²æ¡«æ¢çå¦ç¾§èæ缩è¶ç°ç°ç¸®é«¿é®»æå¢ç´¢ççæ¢éå©ææºç£ééé»é¼éé¤æº¹è¶ä»å®ç ç¥å趿éå¡æ¦æº»éè¤è¹¹ä¾¤å¡å¢çé®é³çºé°¨î ¯æç§é¼å´æ¶¾æ¨éé¢é榻毾禢æ»æ¾¾èª»è¸åéåºæ¿è¹ééé³é¥è¶èº¢è¥¨å¼å¡éªçèé§å°æ²é°å®æ¬èç±ç²èè·é²ç®èºé¢±åé®å¬¯æ¡è¹æª¯ç±å¤ªå夳忲汰æè½éæ³°ç²è¦é
é¦æºæ
ç¤åè´ªæ¹å´çè貪æ滩å½æ½¬ç«æ¹æ¤çç±åæåè°é¯å©æå¼¾è¦æ¦ç°é¬è°å¢°å¢µææ½è«éå£ææ©éæªé¡ç½è«å£èè²é°è ç½é·¤å¿å¦è¢é½è¼æ¯¯éå¿æ³æ»æºéç®è¥¢å¹çå®æ¢åæ¹ èµåå碳èæ¢æ賧汤é´æ¹¯å¡åç¾°èªèéè¹éééºé¼é¥§å£åå ååºæ£ éå¡åµ£æªæºèé榶æ¼ç
»çç¦è
æ¨ç£ç³èæ©ç¯ç³è踼ç³è³èµ¯é£é¤³é餹éé¥é¶¶å¸ååæ·å¥è¥èººéé²å»ææç£çéç«æ¥è¶çä»å¤²å¼¢æ¶ç»¦æçµè©å«å¹æ
æ¯æ»æ§ç«é¬é£¸ç¸ç¸§æ¿¤è¬é±éé¥å迯å·æ´®éæ¡é¶å梼æ·ç»¹è祹裪綯èªéééé¾é駣檮é¥é¨é¼è®¨å¥è¨çå¿å¿ç¹è²£è¦çé½æ
é±èè¯é¼ç¼çå¹è
¾èªæ¼æ»é縢è£é§¦è¬å¯è¤é¨°ç±î¡é°§ç±è
é©£é¯åæ°å梯é踢é»é·î¡¡é·å绨åç¶å¼åªå´¹æ¿æ渧ç¨ç¼ç½¤éé¹åç
ç¶ç¢®å¾²æ¼½ç·¹èèé¢è¶§è¹éè¬è¹éé³é´ºé¡é®·éµé¨ 鯷é¶é¶ä½æ®èº°éªµè»é«æ»å±åæ´åææ¶éå±æææ¦é·ææ¥æ¿æ¥´è£¼è¤
æ殢髰èåé¬åçé¬ç±é趯天å
²å©æ·»é
éé»éç°å±æ²ºæ¬ççç·èç ççè¾æ¹å¡¡å¡«æ·é碵ç·ç£çª´é´«ç³éé·é·å¿æ®ååºæ¿æµæ·æªç è
è§ç¶çèé¤è¦¥è³éªé¦æç±ç¼èæ«ä½»åº£ææ祧èèæ¡å²§å²¹è¿¢ç¥æ¢ç¬¤èè¨é¾æ¨¤è©éé髫鲦è©é¯é¥é½ 鰷宨ææèçªèªçª±å¬¥çºç²é«çµ©è¦è¶è·³é «ç³¶æè´´èèè²¼è·éèéå£éé´©é¡é¢éµé©å«å¸é£»é¤®å
åºæ±è¼å¬çºèåç桯ç´ç¶éè´è¼å»°è½å»³éå»·äºåºèåå©·åµæ¸ç³è¶èæ¥æ¦³é®éè¤è諪鼮å¢ä¾¹å¨æºæ¶æ¢ç¶ç½è¡é¤èé¢èèªéé ²æ¿ä¹å²çµéçåµèªæ¨ç¥ä»åä½å½¤å³åºåçªè¼ææ¡æµµçç ¼èç®ç§±é童粡絧è¡èµ¨é
®éå®åéµé
é¤é²æ½¼çææ£æ©¦æ°çè§ç³ç©é®¦ç»æ
桶ççµ±ç©ç¶æ¸çæ
æ
å·å¸å©¾åª®é®äº 头æ骰緰é 妵ç´æ¨æ®æ¢é»è£éå¸ç¦¿ç§æ¢çªåæ¶æ¸å æ¹¥çèå¶éµéµé¼µå³å¾å峹庩å¾æææ¶è¼éå± æ¢æ¬ç¨å¡åµçç¡è
¯è¤é¯ååå»æ½³è·¿é
´é¦é駼éµé¶é·é·µåå¡åæ±¢éé·å
è¿å
èµå èéµµæ¹ç¯ç
è²å¢å£æå¬å¸å塼æ
±æ¶æ§«æ¼ç¯¿æª²éç³°é·é·»åçå½æ¹ªè¤æ¨è·è¬é¢é¤å°µé ¹é ºé ½é穨è蹪ä¿è®è
¿åè¹éª½é娧ç
ºè»è褪駾ååæ½æ¶åæçæ¾é»å±¯å¿³è饨è±è±è»é£©é²é¨éèèæ°½ç½åä¹è®¬ææ¡æ±é¥¦æä¾åæææ²°ä¾»æ©æè袥è¨æ¶¶è«è±é£¥é¦²é é©é©®ä½ééå¨å²®æ²±ç迱驼æç £ç ¤è¢é¸µç´½å ¶è©è·é
¡ç¢¢é¦±æ§é§è¸»é§é§æ©é®é´é¼§é¨¨é¼é©é¼å½µå¦¥æ¯¤åº¹åª æ¤æ¥å«·æ±æ©¢éµé°ææå¾èè·
毻箨èç±å±²å¸åå¨å¾æ洼娲ççªå媧åèæ²æºæ¼¥çªªé¼æ¨ç¦ä½¤é·åç²ç è¢èå¢è
½è襪éé¤æªî å竵崴å¤é¡¡ä¹å¼¯åå© å¸µå¡æ¹¾çè¿æ½«è±å½å£ªç£ä¸¸åæ±çº¨èå®å²å¿¨æç©ç¬ç´æ顽ç·ç貦é éå®ååæ½æçèå¦å©ææ©æ¢æ¶´ç»¾èèæ¼æ¤ç¬çç¹ç¢ç¶©ç¶°è¼è¸ ééä¸åå妧æ¤æ¥è
è¬ç¿«éèé½è´é«è´å°£å°©å°ªå°«æ±ªäº¡äº¾å
¦ç仼彺è£èç½å¿¹å¾å¾æç½æèµæ棢ç¹è§è¾ç¶²è誷è¼çéå¦å¿è¿æºç³ææ¢å±å¨çåé¶ééå´åªåªæææ»æ¸¨ç
è¨è³å¾®æ¤³æ¥²æº¦ç
¨è©´ç¸
è覣嶶èç°é³çå·é°é°å为é¦å©å´å¸æ²©è¿é±å³å³æ´çºéæ¡
æ¶ å¯å¸·æç»´å¡å嵬å¹æ¹æºç²çéæ½ç¶è¶é¬æ½æ½¿éæ¿°ééé® ç覹ç©éºé»åä¼ä¼ªå°¾çº¬èèå§çç®æ´§å¨æ¤æµè±è¯¿åå½å´£æ¢¶çç¡èé骩åµå»å¾«æç¥è¦è骪骫æ椲ç
çç¿è
²èéªå碨è²è¼é²å¯ªç·¯è¿è«è¸éé è³å°æ¿»é¡é®ªå£é颹ç¢é¡äº¹æå«æªä½å³è¿çèåè»å°ç¡èè°å媦æ¸ç¬ç
å¢èæ
°ççç£ç·èè¡ææ¿çç½»è¡è¬é餧é®è±è¤½é¤µéè¯è½éé¨é³è¶é¥è®èºè®èºæ·å¡æ¸©æ¦
æ®æº«ç¥è¾æ¦²ç豱輼è½é³é¾é¥é°é°®æ彣纹è çç é»ç´èèç³éé«é¯çè馼é°é³¼é´è¡éºé¿èé
鼤é¦é§åå»åå¿æå¡è³ç´æ¡½è稳ç©ç©©é®å¦æ±¶è¬åæ¸èæ¾æµçµ»é¡çºç¿å¡é¹èé鶲å奣å¡åµ¡æ»èæ¡çè¬ç®è¹çç½é½æå涡è´å©æ¶¹æ¸¦ç§èµåçªçª©èæ¾è¸è¸æå©å©æ°ä»´æ²èå§è¥åæ¾åªå¹æ¡æ¸¥ç¥ç¡ªæ¥è
æ¡çæ¿£çèé¾é½·ä¹å¬å¼æ±æ±æ±¡é¬åæå·«å±æ´¿è¯¬é¨ç趶åçªé«éåèªæ誣箼èé´®é¢é°æ æ¯å³å´å¾åèéå娪梧æ´æµ¯è£èç¸ç¥¦é¹ç¡ç¦èèªçéµé¯é¼¯é·¡ä¹äºå仵ä¼å妩åºå¿¤æè¿æ¿æ¦çä¾®ä¿åµæå娬ç¾ç·å¡¢æçç¢é¹ç¦è嫵廡æ®æ½é»åæ©ç鵡èºå
å¿å¡æé¢ä¼å±¼æ¤å²æè´å¿¢ç©ç¹æ误åæææ®ç²
éæ¤çç婺åµç¦éé°éªå¥¦åµ¨æº©é¾å¯¤ç誤é¹é窹é鼿é§é½èé¨é¶©å¤å
®å¿æ±è¥¿è¦å¸å¸æ¸å¥ææç½ç©¸è¸è¹ä¿å¾æ¸è¯¶é饻åå¥å¨å±å±æ¯æææ°¥æµ çºç¶èå½ææ桸欷æ·
æ¸ç¯çççç¡è¥èµ¥é¸åææ°æ³çç¬ççç¨ç²ç¿ç¿è¾éååµ å¾¯æºªç
çè é¡å榽çççç·è¥èªè±¨é¤å»åå¬å¬çèé¤å樨æ©ææç¹çºç»çª¸ç¾²è
èé«ç¨ç ç¦ç¤èè°¿è±è±¯è²ç¹¥éé¯éµè§¹èé¯ééµå·æ¦çç§é
è§½é¼·è µé¸è§¿é´ä¹ éå¸ç¿è¢è§åª³æ¤ºèµèå¶æ¼è¦¡è¶æ§¢è·èé°æªè¬µé´é«é³é£é¨±é¨½è¥²é°¼é©¨æ«æ²æ´çºå¾é£åå¾èè¸é¢å±£æ¼è°éæææ¿æ©²æ禧諰å£ç¸°è¬è¢è¹ç½é±ççºèº§å¸åæå±ç³»é¥©å¬å¿¥æ¬ç»éä¿å¥æç»é¤æ¬¯ç»¤ç´°é³éå¡æ¤èè¶éæ
æ»ç¦ç¶èµ©éçç稧æ¯æ½æ½æ¾è®è¦¤æ±é»æ²ç£¶è©é¤¼é¬©å±éé¼è¡å·ç¨è¾è°ºåéæ®ç
颬çè¦é°å£ä¾ çä¿ å³¡æç çéå³½çç¹ç¨ç¥«ç¡ç¬ç¿èºé¿æºç¡¤éæ³æççªç¢¬èè¾ç£ç¸è¸ç¸èµ®é»è½éééé» é¨¢é¶·éä¸
ä¸åå·çå¤æ¢ºå¦å»ç±è«åæç½
å¤é¬ä»ä»å±³å
奾纤佡忺æ°æ´ç¥ç§è®æ®ç±¼çè¶æé¦è·¹é
°é¨åå²åéé²æ¹é¯å¬æ¸èééç¹è¤¼é±é®®é¦¦è¹®å
廯æè£çºé¶±è¥³èºçºé±»ä¼åé²å¦¶å¼¦è´¤å¸åæ¦æ¶è娴娹婱çµè·è¿è¡å£æ¹ºç«èéé¹å«è¡çé嫺嫻æªææ¾èª¸è³¢è«´è¼±éççè鹹礥è´é¦é·³é·´é·¼å¼çæ¾é©å´æ¯¨ççè¬éºèµ»ç
å°å° æç¦è跣箲èéªå¶®ç«ç®èéç¹é¡å¹°æ櫶èçé
顯ç¦å¿å²èç°çº¿è½éå§å®ªçé¥å¯å·å¨å¨¨å³´ææ¶è§é·ç¾ç¡é¦
ç絤ç¼ç¾¡ç®ç²¯ç¾¨è
ºå©å´ç¶«èª¢æç·é§æ²æ©ç¸£é餡è±éº²çèç»ç³®é¾é°é¼¸ä¹¡èç¸é¦é·å¢åééå»æ¹ç¼èé楿èç®±ç·è·è¥å¿éª§éºæ¬çé¶é±é²é©¤ç¨ä½è¯¦åº æ 祥絴ç¿è©³è·äº«äº¯åè饷æ飨æ³éé¤é²å®è é®é¯é¿é¥é¥é±¶åå§ å··é¡¹ç¦è±¡ç¼¿è«é
åå¨å¶ææ©¡è¥èéé±ç±ç²åºæä¾¾ååæµéªå®¯å®µåº¨æ·æ¶ç»¡èé鸮åå©æ¢ççè§ççç¡ç¡£çªç¿è·éæ±ç¶åææ½ç®«è¸åµæ¢æ¨ç¢é·éå½è®èéé´ç©ç°èèèè¬é´µå£çç°«è°é«å»å櫹é«é·è ¨é©æ¯èæ´¨é©å´¤æ·è¨¤èªµå°ææç±ç¿çæç¯ è¬ç¢åèå¹å²æ俲å®ææ ¡æ¶ç¬å¸åæ©æ»§è©¨åå¨èªå¯æç½æ
æäºæ¥æèè å¦åæªéªåèå¥å¥å³«ææ¹ææ¾è
èè衺åæè°ç²çµç¿åæ¶æºçç¶çèå°æ·æ緳缬è¢é諧ç²æ·éµè¥é·æçºè®é¾¤åå©å¯«èä¼³çºæ³æ³»ç¥ç»ç¼·å¸æ´©ç§ç¨å¨å¨å±å±å°å¾¢æ¢°ç禼紲亵åªå±æ³æ¸«çµçµ¬è°¢åå¡®æ¦æ¦è¤å§å±§æ¬ç·¤é°å¶°å»¨ææ¾¥ç¬ç³è¢è¤éç®è¤»è¬å¤çé¢ç£çè¹è é½é½¥é½èº å±èºå¿å¿é¤å¦¡å¿»î¡è¯è¾ææºæ¬£çºä¿½èæ訢ééæ°æå»é
å·åºå¬èªé¦¨é«é¦«æ鬵éä¼æ½é 伩ååçä¿¡è»èªè¡
訫ç®é¦¸èé¡éå
´çæå¶éªæºç©ç
çè
¥èµè§ªç®µç¯èè¬é®æ觲é¨ç¨é¯¹åè¡é¢å½¢éä¾éååæ´ééå¨ç¡è£ééé¶ééç²éæ¤æå§å¹¸æ§èåèå©æ»æ¶¬å¡ç·å¬¹èå¶å
å
åè讻忷汹å
ææ´¶è·è¸è¨©è©¾éçè¯è©å¤æ»ä¼ä¿¢ä¿®å»åº¥ççç¾è©è鸺è¹è²
é¦æ¨é髤髹éé®´éµé¥é
é£è¬æ½ç¶æ»«ç³ç§å²«ç绣è¢çé溴ç¶ç裦è¤è¤é¹èç¹ç¹¡é¥é½é½
ææ´çç±æ¬¨ç è¥é¡»è¨é¡¼èèè°åªå¹æ欻èé æ¥çª¢é å稰ééåå¢å¬æç¸è¦èæè«èéé©éé¬ä¿å¾è£è®¸å´å§è¯©åæ ©çå¦è¨±æ¹æè©¡é¦ç³éç¨æä¼µåºæ±¿ä¾å¹æ²åæ¤æ«æ´«å¿æ¬°æ®ç
ç¬çååææç¼ç»ªç»é
å£å£»å©¿ææºçµ®è¨¹å
æ
ç
¦ç¶èè³æ§æ¼µæ½ç¢çç·èéç稸ç·èç²èçºé±®è¿å
轩æåºå®£æ
è»æ¢è°å§å¡åªæææè±è²æç
çèç»å禤箮翧èå¬è¿è« 諼é¹é§½ç翾è¼èè èé°è®çç¹çæ¬æçèå«æ¼©æ¶çæªç¿æ¸éçæ
é¸ç£ç¬æ°æ³«æ¡ç«ç»ç©è¢¨éçç´è¡æ¸²çµ¢æ¥¥æ¥¦é碹èéé颴縼ç¹éè´ç¶èé´èè¾¥é¾ç©´æä¹´å¹å¦å²¤å³è泶è¢é¸´è¸
å¸å¶¨æ¾©ç¢è§·é¤é·½éªæ¨°è¤èè½é³é±è¡å·æ´æ³§çç¦æ¡çè°è¶è¬ç¥åååçå塤ç窨èå²å³è«é§¨åå£ç¯è°æç»èçè壦ççºéºå»µå¯»å·¡æ¬é©¯æ询å³ææ´µæµç´èæ 桪毥ç£å±å°å¾ªæ詢馴é©é²å潯æ³æ¨³çç
ççè¥è³é±é±ç¥åè®è®¯ä¼¨æ±è¿
ä¾å¾ç¥è¿¿éæ®è¨è¨è¨å¥å·½æ®¾éæ»è³åè顨é丫åååºæ¼é¸¦æ¡ é¸å²éæ¤é´éé´¨å£éµ¶éçä¼¢å²è½åæçç¬èå å´å´æ¶¯çççè¡æ¼é½çååºåååçé
çè¥åå äºç©µè¥¾è®¶äºç½è¿äºç¡åå¨
æç 俹氩å¡å©æè¨æ æ°¬ç°èåç¨çª«é½¾å½æ¹å¦ççèå£å´¦æ·¹çè¸éæ¹®è
å¿ç
é¢å«£æ¼¹è«å¶æ¨®éé¹å¬®ç¯¶æèé»«è® å延é«ä¸¥å¦è«è¨è¨å²©æ沿çé姸娫ç¿ç è娮ççç¡è¨®ééåµåµî¡£çµç¶èå¡©æ
æ¥è©½ç¢è
é¢è¤é»å³æªé¡é¡å´å£å·ç°·æ«©éºå£§åå·å·å·æ¬ç¤¹é¹½éº£å¤µææ²ä¹µå
å¥ä¿¨å
å½å¼è¡åå£æ©ç¼èé¾é
åµæææ棪渰渷ç°éé椼硽罨裺æ¼è¤æèéå躽縯檿黡å´çé°é¶ 黤é½é¾å¼é»¬é»é¡©é¼´å·æ®é鼹齴黶åå¦è§çªå§²å½¥å½¦ç åå®´æè³è¦éªåæçè°éåå °æ¥ç°ç±ç硯èé椻æ»é³«åå¢æ¥çé
½å¬è°³é¤é´çç諺èµé¬³æé´³é
é¨é¨å¥î¡
嬿è¶è´è»
çé¶é¨´é·çè´è´è§¾è®é¼é¥é©é·°è·çé
é© ç§è®è±è±ç©å¤®åå§æ°æ³±æ®è¦ç秧鸯é éµé
éé´¦æ¬ç¾é¦é³æ¸æ¨ç佯å·æ°ç¡éé£åå¾ææ´ç¾ççç»é½å´µå´¸æèæææ¥ç
¬ç¦ç諹輰é鴹颺éé°é·é¸å¬ä»°ä½å±å¥å²å
»ç´æ°§çç´»å楧軮æ
氱羪é¤é§æ©æçç¢ç¤¢ææææ ·ç¾è©æ§æ¼¾æ¨£å¹ºå¤åå¦æç¥
è¨åè½æ¥è
°é´éç»å°§å°è´åå§å³£è½ºåçç§çªåå ¯æºæ®½è°£è»ºå媱å¾æ®ææçºéé¥æ¿æ榣ç¤ç¶éé£é¤å¶¢å¶¤å¾ºç£çª¯çª°é¤ç¹è¬ 謡éé³é¢»è¨é¡¤é°©ä»¸å®å²ææ³æ®çèå¬æ¼ççª
çªèå 婹崾æºèæ¦é´¢éé¨é½©é·ç©¾è¯è¦è¢çªçè¯è©çè¦é¿çé¹è¬é¼¼æç¿èè¥ç
æ£èçº
é·è®é°å»æ¤°æåæ½±è ®ç·è¶ææ¶éçºî¡é¾é£éæ¨ä¹å亪å¶åéå¢æ¼å£ä¸å¶æ³é¡µéºå¤æ´äº±æ¼æ´é æææ½ç¨åæ液è°å ¨æ®è
èé墷楪æ¥é¦å·ææ
æçææç£ç±é´é¥å¶ªå¶«æ¾²è¬é¤£åæ«æç¸é±æªçç¤éé¥éµºé¨é©é¸è¶å²ä¸å¼è¾·è¡¤ä¼è¡£å»å壱ä¾ç¥å¿æ´¢çç©é¼é±å£¹æ欹èç¦å«æ¼ªç¨¦é¥å¬å«å¤ç¿é¹¥ç¹æª¹æ¯é«é»è©é·é»³ä¹ä»ªåå¯å¤·åå®ææ²è¯ä¾å®æ¡æ²¶ç衪迤饴å¦å§¨å³å¼¬ææçµè贻迻宧巸æ
æ æ¡çè°è¢é
ç移èåªæ¤¬ç¾ è¦è©è²½éæ椸èªè· é é¢é£´çåçªéºå¶¬å½å½èé ¤é ¥å¯²å¶·ç°é¡é®§å½å½è¬»éç±è§ºè®é¸ä¹å·²ä»¥è¿éä½æºç£è¡è¢åº¡è£èéåæç¬éå¯å´ºææ¤
éé¯é³¦æè¼¢æ¼è檥ç¤è¤è»é¡è½é½®ä¹ä¹äº¿å¼åå¿èºä»¡åèè®®é£äº¦ä¼å±¹å¼å¿è
伿ä½å®ååå½¹ææµæè´è
è¯éä½¾åå¹å¦·å³ææ¿æææ³çç§ç»è¯£é©¿ä¿å¥å¸å¸ å¼æ»æµç´ç«ç¾¿è¡µè½¶åå¼ææ¹æ §æ ºæ¬æµ¥æµ³ç袣è°è²¤éåå¶å¸ææ¥æ®¹ç°ç¾ç¿ç¿è訲訳è±è±é¸é´é¿å¹æ¡æ¹æ£æ®æ¹ç²è¡è©è·è»¼é 骮äºå
¿æ溢çç¬ç«©ç¼¢ç¾©èè£è£è©£å©å«å»æ¦æ½©çèèºè´é¾é§
åæ槸æ¯
ç ç¤ç¼ç誼éé¹é¹¢é»åå墿å¬å¬å¶§æ¶ææ殪澺çç±çç©ç¸èèè 褹寱æææªæç¡ç±ç¿³ç¿¼èè²é®¨çèèè´é°é±ç¹¶ç¹¹è±·é¬é¯£é¶é¶é¶ç·èè¯è°é³é·é¥åé¿é·é·æ¿è¥¼é©é·§èé·¾è®é½¸ä¹åå é¥é´ä¾å姻æ´èµè«é³éªæ ¶æ®·æ°¤é°å秵è£éé»éåå å©£æç絪æ
溵ç¦èèæ
çé¦ç£¤ç·¸é諲é駰å¾æ¿¦éé é¾åä¹åç¾èæ¦å 泿åå³¾ççºç¢ç²è¶è¨å«å©¬å¯
å´å´¯æ·«è¨¡é¶éé¾æ»ç¢é夤è©è¨èª¾éé¾å殥çåæªè«éªé½é½¦é·£å»´å°¹å¼å²é¥®èéæ·¾é¿é飲é é·é£®æè¶æªç¾é±å¶¾æ¿¥è¾è櫽ç®è®å°èæ´è¤å½æ¹çå»é
³æ
çææî¡é®£æ檼åºå¿è±åæ¡ç±èºå¨å©´åªæ¥æ¸¶ç»¬æ ç
çå«ç¢¤é³å¤ææ»çç·ç¼¨ç½è§è³æ¨±çåç½è¤®é鴬鹦嬰æèºéºçé£é¹°é¶§å¶åå¾æç´ç½è¡æ«»ç礯è»é¶¯éçºè ³é·ªè»é·¹é¸é¸çè¿èçè¥è§è¹è¤è¥è¦èå¶æºæºè¾åå¡æ¥¹æ»¢è¥æ½çèç©è¿å¬´çç¸è¢æ¿æ¿æ¿´è覮è¬èµ¢å·ææçç ç¯è
æ«¿çç±çè´ç±¯ç¨é¢æµ§æ¢¬é¢é¢é¢æ¬å½±æ½ç¿ç©é ´å·å»®éçæ æ硬媵è¡éç
èåå·å²ä½£æ¥çé庸ååééå¢å«æ
µæ»½æ§¦ç
é¿å°å£
ææ¾éºéèçééé³å»±çé¥é±
é·ç°åé¢é¡é°«æ°¸ç¬åæºæ³³ä¿ååæ åææ¡æ¶æ¿åæ¥ææ¹§ç¡§è© å¡åµ±å½®æ¹è¹æ
è¸ç¦é²¬è¸´é¯ç¨èç ½éä¼å¿§æ¸å¦æ®æ³å¹½æ éºæ»ºæåªé¾åæ®çæ«çºè°å°¢å°¤ç±æ²ç¹é®ææ²¹è¬æ£æ¿æç£å³³æµç§èè¤è¸ééµéå¤è°è¨§é°æ¸¸ç¶é鱿楢ç·é¾é²è¼é§èè£é·è¼¶é®æ«¾éåæ丣å£èé
ç¾åº®ç¾è æ¢èèéæ¹µèç¦èéªæ§±ççé»åå³å¹¼ä½ä¾å§ç糿åå¿å§·å®¥å³ç°ç¥è¯±è¿¶åæ¢è´äº´è²éé
èªé¼¬æ纡è¿è¿ç©»éç´è¶å¹æ·¤çæ¸çç®äºäºäºéä¼ä½å¦¤æµæ
欤ççæ¼çè¾è¡§é±¼ä¿å
ªç¦ºç«½èè°è¢å¨å¨¯å¨±ç³è°é
é¦æ¸è¸éªéé
é©éå £å ¬å´³åµåµææ楰湡ç¬çç¡¢è
´é¾éª¬æ楡æ¦æççè
èè§æ¼î¡î¡ç®çª¬èè¤æ¶ç¾èèè«éé¤é£å¬©ææ¾è¦¦è¸°æçµè¸è¼¿éç¤è¬£é«é®½æç±
é¨é¯²é°
é· é¸ä¸ä¼å®å±¿ç¾½é¨ä¿ä¿£æ§ç¦¹è¯å峿祤åå¬å庾æé
èè®é»å´å¯ææ¥ççèèªçª³éé¾å³å¶¼è²æéºè齬çé©åå«è¿èè妪忬饫è²é彧æ±ç±ç§èä¿¼å³ªæ ¯æµ´ç ¡é°é¢ååå ææ欲淢淯袬è°é³éå
å©å»åªå¯åº½å¾¡æ£æ£æ£«ç´ççè£é飫é¦é¹æ滪ç
稢ç½è®è£èªéºé å«å¶æ«æ¯ççç·èè®è¼éé©åæ
¾ç¨¶è¹è豫é¹é鳿澦çç è·è«é¥é¾é´¥é´§é´ªå¥ç¤ç¦¦é鹬çç¤ç©¥ç¯½ç¹é§éµæ«²é¥èè½è½éé±æ¬é©é¬»ç±é±é·¸é¸æ¬è»é¬°é¬±çªç±²ç©å¦é¸¢åå¤å¼²æç¢é¸³å¯æ¸æ¸æ¸æ¸ææ·µè¾æ£©è¬èé¹ç®¢é³¶èµé§éºé´å¬½éµ·çé¼é¼å
è´ é§ååæ²
æ¬å£ç°è²åå¡åç¬èè¢å¡é
åæ´æ¹²ç¨ç¼é¨é¼åå塬媴å«æºæºç¿çèæ¦æ¦¬è¾ç·£ç¸èè¯éå橼羱èèè¬è½
黿é±æ«é騵鶢鶰åµè¿ç¶éºé å¤è妴èæ¨é¢å¸è¡ååªæ¾çç¦æ¿è£«è¤è¤¤å®é¡æ°æ±çº¦ç´ç®¹ç±å½å½ ææåæ±å²æ礿岳æç¥æ±é¥æ
æ¦èèè»éºé
æ³è·è·ç²¤è¶é
ç²µéé±é²å¬³æ¨¾ç¯å¶½é¾ ç±ç¹è¥é»¦ç禴èºç±¥é¸ç±°é¾¥é¸èç
´èç
奫è¹èµé µé¦§è´äºå»åä¼åå©å¦æ£æ²çºè¸æççç§é§æ¶¢ç´èèºéé²æªæ°²æº³ç¼è·æ°³çæ¾èéæ©ç¯ç¸ç¹§å
é夽æçç§é¨èºæ®åééæ®è¤é¦»ç£é£é½«é½³åè¿æéæ½æéé
åæ²æ ç¼éæ
æè
ªé«éµç¨ç·¼è°è´ç¸èè³±éé餫è´ééèé»å¸åæ²åæ¶æ²¯æ¡ç´¥ç´®éé³èè¢æç ¸é´é磼è¥éåé¥ç½ç¾ç¾åæ ½çè渽溨çµè³³å®°è½½å´½è¼åå¨ææ´
å¤é
¨å縡å
ç³ç°ªç°®éå±åºåæå¯æå§æå¹æ¢è¶±è¶²ææ«è³èµé¾é¼æ¿½è¹é
çè´é¨çé
åçè®ç禶襸è®é¥¡çç¾èµè³è§è³è´é«è´é©µé§å¥å¼èå¡è¬éºèèå®éç³è¹§é©å¿é¿æ©æ£æ è¤æ£ç
澡çªè»è»ç¶ççåå£é æ¢å¿æ
¥ç
°èåªç°ç¥ç«è趮èºç«å«ä¼¬åææ²¢æ©æ³æ³½è´£è¿®åå¶å§å¸»ç¬®è´è²¬æºç å嫧å¹ç®¦è¶æ¨æµè«èµæ澤ççç°è«ç¤è¥è¬®è³¾è é½é½°é¸
ä»å¤¨åºæ±æææå´±ç¨è´¼è³é²è é°é±¡æè°®èèåæ½æ¾å¢é«å¢æ缯橧ç·çç°ç£³ç½¾ç¹èé±éé¥çèµ è´åè¿åæ¯ææ¤å³å§å³æ¸æ¸£æº æ¥åç¶ç®æ¨è§°ç»ç¼èé½é½ææç´è½§è»é¸è»é¡ç
çéé
éèåè²ç¨ç æ©é²é²è¸·é®é®ºä¹ç¹è¯å¤å¥æµæ
ç¸å®±çè±è©æ¾æ£æ¦¨èªé¡å¤ç²æææææ榸é½å®
ç¿çªéåºç ¦åµå¯¨çµæ²¾æ¯¡ææ ´ç²è
飦æè©è¶è©¹éè°µå¡å¶¦æ¾¶èé
éæ°æ°ç»é¹¯æè«é¥é³£é©éé±£é¸è®ææ©é£å±çå´æ¬çæçå¶å¶æ¦è¾é¢å«¸éæ©è¹è¼¾ç½é»µå ä½ææ æ¡ç«å¡ç»½è棧æ¹æ¦ç¶»å¶è¼éª£æ°è¥è¦è¦±è½è¸é©å¼ å¼¡å¼µç« å½é£å«å½°æ
æ¼³çç²»èé§æ²æ¨ç餦èé±é¨¿é±éºä»æ¶¨æ¶±æ漲幥ç¤éé£ä¸ä»æå¸æèè´¦ç²å¸³è¹ç®éå¢å¶å¹è³¬ç¬ç´çä½é妱巶ææç¤çéåéé§çª¼é£ç«æ¾æ²¼çµå¬å
è¯æåç£èµµç¬èæ棹ç½è©ç
§ç½©ç®èèè¶æç³é®¡æ«ç¾ç¾è嫬é®åææ½çºç ç±·è´å²åç²è¢©å ææ¢æ£è¾åæ£è°è©è°ªæºè¼æ¨ç£è¼é¸è¾èå謫謺鮿è½è®è¥µè®è
éèµè¤¶éºè¿ææµéæ·å»èæ¨é¹§è
é·è´é侦æµççè²å¸ªæ æ¡¢ççç §ç¥¯éåµææ¡é
å¯æ¹è´éæ¸æ楨ççç¦èèééæ¦æ§æ®ç§ç¢ªç¦æ½§ç®´æ¨¼æ¾µè»è½é±è½éé¼ç±é±µå±è¯æ®æ姫弫æ£è轸çç¹çè¢ç´¾èèè£è¦è¨ºè»«å«ç¼ç¨¹é§ç¸ç¸¥è¾´é¬é»°å³éµçº¼ä¾²æé£é¸©æ¯ææ ç´ç¹èµå¡¦æçµ¼èæ¶èª«è³é´ééé´éé®é»®å§äºä½å§å¾æçå³¥æ£ç¡ç°î¡ççé²å©å´å´¢æççèé®åªæçå¾°çè¸é¦å¾´ç®å¾µî¡è¸ç¯éé¬ç¥æ°¶æç³½æ¯æå¡£æ¸æ¸ææ´æ£ã£è¯è¯¤é帧æ¿çå¹è¨¼éè«é´èä¹æ¯å®æ±èå±å·µæ±¥æç¥ç»è¢å¾æ ç¥ç§ç§èè衹衼åç·ç¥¬ç§ªèé»æ¢æ 椥è¸æç¦ç¶æ¦°è馶鳷謢鴲ç¹èµé¼
禵æ§ä¾å§ç´å§ªå¤å¼èèéå´å·èæ¤æ®ç¦çµ·è·ç¡å¢æ馽å¬æ
¹æ¼è¸¯æ¨´è±ç¸¶è·èè¹ è¹¢è»èºå¤æ¢åªåªå§æ¨é¯ååå¸æºæ±¦æ²çº¸è·æ§ç¥èå«æææ³æ´ç 轵淽ç»ç´è¨¨è¶¾è»¹é»¹é
¯è¢è¥§é¤è³èå¿å¿®æ»è±¸å¶ååå¸å¸æ²»çè´¨é
俧å³åº¢åº¤ææ£æ æ´·ç¥é娡å¾æææ¡ç¾ç§©è´è¢è´½è½¾ä¹¿å«å¾æ·æ¢½çç¤ç秲秷çªç´©ç¿è¢ è§è²é鸷åå´»å½æºæ»ç£èéªå¯å»æ±æ»ç¨ç¨ç«ç½®è·±è¼é§éå¢æ§æ»¯æ½çç製è¦èªéå¹ææ¯æ½ªç«ç¨ºè£è§¯è³ªè¸¬éæçç·»é²é§¤é´å¨åæ¥æ²æ¿æ«ç©è²æ«è´æ«ç觶é¨é¯¯ç¤©è±é¨ºé©èºé·éè±ä¸ä¼æ±·å£å¦å½¸è¿å¿ æ³çç»æç
衳éè¯è¡·çµé¡å¹è éºè¤é´¤è½é¾é¼¨è¹±é籦è¿ç§å¢å å°°å¡æ±ç
è
«ç種踵仲ä¼å¦çç¥ç¥è½è¡¶éèå
ç¾å ¹åªçè¡è«¥å·èè¯î î ä¾å¨æ´æ´²ç¿è¯ªççè¾é®å©¤å¾æ·çªé±é¸¼åç²¥èµè¼éè³è¼é駲åç©è¬
éµé¨è¸å¦¯è½´è»¸ç¢¡èå¸çè·æçç®é¯çº£ä¼·åªåå®ç»î ¥î ¤åå®æ¼ç´èè®æç±é
ç²è¤è©çå½çºé§å£ç¸éª¤ç±ç±ç±é©æ±å¯ä¾è¯é¾æ´è±æ ªã±ç 诸çªç¡è¢¾é¢çµèèª
è·¦æ§ æ½´è«é橥諸豬駯鮢鴸ç¦è¸æ«§æ««é¼é¯ºè ©ç«¹æ³ç«ºç¢ç¬è¿ççªéç¬è³çè«çè èº
é±ååçæ¸æ¯æ¬ç¥è ¾é丶主å®æç «ç½é¼æ¸ç
ç
®è©å±æ¿éºç©å±¬åç伫ä½ä½å©çº»è§èå¾æ¼æ³¨è§è´®è¿¬é©»å£´æ±æ·æ®¶ç·ç¥ç°ç祩ç«è秼紵紸ç¾èèåµç註貯è·è»´é¸ç¯é飳馵墸箸翥樦é³é§ç¯ç¯«ééºéææªè¼ç°»é«½çªæ½è·©ä¸åå°ç å°éå«¥ç¼çèé¢ç£è«¯è¤é¡é±è½¬î ¿å¨è»¢ç«±è½ç·åå èçåèµæ°ç¯é¦ç¸³è¥è³ºèé¥åç±å¦åºå¦åºè娤桩è湷粧è£
è£æ¨ç³ä¸¬å£®å£¯ç¶ç壵æ¢çå¹¢ææ
é¹è¿½éªæ¤é¥éé¨
éµ»æ²å ç¬å¨·ç¼æ´çç¼ç·ç¡¾èå¢ç¶´èµç¸è«éé£é¤ç¤è´
è½éå®è¿è«çªè°è«è¡ åå»åæºç¶§è¨°ç¨åæçªå¬ææ¡æ£æ¶¿æ£³ç¸çª§æ§ç©ç©±è ¿å´å½´ç³ç¼å妰èæ«æµä¸µæµçµè¯¼é
åå
娺梲çæ®æ«æ¤ç¢æ±ç¡ºçª¡ç½¬æ¯ææ²ç¦å
è«è«éæ¿ç¯§æ¢ææµæ¿¯æ«¡è¬¶é¯î¡é¯éµ«çè é²ç±é·ç±±ä»ååèå
¹å¨å§å§¿è²æ ¥çç´èµèµå´°æ·ç§¶ç¼è°èµ¼åå³åµ«æ¤æ¹½æ»ç²¢èè¾éå¶ç¦è§è²²è³è¶é±ç¨µç·ééé¾è¼é¼æ¾¬è«®è¶¦è¼ºéé«é²»é¿é¡é ¾é ¿é¯é¶
é½é°¦é½ç±½ååå§å§æç·ç§èå°ç§èè¸ç¬«æ¢é¨åç´«æ»è¨¾è¨¿æ¦æ©´åèªèè¡å³åæ£ç¸æ¸ç¥ç¦èè¾æ¼¬å¨å®å§ç»¼éªå «åµåµæ¾æ£ç£è
è¼æ¡æ¤¶åµ¸ç¨¯ç¶ç·ç§ç·µç¿ªèè¬è¸¨è¸ªç£«è±µè¹¤é¨é¬é¨£é¬é¬·é¯®é¯¼éæ»å¬æ´æ£æ¡ææå¯èæ ç·ç¸çªç¸½é¯é纵æ®çåçç¢ç²½ç³ç²ç¸¦é縱é¹é©ºè¯¹é°é¬æ«è棷棸éç®ç·
è«é¹é²°é¯«é»é¨¶é½ºèµ±èµ°é¯å¥æ媰ç§è¹è
è©å足åå«å´å´ªæå¶ç¨¡ç®¤è¸¤è¸¿ééè¯
é»ç»ä¿ç¼çç¥çµè©é»éºè¬¯åèºé躦é½ç¹¤ç¼µçºçºç±«çºé»ææ¥åæåºæ¨¶èçºå¶å´å¿æ¿¢ç»æ æ ¬çµé
æ¬æç¥½ç½ªè¾ é
»èé嶵æªé·éæªç©æ¬å°å¶éµæ¨½ç¹ç½é¶éé³é±é··ååæèæéæ¨ç§¨èæ½æ¤èç¨ç°é¼å·¦ä½ç¹ä½åé¼å²å²æä¾³æç¥èå座è¢åèè飵糳å</pc>
+ </rules>
+ </collation>
+
+ <!-- some unsupported tags -->
+ <collation name="utf8_5624_2" id="355">
+ <settings strength="tertiary"/>
+ <rules>
+ </rules>
+ </collation>
+
+ <!-- reset before primary ignorable -->
+ <collation name="utf8_5624_3" id="356">
+ <rules>
+ <reset before="primary"><first_secondary_ignorable/></reset><p>lb-fsi</p>
+ </rules>
+ </collation>
+
+ <!-- \u without hex digits -->
+ <collation name="utf8_5624_4" id="357">
+ <rules>
+ <reset>\u</reset><i>x</i>
+ </rules>
+ </collation>
+
+ <!-- shift after using expansion -->
+ <collation name="utf8_5624_5" id="368" shift-after-method="expand">
+ <rules>
+ <!--
+ Put small basic Latin letters between 0 and 1.
+ Simple shift method would not work, because there is no
+ weight space between 0 and 1 in DUCET.
+ Also, to test it works with contractions, put some after 'z'.
+ -->
+ <reset>0</reset>
+ <pc>abcdefghijklmnopqrstuvwxyz</pc><p>aa</p><p>aaa</p>
+ <reset before="primary">1</reset>
+ <pc>ABCDEFGHIJKLMNOPQRSTUVWXYZ</pc><p>AA</p><p>AAA</p>
+ </rules>
+ </collation>
+
<collation name="utf8_hugeid_ci" id="2047000000">
<rules>
<reset>a</reset>
@@ -41,6 +144,10 @@
<s>b</s>
</rules>
</collation>
+ <collation name="utf8mb4_test_400_ci" id="328" version="4.0.0">
+ <rules>
+ </rules>
+ </collation>
</charset>
<charset name="utf16">
@@ -119,6 +226,74 @@
</collation>
+ <collation name="ucs2_5624_1" id="360">
+ <rules>
+ <!-- long contractions and expansions -->
+ <reset>12345</reset><q>012345</q><q>12345</q>
+ <reset>1234</reset><q>001234</q><q>01234</q>
+ <reset>123</reset><q>000123</q><q>00123</q><q>0123</q>
+ <reset>12</reset><q>000012</q><q>00012</q><q>0012</q><q>012</q>
+ <reset>1</reset><q>000001</q><q>00001</q><q>0001</q><q>001</q><q>01</q>
+ <!-- some non-latin contractions and expansions -->
+ <reset>ÐÐÐ</reset><i>ÐÐÐÐÐ</i>
+
+ <!-- reset before: Maltese -->
+ <reset before="primary">d</reset><p>Ä</p><t>Ä</t>
+ <reset before="primary">g</reset><p>Ä </p><t>Ä¡</t>
+ <reset before="primary">h</reset><p>GĦ</p><t>Għ</t><t>gĦ</t><t>għ</t>
+ <reset before="primary">i</reset><p>Ħ</p><t>ħ</t>
+ <reset before="primary">z</reset><p>Ż</p><t>ż</t>
+ <!-- higher levels -->
+ <reset before="secondary">b</reset><s>Ä</s><t>Ä</t>
+ <reset before="tertiary">b</reset><t>á</t><t>Ã</t>
+ <reset before="quaternary">b</reset><q>Ã </q><q>Ã</q>
+
+ <!-- abbreviated syntax: put some punctuation immediately before a -->
+ <reset before="primary">a</reset><pc>~!@#$%^*()+:;"'?</pc>
+ <reset>d</reset><sc>Äé</sc>
+ <reset>d</reset><tc>ÄÃ</tc>
+ <reset>d</reset><qc>Äê</qc>
+ <reset>d</reset><ic>ÄÃ</ic>
+
+ <!-- normal expansion syntax -->
+ <reset>c</reset><x><s>k</s><extend>h</extend></x>
+ <reset>cs</reset><x><t>ccs</t><extend>cs</extend></x>
+
+ <!-- previous context -->
+ <reset>a</reset><x><context>b</context><p>-</p></x>
+ <reset>c</reset><x><context>c</context><s>-</s></x>
+ <reset>d</reset><x><context>d</context><t>-</t></x>
+ <reset>e</reset><x><context>e</context><q>-</q></x>
+ <reset>f</reset><x><context>f</context><i>-</i></x>
+
+ <!-- logical reset positions -->
+ <reset><first_non_ignorable/></reset><p>lp-fni</p>
+ <reset><last_non_ignorable/></reset><p>lp-lni</p>
+ <reset><first_primary_ignorable/></reset><p>lp-fpi</p>
+ <reset><last_primary_ignorable/></reset><p>lp-lpi</p>
+ <reset><first_secondary_ignorable/></reset><p>lp-fsi</p>
+ <reset><last_secondary_ignorable/></reset><p>lp-lsi</p>
+ <reset><first_tertiary_ignorable/></reset><p>lp-fti</p>
+ <reset><last_tertiary_ignorable/></reset><p>lp-lti</p>
+ <reset><first_trailing/></reset><p>lp-ft</p>
+ <reset><last_trailing/></reset><p>lp-lt</p>
+ <reset><first_variable/></reset><p>lp-fv</p>
+ <reset><last_variable/></reset><p>lp-lv</p>
+
+ <!-- logical positions and reset before -->
+ <reset before="primary"><first_non_ignorable/></reset><p>lb-fni</p>
+ <reset before="primary"><last_non_ignorable/></reset><p>lb-lni</p>
+ <reset before="primary"><first_variable/></reset><p>lb-fv</p>
+ <reset before="primary"><last_variable/></reset><p>lb-lv</p>
+
+ <!-- long tailoring: pinyin order from CLDR's zh.xml -->
+ <reset><last_non_ignorable/></reset>
+ <pc>ã
ããããããããããããããããããããããããããã ã¡ã¢ã£ã¤ã¥ã¦ã§ã¨ã©åé¿åééååååååæ¨æ¬¸æº¾é¿éåæ±çå嵦溰åæ±æ³ççæ¯æ¹å¨¾å³ç®è¼èº·å¯æ¿ï¨è¹èªééè¾ä¼ç±ç ¹ç¡éå塧å«æç¢åæ§ç·å¾å£å¬¡æèææç¦è³¹é¤²é´±ç§ç¹é¦¤ç¤èºé鱫éå®ä¾å³æ¡æ°¨åºµè´è°åªè»èç·è
¤é¹èèªééç¦è«³é馣é®ç«éµªé½é¶çµå½é¸åµä¿ºåµå¯éµéææ»ç½¯é¨ç´å²¸ææ´èæ¡èºè±»å å©©æè²åé黯è®éª¯å²ææ»æçé å¹å³åæªè»ªçæå«éå·å¸å¶
å»æ»¶ççé¨æ®ç¬çèç£ç¿±è±è¯ç¿¶è¬·ç¿ºé³éé°²é·é¼æèºæè¢åªªéºåª¼è¥å²æ·å²°å²å¥¡å¥¥å«¯æ
éªå¥§æ¾å¢ºå¶´æ¾³ææ謸éé©å
«ä»å·´åææ³çå§å¤¿å²èç¤åµæç¬ç²ç´¦ç¾èéè±é²éåç®æåºå¦æèç¦ç¹èéèè©è·è»·é¢°é墢鼥æé¯éé¶åå¼ç¸å»ç½¢î ½è·é²
ç½·î ¼é®è¦ç²é¸å£©çæ¬ææ°ç½ç¾ä½°ææ ¢æ竡粨çµææºè¥¬ååºæè´¥æåæçç¨ç²ºéèè´éå
¡ç¸æ³æ½æçè¬é¢ææ¬æé ç¢èè褩ç辬éªåå²
ææ¿ççªé£ç²è¨éèé¬éååä¼´æ®å§
ææç»ç§æ¹´çµé¡é½è¾¦ç£é¦å³å¹å¸®æ æ¢æµé«å¹å¹ç¸å¹«é¤ç»ç¶æ¦çèç¤èåæ£æ£ç¡¥è°¤å¡å¾¬ç¨è¡è¯ç£
éèè¬éå¹å
佨å¢èèå笣ç
²é¾
èè¤éè¥é½çªå«é¹å®æ饱ä¿é¸¨ç¤å ¡å ¢åª¬èå¯é£¹é£½è¤é§é³µç·¥é´è³²èµå¯³å¯¶éå½æ¥æ±è±¹è¶µéè¢è¢å ±éé²é¤éª²æ´é«±è£é®å¤æçå¿é¤è¡éåæ¯çæ¡®æ²æ¹ç¢é¹è£éµ¯åºåé³è´çè²é¶å¤æç¬èèé¡ä¿»åæç½è¢«åå¹æ¢ç¼éååæ«çç²è»°è¾æç¢ç¦èè½çè¤èªéª³è¼©éæç³é´é¾å¥æ³è´²å´æ¸é©çè³ééæ¬è¯å¥çæ¥åæ¹æ¡³ç¬¨æªç輽伻ç¥å¥å´©ç»·çµ£éåµçå£ç¶³ç¹çåå²è¶ç£ç«é泵迸é¬è·°å¡´çé蹦é°çå±åªæ¯´é¼è±èé²¾ééµé°æ²è¸é¼»å¬¶åæ¯å¤¶æ¼ä½å¡å¦£æ²çå½¼æç§ä¿¾ç¬ç²ç²èåçéèè²åå¸å¿
æ¯éä½ååºè¯é²å¦¼ææççè¾åæ¯ççªèèéæ¯ç´ç¢è¢é婢庳ææ¢èèééå 弻弼æææ¹¢çç¦çè©è²±èµå¶å½æ¥
æ»æ»ç
ç¹çºè
·èè½è裨跸è¾éé飶幣å¼çç碧稫ç®
ç®ç¶¼è½éªé¦å¹¤æ½·çç½¼è¥
é§é«²å£å¬å»¦ç¯¦ç¯³ç¸ªè觱é¿é®
ææ¿èè¹éé«å¥°ç§é¨é¥ç¹´è¥è¥£éé¸é èºèºéè´é´é©é·é·©é¼è¾¹ç 笾çµç¼è¹ç
¸çç箯編èç±éé½é³éé鯾鯿籩çè´¬æçªå¾è²¶æ¼ç¢¥ç¨¨è¤ç³é´èåå¼å¿æ汳汴èéå³
æ便åå¤æªè¦å¾§æç¼éé辡緶èé ¨è¾§è¾¨è¾©è¾ªè¾«è¾®è¾¯è®ç¬æ彪æ é£éªé«æ·²çè¿å¢å¹æ»®èé¢®éª æ¨çèéºçéé£é£å¦é¢·çè¨è¬¤çèè´é¢ç©®é³é£é£é£é£é©é£é©«è¡¨å©è£±è«è¤¾é¶æª¦ä¿µæ½é³é°¾æé³é±é¼èé¾å¥å«åèè徶è¥è蹩çªçå½æ±é ç 宾彬å§ææ¤æ»¨ç¼¤æ§ç¸è±©è³è³éåæ¿æ¿±æ¿µè¨è±³ç¸çé¦ç¹½è éé¡®æ°æ殡èé«©æ¯é¬æ®¯èé«é¬é«é¬¢å«ä»æ°·å°å
µæ æ¤æ¢¹é²æª³ä¸é´éæ²æ¦ç§èªææºæç³é¥¼çªçªèæ£
ç¦éµé¼éé¤
é¤ ç·å¹¶ä¸¦ä½µå¹·åªåº°åæ ¤ç
ç«åå¡å¯æèªé®©éç¶æ¨æ³¢ç·ç»å¥çç µè¢è¢¯éµé¥½åµç´´ç¼½èè 袰ç¢é¢å å¶æ¥æé¤ç£»è¹³é©é±ä»¢ä¼¯åç»é©³å¸æ³ççè©ä¾¼åæèé£äº³æ¬æµ¡ç秡é¹î¡é桲淿è¶å渤æ¹è§é¹æ½æç¼é¸éé¦é²å°ç
¿çç®èèé¦é§è¸£ééå£èé¦é§®é®è¥è±°åæªç¤¡ç°é餺éµç¦é«é«æ¬è¥®ç¤´é®è¾è·ç®¥ç°¸å¹ææªç³ªèèè峬庯éé¸æ¡é½èª§é¤è½éååè¡¥åºæè£é³ªçéµé¸ä¸å¸ä½å¥æ¥åææ¨æ©éååææè¹é¨å ç¿éå»èè¸é¶ç¯°é¤¢ç°¿åæ¦æ礤礸éªåå²çææ财財æè£çºéå¸å°å©å¯å½©æ¡ç¬è·´ç¶µè¸©èæ£è¡ç¸©ä¹²ååå飡éªå
å°æ¹åªå¬ é¤é©æ®èææ®æ
è
æ
è ¶è ºæ¨ææ
åæ¯î µç©é»ªé»²ç¿ç²²å澯èç¦ç¨è¬²çä»ä»ºä¼§æ²§è鸧åè±åååµ¢æ»çè¼æ¿¸èè¥ç½é¶¬å¨èµèæ¬é¶è³¶æ¡æç³æºæ¹åå¶æ¼è¸æ§½è¤¿èè¬éªè¹è¸èæºæ騲èéµè¥é¼åå侧åæ»æºæµèæçå´å 笧粣èå»æ»æ¸¬çè´çç´èå¢ç®£æ¡ç°åµ¾è¥å²æ¢£æ¶ç¬åå±å±¤å¶ç«²é©è¹ç¡ç¡³å²¾ç ä¹½åæ æ±èæèè¿æ¿è¨ååææ·é¦éé¸èçé¤é餷ç§
åæ¥æ»è¬è¶åµæ½ç¹é«æ§è©§å¯ç¢´è¤¨æª«è¡©è¹
é²é奼æ±å²ä¾è¯§å姹差ç´è©«æééµç²ä¾ªæ´ç¥¡è±ºååèè¿åè¢ç¥è å辿è§æ¢´æºæè¦è£§æ»é幨è¥æ婵è°å±æ£æ¹¹ç¦
é¦å¬ç
ç¼ åçèèèªéåå»æ½¹æ½ºç·¾ç£ç¦ªæ¯é½é¡çè¬å³åç¹µè¾é
åµå£¥å·çºæ¬çºçºèºéµè¬è®é±é¥äº§å¬æµä¸³æµåè°ç¢ç£é²éèå·åµ¼ææ»»å¹èè«é³çç°
åç¹é¦èéé¡å
çè®å¿ç¡æ²æ´é¢¤æºç¾¼éé¡«ä¼¥æå娼æ·çèéæ¿æ¤ç©è£®é é©é¶é²³é¯§é¼é¿ä»§å
è èé·é¸å°å¿å¸¸å¾çºèçè
¸å塲嫦çºèé¿ååè鲿é鱨ååºæ¶æå ´æåå°å» æ°
é¹æ
çç
å¡é¬¯å±æµçæ¢ç¼èª¯éæ弨æ欩é訬ç¯è¶
éç¹çæ巢巣æéé¼æ¼
å²æ¨æ½®çª²ç½ºè½é¼è¬¿åµçç§ç
¼éº¨å·ä»¦ä»¯èè§è½¦ä¼¡è»ä¿¥ç åè硨è¼æ¯åæ¦å¥²å±®å½»å¼è¿ ç¢ç²è
æ£ç¡©é å¾¹æ¤æ¾å¶ç®ç¡æ»é´æ£½çåç¶çè«è³è¬å°è£å¿±æ²è¾°é迧è宸ç¥èèé³ææ¨è¨¦è°è»ææ¨éç
è¯å¡µæ¨çéè´è«¶è¼éºæé·è¶»ç¡¶ç¢å¢å¤¦ç££è¸¸è´é¯è¡¬ç¢ç§°é¾è¶è¶æ¦ç¨±é½é½åå«è°¶æ«¬è¥¯è®é·æ³è°æ½ç¯æ£¦æµ¾åèéçç¤èµªææéææç·½æ©ç èµ¬é ³æªç«ç©ªè¶é³é¿é¥éºä¸ææ¾åæ¿æ¨è¯éä¹åå¨å®¬å³¸æ´è¿ä¹åæ°ç¹èæçµçªèéå æ©æ£æ¤ç¨ç¬çµ¾è£å¡å¡æºç¢èª ç»é
²é®ææ¾æ¾æ©æªé¯çæ²é¨¬ä¾±å¾æééªåº±çé¨ç§¤åå¦æä¾å§å½¨èµè©é¸±ç»çµç¬ç²å«è¨µå¤åª¸æç´çµºåç誺èé´éµç¡éé½æ¡éº¶å½²é»å¼æ± é©°åè¿å²»æ³èæ竾èä¿¿æåæ·èè³èµ¿çè²¾é
è¶é馳å¢æ¼¦è¸é²ç¯ªè¬å°ºåºåèä¾å¶é½¿åæ¸è£æ¥è»è袳è±æ¬¼æ¯è¢²è£é¹è¤«é½å½³å±æ¥ç»èµ¤é¥¬æ¶è¿£å
æç½ç¿ç¿
æç¾çå»æ¹é£åºç¸è
è·®éé´æ翤é«éæ
ç翨ç¾æ糦趩é¥é¶é·å
å²å¿¡æ²èºæµºç«ç¿èåæ徸ææ§è¡ç½¿èè¹è«å´å´éæ¼´è¤ç·è©è²çå® å«å¯µé³æ°éæ½î ·ç´¬æç³ç¯ç¨ç«ä»ä¿¦å¸±æ ¦æ绸èæ¤ç´çµæçç¨ ç¹è£¯è©¶é
§é
¬ç¶¢è¸åé嬦幬æ¤èµç½é çç±èºé»è®è®ä¸ä¸åæ½ä¾´å¢ç
éçéèè°éæ® åºå²åæ´æ¨è²é½£åé¤è»å¨æ»è¢è± éæ¦è¡èèè¶ééçèå»ç¯¨é¤æ©±æ¨å¹®æ«èµèºé櫥蹰鶵èºæµç¡æ¤å¨æ¥®ç¦æ¥è¤æ¿å²æªç´ç¤é½é½¼äºå¦å¤ç«æµæç»è±æ¬ªç«ä¿¶æå±ç¿çµèåç¡éææ»è§¦è¸é¦åå¼è«æ·æ©»æ¶æè
é»è§¸çæèæ£î¡î¡åå¬è¸¹å·å·æ°ç©¿å¶çä¼ è¡è©è¹åçéå³æ¤½ææ·ç¯
è¼²èèåå¢æ±ä¸²çéé§è³é¶¨å
å±ç®çªçªçæçç¡çª»åºçåå¸æ¼ºç£¢éåæå±åååµæ´å¹ç龡åååæ¡é²æ¶èæ¥æ£°è
æ§é¤ç® ééé¡æ¾æ¶æ¥è
å ¾åªæ椿æ§ç箺è½æ©è¼´æ«î¡é°é¶çº¯éåæµ±ç´è¼æ·³è£æ¹»ç滣èé¹æ¼è´éééé¯é¶åè¶æ·ç¶è³°è¸³è ¢è¸æ³è¾¶è¾µå¨å¨æ涰绰é´è
è¾é
«ç¶½è¶ è¼é¾æç£æ å½é½ªé¡é½±å²ç¼çµè¶å¨ç¸éª´è¯çåæç¥ èè¨å ²ç·è©è¾æ
çè¾é¶ç£éé¹ç³è¾¤é£ºé¤å¬¨æ¿¨èé´ç¤ è è¾é¶¿é·æ¤ä½æ³çè·æ¿æ¬¡ä½½åºå¾åºè¦æ ¨è¿çµèèµèè³åä»ååªèå¿©æèæ±å¾æ¤æ£ç§è±æ¥¤æ¼è¡è¯è¥éª¢æ°æ¨
樬çç½çç·«è¦èªç篵è°èç¹±é¦é¨é©ä¸å¾å©å®å¾æ°æ·ç®æ
æ¼æ½æ½æ½¨èª´è³¨è³©æ¨·èå¢çæ¬çæ謥åæ¹æ¥±è
è¾è¼³ç²è§éºéºéº¤å¾æ®ä¿ç媨é
¢çèèªè¶åæ±è¸§éç¯ç°ç¸¬è¹é¼è¹´è¹µé¡£æ±æºé©è¹¿æ躥é¹æ
æ«å·æ¬ç©³çªç¶ç¯¡æ®©ç¯¹ç°ç«ç¨å´å¬åç¼å¢å¶æ
æ§æ¦±æ§¯ç磪ç¸é乼漼ç趡ç ä¼å¿°ç©å
ç´£ç¿èèååæ´æ·¬è毳ç çç²¹ç¶·ç¿ èµè¬ç«è¥é¡èé¨æç´å¢«æ¾ç«´åæµè¸åå¿å¯¸å籿æç³é³ç£æ®è¹éé«è嵯嵳ç¤çç¬è«è鹾鹺齹èåååå¤æ«èè¡æªéªæ£¤éèéé¼é¯ååè·ç£æå褡å 墶æéè¾¾è¿è¿å¾å¦²ææ²å¯çç¾è
èå³å笪é¹æºçè©éè·¶ç©é¼èéçµç¹¨è½éèºé½éé¾é¾æ大亣ç橽ååçææ¹å£ä»£æ±è½ªä¾¢åå²±å¸çç»è¿¨å¸¦å¾
æ ææ®ç³è´·å¸¯è»å帶紿è®è¢è»é®è²¸è»©çå»åæç·¿é®é´æ´èé»ç°¤è¹ç»é´è¥¶é»±é丹å¦åæ
åçç è¼è½é¸èèºé
å®åª
æ®ç
å°ç®ªè¤é²é åå¯æ殫çè¥ç°è¸ä¼åçç¬çèè¡´ç¸ç´æ¸äº¶é¦¾æ£æ¾¸é»è½æ¦ä½å¸æ²æ³¹è¯æ¦çè¨ååå¼¹æ®æ·¡èèå¿æ°®è
èè§çªèªå¤å髧å¾å½ææºæ¾¹ç¦«é¤¤é§³é´ ççåªè´é®é¥å½ç°è£çç¶å
å¹æ¾¢ç«è¥ ç°¹è¡è·æ¡å
è° æè¡é»¨æ©çæ¬è®æ°¹å¼åµå®ç å±è¡æ¡£èªå©¸ç½é¿é¼æ½ç¢çè©è¶¤å£æªççªç¤ç°è¯é£ååå¨å±¶å¿æ·æ°è éé±½éæ¯å¯¼å²é¦å宲島æ£ç¥·ç¦æéå¶å¶æ§å°é¯å£å¶¹æ£è¹ç¦±å°æ¼ççè¿æ¤¡çé稲翢åµç¨»è¡æª¤è¡ç¾ç¿¿è»ççºæ´å¾æ·æ³æªéå徳德éçæ¼æ¥æ½ç¯ç»è±åå¬çç竳簦è 覴蹬çæ¥éåå³é§é¥å¢±å¶çªç£´é«æ«é仾ä½å¥å½½è¢å²åç¾éå ¤è¶åæ»´é磾éé®é廸çèç±´è迪åæ涤è»æ¢ç¬è§é®æ»é«¢å«¡èèé é¡æµç¯´åè¡è±´ç³´è¦¿é¸æ°åè¯é¸éºå§å»åºå¼¤æµææ¢ç´ç ¥æè§è§è©è»§è骶鯳å°å¼åå¼æ³æçææ¤è俤å¸å娣ééååæ¢çç±ç¥¶ç¬¬èè°é±åªæ££çç¼èåç¦è
£ééªé¦°å¢å¢¬æ碲èèé°æ
¸çç· å¶³è«¦è¸¶è®å²ææåå§åµ®æ»æ§ç¨é¢ è¹å·
é¡é¡ç«å·å·æ§ç²é½»å
¸å¥ç¹å©°æ椣ç¢è§è踮é»çµä½ç¸é½å«åºå«æç·é¿å¸å©æ¦æ·å¥ ç殿èé¿é»å¢å£æ©æ¾±é磹çç°é©åå¼æ±åèåå¥å¼´å½«èç±è²ç¢é³æ®¦çéé®é²·ç°é¼¦é¯éµ°æå±å¼ä¼åéçªè¨è°æé£éé竨è§é±é¿èª¿ç¹çªµé½èéç¹è·è¤ºèµè¿å¤å³ææç»è
çç£èåæè°åå å¹æµæ²ç³çµ°èè·è©è¶å æ®ççé»åµ½ç¢è¨è¤èè¶çè«è¹é²½æ¡æ¢é°ççæ°åæ³ç°å¸ä¸ä»å®å¸çç¼çç¯éèµé
ééªå¥µé¡¶é é¼åµ¿é¼è¡é¤è®¢å¿é¥¤ç´å®è¨é££å¶è£æ¤è
ç¢éç¢ è¢è£é 磸é¡ä¸ä¸¢é¥é¢©é©ä¸å¬åå²½æ±è³æ¸æ°¡å²é¸«å¬å¨»å´¬æ¶·ç¬èæ°èé®é¼é¯é¶é¶«è£å¢¥å¬æ箽è«è«å¨å»ä¾åå§å³å³æ«ææ æ´è¨è¿µåæè´åå´ ç¡æ£æ¹©è
å詷駧éåºå
åé½å
å
è¸æ©·ç¯¼èæ乧é§ææéé¡èªéè±éæµ¢è³é饾鬥梪æ¯è°é
çé窦鬦éé¤æ£éç«é¬ªé¬¬é¬å¢éåç£ééæ¯æ¶è¯»æ¸æ¤çç裻èªè³ç¨éååµå¬»çæ«æ®°çç¢çç¾é¨³é»©è®è±è´é£é«ééé¥é»·è®å¾ç¬ç¬å µå¸¾ç½èµç¹è¦©è³ç¯¤èå¦æè妬度è°ç§ºæ¸¡é¯éè殬éè §è ¹èå³åªç«¯è¤é´ç段æå¡
ç¼è®æ¤´ç
çè
¶ç¢«é»ç·æ¯ç°éæ·èºç±ªå¾åå å¡ åµç½ç£é §é´éé对å
å
å
対ç¥æ¼é®éç¢ç¶å°æ濧è±é¦æç©èéèµå¨ææ¦è³å¢©å¢ªå£¿æ´ç¤å¸ææ©çç¤
蹲蹾é©ç¹è¶¸èºä¼
å¤åºæ²çç¾ç ééé¡¿ééè
é 碷é¯æ潡ç踲å¤å¤ååè¤åå´æ 毲裰åä»å¤ºéå«æææå¥æªç¥é¬å¥ªå踱鮵é¸æµæ¶ååæ
æåµç¼æ¤¯è¶èº±èº²ç¶äº¸è»é¬å²å´åæ²²éé饳åå°®æ®æ¡å èµæ°è·¢è·¥è·ºé£¿å¢®å¶æ墯鵽妸妿娿å±è®¹åªå®è¿ä¿å¨¥å³¨å³©æ¶èªç´è¨ççééé¹
è¾ç£èªé¨é é¢é¤é¡éµéµèæç å©æ¡åé¨éµåæºå±µæ¹å²é¨åæ¼èé¸åç è½å¢å¹å©å§¶å³åæ¶ç ¨è
饿åå¾å æªç¡è°è»ééå ®å´¿ææ¹è¼è±è»¶ééå»
æ¤æ¹ç§è
è©»å«èé·é¹èé»é é¢é¤å©æ覨諤é¼é¤©éé³æé¡æ«®é°é¶è®é©é½¶é±·å¥æ©è½ç
¾å³æé¥ä»ä¹»æå¿èå
ä¾å
éå³æ´èèæ è¹å²è¢»é¸¸ç²«èè¼é²é髵é®é´¯è½å°å°å°è³è¿©æ´±é¥µæ ®æ¯¦ç¥éç¾éºé¤é§¬è¾é趰äºå¼å¼ä½´åµå¡è´°è²®è¡è²³èªæ¨²åæ²·çºç¼å½é«ªæ©éä¹ä¼å§å¡çºç½è·éæ °å ççç½°é¥ç½¸è
ä½±æ³ç é
çççºé«®å¸å¿ç¿çªå«å墦å¬å¹¡æ£ææç¿»è©è½é¢¿ç±é£é±å¡å¢å£å¥ææç¾ç±µéè¤ç¦è§ç¬²é©æ£¥ç
©ç·æ¨èæ©çç è°è ç¹è¥ç¹ç¾³è¹¯ç¿ç¤¬è©éè é·åä»®æ辺è¿æ°¾ç¯å¥¿æ±æ³é¥èè´©çè¨è»æ¢µç笵販軬飯飰滼å¬ç¯å¬çªåæ¹é¡åè³æç¥é«æ·èå 趽ééºé´é²å¦¨æ¿èªå
é²é´ä»¿è®¿å½·çººææç¬çå£æç´¡è«è¨ªé«£é¶æ¾é£å¦éé£å¡å©å©æ¸ç»¯è²æçé裶ç·èé鲱餥馡é¨é¨é¯¡é£è¥æ·æè
è°è¦æèåªè¯½å¥æ±ææ£æ¦§ç¿¡è誹ç¯å åºæ®æ²¸çèºæ²è´¹ä¿·ååç¿å±èå»è²»ç±é廢èæçé¼£æ¿·æ« é¨é
åå©å¸çº·è¬ææ°ç¢ç«è¡¯ç´ç¿æ£»è¨èº®é
éé°æ餴é¥åå妢å²æ±¾æçè¦æ¢¤ç¾è è¡æ£¼çè¶é¦é«å¢³å¹©è¡éµé³»æ©¨çç豮鼢羵é¼è±¶è½é¼é¦©é»ç²ç黺份åå¼
å¥å¿¿ç§å¾æ¤ç²ªå¨æ¤å¥®è¹ç³é²¼çµé±ä¸°é£ä»¹å¨å¬å¦¦æ²£æ²¨å®æ«å°ç¯ç½ç 風峯峰åæ¡»ç½ç崶渢æºç¦èéæ¥çèç碸å¼ç¯é·éæªè±é½é é
寷çè´éé£éº·å¯å¤ææµ²é¢å ¸é¦®æç¶ç¼è縫讽è¦åªè«·å¤å¥ç®ä¿¸æ¹ç¨ç
èµé³¯é³³é´è³µèç°è¦
ä»ä½å²æ¢»åºç´ç¼¶å¦å¦ç¼¹ç¼»é¬é´å¤«ä¼éåå¦å§æçè¤æ¤æç èèè¡å¨å°è´æ紨趺é
麸ç¨è·éçç¶éåµè±§æ·è鳺麩ç³éº¬éº±æ¯ä¹å·¿å¼ä¼å«ç¶å¹ååæ¶èè£è¾å岪å¸å½¿æ«æææ³ç»ç»è»èä¿åæ¹æ«æ°æ´ç¥ç¸ççç¥ç½è¯éé¨é³¬å¹æ ¿æµ®çç ©è©è¨å桴涪ç°ç符笰紱紼ç¿è´èè袱å¹
棴絥罦èç¦ç²°ç¶èèè¾éé颫鳧æ¦ç¨ªç®è¤éå¹æ¾è é«´é´è«¨è¸¾è¼»é®çè¥é®²é»»è¥¥éµ©é¶åæç«åºå¼£ææ§ä¿é俯éé¡æ¬è¯è¾
椨ç¤çè
æ»è
è
è¼æ«é¬´ç° 黼éç¶è®£ä»å¦è´éåå¿ç«é驸å¤å³ç¥è¨è² èµ´è¥è¢éå©å¨å¯å©å©¦è¹å
åªå¯å¾©ç§¿è¯èè¦è©èµæ¤±ç¼è
¹é²ç¦£è¤èµç·®è§èè®è³¦é§ç¸è¼¹é®è³»éé¢é³è¦é¦¥é°ç¤æ®ä¼½å éå°éåå¶é·å°çå°¬éä¾
该ééåå§å³èæèµ
ç¡ç¥´çµ¯é該豥è³
è³å¿æ¹çµ é
ä¸ä¹¢ååæéçæ¡æºè¢é£æ¤æ¦è槩槪æ¼çå¹²çå¿èè¿æ¼æçèå©æ³è·æç«¿ç³é
ç²äºå²å°²å°´ç¸æ¼§é³±å°¶å°·éä» ç¯ç§è¡¦èµ¶æ¢æ¡¿ç¬´ç¨ææ¾è¶æ©æ簳鳡鱤æ°æ±µç°ç¸ç»åå淦紺è©éªå¹¹æ¦¦æªèµ£è´ç¨åç½å®åé¬å²çº²è岡ç¨çç¼ç¼¸é¢åç½¡î §î å æé棡ç
å ½ç¶±ç½é¼é å´æ¸¯æ çµç»æ§ææçç¾ç¾é«çé«è¯æ»çªæ§ç¾è槹橰ç¯ç³é¤»æ«éé·é¼é·±å¤°æ²èç¨æç¼æ§æ§ç稾稿éç¸è檺è³é¬å¿åå诰é峼祮祰éç¶æ ç¦èª¥é¯æåªçµçº¥æèç«çç±ç´å¥è³è¢¼é¸½å²æå½ææ»æ¨é¤é´é´æ±è¬é´¿é¶åä½®åæèéé©ææ ¼é¬²æ
èµèèè¤è£éåå¡¥æ»è§¡æ¿æ§
èé£ééé骼諽輵鮯æ«ééè½é·é¨é°ªå¿è¸ä¸ªåè¼åç¡é¬ç®é»ç¦ç»çµ¦æ ¹è·åäºè®èæ¯ææ´å¯åºçæµèæ¶è®æ¤©ç¿çµèµé¹ç·ªç¸ç¾®è³¡ç¾¹é¶é å½å峺æç» è¿èæ¢ç¶é² 骾é¯äºå ©å¹å¼å°å·¥å¼å
¬å·åæ»æä¾ç³¼è±å®«å®®æè£èº¬é¾å塨å¹æ©è§¥èº³å碽篢髸觵é¾é¾å»¾å·©æ±æ±åæ²æ ±çè¼éå
±è´¡ç¾¾è²¢æ
çè´å
å
£å¾ä½æ²é©è¢§ç¼éæºé¤ç·±è¤ ç¯ç°¼é²éå²£çèæ¸ç½èè笱èè¼è±¿å¸æè¯è´å¢å§¤è©åå¤å¤ 訽媾å½æ詬ééæ§ç
¹è§æ覯購估åå§å¤æ²½æ³æ§è½±ååç½é¸ªç¬èè°èèè§è»±è»²è¾é
¤æ¯é²ç®ç®å«´ç¯æ©é®é´£è½é¹é¶»å¤å¤æ¢æ±©è¯è°·è¡å³ ç¯éª¨ç½ç¾é§é´å¦åæ·èµèèå°³æ²ç¸ç¡²è©é¦é¹æ¦¾é·é¼é¼åæ¦ç·ç©ç¸ç³è£æ¿²è餶çç¬ç½éµ è ±åºææ
å
顾å å´å´®æ¢ç¿æ£ç¥»éç¼ç¨é¢é å±é®é²´é¯é¡§çå®è½è鸹æç»ç
±é¢ªè¶åç·ºé½é¢³é´°é¨§åå§å±åå®å©å¯¡å¦å¬è¯ææç½£çµç½«è¤è©¿ä¹ææ´æºç®å¤¬åæªæ å
³è§å®å è¦åè棺è窤é¢çç観éé³éé°¥è§é±é¦ç¯ç¯ç¦ç®¡è¼¨èé§é¤¨èºé³¤åæ¯ä¸±è´¯æ³´æºæ¯æ¼æ¶«è²«æ¹ç¥¼æ
£ææ½
é¦æ¨ç¥ç½ééçççç礶鹳ç½éµé¸é±¹å
ç®ä¾çççå£å姯洸èªæ¡ç¡çè±ç¡åè¼é§é»æ¬å¹¿åºç·å»£ç·è©ä¿éè¦æå½å妫é¾è§é½çè¥éºå¸°çªè¿äºç¡
çªè¢¿è¦åª¯æ¤ç°éå«¢æ«é¨é²å¬å¶²æ§»æ§¼çç¡èé®é¾å·æ¸é¬¶é¨©ç鬹櫷å®æ°¿è½¨åºä½¹å¦è¯¡éå姽æç¸è»é¬¼åºªç¥ªåæ·æ¹è«è§¤è©å¬ç°è¡å½å¿æ°ææç
æ±è´µæ¡æ¤¢çè²´æºèè·ªçååæ槶ç¶ç¦¬ç°æ«è¥é³é¼é±é±¥ä¸¨è¡®æ绲è¢è¾æ»è裷滾ç·èç£ç··è¼¥é²§é®é¯æ£æ£çç´ç謴åå¼åéå¯å å´æ¥èéé
å¢çåå½æ¿èéå½èå¯å¶å»å½åå帼æ´è
å¹æ
ææ¼èè®èè¢é¦æææ·çèé¦æ¤è¤æ§¨ç²¿ç¶¶è¾è£¹è¼ é¤é¹è¿éè
å¦éªé¿ä¸·ååå¨å©éª¸æµ·è²ç¸å¡°é
¼é¢äº¥éªå®³æ°¦åé¤é§é§´å¡é¥ä¹¤å
¯ä½é¡¸å»è¶é
£é 嫨谽æ¨é¦ é½é¼¾éå«é¯å½åè£å¾è·å
å
娢æµå´¡ææ¢æ¶µçå¯åµ
é©çç¨ç³è¬æ¾é¡éåç½æµ«åèè±é¬«æ±å±½ææ±é¬æ±å¾ææææ¶çèæ¥æ·ççè¡é¬éçç
å¼è¿é¢é¦¯ææ¼¢èæµç¯é²éæ¾æ¼ç¿°èé ·é¡é§»èî ¡î éçè«é¶¾å¤¯é§å¦èè¿æ»æå³ç»ç¬èªè¢é¢è²¥ççµé æ²è è¿åè
è§ç«è毫æ¤å¥çå豪å·çå«æåå£æ¿ ç±è è¹å¥½éå·ææ¦ç§å ææ浩èæ§æ·åçæ»èèæ¤ææ¾ççç¡èç¥é¢¢çé¡¥é°çå
è¯åµæ²æ¬±å訶å¬è 禾åä½å¾ååå§æ²³éå³æ·æç¢ç籺é饸å¬ææ ¸ççè·å涸渮ç秴èèèµé¾æç²è¨¸é¢æ¥æ¯¼è©¥è²è²ééé²çé¡é¹éº§æ¾é ç¯ç¿®èéºç¤éé¨é½è¦é¶¡ç¬é龢佫åè´ºè¢éºå¯çæ¹¼è³åç
ç¢çè¤èµ«é¹¤ç¿¯å£ççºç鶴é½ééé¸éé»é»å¿æ½¶å¬æ«çéä½·å¾ç 詪æ¨äº¨å¼æ涥è姮æææ¡çç©è»é¸»æ¨ªæ©«è¡¡é´´éµè
é
åå ¼åä¹ä¹¥å¿ç´è½°åè¨ç軣æ渹ç¢ç¡¡è°¾è¨è¼·åé§è½ä»å¼å¦
红å°å®æ±¯ç纮é³å®æ³çè°å¬å¨æ´ªç«ç´
èè¹æµ¤ç´ç¿è¾ç¡ç´è°¹é¸¿æ¸±ç«¤ç² èèééç¶ç¿è°¼æ½é·ééç¯éå½è»éé»éé´»é»æå讧è¨é§ææ¾æ¾é¾éé鬨é½ä¾¯ç¦å帿ç´èççºéç¯ç³ç¿éªºé餱鯸å¼å½ç¼åéååå¾æ´é
åéå è±é²é²é®é±ä¹å¢èå¼å忽ææ¶æ³è¸æçè½·å«å¿ææ·´è軤é½å寣滹éå¹ æè´è¬¼å«æ弧çç³è¡å£¶å£·æçå壺媩æ°æ¹ç¢çµè«æ¥ç
³çåèé¹æ§²ç®¶ç³è´è¡é±ç¸ èéé ¶è§³é¸é¤¬ç«é¬é°é¶é¶¦é¶®ä¹æ±»èæµå¬èç¥è滸ç®é¿é¯±äºå¼æ¶æ·æ¸å±å´èå¸æ¤æ²æ²ªå²µææ½ææç¥ç¬ç²å©æç ç¶é å«å«®æ¢æ»¬è°æ§´ç©é³¸ç°éåé¹±è·é³ éé 鱯é¸è±è²å婲æ¤ç¡´ç³èª®éµè¤åå姡éª
è¯é§æ»ç¾å©æ¶çç£èèéèéµé©é·¨ååæ¹ç»è¯å´æ¡¦å©³ç«å¬
çµè§è©±åæ¦æ§¬æ¨ºå«¿æ¾
è«è«£é»ç¹£èè³æå¾æ·®æ§è¤¢è¸æ褱æ·ç¤æ«°è²è¹åå¶å£å£è¾æ¬¢æ¬¥æé´
æéµé
å¾æ½ç¾æ¡è²è®é©©è¿ç¯éå³æ´¹çèæ¡èèå å¯çµéç¶ç¾¦è²é¾é寰澴缳éç°è±²é°é®é¹®ç³«ç¹¯è½é¤é¶é¬ççç¼è¼ç·©æå¹»å¥èå¥å®¦å¤æ¢æµ£æ¶£çæ£æ¢çéåååµæææ¸çªç
¥ç豢漶ç槵鲩ææ¾£ç£è§é¯é¯¶é°å·èèè¡æå¡æ
çåå°éé»é»å¤å åªå´²å¾¨æ¶ææ¹èé楻ç
ç墴潢çé½ç¿çç¯èèç磺ç©è«»ç°§è¥é é¤é³è¶ªé¹éé¨é°é±é·¬æ³æç¾å®ºææå¥è°å¹æ°è©¤ç縨è¬æ«ç©å
¤æ»æ¦¥æçé¤ç°ç³è¯å´æ¢æ»æ¥æ´èºè¢æç£ç²è±å©åªæ®ç¿è¾éææ¥ç
ç¿ç¦è©¼å¹ç³è¤å
åæ翬è¼éº¾å¾½é³çé°´ååå¬ä½ªå»»å»½ææ´è´è¿´ç èé¥çèèèé®°æèæ¯æªç¬èåå±·æ±ä¼è®³æ³åæµç»èè诲ææµæ¡§ç©çªè´¿å½æ¦ç§½åæ æ¹çµµç¼ç¿éå¯å½å½ææ¯æ¯æ»è©¯è³å¡åç£è§èª¨åå¯æ
§ææ³æ§¥æ½èå¦å¾»æ©æ¾®ç©ç¤èèè«±é ®æª
æªç´ç¯ç¯²è±é¤¯åæ³çºç©¢ç¹¢èªæ«ç¹ªç¿½èå¶è®é¸é åé¬é§é¢è¿é¡ªææ¬è¤å©æ涽éæ½æ£æ®è·ç§ç¯é½å¿¶æµé¦æ¸¾éé¤ç¹è½é¼²è¯¨ä¿å±åææ··ç溷æ
觨諢åè éªåéè±æé¨ä½¸æ´»ç§®ç§³ç«ä¼é©é¬é¥æ¼·å¤¥æ²æè´§åä¿°æçè·éå¨æ祸貨ææ¤æ¹±ç¦åè¦å奯ææ¿©ç²é檴è¬éçç©«é¬å¯çè¯è§è¿è å¿æ¤èç¨çéé夻ä¸è®¥å»åå½é¥¥ä¹©åå¾æºçèè¨ç¶é¸¡æ
å迹åå§å§¬å±ç§¯ç¬é£¢åºç»©ååµåµæ²æ§ççç¼èµå£åç¸ç¨è·»é³®åæ¯ç®éå°æ槣æ¨ç¿ç¨½ç·è§è³«èº¸é½å¢¼æ¿æ©æ¿ç£ç¦¨ç©é¤é®æ磯ç°ç¸¾ç¾è³·é¿æ«
èéèé²é¶è¤éé¥çªèºé¿é·é½ç¾èéè¦éé½ç¾é¸è¦äº¼åä¼åå²å½¶å¿£æ±²çº§å³æäºä½¶éå½åå§æ¥ç¤çç¬ç´æ¤ç¾è§å®å庴æ¥çè¨è°»æ¢æ£æ¥µæ®æ¹éå¡å«æ±æ¥«èºèè¶è¾æ§è¤èé¡å¶¯æ½ç 箿èèºè¸é鹡橶æªæ¿è輯è¥è¹éè¥ç±è½é¶éµé¶ºé·èº¤é¦é§å 己丮å¦ç±æ³²è®æ¤èæ鱾幾æåµ´éºé¢æ æ ç©è£å½å½æ¡è®¡è®°ä¼çºªåå¦å¿æè°è¶é
åå£ååå³æ¢æ´æµç´èè¨å¤ç´ç»§è§è¨åå¯å¯å¾æ¸æ£æ¢æ¸ç¥èæè®èªèå
¾çµç¶èè£è·¡éå¢æ¨æ¼æ¼ç¦ç¨©ç©èªè·½éé²æ©ç¨·è«
鲫ååæç©ç¸èè¥é«»åæªæ¿ç¹ç½½è¦¬é®æªµç¾è¹é¯½éµé½å»æ»ç 穧ç³ç¹«è骥é¯ç±ç¹¼è®é±è»é½é°¶é°¿é±é©¥å 夹夾å®æ¸ä½³ææ³è¿¦æ·æ¯ æµçå家浹çæ¢ç¬³èè¢è¢·å¢ç³èè£è·çè
µé«åéç³è±è²éµéºå¿æ´å²¬éèéåæè¢æè¥éæè±é¢èºè·²é¤éé ¬é °é´¶éµç²åç¾èæè´¾é¾å©½å¾¦æ椵è³éæ¦æ§çæªä»·é©¾æ¶åå«å¹æ¦¢å¹ç¨¼é§å§æ奸å°å¹µåæ¼é´å¿æçªè©è°å§¦å§§å
¼çå
æ¤ç笺è
èºè±æ¹ççç¼èèéé¬æ椷椾ç
çç·ç¢ç¼£è¹è±£ç£ç®æ¨«çç·èè³é²£é³½é¹£ç¸ç¯¯ç¸é»è±é¬é¤°é¦¢éºçé¯é³æ®±ç¤è¦¸éµ³ç¸é°æ«¼æ®²è¼é°é¶¼ç±éé°¹åèé¯éåæ£æ§ä¿æ¬è§å¹æ¸æ¡ç¬ååªå¸´æ¢æ£æ¹è¶¼æææ¤æ¸ç硷裥è©é弿æçç§ç®çµ¸è°«å½
æ©æ¬ç¢±å翦æ¿æª¢èè¥è¥è¬è¹ç¼ç¤ç°¡ç¹è¬é¬é°é¹¸ç½è éé§é¹»è¾è¥ºé¹¼è§ä»¶è¦ä¾å»ºé¥¯åæ´ç®è贱俴å¥å£æ «æ¶§çè°å±å¾¤æ¸è¢¸è°é¼å¯ææ¥æ¯½æº
è
±è¶è¥è·è·µéè³é´é®åæ¦æ§æ¼¸åå墹æ¾ç®ç³è«è³¤è¶è¸è¸ºåå橺è¦è««éµé¤ç¯ç·ç£µç¤è¹é³æ¶æª»æ¿ºç¹ç³è¦µé©è»è¦è½ééé¬é³æ±å§å°è³æµçè±èæªç¿åµæ¼¿èå£å½ç¼°èæ©¿æ®è¿é³ç
ç¤çç¹®éé±è®²å¥æ¡¨åèå¥å¥¨å¥¬è£æ§³çè©èè¬é¡åå å¤
å¼æ¢éæ´ç»å°å¼¶è¢¶çµ³çºé
±æ¾æ»°åµ¹ç糡é¤ç³¨é¬æ«¤è¬½è½è交é姣å¨å³§æµèè®éªè¶æ¤ç¦ç³èè·¤å¬åè é²å¬å¶å¶£ææ¾è èçè²ç¤ç©é®«î¡éµé¹ªç°¥èè½éé©é·¦é·®æ«µè«è§ä½¼ä¾¥æ¢ç¡ç»é¥ºææçç¬
çç«èé°æ
湫ççµå¿å¦æ«æ¹¬ç
è
³è³å¥æ·æè¸é¸é¤ååææ¹å¾¼æ½æ¿ç¼´æç¬ç¯ç¦è鵤繳èåçºæªçé±å«å峤æè¨ççªè½¿è¾ææçªæ»è¼åå¦æ æ¼é
µåå¶ æ½åå¬ç¥è è¶è½é®è¥çéé¶ççæ¥æ²ç秸è¨éååå ¦åªå«
ææ¤æ¹è»è¡ç
¯ç¨éèæç¤é¶å©åªåå°è讦å¦å§å«å²æ
å¼å¼æ°ç衱è¯æ®æ´ç»è¿¼å¢æ¡æ¡èè¨å¼å©å´¨æ·è¢ºå媫çµè£é¢åµ¥æ¥¬æ¥¶æ»ç«ç¯èè©°é£éæªæ¦¤ç¢£ç«èµé²æ½ç¾¯èª±è¸é ¡å¹¯æ³å¶»æ®ç¤é»é®å·æ«è è è ½å¥¹å§æ¯åªè§£è§§é£·æªä¸¯ä»å¤å²åºå¿¦æè¥å±å±æºç ççç¥ç 衸诫åæè§å¾£å ºæ¥ç¾è¶éª±ç誡褯éªè繲巾ä»æ¤é
å
ééæ´¥çç èè¡¿è§åçç´æçå »ç»çå¶ç¡é¹¶é»
è¥ä»
åºå·¹ç´§å è«å
åªè°¨é¦å«¤å»æ¼ç¡ç·è³é¦æ§¿ç¾é¦è¬¹é¥ä¼å¤å°½å²å¦è¿è¿ä¾æåæµè©ææ浸ç¬èµç¥²é²ç
¡ç¼å¯æ¢æºç¦é³å¢æ
¬ç¨å¸åæ殣è§åå¤æ¿
ç¸è³®åå£å¬§æ¿èç¼ç¶è¦²è´é½½ååå· äº¬æ³¾ç»è亰ç§èèæ¶èå©æææççµèæ¶ç¨è
çç²³ç¶å
¢ç²¾è橸鲸éµé¯¨é¶î¡é¶éºé¼±é©éº äºä¸¼é±ååå®æ±«æ±¬è¼å穽é¢æ¯åå¹æ¬çæ¼æ»çççç¥é ¸è¼è¦å¦å弪å¾è¿³ä¿æµè«ååå¼³å¾çç«éå©å©§æ¡±æ¢·æ·¨ç«ç««èæ¬ç竧éå¹éå¢ç誩è¸éé éæééçé¡ç«¶ç«¸ååå°æåçµ
é§é§«èåå§æ³è¿¥ä¾°ç¯éæµ»ç±ç
çªé¢ç¶åç
ç²æ¾çç褧é¡è丩å¼çº æ»çç©¶ç³ºé¸ ç³¾èµ³éèå¾ææªæ«é³©ææ¨é¬é¬®ä¹ä¹
ä¹ä¹£å¥ºæ±£æ¦ç¸çèéç´¤é
é¹é®åæ§è¼åççæ©æ¾åæ¡å©æå°±å»åè
å¦å»å»æ
¦æ®§è鹫鯦éºå¶é½¨é·²æ¬å¥å§æ
åå±
ææ³çè´é©¹å¶æ¶æç½ççç ç½é±å¨µå©
å©®å´æ¬æ¢®æ¶ºæ¤çè
è¶è·é裾éèèè«è¸é¦é§é®é´¡é é«é¶å±æ³¦ä¾·çæ¡æ¯©æ·çèé¹æ¤æ¯±æ¹¨çè¼åªç²·è»è·¼è¶èº¹é°æ©æªé§¶éµè¹«éµ´å·èî¡ é¶ªé¼°é¼³é©§åå¼æ²®ä¸¾ç©èææ¤ç¥æ¦æ¦èé¾è¥è踽æ§æ«¸é½æ¬
襷å¥å·¨è®µå§å² æææ´°è£éå
·ææ ææ«ç¬ç§¬é俱å¨å£å§ç²èè·è¢å§å¾æ§æ®è©è·ç£çè·é
é£è¡è±¦é¯å¯ æ³çªèé§åå®å±¦è¸é®å£æ
æ澽窶é½é¸å±¨é¢¶ç¿è²ç°´èºéµæ¼é»ç 姢å¨ææ¶è§è£é¹å¬éééé¸éµé«è ²å·å帣åæ²è¤é©èéå¥åµå¼®å¦åæ¡ç·ç»¢é½æ·ç¹ç·éççµç½¥éç 絹飬æ
»è¨é¤ç§ç¾åæ
æ§å±©å±«äº
ååå³åæ°è¯å¦æ決èµæ³¬ç¦ç¨æçç ç»è³è§åæ欮èå´æææ¡·æ®çè¦è§è¨£èµ½è¶¹é«åå¥çµçµ¶è¦è¶éååªç´è°²é§å¶¡å¶¥æ°æ½ç¦ç´ççèè¨é´é´å±æ æ©æ©é¼çµèé¢è¨è©çè蹶蹷é¶å¼ç覺ééçç觼å½ææ«çé·¢æ¬ç¡é¾£è²èº©î¡éååå汮姰è¢è»é§èè桾ç²èéç¢
ç ç¸ç¹è¦ éé鲪éºé鮶éºéºåä¿é¡éåå³»æææµé¦éªççºç¯ç«£ç®ç®è å寯æé¤ç濬駿éµéµéµæåååå¡ä½§å°è©è£é²å¼å¥æ©è¡ééé¦å¯åå²æºé¿é å±å´æ
¨èå¡æ·æ¥·è¼æé´éé§é颽忾çç欬çåå
æ¾é乫åæ åé¾å ªåµæ¡é¾ååä¾ç è°åå³æå ¿æ¬¿å¡ªæ輡è½é¡ç«·è½çè¡å´å¢éç°ç£¡éç忼ç ç²åº·å«åµ»æ
·æ¼®æ§ºç©
ç³ èº¿é®é±ææ亢ä¼åéå¥æçºé¶çéªé§éå°»é«ä¸æ·èæ·æ´æ ²ç¤éçé¬é²é 鮳é¯å¼å·èæ¯ççç§è¢è½²ç´è¶·é¶åµæ£µç¾èªè»»é¢æçç¨çª é³æ¦¼èé¢æ¨çç£èé ¦éé¡é«ç¤å£³å³æ®»æ¢ç¿å¶±å¯å²¢ç£æ¸åµæ¤æ¸´å
å»ååå客å³æªå¨å°
课å æ°ªéªç¼åææºé碦ç·èª²éç¤é¨èè¯è»å¦æ³å豤è²å¢¾é¹ææ¯è£è¤å¥åååæ³ç¡ç¼ç¡é¿ç¡»èªéµéé巪乬åå¼æ¾ç©ºå¥åªå´æ¾æ¶³ç¡¿ç®èº»èº¼ééµ¼åææ§é廤æ è¤çå¾å½æ³çå£å¶å©æ£ææå¦å®¼å¯é¦çªçæ»±è²è»çç°é·æå³ç»éæ¯åæ¡å å´«åè·çªéª·é®¬çè¦æ¥åºä¿ç»åº«ç§ç
袴å¾çµè£¤çé
·è¤²å³å¤¸å§±æè¿èªä¾åµå®éæè¯è·¨éª»è¯æå·å·å¦å快侩éåç¯èå¡ç·î ¨é²å墤é¶å²å»¥çªè¾æç³©é± å®½å¯å¯¬é«é§é«æ¢¡æ¬µæ¬¾æ窽窾å¡å»è¯é¼å©åææ´ççºèªè»æçç
诳è»è» èªéµå¤¼å£æéå¹çº©åµæ·å²²æ³ç¿æ¿è´¶æ¡çç ¿ç¶çµçµè²ºè»¦é±ééºå£é»æ¬æ çç礦穬çºéäºå²å²¿æç窥è§çªºè§éé¡å·è¬å¥æéµéé é¦å¹æèµéªæ£ææ¥æ¥éç½è°é ¯æ«èé¨é·é¨¤å¤è·èå·èº¨å¼åç
è·¬é ç£è¹å°¯å®æ¬³å媿æ¦æ§æºèèé¦å±å³î ®å¬ææ½°ç¯è©î¡èè¢æ¨»æ®¨è¬é¤½ç°£î¡èµç±éé¥éå¤ææå å å©«å´å´çèè£çç¨é« 裩éé«¡é¹å°¡æ½è«è¤é«¨ç´ç»ééé²²èé¨é¯¤éµ¾é¶¤ææé壸梱祵硱ç¨è£å£¼ç¨ç¶é«é¸å°æ¶çæ©æ¡æ¬ææ æ¡°çè¿èèéå»åé ¢é«ºæ´æ¿¶éééæé©é¹é¬ ç©åææå¦ç¿èæéæ¯ç ¬æ¦ç£åèå¹åæºè
æ§æ¥çè¡è辢辣è²èæçèé¬æ«´çé´é¯»è éé¡æ¥ä¾ä¿«åå´å¾æ¶è±é²å©¡å´åº²å¾ 梾淶çèé¨æ£¶ççé¼ç®é¸é¨é¯ é¶éº³å»èµççèµè³æ¿è³´é ¼é¡çéµ£ç¨ç¬ç±è¾ç©è¥°ç±å
°å²æ¦æ 婪åµè»éèèè°°å±æ¾è¤´åæ篮æ¢ç£èè¥é§éç¼è¥¤èå¹±æç¾çç±ç¹¿èææ¬ç¤·è¥´åç¡ç±£æ¬è®èºè¥½éééè§æµ¨æ½ç¼æ¦æ¼¤ç½±éå£æ覧æ¥å¬¾æ¶å覽åæ¬æ¬ç¦çºç滥çåå£æ¿«ççç¤çç ç³·å·åéé欴ç¼è¨å«å»æ¡¹ç
èæ¦ç¯ç¡ ç¨éç¤èèéè躴éé¯é§ºæ¢æéæçºå¡±è¢æ¨èªé¬æ¤åå´æµªèå¥æ粩æå³å´ç¢ç«çªå°å å´æµ¶åç¨é¹åå®å¶æ¥æ¥ç磱簩è§éªéé¡é«èè佬å¾å§¥æ
èæ ³ç¯ç¡éè¯é 潦æ©é®±è½æ¶çå è¢é
ªå«ªæ¦æ¾æ©¯è®è»ä»éä¹å»å¿ææ°»è»çæ³ç«»ç ³å楽é·æ¨ç°é³é°³é¥¹é¤é·å«ç¼§èæ¨ç¾æªç¸²éæ«ç羸礧çºç½è²é³è½ 壨ééè鱩æ¬çºé¼ºå½èè¯åå¡çµ«å«èªç£è磥è¾å¡å£çèæ«ç礨ç
è è½è®å½é¸é¸è泪洡类æ¶æ·ç´¯é
¹éé é ªæéæç¤é¢£é¡çºè±ç¦·åè·å¡æ£±æ¥ç¢ç¨è¸èå·å°å æ£çåååå梨ç¸ç¦»è²èéªæ¡æ¢¸çèå±æ£çé¹åºæ¼çç£ç¼¡èè èå« å·æ¨çç ç«°è²æ°çç³è¾è¤µé«é²¡é»ç¯±ç¸ç½¹é
è謧é¨åèééé¢é¯æé«é¯¬éµ¹é»§åçèºè ¡è «å廲åé穲籬驪鱺é¸ç¤¼æéä¿å³å©å¨å³²æµ¬é¦ç裡éç²´è£è±é°é²¤æ¾§ç¦®é¯è¸é´é³¢é鱧æ¬åååå±´ç«åæ¸ä¸½å©å±ååæ²¥èä¾å²¦æ¾æ¥æ²´ç èé¶ä¿ä¿ªæ æ ç¬ç
èè赲轹é¦å¨³æ§æ æ æ µæ¶ççç ºç ¾ç§è
å³å©¯æ·çç¬ ç²ç²è¸èååå¤æ£ç¢è è©è·é³å¡æ
æ®æº§èèé鳨å¯å²æ¦æ´ç®ç¶è§åµææ·ç¯¥é·é´å·æªªæ¿¿ç磿é¸é¬å®ææ«çç¡ç¦²è å¦å£¢ææ«çç
礪è¶éºæ«ªçççªçç¤«ç³²è £å·ç§ç¤°é
é·
éºåæ¦èºè½¢æ¬è®è½£æç¥éé±±éçä¿©å嫾å¥è¿å¸ææ¶è²é£æ¢¿è裢亷å¹å»æ
©æºæ¼£è®å²å¥©çè¦åå³åæç£è¨è«è¤³é²¢æ¿æ¿ç¸ºç¿´è®èèæ«£ç«è¯è蹥謰éé°ç°¾è è§é¬é®é°±ç±¢ç±¨æçè¸è££æ槤çè¹å¬ææèé»è¥ç¾·èèç»å¨ç¼ææµ°æ®å 媡æ¹
è°é¾åæ¥ç
çæ½ç¨´ç·´æ¾°é¬æ®®ééç²é°æçºç°è¯ä¿åæ¢æ¶¼æ¤è¾ç²®ç²±å¢ç¶¡è¸æ¨è¼¬ç³§ä¸¡ä¸¤å
©å¡å¢æè¼è£²ç·è½éé亮å´è°
è¾å¨æ¾æ¹¸éç
·è¼è«è¼é蹽辽çèå寥嵺å»ææ¼»èå¹å«½å¯®å¶å¶ææ©æ¹ç ç¼é¼æ¸çç窷è«çç«é£é¹©å±ªå»«ç°ç¹èè±è³¿è¹çéé«é£é·¯éééè¼çé½äºå°¥å°¦çæå°æçå§æ¯æååå£å½å½å§´å³¢ææ´è¢è¿¾åæµçç®æ©ççèèè£ç
çèè¶å·¤é¢²å 鮤î¡é´·æ¸çµç£èºé¬é¬£é±²å¸é»æ临åå´ææ·æ½ç³ç²¦ç³ç¢ç®ç²¼é°é£å¶æ½¾çé´æ´æ½ççè¾éçµç£·è¨ç¹ç¿·éºè½å££ç¶é»é³é©éºé±è»äºç¨å¯ååæ廩廪æææ¾æªæª©çç顲åæ¡æèµçè³èºæ©çè¦éµçèºè¹¸èºèºèºªè½¥æ伶å¢çµå¹å½å¤å§å²å²ºå½¾æ³ çèæ¤ææç²ç´åçç ±ç§¢ç«ééµé¸°å©å´ææ£æ·©çç¬ç´·ç»«ç¾ç¿èè²è±èè¡ç¥¾è©
è·è»¨è¤è£¬é´éé¶é¾ç¶¾èè¼éé§æ¾ªè¶ééé¿é²®é´é¹·ç¯ééé½¢ç®é
鯪åè¦é½¡æ«ºé½éæ¬ç§éº¢é¾é¾è¢é¢é 嶺令å¦å¤ç©æºçåæ² çæµæµçæçç±ç¡«è£åª¹åµ§æè¥è
éé¦éªæ¦´ç é£åç¬ç¤ç£éé§ é¹ æ©ç¢çé ç
è駵å æ°çè°éé¦é¤¾éºéé£é騮é£
鰡鶹é©æ³æ æ¡ç桺绺é綹ç®ç½¶é¶æ©®ç¾å¬¼å
ç¿å¡¯å»æ¾ç£é¹¨è¹é¤é¡é£é¬¸é·ç¼ç
åå¯é¾å±¸åæ³·èæ½æ çè§ç¬ç »ç«ç¬¼èéæ¹°å¶æ§æ¼è¯ç窿ç¯é¾å¨å·å·ç§è¢é§é³æ¨æ§æ«³ççç礱礲襱é¾ç± è¾è ªè ¬é¾è±
èºé¨éé©¡é¸éåå
æ¢å±é´å£å£ æç«å¢æ¢ç¡¦è¡å¾¿è´å¨å»å©å½æºèå楼åå»æ
ºèé±æ¨ç¡è§è¼çè¬èè»è¬±è»é«
é»é«åµæå¡¿å¶ææ¼çç¯ç°éå±æ¼çéî ´çºç»é¤é²åæ¸åæ¼å¢åºè¦åæ¦æ³¸çæ èªè½³è®é¸¬çè»é¢
é©é²é²ç§å§å£å»¬æçç¹ç·è櫨ççèçç±çºç½è«è ¦è½¤éªé¡±é«é±¸é¸é»¸å¤èæææ³é¹µç¡µé²èå¡·æ»·è¾æ¨æ¾é¯ææ©¹ç£ é¥çæ«æ°è£éèªéªé¥å¥çªéä¾å´å½å½å³åèµè¾é¸å¨½æ·æ·¥æ¸ç¡èé¯é¹¿æ¤ç祿ç¦åå¹å 滤çç©ç¢ç¨è³è·¯è¼
塶å»ææ¼ç®ç²¶èæ®æ¨çèè觮趢è¸è¾éæ½ç©èéé²é´çç°è°é´¼æ¿¾ç°¶è¹è½é¨é¹ç°¬ç°µé鯥鵦鵱éºé´é¨¼ç±è§»èé·ºæ°é©´é¾æ¦é馿æ°è¢æ«èæ¥é·é©¢ååä¾£é侶æ
æ¢ ç祣ç¨é屡絽ç¼å±¢èèè¤é履褸å¢ç©ç¸·ç©å¯½åå¾å·èç绿åµæ°¯èç¶ ç·æ
®ç®»å´ç¹æ«çé¢åªå³¦ææ ¾é¸¾è滦é®éµå奱åå¿å·æ£æ«æ¬çç¾è åç¤èé¾ç´çµé¸åµä¹±é äºæ ç¥ç§é稤稥åéé¢æ½æ¡æä»ä¼¦åµæ²¦çº¶ä¾è½®å«é¯å婨å´å´ææ·ªèæ£è
ç¢ç¶¸è¦è¸è¼ªç£®é鯩ç¨è£è®ºå¨æº£è«æé ±åç½å°ç¡è¶èé»æ¤¤è
¡é£ç®©éª¡éèºç¾
覶éå¸è¦¼é¨¾çè¿éæ¬é¸ç±®é¼é¥ é©åå®ç ¢è裸躶ç°è èææªç³æ³ºå³æ´ç»è¦éªæ´ç笿絡è½æ漯çé駱鮥éµ
濼çºé±³å¸å£å¦åª½å¬¤å¬·éº»ç²å«²è´çèè马ç¸çç è馬溤çé¤çªç¢¼èé·é·é°¢äºæ©ç¥ééªååç°å榪禡罵駡礣é¬ååååè¶é¾ä¹°è¬è²·åªèé·¶å¢è¿ä½
売麦åèè麥è¡å±è³£éé¡é¢é¢é¡¢å§æè®æ
²æ±é¦æ§¾æ¨ ççéé¥
é³é¬é¬é°»è »å±æºç满滿è¨è¥èéçæ¼åè°©é¤å¢å«å¹æ
¢æ¼«ç缦èèç³æ¾«æ¾·é縵è謾éè°ç¤éåå¿æ±èå°¨ææ§ç²åæ¾ç¬è«å¤å¨æµçµç»ç¡é¯éçèé©é§¹èè½è¾è»å£¾æ¼èè åç«è²æ¯çæ¯æ¯æç¦è
æ渵è»é
å ¥èé緢髦è¥é«³é¨èé¶åå¯å¤æ¼å³æ³èæ´é笷è©éåçè¼åèåçè´¸è袤è¦åª¢å¸½è²¿éæææ¥æ¯·ççè²é®èæååº
å濹å°ä¹ç¦å
æ²æ²¡æç«èºæ çèèæ¢
ç»è¢é¿å ³åªåµæ¹æ¹ç¸çè¿æ¥£æ¥³ç
¤çç¦è
塺æ§é
¶é
é¹ééå¾¾éçæèªé¶¥æé»´æ¯æ¯åç¾æ´æµ¼åªåµæ¸¼åªºéå¬ç躾é黣妹æºæ²¬æ§ç¥è¢çåªå¯çè·é¬½ç
ç¸éé
ç¯èåæ¤é¨æªç£ééé
æ«èçç©éèé·çæ¶æªçææ£ä»¬åæ¹ææ°ç¿è»å¡åº¬ç½èèè 夢æºçéºçåæ©ç¢èè±é³é¸å¹ªææ¿ç´ææ¦æª¬æ°çç¤é¯è¨é¹²çéé¥é¡é¸åçç¾èé°èè¢é³æµè é¯é¼å梦夣æé¥é¿è¸åªçå弥祢迷袮çè°è¾è©¸è¬éå½æç³ç¸»éºéºç¦°é¡ç¼éºç¢ææ çè¼é¾é¾é¿é¸éç±³ç¾èä¾æ²µå¼æ´£æç«ç²èç¯æ¸³èèèé¤æ¿ç°åçå糸汨æ²å®æ³è§
å³ç¥å®»ç§å¯æ·§è¦è¦å¹è°§å¡å¹è¦å§æ¦æ»µæ¼çè¤èé¼åªæ¨å¹¦æ¿èè¬æ«ç°ç¾å®èç å©ç»µåªæ£ç¶¿ç·è±è嬵檰æ«çççä¸æ±
å
æ²é»¾ä¿åç娩ååååææ¹ç¼
èè
¼ç·¬é®¸é£é¢ç³éºªéº«éººéºµåµèåªæçé¹å«¹é¶é±æªçç§æ·¼æ¸ºç¼ç¯ç·²èéå¦åºç
ç«åº¿å»ä¹åå©å¶åçè¦æ£æ»
èèé´å¹æ±ç篾æ«è è¡éé±´ç±æ°åå§å²·å¿ææ»æ¼çè çç¿å§ç½ å´æªççç¼æçç»ç¢é±ç·ç·¡è³¯éé´é²ç¿åºå¡éµæ¿æ³¯åæé½æ¯æ笢笽湣éææ¯é»½é©å¶æ
æ«æ½£ç°¢é³è é°µåæ鸣洺çèå¥æç³ééå«æºç½èææ¦ éé³´çèè¦ä½²å§³åæ
é
©å½æµè©ºè°¬ç¼ªç¹è¬¬æ¸å¤å°è°å««é¦æ¹æ¨¡è麼麽æ©é¹æ©
磨糢謨謩æµé¥å©èèé«éåé¥æ¹æ¡éº¿æ«å°å½å¦ºå¸æ½æ¾æ¿æ®æ²«èéå¸æ©æºççç¿ç 秣èè«ç½ç²çµè¢¹è¨è²å¼å¡»å¯æ¼ è¦è²ééºå¢¨å«¼æ¯ç¼ççéé©é»ç¸¸é»è²è¦èéç
é©ç¤³çºè±ä¹®åçä¾åºææ´ æ¡ç¸è°é¾è¬ç´éªé´¾éº°è±ææ¯æ¯ªç墲æ°äº©ç¡å§æå³ç³ççèå¨ççç ªç®é§è¸æ¨ä»«ç®å©æ²çå¶çç§è毣è¯èé¼åèºé®å¢å¹å¹æ
æ¥ç¦é¬æ
æ®æ¨¢èéç©éªæä¸æ¤§ææ¿æ誽éé¿ä¹¸åªé«å
é£å¶å¦ 纳èå¨è¡²é ç´è¢¦æºç¬è±½è»è²éå±è³é¹é¶è
çæ¨å»ä¹å¥¶è¿æ°ç妳廼迺å·é¢å¬å¥æ°èè渿é¼è¤¦èé¼å¡ç·æ©ææ¬ä¾½åæå¨çè®é¾åéææ¥ ç
µè«µé£èµ§ææ¹³è³è
©è»æå©»å乪å¢åè °é¬é¦æ¬é¥¢ææ©æ®ç¢å¾é½å¬æªå¶ææ å³±ç¡éç±è²è©ç¢æ嶩ç¶è¯å¤èéå·ç¿å´æ¼æ©èåè³å æ±å«çè
¦ç¢¯é¹å©¥æ·é鬧èçè®·åæç²è¨¥å¢å¨é¦è
é¤é®¾é¯å
§æ°ç¾å«©è½è»å¯éªé°å±å¦®å°¼åæ©æ³¥ç±¾åªå±ç§é³éå¿å©æ·£çè棿è·é®èºè§¬è²è¼é鲵鯢éºé½¯è¡ä¼±ä¼²ä½ ææ³çè¨æ
æææ²å´é¨é¦ååé¬æ¬è¿æª·é屰氼迡æµèéå¿çç¤å æå«æµæººç¨è
»æ±ç¸è©å¬ºæå¹´ç§å秥é²é®é²¶éµé»é¯°æ¶æ»æ·°è¾ææµç¢¾è¼¦ç°æ蹨èºå廿念姩åèå¨å¬¢åé
¿é¸éé¸èèè¢
é³¥å«è£è¦å¬è¤å¬²å°¿è²ææèå¸å¼è¶æ¿é§æ¶
èè¬å®æèéå¦æå«åµ²é©è¸åæ°æ§·è¸è¸ééå¶ç¯è²éé¢è¹åè¶é³éå¼å½æ«±ç±èå齧å·ç³±ç³µè ¥åè®èº¡é·é¡³éèåæ¨æ°å®åæ§çæ èå¯å¯å¯å¯§ååå嬣æ°ç°è´æª¸è¹é鬡é¸æ©£çä½ä¾«æ³ç¯å¯æ¾æ¿å¦çç汼忸ææ²ç纽æ»çé®ç´è¥ééµå侬åæµè秾農åè¾³å¥æ¹æ¿è½ç¦¯è¿ç© è¥é²æ¬ç¹·å¼ææµçé½ç¾ºè¨åæ§è¨ç³æª½ééè³å¥´ä¼å¥é©½ç¬¯é§ä¼®åªå¼©ç ®è¬æåæ女éç±¹é¹è¡æ§æè¡çèç§å¥»æ¸æç
ç
餪硸é»ç¶éæªæ¢å©æ»åºæ© 诺åæ¿é½æ¦éæ¦ç¨¬è«¾è¹ç³é©æ¦æ§ç³¥ç©¤ç³¯æ¡å¢å¦ç½æ¯®å¤ä¹¯é°è®´æ¬§æ®´ç¯é¸¥å¡¸ææ¯ç°çèé´æ«è²è¬³éé·é½µååå¶è
¢åè¦è
èæ沤æ
ªæ¼å¦ç
趴è¥åªè©æ·ç¬èæ±ç¶ç¢æ½å¸å¸æè¢æ俳å¾æç
æ£çç®è¼«ç°°ç¤åæ´¾æ¹èéç£ç
ç¨æ½æç¿æçè·åª»å¹è°æ«æ§ç¤ç£ç¸è¹çè è¹£éé¶å¢å¸å¤æ²æ³®çåçç¼ç袢è©æº¿é é¬éµ¥è¥»é»ä¹æ±¸æ²è¨è®é±æ»èé¶ååºéæè½å«ç¯£èé³é¾é¾é°è åèªè¦«é«çèææè¬å¨åååºçç®ç°ç®è¢åè«è»³éè¤éº
è·å¥
泡ç±ç°ç ²è¢éºç¤ç¤®å¸æè§æ¸èè¡é
é«éªé«å¹æ¯°èµé«è£´è£µè³ éä¿ä¼æ²ä½©å¸å§µæ¾æ浿ç®é
笩èè¾é¦·å¶é轡å·å´æ¿æç«çæ¹èå ç¿ç¿¸å¯åæ¦æ¨æ³æ²èç °æ¢ç¹ç¡è»¯éæ¼°åé§ç£èææ·ç«¼åèå 弸å½æ£æ¤å°å¡å¡³æ漨硼ç¨è¬é¹æ§°æ¨¥ç¢ææ¾è¼£ç¯·è¨éé¸é«¼èèé¬
çºé¼éµ¬é¨¯é¬éæ§æ·çå»æ½æ¤ªç¢°è¸«æµå·¼é乶å¸ä¸ä¼ä¼¾æ¹çº°é³å¯æ¶æ«æ·çççç æç§ç§ ç´éæç¿èè±¾é½éé¹ééåç£é§é«¬å¼ééé¾æµç¤ç¤é¢é¹ç®é°è岯ææ¯è¶æ¯æ¯ç²ç¬èé«é´å¤å¤å´¥è½è±¼æ¤ç·çµè¾è
æ¦é²ç½´èè±é¦é®å£é®ç¯ºè·è²ç°²ç¾éµ§æé¼è ¯å¹åºä»³å®èè´çé¢è«é´æå½çåå±æ· æ¸æ媲å«ç¤ç¥æ½å»æ¾¼åççè¬é·¿î¡¢é¸çå¨å媥çç¯ç¿©é¶£éªè¼è
æ¥æ¥©è³è«éª¿è¹é§¢é¨è¦è°è²µè«éªé¸é¨é¨å½å½¯æ¼ç¼¥é£ç£¦æ縹翲èµç¥é£é£éç¢è¸éæ®ç篻é¥ç«é¡ 票åå¡åå«å¾±æ
æ°æææ¼ç¥ä¸¿è¤é
嫳å§æ¼ç¤ç©¦é¦ªé©ç贫貧çå«é¢é »å¬ªè²å¬ç颦顰åæ¦æ©çæ±å¨èä¹ç¹ä¿æ¶ç ¯èµç«®é ©å¹³è¯åå¯åªå²¼è¹é±å±å¸¡æ°æ´´ç¶è娦ç¶å±å¸²æ·èè²å¡å¹ç©çç¼¾è è±è¢è©è»¿é²å´æ
¿ç®³è¼§æé®æªç°èéå¡å²¥æ³¼å¨éé¢æºé
¦æ½é±éºå©åè¢é±ç¤è¬æ«åµå°é·ç¬¸éé§å»¹å²¶è¿«ææ¢æ´¦çå±çç ´ç ¶ç²å¥¤èªé éåé¢ææææè£ç®å
å£å©å ·çå
ºåä»æ´æµææªçå·¬å·æ¨é ç¡éºé§åæ²éªæé¯å¤åèè©èè¡è±è²åé
ºå¢£çæ¿®ç¨ç©é¤è´çºé·æ´åå浦ç³æ®å溥æ谱潽樸æ°è«©æªé¨èè¹¼é èèçæä¸è¿æ²å¦»ææååæ 桤缼éªå¨¸æ½ææ¿æ¡¼æ·èææ棲欺紪è¤ååæ
½æ¦¿æ§æ¼ç·æ
¼ç£è«è¸¦è«¿éè¹ééé¶äºç¥é½å»å²å²å¿¯èªäºå
¶å¥ææ§ç¥ç¥èµç§ç«åææèèèèèé¢å¼å´å¸ºææ·æ¸çç¦èè·è»é®éªéªåµæ£æ£ç¦çªç¥ºè´æç¢ç¢è¤éé 鬾鬿æ粸綥綦綨ç·èèé½ç禥è²è¸è§é¡é²¯æ æ¿è檱æ«ç°±èé¨é¨é³èé¯éµ¸é¶éºç±çºè©è é¬é¨¹éé°ç麡ä¹éä¼å±ºå²èå¯åæççåè±èµ·åååå©ç»®æµæ£¨è£¿ç¶®ç¶ºè«¬ç°¯éæ°è®«æ°æ±è¿å¼æ±½çµèå®æ³£ççµå å¥ç è æ æ°£è¨å欫夡ææ£æ¹æ¹èºç¢ææ£ç碶åæå¨æ©ç£ç£§ç£©èºç¤ç½è¿æèæ¤è·é
éå¶å¾å¸¢æ°æ´½æ®ç¡æé«åä»é¡å±å²å¥·æ¦æ±èè¿ä½¥å²æ汧è¾æ¬¦ç«è¤éæªçµç²æèè°¸é
å©å¯ç½éºæè°¦ééåæç¾ééªé¹æ
³æ´æ¼æç®è«é·è¤°è¬é¡
檶æææ«ç°½é²éµ®æ騫é±é¬é¬ç±¤éä»±å²å¿´æ²æä¹¹åè¨é¤æ¬èé±é³ä¹¾åæ®æµè»¡åªéééå¢æ¦©ç®éæ½ç¾¬è橬é¢é»éé»é¨æ¿³é¨çç±é°¬åµæµ
è·æ·ºåµ°æ
é£æ§èè¸æ½è°´ç¼±ç¹¾è´éæ¬ åä¼£è¡ä¿èå©æå ååµæ£æ¤ åçè¨å¡¹æ綪è³å槧ç¯è¼¤ç¯å£å¬±ç¸´åç¾æææ¨æªç±ç¾çç·è·å´æ¤çè
å溬è£éå¶æ§æ§çç²ç¾«éµç¯¬éè¹éªè¹¡ééé¹å¼·å¼ºå¢å«±è·æ¨¯æ¼è墻å¬å»§è檣çè¬è¢è æ¢ç¾æ¶ç¾¥å¢æ¤ç¹è¥ç¹¦çå´çç¾»å
ç©æç¡é»é嵪跷é¡é¥åæ²è¸é¹å¢ç¢»é 骹墽幧æ©ç缲磽é«é¬ç¹ç¹°è¶¬è¹ºè¹»é°ä¹ä¾¨èèæ¡¥ç¡è¬å¬çåæ§è°¯åºå«¶æèé樵æ©ççç§ç¤è®è趫éé½é¡¦å·§é¥æé«ä¿è¯®éå³å¸©çªæ®¼ç¿èªé«åºæ¬æ½ééç«
翹é©èºåèç¿èèºä¸å妾æ¯å§çªå¿æææ´¯æ¬æ·ç¬¡æèªæ
箧ç·é²é¥ç¯è¸¥ç©èé¥é¯éç«ç±¡äº²ä¾µé¦è¡¾éªè³åªåµç¶
èªå¶è¦ªé¡é§¸é®¼å¯´åºè©è¹åç¡ç秦è¹è¦èæ¦ç´ç¹ç¦½ééå¤åªå«æº±é²åææ³é³¹ææªæ¾¿ç½èæè å
æç¬æ¢«èµºèµ¾å¯éå¯å¯¢éè¼å¢å£ææ²åè£æ¿æ¬½ææ³çè½éé氢轻å¾å¿é¬åå¥æ°«æ·¸æ¸
軽å¾å»è»è¼é²é¯éå¤ç å åæ
æ®ç¡æ´î¡æ£¾æ°°èæææ¨ææª é»¥è顷请庼é æ¼è«î¡æª¾è¬¦åºåæ
殸ç¢ç®éæ
¶ç£¬å¬æ¿ªç½æ«¦å®è·«éåéç©·î¡ç©¹èæ¡ç¬»çèµ¹æ¸çªçç¼è¼è©è¬ç
¢ççç窮åææ©©çèçç«èçä¸ä¸ é±åµæç§ç§å¯è¯åªè©æ¥¸è²é¹ç¯ç·§èµç©è¶¥é³
èé¦é§èî¡é°é°é¶é±é¾å´åæç°çæ¹æ±èæ±è¬æ³
è¯ä¿
è§è¨è¨
é
åæµç´èéééæ¢æ®æ¯¬çèµé»å´·å·¯æ¸æ¹ç³çéç
ªçµ¿è·è£å·°è§©è³çè¤é¶éé®é¼½é¯éµè ¤é°½æç³åºæ²ä¼¹ä½å¤å²è¯é¹é©±å¥å±å²¨å²´æ¾æµç¥è 袪åè躯ç粬èè©è¶å¶é§ææºèª³é§éº¹é«·é¼è¶¨éº¯è»éº´é»¢é©
é°¸é±ä½¢å¬æªææèèè¡é¸²æ·æ¸ çµç¿è軥èç磲è¶é´ç©ç¿µè鼩è§å·å¿çæµæ¬æ°ç±§èç¯è ·è¡¢èº£è ¼éºé¸åç«å¨¶ç´¶è©ç«¬èºé¾é½²åºå»åå¿è¿²é¥èéè§è¶£é´éº®é覰覷é¼è¦»å³æ®æåå棬駩騡éå
¨æä½ºè¯ å§¾æ³æ´¤èæ³ç·è¾å³å¢å©æçç¡é¨æ¹¶çççµè
è²æ¼æ¥¾çè§ è©®è·§è¼è·é権踡ç¸ééé³é¬åå·é°æ¬é½¤è ¸é¢§é¡´çç¬æ±±ç½çç绻綣èåå¸å·»ç¶æ¤¦å§éå¸ç缺èç¸å´å»åå´
æ«éç¡ç¡®èéå¡æçµç¢éé¹æ¨æ¦·å¢§æ
¤æ¯ç¢ºè¶ç©éç¤ééµ²ç¤å¤å·å³®é¡è¼å®å¸¬è£ç¾£ç¾¤è£ 亽ç½åå¥è°è¡»è¢è¦è¢¡èºç¶é«¥å«é«¯çç¹ååå§èæç媣è
橪穣å´å·ç¼ç½è禳ç¤ç©°èºé¬¤å£å·å£¤æççºè®©æ¹è²è®è饶桡èæ©è¥é¥çªæ°å¨é¢å¬æ¾ç»é¶ç¹æ¹çç±äººäº»ä»å£¬å¿æ²å¿ç§è¢ééééµå¿èæ æ £èµç§¹æ£¯ç¨ç¶èºµåå认ä»ä»è®±ä»»å±»æ¨çº«å¦æç£çº´è轫é§é¥ªå§ç´è¡½æç´è¨è»æ¢è¢µçµè
èéé±é飪èªé¤æä»è¾¸ç¤½è¿é¾æ¥é©²å¸é°é¤é¦¹æèæ ç¨ç»èè¸è£å®¹å³µæ¯§ç¿åª¶åµçµ¨ç¾¢å«åµ¤æææ榵溶èæ¦æ¦®çç¢ç©è¾è¤£éæ°ç¸èè駥髶嬫嶸çéçæ§è åå®å軵ç©å¹ç¦¸æç²åªææ¸èçè
¬ç³
èè¹è¼®éé£ç騥é°é¶æ¥ºç
£éèå®å¶¿éå¦ä¾å¸¤è¹æ¡è¢½é·æ¸ªçèé£è åé´å
嬬åºæ¿¡è·é´½æç¸è¥¦ç¹»è 颥é¹é¡¬é±¬æ±è乳辱éå
¥æè¾¼ææ´³å媷溽ç¼è鳰褥ç¸æ©å §æå£é®æ软èåè»åªæçè
å«°ç¢ç·è¡è¼çç¤æ¡µç¤ç·è¤èèæ©¤ç¹ èèæ±è®æèéçè¹ç¿é³éå¡å£¡é°æ¶¦éé 潤æ©æ¼æ¼åè¥åå¼±é婼æ¸ç«æ¥åµ¶è»ç®¬ç¯çé°é°¯é¶¸ä»¨æ¡¬ææ´è¨¯é¸æ½µçå
éé£èè¨éæé¡é¦ºé¢¯è©æ«æ 毢æ¢æå¡æ¯¸è
®å¥å»é³é¡é°å®èµå¿è³½ç°ºèä¸å¼å毵毶å毿çé¬å£ä¼åæ£ç³ç³é¦æ©µç³ç³£ç³¤ç¹éé¥ä¿éæ¡æ¡æ§¡åæ¡ç£è¤¬é¢¡éé¡ä¸§åªæ»æ
ææºéªç¼«ç¹
èé³é¢¾é¨é¨·é° é±¢æ«æå«å½çæ°çé«è²æ´æ 涩å¬æ¸é¯éæ®çåçæ°é«æ¾æææ¿æ¿ç·ç©æ¾ç±ç穡繬穯è½é¼è
é£è£è森槮è¥ç¯¸å§é¬éªç¸ææ²çº±ä¹·å¹ç å¦æ±æ®ºçç²ç´èé©ç§ç¡°è±è£æ¦æ¨§é¦é²¨é·é©é¯é¯ç¹ºå»åç¹å½å¼å¥å¸¹èå¢æç
ç¿ç®ç¿£é¯éç篩ç°ç°ææ¬å±±å½¡éå¸å åªææ£èå§å§è¡«éåæ»ç¦çè¢ç»çè è»ç¬é¤éè·å¼æ§åå¹ç
½èªæ½¸æ¾ææªç¸¿è»é¯
羴羶éªéç¶ééæ±ç
çç覢讪æ±çè«å¡æè¨èµ¸åå椫ééªåé¯å¢ 墡缮å¬æ
æ¾æ¨¿è³ç£°è¬î¡î¡èµ¡ç¹è®èºè±è´î¡é¥é¥é¨¸é³çé±é±ä¼¤æ®åæè§å·å¢æ
¯æ»³æ¼¡è殤çµèªè§´è¬ªé¬ºè£³å§ææèµè³éä¸ä¸ä»©å°å°æ¦ç»±ç·å¼°æ梢ç§è¦ç¼ç½ç¨æç²èè¸è¼è±ç颵髾鮹åºèèæç¿èé¶å°åå²éµç»å¨å¨è¢ç´¹ç¶¤æ½²å¥¢çèµç²è¼è³è³æª¨èä½èµèè¥èæ¨å设社èåå°æ¶æ¶»æ¸è¨èµ¦å¼½æ
æææ» æ
´æµèè éé¨æ¾æçéºæ¬ç³å±¾æ伸身ä¾å»å¦½ç±¶ç»
ç½è¯å§ºææ° ç
ç©¼ç±¸å¨ å³·ç¡çç ·å 深紳å
椮è è£è¨·ç½§è¡è©µç§èçè駪鲹é¯éµ¢é¯µé°ºç¥æ¦é®é°°é¥å¼ææ²å®¡ç¤åç§å®·è°è°å©¶æ¸è¨ 審è«é £é«æç«å¬¸ç覾è®
è¾ä¾ºæçèæ¶çæ¸ç¥³è¤è
æ¼æ
椹çè滲é ç®åçé©å声æææ¡æ³©è¼æ®
ç²çç«èéæ»é¹ç¬æ¹¦çºç¥éè²é鼪鵿æ¸ç»³ç¸æ´æ¾ 繩è鱦ççå渻å£ææ å°çå©åçè²¹åµèå¢æ¦ºè橳賸尸失å¸åè±è²è¯é¿é¸¤å±æ½æµç®å¸«çµé¶æ¹¤æ¹¿è¹æº®æº¼ç
èèè©©éç¡é
¾é³²ç®·è¨î¡é³¾è¤·é²ºæ¿é¦é¯´é°¤é¶³è¥¹ç±éå饣ä»ç³è¾»ä½¦æ¶ç«è¯å®å®æ¹é£ 姼å³æ¾ç»ç¥èé£åæè³å¯æ¹éå¡åµµæº¡èé實榯èé½ç¯é²¥é®é¼«èé¼é°£å²ç¢ä¹¨è±ä½¿å§é©¶å
宩å±ç¬¶æ¦éé§å£«æ°ç¤»ä¸ä¸ä»å¸ç¤ºåå¼å¿äºåæºäºä¾å¿å©æ¹è§è¯é¥°å室ææææ¯æ°æ¾æ¿çè´³éæ »ççç¡èè½¼éé笹è¦éå´¼å¼å¾¥æ谥貰éå¢åå¼ç
¶çç®è§¢è©¦è»¾é°é飾èè¤èªé©å¥é´å¬å¬æ¾¨è«è«¡é¾é¤æª¡è«è¬ç°ç±è¥«éé°é½å
ç§åæ¶ææå®å¨é¦è寿åç©å
½å®ææ¶ç»¶ç©è壽ç¦ç¶¬å¤ç£ç¸é书殳æ纾åæ¸æ¢éå§æååæ¸æ®ç´æ梳æ·çè½è»éççèæ
毹毺ç¶è¾ç¹è·¾è¸æ¨è¬è¼¸æ©¾é®åµæç鵨å°ç§«å©å°èµå¡¾çç¹è´ææé»ç½²é¼ å±é¼¡èæ½»è¥è¯æçè·è¥¡ç³¬è¥©ç±è ´é±ªé¸é±°æ®æ¯æææ²è¿°ä¾¸å°æ·æ ç«èæ庶庻çµèè¡å°è£æ°ç«ªè
§é¥å¢
æ¼±æ½æ¸æ¾è±æ¨¹æ¿é°é£é¶é¶èªå·å°èèªè¡°æç©å¸
帥èåé©æ´éæ 涮è
¨åæ»ééå骦å騻æ¬ç¤µé·é¹´è驦é¸ç½å¡½æ
¡æ¨ç¸é¯çè°è½èª°æ°µæ°´æ°ºé帨æ¶æ¶ç¥±ç¨
ç¨è£ç¡å®æ¥¯é¡ºèé è£æ©çç¤ç¬é¬è¯´å¾èªªèª¬å¦çæé欶ç¡çåæ è´å½æ§ç¢©ç¡ç®¾éçé å¶çºä¸å¸ç³¹ç§åæ³ä¿¬ææè鸶媤æ¯çµ²ç¼è³æ¥ç¦é°é£åå®æ¦¹ç¦ ç½³è¤é¯é¶å¶åå»ææ¾ç£ç·¦è¬éçèé¶èè´é¢¸é¨¦é鷥鼶æ»å·³äºåç½å¯ºæ±ä¼ºä¼¼ä½å
å§æ³¤ç¥ä¾¡å æ³é¥²é©·ä¿å¨°æ±æ¶ç梩æ´æ¶è飤笥èé²ç«¢è¦å£èè²é»é£¼ç¦©é§è¼å©é¨çè¦ä¹ºå¿ªæ¾ææ©å¨æå¯å梥崧庺æ·è嵩硹èæ½æª§æ¿é¬æææè¸ç«¦å±æ¯åµ·æ
«è³é§·è®¼å®î ªè¯µéé¢è¨é 誦餸é¹î ©åæéåå»å»æ溲çèèé¦é£æé¼èèééªé¤¿é¢¼é¨ªåååå¾çæè®æ»èªæ«¢ç¶èç¦é
¥ç¨£çª£ç©é¯èè櫯åä¿çå¤è¯æ³èæ´¬æ¶çç´ é宿æ¢æ®ç²éªåç²è¨´è°¡åå¡å¡å«æ«æº¯æº¸è
é¡é¹å³æ¬æ¦¡èè觫è¶é¬ææ¨æ¨æ½¥ç¢¿éé¤æ½ç¸¤æ©çç°èè¬è¹é©é±é·«ç»ç é
¸å´ç¥ç¬çèç®å¤èè½å å¸æµ½è½è¾çè°æ»ç¢ç£æ¿éé绥éééç¶é¨çè¸ç¡é«é«äºå²ç ç¥ç²è°å£åµèºéæ²æ³ç
«çç¢é§å¬æ¾»ç©èª¶è³¥æªç§ç²ç¦ç©ç©ç¹è¥éæç¹ç¹¸éè¢é©åç²èªå«é£§æç»è飱æ§èµèçæç¬é¼çæ榫箰簨é¨é¶½å·ºæ½ åå¨èåæ²æ¡«æ¢çå¦ç¾§èæ缩è¶ç°ç°ç¸®é«¿é®»æå¢ç´¢ççæ¢éå©ææºç£ééé»é¼éé¤æº¹è¶ä»å®ç ç¥å趿éå¡æ¦æº»éè¤è¹¹ä¾¤å¡å¢çé®é³çºé°¨î ¯æç§é¼å´æ¶¾æ¨éé¢é榻毾禢æ»æ¾¾èª»è¸åéåºæ¿è¹ééé³é¥è¶èº¢è¥¨å¼å¡éªçèé§å°æ²é°å®æ¬èç±ç²èè·é²ç®èºé¢±åé®å¬¯æ¡è¹æª¯ç±å¤ªå夳忲汰æè½éæ³°ç²è¦é
é¦æºæ
ç¤åè´ªæ¹å´çè貪æ滩å½æ½¬ç«æ¹æ¤çç±åæåè°é¯å©æå¼¾è¦æ¦ç°é¬è°å¢°å¢µææ½è«éå£ææ©éæªé¡ç½è«å£èè²é°è ç½é·¤å¿å¦è¢é½è¼æ¯¯éå¿æ³æ»æºéç®è¥¢å¹çå®æ¢åæ¹ èµåå碳èæ¢æ賧汤é´æ¹¯å¡åç¾°èªèéè¹éééºé¼é¥§å£åå ååºæ£ éå¡åµ£æªæºèé榶æ¼ç
»çç¦è
æ¨ç£ç³èæ©ç¯ç³è踼ç³è³èµ¯é£é¤³é餹éé¥é¶¶å¸ååæ·å¥è¥èººéé²å»ææç£çéç«æ¥è¶çä»å¤²å¼¢æ¶ç»¦æçµè©å«å¹æ
æ¯æ»æ§ç«é¬é£¸ç¸ç¸§æ¿¤è¬é±éé¥å迯å·æ´®éæ¡é¶å梼æ·ç»¹è祹裪綯èªéééé¾é駣檮é¥é¨é¼è®¨å¥è¨çå¿å¿ç¹è²£è¦çé½æ
é±èè¯é¼ç¼çå¹è
¾èªæ¼æ»é縢è£é§¦è¬å¯è¤é¨°ç±î¡é°§ç±è
é©£é¯åæ°å梯é踢é»é·î¡¡é·å绨åç¶å¼åªå´¹æ¿æ渧ç¨ç¼ç½¤éé¹åç
ç¶ç¢®å¾²æ¼½ç·¹èèé¢è¶§è¹éè¬è¹éé³é´ºé¡é®·éµé¨ 鯷é¶é¶ä½æ®èº°éªµè»é«æ»å±åæ´åææ¶éå±æææ¦é·ææ¥æ¿æ¥´è£¼è¤
æ殢髰èåé¬åçé¬ç±é趯天å
²å©æ·»é
éé»éç°å±æ²ºæ¬ççç·èç ççè¾æ¹å¡¡å¡«æ·é碵ç·ç£çª´é´«ç³éé·é·å¿æ®ååºæ¿æµæ·æªç è
è§ç¶çèé¤è¦¥è³éªé¦æç±ç¼èæ«ä½»åº£ææ祧èèæ¡å²§å²¹è¿¢ç¥æ¢ç¬¤èè¨é¾æ¨¤è©éé髫鲦è©é¯é¥é½ 鰷宨ææèçªèªçª±å¬¥çºç²é«çµ©è¦è¶è·³é «ç³¶æè´´èèè²¼è·éèéå£éé´©é¡é¢éµé©å«å¸é£»é¤®å
åºæ±è¼å¬çºèåç桯ç´ç¶éè´è¼å»°è½å»³éå»·äºåºèåå©·åµæ¸ç³è¶èæ¥æ¦³é®éè¤è諪鼮å¢ä¾¹å¨æºæ¶æ¢ç¶ç½è¡é¤èé¢èèªéé ²æ¿ä¹å²çµéçåµèªæ¨ç¥ä»åä½å½¤å³åºåçªè¼ææ¡æµµçç ¼èç®ç§±é童粡絧è¡èµ¨é
®éå®åéµé
é¤é²æ½¼çææ£æ©¦æ°çè§ç³ç©é®¦ç»æ
桶ççµ±ç©ç¶æ¸çæ
æ
å·å¸å©¾åª®é®äº 头æ骰緰é 妵ç´æ¨æ®æ¢é»è£éå¸ç¦¿ç§æ¢çªåæ¶æ¸å æ¹¥çèå¶éµéµé¼µå³å¾å峹庩å¾æææ¶è¼éå± æ¢æ¬ç¨å¡åµçç¡è
¯è¤é¯ååå»æ½³è·¿é
´é¦é駼éµé¶é·é·µåå¡åæ±¢éé·å
è¿å
èµå èéµµæ¹ç¯ç
è²å¢å£æå¬å¸å塼æ
±æ¶æ§«æ¼ç¯¿æª²éç³°é·é·»åçå½æ¹ªè¤æ¨è·è¬é¢é¤å°µé ¹é ºé ½é穨è蹪ä¿è®è
¿åè¹éª½é娧ç
ºè»è褪駾ååæ½æ¶åæçæ¾é»å±¯å¿³è饨è±è±è»é£©é²é¨éèèæ°½ç½åä¹è®¬ææ¡æ±é¥¦æä¾åæææ²°ä¾»æ©æè袥è¨æ¶¶è«è±é£¥é¦²é é©é©®ä½ééå¨å²®æ²±ç迱驼æç £ç ¤è¢é¸µç´½å ¶è©è·é
¡ç¢¢é¦±æ§é§è¸»é§é§æ©é®é´é¼§é¨¨é¼é©é¼å½µå¦¥æ¯¤åº¹åª æ¤æ¥å«·æ±æ©¢éµé°ææå¾èè·
毻箨èç±å±²å¸åå¨å¾æ洼娲ççªå媧åèæ²æºæ¼¥çªªé¼æ¨ç¦ä½¤é·åç²ç è¢èå¢è
½è襪éé¤æªî å竵崴å¤é¡¡ä¹å¼¯åå© å¸µå¡æ¹¾çè¿æ½«è±å½å£ªç£ä¸¸åæ±çº¨èå®å²å¿¨æç©ç¬ç´æ顽ç·ç貦é éå®ååæ½æçèå¦å©ææ©æ¢æ¶´ç»¾èèæ¼æ¤ç¬çç¹ç¢ç¶©ç¶°è¼è¸ ééä¸åå妧æ¤æ¥è
è¬ç¿«éèé½è´é«è´å°£å°©å°ªå°«æ±ªäº¡äº¾å
¦ç仼彺è£èç½å¿¹å¾å¾æç½æèµæ棢ç¹è§è¾ç¶²è誷è¼çéå¦å¿è¿æºç³ææ¢å±å¨çåé¶ééå´åªåªæææ»æ¸¨ç
è¨è³å¾®æ¤³æ¥²æº¦ç
¨è©´ç¸
è覣嶶èç°é³çå·é°é°å为é¦å©å´å¸æ²©è¿é±å³å³æ´çºéæ¡
æ¶ å¯å¸·æç»´å¡å嵬å¹æ¹æºç²çéæ½ç¶è¶é¬æ½æ½¿éæ¿°ééé® ç覹ç©éºé»åä¼ä¼ªå°¾çº¬èèå§çç®æ´§å¨æ¤æµè±è¯¿åå½å´£æ¢¶çç¡èé骩åµå»å¾«æç¥è¦è骪骫æ椲ç
çç¿è
²èéªå碨è²è¼é²å¯ªç·¯è¿è«è¸éé è³å°æ¿»é¡é®ªå£é颹ç¢é¡äº¹æå«æªä½å³è¿çèåè»å°ç¡èè°å媦æ¸ç¬ç
å¢èæ
°ççç£ç·èè¡ææ¿çç½»è¡è¬é餧é®è±è¤½é¤µéè¯è½éé¨é³è¶é¥è®èºè®èºæ·å¡æ¸©æ¦
æ®æº«ç¥è¾æ¦²ç豱輼è½é³é¾é¥é°é°®æ彣纹è çç é»ç´èèç³éé«é¯çè馼é°é³¼é´è¡éºé¿èé
鼤é¦é§åå»åå¿æå¡è³ç´æ¡½è稳ç©ç©©é®å¦æ±¶è¬åæ¸èæ¾æµçµ»é¡çºç¿å¡é¹èé鶲å奣å¡åµ¡æ»èæ¡çè¬ç®è¹çç½é½æå涡è´å©æ¶¹æ¸¦ç§èµåçªçª©èæ¾è¸è¸æå©å©æ°ä»´æ²èå§è¥åæ¾åªå¹æ¡æ¸¥ç¥ç¡ªæ¥è
æ¡çæ¿£çèé¾é½·ä¹å¬å¼æ±æ±æ±¡é¬åæå·«å±æ´¿è¯¬é¨ç趶åçªé«éåèªæ誣箼èé´®é¢é°æ æ¯å³å´å¾åèéå娪梧æ´æµ¯è£èç¸ç¥¦é¹ç¡ç¦èèªçéµé¯é¼¯é·¡ä¹äºå仵ä¼å妩åºå¿¤æè¿æ¿æ¦çä¾®ä¿åµæå娬ç¾ç·å¡¢æçç¢é¹ç¦è嫵廡æ®æ½é»åæ©ç鵡èºå
å¿å¡æé¢ä¼å±¼æ¤å²æè´å¿¢ç©ç¹æ误åæææ®ç²
éæ¤çç婺åµç¦éé°éªå¥¦åµ¨æº©é¾å¯¤ç誤é¹é窹é鼿é§é½èé¨é¶©å¤å
®å¿æ±è¥¿è¦å¸å¸æ¸å¥ææç½ç©¸è¸è¹ä¿å¾æ¸è¯¶é饻åå¥å¨å±å±æ¯æææ°¥æµ çºç¶èå½ææ桸欷æ·
æ¸ç¯çççç¡è¥èµ¥é¸åææ°æ³çç¬ççç¨ç²ç¿ç¿è¾éååµ å¾¯æºªç
çè é¡å榽çççç·è¥èªè±¨é¤å»åå¬å¬çèé¤å樨æ©ææç¹çºç»çª¸ç¾²è
èé«ç¨ç ç¦ç¤èè°¿è±è±¯è²ç¹¥éé¯éµè§¹èé¯ééµå·æ¦çç§é
è§½é¼·è µé¸è§¿é´ä¹ éå¸ç¿è¢è§åª³æ¤ºèµèå¶æ¼è¦¡è¶æ§¢è·èé°æªè¬µé´é«é³é£é¨±é¨½è¥²é°¼é©¨æ«æ²æ´çºå¾é£åå¾èè¸é¢å±£æ¼è°éæææ¿æ©²æ禧諰å£ç¸°è¬è¢è¹ç½é±ççºèº§å¸åæå±ç³»é¥©å¬å¿¥æ¬ç»éä¿å¥æç»é¤æ¬¯ç»¤ç´°é³éå¡æ¤èè¶éæ
æ»ç¦ç¶èµ©éçç稧æ¯æ½æ½æ¾è®è¦¤æ±é»æ²ç£¶è©é¤¼é¬©å±éé¼è¡å·ç¨è¾è°ºåéæ®ç
颬çè¦é°å£ä¾ çä¿ å³¡æç çéå³½çç¹ç¨ç¥«ç¡ç¬ç¿èºé¿æºç¡¤éæ³æççªç¢¬èè¾ç£ç¸è¸ç¸èµ®é»è½éééé» é¨¢é¶·éä¸
ä¸åå·çå¤æ¢ºå¦å»ç±è«åæç½
å¤é¬ä»ä»å±³å
奾纤佡忺æ°æ´ç¥ç§è®æ®ç±¼çè¶æé¦è·¹é
°é¨åå²åéé²æ¹é¯å¬æ¸èééç¹è¤¼é±é®®é¦¦è¹®å
廯æè£çºé¶±è¥³èºçºé±»ä¼åé²å¦¶å¼¦è´¤å¸åæ¦æ¶è娴娹婱çµè·è¿è¡å£æ¹ºç«èéé¹å«è¡çé嫺嫻æªææ¾èª¸è³¢è«´è¼±éççè鹹礥è´é¦é·³é·´é·¼å¼çæ¾é©å´æ¯¨ççè¬éºèµ»ç
å°å° æç¦è跣箲èéªå¶®ç«ç®èéç¹é¡å¹°æ櫶èçé
顯ç¦å¿å²èç°çº¿è½éå§å®ªçé¥å¯å·å¨å¨¨å³´ææ¶è§é·ç¾ç¡é¦
ç絤ç¼ç¾¡ç®ç²¯ç¾¨è
ºå©å´ç¶«èª¢æç·é§æ²æ©ç¸£é餡è±éº²çèç»ç³®é¾é°é¼¸ä¹¡èç¸é¦é·å¢åééå»æ¹ç¼èé楿èç®±ç·è·è¥å¿éª§éºæ¬çé¶é±é²é©¤ç¨ä½è¯¦åº æ 祥絴ç¿è©³è·äº«äº¯åè饷æ飨æ³éé¤é²å®è é®é¯é¿é¥é¥é±¶åå§ å··é¡¹ç¦è±¡ç¼¿è«é
åå¨å¶ææ©¡è¥èéé±ç±ç²åºæä¾¾ååæµéªå®¯å®µåº¨æ·æ¶ç»¡èé鸮åå©æ¢ççè§ççç¡ç¡£çªç¿è·éæ±ç¶åææ½ç®«è¸åµæ¢æ¨ç¢é·éå½è®èéé´ç©ç°èèèè¬é´µå£çç°«è°é«å»å櫹é«é·è ¨é©æ¯èæ´¨é©å´¤æ·è¨¤èªµå°ææç±ç¿çæç¯ è¬ç¢åèå¹å²æ俲å®ææ ¡æ¶ç¬å¸åæ©æ»§è©¨åå¨èªå¯æç½æ
æäºæ¥æèè å¦åæªéªåèå¥å¥å³«ææ¹ææ¾è
èè衺åæè°ç²çµç¿åæ¶æºçç¶çèå°æ·æ緳缬è¢é諧ç²æ·éµè¥é·æçºè®é¾¤åå©å¯«èä¼³çºæ³æ³»ç¥ç»ç¼·å¸æ´©ç§ç¨å¨å¨å±å±å°å¾¢æ¢°ç禼紲亵åªå±æ³æ¸«çµçµ¬è°¢åå¡®æ¦æ¦è¤å§å±§æ¬ç·¤é°å¶°å»¨ææ¾¥ç¬ç³è¢è¤éç®è¤»è¬å¤çé¢ç£çè¹è é½é½¥é½èº å±èºå¿å¿é¤å¦¡å¿»î¡è¯è¾ææºæ¬£çºä¿½èæ訢ééæ°æå»é
å·åºå¬èªé¦¨é«é¦«æ鬵éä¼æ½é 伩ååçä¿¡è»èªè¡
訫ç®é¦¸èé¡éå
´çæå¶éªæºç©ç
çè
¥èµè§ªç®µç¯èè¬é®æ觲é¨ç¨é¯¹åè¡é¢å½¢éä¾éååæ´ééå¨ç¡è£ééé¶ééç²éæ¤æå§å¹¸æ§èåèå©æ»æ¶¬å¡ç·å¬¹èå¶å
å
åè讻忷汹å
ææ´¶è·è¸è¨©è©¾éçè¯è©å¤æ»ä¼ä¿¢ä¿®å»åº¥ççç¾è©è鸺è¹è²
é¦æ¨é髤髹éé®´éµé¥é
é£è¬æ½ç¶æ»«ç³ç§å²«ç绣è¢çé溴ç¶ç裦è¤è¤é¹èç¹ç¹¡é¥é½é½
ææ´çç±æ¬¨ç è¥é¡»è¨é¡¼èèè°åªå¹æ欻èé æ¥çª¢é å稰ééåå¢å¬æç¸è¦èæè«èéé©éé¬ä¿å¾è£è®¸å´å§è¯©åæ ©çå¦è¨±æ¹æè©¡é¦ç³éç¨æä¼µåºæ±¿ä¾å¹æ²åæ¤æ«æ´«å¿æ¬°æ®ç
ç¬çååææç¼ç»ªç»é
å£å£»å©¿ææºçµ®è¨¹å
æ
ç
¦ç¶èè³æ§æ¼µæ½ç¢çç·èéç稸ç·èç²èçºé±®è¿å
轩æåºå®£æ
è»æ¢è°å§å¡åªæææè±è²æç
çèç»å禤箮翧èå¬è¿è« 諼é¹é§½ç翾è¼èè èé°è®çç¹çæ¬æçèå«æ¼©æ¶çæªç¿æ¸éçæ
é¸ç£ç¬æ°æ³«æ¡ç«ç»ç©è¢¨éçç´è¡æ¸²çµ¢æ¥¥æ¥¦é碹èéé颴縼ç¹éè´ç¶èé´èè¾¥é¾ç©´æä¹´å¹å¦å²¤å³è泶è¢é¸´è¸
å¸å¶¨æ¾©ç¢è§·é¤é·½éªæ¨°è¤èè½é³é±è¡å·æ´æ³§çç¦æ¡çè°è¶è¬ç¥åååçå塤ç窨èå²å³è«é§¨åå£ç¯è°æç»èçè壦ççºéºå»µå¯»å·¡æ¬é©¯æ询å³ææ´µæµç´èæ 桪毥ç£å±å°å¾ªæ詢馴é©é²å潯æ³æ¨³çç
ççè¥è³é±é±ç¥åè®è®¯ä¼¨æ±è¿
ä¾å¾ç¥è¿¿éæ®è¨è¨è¨å¥å·½æ®¾éæ»è³åè顨é丫åååºæ¼é¸¦æ¡ é¸å²éæ¤é´éé´¨å£éµ¶éçä¼¢å²è½åæçç¬èå å´å´æ¶¯çççè¡æ¼é½çååºåååçé
çè¥åå äºç©µè¥¾è®¶äºç½è¿äºç¡åå¨
æç 俹氩å¡å©æè¨æ æ°¬ç°èåç¨çª«é½¾å½æ¹å¦ççèå£å´¦æ·¹çè¸éæ¹®è
å¿ç
é¢å«£æ¼¹è«å¶æ¨®éé¹å¬®ç¯¶æèé»«è® å延é«ä¸¥å¦è«è¨è¨å²©æ沿çé姸娫ç¿ç è娮ççç¡è¨®ééåµåµî¡£çµç¶èå¡©æ
æ¥è©½ç¢è
é¢è¤é»å³æªé¡é¡å´å£å·ç°·æ«©éºå£§åå·å·å·æ¬ç¤¹é¹½éº£å¤µææ²ä¹µå
å¥ä¿¨å
å½å¼è¡åå£æ©ç¼èé¾é
åµæææ棪渰渷ç°éé椼硽罨裺æ¼è¤æèéå躽縯檿黡å´çé°é¶ 黤é½é¾å¼é»¬é»é¡©é¼´å·æ®é鼹齴黶åå¦è§çªå§²å½¥å½¦ç åå®´æè³è¦éªåæçè°éåå °æ¥ç°ç±ç硯èé椻æ»é³«åå¢æ¥çé
½å¬è°³é¤é´çç諺èµé¬³æé´³é
é¨é¨å¥î¡
嬿è¶è´è»
çé¶é¨´é·çè´è´è§¾è®é¼é¥é©é·°è·çé
é© ç§è®è±è±ç©å¤®åå§æ°æ³±æ®è¦ç秧鸯é éµé
éé´¦æ¬ç¾é¦é³æ¸æ¨ç佯å·æ°ç¡éé£åå¾ææ´ç¾ççç»é½å´µå´¸æèæææ¥ç
¬ç¦ç諹輰é鴹颺éé°é·é¸å¬ä»°ä½å±å¥å²å
»ç´æ°§çç´»å楧軮æ
氱羪é¤é§æ©æçç¢ç¤¢ææææ ·ç¾è©æ§æ¼¾æ¨£å¹ºå¤åå¦æç¥
è¨åè½æ¥è
°é´éç»å°§å°è´åå§å³£è½ºåçç§çªåå ¯æºæ®½è°£è»ºå媱å¾æ®ææçºéé¥æ¿æ榣ç¤ç¶éé£é¤å¶¢å¶¤å¾ºç£çª¯çª°é¤ç¹è¬ 謡éé³é¢»è¨é¡¤é°©ä»¸å®å²ææ³æ®çèå¬æ¼ççª
çªèå 婹崾æºèæ¦é´¢éé¨é½©é·ç©¾è¯è¦è¢çªçè¯è©çè¦é¿çé¹è¬é¼¼æç¿èè¥ç
æ£èçº
é·è®é°å»æ¤°æåæ½±è ®ç·è¶ææ¶éçºî¡é¾é£éæ¨ä¹å亪å¶åéå¢æ¼å£ä¸å¶æ³é¡µéºå¤æ´äº±æ¼æ´é æææ½ç¨åæ液è°å ¨æ®è
èé墷楪æ¥é¦å·ææ
æçææç£ç±é´é¥å¶ªå¶«æ¾²è¬é¤£åæ«æç¸é±æªçç¤éé¥éµºé¨é©é¸è¶å²ä¸å¼è¾·è¡¤ä¼è¡£å»å壱ä¾ç¥å¿æ´¢çç©é¼é±å£¹æ欹èç¦å«æ¼ªç¨¦é¥å¬å«å¤ç¿é¹¥ç¹æª¹æ¯é«é»è©é·é»³ä¹ä»ªåå¯å¤·åå®ææ²è¯ä¾å®æ¡æ²¶ç衪迤饴å¦å§¨å³å¼¬ææçµè贻迻宧巸æ
æ æ¡çè°è¢é
ç移èåªæ¤¬ç¾ è¦è©è²½éæ椸èªè· é é¢é£´çåçªéºå¶¬å½å½èé ¤é ¥å¯²å¶·ç°é¡é®§å½å½è¬»éç±è§ºè®é¸ä¹å·²ä»¥è¿éä½æºç£è¡è¢åº¡è£èéåæç¬éå¯å´ºææ¤
éé¯é³¦æè¼¢æ¼è檥ç¤è¤è»é¡è½é½®ä¹ä¹äº¿å¼åå¿èºä»¡åèè®®é£äº¦ä¼å±¹å¼å¿è
伿ä½å®ååå½¹ææµæè´è
è¯éä½¾åå¹å¦·å³ææ¿æææ³çç§ç»è¯£é©¿ä¿å¥å¸å¸ å¼æ»æµç´ç«ç¾¿è¡µè½¶åå¼ææ¹æ §æ ºæ¬æµ¥æµ³ç袣è°è²¤éåå¶å¸ææ¥æ®¹ç°ç¾ç¿ç¿è訲訳è±è±é¸é´é¿å¹æ¡æ¹æ£æ®æ¹ç²è¡è©è·è»¼é 骮äºå
¿æ溢çç¬ç«©ç¼¢ç¾©èè£è£è©£å©å«å»æ¦æ½©çèèºè´é¾é§
åæ槸æ¯
ç ç¤ç¼ç誼éé¹é¹¢é»åå墿å¬å¬å¶§æ¶ææ殪澺çç±çç©ç¸èèè 褹寱æææªæç¡ç±ç¿³ç¿¼èè²é®¨çèèè´é°é±ç¹¶ç¹¹è±·é¬é¯£é¶é¶é¶ç·èè¯è°é³é·é¥åé¿é·é·æ¿è¥¼é©é·§èé·¾è®é½¸ä¹åå é¥é´ä¾å姻æ´èµè«é³éªæ ¶æ®·æ°¤é°å秵è£éé»éåå å©£æç絪æ
溵ç¦èèæ
çé¦ç£¤ç·¸é諲é駰å¾æ¿¦éé é¾åä¹åç¾èæ¦å 泿åå³¾ççºç¢ç²è¶è¨å«å©¬å¯
å´å´¯æ·«è¨¡é¶éé¾æ»ç¢é夤è©è¨èª¾éé¾å殥çåæªè«éªé½é½¦é·£å»´å°¹å¼å²é¥®èéæ·¾é¿é飲é é·é£®æè¶æªç¾é±å¶¾æ¿¥è¾è櫽ç®è®å°èæ´è¤å½æ¹çå»é
³æ
çææî¡é®£æ檼åºå¿è±åæ¡ç±èºå¨å©´åªæ¥æ¸¶ç»¬æ ç
çå«ç¢¤é³å¤ææ»çç·ç¼¨ç½è§è³æ¨±çåç½è¤®é鴬鹦嬰æèºéºçé£é¹°é¶§å¶åå¾æç´ç½è¡æ«»ç礯è»é¶¯éçºè ³é·ªè»é·¹é¸é¸çè¿èçè¥è§è¹è¤è¥è¦èå¶æºæºè¾åå¡æ¥¹æ»¢è¥æ½çèç©è¿å¬´çç¸è¢æ¿æ¿æ¿´è覮è¬èµ¢å·ææçç ç¯è
æ«¿çç±çè´ç±¯ç¨é¢æµ§æ¢¬é¢é¢é¢æ¬å½±æ½ç¿ç©é ´å·å»®éçæ æ硬媵è¡éç
èåå·å²ä½£æ¥çé庸ååééå¢å«æ
µæ»½æ§¦ç
é¿å°å£
ææ¾éºéèçééé³å»±çé¥é±
é·ç°åé¢é¡é°«æ°¸ç¬åæºæ³³ä¿ååæ åææ¡æ¶æ¿åæ¥ææ¹§ç¡§è© å¡åµ±å½®æ¹è¹æ
è¸ç¦é²¬è¸´é¯ç¨èç ½éä¼å¿§æ¸å¦æ®æ³å¹½æ éºæ»ºæåªé¾åæ®çæ«çºè°å°¢å°¤ç±æ²ç¹é®ææ²¹è¬æ£æ¿æç£å³³æµç§èè¤è¸ééµéå¤è°è¨§é°æ¸¸ç¶é鱿楢ç·é¾é²è¼é§èè£é·è¼¶é®æ«¾éåæ丣å£èé
ç¾åº®ç¾è æ¢èèéæ¹µèç¦èéªæ§±ççé»åå³å¹¼ä½ä¾å§ç糿åå¿å§·å®¥å³ç°ç¥è¯±è¿¶åæ¢è´äº´è²éé
èªé¼¬æ纡è¿è¿ç©»éç´è¶å¹æ·¤çæ¸çç®äºäºäºéä¼ä½å¦¤æµæ
欤ççæ¼çè¾è¡§é±¼ä¿å
ªç¦ºç«½èè°è¢å¨å¨¯å¨±ç³è°é
é¦æ¸è¸éªéé
é©éå £å ¬å´³åµåµææ楰湡ç¬çç¡¢è
´é¾éª¬æ楡æ¦æççè
èè§æ¼î¡î¡ç®çª¬èè¤æ¶ç¾èèè«éé¤é£å¬©ææ¾è¦¦è¸°æçµè¸è¼¿éç¤è¬£é«é®½æç±
é¨é¯²é°
é· é¸ä¸ä¼å®å±¿ç¾½é¨ä¿ä¿£æ§ç¦¹è¯å峿祤åå¬å庾æé
èè®é»å´å¯ææ¥ççèèªçª³éé¾å³å¶¼è²æéºè齬çé©åå«è¿èè妪忬饫è²é彧æ±ç±ç§èä¿¼å³ªæ ¯æµ´ç ¡é°é¢ååå ææ欲淢淯袬è°é³éå
å©å»åªå¯åº½å¾¡æ£æ£æ£«ç´ççè£é飫é¦é¹æ滪ç
稢ç½è®è£èªéºé å«å¶æ«æ¯ççç·èè®è¼éé©åæ
¾ç¨¶è¹è豫é¹é鳿澦çç è·è«é¥é¾é´¥é´§é´ªå¥ç¤ç¦¦é鹬çç¤ç©¥ç¯½ç¹é§éµæ«²é¥èè½è½éé±æ¬é©é¬»ç±é±é·¸é¸æ¬è»é¬°é¬±çªç±²ç©å¦é¸¢åå¤å¼²æç¢é¸³å¯æ¸æ¸æ¸æ¸ææ·µè¾æ£©è¬èé¹ç®¢é³¶èµé§éºé´å¬½éµ·çé¼é¼å
è´ é§ååæ²
æ¬å£ç°è²åå¡åç¬èè¢å¡é
åæ´æ¹²ç¨ç¼é¨é¼åå塬媴å«æºæºç¿çèæ¦æ¦¬è¾ç·£ç¸èè¯éå橼羱èèè¬è½
黿é±æ«é騵鶢鶰åµè¿ç¶éºé å¤è妴èæ¨é¢å¸è¡ååªæ¾çç¦æ¿è£«è¤è¤¤å®é¡æ°æ±çº¦ç´ç®¹ç±å½å½ ææåæ±å²æ礿岳æç¥æ±é¥æ
æ¦èèè»éºé
æ³è·è·ç²¤è¶é
ç²µéé±é²å¬³æ¨¾ç¯å¶½é¾ ç±ç¹è¥é»¦ç禴èºç±¥é¸ç±°é¾¥é¸èç
´èç
奫è¹èµé µé¦§è´äºå»åä¼åå©å¦æ£æ²çºè¸æççç§é§æ¶¢ç´èèºéé²æªæ°²æº³ç¼è·æ°³çæ¾èéæ©ç¯ç¸ç¹§å
é夽æçç§é¨èºæ®åééæ®è¤é¦»ç£é£é½«é½³åè¿æéæ½æéé
åæ²æ ç¼éæ
æè
ªé«éµç¨ç·¼è°è´ç¸èè³±éé餫è´ééèé»å¸åæ²åæ¶æ²¯æ¡ç´¥ç´®éé³èè¢æç ¸é´é磼è¥éåé¥ç½ç¾ç¾åæ ½çè渽溨çµè³³å®°è½½å´½è¼åå¨ææ´
å¤é
¨å縡å
ç³ç°ªç°®éå±åºåæå¯æå§æå¹æ¢è¶±è¶²ææ«è³èµé¾é¼æ¿½è¹é
çè´é¨çé
åçè®ç禶襸è®é¥¡çç¾èµè³è§è³è´é«è´é©µé§å¥å¼èå¡è¬éºèèå®éç³è¹§é©å¿é¿æ©æ£æ è¤æ£ç
澡çªè»è»ç¶ççåå£é æ¢å¿æ
¥ç
°èåªç°ç¥ç«è趮èºç«å«ä¼¬åææ²¢æ©æ³æ³½è´£è¿®åå¶å§å¸»ç¬®è´è²¬æºç å嫧å¹ç®¦è¶æ¨æµè«èµæ澤ççç°è«ç¤è¥è¬®è³¾è é½é½°é¸
ä»å¤¨åºæ±æææå´±ç¨è´¼è³é²è é°é±¡æè°®èèåæ½æ¾å¢é«å¢æ缯橧ç·çç°ç£³ç½¾ç¹èé±éé¥çèµ è´åè¿åæ¯ææ¤å³å§å³æ¸æ¸£æº æ¥åç¶ç®æ¨è§°ç»ç¼èé½é½ææç´è½§è»é¸è»é¡ç
çéé
éèåè²ç¨ç æ©é²é²è¸·é®é®ºä¹ç¹è¯å¤å¥æµæ
ç¸å®±çè±è©æ¾æ£æ¦¨èªé¡å¤ç²æææææ榸é½å®
ç¿çªéåºç ¦åµå¯¨çµæ²¾æ¯¡ææ ´ç²è
飦æè©è¶è©¹éè°µå¡å¶¦æ¾¶èé
éæ°æ°ç»é¹¯æè«é¥é³£é©éé±£é¸è®ææ©é£å±çå´æ¬çæçå¶å¶æ¦è¾é¢å«¸éæ©è¹è¼¾ç½é»µå ä½ææ æ¡ç«å¡ç»½è棧æ¹æ¦ç¶»å¶è¼éª£æ°è¥è¦è¦±è½è¸é©å¼ å¼¡å¼µç« å½é£å«å½°æ
æ¼³çç²»èé§æ²æ¨ç餦èé±é¨¿é±éºä»æ¶¨æ¶±æ漲幥ç¤éé£ä¸ä»æå¸æèè´¦ç²å¸³è¹ç®éå¢å¶å¹è³¬ç¬ç´çä½é妱巶ææç¤çéåéé§çª¼é£ç«æ¾æ²¼çµå¬å
è¯æåç£èµµç¬èæ棹ç½è©ç
§ç½©ç®èèè¶æç³é®¡æ«ç¾ç¾è嫬é®åææ½çºç ç±·è´å²åç²è¢©å ææ¢æ£è¾åæ£è°è©è°ªæºè¼æ¨ç£è¼é¸è¾èå謫謺鮿è½è®è¥µè®è
éèµè¤¶éºè¿ææµéæ·å»èæ¨é¹§è
é·è´é侦æµççè²å¸ªæ æ¡¢ççç §ç¥¯éåµææ¡é
å¯æ¹è´éæ¸æ楨ççç¦èèééæ¦æ§æ®ç§ç¢ªç¦æ½§ç®´æ¨¼æ¾µè»è½é±è½éé¼ç±é±µå±è¯æ®æ姫弫æ£è轸çç¹çè¢ç´¾èèè£è¦è¨ºè»«å«ç¼ç¨¹é§ç¸ç¸¥è¾´é¬é»°å³éµçº¼ä¾²æé£é¸©æ¯ææ ç´ç¹èµå¡¦æçµ¼èæ¶èª«è³é´ééé´éé®é»®å§äºä½å§å¾æçå³¥æ£ç¡ç°î¡ççé²å©å´å´¢æççèé®åªæçå¾°çè¸é¦å¾´ç®å¾µî¡è¸ç¯éé¬ç¥æ°¶æç³½æ¯æå¡£æ¸æ¸ææ´æ£ã£è¯è¯¤é帧æ¿çå¹è¨¼éè«é´èä¹æ¯å®æ±èå±å·µæ±¥æç¥ç»è¢å¾æ ç¥ç§ç§èè衹衼åç·ç¥¬ç§ªèé»æ¢æ 椥è¸æç¦ç¶æ¦°è馶鳷謢鴲ç¹èµé¼
禵æ§ä¾å§ç´å§ªå¤å¼èèéå´å·èæ¤æ®ç¦çµ·è·ç¡å¢æ馽å¬æ
¹æ¼è¸¯æ¨´è±ç¸¶è·èè¹ è¹¢è»èºå¤æ¢åªåªå§æ¨é¯ååå¸æºæ±¦æ²çº¸è·æ§ç¥èå«æææ³æ´ç 轵淽ç»ç´è¨¨è¶¾è»¹é»¹é
¯è¢è¥§é¤è³èå¿å¿®æ»è±¸å¶ååå¸å¸æ²»çè´¨é
俧å³åº¢åº¤ææ£æ æ´·ç¥é娡å¾æææ¡ç¾ç§©è´è¢è´½è½¾ä¹¿å«å¾æ·æ¢½çç¤ç秲秷çªç´©ç¿è¢ è§è²é鸷åå´»å½æºæ»ç£èéªå¯å»æ±æ»ç¨ç¨ç«ç½®è·±è¼é§éå¢æ§æ»¯æ½çç製è¦èªéå¹ææ¯æ½ªç«ç¨ºè£è§¯è³ªè¸¬éæçç·»é²é§¤é´å¨åæ¥æ²æ¿æ«ç©è²æ«è´æ«ç觶é¨é¯¯ç¤©è±é¨ºé©èºé·éè±ä¸ä¼æ±·å£å¦å½¸è¿å¿ æ³çç»æç
衳éè¯è¡·çµé¡å¹è éºè¤é´¤è½é¾é¼¨è¹±é籦è¿ç§å¢å å°°å¡æ±ç
è
«ç種踵仲ä¼å¦çç¥ç¥è½è¡¶éèå
ç¾å ¹åªçè¡è«¥å·èè¯î î ä¾å¨æ´æ´²ç¿è¯ªççè¾é®å©¤å¾æ·çªé±é¸¼åç²¥èµè¼éè³è¼é駲åç©è¬
éµé¨è¸å¦¯è½´è»¸ç¢¡èå¸çè·æçç®é¯çº£ä¼·åªåå®ç»î ¥î ¤åå®æ¼ç´èè®æç±é
ç²è¤è©çå½çºé§å£ç¸éª¤ç±ç±ç±é©æ±å¯ä¾è¯é¾æ´è±æ ªã±ç 诸çªç¡è¢¾é¢çµèèª
è·¦æ§ æ½´è«é橥諸豬駯鮢鴸ç¦è¸æ«§æ««é¼é¯ºè ©ç«¹æ³ç«ºç¢ç¬è¿ççªéç¬è³çè«çè èº
é±ååçæ¸æ¯æ¬ç¥è ¾é丶主å®æç «ç½é¼æ¸ç
ç
®è©å±æ¿éºç©å±¬åç伫ä½ä½å©çº»è§èå¾æ¼æ³¨è§è´®è¿¬é©»å£´æ±æ·æ®¶ç·ç¥ç°ç祩ç«è秼紵紸ç¾èèåµç註貯è·è»´é¸ç¯é飳馵墸箸翥樦é³é§ç¯ç¯«ééºéææªè¼ç°»é«½çªæ½è·©ä¸åå°ç å°éå«¥ç¼çèé¢ç£è«¯è¤é¡é±è½¬î ¿å¨è»¢ç«±è½ç·åå èçåèµæ°ç¯é¦ç¸³è¥è³ºèé¥åç±å¦åºå¦åºè娤桩è湷粧è£
è£æ¨ç³ä¸¬å£®å£¯ç¶ç壵æ¢çå¹¢ææ
é¹è¿½éªæ¤é¥éé¨
éµ»æ²å ç¬å¨·ç¼æ´çç¼ç·ç¡¾èå¢ç¶´èµç¸è«éé£é¤ç¤è´
è½éå®è¿è«çªè°è«è¡ åå»åæºç¶§è¨°ç¨åæçªå¬ææ¡æ£æ¶¿æ£³ç¸çª§æ§ç©ç©±è ¿å´å½´ç³ç¼å妰èæ«æµä¸µæµçµè¯¼é
åå
娺梲çæ®æ«æ¤ç¢æ±ç¡ºçª¡ç½¬æ¯ææ²ç¦å
è«è«éæ¿ç¯§æ¢ææµæ¿¯æ«¡è¬¶é¯î¡é¯éµ«çè é²ç±é·ç±±ä»ååèå
¹å¨å§å§¿è²æ ¥çç´èµèµå´°æ·ç§¶ç¼è°èµ¼åå³åµ«æ¤æ¹½æ»ç²¢èè¾éå¶ç¦è§è²²è³è¶é±ç¨µç·ééé¾è¼é¼æ¾¬è«®è¶¦è¼ºéé«é²»é¿é¡é ¾é ¿é¯é¶
é½é°¦é½ç±½ååå§å§æç·ç§èå°ç§èè¸ç¬«æ¢é¨åç´«æ»è¨¾è¨¿æ¦æ©´åèªèè¡å³åæ£ç¸æ¸ç¥ç¦èè¾æ¼¬å¨å®å§ç»¼éªå «åµåµæ¾æ£ç£è
è¼æ¡æ¤¶åµ¸ç¨¯ç¶ç·ç§ç·µç¿ªèè¬è¸¨è¸ªç£«è±µè¹¤é¨é¬é¨£é¬é¬·é¯®é¯¼éæ»å¬æ´æ£æ¡ææå¯èæ ç·ç¸çªç¸½é¯é纵æ®çåçç¢ç²½ç³ç²ç¸¦é縱é¹é©ºè¯¹é°é¬æ«è棷棸éç®ç·
è«é¹é²°é¯«é»é¨¶é½ºèµ±èµ°é¯å¥æ媰ç§è¹è
è©å足åå«å´å´ªæå¶ç¨¡ç®¤è¸¤è¸¿ééè¯
é»ç»ä¿ç¼çç¥çµè©é»éºè¬¯åèºé躦é½ç¹¤ç¼µçºçºç±«çºé»ææ¥åæåºæ¨¶èçºå¶å´å¿æ¿¢ç»æ æ ¬çµé
æ¬æç¥½ç½ªè¾ é
»èé嶵æªé·éæªç©æ¬å°å¶éµæ¨½ç¹ç½é¶éé³é±é··ååæèæéæ¨ç§¨èæ½æ¤èç¨ç°é¼å·¦ä½ç¹ä½åé¼å²å²æä¾³æç¥èå座è¢åèè飵糳å</pc>
+
+ </rules>
+ </collation>
+
+
</charset>
<charset name="latin1">
@@ -134,4 +309,791 @@
<collation name="latin1_test" id="99" order="test"/>
</charset>
+ <charset name="utf8">
+ <collation name="utf8_bengali_standard_ci" id="336">
+ <rules>
+ <reset>\u9FA</reset>
+ <p>\u9F8</p>
+ <p>\u9F9</p>
+ <p>\u9F2</p>
+ <p>\u9F3</p>
+ <p>\u985</p>
+ <p>\u986</p>
+ <p>\u987</p>
+ <p>\u988</p>
+ <p>\u989</p>
+ <p>\u98A</p>
+ <p>\u98B</p>
+ <p>\u9E0</p>
+ <p>\u98C</p>
+ <p>\u9E1</p>
+ <p>\u98F</p>
+ <p>\u990</p>
+ <p>\u993</p>
+ <p>\u994</p>
+ <p>\u9BC</p>
+ <p>\u982</p>
+ <p>\u983</p>
+ <p>\u981</p>
+ <p>\u995</p>
+ <p>\u996</p>
+ <p>\u997</p>
+ <p>\u998</p>
+ <p>\u999</p>
+ <p>\u99A</p>
+ <p>\u99B</p>
+ <p>\u99C</p>
+ <p>\u99D</p>
+ <p>\u99E</p>
+ <p>\u99F</p>
+ <p>\u9A0</p>
+ <p>\u9A1</p>
+ <p>\u9DC</p>
+ <i>\u9A1\u9BC</i>
+ <p>\u9A2</p>
+ <p>\u9DD</p>
+ <i>\u9A2\u9BC</i>
+ <p>\u9A3</p>
+ <p>\u9CE</p>
+ <p>\u9A4</p>
+ <p>\u9A5</p>
+ <p>\u9A6</p>
+ <p>\u9A7</p>
+ <p>\u9A8</p>
+ <p>\u9AA</p>
+ <p>\u9AB</p>
+ <p>\u9AC</p>
+ <p>\u9AD</p>
+ <p>\u9AE</p>
+ <p>\u9AF</p>
+ <p>\u9DF</p>
+ <i>\u9AF\u9BC</i>
+ <p>\u9B0</p>
+ <p>\u9F0</p>
+ <p>\u9B2</p>
+ <p>\u9F1</p>
+ <p>\u9B6</p>
+ <p>\u9B7</p>
+ <p>\u9B8</p>
+ <p>\u9B9</p>
+ <p>\u9BD</p>
+ <p>\u9BE</p>
+ <p>\u9BF</p>
+ <p>\u9C0</p>
+ <p>\u9C1</p>
+ <p>\u9C2</p>
+ <p>\u9C3</p>
+ <p>\u9C4</p>
+ <p>\u9E2</p>
+ <p>\u9E3</p>
+ <p>\u9C7</p>
+ <p>\u9C8</p>
+ <p>\u9CB</p>
+ <i>\u9C7\u9BE</i>
+ <p>\u9CC</p>
+ <i>\u9C7\u9D7</i>
+ <p>\u9CD</p>
+ <p>\u9D7</p>
+ </rules>
+ </collation>
+
+ <collation name="utf8_bengali_traditional_ci" id="337">
+ <rules>
+ <reset>\u994</reset>
+ <p>\u982</p>
+ <p>\u983</p>
+ <p>\u981</p>
+ <p>\u995\u9CD</p>
+ <p>\u996\u9CD</p>
+ <p>\u997\u9CD</p>
+ <p>\u998\u9CD</p>
+ <p>\u999\u9CD</p>
+ <p>\u99A\u9CD</p>
+ <p>\u99B\u9CD</p>
+ <p>\u99C\u9CD</p>
+ <p>\u99D\u9CD</p>
+ <p>\u99E\u9CD</p>
+ <p>\u99F\u9CD</p>
+ <p>\u9A0\u9CD</p>
+ <p>\u9A1\u9CD</p>
+ <p>\u9A2\u9CD</p>
+ <p>\u9A3\u9CD</p>
+ <p>\u9CE</p><i>\u9A4\u9CD\u200D</i><s>\u9A4\u9CD</s>
+ <p>\u9A5\u9CD</p>
+ <p>\u9A6\u9CD</p>
+ <p>\u9A7\u9CD</p>
+ <p>\u9A8\u9CD</p>
+ <p>\u9AA\u9CD</p>
+ <p>\u9AB\u9CD</p>
+ <p>\u9AC\u9CD</p>
+ <p>\u9AD\u9CD</p>
+ <p>\u9AE\u9CD</p>
+ <p>\u9AF\u9CD</p>
+ <p>\u9B0\u9CD</p>
+ <p>\u9F0\u9CD</p>
+ <p>\u9B2\u9CD</p>
+ <p>\u9F1\u9CD</p>
+ <p>\u9B6\u9CD</p>
+ <p>\u9B7\u9CD</p>
+ <p>\u9B8\u9CD</p>
+ <p>\u9B9\u9CD</p>
+
+ <reset>\u995\u9CD\u985</reset><i>\u995</i>
+ <reset>\u995\u9CD\u986</reset><i>\u995\u9BE</i>
+ <reset>\u995\u9CD\u987</reset><i>\u995\u9BF</i>
+ <reset>\u995\u9CD\u988</reset><i>\u995\u9C0</i>
+ <reset>\u995\u9CD\u989</reset><i>\u995\u9C1</i>
+ <reset>\u995\u9CD\u98A</reset><i>\u995\u9C2</i>
+ <reset>\u995\u9CD\u98B</reset><i>\u995\u9C3</i>
+ <reset>\u995\u9CD\u9E0</reset><i>\u995\u9C4</i>
+ <reset>\u995\u9CD\u98C</reset><i>\u995\u9E2</i>
+ <reset>\u995\u9CD\u9E1</reset><i>\u995\u9E3</i>
+ <reset>\u995\u9CD\u98F</reset><i>\u995\u9C7</i>
+ <reset>\u995\u9CD\u990</reset><i>\u995\u9C8</i>
+ <reset>\u995\u9CD\u993</reset><i>\u995\u9CB</i>
+ <reset>\u995\u9CD\u994</reset><i>\u995\u9CC</i>
+
+ <reset>\u996\u9CD\u985</reset><i>\u996</i>
+ <reset>\u996\u9CD\u986</reset><i>\u996\u9BE</i>
+ <reset>\u996\u9CD\u987</reset><i>\u996\u9BF</i>
+ <reset>\u996\u9CD\u988</reset><i>\u996\u9C0</i>
+ <reset>\u996\u9CD\u989</reset><i>\u996\u9C1</i>
+ <reset>\u996\u9CD\u98A</reset><i>\u996\u9C2</i>
+ <reset>\u996\u9CD\u98B</reset><i>\u996\u9C3</i>
+ <reset>\u996\u9CD\u9E0</reset><i>\u996\u9C4</i>
+ <reset>\u996\u9CD\u98C</reset><i>\u996\u9E2</i>
+ <reset>\u996\u9CD\u9E1</reset><i>\u996\u9E3</i>
+ <reset>\u996\u9CD\u98F</reset><i>\u996\u9C7</i>
+ <reset>\u996\u9CD\u990</reset><i>\u996\u9C8</i>
+ <reset>\u996\u9CD\u993</reset><i>\u996\u9CB</i>
+ <reset>\u996\u9CD\u994</reset><i>\u996\u9CC</i>
+
+ <reset>\u997\u9CD\u985</reset><i>\u997</i>
+ <reset>\u997\u9CD\u986</reset><i>\u997\u9BE</i>
+ <reset>\u997\u9CD\u987</reset><i>\u997\u9BF</i>
+ <reset>\u997\u9CD\u988</reset><i>\u997\u9C0</i>
+ <reset>\u997\u9CD\u989</reset><i>\u997\u9C1</i>
+ <reset>\u997\u9CD\u98A</reset><i>\u997\u9C2</i>
+ <reset>\u997\u9CD\u98B</reset><i>\u997\u9C3</i>
+ <reset>\u997\u9CD\u9E0</reset><i>\u997\u9C4</i>
+ <reset>\u997\u9CD\u98C</reset><i>\u997\u9E2</i>
+ <reset>\u997\u9CD\u9E1</reset><i>\u997\u9E3</i>
+ <reset>\u997\u9CD\u98F</reset><i>\u997\u9C7</i>
+ <reset>\u997\u9CD\u990</reset><i>\u997\u9C8</i>
+ <reset>\u997\u9CD\u993</reset><i>\u997\u9CB</i>
+ <reset>\u997\u9CD\u994</reset><i>\u997\u9CC</i>
+
+ <reset>\u998\u9CD\u985</reset><i>\u998</i>
+ <reset>\u998\u9CD\u986</reset><i>\u998\u9BE</i>
+ <reset>\u998\u9CD\u987</reset><i>\u998\u9BF</i>
+ <reset>\u998\u9CD\u988</reset><i>\u998\u9C0</i>
+ <reset>\u998\u9CD\u989</reset><i>\u998\u9C1</i>
+ <reset>\u998\u9CD\u98A</reset><i>\u998\u9C2</i>
+ <reset>\u998\u9CD\u98B</reset><i>\u998\u9C3</i>
+ <reset>\u998\u9CD\u9E0</reset><i>\u998\u9C4</i>
+ <reset>\u998\u9CD\u98C</reset><i>\u998\u9E2</i>
+ <reset>\u998\u9CD\u9E1</reset><i>\u998\u9E3</i>
+ <reset>\u998\u9CD\u98F</reset><i>\u998\u9C7</i>
+ <reset>\u998\u9CD\u990</reset><i>\u998\u9C8</i>
+ <reset>\u998\u9CD\u993</reset><i>\u998\u9CB</i>
+ <reset>\u998\u9CD\u994</reset><i>\u998\u9CC</i>
+
+ <reset>\u999\u9CD\u985</reset><i>\u999</i>
+ <reset>\u999\u9CD\u986</reset><i>\u999\u9BE</i>
+ <reset>\u999\u9CD\u987</reset><i>\u999\u9BF</i>
+ <reset>\u999\u9CD\u988</reset><i>\u999\u9C0</i>
+ <reset>\u999\u9CD\u989</reset><i>\u999\u9C1</i>
+ <reset>\u999\u9CD\u98A</reset><i>\u999\u9C2</i>
+ <reset>\u999\u9CD\u98B</reset><i>\u999\u9C3</i>
+ <reset>\u999\u9CD\u9E0</reset><i>\u999\u9C4</i>
+ <reset>\u999\u9CD\u98C</reset><i>\u999\u9E2</i>
+ <reset>\u999\u9CD\u9E1</reset><i>\u999\u9E3</i>
+ <reset>\u999\u9CD\u98F</reset><i>\u999\u9C7</i>
+ <reset>\u999\u9CD\u990</reset><i>\u999\u9C8</i>
+ <reset>\u999\u9CD\u993</reset><i>\u999\u9CB</i>
+ <reset>\u999\u9CD\u994</reset><i>\u999\u9CC</i>
+
+ <reset>\u99A\u9CD\u985</reset><i>\u99A</i>
+ <reset>\u99A\u9CD\u986</reset><i>\u99A\u9BE</i>
+ <reset>\u99A\u9CD\u987</reset><i>\u99A\u9BF</i>
+ <reset>\u99A\u9CD\u988</reset><i>\u99A\u9C0</i>
+ <reset>\u99A\u9CD\u989</reset><i>\u99A\u9C1</i>
+ <reset>\u99A\u9CD\u98A</reset><i>\u99A\u9C2</i>
+ <reset>\u99A\u9CD\u98B</reset><i>\u99A\u9C3</i>
+ <reset>\u99A\u9CD\u9E0</reset><i>\u99A\u9C4</i>
+ <reset>\u99A\u9CD\u98C</reset><i>\u99A\u9E2</i>
+ <reset>\u99A\u9CD\u9E1</reset><i>\u99A\u9E3</i>
+ <reset>\u99A\u9CD\u98F</reset><i>\u99A\u9C7</i>
+ <reset>\u99A\u9CD\u990</reset><i>\u99A\u9C8</i>
+ <reset>\u99A\u9CD\u993</reset><i>\u99A\u9CB</i>
+ <reset>\u99A\u9CD\u994</reset><i>\u99A\u9CC</i>
+
+ <reset>\u99B\u9CD\u985</reset><i>\u99B</i>
+ <reset>\u99B\u9CD\u986</reset><i>\u99B\u9BE</i>
+ <reset>\u99B\u9CD\u987</reset><i>\u99B\u9BF</i>
+ <reset>\u99B\u9CD\u988</reset><i>\u99B\u9C0</i>
+ <reset>\u99B\u9CD\u989</reset><i>\u99B\u9C1</i>
+ <reset>\u99B\u9CD\u98A</reset><i>\u99B\u9C2</i>
+ <reset>\u99B\u9CD\u98B</reset><i>\u99B\u9C3</i>
+ <reset>\u99B\u9CD\u9E0</reset><i>\u99B\u9C4</i>
+ <reset>\u99B\u9CD\u98C</reset><i>\u99B\u9E2</i>
+ <reset>\u99B\u9CD\u9E1</reset><i>\u99B\u9E3</i>
+ <reset>\u99B\u9CD\u98F</reset><i>\u99B\u9C7</i>
+ <reset>\u99B\u9CD\u990</reset><i>\u99B\u9C8</i>
+ <reset>\u99B\u9CD\u993</reset><i>\u99B\u9CB</i>
+ <reset>\u99B\u9CD\u994</reset><i>\u99B\u9CC</i>
+
+ <reset>\u99C\u9CD\u985</reset><i>\u99C</i>
+ <reset>\u99C\u9CD\u986</reset><i>\u99C\u9BE</i>
+ <reset>\u99C\u9CD\u987</reset><i>\u99C\u9BF</i>
+ <reset>\u99C\u9CD\u988</reset><i>\u99C\u9C0</i>
+ <reset>\u99C\u9CD\u989</reset><i>\u99C\u9C1</i>
+ <reset>\u99C\u9CD\u98A</reset><i>\u99C\u9C2</i>
+ <reset>\u99C\u9CD\u98B</reset><i>\u99C\u9C3</i>
+ <reset>\u99C\u9CD\u9E0</reset><i>\u99C\u9C4</i>
+ <reset>\u99C\u9CD\u98C</reset><i>\u99C\u9E2</i>
+ <reset>\u99C\u9CD\u9E1</reset><i>\u99C\u9E3</i>
+ <reset>\u99C\u9CD\u98F</reset><i>\u99C\u9C7</i>
+ <reset>\u99C\u9CD\u990</reset><i>\u99C\u9C8</i>
+ <reset>\u99C\u9CD\u993</reset><i>\u99C\u9CB</i>
+ <reset>\u99C\u9CD\u994</reset><i>\u99C\u9CC</i>
+
+ <reset>\u99D\u9CD\u985</reset><i>\u99D</i>
+ <reset>\u99D\u9CD\u986</reset><i>\u99D\u9BE</i>
+ <reset>\u99D\u9CD\u987</reset><i>\u99D\u9BF</i>
+ <reset>\u99D\u9CD\u988</reset><i>\u99D\u9C0</i>
+ <reset>\u99D\u9CD\u989</reset><i>\u99D\u9C1</i>
+ <reset>\u99D\u9CD\u98A</reset><i>\u99D\u9C2</i>
+ <reset>\u99D\u9CD\u98B</reset><i>\u99D\u9C3</i>
+ <reset>\u99D\u9CD\u9E0</reset><i>\u99D\u9C4</i>
+ <reset>\u99D\u9CD\u98C</reset><i>\u99D\u9E2</i>
+ <reset>\u99D\u9CD\u9E1</reset><i>\u99D\u9E3</i>
+ <reset>\u99D\u9CD\u98F</reset><i>\u99D\u9C7</i>
+ <reset>\u99D\u9CD\u990</reset><i>\u99D\u9C8</i>
+ <reset>\u99D\u9CD\u993</reset><i>\u99D\u9CB</i>
+ <reset>\u99D\u9CD\u994</reset><i>\u99D\u9CC</i>
+
+ <reset>\u99E\u9CD\u985</reset><i>\u99E</i>
+ <reset>\u99E\u9CD\u986</reset><i>\u99E\u9BE</i>
+ <reset>\u99E\u9CD\u987</reset><i>\u99E\u9BF</i>
+ <reset>\u99E\u9CD\u988</reset><i>\u99E\u9C0</i>
+ <reset>\u99E\u9CD\u989</reset><i>\u99E\u9C1</i>
+ <reset>\u99E\u9CD\u98A</reset><i>\u99E\u9C2</i>
+ <reset>\u99E\u9CD\u98B</reset><i>\u99E\u9C3</i>
+ <reset>\u99E\u9CD\u9E0</reset><i>\u99E\u9C4</i>
+ <reset>\u99E\u9CD\u98C</reset><i>\u99E\u9E2</i>
+ <reset>\u99E\u9CD\u9E1</reset><i>\u99E\u9E3</i>
+ <reset>\u99E\u9CD\u98F</reset><i>\u99E\u9C7</i>
+ <reset>\u99E\u9CD\u990</reset><i>\u99E\u9C8</i>
+ <reset>\u99E\u9CD\u993</reset><i>\u99E\u9CB</i>
+ <reset>\u99E\u9CD\u994</reset><i>\u99E\u9CC</i>
+
+ <reset>\u99F\u9CD\u985</reset><i>\u99F</i>
+ <reset>\u99F\u9CD\u986</reset><i>\u99F\u9BE</i>
+ <reset>\u99F\u9CD\u987</reset><i>\u99F\u9BF</i>
+ <reset>\u99F\u9CD\u988</reset><i>\u99F\u9C0</i>
+ <reset>\u99F\u9CD\u989</reset><i>\u99F\u9C1</i>
+ <reset>\u99F\u9CD\u98A</reset><i>\u99F\u9C2</i>
+ <reset>\u99F\u9CD\u98B</reset><i>\u99F\u9C3</i>
+ <reset>\u99F\u9CD\u9E0</reset><i>\u99F\u9C4</i>
+ <reset>\u99F\u9CD\u98C</reset><i>\u99F\u9E2</i>
+ <reset>\u99F\u9CD\u9E1</reset><i>\u99F\u9E3</i>
+ <reset>\u99F\u9CD\u98F</reset><i>\u99F\u9C7</i>
+ <reset>\u99F\u9CD\u990</reset><i>\u99F\u9C8</i>
+ <reset>\u99F\u9CD\u993</reset><i>\u99F\u9CB</i>
+ <reset>\u99F\u9CD\u994</reset><i>\u99F\u9CC</i>
+
+ <reset>\u9A0\u9CD\u985</reset><i>\u9A0</i>
+ <reset>\u9A0\u9CD\u986</reset><i>\u9A0\u9BE</i>
+ <reset>\u9A0\u9CD\u987</reset><i>\u9A0\u9BF</i>
+ <reset>\u9A0\u9CD\u988</reset><i>\u9A0\u9C0</i>
+ <reset>\u9A0\u9CD\u989</reset><i>\u9A0\u9C1</i>
+ <reset>\u9A0\u9CD\u98A</reset><i>\u9A0\u9C2</i>
+ <reset>\u9A0\u9CD\u98B</reset><i>\u9A0\u9C3</i>
+ <reset>\u9A0\u9CD\u9E0</reset><i>\u9A0\u9C4</i>
+ <reset>\u9A0\u9CD\u98C</reset><i>\u9A0\u9E2</i>
+ <reset>\u9A0\u9CD\u9E1</reset><i>\u9A0\u9E3</i>
+ <reset>\u9A0\u9CD\u98F</reset><i>\u9A0\u9C7</i>
+ <reset>\u9A0\u9CD\u990</reset><i>\u9A0\u9C8</i>
+ <reset>\u9A0\u9CD\u993</reset><i>\u9A0\u9CB</i>
+ <reset>\u9A0\u9CD\u994</reset><i>\u9A0\u9CC</i>
+
+ <reset>\u9A1\u9CD\u985</reset><i>\u9A1</i>
+ <reset>\u9A1\u9CD\u986</reset><i>\u9A1\u9BE</i>
+ <reset>\u9A1\u9CD\u987</reset><i>\u9A1\u9BF</i>
+ <reset>\u9A1\u9CD\u988</reset><i>\u9A1\u9C0</i>
+ <reset>\u9A1\u9CD\u989</reset><i>\u9A1\u9C1</i>
+ <reset>\u9A1\u9CD\u98A</reset><i>\u9A1\u9C2</i>
+ <reset>\u9A1\u9CD\u98B</reset><i>\u9A1\u9C3</i>
+ <reset>\u9A1\u9CD\u9E0</reset><i>\u9A1\u9C4</i>
+ <reset>\u9A1\u9CD\u98C</reset><i>\u9A1\u9E2</i>
+ <reset>\u9A1\u9CD\u9E1</reset><i>\u9A1\u9E3</i>
+ <reset>\u9A1\u9CD\u98F</reset><i>\u9A1\u9C7</i>
+ <reset>\u9A1\u9CD\u990</reset><i>\u9A1\u9C8</i>
+ <reset>\u9A1\u9CD\u993</reset><i>\u9A1\u9CB</i>
+ <reset>\u9A1\u9CD\u994</reset><i>\u9A1\u9CC</i>
+
+ <reset>\u9A2\u9CD\u985</reset><i>\u9A2</i>
+ <reset>\u9A2\u9CD\u986</reset><i>\u9A2\u9BE</i>
+ <reset>\u9A2\u9CD\u987</reset><i>\u9A2\u9BF</i>
+ <reset>\u9A2\u9CD\u988</reset><i>\u9A2\u9C0</i>
+ <reset>\u9A2\u9CD\u989</reset><i>\u9A2\u9C1</i>
+ <reset>\u9A2\u9CD\u98A</reset><i>\u9A2\u9C2</i>
+ <reset>\u9A2\u9CD\u98B</reset><i>\u9A2\u9C3</i>
+ <reset>\u9A2\u9CD\u9E0</reset><i>\u9A2\u9C4</i>
+ <reset>\u9A2\u9CD\u98C</reset><i>\u9A2\u9E2</i>
+ <reset>\u9A2\u9CD\u9E1</reset><i>\u9A2\u9E3</i>
+ <reset>\u9A2\u9CD\u98F</reset><i>\u9A2\u9C7</i>
+ <reset>\u9A2\u9CD\u990</reset><i>\u9A2\u9C8</i>
+ <reset>\u9A2\u9CD\u993</reset><i>\u9A2\u9CB</i>
+ <reset>\u9A2\u9CD\u994</reset><i>\u9A2\u9CC</i>
+
+ <reset>\u9A3\u9CD\u985</reset><i>\u9A3</i>
+ <reset>\u9A3\u9CD\u986</reset><i>\u9A3\u9BE</i>
+ <reset>\u9A3\u9CD\u987</reset><i>\u9A3\u9BF</i>
+ <reset>\u9A3\u9CD\u988</reset><i>\u9A3\u9C0</i>
+ <reset>\u9A3\u9CD\u989</reset><i>\u9A3\u9C1</i>
+ <reset>\u9A3\u9CD\u98A</reset><i>\u9A3\u9C2</i>
+ <reset>\u9A3\u9CD\u98B</reset><i>\u9A3\u9C3</i>
+ <reset>\u9A3\u9CD\u9E0</reset><i>\u9A3\u9C4</i>
+ <reset>\u9A3\u9CD\u98C</reset><i>\u9A3\u9E2</i>
+ <reset>\u9A3\u9CD\u9E1</reset><i>\u9A3\u9E3</i>
+ <reset>\u9A3\u9CD\u98F</reset><i>\u9A3\u9C7</i>
+ <reset>\u9A3\u9CD\u990</reset><i>\u9A3\u9C8</i>
+ <reset>\u9A3\u9CD\u993</reset><i>\u9A3\u9CB</i>
+ <reset>\u9A3\u9CD\u994</reset><i>\u9A3\u9CC</i>
+
+ <reset>\u9A4\u9CD\u985</reset><i>\u9A4</i>
+ <reset>\u9A4\u9CD\u986</reset><i>\u9A4\u9BE</i>
+ <reset>\u9A4\u9CD\u987</reset><i>\u9A4\u9BF</i>
+ <reset>\u9A4\u9CD\u988</reset><i>\u9A4\u9C0</i>
+ <reset>\u9A4\u9CD\u989</reset><i>\u9A4\u9C1</i>
+ <reset>\u9A4\u9CD\u98A</reset><i>\u9A4\u9C2</i>
+ <reset>\u9A4\u9CD\u98B</reset><i>\u9A4\u9C3</i>
+ <reset>\u9A4\u9CD\u9E0</reset><i>\u9A4\u9C4</i>
+ <reset>\u9A4\u9CD\u98C</reset><i>\u9A4\u9E2</i>
+ <reset>\u9A4\u9CD\u9E1</reset><i>\u9A4\u9E3</i>
+ <reset>\u9A4\u9CD\u98F</reset><i>\u9A4\u9C7</i>
+ <reset>\u9A4\u9CD\u990</reset><i>\u9A4\u9C8</i>
+ <reset>\u9A4\u9CD\u993</reset><i>\u9A4\u9CB</i>
+ <reset>\u9A4\u9CD\u994</reset><i>\u9A4\u9CC</i>
+
+ <reset>\u9A5\u9CD\u985</reset><i>\u9A5</i>
+ <reset>\u9A5\u9CD\u986</reset><i>\u9A5\u9BE</i>
+ <reset>\u9A5\u9CD\u987</reset><i>\u9A5\u9BF</i>
+ <reset>\u9A5\u9CD\u988</reset><i>\u9A5\u9C0</i>
+ <reset>\u9A5\u9CD\u989</reset><i>\u9A5\u9C1</i>
+ <reset>\u9A5\u9CD\u98A</reset><i>\u9A5\u9C2</i>
+ <reset>\u9A5\u9CD\u98B</reset><i>\u9A5\u9C3</i>
+ <reset>\u9A5\u9CD\u9E0</reset><i>\u9A5\u9C4</i>
+ <reset>\u9A5\u9CD\u98C</reset><i>\u9A5\u9E2</i>
+ <reset>\u9A5\u9CD\u9E1</reset><i>\u9A5\u9E3</i>
+ <reset>\u9A5\u9CD\u98F</reset><i>\u9A5\u9C7</i>
+ <reset>\u9A5\u9CD\u990</reset><i>\u9A5\u9C8</i>
+ <reset>\u9A5\u9CD\u993</reset><i>\u9A5\u9CB</i>
+ <reset>\u9A5\u9CD\u994</reset><i>\u9A5\u9CC</i>
+
+ <reset>\u9A6\u9CD\u985</reset><i>\u9A6</i>
+ <reset>\u9A6\u9CD\u986</reset><i>\u9A6\u9BE</i>
+ <reset>\u9A6\u9CD\u987</reset><i>\u9A6\u9BF</i>
+ <reset>\u9A6\u9CD\u988</reset><i>\u9A6\u9C0</i>
+ <reset>\u9A6\u9CD\u989</reset><i>\u9A6\u9C1</i>
+ <reset>\u9A6\u9CD\u98A</reset><i>\u9A6\u9C2</i>
+ <reset>\u9A6\u9CD\u98B</reset><i>\u9A6\u9C3</i>
+ <reset>\u9A6\u9CD\u9E0</reset><i>\u9A6\u9C4</i>
+ <reset>\u9A6\u9CD\u98C</reset><i>\u9A6\u9E2</i>
+ <reset>\u9A6\u9CD\u9E1</reset><i>\u9A6\u9E3</i>
+ <reset>\u9A6\u9CD\u98F</reset><i>\u9A6\u9C7</i>
+ <reset>\u9A6\u9CD\u990</reset><i>\u9A6\u9C8</i>
+ <reset>\u9A6\u9CD\u993</reset><i>\u9A6\u9CB</i>
+ <reset>\u9A6\u9CD\u994</reset><i>\u9A6\u9CC</i>
+
+ <reset>\u9A7\u9CD\u985</reset><i>\u9A7</i>
+ <reset>\u9A7\u9CD\u986</reset><i>\u9A7\u9BE</i>
+ <reset>\u9A7\u9CD\u987</reset><i>\u9A7\u9BF</i>
+ <reset>\u9A7\u9CD\u988</reset><i>\u9A7\u9C0</i>
+ <reset>\u9A7\u9CD\u989</reset><i>\u9A7\u9C1</i>
+ <reset>\u9A7\u9CD\u98A</reset><i>\u9A7\u9C2</i>
+ <reset>\u9A7\u9CD\u98B</reset><i>\u9A7\u9C3</i>
+ <reset>\u9A7\u9CD\u9E0</reset><i>\u9A7\u9C4</i>
+ <reset>\u9A7\u9CD\u98C</reset><i>\u9A7\u9E2</i>
+ <reset>\u9A7\u9CD\u9E1</reset><i>\u9A7\u9E3</i>
+ <reset>\u9A7\u9CD\u98F</reset><i>\u9A7\u9C7</i>
+ <reset>\u9A7\u9CD\u990</reset><i>\u9A7\u9C8</i>
+ <reset>\u9A7\u9CD\u993</reset><i>\u9A7\u9CB</i>
+ <reset>\u9A7\u9CD\u994</reset><i>\u9A7\u9CC</i>
+
+ <reset>\u9A8\u9CD\u985</reset><i>\u9A8</i>
+ <reset>\u9A8\u9CD\u986</reset><i>\u9A8\u9BE</i>
+ <reset>\u9A8\u9CD\u987</reset><i>\u9A8\u9BF</i>
+ <reset>\u9A8\u9CD\u988</reset><i>\u9A8\u9C0</i>
+ <reset>\u9A8\u9CD\u989</reset><i>\u9A8\u9C1</i>
+ <reset>\u9A8\u9CD\u98A</reset><i>\u9A8\u9C2</i>
+ <reset>\u9A8\u9CD\u98B</reset><i>\u9A8\u9C3</i>
+ <reset>\u9A8\u9CD\u9E0</reset><i>\u9A8\u9C4</i>
+ <reset>\u9A8\u9CD\u98C</reset><i>\u9A8\u9E2</i>
+ <reset>\u9A8\u9CD\u9E1</reset><i>\u9A8\u9E3</i>
+ <reset>\u9A8\u9CD\u98F</reset><i>\u9A8\u9C7</i>
+ <reset>\u9A8\u9CD\u990</reset><i>\u9A8\u9C8</i>
+ <reset>\u9A8\u9CD\u993</reset><i>\u9A8\u9CB</i>
+ <reset>\u9A8\u9CD\u994</reset><i>\u9A8\u9CC</i>
+
+ <reset>\u9AA\u9CD\u985</reset><i>\u9AA</i>
+ <reset>\u9AA\u9CD\u986</reset><i>\u9AA\u9BE</i>
+ <reset>\u9AA\u9CD\u987</reset><i>\u9AA\u9BF</i>
+ <reset>\u9AA\u9CD\u988</reset><i>\u9AA\u9C0</i>
+ <reset>\u9AA\u9CD\u989</reset><i>\u9AA\u9C1</i>
+ <reset>\u9AA\u9CD\u98A</reset><i>\u9AA\u9C2</i>
+ <reset>\u9AA\u9CD\u98B</reset><i>\u9AA\u9C3</i>
+ <reset>\u9AA\u9CD\u9E0</reset><i>\u9AA\u9C4</i>
+ <reset>\u9AA\u9CD\u98C</reset><i>\u9AA\u9E2</i>
+ <reset>\u9AA\u9CD\u9E1</reset><i>\u9AA\u9E3</i>
+ <reset>\u9AA\u9CD\u98F</reset><i>\u9AA\u9C7</i>
+ <reset>\u9AA\u9CD\u990</reset><i>\u9AA\u9C8</i>
+ <reset>\u9AA\u9CD\u993</reset><i>\u9AA\u9CB</i>
+ <reset>\u9AA\u9CD\u994</reset><i>\u9AA\u9CC</i>
+
+ <reset>\u9AB\u9CD\u985</reset><i>\u9AB</i>
+ <reset>\u9AB\u9CD\u986</reset><i>\u9AB\u9BE</i>
+ <reset>\u9AB\u9CD\u987</reset><i>\u9AB\u9BF</i>
+ <reset>\u9AB\u9CD\u988</reset><i>\u9AB\u9C0</i>
+ <reset>\u9AB\u9CD\u989</reset><i>\u9AB\u9C1</i>
+ <reset>\u9AB\u9CD\u98A</reset><i>\u9AB\u9C2</i>
+ <reset>\u9AB\u9CD\u98B</reset><i>\u9AB\u9C3</i>
+ <reset>\u9AB\u9CD\u9E0</reset><i>\u9AB\u9C4</i>
+ <reset>\u9AB\u9CD\u98C</reset><i>\u9AB\u9E2</i>
+ <reset>\u9AB\u9CD\u9E1</reset><i>\u9AB\u9E3</i>
+ <reset>\u9AB\u9CD\u98F</reset><i>\u9AB\u9C7</i>
+ <reset>\u9AB\u9CD\u990</reset><i>\u9AB\u9C8</i>
+ <reset>\u9AB\u9CD\u993</reset><i>\u9AB\u9CB</i>
+ <reset>\u9AB\u9CD\u994</reset><i>\u9AB\u9CC</i>
+
+ <reset>\u9AC\u9CD\u985</reset><i>\u9AC</i>
+ <reset>\u9AC\u9CD\u986</reset><i>\u9AC\u9BE</i>
+ <reset>\u9AC\u9CD\u987</reset><i>\u9AC\u9BF</i>
+ <reset>\u9AC\u9CD\u988</reset><i>\u9AC\u9C0</i>
+ <reset>\u9AC\u9CD\u989</reset><i>\u9AC\u9C1</i>
+ <reset>\u9AC\u9CD\u98A</reset><i>\u9AC\u9C2</i>
+ <reset>\u9AC\u9CD\u98B</reset><i>\u9AC\u9C3</i>
+ <reset>\u9AC\u9CD\u9E0</reset><i>\u9AC\u9C4</i>
+ <reset>\u9AC\u9CD\u98C</reset><i>\u9AC\u9E2</i>
+ <reset>\u9AC\u9CD\u9E1</reset><i>\u9AC\u9E3</i>
+ <reset>\u9AC\u9CD\u98F</reset><i>\u9AC\u9C7</i>
+ <reset>\u9AC\u9CD\u990</reset><i>\u9AC\u9C8</i>
+ <reset>\u9AC\u9CD\u993</reset><i>\u9AC\u9CB</i>
+ <reset>\u9AC\u9CD\u994</reset><i>\u9AC\u9CC</i>
+
+ <reset>\u9AD\u9CD\u985</reset><i>\u9AD</i>
+ <reset>\u9AD\u9CD\u986</reset><i>\u9AD\u9BE</i>
+ <reset>\u9AD\u9CD\u987</reset><i>\u9AD\u9BF</i>
+ <reset>\u9AD\u9CD\u988</reset><i>\u9AD\u9C0</i>
+ <reset>\u9AD\u9CD\u989</reset><i>\u9AD\u9C1</i>
+ <reset>\u9AD\u9CD\u98A</reset><i>\u9AD\u9C2</i>
+ <reset>\u9AD\u9CD\u98B</reset><i>\u9AD\u9C3</i>
+ <reset>\u9AD\u9CD\u9E0</reset><i>\u9AD\u9C4</i>
+ <reset>\u9AD\u9CD\u98C</reset><i>\u9AD\u9E2</i>
+ <reset>\u9AD\u9CD\u9E1</reset><i>\u9AD\u9E3</i>
+ <reset>\u9AD\u9CD\u98F</reset><i>\u9AD\u9C7</i>
+ <reset>\u9AD\u9CD\u990</reset><i>\u9AD\u9C8</i>
+ <reset>\u9AD\u9CD\u993</reset><i>\u9AD\u9CB</i>
+ <reset>\u9AD\u9CD\u994</reset><i>\u9AD\u9CC</i>
+
+ <reset>\u9AE\u9CD\u985</reset><i>\u9AE</i>
+ <reset>\u9AE\u9CD\u986</reset><i>\u9AE\u9BE</i>
+ <reset>\u9AE\u9CD\u987</reset><i>\u9AE\u9BF</i>
+ <reset>\u9AE\u9CD\u988</reset><i>\u9AE\u9C0</i>
+ <reset>\u9AE\u9CD\u989</reset><i>\u9AE\u9C1</i>
+ <reset>\u9AE\u9CD\u98A</reset><i>\u9AE\u9C2</i>
+ <reset>\u9AE\u9CD\u98B</reset><i>\u9AE\u9C3</i>
+ <reset>\u9AE\u9CD\u9E0</reset><i>\u9AE\u9C4</i>
+ <reset>\u9AE\u9CD\u98C</reset><i>\u9AE\u9E2</i>
+ <reset>\u9AE\u9CD\u9E1</reset><i>\u9AE\u9E3</i>
+ <reset>\u9AE\u9CD\u98F</reset><i>\u9AE\u9C7</i>
+ <reset>\u9AE\u9CD\u990</reset><i>\u9AE\u9C8</i>
+ <reset>\u9AE\u9CD\u993</reset><i>\u9AE\u9CB</i>
+ <reset>\u9AE\u9CD\u994</reset><i>\u9AE\u9CC</i>
+
+ <reset>\u9AF\u9CD\u985</reset><i>\u9AF</i>
+ <reset>\u9AF\u9CD\u986</reset><i>\u9AF\u9BE</i>
+ <reset>\u9AF\u9CD\u987</reset><i>\u9AF\u9BF</i>
+ <reset>\u9AF\u9CD\u988</reset><i>\u9AF\u9C0</i>
+ <reset>\u9AF\u9CD\u989</reset><i>\u9AF\u9C1</i>
+ <reset>\u9AF\u9CD\u98A</reset><i>\u9AF\u9C2</i>
+ <reset>\u9AF\u9CD\u98B</reset><i>\u9AF\u9C3</i>
+ <reset>\u9AF\u9CD\u9E0</reset><i>\u9AF\u9C4</i>
+ <reset>\u9AF\u9CD\u98C</reset><i>\u9AF\u9E2</i>
+ <reset>\u9AF\u9CD\u9E1</reset><i>\u9AF\u9E3</i>
+ <reset>\u9AF\u9CD\u98F</reset><i>\u9AF\u9C7</i>
+ <reset>\u9AF\u9CD\u990</reset><i>\u9AF\u9C8</i>
+ <reset>\u9AF\u9CD\u993</reset><i>\u9AF\u9CB</i>
+ <reset>\u9AF\u9CD\u994</reset><i>\u9AF\u9CC</i>
+
+ <reset>\u9B0\u9CD\u985</reset><i>\u9B0</i>
+ <reset>\u9B0\u9CD\u986</reset><i>\u9B0\u9BE</i>
+ <reset>\u9B0\u9CD\u987</reset><i>\u9B0\u9BF</i>
+ <reset>\u9B0\u9CD\u988</reset><i>\u9B0\u9C0</i>
+ <reset>\u9B0\u9CD\u989</reset><i>\u9B0\u9C1</i>
+ <reset>\u9B0\u9CD\u98A</reset><i>\u9B0\u9C2</i>
+ <reset>\u9B0\u9CD\u98B</reset><i>\u9B0\u9C3</i>
+ <reset>\u9B0\u9CD\u9E0</reset><i>\u9B0\u9C4</i>
+ <reset>\u9B0\u9CD\u98C</reset><i>\u9B0\u9E2</i>
+ <reset>\u9B0\u9CD\u9E1</reset><i>\u9B0\u9E3</i>
+ <reset>\u9B0\u9CD\u98F</reset><i>\u9B0\u9C7</i>
+ <reset>\u9B0\u9CD\u990</reset><i>\u9B0\u9C8</i>
+ <reset>\u9B0\u9CD\u993</reset><i>\u9B0\u9CB</i>
+ <reset>\u9B0\u9CD\u994</reset><i>\u9B0\u9CC</i>
+
+ <reset>\u9F0\u9CD\u985</reset><i>\u9F0</i>
+ <reset>\u9F0\u9CD\u986</reset><i>\u9F0\u9BE</i>
+ <reset>\u9F0\u9CD\u987</reset><i>\u9F0\u9BF</i>
+ <reset>\u9F0\u9CD\u988</reset><i>\u9F0\u9C0</i>
+ <reset>\u9F0\u9CD\u989</reset><i>\u9F0\u9C1</i>
+ <reset>\u9F0\u9CD\u98A</reset><i>\u9F0\u9C2</i>
+ <reset>\u9F0\u9CD\u98B</reset><i>\u9F0\u9C3</i>
+ <reset>\u9F0\u9CD\u9E0</reset><i>\u9F0\u9C4</i>
+ <reset>\u9F0\u9CD\u98C</reset><i>\u9F0\u9E2</i>
+ <reset>\u9F0\u9CD\u9E1</reset><i>\u9F0\u9E3</i>
+ <reset>\u9F0\u9CD\u98F</reset><i>\u9F0\u9C7</i>
+ <reset>\u9F0\u9CD\u990</reset><i>\u9F0\u9C8</i>
+ <reset>\u9F0\u9CD\u993</reset><i>\u9F0\u9CB</i>
+ <reset>\u9F0\u9CD\u994</reset><i>\u9F0\u9CC</i>
+
+ <reset>\u9B2\u9CD\u985</reset><i>\u9B2</i>
+ <reset>\u9B2\u9CD\u986</reset><i>\u9B2\u9BE</i>
+ <reset>\u9B2\u9CD\u987</reset><i>\u9B2\u9BF</i>
+ <reset>\u9B2\u9CD\u988</reset><i>\u9B2\u9C0</i>
+ <reset>\u9B2\u9CD\u989</reset><i>\u9B2\u9C1</i>
+ <reset>\u9B2\u9CD\u98A</reset><i>\u9B2\u9C2</i>
+ <reset>\u9B2\u9CD\u98B</reset><i>\u9B2\u9C3</i>
+ <reset>\u9B2\u9CD\u9E0</reset><i>\u9B2\u9C4</i>
+ <reset>\u9B2\u9CD\u98C</reset><i>\u9B2\u9E2</i>
+ <reset>\u9B2\u9CD\u9E1</reset><i>\u9B2\u9E3</i>
+ <reset>\u9B2\u9CD\u98F</reset><i>\u9B2\u9C7</i>
+ <reset>\u9B2\u9CD\u990</reset><i>\u9B2\u9C8</i>
+ <reset>\u9B2\u9CD\u993</reset><i>\u9B2\u9CB</i>
+ <reset>\u9B2\u9CD\u994</reset><i>\u9B2\u9CC</i>
+
+ <reset>\u9F1\u9CD\u985</reset><i>\u9F1</i>
+ <reset>\u9F1\u9CD\u986</reset><i>\u9F1\u9BE</i>
+ <reset>\u9F1\u9CD\u987</reset><i>\u9F1\u9BF</i>
+ <reset>\u9F1\u9CD\u988</reset><i>\u9F1\u9C0</i>
+ <reset>\u9F1\u9CD\u989</reset><i>\u9F1\u9C1</i>
+ <reset>\u9F1\u9CD\u98A</reset><i>\u9F1\u9C2</i>
+ <reset>\u9F1\u9CD\u98B</reset><i>\u9F1\u9C3</i>
+ <reset>\u9F1\u9CD\u9E0</reset><i>\u9F1\u9C4</i>
+ <reset>\u9F1\u9CD\u98C</reset><i>\u9F1\u9E2</i>
+ <reset>\u9F1\u9CD\u9E1</reset><i>\u9F1\u9E3</i>
+ <reset>\u9F1\u9CD\u98F</reset><i>\u9F1\u9C7</i>
+ <reset>\u9F1\u9CD\u990</reset><i>\u9F1\u9C8</i>
+ <reset>\u9F1\u9CD\u993</reset><i>\u9F1\u9CB</i>
+ <reset>\u9F1\u9CD\u994</reset><i>\u9F1\u9CC</i>
+
+ <reset>\u9B6\u9CD\u985</reset><i>\u9B6</i>
+ <reset>\u9B6\u9CD\u986</reset><i>\u9B6\u9BE</i>
+ <reset>\u9B6\u9CD\u987</reset><i>\u9B6\u9BF</i>
+ <reset>\u9B6\u9CD\u988</reset><i>\u9B6\u9C0</i>
+ <reset>\u9B6\u9CD\u989</reset><i>\u9B6\u9C1</i>
+ <reset>\u9B6\u9CD\u98A</reset><i>\u9B6\u9C2</i>
+ <reset>\u9B6\u9CD\u98B</reset><i>\u9B6\u9C3</i>
+ <reset>\u9B6\u9CD\u9E0</reset><i>\u9B6\u9C4</i>
+ <reset>\u9B6\u9CD\u98C</reset><i>\u9B6\u9E2</i>
+ <reset>\u9B6\u9CD\u9E1</reset><i>\u9B6\u9E3</i>
+ <reset>\u9B6\u9CD\u98F</reset><i>\u9B6\u9C7</i>
+ <reset>\u9B6\u9CD\u990</reset><i>\u9B6\u9C8</i>
+ <reset>\u9B6\u9CD\u993</reset><i>\u9B6\u9CB</i>
+ <reset>\u9B6\u9CD\u994</reset><i>\u9B6\u9CC</i>
+
+ <reset>\u9B7\u9CD\u985</reset><i>\u9B7</i>
+ <reset>\u9B7\u9CD\u986</reset><i>\u9B7\u9BE</i>
+ <reset>\u9B7\u9CD\u987</reset><i>\u9B7\u9BF</i>
+ <reset>\u9B7\u9CD\u988</reset><i>\u9B7\u9C0</i>
+ <reset>\u9B7\u9CD\u989</reset><i>\u9B7\u9C1</i>
+ <reset>\u9B7\u9CD\u98A</reset><i>\u9B7\u9C2</i>
+ <reset>\u9B7\u9CD\u98B</reset><i>\u9B7\u9C3</i>
+ <reset>\u9B7\u9CD\u9E0</reset><i>\u9B7\u9C4</i>
+ <reset>\u9B7\u9CD\u98C</reset><i>\u9B7\u9E2</i>
+ <reset>\u9B7\u9CD\u9E1</reset><i>\u9B7\u9E3</i>
+ <reset>\u9B7\u9CD\u98F</reset><i>\u9B7\u9C7</i>
+ <reset>\u9B7\u9CD\u990</reset><i>\u9B7\u9C8</i>
+ <reset>\u9B7\u9CD\u993</reset><i>\u9B7\u9CB</i>
+ <reset>\u9B7\u9CD\u994</reset><i>\u9B7\u9CC</i>
+
+ <reset>\u9B8\u9CD\u985</reset><i>\u9B8</i>
+ <reset>\u9B8\u9CD\u986</reset><i>\u9B8\u9BE</i>
+ <reset>\u9B8\u9CD\u987</reset><i>\u9B8\u9BF</i>
+ <reset>\u9B8\u9CD\u988</reset><i>\u9B8\u9C0</i>
+ <reset>\u9B8\u9CD\u989</reset><i>\u9B8\u9C1</i>
+ <reset>\u9B8\u9CD\u98A</reset><i>\u9B8\u9C2</i>
+ <reset>\u9B8\u9CD\u98B</reset><i>\u9B8\u9C3</i>
+ <reset>\u9B8\u9CD\u9E0</reset><i>\u9B8\u9C4</i>
+ <reset>\u9B8\u9CD\u98C</reset><i>\u9B8\u9E2</i>
+ <reset>\u9B8\u9CD\u9E1</reset><i>\u9B8\u9E3</i>
+ <reset>\u9B8\u9CD\u98F</reset><i>\u9B8\u9C7</i>
+ <reset>\u9B8\u9CD\u990</reset><i>\u9B8\u9C8</i>
+ <reset>\u9B8\u9CD\u993</reset><i>\u9B8\u9CB</i>
+ <reset>\u9B8\u9CD\u994</reset><i>\u9B8\u9CC</i>
+
+ <reset>\u9B9\u9CD\u985</reset><i>\u9B9</i>
+ <reset>\u9B9\u9CD\u986</reset><i>\u9B9\u9BE</i>
+ <reset>\u9B9\u9CD\u987</reset><i>\u9B9\u9BF</i>
+ <reset>\u9B9\u9CD\u988</reset><i>\u9B9\u9C0</i>
+ <reset>\u9B9\u9CD\u989</reset><i>\u9B9\u9C1</i>
+ <reset>\u9B9\u9CD\u98A</reset><i>\u9B9\u9C2</i>
+ <reset>\u9B9\u9CD\u98B</reset><i>\u9B9\u9C3</i>
+ <reset>\u9B9\u9CD\u9E0</reset><i>\u9B9\u9C4</i>
+ <reset>\u9B9\u9CD\u98C</reset><i>\u9B9\u9E2</i>
+ <reset>\u9B9\u9CD\u9E1</reset><i>\u9B9\u9E3</i>
+ <reset>\u9B9\u9CD\u98F</reset><i>\u9B9\u9C7</i>
+ <reset>\u9B9\u9CD\u990</reset><i>\u9B9\u9C8</i>
+ <reset>\u9B9\u9CD\u993</reset><i>\u9B9\u9CB</i>
+ <reset>\u9B9\u9CD\u994</reset><i>\u9B9\u9CC</i>
+
+ <reset>\u995</reset><t>\u995\u9BC</t>
+ <reset>\u995\u9BE</reset><t>\u995\u9BC\u9BE</t>
+ <reset>\u995\u9BF</reset><t>\u995\u9BC\u9BF</t>
+ <reset>\u995\u9C0</reset><t>\u995\u9BC\u9C0</t>
+ <reset>\u995\u9C1</reset><t>\u995\u9BC\u9C1</t>
+ <reset>\u995\u9C2</reset><t>\u995\u9BC\u9C2</t>
+ <reset>\u995\u9C3</reset><t>\u995\u9BC\u9C3</t>
+ <reset>\u995\u9C4</reset><t>\u995\u9BC\u9C4</t>
+ <reset>\u995\u9E2</reset><t>\u995\u9BC\u9E2</t>
+ <reset>\u995\u9E3</reset><t>\u995\u9BC\u9E3</t>
+ <reset>\u995\u9C7</reset><t>\u995\u9BC\u9C7</t>
+ <reset>\u995\u9C8</reset><t>\u995\u9BC\u9C8</t>
+ <reset>\u995\u9CB</reset><t>\u995\u9BC\u9CB</t>
+ <reset>\u995\u9CC</reset><t>\u995\u9BC\u9CC</t>
+ <reset>\u995\u9CD</reset><t>\u995\u9BC\u9CD</t>
+
+ <reset>\u996</reset><t>\u996\u9BC</t>
+ <reset>\u996\u9BE</reset><t>\u996\u9BC\u9BE</t>
+ <reset>\u996\u9BF</reset><t>\u996\u9BC\u9BF</t>
+ <reset>\u996\u9C0</reset><t>\u996\u9BC\u9C0</t>
+ <reset>\u996\u9C1</reset><t>\u996\u9BC\u9C1</t>
+ <reset>\u996\u9C2</reset><t>\u996\u9BC\u9C2</t>
+ <reset>\u996\u9C3</reset><t>\u996\u9BC\u9C3</t>
+ <reset>\u996\u9C4</reset><t>\u996\u9BC\u9C4</t>
+ <reset>\u996\u9E2</reset><t>\u996\u9BC\u9E2</t>
+ <reset>\u996\u9E3</reset><t>\u996\u9BC\u9E3</t>
+ <reset>\u996\u9C7</reset><t>\u996\u9BC\u9C7</t>
+ <reset>\u996\u9C8</reset><t>\u996\u9BC\u9C8</t>
+ <reset>\u996\u9CB</reset><t>\u996\u9BC\u9CB</t>
+ <reset>\u996\u9CC</reset><t>\u996\u9BC\u9CC</t>
+ <reset>\u996\u9CD</reset><t>\u996\u9BC\u9CD</t>
+
+ <reset>\u997</reset><t>\u997\u9BC</t>
+ <reset>\u997\u9BE</reset><t>\u997\u9BC\u9BE</t>
+ <reset>\u997\u9BF</reset><t>\u997\u9BC\u9BF</t>
+ <reset>\u997\u9C0</reset><t>\u997\u9BC\u9C0</t>
+ <reset>\u997\u9C1</reset><t>\u997\u9BC\u9C1</t>
+ <reset>\u997\u9C2</reset><t>\u997\u9BC\u9C2</t>
+ <reset>\u997\u9C3</reset><t>\u997\u9BC\u9C3</t>
+ <reset>\u997\u9C4</reset><t>\u997\u9BC\u9C4</t>
+ <reset>\u997\u9E2</reset><t>\u997\u9BC\u9E2</t>
+ <reset>\u997\u9E3</reset><t>\u997\u9BC\u9E3</t>
+ <reset>\u997\u9C7</reset><t>\u997\u9BC\u9C7</t>
+ <reset>\u997\u9C8</reset><t>\u997\u9BC\u9C8</t>
+ <reset>\u997\u9CB</reset><t>\u997\u9BC\u9CB</t>
+ <reset>\u997\u9CC</reset><t>\u997\u9BC\u9CC</t>
+ <reset>\u997\u9CD</reset><t>\u997\u9BC\u9CD</t>
+
+ <reset>\u99C</reset><t>\u99C\u9BC</t>
+ <reset>\u99C\u9BE</reset><t>\u99C\u9BC\u9BE</t>
+ <reset>\u99C\u9BF</reset><t>\u99C\u9BC\u9BF</t>
+ <reset>\u99C\u9C0</reset><t>\u99C\u9BC\u9C0</t>
+ <reset>\u99C\u9C1</reset><t>\u99C\u9BC\u9C1</t>
+ <reset>\u99C\u9C2</reset><t>\u99C\u9BC\u9C2</t>
+ <reset>\u99C\u9C3</reset><t>\u99C\u9BC\u9C3</t>
+ <reset>\u99C\u9C4</reset><t>\u99C\u9BC\u9C4</t>
+ <reset>\u99C\u9E2</reset><t>\u99C\u9BC\u9E2</t>
+ <reset>\u99C\u9E3</reset><t>\u99C\u9BC\u9E3</t>
+ <reset>\u99C\u9C7</reset><t>\u99C\u9BC\u9C7</t>
+ <reset>\u99C\u9C8</reset><t>\u99C\u9BC\u9C8</t>
+ <reset>\u99C\u9CB</reset><t>\u99C\u9BC\u9CB</t>
+ <reset>\u99C\u9CC</reset><t>\u99C\u9BC\u9CC</t>
+ <reset>\u99C\u9CD</reset><t>\u99C\u9BC\u9CD</t>
+
+ <reset>\u9A1</reset><t>\u9A1\u9BC</t>
+ <reset>\u9A1\u9BE</reset><t>\u9A1\u9BC\u9BE</t>
+ <reset>\u9A1\u9BF</reset><t>\u9A1\u9BC\u9BF</t>
+ <reset>\u9A1\u9C0</reset><t>\u9A1\u9BC\u9C0</t>
+ <reset>\u9A1\u9C1</reset><t>\u9A1\u9BC\u9C1</t>
+ <reset>\u9A1\u9C2</reset><t>\u9A1\u9BC\u9C2</t>
+ <reset>\u9A1\u9C3</reset><t>\u9A1\u9BC\u9C3</t>
+ <reset>\u9A1\u9C4</reset><t>\u9A1\u9BC\u9C4</t>
+ <reset>\u9A1\u9E2</reset><t>\u9A1\u9BC\u9E2</t>
+ <reset>\u9A1\u9E3</reset><t>\u9A1\u9BC\u9E3</t>
+ <reset>\u9A1\u9C7</reset><t>\u9A1\u9BC\u9C7</t>
+ <reset>\u9A1\u9C8</reset><t>\u9A1\u9BC\u9C8</t>
+ <reset>\u9A1\u9CB</reset><t>\u9A1\u9BC\u9CB</t>
+ <reset>\u9A1\u9CC</reset><t>\u9A1\u9BC\u9CC</t>
+ <reset>\u9A1\u9CD</reset><t>\u9A1\u9BC\u9CD</t>
+
+ <reset>\u9A2</reset><t>\u9A2\u9BC</t>
+ <reset>\u9A2\u9BE</reset><t>\u9A2\u9BC\u9BE</t>
+ <reset>\u9A2\u9BF</reset><t>\u9A2\u9BC\u9BF</t>
+ <reset>\u9A2\u9C0</reset><t>\u9A2\u9BC\u9C0</t>
+ <reset>\u9A2\u9C1</reset><t>\u9A2\u9BC\u9C1</t>
+ <reset>\u9A2\u9C2</reset><t>\u9A2\u9BC\u9C2</t>
+ <reset>\u9A2\u9C3</reset><t>\u9A2\u9BC\u9C3</t>
+ <reset>\u9A2\u9C4</reset><t>\u9A2\u9BC\u9C4</t>
+ <reset>\u9A2\u9E2</reset><t>\u9A2\u9BC\u9E2</t>
+ <reset>\u9A2\u9E3</reset><t>\u9A2\u9BC\u9E3</t>
+ <reset>\u9A2\u9C7</reset><t>\u9A2\u9BC\u9C7</t>
+ <reset>\u9A2\u9C8</reset><t>\u9A2\u9BC\u9C8</t>
+ <reset>\u9A2\u9CB</reset><t>\u9A2\u9BC\u9CB</t>
+ <reset>\u9A2\u9CC</reset><t>\u9A2\u9BC\u9CC</t>
+ <reset>\u9A2\u9CD</reset><t>\u9A2\u9BC\u9CD</t>
+
+ <reset>\u9AB</reset><t>\u9AB\u9BC</t>
+ <reset>\u9AB\u9BE</reset><t>\u9AB\u9BC\u9BE</t>
+ <reset>\u9AB\u9BF</reset><t>\u9AB\u9BC\u9BF</t>
+ <reset>\u9AB\u9C0</reset><t>\u9AB\u9BC\u9C0</t>
+ <reset>\u9AB\u9C1</reset><t>\u9AB\u9BC\u9C1</t>
+ <reset>\u9AB\u9C2</reset><t>\u9AB\u9BC\u9C2</t>
+ <reset>\u9AB\u9C3</reset><t>\u9AB\u9BC\u9C3</t>
+ <reset>\u9AB\u9C4</reset><t>\u9AB\u9BC\u9C4</t>
+ <reset>\u9AB\u9E2</reset><t>\u9AB\u9BC\u9E2</t>
+ <reset>\u9AB\u9E3</reset><t>\u9AB\u9BC\u9E3</t>
+ <reset>\u9AB\u9C7</reset><t>\u9AB\u9BC\u9C7</t>
+ <reset>\u9AB\u9C8</reset><t>\u9AB\u9BC\u9C8</t>
+ <reset>\u9AB\u9CB</reset><t>\u9AB\u9BC\u9CB</t>
+ <reset>\u9AB\u9CC</reset><t>\u9AB\u9BC\u9CC</t>
+ <reset>\u9AB\u9CD</reset><t>\u9AB\u9BC\u9CD</t>
+
+ <reset>\u9AC</reset><t>\u9AC\u9BC</t>
+ <reset>\u9AC\u9BE</reset><t>\u9AC\u9BC\u9BE</t>
+ <reset>\u9AC\u9BF</reset><t>\u9AC\u9BC\u9BF</t>
+ <reset>\u9AC\u9C0</reset><t>\u9AC\u9BC\u9C0</t>
+ <reset>\u9AC\u9C1</reset><t>\u9AC\u9BC\u9C1</t>
+ <reset>\u9AC\u9C2</reset><t>\u9AC\u9BC\u9C2</t>
+ <reset>\u9AC\u9C3</reset><t>\u9AC\u9BC\u9C3</t>
+ <reset>\u9AC\u9C4</reset><t>\u9AC\u9BC\u9C4</t>
+ <reset>\u9AC\u9E2</reset><t>\u9AC\u9BC\u9E2</t>
+ <reset>\u9AC\u9E3</reset><t>\u9AC\u9BC\u9E3</t>
+ <reset>\u9AC\u9C7</reset><t>\u9AC\u9BC\u9C7</t>
+ <reset>\u9AC\u9C8</reset><t>\u9AC\u9BC\u9C8</t>
+ <reset>\u9AC\u9CB</reset><t>\u9AC\u9BC\u9CB</t>
+ <reset>\u9AC\u9CC</reset><t>\u9AC\u9BC\u9CC</t>
+ <reset>\u9AC\u9CD</reset><t>\u9AC\u9BC\u9CD</t>
+
+ <reset>\u9AF</reset><t>\u9AF\u9BC</t>
+ <reset>\u9AF\u9BE</reset><t>\u9AF\u9BC\u9BE</t>
+ <reset>\u9AF\u9BF</reset><t>\u9AF\u9BC\u9BF</t>
+ <reset>\u9AF\u9C0</reset><t>\u9AF\u9BC\u9C0</t>
+ <reset>\u9AF\u9C1</reset><t>\u9AF\u9BC\u9C1</t>
+ <reset>\u9AF\u9C2</reset><t>\u9AF\u9BC\u9C2</t>
+ <reset>\u9AF\u9C3</reset><t>\u9AF\u9BC\u9C3</t>
+ <reset>\u9AF\u9C4</reset><t>\u9AF\u9BC\u9C4</t>
+ <reset>\u9AF\u9E2</reset><t>\u9AF\u9BC\u9E2</t>
+ <reset>\u9AF\u9E3</reset><t>\u9AF\u9BC\u9E3</t>
+ <reset>\u9AF\u9C7</reset><t>\u9AF\u9BC\u9C7</t>
+ <reset>\u9AF\u9C8</reset><t>\u9AF\u9BC\u9C8</t>
+ <reset>\u9AF\u9CB</reset><t>\u9AF\u9BC\u9CB</t>
+ <reset>\u9AF\u9CC</reset><t>\u9AF\u9BC\u9CC</t>
+ <reset>\u9AF\u9CD</reset><t>\u9AF\u9BC\u9CD</t>
+ </rules>
+ </collation>
+
+ </charset>
+
</charsets>
=== modified file 'mysql-test/t/ctype_ldml-master.opt'
--- mysql-test/t/ctype_ldml-master.opt 2007-06-07 12:55:55 +0000
+++ mysql-test/t/ctype_ldml-master.opt 2013-09-17 16:21:42 +0000
@@ -1,2 +1,2 @@
--character-sets-dir=$MYSQL_TEST_DIR/std_data/
-
+--log-error=$MYSQLTEST_VARDIR/tmp/ctype_ldml_log.err
=== modified file 'mysql-test/t/ctype_ldml.test'
--- mysql-test/t/ctype_ldml.test 2010-03-24 15:03:44 +0000
+++ mysql-test/t/ctype_ldml.test 2013-09-17 16:20:17 +0000
@@ -61,7 +61,6 @@ insert into t1 values ('a');
select * from t1 where c1='b';
drop table t1;
-
#
# Bug#41084 full-text index added to custom UCA collation not working
#
@@ -181,3 +180,188 @@ DROP TABLE t1;
SET NAMES utf8 COLLATE utf8_phone_ci;
SHOW COLLATION LIKE 'utf8_phone_ci';
SET NAMES utf8;
+
+# make sure utf8mb4_test_400_ci is Unicode-4.0.0 based
+SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a));
+SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a));
+SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a));
+SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a));
+
+--echo #
+--echo # WL#5624 Collation customization improvements
+--echo #
+SET NAMES utf8 COLLATE utf8_5624_1;
+CREATE TABLE t1 AS SELECT REPEAT(' ', 16) AS a LIMIT 0;
+# Part 1,2,3: long contractions and expansions
+# Part 7: Quarternary difference
+INSERT INTO t1 VALUES ('012345'),('001234'),('000123'),('000012'),('000001');
+INSERT INTO t1 VALUES ('12345'),('01234'),('00123'),('00012'),('00001');
+INSERT INTO t1 VALUES ('1234'),('0123'),('0012'),('0001');
+INSERT INTO t1 VALUES ('123'),('012'),('001');
+INSERT INTO t1 VALUES ('12'),('01');
+INSERT INTO t1 VALUES ('1'),('9');
+INSERT INTO t1 VALUES ('ÐÐÐ'),('ÐÐÐÐÐ');
+# Part 4: reset before
+# Part 6: characters rather than escape sequences
+INSERT INTO t1 VALUES ('a'),('b'),('c'),('d'),('e');
+INSERT INTO t1 VALUES ('cz'),('Ä'),('Ä');
+INSERT INTO t1 VALUES ('f'),('fz'),('g'),('Ä '),('Ä¡');
+INSERT INTO t1 VALUES ('h'),('hz'),('GĦ'),('Għ'),('gĦ'),('għ');
+INSERT INTO t1 VALUES ('i'),('iz'),('Ħ'),('ħ');
+INSERT INTO t1 VALUES ('y'),('yz'),('z'),('Ż'),('ż');
+INSERT INTO t1 VALUES ('Ä'),('Ä'),('á'),('Ã'),('à '),('Ã');
+INSERT INTO t1 VALUES ('Ä'),('é'),('Ä'),('ê'),('Ä'),('Ã'),('Ä'),('Ã');
+# Part 8: Abbreviated shift syntax
+INSERT INTO t1 VALUES ('a'),('~'),('!'),('@'),('#'),('$'),('%'),('^');
+INSERT INTO t1 VALUES ('('),(')'),('-'),('+'),('|'),('='),(':'),(';');
+INSERT INTO t1 VALUES ('"'),('\''),('?');
+# Part 9: Normal expansion syntax
+INSERT INTO t1 VALUES ('ch'),('k'),('cs'),('ccs'),('cscs');
+# Part 10: Previous context
+INSERT INTO t1 VALUES ('aa-'),('ab-'),('ac-'),('ad-'),('ae-'),('af-'),('az-');
+# Part 12: Logical reset positions
+INSERT INTO t1 VALUES ('lp-fni'),('lp-lni');
+INSERT INTO t1 VALUES ('lp-fpi'),('lp-lpi');
+INSERT INTO t1 VALUES ('lp-fsi'),('lp-lsi');
+INSERT INTO t1 VALUES ('lp-fti'),('lp-lti');
+INSERT INTO t1 VALUES ('lp-ft'),('lp-lt');
+INSERT INTO t1 VALUES ('lp-fv'),('lp-lv');
+# Logical positions with reset before
+INSERT INTO t1 VALUES ('lb-fni'),('lb-lni');
+INSERT INTO t1 VALUES ('lb-fv'),('lb-lv');
+# Part 5: Long tailoring
+INSERT INTO t1 VALUES (_ucs2 0x3106),(_ucs2 0x3110), (_ucs2 0x3111), (_ucs2 0x3112);
+INSERT INTO t1 VALUES (_ucs2 0x32A3), (_ucs2 0x3231);
+INSERT INTO t1 VALUES (_ucs2 0x84D9), (_ucs2 0x98F5), (_ucs2 0x7CF3), (_ucs2 0x5497);
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY a;
+--echo #
+--echo # WL#5624, the same test with UCS2
+--echo #
+ALTER TABLE t1 CONVERT TO CHARACTER SET ucs2 COLLATE ucs2_5624_1;
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY(a);
+DROP TABLE t1;
+
+--echo #
+--echo # WL#5624, unsupported features
+--echo #
+# Part 13: More verbosity
+--error ER_UNKNOWN_COLLATION
+SET NAMES utf8 COLLATE utf8_5624_2;
+SHOW WARNINGS;
+
+--echo #
+--echo # WL#5624, reset before primary ignorable
+--echo #
+--error ER_UNKNOWN_COLLATION
+SET NAMES utf8 COLLATE utf8_5624_3;
+SHOW WARNINGS;
+
+--echo #
+--echo # WL#5624, \u without hex digits is equal to {'\\', 'u'}
+--echo #
+SET NAMES utf8 COLLATE utf8_5624_4;
+CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES ('\\'),('u'),('x'),('X');
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY(a);
+DROP TABLE t1;
+
+--echo #
+--echo # WL#5624, testing Bengali collations
+--echo #
+SET NAMES utf8, collation_connection=utf8_bengali_standard_ci;
+CREATE TABLE t1 AS SELECT REPEAT (' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES (_ucs2 0x09FA), (_ucs2 0x09F8), (_ucs2 0x09F9), (_ucs2 0x09F2);
+INSERT INTO t1 VALUES (_ucs2 0x09DC), (_ucs2 0x09A109BC);
+INSERT INTO t1 VALUES (_ucs2 0x09A2), (_ucs2 0x09DD), (_ucs2 0x09A209BC);
+INSERT INTO t1 VALUES (_ucs2 0x09A3);
+SELECT HEX(CONVERT(a USING ucs2)), HEX(a)
+FROM t1 ORDER BY a, BINARY a;
+DROP TABLE t1;
+
+SET NAMES utf8, collation_connection=utf8_bengali_traditional_ci;
+CREATE TABLE t1 AS SELECT REPEAT (' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES
+(_ucs2 0x0985),(_ucs2 0x0986),(_ucs2 0x0987),(_ucs2 0x0988),
+(_ucs2 0x0989),(_ucs2 0x098A),(_ucs2 0x098B),(_ucs2 0x09E0),
+(_ucs2 0x098C),(_ucs2 0x09E1),(_ucs2 0x098F),(_ucs2 0x0990),
+(_ucs2 0x0993);
+
+INSERT INTO t1 VALUES
+(_ucs2 0x0994),(_ucs2 0x0982),(_ucs2 0x0983),(_ucs2 0x0981),
+(_ucs2 0x099509CD), (_ucs2 0x099609CD), (_ucs2 0x099709CD), (_ucs2 0x099809CD),
+(_ucs2 0x099909CD), (_ucs2 0x099A09CD), (_ucs2 0x099B09CD), (_ucs2 0x099C09CD),
+(_ucs2 0x099D09CD), (_ucs2 0x099E09CD), (_ucs2 0x099F09CD), (_ucs2 0x09A009CD),
+(_ucs2 0x09A109CD), (_ucs2 0x09A209CD), (_ucs2 0x09A309CD),
+(_ucs2 0x09CE), (_ucs2 0x09A409CD200D), (_ucs2 0x09A409CD),
+(_ucs2 0x09A509CD),(_ucs2 0x09A609CD),
+(_ucs2 0x09A709CD), (_ucs2 0x09A809CD), (_ucs2 0x09AA09CD), (_ucs2 0x09AB09CD),
+(_ucs2 0x09AC09CD), (_ucs2 0x09AD09CD), (_ucs2 0x09AE09CD), (_ucs2 0x09AF09CD),
+(_ucs2 0x09B009CD), (_ucs2 0x09F009CD), (_ucs2 0x09B209CD), (_ucs2 0x09F109CD),
+(_ucs2 0x09B609CD), (_ucs2 0x09B709CD), (_ucs2 0x09B809CD), (_ucs2 0x09B909CD);
+
+INSERT INTO t1 VALUES
+ (_ucs2 0x099509CD0985),(_ucs2 0x0995),
+ (_ucs2 0x099509CD0986),(_ucs2 0x099509BE),
+ (_ucs2 0x099509CD0987),(_ucs2 0x099509BF),
+ (_ucs2 0x099509CD0988),(_ucs2 0x099509C0),
+ (_ucs2 0x099509CD0989),(_ucs2 0x099509C1),
+ (_ucs2 0x099509CD098A),(_ucs2 0x099509C2),
+ (_ucs2 0x099509CD098B),(_ucs2 0x099509C3),
+ (_ucs2 0x099509CD09E0),(_ucs2 0x099509C4),
+ (_ucs2 0x099509CD098C),(_ucs2 0x099509E2),
+ (_ucs2 0x099509CD09E1),(_ucs2 0x099509E3),
+ (_ucs2 0x099509CD098F),(_ucs2 0x099509C7),
+ (_ucs2 0x099509CD0990),(_ucs2 0x099509C8),
+ (_ucs2 0x099509CD0993),(_ucs2 0x099509CB),
+ (_ucs2 0x099509CD0994),(_ucs2 0x099509CC);
+
+SELECT HEX(CONVERT(a USING ucs2)), HEX(a)
+FROM t1 ORDER BY a, BINARY(a);
+SELECT
+GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a)
+FROM t1 GROUP BY a ORDER BY a;
+DROP TABLE t1;
+
+--echo #
+--echo # WL#5624, shift after, using expansion
+--echo #
+SET NAMES utf8 COLLATE utf8_5624_5;
+CREATE TABLE t1 AS SELECT REPEAT(' ', 10) AS a LIMIT 0;
+INSERT INTO t1 VALUES ('0'),('1'),('0z'),(_ucs2 0x0030FF9D);
+INSERT INTO t1 VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i');
+INSERT INTO t1 VALUES ('j'),('k'),('l'),('m'),('n'),('o'),('p'),('q'),('r');
+INSERT INTO t1 VALUES ('s'),('t'),('u'),('v'),('w'),('x'),('y'),('z');
+INSERT INTO t1 VALUES ('aa'),('aaa');
+INSERT INTO t1 VALUES ('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I');
+INSERT INTO t1 VALUES ('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R');
+INSERT INTO t1 VALUES ('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z');
+INSERT INTO t1 VALUES ('AA'),('AAA');
+
+SELECT a FROM t1 ORDER BY a, LENGTH(a), BINARY(a);
+DROP TABLE t1;
+
+
+--echo #
+--echo # End of WL#5624
+--echo #
+
+
+--echo #
+--echo # Bug#14197426 PARSE ERRORS IN LOADABLE UCA / LDML COLLATIONS ARE SILENTLY IGNORED
+--echo #
+
+--let $out_file= $MYSQLTEST_VARDIR/tmp/ctype_ldml_log.err
+--let OUTF= $out_file
+# Error messages are not seen in error log in embedded version
+--let EMBEDDED=`SELECT version() LIKE '%embedded%'`
+--echo # Search for occurrences of [ERROR] Syntax error at '[strength tertiary]'
+
+perl;
+ use strict;
+ my $outf= $ENV{'OUTF'} or die "OUTF not set";
+ open(FILE, "$outf") or die("Unable to open $outf: $!\n");
+ my $count_error= grep(/\[ERROR\] Syntax error at '\[strength tertiary\]'/gi,<FILE>);
+ my $count_error= $count_error + $ENV{"EMBEDDED"};
+ print "Occurances : $count_error\n";
+ close(FILE);
+EOF
=== modified file 'mysql-test/t/ctype_uca.test'
--- mysql-test/t/ctype_uca.test 2011-07-04 08:42:17 +0000
+++ mysql-test/t/ctype_uca.test 2013-08-29 12:47:22 +0000
@@ -215,6 +215,7 @@ select group_concat(c1 order by c1) from
select group_concat(c1 order by c1) from t1 group by c1 collate utf8_esperanto_ci;
select group_concat(c1 order by c1) from t1 group by c1 collate utf8_hungarian_ci;
select group_concat(c1 order by c1) from t1 group by c1 collate utf8_croatian_ci;
+select group_concat(c1 order by c1) from t1 group by c1 collate utf8_german2_ci;
drop table t1;
@@ -580,3 +581,14 @@ drop table t1;
--echo #
--echo # End of 5.5 tests
--echo #
+
+--echo #
+--echo # WL#4013 Unicode german2 collation
+--echo #
+SET collation_connection=utf8_german2_ci;
+--source include/ctype_german.inc
+
+
+--echo #
+--echo # End of 5.6 tests
+--echo #
=== modified file 'mysys/charset-def.c'
--- mysys/charset-def.c 2013-07-18 14:46:57 +0000
+++ mysys/charset-def.c 2013-09-04 14:10:55 +0000
@@ -24,6 +24,7 @@
#ifdef HAVE_UCA_COLLATIONS
#ifdef HAVE_CHARSET_ucs2
+extern struct charset_info_st my_charset_ucs2_german2_uca_ci;
extern struct charset_info_st my_charset_ucs2_icelandic_uca_ci;
extern struct charset_info_st my_charset_ucs2_latvian_uca_ci;
extern struct charset_info_st my_charset_ucs2_romanian_uca_ci;
@@ -48,6 +49,7 @@ extern struct charset_info_st my_charset
#ifdef HAVE_CHARSET_utf32
+extern struct charset_info_st my_charset_utf32_german2_uca_ci;
extern struct charset_info_st my_charset_utf32_icelandic_uca_ci;
extern struct charset_info_st my_charset_utf32_latvian_uca_ci;
extern struct charset_info_st my_charset_utf32_romanian_uca_ci;
@@ -72,6 +74,7 @@ extern struct charset_info_st my_charset
#ifdef HAVE_CHARSET_utf16
+extern struct charset_info_st my_charset_utf16_german2_uca_ci;
extern struct charset_info_st my_charset_utf16_icelandic_uca_ci;
extern struct charset_info_st my_charset_utf16_latvian_uca_ci;
extern struct charset_info_st my_charset_utf16_romanian_uca_ci;
@@ -96,6 +99,7 @@ extern struct charset_info_st my_charset
#ifdef HAVE_CHARSET_utf8
+extern struct charset_info_st my_charset_utf8_german2_uca_ci;
extern struct charset_info_st my_charset_utf8_icelandic_uca_ci;
extern struct charset_info_st my_charset_utf8_latvian_uca_ci;
extern struct charset_info_st my_charset_utf8_romanian_uca_ci;
@@ -122,6 +126,7 @@ extern struct charset_info_st my_charset
#endif
#ifdef HAVE_CHARSET_utf8mb4
+extern struct charset_info_st my_charset_utf8mb4_german2_uca_ci;
extern struct charset_info_st my_charset_utf8mb4_icelandic_uca_ci;
extern struct charset_info_st my_charset_utf8mb4_latvian_uca_ci;
extern struct charset_info_st my_charset_utf8mb4_romanian_uca_ci;
@@ -211,6 +216,7 @@ my_bool init_compiled_charsets(myf flags
add_compiled_collation(&my_charset_ucs2_general_mysql500_ci);
#ifdef HAVE_UCA_COLLATIONS
add_compiled_collation(&my_charset_ucs2_unicode_ci);
+ add_compiled_collation(&my_charset_ucs2_german2_uca_ci);
add_compiled_collation(&my_charset_ucs2_icelandic_uca_ci);
add_compiled_collation(&my_charset_ucs2_latvian_uca_ci);
add_compiled_collation(&my_charset_ucs2_romanian_uca_ci);
@@ -248,6 +254,7 @@ my_bool init_compiled_charsets(myf flags
#endif
#ifdef HAVE_UCA_COLLATIONS
add_compiled_collation(&my_charset_utf8_unicode_ci);
+ add_compiled_collation(&my_charset_utf8_german2_uca_ci);
add_compiled_collation(&my_charset_utf8_icelandic_uca_ci);
add_compiled_collation(&my_charset_utf8_latvian_uca_ci);
add_compiled_collation(&my_charset_utf8_romanian_uca_ci);
@@ -277,6 +284,7 @@ my_bool init_compiled_charsets(myf flags
add_compiled_collation(&my_charset_utf8mb4_bin);
#ifdef HAVE_UCA_COLLATIONS
add_compiled_collation(&my_charset_utf8mb4_unicode_ci);
+ add_compiled_collation(&my_charset_utf8mb4_german2_uca_ci);
add_compiled_collation(&my_charset_utf8mb4_icelandic_uca_ci);
add_compiled_collation(&my_charset_utf8mb4_latvian_uca_ci);
add_compiled_collation(&my_charset_utf8mb4_romanian_uca_ci);
@@ -308,6 +316,7 @@ my_bool init_compiled_charsets(myf flags
add_compiled_collation(&my_charset_utf16le_bin);
#ifdef HAVE_UCA_COLLATIONS
add_compiled_collation(&my_charset_utf16_unicode_ci);
+ add_compiled_collation(&my_charset_utf16_german2_uca_ci);
add_compiled_collation(&my_charset_utf16_icelandic_uca_ci);
add_compiled_collation(&my_charset_utf16_latvian_uca_ci);
add_compiled_collation(&my_charset_utf16_romanian_uca_ci);
@@ -337,6 +346,7 @@ my_bool init_compiled_charsets(myf flags
add_compiled_collation(&my_charset_utf32_bin);
#ifdef HAVE_UCA_COLLATIONS
add_compiled_collation(&my_charset_utf32_unicode_ci);
+ add_compiled_collation(&my_charset_utf32_german2_uca_ci);
add_compiled_collation(&my_charset_utf32_icelandic_uca_ci);
add_compiled_collation(&my_charset_utf32_latvian_uca_ci);
add_compiled_collation(&my_charset_utf32_romanian_uca_ci);
=== modified file 'mysys/charset.c'
--- mysys/charset.c 2012-08-14 14:23:34 +0000
+++ mysys/charset.c 2013-09-17 11:14:49 +0000
@@ -214,6 +214,8 @@ copy_uca_collation(struct charset_info_s
to->max_sort_char= from->max_sort_char;
to->mbminlen= from->mbminlen;
to->mbmaxlen= from->mbmaxlen;
+ to->caseup_multiply= from->caseup_multiply;
+ to->casedn_multiply= from->casedn_multiply;
to->state|= MY_CS_AVAILABLE | MY_CS_LOADED |
MY_CS_STRNXFRM | MY_CS_UNICODE;
}
@@ -349,6 +351,7 @@ static int add_collation(struct charset_
return MY_XML_OK;
}
+
/**
Report character set initialization errors and warnings.
Be silent by default: no warnings on the client side.
@@ -361,13 +364,53 @@ default_reporter(enum loglevel level __
}
my_error_reporter my_charset_error_reporter= default_reporter;
+
+/**
+ Wrappers for memory functions my_malloc (and friends)
+ with C-compatbile API without extra "myf" argument.
+*/
+static void *
+my_once_alloc_c(size_t size)
+{ return my_once_alloc(size, MYF(MY_WME)); }
+
+
+static void *
+my_malloc_c(size_t size)
+{ return my_malloc(size, MYF(MY_WME)); }
+
+
+static void *
+my_realloc_c(void *old, size_t size)
+{ return my_realloc(old, size, MYF(MY_WME|MY_ALLOW_ZERO_PTR)); }
+
+
+/**
+ Initialize character set loader to use mysys memory management functions.
+ @param loader Loader to initialize
+*/
+void
+my_charset_loader_init_mysys(MY_CHARSET_LOADER *loader)
+{
+ loader->error[0]= '\0';
+ loader->once_alloc= my_once_alloc_c;
+ loader->malloc= my_malloc_c;
+ loader->realloc= my_realloc_c;
+ loader->free= my_free;
+ loader->reporter= my_charset_error_reporter;
+ loader->add_collation= add_collation;
+}
+
+
#define MY_MAX_ALLOWED_BUF 1024*1024
#define MY_CHARSET_INDEX "Index.xml"
const char *charsets_dir= NULL;
-static my_bool my_read_charset_file(const char *filename, myf myflags)
+static my_bool
+my_read_charset_file(MY_CHARSET_LOADER *loader,
+ const char *filename,
+ myf myflags)
{
uchar *buf;
int fd;
@@ -386,14 +429,11 @@ static my_bool my_read_charset_file(cons
if (tmp_len != len)
goto error;
- if (my_parse_charset_xml((char*) buf,len,add_collation))
+ if (my_parse_charset_xml(loader, (char *) buf, len))
{
-#ifdef NOT_YET
- printf("ERROR at line %d pos %d '%s'\n",
- my_xml_error_lineno(&p)+1,
- my_xml_error_pos(&p),
- my_xml_error_string(&p));
-#endif
+ my_printf_error(EE_UNKNOWN_CHARSET, "Error while parsing '%s': %s\n",
+ MYF(0), filename, loader->error);
+ goto error;
}
my_free(buf);
@@ -437,11 +477,6 @@ void add_compiled_collation(struct chars
cs->state|= MY_CS_AVAILABLE;
}
-static void *cs_alloc(size_t size)
-{
- return my_once_alloc(size, MYF(MY_WME));
-}
-
static my_pthread_once_t charsets_initialized= MY_PTHREAD_ONCE_INIT;
static my_pthread_once_t charsets_template= MY_PTHREAD_ONCE_INIT;
@@ -450,6 +485,7 @@ static void init_available_charsets(void
{
char fname[FN_REFLEN + sizeof(MY_CHARSET_INDEX)];
struct charset_info_st **cs;
+ MY_CHARSET_LOADER loader;
bzero((char*) &all_charsets,sizeof(all_charsets));
init_compiled_charsets(MYF(0));
@@ -468,8 +504,9 @@ static void init_available_charsets(void
}
}
+ my_charset_loader_init_mysys(&loader);
strmov(get_charsets_dir(fname), MY_CHARSET_INDEX);
- my_read_charset_file(fname, MYF(0));
+ my_read_charset_file(&loader, fname, MYF(0));
}
@@ -558,7 +595,8 @@ const char *get_charset_name(uint charse
}
-static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags)
+static CHARSET_INFO *
+get_internal_charset(MY_CHARSET_LOADER *loader, uint cs_number, myf flags)
{
char buf[FN_REFLEN];
struct charset_info_st *cs;
@@ -578,17 +616,21 @@ static CHARSET_INFO *get_internal_charse
if (!(cs->state & (MY_CS_COMPILED|MY_CS_LOADED))) /* if CS is not in memory */
{
+ MY_CHARSET_LOADER loader;
strxmov(get_charsets_dir(buf), cs->csname, ".xml", NullS);
- my_read_charset_file(buf,flags);
+ my_charset_loader_init_mysys(&loader);
+ my_read_charset_file(&loader, buf, flags);
}
if (cs->state & MY_CS_AVAILABLE)
{
if (!(cs->state & MY_CS_READY))
{
- if ((cs->cset->init && cs->cset->init(cs, cs_alloc)) ||
- (cs->coll->init && cs->coll->init(cs, cs_alloc)))
+ if ((cs->cset->init && cs->cset->init(cs, loader)) ||
+ (cs->coll->init && cs->coll->init(cs, loader)))
+ {
cs= NULL;
+ }
else
cs->state|= MY_CS_READY;
}
@@ -605,6 +647,8 @@ static CHARSET_INFO *get_internal_charse
CHARSET_INFO *get_charset(uint cs_number, myf flags)
{
CHARSET_INFO *cs;
+ MY_CHARSET_LOADER loader;
+
if (cs_number == default_charset_info->number)
return default_charset_info;
@@ -612,8 +656,9 @@ CHARSET_INFO *get_charset(uint cs_number
if (cs_number >= array_elements(all_charsets))
return NULL;
-
- cs=get_internal_charset(cs_number, flags);
+
+ my_charset_loader_init_mysys(&loader);
+ cs= get_internal_charset(&loader, cs_number, flags);
if (!cs && (flags & MY_WME))
{
@@ -626,29 +671,58 @@ CHARSET_INFO *get_charset(uint cs_number
return cs;
}
-CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags)
+
+/**
+ Find collation by name: extended version of get_charset_by_name()
+ to return error messages to the caller.
+ @param loader Character set loader
+ @param name Collation name
+ @param flags Flags
+ @return NULL on error, pointer to collation on success
+*/
+
+CHARSET_INFO *
+my_collation_get_by_name(MY_CHARSET_LOADER *loader,
+ const char *name, myf flags)
{
uint cs_number;
CHARSET_INFO *cs;
my_pthread_once(&charsets_initialized, init_available_charsets);
- cs_number=get_collation_number(cs_name);
- cs= cs_number ? get_internal_charset(cs_number,flags) : NULL;
+ cs_number= get_collation_number(name);
+ my_charset_loader_init_mysys(loader);
+ cs= cs_number ? get_internal_charset(loader, cs_number, flags) : NULL;
if (!cs && (flags & MY_WME))
{
char index_file[FN_REFLEN + sizeof(MY_CHARSET_INDEX)];
strmov(get_charsets_dir(index_file),MY_CHARSET_INDEX);
- my_error(EE_UNKNOWN_COLLATION, MYF(ME_BELL), cs_name, index_file);
+ my_error(EE_UNKNOWN_COLLATION, MYF(ME_BELL), name, index_file);
}
-
return cs;
}
-CHARSET_INFO *get_charset_by_csname(const char *cs_name,
- uint cs_flags,
- myf flags)
+CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags)
+{
+ MY_CHARSET_LOADER loader;
+ my_charset_loader_init_mysys(&loader);
+ return my_collation_get_by_name(&loader, cs_name, flags);
+}
+
+
+/**
+ Find character set by name: extended version of get_charset_by_csname()
+ to return error messages to the caller.
+ @param loader Character set loader
+ @param name Collation name
+ @param cs_flags Character set flags (e.g. default or binary collation)
+ @param flags Flags
+ @return NULL on error, pointer to collation on success
+*/
+CHARSET_INFO *
+my_charset_get_by_name(MY_CHARSET_LOADER *loader,
+ const char *cs_name, uint cs_flags, myf flags)
{
uint cs_number;
CHARSET_INFO *cs;
@@ -658,7 +732,7 @@ CHARSET_INFO *get_charset_by_csname(cons
my_pthread_once(&charsets_initialized, init_available_charsets);
cs_number= get_charset_number(cs_name, cs_flags);
- cs= cs_number ? get_internal_charset(cs_number, flags) : NULL;
+ cs= cs_number ? get_internal_charset(loader, cs_number, flags) : NULL;
if (!cs && (flags & MY_WME))
{
@@ -671,6 +745,15 @@ CHARSET_INFO *get_charset_by_csname(cons
}
+CHARSET_INFO *
+get_charset_by_csname(const char *cs_name, uint cs_flags, myf flags)
+{
+ MY_CHARSET_LOADER loader;
+ my_charset_loader_init_mysys(&loader);
+ return my_charset_get_by_name(&loader, cs_name, cs_flags, flags);
+}
+
+
/**
Resolve character set by the character set name (utf8, latin1, ...).
@@ -868,8 +951,11 @@ CHARSET_INFO *fs_character_set()
As we're now interested in cp932 only,
let's just detect it using strcmp().
*/
- fs_cset_cache= !strcmp(buf, "cp932") ?
- &my_charset_cp932_japanese_ci : &my_charset_bin;
+ fs_cset_cache=
+ #ifdef HAVE_CHARSET_cp932
+ !strcmp(buf, "cp932") ? &my_charset_cp932_japanese_ci :
+ #endif
+ &my_charset_bin;
}
return fs_cset_cache;
}
=== modified file 'sql/mysqld.cc'
--- sql/mysqld.cc 2013-08-14 08:48:50 +0000
+++ sql/mysqld.cc 2013-09-17 18:30:13 +0000
@@ -1287,7 +1287,7 @@ struct my_rnd_struct sql_rand; ///< used
@param level log message level
@param format log message format string
*/
-
+C_MODE_START
static void buffered_option_error_reporter(enum loglevel level,
const char *format, ...)
{
@@ -1300,6 +1300,33 @@ static void buffered_option_error_report
buffered_logs.buffer(level, buffer);
}
+
+/**
+ Character set and collation error reporter that prints to sql error log.
+ @param level log message level
+ @param format log message format string
+
+ This routine is used to print character set and collation
+ warnings and errors inside an already running mysqld server,
+ e.g. when a character set or collation is requested for the very first time
+ and its initialization does not go well for some reasons.
+
+ Note: At early mysqld initialization stage,
+ when error log is not yet available,
+ we use buffered_option_error_reporter() instead,
+ to print general character set subsystem initialization errors,
+ such as Index.xml syntax problems, bad XML tag hierarchy, etc.
+*/
+static void charset_error_reporter(enum loglevel level,
+ const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ vprint_msg_to_log(level, format, args);
+ va_end(args);
+}
+C_MODE_END
+
struct passwd *user_info;
static pthread_t select_thread;
#endif
@@ -4544,6 +4571,15 @@ static int init_server_components()
buffered_logs.cleanup();
#endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */
+#ifndef EMBEDDED_LIBRARY
+ /*
+ Now that the logger is available, redirect character set
+ errors directly to the logger
+ (instead of the buffered_logs used at the server startup time).
+ */
+ my_charset_error_reporter= charset_error_reporter;
+#endif
+
if (xid_cache_init())
{
sql_print_error("Out of memory");
=== modified file 'sql/sql_class.h'
--- sql/sql_class.h 2013-08-12 20:05:23 +0000
+++ sql/sql_class.h 2013-09-17 12:34:19 +0000
@@ -744,6 +744,35 @@ typedef struct system_status_var
void mark_transaction_to_rollback(THD *thd, bool all);
+
+/**
+ Get collation by name, send error to client on failure.
+ @param name Collation name
+ @param name_cs Character set of the name string
+ @return
+ @retval NULL on error
+ @retval Pointter to CHARSET_INFO with the given name on success
+*/
+inline CHARSET_INFO *
+mysqld_collation_get_by_name(const char *name,
+ CHARSET_INFO *name_cs= system_charset_info)
+{
+ CHARSET_INFO *cs;
+ MY_CHARSET_LOADER loader;
+ my_charset_loader_init_mysys(&loader);
+ if (!(cs= my_collation_get_by_name(&loader, name, MYF(0))))
+ {
+ ErrConvString err(name, name_cs);
+ my_error(ER_UNKNOWN_COLLATION, MYF(0), err.ptr());
+ if (loader.error[0])
+ push_warning_printf(current_thd,
+ Sql_condition::WARN_LEVEL_WARN,
+ ER_UNKNOWN_COLLATION, "%s", loader.error);
+ }
+ return cs;
+}
+
+
#ifdef MYSQL_SERVER
void free_tmp_table(THD *thd, TABLE *entry);
=== modified file 'sql/sql_error.h'
--- sql/sql_error.h 2013-08-15 11:24:34 +0000
+++ sql/sql_error.h 2013-09-17 12:40:50 +0000
@@ -565,6 +565,8 @@ class ErrConvString : public ErrConv
public:
ErrConvString(const char *str_arg, size_t len_arg, CHARSET_INFO *cs_arg)
: ErrConv(), str(str_arg), len(len_arg), cs(cs_arg) {}
+ ErrConvString(const char *str_arg, CHARSET_INFO *cs_arg)
+ : ErrConv(), str(str_arg), len(strlen(str_arg)), cs(cs_arg) {}
ErrConvString(String *s)
: ErrConv(), str(s->ptr()), len(s->length()), cs(s->charset()) {}
const char *ptr() const
=== modified file 'sql/sql_yacc.yy'
--- sql/sql_yacc.yy 2013-08-13 11:35:36 +0000
+++ sql/sql_yacc.yy 2013-09-17 12:44:41 +0000
@@ -6530,11 +6530,8 @@ old_or_new_charset_name_or_default:
collation_name:
ident_or_text
{
- if (!($$=get_charset_by_name($1.str,MYF(0))))
- {
- my_error(ER_UNKNOWN_COLLATION, MYF(0), $1.str);
+ if (!($$= mysqld_collation_get_by_name($1.str)))
MYSQL_YYABORT;
- }
}
;
@@ -6578,19 +6575,13 @@ unicode:
}
| UNICODE_SYM BINARY
{
- if (!(Lex->charset=get_charset_by_name("ucs2_bin", MYF(0))))
- {
+ if (!(Lex->charset= mysqld_collation_get_by_name("ucs2_bin")))
my_error(ER_UNKNOWN_COLLATION, MYF(0), "ucs2_bin");
- MYSQL_YYABORT;
- }
}
| BINARY UNICODE_SYM
{
- if (!(Lex->charset=get_charset_by_name("ucs2_bin", MYF(0))))
- {
- my_error(ER_UNKNOWN_COLLATION, MYF(0), "ucs2_bin");
+ if (!(Lex->charset= mysqld_collation_get_by_name("ucs2_bin")))
MYSQL_YYABORT;
- }
}
;
=== modified file 'strings/CMakeLists.txt'
--- strings/CMakeLists.txt 2012-01-13 14:50:02 +0000
+++ strings/CMakeLists.txt 2013-09-04 13:42:15 +0000
@@ -32,3 +32,6 @@ ENDIF()
# Avoid dependencies on perschema data defined in mysys
ADD_DEFINITIONS(-DDISABLE_MYSQL_THREAD_H)
ADD_CONVENIENCE_LIBRARY(strings ${STRINGS_SOURCES})
+
+ADD_EXECUTABLE(conf_to_src EXCLUDE_FROM_ALL conf_to_src.c)
+TARGET_LINK_LIBRARIES(conf_to_src strings)
=== modified file 'strings/conf_to_src.c'
--- strings/conf_to_src.c 2012-01-13 14:50:02 +0000
+++ strings/conf_to_src.c 2013-09-04 13:40:56 +0000
@@ -145,12 +145,35 @@ static int add_collation(struct charset_
}
+static void
+default_reporter(enum loglevel level __attribute__ ((unused)),
+ const char *format __attribute__ ((unused)),
+ ...)
+{
+}
+
+
+static void
+my_charset_loader_init(MY_CHARSET_LOADER *loader)
+{
+ loader->error[0]= '\0';
+ loader->once_alloc= malloc;
+ loader->malloc= malloc;
+ loader->realloc= realloc;
+ loader->free= free;
+ loader->reporter= default_reporter;
+ loader->add_collation= add_collation;
+}
+
+
static int my_read_charset_file(const char *filename)
{
char buf[MAX_BUF];
int fd;
uint len;
+ MY_CHARSET_LOADER loader;
+ my_charset_loader_init(&loader);
if ((fd=open(filename,O_RDONLY)) < 0)
{
fprintf(stderr,"Can't open '%s'\n",filename);
@@ -161,14 +184,10 @@ static int my_read_charset_file(const ch
DBUG_ASSERT(len < MAX_BUF);
close(fd);
- if (my_parse_charset_xml(buf,len,add_collation))
+ if (my_parse_charset_xml(&loader, buf, len))
{
-#if 0
- printf("ERROR at line %d pos %d '%s'\n",
- my_xml_error_lineno(&p)+1,
- my_xml_error_pos(&p),
- my_xml_error_string(&p));
-#endif
+ fprintf(stderr, "Error while parsing '%s': %s\n", filename, loader.error);
+ exit(1);
}
return FALSE;
@@ -207,8 +226,7 @@ void dispcset(FILE *f,CHARSET_INFO *cs)
fprintf(f," sort_order_%s, /* sort_order */\n",cs->name);
else
fprintf(f," NULL, /* sort_order */\n");
- fprintf(f," NULL, /* contractions */\n");
- fprintf(f," NULL, /* sort_order_big*/\n");
+ fprintf(f," NULL, /* uca */\n");
fprintf(f," to_uni_%s, /* to_uni */\n",cs->name);
}
else
@@ -221,13 +239,12 @@ void dispcset(FILE *f,CHARSET_INFO *cs)
fprintf(f," NULL, /* lower */\n");
fprintf(f," NULL, /* upper */\n");
fprintf(f," NULL, /* sort order */\n");
- fprintf(f," NULL, /* contractions */\n");
- fprintf(f," NULL, /* sort_order_big*/\n");
+ fprintf(f," NULL, /* uca */\n");
fprintf(f," NULL, /* to_uni */\n");
}
fprintf(f," NULL, /* from_uni */\n");
- fprintf(f," my_unicase_default, /* caseinfo */\n");
+ fprintf(f," &my_unicase_default, /* caseinfo */\n");
fprintf(f," NULL, /* state map */\n");
fprintf(f," NULL, /* ident map */\n");
fprintf(f," 1, /* strxfrm_multiply*/\n");
=== modified file 'strings/ctype-big5.c'
--- strings/ctype-big5.c 2013-03-25 22:03:13 +0000
+++ strings/ctype-big5.c 2013-08-29 08:19:23 +0000
@@ -29,6 +29,7 @@
#include "strings_def.h"
#include <m_ctype.h>
+#include <my_sys.h>
#ifdef HAVE_CHARSET_big5
@@ -177,7 +178,7 @@ static const uchar sort_order_big5[]=
};
-static MY_UNICASE_INFO cA2[256]=
+static MY_UNICASE_CHARACTER cA2[256]=
{
/* A200-A20F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -370,7 +371,7 @@ static MY_UNICASE_INFO cA2[256]=
};
-static MY_UNICASE_INFO cA3[256]=
+static MY_UNICASE_CHARACTER cA3[256]=
{
/* A300-A30F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -563,7 +564,7 @@ static MY_UNICASE_INFO cA3[256]=
};
-static MY_UNICASE_INFO cC7[256]=
+static MY_UNICASE_CHARACTER cC7[256]=
{
/* C700-C70F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -756,7 +757,7 @@ static MY_UNICASE_INFO cC7[256]=
};
-static MY_UNICASE_INFO *my_caseinfo_big5[256]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_big5[256]=
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -793,6 +794,13 @@ static MY_UNICASE_INFO *my_caseinfo_big5
};
+static MY_UNICASE_INFO my_caseinfo_big5=
+{
+ 0xFFFF,
+ my_caseinfo_pages_big5
+};
+
+
static uint16 big5strokexfrm(uint16 i)
{
if ((i == 0xA440) || (i == 0xA441)) return 0xA440;
@@ -6926,11 +6934,10 @@ struct charset_info_st my_charset_big5_c
to_lower_big5,
to_upper_big5,
sort_order_big5,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_big5, /* caseinfo */
+ &my_caseinfo_big5, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -6959,11 +6966,10 @@ struct charset_info_st my_charset_big5_b
to_lower_big5,
to_upper_big5,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_big5, /* caseinfo */
+ &my_caseinfo_big5, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-bin.c'
--- strings/ctype-bin.c 2013-07-21 14:39:19 +0000
+++ strings/ctype-bin.c 2013-08-29 07:42:03 +0000
@@ -69,7 +69,7 @@ static const uchar bin_char_array[] =
static my_bool
my_coll_init_8bit_bin(struct charset_info_st *cs,
- void *(*alloc)(size_t) __attribute__((unused)))
+ MY_CHARSET_LOADER *loader __attribute__((unused)))
{
cs->max_sort_char=255;
return FALSE;
@@ -571,11 +571,10 @@ struct charset_info_st my_charset_bin =
bin_char_array, /* to_lower */
bin_char_array, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-cp932.c'
--- strings/ctype-cp932.c 2012-01-13 14:50:02 +0000
+++ strings/ctype-cp932.c 2013-08-29 08:06:52 +0000
@@ -197,7 +197,7 @@ static uint mbcharlen_cp932(CHARSET_INFO
#define cp932code(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d))
-static MY_UNICASE_INFO c81[256]=
+static MY_UNICASE_CHARACTER c81[256]=
{
/* 8100-810F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -407,7 +407,7 @@ static MY_UNICASE_INFO c81[256]=
};
-static MY_UNICASE_INFO c82[256]=
+static MY_UNICASE_CHARACTER c82[256]=
{
/* 8200-820F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -615,7 +615,7 @@ static MY_UNICASE_INFO c82[256]=
};
-static MY_UNICASE_INFO c83[256]=
+static MY_UNICASE_CHARACTER c83[256]=
{
/* 8300-830F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -825,7 +825,7 @@ static MY_UNICASE_INFO c83[256]=
};
-static MY_UNICASE_INFO c84[256]=
+static MY_UNICASE_CHARACTER c84[256]=
{
/* 8400-840F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1035,7 +1035,7 @@ static MY_UNICASE_INFO c84[256]=
};
-static MY_UNICASE_INFO c87[256]=
+static MY_UNICASE_CHARACTER c87[256]=
{
/* 8700-870F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1245,7 +1245,7 @@ static MY_UNICASE_INFO c87[256]=
};
-static MY_UNICASE_INFO cEE[256]=
+static MY_UNICASE_CHARACTER cEE[256]=
{
/* EE00-EE0F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1456,7 +1456,7 @@ static MY_UNICASE_INFO cEE[256]=
};
-static MY_UNICASE_INFO cFA[256]=
+static MY_UNICASE_CHARACTER cFA[256]=
{
/* FA00-FA0F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1666,7 +1666,7 @@ static MY_UNICASE_INFO cFA[256]=
};
-static MY_UNICASE_INFO *my_caseinfo_cp932[256]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_cp932[256]=
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1703,7 +1703,13 @@ static MY_UNICASE_INFO *my_caseinfo_cp93
};
-static int my_strnncoll_cp932_internal(CHARSET_INFO *cs,
+MY_UNICASE_INFO my_caseinfo_cp932=
+{
+ 0xFFFF,
+ my_caseinfo_pages_cp932
+};
+
+static int my_strnncoll_cp932_internal(const CHARSET_INFO *cs,
const uchar **a_res, size_t a_length,
const uchar **b_res, size_t b_length)
{
@@ -34834,11 +34840,10 @@ struct charset_info_st my_charset_cp932_
to_lower_cp932,
to_upper_cp932,
sort_order_cp932,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_cp932, /* caseinfo */
+ &my_caseinfo_cp932, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -34866,11 +34871,10 @@ struct charset_info_st my_charset_cp932_
to_lower_cp932,
to_upper_cp932,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_cp932, /* caseinfo */
+ &my_caseinfo_cp932, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-czech.c'
--- strings/ctype-czech.c 2012-01-13 14:50:02 +0000
+++ strings/ctype-czech.c 2013-08-29 07:45:28 +0000
@@ -613,11 +613,10 @@ struct charset_info_st my_charset_latin2
to_lower_czech,
to_upper_czech,
sort_order_czech,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
tab_8859_2_uni, /* tab_to_uni */
idx_uni_8859_2, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
4, /* strxfrm_multiply */
=== modified file 'strings/ctype-euc_kr.c'
--- strings/ctype-euc_kr.c 2012-01-13 14:50:02 +0000
+++ strings/ctype-euc_kr.c 2013-08-29 07:47:51 +0000
@@ -216,7 +216,7 @@ static uint mbcharlen_euc_kr(CHARSET_INF
}
-static MY_UNICASE_INFO cA3[256]=
+static MY_UNICASE_CHARACTER cA3[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -421,7 +421,7 @@ static MY_UNICASE_INFO cA3[256]=
};
-static MY_UNICASE_INFO cA5[256]=
+static MY_UNICASE_CHARACTER cA5[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -626,7 +626,7 @@ static MY_UNICASE_INFO cA5[256]=
};
-static MY_UNICASE_INFO cA7[256]=
+static MY_UNICASE_CHARACTER cA7[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -831,7 +831,7 @@ static MY_UNICASE_INFO cA7[256]=
};
-static MY_UNICASE_INFO cA8[256]=
+static MY_UNICASE_CHARACTER cA8[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1036,7 +1036,7 @@ static MY_UNICASE_INFO cA8[256]=
};
-static MY_UNICASE_INFO cA9[256]=
+static MY_UNICASE_CHARACTER cA9[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1241,7 +1241,7 @@ static MY_UNICASE_INFO cA9[256]=
};
-static MY_UNICASE_INFO cAC[256]=
+static MY_UNICASE_CHARACTER cAC[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1446,7 +1446,7 @@ static MY_UNICASE_INFO cAC[256]=
};
-static MY_UNICASE_INFO *my_caseinfo_euckr[256]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_euckr[256]=
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1483,6 +1483,13 @@ static MY_UNICASE_INFO *my_caseinfo_euck
};
+static MY_UNICASE_INFO my_caseinfo_euckr=
+{
+ 0xFFFF,
+ my_caseinfo_pages_euckr
+};
+
+
/* page 0 0x8141-0xC8FE */
static const uint16 tab_ksc5601_uni0[]={
0xAC02,0xAC03,0xAC05,0xAC06,0xAC0B,0xAC0C,0xAC0D,0xAC0E,
@@ -10016,11 +10023,10 @@ struct charset_info_st my_charset_euckr_
to_lower_euc_kr,
to_upper_euc_kr,
sort_order_euc_kr,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_euckr, /* caseinfo */
+ &my_caseinfo_euckr, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -10049,11 +10055,10 @@ struct charset_info_st my_charset_euckr_
to_lower_euc_kr,
to_upper_euc_kr,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_euckr, /* caseinfo */
+ &my_caseinfo_euckr, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-eucjpms.c'
--- strings/ctype-eucjpms.c 2013-07-16 17:09:54 +0000
+++ strings/ctype-eucjpms.c 2013-08-29 07:49:51 +0000
@@ -203,7 +203,7 @@ static uint mbcharlen_eucjpms(CHARSET_IN
/* Case info pages for JIS-X-0208 range */
-static MY_UNICASE_INFO cA2[256]=
+static MY_UNICASE_CHARACTER cA2[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -324,7 +324,7 @@ static MY_UNICASE_INFO cA2[256]=
};
-static MY_UNICASE_INFO cA3[256]=
+static MY_UNICASE_CHARACTER cA3[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -445,7 +445,7 @@ static MY_UNICASE_INFO cA3[256]=
};
-static MY_UNICASE_INFO cA6[256]=
+static MY_UNICASE_CHARACTER cA6[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -566,7 +566,7 @@ static MY_UNICASE_INFO cA6[256]=
};
-static MY_UNICASE_INFO cA7[256]=
+static MY_UNICASE_CHARACTER cA7[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -687,7 +687,7 @@ static MY_UNICASE_INFO cA7[256]=
};
-static MY_UNICASE_INFO cAD[256]=
+static MY_UNICASE_CHARACTER cAD[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -810,7 +810,7 @@ static MY_UNICASE_INFO cAD[256]=
/* Case info pages for JIS-X-0212 range */
-static MY_UNICASE_INFO c8FA6[256]=
+static MY_UNICASE_CHARACTER c8FA6[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -931,7 +931,7 @@ static MY_UNICASE_INFO c8FA6[256]=
};
-static MY_UNICASE_INFO c8FA7[256]=
+static MY_UNICASE_CHARACTER c8FA7[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1052,7 +1052,7 @@ static MY_UNICASE_INFO c8FA7[256]=
};
-static MY_UNICASE_INFO c8FA9[256]=
+static MY_UNICASE_CHARACTER c8FA9[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1173,7 +1173,7 @@ static MY_UNICASE_INFO c8FA9[256]=
};
-static MY_UNICASE_INFO c8FAA[256]=
+static MY_UNICASE_CHARACTER c8FAA[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1294,7 +1294,7 @@ static MY_UNICASE_INFO c8FAA[256]=
};
-static MY_UNICASE_INFO c8FAB[256]=
+static MY_UNICASE_CHARACTER c8FAB[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1415,7 +1415,7 @@ static MY_UNICASE_INFO c8FAB[256]=
};
-static MY_UNICASE_INFO c8FF3[256]=
+static MY_UNICASE_CHARACTER c8FF3[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1536,7 +1536,7 @@ static MY_UNICASE_INFO c8FF3[256]=
};
-static MY_UNICASE_INFO c8FF4[256]=
+static MY_UNICASE_CHARACTER c8FF4[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1657,7 +1657,7 @@ static MY_UNICASE_INFO c8FF4[256]=
};
-static MY_UNICASE_INFO *my_caseinfo_eucjpms[512]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_eucjpms[512]=
{
/* JIS-X-0208 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
@@ -1729,7 +1729,14 @@ static MY_UNICASE_INFO *my_caseinfo_eucj
};
-static const uint16 jisx0208_eucjpms_to_unicode[65536]=
+static MY_UNICASE_INFO my_caseinfo_eucjpms=
+{
+ 0x0FFFF,
+ my_caseinfo_pages_eucjpms
+};
+
+
+static uint16 jisx0208_eucjpms_to_unicode[65536]=
{
0x0000, 0x0001, 0x0002, 0x0003, /* 0000 */
0x0004, 0x0005, 0x0006, 0x0007,
@@ -67559,11 +67566,10 @@ struct charset_info_st my_charset_eucjpm
to_lower_eucjpms,
to_upper_eucjpms,
sort_order_eucjpms,
- NULL, /* sort_order_big*/
- NULL, /* contractions */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_eucjpms,/* caseinfo */
+ &my_caseinfo_eucjpms,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -67592,11 +67598,10 @@ struct charset_info_st my_charset_eucjpm
to_lower_eucjpms,
to_upper_eucjpms,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_eucjpms,/* caseinfo */
+ &my_caseinfo_eucjpms,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-extra.c'
--- strings/ctype-extra.c 2012-01-13 14:50:02 +0000
+++ strings/ctype-extra.c 2013-08-29 07:55:47 +0000
@@ -6616,11 +6616,10 @@ struct charset_info_st compiled_charsets
to_lower_dec8_swedish_ci, /* lower */
to_upper_dec8_swedish_ci, /* upper */
sort_order_dec8_swedish_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_dec8_swedish_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6649,11 +6648,10 @@ struct charset_info_st compiled_charsets
to_lower_cp850_general_ci, /* lower */
to_upper_cp850_general_ci, /* upper */
sort_order_cp850_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp850_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6682,11 +6680,10 @@ struct charset_info_st compiled_charsets
to_lower_latin1_german1_ci, /* lower */
to_upper_latin1_german1_ci, /* upper */
sort_order_latin1_german1_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin1_german1_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6715,11 +6712,10 @@ struct charset_info_st compiled_charsets
to_lower_hp8_english_ci, /* lower */
to_upper_hp8_english_ci, /* upper */
sort_order_hp8_english_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_hp8_english_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6748,11 +6744,10 @@ struct charset_info_st compiled_charsets
to_lower_koi8r_general_ci, /* lower */
to_upper_koi8r_general_ci, /* upper */
sort_order_koi8r_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_koi8r_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6781,11 +6776,10 @@ struct charset_info_st compiled_charsets
to_lower_latin2_general_ci, /* lower */
to_upper_latin2_general_ci, /* upper */
sort_order_latin2_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin2_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6814,11 +6808,10 @@ struct charset_info_st compiled_charsets
to_lower_swe7_swedish_ci, /* lower */
to_upper_swe7_swedish_ci, /* upper */
sort_order_swe7_swedish_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_swe7_swedish_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6847,11 +6840,10 @@ struct charset_info_st compiled_charsets
to_lower_ascii_general_ci, /* lower */
to_upper_ascii_general_ci, /* upper */
sort_order_ascii_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_ascii_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6880,11 +6872,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1251_bulgarian_ci, /* lower */
to_upper_cp1251_bulgarian_ci, /* upper */
sort_order_cp1251_bulgarian_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1251_bulgarian_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6913,11 +6904,10 @@ struct charset_info_st compiled_charsets
to_lower_latin1_danish_ci, /* lower */
to_upper_latin1_danish_ci, /* upper */
sort_order_latin1_danish_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin1_danish_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6946,11 +6936,10 @@ struct charset_info_st compiled_charsets
to_lower_hebrew_general_ci, /* lower */
to_upper_hebrew_general_ci, /* upper */
sort_order_hebrew_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_hebrew_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -6979,11 +6968,10 @@ struct charset_info_st compiled_charsets
to_lower_latin7_estonian_cs, /* lower */
to_upper_latin7_estonian_cs, /* upper */
sort_order_latin7_estonian_cs, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin7_estonian_cs, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7012,11 +7000,10 @@ struct charset_info_st compiled_charsets
to_lower_latin2_hungarian_ci, /* lower */
to_upper_latin2_hungarian_ci, /* upper */
sort_order_latin2_hungarian_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin2_hungarian_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7045,11 +7032,10 @@ struct charset_info_st compiled_charsets
to_lower_koi8u_general_ci, /* lower */
to_upper_koi8u_general_ci, /* upper */
sort_order_koi8u_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_koi8u_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7078,11 +7064,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1251_ukrainian_ci, /* lower */
to_upper_cp1251_ukrainian_ci, /* upper */
sort_order_cp1251_ukrainian_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1251_ukrainian_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7111,11 +7096,10 @@ struct charset_info_st compiled_charsets
to_lower_greek_general_ci, /* lower */
to_upper_greek_general_ci, /* upper */
sort_order_greek_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_greek_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7144,11 +7128,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1250_general_ci, /* lower */
to_upper_cp1250_general_ci, /* upper */
sort_order_cp1250_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1250_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7177,11 +7160,10 @@ struct charset_info_st compiled_charsets
to_lower_latin2_croatian_ci, /* lower */
to_upper_latin2_croatian_ci, /* upper */
sort_order_latin2_croatian_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin2_croatian_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7210,11 +7192,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1257_lithuanian_ci, /* lower */
to_upper_cp1257_lithuanian_ci, /* upper */
sort_order_cp1257_lithuanian_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1257_lithuanian_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7243,11 +7224,10 @@ struct charset_info_st compiled_charsets
to_lower_latin5_turkish_ci, /* lower */
to_upper_latin5_turkish_ci, /* upper */
sort_order_latin5_turkish_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin5_turkish_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7276,11 +7256,10 @@ struct charset_info_st compiled_charsets
to_lower_armscii8_general_ci, /* lower */
to_upper_armscii8_general_ci, /* upper */
sort_order_armscii8_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_armscii8_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7309,11 +7288,10 @@ struct charset_info_st compiled_charsets
to_lower_cp866_general_ci, /* lower */
to_upper_cp866_general_ci, /* upper */
sort_order_cp866_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp866_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7342,11 +7320,10 @@ struct charset_info_st compiled_charsets
to_lower_keybcs2_general_ci, /* lower */
to_upper_keybcs2_general_ci, /* upper */
sort_order_keybcs2_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_keybcs2_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7375,11 +7352,10 @@ struct charset_info_st compiled_charsets
to_lower_macce_general_ci, /* lower */
to_upper_macce_general_ci, /* upper */
sort_order_macce_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_macce_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7408,11 +7384,10 @@ struct charset_info_st compiled_charsets
to_lower_macroman_general_ci, /* lower */
to_upper_macroman_general_ci, /* upper */
sort_order_macroman_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_macroman_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7441,11 +7416,10 @@ struct charset_info_st compiled_charsets
to_lower_cp852_general_ci, /* lower */
to_upper_cp852_general_ci, /* upper */
sort_order_cp852_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp852_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7474,11 +7448,10 @@ struct charset_info_st compiled_charsets
to_lower_latin7_general_ci, /* lower */
to_upper_latin7_general_ci, /* upper */
sort_order_latin7_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin7_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7507,11 +7480,10 @@ struct charset_info_st compiled_charsets
to_lower_latin7_general_cs, /* lower */
to_upper_latin7_general_cs, /* upper */
sort_order_latin7_general_cs, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin7_general_cs, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7540,11 +7512,10 @@ struct charset_info_st compiled_charsets
to_lower_macce_bin, /* lower */
to_upper_macce_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_macce_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7573,11 +7544,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1250_croatian_ci, /* lower */
to_upper_cp1250_croatian_ci, /* upper */
sort_order_cp1250_croatian_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1250_croatian_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7606,11 +7576,10 @@ struct charset_info_st compiled_charsets
to_lower_latin1_general_ci, /* lower */
to_upper_latin1_general_ci, /* upper */
sort_order_latin1_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin1_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7639,11 +7608,10 @@ struct charset_info_st compiled_charsets
to_lower_latin1_general_cs, /* lower */
to_upper_latin1_general_cs, /* upper */
sort_order_latin1_general_cs, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin1_general_cs, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7672,11 +7640,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1251_bin, /* lower */
to_upper_cp1251_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1251_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7705,11 +7672,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1251_general_ci, /* lower */
to_upper_cp1251_general_ci, /* upper */
sort_order_cp1251_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1251_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7738,11 +7704,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1251_general_cs, /* lower */
to_upper_cp1251_general_cs, /* upper */
sort_order_cp1251_general_cs, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1251_general_cs, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7771,11 +7736,10 @@ struct charset_info_st compiled_charsets
to_lower_macroman_bin, /* lower */
to_upper_macroman_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_macroman_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7804,11 +7768,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1256_general_ci, /* lower */
to_upper_cp1256_general_ci, /* upper */
sort_order_cp1256_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1256_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7837,11 +7800,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1257_bin, /* lower */
to_upper_cp1257_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1257_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7870,11 +7832,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1257_general_ci, /* lower */
to_upper_cp1257_general_ci, /* upper */
sort_order_cp1257_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1257_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7903,11 +7864,10 @@ struct charset_info_st compiled_charsets
to_lower_armscii8_bin, /* lower */
to_upper_armscii8_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_armscii8_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7936,11 +7896,10 @@ struct charset_info_st compiled_charsets
to_lower_ascii_bin, /* lower */
to_upper_ascii_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_ascii_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -7969,11 +7928,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1250_bin, /* lower */
to_upper_cp1250_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1250_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8002,11 +7960,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1256_bin, /* lower */
to_upper_cp1256_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1256_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8035,11 +7992,10 @@ struct charset_info_st compiled_charsets
to_lower_cp866_bin, /* lower */
to_upper_cp866_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp866_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8068,11 +8024,10 @@ struct charset_info_st compiled_charsets
to_lower_dec8_bin, /* lower */
to_upper_dec8_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_dec8_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8101,11 +8056,10 @@ struct charset_info_st compiled_charsets
to_lower_greek_bin, /* lower */
to_upper_greek_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_greek_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8134,11 +8088,10 @@ struct charset_info_st compiled_charsets
to_lower_hebrew_bin, /* lower */
to_upper_hebrew_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_hebrew_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8167,11 +8120,10 @@ struct charset_info_st compiled_charsets
to_lower_hp8_bin, /* lower */
to_upper_hp8_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_hp8_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8200,11 +8152,10 @@ struct charset_info_st compiled_charsets
to_lower_keybcs2_bin, /* lower */
to_upper_keybcs2_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_keybcs2_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8233,11 +8184,10 @@ struct charset_info_st compiled_charsets
to_lower_koi8r_bin, /* lower */
to_upper_koi8r_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_koi8r_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8266,11 +8216,10 @@ struct charset_info_st compiled_charsets
to_lower_koi8u_bin, /* lower */
to_upper_koi8u_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_koi8u_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8299,11 +8248,10 @@ struct charset_info_st compiled_charsets
to_lower_latin2_bin, /* lower */
to_upper_latin2_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin2_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8332,11 +8280,10 @@ struct charset_info_st compiled_charsets
to_lower_latin5_bin, /* lower */
to_upper_latin5_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin5_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8365,11 +8312,10 @@ struct charset_info_st compiled_charsets
to_lower_latin7_bin, /* lower */
to_upper_latin7_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin7_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8398,11 +8344,10 @@ struct charset_info_st compiled_charsets
to_lower_cp850_bin, /* lower */
to_upper_cp850_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp850_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8431,11 +8376,10 @@ struct charset_info_st compiled_charsets
to_lower_cp852_bin, /* lower */
to_upper_cp852_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp852_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8464,11 +8408,10 @@ struct charset_info_st compiled_charsets
to_lower_swe7_bin, /* lower */
to_upper_swe7_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_swe7_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8497,11 +8440,10 @@ struct charset_info_st compiled_charsets
to_lower_geostd8_general_ci, /* lower */
to_upper_geostd8_general_ci, /* upper */
sort_order_geostd8_general_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_geostd8_general_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8530,11 +8472,10 @@ struct charset_info_st compiled_charsets
to_lower_geostd8_bin, /* lower */
to_upper_geostd8_bin, /* upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_geostd8_bin, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8563,11 +8504,10 @@ struct charset_info_st compiled_charsets
to_lower_latin1_spanish_ci, /* lower */
to_upper_latin1_spanish_ci, /* upper */
sort_order_latin1_spanish_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_latin1_spanish_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8596,11 +8536,10 @@ struct charset_info_st compiled_charsets
to_lower_cp1250_polish_ci, /* lower */
to_upper_cp1250_polish_ci, /* upper */
sort_order_cp1250_polish_ci, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
to_uni_cp1250_polish_ci, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
@@ -8628,11 +8567,10 @@ struct charset_info_st compiled_charsets
NULL, /* lower */
NULL, /* upper */
NULL, /* sort order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* to_uni */
NULL, /* from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state map */
NULL, /* ident map */
1, /* strxfrm_multiply*/
=== modified file 'strings/ctype-gb2312.c'
--- strings/ctype-gb2312.c 2012-01-13 14:50:02 +0000
+++ strings/ctype-gb2312.c 2013-08-29 08:00:35 +0000
@@ -177,7 +177,7 @@ static uint mbcharlen_gb2312(CHARSET_INF
}
-static MY_UNICASE_INFO cA2[256]=
+static MY_UNICASE_CHARACTER cA2[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -298,7 +298,7 @@ static MY_UNICASE_INFO cA2[256]=
};
-static MY_UNICASE_INFO cA3[256]=
+static MY_UNICASE_CHARACTER cA3[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -419,7 +419,7 @@ static MY_UNICASE_INFO cA3[256]=
};
-static MY_UNICASE_INFO cA6[256]=
+static MY_UNICASE_CHARACTER cA6[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -540,7 +540,7 @@ static MY_UNICASE_INFO cA6[256]=
};
-static MY_UNICASE_INFO cA7[256]=
+static MY_UNICASE_CHARACTER cA7[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -661,7 +661,7 @@ static MY_UNICASE_INFO cA7[256]=
};
-static MY_UNICASE_INFO cA8[256]=
+static MY_UNICASE_CHARACTER cA8[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -782,7 +782,7 @@ static MY_UNICASE_INFO cA8[256]=
};
-static MY_UNICASE_INFO *my_caseinfo_gb2312[256]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_gb2312[256]=
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -819,6 +819,13 @@ static MY_UNICASE_INFO *my_caseinfo_gb23
};
+static MY_UNICASE_INFO my_caseinfo_gb2312=
+{
+ 0xFFFF,
+ my_caseinfo_pages_gb2312
+};
+
+
/* page 0 0x2121-0x2658 */
static const uint16 tab_gb2312_uni0[]={
0x3000,0x3001,0x3002,0x30FB,0x02C9,0x02C7,0x00A8,0x3003,
@@ -6419,11 +6426,10 @@ struct charset_info_st my_charset_gb2312
to_lower_gb2312,
to_upper_gb2312,
sort_order_gb2312,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_gb2312, /* caseinfo */
+ &my_caseinfo_gb2312,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -6451,11 +6457,10 @@ struct charset_info_st my_charset_gb2312
to_lower_gb2312,
to_upper_gb2312,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_gb2312, /* caseinfo */
+ &my_caseinfo_gb2312,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-gbk.c'
--- strings/ctype-gbk.c 2013-03-25 22:03:13 +0000
+++ strings/ctype-gbk.c 2013-08-29 08:01:57 +0000
@@ -136,7 +136,8 @@ static const uchar to_upper_gbk[]=
(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377',
};
-static MY_UNICASE_INFO cA2[256]=
+
+static MY_UNICASE_CHARACTER cA2[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -340,7 +341,7 @@ static MY_UNICASE_INFO cA2[256]=
{0xA2FF,0xA2FF,0xA2FF}
};
-static MY_UNICASE_INFO cA3[256]=
+static MY_UNICASE_CHARACTER cA3[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -545,7 +546,7 @@ static MY_UNICASE_INFO cA3[256]=
};
-static MY_UNICASE_INFO cA6[256]=
+static MY_UNICASE_CHARACTER cA6[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -750,7 +751,7 @@ static MY_UNICASE_INFO cA6[256]=
};
-static MY_UNICASE_INFO cA7[256]=
+static MY_UNICASE_CHARACTER cA7[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -955,7 +956,7 @@ static MY_UNICASE_INFO cA7[256]=
};
-static MY_UNICASE_INFO *my_caseinfo_gbk[256]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_gbk[256]=
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -991,7 +992,15 @@ static MY_UNICASE_INFO *my_caseinfo_gbk[
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
};
-static const uchar sort_order_gbk[]=
+
+static MY_UNICASE_INFO my_caseinfo_gbk=
+{
+ 0xFFFF,
+ my_caseinfo_pages_gbk
+};
+
+
+static uchar sort_order_gbk[]=
{
'\000','\001','\002','\003','\004','\005','\006','\007',
'\010','\011','\012','\013','\014','\015','\016','\017',
@@ -10809,11 +10818,10 @@ struct charset_info_st my_charset_gbk_ch
to_lower_gbk,
to_upper_gbk,
sort_order_gbk,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_gbk, /* caseinfo */
+ &my_caseinfo_gbk, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -10841,11 +10849,10 @@ struct charset_info_st my_charset_gbk_bi
to_lower_gbk,
to_upper_gbk,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_gbk, /* caseinfo */
+ &my_caseinfo_gbk, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-latin1.c'
--- strings/ctype-latin1.c 2013-04-15 13:09:22 +0000
+++ strings/ctype-latin1.c 2013-08-29 08:07:30 +0000
@@ -437,11 +437,10 @@ struct charset_info_st my_charset_latin1
to_lower_latin1,
to_upper_latin1,
sort_order_latin1,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
cs_to_uni, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -736,11 +735,10 @@ struct charset_info_st my_charset_latin1
to_lower_latin1,
to_upper_latin1,
sort_order_latin1_de,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
cs_to_uni, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
2, /* strxfrm_multiply */
@@ -769,11 +767,10 @@ struct charset_info_st my_charset_latin1
to_lower_latin1,
to_upper_latin1,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
cs_to_uni, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-mb.c'
--- strings/ctype-mb.c 2013-07-21 14:39:19 +0000
+++ strings/ctype-mb.c 2013-08-29 10:07:40 +0000
@@ -62,11 +62,11 @@ size_t my_casedn_str_mb(CHARSET_INFO * c
}
-static inline MY_UNICASE_INFO*
-get_case_info_for_ch(CHARSET_INFO *cs, uint page, uint offs)
+static inline MY_UNICASE_CHARACTER*
+get_case_info_for_ch(const CHARSET_INFO *cs, uint page, uint offs)
{
- MY_UNICASE_INFO *p;
- return cs->caseinfo ? ((p= cs->caseinfo[page]) ? &p[offs] : NULL) : NULL;
+ MY_UNICASE_CHARACTER *p;
+ return cs->caseinfo ? ((p= cs->caseinfo->page[page]) ? &p[offs] : NULL) : NULL;
}
@@ -89,7 +89,7 @@ size_t my_caseup_mb(CHARSET_INFO * cs, c
{
if ((l=my_ismbchar(cs, src, srcend)))
{
- MY_UNICASE_INFO *ch;
+ MY_UNICASE_CHARACTER *ch;
if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
{
*src++= ch->toupper >> 8;
@@ -124,7 +124,7 @@ size_t my_casedn_mb(CHARSET_INFO * cs, c
{
if ((l= my_ismbchar(cs, src, srcend)))
{
- MY_UNICASE_INFO *ch;
+ MY_UNICASE_CHARACTER *ch;
if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
{
*src++= ch->tolower >> 8;
@@ -168,7 +168,7 @@ my_casefold_mb_varlen(CHARSET_INFO *cs,
size_t mblen= my_ismbchar(cs, src, srcend);
if (mblen)
{
- MY_UNICASE_INFO *ch;
+ MY_UNICASE_CHARACTER *ch;
if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
{
int code= is_upper ? ch->toupper : ch->tolower;
@@ -696,7 +696,7 @@ my_bool my_like_range_mb(CHARSET_INFO *c
char *min_end= min_str + res_length;
char *max_end= max_str + res_length;
size_t maxcharlen= res_length / cs->mbmaxlen;
- my_bool have_contractions= my_cs_have_contractions(cs);
+ const MY_CONTRACTIONS *contractions= my_charset_get_contractions(cs, 0);
for (; ptr != end && min_str != min_end && maxcharlen ; maxcharlen--)
{
@@ -764,8 +764,8 @@ my_bool my_like_range_mb(CHARSET_INFO *c
'ab\min\min\min\min' and 'ab\max\max\max\max'.
*/
- if (have_contractions && ptr + 1 < end &&
- my_cs_can_be_contraction_head(cs, (uchar) *ptr))
+ if (contractions && ptr + 1 < end &&
+ my_uca_can_be_contraction_head(contractions, (uchar) *ptr))
{
/* Ptr[0] is a contraction head. */
@@ -787,8 +787,8 @@ my_bool my_like_range_mb(CHARSET_INFO *c
is not a contraction, then we put only ptr[0],
and continue with ptr[1] on the next loop.
*/
- if (my_cs_can_be_contraction_tail(cs, (uchar) ptr[1]) &&
- my_cs_contraction2_weight(cs, (uchar) ptr[0], (uchar) ptr[1]))
+ if (my_uca_can_be_contraction_tail(contractions, (uchar) ptr[1]) &&
+ my_uca_contraction2_weight(contractions, (uchar) ptr[0], ptr[1]))
{
/* Contraction found */
if (maxcharlen == 1 || min_str + 1 >= min_end)
@@ -853,7 +853,7 @@ my_like_range_generic(CHARSET_INFO *cs,
char *max_end= max_str + res_length;
size_t charlen= res_length / cs->mbmaxlen;
size_t res_length_diff;
- my_bool have_contractions= my_cs_have_contractions(cs);
+ const MY_CONTRACTIONS *contractions= my_charset_get_contractions(cs, 0);
for ( ; charlen > 0; charlen--)
{
@@ -921,8 +921,8 @@ my_like_range_generic(CHARSET_INFO *cs,
goto pad_min_max;
}
- if (have_contractions &&
- my_cs_can_be_contraction_head(cs, wc) &&
+ if (contractions &&
+ my_uca_can_be_contraction_head(contractions, wc) &&
(res= cs->cset->mb_wc(cs, &wc2, (uchar*) ptr, (uchar*) end)) > 0)
{
const uint16 *weight;
@@ -933,8 +933,8 @@ my_like_range_generic(CHARSET_INFO *cs,
goto pad_min_max;
}
- if (my_cs_can_be_contraction_tail(cs, wc2) &&
- (weight= my_cs_contraction2_weight(cs, wc, wc2)) && weight[0])
+ if (my_uca_can_be_contraction_tail(contractions, wc2) &&
+ (weight= my_uca_contraction2_weight(contractions, wc, wc2)) && weight[0])
{
/* Contraction found */
if (charlen == 1)
=== modified file 'strings/ctype-simple.c'
--- strings/ctype-simple.c 2013-07-21 14:39:19 +0000
+++ strings/ctype-simple.c 2013-09-17 11:41:12 +0000
@@ -1163,12 +1163,12 @@ static int pcmp(const void * f, const vo
return res;
}
-static my_bool create_fromuni(struct charset_info_st *cs,
- void *(*alloc)(size_t))
+static my_bool
+create_fromuni(struct charset_info_st *cs,
+ MY_CHARSET_LOADER *loader)
{
uni_idx idx[PLANE_NUM];
int i,n;
- struct my_uni_idx_st *tab_from_uni;
/*
Check that Unicode map is loaded.
@@ -1217,7 +1217,8 @@ static my_bool create_fromuni(struct cha
numchars=idx[i].uidx.to-idx[i].uidx.from+1;
if (!(idx[i].uidx.tab= tab= (uchar*)
- alloc(numchars * sizeof(*idx[i].uidx.tab))))
+ (loader->once_alloc) (numchars *
+ sizeof(*idx[i].uidx.tab))))
return TRUE;
bzero(tab,numchars*sizeof(*tab));
@@ -1235,25 +1236,25 @@ static my_bool create_fromuni(struct cha
/* Allocate and fill reverse table for each plane */
n=i;
- if (!(cs->tab_from_uni= tab_from_uni= (struct my_uni_idx_st*)
- alloc(sizeof(MY_UNI_IDX)*(n+1))))
+ if (!(cs->tab_from_uni= (MY_UNI_IDX *)
+ (loader->once_alloc)(sizeof(MY_UNI_IDX) * (n + 1))))
return TRUE;
for (i=0; i< n; i++)
- tab_from_uni[i]= idx[i].uidx;
+ ((struct my_uni_idx_st*)cs->tab_from_uni)[i]= idx[i].uidx;
/* Set end-of-list marker */
- bzero(&tab_from_uni[i],sizeof(MY_UNI_IDX));
+ bzero((char*) &cs->tab_from_uni[i],sizeof(MY_UNI_IDX));
return FALSE;
}
-static my_bool my_cset_init_8bit(struct charset_info_st *cs,
- void *(*alloc)(size_t))
+static my_bool
+my_cset_init_8bit(struct charset_info_st *cs, MY_CHARSET_LOADER *loader)
{
cs->caseup_multiply= 1;
cs->casedn_multiply= 1;
cs->pad_char= ' ';
- return create_fromuni(cs, alloc);
+ return create_fromuni(cs, loader);
}
static void set_max_sort_char(struct charset_info_st *cs)
@@ -1276,7 +1277,7 @@ static void set_max_sort_char(struct cha
}
static my_bool my_coll_init_simple(struct charset_info_st *cs,
- void *(*alloc)(size_t) __attribute__((unused)))
+ MY_CHARSET_LOADER *loader __attribute__((unused)))
{
set_max_sort_char(cs);
return FALSE;
=== modified file 'strings/ctype-sjis.c'
--- strings/ctype-sjis.c 2012-01-13 14:50:02 +0000
+++ strings/ctype-sjis.c 2013-08-29 08:09:16 +0000
@@ -197,7 +197,7 @@ static uint mbcharlen_sjis(CHARSET_INFO
#define sjiscode(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d))
-static MY_UNICASE_INFO c81[256]=
+static MY_UNICASE_CHARACTER c81[256]=
{
/* 8100-810F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -407,7 +407,7 @@ static MY_UNICASE_INFO c81[256]=
};
-static MY_UNICASE_INFO c82[256]=
+static MY_UNICASE_CHARACTER c82[256]=
{
/* 8200-820F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -615,7 +615,7 @@ static MY_UNICASE_INFO c82[256]=
};
-static MY_UNICASE_INFO c83[256]=
+static MY_UNICASE_CHARACTER c83[256]=
{
/* 8300-830F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -825,7 +825,7 @@ static MY_UNICASE_INFO c83[256]=
};
-static MY_UNICASE_INFO c84[256]=
+static MY_UNICASE_CHARACTER c84[256]=
{
/* 8400-840F */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -1035,7 +1035,7 @@ static MY_UNICASE_INFO c84[256]=
};
-static MY_UNICASE_INFO *my_caseinfo_sjis[256]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_sjis[256]=
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1072,7 +1072,14 @@ static MY_UNICASE_INFO *my_caseinfo_sjis
};
-static int my_strnncoll_sjis_internal(CHARSET_INFO *cs,
+static MY_UNICASE_INFO my_caseinfo_sjis=
+{
+ 0xFFFF,
+ my_caseinfo_pages_sjis
+};
+
+
+static int my_strnncoll_sjis_internal(const CHARSET_INFO *cs,
const uchar **a_res, size_t a_length,
const uchar **b_res, size_t b_length)
{
@@ -34204,11 +34211,10 @@ struct charset_info_st my_charset_sjis_j
to_lower_sjis,
to_upper_sjis,
sort_order_sjis,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_sjis, /* caseinfo */
+ &my_caseinfo_sjis, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -34236,11 +34242,10 @@ struct charset_info_st my_charset_sjis_b
to_lower_sjis,
to_upper_sjis,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_sjis, /* caseinfo */
+ &my_caseinfo_sjis, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-tis620.c'
--- strings/ctype-tis620.c 2013-03-25 22:03:13 +0000
+++ strings/ctype-tis620.c 2013-08-29 08:10:04 +0000
@@ -894,11 +894,10 @@ struct charset_info_st my_charset_tis620
to_lower_tis620,
to_upper_tis620,
sort_order_tis620,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
4, /* strxfrm_multiply */
@@ -926,11 +925,10 @@ struct charset_info_st my_charset_tis620
to_lower_tis620,
to_upper_tis620,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-uca.c'
--- strings/ctype-uca.c 2013-07-21 14:39:19 +0000
+++ strings/ctype-uca.c 2013-09-17 13:16:55 +0000
@@ -46,7 +46,6 @@
#define MY_UCA_NCHARS 256
#define MY_UCA_CMASK 255
#define MY_UCA_PSHIFT 8
-#define MAX_UCA_CHAR_WITH_EXPLICIT_WEIGHT 0xFFFF
static const uint16 page000data[]= { /* 0000 (4 weights per char) */
0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,
@@ -6526,6 +6525,59 @@ NULL ,page0F9data,page0FAdata,page
page0FCdata,page0FDdata,page0FEdata,page0FFdata
};
+
+MY_UCA_INFO my_uca_v400=
+{
+ {
+ {
+ 0xFFFF, /* maxchar */
+ (uchar *) uca_length,
+ (uint16 **) uca_weight,
+ { /* Contractions: */
+ 0, /* nitems */
+ NULL, /* item */
+ NULL /* flags */
+ }
+ },
+ },
+
+ /* Logical positions */
+ 0x0009, /* first_non_ignorable p != ignore */
+ 0xA48C, /* last_non_ignorable Not a CJK and not UNASSIGNED */
+
+ 0x0332, /* first_primary_ignorable p == 0 */
+ 0x20EA, /* last_primary_ignorable */
+
+ 0x0000, /* first_secondary_ignorable p,s == 0 */
+ 0xFE73, /* last_secondary_ignorable p,s == 0 */
+
+ 0x0000, /* first_tertiary_ignorable p,s,t == 0 */
+ 0xFE73, /* last_tertiary_ignorable p,s,t == 0 */
+
+ 0x0000, /* first_trailing */
+ 0x0000, /* last_trailing */
+
+ 0x0009, /* first_variable */
+ 0x2183, /* last_variable */
+};
+
+/******************************************************/
+
+#define MY_UCA_CMASK 255
+#define MY_UCA_PSHIFT 8
+
+
+/******************************************************/
+
+/*
+ German Phonebook
+*/
+static const char german2[]=
+ "&AE << \\u00E6 <<< \\u00C6 << \\u00E4 <<< \\u00C4 "
+ "&OE << \\u0153 <<< \\u0152 << \\u00F6 <<< \\u00D6 "
+ "&UE << \\u00FC <<< \\u00DC ";
+
+
/*
Some sources treat LETTER A WITH DIARESIS (00E4,00C4)
secondary greater than LETTER AE (00E6,00C6).
@@ -6686,7 +6738,13 @@ static const char persian[]=
"& \\u0642 < \\u06A9 < \\u0643"
"& \\u0648 < \\u0647 < \\u0629 < \\u06C0 < \\u06CC < \\u0649 < \\u064A"
"& \\uFE80 < \\uFE81 < \\uFE82 < \\uFE8D < \\uFE8E < \\uFB50 < \\uFB51"
- " < \\uFE80 < \\uFE83 < \\uFE84 < \\uFE87 < \\uFE88 < \\uFE85"
+ " < \\uFE80 "
+ /*
+ FE80 appears both in reset and shift.
+ We need to break the rule here and reset to *new* FE80 again,
+ so weight for FE83 is calculated as P[FE80]+1, not as P[FE80]+8.
+ */
+ " & \\uFE80 < \\uFE83 < \\uFE84 < \\uFE87 < \\uFE88 < \\uFE85"
" < \\uFE86 < \\u0689 < \\u068A"
"& \\uFEAE < \\uFDFC"
"& \\uFED8 < \\uFB8E < \\uFB8F < \\uFB90 < \\uFB91 < \\uFED9 < \\uFEDA"
@@ -6747,7 +6805,6 @@ static const char sinhala[]=
static const char croatian[]=
-
"&C < \\u010D <<< \\u010C < \\u0107 <<< \\u0106 "
"&D < d\\u017E <<< \\u01C6 <<< D\\u017E <<< \\u01C5 <<< D\\u017D <<< \\u01C4 "
" < \\u0111 <<< \\u0110 "
@@ -6755,7 +6812,6 @@ static const char croatian[]=
"&N < nj <<< \\u01CC <<< Nj <<< \\u01CB <<< NJ <<< \\u01CA "
"&S < \\u0161 <<< \\u0160 "
"&Z < \\u017E <<< \\u017D";
-
/*
Unicode Collation Algorithm:
Collation element (weight) scanner,
@@ -6767,9 +6823,7 @@ typedef struct my_uca_scanner_st
const uint16 *wbeg; /* Beginning of the current weight string */
const uchar *sbeg; /* Beginning of the input string */
const uchar *send; /* End of the input string */
- const uchar *uca_length;
- const uint16 * const *uca_weight;
- const MY_CONTRACTIONS *contractions;
+ const MY_UCA_WEIGHT_LEVEL *level;
uint16 implicit[2];
int page;
int code;
@@ -6782,51 +6836,81 @@ typedef struct my_uca_scanner_st
*/
typedef struct my_uca_scanner_handler_st
{
- void (*init)(my_uca_scanner *scanner, CHARSET_INFO *cs,
+ void (*init)(my_uca_scanner *scanner, CHARSET_INFO *cs,
+ const MY_UCA_WEIGHT_LEVEL *level,
const uchar *str, size_t length);
int (*next)(my_uca_scanner *scanner);
} my_uca_scanner_handler;
static const uint16 nochar[]= {0,0};
+
+#define MY_UCA_CNT_FLAG_SIZE 4096
+#define MY_UCA_CNT_FLAG_MASK 4095
+
+#define MY_UCA_CNT_HEAD 1
+#define MY_UCA_CNT_TAIL 2
+#define MY_UCA_CNT_MID1 4
+#define MY_UCA_CNT_MID2 8
+#define MY_UCA_CNT_MID3 16
+#define MY_UCA_CNT_MID4 32
+
+#define MY_UCA_PREVIOUS_CONTEXT_HEAD 64
+#define MY_UCA_PREVIOUS_CONTEXT_TAIL 128
+
/********** Helper functions to handle contraction ************/
/**
Mark a character as a contraction part
- @cs Pointer to CHARSET_INFO data
- @wc Unicode code point
- @flag flag: "is contraction head", "is contraction tail"
+ @param uca Pointer to UCA data
+ @param wc Unicode code point
+ @param flag flag: "is contraction head", "is contraction tail"
*/
-static void
-my_uca_add_contraction_flag(CHARSET_INFO *cs, my_wc_t wc, int flag)
+static inline void
+my_uca_add_contraction_flag(MY_CONTRACTIONS *list, my_wc_t wc, int flag)
{
- cs->contractions->flags[wc & MY_UCA_CNT_FLAG_MASK]|= flag;
+ list->flags[wc & MY_UCA_CNT_FLAG_MASK]|= flag;
}
/**
Add a new contraction into contraction list
- @cs Pointer to CHARSET_INFO data
- @wc Unicode code points of the characters
- @len Number of characters
+ @param uca Pointer to UCA data
+ @param wc Unicode code points of the characters
+ @param len Number of characters
@return New contraction
@retval Pointer to a newly added contraction
*/
static MY_CONTRACTION *
-my_uca_add_contraction(struct charset_info_st *cs,
- my_wc_t *wc, int len __attribute__((unused)))
+my_uca_add_contraction(MY_CONTRACTIONS *list, my_wc_t *wc, size_t len,
+ my_bool with_context)
{
- MY_CONTRACTIONS *list= (MY_CONTRACTIONS*) cs->contractions;
MY_CONTRACTION *next= &list->item[list->nitems];
- DBUG_ASSERT(len == 2); /* We currently support only contraction2 */
- next->ch[0]= wc[0];
- next->ch[1]= wc[1];
+ size_t i;
+ /*
+ Contraction is always at least 2 characters.
+ Contraction is never longer than MY_UCA_MAX_CONTRACTION,
+ which is guaranteed by using my_coll_rule_expand() with proper limit.
+ */
+ DBUG_ASSERT(len > 1 && len <= MY_UCA_MAX_CONTRACTION);
+ for (i= 0; i < len; i++)
+ {
+ /*
+ We don't support contractions with U+0000.
+ my_coll_rule_expand() guarantees there're no U+0000 in a contraction.
+ */
+ DBUG_ASSERT(wc[i] != 0);
+ next->ch[i]= wc[i];
+ }
+ if (i < MY_UCA_MAX_CONTRACTION)
+ next->ch[i]= 0; /* Add end-of-line marker */
+ next->with_context= with_context;
list->nitems++;
return next;
}
@@ -6835,9 +6919,9 @@ my_uca_add_contraction(struct charset_in
/**
Allocate and initialize memory for contraction list and flags
- @cs Pointer to CHARSET_INFO data
- @alloc Memory allocation function (typically points to my_alloc_once)
- @n Number of contractions
+ @param uca Pointer to UCA data
+ @param alloc Memory allocation function (typically points to my_alloc_once)
+ @param n Number of contractions
@return Error code
@retval 0 - memory allocated successfully
@@ -6845,171 +6929,318 @@ my_uca_add_contraction(struct charset_in
*/
static my_bool
-my_uca_alloc_contractions(struct charset_info_st *cs,
- void *(*alloc)(size_t), size_t n)
+my_uca_alloc_contractions(MY_CONTRACTIONS *contractions,
+ MY_CHARSET_LOADER *loader, size_t n)
{
uint size= n * sizeof(MY_CONTRACTION);
- MY_CONTRACTIONS *contractions;
-
- if (!(cs->contractions= contractions= (*alloc)(sizeof(MY_CONTRACTIONS))))
- return 1;
- bzero(contractions, sizeof(MY_CONTRACTIONS));
- if (!(contractions->item= (*alloc)(size)) ||
- !(contractions->flags= (char*) (*alloc)(MY_UCA_CNT_FLAG_SIZE)))
+ if (!(contractions->item= (loader->once_alloc)(size)) ||
+ !(contractions->flags= (char *) (loader->once_alloc)(MY_UCA_CNT_FLAG_SIZE)))
return 1;
- bzero(contractions->item, size);
- bzero(contractions->flags, MY_UCA_CNT_FLAG_SIZE);
+ memset(contractions->item, 0, size);
+ memset(contractions->flags, 0, MY_UCA_CNT_FLAG_SIZE);
return 0;
}
-#ifdef HAVE_CHARSET_ucs2
-/*
- Initialize collation weight scanner
+/**
+ Return UCA contraction data for a CHARSET_INFO structure.
- SYNOPSIS:
- my_uca_scanner_init()
- scanner Pointer to an initialized scanner structure
- cs Character set + collation information
- str Beginning of the string
- length Length of the string.
-
- NOTES:
- Optimized for UCS2
+ @param cs Pointer to CHARSET_INFO structure
+ @retval Pointer to contraction data
+ @retval NULL, if this collation does not have UCA contraction
+*/
- RETURN
- N/A
+const MY_CONTRACTIONS *
+my_charset_get_contractions(const CHARSET_INFO *cs, int level)
+{
+ return (cs->uca != NULL) && (cs->uca->level[level].contractions.nitems > 0) ?
+ &cs->uca->level[level].contractions : NULL;
+}
+
+
+/**
+ Check if UCA level data has contractions (static version)
+ Static quick version of my_uca_have_contractions(),
+ optimized for performance purposes, also marked as "inline".
+
+ @param level Pointer to UCA level data
+
+ @return Flags indicating if UCA with contractions
+ @retval 0 - no contractions
+ @retval 1 - there are some contractions
*/
-static void my_uca_scanner_init_ucs2(my_uca_scanner *scanner,
- CHARSET_INFO *cs,
- const uchar *str, size_t length)
+static inline my_bool
+my_uca_have_contractions_quick(const MY_UCA_WEIGHT_LEVEL *level)
{
- scanner->wbeg= nochar;
- if (length)
+ return (level->contractions.nitems > 0);
+}
+
+
+
+/**
+ Check if a character can be contraction head
+
+ @param c Pointer to UCA contraction data
+ @param wc Code point
+
+ @retval 0 - cannot be contraction head
+ @retval 1 - can be contraction head
+*/
+
+my_bool
+my_uca_can_be_contraction_head(const MY_CONTRACTIONS *c, my_wc_t wc)
+{
+ return c->flags[wc & MY_UCA_CNT_FLAG_MASK] & MY_UCA_CNT_HEAD;
+}
+
+
+/**
+ Check if a character can be contraction tail
+
+ @param c Pointer to UCA contraction data
+ @param wc Code point
+
+ @retval 0 - cannot be contraction tail
+ @retval 1 - can be contraction tail
+*/
+
+my_bool
+my_uca_can_be_contraction_tail(const MY_CONTRACTIONS *c, my_wc_t wc)
+{
+ return c->flags[wc & MY_UCA_CNT_FLAG_MASK] & MY_UCA_CNT_TAIL;
+}
+
+
+/**
+ Check if a character can be contraction part
+
+ @param c Pointer to UCA contraction data
+ @param wc Code point
+
+ @retval 0 - cannot be contraction part
+ @retval 1 - can be contraction part
+*/
+
+static inline my_bool
+my_uca_can_be_contraction_part(const MY_CONTRACTIONS *c, my_wc_t wc, int flag)
+{
+ return c->flags[wc & MY_UCA_CNT_FLAG_MASK] & flag;
+}
+
+
+/**
+ Find a contraction consisting of two characters and return its weight array
+
+ @param list Pointer to UCA contraction data
+ @param wc1 First character
+ @param wc2 Second character
+
+ @return Weight array
+ @retval NULL - no contraction found
+ @retval ptr - contraction weight array
+*/
+
+uint16 *
+my_uca_contraction2_weight(const MY_CONTRACTIONS *list, my_wc_t wc1, my_wc_t wc2)
+{
+ MY_CONTRACTION *c, *last;
+ for (c= list->item, last= c + list->nitems; c < last; c++)
{
- scanner->sbeg= str;
- scanner->send= str + length - 2;
- scanner->uca_length= cs->sort_order;
- scanner->uca_weight= cs->sort_order_big;
- scanner->contractions= cs->contractions;
- scanner->cs= cs;
- return;
+ if (c->ch[0] == wc1 && c->ch[1] == wc2 && c->ch[2] == 0)
+ {
+ return c->weight;
+ }
}
+ return NULL;
+}
- /*
- Sometimes this function is called with
- str=NULL and length=0, which should be
- considered as an empty string.
-
- The above initialization is unsafe for such cases,
- because scanner->send is initialized to (NULL-2), which is 0xFFFFFFFE.
- Then we fall into an endless loop in my_uca_scanner_next_ucs2().
-
- Do special initialization for the case when length=0.
- Initialize scanner->sbeg to an address greater than scanner->send.
- Next call of my_uca_scanner_next_ucs2() will correctly return with -1.
- */
- scanner->sbeg= (uchar*) &nochar[1];
- scanner->send= (uchar*) &nochar[0];
+
+/**
+ Check if a character can be previous context head
+
+ @param list Pointer to UCA contraction data
+ @param wc Code point
+
+ @return
+ @retval FALSE - cannot be previous context head
+ @retval TRUE - can be previous context head
+*/
+
+my_bool
+my_uca_can_be_previous_context_head(const MY_CONTRACTIONS *list, my_wc_t wc)
+{
+ return list->flags[wc & MY_UCA_CNT_FLAG_MASK] & MY_UCA_PREVIOUS_CONTEXT_HEAD;
}
-/*
- Read next collation element (weight), i.e. converts
- a stream of characters into a stream of their weights.
-
- SYNOPSIS:
- my_uca_scanner_next()
- scanner Address of a previously initialized scanner strucuture
-
- NOTES:
- Optimized for UCS2
-
- Checks if the current character's weight string has been fully scanned,
- if no, then returns the next weight for this character,
- else scans the next character and returns its first weight.
+/**
+ Check if a character can be previois context tail
- Each character can have number weights from 0 to 8.
-
- Some characters do not have weights at all, 0 weights.
- It means they are ignored during comparison.
-
- Examples:
- 1. 0x0001 START OF HEADING, has no weights, ignored, does
- not produce any weights.
- 2. 0x0061 LATIN SMALL LETTER A, has one weight.
- 0x0E33 will be returned
- 3. 0x00DF LATIN SMALL LETTER SHARP S, aka SZ ligature,
- has two weights. It will return 0x0FEA twice for two
- consequent calls.
- 4. 0x247D PATENTHESIZED NUMBER TEN, has four weights,
- this function will return these numbers in four
- consequent calls: 0x0288, 0x0E2A, 0x0E29, 0x0289
- 5. A string consisting of the above characters:
- 0x0001 0x0061 0x00DF 0x247D
- will return the following weights, one weight per call:
- 0x0E33 0x0FEA 0x0FEA 0x0288, 0x0E2A, 0x0E29, 0x0289
-
- RETURN
- Next weight, a number between 0x0000 and 0xFFFF
- Or -1 on error (END-OF-STRING or ILLEGAL MULTIBYTE SEQUENCE)
+ @param uca Pointer to UCA contraction data
+ @param wc Code point
+
+ @return
+ @retval FALSE - cannot be contraction tail
+ @retval TRUE - can be contraction tail
*/
-static int my_uca_scanner_next_ucs2(my_uca_scanner *scanner)
+my_bool
+my_uca_can_be_previous_context_tail(const MY_CONTRACTIONS *list, my_wc_t wc)
{
-
- /*
- Check if the weights for the previous character have been
- already fully scanned. If yes, then get the next character and
- initialize wbeg and wlength to its weight string.
- */
-
- if (scanner->wbeg[0])
- return *scanner->wbeg++;
-
- do
+ return list->flags[wc & MY_UCA_CNT_FLAG_MASK] & MY_UCA_PREVIOUS_CONTEXT_TAIL;
+}
+
+
+/**
+ Compare two wide character strings, wide analog to strncmp().
+
+ @param a Pointer to the first string
+ @param b Pointer to the second string
+ @param len Length of the strings
+
+ @return
+ @retval 0 - strings are equal
+ @retval non-zero - strings are different
+*/
+
+static int
+my_wmemcmp(my_wc_t *a, my_wc_t *b, size_t len)
+{
+ return memcmp(a, b, len * sizeof(my_wc_t));
+}
+
+
+/**
+ Check if a string is a contraction,
+ and return its weight array on success.
+
+ @param list Pointer to UCA contraction data
+ @param wc Pointer to wide string
+ @param len String length
+
+ @return Weight array
+ @retval NULL - Input string is not a known contraction
+ @retval ptr - contraction weight array
+*/
+
+static inline uint16 *
+my_uca_contraction_weight(const MY_CONTRACTIONS *list, my_wc_t *wc, size_t len)
+{
+ MY_CONTRACTION *c, *last;
+ for (c= list->item, last= c + list->nitems; c < last; c++)
{
- const uint16 *const *ucaw= scanner->uca_weight;
- const uchar *ucal= scanner->uca_length;
-
- if (scanner->sbeg > scanner->send)
- return -1;
-
- scanner->page= (uchar)scanner->sbeg[0];
- scanner->code= (uchar)scanner->sbeg[1];
- scanner->sbeg+= 2;
-
- if (scanner->contractions && (scanner->sbeg <= scanner->send))
+ if ((len == MY_UCA_MAX_CONTRACTION || c->ch[len] == 0) &&
+ !c->with_context &&
+ !my_wmemcmp(c->ch, wc, len))
+ return c->weight;
+ }
+ return NULL;
+}
+
+
+/**
+ Find a contraction in the input stream and return its weight array
+
+ Scan input characters while their flags tell that they can be
+ a contraction part. Then try to find real contraction among the
+ candidates, starting from the longest.
+
+ @param scanner Pointer to UCA scanner
+ @param[OUT] *wc Where to store the scanned string
+
+ @return Weight array
+ @retval NULL - no contraction found
+ @retval ptr - contraction weight array
+*/
+
+static uint16 *
+my_uca_scanner_contraction_find(my_uca_scanner *scanner, my_wc_t *wc)
+{
+ size_t clen= 1;
+ int flag;
+ const uchar *s, *beg[MY_UCA_MAX_CONTRACTION];
+ memset(beg, 0, sizeof(beg));
+
+ /* Scan all contraction candidates */
+ for (s= scanner->sbeg, flag= MY_UCA_CNT_MID1;
+ clen < MY_UCA_MAX_CONTRACTION;
+ flag<<= 1)
+ {
+ int mblen;
+ if ((mblen= scanner->cs->cset->mb_wc(scanner->cs, &wc[clen],
+ s, scanner->send)) <= 0)
+ break;
+ beg[clen]= s= s + mblen;
+ if (!my_uca_can_be_contraction_part(&scanner->level->contractions,
+ wc[clen++], flag))
+ break;
+ }
+
+ /* Find among candidates the longest real contraction */
+ for ( ; clen > 1; clen--)
+ {
+ uint16 *cweight;
+ if (my_uca_can_be_contraction_tail(&scanner->level->contractions,
+ wc[clen - 1]) &&
+ (cweight= my_uca_contraction_weight(&scanner->level->contractions,
+ wc, clen)))
{
- my_wc_t wc1= ((scanner->page << 8) | scanner->code);
-
- if (my_cs_can_be_contraction_head(scanner->cs, wc1))
- {
- const uint16 *cweight;
- my_wc_t wc2= (((my_wc_t) scanner->sbeg[0]) << 8) | scanner->sbeg[1];
- if (my_cs_can_be_contraction_tail(scanner->cs, wc2) &&
- (cweight= my_cs_contraction2_weight(scanner->cs,
- scanner->code,
- scanner->sbeg[1])))
- {
- scanner->implicit[0]= 0;
- scanner->wbeg= scanner->implicit;
- scanner->sbeg+=2;
- return *cweight;
- }
- }
+ scanner->wbeg= cweight + 1;
+ scanner->sbeg= beg[clen - 1];
+ return cweight;
}
-
- if (!ucaw[scanner->page])
- goto implicit;
- scanner->wbeg= ucaw[scanner->page] + scanner->code * ucal[scanner->page];
- } while (!scanner->wbeg[0]);
-
- return *scanner->wbeg++;
+ }
+
+ return NULL; /* No contractions were found */
+}
+
+
+/**
+ Find weight for contraction with previous context
+ and return its weight array.
+
+ @param scanner Pointer to UCA scanner
+ @param wc0 Previous character
+ @param wc1 Current character
+
+ @return Weight array
+ @retval NULL - no contraction with context found
+ @retval ptr - contraction weight array
+*/
+
+uint16 *
+my_uca_previous_context_find(my_uca_scanner *scanner,
+ my_wc_t wc0, my_wc_t wc1)
+{
+ const MY_CONTRACTIONS *list= &scanner->level->contractions;
+ MY_CONTRACTION *c, *last;
+ for (c= list->item, last= c + list->nitems; c < last; c++)
+ {
+ if (c->with_context && wc0 == c->ch[0] && wc1 == c->ch[1])
+ {
+ scanner->wbeg= c->weight + 1;
+ return c->weight;
+ }
+ }
+ return NULL;
+}
+
+/****************************************************************/
+
+
+/**
+ Return implicit UCA weight
+ Used for characters that do not have assigned UCA weights.
-implicit:
+ @param scanner UCA weight scanner
+ @return The leading implicit weight.
+*/
+
+static inline int
+my_uca_scanner_next_implicit(my_uca_scanner *scanner)
+{
scanner->code= (scanner->page << 8) + scanner->code;
scanner->implicit[0]= (scanner->code & 0x7FFF) | 0x8000;
scanner->implicit[1]= 0;
@@ -7027,112 +7258,101 @@ static int my_uca_scanner_next_ucs2(my_u
return scanner->page;
}
-static my_uca_scanner_handler my_ucs2_uca_scanner_handler=
-{
- my_uca_scanner_init_ucs2,
- my_uca_scanner_next_ucs2
-};
-
-#endif /* HAVE_CHARSET_ucs2 */
-
/*
The same two functions for any character set
*/
-static void my_uca_scanner_init_any(my_uca_scanner *scanner,
- CHARSET_INFO *cs __attribute__((unused)),
- const uchar *str, size_t length)
+static void
+my_uca_scanner_init_any(my_uca_scanner *scanner,
+ CHARSET_INFO *cs,
+ const MY_UCA_WEIGHT_LEVEL *level,
+ const uchar *str, size_t length)
{
/* Note, no needs to initialize scanner->wbeg */
scanner->sbeg= str;
scanner->send= str + length;
scanner->wbeg= nochar;
- scanner->uca_length= cs->sort_order;
- scanner->uca_weight= cs->sort_order_big;
- scanner->contractions= cs->contractions;
+ scanner->level= level;
scanner->cs= cs;
}
static int my_uca_scanner_next_any(my_uca_scanner *scanner)
{
-
/*
Check if the weights for the previous character have been
already fully scanned. If yes, then get the next character and
initialize wbeg and wlength to its weight string.
*/
-
- if (scanner->wbeg[0])
- return *scanner->wbeg++;
-
- do
+
+ if (scanner->wbeg[0]) /* More weights left from the previous step: */
+ return *scanner->wbeg++; /* return the next weight from expansion */
+
+ do
{
- const uint16 *const *ucaw= scanner->uca_weight;
- const uchar *ucal= scanner->uca_length;
- my_wc_t wc;
- int mb_len;
-
- if (((mb_len= scanner->cs->cset->mb_wc(scanner->cs, &wc,
+ const uint16 *wpage;
+ my_wc_t wc[MY_UCA_MAX_CONTRACTION];
+ int mblen;
+
+ /* Get next character */
+ if (((mblen= scanner->cs->cset->mb_wc(scanner->cs, wc,
scanner->sbeg,
scanner->send)) <= 0))
return -1;
-
- scanner->sbeg+= mb_len;
- if (wc > MAX_UCA_CHAR_WITH_EXPLICIT_WEIGHT)
+
+ scanner->sbeg+= mblen;
+ if (wc[0] > scanner->level->maxchar)
{
/* Return 0xFFFD as weight for all characters outside BMP */
scanner->wbeg= nochar;
return 0xFFFD;
}
- else
- {
- scanner->page= wc >> 8;
- scanner->code= wc & 0xFF;
- }
-
- if (my_cs_have_contractions(scanner->cs) &&
- my_cs_can_be_contraction_head(scanner->cs, wc))
+
+ if (my_uca_have_contractions_quick(scanner->level))
{
- my_wc_t wc2;
- const uint16 *cweight;
-
- if (((mb_len= scanner->cs->cset->mb_wc(scanner->cs, &wc2,
- scanner->sbeg,
- scanner->send)) >=0) &&
- my_cs_can_be_contraction_tail(scanner->cs, wc2) &&
- (cweight= my_cs_contraction2_weight(scanner->cs, wc, wc2)))
+ uint16 *cweight;
+ /*
+ If we have scanned a character which can have previous context,
+ and there were some more characters already before,
+ then reconstruct codepoint of the previous character
+ from "page" and "code" into w[1], and verify that {wc[1], wc[0]}
+ together form a real previous context pair.
+ Note, we support only 2-character long sequences with previous
+ context at the moment. CLDR does not have longer sequences.
+ */
+ if (my_uca_can_be_previous_context_tail(&scanner->level->contractions,
+ wc[0]) &&
+ scanner->wbeg != nochar && /* if not the very first character */
+ my_uca_can_be_previous_context_head(&scanner->level->contractions,
+ (wc[1]= ((scanner->page << 8) +
+ scanner->code))) &&
+ (cweight= my_uca_previous_context_find(scanner, wc[1], wc[0])))
{
- scanner->implicit[0]= 0;
- scanner->wbeg= scanner->implicit;
- scanner->sbeg+= mb_len;
+ scanner->page= scanner->code= 0; /* Clear for the next character */
return *cweight;
}
+ else if (my_uca_can_be_contraction_head(&scanner->level->contractions,
+ wc[0]))
+ {
+ /* Check if w[0] starts a contraction */
+ if ((cweight= my_uca_scanner_contraction_find(scanner, wc)))
+ return *cweight;
+ }
}
-
- if (!ucaw[scanner->page])
- goto implicit;
- scanner->wbeg= ucaw[scanner->page] + scanner->code * ucal[scanner->page];
- } while (!scanner->wbeg[0]);
-
+
+ /* Process single character */
+ scanner->page= wc[0] >> 8;
+ scanner->code= wc[0] & 0xFF;
+
+ /* If weight page for w[0] does not exist, then calculate algoritmically */
+ if (!(wpage= scanner->level->weights[scanner->page]))
+ return my_uca_scanner_next_implicit(scanner);
+
+ /* Calculate pointer to w[0]'s weight, using page and offset */
+ scanner->wbeg= wpage +
+ scanner->code * scanner->level->lengths[scanner->page];
+ } while (!scanner->wbeg[0]); /* Skip ignorable characters */
+
return *scanner->wbeg++;
-
-implicit:
-
- scanner->code= (scanner->page << 8) + scanner->code;
- scanner->implicit[0]= (scanner->code & 0x7FFF) | 0x8000;
- scanner->implicit[1]= 0;
- scanner->wbeg= scanner->implicit;
-
- scanner->page= scanner->page >> 7;
-
- if (scanner->code >= 0x3400 && scanner->code <= 0x4DB5)
- scanner->page+= 0xFB80;
- else if (scanner->code >= 0x4E00 && scanner->code <= 0x9FA5)
- scanner->page+= 0xFB40;
- else
- scanner->page+= 0xFBC0;
-
- return scanner->page;
}
@@ -7142,7 +7362,6 @@ static my_uca_scanner_handler my_any_uca
my_uca_scanner_next_any
};
-
/*
Compares two strings according to the collation
@@ -7195,8 +7414,8 @@ static int my_strnncoll_uca(CHARSET_INFO
int s_res;
int t_res;
- scanner_handler->init(&sscanner, cs, s, slen);
- scanner_handler->init(&tscanner, cs, t, tlen);
+ scanner_handler->init(&sscanner, cs, &cs->uca->level[0], s, slen);
+ scanner_handler->init(&tscanner, cs, &cs->uca->level[0], t, tlen);
do
{
@@ -7207,7 +7426,39 @@ static int my_strnncoll_uca(CHARSET_INFO
return (t_is_prefix && t_res < 0) ? 0 : (s_res - t_res);
}
-/*
+
+static inline int
+my_space_weight(const CHARSET_INFO *cs) /* W3-TODO */
+{
+ return cs->uca->level[0].weights[0][0x20 * cs->uca->level[0].lengths[0]];
+}
+
+
+/**
+ Helper function:
+ Find address of weights of the given character.
+
+ @param weights UCA weight array
+ @param lengths UCA length array
+ @param ch character Unicode code point
+
+ @return Weight array
+ @retval pointer to weight array for the given character,
+ or NULL if this page does not have implicit weights.
+*/
+
+static inline uint16 *
+my_char_weight_addr(const MY_UCA_WEIGHT_LEVEL *level, uint wc)
+{
+ uint page, ofst;
+ return wc > level->maxchar ? NULL :
+ (level->weights[page= (wc >> 8)] ?
+ level->weights[page] + (ofst= (wc & 0xFF)) * level->lengths[page] :
+ NULL);
+}
+
+
+/*
Compares two strings according to the collation,
ignoring trailing spaces.
@@ -7268,8 +7519,8 @@ static int my_strnncollsp_uca(CHARSET_IN
diff_if_only_endspace_difference= 0;
#endif
- scanner_handler->init(&sscanner, cs, s, slen);
- scanner_handler->init(&tscanner, cs, t, tlen);
+ scanner_handler->init(&sscanner, cs, &cs->uca->level[0], s, slen);
+ scanner_handler->init(&tscanner, cs, &cs->uca->level[0], t, tlen);
do
{
@@ -7280,7 +7531,7 @@ static int my_strnncollsp_uca(CHARSET_IN
if (s_res > 0 && t_res < 0)
{
/* Calculate weight for SPACE character */
- t_res= cs->sort_order_big[0][0x20 * cs->sort_order[0]];
+ t_res= my_space_weight(cs);
/* compare the first string to spaces */
do
@@ -7295,7 +7546,7 @@ static int my_strnncollsp_uca(CHARSET_IN
if (s_res < 0 && t_res > 0)
{
/* Calculate weight for SPACE character */
- s_res= cs->sort_order_big[0][0x20 * cs->sort_order[0]];
+ s_res= my_space_weight(cs);
/* compare the second string to spaces */
do
@@ -7342,7 +7593,7 @@ static void my_hash_sort_uca(CHARSET_INF
my_uca_scanner scanner;
slen= cs->cset->lengthsp(cs, (char*) s, slen);
- scanner_handler->init(&scanner, cs, s, slen);
+ scanner_handler->init(&scanner, cs, &cs->uca->level[0], s, slen);
while ((s_res= scanner_handler->next(&scanner)) >0)
{
@@ -7393,7 +7644,7 @@ static size_t my_strnxfrm_uca(CHARSET_IN
uchar *de= dst + (dstlen & (size_t) ~1); /* add even length for easier code */
int s_res;
my_uca_scanner scanner;
- scanner_handler->init(&scanner, cs, src, srclen);
+ scanner_handler->init(&scanner, cs, &cs->uca->level[0], src, srclen);
while (dst < de && (s_res= scanner_handler->next(&scanner)) >0)
{
@@ -7401,7 +7652,7 @@ static size_t my_strnxfrm_uca(CHARSET_IN
dst[1]= s_res & 0xFF;
dst+= 2;
}
- s_res= cs->sort_order_big[0][0x20 * cs->sort_order[0]];
+ s_res= my_space_weight(cs);
while (dst < de)
{
dst[0]= s_res >> 8;
@@ -7416,33 +7667,6 @@ static size_t my_strnxfrm_uca(CHARSET_IN
-/**
- Helper function:
- Find address of weights of the given character.
-
- @param weights UCA weight array
- @param lengths UCA length array
- @param ch character Unicode code point
-
- @return Weight array
- @retval pointer to weight array for the given character,
- or NULL if this page does not have implicit weights.
-*/
-
-static inline const uint16 *
-my_char_weight_addr(CHARSET_INFO *cs, uint wc)
-{
- uint page, ofst;
- const uchar *ucal= cs->sort_order;
- const uint16 * const *ucaw= cs->sort_order_big;
-
- return wc > MAX_UCA_CHAR_WITH_EXPLICIT_WEIGHT ? NULL :
- (ucaw[page= (wc >> 8)] ?
- ucaw[page] + (ofst= (wc & 0xFF)) * ucal[page] :
- NULL);
-}
-
-
/*
This function compares if two characters are the same.
The sign +1 or -1 does not matter. The only
@@ -7454,8 +7678,8 @@ my_char_weight_addr(CHARSET_INFO *cs, ui
static int my_uca_charcmp(CHARSET_INFO *cs, my_wc_t wc1, my_wc_t wc2)
{
size_t length1, length2;
- const uint16 *weight1= my_char_weight_addr(cs, wc1);
- const uint16 *weight2= my_char_weight_addr(cs, wc2);
+ const uint16 *weight1= my_char_weight_addr(&cs->uca->level[0], wc1);
+ const uint16 *weight2= my_char_weight_addr(&cs->uca->level[0], wc2);
if (!weight1 || !weight2)
return wc1 != wc2;
@@ -7465,8 +7689,8 @@ static int my_uca_charcmp(CHARSET_INFO *
return 1;
/* Thoroughly compare all weights */
- length1= cs->sort_order[wc1 >> MY_UCA_PSHIFT];
- length2= cs->sort_order[wc2 >> MY_UCA_PSHIFT];
+ length1= cs->uca->level[0].lengths[wc1 >> MY_UCA_PSHIFT]; /* W3-TODO */
+ length2= cs->uca->level[0].lengths[wc2 >> MY_UCA_PSHIFT];
if (length1 > length2)
return memcmp((const void*)weight1, (const void*)weight2, length2*2) ?
@@ -7632,7 +7856,7 @@ int my_wildcmp_uca(CHARSET_INFO *cs,
/*
Collation language is implemented according to
subset of ICU Collation Customization (tailorings):
- http://oss.software.ibm.com/icu/userguide/Collate_Customization.html
+ http://icu.sourceforge.net/userguide/Collate_Customization.html
Collation language elements:
Delimiters:
@@ -7674,16 +7898,47 @@ int my_wildcmp_uca(CHARSET_INFO *cs,
typedef enum my_coll_lexem_num_en
{
- MY_COLL_LEXEM_EOF = 0,
- MY_COLL_LEXEM_DIFF = 1,
- MY_COLL_LEXEM_SHIFT = 4,
- MY_COLL_LEXEM_CHAR = 5,
- MY_COLL_LEXEM_ERROR = 6
+ MY_COLL_LEXEM_EOF = 0,
+ MY_COLL_LEXEM_SHIFT = 1,
+ MY_COLL_LEXEM_RESET = 4,
+ MY_COLL_LEXEM_CHAR = 5,
+ MY_COLL_LEXEM_ERROR = 6,
+ MY_COLL_LEXEM_OPTION = 7,
+ MY_COLL_LEXEM_EXTEND = 8,
+ MY_COLL_LEXEM_CONTEXT = 9,
} my_coll_lexem_num;
+/**
+ Convert collation customization lexem to string,
+ for nice error reporting
+
+ @param term lexem code
+
+ @return lexem name
+*/
+
+static const char *
+my_coll_lexem_num_to_str(my_coll_lexem_num term)
+{
+ switch (term)
+ {
+ case MY_COLL_LEXEM_EOF: return "EOF";
+ case MY_COLL_LEXEM_SHIFT: return "Shift";
+ case MY_COLL_LEXEM_RESET: return "&";
+ case MY_COLL_LEXEM_CHAR: return "Character";
+ case MY_COLL_LEXEM_OPTION: return "Bracket option";
+ case MY_COLL_LEXEM_EXTEND: return "/";
+ case MY_COLL_LEXEM_CONTEXT:return "|";
+ case MY_COLL_LEXEM_ERROR: return "ERROR";
+ }
+ return NULL;
+}
+
+
typedef struct my_coll_lexem_st
{
+ my_coll_lexem_num term;
const char *beg;
const char *end;
const char *prev;
@@ -7717,6 +7972,27 @@ static void my_coll_lexem_init(MY_COLL_L
}
+/**
+ Compare lexem to string with length
+
+ @param lexem lexem
+ @param pattern string
+ @param patternlen string length
+
+ @return
+ @retval 0 if lexem is equal to string, non-0 otherwise.
+*/
+
+static int
+lex_cmp(MY_COLL_LEXEM *lexem, const char *pattern, size_t patternlen)
+{
+ size_t lexemlen= lexem->beg - lexem->prev;
+ if (lexemlen < patternlen)
+ return 1; /* Not a prefix */
+ return strncasecmp(lexem->prev, pattern, patternlen);
+}
+
+
/*
Print collation customization expression parse error, with context.
@@ -7740,7 +8016,8 @@ static void my_coll_lexem_print_error(MY
size_t len= lexem->end - lexem->prev;
strmake (tail, lexem->prev, (size_t) MY_MIN(len, sizeof(tail)-1));
errstr[errsize-1]= '\0';
- my_snprintf(errstr,errsize-1,"%s at '%s'", txt, tail);
+ my_snprintf(errstr, errsize - 1,
+ "%s at '%s'", txt[0] ? txt : "Syntax error", tail);
}
@@ -7791,44 +8068,75 @@ static my_coll_lexem_num my_coll_lexem_n
{
const char *beg;
my_coll_lexem_num rc;
-
+
for (beg= lexem->beg ; beg < lexem->end ; beg++)
{
- if (*beg == ' ' || *beg == '\t' || *beg == '\r' || *beg == '\n')
- continue;
-
- if (*beg == '&')
+ switch (*beg)
{
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ continue;
+
+ case '[': /* Bracket expression, e.g. "[optimize [a-z]]" */
+ {
+ size_t nbrackets; /* Indicates nested recursion level */
+ for (beg++, nbrackets= 1 ; beg < lexem->end; beg++)
+ {
+ if (*beg == '[') /* Enter nested bracket expression */
+ nbrackets++;
+ else if (*beg == ']')
+ {
+ if (--nbrackets == 0)
+ {
+ rc= MY_COLL_LEXEM_OPTION;
+ beg++;
+ goto ex;
+ }
+ }
+ }
+ rc= MY_COLL_LEXEM_ERROR;
+ goto ex;
+ }
+
+ case '&':
beg++;
- rc= MY_COLL_LEXEM_SHIFT;
+ rc= MY_COLL_LEXEM_RESET;
goto ex;
- }
-
- if (beg[0] == '=')
- {
+
+ case '=':
beg++;
- rc= MY_COLL_LEXEM_DIFF;
+ lexem->diff= 0;
+ rc= MY_COLL_LEXEM_SHIFT;
goto ex;
- }
-
- if (beg[0] == '<')
- {
- for (beg++, lexem->diff= 1;
- (beg < lexem->end) &&
- (*beg == '<') && (lexem->diff<3);
- beg++, lexem->diff++);
- rc= MY_COLL_LEXEM_DIFF;
+
+ case '/':
+ beg++;
+ rc= MY_COLL_LEXEM_EXTEND;
goto ex;
- }
-
- if ((*beg >= 'a' && *beg <= 'z') || (*beg >= 'A' && *beg <= 'Z'))
- {
- lexem->code= *beg++;
- rc= MY_COLL_LEXEM_CHAR;
+
+ case '|':
+ beg++;
+ rc= MY_COLL_LEXEM_CONTEXT;
goto ex;
+
+ case '<': /* Shift: '<' or '<<' or '<<<' or '<<<<' */
+ {
+ /* Scan up to 3 additional '<' characters */
+ for (beg++, lexem->diff= 1;
+ (beg < lexem->end) && (*beg == '<') && (lexem->diff <= 3);
+ beg++, lexem->diff++);
+ rc= MY_COLL_LEXEM_SHIFT;
+ goto ex;
+ }
+ default:
+ break;
}
-
- if ((*beg == '\\') && (beg+2 < lexem->end) && (beg[1] == 'u'))
+
+ /* Escaped character, e.g. \u1234 */
+ if ((*beg == '\\') && (beg + 2 < lexem->end) &&
+ (beg[1] == 'u') && my_isxdigit(&my_charset_utf8_general_ci, beg[2]))
{
int ch;
@@ -7842,159 +8150,1194 @@ static my_coll_lexem_num my_coll_lexem_n
rc= MY_COLL_LEXEM_CHAR;
goto ex;
}
-
+
+ /*
+ Unescaped single byte character:
+ allow printable ASCII range except SPACE and
+ special characters parsed above []<&/|=
+ */
+ if (*beg >= 0x21 && *beg <= 0x7E)
+ {
+ lexem->code= *beg++;
+ rc= MY_COLL_LEXEM_CHAR;
+ goto ex;
+ }
+
+ if (((uchar) *beg) > 0x7F) /* Unescaped multibyte character */
+ {
+ CHARSET_INFO *cs= &my_charset_utf8_general_ci;
+ my_wc_t wc;
+ int nbytes= cs->cset->mb_wc(cs, &wc,
+ (uchar *) beg, (uchar *) lexem->end);
+ if (nbytes > 0)
+ {
+ rc= MY_COLL_LEXEM_CHAR;
+ beg+= nbytes;
+ lexem->code= (int) wc;
+ goto ex;
+ }
+ }
+
rc= MY_COLL_LEXEM_ERROR;
goto ex;
}
- rc= MY_COLL_LEXEM_EOF;
-
-ex:
- lexem->prev= lexem->beg;
- lexem->beg= beg;
- return rc;
+ rc= MY_COLL_LEXEM_EOF;
+
+ex:
+ lexem->prev= lexem->beg;
+ lexem->beg= beg;
+ lexem->term= rc;
+ return rc;
+}
+
+
+/*
+ Collation rule item
+*/
+
+#define MY_UCA_MAX_EXPANSION 6 /* Maximum expansion length */
+
+typedef struct my_coll_rule_item_st
+{
+ my_wc_t base[MY_UCA_MAX_EXPANSION]; /* Base character */
+ my_wc_t curr[MY_UCA_MAX_CONTRACTION]; /* Current character */
+ int diff[4]; /* Primary, Secondary, Tertiary, Quaternary difference */
+ size_t before_level; /* "reset before" indicator */
+ my_bool with_context;
+} MY_COLL_RULE;
+
+
+/**
+ Return length of a 0-terminated wide string, analog to strnlen().
+
+ @param s Pointer to wide string
+ @param maxlen Mamixum string length
+
+ @return string length, or maxlen if no '\0' is met.
+*/
+static size_t
+my_wstrnlen(my_wc_t *s, size_t maxlen)
+{
+ size_t i;
+ for (i= 0; i < maxlen; i++)
+ {
+ if (s[i] == 0)
+ return i;
+ }
+ return maxlen;
+}
+
+
+/**
+ Return length of the "reset" string of a rule.
+
+ @param r Collation customization rule
+
+ @return Length of r->base
+*/
+
+static inline size_t
+my_coll_rule_reset_length(MY_COLL_RULE *r)
+{
+ return my_wstrnlen(r->base, MY_UCA_MAX_EXPANSION);
+}
+
+
+/**
+ Return length of the "shift" string of a rule.
+
+ @param r Collation customization rule
+
+ @return Length of r->base
+*/
+
+static inline size_t
+my_coll_rule_shift_length(MY_COLL_RULE *r)
+{
+ return my_wstrnlen(r->curr, MY_UCA_MAX_CONTRACTION);
+}
+
+
+/**
+ Append new character to the end of a 0-terminated wide string.
+
+ @param wc Wide string
+ @param limit Maximum possible result length
+ @param code Character to add
+
+ @return 1 if character was added, 0 if string was too long
+*/
+
+static int
+my_coll_rule_expand(my_wc_t *wc, size_t limit, my_wc_t code)
+{
+ size_t i;
+ for (i= 0; i < limit; i++)
+ {
+ if (wc[i] == 0)
+ {
+ wc[i]= code;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+/**
+ Initialize collation customization rule
+
+ @param wc Rule
+*/
+
+static void
+my_coll_rule_reset(MY_COLL_RULE *r)
+{
+ memset(r, 0, sizeof(*r));
+}
+
+
+/*
+ Shift methods:
+ Simple: "&B < C" : weight('C') = weight('B') + 1
+ Expand: weght('C') = { weight('B'), weight(last_non_ignorable) + 1 }
+*/
+typedef enum
+{
+ my_shift_method_simple= 0,
+ my_shift_method_expand
+} my_coll_shift_method;
+
+
+typedef struct my_coll_rules_st
+{
+ uint version; /* Unicode version, e.g. 400 or 520 */
+ MY_UCA_INFO *uca; /* Unicode weight data */
+ size_t nrules; /* Number of rules in the rule array */
+ size_t mrules; /* Number of allocated rules */
+ MY_COLL_RULE *rule; /* Rule array */
+ MY_CHARSET_LOADER *loader;
+ my_coll_shift_method shift_after_method;
+} MY_COLL_RULES;
+
+
+/**
+ Realloc rule array to a new size.
+ Reallocate memory for 128 additional rules at once,
+ to reduce the number of reallocs, which is important
+ for long tailorings (e.g. for East Asian collations).
+
+ @param rules Rule container
+ @param n new number of rules
+
+ @return 0 on success, -1 on error.
+*/
+
+static int
+my_coll_rules_realloc(MY_COLL_RULES *rules, size_t n)
+{
+ if (rules->nrules < rules->mrules ||
+ (rules->rule= rules->loader->realloc(rules->rule,
+ sizeof(MY_COLL_RULE) *
+ (rules->mrules= n + 128))))
+ return 0;
+ return -1;
+}
+
+
+/**
+ Append one new rule to a rule array
+
+ @param rules Rule container
+ @param rule New rule to add
+
+ @return 0 on success, -1 on error.
+*/
+
+static int
+my_coll_rules_add(MY_COLL_RULES *rules, MY_COLL_RULE *rule)
+{
+ if (my_coll_rules_realloc(rules, rules->nrules + 1))
+ return -1;
+ rules->rule[rules->nrules++]= rule[0];
+ return 0;
+}
+
+
+/**
+ Apply difference at level
+
+ @param r Rule
+ @param level Level (0,1,2,3,4)
+*/
+
+static void
+my_coll_rule_shift_at_level(MY_COLL_RULE *r, int level)
+{
+ switch (level)
+ {
+ case 4: /* Quaternary difference */
+ r->diff[3]++;
+ break;
+ case 3: /* Tertiary difference */
+ r->diff[2]++;
+ r->diff[3]= 0;
+ break;
+ case 2: /* Secondary difference */
+ r->diff[1]++;
+ r->diff[2]= r->diff[3]= 0;
+ break;
+ case 1: /* Primary difference */
+ r->diff[0]++;
+ r->diff[1]= r->diff[2]= r->diff[3]= 0;
+ break;
+ case 0:
+ /* Do nothing for '=': use the previous offsets for all levels */
+ break;
+ default:
+ DBUG_ASSERT(0);
+ }
+}
+
+
+typedef struct my_coll_rule_parser_st
+{
+ MY_COLL_LEXEM tok[2]; /* Current token and next token for look-ahead */
+ MY_COLL_RULE rule; /* Currently parsed rule */
+ MY_COLL_RULES *rules; /* Rule list pointer */
+ char errstr[128]; /* Error message */
+} MY_COLL_RULE_PARSER;
+
+
+/**
+ Current parser token
+
+ @param p Collation customization parser
+
+ @return Pointer to the current token
+*/
+
+static MY_COLL_LEXEM *
+my_coll_parser_curr(MY_COLL_RULE_PARSER *p)
+{
+ return &p->tok[0];
+}
+
+
+/**
+ Next parser token, to look ahead.
+
+ @param p Collation customization parser
+
+ @return Pointer to the next token
+*/
+
+static MY_COLL_LEXEM *
+my_coll_parser_next(MY_COLL_RULE_PARSER *p)
+{
+ return &p->tok[1];
+}
+
+
+/**
+ Scan one token from the input stream
+
+ @param p Collation customization parser
+
+ @return 1, for convenience, to use in logical expressions easier.
+*/
+static int
+my_coll_parser_scan(MY_COLL_RULE_PARSER *p)
+{
+ my_coll_parser_curr(p)[0]= my_coll_parser_next(p)[0];
+ my_coll_lexem_next(my_coll_parser_next(p));
+ return 1;
+}
+
+
+/**
+ Initialize collation customization parser
+
+ @param p Collation customization parser
+ @param rules Where to store rules
+ @param str Beginning of a collation customization sting
+ @param str_end End of the collation customizations string
+*/
+
+static void
+my_coll_parser_init(MY_COLL_RULE_PARSER *p,
+ MY_COLL_RULES *rules,
+ const char *str, const char *str_end)
+{
+ /*
+ Initialize parser to the input buffer and scan two tokens,
+ to make the current token and the next token known.
+ */
+ memset(p, 0, sizeof(*p));
+ p->rules= rules;
+ p->errstr[0]= '\0';
+ my_coll_lexem_init(my_coll_parser_curr(p), str, str_end);
+ my_coll_lexem_next(my_coll_parser_curr(p));
+ my_coll_parser_next(p)[0]= my_coll_parser_curr(p)[0];
+ my_coll_lexem_next(my_coll_parser_next(p));
+}
+
+
+/**
+ Display error when an unexpected token found
+
+ @param p Collation customization parser
+ @param term Which lexem was expected
+
+ @return 0, to use in "return" and boolean expressions.
+*/
+
+static int
+my_coll_parser_expected_error(MY_COLL_RULE_PARSER *p, my_coll_lexem_num term)
+{
+ my_snprintf(p->errstr, sizeof(p->errstr),
+ "%s expected", my_coll_lexem_num_to_str(term));
+ return 0;
+}
+
+
+/**
+ Display error when a too long character sequence is met
+
+ @param p Collation customization parser
+ @param name Which kind of sequence: contraction, expansion, etc.
+
+ @return 0, to use in "return" and boolean expressions.
+*/
+
+static int
+my_coll_parser_too_long_error(MY_COLL_RULE_PARSER *p, const char *name)
+{
+ my_snprintf(p->errstr, sizeof(p->errstr), "%s is too long", name);
+ return 0;
+}
+
+
+/**
+ Scan the given lexem from input stream, or display "expected" error.
+
+ @param p Collation customization parser
+ @param term Which lexem is expected.
+
+ @return
+ @retval 0 if the required term was not found.
+ @retval 1 if the required term was found.
+*/
+static int
+my_coll_parser_scan_term(MY_COLL_RULE_PARSER *p, my_coll_lexem_num term)
+{
+ if (my_coll_parser_curr(p)->term != term)
+ return my_coll_parser_expected_error(p, term);
+ return my_coll_parser_scan(p);
+}
+
+
+/*
+ In the following code we have a few functions to parse
+ various collation customization non-terminal symbols.
+ Unlike our usual coding convension, they return
+ - 0 on "error" (when the rule was not scanned) and
+ - 1 on "success"(when the rule was scanned).
+ This is done intentionally to make body of the functions look easier
+ and repeat the grammar of the rules in straightforward manner.
+ For example:
+
+ // <x> ::= <y> | <z>
+ int parse_x() { return parse_y() || parser_z(); }
+
+ // <x> ::= <y> <z>
+ int parse_x() { return parse_y() && parser_z(); }
+
+ Using 1 on "not found" and 0 on "found" in the parser code would
+ make the code more error prone and harder to read because
+ of having to use inverse boolean logic.
+*/
+
+
+/**
+ Scan a collation setting in brakets, for example UCA version.
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if setting was scanned.
+ @retval 1 if setting was not scanned.
+*/
+
+static int
+my_coll_parser_scan_setting(MY_COLL_RULE_PARSER *p)
+{
+ MY_COLL_RULES *rules= p->rules;
+ MY_COLL_LEXEM *lexem= my_coll_parser_curr(p);
+
+ if (!lex_cmp(lexem, C_STRING_WITH_LEN("[version 4.0.0]")))
+ {
+ rules->version= 400;
+ rules->uca= &my_uca_v400;
+ }
+#if RESOLVE_CONFLICTS_WITH_MARIA_AND_MYSQL_COLLATION_IDS
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[version 5.2.0]")))
+ {
+ rules->version= 520;
+ rules->uca= &my_uca_v520;
+ }
+#endif
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[shift-after-method expand]")))
+ {
+ rules->shift_after_method= my_shift_method_expand;
+ }
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[shift-after-method simple]")))
+ {
+ rules->shift_after_method= my_shift_method_simple;
+ }
+ else
+ {
+ return 0;
+ }
+ return my_coll_parser_scan(p);
+}
+
+
+/**
+ Scan multiple collation settings
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if no settings were scanned.
+ @retval 1 if one or more settings were scanned.
+*/
+
+static int
+my_coll_parser_scan_settings(MY_COLL_RULE_PARSER *p)
+{
+ /* Scan collation setting or special purpose command */
+ while (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_OPTION)
+ {
+ if (!my_coll_parser_scan_setting(p))
+ return 0;
+ }
+ return 1;
+}
+
+
+/**
+ Scan [before xxx] reset option
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if reset option was not scanned.
+ @retval 1 if reset option was scanned.
+*/
+
+static int
+my_coll_parser_scan_reset_before(MY_COLL_RULE_PARSER *p)
+{
+ MY_COLL_LEXEM *lexem= my_coll_parser_curr(p);
+ if (!lex_cmp(lexem, C_STRING_WITH_LEN("[before primary]")) ||
+ !lex_cmp(lexem, C_STRING_WITH_LEN("[before 1]")))
+ {
+ p->rule.before_level= 1;
+ }
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[before secondary]")) ||
+ !lex_cmp(lexem, C_STRING_WITH_LEN("[before 2]")))
+ {
+ p->rule.before_level= 2;
+ }
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[before tertiary]")) ||
+ !lex_cmp(lexem, C_STRING_WITH_LEN("[before 3]")))
+ {
+ p->rule.before_level= 3;
+ }
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[before quaternary]")) ||
+ !lex_cmp(lexem, C_STRING_WITH_LEN("[before 4]")))
+ {
+ p->rule.before_level= 4;
+ }
+ else
+ {
+ p->rule.before_level= 0;
+ return 0; /* Don't scan thr next character */
+ }
+ return my_coll_parser_scan(p);
+}
+
+
+/**
+ Scan logical position and add to the wide string.
+
+ @param p Collation customization parser
+ @param pwc Wide string to add code to
+ @param limit The result string cannot be longer than 'limit' characters
+
+ @return
+ @retval 0 if logical position was not scanned.
+ @retval 1 if logical position was scanned.
+*/
+
+static int
+my_coll_parser_scan_logical_position(MY_COLL_RULE_PARSER *p,
+ my_wc_t *pwc, size_t limit)
+{
+ MY_COLL_RULES *rules= p->rules;
+ MY_COLL_LEXEM *lexem= my_coll_parser_curr(p);
+
+ if (!lex_cmp(lexem, C_STRING_WITH_LEN("[first non-ignorable]")))
+ lexem->code= rules->uca->first_non_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[last non-ignorable]")))
+ lexem->code= rules->uca->last_non_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[first primary ignorable]")))
+ lexem->code= rules->uca->first_primary_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[last primary ignorable]")))
+ lexem->code= rules->uca->last_primary_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[first secondary ignorable]")))
+ lexem->code= rules->uca->first_secondary_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[last secondary ignorable]")))
+ lexem->code= rules->uca->last_secondary_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[first tertiary ignorable]")))
+ lexem->code= rules->uca->first_tertiary_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[last tertiary ignorable]")))
+ lexem->code= rules->uca->last_tertiary_ignorable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[first trailing]")))
+ lexem->code= rules->uca->first_trailing;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[last trailing]")))
+ lexem->code= rules->uca->last_trailing;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[first variable]")))
+ lexem->code= rules->uca->first_variable;
+ else if (!lex_cmp(lexem, C_STRING_WITH_LEN("[last variable]")))
+ lexem->code= rules->uca->last_variable;
+ else
+ return 0; /* Don't scan the next token */
+
+ if (!my_coll_rule_expand(pwc, limit, lexem->code))
+ {
+ /*
+ Logical position can not be in a contraction,
+ so the above call should never fail.
+ Let's assert in debug version and print
+ a nice error message in production version.
+ */
+ DBUG_ASSERT(0);
+ return my_coll_parser_too_long_error(p, "Logical position");
+ }
+ return my_coll_parser_scan(p);
+}
+
+
+/**
+ Scan character list
+
+ <character list> ::= CHAR [ CHAR... ]
+
+ @param p Collation customization parser
+ @param pwc Character string to add code to
+ @param limit The result string cannot be longer than 'limit' characters
+ @param name E.g. "contraction", "expansion"
+
+ @return
+ @retval 0 if character sequence was not scanned.
+ @retval 1 if character sequence was scanned.
+*/
+
+static int
+my_coll_parser_scan_character_list(MY_COLL_RULE_PARSER *p,
+ my_wc_t *pwc, size_t limit,
+ const char *name)
+{
+ if (my_coll_parser_curr(p)->term != MY_COLL_LEXEM_CHAR)
+ return my_coll_parser_expected_error(p, MY_COLL_LEXEM_CHAR);
+
+ if (!my_coll_rule_expand(pwc, limit, my_coll_parser_curr(p)->code))
+ return my_coll_parser_too_long_error(p, name);
+
+ if (!my_coll_parser_scan_term(p, MY_COLL_LEXEM_CHAR))
+ return 0;
+
+ while (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_CHAR)
+ {
+ if (!my_coll_rule_expand(pwc, limit, my_coll_parser_curr(p)->code))
+ return my_coll_parser_too_long_error(p, name);
+ my_coll_parser_scan(p);
+ }
+ return 1;
+}
+
+
+/**
+ Scan reset sequence
+
+ <reset sequence> ::=
+ [ <reset before option> ] <character list>
+ | [ <reset before option> ] <logical reset position>
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if reset sequence was not scanned.
+ @retval 1 if reset sequence was scanned.
+*/
+
+static int
+my_coll_parser_scan_reset_sequence(MY_COLL_RULE_PARSER *p)
+{
+ my_coll_rule_reset(&p->rule);
+
+ /* Scan "[before x]" option, if exists */
+ if (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_OPTION)
+ my_coll_parser_scan_reset_before(p);
+
+ /* Try logical reset position */
+ if (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_OPTION)
+ {
+ if (!my_coll_parser_scan_logical_position(p, p->rule.base, 1))
+ return 0;
+ }
+ else
+ {
+ /* Scan single reset character or expansion */
+ if (!my_coll_parser_scan_character_list(p, p->rule.base,
+ MY_UCA_MAX_EXPANSION, "Expansion"))
+ return 0;
+ }
+
+ if (p->rules->shift_after_method == my_shift_method_expand ||
+ p->rule.before_level == 1) /* Apply "before primary" option */
+ {
+ /*
+ Suppose we have this rule: &B[before primary] < C
+ i.e. we need to put C before B, but after A, so
+ the result order is: A < C < B.
+
+ Let primary weight of B be [BBBB].
+
+ We cannot just use [BBBB-1] as weight for C:
+ DUCET does not have enough unused weights between any two characters,
+ so using [BBBB-1] will likely make C equal to the previous character,
+ which is A, so we'll get this order instead of the desired: A = C < B.
+
+ To guarantee that that C is sorted after A, we'll use expansion
+ with a kind of "biggest possible character".
+ As "biggest possible character" we'll use "last_non_ignorable":
+
+ We'll compose weight for C as: [BBBB-1][MMMM+1]
+ where [MMMM] is weight for "last_non_ignorable".
+
+ We also do the same trick for "reset after" if the collation
+ option says so. E.g. for the rules "&B < C", weight for
+ C will be calculated as: [BBBB][MMMM+1]
+
+ At this point we only need to store codepoints
+ 'B' and 'last_non_ignorable'. Actual weights for 'C'
+ will be calculated according to the above formula later,
+ in create_tailoring().
+ */
+ if (!my_coll_rule_expand(p->rule.base, MY_UCA_MAX_EXPANSION,
+ p->rules->uca->last_non_ignorable))
+ return my_coll_parser_too_long_error(p, "Expansion");
+ }
+ return 1;
+}
+
+
+/**
+ Scan shift sequence
+
+ <shift sequence> ::=
+ <character list> [ / <character list> ]
+ | <character list> [ | <character list> ]
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if shift sequence was not scanned.
+ @retval 1 if shift sequence was scanned.
+*/
+
+static int
+my_coll_parser_scan_shift_sequence(MY_COLL_RULE_PARSER *p)
+{
+ MY_COLL_RULE before_extend;
+
+ memset(&p->rule.curr, 0, sizeof(p->rule.curr));
+
+ /* Scan single shift character or contraction */
+ if (!my_coll_parser_scan_character_list(p, p->rule.curr,
+ MY_UCA_MAX_CONTRACTION,
+ "Contraction"))
+ return 0;
+
+ before_extend= p->rule; /* Remember the part before "/" */
+
+ /* Append the part after "/" as expansion */
+ if (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_EXTEND)
+ {
+ my_coll_parser_scan(p);
+ if (!my_coll_parser_scan_character_list(p, p->rule.base,
+ MY_UCA_MAX_EXPANSION,
+ "Expansion"))
+ return 0;
+ }
+ else if (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_CONTEXT)
+ {
+ /*
+ We support 2-character long context sequences only:
+ one character is the previous context, plus the current character.
+ It's OK as Unicode's CLDR does not have longer examples.
+ */
+ my_coll_parser_scan(p);
+ p->rule.with_context= TRUE;
+ if (!my_coll_parser_scan_character_list(p, p->rule.curr + 1, 1, "context"))
+ return 0;
+ }
+
+ /* Add rule to the rule list */
+ if (my_coll_rules_add(p->rules, &p->rule))
+ return 0;
+
+ p->rule= before_extend; /* Restore to the state before "/" */
+
+ return 1;
+}
+
+
+/**
+ Scan shift operator
+
+ <shift> ::= < | << | <<< | <<<< | =
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if shift operator was not scanned.
+ @retval 1 if shift operator was scanned.
+*/
+static int
+my_coll_parser_scan_shift(MY_COLL_RULE_PARSER *p)
+{
+ if (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_SHIFT)
+ {
+ my_coll_rule_shift_at_level(&p->rule, my_coll_parser_curr(p)->diff);
+ return my_coll_parser_scan(p);
+ }
+ return 0;
}
-/*
- Collation rule item
+/**
+ Scan one rule: reset followed by a number of shifts
+
+ <rule> ::=
+ & <reset sequence>
+ <shift> <shift sequence>
+ [ { <shift> <shift sequence> }... ]
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if rule was not scanned.
+ @retval 1 if rule was scanned.
*/
+static int
+my_coll_parser_scan_rule(MY_COLL_RULE_PARSER *p)
+{
+ if (!my_coll_parser_scan_term(p, MY_COLL_LEXEM_RESET) ||
+ !my_coll_parser_scan_reset_sequence(p))
+ return 0;
+
+ /* Scan the first required shift command */
+ if (!my_coll_parser_scan_shift(p))
+ return my_coll_parser_expected_error(p, MY_COLL_LEXEM_SHIFT);
+
+ /* Scan the first shift sequence */
+ if (!my_coll_parser_scan_shift_sequence(p))
+ return 0;
-typedef struct my_coll_rule_item_st
+ /* Scan subsequent shift rules */
+ while (my_coll_parser_scan_shift(p))
+ {
+ if (!my_coll_parser_scan_shift_sequence(p))
+ return 0;
+ }
+ return 1;
+}
+
+
+/**
+ Scan collation customization: settings followed by rules
+
+ <collation customization> ::=
+ [ <setting> ... ]
+ [ <rule>... ]
+
+ @param p Collation customization parser
+
+ @return
+ @retval 0 if collation customozation expression was not scanned.
+ @retval 1 if collation customization expression was scanned.
+*/
+
+static int
+my_coll_parser_exec(MY_COLL_RULE_PARSER *p)
{
- my_wc_t base; /* Base character */
- my_wc_t curr[2]; /* Current character */
- int diff[3]; /* Primary, Secondary and Tertiary difference */
-} MY_COLL_RULE;
+ if (!my_coll_parser_scan_settings(p))
+ return 0;
+
+ while (my_coll_parser_curr(p)->term == MY_COLL_LEXEM_RESET)
+ {
+ if (!my_coll_parser_scan_rule(p))
+ return 0;
+ }
+ /* Make sure no unparsed input data left */
+ return my_coll_parser_scan_term(p, MY_COLL_LEXEM_EOF);
+}
/*
Collation language syntax parser.
Uses lexical parser.
-
- SYNOPSIS
- my_coll_rule_parse
- rule Collation rule list to load to.
- str A string containin collation language expression.
- str_end End of the string.
- USAGE
-
- RETURN VALUES
- A positive number means the number of rules loaded.
- -1 means ERROR, e.g. too many items, syntax error, etc.
+
+ @param rules Collation rule list to load to.
+ @param str A string with collation customization.
+ @param str_end End of the string.
+
+ @return
+ @retval 0 on success
+ @retval 1 on error
*/
-static int my_coll_rule_parse(MY_COLL_RULE *rule, size_t mitems,
- const char *str, const char *str_end,
- char *errstr, size_t errsize)
+static int
+my_coll_rule_parse(MY_COLL_RULES *rules,
+ const char *str, const char *str_end)
{
- MY_COLL_LEXEM lexem;
- my_coll_lexem_num lexnum;
- my_coll_lexem_num prevlexnum= MY_COLL_LEXEM_ERROR;
- MY_COLL_RULE item;
- int state= 0;
- size_t nitems= 0;
+ MY_COLL_RULE_PARSER p;
+
+ my_coll_parser_init(&p, rules, str, str_end);
+
+ if (!my_coll_parser_exec(&p))
+ {
+ my_coll_lexem_print_error(my_coll_parser_curr(&p),
+ rules->loader->error,
+ sizeof(rules->loader->error) - 1,
+ p.errstr);
+ return 1;
+ }
+ return 0;
+}
+
+
+/**
+ Helper function:
+ Copies UCA weights for a given "uint" string
+ to the given location.
- /* Init all variables */
- errstr[0]= '\0';
- bzero(&item, sizeof(item));
- my_coll_lexem_init(&lexem, str, str_end);
+ @src_uca source UCA weight data
+ @dst_uca destination UCA weight data
+ @to destination address
+ @to_length size of destination
+ @str qide string
+ @len string length
- while ((lexnum= my_coll_lexem_next(&lexem)))
+ @return number of weights put
+*/
+
+static size_t
+my_char_weight_put(MY_UCA_WEIGHT_LEVEL *dst,
+ uint16 *to, size_t to_length,
+ my_wc_t *str, size_t len)
+{
+ size_t count;
+ if (!to_length)
+ return 0;
+ to_length--; /* Without trailing zero */
+
+ for (count= 0; len; )
{
- if (lexnum == MY_COLL_LEXEM_ERROR)
+ size_t chlen;
+ const uint16 *from= NULL;
+
+ for (chlen= len; chlen > 1; chlen--)
{
- my_coll_lexem_print_error(&lexem,errstr,errsize-1,"Unknown character");
- return -1;
- }
-
- switch (state) {
- case 0:
- if (lexnum != MY_COLL_LEXEM_SHIFT)
- {
- my_coll_lexem_print_error(&lexem,errstr,errsize-1,"& expected");
- return -1;
- }
- prevlexnum= lexnum;
- state= 2;
- continue;
-
- case 1:
- if (lexnum != MY_COLL_LEXEM_SHIFT && lexnum != MY_COLL_LEXEM_DIFF)
+ if ((from= my_uca_contraction_weight(&dst->contractions, str, chlen)))
{
- my_coll_lexem_print_error(&lexem,errstr,errsize-1,"& or < expected");
- return -1;
+ str+= chlen;
+ len-= chlen;
+ break;
}
- prevlexnum= lexnum;
- state= 2;
- continue;
-
- case 2:
- if (lexnum != MY_COLL_LEXEM_CHAR)
+ }
+
+ if (!from)
+ {
+ from= my_char_weight_addr(dst, *str);
+ str++;
+ len--;
+ }
+
+ for ( ; from && *from && count < to_length; )
+ {
+ *to++= *from++;
+ count++;
+ }
+ }
+
+ *to= 0;
+ return count;
+}
+
+
+/**
+ Alloc new page and copy the default UCA weights
+ @param loader - Character set loader
+ @param src_uca - Default UCA data to copy from
+ @param dst_uca - UCA data to copy weights to
+ @param page - page number
+
+ @return
+ @retval FALSE on success
+ @retval TRUE on error
+*/
+static my_bool
+my_uca_copy_page(MY_CHARSET_LOADER *loader,
+ const MY_UCA_WEIGHT_LEVEL *src,
+ MY_UCA_WEIGHT_LEVEL *dst,
+ size_t page)
+{
+ uint chc, size= 256 * dst->lengths[page] * sizeof(uint16);
+ if (!(dst->weights[page]= (uint16 *) (loader->once_alloc)(size)))
+ return TRUE;
+
+ DBUG_ASSERT(src->lengths[page] <= dst->lengths[page]);
+ memset(dst->weights[page], 0, size);
+ for (chc=0 ; chc < 256; chc++)
+ {
+ memcpy(dst->weights[page] + chc * dst->lengths[page],
+ src->weights[page] + chc * src->lengths[page],
+ src->lengths[page] * sizeof(uint16));
+ }
+ return FALSE;
+}
+
+
+static my_bool
+apply_shift(MY_CHARSET_LOADER *loader,
+ MY_COLL_RULES *rules, MY_COLL_RULE *r, int level,
+ uint16 *to, size_t nweights)
+{
+ /* Apply level difference. */
+ if (nweights)
+ {
+ to[nweights - 1]+= r->diff[level];
+ if (r->before_level == 1) /* Apply "&[before primary]" */
+ {
+ if (nweights >= 2)
{
- my_coll_lexem_print_error(&lexem,errstr,errsize-1,"character expected");
- return -1;
+ to[nweights - 2]--; /* Reset before */
+ if (rules->shift_after_method == my_shift_method_expand)
+ {
+ /*
+ Special case. Don't let characters shifted after X
+ and before next(X) intermix to each other.
+
+ For example:
+ "[shift-after-method expand] &0 < a &[before primary]1 < A".
+ I.e. we reorder 'a' after '0', and then 'A' before '1'.
+ 'a' must be sorted before 'A'.
+
+ Note, there are no real collations in CLDR which shift
+ after and before two neighbourgh characters. We need this
+ just in case. Reserving 4096 (0x1000) weights for such
+ cases is perfectly enough.
+ */
+ to[nweights - 1]+= 0x1000; /* W3-TODO: const may vary on levels 2,3*/
+ }
}
-
- if (prevlexnum == MY_COLL_LEXEM_SHIFT)
+ else
{
- item.base= lexem.code;
- item.diff[0]= 0;
- item.diff[1]= 0;
- item.diff[2]= 0;
+ my_snprintf(loader->error, sizeof(loader->error),
+ "Can't reset before "
+ "a primary ignorable character U+%04lX", r->base[0]);
+ return TRUE;
}
- else if (prevlexnum == MY_COLL_LEXEM_DIFF)
+ }
+ }
+ else
+ {
+ /* Shift to an ignorable character, e.g.: & \u0000 < \u0001 */
+ DBUG_ASSERT(to[0] == 0);
+ to[0]= r->diff[level];
+ }
+ return FALSE;
+}
+
+
+static my_bool
+apply_one_rule(MY_CHARSET_LOADER *loader,
+ MY_COLL_RULES *rules, MY_COLL_RULE *r, int level,
+ MY_UCA_WEIGHT_LEVEL *dst)
+{
+ size_t nweights;
+ size_t nreset= my_coll_rule_reset_length(r); /* Length of reset sequence */
+ size_t nshift= my_coll_rule_shift_length(r); /* Length of shift sequence */
+ uint16 *to;
+
+ if (nshift >= 2) /* Contraction */
+ {
+ size_t i;
+ int flag;
+ MY_CONTRACTIONS *contractions= &dst->contractions;
+ /* Add HEAD, MID and TAIL flags for the contraction parts */
+ my_uca_add_contraction_flag(contractions, r->curr[0],
+ r->with_context ?
+ MY_UCA_PREVIOUS_CONTEXT_HEAD :
+ MY_UCA_CNT_HEAD);
+ for (i= 1, flag= MY_UCA_CNT_MID1; i < nshift - 1; i++, flag<<= 1)
+ my_uca_add_contraction_flag(contractions, r->curr[i], flag);
+ my_uca_add_contraction_flag(contractions, r->curr[i],
+ r->with_context ?
+ MY_UCA_PREVIOUS_CONTEXT_TAIL :
+ MY_UCA_CNT_TAIL);
+ /* Add new contraction to the contraction list */
+ to= my_uca_add_contraction(contractions, r->curr, nshift,
+ r->with_context)->weight;
+ /* Store weights of the "reset to" character */
+ dst->contractions.nitems--; /* Temporarily hide - it's incomplete */
+ nweights= my_char_weight_put(dst, to, MY_UCA_MAX_WEIGHT_SIZE,
+ r->base, nreset);
+ dst->contractions.nitems++; /* Activate, now it's complete */
+ }
+ else
+ {
+ my_wc_t pagec= (r->curr[0] >> 8);
+ DBUG_ASSERT(dst->weights[pagec]);
+ to= my_char_weight_addr(dst, r->curr[0]);
+ /* Store weights of the "reset to" character */
+ nweights= my_char_weight_put(dst, to, dst->lengths[pagec], r->base, nreset);
+ }
+
+ /* Apply level difference. */
+ return apply_shift(loader, rules, r, level, to, nweights);
+}
+
+
+/**
+ Check if collation rules are valid,
+ i.e. characters are not outside of the collation suported range.
+*/
+static int
+check_rules(MY_CHARSET_LOADER *loader,
+ const MY_COLL_RULES *rules,
+ const MY_UCA_WEIGHT_LEVEL *dst, const MY_UCA_WEIGHT_LEVEL *src)
+{
+ const MY_COLL_RULE *r, *rlast;
+ for (r= rules->rule, rlast= rules->rule + rules->nrules; r < rlast; r++)
+ {
+ if (r->curr[0] > dst->maxchar)
+ {
+ my_snprintf(loader->error, sizeof(loader->error),
+ "Shift character out of range: u%04X", (uint) r->curr[0]);
+ return TRUE;
+ }
+ else if (r->base[0] > src->maxchar)
+ {
+ my_snprintf(loader->error, sizeof(loader->error),
+ "Reset character out of range: u%04X", (uint) r->base[0]);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+static my_bool
+init_weight_level(MY_CHARSET_LOADER *loader, MY_COLL_RULES *rules, int level,
+ MY_UCA_WEIGHT_LEVEL *dst, const MY_UCA_WEIGHT_LEVEL *src)
+{
+ MY_COLL_RULE *r, *rlast;
+ int ncontractions= 0;
+ size_t i, npages= (src->maxchar + 1) / 256;
+
+ dst->maxchar= src->maxchar;
+
+ if (check_rules(loader, rules, dst, src))
+ return TRUE;
+
+ /* Allocate memory for pages and their lengths */
+ if (!(dst->lengths= (uchar *) (loader->once_alloc)(npages)) ||
+ !(dst->weights= (uint16 **) (loader->once_alloc)(npages *
+ sizeof(uint16 *))))
+ return TRUE;
+
+ /* Copy pages lengths and page pointers from the default UCA weights */
+ memcpy(dst->lengths, src->lengths, npages);
+ memcpy(dst->weights, src->weights, npages * sizeof(uint16 *));
+
+ /*
+ Calculate maximum lenghts for the pages which will be overwritten.
+ Mark pages that will be otherwriten as NULL.
+ We'll allocate their own memory.
+ */
+ for (r= rules->rule, rlast= rules->rule + rules->nrules; r < rlast; r++)
+ {
+ if (!r->curr[1]) /* If not a contraction */
+ {
+ uint pagec= (r->curr[0] >> 8);
+ if (r->base[1]) /* Expansion */
{
- MY_COLL_LEXEM savlex;
- savlex= lexem;
- item.curr[0]= lexem.code;
- if ((lexnum= my_coll_lexem_next(&lexem)) == MY_COLL_LEXEM_CHAR)
- {
- item.curr[1]= lexem.code;
- }
- else
- {
- item.curr[1]= 0;
- lexem=savlex; /* Restore previous parser state */
- }
- if (lexem.diff == 3)
- {
- item.diff[2]++;
- }
- else if (lexem.diff == 2)
- {
- item.diff[1]++;
- item.diff[2]= 0;
- }
- else if (lexem.diff == 1)
- {
- item.diff[0]++;
- item.diff[1]= 0;
- item.diff[2]= 0;
- }
- else if (lexem.diff == 0)
- {
- item.diff[0]= item.diff[1]= item.diff[2]= 0;
- }
- if (nitems >= mitems)
- {
- my_coll_lexem_print_error(&lexem,errstr,errsize-1,"Too many rules");
- return -1;
- }
- rule[nitems++]= item;
+ /* Reserve space for maximum possible length */
+ dst->lengths[pagec]= MY_UCA_MAX_WEIGHT_SIZE;
}
else
{
- my_coll_lexem_print_error(&lexem,errstr,errsize-1,"Should never happen");
- return -1;
+ uint pageb= (r->base[0] >> 8);
+ if (dst->lengths[pagec] < src->lengths[pageb])
+ dst->lengths[pagec]= src->lengths[pageb];
}
- state= 1;
- continue;
+ dst->weights[pagec]= NULL; /* Mark that we'll overwrite this page */
}
+ else
+ ncontractions++;
}
- return (int) nitems;
+
+ /* Allocate pages that we'll overwrite and copy default weights */
+ for (i= 0; i < npages; i++)
+ {
+ my_bool rc;
+ /*
+ Don't touch pages with lengths[i]==0, they have implicit weights
+ calculated algorithmically.
+ */
+ if (!dst->weights[i] && dst->lengths[i] &&
+ (rc= my_uca_copy_page(loader, src, dst, i)))
+ return rc;
+ }
+
+ if (ncontractions)
+ {
+ if (my_uca_alloc_contractions(&dst->contractions, loader, ncontractions))
+ return TRUE;
+ }
+
+ /*
+ Preparatory step is done at this point.
+ Now we have memory allocated for the pages that we'll overwrite,
+ and for contractions, including previous context contractions.
+ Also, for the pages that we'll overwrite, we have copied default weights.
+ Now iterate through the rules, overwrite weights for the characters
+ that appear in the rules, and put all contractions into contraction list.
+ */
+ for (r= rules->rule; r < rlast; r++)
+ {
+ if (apply_one_rule(loader, rules, r, level, dst))
+ return TRUE;
+ }
+ return FALSE;
}
-#define MY_MAX_COLL_RULE 128
/*
This function copies an UCS2 collation from
@@ -8013,145 +9356,65 @@ static int my_coll_rule_parse(MY_COLL_RU
default weights.
*/
-static my_bool create_tailoring(struct charset_info_st *cs,
- void *(*alloc)(size_t))
+static my_bool
+create_tailoring(struct charset_info_st *cs, MY_CHARSET_LOADER *loader)
{
- MY_COLL_RULE rule[MY_MAX_COLL_RULE];
- MY_COLL_RULE *r, *rfirst, *rlast;
- char errstr[128];
- uchar *newlengths;
- uint16 **newweights;
- const uchar *deflengths= uca_length;
- const uint16 *const *defweights= uca_weight;
- int rc, i;
- int ncontractions= 0;
-
+ MY_COLL_RULES rules;
+ MY_UCA_INFO new_uca, *src_uca= NULL;
+ int rc= 0;
+
+ *loader->error= '\0';
+
if (!cs->tailoring)
- return 1;
-
+ return 0; /* Ok to add a collation without tailoring */
+
+ memset(&rules, 0, sizeof(rules));
+ rules.loader= loader;
+ rules.uca= cs->uca ? cs->uca : &my_uca_v400; /* For logical positions, etc */
+ memset(&new_uca, 0, sizeof(new_uca));
+
/* Parse ICU Collation Customization expression */
- if ((rc= my_coll_rule_parse(rule, MY_MAX_COLL_RULE,
+ if ((rc= my_coll_rule_parse(&rules,
cs->tailoring,
- cs->tailoring + strlen(cs->tailoring),
- errstr, sizeof(errstr))) < 0)
- {
- /*
- TODO: add error message reporting.
- printf("Error: %d '%s'\n", rc, errstr);
- */
- return 1;
- }
-
- rfirst= rule;
- rlast= rule + rc;
-
- if (!cs->caseinfo)
- cs->caseinfo= my_unicase_default;
-
- if (!(newweights= (uint16**) (*alloc)(256*sizeof(uint16*))))
- return 1;
- bzero(newweights, 256*sizeof(uint16*));
-
- if (!(newlengths= (uchar*) (*alloc)(256)))
- return 1;
-
- memcpy(newlengths, deflengths, 256);
-
- /*
- Calculate maximum lenghts for the pages
- which will be overwritten.
- */
- for (i=0; i < rc; i++)
- {
- /* check if the shift or the reset characters are out of range */
- if (rule[i].curr[0] > MAX_UCA_CHAR_WITH_EXPLICIT_WEIGHT ||
- rule[i].base > MAX_UCA_CHAR_WITH_EXPLICIT_WEIGHT)
- return 1;
+ cs->tailoring + strlen(cs->tailoring))))
+ goto ex;
- if (!rule[i].curr[1]) /* If not a contraction */
- {
- uint pageb= (rule[i].base >> 8) & 0xFF;
- uint pagec= (rule[i].curr[0] >> 8) & 0xFF;
-
- if (newlengths[pagec] < deflengths[pageb])
- newlengths[pagec]= deflengths[pageb];
- }
- else
- ncontractions++;
+#if RESOLVE_CONFLICT_WITH_MYSQL_AND_MARIA_COLLATION_IDS
+ if (rules.version == 520) /* Unicode-5.2.0 requested */
+ {
+ src_uca= &my_uca_v520;
+ cs->caseinfo= &my_unicase_unicode520;
}
-
- for (i=0; i < rc; i++)
+ else
+#endif
+ if (rules.version == 400) /* Unicode-4.0.0 requested */
{
- uint pageb= (rule[i].base >> 8) & 0xFF;
- uint pagec= (rule[i].curr[0] >> 8) & 0xFF;
- uint chb, chc;
-
- if (rule[i].curr[1]) /* Skip contraction */
- continue;
-
- if (!newweights[pagec])
- {
- /* Alloc new page and copy the default UCA weights */
- uint size= 256*newlengths[pagec]*sizeof(uint16);
-
- if (!(newweights[pagec]= (uint16*) (*alloc)(size)))
- return 1;
- bzero((void*) newweights[pagec], size);
-
- for (chc=0 ; chc < 256; chc++)
- {
- memcpy(newweights[pagec] + chc*newlengths[pagec],
- defweights[pagec] + chc*deflengths[pagec],
- deflengths[pagec]*sizeof(uint16));
- }
- }
-
- /*
- Aply the alternative rule:
- shift to the base character and primary difference.
- */
- chc= rule[i].curr[0] & 0xFF;
- chb= rule[i].base & 0xFF;
- memcpy(newweights[pagec] + chc*newlengths[pagec],
- defweights[pageb] + chb*deflengths[pageb],
- deflengths[pageb]*sizeof(uint16));
- /* Apply primary difference */
- newweights[pagec][chc*newlengths[pagec]]+= rule[i].diff[0];
+ src_uca= &my_uca_v400;
+ cs->caseinfo= &my_unicase_default;
}
-
- /* Copy non-overwritten pages from the default UCA weights */
- for (i= 0; i < 256 ; i++)
+ else /* No Unicode version specified */
{
- if (!newweights[i])
- ((const uint16**) newweights)[i]= defweights[i];
+ src_uca= cs->uca ? cs->uca : &my_uca_v400;
+ if (!cs->caseinfo)
+ cs->caseinfo= &my_unicase_default;
}
-
- cs->sort_order= newlengths;
- cs->sort_order_big= (const uint16**) newweights;
- cs->contractions= NULL;
-
- /* Now process contractions */
- if (ncontractions)
+
+ if ((rc= init_weight_level(loader, &rules, 0,
+ &new_uca.level[0], &src_uca->level[0])))
+ goto ex;
+
+ if (!(cs->uca= (MY_UCA_INFO *) (loader->once_alloc)(sizeof(MY_UCA_INFO))))
{
- if (my_uca_alloc_contractions(cs, alloc, ncontractions))
- return 1;
- for (r= rfirst; r < rlast; r++)
- {
- uint16 *to;
- if (r->curr[1]) /* Contraction */
- {
- /* Mark both letters as "is contraction part" */
- my_uca_add_contraction_flag(cs, r->curr[0], MY_UCA_CNT_HEAD);
- my_uca_add_contraction_flag(cs, r->curr[1], MY_UCA_CNT_TAIL);
- to= my_uca_add_contraction(cs, r->curr, 2)->weight;
- /* Copy weight from the reset character */
- to[0]= my_char_weight_addr(cs, r->base)[0];
- /* Apply primary difference */
- to[0]+= r->diff[0];
- }
- }
+ rc= 1;
+ goto ex;
}
- return 0;
+ cs->uca[0]= new_uca;
+
+ex:
+ (loader->free)(rules.rule);
+ if (rc != 0 && loader->error[0])
+ loader->reporter(ERROR_LEVEL, "%s", loader->error);
+ return rc;
}
@@ -8161,12 +9424,14 @@ static my_bool create_tailoring(struct c
Should work for any character set.
*/
-static my_bool my_coll_init_uca(struct charset_info_st *cs,
- void *(*alloc)(size_t))
+static my_bool
+my_coll_init_uca(struct charset_info_st *cs, MY_CHARSET_LOADER *loader)
{
cs->pad_char= ' ';
cs->ctype= my_charset_utf8_unicode_ci.ctype;
- return create_tailoring(cs, alloc);
+ if (!cs->caseinfo)
+ cs->caseinfo= &my_unicase_default;
+ return create_tailoring(cs, loader);
}
static int my_strnncoll_any_uca(CHARSET_INFO *cs,
@@ -8213,7 +9478,7 @@ static int my_strnncoll_ucs2_uca(CHARSET
const uchar *t, size_t tlen,
my_bool t_is_prefix)
{
- return my_strnncoll_uca(cs, &my_ucs2_uca_scanner_handler,
+ return my_strnncoll_uca(cs, &my_any_uca_scanner_handler,
s, slen, t, tlen, t_is_prefix);
}
@@ -8222,7 +9487,7 @@ static int my_strnncollsp_ucs2_uca(CHARS
const uchar *t, size_t tlen,
my_bool diff_if_only_endspace_difference)
{
- return my_strnncollsp_uca(cs, &my_ucs2_uca_scanner_handler,
+ return my_strnncollsp_uca(cs, &my_any_uca_scanner_handler,
s, slen, t, tlen,
diff_if_only_endspace_difference);
}
@@ -8231,14 +9496,14 @@ static void my_hash_sort_ucs2_uca(CHARSE
const uchar *s, size_t slen,
ulong *n1, ulong *n2)
{
- my_hash_sort_uca(cs, &my_ucs2_uca_scanner_handler, s, slen, n1, n2);
+ my_hash_sort_uca(cs, &my_any_uca_scanner_handler, s, slen, n1, n2);
}
static size_t my_strnxfrm_ucs2_uca(CHARSET_INFO *cs,
uchar *dst, size_t dstlen,
const uchar *src, size_t srclen)
{
- return my_strnxfrm_uca(cs, &my_ucs2_uca_scanner_handler,
+ return my_strnxfrm_uca(cs, &my_any_uca_scanner_handler,
dst, dstlen, src, srclen);
}
@@ -8268,12 +9533,11 @@ struct charset_info_st my_charset_ucs2_u
NULL, /* ctype */
NULL, /* to_lower */
NULL, /* to_upper */
- uca_length, /* sort_order */
- NULL, /* contractions */
- uca_weight, /* sort_order_big*/
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8301,11 +9565,10 @@ struct charset_info_st my_charset_ucs2_i
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8333,11 +9596,10 @@ struct charset_info_st my_charset_ucs2_l
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8365,11 +9627,10 @@ struct charset_info_st my_charset_ucs2_r
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8397,11 +9658,10 @@ struct charset_info_st my_charset_ucs2_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8429,11 +9689,10 @@ struct charset_info_st my_charset_ucs2_p
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8461,11 +9720,10 @@ struct charset_info_st my_charset_ucs2_e
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8493,11 +9751,10 @@ struct charset_info_st my_charset_ucs2_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8525,11 +9782,10 @@ struct charset_info_st my_charset_ucs2_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8557,11 +9813,10 @@ struct charset_info_st my_charset_ucs2_t
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_turkish, /* caseinfo */
+ &my_unicase_turkish,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8589,11 +9844,10 @@ struct charset_info_st my_charset_ucs2_c
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8622,11 +9876,10 @@ struct charset_info_st my_charset_ucs2_d
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8654,11 +9907,10 @@ struct charset_info_st my_charset_ucs2_l
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8686,11 +9938,10 @@ struct charset_info_st my_charset_ucs2_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8718,11 +9969,10 @@ struct charset_info_st my_charset_ucs2_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8751,11 +10001,10 @@ struct charset_info_st my_charset_ucs2_r
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8784,11 +10033,10 @@ struct charset_info_st my_charset_ucs2_p
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8817,11 +10065,10 @@ struct charset_info_st my_charset_ucs2_e
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8850,11 +10097,10 @@ struct charset_info_st my_charset_ucs2_h
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8870,23 +10116,55 @@ struct charset_info_st my_charset_ucs2_h
&my_collation_ucs2_uca_handler
};
-struct charset_info_st my_charset_ucs2_sinhala_uca_ci=
+struct charset_info_st my_charset_ucs2_sinhala_uca_ci=
+{
+ 147,0,0, /* number */
+ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII,
+ "ucs2", /* csname */
+ "ucs2_sinhala_ci", /* name */
+ "", /* comment */
+ sinhala, /* tailoring */
+ NULL, /* ctype */
+ NULL, /* to_lower */
+ NULL, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* uca */
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ &my_unicase_default, /* caseinfo */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 8, /* strxfrm_multiply */
+ 1, /* caseup_multiply */
+ 1, /* casedn_multiply */
+ 2, /* mbminlen */
+ 2, /* mbmaxlen */
+ 9, /* min_sort_char */
+ 0xFFFF, /* max_sort_char */
+ ' ', /* pad char */
+ 0, /* escape_with_backslash_is_dangerous */
+ &my_charset_ucs2_handler,
+ &my_collation_ucs2_uca_handler
+};
+
+
+
+struct charset_info_st my_charset_ucs2_german2_uca_ci=
{
- 147,0,0, /* number */
+ 148,0,0, /* number */
MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII,
"ucs2", /* csname */
- "ucs2_sinhala_ci", /* name */
+ "ucs2_german2_ci", /* name */
"", /* comment */
- sinhala, /* tailoring */
+ german2, /* tailoring */
NULL, /* ctype */
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8914,11 +10192,10 @@ struct charset_info_st my_charset_ucs2_c
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -8934,6 +10211,7 @@ struct charset_info_st my_charset_ucs2_c
&my_collation_ucs2_uca_handler
};
+
#endif
@@ -8981,10 +10259,12 @@ static uchar ctype_utf8[] = {
extern MY_CHARSET_HANDLER my_charset_utf8_handler;
+#define MY_CS_UTF8MB3_UCA_FLAGS (MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE)
+
struct charset_info_st my_charset_utf8_unicode_ci=
{
192,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_unicode_ci", /* name */
"", /* comment */
@@ -8992,12 +10272,11 @@ struct charset_info_st my_charset_utf8_u
ctype_utf8, /* ctype */
NULL, /* to_lower */
NULL, /* to_upper */
- uca_length, /* sort_order */
- NULL, /* contractions */
- uca_weight, /* sort_order_big*/
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9017,7 +10296,7 @@ struct charset_info_st my_charset_utf8_u
struct charset_info_st my_charset_utf8_icelandic_uca_ci=
{
193,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_icelandic_ci",/* name */
"", /* comment */
@@ -9026,11 +10305,10 @@ struct charset_info_st my_charset_utf8_i
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9049,7 +10327,7 @@ struct charset_info_st my_charset_utf8_i
struct charset_info_st my_charset_utf8_latvian_uca_ci=
{
194,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_latvian_ci", /* name */
"", /* comment */
@@ -9058,11 +10336,10 @@ struct charset_info_st my_charset_utf8_l
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9081,7 +10358,7 @@ struct charset_info_st my_charset_utf8_l
struct charset_info_st my_charset_utf8_romanian_uca_ci=
{
195,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_romanian_ci", /* name */
"", /* comment */
@@ -9090,11 +10367,10 @@ struct charset_info_st my_charset_utf8_r
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9113,7 +10389,7 @@ struct charset_info_st my_charset_utf8_r
struct charset_info_st my_charset_utf8_slovenian_uca_ci=
{
196,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_slovenian_ci",/* name */
"", /* comment */
@@ -9122,11 +10398,10 @@ struct charset_info_st my_charset_utf8_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9145,7 +10420,7 @@ struct charset_info_st my_charset_utf8_s
struct charset_info_st my_charset_utf8_polish_uca_ci=
{
197,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_polish_ci", /* name */
"", /* comment */
@@ -9154,11 +10429,10 @@ struct charset_info_st my_charset_utf8_p
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9177,7 +10451,7 @@ struct charset_info_st my_charset_utf8_p
struct charset_info_st my_charset_utf8_estonian_uca_ci=
{
198,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_estonian_ci", /* name */
"", /* comment */
@@ -9186,11 +10460,10 @@ struct charset_info_st my_charset_utf8_e
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9209,7 +10482,7 @@ struct charset_info_st my_charset_utf8_e
struct charset_info_st my_charset_utf8_spanish_uca_ci=
{
199,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_spanish_ci", /* name */
"", /* comment */
@@ -9218,11 +10491,10 @@ struct charset_info_st my_charset_utf8_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9241,7 +10513,7 @@ struct charset_info_st my_charset_utf8_s
struct charset_info_st my_charset_utf8_swedish_uca_ci=
{
200,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_swedish_ci", /* name */
"", /* comment */
@@ -9250,11 +10522,10 @@ struct charset_info_st my_charset_utf8_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9273,7 +10544,7 @@ struct charset_info_st my_charset_utf8_s
struct charset_info_st my_charset_utf8_turkish_uca_ci=
{
201,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_turkish_ci", /* name */
"", /* comment */
@@ -9282,11 +10553,10 @@ struct charset_info_st my_charset_utf8_t
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_turkish, /* caseinfo */
+ &my_unicase_turkish,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9305,7 +10575,7 @@ struct charset_info_st my_charset_utf8_t
struct charset_info_st my_charset_utf8_czech_uca_ci=
{
202,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_czech_ci", /* name */
"", /* comment */
@@ -9314,11 +10584,10 @@ struct charset_info_st my_charset_utf8_c
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9338,7 +10607,7 @@ struct charset_info_st my_charset_utf8_c
struct charset_info_st my_charset_utf8_danish_uca_ci=
{
203,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_danish_ci", /* name */
"", /* comment */
@@ -9347,11 +10616,10 @@ struct charset_info_st my_charset_utf8_d
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9370,7 +10638,7 @@ struct charset_info_st my_charset_utf8_d
struct charset_info_st my_charset_utf8_lithuanian_uca_ci=
{
204,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_lithuanian_ci",/* name */
"", /* comment */
@@ -9379,11 +10647,10 @@ struct charset_info_st my_charset_utf8_l
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9402,7 +10669,7 @@ struct charset_info_st my_charset_utf8_l
struct charset_info_st my_charset_utf8_slovak_uca_ci=
{
205,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_slovak_ci", /* name */
"", /* comment */
@@ -9411,11 +10678,10 @@ struct charset_info_st my_charset_utf8_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9434,7 +10700,7 @@ struct charset_info_st my_charset_utf8_s
struct charset_info_st my_charset_utf8_spanish2_uca_ci=
{
206,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_spanish2_ci", /* name */
"", /* comment */
@@ -9443,11 +10709,10 @@ struct charset_info_st my_charset_utf8_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9466,7 +10731,7 @@ struct charset_info_st my_charset_utf8_s
struct charset_info_st my_charset_utf8_roman_uca_ci=
{
207,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_roman_ci", /* name */
"", /* comment */
@@ -9475,11 +10740,10 @@ struct charset_info_st my_charset_utf8_r
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9498,7 +10762,7 @@ struct charset_info_st my_charset_utf8_r
struct charset_info_st my_charset_utf8_persian_uca_ci=
{
208,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_persian_ci", /* name */
"", /* comment */
@@ -9507,11 +10771,10 @@ struct charset_info_st my_charset_utf8_p
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9530,7 +10793,7 @@ struct charset_info_st my_charset_utf8_p
struct charset_info_st my_charset_utf8_esperanto_uca_ci=
{
209,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_esperanto_ci",/* name */
"", /* comment */
@@ -9539,11 +10802,10 @@ struct charset_info_st my_charset_utf8_e
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9562,7 +10824,7 @@ struct charset_info_st my_charset_utf8_e
struct charset_info_st my_charset_utf8_hungarian_uca_ci=
{
210,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_hungarian_ci",/* name */
"", /* comment */
@@ -9571,11 +10833,10 @@ struct charset_info_st my_charset_utf8_h
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9594,7 +10855,7 @@ struct charset_info_st my_charset_utf8_h
struct charset_info_st my_charset_utf8_sinhala_uca_ci=
{
211,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
"utf8", /* cs name */
"utf8_sinhala_ci", /* name */
"", /* comment */
@@ -9603,11 +10864,42 @@ struct charset_info_st my_charset_utf8_s
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ &my_unicase_default, /* caseinfo */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 8, /* strxfrm_multiply */
+ 1, /* caseup_multiply */
+ 1, /* casedn_multiply */
+ 1, /* mbminlen */
+ 3, /* mbmaxlen */
+ 9, /* min_sort_char */
+ 0xFFFF, /* max_sort_char */
+ ' ', /* pad char */
+ 0, /* escape_with_backslash_is_dangerous */
+ &my_charset_utf8_handler,
+ &my_collation_any_uca_handler
+};
+
+
+struct charset_info_st my_charset_utf8_german2_uca_ci=
+{
+ 212,0,0, /* number */
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
+ MY_UTF8MB3, /* cs name */
+ MY_UTF8MB3 "_german2_ci",/* name */
+ "", /* comment */
+ german2, /* tailoring */
+ ctype_utf8, /* ctype */
+ NULL, /* to_lower */
+ NULL, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9625,36 +10917,36 @@ struct charset_info_st my_charset_utf8_s
struct charset_info_st my_charset_utf8_croatian_uca_ci=
{
- 213,0,0, /* number */
- MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE,
- "utf8", /* cs name */
- "utf8_croatian_ci", /* name */
- "", /* comment */
- croatian, /* tailoring */
- ctype_utf8, /* ctype */
- NULL, /* to_lower */
- NULL, /* to_upper */
- NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
- NULL, /* tab_to_uni */
- NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
- NULL, /* state_map */
- NULL, /* ident_map */
- 8, /* strxfrm_multiply */
- 1, /* caseup_multiply */
- 1, /* casedn_multiply */
- 1, /* mbminlen */
- 3, /* mbmaxlen */
- 9, /* min_sort_char */
- 0xFFFF, /* max_sort_char */
- ' ', /* pad char */
- 0, /* escape_with_backslash_is_dangerous */
+ 213,0,0, /* number */
+ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */
+ MY_UTF8MB3, /* cs name */
+ MY_UTF8MB3 "_croatian_ci",/* name */
+ "", /* comment */
+ croatian, /* tailoring */
+ ctype_utf8, /* ctype */
+ NULL, /* to_lower */
+ NULL, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* uca */
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ &my_unicase_default, /* caseinfo */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 8, /* strxfrm_multiply */
+ 1, /* caseup_multiply */
+ 1, /* casedn_multiply */
+ 1, /* mbminlen */
+ 3, /* mbmaxlen */
+ 9, /* min_sort_char */
+ 0xFFFF, /* max_sort_char */
+ ' ', /* pad char */
+ 0, /* escape_with_backslash_is_dangerous */
&my_charset_utf8_handler,
&my_collation_any_uca_handler
};
+
#endif /* HAVE_CHARSET_utf8 */
@@ -9675,12 +10967,11 @@ struct charset_info_st my_charset_utf8mb
ctype_utf8, /* ctype */
NULL, /* to_lower */
NULL, /* to_upper */
- uca_length, /* sort_order */
- NULL, /* contractions */
- uca_weight, /* sort_order_big*/
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9709,11 +11000,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9741,11 +11031,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9773,11 +11062,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9805,11 +11093,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9837,11 +11124,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9869,11 +11155,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9901,11 +11186,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9933,11 +11217,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9965,11 +11248,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_turkish, /* caseinfo */
+ &my_unicase_turkish, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -9997,11 +11279,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10030,11 +11311,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10062,11 +11342,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10094,11 +11373,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10126,11 +11404,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10158,11 +11435,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10190,11 +11466,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10222,11 +11497,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10254,11 +11528,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10286,11 +11559,41 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ &my_unicase_default,/* caseinfo */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 8, /* strxfrm_multiply */
+ 1, /* caseup_multiply */
+ 1, /* casedn_multiply */
+ 1, /* mbminlen */
+ 4, /* mbmaxlen */
+ 9, /* min_sort_char */
+ 0xFFFF, /* max_sort_char */
+ ' ', /* pad char */
+ 0, /* escape_with_backslash_is_dangerous */
+ &my_charset_utf8mb4_handler,
+ &my_collation_any_uca_handler
+};
+
+struct charset_info_st my_charset_utf8mb4_german2_uca_ci=
+{
+ 244,0,0, /* number */
+ MY_CS_UTF8MB4_UCA_FLAGS,/* state */
+ MY_UTF8MB4, /* csname */
+ MY_UTF8MB4 "_german2_ci",/* name */
+ "", /* comment */
+ german2, /* tailoring */
+ ctype_utf8, /* ctype */
+ NULL, /* to_lower */
+ NULL, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10318,11 +11621,10 @@ struct charset_info_st my_charset_utf8mb
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10373,12 +11675,11 @@ struct charset_info_st my_charset_utf32_
NULL, /* ctype */
NULL, /* to_lower */
NULL, /* to_upper */
- uca_length, /* sort_order */
- NULL, /* contractions */
- uca_weight, /* sort_order_big*/
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10407,11 +11708,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10439,11 +11739,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10471,11 +11770,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10503,11 +11801,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10535,11 +11832,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10567,11 +11863,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10599,11 +11894,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10631,11 +11925,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10663,11 +11956,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_turkish, /* caseinfo */
+ &my_unicase_turkish, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10695,11 +11987,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10728,11 +12019,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10760,11 +12050,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10792,11 +12081,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10824,11 +12112,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10856,11 +12143,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10888,11 +12174,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10920,11 +12205,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10952,11 +12236,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -10984,11 +12267,41 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ &my_unicase_default,/* caseinfo */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 8, /* strxfrm_multiply */
+ 1, /* caseup_multiply */
+ 1, /* casedn_multiply */
+ 4, /* mbminlen */
+ 4, /* mbmaxlen */
+ 9, /* min_sort_char */
+ 0xFFFF, /* max_sort_char */
+ ' ', /* pad char */
+ 0, /* escape_with_backslash_is_dangerous */
+ &my_charset_utf32_handler,
+ &my_collation_utf32_uca_handler
+};
+
+struct charset_info_st my_charset_utf32_german2_uca_ci=
+{
+ 180,0,0, /* number */
+ MY_CS_UTF32_UCA_FLAGS,/* state */
+ "utf32", /* csname */
+ "utf32_german2_ci", /* name */
+ "", /* comment */
+ german2, /* tailoring */
+ NULL, /* ctype */
+ NULL, /* to_lower */
+ NULL, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11007,8 +12320,8 @@ struct charset_info_st my_charset_utf32_
struct charset_info_st my_charset_utf32_croatian_uca_ci=
{
214,0,0, /* number */
- MY_CS_UTF32_UCA_FLAGS /* state */,
- "utf32", /* cs name */
+ MY_CS_UTF32_UCA_FLAGS,/* state */
+ "utf32", /* csname */
"utf32_croatian_ci", /* name */
"", /* comment */
croatian, /* tailoring */
@@ -11016,11 +12329,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11035,6 +12347,7 @@ struct charset_info_st my_charset_utf32_
&my_charset_utf32_handler,
&my_collation_utf32_uca_handler
};
+
#endif /* HAVE_CHARSET_utf32 */
@@ -11071,12 +12384,11 @@ struct charset_info_st my_charset_utf16_
NULL, /* ctype */
NULL, /* to_lower */
NULL, /* to_upper */
- uca_length, /* sort_order */
- NULL, /* contractions */
- uca_weight, /* sort_order_big*/
+ NULL, /* sort_order */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11105,11 +12417,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11137,11 +12448,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11169,11 +12479,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11201,11 +12510,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11233,11 +12541,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11265,11 +12572,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11297,11 +12603,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11329,11 +12634,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11361,11 +12665,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_turkish, /* caseinfo */
+ &my_unicase_turkish, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11393,11 +12696,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11426,11 +12728,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11458,11 +12759,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11490,11 +12790,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11522,11 +12821,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11554,11 +12852,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11586,11 +12883,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11618,11 +12914,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11650,11 +12945,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default,/* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11682,11 +12976,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default,/* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
8, /* strxfrm_multiply */
@@ -11702,114 +12995,72 @@ struct charset_info_st my_charset_utf16_
&my_collation_utf16_uca_handler
};
-struct charset_info_st my_charset_utf16_croatian_uca_ci=
+struct charset_info_st my_charset_utf16_german2_uca_ci=
{
- 215,0,0, /* number */
- MY_CS_UTF16_UCA_FLAGS /* state */,
- "utf16", /* cs name */
- "utf16_croatian_ci", /* name */
- "", /* comment */
- croatian, /* tailoring */
- NULL, /* ctype */
- NULL, /* to_lower */
- NULL, /* to_upper */
- NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
- NULL, /* tab_to_uni */
- NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
- NULL, /* state_map */
- NULL, /* ident_map */
- 8, /* strxfrm_multiply */
- 1, /* caseup_multiply */
- 1, /* casedn_multiply */
- 2, /* mbminlen */
- 4, /* mbmaxlen */
- 9, /* min_sort_char */
- 0xFFFF, /* max_sort_char */
- ' ', /* pad char */
- 0, /* escape_with_backslash_is_dangerous */
+ 121,0,0, /* number */
+ MY_CS_UTF16_UCA_FLAGS,/* state */
+ "utf16", /* cs name */
+ "utf16_german2_ci",/* name */
+ "", /* comment */
+ german2, /* tailoring */
+ NULL, /* ctype */
+ NULL, /* to_lower */
+ NULL, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* uca */
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ &my_unicase_default,/* caseinfo */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 8, /* strxfrm_multiply */
+ 1, /* caseup_multiply */
+ 1, /* casedn_multiply */
+ 2, /* mbminlen */
+ 4, /* mbmaxlen */
+ 9, /* min_sort_char */
+ 0xFFFF, /* max_sort_char */
+ ' ', /* pad char */
+ 0, /* escape_with_backslash_is_dangerous */
&my_charset_utf16_handler,
&my_collation_utf16_uca_handler
};
-#endif /* HAVE_CHARSET_utf16 */
-
-
-
-#endif /* HAVE_UCA_COLLATIONS */
-
-/**
- Check if UCA data has contractions (public version)
-
- @cs Pointer to CHARSET_INFO data
- @retval 0 - no contraction, 1 - have contractions.
-*/
-
-my_bool
-my_cs_have_contractions(CHARSET_INFO *cs)
-{
- return cs->contractions != NULL;
-}
-/**
- Check if a character can be contraction head
-
- @cs Pointer to CHARSET_INFO data
- @wc Code point
-
- @retval 0 - cannot be contraction head
- @retval 1 - can be contraction head
-*/
-my_bool
-my_cs_can_be_contraction_head(CHARSET_INFO *cs, my_wc_t wc)
+struct charset_info_st my_charset_utf16_croatian_uca_ci=
{
- return cs->contractions->flags[wc & MY_UCA_CNT_FLAG_MASK] & MY_UCA_CNT_HEAD;
-}
-
-
-/**
- Check if a character can be contraction tail
-
- @cs Pointer to CHARSET_INFO data
- @wc Code point
-
- @retval 0 - cannot be contraction tail
- @retval 1 - can be contraction tail
-*/
+ 215,0,0, /* number */
+ MY_CS_UTF16_UCA_FLAGS,/* state */
+ "utf16", /* cs name */
+ "utf16_croatian_ci",/* name */
+ "", /* comment */
+ croatian, /* tailoring */
+ NULL, /* ctype */
+ NULL, /* to_lower */
+ NULL, /* to_upper */
+ NULL, /* sort_order */
+ NULL, /* uca */
+ NULL, /* tab_to_uni */
+ NULL, /* tab_from_uni */
+ &my_unicase_default,/* caseinfo */
+ NULL, /* state_map */
+ NULL, /* ident_map */
+ 8, /* strxfrm_multiply */
+ 1, /* caseup_multiply */
+ 1, /* casedn_multiply */
+ 2, /* mbminlen */
+ 4, /* mbmaxlen */
+ 9, /* min_sort_char */
+ 0xFFFF, /* max_sort_char */
+ ' ', /* pad char */
+ 0, /* escape_with_backslash_is_dangerous */
+ &my_charset_utf16_handler,
+ &my_collation_utf16_uca_handler
+};
-my_bool
-my_cs_can_be_contraction_tail(CHARSET_INFO *cs, my_wc_t wc)
-{
- return cs->contractions->flags[wc & MY_UCA_CNT_FLAG_MASK] & MY_UCA_CNT_TAIL;
-}
+#endif /* HAVE_CHARSET_utf16 */
-/**
- Find a contraction and return its weight array
-
- @cs Pointer to CHARSET data
- @wc1 First character
- @wc2 Second character
-
- @return Weight array
- @retval NULL - no contraction found
- @retval ptr - contraction weight array
-*/
-const uint16 *
-my_cs_contraction2_weight(CHARSET_INFO *cs, my_wc_t wc1, my_wc_t wc2)
-{
- const MY_CONTRACTIONS *list= cs->contractions;
- const MY_CONTRACTION *c, *last;
- for (c= list->item, last= &list->item[list->nitems]; c < last; c++)
- {
- if (c->ch[0] == wc1 && c->ch[1] == wc2)
- {
- return c->weight;
- }
- }
- return NULL;
-}
+#endif /* HAVE_UCA_COLLATIONS */
=== modified file 'strings/ctype-ucs2.c'
--- strings/ctype-ucs2.c 2013-08-02 09:36:25 +0000
+++ strings/ctype-ucs2.c 2013-08-29 08:41:37 +0000
@@ -1161,31 +1161,31 @@ my_uni_utf16(CHARSET_INFO *cs __attribut
static inline void
-my_tolower_utf16(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_tolower_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- if (page < 256 && uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].tolower;
+ MY_UNICASE_CHARACTER *page;
+ if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].tolower;
}
static inline void
-my_toupper_utf16(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_toupper_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- if (page < 256 && uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].toupper;
+ MY_UNICASE_CHARACTER *page;
+ if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].toupper;
}
static inline void
-my_tosort_utf16(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_tosort_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- if (page < 256)
+ if (*wc <= uni_plane->maxchar)
{
- if (uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].sort;
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].sort;
}
else
{
@@ -1194,6 +1194,7 @@ my_tosort_utf16(MY_UNICASE_INFO * const*
}
+
static size_t
my_caseup_utf16(CHARSET_INFO *cs, char *src, size_t srclen,
char *dst __attribute__((unused)),
@@ -1204,7 +1205,7 @@ my_caseup_utf16(CHARSET_INFO *cs, char *
my_charset_conv_wc_mb wc_mb= cs->cset->wc_mb;
int res;
char *srcend= src + srclen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src == dst && srclen == dstlen);
while ((src < srcend) &&
@@ -1227,7 +1228,7 @@ my_hash_sort_utf16(CHARSET_INFO *cs, con
my_charset_conv_mb_wc mb_wc= cs->cset->mb_wc;
int res;
const uchar *e= s + cs->cset->lengthsp(cs, (const char *) s, slen);
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while ((s < e) && (res= mb_wc(cs, &wc, (uchar *) s, (uchar *) e)) > 0)
{
@@ -1251,7 +1252,7 @@ my_casedn_utf16(CHARSET_INFO *cs, char *
my_charset_conv_wc_mb wc_mb= cs->cset->wc_mb;
int res;
char *srcend= src + srclen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src == dst && srclen == dstlen);
while ((src < srcend) &&
@@ -1277,7 +1278,7 @@ my_strnncoll_utf16(CHARSET_INFO *cs,
my_charset_conv_mb_wc mb_wc= cs->cset->mb_wc;
const uchar *se= s + slen;
const uchar *te= t + tlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while (s < se && t < te)
{
@@ -1341,7 +1342,7 @@ my_strnncollsp_utf16(CHARSET_INFO *cs,
my_wc_t UNINIT_VAR(s_wc), UNINIT_VAR(t_wc);
my_charset_conv_mb_wc mb_wc= cs->cset->mb_wc;
const uchar *se= s + slen, *te= t + tlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT((slen % 2) == 0);
DBUG_ASSERT((tlen % 2) == 0);
@@ -1483,7 +1484,7 @@ my_wildcmp_utf16_ci(CHARSET_INFO *cs,
const char *wildstr,const char *wildend,
int escape, int w_one, int w_many)
{
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
return my_wildcmp_unicode(cs, str, str_end, wildstr, wildend,
escape, w_one, w_many, uni_plane);
}
@@ -1695,11 +1696,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -1728,11 +1728,10 @@ struct charset_info_st my_charset_utf16_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -1864,11 +1863,10 @@ struct charset_info_st my_charset_utf16l
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -1897,11 +1895,10 @@ struct charset_info_st my_charset_utf16l
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -1950,31 +1947,31 @@ my_uni_utf32(CHARSET_INFO *cs __attribut
static inline void
-my_tolower_utf32(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_tolower_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- if (page < 256 && uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].tolower;
+ MY_UNICASE_CHARACTER *page;
+ if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].tolower;
}
static inline void
-my_toupper_utf32(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_toupper_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- if (page < 256 && uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].toupper;
+ MY_UNICASE_CHARACTER *page;
+ if ((*wc <= uni_plane->maxchar) && (page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].toupper;
}
static inline void
-my_tosort_utf32(MY_UNICASE_INFO *const* uni_plane, my_wc_t *wc)
+my_tosort_utf32(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- if (page < 256)
+ if (*wc <= uni_plane->maxchar)
{
- if (uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].sort;
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[*wc >> 8]))
+ *wc= page[*wc & 0xFF].sort;
}
else
{
@@ -1991,7 +1988,7 @@ my_caseup_utf32(CHARSET_INFO *cs, char *
my_wc_t wc;
int res;
char *srcend= src + srclen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src == dst && srclen == dstlen);
while ((src < srcend) &&
@@ -2021,7 +2018,7 @@ my_hash_sort_utf32(CHARSET_INFO *cs, con
my_wc_t wc;
int res;
const uchar *e= s + slen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
/* Skip trailing spaces */
while (e > s + 3 && e[-1] == ' ' && !e[-2] && !e[-3] && !e[-4])
@@ -2047,7 +2044,7 @@ my_casedn_utf32(CHARSET_INFO *cs, char *
my_wc_t wc;
int res;
char *srcend= src + srclen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src == dst && srclen == dstlen);
while ((res= my_utf32_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0)
@@ -2070,7 +2067,7 @@ my_strnncoll_utf32(CHARSET_INFO *cs,
my_wc_t UNINIT_VAR(s_wc),UNINIT_VAR(t_wc);
const uchar *se= s + slen;
const uchar *te= t + tlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while (s < se && t < te)
{
@@ -2134,7 +2131,7 @@ my_strnncollsp_utf32(CHARSET_INFO *cs,
int res;
my_wc_t UNINIT_VAR(s_wc), UNINIT_VAR(t_wc);
const uchar *se= s + slen, *te= t + tlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT((slen % 4) == 0);
DBUG_ASSERT((tlen % 4) == 0);
@@ -2582,7 +2579,7 @@ my_wildcmp_utf32_ci(CHARSET_INFO *cs,
const char *wildstr, const char *wildend,
int escape, int w_one, int w_many)
{
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
return my_wildcmp_unicode(cs, str, str_end, wildstr, wildend,
escape, w_one, w_many, uni_plane);
}
@@ -2790,11 +2787,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -2823,11 +2819,10 @@ struct charset_info_st my_charset_utf32_
NULL, /* to_lower */
NULL, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -2934,32 +2929,29 @@ static int my_uni_ucs2(CHARSET_INFO *cs
static inline void
-my_tolower_ucs2(MY_UNICASE_INFO *const *uni_plane, my_wc_t *wc)
+my_tolower_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- DBUG_ASSERT(page < 256);
- if (uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].tolower;
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8) & 0xFF]))
+ *wc= page[*wc & 0xFF].tolower;
}
static inline void
-my_toupper_ucs2(MY_UNICASE_INFO *const *uni_plane, my_wc_t *wc)
+my_toupper_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- DBUG_ASSERT(page < 256);
- if (uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].toupper;
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8) & 0xFF]))
+ *wc= page[*wc & 0xFF].toupper;
}
static inline void
-my_tosort_ucs2(MY_UNICASE_INFO *const *uni_plane, my_wc_t *wc)
+my_tosort_ucs2(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- uint page= *wc >> 8;
- DBUG_ASSERT(page < 256);
- if (uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].sort;
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8) & 0xFF]))
+ *wc= page[*wc & 0xFF].sort;
}
static size_t my_caseup_ucs2(CHARSET_INFO *cs, char *src, size_t srclen,
@@ -2969,7 +2961,7 @@ static size_t my_caseup_ucs2(CHARSET_INF
my_wc_t wc;
int res;
char *srcend= src + srclen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src == dst && srclen == dstlen);
while ((src < srcend) &&
@@ -2990,7 +2982,7 @@ static void my_hash_sort_ucs2(CHARSET_IN
my_wc_t wc;
int res;
const uchar *e=s+slen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while (e > s+1 && e[-1] == ' ' && e[-2] == '\0')
e-= 2;
@@ -3014,7 +3006,7 @@ static size_t my_casedn_ucs2(CHARSET_INF
my_wc_t wc;
int res;
char *srcend= src + srclen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src == dst && srclen == dstlen);
while ((src < srcend) &&
@@ -3062,7 +3054,7 @@ static int my_strnncoll_ucs2(CHARSET_INF
my_wc_t UNINIT_VAR(s_wc),UNINIT_VAR(t_wc);
const uchar *se=s+slen;
const uchar *te=t+tlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while ( s < se && t < te )
{
@@ -3124,7 +3116,7 @@ static int my_strnncollsp_ucs2(CHARSET_I
{
const uchar *se, *te;
size_t minlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
/* extra safety to make sure the lengths are even numbers */
slen&= ~1;
@@ -3135,11 +3127,11 @@ static int my_strnncollsp_ucs2(CHARSET_I
for (minlen= MY_MIN(slen, tlen); minlen; minlen-= 2)
{
- int s_wc = uni_plane[s[0]] ? (int) uni_plane[s[0]][s[1]].sort :
- (((int) s[0]) << 8) + (int) s[1];
+ int s_wc = uni_plane->page[s[0]] ? (int) uni_plane->page[s[0]][s[1]].sort :
+ (((int) s[0]) << 8) + (int) s[1];
- int t_wc = uni_plane[t[0]] ? (int) uni_plane[t[0]][t[1]].sort :
- (((int) t[0]) << 8) + (int) t[1];
+ int t_wc = uni_plane->page[t[0]] ? (int) uni_plane->page[t[0]][t[1]].sort :
+ (((int) t[0]) << 8) + (int) t[1];
if ( s_wc != t_wc )
return s_wc > t_wc ? 1 : -1;
@@ -3220,7 +3212,7 @@ int my_wildcmp_ucs2_ci(CHARSET_INFO *cs,
const char *wildstr,const char *wildend,
int escape, int w_one, int w_many)
{
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
return my_wildcmp_unicode(cs,str,str_end,wildstr,wildend,
escape,w_one,w_many,uni_plane);
}
@@ -3412,11 +3404,10 @@ struct charset_info_st my_charset_ucs2_g
to_lower_ucs2, /* to_lower */
to_upper_ucs2, /* to_upper */
to_upper_ucs2, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -3445,11 +3436,10 @@ struct charset_info_st my_charset_ucs2_g
to_lower_ucs2, /* to_lower */
to_upper_ucs2, /* to_upper */
to_upper_ucs2, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_mysql500, /* caseinfo */
+ &my_unicase_mysql500, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -3478,11 +3468,10 @@ struct charset_info_st my_charset_ucs2_b
to_lower_ucs2, /* to_lower */
to_upper_ucs2, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-ujis.c'
--- strings/ctype-ujis.c 2013-07-16 17:09:54 +0000
+++ strings/ctype-ujis.c 2013-08-29 09:07:23 +0000
@@ -65988,7 +65988,7 @@ my_wc_mb_euc_jp(CHARSET_INFO *cs __attri
/* Case info pages for JIS-X-0208 range */
-static MY_UNICASE_INFO cA2[256]=
+static MY_UNICASE_CHARACTER cA2[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66109,7 +66109,7 @@ static MY_UNICASE_INFO cA2[256]=
};
-static MY_UNICASE_INFO cA3[256]=
+static MY_UNICASE_CHARACTER cA3[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66230,7 +66230,7 @@ static MY_UNICASE_INFO cA3[256]=
};
-static MY_UNICASE_INFO cA6[256]=
+static MY_UNICASE_CHARACTER cA6[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66351,7 +66351,7 @@ static MY_UNICASE_INFO cA6[256]=
};
-static MY_UNICASE_INFO cA7[256]=
+static MY_UNICASE_CHARACTER cA7[256]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66473,7 +66473,7 @@ static MY_UNICASE_INFO cA7[256]=
/* Case info pages for JIS-X-0212 range */
-static MY_UNICASE_INFO c8FA6[]=
+static MY_UNICASE_CHARACTER c8FA6[]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66594,7 +66594,7 @@ static MY_UNICASE_INFO c8FA6[]=
};
-static MY_UNICASE_INFO c8FA7[]=
+static MY_UNICASE_CHARACTER c8FA7[]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66715,7 +66715,7 @@ static MY_UNICASE_INFO c8FA7[]=
};
-static MY_UNICASE_INFO c8FA9[]=
+static MY_UNICASE_CHARACTER c8FA9[]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66836,7 +66836,7 @@ static MY_UNICASE_INFO c8FA9[]=
};
-static MY_UNICASE_INFO c8FAA[]=
+static MY_UNICASE_CHARACTER c8FAA[]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -66957,7 +66957,7 @@ static MY_UNICASE_INFO c8FAA[]=
};
-static MY_UNICASE_INFO c8FAB[]=
+static MY_UNICASE_CHARACTER c8FAB[]=
{
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}, /* xx00 */
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
@@ -67078,7 +67078,7 @@ static MY_UNICASE_INFO c8FAB[]=
};
-static MY_UNICASE_INFO *my_caseinfo_ujis[512]=
+static MY_UNICASE_CHARACTER *my_caseinfo_pages_ujis[512]=
{
/* JIS-X-0208 */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0 */
@@ -67148,6 +67148,15 @@ static MY_UNICASE_INFO *my_caseinfo_ujis
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* F */
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
};
+
+static MY_UNICASE_INFO my_caseinfo_ujis=
+{
+ 0x0FFFF,
+ my_caseinfo_pages_ujis
+};
+
+
+
#endif /* HAVE_CHARSET_ujis */
@@ -67158,11 +67167,11 @@ static MY_UNICASE_INFO *my_caseinfo_ujis
UJIS and EUCJPMS share the same UPPER/LOWER functions.
*/
-static MY_UNICASE_INFO*
+static MY_UNICASE_CHARACTER*
get_case_info_for_ch(CHARSET_INFO *cs, uint plane, uint page, uint offs)
{
- MY_UNICASE_INFO *p;
- return (p= cs->caseinfo[page + plane * 256]) ? &p[offs & 0xFF] : NULL;
+ MY_UNICASE_CHARACTER *p;
+ return (p= cs->caseinfo->page[page + plane * 256]) ? &p[offs & 0xFF] : NULL;
}
@@ -67183,7 +67192,7 @@ my_casefold_ujis(CHARSET_INFO *cs,
size_t mblen= my_ismbchar(cs, src, srcend);
if (mblen)
{
- MY_UNICASE_INFO *ch;
+ MY_UNICASE_CHARACTER *ch;
ch= (mblen == 2) ?
get_case_info_for_ch(cs, 0, (uchar) src[0], (uchar) src[1]) :
get_case_info_for_ch(cs, 1, (uchar) src[1], (uchar) src[2]);
@@ -67304,11 +67313,10 @@ struct charset_info_st my_charset_ujis_j
to_lower_ujis,
to_upper_ujis,
sort_order_ujis,
- NULL, /* sort_order_big*/
- NULL, /* contractions */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_ujis, /* caseinfo */
+ &my_caseinfo_ujis, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -67337,11 +67345,10 @@ struct charset_info_st my_charset_ujis_b
to_lower_ujis,
to_upper_ujis,
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_caseinfo_ujis, /* caseinfo */
+ &my_caseinfo_ujis, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-utf8.c'
--- strings/ctype-utf8.c 2013-07-21 14:39:19 +0000
+++ strings/ctype-utf8.c 2013-09-12 08:45:23 +0000
@@ -60,7 +60,7 @@
#include "my_uctype.h"
-static MY_UNICASE_INFO plane00[]={
+static MY_UNICASE_CHARACTER plane00[]={
{0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001},
{0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003},
{0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005},
@@ -196,7 +196,7 @@ static MY_UNICASE_INFO plane00[]={
Almost similar to plane00, but maps sorting order
for U+00DF to 0x00DF instead of 0x0053.
*/
-static MY_UNICASE_INFO plane00_mysql500[]={
+static MY_UNICASE_CHARACTER plane00_mysql500[]={
{0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001},
{0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003},
{0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005},
@@ -328,7 +328,7 @@ static MY_UNICASE_INFO plane00_mysql500[
};
-static MY_UNICASE_INFO plane01[]={
+static MY_UNICASE_CHARACTER plane01[]={
{0x0100,0x0101,0x0041}, {0x0100,0x0101,0x0041},
{0x0102,0x0103,0x0041}, {0x0102,0x0103,0x0041},
{0x0104,0x0105,0x0041}, {0x0104,0x0105,0x0041},
@@ -459,7 +459,7 @@ static MY_UNICASE_INFO plane01[]={
{0x01FE,0x01FF,0x00D8}, {0x01FE,0x01FF,0x00D8}
};
-static MY_UNICASE_INFO plane02[]={
+static MY_UNICASE_CHARACTER plane02[]={
{0x0200,0x0201,0x0041}, {0x0200,0x0201,0x0041},
{0x0202,0x0203,0x0041}, {0x0202,0x0203,0x0041},
{0x0204,0x0205,0x0045}, {0x0204,0x0205,0x0045},
@@ -590,7 +590,7 @@ static MY_UNICASE_INFO plane02[]={
{0x02FE,0x02FE,0x02FE}, {0x02FF,0x02FF,0x02FF}
};
-static MY_UNICASE_INFO plane03[]={
+static MY_UNICASE_CHARACTER plane03[]={
{0x0300,0x0300,0x0300}, {0x0301,0x0301,0x0301},
{0x0302,0x0302,0x0302}, {0x0303,0x0303,0x0303},
{0x0304,0x0304,0x0304}, {0x0305,0x0305,0x0305},
@@ -721,7 +721,7 @@ static MY_UNICASE_INFO plane03[]={
{0x03FE,0x03FE,0x03FE}, {0x03FF,0x03FF,0x03FF}
};
-static MY_UNICASE_INFO plane04[]={
+static MY_UNICASE_CHARACTER plane04[]={
{0x0400,0x0450,0x0415}, {0x0401,0x0451,0x0415},
{0x0402,0x0452,0x0402}, {0x0403,0x0453,0x0413},
{0x0404,0x0454,0x0404}, {0x0405,0x0455,0x0405},
@@ -852,7 +852,7 @@ static MY_UNICASE_INFO plane04[]={
{0x04FE,0x04FE,0x04FE}, {0x04FF,0x04FF,0x04FF}
};
-static MY_UNICASE_INFO plane05[]={
+static MY_UNICASE_CHARACTER plane05[]={
{0x0500,0x0500,0x0500}, {0x0501,0x0501,0x0501},
{0x0502,0x0502,0x0502}, {0x0503,0x0503,0x0503},
{0x0504,0x0504,0x0504}, {0x0505,0x0505,0x0505},
@@ -983,7 +983,7 @@ static MY_UNICASE_INFO plane05[]={
{0x05FE,0x05FE,0x05FE}, {0x05FF,0x05FF,0x05FF}
};
-static MY_UNICASE_INFO plane1E[]={
+static MY_UNICASE_CHARACTER plane1E[]={
{0x1E00,0x1E01,0x0041}, {0x1E00,0x1E01,0x0041},
{0x1E02,0x1E03,0x0042}, {0x1E02,0x1E03,0x0042},
{0x1E04,0x1E05,0x0042}, {0x1E04,0x1E05,0x0042},
@@ -1114,7 +1114,7 @@ static MY_UNICASE_INFO plane1E[]={
{0x1EFE,0x1EFE,0x1EFE}, {0x1EFF,0x1EFF,0x1EFF}
};
-static MY_UNICASE_INFO plane1F[]={
+static MY_UNICASE_CHARACTER plane1F[]={
{0x1F08,0x1F00,0x0391}, {0x1F09,0x1F01,0x0391},
{0x1F0A,0x1F02,0x0391}, {0x1F0B,0x1F03,0x0391},
{0x1F0C,0x1F04,0x0391}, {0x1F0D,0x1F05,0x0391},
@@ -1245,7 +1245,7 @@ static MY_UNICASE_INFO plane1F[]={
{0x1FFE,0x1FFE,0x1FFE}, {0x1FFF,0x1FFF,0x1FFF}
};
-static MY_UNICASE_INFO plane21[]={
+static MY_UNICASE_CHARACTER plane21[]={
{0x2100,0x2100,0x2100}, {0x2101,0x2101,0x2101},
{0x2102,0x2102,0x2102}, {0x2103,0x2103,0x2103},
{0x2104,0x2104,0x2104}, {0x2105,0x2105,0x2105},
@@ -1376,7 +1376,7 @@ static MY_UNICASE_INFO plane21[]={
{0x21FE,0x21FE,0x21FE}, {0x21FF,0x21FF,0x21FF}
};
-static MY_UNICASE_INFO plane24[]={
+static MY_UNICASE_CHARACTER plane24[]={
{0x2400,0x2400,0x2400}, {0x2401,0x2401,0x2401},
{0x2402,0x2402,0x2402}, {0x2403,0x2403,0x2403},
{0x2404,0x2404,0x2404}, {0x2405,0x2405,0x2405},
@@ -1507,7 +1507,7 @@ static MY_UNICASE_INFO plane24[]={
{0x24FE,0x24FE,0x24FE}, {0x24FF,0x24FF,0x24FF}
};
-static MY_UNICASE_INFO planeFF[]={
+static MY_UNICASE_CHARACTER planeFF[]={
{0xFF00,0xFF00,0xFF00}, {0xFF01,0xFF01,0xFF01},
{0xFF02,0xFF02,0xFF02}, {0xFF03,0xFF03,0xFF03},
{0xFF04,0xFF04,0xFF04}, {0xFF05,0xFF05,0xFF05},
@@ -1638,7 +1638,9 @@ static MY_UNICASE_INFO planeFF[]={
{0xFFFE,0xFFFE,0xFFFE}, {0xFFFF,0xFFFF,0xFFFF}
};
-MY_UNICASE_INFO *const my_unicase_default[256]={
+
+static MY_UNICASE_CHARACTER *my_unicase_pages_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,
@@ -1671,14 +1673,20 @@ MY_UNICASE_INFO *const my_unicase_defaul
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, planeFF
+};
+
+MY_UNICASE_INFO my_unicase_default=
+{
+ 0xFFFF,
+ my_unicase_pages_default
};
/*
Reproduce old utf8_general_ci behaviour before we fixed Bug#27877.
*/
-MY_UNICASE_INFO *const my_unicase_mysql500[256]={
+MY_UNICASE_CHARACTER *my_unicase_pages_mysql500[256]={
plane00_mysql500,
plane01, plane02, plane03, plane04, plane05, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1716,6 +1724,13 @@ MY_UNICASE_INFO *const my_unicase_mysql5
};
+MY_UNICASE_INFO my_unicase_mysql500=
+{
+ 0xFFFF,
+ my_unicase_pages_mysql500
+};
+
+
/*
Turkish lower/upper mapping:
1. LOWER(0x0049 LATIN CAPITAL LETTER I) ->
@@ -1724,7 +1739,7 @@ MY_UNICASE_INFO *const my_unicase_mysql5
0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
*/
-static MY_UNICASE_INFO turk00[]=
+static MY_UNICASE_CHARACTER turk00[]=
{
{0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001},
{0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003},
@@ -1858,7 +1873,7 @@ static MY_UNICASE_INFO turk00[]=
-MY_UNICASE_INFO *const my_unicase_turkish[256]=
+static MY_UNICASE_CHARACTER *my_unicase_pages_turkish[256]=
{
turk00, plane01, plane02, plane03, plane04, plane05, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1895,14 +1910,23 @@ MY_UNICASE_INFO *const my_unicase_turkis
};
+MY_UNICASE_INFO my_unicase_turkish=
+{
+ 0xFFFF,
+ my_unicase_pages_turkish
+};
+
+
static inline void
-my_tosort_unicode(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_tosort_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc, uint flags)
{
- int page= *wc >> 8;
- if (page < 256)
+ if (*wc <= uni_plane->maxchar)
{
- if (uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].sort;
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[*wc >> 8]))
+ *wc= (flags & MY_CS_LOWER_SORT) ?
+ page[*wc & 0xFF].tolower :
+ page[*wc & 0xFF].sort;
}
else
{
@@ -1925,7 +1949,7 @@ int my_wildcmp_unicode_impl(CHARSET_INFO
const char *str,const char *str_end,
const char *wildstr,const char *wildend,
int escape, int w_one, int w_many,
- MY_UNICASE_INFO *const *weights, int recurse_level)
+ MY_UNICASE_INFO *weights, int recurse_level)
{
int result= -1; /* Not found, using wildcards */
my_wc_t s_wc, w_wc;
@@ -1974,8 +1998,8 @@ int my_wildcmp_unicode_impl(CHARSET_INFO
{
if (weights)
{
- my_tosort_unicode(weights, &s_wc);
- my_tosort_unicode(weights, &w_wc);
+ my_tosort_unicode(weights, &s_wc, cs->state);
+ my_tosort_unicode(weights, &w_wc, cs->state);
}
if (s_wc != w_wc)
return 1; /* No match */
@@ -2045,8 +2069,8 @@ int my_wildcmp_unicode_impl(CHARSET_INFO
return 1;
if (weights)
{
- my_tosort_unicode(weights, &s_wc);
- my_tosort_unicode(weights, &w_wc);
+ my_tosort_unicode(weights, &s_wc, cs->state);
+ my_tosort_unicode(weights, &w_wc, cs->state);
}
if (s_wc == w_wc)
@@ -2074,7 +2098,7 @@ my_wildcmp_unicode(CHARSET_INFO *cs,
const char *str,const char *str_end,
const char *wildstr,const char *wildend,
int escape, int w_one, int w_many,
- MY_UNICASE_INFO *const *weights)
+ MY_UNICASE_INFO *weights)
{
return my_wildcmp_unicode_impl(cs, str, str_end,
wildstr, wildend,
@@ -2099,7 +2123,7 @@ my_strnxfrm_unicode(CHARSET_INFO *cs,
uchar *de= dst + dstlen;
uchar *de_beg= de - 1;
const uchar *se = src + srclen;
- MY_UNICASE_INFO * const*uni_plane= (cs->state & MY_CS_BINSORT) ?
+ MY_UNICASE_INFO *uni_plane= (cs->state & MY_CS_BINSORT) ?
NULL : cs->caseinfo;
DBUG_ASSERT(src);
@@ -2110,7 +2134,7 @@ my_strnxfrm_unicode(CHARSET_INFO *cs,
src+=res;
if (uni_plane)
- my_tosort_unicode(uni_plane, &wc);
+ my_tosort_unicode(uni_plane, &wc, cs->state);
*dst++= (uchar) (wc >> 8);
if (dst < de)
@@ -2476,20 +2500,45 @@ static int my_uni_utf8_no_range(CHARSET_
}
+static inline void
+my_tolower_utf8mb3(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
+{
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8) & 0xFF]))
+ *wc= page[*wc & 0xFF].tolower;
+}
+
+
+static inline void
+my_toupper_utf8mb3(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
+{
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8) & 0xFF]))
+ *wc= page[*wc & 0xFF].toupper;
+}
+
+
+static inline void
+my_tosort_utf8mb3(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
+{
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8) & 0xFF]))
+ *wc= page[*wc & 0xFF].sort;
+}
+
static size_t my_caseup_utf8(CHARSET_INFO *cs, char *src, size_t srclen,
char *dst, size_t dstlen)
{
my_wc_t wc;
int srcres, dstres;
char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src != dst || cs->caseup_multiply == 1);
while ((src < srcend) &&
(srcres= my_utf8_uni(cs, &wc, (uchar *) src, (uchar*) srcend)) > 0)
{
- int plane= (wc>>8) & 0xFF;
- wc= uni_plane[plane] ? uni_plane[plane][wc & 0xFF].toupper : wc;
+ my_toupper_utf8mb3(uni_plane, &wc);
if ((dstres= my_uni_utf8(cs, wc, (uchar*) dst, (uchar*) dstend)) <= 0)
break;
src+= srcres;
@@ -2505,7 +2554,7 @@ static void my_hash_sort_utf8(CHARSET_IN
my_wc_t wc;
int res;
const uchar *e=s+slen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
/*
Remove end space. We have to do this to be able to compare
@@ -2516,8 +2565,7 @@ static void my_hash_sort_utf8(CHARSET_IN
while ((s < e) && (res=my_utf8_uni(cs,&wc, (uchar *)s, (uchar*)e))>0 )
{
- int plane = (wc>>8) & 0xFF;
- wc = uni_plane[plane] ? uni_plane[plane][wc & 0xFF].sort : wc;
+ my_tosort_unicode(uni_plane, &wc, cs->state);
n1[0]^= (((n1[0] & 63)+n2[0])*(wc & 0xFF))+ (n1[0] << 8);
n2[0]+=3;
n1[0]^= (((n1[0] & 63)+n2[0])*(wc >> 8))+ (n1[0] << 8);
@@ -2532,14 +2580,13 @@ static size_t my_caseup_str_utf8(CHARSET
my_wc_t wc;
int srcres, dstres;
char *dst= src, *dst0= src;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(cs->caseup_multiply == 1);
while (*src &&
(srcres= my_utf8_uni_no_range(cs, &wc, (uchar *) src)) > 0)
{
- int plane= (wc>>8) & 0xFF;
- wc= uni_plane[plane] ? uni_plane[plane][wc & 0xFF].toupper : wc;
+ my_toupper_utf8mb3(uni_plane, &wc);
if ((dstres= my_uni_utf8_no_range(cs, wc, (uchar*) dst)) <= 0)
break;
src+= srcres;
@@ -2556,14 +2603,13 @@ static size_t my_casedn_utf8(CHARSET_INF
my_wc_t wc;
int srcres, dstres;
char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src != dst || cs->casedn_multiply == 1);
while ((src < srcend) &&
(srcres= my_utf8_uni(cs, &wc, (uchar*) src, (uchar*)srcend)) > 0)
{
- int plane= (wc>>8) & 0xFF;
- wc= uni_plane[plane] ? uni_plane[plane][wc & 0xFF].tolower : wc;
+ my_tolower_utf8mb3(uni_plane, &wc);
if ((dstres= my_uni_utf8(cs, wc, (uchar*) dst, (uchar*) dstend)) <= 0)
break;
src+= srcres;
@@ -2578,14 +2624,13 @@ static size_t my_casedn_str_utf8(CHARSET
my_wc_t wc;
int srcres, dstres;
char *dst= src, *dst0= src;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(cs->casedn_multiply == 1);
while (*src &&
(srcres= my_utf8_uni_no_range(cs, &wc, (uchar *) src)) > 0)
{
- int plane= (wc>>8) & 0xFF;
- wc= uni_plane[plane] ? uni_plane[plane][wc & 0xFF].tolower : wc;
+ my_tolower_utf8mb3(uni_plane, &wc);
if ((dstres= my_uni_utf8_no_range(cs, wc, (uchar*) dst)) <= 0)
break;
src+= srcres;
@@ -2621,11 +2666,10 @@ static int my_strnncoll_utf8(CHARSET_INF
my_wc_t UNINIT_VAR(s_wc), UNINIT_VAR(t_wc);
const uchar *se=s+slen;
const uchar *te=t+tlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while ( s < se && t < te )
{
- int plane;
s_res=my_utf8_uni(cs,&s_wc, s, se);
t_res=my_utf8_uni(cs,&t_wc, t, te);
@@ -2635,10 +2679,9 @@ static int my_strnncoll_utf8(CHARSET_INF
return bincmp(s, se, t, te);
}
- plane=(s_wc>>8) & 0xFF;
- s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc;
- plane=(t_wc>>8) & 0xFF;
- t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].sort : t_wc;
+ my_tosort_unicode(uni_plane, &s_wc, cs->state);
+ my_tosort_unicode(uni_plane, &t_wc, cs->state);
+
if ( s_wc != t_wc )
{
return s_wc > t_wc ? 1 : -1;
@@ -2690,7 +2733,7 @@ static int my_strnncollsp_utf8(CHARSET_I
int s_res, t_res, res;
my_wc_t UNINIT_VAR(s_wc), UNINIT_VAR(t_wc);
const uchar *se= s+slen, *te= t+tlen;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
#ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
diff_if_only_endspace_difference= 0;
@@ -2698,7 +2741,6 @@ static int my_strnncollsp_utf8(CHARSET_I
while ( s < se && t < te )
{
- int plane;
s_res=my_utf8_uni(cs,&s_wc, s, se);
t_res=my_utf8_uni(cs,&t_wc, t, te);
@@ -2708,10 +2750,9 @@ static int my_strnncollsp_utf8(CHARSET_I
return bincmp(s, se, t, te);
}
- plane=(s_wc>>8) & 0xFF;
- s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc;
- plane=(t_wc>>8) & 0xFF;
- t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].sort : t_wc;
+ my_tosort_unicode(uni_plane, &s_wc, cs->state);
+ my_tosort_unicode(uni_plane, &t_wc, cs->state);
+
if ( s_wc != t_wc )
{
return s_wc > t_wc ? 1 : -1;
@@ -2778,7 +2819,7 @@ static int my_strnncollsp_utf8(CHARSET_I
static
int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t)
{
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while (s[0] && t[0])
{
my_wc_t s_wc,t_wc;
@@ -2795,7 +2836,7 @@ int my_strcasecmp_utf8(CHARSET_INFO *cs,
}
else
{
- int plane, res;
+ int res;
/*
Scan a multibyte character.
@@ -2823,8 +2864,7 @@ int my_strcasecmp_utf8(CHARSET_INFO *cs,
s+= res;
/* Convert Unicode code into weight according to collation */
- plane=(s_wc>>8) & 0xFF;
- s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].tolower : s_wc;
+ my_tolower_utf8mb3(uni_plane, &s_wc);
}
@@ -2838,15 +2878,13 @@ int my_strcasecmp_utf8(CHARSET_INFO *cs,
}
else
{
- int plane;
int res=my_utf8_uni(cs,&t_wc, (const uchar*)t, (const uchar*) t + 3);
if (res <= 0)
return strcmp(s, t);
t+= res;
/* Convert code into weight */
- plane=(t_wc>>8) & 0xFF;
- t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].tolower : t_wc;
+ my_tolower_utf8mb3(uni_plane, &t_wc);
}
/* Now we have two weights, let's compare them */
@@ -2863,7 +2901,7 @@ int my_wildcmp_utf8(CHARSET_INFO *cs,
const char *wildstr,const char *wildend,
int escape, int w_one, int w_many)
{
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
return my_wildcmp_unicode(cs,str,str_end,wildstr,wildend,
escape,w_one,w_many,uni_plane);
}
@@ -2966,11 +3004,10 @@ struct charset_info_st my_charset_utf8_g
to_lower_utf8, /* to_lower */
to_upper_utf8, /* to_upper */
to_upper_utf8, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -2999,11 +3036,10 @@ struct charset_info_st my_charset_utf8_g
to_lower_utf8, /* to_lower */
to_upper_utf8, /* to_upper */
to_upper_utf8, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big */
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_mysql500, /* caseinfo */
+ &my_unicase_mysql500, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -3032,11 +3068,10 @@ struct charset_info_st my_charset_utf8_b
to_lower_utf8, /* to_lower */
to_upper_utf8, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -3117,7 +3152,7 @@ static int my_strnncollsp_utf8_cs(CHARSE
const uchar *se= s + slen;
const uchar *te= t + tlen;
int save_diff= 0;
- MY_UNICASE_INFO *const *uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
#ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
diff_if_only_endspace_difference= 0;
@@ -3125,7 +3160,6 @@ static int my_strnncollsp_utf8_cs(CHARSE
while ( s < se && t < te )
{
- int plane;
s_res=my_utf8_uni(cs,&s_wc, s, se);
t_res=my_utf8_uni(cs,&t_wc, t, te);
@@ -3139,10 +3173,10 @@ static int my_strnncollsp_utf8_cs(CHARSE
{
save_diff = ((int)s_wc) - ((int)t_wc);
}
- plane=(s_wc>>8) & 0xFF;
- s_wc = uni_plane[plane] ? uni_plane[plane][s_wc & 0xFF].sort : s_wc;
- plane=(t_wc>>8) & 0xFF;
- t_wc = uni_plane[plane] ? uni_plane[plane][t_wc & 0xFF].sort : t_wc;
+
+ my_tosort_unicode(uni_plane, &s_wc, cs->state);
+ my_tosort_unicode(uni_plane, &t_wc, cs->state);
+
if ( s_wc != t_wc )
{
return ((int) s_wc) - ((int) t_wc);
@@ -4519,11 +4553,10 @@ struct charset_info_st my_charset_filena
to_lower_utf8, /* to_lower */
to_upper_utf8, /* to_upper */
to_upper_utf8, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -4885,20 +4918,26 @@ my_wc_mb_utf8mb4_no_range(CHARSET_INFO *
static inline void
-my_tolower_utf8mb4(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_tolower_utf8mb4(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- int page= *wc >> 8;
- if (page < 256 && uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].tolower;
+ if (*wc <= uni_plane->maxchar)
+ {
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8)]))
+ *wc= page[*wc & 0xFF].tolower;
+ }
}
static inline void
-my_toupper_utf8mb4(MY_UNICASE_INFO * const* uni_plane, my_wc_t *wc)
+my_toupper_utf8mb4(MY_UNICASE_INFO *uni_plane, my_wc_t *wc)
{
- int page= *wc >> 8;
- if (page < 256 && uni_plane[page])
- *wc= uni_plane[page][*wc & 0xFF].toupper;
+ if (*wc <= uni_plane->maxchar)
+ {
+ MY_UNICASE_CHARACTER *page;
+ if ((page= uni_plane->page[(*wc >> 8)]))
+ *wc= page[*wc & 0xFF].toupper;
+ }
}
@@ -4909,7 +4948,7 @@ my_caseup_utf8mb4(CHARSET_INFO *cs, char
my_wc_t wc;
int srcres, dstres;
char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src != dst || cs->caseup_multiply == 1);
while ((src < srcend) &&
@@ -4941,7 +4980,7 @@ my_hash_sort_utf8mb4(CHARSET_INFO *cs, c
my_wc_t wc;
int res;
const uchar *e= s + slen;
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
/*
Remove end space. We do this to be able to compare
@@ -4952,7 +4991,7 @@ my_hash_sort_utf8mb4(CHARSET_INFO *cs, c
while ((res= my_mb_wc_utf8mb4(cs, &wc, (uchar*) s, (uchar*) e)) > 0)
{
- my_tosort_unicode(uni_plane, &wc);
+ my_tosort_unicode(uni_plane, &wc, cs->state);
my_hash_add(n1, n2, (uint) (wc & 0xFF));
my_hash_add(n1, n2, (uint) (wc >> 8) & 0xFF);
if (wc > 0xFFFF)
@@ -4977,7 +5016,7 @@ my_caseup_str_utf8mb4(CHARSET_INFO *cs,
my_wc_t wc;
int srcres, dstres;
char *dst= src, *dst0= src;
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(cs->caseup_multiply == 1);
while (*src &&
@@ -5002,7 +5041,7 @@ my_casedn_utf8mb4(CHARSET_INFO *cs,
my_wc_t wc;
int srcres, dstres;
char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(src != dst || cs->casedn_multiply == 1);
while ((src < srcend) &&
@@ -5025,7 +5064,7 @@ my_casedn_str_utf8mb4(CHARSET_INFO *cs,
my_wc_t wc;
int srcres, dstres;
char *dst= src, *dst0= src;
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
DBUG_ASSERT(cs->casedn_multiply == 1);
while (*src &&
@@ -5067,7 +5106,7 @@ my_strnncoll_utf8mb4(CHARSET_INFO *cs,
my_wc_t s_wc,t_wc;
const uchar *se= s + slen;
const uchar *te= t + tlen;
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
LINT_INIT(s_wc);
LINT_INIT(t_wc);
@@ -5082,9 +5121,9 @@ my_strnncoll_utf8mb4(CHARSET_INFO *cs,
return bincmp_utf8mb4(s, se, t, te);
}
- my_tosort_unicode(uni_plane, &s_wc);
- my_tosort_unicode(uni_plane, &t_wc);
-
+ my_tosort_unicode(uni_plane, &s_wc, cs->state);
+ my_tosort_unicode(uni_plane, &t_wc, cs->state);
+
if ( s_wc != t_wc )
{
return s_wc > t_wc ? 1 : -1;
@@ -5134,7 +5173,7 @@ my_strnncollsp_utf8mb4(CHARSET_INFO *cs,
int res;
my_wc_t s_wc, t_wc;
const uchar *se= s + slen, *te= t + tlen;
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
LINT_INIT(s_wc);
LINT_INIT(t_wc);
@@ -5153,8 +5192,8 @@ my_strnncollsp_utf8mb4(CHARSET_INFO *cs,
return bincmp_utf8mb4(s, se, t, te);
}
- my_tosort_unicode(uni_plane, &s_wc);
- my_tosort_unicode(uni_plane, &t_wc);
+ my_tosort_unicode(uni_plane, &s_wc, cs->state);
+ my_tosort_unicode(uni_plane, &t_wc, cs->state);
if ( s_wc != t_wc )
{
@@ -5218,7 +5257,7 @@ my_strnncollsp_utf8mb4(CHARSET_INFO *cs,
static int
my_strcasecmp_utf8mb4(CHARSET_INFO *cs, const char *s, const char *t)
{
- MY_UNICASE_INFO * const* uni_plane= cs->caseinfo;
+ MY_UNICASE_INFO *uni_plane= cs->caseinfo;
while (s[0] && t[0])
{
my_wc_t s_wc,t_wc;
@@ -5397,11 +5436,10 @@ struct charset_info_st my_charset_utf8mb
to_lower_utf8mb4, /* to_lower */
to_upper_utf8mb4, /* to_upper */
to_upper_utf8mb4, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
@@ -5430,11 +5468,10 @@ struct charset_info_st my_charset_utf8mb
to_lower_utf8mb4, /* to_lower */
to_upper_utf8mb4, /* to_upper */
NULL, /* sort_order */
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
NULL, /* tab_to_uni */
NULL, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default,/* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
1, /* strxfrm_multiply */
=== modified file 'strings/ctype-win1250ch.c'
--- strings/ctype-win1250ch.c 2012-01-13 14:50:02 +0000
+++ strings/ctype-win1250ch.c 2013-08-29 09:42:41 +0000
@@ -690,11 +690,10 @@ struct charset_info_st my_charset_cp1250
to_lower_win1250ch,
to_upper_win1250ch,
sort_order_win1250ch,
- NULL, /* contractions */
- NULL, /* sort_order_big*/
+ NULL, /* uca */
tab_cp1250_uni, /* tab_to_uni */
idx_uni_cp1250, /* tab_from_uni */
- my_unicase_default, /* caseinfo */
+ &my_unicase_default, /* caseinfo */
NULL, /* state_map */
NULL, /* ident_map */
2, /* strxfrm_multiply */
=== modified file 'strings/ctype.c'
--- strings/ctype.c 2013-08-07 15:40:25 +0000
+++ strings/ctype.c 2013-08-29 09:52:49 +0000
@@ -38,6 +38,18 @@
*/
+
+/*
+ Avoid using my_snprintf
+ We cannot use my_snprintf() here, because ctype.o is
+ used to build conf_to_src, which must require minimun
+ dependency.
+*/
+
+#undef my_snprinf
+#define my_snprintf "We cannot use my_snprintf in this file"
+
+
int (*my_string_stack_guard)(int)= NULL;
static char *mstr(char *str,const char *src,size_t l1,size_t l2)
@@ -71,11 +83,75 @@ struct my_cs_file_section_st
#define _CS_PRIMARY_ID 15
#define _CS_BINARY_ID 16
#define _CS_CSDESCRIPT 17
-#define _CS_RESET 18
-#define _CS_DIFF1 19
-#define _CS_DIFF2 20
-#define _CS_DIFF3 21
-#define _CS_IDENTICAL 22
+
+
+/* Special purpose commands */
+#define _CS_UCA_VERSION 100
+#define _CS_CL_SUPPRESS_CONTRACTIONS 101
+#define _CS_CL_OPTIMIZE 102
+#define _CS_CL_SHIFT_AFTER_METHOD 103
+
+
+/* Collation Settings */
+#define _CS_ST_SETTINGS 200
+#define _CS_ST_STRENGTH 201
+#define _CS_ST_ALTERNATE 202
+#define _CS_ST_BACKWARDS 203
+#define _CS_ST_NORMALIZATION 204
+#define _CS_ST_CASE_LEVEL 205
+#define _CS_ST_CASE_FIRST 206
+#define _CS_ST_HIRAGANA_QUATERNARY 207
+#define _CS_ST_NUMERIC 208
+#define _CS_ST_VARIABLE_TOP 209
+#define _CS_ST_MATCH_BOUNDARIES 210
+#define _CS_ST_MATCH_STYLE 211
+
+
+/* Rules */
+#define _CS_RULES 300
+#define _CS_RESET 301
+#define _CS_DIFF1 302
+#define _CS_DIFF2 303
+#define _CS_DIFF3 304
+#define _CS_DIFF4 305
+#define _CS_IDENTICAL 306
+
+/* Rules: Expansions */
+#define _CS_EXP_X 320
+#define _CS_EXP_EXTEND 321
+#define _CS_EXP_DIFF1 322
+#define _CS_EXP_DIFF2 323
+#define _CS_EXP_DIFF3 324
+#define _CS_EXP_DIFF4 325
+#define _CS_EXP_IDENTICAL 326
+
+/* Rules: Abbreviating Ordering Specifications */
+#define _CS_A_DIFF1 351
+#define _CS_A_DIFF2 352
+#define _CS_A_DIFF3 353
+#define _CS_A_DIFF4 354
+#define _CS_A_IDENTICAL 355
+
+/* Rules: previous context */
+#define _CS_CONTEXT 370
+
+/* Rules: Placing Characters Before Others*/
+#define _CS_RESET_BEFORE 380
+
+/* Rules: Logical Reset Positions */
+#define _CS_RESET_FIRST_PRIMARY_IGNORABLE 401
+#define _CS_RESET_LAST_PRIMARY_IGNORABLE 402
+#define _CS_RESET_FIRST_SECONDARY_IGNORABLE 403
+#define _CS_RESET_LAST_SECONDARY_IGNORABLE 404
+#define _CS_RESET_FIRST_TERTIARY_IGNORABLE 405
+#define _CS_RESET_LAST_TERTIARY_IGNORABLE 406
+#define _CS_RESET_FIRST_TRAILING 407
+#define _CS_RESET_LAST_TRAILING 408
+#define _CS_RESET_FIRST_VARIABLE 409
+#define _CS_RESET_LAST_VARIABLE 410
+#define _CS_RESET_FIRST_NON_IGNORABLE 411
+#define _CS_RESET_LAST_NON_IGNORABLE 412
+
static const struct my_cs_file_section_st sec[] =
@@ -85,6 +161,8 @@ static const struct my_cs_file_section_s
{_CS_MISC, "xml/encoding"},
{_CS_MISC, "charsets"},
{_CS_MISC, "charsets/max-id"},
+ {_CS_MISC, "charsets/copyright"},
+ {_CS_MISC, "charsets/description"},
{_CS_CHARSET, "charsets/charset"},
{_CS_PRIMARY_ID, "charsets/charset/primary-id"},
{_CS_BINARY_ID, "charsets/charset/binary-id"},
@@ -106,11 +184,72 @@ static const struct my_cs_file_section_s
{_CS_ORDER, "charsets/charset/collation/order"},
{_CS_FLAG, "charsets/charset/collation/flag"},
{_CS_COLLMAP, "charsets/charset/collation/map"},
- {_CS_RESET, "charsets/charset/collation/rules/reset"},
- {_CS_DIFF1, "charsets/charset/collation/rules/p"},
- {_CS_DIFF2, "charsets/charset/collation/rules/s"},
- {_CS_DIFF3, "charsets/charset/collation/rules/t"},
- {_CS_IDENTICAL, "charsets/charset/collation/rules/i"},
+
+ /* Special purpose commands */
+ {_CS_UCA_VERSION, "charsets/charset/collation/version"},
+ {_CS_CL_SUPPRESS_CONTRACTIONS, "charsets/charset/collation/suppress_contractions"},
+ {_CS_CL_OPTIMIZE, "charsets/charset/collation/optimize"},
+ {_CS_CL_SHIFT_AFTER_METHOD, "charsets/charset/collation/shift-after-method"},
+
+ /* Collation Settings */
+ {_CS_ST_SETTINGS, "charsets/charset/collation/settings"},
+ {_CS_ST_STRENGTH, "charsets/charset/collation/settings/strength"},
+ {_CS_ST_ALTERNATE, "charsets/charset/collation/settings/alternate"},
+ {_CS_ST_BACKWARDS, "charsets/charset/collation/settings/backwards"},
+ {_CS_ST_NORMALIZATION, "charsets/charset/collation/settings/normalization"},
+ {_CS_ST_CASE_LEVEL, "charsets/charset/collation/settings/caseLevel"},
+ {_CS_ST_CASE_FIRST, "charsets/charset/collation/settings/caseFirst"},
+ {_CS_ST_HIRAGANA_QUATERNARY, "charsets/charset/collation/settings/hiraganaQuaternary"},
+ {_CS_ST_NUMERIC, "charsets/charset/collation/settings/numeric"},
+ {_CS_ST_VARIABLE_TOP, "charsets/charset/collation/settings/variableTop"},
+ {_CS_ST_MATCH_BOUNDARIES, "charsets/charset/collation/settings/match-boundaries"},
+ {_CS_ST_MATCH_STYLE, "charsets/charset/collation/settings/match-style"},
+
+ /* Rules */
+ {_CS_RULES, "charsets/charset/collation/rules"},
+ {_CS_RESET, "charsets/charset/collation/rules/reset"},
+ {_CS_DIFF1, "charsets/charset/collation/rules/p"},
+ {_CS_DIFF2, "charsets/charset/collation/rules/s"},
+ {_CS_DIFF3, "charsets/charset/collation/rules/t"},
+ {_CS_DIFF4, "charsets/charset/collation/rules/q"},
+ {_CS_IDENTICAL, "charsets/charset/collation/rules/i"},
+
+ /* Rules: expansions */
+ {_CS_EXP_X, "charsets/charset/collation/rules/x"},
+ {_CS_EXP_EXTEND, "charsets/charset/collation/rules/x/extend"},
+ {_CS_EXP_DIFF1, "charsets/charset/collation/rules/x/p"},
+ {_CS_EXP_DIFF2, "charsets/charset/collation/rules/x/s"},
+ {_CS_EXP_DIFF3, "charsets/charset/collation/rules/x/t"},
+ {_CS_EXP_DIFF4, "charsets/charset/collation/rules/x/q"},
+ {_CS_EXP_IDENTICAL, "charsets/charset/collation/rules/x/i"},
+
+ /* Rules: previous context */
+ {_CS_CONTEXT, "charsets/charset/collation/rules/x/context"},
+
+ /* Rules: Abbreviating Ordering Specifications */
+ {_CS_A_DIFF1, "charsets/charset/collation/rules/pc"},
+ {_CS_A_DIFF2, "charsets/charset/collation/rules/sc"},
+ {_CS_A_DIFF3, "charsets/charset/collation/rules/tc"},
+ {_CS_A_DIFF4, "charsets/charset/collation/rules/qc"},
+ {_CS_A_IDENTICAL, "charsets/charset/collation/rules/ic"},
+
+ /* Rules: Placing Characters Before Others*/
+ {_CS_RESET_BEFORE, "charsets/charset/collation/rules/reset/before"},
+
+ /* Rules: Logical Reset Positions */
+ {_CS_RESET_FIRST_NON_IGNORABLE, "charsets/charset/collation/rules/reset/first_non_ignorable"},
+ {_CS_RESET_LAST_NON_IGNORABLE, "charsets/charset/collation/rules/reset/last_non_ignorable"},
+ {_CS_RESET_FIRST_PRIMARY_IGNORABLE, "charsets/charset/collation/rules/reset/first_primary_ignorable"},
+ {_CS_RESET_LAST_PRIMARY_IGNORABLE, "charsets/charset/collation/rules/reset/last_primary_ignorable"},
+ {_CS_RESET_FIRST_SECONDARY_IGNORABLE, "charsets/charset/collation/rules/reset/first_secondary_ignorable"},
+ {_CS_RESET_LAST_SECONDARY_IGNORABLE, "charsets/charset/collation/rules/reset/last_secondary_ignorable"},
+ {_CS_RESET_FIRST_TERTIARY_IGNORABLE, "charsets/charset/collation/rules/reset/first_tertiary_ignorable"},
+ {_CS_RESET_LAST_TERTIARY_IGNORABLE, "charsets/charset/collation/rules/reset/last_tertiary_ignorable"},
+ {_CS_RESET_FIRST_TRAILING, "charsets/charset/collation/rules/reset/first_trailing"},
+ {_CS_RESET_LAST_TRAILING, "charsets/charset/collation/rules/reset/last_trailing"},
+ {_CS_RESET_FIRST_VARIABLE, "charsets/charset/collation/rules/reset/first_variable"},
+ {_CS_RESET_LAST_VARIABLE, "charsets/charset/collation/rules/reset/last_variable"},
+
{0, NULL}
};
@@ -120,14 +259,16 @@ static const struct my_cs_file_section_s
const struct my_cs_file_section_st *s;
for (s=sec; s->str; s++)
{
- if (!strncmp(attr,s->str,len))
+ if (!strncmp(attr, s->str, len) && s->str[len] == 0)
return s;
}
return NULL;
}
#define MY_CS_CSDESCR_SIZE 64
-#define MY_CS_TAILORING_SIZE 1024
+#define MY_CS_TAILORING_SIZE 32*1024
+#define MY_CS_UCA_VERSION_SIZE 64
+#define MY_CS_CONTEXT_SIZE 64
typedef struct my_cs_file_info
{
@@ -139,13 +280,60 @@ typedef struct my_cs_file_info
uchar sort_order[MY_CS_SORT_ORDER_TABLE_SIZE];
uint16 tab_to_uni[MY_CS_TO_UNI_TABLE_SIZE];
char comment[MY_CS_CSDESCR_SIZE];
- char tailoring[MY_CS_TAILORING_SIZE];
+ char *tailoring;
size_t tailoring_length;
+ size_t tailoring_alloced_length;
+ char context[MY_CS_CONTEXT_SIZE];
struct charset_info_st cs;
- int (*add_collation)(struct charset_info_st *cs);
-} MY_CHARSET_LOADER;
+ MY_CHARSET_LOADER *loader;
+} MY_CHARSET_FILE;
+
+
+static void
+my_charset_file_reset_charset(MY_CHARSET_FILE *i)
+{
+ memset(&i->cs, 0, sizeof(i->cs));
+}
+
+
+static void
+my_charset_file_reset_collation(MY_CHARSET_FILE *i)
+{
+ i->tailoring_length= 0;
+ i->context[0]= '\0';
+}
+
+
+static void
+my_charset_file_init(MY_CHARSET_FILE *i)
+{
+ my_charset_file_reset_charset(i);
+ my_charset_file_reset_collation(i);
+ i->tailoring= NULL;
+ i->tailoring_alloced_length= 0;
+}
+
+
+static void
+my_charset_file_free(MY_CHARSET_FILE *i)
+{
+ i->loader->free(i->tailoring);
+}
+static int
+my_charset_file_tailoring_realloc(MY_CHARSET_FILE *i, size_t newlen)
+{
+ if (i->tailoring_alloced_length > newlen ||
+ (i->tailoring= i->loader->realloc(i->tailoring,
+ (i->tailoring_alloced_length=
+ (newlen + 32*1024)))))
+ {
+ return MY_XML_OK;
+ }
+ return MY_XML_ERROR;
+}
+
static int fill_uchar(uchar *a,uint size,const char *str, size_t len)
{
@@ -182,17 +370,119 @@ static int fill_uint16(uint16 *a,uint si
}
+
+
+static int
+tailoring_append(MY_XML_PARSER *st,
+ const char *fmt, size_t len, const char *attr)
+{
+ struct my_cs_file_info *i= (struct my_cs_file_info *) st->user_data;
+ size_t newlen= i->tailoring_length + len + 64; /* 64 for format */
+ if (MY_XML_OK == my_charset_file_tailoring_realloc(i, newlen))
+ {
+ char *dst= i->tailoring + i->tailoring_length;
+ sprintf(dst, fmt, (int) len, attr);
+ i->tailoring_length+= strlen(dst);
+ return MY_XML_OK;
+ }
+ return MY_XML_ERROR;
+}
+
+
+static int
+tailoring_append2(MY_XML_PARSER *st,
+ const char *fmt,
+ size_t len1, const char *attr1,
+ size_t len2, const char *attr2)
+{
+ struct my_cs_file_info *i= (struct my_cs_file_info *) st->user_data;
+ size_t newlen= i->tailoring_length + len1 + len2 + 64; /* 64 for format */
+ if (MY_XML_OK == my_charset_file_tailoring_realloc(i, newlen))
+ {
+ char *dst= i->tailoring + i->tailoring_length;
+ sprintf(dst, fmt, (int) len1, attr1, (int) len2, attr2);
+ i->tailoring_length+= strlen(dst);
+ return MY_XML_OK;
+ }
+ return MY_XML_ERROR;
+}
+
+
+static size_t
+scan_one_character(const char *s, const char *e, my_wc_t *wc)
+{
+ CHARSET_INFO *cs= &my_charset_utf8_general_ci;
+ if (s >= e)
+ return 0;
+
+ /* Escape sequence: \uXXXX */
+ if (s[0] == '\\' && s + 2 < e && s[1] == 'u' && my_isxdigit(cs, s[2]))
+ {
+ size_t len= 3; /* We have at least one digit */
+ for (s+= 3; s < e && my_isxdigit(cs, s[0]); s++, len++)
+ {
+ }
+ wc[0]= 0;
+ return len;
+ }
+ else if (s[0] > 0) /* 7-bit character */
+ {
+ wc[0]= 0;
+ return 1;
+ }
+ else /* Non-escaped character */
+ {
+ int rc= cs->cset->mb_wc(cs, wc, (uchar *) s, (uchar *) e);
+ if (rc > 0)
+ return (size_t) rc;
+ }
+ return 0;
+}
+
+
+static int
+tailoring_append_abbreviation(MY_XML_PARSER *st,
+ const char *fmt, size_t len, const char *attr)
+{
+ size_t clen;
+ const char *attrend= attr + len;
+ my_wc_t wc;
+
+ for ( ; (clen= scan_one_character(attr, attrend, &wc)) > 0; attr+= clen)
+ {
+ DBUG_ASSERT(attr < attrend);
+ if (tailoring_append(st, fmt, clen, attr) != MY_XML_OK)
+ return MY_XML_ERROR;
+ }
+ return MY_XML_OK;
+}
+
+
static int cs_enter(MY_XML_PARSER *st,const char *attr, size_t len)
{
struct my_cs_file_info *i= (struct my_cs_file_info *)st->user_data;
const struct my_cs_file_section_st *s= cs_file_sec(attr,len);
+ int state= s ? s->state : 0;
- if ( s && (s->state == _CS_CHARSET))
- bzero(&i->cs,sizeof(i->cs));
-
- if (s && (s->state == _CS_COLLATION))
- i->tailoring_length= 0;
+ switch (state) {
+ case 0:
+ i->loader->reporter(WARNING_LEVEL, "Unknown LDML tag: '%.*s'", len, attr);
+ break;
+ case _CS_CHARSET:
+ my_charset_file_reset_charset(i);
+ break;
+
+ case _CS_COLLATION:
+ my_charset_file_reset_collation(i);
+ break;
+
+ case _CS_RESET:
+ return tailoring_append(st, " &", 0, NULL);
+
+ default:
+ break;
+ }
return MY_XML_OK;
}
@@ -206,8 +496,60 @@ static int cs_leave(MY_XML_PARSER *st,co
switch(state){
case _CS_COLLATION:
- rc= i->add_collation ? i->add_collation(&i->cs) : MY_XML_OK;
+ if (i->tailoring_length)
+ i->cs.tailoring= i->tailoring;
+ rc= i->loader->add_collation ? i->loader->add_collation(&i->cs) : MY_XML_OK;
+ break;
+
+ /* Rules: Logical Reset Positions */
+ case _CS_RESET_FIRST_NON_IGNORABLE:
+ rc= tailoring_append(st, "[first non-ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_LAST_NON_IGNORABLE:
+ rc= tailoring_append(st, "[last non-ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_FIRST_PRIMARY_IGNORABLE:
+ rc= tailoring_append(st, "[first primary ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_LAST_PRIMARY_IGNORABLE:
+ rc= tailoring_append(st, "[last primary ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_FIRST_SECONDARY_IGNORABLE:
+ rc= tailoring_append(st, "[first secondary ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_LAST_SECONDARY_IGNORABLE:
+ rc= tailoring_append(st, "[last secondary ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_FIRST_TERTIARY_IGNORABLE:
+ rc= tailoring_append(st, "[first tertiary ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_LAST_TERTIARY_IGNORABLE:
+ rc= tailoring_append(st, "[last tertiary ignorable]", 0, NULL);
+ break;
+
+ case _CS_RESET_FIRST_TRAILING:
+ rc= tailoring_append(st, "[first trailing]", 0, NULL);
break;
+
+ case _CS_RESET_LAST_TRAILING:
+ rc= tailoring_append(st, "[last trailing]", 0, NULL);
+ break;
+
+ case _CS_RESET_FIRST_VARIABLE:
+ rc= tailoring_append(st, "[first variable]", 0, NULL);
+ break;
+
+ case _CS_RESET_LAST_VARIABLE:
+ rc= tailoring_append(st, "[last variable]", 0, NULL);
+ break;
+
default:
rc=MY_XML_OK;
}
@@ -215,14 +557,40 @@ static int cs_leave(MY_XML_PARSER *st,co
}
+static const char *diff_fmt[5]=
+{
+ "<%.*s",
+ "<<%.*s",
+ "<<<%.*s",
+ "<<<<%.*s",
+ "=%.*s"
+};
+
+
+static const char *context_diff_fmt[5]=
+{
+ "<%.*s|%.*s",
+ "<<%.*s|%.*s",
+ "<<<%.*s|%.*s",
+ "<<<<%.*s|%.*s",
+ "=%.*s|%.*s"
+};
+
+
static int cs_value(MY_XML_PARSER *st,const char *attr, size_t len)
{
struct my_cs_file_info *i= (struct my_cs_file_info *)st->user_data;
const struct my_cs_file_section_st *s;
- int state= (int)((s= cs_file_sec(st->attr, strlen(st->attr))) ? s->state :
- 0);
-
+ int state= (int)((s= cs_file_sec(st->attr.start,
+ st->attr.end - st->attr.start)) ?
+ s->state : 0);
+ int rc= MY_XML_OK;
+
switch (state) {
+ case _CS_MISC:
+ case _CS_FAMILY:
+ case _CS_ORDER:
+ break;
case _CS_ID:
i->cs.number= strtol(attr,(char**)NULL,10);
break;
@@ -269,47 +637,185 @@ static int cs_value(MY_XML_PARSER *st,co
fill_uchar(i->ctype,MY_CS_CTYPE_TABLE_SIZE,attr,len);
i->cs.ctype=i->ctype;
break;
+
+ /* Special purpose commands */
+ case _CS_UCA_VERSION:
+ rc= tailoring_append(st, "[version %.*s]", len, attr);
+ break;
+
+ case _CS_CL_SUPPRESS_CONTRACTIONS:
+ rc= tailoring_append(st, "[suppress contractions %.*s]", len, attr);
+ break;
+
+ case _CS_CL_OPTIMIZE:
+ rc= tailoring_append(st, "[optimize %.*s]", len, attr);
+ break;
+
+ case _CS_CL_SHIFT_AFTER_METHOD:
+ rc= tailoring_append(st, "[shift-after-method %.*s]", len, attr);
+ break;
+
+ /* Collation Settings */
+ case _CS_ST_STRENGTH:
+ /* 1, 2, 3, 4, 5, or primary, secondary, tertiary, quaternary, identical */
+ rc= tailoring_append(st, "[strength %.*s]", len, attr);
+ break;
+
+ case _CS_ST_ALTERNATE:
+ /* non-ignorable, shifted */
+ rc= tailoring_append(st, "[alternate %.*s]", len, attr);
+ break;
+
+ case _CS_ST_BACKWARDS:
+ /* on, off, 2 */
+ rc= tailoring_append(st, "[backwards %.*s]", len, attr);
+ break;
+
+ case _CS_ST_NORMALIZATION:
+ /*
+ TODO for WL#896: check collations for normalization: vi.xml
+ We want precomposed characters work well at this point.
+ */
+ /* on, off */
+ rc= tailoring_append(st, "[normalization %.*s]", len, attr);
+ break;
+
+ case _CS_ST_CASE_LEVEL:
+ /* on, off */
+ rc= tailoring_append(st, "[caseLevel %.*s]", len, attr);
+ break;
+
+ case _CS_ST_CASE_FIRST:
+ /* upper, lower, off */
+ rc= tailoring_append(st, "[caseFirst %.*s]", len, attr);
+ break;
+
+ case _CS_ST_HIRAGANA_QUATERNARY:
+ /* on, off */
+ rc= tailoring_append(st, "[hiraganaQ %.*s]", len, attr);
+ break;
+
+ case _CS_ST_NUMERIC:
+ /* on, off */
+ rc= tailoring_append(st, "[numeric %.*s]", len, attr);
+ break;
+
+ case _CS_ST_VARIABLE_TOP:
+ /* TODO for WL#896: check value format */
+ rc= tailoring_append(st, "[variableTop %.*s]", len, attr);
+ break;
+
+ case _CS_ST_MATCH_BOUNDARIES:
+ /* none, whole-character, whole-word */
+ rc= tailoring_append(st, "[match-boundaries %.*s]", len, attr);
+ break;
+
+ case _CS_ST_MATCH_STYLE:
+ /* minimal, medial, maximal */
+ rc= tailoring_append(st, "[match-style %.*s]", len, attr);
+ break;
+
+
+ /* Rules */
case _CS_RESET:
+ rc= tailoring_append(st, "%.*s", len, attr);
+ break;
+
case _CS_DIFF1:
case _CS_DIFF2:
case _CS_DIFF3:
+ case _CS_DIFF4:
case _CS_IDENTICAL:
+ rc= tailoring_append(st, diff_fmt[state - _CS_DIFF1], len, attr);
+ break;
+
+
+ /* Rules: Expansion */
+ case _CS_EXP_EXTEND:
+ rc= tailoring_append(st, " / %.*s", len, attr);
+ break;
+
+ case _CS_EXP_DIFF1:
+ case _CS_EXP_DIFF2:
+ case _CS_EXP_DIFF3:
+ case _CS_EXP_DIFF4:
+ case _CS_EXP_IDENTICAL:
+ if (i->context[0])
{
- /*
- Convert collation description from
- Locale Data Markup Language (LDML)
- into ICU Collation Customization expression.
- */
- char arg[16];
- const char *cmd[]= {"&","<","<<","<<<","="};
- i->cs.tailoring= i->tailoring;
- mstr(arg,attr,len,sizeof(arg)-1);
- if (i->tailoring_length + 20 < sizeof(i->tailoring))
- {
- char *dst= i->tailoring_length + i->tailoring;
- i->tailoring_length+= sprintf(dst," %s %s",cmd[state-_CS_RESET],arg);
- }
+ rc= tailoring_append2(st, context_diff_fmt[state - _CS_EXP_DIFF1],
+ strlen(i->context), i->context, len, attr);
+ i->context[0]= 0;
}
+ else
+ rc= tailoring_append(st, diff_fmt[state - _CS_EXP_DIFF1], len, attr);
+ break;
+
+ /* Rules: Context */
+ case _CS_CONTEXT:
+ if (len < sizeof(i->context) + 1)
+ {
+ memcpy(i->context, attr, len);
+ i->context[len]= '\0';
+ }
+ break;
+
+ /* Rules: Abbreviating Ordering Specifications */
+ case _CS_A_DIFF1:
+ case _CS_A_DIFF2:
+ case _CS_A_DIFF3:
+ case _CS_A_DIFF4:
+ case _CS_A_IDENTICAL:
+ rc= tailoring_append_abbreviation(st, diff_fmt[state - _CS_A_DIFF1], len, attr);
+ break;
+
+ /* Rules: Placing Characters Before Others */
+ case _CS_RESET_BEFORE:
+ /*
+ TODO for WL#896: Add this check into text customization parser:
+ It is an error if the strength of the before relation is not identical
+ to the relation after the reset. We'll need this for WL#896.
+ */
+ rc= tailoring_append(st, "[before %.*s]", len, attr);
+ break;
+
+
+ default:
+ break;
}
- return MY_XML_OK;
+
+ return rc;
}
-my_bool my_parse_charset_xml(const char *buf, size_t len,
- int (*add_collation)(struct charset_info_st *cs))
+my_bool
+my_parse_charset_xml(MY_CHARSET_LOADER *loader, const char *buf, size_t len)
{
MY_XML_PARSER p;
- struct my_cs_file_info i;
+ struct my_cs_file_info info;
my_bool rc;
+ my_charset_file_init(&info);
my_xml_parser_create(&p);
my_xml_set_enter_handler(&p,cs_enter);
my_xml_set_value_handler(&p,cs_value);
my_xml_set_leave_handler(&p,cs_leave);
- i.add_collation= add_collation;
- my_xml_set_user_data(&p,(void*)&i);
+ info.loader= loader;
+ my_xml_set_user_data(&p, (void *) &info);
rc= (my_xml_parse(&p,buf,len) == MY_XML_OK) ? FALSE : TRUE;
my_xml_parser_free(&p);
+ my_charset_file_free(&info);
+ if (rc != MY_XML_OK)
+ {
+ const char *errstr= my_xml_error_string(&p);
+ if (sizeof(loader->error) > 32 + strlen(errstr))
+ {
+ /* We cannot use my_snprintf() here. See previous comment. */
+ sprintf(loader->error, "at line %d pos %d: %s",
+ my_xml_error_lineno(&p)+1,
+ (int) my_xml_error_pos(&p),
+ my_xml_error_string(&p));
+ }
+ }
return rc;
}
=== modified file 'strings/str_alloc.c'
--- strings/str_alloc.c 2013-05-07 11:05:09 +0000
+++ strings/str_alloc.c 2013-08-29 10:02:49 +0000
@@ -31,5 +31,11 @@ static void my_str_free_default(void *pt
free(ptr);
}
+void *my_str_realloc_default(void *ptr, size_t size)
+{
+ return realloc(ptr, size);
+}
+
void *(*my_str_malloc)(size_t)= &my_str_malloc_default;
void (*my_str_free)(void *)= &my_str_free_default;
+void *(*my_str_realloc)(void *, size_t)= &my_str_realloc_default;
=== modified file 'strings/xml.c'
--- strings/xml.c 2013-07-16 17:09:54 +0000
+++ strings/xml.c 2013-08-29 10:00:34 +0000
@@ -15,6 +15,7 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
#include "strings_def.h"
+#include "m_string.h"
#include "my_xml.h"
@@ -207,25 +208,71 @@ static int my_xml_value(MY_XML_PARSER *s
}
-static int my_xml_enter(MY_XML_PARSER *st, const char *str, size_t len)
+/**
+ Ensure the attr buffer is wide enough to hold the new value
+
+ Expand and/or allocate dynamic buffer as needed to hold the concatenated
+ path and the terminating zero.
+
+ @attr st the parser instance
+ @attr len the length of the attribute to be added
+ @return state
+ @retval 1 failed
+ @retval 0 success
+*/
+static int my_xml_attr_ensure_space(MY_XML_PARSER *st, size_t len)
{
- if ((size_t) (st->attrend-st->attr+len+1) > sizeof(st->attr))
+ size_t ofs= st->attr.end - st->attr.start;
+ len++; // Add terminating zero.
+ if (ofs + len > st->attr.buffer_size)
{
- sprintf(st->errstr,"To deep XML");
- return MY_XML_ERROR;
+ st->attr.buffer_size= (SIZE_T_MAX - len) / 2 > st->attr.buffer_size ?
+ st->attr.buffer_size * 2 + len : SIZE_T_MAX;
+
+ if (!st->attr.buffer)
+ {
+ st->attr.buffer= (char *) my_str_malloc(st->attr.buffer_size);
+ if (st->attr.buffer)
+ memcpy(st->attr.buffer, st->attr.static_buffer, ofs + 1 /*term. zero */);
+ }
+ else
+ st->attr.buffer= (char *) my_str_realloc(st->attr.buffer,
+ st->attr.buffer_size);
+ st->attr.start= st->attr.buffer;
+ st->attr.end= st->attr.start + ofs;
+
+ return st->attr.buffer ? MY_XML_OK : MY_XML_ERROR;
}
- if (st->attrend > st->attr)
+ return MY_XML_OK;
+}
+
+
+/** rewind the attr buffer to initial state */
+static void my_xml_attr_rewind(MY_XML_PARSER *p)
+{
+ /* keep the buffer already allocated */
+ p->attr.end= p->attr.start;
+}
+
+
+static int my_xml_enter(MY_XML_PARSER *st, const char *str, size_t len)
+{
+ if (my_xml_attr_ensure_space(st, len + 1 /* the separator char */))
+ return MY_XML_ERROR;
+
+ if (st->attr.end > st->attr.start)
{
- st->attrend[0]= '/';
- st->attrend++;
+ st->attr.end[0]= '/';
+ st->attr.end++;
}
- memcpy(st->attrend,str,len);
- st->attrend+=len;
- st->attrend[0]='\0';
+ memcpy(st->attr.end, str, len);
+ st->attr.end+= len;
+ st->attr.end[0]= '\0';
if (st->flags & MY_XML_FLAG_RELATIVE_NAMES)
return st->enter ? st->enter(st, str, len) : MY_XML_OK;
else
- return st->enter ? st->enter(st,st->attr,st->attrend-st->attr) : MY_XML_OK;
+ return st->enter ?
+ st->enter(st, st->attr.start, st->attr.end - st->attr.start) : MY_XML_OK;
}
@@ -246,8 +293,8 @@ static int my_xml_leave(MY_XML_PARSER *p
int rc;
/* Find previous '/' or beginning */
- for (e=p->attrend; (e>p->attr) && (e[0] != '/') ; e--);
- glen = (size_t) ((e[0] == '/') ? (p->attrend-e-1) : p->attrend-e);
+ for (e= p->attr.end; (e > p->attr.start) && (e[0] != '/') ; e--);
+ glen= (size_t) ((e[0] == '/') ? (p->attr.end - e - 1) : p->attr.end - e);
if (str && (slen != glen))
{
@@ -265,11 +312,12 @@ static int my_xml_leave(MY_XML_PARSER *p
if (p->flags & MY_XML_FLAG_RELATIVE_NAMES)
rc= p->leave_xml ? p->leave_xml(p, str, slen) : MY_XML_OK;
else
- rc= (p->leave_xml ? p->leave_xml(p,p->attr,p->attrend-p->attr) :
+ rc= (p->leave_xml ?
+ p->leave_xml(p, p->attr.start, p->attr.end - p->attr.start) :
MY_XML_OK);
*e='\0';
- p->attrend=e;
+ p->attr.end= e;
return rc;
}
@@ -277,7 +325,9 @@ static int my_xml_leave(MY_XML_PARSER *p
int my_xml_parse(MY_XML_PARSER *p,const char *str, size_t len)
{
- p->attrend=p->attr;
+
+ my_xml_attr_rewind(p);
+
p->beg=str;
p->cur=str;
p->end=str+len;
@@ -432,7 +482,7 @@ int my_xml_parse(MY_XML_PARSER *p,const
}
}
- if (p->attr[0])
+ if (p->attr.start[0])
{
sprintf(p->errstr,"unexpected END-OF-INPUT");
return MY_XML_ERROR;
@@ -443,12 +493,22 @@ int my_xml_parse(MY_XML_PARSER *p,const
void my_xml_parser_create(MY_XML_PARSER *p)
{
- bzero((void*)p,sizeof(p[0]));
+ memset(p, 0, sizeof(p[0]));
+ /*
+ Use static buffer while it's sufficient.
+ */
+ p->attr.start= p->attr.end= p->attr.static_buffer;
+ p->attr.buffer_size= sizeof(p->attr.static_buffer);
}
-void my_xml_parser_free(MY_XML_PARSER *p __attribute__((unused)))
+void my_xml_parser_free(MY_XML_PARSER *p)
{
+ if (p->attr.buffer)
+ {
+ my_str_free(p->attr.buffer);
+ p->attr.buffer= NULL;
+ }
}
Follow ups
References