PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.0.5
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.0.5
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / back / Core / AcymPunycode.php

AcymPunycode.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 11.0.5, at back/Core/AcymPunycode.php

2,563 lines 78.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace AcyMailing\Core;
4
5 class AcymPunycode
6 {
7 protected $_punycode_prefix = 'xn--';
8 protected $_max_ucs = 0x10FFFF;
9 protected $_base = 36;
10 protected $_tmin = 1;
11 protected $_tmax = 26;
12 protected $_skew = 38;
13 protected $_damp = 700;
14 protected $_initial_bias = 72;
15 protected $_initial_n = 0x80;
16 protected $_sbase = 0xAC00;
17 protected $_lbase = 0x1100;
18 protected $_vbase = 0x1161;
19 protected $_tbase = 0x11A7;
20 protected $_lcount = 19;
21 protected $_vcount = 21;
22 protected $_tcount = 28;
23 protected $_ncount = 588;
24 protected $_scount = 11172;
25
26 protected static $_mb_string_overload = null;
27
28 protected $_api_encoding = 'utf8';
29 protected $_allow_overlong = false;
30 protected $_strict_mode = false;
31 protected $_idn_version = 2003;
32
33 public function __construct()
34 {
35 if (self::$_mb_string_overload === null) {
36 self::$_mb_string_overload = (extension_loaded('mbstring') && (ini_get('mbstring.func_overload') & 0x02) === 0x02);
37 }
38 }
39
40 protected function _error($error = '')
41 {
42 acym_enqueueMessage($error);
43 }
44
45 protected static function byteLength($string)
46 {
47 if (self::$_mb_string_overload) {
48 return mb_strlen($string, '8bit');
49 }
50
51 return strlen((string)$string);
52 }
53
54 protected function _decode_digit($cp)
55 {
56 $cp = ord($cp);
57
58 return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
59 }
60
61 protected function _ucs4_to_ucs4_string($input)
62 {
63 $output = '';
64 foreach ($input as $v) {
65 $output .= chr(($v >> 24) & 255).chr(($v >> 16) & 255).chr(($v >> 8) & 255).chr($v & 255);
66 }
67
68 return $output;
69 }
70
71 protected function _utf8_to_ucs4($input)
72 {
73 $output = [];
74 $out_len = 0;
75 $inp_len = self::byteLength($input);
76 $mode = 'next';
77 $test = 'none';
78 for ($k = 0; $k < $inp_len; ++$k) {
79 $v = ord($input[$k]); // Extract byte from input string
80 if ($v < 128) { // We found an ASCII char - put into stirng as is
81 $output[$out_len] = $v;
82 ++$out_len;
83 if ('add' == $mode) {
84 return false;
85 }
86 continue;
87 }
88 if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
89 $start_byte = $v;
90 $mode = 'add';
91 $test = 'range';
92 if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
93 $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
94 $v = ($v - 192) << 6;
95 } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
96 $next_byte = 1;
97 $v = ($v - 224) << 12;
98 } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
99 $next_byte = 2;
100 $v = ($v - 240) << 18;
101 } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
102 $next_byte = 3;
103 $v = ($v - 248) << 24;
104 } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
105 $next_byte = 4;
106 $v = ($v - 252) << 30;
107 } else {
108 return false;
109 }
110 if ('add' == $mode) {
111 $output[$out_len] = (int)$v;
112 ++$out_len;
113 continue;
114 }
115 }
116 if ('add' == $mode) {
117 if (!$this->_allow_overlong && $test == 'range') {
118 $test = 'none';
119 if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
120 return false;
121 }
122 }
123 if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
124 $v = ($v - 128) << ($next_byte * 6);
125 $output[($out_len - 1)] += $v;
126 --$next_byte;
127 } else {
128 return false;
129 }
130 if ($next_byte < 0) {
131 $mode = 'next';
132 }
133 }
134 } // for
135
136 return $output;
137 }
138
139 public function emailToUTF8($input, $one_time_encoding = false)
140 {
141 // Optionally set
142 if ($one_time_encoding) {
143 switch ($one_time_encoding) {
144 case 'utf8':
145 case 'ucs4_string':
146 case 'ucs4_array':
147 break;
148 default:
149 $this->_error('Unknown encoding '.$one_time_encoding);
150
151 return false;
152 }
153 }
154 $input = trim($input);
155
156 if (strpos($input, '@')) { // Maybe it is an email address
157 // No no in strict mode
158 if ($this->_strict_mode) {
159 return false;
160 }
161 [$email_pref, $input] = explode('@', $input, 2);
162 $arr = explode('.', $input);
163 foreach ($arr as $k => $v) {
164 if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
165 $conv = $this->_decode($v);
166 if ($conv) $arr[$k] = $conv;
167 }
168 }
169 $input = join('.', $arr);
170 $arr = explode('.', $email_pref);
171 foreach ($arr as $k => $v) {
172 if (preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $v)) {
173 $conv = $this->_decode($v);
174 if ($conv) $arr[$k] = $conv;
175 }
176 }
177 $email_pref = join('.', $arr);
178 $return = $email_pref.'@'.$input;
179 } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
180 if ($this->_strict_mode) {
181 return false;
182 }
183 $parsed = acym_parseUrl($input);
184 if (isset($parsed['host'])) {
185 $arr = explode('.', $parsed['host']);
186 foreach ($arr as $k => $v) {
187 $conv = $this->_decode($v);
188 if ($conv) $arr[$k] = $conv;
189 }
190 $parsed['host'] = join('.', $arr);
191 $return = (empty($parsed['scheme'])
192 ? ''
193 : $parsed['scheme'].(strtolower(
194 $parsed['scheme']
195 ) == 'mailto' ? ':' : '://')).(empty($parsed['user'])
196 ? ''
197 : $parsed['user'].(empty($parsed['pass']) ? ''
198 : ':'.$parsed['pass']).'@').$parsed['host'].(empty($parsed['port']) ? '' : ':'.$parsed['port']).(empty($parsed['path']) ? ''
199 : $parsed['path']).(empty($parsed['query']) ? '' : '?'.$parsed['query']).(empty($parsed['fragment']) ? '' : '#'.$parsed['fragment']);
200 } else {
201 $arr = explode('.', $input);
202 foreach ($arr as $k => $v) {
203 $conv = $this->_decode($v);
204 $arr[$k] = ($conv) ? $conv : $v;
205 }
206 $return = join('.', $arr);
207 }
208 } else {
209 $return = $this->_decode($input);
210 if (!$return) $return = $input;
211 }
212 switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
213 case 'utf8':
214 return $return;
215 break;
216 case 'ucs4_string':
217 return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
218 break;
219 case 'ucs4_array':
220 return $this->_utf8_to_ucs4($return);
221 break;
222 default:
223 $this->_error('Unsupported output format');
224
225 return false;
226 }
227 }
228
229 protected function _decode($encoded)
230 {
231 $decoded = [];
232 if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) {
233 return false;
234 }
235 $encode_test = preg_replace('!^'.preg_quote($this->_punycode_prefix, '!').'!', '', $encoded);
236 if (!$encode_test) {
237 return false;
238 }
239 $delim_pos = strrpos($encoded, '-');
240 if ($delim_pos > self::byteLength($this->_punycode_prefix)) {
241 for ($k = self::byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) {
242 $decoded[] = ord($encoded[$k]);
243 }
244 }
245 $deco_len = count($decoded);
246 $enco_len = self::byteLength($encoded);
247
248 $is_first = true;
249 $bias = $this->_initial_bias;
250 $idx = 0;
251 $char = $this->_initial_n;
252
253 for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
254 for ($old_idx = $idx, $w = 1, $k = $this->_base; 1; $k += $this->_base) {
255 $digit = $this->_decode_digit($encoded[$enco_idx++]);
256 $idx += $digit * $w;
257 $t = ($k <= $bias) ? $this->_tmin : (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
258 if ($digit < $t) break;
259 $w = (int)($w * ($this->_base - $t));
260 }
261 $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
262 $is_first = false;
263 $char += (int)($idx / ($deco_len + 1));
264 $idx %= ($deco_len + 1);
265 if ($deco_len > 0) {
266 for ($i = $deco_len; $i > $idx; $i--) {
267 $decoded[$i] = $decoded[($i - 1)];
268 }
269 }
270 $decoded[$idx++] = $char;
271 }
272
273 return $this->_ucs4_to_utf8($decoded);
274 }
275
276 public function emailToPunycode($decoded, $one_time_encoding = false)
277 {
278 switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
279 case 'utf8':
280 $decoded = $this->_utf8_to_ucs4($decoded);
281 break;
282 case 'ucs4_string':
283 $decoded = $this->_ucs4_string_to_ucs4($decoded);
284 break;
285 case 'ucs4_array':
286 break;
287 default:
288 $this->_error('Unsupported input format: '.($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
289
290 return false;
291 }
292
293 if (empty($decoded)) return '';
294
295 $last_begin = 0;
296 $output = '';
297 foreach ($decoded as $k => $v) {
298 switch ($v) {
299 case 0x3002:
300 case 0xFF0E:
301 case 0xFF61:
302 $decoded[$k] = 0x2E;
303 // normal I guess
304 case 0x2E:
305 case 0x2F:
306 case 0x3A:
307 case 0x3F:
308 case 0x40:
309 if ($this->_strict_mode) {
310 return false;
311 } else {
312 if ($k) {
313 $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k) - $last_begin)));
314 if ($encoded) {
315 $output .= $encoded;
316 } else {
317 $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k) - $last_begin)));
318 }
319 $output .= chr($decoded[$k]);
320 }
321 $last_begin = $k + 1;
322 }
323 }
324 }
325 if ($last_begin) {
326 $inp_len = count($decoded);
327 $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len) - $last_begin)));
328 if ($encoded) {
329 $output .= $encoded;
330 } else {
331 $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len) - $last_begin)));
332 }
333
334 return $output;
335 } else {
336 if ($output = $this->_encode($decoded)) {
337 return $output;
338 } else {
339 return $this->_ucs4_to_utf8($decoded);
340 }
341 }
342 }
343
344 protected function _encode($decoded)
345 {
346 $extract = self::byteLength($this->_punycode_prefix);
347 $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
348 $check_deco = array_slice($decoded, 0, $extract);
349
350 if ($check_pref == $check_deco) return false;
351 $encodable = false;
352 foreach ($decoded as $k => $v) {
353 if ($v > 0x7a) {
354 $encodable = true;
355 break;
356 }
357 }
358 if (!$encodable) return false;
359
360 $decoded = $this->_nameprep($decoded);
361 if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed
362 $deco_len = count($decoded);
363 if (!$deco_len) return false; // Empty array
364 $codecount = 0; // How many chars have been consumed
365 $encoded = '';
366 for ($i = 0; $i < $deco_len; ++$i) {
367 $test = $decoded[$i];
368 if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B) || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
369 $encoded .= chr($decoded[$i]);
370 $codecount++;
371 }
372 }
373 if ($codecount == $deco_len) return $encoded; // All codepoints were basic ones
374
375 $encoded = $this->_punycode_prefix.$encoded;
376 if ($codecount) $encoded .= '-';
377 $is_first = true;
378 $cur_code = $this->_initial_n;
379 $bias = $this->_initial_bias;
380 $delta = 0;
381 while ($codecount < $deco_len) {
382 for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
383 if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
384 $next_code = $decoded[$i];
385 }
386 }
387 $delta += ($next_code - $cur_code) * ($codecount + 1);
388 $cur_code = $next_code;
389
390 for ($i = 0; $i < $deco_len; $i++) {
391 if ($decoded[$i] < $cur_code) {
392 $delta++;
393 } elseif ($decoded[$i] == $cur_code) {
394 for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
395 $t = ($k <= $bias) ? $this->_tmin : (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
396 if ($q < $t) break;
397 $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
398 $q = (int)(($q - $t) / ($this->_base - $t));
399 }
400 $encoded .= $this->_encode_digit($q);
401 $bias = $this->_adapt($delta, $codecount + 1, $is_first);
402 $codecount++;
403 $delta = 0;
404 $is_first = false;
405 }
406 }
407 $delta++;
408 $cur_code++;
409 }
410
411 return $encoded;
412 }
413
414 protected function _adapt($delta, $npoints, $is_first)
415 {
416 $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
417 $delta += intval($delta / $npoints);
418 for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
419 $delta = intval($delta / ($this->_base - $this->_tmin));
420 }
421
422 return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
423 }
424
425 protected function _encode_digit($d)
426 {
427 return chr($d + 22 + 75 * ($d < 26));
428 }
429
430 protected function _nameprep($input)
431 {
432 $output = [];
433 foreach ($input as $v) {
434 if (in_array($v, self::$NP['map_nothing'])) continue;
435 if (in_array($v, self::$NP['prohibit']) || in_array($v, self::$NP['general_prohibited'])) {
436 return false;
437 }
438 foreach (self::$NP['prohibit_ranges'] as $range) {
439 if ($range[0] <= $v && $v <= $range[1]) {
440 return false;
441 }
442 }
443
444 if (0xAC00 <= $v && $v <= 0xD7AF) {
445 foreach ($this->_hangul_decompose($v) as $out) {
446 $output[] = (int)$out;
447 }
448 } elseif (($this->_idn_version == '2003') && isset(self::$NP['replacemaps'][$v])) {
449 foreach ($this->_apply_cannonical_ordering(self::$NP['replacemaps'][$v]) as $out) {
450 $output[] = (int)$out;
451 }
452 } else {
453 $output[] = (int)$v;
454 }
455 }
456 $output = $this->_hangul_compose($output);
457 $last_class = 0;
458 $last_starter = 0;
459 $out_len = count($output);
460 for ($i = 0; $i < $out_len; ++$i) {
461 $class = $this->_get_combining_class($output[$i]);
462 if ((!$last_class || $last_class > $class) && $class) {
463 $seq_len = $i - $last_starter;
464 $out = $this->_combine(array_slice($output, $last_starter, $seq_len));
465 if ($out) {
466 $output[$last_starter] = $out;
467 if (count($out) != $seq_len) {
468 for ($j = $i + 1; $j < $out_len; ++$j) {
469 $output[$j - 1] = $output[$j];
470 }
471 unset($output[$out_len]);
472 }
473 $i--;
474 $out_len--;
475 $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i - 1]);
476 continue;
477 }
478 }
479 if (!$class) $last_starter = $i;
480 $last_class = $class;
481 }
482
483 return $output;
484 }
485
486 protected function _hangul_decompose($char)
487 {
488 $sindex = (int)$char - $this->_sbase;
489 if ($sindex < 0 || $sindex >= $this->_scount) return [$char];
490 $result = [];
491 $result[] = (int)$this->_lbase + $sindex / $this->_ncount;
492 $result[] = (int)$this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
493 $T = intval($this->_tbase + $sindex % $this->_tcount);
494 if ($T != $this->_tbase) $result[] = $T;
495
496 return $result;
497 }
498
499 protected function _hangul_compose($input)
500 {
501 $inp_len = count($input);
502 if (!$inp_len) return [];
503 $result = [];
504 $last = (int)$input[0];
505 $result[] = $last; // copy first char from input to output
506
507 for ($i = 1; $i < $inp_len; ++$i) {
508 $char = (int)$input[$i];
509 $sindex = $last - $this->_sbase;
510 $lindex = $last - $this->_lbase;
511 $vindex = $char - $this->_vbase;
512 $tindex = $char - $this->_tbase;
513 if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0) && 0 <= $tindex && $tindex <= $this->_tcount) {
514 $last += $tindex;
515 $result[(count($result) - 1)] = $last; // reset last
516 continue; // discard char
517 }
518 if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
519 $last = (int)$this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
520 $result[(count($result) - 1)] = $last; // reset last
521 continue; // discard char
522 }
523 $last = $char;
524 $result[] = $char;
525 }
526
527 return $result;
528 }
529
530 protected function _get_combining_class($char)
531 {
532 return isset(self::$NP['norm_combcls'][$char]) ? self::$NP['norm_combcls'][$char] : 0;
533 }
534
535 protected function _apply_cannonical_ordering($input)
536 {
537 $swap = true;
538 $size = count($input);
539 while ($swap) {
540 $swap = false;
541 $last = $this->_get_combining_class(intval($input[0]));
542 for ($i = 0; $i < $size - 1; ++$i) {
543 $next = $this->_get_combining_class(intval($input[$i + 1]));
544 if ($next != 0 && $last > $next) {
545 for ($j = $i + 1; $j > 0; --$j) {
546 if ($this->_get_combining_class(intval($input[$j - 1])) <= $next) break;
547 $t = intval($input[$j]);
548 $input[$j] = intval($input[$j - 1]);
549 $input[$j - 1] = $t;
550 $swap = true;
551 }
552 $next = $last;
553 }
554 $last = $next;
555 }
556 }
557
558 return $input;
559 }
560
561 protected function _combine($input)
562 {
563 $inp_len = count($input);
564 foreach (self::$NP['replacemaps'] as $np_src => $np_target) {
565 if ($np_target[0] != $input[0]) continue;
566 if (count($np_target) != $inp_len) continue;
567 $hit = false;
568 foreach ($input as $k2 => $v2) {
569 if ($v2 == $np_target[$k2]) {
570 $hit = true;
571 } else {
572 $hit = false;
573 break;
574 }
575 }
576 if ($hit) return $np_src;
577 }
578
579 return false;
580 }
581
582 protected function _ucs4_to_utf8($input)
583 {
584 $output = '';
585 foreach ($input as $k => $v) {
586 if ($v < 128) { // 7bit are transferred literally
587 $output .= chr($v);
588 } elseif ($v < (1 << 11)) { // 2 bytes
589 $output .= chr(192 + ($v >> 6)).chr(128 + ($v & 63));
590 } elseif ($v < (1 << 16)) { // 3 bytes
591 $output .= chr(224 + ($v >> 12)).chr(128 + (($v >> 6) & 63)).chr(128 + ($v & 63));
592 } elseif ($v < (1 << 21)) { // 4 bytes
593 $output .= chr(240 + ($v >> 18)).chr(128 + (($v >> 12) & 63)).chr(128 + (($v >> 6) & 63)).chr(128 + ($v & 63));
594 } elseif (self::$safe_mode) {
595 $output .= self::$safe_char;
596 } else {
597 return false;
598 }
599 }
600
601 return $output;
602 }
603
604 protected function _ucs4_string_to_ucs4($input)
605 {
606 $output = [];
607 $inp_len = self::byteLength($input);
608 if ($inp_len % 4) {
609 return false;
610 }
611 if (!$inp_len) return $output;
612 for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
613 if (!($i % 4)) {
614 $out_len++;
615 $output[$out_len] = 0;
616 }
617 $output[$out_len] += ord($input[$i]) << (8 * (3 - ($i % 4)));
618 }
619
620 return $output;
621 }
622
623 protected static $NP = [
624 'map_nothing' => [
625 0xAD,
626 0x34F,
627 0x1806,
628 0x180B,
629 0x180C,
630 0x180D,
631 0x200B,
632 0x200C,
633 0x200D,
634 0x2060,
635 0xFE00,
636 0xFE01,
637 0xFE02,
638 0xFE03,
639 0xFE04,
640 0xFE05,
641 0xFE06,
642 0xFE07,
643 0xFE08,
644 0xFE09,
645 0xFE0A,
646 0xFE0B,
647 0xFE0C,
648 0xFE0D,
649 0xFE0E,
650 0xFE0F,
651 0xFEFF,
652 ],
653 'general_prohibited' => [
654 0,
655 1,
656 2,
657 3,
658 4,
659 5,
660 6,
661 7,
662 8,
663 9,
664 10,
665 11,
666 12,
667 13,
668 14,
669 15,
670 16,
671 17,
672 18,
673 19,
674 20,
675 21,
676 22,
677 23,
678 24,
679 25,
680 26,
681 27,
682 28,
683 29,
684 30,
685 31,
686 32,
687 33,
688 34,
689 35,
690 36,
691 37,
692 38,
693 39,
694 40,
695 41,
696 42,
697 43,
698 44,
699 47,
700 59,
701 60,
702 61,
703 62,
704 63,
705 64,
706 91,
707 92,
708 93,
709 94,
710 95,
711 96,
712 123,
713 124,
714 125,
715 126,
716 127,
717 0x3002,
718 ],
719 'prohibit' => [
720 0xA0,
721 0x340,
722 0x341,
723 0x6DD,
724 0x70F,
725 0x1680,
726 0x180E,
727 0x2000,
728 0x2001,
729 0x2002,
730 0x2003,
731 0x2004,
732 0x2005,
733 0x2006,
734 0x2007,
735 0x2008,
736 0x2009,
737 0x200A,
738 0x200B,
739 0x200C,
740 0x200D,
741 0x200E,
742 0x200F,
743 0x2028,
744 0x2029,
745 0x202A,
746 0x202B,
747 0x202C,
748 0x202D,
749 0x202E,
750 0x202F,
751 0x205F,
752 0x206A,
753 0x206B,
754 0x206C,
755 0x206D,
756 0x206E,
757 0x206F,
758 0x3000,
759 0xFEFF,
760 0xFFF9,
761 0xFFFA,
762 0xFFFB,
763 0xFFFC,
764 0xFFFD,
765 0xFFFE,
766 0xFFFF,
767 0x1FFFE,
768 0x1FFFF,
769 0x2FFFE,
770 0x2FFFF,
771 0x3FFFE,
772 0x3FFFF,
773 0x4FFFE,
774 0x4FFFF,
775 0x5FFFE,
776 0x5FFFF,
777 0x6FFFE,
778 0x6FFFF,
779 0x7FFFE,
780 0x7FFFF,
781 0x8FFFE,
782 0x8FFFF,
783 0x9FFFE,
784 0x9FFFF,
785 0xAFFFE,
786 0xAFFFF,
787 0xBFFFE,
788 0xBFFFF,
789 0xCFFFE,
790 0xCFFFF,
791 0xDFFFE,
792 0xDFFFF,
793 0xE0001,
794 0xEFFFE,
795 0xEFFFF,
796 0xFFFFE,
797 0xFFFFF,
798 0x10FFFE,
799 0x10FFFF,
800 ],
801 'prohibit_ranges' => [
802 [0x80, 0x9F],
803 [0x2060, 0x206F],
804 [0x1D173, 0x1D17A],
805 [0xE000, 0xF8FF],
806 [0xF0000, 0xFFFFD],
807 [0x100000, 0x10FFFD],
808 [0xFDD0, 0xFDEF],
809 [0xD800, 0xDFFF],
810 [0x2FF0, 0x2FFB],
811 [0xE0020, 0xE007F],
812 ],
813 'replacemaps' => [
814 0x41 => [0x61],
815 0x42 => [0x62],
816 0x43 => [0x63],
817 0x44 => [0x64],
818 0x45 => [0x65],
819 0x46 => [0x66],
820 0x47 => [0x67],
821 0x48 => [0x68],
822 0x49 => [0x69],
823 0x4A => [0x6A],
824 0x4B => [0x6B],
825 0x4C => [0x6C],
826 0x4D => [0x6D],
827 0x4E => [0x6E],
828 0x4F => [0x6F],
829 0x50 => [0x70],
830 0x51 => [0x71],
831 0x52 => [0x72],
832 0x53 => [0x73],
833 0x54 => [0x74],
834 0x55 => [0x75],
835 0x56 => [0x76],
836 0x57 => [0x77],
837 0x58 => [0x78],
838 0x59 => [0x79],
839 0x5A => [0x7A],
840 0xB5 => [0x3BC],
841 0xC0 => [0xE0],
842 0xC1 => [0xE1],
843 0xC2 => [0xE2],
844 0xC3 => [0xE3],
845 0xC4 => [0xE4],
846 0xC5 => [0xE5],
847 0xC6 => [0xE6],
848 0xC7 => [0xE7],
849 0xC8 => [0xE8],
850 0xC9 => [0xE9],
851 0xCA => [0xEA],
852 0xCB => [0xEB],
853 0xCC => [0xEC],
854 0xCD => [0xED],
855 0xCE => [0xEE],
856 0xCF => [0xEF],
857 0xD0 => [0xF0],
858 0xD1 => [0xF1],
859 0xD2 => [0xF2],
860 0xD3 => [0xF3],
861 0xD4 => [0xF4],
862 0xD5 => [0xF5],
863 0xD6 => [0xF6],
864 0xD8 => [0xF8],
865 0xD9 => [0xF9],
866 0xDA => [0xFA],
867 0xDB => [0xFB],
868 0xDC => [0xFC],
869 0xDD => [0xFD],
870 0xDE => [0xFE],
871 0xDF => [0x73, 0x73],
872 0x100 => [0x101],
873 0x102 => [0x103],
874 0x104 => [0x105],
875 0x106 => [0x107],
876 0x108 => [0x109],
877 0x10A => [0x10B],
878 0x10C => [0x10D],
879 0x10E => [0x10F],
880 0x110 => [0x111],
881 0x112 => [0x113],
882 0x114 => [0x115],
883 0x116 => [0x117],
884 0x118 => [0x119],
885 0x11A => [0x11B],
886 0x11C => [0x11D],
887 0x11E => [0x11F],
888 0x120 => [0x121],
889 0x122 => [0x123],
890 0x124 => [0x125],
891 0x126 => [0x127],
892 0x128 => [0x129],
893 0x12A => [0x12B],
894 0x12C => [0x12D],
895 0x12E => [0x12F],
896 0x130 => [0x69, 0x307],
897 0x132 => [0x133],
898 0x134 => [0x135],
899 0x136 => [0x137],
900 0x139 => [0x13A],
901 0x13B => [0x13C],
902 0x13D => [0x13E],
903 0x13F => [0x140],
904 0x141 => [0x142],
905 0x143 => [0x144],
906 0x145 => [0x146],
907 0x147 => [0x148],
908 0x149 => [0x2BC, 0x6E],
909 0x14A => [0x14B],
910 0x14C => [0x14D],
911 0x14E => [0x14F],
912 0x150 => [0x151],
913 0x152 => [0x153],
914 0x154 => [0x155],
915 0x156 => [0x157],
916 0x158 => [0x159],
917 0x15A => [0x15B],
918 0x15C => [0x15D],
919 0x15E => [0x15F],
920 0x160 => [0x161],
921 0x162 => [0x163],
922 0x164 => [0x165],
923 0x166 => [0x167],
924 0x168 => [0x169],
925 0x16A => [0x16B],
926 0x16C => [0x16D],
927 0x16E => [0x16F],
928 0x170 => [0x171],
929 0x172 => [0x173],
930 0x174 => [0x175],
931 0x176 => [0x177],
932 0x178 => [0xFF],
933 0x179 => [0x17A],
934 0x17B => [0x17C],
935 0x17D => [0x17E],
936 0x17F => [0x73],
937 0x181 => [0x253],
938 0x182 => [0x183],
939 0x184 => [0x185],
940 0x186 => [0x254],
941 0x187 => [0x188],
942 0x189 => [0x256],
943 0x18A => [0x257],
944 0x18B => [0x18C],
945 0x18E => [0x1DD],
946 0x18F => [0x259],
947 0x190 => [0x25B],
948 0x191 => [0x192],
949 0x193 => [0x260],
950 0x194 => [0x263],
951 0x196 => [0x269],
952 0x197 => [0x268],
953 0x198 => [0x199],
954 0x19C => [0x26F],
955 0x19D => [0x272],
956 0x19F => [0x275],
957 0x1A0 => [0x1A1],
958 0x1A2 => [0x1A3],
959 0x1A4 => [0x1A5],
960 0x1A6 => [0x280],
961 0x1A7 => [0x1A8],
962 0x1A9 => [0x283],
963 0x1AC => [0x1AD],
964 0x1AE => [0x288],
965 0x1AF => [0x1B0],
966 0x1B1 => [0x28A],
967 0x1B2 => [0x28B],
968 0x1B3 => [0x1B4],
969 0x1B5 => [0x1B6],
970 0x1B7 => [0x292],
971 0x1B8 => [0x1B9],
972 0x1BC => [0x1BD],
973 0x1C4 => [0x1C6],
974 0x1C5 => [0x1C6],
975 0x1C7 => [0x1C9],
976 0x1C8 => [0x1C9],
977 0x1CA => [0x1CC],
978 0x1CB => [0x1CC],
979 0x1CD => [0x1CE],
980 0x1CF => [0x1D0],
981 0x1D1 => [0x1D2],
982 0x1D3 => [0x1D4],
983 0x1D5 => [0x1D6],
984 0x1D7 => [0x1D8],
985 0x1D9 => [0x1DA],
986 0x1DB => [0x1DC],
987 0x1DE => [0x1DF],
988 0x1E0 => [0x1E1],
989 0x1E2 => [0x1E3],
990 0x1E4 => [0x1E5],
991 0x1E6 => [0x1E7],
992 0x1E8 => [0x1E9],
993 0x1EA => [0x1EB],
994 0x1EC => [0x1ED],
995 0x1EE => [0x1EF],
996 0x1F0 => [0x6A, 0x30C],
997 0x1F1 => [0x1F3],
998 0x1F2 => [0x1F3],
999 0x1F4 => [0x1F5],
1000 0x1F6 => [0x195],
1001 0x1F7 => [0x1BF],
1002 0x1F8 => [0x1F9],
1003 0x1FA => [0x1FB],
1004 0x1FC => [0x1FD],
1005 0x1FE => [0x1FF],
1006 0x200 => [0x201],
1007 0x202 => [0x203],
1008 0x204 => [0x205],
1009 0x206 => [0x207],
1010 0x208 => [0x209],
1011 0x20A => [0x20B],
1012 0x20C => [0x20D],
1013 0x20E => [0x20F],
1014 0x210 => [0x211],
1015 0x212 => [0x213],
1016 0x214 => [0x215],
1017 0x216 => [0x217],
1018 0x218 => [0x219],
1019 0x21A => [0x21B],
1020 0x21C => [0x21D],
1021 0x21E => [0x21F],
1022 0x220 => [0x19E],
1023 0x222 => [0x223],
1024 0x224 => [0x225],
1025 0x226 => [0x227],
1026 0x228 => [0x229],
1027 0x22A => [0x22B],
1028 0x22C => [0x22D],
1029 0x22E => [0x22F],
1030 0x230 => [0x231],
1031 0x232 => [0x233],
1032 0x345 => [0x3B9],
1033 0x37A => [0x20, 0x3B9],
1034 0x386 => [0x3AC],
1035 0x388 => [0x3AD],
1036 0x389 => [0x3AE],
1037 0x38A => [0x3AF],
1038 0x38C => [0x3CC],
1039 0x38E => [0x3CD],
1040 0x38F => [0x3CE],
1041 0x390 => [0x3B9, 0x308, 0x301],
1042 0x391 => [0x3B1],
1043 0x392 => [0x3B2],
1044 0x393 => [0x3B3],
1045 0x394 => [0x3B4],
1046 0x395 => [0x3B5],
1047 0x396 => [0x3B6],
1048 0x397 => [0x3B7],
1049 0x398 => [0x3B8],
1050 0x399 => [0x3B9],
1051 0x39A => [0x3BA],
1052 0x39B => [0x3BB],
1053 0x39C => [0x3BC],
1054 0x39D => [0x3BD],
1055 0x39E => [0x3BE],
1056 0x39F => [0x3BF],
1057 0x3A0 => [0x3C0],
1058 0x3A1 => [0x3C1],
1059 0x3A3 => [0x3C3],
1060 0x3A4 => [0x3C4],
1061 0x3A5 => [0x3C5],
1062 0x3A6 => [0x3C6],
1063 0x3A7 => [0x3C7],
1064 0x3A8 => [0x3C8],
1065 0x3A9 => [0x3C9],
1066 0x3AA => [0x3CA],
1067 0x3AB => [0x3CB],
1068 0x3B0 => [0x3C5, 0x308, 0x301],
1069 0x3C2 => [0x3C3],
1070 0x3D0 => [0x3B2],
1071 0x3D1 => [0x3B8],
1072 0x3D2 => [0x3C5],
1073 0x3D3 => [0x3CD],
1074 0x3D4 => [0x3CB],
1075 0x3D5 => [0x3C6],
1076 0x3D6 => [0x3C0],
1077 0x3D8 => [0x3D9],
1078 0x3DA => [0x3DB],
1079 0x3DC => [0x3DD],
1080 0x3DE => [0x3DF],
1081 0x3E0 => [0x3E1],
1082 0x3E2 => [0x3E3],
1083 0x3E4 => [0x3E5],
1084 0x3E6 => [0x3E7],
1085 0x3E8 => [0x3E9],
1086 0x3EA => [0x3EB],
1087 0x3EC => [0x3ED],
1088 0x3EE => [0x3EF],
1089 0x3F0 => [0x3BA],
1090 0x3F1 => [0x3C1],
1091 0x3F2 => [0x3C3],
1092 0x3F4 => [0x3B8],
1093 0x3F5 => [0x3B5],
1094 0x400 => [0x450],
1095 0x401 => [0x451],
1096 0x402 => [0x452],
1097 0x403 => [0x453],
1098 0x404 => [0x454],
1099 0x405 => [0x455],
1100 0x406 => [0x456],
1101 0x407 => [0x457],
1102 0x408 => [0x458],
1103 0x409 => [0x459],
1104 0x40A => [0x45A],
1105 0x40B => [0x45B],
1106 0x40C => [0x45C],
1107 0x40D => [0x45D],
1108 0x40E => [0x45E],
1109 0x40F => [0x45F],
1110 0x410 => [0x430],
1111 0x411 => [0x431],
1112 0x412 => [0x432],
1113 0x413 => [0x433],
1114 0x414 => [0x434],
1115 0x415 => [0x435],
1116 0x416 => [0x436],
1117 0x417 => [0x437],
1118 0x418 => [0x438],
1119 0x419 => [0x439],
1120 0x41A => [0x43A],
1121 0x41B => [0x43B],
1122 0x41C => [0x43C],
1123 0x41D => [0x43D],
1124 0x41E => [0x43E],
1125 0x41F => [0x43F],
1126 0x420 => [0x440],
1127 0x421 => [0x441],
1128 0x422 => [0x442],
1129 0x423 => [0x443],
1130 0x424 => [0x444],
1131 0x425 => [0x445],
1132 0x426 => [0x446],
1133 0x427 => [0x447],
1134 0x428 => [0x448],
1135 0x429 => [0x449],
1136 0x42A => [0x44A],
1137 0x42B => [0x44B],
1138 0x42C => [0x44C],
1139 0x42D => [0x44D],
1140 0x42E => [0x44E],
1141 0x42F => [0x44F],
1142 0x460 => [0x461],
1143 0x462 => [0x463],
1144 0x464 => [0x465],
1145 0x466 => [0x467],
1146 0x468 => [0x469],
1147 0x46A => [0x46B],
1148 0x46C => [0x46D],
1149 0x46E => [0x46F],
1150 0x470 => [0x471],
1151 0x472 => [0x473],
1152 0x474 => [0x475],
1153 0x476 => [0x477],
1154 0x478 => [0x479],
1155 0x47A => [0x47B],
1156 0x47C => [0x47D],
1157 0x47E => [0x47F],
1158 0x480 => [0x481],
1159 0x48A => [0x48B],
1160 0x48C => [0x48D],
1161 0x48E => [0x48F],
1162 0x490 => [0x491],
1163 0x492 => [0x493],
1164 0x494 => [0x495],
1165 0x496 => [0x497],
1166 0x498 => [0x499],
1167 0x49A => [0x49B],
1168 0x49C => [0x49D],
1169 0x49E => [0x49F],
1170 0x4A0 => [0x4A1],
1171 0x4A2 => [0x4A3],
1172 0x4A4 => [0x4A5],
1173 0x4A6 => [0x4A7],
1174 0x4A8 => [0x4A9],
1175 0x4AA => [0x4AB],
1176 0x4AC => [0x4AD],
1177 0x4AE => [0x4AF],
1178 0x4B0 => [0x4B1],
1179 0x4B2 => [0x4B3],
1180 0x4B4 => [0x4B5],
1181 0x4B6 => [0x4B7],
1182 0x4B8 => [0x4B9],
1183 0x4BA => [0x4BB],
1184 0x4BC => [0x4BD],
1185 0x4BE => [0x4BF],
1186 0x4C1 => [0x4C2],
1187 0x4C3 => [0x4C4],
1188 0x4C5 => [0x4C6],
1189 0x4C7 => [0x4C8],
1190 0x4C9 => [0x4CA],
1191 0x4CB => [0x4CC],
1192 0x4CD => [0x4CE],
1193 0x4D0 => [0x4D1],
1194 0x4D2 => [0x4D3],
1195 0x4D4 => [0x4D5],
1196 0x4D6 => [0x4D7],
1197 0x4D8 => [0x4D9],
1198 0x4DA => [0x4DB],
1199 0x4DC => [0x4DD],
1200 0x4DE => [0x4DF],
1201 0x4E0 => [0x4E1],
1202 0x4E2 => [0x4E3],
1203 0x4E4 => [0x4E5],
1204 0x4E6 => [0x4E7],
1205 0x4E8 => [0x4E9],
1206 0x4EA => [0x4EB],
1207 0x4EC => [0x4ED],
1208 0x4EE => [0x4EF],
1209 0x4F0 => [0x4F1],
1210 0x4F2 => [0x4F3],
1211 0x4F4 => [0x4F5],
1212 0x4F8 => [0x4F9],
1213 0x500 => [0x501],
1214 0x502 => [0x503],
1215 0x504 => [0x505],
1216 0x506 => [0x507],
1217 0x508 => [0x509],
1218 0x50A => [0x50B],
1219 0x50C => [0x50D],
1220 0x50E => [0x50F],
1221 0x531 => [0x561],
1222 0x532 => [0x562],
1223 0x533 => [0x563],
1224 0x534 => [0x564],
1225 0x535 => [0x565],
1226 0x536 => [0x566],
1227 0x537 => [0x567],
1228 0x538 => [0x568],
1229 0x539 => [0x569],
1230 0x53A => [0x56A],
1231 0x53B => [0x56B],
1232 0x53C => [0x56C],
1233 0x53D => [0x56D],
1234 0x53E => [0x56E],
1235 0x53F => [0x56F],
1236 0x540 => [0x570],
1237 0x541 => [0x571],
1238 0x542 => [0x572],
1239 0x543 => [0x573],
1240 0x544 => [0x574],
1241 0x545 => [0x575],
1242 0x546 => [0x576],
1243 0x547 => [0x577],
1244 0x548 => [0x578],
1245 0x549 => [0x579],
1246 0x54A => [0x57A],
1247 0x54B => [0x57B],
1248 0x54C => [0x57C],
1249 0x54D => [0x57D],
1250 0x54E => [0x57E],
1251 0x54F => [0x57F],
1252 0x550 => [0x580],
1253 0x551 => [0x581],
1254 0x552 => [0x582],
1255 0x553 => [0x583],
1256 0x554 => [0x584],
1257 0x555 => [0x585],
1258 0x556 => [0x586],
1259 0x587 => [0x565, 0x582],
1260 0xE33 => [0xE4D, 0xE32],
1261 0x1E00 => [0x1E01],
1262 0x1E02 => [0x1E03],
1263 0x1E04 => [0x1E05],
1264 0x1E06 => [0x1E07],
1265 0x1E08 => [0x1E09],
1266 0x1E0A => [0x1E0B],
1267 0x1E0C => [0x1E0D],
1268 0x1E0E => [0x1E0F],
1269 0x1E10 => [0x1E11],
1270 0x1E12 => [0x1E13],
1271 0x1E14 => [0x1E15],
1272 0x1E16 => [0x1E17],
1273 0x1E18 => [0x1E19],
1274 0x1E1A => [0x1E1B],
1275 0x1E1C => [0x1E1D],
1276 0x1E1E => [0x1E1F],
1277 0x1E20 => [0x1E21],
1278 0x1E22 => [0x1E23],
1279 0x1E24 => [0x1E25],
1280 0x1E26 => [0x1E27],
1281 0x1E28 => [0x1E29],
1282 0x1E2A => [0x1E2B],
1283 0x1E2C => [0x1E2D],
1284 0x1E2E => [0x1E2F],
1285 0x1E30 => [0x1E31],
1286 0x1E32 => [0x1E33],
1287 0x1E34 => [0x1E35],
1288 0x1E36 => [0x1E37],
1289 0x1E38 => [0x1E39],
1290 0x1E3A => [0x1E3B],
1291 0x1E3C => [0x1E3D],
1292 0x1E3E => [0x1E3F],
1293 0x1E40 => [0x1E41],
1294 0x1E42 => [0x1E43],
1295 0x1E44 => [0x1E45],
1296 0x1E46 => [0x1E47],
1297 0x1E48 => [0x1E49],
1298 0x1E4A => [0x1E4B],
1299 0x1E4C => [0x1E4D],
1300 0x1E4E => [0x1E4F],
1301 0x1E50 => [0x1E51],
1302 0x1E52 => [0x1E53],
1303 0x1E54 => [0x1E55],
1304 0x1E56 => [0x1E57],
1305 0x1E58 => [0x1E59],
1306 0x1E5A => [0x1E5B],
1307 0x1E5C => [0x1E5D],
1308 0x1E5E => [0x1E5F],
1309 0x1E60 => [0x1E61],
1310 0x1E62 => [0x1E63],
1311 0x1E64 => [0x1E65],
1312 0x1E66 => [0x1E67],
1313 0x1E68 => [0x1E69],
1314 0x1E6A => [0x1E6B],
1315 0x1E6C => [0x1E6D],
1316 0x1E6E => [0x1E6F],
1317 0x1E70 => [0x1E71],
1318 0x1E72 => [0x1E73],
1319 0x1E74 => [0x1E75],
1320 0x1E76 => [0x1E77],
1321 0x1E78 => [0x1E79],
1322 0x1E7A => [0x1E7B],
1323 0x1E7C => [0x1E7D],
1324 0x1E7E => [0x1E7F],
1325 0x1E80 => [0x1E81],
1326 0x1E82 => [0x1E83],
1327 0x1E84 => [0x1E85],
1328 0x1E86 => [0x1E87],
1329 0x1E88 => [0x1E89],
1330 0x1E8A => [0x1E8B],
1331 0x1E8C => [0x1E8D],
1332 0x1E8E => [0x1E8F],
1333 0x1E90 => [0x1E91],
1334 0x1E92 => [0x1E93],
1335 0x1E94 => [0x1E95],
1336 0x1E96 => [0x68, 0x331],
1337 0x1E97 => [0x74, 0x308],
1338 0x1E98 => [0x77, 0x30A],
1339 0x1E99 => [0x79, 0x30A],
1340 0x1E9A => [0x61, 0x2BE],
1341 0x1E9B => [0x1E61],
1342 0x1EA0 => [0x1EA1],
1343 0x1EA2 => [0x1EA3],
1344 0x1EA4 => [0x1EA5],
1345 0x1EA6 => [0x1EA7],
1346 0x1EA8 => [0x1EA9],
1347 0x1EAA => [0x1EAB],
1348 0x1EAC => [0x1EAD],
1349 0x1EAE => [0x1EAF],
1350 0x1EB0 => [0x1EB1],
1351 0x1EB2 => [0x1EB3],
1352 0x1EB4 => [0x1EB5],
1353 0x1EB6 => [0x1EB7],
1354 0x1EB8 => [0x1EB9],
1355 0x1EBA => [0x1EBB],
1356 0x1EBC => [0x1EBD],
1357 0x1EBE => [0x1EBF],
1358 0x1EC0 => [0x1EC1],
1359 0x1EC2 => [0x1EC3],
1360 0x1EC4 => [0x1EC5],
1361 0x1EC6 => [0x1EC7],
1362 0x1EC8 => [0x1EC9],
1363 0x1ECA => [0x1ECB],
1364 0x1ECC => [0x1ECD],
1365 0x1ECE => [0x1ECF],
1366 0x1ED0 => [0x1ED1],
1367 0x1ED2 => [0x1ED3],
1368 0x1ED4 => [0x1ED5],
1369 0x1ED6 => [0x1ED7],
1370 0x1ED8 => [0x1ED9],
1371 0x1EDA => [0x1EDB],
1372 0x1EDC => [0x1EDD],
1373 0x1EDE => [0x1EDF],
1374 0x1EE0 => [0x1EE1],
1375 0x1EE2 => [0x1EE3],
1376 0x1EE4 => [0x1EE5],
1377 0x1EE6 => [0x1EE7],
1378 0x1EE8 => [0x1EE9],
1379 0x1EEA => [0x1EEB],
1380 0x1EEC => [0x1EED],
1381 0x1EEE => [0x1EEF],
1382 0x1EF0 => [0x1EF1],
1383 0x1EF2 => [0x1EF3],
1384 0x1EF4 => [0x1EF5],
1385 0x1EF6 => [0x1EF7],
1386 0x1EF8 => [0x1EF9],
1387 0x1F08 => [0x1F00],
1388 0x1F09 => [0x1F01],
1389 0x1F0A => [0x1F02],
1390 0x1F0B => [0x1F03],
1391 0x1F0C => [0x1F04],
1392 0x1F0D => [0x1F05],
1393 0x1F0E => [0x1F06],
1394 0x1F0F => [0x1F07],
1395 0x1F18 => [0x1F10],
1396 0x1F19 => [0x1F11],
1397 0x1F1A => [0x1F12],
1398 0x1F1B => [0x1F13],
1399 0x1F1C => [0x1F14],
1400 0x1F1D => [0x1F15],
1401 0x1F28 => [0x1F20],
1402 0x1F29 => [0x1F21],
1403 0x1F2A => [0x1F22],
1404 0x1F2B => [0x1F23],
1405 0x1F2C => [0x1F24],
1406 0x1F2D => [0x1F25],
1407 0x1F2E => [0x1F26],
1408 0x1F2F => [0x1F27],
1409 0x1F38 => [0x1F30],
1410 0x1F39 => [0x1F31],
1411 0x1F3A => [0x1F32],
1412 0x1F3B => [0x1F33],
1413 0x1F3C => [0x1F34],
1414 0x1F3D => [0x1F35],
1415 0x1F3E => [0x1F36],
1416 0x1F3F => [0x1F37],
1417 0x1F48 => [0x1F40],
1418 0x1F49 => [0x1F41],
1419 0x1F4A => [0x1F42],
1420 0x1F4B => [0x1F43],
1421 0x1F4C => [0x1F44],
1422 0x1F4D => [0x1F45],
1423 0x1F50 => [0x3C5, 0x313],
1424 0x1F52 => [0x3C5, 0x313, 0x300],
1425 0x1F54 => [0x3C5, 0x313, 0x301],
1426 0x1F56 => [0x3C5, 0x313, 0x342],
1427 0x1F59 => [0x1F51],
1428 0x1F5B => [0x1F53],
1429 0x1F5D => [0x1F55],
1430 0x1F5F => [0x1F57],
1431 0x1F68 => [0x1F60],
1432 0x1F69 => [0x1F61],
1433 0x1F6A => [0x1F62],
1434 0x1F6B => [0x1F63],
1435 0x1F6C => [0x1F64],
1436 0x1F6D => [0x1F65],
1437 0x1F6E => [0x1F66],
1438 0x1F6F => [0x1F67],
1439 0x1F80 => [0x1F00, 0x3B9],
1440 0x1F81 => [0x1F01, 0x3B9],
1441 0x1F82 => [0x1F02, 0x3B9],
1442 0x1F83 => [0x1F03, 0x3B9],
1443 0x1F84 => [0x1F04, 0x3B9],
1444 0x1F85 => [0x1F05, 0x3B9],
1445 0x1F86 => [0x1F06, 0x3B9],
1446 0x1F87 => [0x1F07, 0x3B9],
1447 0x1F88 => [0x1F00, 0x3B9],
1448 0x1F89 => [0x1F01, 0x3B9],
1449 0x1F8A => [0x1F02, 0x3B9],
1450 0x1F8B => [0x1F03, 0x3B9],
1451 0x1F8C => [0x1F04, 0x3B9],
1452 0x1F8D => [0x1F05, 0x3B9],
1453 0x1F8E => [0x1F06, 0x3B9],
1454 0x1F8F => [0x1F07, 0x3B9],
1455 0x1F90 => [0x1F20, 0x3B9],
1456 0x1F91 => [0x1F21, 0x3B9],
1457 0x1F92 => [0x1F22, 0x3B9],
1458 0x1F93 => [0x1F23, 0x3B9],
1459 0x1F94 => [0x1F24, 0x3B9],
1460 0x1F95 => [0x1F25, 0x3B9],
1461 0x1F96 => [0x1F26, 0x3B9],
1462 0x1F97 => [0x1F27, 0x3B9],
1463 0x1F98 => [0x1F20, 0x3B9],
1464 0x1F99 => [0x1F21, 0x3B9],
1465 0x1F9A => [0x1F22, 0x3B9],
1466 0x1F9B => [0x1F23, 0x3B9],
1467 0x1F9C => [0x1F24, 0x3B9],
1468 0x1F9D => [0x1F25, 0x3B9],
1469 0x1F9E => [0x1F26, 0x3B9],
1470 0x1F9F => [0x1F27, 0x3B9],
1471 0x1FA0 => [0x1F60, 0x3B9],
1472 0x1FA1 => [0x1F61, 0x3B9],
1473 0x1FA2 => [0x1F62, 0x3B9],
1474 0x1FA3 => [0x1F63, 0x3B9],
1475 0x1FA4 => [0x1F64, 0x3B9],
1476 0x1FA5 => [0x1F65, 0x3B9],
1477 0x1FA6 => [0x1F66, 0x3B9],
1478 0x1FA7 => [0x1F67, 0x3B9],
1479 0x1FA8 => [0x1F60, 0x3B9],
1480 0x1FA9 => [0x1F61, 0x3B9],
1481 0x1FAA => [0x1F62, 0x3B9],
1482 0x1FAB => [0x1F63, 0x3B9],
1483 0x1FAC => [0x1F64, 0x3B9],
1484 0x1FAD => [0x1F65, 0x3B9],
1485 0x1FAE => [0x1F66, 0x3B9],
1486 0x1FAF => [0x1F67, 0x3B9],
1487 0x1FB2 => [0x1F70, 0x3B9],
1488 0x1FB3 => [0x3B1, 0x3B9],
1489 0x1FB4 => [0x3AC, 0x3B9],
1490 0x1FB6 => [0x3B1, 0x342],
1491 0x1FB7 => [0x3B1, 0x342, 0x3B9],
1492 0x1FB8 => [0x1FB0],
1493 0x1FB9 => [0x1FB1],
1494 0x1FBA => [0x1F70],
1495 0x1FBB => [0x1F71],
1496 0x1FBC => [0x3B1, 0x3B9],
1497 0x1FBE => [0x3B9],
1498 0x1FC2 => [0x1F74, 0x3B9],
1499 0x1FC3 => [0x3B7, 0x3B9],
1500 0x1FC4 => [0x3AE, 0x3B9],
1501 0x1FC6 => [0x3B7, 0x342],
1502 0x1FC7 => [0x3B7, 0x342, 0x3B9],
1503 0x1FC8 => [0x1F72],
1504 0x1FC9 => [0x1F73],
1505 0x1FCA => [0x1F74],
1506 0x1FCB => [0x1F75],
1507 0x1FCC => [0x3B7, 0x3B9],
1508 0x1FD2 => [0x3B9, 0x308, 0x300],
1509 0x1FD3 => [0x3B9, 0x308, 0x301],
1510 0x1FD6 => [0x3B9, 0x342],
1511 0x1FD7 => [0x3B9, 0x308, 0x342],
1512 0x1FD8 => [0x1FD0],
1513 0x1FD9 => [0x1FD1],
1514 0x1FDA => [0x1F76],
1515 0x1FDB => [0x1F77],
1516 0x1FE2 => [0x3C5, 0x308, 0x300],
1517 0x1FE3 => [0x3C5, 0x308, 0x301],
1518 0x1FE4 => [0x3C1, 0x313],
1519 0x1FE6 => [0x3C5, 0x342],
1520 0x1FE7 => [0x3C5, 0x308, 0x342],
1521 0x1FE8 => [0x1FE0],
1522 0x1FE9 => [0x1FE1],
1523 0x1FEA => [0x1F7A],
1524 0x1FEB => [0x1F7B],
1525 0x1FEC => [0x1FE5],
1526 0x1FF2 => [0x1F7C, 0x3B9],
1527 0x1FF3 => [0x3C9, 0x3B9],
1528 0x1FF4 => [0x3CE, 0x3B9],
1529 0x1FF6 => [0x3C9, 0x342],
1530 0x1FF7 => [0x3C9, 0x342, 0x3B9],
1531 0x1FF8 => [0x1F78],
1532 0x1FF9 => [0x1F79],
1533 0x1FFA => [0x1F7C],
1534 0x1FFB => [0x1F7D],
1535 0x1FFC => [0x3C9, 0x3B9],
1536 0x20A8 => [0x72, 0x73],
1537 0x2102 => [0x63],
1538 0x2103 => [0xB0, 0x63],
1539 0x2107 => [0x25B],
1540 0x2109 => [0xB0, 0x66],
1541 0x210B => [0x68],
1542 0x210C => [0x68],
1543 0x210D => [0x68],
1544 0x2110 => [0x69],
1545 0x2111 => [0x69],
1546 0x2112 => [0x6C],
1547 0x2115 => [0x6E],
1548 0x2116 => [0x6E, 0x6F],
1549 0x2119 => [0x70],
1550 0x211A => [0x71],
1551 0x211B => [0x72],
1552 0x211C => [0x72],
1553 0x211D => [0x72],
1554 0x2120 => [0x73, 0x6D],
1555 0x2121 => [0x74, 0x65, 0x6C],
1556 0x2122 => [0x74, 0x6D],
1557 0x2124 => [0x7A],
1558 0x2126 => [0x3C9],
1559 0x2128 => [0x7A],
1560 0x212A => [0x6B],
1561 0x212B => [0xE5],
1562 0x212C => [0x62],
1563 0x212D => [0x63],
1564 0x2130 => [0x65],
1565 0x2131 => [0x66],
1566 0x2133 => [0x6D],
1567 0x213E => [0x3B3],
1568 0x213F => [0x3C0],
1569 0x2145 => [0x64],
1570 0x2160 => [0x2170],
1571 0x2161 => [0x2171],
1572 0x2162 => [0x2172],
1573 0x2163 => [0x2173],
1574 0x2164 => [0x2174],
1575 0x2165 => [0x2175],
1576 0x2166 => [0x2176],
1577 0x2167 => [0x2177],
1578 0x2168 => [0x2178],
1579 0x2169 => [0x2179],
1580 0x216A => [0x217A],
1581 0x216B => [0x217B],
1582 0x216C => [0x217C],
1583 0x216D => [0x217D],
1584 0x216E => [0x217E],
1585 0x216F => [0x217F],
1586 0x24B6 => [0x24D0],
1587 0x24B7 => [0x24D1],
1588 0x24B8 => [0x24D2],
1589 0x24B9 => [0x24D3],
1590 0x24BA => [0x24D4],
1591 0x24BB => [0x24D5],
1592 0x24BC => [0x24D6],
1593 0x24BD => [0x24D7],
1594 0x24BE => [0x24D8],
1595 0x24BF => [0x24D9],
1596 0x24C0 => [0x24DA],
1597 0x24C1 => [0x24DB],
1598 0x24C2 => [0x24DC],
1599 0x24C3 => [0x24DD],
1600 0x24C4 => [0x24DE],
1601 0x24C5 => [0x24DF],
1602 0x24C6 => [0x24E0],
1603 0x24C7 => [0x24E1],
1604 0x24C8 => [0x24E2],
1605 0x24C9 => [0x24E3],
1606 0x24CA => [0x24E4],
1607 0x24CB => [0x24E5],
1608 0x24CC => [0x24E6],
1609 0x24CD => [0x24E7],
1610 0x24CE => [0x24E8],
1611 0x24CF => [0x24E9],
1612 0x3371 => [0x68, 0x70, 0x61],
1613 0x3373 => [0x61, 0x75],
1614 0x3375 => [0x6F, 0x76],
1615 0x3380 => [0x70, 0x61],
1616 0x3381 => [0x6E, 0x61],
1617 0x3382 => [0x3BC, 0x61],
1618 0x3383 => [0x6D, 0x61],
1619 0x3384 => [0x6B, 0x61],
1620 0x3385 => [0x6B, 0x62],
1621 0x3386 => [0x6D, 0x62],
1622 0x3387 => [0x67, 0x62],
1623 0x338A => [0x70, 0x66],
1624 0x338B => [0x6E, 0x66],
1625 0x338C => [0x3BC, 0x66],
1626 0x3390 => [0x68, 0x7A],
1627 0x3391 => [0x6B, 0x68, 0x7A],
1628 0x3392 => [0x6D, 0x68, 0x7A],
1629 0x3393 => [0x67, 0x68, 0x7A],
1630 0x3394 => [0x74, 0x68, 0x7A],
1631 0x33A9 => [0x70, 0x61],
1632 0x33AA => [0x6B, 0x70, 0x61],
1633 0x33AB => [0x6D, 0x70, 0x61],
1634 0x33AC => [0x67, 0x70, 0x61],
1635 0x33B4 => [0x70, 0x76],
1636 0x33B5 => [0x6E, 0x76],
1637 0x33B6 => [0x3BC, 0x76],
1638 0x33B7 => [0x6D, 0x76],
1639 0x33B8 => [0x6B, 0x76],
1640 0x33B9 => [0x6D, 0x76],
1641 0x33BA => [0x70, 0x77],
1642 0x33BB => [0x6E, 0x77],
1643 0x33BC => [0x3BC, 0x77],
1644 0x33BD => [0x6D, 0x77],
1645 0x33BE => [0x6B, 0x77],
1646 0x33BF => [0x6D, 0x77],
1647 0x33C0 => [0x6B, 0x3C9],
1648 0x33C1 => [0x6D, 0x3C9] /*
1649 ,0x33C2 => array(0x61, 0x2E, 0x6D, 0x2E) */,
1650 0x33C3 => [0x62, 0x71],
1651 0x33C6 => [0x63, 0x2215, 0x6B, 0x67],
1652 0x33C7 => [0x63, 0x6F, 0x2E],
1653 0x33C8 => [0x64, 0x62],
1654 0x33C9 => [0x67, 0x79],
1655 0x33CB => [0x68, 0x70],
1656 0x33CD => [0x6B, 0x6B],
1657 0x33CE => [0x6B, 0x6D],
1658 0x33D7 => [0x70, 0x68],
1659 0x33D9 => [0x70, 0x70, 0x6D],
1660 0x33DA => [0x70, 0x72],
1661 0x33DC => [0x73, 0x76],
1662 0x33DD => [0x77, 0x62],
1663 0xFB00 => [0x66, 0x66],
1664 0xFB01 => [0x66, 0x69],
1665 0xFB02 => [0x66, 0x6C],
1666 0xFB03 => [0x66, 0x66, 0x69],
1667 0xFB04 => [0x66, 0x66, 0x6C],
1668 0xFB05 => [0x73, 0x74],
1669 0xFB06 => [0x73, 0x74],
1670 0xFB13 => [0x574, 0x576],
1671 0xFB14 => [0x574, 0x565],
1672 0xFB15 => [0x574, 0x56B],
1673 0xFB16 => [0x57E, 0x576],
1674 0xFB17 => [0x574, 0x56D],
1675 0xFF21 => [0xFF41],
1676 0xFF22 => [0xFF42],
1677 0xFF23 => [0xFF43],
1678 0xFF24 => [0xFF44],
1679 0xFF25 => [0xFF45],
1680 0xFF26 => [0xFF46],
1681 0xFF27 => [0xFF47],
1682 0xFF28 => [0xFF48],
1683 0xFF29 => [0xFF49],
1684 0xFF2A => [0xFF4A],
1685 0xFF2B => [0xFF4B],
1686 0xFF2C => [0xFF4C],
1687 0xFF2D => [0xFF4D],
1688 0xFF2E => [0xFF4E],
1689 0xFF2F => [0xFF4F],
1690 0xFF30 => [0xFF50],
1691 0xFF31 => [0xFF51],
1692 0xFF32 => [0xFF52],
1693 0xFF33 => [0xFF53],
1694 0xFF34 => [0xFF54],
1695 0xFF35 => [0xFF55],
1696 0xFF36 => [0xFF56],
1697 0xFF37 => [0xFF57],
1698 0xFF38 => [0xFF58],
1699 0xFF39 => [0xFF59],
1700 0xFF3A => [0xFF5A],
1701 0x10400 => [0x10428],
1702 0x10401 => [0x10429],
1703 0x10402 => [0x1042A],
1704 0x10403 => [0x1042B],
1705 0x10404 => [0x1042C],
1706 0x10405 => [0x1042D],
1707 0x10406 => [0x1042E],
1708 0x10407 => [0x1042F],
1709 0x10408 => [0x10430],
1710 0x10409 => [0x10431],
1711 0x1040A => [0x10432],
1712 0x1040B => [0x10433],
1713 0x1040C => [0x10434],
1714 0x1040D => [0x10435],
1715 0x1040E => [0x10436],
1716 0x1040F => [0x10437],
1717 0x10410 => [0x10438],
1718 0x10411 => [0x10439],
1719 0x10412 => [0x1043A],
1720 0x10413 => [0x1043B],
1721 0x10414 => [0x1043C],
1722 0x10415 => [0x1043D],
1723 0x10416 => [0x1043E],
1724 0x10417 => [0x1043F],
1725 0x10418 => [0x10440],
1726 0x10419 => [0x10441],
1727 0x1041A => [0x10442],
1728 0x1041B => [0x10443],
1729 0x1041C => [0x10444],
1730 0x1041D => [0x10445],
1731 0x1041E => [0x10446],
1732 0x1041F => [0x10447],
1733 0x10420 => [0x10448],
1734 0x10421 => [0x10449],
1735 0x10422 => [0x1044A],
1736 0x10423 => [0x1044B],
1737 0x10424 => [0x1044C],
1738 0x10425 => [0x1044D],
1739 0x1D400 => [0x61],
1740 0x1D401 => [0x62],
1741 0x1D402 => [0x63],
1742 0x1D403 => [0x64],
1743 0x1D404 => [0x65],
1744 0x1D405 => [0x66],
1745 0x1D406 => [0x67],
1746 0x1D407 => [0x68],
1747 0x1D408 => [0x69],
1748 0x1D409 => [0x6A],
1749 0x1D40A => [0x6B],
1750 0x1D40B => [0x6C],
1751 0x1D40C => [0x6D],
1752 0x1D40D => [0x6E],
1753 0x1D40E => [0x6F],
1754 0x1D40F => [0x70],
1755 0x1D410 => [0x71],
1756 0x1D411 => [0x72],
1757 0x1D412 => [0x73],
1758 0x1D413 => [0x74],
1759 0x1D414 => [0x75],
1760 0x1D415 => [0x76],
1761 0x1D416 => [0x77],
1762 0x1D417 => [0x78],
1763 0x1D418 => [0x79],
1764 0x1D419 => [0x7A],
1765 0x1D434 => [0x61],
1766 0x1D435 => [0x62],
1767 0x1D436 => [0x63],
1768 0x1D437 => [0x64],
1769 0x1D438 => [0x65],
1770 0x1D439 => [0x66],
1771 0x1D43A => [0x67],
1772 0x1D43B => [0x68],
1773 0x1D43C => [0x69],
1774 0x1D43D => [0x6A],
1775 0x1D43E => [0x6B],
1776 0x1D43F => [0x6C],
1777 0x1D440 => [0x6D],
1778 0x1D441 => [0x6E],
1779 0x1D442 => [0x6F],
1780 0x1D443 => [0x70],
1781 0x1D444 => [0x71],
1782 0x1D445 => [0x72],
1783 0x1D446 => [0x73],
1784 0x1D447 => [0x74],
1785 0x1D448 => [0x75],
1786 0x1D449 => [0x76],
1787 0x1D44A => [0x77],
1788 0x1D44B => [0x78],
1789 0x1D44C => [0x79],
1790 0x1D44D => [0x7A],
1791 0x1D468 => [0x61],
1792 0x1D469 => [0x62],
1793 0x1D46A => [0x63],
1794 0x1D46B => [0x64],
1795 0x1D46C => [0x65],
1796 0x1D46D => [0x66],
1797 0x1D46E => [0x67],
1798 0x1D46F => [0x68],
1799 0x1D470 => [0x69],
1800 0x1D471 => [0x6A],
1801 0x1D472 => [0x6B],
1802 0x1D473 => [0x6C],
1803 0x1D474 => [0x6D],
1804 0x1D475 => [0x6E],
1805 0x1D476 => [0x6F],
1806 0x1D477 => [0x70],
1807 0x1D478 => [0x71],
1808 0x1D479 => [0x72],
1809 0x1D47A => [0x73],
1810 0x1D47B => [0x74],
1811 0x1D47C => [0x75],
1812 0x1D47D => [0x76],
1813 0x1D47E => [0x77],
1814 0x1D47F => [0x78],
1815 0x1D480 => [0x79],
1816 0x1D481 => [0x7A],
1817 0x1D49C => [0x61],
1818 0x1D49E => [0x63],
1819 0x1D49F => [0x64],
1820 0x1D4A2 => [0x67],
1821 0x1D4A5 => [0x6A],
1822 0x1D4A6 => [0x6B],
1823 0x1D4A9 => [0x6E],
1824 0x1D4AA => [0x6F],
1825 0x1D4AB => [0x70],
1826 0x1D4AC => [0x71],
1827 0x1D4AE => [0x73],
1828 0x1D4AF => [0x74],
1829 0x1D4B0 => [0x75],
1830 0x1D4B1 => [0x76],
1831 0x1D4B2 => [0x77],
1832 0x1D4B3 => [0x78],
1833 0x1D4B4 => [0x79],
1834 0x1D4B5 => [0x7A],
1835 0x1D4D0 => [0x61],
1836 0x1D4D1 => [0x62],
1837 0x1D4D2 => [0x63],
1838 0x1D4D3 => [0x64],
1839 0x1D4D4 => [0x65],
1840 0x1D4D5 => [0x66],
1841 0x1D4D6 => [0x67],
1842 0x1D4D7 => [0x68],
1843 0x1D4D8 => [0x69],
1844 0x1D4D9 => [0x6A],
1845 0x1D4DA => [0x6B],
1846 0x1D4DB => [0x6C],
1847 0x1D4DC => [0x6D],
1848 0x1D4DD => [0x6E],
1849 0x1D4DE => [0x6F],
1850 0x1D4DF => [0x70],
1851 0x1D4E0 => [0x71],
1852 0x1D4E1 => [0x72],
1853 0x1D4E2 => [0x73],
1854 0x1D4E3 => [0x74],
1855 0x1D4E4 => [0x75],
1856 0x1D4E5 => [0x76],
1857 0x1D4E6 => [0x77],
1858 0x1D4E7 => [0x78],
1859 0x1D4E8 => [0x79],
1860 0x1D4E9 => [0x7A],
1861 0x1D504 => [0x61],
1862 0x1D505 => [0x62],
1863 0x1D507 => [0x64],
1864 0x1D508 => [0x65],
1865 0x1D509 => [0x66],
1866 0x1D50A => [0x67],
1867 0x1D50D => [0x6A],
1868 0x1D50E => [0x6B],
1869 0x1D50F => [0x6C],
1870 0x1D510 => [0x6D],
1871 0x1D511 => [0x6E],
1872 0x1D512 => [0x6F],
1873 0x1D513 => [0x70],
1874 0x1D514 => [0x71],
1875 0x1D516 => [0x73],
1876 0x1D517 => [0x74],
1877 0x1D518 => [0x75],
1878 0x1D519 => [0x76],
1879 0x1D51A => [0x77],
1880 0x1D51B => [0x78],
1881 0x1D51C => [0x79],
1882 0x1D538 => [0x61],
1883 0x1D539 => [0x62],
1884 0x1D53B => [0x64],
1885 0x1D53C => [0x65],
1886 0x1D53D => [0x66],
1887 0x1D53E => [0x67],
1888 0x1D540 => [0x69],
1889 0x1D541 => [0x6A],
1890 0x1D542 => [0x6B],
1891 0x1D543 => [0x6C],
1892 0x1D544 => [0x6D],
1893 0x1D546 => [0x6F],
1894 0x1D54A => [0x73],
1895 0x1D54B => [0x74],
1896 0x1D54C => [0x75],
1897 0x1D54D => [0x76],
1898 0x1D54E => [0x77],
1899 0x1D54F => [0x78],
1900 0x1D550 => [0x79],
1901 0x1D56C => [0x61],
1902 0x1D56D => [0x62],
1903 0x1D56E => [0x63],
1904 0x1D56F => [0x64],
1905 0x1D570 => [0x65],
1906 0x1D571 => [0x66],
1907 0x1D572 => [0x67],
1908 0x1D573 => [0x68],
1909 0x1D574 => [0x69],
1910 0x1D575 => [0x6A],
1911 0x1D576 => [0x6B],
1912 0x1D577 => [0x6C],
1913 0x1D578 => [0x6D],
1914 0x1D579 => [0x6E],
1915 0x1D57A => [0x6F],
1916 0x1D57B => [0x70],
1917 0x1D57C => [0x71],
1918 0x1D57D => [0x72],
1919 0x1D57E => [0x73],
1920 0x1D57F => [0x74],
1921 0x1D580 => [0x75],
1922 0x1D581 => [0x76],
1923 0x1D582 => [0x77],
1924 0x1D583 => [0x78],
1925 0x1D584 => [0x79],
1926 0x1D585 => [0x7A],
1927 0x1D5A0 => [0x61],
1928 0x1D5A1 => [0x62],
1929 0x1D5A2 => [0x63],
1930 0x1D5A3 => [0x64],
1931 0x1D5A4 => [0x65],
1932 0x1D5A5 => [0x66],
1933 0x1D5A6 => [0x67],
1934 0x1D5A7 => [0x68],
1935 0x1D5A8 => [0x69],
1936 0x1D5A9 => [0x6A],
1937 0x1D5AA => [0x6B],
1938 0x1D5AB => [0x6C],
1939 0x1D5AC => [0x6D],
1940 0x1D5AD => [0x6E],
1941 0x1D5AE => [0x6F],
1942 0x1D5AF => [0x70],
1943 0x1D5B0 => [0x71],
1944 0x1D5B1 => [0x72],
1945 0x1D5B2 => [0x73],
1946 0x1D5B3 => [0x74],
1947 0x1D5B4 => [0x75],
1948 0x1D5B5 => [0x76],
1949 0x1D5B6 => [0x77],
1950 0x1D5B7 => [0x78],
1951 0x1D5B8 => [0x79],
1952 0x1D5B9 => [0x7A],
1953 0x1D5D4 => [0x61],
1954 0x1D5D5 => [0x62],
1955 0x1D5D6 => [0x63],
1956 0x1D5D7 => [0x64],
1957 0x1D5D8 => [0x65],
1958 0x1D5D9 => [0x66],
1959 0x1D5DA => [0x67],
1960 0x1D5DB => [0x68],
1961 0x1D5DC => [0x69],
1962 0x1D5DD => [0x6A],
1963 0x1D5DE => [0x6B],
1964 0x1D5DF => [0x6C],
1965 0x1D5E0 => [0x6D],
1966 0x1D5E1 => [0x6E],
1967 0x1D5E2 => [0x6F],
1968 0x1D5E3 => [0x70],
1969 0x1D5E4 => [0x71],
1970 0x1D5E5 => [0x72],
1971 0x1D5E6 => [0x73],
1972 0x1D5E7 => [0x74],
1973 0x1D5E8 => [0x75],
1974 0x1D5E9 => [0x76],
1975 0x1D5EA => [0x77],
1976 0x1D5EB => [0x78],
1977 0x1D5EC => [0x79],
1978 0x1D5ED => [0x7A],
1979 0x1D608 => [0x61],
1980 0x1D609 => [0x62],
1981 0x1D60A => [0x63],
1982 0x1D60B => [0x64],
1983 0x1D60C => [0x65],
1984 0x1D60D => [0x66],
1985 0x1D60E => [0x67],
1986 0x1D60F => [0x68],
1987 0x1D610 => [0x69],
1988 0x1D611 => [0x6A],
1989 0x1D612 => [0x6B],
1990 0x1D613 => [0x6C],
1991 0x1D614 => [0x6D],
1992 0x1D615 => [0x6E],
1993 0x1D616 => [0x6F],
1994 0x1D617 => [0x70],
1995 0x1D618 => [0x71],
1996 0x1D619 => [0x72],
1997 0x1D61A => [0x73],
1998 0x1D61B => [0x74],
1999 0x1D61C => [0x75],
2000 0x1D61D => [0x76],
2001 0x1D61E => [0x77],
2002 0x1D61F => [0x78],
2003 0x1D620 => [0x79],
2004 0x1D621 => [0x7A],
2005 0x1D63C => [0x61],
2006 0x1D63D => [0x62],
2007 0x1D63E => [0x63],
2008 0x1D63F => [0x64],
2009 0x1D640 => [0x65],
2010 0x1D641 => [0x66],
2011 0x1D642 => [0x67],
2012 0x1D643 => [0x68],
2013 0x1D644 => [0x69],
2014 0x1D645 => [0x6A],
2015 0x1D646 => [0x6B],
2016 0x1D647 => [0x6C],
2017 0x1D648 => [0x6D],
2018 0x1D649 => [0x6E],
2019 0x1D64A => [0x6F],
2020 0x1D64B => [0x70],
2021 0x1D64C => [0x71],
2022 0x1D64D => [0x72],
2023 0x1D64E => [0x73],
2024 0x1D64F => [0x74],
2025 0x1D650 => [0x75],
2026 0x1D651 => [0x76],
2027 0x1D652 => [0x77],
2028 0x1D653 => [0x78],
2029 0x1D654 => [0x79],
2030 0x1D655 => [0x7A],
2031 0x1D670 => [0x61],
2032 0x1D671 => [0x62],
2033 0x1D672 => [0x63],
2034 0x1D673 => [0x64],
2035 0x1D674 => [0x65],
2036 0x1D675 => [0x66],
2037 0x1D676 => [0x67],
2038 0x1D677 => [0x68],
2039 0x1D678 => [0x69],
2040 0x1D679 => [0x6A],
2041 0x1D67A => [0x6B],
2042 0x1D67B => [0x6C],
2043 0x1D67C => [0x6D],
2044 0x1D67D => [0x6E],
2045 0x1D67E => [0x6F],
2046 0x1D67F => [0x70],
2047 0x1D680 => [0x71],
2048 0x1D681 => [0x72],
2049 0x1D682 => [0x73],
2050 0x1D683 => [0x74],
2051 0x1D684 => [0x75],
2052 0x1D685 => [0x76],
2053 0x1D686 => [0x77],
2054 0x1D687 => [0x78],
2055 0x1D688 => [0x79],
2056 0x1D689 => [0x7A],
2057 0x1D6A8 => [0x3B1],
2058 0x1D6A9 => [0x3B2],
2059 0x1D6AA => [0x3B3],
2060 0x1D6AB => [0x3B4],
2061 0x1D6AC => [0x3B5],
2062 0x1D6AD => [0x3B6],
2063 0x1D6AE => [0x3B7],
2064 0x1D6AF => [0x3B8],
2065 0x1D6B0 => [0x3B9],
2066 0x1D6B1 => [0x3BA],
2067 0x1D6B2 => [0x3BB],
2068 0x1D6B3 => [0x3BC],
2069 0x1D6B4 => [0x3BD],
2070 0x1D6B5 => [0x3BE],
2071 0x1D6B6 => [0x3BF],
2072 0x1D6B7 => [0x3C0],
2073 0x1D6B8 => [0x3C1],
2074 0x1D6B9 => [0x3B8],
2075 0x1D6BA => [0x3C3],
2076 0x1D6BB => [0x3C4],
2077 0x1D6BC => [0x3C5],
2078 0x1D6BD => [0x3C6],
2079 0x1D6BE => [0x3C7],
2080 0x1D6BF => [0x3C8],
2081 0x1D6C0 => [0x3C9],
2082 0x1D6D3 => [0x3C3],
2083 0x1D6E2 => [0x3B1],
2084 0x1D6E3 => [0x3B2],
2085 0x1D6E4 => [0x3B3],
2086 0x1D6E5 => [0x3B4],
2087 0x1D6E6 => [0x3B5],
2088 0x1D6E7 => [0x3B6],
2089 0x1D6E8 => [0x3B7],
2090 0x1D6E9 => [0x3B8],
2091 0x1D6EA => [0x3B9],
2092 0x1D6EB => [0x3BA],
2093 0x1D6EC => [0x3BB],
2094 0x1D6ED => [0x3BC],
2095 0x1D6EE => [0x3BD],
2096 0x1D6EF => [0x3BE],
2097 0x1D6F0 => [0x3BF],
2098 0x1D6F1 => [0x3C0],
2099 0x1D6F2 => [0x3C1],
2100 0x1D6F3 => [0x3B8],
2101 0x1D6F4 => [0x3C3],
2102 0x1D6F5 => [0x3C4],
2103 0x1D6F6 => [0x3C5],
2104 0x1D6F7 => [0x3C6],
2105 0x1D6F8 => [0x3C7],
2106 0x1D6F9 => [0x3C8],
2107 0x1D6FA => [0x3C9],
2108 0x1D70D => [0x3C3],
2109 0x1D71C => [0x3B1],
2110 0x1D71D => [0x3B2],
2111 0x1D71E => [0x3B3],
2112 0x1D71F => [0x3B4],
2113 0x1D720 => [0x3B5],
2114 0x1D721 => [0x3B6],
2115 0x1D722 => [0x3B7],
2116 0x1D723 => [0x3B8],
2117 0x1D724 => [0x3B9],
2118 0x1D725 => [0x3BA],
2119 0x1D726 => [0x3BB],
2120 0x1D727 => [0x3BC],
2121 0x1D728 => [0x3BD],
2122 0x1D729 => [0x3BE],
2123 0x1D72A => [0x3BF],
2124 0x1D72B => [0x3C0],
2125 0x1D72C => [0x3C1],
2126 0x1D72D => [0x3B8],
2127 0x1D72E => [0x3C3],
2128 0x1D72F => [0x3C4],
2129 0x1D730 => [0x3C5],
2130 0x1D731 => [0x3C6],
2131 0x1D732 => [0x3C7],
2132 0x1D733 => [0x3C8],
2133 0x1D734 => [0x3C9],
2134 0x1D747 => [0x3C3],
2135 0x1D756 => [0x3B1],
2136 0x1D757 => [0x3B2],
2137 0x1D758 => [0x3B3],
2138 0x1D759 => [0x3B4],
2139 0x1D75A => [0x3B5],
2140 0x1D75B => [0x3B6],
2141 0x1D75C => [0x3B7],
2142 0x1D75D => [0x3B8],
2143 0x1D75E => [0x3B9],
2144 0x1D75F => [0x3BA],
2145 0x1D760 => [0x3BB],
2146 0x1D761 => [0x3BC],
2147 0x1D762 => [0x3BD],
2148 0x1D763 => [0x3BE],
2149 0x1D764 => [0x3BF],
2150 0x1D765 => [0x3C0],
2151 0x1D766 => [0x3C1],
2152 0x1D767 => [0x3B8],
2153 0x1D768 => [0x3C3],
2154 0x1D769 => [0x3C4],
2155 0x1D76A => [0x3C5],
2156 0x1D76B => [0x3C6],
2157 0x1D76C => [0x3C7],
2158 0x1D76D => [0x3C8],
2159 0x1D76E => [0x3C9],
2160 0x1D781 => [0x3C3],
2161 0x1D790 => [0x3B1],
2162 0x1D791 => [0x3B2],
2163 0x1D792 => [0x3B3],
2164 0x1D793 => [0x3B4],
2165 0x1D794 => [0x3B5],
2166 0x1D795 => [0x3B6],
2167 0x1D796 => [0x3B7],
2168 0x1D797 => [0x3B8],
2169 0x1D798 => [0x3B9],
2170 0x1D799 => [0x3BA],
2171 0x1D79A => [0x3BB],
2172 0x1D79B => [0x3BC],
2173 0x1D79C => [0x3BD],
2174 0x1D79D => [0x3BE],
2175 0x1D79E => [0x3BF],
2176 0x1D79F => [0x3C0],
2177 0x1D7A0 => [0x3C1],
2178 0x1D7A1 => [0x3B8],
2179 0x1D7A2 => [0x3C3],
2180 0x1D7A3 => [0x3C4],
2181 0x1D7A4 => [0x3C5],
2182 0x1D7A5 => [0x3C6],
2183 0x1D7A6 => [0x3C7],
2184 0x1D7A7 => [0x3C8],
2185 0x1D7A8 => [0x3C9],
2186 0x1D7BB => [0x3C3],
2187 0x3F9 => [0x3C3],
2188 0x1D2C => [0x61],
2189 0x1D2D => [0xE6],
2190 0x1D2E => [0x62],
2191 0x1D30 => [0x64],
2192 0x1D31 => [0x65],
2193 0x1D32 => [0x1DD],
2194 0x1D33 => [0x67],
2195 0x1D34 => [0x68],
2196 0x1D35 => [0x69],
2197 0x1D36 => [0x6A],
2198 0x1D37 => [0x6B],
2199 0x1D38 => [0x6C],
2200 0x1D39 => [0x6D],
2201 0x1D3A => [0x6E],
2202 0x1D3C => [0x6F],
2203 0x1D3D => [0x223],
2204 0x1D3E => [0x70],
2205 0x1D3F => [0x72],
2206 0x1D40 => [0x74],
2207 0x1D41 => [0x75],
2208 0x1D42 => [0x77],
2209 0x213B => [0x66, 0x61, 0x78],
2210 0x3250 => [0x70, 0x74, 0x65],
2211 0x32CC => [0x68, 0x67],
2212 0x32CE => [0x65, 0x76],
2213 0x32CF => [0x6C, 0x74, 0x64],
2214 0x337A => [0x69, 0x75],
2215 0x33DE => [0x76, 0x2215, 0x6D],
2216 0x33DF => [0x61, 0x2215, 0x6D],
2217 ],
2218 'norm_combcls' => [
2219 0x334 => 1,
2220 0x335 => 1,
2221 0x336 => 1,
2222 0x337 => 1,
2223 0x338 => 1,
2224 0x93C => 7,
2225 0x9BC => 7,
2226 0xA3C => 7,
2227 0xABC => 7,
2228 0xB3C => 7,
2229 0xCBC => 7,
2230 0x1037 => 7,
2231 0x3099 => 8,
2232 0x309A => 8,
2233 0x94D => 9,
2234 0x9CD => 9,
2235 0xA4D => 9,
2236 0xACD => 9,
2237 0xB4D => 9,
2238 0xBCD => 9,
2239 0xC4D => 9,
2240 0xCCD => 9,
2241 0xD4D => 9,
2242 0xDCA => 9,
2243 0xE3A => 9,
2244 0xF84 => 9,
2245 0x1039 => 9,
2246 0x1714 => 9,
2247 0x1734 => 9,
2248 0x17D2 => 9,
2249 0x5B0 => 10,
2250 0x5B1 => 11,
2251 0x5B2 => 12,
2252 0x5B3 => 13,
2253 0x5B4 => 14,
2254 0x5B5 => 15,
2255 0x5B6 => 16,
2256 0x5B7 => 17,
2257 0x5B8 => 18,
2258 0x5B9 => 19,
2259 0x5BB => 20,
2260 0x5Bc => 21,
2261 0x5BD => 22,
2262 0x5BF => 23,
2263 0x5C1 => 24,
2264 0x5C2 => 25,
2265 0xFB1E => 26,
2266 0x64B => 27,
2267 0x64C => 28,
2268 0x64D => 29,
2269 0x64E => 30,
2270 0x64F => 31,
2271 0x650 => 32,
2272 0x651 => 33,
2273 0x652 => 34,
2274 0x670 => 35,
2275 0x711 => 36,
2276 0xC55 => 84,
2277 0xC56 => 91,
2278 0xE38 => 103,
2279 0xE39 => 103,
2280 0xE48 => 107,
2281 0xE49 => 107,
2282 0xE4A => 107,
2283 0xE4B => 107,
2284 0xEB8 => 118,
2285 0xEB9 => 118,
2286 0xEC8 => 122,
2287 0xEC9 => 122,
2288 0xECA => 122,
2289 0xECB => 122,
2290 0xF71 => 129,
2291 0xF72 => 130,
2292 0xF7A => 130,
2293 0xF7B => 130,
2294 0xF7C => 130,
2295 0xF7D => 130,
2296 0xF80 => 130,
2297 0xF74 => 132,
2298 0x321 => 202,
2299 0x322 => 202,
2300 0x327 => 202,
2301 0x328 => 202,
2302 0x31B => 216,
2303 0xF39 => 216,
2304 0x1D165 => 216,
2305 0x1D166 => 216,
2306 0x1D16E => 216,
2307 0x1D16F => 216,
2308 0x1D170 => 216,
2309 0x1D171 => 216,
2310 0x1D172 => 216,
2311 0x302A => 218,
2312 0x316 => 220,
2313 0x317 => 220,
2314 0x318 => 220,
2315 0x319 => 220,
2316 0x31C => 220,
2317 0x31D => 220,
2318 0x31E => 220,
2319 0x31F => 220,
2320 0x320 => 220,
2321 0x323 => 220,
2322 0x324 => 220,
2323 0x325 => 220,
2324 0x326 => 220,
2325 0x329 => 220,
2326 0x32A => 220,
2327 0x32B => 220,
2328 0x32C => 220,
2329 0x32D => 220,
2330 0x32E => 220,
2331 0x32F => 220,
2332 0x330 => 220,
2333 0x331 => 220,
2334 0x332 => 220,
2335 0x333 => 220,
2336 0x339 => 220,
2337 0x33A => 220,
2338 0x33B => 220,
2339 0x33C => 220,
2340 0x347 => 220,
2341 0x348 => 220,
2342 0x349 => 220,
2343 0x34D => 220,
2344 0x34E => 220,
2345 0x353 => 220,
2346 0x354 => 220,
2347 0x355 => 220,
2348 0x356 => 220,
2349 0x591 => 220,
2350 0x596 => 220,
2351 0x59B => 220,
2352 0x5A3 => 220,
2353 0x5A4 => 220,
2354 0x5A5 => 220,
2355 0x5A6 => 220,
2356 0x5A7 => 220,
2357 0x5AA => 220,
2358 0x655 => 220,
2359 0x656 => 220,
2360 0x6E3 => 220,
2361 0x6EA => 220,
2362 0x6ED => 220,
2363 0x731 => 220,
2364 0x734 => 220,
2365 0x737 => 220,
2366 0x738 => 220,
2367 0x739 => 220,
2368 0x73B => 220,
2369 0x73C => 220,
2370 0x73E => 220,
2371 0x742 => 220,
2372 0x744 => 220,
2373 0x746 => 220,
2374 0x748 => 220,
2375 0x952 => 220,
2376 0xF18 => 220,
2377 0xF19 => 220,
2378 0xF35 => 220,
2379 0xF37 => 220,
2380 0xFC6 => 220,
2381 0x193B => 220,
2382 0x20E8 => 220,
2383 0x1D17B => 220,
2384 0x1D17C => 220,
2385 0x1D17D => 220,
2386 0x1D17E => 220,
2387 0x1D17F => 220,
2388 0x1D180 => 220,
2389 0x1D181 => 220,
2390 0x1D182 => 220,
2391 0x1D18A => 220,
2392 0x1D18B => 220,
2393 0x59A => 222,
2394 0x5AD => 222,
2395 0x1929 => 222,
2396 0x302D => 222,
2397 0x302E => 224,
2398 0x302F => 224,
2399 0x1D16D => 226,
2400 0x5AE => 228,
2401 0x18A9 => 228,
2402 0x302B => 228,
2403 0x300 => 230,
2404 0x301 => 230,
2405 0x302 => 230,
2406 0x303 => 230,
2407 0x304 => 230,
2408 0x305 => 230,
2409 0x306 => 230,
2410 0x307 => 230,
2411 0x308 => 230,
2412 0x309 => 230,
2413 0x30A => 230,
2414 0x30B => 230,
2415 0x30C => 230,
2416 0x30D => 230,
2417 0x30E => 230,
2418 0x30F => 230,
2419 0x310 => 230,
2420 0x311 => 230,
2421 0x312 => 230,
2422 0x313 => 230,
2423 0x314 => 230,
2424 0x33D => 230,
2425 0x33E => 230,
2426 0x33F => 230,
2427 0x340 => 230,
2428 0x341 => 230,
2429 0x342 => 230,
2430 0x343 => 230,
2431 0x344 => 230,
2432 0x346 => 230,
2433 0x34A => 230,
2434 0x34B => 230,
2435 0x34C => 230,
2436 0x350 => 230,
2437 0x351 => 230,
2438 0x352 => 230,
2439 0x357 => 230,
2440 0x363 => 230,
2441 0x364 => 230,
2442 0x365 => 230,
2443 0x366 => 230,
2444 0x367 => 230,
2445 0x368 => 230,
2446 0x369 => 230,
2447 0x36A => 230,
2448 0x36B => 230,
2449 0x36C => 230,
2450 0x36D => 230,
2451 0x36E => 230,
2452 0x36F => 230,
2453 0x483 => 230,
2454 0x484 => 230,
2455 0x485 => 230,
2456 0x486 => 230,
2457 0x592 => 230,
2458 0x593 => 230,
2459 0x594 => 230,
2460 0x595 => 230,
2461 0x597 => 230,
2462 0x598 => 230,
2463 0x599 => 230,
2464 0x59C => 230,
2465 0x59D => 230,
2466 0x59E => 230,
2467 0x59F => 230,
2468 0x5A0 => 230,
2469 0x5A1 => 230,
2470 0x5A8 => 230,
2471 0x5A9 => 230,
2472 0x5AB => 230,
2473 0x5AC => 230,
2474 0x5AF => 230,
2475 0x5C4 => 230,
2476 0x610 => 230,
2477 0x611 => 230,
2478 0x612 => 230,
2479 0x613 => 230,
2480 0x614 => 230,
2481 0x615 => 230,
2482 0x653 => 230,
2483 0x654 => 230,
2484 0x657 => 230,
2485 0x658 => 230,
2486 0x6D6 => 230,
2487 0x6D7 => 230,
2488 0x6D8 => 230,
2489 0x6D9 => 230,
2490 0x6DA => 230,
2491 0x6DB => 230,
2492 0x6DC => 230,
2493 0x6DF => 230,
2494 0x6E0 => 230,
2495 0x6E1 => 230,
2496 0x6E2 => 230,
2497 0x6E4 => 230,
2498 0x6E7 => 230,
2499 0x6E8 => 230,
2500 0x6EB => 230,
2501 0x6EC => 230,
2502 0x730 => 230,
2503 0x732 => 230,
2504 0x733 => 230,
2505 0x735 => 230,
2506 0x736 => 230,
2507 0x73A => 230,
2508 0x73D => 230,
2509 0x73F => 230,
2510 0x740 => 230,
2511 0x741 => 230,
2512 0x743 => 230,
2513 0x745 => 230,
2514 0x747 => 230,
2515 0x749 => 230,
2516 0x74A => 230,
2517 0x951 => 230,
2518 0x953 => 230,
2519 0x954 => 230,
2520 0xF82 => 230,
2521 0xF83 => 230,
2522 0xF86 => 230,
2523 0xF87 => 230,
2524 0x170D => 230,
2525 0x193A => 230,
2526 0x20D0 => 230,
2527 0x20D1 => 230,
2528 0x20D4 => 230,
2529 0x20D5 => 230,
2530 0x20D6 => 230,
2531 0x20D7 => 230,
2532 0x20DB => 230,
2533 0x20DC => 230,
2534 0x20E1 => 230,
2535 0x20E7 => 230,
2536 0x20E9 => 230,
2537 0xFE20 => 230,
2538 0xFE21 => 230,
2539 0xFE22 => 230,
2540 0xFE23 => 230,
2541 0x1D185 => 230,
2542 0x1D186 => 230,
2543 0x1D187 => 230,
2544 0x1D189 => 230,
2545 0x1D188 => 230,
2546 0x1D1AA => 230,
2547 0x1D1AB => 230,
2548 0x1D1AC => 230,
2549 0x1D1AD => 230,
2550 0x315 => 232,
2551 0x31A => 232,
2552 0x302C => 232,
2553 0x35F => 233,
2554 0x362 => 233,
2555 0x35D => 234,
2556 0x35E => 234,
2557 0x360 => 234,
2558 0x361 => 234,
2559 0x345 => 240,
2560 ],
2561 ];
2562 }
2563