changeset 2:c9123a24f544

Added special Keiko instructions including CASEJUMP
author Mike Spivey <mike@cs.ox.ac.uk>
date Mon, 15 Oct 2018 16:23:30 +0100
parents b683d796e07e
children 9176d9aa3163
files keiko/interp.c keiko/keiko.h keiko/template.c
diffstat 3 files changed, 442 insertions(+), 401 deletions(-) [+]
line wrap: on
line diff
--- a/keiko/interp.c	Mon Sep 10 20:34:00 2018 +0100
+++ b/keiko/interp.c	Mon Oct 15 16:23:30 2018 +0100
@@ -190,6 +190,9 @@
 #define slide(nargs) sp += HEAD + nargs; cond_break();
 
 
+#define casejump(x, n0)                                  {                                                       int n = n0;                                     pc0 = pc; pc += 4*n;                            while (n > 0) {                                 if (x == get2(pc0)) {                   jump(get2(pc0+2));                      break;                          }                                       pc0 += 4; n--;                          }                                               }
+
+
 
 /* interp -- main loop of the interpreter */
 void interp(value *sp0) {
@@ -462,9 +465,9 @@
           &&lbl_RETURN,
           &&lbl_LNUM_2,
           &&lbl_BREAK_2,
-          &&lbl_ILLEGAL,
-          &&lbl_ILLEGAL,
-          &&lbl_ILLEGAL,
+          &&lbl_CASEJUMP_1,
+          &&lbl_PACK,
+          &&lbl_UNPACK,
           &&lbl_ILLEGAL,
      };
 #endif
@@ -1628,6 +1631,22 @@
  }
                NEXT;
 
+          ACTION(CASEJUMP_1)
+               pc = pc0 + 2;
+               sp += 1; { casejump(sp[-1].i, get1(pc0+1)); }
+               NEXT;
+
+          ACTION(PACK)
+               pc = pc0 + 1;
+               sp++; sp[0].i = pack(valptr(sp[-1]), pointer(sp[0]));
+               NEXT;
+
+          ACTION(UNPACK)
+               pc = pc0 + 1;
+               { sp--; sp[0].a = address(getcode(sp[1].i)); 
+                                   sp[1].a = address(getenvt(sp[1].i)); }
+               NEXT;
+
 
           ACTION(ILLEGAL)
           DEFAULT
--- a/keiko/keiko.h	Mon Sep 10 20:34:00 2018 +0100
+++ b/keiko/keiko.h	Mon Oct 15 16:23:30 2018 +0100
@@ -1,7 +1,7 @@
 /* Header file -- generated by iset.tcl */
 
-#define NTEMPLATES 290
-#define NTRIE 995
+#define NTEMPLATES 294
+#define NTRIE 1018
 #define MAXARGS 2
 
 #define __INSTRS__(i) \
@@ -228,6 +228,10 @@
      i(RETURN) \
      i(LNUM) \
      i(BREAK) \
+     i(CASEJUMP) \
+     i(CASEARM) \
+     i(PACK) \
+     i(UNPACK) \
      i(REG) \
      i(ADDR) \
      i(STACKW) \
@@ -463,6 +467,9 @@
 #define K_RETURN 249
 #define K_LNUM_2 250
 #define K_BREAK_2 251
+#define K_CASEJUMP_1 252
+#define K_PACK 253
+#define K_UNPACK 254
 
 #define __OPCODES__(o) \
      o(ILLEGAL, ILLEGAL, "", 0, 1) \
@@ -716,4 +723,7 @@
      o(RESULTQ, RESULTQ, "", 0, 1) \
      o(RETURN, RETURN, "", 0, 1) \
      o(LNUM_2, LNUM, "2", 0, 3) \
-     o(BREAK_2, BREAK, "2", 0, 3)
+     o(BREAK_2, BREAK, "2", 0, 3) \
+     o(CASEJUMP_1, CASEJUMP, "1", 0, 2) \
+     o(PACK, PACK, "", 0, 1) \
+     o(UNPACK, UNPACK, "", 0, 1)
--- a/keiko/template.c	Mon Sep 10 20:34:00 2018 +0100
+++ b/keiko/template.c	Mon Oct 15 16:23:30 2018 +0100
@@ -274,6 +274,10 @@
 {"RETURN",    "",      0,  0,  0,  1,  1, K_RETURN, {}},
 {"LNUM",      "2",     0,  0,  0,  3,  1, K_LNUM_2, {}},
 {"BREAK",     "2",     0,  0,  0,  3,  1, K_BREAK_2, {}},
+{"CASEJUMP",  "1",     0,  0,  0,  2,  1, K_CASEJUMP_1, {}},
+{"CASEARM",   "2R",    0,  0,  0,  4,  0, 0, {}},
+{"PACK",      "",      0,  0,  0,  1,  1, K_PACK, {}},
+{"UNPACK",    "",      0,  0,  0,  1,  1, K_UNPACK, {}},
 {"CONST",     "?",     0,  0,  0, -1,  1, D_CONST, {}},
 {"FCONST",    "?",     0,  0,  0, -1,  1, D_FCONST, {}},
 {"DCONST",    "?",     0,  0,  0, -1,  1, D_DCONST, {}},
@@ -312,325 +316,332 @@
  |       |       |              [F]  22 --> 249
  |       |       |              [Q]  28 --> 248
  |       |       |              [W]  29 --> 247
- |       |      [S]  48 [E]  46 [L]  33 --> 158
- |      [O]  52 [N]  45 [S]  51 [T]  35 --> 270
- |                      [V]  68 [D]  54 [F]  36 --> 227
- |                               |      [N]  37 --> 225
- |                              [F]  59 [D]  38 --> 226
- |                               |      [N]  39 --> 224
- |                              [N]  74 [C]  47 --> 228
- |                               |      [D]  55 --> 223
- |                               |      [F]  56 --> 222
- |                               |      [Q]  57 --> 230
- |                               |      [S]  58 --> 229
- |                              [Q]  65 [D]  60 --> 232
- |                                      [N]  61 --> 231
-[D]  85 [C]  71 [M]  67 [P]  95 [G]  62 --> 192
- |       |       |              [L]  63 --> 191
- |       |      [O]  73 [N]  77 [S]  80 [T]  64 --> 272
- |      [D]  66 [I]  81 [V] 126 --> 189
- |      [E] 106 [C] 145 --> 106
- |       |       |      [L] 168 --> 93
- |       |      [F]  99 [I]  96 [N] 108 [E] 178 --> 279
- |       |      [Q] 179 --> 193
- |      [G] 111 [E] 100 [Q] 182 --> 198
- |       |      [T] 183 --> 196
- |      [I]  98 [V] 185 --> 115
- |      [J] 120 [E] 105 [Q] 188 --> 199
- |       |      [G] 121 [E] 112 [Q] 192 --> 204
- |       |       |      [T] 194 --> 202
- |       |      [L] 128 [E] 118 [Q] 200 --> 203
- |       |       |      [T] 201 --> 201
- |       |      [N] 133 [E] 122 [Q] 206 --> 200
- |       |              [G] 138 [E] 127 [Q] 210 --> 208
- |       |               |      [T] 211 --> 206
- |       |              [L] 144 [E] 134 [Q] 214 --> 207
- |       |                      [T] 216 --> 205
- |      [L] 148 [E] 137 [Q] 219 --> 197
- |       |      [T] 220 --> 195
- |      [M] 150 [I] 146 [N] 140 [U] 143 [S] 227 --> 187
- |      [N] 160 [E] 149 [Q] 231 --> 194
- |      [P] 157 [L] 151 [U] 152 [S] 234 --> 186
- |      [T] 164 [I] 161 [M] 170 [E] 158 [S] 240 --> 188
- |      [U] 165 [M] 171 [I] 169 [N] 163 [U] 166 [S] 243 --> 190
- |       |      [P] 246 --> 95
- |      [Z] 184 [C] 180 [H] 181 [E] 186 [C] 187 [K] 254 --> 238
-[E] 190 [A] 173 [S] 174 [S] 189 [E] 177 [R] 176 [T] 261 --> 241
- |      [N] 195 [D] 264 --> 277
- |       |              [H] 197 [D] 191 [R] 266 --> 284
- |      [Q] 267 --> 117
- |      [R] 193 [R] 198 [O] 196 [R] 269 --> 240
-[F] 212 [C] 205 [M] 207 [P] 222 [G] 270 --> 169
- |       |       |              [L] 274 --> 168
- |       |      [O] 213 [N] 217 [S] 215 [T] 276 --> 271
- |      [D] 221 [I] 209 [V] 301 --> 166
- |      [E] 223 [Q] 303 --> 170
- |      [G] 236 [E] 225 [Q] 307 --> 175
- |       |      [T] 308 --> 173
- |      [I] 224 [X] 242 [C] 232 [O] 230 [P] 226 [Y] 313 --> 244
- |      [J] 245 [E] 237 [Q] 317 --> 176
- |       |      [G] 250 [E] 241 [Q] 324 --> 181
- |       |       |      [T] 325 --> 179
- |       |      [L] 257 [E] 247 [Q] 327 --> 180
- |       |       |      [T] 329 --> 178
- |       |      [N] 262 [E] 249 [Q] 332 --> 177
- |       |              [G] 268 [E] 258 [Q] 335 --> 185
- |       |               |      [T] 340 --> 183
- |       |              [L] 273 [E] 263 [Q] 343 --> 184
- |       |                      [T] 345 --> 182
- |      [L] 277 [E] 272 [Q] 347 --> 174
- |       |       |      [X] 281 [C] 271 [O] 275 [P] 260 [Y] 351 --> 245
- |       |      [T] 354 --> 172
- |      [M] 283 [I] 280 [N] 278 [U] 279 [S] 359 --> 164
- |      [N] 295 [E] 284 [Q] 366 --> 171
- |      [P] 291 [L] 285 [U] 286 [S] 368 --> 163
- |      [T] 298 [I] 296 [M] 305 [E] 289 [S] 375 --> 165
- |      [U] 299 [M] 304 [I] 300 [N] 294 [U] 297 [S] 381 --> 167
- |      [Z] 315 [C] 311 [H] 316 [E] 319 [C] 309 [K] 387 --> 237
-[G] 321 [C] 320 [H] 322 [E] 326 [C] 314 [K] 394 --> 235
- |      [E] 318 [Q] 395 --> 121
- |      [L] 323 [O] 330 [B] 333 [A] 328 [L] 400 --> 274
- |       |              [V] 336 [A] 331 [R] 403 --> 281
- |      [T] 406 --> 119
-[I] 334 [M] 337 [P] 339 [O] 338 [R] 341 [T] 407 --> 285
- |      [N] 342 [C] 408 --> 105
- |               |      [L] 414 --> 91
- |              [D] 346 [E] 344 [X] 353 [D] 419 --> 12
- |                                      [S] 422 --> 10
- |                                      [W] 423 --> 11
-[J] 357 [C] 362 [A] 348 [S] 360 [E] 430 --> 157
- |      [E] 363 [Q] 434 --> 123
- |       |              [Z] 438 --> 145
- |      [G] 372 [E] 364 [Q] 443 --> 131
- |       |       |              [Z] 446 --> 141
- |       |      [T] 447 --> 127
- |       |              [Z] 448 --> 137
- |      [L] 380 [E] 369 [Q] 451 --> 129
- |       |       |              [Z] 452 --> 139
- |       |      [T] 453 --> 125
- |       |              [Z] 454 --> 135
- |      [N] 386 [E] 376 [Q] 458 --> 133
- |       |                      [Z] 459 --> 143
- |      [P] 378 [R] 382 [O] 396 [C] 462 --> 253
- |      [R] 401 [A] 389 [N] 397 [G] 402 [E] 465 --> 159
- |      [U] 392 [M] 390 [P] 472 --> 147
-[L] 409 [A] 410 [B] 404 [E] 399 [L] 479 --> 275
- |      [D] 424 [G] 436 [C] 480 --> 45
- |       |       |      [D] 481 --> 85
- |       |       |      [F] 483 --> 47
- |       |       |      [Q] 485 --> 89
- |       |       |      [S] 486 --> 43
- |       |       |      [W] 489 --> 41
- |       |      [I] 444 [C] 490 --> 66
- |       |       |      [D] 491 --> 71
- |       |       |      [F] 494 --> 64
- |       |       |      [Q] 496 --> 73
- |       |       |      [S] 498 --> 65
- |       |       |      [W] 501 --> 63
- |       |      [K] 439 [D] 505 --> 77
- |       |       |      [F] 508 --> 5
- |       |       |      [Q] 510 --> 81
- |       |       |      [W] 513 --> 3
- |       |      [L] 468 [C] 515 --> 27
- |       |       |      [D] 516 --> 83
- |       |       |      [F] 518 --> 29
- |       |       |      [Q] 521 --> 87
- |       |       |      [S] 522 --> 25
- |       |       |      [W] 528 --> 21
- |       |      [N] 442 [W] 530 --> 57
- |      [E] 461 [Q] 532 --> 120
- |      [I] 456 [N] 470 [E] 540 --> 287
- |       |              [K] 544 --> 251
- |      [N] 467 [U] 469 [M] 547 --> 268
- |      [O] 492 [A] 482 [D] 493 [C] 553 --> 15
- |       |       |              [D] 554 --> 75
- |       |       |              [F] 556 --> 16
- |       |       |              [Q] 558 --> 79
- |       |       |              [S] 562 --> 14
- |       |       |              [W] 564 --> 13
- |       |      [C] 500 [A] 495 [L] 566 --> 7
- |      [S] 497 [L] 567 --> 111
- |       |      [R] 568 --> 112
- |      [T] 569 --> 118
-[M] 499 [I] 503 [N] 502 [U] 487 [S] 575 --> 99
- |      [O] 509 [D] 582 --> 116
- |                      [U] 507 [L] 517 [E] 584 --> 283
-[N] 523 [C] 519 [H] 520 [E] 526 [C] 524 [K] 585 --> 234
- |      [E] 514 [Q] 588 --> 122
- |      [O] 512 [T] 594 --> 104
-[O] 527 [F] 531 [F] 525 [S] 529 [E] 533 [T] 600 --> 9
- |      [R] 603 --> 103
-[P] 537 [C] 541 [A] 534 [L] 535 [L] 605 --> 288
- |       |                              [W] 607 --> 289
- |      [L] 536 [U] 542 [S] 612 --> 98
- |      [O] 538 [P] 614 --> 97
- |      [R] 550 [I] 543 [M] 559 [D] 546 [E] 560 [F] 624 --> 278
- |       |      [O] 561 [C] 626 --> 276
- |      [U] 548 [S] 563 [H] 632 --> 0
-[Q] 570 [C] 557 [M] 565 [P] 633 --> 209
- |       |      [O] 571 [N] 573 [S] 574 [T] 640 --> 273
- |      [D] 590 [E] 586 [C] 642 --> 156
- |       |      [I] 576 [V] 651 --> 153
- |      [E] 580 [Q] 652 --> 210
- |      [G] 595 [E] 587 [Q] 657 --> 214
- |       |      [T] 665 --> 212
- |      [I] 591 [N] 599 [C] 670 --> 155
- |      [J] 602 [E] 593 [Q] 672 --> 216
- |       |      [G] 606 [E] 596 [Q] 676 --> 220
- |       |       |      [T] 681 --> 218
- |       |      [L] 613 [E] 604 [Q] 683 --> 219
- |       |       |      [T] 684 --> 217
- |       |      [N] 617 [E] 608 [Q] 687 --> 221
- |      [L] 619 [E] 610 [Q] 693 --> 213
- |       |      [T] 694 --> 211
- |      [M] 622 [I] 618 [N] 615 [U] 616 [S] 698 --> 150
- |       |      [O] 634 [D] 704 --> 154
- |      [N] 636 [E] 625 [Q] 707 --> 215
- |      [P] 635 [L] 623 [U] 627 [S] 709 --> 149
- |      [T] 639 [I] 637 [M] 644 [E] 638 [S] 715 --> 151
- |      [U] 641 [M] 643 [I] 645 [N] 646 [U] 647 [S] 717 --> 152
- |      [Z] 653 [C] 650 [H] 655 [E] 658 [C] 654 [K] 719 --> 239
-[R] 659 [E] 649 [S] 656 [U] 660 [L] 661 [T] 667 [D] 726 --> 264
- |       |       |                              [F] 727 --> 265
- |       |       |                              [Q] 734 --> 266
- |       |       |                              [W] 739 --> 263
- |       |      [T] 662 [U] 664 [R] 666 [N] 740 --> 267
- |       |                                      [D] 742 --> 261
- |       |                                      [F] 743 --> 260
- |       |                                      [Q] 749 --> 262
- |       |                                      [W] 750 --> 259
- |      [O] 669 [R] 752 --> 114
-[S] 688 [A] 671 [V] 686 [E] 680 [L] 685 [I] 682 [N] 690 [K] 759 --> 252
- |      [L] 689 [I] 695 [D] 692 [E] 766 --> 254
- |       |                              [D] 767 --> 256
- |       |                              [F] 768 --> 257
- |       |                              [Q] 769 --> 258
- |       |                              [W] 770 --> 255
- |      [T] 703 [G] 716 [C] 771 --> 53
- |       |       |      [D] 773 --> 86
- |       |       |      [F] 777 --> 55
- |       |       |      [Q] 780 --> 90
- |       |       |      [S] 787 --> 51
- |       |       |      [W] 788 --> 49
- |       |      [I] 724 [C] 789 --> 70
- |       |       |      [D] 790 --> 72
- |       |       |      [F] 793 --> 68
- |       |       |      [Q] 795 --> 74
- |       |       |      [S] 796 --> 69
- |       |       |      [W] 798 --> 67
- |       |      [K] 723 [M] 736 [A] 722 [P] 804 --> 286
- |       |      [L] 745 [C] 806 --> 37
- |       |       |      [D] 809 --> 84
- |       |       |      [F] 814 --> 39
- |       |       |      [Q] 816 --> 88
- |       |       |      [S] 817 --> 35
- |       |       |      [W] 818 --> 31
- |       |      [N] 732 [W] 820 --> 60
- |       |      [O] 741 [R] 753 [E] 763 [C] 824 --> 19
- |       |       |                      [D] 825 --> 76
- |       |       |                      [F] 829 --> 20
- |       |       |                      [Q] 835 --> 80
- |       |       |                      [S] 837 --> 18
- |       |       |                      [W] 838 --> 17
- |       |      [R] 772 [I] 761 [N] 778 [G] 840 --> 280
- |      [W] 776 [A] 762 [P] 843 --> 96
-[T] 779 [E] 774 [S] 775 [T] 783 [G] 782 [E] 781 [Q] 855 --> 161
- |      [I] 784 [M] 791 [E] 785 [S] 856 --> 100
-[U] 786 [M] 792 [I] 794 [N] 797 [U] 800 [S] 858 --> 101
-[W] 799 [O] 802 [R] 801 [D] 864 --> 282
-[Z] 803 [C] 805 [H] 807 [E] 808 [C] 810 [K] 866 --> 236
+ |       |      [S]  48 [E]  57 [A]  45 [R]  47 [M]  33 --> 271
+ |       |                      [J]  51 [U]  55 [M]  46 [P]  35 --> 270
+ |       |                      [L]  36 --> 158
+ |      [O]  52 [N]  56 [S]  54 [T]  37 --> 274
+ |                      [V]  67 [D]  71 [F]  38 --> 227
+ |                               |      [N]  39 --> 225
+ |                              [F]  75 [D]  58 --> 226
+ |                               |      [N]  59 --> 224
+ |                              [N]  84 [C]  60 --> 228
+ |                               |      [D]  61 --> 223
+ |                               |      [F]  62 --> 222
+ |                               |      [Q]  63 --> 230
+ |                               |      [S]  64 --> 229
+ |                              [Q]  78 [D] 128 --> 232
+ |                                      [N] 144 --> 231
+[D]  95 [C]  80 [M]  70 [P] 105 [G] 147 --> 192
+ |       |       |              [L] 155 --> 191
+ |       |      [O]  82 [N]  87 [S]  74 [T] 161 --> 276
+ |      [D] 101 [I]  91 [V] 178 --> 189
+ |      [E] 116 [C] 182 --> 106
+ |       |       |      [L] 184 --> 93
+ |       |      [F] 114 [I] 110 [N] 120 [E] 190 --> 283
+ |       |      [Q] 191 --> 193
+ |      [G] 123 [E] 112 [Q] 194 --> 198
+ |       |      [T] 195 --> 196
+ |      [I] 113 [V] 196 --> 115
+ |      [J] 132 [E] 117 [Q] 200 --> 199
+ |       |      [G] 133 [E] 124 [Q] 204 --> 204
+ |       |       |      [T] 206 --> 202
+ |       |      [L] 140 [E] 130 [Q] 212 --> 203
+ |       |       |      [T] 213 --> 201
+ |       |      [N] 145 [E] 134 [Q] 218 --> 200
+ |       |              [G] 150 [E] 139 [Q] 222 --> 208
+ |       |               |      [T] 223 --> 206
+ |       |              [L] 156 [E] 146 [Q] 226 --> 207
+ |       |                      [T] 228 --> 205
+ |      [L] 160 [E] 149 [Q] 231 --> 197
+ |       |      [T] 232 --> 195
+ |      [M] 162 [I] 158 [N] 148 [U] 154 [S] 238 --> 187
+ |      [N] 170 [E] 164 [Q] 241 --> 194
+ |      [P] 166 [L] 163 [U] 167 [S] 243 --> 186
+ |      [T] 173 [I] 172 [M] 183 [E] 168 [S] 247 --> 188
+ |      [U] 176 [M] 181 [I] 177 [N] 174 [U] 179 [S] 257 --> 190
+ |       |      [P] 260 --> 95
+ |      [Z] 197 [C] 189 [H] 198 [E] 199 [C] 188 [K] 265 --> 238
+[E] 203 [A] 186 [S] 187 [S] 202 [E] 192 [R] 193 [T] 272 --> 241
+ |      [N] 205 [D] 275 --> 281
+ |       |              [H] 208 [D] 201 [R] 278 --> 288
+ |      [Q] 279 --> 117
+ |      [R] 207 [R] 209 [O] 210 [R] 280 --> 240
+[F] 227 [C] 214 [M] 217 [P] 211 [G] 286 --> 169
+ |       |       |              [L] 290 --> 168
+ |       |      [O] 221 [N] 219 [S] 224 [T] 306 --> 275
+ |      [D] 236 [I] 229 [V] 310 --> 166
+ |      [E] 233 [Q] 313 --> 170
+ |      [G] 249 [E] 235 [Q] 319 --> 175
+ |       |      [T] 320 --> 173
+ |      [I] 234 [X] 254 [C] 244 [O] 245 [P] 237 [Y] 324 --> 244
+ |      [J] 258 [E] 250 [Q] 328 --> 176
+ |       |      [G] 261 [E] 251 [Q] 335 --> 181
+ |       |       |      [T] 337 --> 179
+ |       |      [L] 269 [E] 259 [Q] 339 --> 180
+ |       |       |      [T] 341 --> 178
+ |       |      [N] 273 [E] 262 [Q] 346 --> 177
+ |       |              [G] 281 [E] 267 [Q] 351 --> 185
+ |       |               |      [T] 352 --> 183
+ |       |              [L] 285 [E] 274 [Q] 356 --> 184
+ |       |                      [T] 357 --> 182
+ |      [L] 289 [E] 282 [Q] 359 --> 174
+ |       |       |      [X] 293 [C] 283 [O] 284 [P] 277 [Y] 361 --> 245
+ |       |      [T] 367 --> 172
+ |      [M] 295 [I] 294 [N] 291 [U] 288 [S] 374 --> 164
+ |      [N] 308 [E] 297 [Q] 375 --> 171
+ |      [P] 303 [L] 296 [U] 299 [S] 380 --> 163
+ |      [T] 311 [I] 309 [M] 314 [E] 302 [S] 387 --> 165
+ |      [U] 312 [M] 315 [I] 316 [N] 305 [U] 317 [S] 391 --> 167
+ |      [Z] 325 [C] 321 [H] 326 [E] 329 [C] 322 [K] 398 --> 237
+[G] 332 [C] 330 [H] 334 [E] 338 [C] 331 [K] 404 --> 235
+ |      [E] 333 [Q] 407 --> 121
+ |      [L] 336 [O] 343 [B] 345 [A] 342 [L] 411 --> 278
+ |       |              [V] 347 [A] 340 [R] 413 --> 285
+ |      [T] 417 --> 119
+[I] 348 [M] 344 [P] 349 [O] 350 [R] 353 [T] 419 --> 289
+ |      [N] 363 [C] 420 --> 105
+ |               |      [L] 421 --> 91
+ |              [D] 354 [E] 355 [X] 365 [D] 427 --> 12
+ |                                      [S] 434 --> 10
+ |                                      [W] 435 --> 11
+[J] 369 [C] 376 [A] 370 [S] 373 [E] 439 --> 157
+ |      [E] 377 [Q] 444 --> 123
+ |       |              [Z] 446 --> 145
+ |      [G] 381 [E] 378 [Q] 455 --> 131
+ |       |       |              [Z] 456 --> 141
+ |       |      [T] 457 --> 127
+ |       |              [Z] 460 --> 137
+ |      [L] 392 [E] 382 [Q] 462 --> 129
+ |       |       |              [Z] 464 --> 139
+ |       |      [T] 466 --> 125
+ |       |              [Z] 467 --> 135
+ |      [N] 399 [E] 388 [Q] 470 --> 133
+ |       |                      [Z] 471 --> 143
+ |      [P] 390 [R] 394 [O] 408 [C] 474 --> 253
+ |      [R] 412 [A] 400 [N] 409 [G] 410 [E] 481 --> 159
+ |      [U] 405 [M] 403 [P] 484 --> 147
+[L] 422 [A] 423 [B] 416 [E] 418 [L] 486 --> 279
+ |      [D] 436 [G] 448 [C] 488 --> 45
+ |       |       |      [D] 492 --> 85
+ |       |       |      [F] 493 --> 47
+ |       |       |      [Q] 497 --> 89
+ |       |       |      [S] 498 --> 43
+ |       |       |      [W] 499 --> 41
+ |       |      [I] 472 [C] 502 --> 66
+ |       |       |      [D] 503 --> 71
+ |       |       |      [F] 504 --> 64
+ |       |       |      [Q] 508 --> 73
+ |       |       |      [S] 510 --> 65
+ |       |       |      [W] 513 --> 63
+ |       |      [K] 449 [D] 520 --> 77
+ |       |       |      [F] 521 --> 5
+ |       |       |      [Q] 522 --> 81
+ |       |       |      [W] 523 --> 3
+ |       |      [L] 494 [C] 524 --> 27
+ |       |       |      [D] 525 --> 83
+ |       |       |      [F] 526 --> 29
+ |       |       |      [Q] 527 --> 87
+ |       |       |      [S] 528 --> 25
+ |       |       |      [W] 532 --> 21
+ |       |      [N] 450 [W] 533 --> 57
+ |      [E] 463 [Q] 538 --> 120
+ |      [I] 465 [N] 479 [E] 541 --> 291
+ |       |              [K] 546 --> 251
+ |      [N] 473 [U] 480 [M] 549 --> 268
+ |      [O] 500 [A] 482 [D] 501 [C] 551 --> 15
+ |       |       |              [D] 563 --> 75
+ |       |       |              [F] 566 --> 16
+ |       |       |              [Q] 570 --> 79
+ |       |       |              [S] 572 --> 14
+ |       |       |              [W] 573 --> 13
+ |       |      [C] 509 [A] 507 [L] 576 --> 7
+ |      [S] 511 [L] 578 --> 111
+ |       |      [R] 579 --> 112
+ |      [T] 580 --> 118
+[M] 512 [I] 514 [N] 505 [U] 506 [S] 586 --> 99
+ |      [O] 529 [D] 594 --> 116
+ |                      [U] 519 [L] 530 [E] 596 --> 287
+[N] 531 [C] 534 [H] 535 [E] 536 [C] 537 [K] 601 --> 234
+ |      [E] 539 [Q] 602 --> 122
+ |      [O] 540 [T] 605 --> 104
+[O] 543 [F] 544 [F] 545 [S] 542 [E] 547 [T] 607 --> 9
+ |      [R] 608 --> 103
+[P] 550 [A] 552 [C] 548 [K] 609 --> 272
+ |      [C] 553 [A] 554 [L] 557 [L] 616 --> 292
+ |       |                              [W] 621 --> 293
+ |      [L] 555 [U] 556 [S] 622 --> 98
+ |      [O] 558 [P] 627 --> 97
+ |      [R] 564 [I] 559 [M] 574 [D] 565 [E] 571 [F] 644 --> 282
+ |       |      [O] 581 [C] 645 --> 280
+ |      [U] 567 [S] 575 [H] 646 --> 0
+[Q] 584 [C] 577 [M] 569 [P] 659 --> 209
+ |       |      [O] 585 [N] 582 [S] 583 [T] 666 --> 277
+ |      [D] 603 [E] 604 [C] 670 --> 156
+ |       |      [I] 587 [V] 675 --> 153
+ |      [E] 597 [Q] 677 --> 210
+ |      [G] 611 [E] 600 [Q] 682 --> 214
+ |       |      [T] 683 --> 212
+ |      [I] 606 [N] 618 [C] 686 --> 155
+ |      [J] 620 [E] 612 [Q] 687 --> 216
+ |       |      [G] 623 [E] 613 [Q] 688 --> 220
+ |       |       |      [T] 690 --> 218
+ |       |      [L] 628 [E] 619 [Q] 699 --> 219
+ |       |       |      [T] 701 --> 217
+ |       |      [N] 633 [E] 624 [Q] 704 --> 221
+ |      [L] 637 [E] 629 [Q] 708 --> 213
+ |       |      [T] 709 --> 211
+ |      [M] 638 [I] 635 [N] 630 [U] 631 [S] 716 --> 150
+ |       |      [O] 650 [D] 719 --> 154
+ |      [N] 651 [E] 641 [Q] 723 --> 215
+ |      [P] 648 [L] 640 [U] 643 [S] 727 --> 149
+ |      [T] 655 [I] 652 [M] 661 [E] 649 [S] 731 --> 151
+ |      [U] 656 [M] 662 [I] 658 [N] 653 [U] 654 [S] 734 --> 152
+ |      [Z] 672 [C] 668 [H] 673 [E] 674 [C] 669 [K] 743 --> 239
+[R] 676 [E] 663 [S] 664 [U] 678 [L] 667 [T] 680 [D] 752 --> 264
+ |       |       |                              [F] 753 --> 265
+ |       |       |                              [Q] 756 --> 266
+ |       |       |                              [W] 757 --> 263
+ |       |      [T] 679 [U] 681 [R] 684 [N] 758 --> 267
+ |       |                                      [D] 759 --> 261
+ |       |                                      [F] 760 --> 260
+ |       |                                      [Q] 765 --> 262
+ |       |                                      [W] 766 --> 259
+ |      [O] 689 [R] 768 --> 114
+[S] 705 [A] 691 [V] 700 [E] 696 [L] 702 [I] 695 [N] 703 [K] 774 --> 252
+ |      [L] 706 [I] 712 [D] 707 [E] 782 --> 254
+ |       |                              [D] 783 --> 256
+ |       |                              [F] 784 --> 257
+ |       |                              [Q] 785 --> 258
+ |       |                              [W] 786 --> 255
+ |      [T] 720 [G] 733 [C] 787 --> 53
+ |       |       |      [D] 788 --> 86
+ |       |       |      [F] 790 --> 55
+ |       |       |      [Q] 794 --> 90
+ |       |       |      [S] 797 --> 51
+ |       |       |      [W] 804 --> 49
+ |       |      [I] 738 [C] 807 --> 70
+ |       |       |      [D] 809 --> 72
+ |       |       |      [F] 810 --> 68
+ |       |       |      [Q] 811 --> 74
+ |       |       |      [S] 812 --> 69
+ |       |       |      [W] 813 --> 67
+ |       |      [K] 740 [M] 750 [A] 742 [P] 818 --> 290
+ |       |      [L] 770 [C] 823 --> 37
+ |       |       |      [D] 824 --> 84
+ |       |       |      [F] 827 --> 39
+ |       |       |      [Q] 829 --> 88
+ |       |       |      [S] 830 --> 35
+ |       |       |      [W] 831 --> 31
+ |       |      [N] 745 [W] 833 --> 60
+ |       |      [O] 754 [R] 772 [E] 779 [C] 834 --> 19
+ |       |       |                      [D] 835 --> 76
+ |       |       |                      [F] 842 --> 20
+ |       |       |                      [Q] 843 --> 80
+ |       |       |                      [S] 844 --> 18
+ |       |       |                      [W] 848 --> 17
+ |       |      [R] 781 [I] 777 [N] 793 [G] 856 --> 284
+ |      [W] 796 [A] 778 [P] 859 --> 96
+[T] 798 [E] 789 [S] 791 [T] 799 [G] 805 [E] 792 [Q] 865 --> 161
+ |      [I] 800 [M] 814 [E] 795 [S] 868 --> 100
+[U] 802 [M] 803 [I] 806 [N] 801 [U] 808 [S] 881 --> 101
+ |      [N] 815 [P] 817 [A] 820 [C] 819 [K] 885 --> 273
+[W] 821 [O] 816 [R] 822 [D] 888 --> 286
+[Z] 825 [C] 832 [H] 828 [E] 826 [C] 836 [K] 889 --> 236
 */
 
 short templ_trie[NTRIE] = {
    0,    0,    0,  242,  243,  102,  113,  107,  110,  108, 
    0,    0,    0,    0,  109,  233,    0,  269,    0,    0, 
  250,    0,  249,    0,    0,    0,    0,    0,  248,  247, 
-   0,    0,    0,  158,    0,  270,  227,  225,  226,  224, 
-   0,    0,    0,    0,    0,    0,    0,  228,    0,    0, 
-   0,    0,    0,  246,    0,  223,  222,  230,  229,    0, 
- 232,  231,  192,  191,  272,   10,   19,   50,   85,  190, 
- 212,  321,   11,  334,  357,    1,  409,  499,  523,  527, 
- 537,  570,  659,  688,  779,  786,    2,  799,   26,   24, 
- 803,    3,   12,   13,    5,    6,   32,   21,   18,   34, 
+   0,    0,    0,  271,    0,  270,  158,  274,  227,  225, 
+   0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
+   0,    0,    0,  246,    0,    0,    0,    0,  226,  224, 
+ 228,  223,  222,  230,  229,   10,   19,   50,   95,  203, 
+ 227,  332,   11,  348,  369,    1,  422,  512,  531,  543, 
+ 550,  584,  676,  705,  798,  802,    2,  821,   26,   24, 
+ 825,    3,   12,   13,    5,    6,   32,   21,   18,   34, 
    8,   44,    7,   31,   16,    9,   30,    4,   15,   40, 
-  25,   23,   14,   49,   41,   42,   17,   46,   43,   53, 
-  27,   20,   33,   22,   36,   48,  189,   38,   51,   52, 
-  45,   68,   37,   60,   28,   35,   54,   39,   59,   81, 
-  29,   47,   55,   61,   56,  106,   74,   95,   67,   65, 
-  73,   77,   71,   66,  106,   57,  111,   58,   98,  120, 
-  80,  148,  150,  160,   64,  157,   62,  126,   93,  164, 
- 165,   63,   96,  145,  108,  184,   99,  178,  279,  193, 
- 100,  182,  198,  196,  185,  115,  188,  179,  199,  105, 
- 112,  121,  204,  192,  202,  183,  128,  118,  133,  200, 
- 203,  201,  122,  206,  138,  194,  200,  127,  210,  144, 
- 208,  206,  201,  134,  207,  214,  205,  137,  219,  197, 
- 195,  168,  211,  146,  140,  143,  227,  187,  216,  149, 
- 231,  194,  220,  151,  186,  234,  152,  161,  170,  158, 
- 188,  240,  171,  190,  169,  246,   95,  163,  166,  243, 
- 186,  180,  181,  187,  238,  173,  174,  189,  177,  176, 
- 261,  241,  254,  264,  277,  191,  284,  117,  195,  240, 
- 169,  267,  193,  266,  168,  198,  271,  196,  269,  205, 
- 221,  223,  207,  236,  213,  224,  245,  222,  277,  283, 
- 295,  217,  291,  270,  209,  301,  298,  299,  274,  276, 
- 215,  166,  315,  170,  303,  225,  307,  175,  173,  232, 
- 226,  230,  242,  244,  237,  313,  250,  176,  317,  241, 
- 308,  257,  324,  262,  181,  179,  247,  180,  327,  178, 
- 332,  249,  177,  268,  325,  185,  197,  258,  273,  335, 
- 183,  329,  263,  184,  343,  182,  272,  174,  271,  351, 
- 275,  245,  340,  347,  172,  260,  280,  345,  278,  164, 
- 281,  354,  359,  279,  284,  366,  171,  285,  163,  368, 
- 286,  296,  375,  305,  289,  165,  304,  300,  294,  297, 
- 381,  167,  311,  316,  387,  319,  309,  237,  320,  394, 
- 318,  326,  322,  314,  235,  121,  333,  323,  328,  395, 
- 274,  331,  330,  281,  400,  406,  119,  285,  105,  408, 
- 346,  337,  342,  403,   91,  344,  336,  339,  338,   12, 
- 341,  419,   10,   11,  362,  407,  363,  348,  372,  430, 
- 157,  360,  353,  380,  123,  386,  422,  378,  145,  401, 
- 423,  364,  392,  131,  434,  443,  141,  127,  137,  369, 
- 451,  129,  139,  125,  135,  376,  447,  458,  133,  143, 
- 382,  396,  253,  462,  453,  159,  389,  397,  402,  390, 
- 472,  465,  147,  399,  410,  479,  404,  424,  461,  275, 
-  45,   85,  456,   47,  414,   89,   43,  467,  492,   41, 
-  66,   71,  497,  569,   64,  436,   73,  444,   65,  439, 
- 468,   63,  442,  480,  481,   77,  483,  505,    5,  508, 
-  81,  490,  491,    3,  494,   27,   83,  485,   29,  486, 
- 510,   87,   25,  489,  438,  496,  513,  498,   21,  530, 
-  57,  501,  120,  446,  470,  515,  516,  448,  518,  540, 
- 287,  452,  532,  454,  251,  544,  547,  268,  459,  521, 
- 493,  522,  469,   15,   75,  528,   16,  482,   79,  500, 
- 553,  554,   14,  556,   13,  495,    7,  111,  112,  118, 
- 575,  566,  503,  567,  558,   99,  562,  582,  509,  568, 
- 564,  502,  116,  517,  283,  234,  584,  487,  122,  526, 
- 519,  520,  514,  524,  104,  588,  594,  531,  533,  585, 
-   9,  525,  512,  103,  541,  288,  534,  289,  529,  603, 
- 535,  605,   98,  536,   97,  560,  538,  600,  614,  550, 
- 559,  542,  548,  543,  278,  612,  276,  546,  626,  561, 
- 624,  563,    0,  209,  565,  632,  571,  557,  590,  580, 
- 273,  595,  156,  591,  602,  633,  619,  622,  636,  573, 
- 635,  153,  210,  642,  639,  641,  574,  214,  640,  586, 
- 653,  652,  651,  576,  587,  212,  670,  507,  657,  599, 
- 155,  593,  216,  606,  672,  596,  220,  676,  613,  665, 
- 617,  218,  604,  219,  217,  683,  608,  221,  610,  687, 
- 681,  693,  607,  213,  211,  618,  615,  684,  150,  698, 
- 616,  634,  704,  694,  154,  625,  707,  215,  627,  149, 
- 709,  623,  637,  638,  644,  151,  645,  152,  643,  239, 
- 650,  715,  655,  646,  658,  654,  264,  265,  649,  719, 
- 717,  647,  656,  662,  266,  726,  661,  727,  669,  263, 
- 267,  660,  261,  260,  740,  667,  666,  664,  734,  262, 
- 259,  752,  114,  671,  739,  680,  685,  686,  682,  252, 
- 690,  766,  695,  692,  689,  759,  254,  256,  257,  258, 
- 255,   53,  703,   86,  716,  776,  724,   55,  723,  745, 
-  90,  732,  741,  771,  773,  772,  777,   51,   49,   70, 
-  72,  789,  790,   68,  793,   74,   69,  780,   67,  787, 
- 736,  722,  804,  788,  286,  795,   37,  796,  742,   84, 
- 743,  798,  806,  809,   39,  814,   88,   35,   31,  820, 
-  60,  749,  763,  753,   19,   76,  816,  750,  817,   20, 
- 824,  825,  818,  829,  767,   80,  768,   18,   17,  778, 
- 280,  762,  843,   96,  835,  761,  837,  769,  774,  840, 
- 838,  781,  784,  770,  782,  161,  100,  775,  101,  783, 
- 785,  791,  855,  792,  282,  794,  236,    0,  856,  864, 
- 805,    0,  797,    0,    0,  810,  808,  807,  802,    0, 
-   0,    0,  800,  858,  801,  866,    0,    0,    0,    0, 
+  25,   23,   14,   49,   41,   42,   17,   57,   43,   53, 
+  27,   20,   45,   22,   33,   48,   35,   47,  232,   52, 
+  56,   51,   46,   36,   28,   71,   55,   75,   37,   54, 
+  29,   38,   67,   58,  231,   84,  128,  192,   78,   39, 
+ 105,   60,   61,   59,   62,  191,  144,   70,  161,   82, 
+  87,  276,   80,  101,  116,   63,  123,   64,  113,  132, 
+  74,  160,  162,  170,   91,  166,  147,  178,  189,  173, 
+ 176,  155,  106,  182,   93,  197,  114,  110,  120,  190, 
+ 283,  193,  112,  194,  198,  196,  115,  191,  200,  196, 
+ 199,  117,  124,  133,  204,  204,  202,  195,  140,  130, 
+ 145,  212,  203,  201,  134,  218,  150,  206,  200,  139, 
+ 222,  156,  208,  206,  213,  146,  207,  226,  205,  149, 
+ 231,  197,  195,  154,  223,  158,  148,  238,  187,  164, 
+ 228,  194,  163,  186,  232,  241,  172,  188,  167,  183, 
+ 243,  247,  168,  181,  177,  174,  260,  190,  184,  179, 
+  95,  198,  257,  265,  189,  238,  188,  199,  186,  187, 
+ 202,  192,  241,  275,  193,  281,  201,  272,  288,  117, 
+ 240,  205,  286,  278,  279,  207,  169,  290,  210,  209, 
+ 168,  217,  280,  221,  214,  236,  233,  211,  249,  219, 
+ 234,  258,  224,  289,  295,  308,  275,  303,  306,  229, 
+ 166,  311,  312,  170,  313,  310,  319,  325,  235,  175, 
+ 173,  244,  254,  245,  244,  237,  324,  250,  176,  261, 
+ 251,  328,  335,  320,  269,  181,  273,  179,  259,  180, 
+ 339,  178,  262,  346,  281,  337,  177,  208,  351,  285, 
+ 267,  185,  183,  341,  274,  356,  184,  182,  282,  174, 
+ 283,  245,  284,  359,  277,  352,  361,  172,  294,  357, 
+ 293,  374,  291,  367,  164,  171,  288,  297,  375,  296, 
+ 163,  299,  380,  302,  309,  387,  314,  165,  316,  315, 
+ 317,  167,  321,  326,  305,  329,  322,  398,  237,  330, 
+ 391,  333,  334,  338,  235,  331,  404,  121,  336,  345, 
+ 342,  278,  340,  285,  407,  343,  417,  119,  411,  289, 
+ 105,   91,  413,  355,  349,  344,  363,   12,  350,  347, 
+ 420,  354,  353,  427,   10,   11,  376,  419,  377,  157, 
+ 381,  370,  439,  365,  123,  392,  145,  399,  434,  390, 
+ 378,  412,  435,  373,  405,  131,  141,  127,  444,  455, 
+ 137,  382,  129,  462,  139,  457,  125,  135,  388,  470, 
+ 133,  143,  394,  408,  253,  474,  466,  400,  409,  481, 
+ 410,  159,  403,  484,  147,  418,  279,  423,   45,  416, 
+ 436,  463,   85,   47,  486,  465,  421,   89,   43,   41, 
+ 473,  500,   66,   71,   64,  511,  580,  448,   73,  472, 
+  65,  449,  494,   63,  450,  488,  492,  520,  493,  521, 
+  77,    5,   81,    3,   27,   83,   29,   87,   25,  497, 
+ 522,  498,   21,   57,  446,  499,  523,  533,  120,  502, 
+ 503,  291,  504,  479,  538,  456,  251,  460,  541,  268, 
+ 501,   15,  464,  508,  546,  510,  467,  549,  480,  513, 
+ 471,  524,  525,   75,  526,  482,   16,  509,  551,  563, 
+  79,  566,   14,   13,  507,  527,    7,  528,  111,  112, 
+ 118,  532,  570,  576,  572,  514,   99,  578,  573,  586, 
+ 506,  529,  505,  579,  116,  530,  287,  594,  534,  596, 
+ 539,  234,  122,  537,  536,  104,  535,    9,  103,  272, 
+ 540,  547,  601,  544,  545,  552,  292,  553,  554,  548, 
+ 602,  293,   98,  609,  605,  608,  555,   97,  542,  558, 
+ 557,  607,  564,  616,  571,  567,  574,  559,  627,  622, 
+ 556,  644,  565,  581,  282,  280,    0,  646,  645,  659, 
+ 575,  577,  603,  597,  569,  611,  585,  606,  620,  209, 
+ 637,  638,  651,  582,  648,  583,  277,  666,  655,  656, 
+ 156,  670,  604,  675,  672,  153,  587,  210,  677,  519, 
+ 600,  682,  214,  212,  618,  686,  155,  216,  220,  612, 
+ 218,  623,  613,  687,  688,  683,  628,  619,  633,  219, 
+ 699,  217,  624,  621,  221,  704,  629,  690,  213,  211, 
+ 708,  635,  701,  630,  716,  631,  150,  650,  719,  154, 
+ 641,  709,  723,  215,  640,  643,  727,  149,  652,  661, 
+ 649,  151,  731,  662,  152,  658,  653,  734,  654,  668, 
+ 673,  669,  674,  239,  743,  663,  664,  679,  752,  678, 
+ 753,  680,  264,  265,  667,  689,  266,  263,  267,  261, 
+ 260,  756,  758,  684,  681,  262,  259,  757,  114,  696, 
+ 691,  768,  702,  703,  252,  695,  782,  700,  774,  712, 
+ 707,  706,  254,  256,  257,  258,  255,   53,   86,  720, 
+  55,  733,  796,  738,   90,  740,  770,   51,  745,  754, 
+ 787,  788,  781,  790,   49,  807,  809,   70,  810,   72, 
+  68,   74,   69,   67,  794,  742,  797,  750,  290,  811, 
+ 804,  812,  818,   37,   84,  813,  759,   39,  760,   88, 
+  35,   31,  833,   60,   19,   76,  772,  823,  824,  765, 
+ 827,  779,   20,   80,   18,  766,  834,  835,   17,  842, 
+ 783,  829,  784,  830,  777,  793,  284,  831,  859,   96, 
+ 843,  778,  844,  785,  856,  161,  848,  789,  100,  786, 
+ 805,  800,  791,  865,  792,  799,  806,  814,  868,  803, 
+ 815,  101,  820,  795,  801,  273,  808,  819,  286,  236, 
+ 888,  881,  832,  836,  885,  817,    0,  826,  822,    0, 
+ 816,    0,    0,    0,  828,    0,    0,    0,    0,    0, 
+   0,  889,    0,    0,    0,    0,    0,    0,    0,    0, 
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
@@ -640,8 +651,7 @@
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
-   0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 
-   0,    0,    0,    0,    0, 
+   0,    0,    0,    0,    0,    0,    0,    0, 
 };
 
 uchar templ_check[NTRIE] = {
@@ -649,91 +659,94 @@
  128,  128,  128,  128,    0,    0,  128,    0,  128,  128, 
    0,  128,    0,  128,  128,  128,  128,  128,    0,    0, 
  128,  128,  128,    0,  128,    0,    0,    0,    0,    0, 
- 128,  128,  128,  128,  128,  128,  128,    0,  128,  128, 
- 128,  128,  128,    0,  128,    0,    0,    0,    0,  128, 
+ 128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
+ 128,  128,  128,    0,  128,  128,  128,  128,    0,    0, 
    0,    0,    0,    0,    0,  'A',  'B',  'C',  'D',  'E', 
  'F',  'G',  'G',  'I',  'J',  'I',  'L',  'M',  'N',  'O', 
  'P',  'Q',  'R',  'S',  'T',  'U',  'L',  'W',  'N',  'N', 
  'Z',  'C',  'I',  'S',  'D',  'R',  'T',  'A',  'O',  'N', 
  'T',  'R',  'D',  'U',  'O',  'R',  'O',  'S',  'D',  'N', 
  'N',  'O',  'R',  'E',  'A',  'A',  'K',  'E',  'L',  'L', 
- 'X',  'D',  'L',  'F',  'F',  'S',    0,  'D',  'S',  'O', 
- 'N',  'V',  'N',  'D',  'Q',  'T',  'D',  'N',  'F',  'I', 
- 'W',  'C',  'D',  'N',  'F',    0,  'N',  'P',  'M',  'Q', 
- 'O',  'N',  'C',  'D',  'E',  'Q',  'G',  'S',  'I',  'J', 
- 'S',  'L',  'M',  'N',  'T',  'P',  'G',  'V',    0,  'T', 
- 'U',  'L',  'I',  'C',  'N',  'Z',  'F',  'E',    0,    0, 
- 'E',  'Q',    0,    0,  'V',    0,  'Q',  'Q',    0,  'E', 
- 'E',  'G',    0,  'Q',    0,  'T',  'L',  'E',  'N',  'Q', 
-   0,    0,  'E',  'Q',  'G',  'T',    0,  'E',  'Q',  'L', 
-   0,    0,  'T',  'E',    0,  'Q',    0,  'E',  'Q',    0, 
-   0,  'L',  'T',  'I',  'N',  'U',  'S',    0,  'T',  'E', 
- 'Q',    0,  'T',  'L',    0,  'S',  'U',  'I',  'M',  'E', 
-   0,  'S',  'M',    0,  'I',  'P',    0,  'N',  'U',  'S', 
- 'E',  'C',  'H',  'C',    0,  'A',  'S',  'S',  'E',  'R', 
- 'T',    0,  'K',  'D',    0,  'D',    0,    0,  'N',    0, 
-   0,  'Q',  'R',  'R',    0,  'R',    0,  'O',  'R',  'C', 
- 'D',  'E',  'M',  'G',  'O',  'I',  'J',  'P',  'L',  'M', 
- 'N',  'N',  'P',  'G',  'I',  'V',  'T',  'U',  'L',  'T', 
- 'S',    0,  'Z',    0,  'Q',  'E',  'Q',    0,    0,  'C', 
- 'P',  'O',  'X',    0,  'E',  'Y',  'G',    0,  'Q',  'E', 
- 'T',  'L',  'Q',  'N',    0,    0,  'E',    0,  'Q',    0, 
- 'Q',  'E',    0,  'G',  'T',    0,  'H',  'E',  'L',  'Q', 
-   0,  'T',  'E',    0,  'Q',    0,  'E',    0,  'C',  'Y', 
- 'O',    0,  'T',  'Q',    0,  'P',  'I',  'T',  'N',    0, 
- 'X',  'T',  'S',  'U',  'E',  'Q',    0,  'L',    0,  'S', 
- 'U',  'I',  'S',  'M',  'E',    0,  'M',  'I',  'N',  'U', 
- 'S',    0,  'C',  'H',  'K',  'E',  'C',    0,  'C',  'K', 
- 'E',  'E',  'H',  'C',    0,    0,  'B',  'L',  'A',  'Q', 
-   0,  'A',  'O',    0,  'L',  'T',    0,    0,    0,  'C', 
- 'D',  'M',  'N',  'R',    0,  'E',  'V',  'P',  'O',    0, 
- 'R',  'D',    0,    0,  'C',  'T',  'E',  'A',  'G',  'E', 
-   0,  'S',  'X',  'L',    0,  'N',  'S',  'P',    0,  'R', 
- 'W',  'E',  'U',    0,  'Q',  'Q',    0,    0,    0,  'E', 
- 'Q',    0,    0,    0,    0,  'E',  'T',  'Q',    0,    0, 
- 'R',  'O',    0,  'C',  'T',    0,  'A',  'N',  'G',  'M', 
- 'P',  'E',    0,  'E',  'A',  'L',  'B',  'D',  'E',    0, 
-   0,    0,  'I',    0,  'L',    0,    0,  'N',  'O',    0, 
-   0,    0,  'S',  'T',    0,  'G',    0,  'I',    0,  'K', 
- 'L',    0,  'N',  'C',  'D',    0,  'F',  'D',    0,  'F', 
-   0,  'C',  'D',    0,  'F',    0,    0,  'Q',    0,  'S', 
- 'Q',    0,    0,  'W',  'Z',  'Q',  'W',  'S',    0,  'W', 
-   0,  'W',    0,  'Z',  'N',  'C',  'D',  'Z',  'F',  'E', 
-   0,  'Z',  'Q',  'Z',    0,  'K',  'M',    0,  'Z',  'Q', 
- 'D',  'S',  'U',    0,    0,  'W',    0,  'A',    0,  'C', 
- 'C',  'D',    0,  'F',    0,  'A',    0,    0,    0,    0, 
- 'S',  'L',  'I',  'L',  'Q',    0,  'S',  'D',  'O',  'R', 
- 'W',  'N',    0,  'L',    0,    0,  'E',  'U',    0,  'E', 
- 'C',  'H',  'E',  'C',    0,  'Q',  'T',  'F',  'E',  'K', 
-   0,  'F',  'O',    0,  'C',    0,  'A',    0,  'S',  'R', 
- 'L',  'L',    0,  'L',    0,  'E',  'O',  'T',  'P',  'R', 
- 'M',  'U',  'U',  'I',    0,  'S',    0,  'D',  'C',  'O', 
- 'F',  'S',    0,    0,  'M',  'H',  'O',  'C',  'D',  'E', 
-   0,  'G',    0,  'I',  'J',  'P',  'L',  'M',  'N',  'N', 
- 'P',    0,    0,  'C',  'T',  'U',  'S',    0,  'T',  'E', 
- 'Z',  'Q',  'V',  'I',  'E',    0,  'C',  'U',  'Q',  'N', 
-   0,  'E',    0,  'G',  'Q',  'E',    0,  'Q',  'L',  'T', 
- 'N',    0,  'E',    0,    0,  'Q',  'E',    0,  'E',  'Q', 
- 'T',  'Q',  'W',    0,    0,  'I',  'N',  'T',    0,  'S', 
- 'U',  'O',  'D',  'T',    0,  'E',  'Q',    0,  'U',    0, 
- 'S',  'L',  'I',  'E',  'M',    0,  'I',    0,  'M',    0, 
- 'C',  'S',  'H',  'N',  'E',  'C',    0,    0,  'E',  'K', 
- 'S',  'U',  'S',  'T',    0,  'D',  'L',  'F',  'O',    0, 
-   0,  'U',    0,    0,  'N',  'T',  'R',  'U',  'Q',    0, 
-   0,  'R',    0,  'A',  'W',  'E',  'L',  'V',  'I',    0, 
- 'N',  'E',  'I',  'D',  'L',  'K',    0,    0,    0,    0, 
-   0,    0,  'T',    0,  'G',  'W',  'I',    0,  'K',  'L', 
-   0,  'N',  'O',  'C',  'D',  'R',  'F',    0,    0,    0, 
-   0,  'C',  'D',    0,  'F',    0,    0,  'Q',    0,  'S', 
- 'M',  'A',  'P',  'W',    0,  'Q',    0,  'S',  'D',    0, 
- 'F',  'W',  'C',  'D',    0,  'F',    0,    0,    0,  'W', 
-   0,  'Q',  'E',  'R',    0,    0,  'Q',  'W',  'S',    0, 
- 'C',  'D',  'W',  'F',  'D',    0,  'F',    0,    0,  'N', 
-   0,  'A',  'P',    0,  'Q',  'I',  'S',  'Q',  'E',  'G', 
- 'W',  'E',  'I',  'W',  'G',    0,    0,  'S',    0,  'T', 
- 'E',  'M',  'Q',  'M',    0,  'I',    0,  128,  'S',  'D', 
- 'C',  128,  'N',  128,  128,  'C',  'E',  'H',  'O',  128, 
- 128,  128,  'U',  'S',  'R',  'K',  128,  128,  128,  128, 
+ 'X',  'D',  'A',  'F',  'M',  'S',  'P',  'R',    0,  'O', 
+ 'N',  'J',  'M',  'L',  'Q',  'D',  'U',  'F',  'T',  'S', 
+ 'W',  'F',  'V',  'D',    0,  'N',  'D',    0,  'Q',  'N', 
+ 'P',  'C',  'D',  'N',  'F',    0,  'N',  'M',  'T',  'O', 
+ 'N',    0,  'C',  'D',  'E',  'Q',  'G',  'S',  'I',  'J', 
+ 'S',  'L',  'M',  'N',  'I',  'P',  'G',  'V',    0,  'T', 
+ 'U',  'L',    0,  'C',    0,  'Z',  'F',  'I',  'N',  'E', 
+   0,    0,  'E',  'Q',    0,    0,    0,  'Q',  'Q',  'V', 
+   0,  'E',  'E',  'G',    0,  'Q',    0,  'T',  'L',  'E', 
+ 'N',  'Q',    0,    0,  'E',  'Q',  'G',  'T',    0,  'E', 
+ 'Q',  'L',    0,    0,  'T',  'E',    0,  'Q',    0,  'E', 
+ 'Q',    0,    0,  'U',  'T',  'I',  'N',  'S',    0,  'E', 
+ 'T',    0,  'L',    0,  'T',  'Q',  'I',    0,  'U',  'M', 
+ 'S',  'S',  'E',  'M',  'I',  'N',  'P',    0,  'L',  'U', 
+   0,  'H',  'S',  'K',  'C',    0,  'C',  'E',  'A',  'S', 
+ 'S',  'E',    0,  'D',  'R',    0,  'D',  'T',    0,    0, 
+   0,  'N',  'G',  'R',  'Q',  'R',    0,  'L',  'O',  'R', 
+   0,  'M',  'R',  'O',  'C',  'D',  'E',  'P',  'G',  'N', 
+ 'I',  'J',  'S',  'L',  'M',  'N',    0,  'P',  'T',  'I', 
+   0,  'T',  'U',    0,  'Q',  'V',  'Q',  'Z',  'E',    0, 
+   0,  'C',  'X',  'O',    0,  'P',  'Y',  'E',    0,  'G', 
+ 'E',  'Q',  'Q',  'T',  'L',    0,  'N',    0,  'E',    0, 
+ 'Q',    0,  'E',  'Q',  'G',  'T',    0,  'H',  'Q',  'L', 
+ 'E',    0,    0,  'T',  'E',  'Q',    0,    0,  'E',    0, 
+ 'C',    0,  'O',  'Q',  'P',  'T',  'Y',    0,  'I',  'T', 
+ 'X',  'S',  'N',  'T',    0,    0,  'U',  'E',  'Q',  'L', 
+   0,  'U',  'S',  'E',  'I',  'S',  'M',    0,  'I',  'M', 
+ 'U',    0,  'C',  'H',  'N',  'E',  'C',  'K',    0,  'C', 
+ 'S',  'E',  'H',  'E',    0,  'C',  'K',    0,  'L',  'B', 
+ 'A',    0,  'A',    0,  'Q',  'O',  'T',    0,  'L',    0, 
+   0,    0,  'R',  'E',  'P',  'M',  'N',    0,  'O',  'V', 
+ 'C',  'D',  'R',  'D',    0,    0,  'C',  'T',  'E',    0, 
+ 'G',  'A',  'E',  'X',    0,  'L',    0,  'N',  'S',  'P', 
+ 'E',  'R',  'W',  'S',  'U',    0,    0,    0,  'Q',  'Q', 
+   0,  'E',    0,  'Q',    0,  'T',    0,    0,  'E',  'Q', 
+   0,    0,  'R',  'O',    0,  'C',  'T',  'A',  'N',  'E', 
+ 'G',    0,  'M',  'P',    0,  'E',    0,  'A',    0,  'B', 
+ 'D',  'E',    0,    0,  'L',  'I',  'L',    0,    0,    0, 
+ 'N',  'O',    0,    0,    0,  'S',  'T',  'G',    0,  'I', 
+   0,  'K',  'L',    0,  'N',  'C',  'D',  'D',  'F',  'F', 
+   0,    0,    0,    0,    0,    0,    0,    0,    0,  'Q', 
+ 'Q',  'S',    0,    0,  'Z',  'W',  'W',  'W',    0,  'C', 
+ 'D',    0,  'F',  'N',  'Q',  'Z',    0,  'Z',  'E',    0, 
+ 'D',    0,  'Z',  'Q',  'K',  'S',  'Z',  'M',  'U',  'W', 
+ 'Z',  'C',  'D',    0,  'F',  'A',    0,  'C',  'C',  'D', 
+   0,  'F',    0,    0,  'A',  'Q',    0,  'S',    0,    0, 
+   0,  'W',  'Q',  'L',  'S',  'I',    0,  'L',  'W',  'S', 
+ 'U',  'O',  'N',  'R',    0,  'L',    0,  'D',  'C',  'E', 
+ 'E',    0,    0,  'C',  'E',    0,  'H',    0,    0,    0, 
+ 'O',  'E',  'K',  'F',  'F',  'A',    0,  'C',  'A',  'C', 
+ 'Q',    0,    0,  'K',  'T',  'R',  'L',    0,  'S',  'O', 
+ 'L',  'T',  'R',  'L',  'E',  'U',  'M',  'I',  'P',  'S', 
+ 'U',  'F',  'D',  'O',    0,    0,    0,  'H',  'C',  'P', 
+ 'S',  'C',  'D',  'E',  'M',  'G',  'O',  'I',  'J',    0, 
+ 'L',  'M',  'N',  'N',  'P',  'S',    0,  'T',  'T',  'U', 
+   0,  'C',  'E',  'V',  'Z',    0,  'I',    0,  'Q',  'U', 
+ 'E',  'Q',    0,    0,  'N',  'C',    0,    0,    0,  'E', 
+   0,  'G',  'E',  'Q',  'Q',  'T',  'L',  'E',  'N',    0, 
+ 'Q',    0,  'E',  'W',    0,  'Q',  'E',  'T',    0,    0, 
+ 'Q',  'I',  'T',  'N',  'S',  'U',    0,  'O',  'D',    0, 
+ 'E',  'T',  'Q',    0,  'L',  'U',  'S',    0,  'I',  'M', 
+ 'E',    0,  'S',  'M',    0,  'I',  'N',  'S',  'U',  'C', 
+ 'H',  'C',  'E',    0,  'K',  'E',  'S',  'T',  'D',  'U', 
+ 'F',  'T',    0,    0,  'L',  'O',    0,    0,    0,    0, 
+   0,  'Q',  'N',  'R',  'U',    0,    0,  'W',    0,  'E', 
+ 'A',  'R',  'L',  'N',    0,  'I',  'E',  'V',  'K',  'I', 
+ 'D',  'L',    0,    0,    0,    0,    0,    0,    0,  'T', 
+   0,  'G',  'W',  'I',    0,  'K',  'L',    0,  'N',  'O', 
+ 'C',  'D',  'R',  'F',    0,  'C',  'D',    0,  'F',    0, 
+   0,    0,    0,    0,  'Q',  'A',  'S',  'M',    0,  'Q', 
+ 'W',  'S',  'P',    0,    0,  'W',  'D',    0,  'F',    0, 
+   0,    0,  'W',    0,    0,    0,  'R',  'C',  'D',  'Q', 
+ 'F',  'E',    0,    0,    0,  'W',  'C',  'D',    0,  'F', 
+ 'D',  'Q',  'F',  'S',  'I',  'N',    0,  'W',  'P',    0, 
+ 'Q',  'A',  'S',  'Q',  'G',    0,  'W',  'E',    0,  'W', 
+ 'G',  'I',  'S',  'Q',  'E',  'T',  'I',  'M',  'S',  'M', 
+ 'N',    0,  'A',  'E',  'N',    0,  'U',  'C',    0,    0, 
+ 'D',  'S',  'C',  'C',  'K',  'P',  128,  'E',  'R',  128, 
+ 'O',  128,  128,  128,  'H',  128,  128,  128,  128,  128, 
+ 128,  'K',  128,  128,  128,  128,  128,  128,  128,  128, 
  128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
  128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
  128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
@@ -743,6 +756,5 @@
  128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
  128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
  128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
- 128,  128,  128,  128,  128,  128,  128,  128,  128,  128, 
- 128,  128,  128,  128,  128, 
+ 128,  128,  128,  128,  128,  128,  128,  128, 
 };