home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / unix / vim-6.2.tar.bz2 / vim-6.2.tar / vim62 / src / hangulin.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-06-04  |  59.4 KB  |  1,622 lines

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved    by Bram Moolenaar
  4.  *
  5.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  6.  * Do ":help credits" in Vim to see a list of people who contributed.
  7.  * See README.txt for an overview of the Vim source code.
  8.  */
  9.  
  10. #include "vim.h"
  11.  
  12. #ifndef HANGUL_DEFAULT_KEYBOARD
  13. # define HANGUL_DEFAULT_KEYBOARD 3
  14. #endif
  15.  
  16. #define AUTOMATA_NEW        0
  17. #define AUTOMATA_CORRECT    1
  18. #define AUTOMATA_SPECIAL    2
  19. #define AUTOMATA_CORRECT_NEW    3
  20. #define AUTOMATA_ERROR        4
  21. #define AUTOMATA_NULL        5
  22.  
  23. #define F_F    0x1    /* ├╩╝║ (initial sound) */
  24. #define F_M    0x2    /* ┴▀╝║ (medial vowel) */
  25. #define F_L    0x4    /* ┴╛╝║ (final consonant) */
  26. #define F_A    0x8    /* ASCII */
  27. #define F_NULL 1
  28. #define M_NULL 2
  29. #define L_NULL 1
  30.  
  31. static int hangul_input_state = 0;
  32. static int f=F_NULL, m=M_NULL, l=L_NULL;
  33. static int sp=0;
  34. static char_u stack[20] = {0};
  35. static int last_l = -1, last_ll = -1;
  36. static int hangul_keyboard_type = HANGUL_DEFAULT_KEYBOARD;
  37.  
  38. static void convert_ks_to_3 __ARGS((const char_u *src, int *fp, int *mp, int *lp));
  39. static int convert_3_to_ks __ARGS((int fv, int mv, int lv, char_u *des));
  40. static int hangul_automata2 __ARGS((char_u *buf, unsigned int *c));
  41. static int hangul_automata3 __ARGS((char_u *buf, unsigned int *c));
  42.  
  43. #define push(x)     {stack[ sp++ ] = *(x); stack[sp++] = *((x)+1);}
  44. #define pop(x)     {*((x) + 1) = stack[--sp]; *(x) = stack[--sp];}
  45. #define query(x) {*((x) + 1) = stack[sp - 1]; *(x) = stack[sp - 2];}
  46.  
  47. #define convert_3_to_code convert_3_to_ks
  48.  
  49.  
  50. /**********************************************************************/
  51. /****** 3 ╣·╜─└┌╞╟└╗ └º╟╤ ╖τ╞╛  (Routines for 3 bulsik keyboard) ******/
  52. /**********************************************************************/
  53.  
  54. /* 3 ╣·╜─┐í╝¡ └┌╞╟ ║»╚» (3 bulsik keyboard conversion) */
  55.  
  56. static char_u value_table_for_3[] =
  57. {
  58.     24  , '"' , '#' , '$' , '%' , '&' ,    /* ! " # $ % & */
  59.     18  , '(' , ')' , '*' , '+' , ',' ,    /* ' ( ) * + , */
  60.     '-' , '.' , 13  , 17  , 29  , 22  ,    /* - . / 0 1 2 */
  61.     19  , 19  , 26  , 5   , 12  , 28  ,    /* 3 4 5 6 7 8 */
  62.     20  , ':' , 9   , '2' , '=' , '3' ,    /* 9 : ; < = > */
  63.     '?' , '@' , 8   , '!' , 11  , 10  ,    /* ? @ A B C D */
  64.     26  , 3   , '/' , 39  , '8' , '4' ,    /* E F G H I J */
  65.     '5' , '6' , '1' , '0' , '9' , '>' ,    /* K L M N O P */
  66.     28  , 6   , 7   , ';' , '7' , 16  ,    /* Q R S T U V */
  67.     27  , 20  , '<' , 25  , '[' , 92  ,    /* W X Y Z [ \ */
  68.     ']' , '^' , '_' , '`' , 23  , 20  ,    /* ] ^ _ ` a b */
  69.     10  , 29  , 11  , 3   , 27  , 4   ,    /* c d e f g h */
  70.     8   , 13  , 2   , 14  , 20  , 11  ,    /* i j k l m n */
  71.     16  , 19  , 21  , 4   , 5   , 7   ,    /* o p q r s t */
  72.     5   , 13  , 9   , 2   , 7   , 17  ,    /* u v w x y z */
  73. };
  74.  
  75. static short_u kind_table_for_3[] =
  76. {
  77.     F_L, F_A, F_A, F_A, F_A, F_A,    /* ! " # $ % & */
  78.     F_F, F_A, F_A, F_A, F_A, F_A,    /* ' ( ) * + , */
  79.     F_A, F_A, F_M, F_F, F_L, F_L,    /* - . / 0 1 2 */
  80.     F_L, F_M, F_M, F_M, F_M, F_M,    /* 3 4 5 6 7 8 */
  81.     F_M, F_A, F_F, F_A, F_A, F_A,    /* 9 : ; < = > */
  82.     F_A, F_A, F_L, F_A, F_L, F_L,    /* ? @ A B C D */
  83.     F_L, F_L, F_A, F_A, F_A, F_A,    /* E F G H I J */
  84.     F_A, F_A, F_A, F_A, F_A, F_A,    /* K L M N O P */
  85.     F_L, F_M, F_L, F_A, F_A, F_L,    /* Q R S T U V */
  86.     F_L, F_L, F_A, F_L, F_A, F_A,    /* W X Y Z [ \ */
  87.     F_A, F_A, F_A, F_A, F_L, F_M,    /* ] ^ _ ` a b */
  88.     F_M, F_M, F_M, F_M, F_M, F_F,    /* c d e f g h */
  89.     F_F, F_F, F_F, F_F, F_F, F_F,    /* i j k l m n */
  90.     F_F, F_F, F_L, F_M, F_L, F_M,    /* o p q r s t */
  91.     F_F, F_M, F_L, F_L, F_F, F_L,    /* u v w x y z */
  92. };
  93.  
  94. /* 3 ╣·╜─┐í╝¡ (╟÷└τ├╩╝║, └╘╖┬┐╡╣«) -> ║╣╟╒├╩╝║ ├│╕«
  95.  * 3 bulsik: (current initial sound, input english) -> compound initial sound.
  96.  */
  97.  
  98.     static int
  99. comfcon3(v, c)
  100.     int    v;
  101.     int c;
  102. {
  103.     if (v == 2 && c == 2)
  104.     return 3;
  105.     if (v == 5 && c == 5)
  106.     return 6;
  107.     if (v == 9 && c == 9)
  108.     return 10;
  109.     if (v == 11 && c == 11)
  110.     return 12;
  111.     if (v == 14 && c == 14)
  112.     return 15;
  113.     return 0;
  114. }
  115.  
  116. /* 3 ╣·╜─┐í╝¡ (╟÷└τ╕≡└╜, └╘╖┬ ┐╡╣«) -> ║╣╟╒ ╕≡└╜ ├│╕«
  117.  * 3 bulsik: (current vowel, input english) -> compound vowel.
  118.  */
  119.  
  120.     static int
  121. comvow3(v, c)
  122.     int v;
  123.     int c;
  124. {
  125.     switch (v)
  126.     {
  127.     case 13:                    /* ñ╟ */
  128.         switch (c) {
  129.         case 3:                    /* ñ╟ñ┐ */
  130.             return 14;
  131.         case 4:                    /* ñ╟ñ└ */
  132.             return 15;
  133.         case 29:                /* ñ╟ñ╙ */
  134.             return 18;
  135.         }
  136.         break;
  137.  
  138.     case 20:                    /* ñ╠ */
  139.         switch (c) {
  140.         case 7:                    /* ñ╠ñ├ */
  141.             return 21;
  142.         case 10:                /* ñ╠ñ─ */
  143.             return 22;
  144.         case 29:                /* ñ╠ñ╙ */
  145.             return 23;
  146.         }
  147.         break;
  148.  
  149.         /* 3 ╣·╜─ └┌╞╟└║ ñ╤ñ╙ ░í └╓└╕╣╟╖╬ ... */
  150.     }
  151.     return 0;
  152. }
  153.  
  154. /* 3 ╣·╜─┐í╝¡ (╟÷└τ ╣▐─º, ┐╡╣«└┌ └╘╖┬) -> ╣▐─º
  155.  * 3 bulsik: (current prop(?), input english) -> prop(?).
  156.  * I want to say, the 'prop' is similar to 'final consonant', but not vowel.
  157.  * (I cannot find the real english from my dictionary. Sorry!)
  158.  * VIM: V = initial sound, I = medial vowel, M = final consonant.
  159.  */
  160.  
  161.     static int
  162. comcon3(k, c)
  163.     int k;
  164.     int c;
  165. {
  166.     switch (k)
  167.     {
  168.     case 2:                        /* ñí */
  169.         switch (c) {
  170.         case 2:
  171.             return 3;                /* ñíñí */
  172.         case 21:
  173.             return 4;                /* ñíñ╡ */
  174.         }
  175.         break;
  176.  
  177.     case 5:                        /* ññ */
  178.         switch (c) {
  179.         case 24:                /* ñññ╕ */
  180.             return 6;
  181.         case 29:
  182.             return 7;                /* ñññ╛ */
  183.         }
  184.         break;
  185.  
  186.     case 9:                        /* ñ⌐ */
  187.         switch (c) {
  188.         case 2:                    /* ñ⌐ñí */
  189.             return 10;
  190.         case 17:                /* ñ⌐ñ▒ */
  191.             return 11;
  192.         case 19:                /* ñ⌐ñ▓ */
  193.             return 12;
  194.         case 21:                /* ñ⌐ñ╡ */
  195.             return 13;
  196.         case 27:                /* ñ⌐ñ╝ */
  197.             return 14;
  198.         case 28:                /* ñ⌐ñ╜ */
  199.             return 15;
  200.         case 29:                /* ñ⌐ñ╛ */
  201.             return 16;
  202.         }
  203.         break;
  204.  
  205.     case 19:
  206.         switch (c) {
  207.         case 21:                /* ñ▓ñ╡ */
  208.             return 20;
  209.         }
  210.         break;
  211.     }
  212.     return 0;
  213. }
  214.  
  215. /**********************************************************************/
  216. /****** 2 ╣·╜─└┌╞╟└╗ └º╟╤ ╖τ╞╛  (Routines for 2 bulsik keyboard) ******/
  217. /**********************************************************************/
  218.  
  219.     static int
  220. kind_table_for_2(c)
  221.     int c;
  222. {
  223.     static char_u table[] =
  224.     {
  225.      /* a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s */
  226.     0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  227.      /* t, u, v, w, x, y, z */
  228.     0, 1, 0, 0, 0, 1, 0
  229.     };
  230.  
  231.     if (c <= 'Z')
  232.     c -= 'A';
  233.     else
  234.     c -= 'a';
  235.  
  236.     return table[c];
  237. }
  238.  
  239. /* 2 ╣·╜─┐í╝¡ ┐╡╣«└┌ -> ┴╢╟╒╟ⁿ ├╩╝║ ║»╚»
  240.  * (2 bulsik: conversion english char. to initial sound of compound type)
  241.  * ░ß░·: ├╩╝║└╠ ╛╞┤╧╕Θ 0 (If it is not initial sound, return 0).
  242.  */
  243.     static int
  244. fcon(c)
  245.     int c;
  246. {
  247.     static char_u table[] =
  248.     {
  249.     /*E */ 6 , /*F */ 0 , /*G */ 0 , /*H */ 0 , /*I */ 0 , /*J */ 0 , /*K */ 0 ,
  250.     /*L */ 0 , /*M */ 0 , /*N */ 0 , /*O */ 0 , /*P */ 0 , /*Q */ 10, /*R */ 3 ,
  251.     /*S */ 0 , /*T */ 12, /*U */ 0 , /*V */ 0 , /*W */ 15, /*X */ 0 , /*Y */ 0 ,
  252.     /*Z */ 0 , /*[ */ 0 , /*\ */ 0 , /*] */ 0 , /*^ */ 0 , /*_ */ 0 , /*` */ 0 ,
  253.     /*a */ 8 , /*b */ 0 , /*c */ 16, /*d */ 13, /*e */ 5 , /*f */ 7 , /*g */ 20,
  254.     /*h */ 0 , /*i */ 0 , /*j */ 0 , /*k */ 0 , /*l */ 0 , /*m */ 0 , /*n */ 0 ,
  255.     /*o */ 0 , /*p */ 0 , /*q */ 9 , /*r */ 2 , /*s */ 4 , /*t */ 11, /*u */ 0 ,
  256.     /*v */ 19, /*w */ 14, /*x */ 18, /*y */ 0 , /*z */ 17
  257.     };
  258.  
  259.     if (c < 'E' || c > 'z')
  260.     return 0;
  261.     return table[c - 'E'];
  262. }
  263.  
  264. /* 2 ╣·╜─┐í╝¡ ┐╡╣«└┌ -> ┴▀╝║ ║»╚»
  265.  * (2 bulsik: conversion english char. to medial vowel)
  266.  * ░ß░·: ┴▀╝║└╠ ╛╞┤╧╕Θ 0 (If it is not medial vowel, return 0).
  267.  */
  268.     static int
  269. vow(c)
  270.     int c;
  271. {
  272.     static char_u table[] =
  273.     {
  274.     /*O */ 6 , /*P */ 12, /*Q */ 0 , /*R */ 0 , /*S */ 0 , /*T */ 0 , /*U */ 0 ,
  275.     /*V */ 0 , /*W */ 0 , /*X */ 0 , /*Y */ 0 , /*Z */ 0 , /*[ */ 0 , /*\ */ 0 ,
  276.     /*] */ 0 , /*^ */ 0 , /*_ */ 0 , /*` */ 0 , /*a */ 0 , /*b */ 26, /*c */ 0 ,
  277.     /*d */ 0 , /*e */ 0 , /*f */ 0 , /*g */ 0 , /*h */ 13, /*i */ 5 , /*j */ 7 ,
  278.     /*k */ 3 , /*l */ 29, /*m */ 27, /*n */ 20, /*o */ 4 , /*p */ 10, /*q */ 0 ,
  279.     /*r */ 0 , /*s */ 0 , /*t */ 0 , /*u */ 11, /*v */ 0 , /*w */ 0 , /*x */ 0 ,
  280.     /*y */ 19};
  281.  
  282.     if (c < 'O' || c > 'y')
  283.     return 0;
  284.     return table[c - 'O'];
  285. }
  286.  
  287. /* 2╣·╜─┐í╝¡ ┐╡╣«└┌ -> ╣▐─º ║»╚»
  288.  * (2 bulsik: conversion english char. to prop)
  289.  * ░ß░·: ╣▐─º└╠ ╛╞┤╧╕Θ 0 (If not prop, return 0)
  290.  */
  291.     static int
  292. lcon(c)
  293.     int c;
  294. {
  295.     static char_u table[] =
  296.     {
  297.     /*R */ 3 , /*S */ 0 , /*T */ 22, /*U */ 0 , /*V */ 0 , /*W */ 0 , /*X */ 0 ,
  298.     /*Y */ 0 , /*Z */ 0 , /*[ */ 0 , /*\ */ 0 , /*] */ 0 , /*^ */ 0 , /*_ */ 0 ,
  299.     /*` */ 0 , /*a */ 17, /*b */ 0 , /*c */ 25, /*d */ 23, /*e */ 8 , /*f */ 9 ,
  300.     /*g */ 29, /*h */ 0 , /*i */ 0 , /*j */ 0 , /*k */ 0 , /*l */ 0 , /*m */ 0 ,
  301.     /*n */ 0 , /*o */ 0 , /*p */ 0 , /*q */ 19, /*r */ 2 , /*s */ 5 , /*t */ 21,
  302.     /*u */ 0 , /*v */ 28, /*w */ 24, /*x */ 27, /*y */ 0 , /*z */ 26
  303.     };
  304.  
  305.     if (c < 'R' || c > 'z')
  306.     return 0;
  307.     return table[c - 'R'];
  308. }
  309.  
  310. /* 2 ╣·╜─┐í╝¡ (╟÷└τ ╣▐─º, ┐╡╣«└┌ └╘╖┬) -> ╣▐─º ║»╚»
  311.  * (2 bulsik: conversion (curr. prop, input english) to prop)
  312.  */
  313.  
  314.     static int
  315. comcon2(k, c)
  316.     int k;
  317.     int c;
  318. {
  319.     switch (k)
  320.     {
  321.     case 2:                    /* ñí */
  322.         switch (c) {
  323.         case 't':
  324.             return 4;            /* ñíñ╡ */
  325.         }
  326.         break;
  327.  
  328.     case 5:                    /* ññ */
  329.         switch (c) {
  330.         case 'w':            /* ñññ╕ */
  331.             return 6;
  332.         case 'g':            /* ñññ╛ */
  333.             return 7;
  334.         }
  335.         break;
  336.  
  337.     case 9:                    /* ñ⌐ */
  338.         switch (c) {
  339.         case 'r':            /* ñ⌐ñí */
  340.             return 10;
  341.         case 'a':            /* ñ⌐ñ▒ */
  342.             return 11;
  343.         case 'q':            /* ñ⌐ñ▓ */
  344.             return 12;
  345.         case 't':            /* ñ⌐ñ╡ */
  346.             return 13;
  347.         case 'x':            /* ñ⌐ñ╝ */
  348.             return 14;
  349.         case 'v':            /* ñ⌐ñ╜ */
  350.             return 15;
  351.         case 'g':            /* ñ⌐ñ╛ */
  352.             return 16;
  353.         }
  354.         break;
  355.  
  356.     case 19:                /* ñ▓ */
  357.         switch (c) {
  358.         case 't':            /* ñ▓ñ╡ */
  359.             return 20;
  360.         }
  361.         break;
  362.     }
  363.     return 0;
  364. }
  365.  
  366. /* 2╣·╜─┐í╝¡ (╟÷└τ ┴▀╝║, ┐╡╣« └╘╖┬) -> ┴▀╝║ ║»╚»
  367.  * (2 bulsik: conversion (curr. medial vowel, input english) to medial
  368.  * vowel)
  369.  */
  370.  
  371.     static int
  372. comvow2(v, c)
  373.     int v;
  374.     int c;
  375. {
  376.     switch (v)
  377.     {
  378.     case 13:                    /* ñ╟ */
  379.         switch (c) {
  380.         case 'k':                /* ñ╟ñ┐ */
  381.             return 14;
  382.         case 'o':                /* ñ╟ñ└ */
  383.             return 15;
  384.         case 'l':                /* ñ╟ñ╙ */
  385.             return 18;
  386.         }
  387.         break;
  388.  
  389.     case 20:                    /* ñ╠ */
  390.         switch (c) {
  391.         case 'j':                /* ñ╠ñ├ */
  392.             return 21;
  393.         case 'p':                /* ñ╠ñ─ */
  394.             return 22;
  395.         case 'l':                /* ñ╠ñ╙ */
  396.             return 23;
  397.         }
  398.         break;
  399.  
  400.     case 27:                    /* ñ╤ */
  401.         switch (c) {
  402.         case 'l':                /* ñ╤ñ╙ */
  403.             return 28;
  404.         }
  405.         break;
  406.     }
  407.     return 0;
  408. }
  409.  
  410.     int
  411. hangul_input_state_get()
  412. {
  413.     return hangul_input_state;
  414. }
  415.  
  416.     void
  417. hangul_input_state_set(state)
  418.     int state;
  419. {
  420.     hangul_input_state = state;
  421.     hangul_input_clear();
  422. }
  423.  
  424.     int
  425. im_get_status()
  426. {
  427.     return hangul_input_state_get();
  428. }
  429.  
  430.     void
  431. hangul_input_state_toggle()
  432. {
  433.     if (hangul_input_state_get())
  434.     {
  435.     hangul_input_state_set(0);
  436.     if (composing_hangul)
  437.     {
  438.         push_raw_key(composing_hangul_buffer, 2);
  439.         composing_hangul = 0;
  440.     }
  441.     }
  442.     else
  443.     hangul_input_state_set(1);
  444.  
  445.     if (showmode())
  446.     {
  447.     setcursor();
  448.     out_flush();
  449.     }
  450.  
  451.     gui_update_cursor(TRUE, FALSE);
  452. }
  453.  
  454.     static int
  455. hangul_automata2(buf, c)
  456.     char_u  *buf;
  457.     int_u   *c;
  458. {
  459.     int t,t2;
  460.  
  461.     if (*c == BS)
  462.     {
  463.     if (sp == 0)
  464.         return AUTOMATA_SPECIAL;
  465.     else if (sp < 4)
  466.     {
  467.         hangul_input_clear();
  468.         return AUTOMATA_NULL;
  469.     }
  470.     pop(buf);
  471.     query(buf);
  472.     convert_ks_to_3(buf, &f, &m, &l);
  473.     last_l = last_ll;
  474.     last_ll = -1;
  475.     return AUTOMATA_CORRECT;
  476.     }
  477.     if ((!(*c >= 'A' && *c <= 'Z')) && (!(*c >= 'a' && *c <= 'z')))
  478.     {
  479.     hangul_input_clear();
  480.     return AUTOMATA_SPECIAL;
  481.     }
  482.     t = *c;
  483.     switch (kind_table_for_2(t))
  484.     {
  485.     case 0: /* └┌└╜ (consonant) */
  486.         if (f == F_NULL)
  487.         {
  488.         if (m != M_NULL)
  489.             hangul_input_clear();
  490.         f = fcon(t);
  491.         convert_3_to_code(f, M_NULL, L_NULL, buf);
  492.         push(buf);
  493.         last_ll = last_l = -1;
  494.         return AUTOMATA_NEW;
  495.         }
  496.         if (m == M_NULL)
  497.         return AUTOMATA_ERROR;
  498.         if (l == L_NULL)
  499.         {
  500.         t2 = lcon(t);
  501.         if (!t2)    /* ╣▐─º└╕╖╬ └√╟╒╟╧┴÷╛╩┤┘ (cannot use it as a prop) */
  502.         {
  503.             hangul_input_clear();
  504.             last_ll = last_l = -1;
  505.             f = fcon(t);
  506.             convert_3_to_code(f, m, l, buf);
  507.             push(buf);
  508.             return AUTOMATA_NEW;
  509.         }
  510.         if (2 == convert_3_to_code(f, m, t2, buf))
  511.         {
  512.             last_ll = -1;
  513.             last_l = t;
  514.             l = t2;
  515.             push(buf);
  516.             return AUTOMATA_CORRECT;
  517.         }
  518.         else    /* ╣▐─º└╕╖╬ ╛▓╖┴╟╧┐┤└╕│¬ code┐í ╛°┤┬ ▒█└┌└╠┤┘ */
  519.         {    /* cannot find such a prop in the code table */
  520.             last_ll = last_l = -1;
  521.             hangul_input_clear();
  522.             f = fcon(t);
  523.             convert_3_to_code(f, m, l, buf);
  524.             push(buf);
  525.             return AUTOMATA_NEW;
  526.         }
  527.         }
  528.         /* ├╩ ┴▀ ┴╛╝║└╠ ╕≡╡╬ ░«├▀╛ε┴« └╓┤┘
  529.          * I have all the 'initial sound' and 'medial vowel' and 'final
  530.          * consonant'.
  531.          */
  532.         t2 = comcon2(l, t);
  533.         if (t2)
  534.         {
  535.         if (2 == convert_3_to_code(f, m, t2, buf))
  536.         {
  537.             l = t2;
  538.             last_ll = last_l;
  539.             last_l = t;
  540.             push(buf);
  541.             return AUTOMATA_CORRECT;
  542.         }
  543.         }
  544.         last_ll = last_l = -1;
  545.         hangul_input_clear();
  546.         f = fcon(t);
  547.         convert_3_to_code(f, m, l, buf);
  548.         push(buf);
  549.         return AUTOMATA_NEW;
  550.  
  551.     case 1:
  552.         if (f == F_NULL)
  553.         {
  554.         hangul_input_clear();
  555.         m = vow(t);
  556.         convert_3_to_code (f, m, L_NULL, buf);
  557.         push (buf);
  558.         last_ll = last_l = -1;
  559.         return AUTOMATA_NEW;
  560.         }
  561.         if (m == M_NULL)
  562.         {
  563.         m = vow(t);
  564.         if (2 == convert_3_to_code(f, m, L_NULL, buf))
  565.         {
  566.             last_ll = last_l = -1;
  567.             push(buf);
  568.             return AUTOMATA_CORRECT;
  569.         }
  570.         m = M_NULL;
  571.         return AUTOMATA_ERROR;
  572.         }
  573.         if (l == L_NULL)
  574.         {
  575.         t2 = comvow2(m, t);
  576.         if (t2)
  577.         {
  578.             if (2 != convert_3_to_code(f, t2, L_NULL, buf))
  579.             return AUTOMATA_ERROR;
  580.  
  581.             m = t2;
  582.             push(buf);
  583.             last_ll = last_l = -1;
  584.             return AUTOMATA_CORRECT;
  585.         }
  586.         return AUTOMATA_ERROR;
  587.         }
  588.         pop(buf);
  589.         pop(buf);
  590.         sp = 0;
  591.         if (last_l == -1)
  592.         {
  593.         /* └╜... └╠░╘ ╟╩┐Σ╟╧│¬?? (Hmm... Is it needed?) */
  594.         convert_ks_to_3(buf, &f, &m, &l);
  595.         }
  596.         else
  597.         {
  598.         char_u tmp[3];
  599.         f = fcon(last_l);
  600.         convert_3_to_code (f, M_NULL, L_NULL, tmp);
  601.         push (tmp);
  602.         }
  603.         m = vow(t);
  604.         l = L_NULL;
  605.         convert_3_to_code(f, m, l, buf + 2);
  606.         push(buf + 2);
  607.         return AUTOMATA_CORRECT_NEW;
  608.  
  609.     default:
  610.         EMSG(_("E256: Hangul automata ERROR"));
  611.         break;
  612.     }
  613.     return AUTOMATA_ERROR; /* RrEeAaLlLlYy EeRrRrOoRr */
  614. }
  615.  
  616.     static int
  617. hangul_automata3(buf, c)
  618.     char_u  *buf;
  619.     int_u   *c;
  620. {
  621.     int t, t2;
  622.  
  623.     if (*c >= '!' && *c <= 'z')
  624.     {
  625.     *c -= '!';
  626.     t = value_table_for_3[*c];
  627.     switch (kind_table_for_3[*c])
  628.     {
  629.         case F_F: /* ├╩╝║╣«└┌ (char. of an initial sound) */
  630.         if (m != M_NULL || sp == 0)
  631.         {
  632.             /* ├╩╝║└╠ ║±╛·░┼│¬ ┤┘└╜ ▒█└┌ ╕≡└╕▒Γ ╜├└█
  633.              * Empty 'initial sound', so starting automata.
  634.              */
  635.             hangul_input_clear();
  636.             f = t;
  637.             convert_3_to_code(f, M_NULL, L_NULL, buf);
  638.             push(buf);
  639.             return AUTOMATA_NEW;
  640.         }
  641.         if ((t2 = comfcon3(f,t)) != 0)    /* ║╣└┌└╜ (double? consonant) */
  642.         {
  643.             f=t2;
  644.             convert_3_to_code(f, M_NULL, L_NULL, buf);
  645.             push(buf);
  646.             return AUTOMATA_CORRECT;
  647.         }
  648.         return AUTOMATA_ERROR;
  649.  
  650.         case F_M:    /* ╕≡└╜ (vowel) */
  651.         if (m == M_NULL)
  652.         {
  653.             if (2 != convert_3_to_code(f, t, L_NULL,buf))
  654.             return AUTOMATA_ERROR;
  655.  
  656.             m = t;
  657.             push(buf);
  658.             if (f == F_NULL)
  659.             return AUTOMATA_NEW;
  660.             else
  661.             return AUTOMATA_CORRECT;
  662.         }
  663.         if ((t2 = comvow3(m,t)))    /* ║╣╕≡└╜ (a diphthong) */
  664.         {
  665.             m = t2;
  666.             convert_3_to_code(f, m, L_NULL, buf);
  667.             push(buf);
  668.             return AUTOMATA_CORRECT;
  669.         }
  670.         return AUTOMATA_ERROR;
  671.  
  672.         case F_L:    /* ╣▐─º (prop?) */
  673.         if (m == M_NULL)
  674.             return AUTOMATA_ERROR; /* ┴▀╝║╛°┤┬ ┴╛╝║ */
  675.         if (l == L_NULL)
  676.         {
  677.             if (2 != convert_3_to_code(f, m, t, buf))
  678.             {
  679.             l = L_NULL;
  680.             return AUTOMATA_ERROR;
  681.             }
  682.             push(buf);
  683.             l = t;
  684.             return AUTOMATA_CORRECT;
  685.         }
  686.         if ((t2 = comcon3(l,t)) != 0)    /* ║╣ ╣▐─º ?? (double prop?) */
  687.         {
  688.             if (2 != convert_3_to_code(f, m, t2, buf))
  689.             return AUTOMATA_ERROR;
  690.  
  691.             push(buf);
  692.             l = t2;
  693.             return AUTOMATA_CORRECT;
  694.         }
  695.         return AUTOMATA_ERROR;
  696.  
  697.         case F_A: /* ╞»╝÷╣«└┌│¬ ╝²└┌ (special char. or number) */
  698.         hangul_input_clear();
  699.         *c = t;
  700.         return AUTOMATA_SPECIAL;
  701.     }
  702.     }
  703.     if (*c == BS)
  704.     {
  705.     if (sp >= 4)
  706.     {
  707.         pop(buf);
  708.         pop(buf);
  709.         convert_ks_to_3(buf, &f, &m, &l);
  710.         push(buf);
  711.         return AUTOMATA_CORRECT;
  712.     }
  713.     else if (sp == 0)
  714.     {
  715.         return AUTOMATA_SPECIAL;
  716.     }
  717.     else
  718.     {
  719.         hangul_input_clear();
  720.         return AUTOMATA_NULL;
  721.     }
  722.     }
  723.     hangul_input_clear();
  724.     return AUTOMATA_SPECIAL;
  725. }
  726.  
  727.     void
  728. hangul_keyboard_set()
  729. {
  730.     int        keyboard;
  731.     char    *s;
  732.  
  733.     hangul_input_clear();
  734.  
  735.     if ((s = getenv("VIM_KEYBOARD")) == NULL)
  736.     s = getenv("HANGUL_KEYBOARD_TYPE");
  737.  
  738.     if (s)
  739.     {
  740.     if (*s == '2')
  741.         keyboard = 2;
  742.     else
  743.         keyboard = 3;
  744.     hangul_keyboard_type = keyboard;
  745.     }
  746. }
  747.  
  748.     int
  749. hangul_input_process(s, len)
  750.     char_u  *s;
  751.     int        len;
  752. {
  753.     int n;
  754.     unsigned int c;
  755.     char_u hanbuf[20];
  756.  
  757.     if (len == 1)
  758.     /* normal key press */
  759.     c = *s;
  760.     else if (len == 3 && s[0] == CSI && s[1] == 'k' && s[2] == 'b')
  761.     {
  762.     /* backspace */
  763.     if (composing_hangul)
  764.         c = Ctrl_H;
  765.     else
  766.         return len;
  767.     }
  768.     else
  769.     {
  770.     if (composing_hangul)
  771.         push_raw_key(composing_hangul_buffer, 2);
  772.     hangul_input_clear();
  773.     composing_hangul = 0;
  774.     return len;
  775.     }
  776.  
  777.     if (hangul_keyboard_type == 2)
  778.     n = hangul_automata2(hanbuf, &c);
  779.     else
  780.     n = hangul_automata3(hanbuf, &c);
  781.  
  782.     if (n == AUTOMATA_CORRECT)
  783.     {
  784.     STRNCPY(composing_hangul_buffer, hanbuf, 2);
  785.     gui_update_cursor(TRUE, FALSE);
  786.     return 0;
  787.     }
  788.     else if (n == AUTOMATA_NEW)
  789.     {
  790.     if (composing_hangul)
  791.         push_raw_key(composing_hangul_buffer, 2);
  792.     STRNCPY(composing_hangul_buffer, hanbuf, 2);
  793.     composing_hangul = 1;
  794.     gui_update_cursor(TRUE, FALSE);
  795.     return 0;
  796.     }
  797.     else if (n == AUTOMATA_CORRECT_NEW)
  798.     {
  799.     if (composing_hangul)
  800.         push_raw_key(hanbuf, 2);
  801.     STRNCPY(composing_hangul_buffer, hanbuf+2, 2);
  802.     composing_hangul = 1;
  803.     gui_update_cursor(TRUE, FALSE);
  804.     return 0;
  805.     }
  806.     else if (n == AUTOMATA_NULL)
  807.     {
  808.     composing_hangul = 0;
  809.     gui_redraw_block(gui.cursor_row, gui.cursor_col,
  810.              gui.cursor_row, gui.cursor_col + 1,
  811.              GUI_MON_NOCLEAR);
  812.     gui_update_cursor(TRUE, FALSE);
  813.     return 0;
  814.     }
  815.     else if (n == AUTOMATA_SPECIAL)
  816.     {
  817.     if (composing_hangul)
  818.     {
  819.         push_raw_key(composing_hangul_buffer, 2);
  820.         composing_hangul = 0;
  821.     }
  822.     *s = c;
  823.     return 1;
  824.     }
  825.     else if (n == AUTOMATA_ERROR)
  826.     {
  827.     vim_beep();
  828.     return 0;
  829.     }
  830.     return len;
  831. }
  832.  
  833.     void
  834. hangul_input_clear()
  835. {
  836.     sp = 0;
  837.     f = F_NULL;
  838.     m = M_NULL;
  839.     l = L_NULL;
  840. }
  841.  
  842. #define han_index(h, l)    (((h)-0xb0)*(0xff-0xa1)+((l)-0xa1))
  843.  
  844. static const char_u ks_table1[][3] =
  845. {
  846.     {  2,  3,  1}, {  2,  3,  2}, {  2,  3,  5}, {  2,  3,  8},
  847.     {  2,  3,  9}, {  2,  3, 10}, {  2,  3, 11}, {  2,  3, 17},
  848.     {  2,  3, 19}, {  2,  3, 20}, {  2,  3, 21}, {  2,  3, 22},
  849.     {  2,  3, 23}, {  2,  3, 24}, {  2,  3, 25}, {  2,  3, 27},
  850.     {  2,  3, 28}, {  2,  3, 29}, {  2,  4,  1}, {  2,  4,  2},
  851.     {  2,  4,  5}, {  2,  4,  9}, {  2,  4, 17}, {  2,  4, 19},
  852.     {  2,  4, 21}, {  2,  4, 22}, {  2,  4, 23}, {  2,  5,  1},
  853.     {  2,  5,  2}, {  2,  5,  5}, {  2,  5,  9}, {  2,  5, 21},
  854.     {  2,  5, 23}, {  2,  6,  1}, {  2,  6,  5}, {  2,  6,  9},
  855.     {  2,  7,  1}, {  2,  7,  2}, {  2,  7,  5}, {  2,  7,  8},
  856.     {  2,  7,  9}, {  2,  7, 11}, {  2,  7, 17}, {  2,  7, 19},
  857.     {  2,  7, 21}, {  2,  7, 22}, {  2,  7, 23}, {  2,  7, 24},
  858.     {  2,  7, 27}, {  2,  7, 28}, {  2,  7, 29}, {  2, 10,  1},
  859.     {  2, 10,  5}, {  2, 10,  9}, {  2, 10, 17}, {  2, 10, 19},
  860.     {  2, 10, 21}, {  2, 10, 22}, {  2, 10, 23}, {  2, 11,  1},
  861.     {  2, 11,  2}, {  2, 11,  3}, {  2, 11,  5}, {  2, 11,  8},
  862.     {  2, 11,  9}, {  2, 11, 17}, {  2, 11, 19}, {  2, 11, 21},
  863.     {  2, 11, 22}, {  2, 11, 23}, {  2, 11, 27}, {  2, 12,  1},
  864.     {  2, 12,  5}, {  2, 12,  9}, {  2, 12, 19}, {  2, 12, 21},
  865.     {  2, 13,  1}, {  2, 13,  2}, {  2, 13,  5}, {  2, 13,  8},
  866.     {  2, 13,  9}, {  2, 13, 11}, {  2, 13, 13}, {  2, 13, 16},
  867.     {  2, 13, 17}, {  2, 13, 19}, {  2, 13, 21}, {  2, 13, 23},
  868.     {  2, 13, 24}, {  2, 14,  1}, {  2, 14,  2}, {  2, 14,  5},
  869.     {  2, 14,  9}, {  2, 14, 11}, {  2, 14, 17}, {  2, 14, 19},
  870.     {  2, 14, 21}, {  2, 14, 23}, {  2, 15,  1}, {  2, 15,  5},
  871.     {  2, 15,  9}, {  2, 15, 19}, {  2, 15, 22}, {  2, 15, 23},
  872.     {  2, 18,  1}, {  2, 18,  2}, {  2, 18,  5}, {  2, 18,  9},
  873.     {  2, 18, 17}, {  2, 18, 19}, {  2, 18, 21}, {  2, 18, 23},
  874.     {  2, 19,  1}, {  2, 19,  5}, {  2, 19,  9}, {  2, 19, 19},
  875.     {  2, 19, 21}, {  2, 20,  1}, {  2, 20,  2}, {  2, 20,  5},
  876.     {  2, 20,  8}, {  2, 20,  9}, {  2, 20, 10}, {  2, 20, 11},
  877.     {  2, 20, 16}, {  2, 20, 17}, {  2, 20, 19}, {  2, 20, 21},
  878.     {  2, 20, 23}, {  2, 20, 24}, {  2, 21,  1}, {  2, 21,  2},
  879.     {  2, 21,  5}, {  2, 21,  9}, {  2, 21, 22}, {  2, 21, 23},
  880.     {  2, 22,  1}, {  2, 22, 21}, {  2, 23,  1}, {  2, 23,  2},
  881.     {  2, 23,  5}, {  2, 23,  9}, {  2, 23, 17}, {  2, 23, 19},
  882.     {  2, 23, 21}, {  2, 26,  1}, {  2, 26,  5}, {  2, 26,  9},
  883.     {  2, 27,  1}, {  2, 27,  2}, {  2, 27,  5}, {  2, 27,  8},
  884.     {  2, 27,  9}, {  2, 27, 10}, {  2, 27, 17}, {  2, 27, 19},
  885.     {  2, 27, 21}, {  2, 27, 23}, {  2, 28,  1}, {  2, 29,  1},
  886.     {  2, 29,  2}, {  2, 29,  5}, {  2, 29,  8}, {  2, 29,  9},
  887.     {  2, 29, 11}, {  2, 29, 17}, {  2, 29, 19}, {  2, 29, 21},
  888.     {  2, 29, 23}, {  2, 29, 24}, {  2, 29, 28}, {  3,  3,  1},
  889.     {  3,  3,  2}, {  3,  3,  3}, {  3,  3,  5}, {  3,  3,  9},
  890.     {  3,  3, 11}, {  3,  3, 17}, {  3,  3, 19}, {  3,  3, 21},
  891.     {  3,  3, 22}, {  3,  3, 23}, {  3,  3, 27}, {  3,  4,  1},
  892.     {  3,  4,  2}, {  3,  4,  5}, {  3,  4,  9}, {  3,  4, 17},
  893.     {  3,  4, 19}, {  3,  4, 21}, {  3,  4, 22}, {  3,  4, 23},
  894.     {  3,  5,  1}, {  3,  5,  2}, {  3,  5,  9}, {  3,  7,  1},
  895.     {  3,  7,  2}, {  3,  7,  3}, {  3,  7,  5}, {  3,  7,  9},
  896.     {  3,  7, 17}, {  3,  7, 19}, {  3,  7, 21}, {  3,  7, 22},
  897.     {  3,  7, 23}, {  3, 10,  1}, {  3, 10,  2}, {  3, 10,  5},
  898.     {  3, 10, 17}, {  3, 10, 21}, {  3, 10, 23}, {  3, 11,  1},
  899.     {  3, 11,  5}, {  3, 11,  9}, {  3, 11, 21}, {  3, 11, 22},
  900.     {  3, 11, 27}, {  3, 12,  1}, {  3, 13,  1}, {  3, 13,  2},
  901.     {  3, 13,  5}, {  3, 13,  7}, {  3, 13,  9}, {  3, 13, 17},
  902.     {  3, 13, 19}, {  3, 13, 21}, {  3, 13, 23}, {  3, 13, 24},
  903.     {  3, 13, 25}, {  3, 14,  1}, {  3, 14,  2}, {  3, 14,  9},
  904.     {  3, 14, 22}, {  3, 14, 23}, {  3, 15,  1}, {  3, 15,  2},
  905.     {  3, 15, 23}, {  3, 18,  1}, {  3, 18,  5}, {  3, 18,  9},
  906.     {  3, 18, 17}, {  3, 18, 19}, {  3, 18, 23}, {  3, 19,  1},
  907.     {  3, 20,  1}, {  3, 20,  2}, {  3, 20,  5}, {  3, 20,  9},
  908.     {  3, 20, 16}, {  3, 20, 17}, {  3, 20, 19}, {  3, 20, 21},
  909.     {  3, 20, 23}, {  3, 20, 24}, {  3, 21,  1}, {  3, 21,  9},
  910.     {  3, 21, 22}, {  3, 21, 23}, {  3, 22,  1}, {  3, 22,  2},
  911.     {  3, 22,  5}, {  3, 22,  9}, {  3, 22, 17}, {  3, 22, 19},
  912.     {  3, 22, 22}, {  3, 23,  1}, {  3, 23,  5}, {  3, 23,  9},
  913.     {  3, 23, 17}, {  3, 23, 19}, {  3, 26,  1}, {  3, 27,  1},
  914.     {  3, 27,  2}, {  3, 27,  5}, {  3, 27,  7}, {  3, 27,  9},
  915.     {  3, 27, 11}, {  3, 27, 16}, {  3, 27, 17}, {  3, 27, 19},
  916.     {  3, 27, 21}, {  3, 27, 23}, {  3, 27, 27}, {  3, 29,  1},
  917.     {  3, 29,  2}, {  3, 29,  5}, {  3, 29,  9}, {  3, 29, 17},
  918.     {  3, 29, 19}, {  3, 29, 21}, {  3, 29, 23}, {  4,  3,  1},
  919.     {  4,  3,  2}, {  4,  3,  3}, {  4,  3,  5}, {  4,  3,  8},
  920.     {  4,  3,  9}, {  4,  3, 10}, {  4,  3, 11}, {  4,  3, 17},
  921.     {  4,  3, 19}, {  4,  3, 21}, {  4,  3, 22}, {  4,  3, 23},
  922.     {  4,  3, 24}, {  4,  3, 25}, {  4,  3, 27}, {  4,  3, 29},
  923.     {  4,  4,  1}, {  4,  4,  2}, {  4,  4,  5}, {  4,  4,  9},
  924.     {  4,  4, 17}, {  4,  4, 19}, {  4,  4, 21}, {  4,  4, 22},
  925.     {  4,  4, 23}, {  4,  5,  1}, {  4,  5,  2}, {  4,  5,  5},
  926.     {  4,  5,  9}, {  4,  5, 17}, {  4,  5, 23}, {  4,  7,  1},
  927.     {  4,  7,  2}, {  4,  7,  4}, {  4,  7,  5}, {  4,  7,  9},
  928.     {  4,  7, 11}, {  4,  7, 12}, {  4,  7, 17}, {  4,  7, 19},
  929.     {  4,  7, 21}, {  4,  7, 22}, {  4,  7, 23}, {  4,  7, 29},
  930.     {  4, 10,  1}, {  4, 10,  2}, {  4, 10,  5}, {  4, 10,  9},
  931.     {  4, 10, 17}, {  4, 10, 19}, {  4, 10, 21}, {  4, 10, 22},
  932.     {  4, 10, 23}, {  4, 11,  1}, {  4, 11,  2}, {  4, 11,  5},
  933.     {  4, 11,  9}, {  4, 11, 17}, {  4, 11, 19}, {  4, 11, 22},
  934.     {  4, 11, 23}, {  4, 11, 26}, {  4, 12,  1}, {  4, 12,  5},
  935.     {  4, 13,  1}, {  4, 13,  2}, {  4, 13,  5}, {  4, 13,  9},
  936.     {  4, 13, 11}, {  4, 13, 17}, {  4, 13, 19}, {  4, 13, 21},
  937.     {  4, 13, 23}, {  4, 13, 28}, {  4, 13, 29}, {  4, 14,  1},
  938.     {  4, 14,  5}, {  4, 14,  9}, {  4, 14, 22}, {  4, 18,  1},
  939.     {  4, 18,  5}, {  4, 18,  9}, {  4, 18, 17}, {  4, 18, 19},
  940.     {  4, 18, 21}, {  4, 19,  1}, {  4, 19,  2}, {  4, 19,  5},
  941.     {  4, 19,  9}, {  4, 19, 19}, {  4, 19, 21}, {  4, 19, 23},
  942.     {  4, 20,  1}, {  4, 20,  2}, {  4, 20,  5}, {  4, 20,  8},
  943.     {  4, 20,  9}, {  4, 20, 17}, {  4, 20, 19}, {  4, 20, 21},
  944.     {  4, 20, 23}, {  4, 21,  1}, {  4, 21, 22}, {  4, 22,  1},
  945.     {  4, 23,  1}, {  4, 23,  5}, {  4, 23,  9}, {  4, 23, 17},
  946.     {  4, 23, 19}, {  4, 26,  1}, {  4, 26,  2}, {  4, 26,  9},
  947.     {  4, 26, 17}, {  4, 26, 19}, {  4, 26, 23}, {  4, 27,  1},
  948.     {  4, 27,  2}, {  4, 27,  5}, {  4, 27,  9}, {  4, 27, 10},
  949.     {  4, 27, 11}, {  4, 27, 17}, {  4, 27, 19}, {  4, 27, 21},
  950.     {  4, 27, 23}, {  4, 27, 24}, {  4, 27, 28}, {  4, 28,  1},
  951.     {  4, 28,  5}, {  4, 28,  9}, {  4, 29,  1}, {  4, 29,  2},
  952.     {  4, 29,  5}, {  4, 29,  9}, {  4, 29, 11}, {  4, 29, 17},
  953.     {  4, 29, 19}, {  4, 29, 21}, {  4, 29, 23}, {  4, 29, 28},
  954.     {  5,  3,  1}, {  5,  3,  2}, {  5,  3,  3}, {  5,  3,  5},
  955.     {  5,  3,  8}, {  5,  3,  9}, {  5,  3, 10}, {  5,  3, 11},
  956.     {  5,  3, 12}, {  5,  3, 16}, {  5,  3, 17}, {  5,  3, 19},
  957.     {  5,  3, 21}, {  5,  3, 22}, {  5,  3, 23}, {  5,  3, 24},
  958.     {  5,  3, 25}, {  5,  3, 29}, {  5,  4,  1}, {  5,  4,  2},
  959.     {  5,  4,  5}, {  5,  4,  9}, {  5,  4, 17}, {  5,  4, 19},
  960.     {  5,  4, 21}, {  5,  4, 22}, {  5,  4, 23}, {  5,  5,  1},
  961.     {  5,  7,  1}, {  5,  7,  2}, {  5,  7,  3}, {  5,  7,  5},
  962.     {  5,  7,  8}, {  5,  7,  9}, {  5,  7, 11}, {  5,  7, 12},
  963.     {  5,  7, 17}, {  5,  7, 19}, {  5,  7, 21}, {  5,  7, 23},
  964.     {  5,  7, 25}, {  5,  7, 28}, {  5, 10,  1}, {  5, 10,  2},
  965.     {  5, 10,  5}, {  5, 10,  9}, {  5, 10, 17}, {  5, 10, 19},
  966.     {  5, 10, 21}, {  5, 10, 22}, {  5, 10, 23}, {  5, 11,  1},
  967.     {  5, 11,  5}, {  5, 11,  9}, {  5, 11, 22}, {  5, 11, 23},
  968.     {  5, 12,  1}, {  5, 12,  5}, {  5, 13,  1}, {  5, 13,  2},
  969.     {  5, 13,  5}, {  5, 13,  8}, {  5, 13,  9}, {  5, 13, 11},
  970.     {  5, 13, 13}, {  5, 13, 17}, {  5, 13, 19}, {  5, 13, 21},
  971.     {  5, 13, 23}, {  5, 13, 25}, {  5, 13, 27}, {  5, 14,  1},
  972.     {  5, 14,  5}, {  5, 14,  9}, {  5, 15,  1}, {  5, 15, 22},
  973.     {  5, 18,  1}, {  5, 18,  5}, {  5, 18,  9}, {  5, 18, 17},
  974.     {  5, 18, 19}, {  5, 18, 21}, {  5, 19,  1}, {  5, 20,  1},
  975.     {  5, 20,  2}, {  5, 20,  5}, {  5, 20,  9}, {  5, 20, 17},
  976.     {  5, 20, 19}, {  5, 20, 21}, {  5, 20, 23}, {  5, 21,  1},
  977.     {  5, 21, 22}, {  5, 22,  1}, {  5, 22, 23}, {  5, 23,  1},
  978.     {  5, 23,  5}, {  5, 23,  9}, {  5, 23, 19}, {  5, 23, 21},
  979.     {  5, 23, 23}, {  5, 26,  1}, {  5, 26,  5}, {  5, 26,  9},
  980.     {  5, 26, 17}, {  5, 26, 23}, {  5, 27,  1}, {  5, 27,  2},
  981.     {  5, 27,  5}, {  5, 27,  8}, {  5, 27,  9}, {  5, 27, 11},
  982.     {  5, 27, 17}, {  5, 27, 19}, {  5, 27, 21}, {  5, 27, 23},
  983.     {  5, 28,  1}, {  5, 29,  1}, {  5, 29,  2}, {  5, 29,  5},
  984.     {  5, 29,  8}, {  5, 29,  9}, {  5, 29, 17}, {  5, 29, 19},
  985.     {  5, 29, 21}, {  5, 29, 22}, {  5, 29, 23}, {  5, 29, 24},
  986.     {  6,  3,  1}, {  6,  3,  2}, {  6,  3,  5}, {  6,  3,  9},
  987.     {  6,  3, 17}, {  6,  3, 19}, {  6,  3, 21}, {  6,  3, 22},
  988.     {  6,  3, 23}, {  6,  3, 29}, {  6,  4,  1}, {  6,  4,  2},
  989.     {  6,  4,  5}, {  6,  4,  9}, {  6,  4, 17}, {  6,  4, 19},
  990.     {  6,  4, 21}, {  6,  4, 22}, {  6,  4, 23}, {  6,  7,  1},
  991.     {  6,  7,  2}, {  6,  7,  5}, {  6,  7,  9}, {  6,  7, 11},
  992.     {  6,  7, 12}, {  6,  7, 17}, {  6,  7, 19}, {  6,  7, 21},
  993.     {  6,  7, 22}, {  6,  7, 23}, {  6,  7, 29}, {  6, 10,  1},
  994.     {  6, 10,  2}, {  6, 10,  5}, {  6, 10,  9}, {  6, 10, 17},
  995.     {  6, 10, 19}, {  6, 10, 21}, {  6, 10, 22}, {  6, 10, 23},
  996.     {  6, 11,  1}, {  6, 11, 22}, {  6, 13,  1}, {  6, 13,  2},
  997.     {  6, 13,  5}, {  6, 13,  9}, {  6, 13, 23}, {  6, 14,  1},
  998.     {  6, 14,  9}, {  6, 15,  1}, {  6, 18,  1}, {  6, 18,  5},
  999.     {  6, 20,  1}, {  6, 20,  2}, {  6, 20,  5}, {  6, 20,  9},
  1000.     {  6, 20, 16}, {  6, 20, 17}, {  6, 20, 23}, {  6, 22,  1},
  1001.     {  6, 23,  1}, {  6, 23,  5}, {  6, 23,  9}, {  6, 23, 17},
  1002.     {  6, 23, 19}, {  6, 23, 23}, {  6, 27,  1}, {  6, 27,  2},
  1003.     {  6, 27,  5}, {  6, 27,  8}, {  6, 27,  9}, {  6, 27, 17},
  1004.     {  6, 27, 19}, {  6, 27, 21}, {  6, 28,  1}, {  6, 28,  5},
  1005.     {  6, 28,  9}, {  6, 28, 17}, {  6, 28, 19}, {  6, 29,  1},
  1006.     {  6, 29,  5}, {  6, 29,  9}, {  6, 29, 17}, {  6, 29, 19},
  1007.     {  6, 29, 21}, {  6, 29, 23}, {  7,  3,  1}, {  7,  3,  2},
  1008.     {  7,  3,  5}, {  7,  3,  9}, {  7,  3, 17}, {  7,  3, 19},
  1009.     {  7,  3, 21}, {  7,  3, 22}, {  7,  3, 23}, {  7,  3, 24},
  1010.     {  7,  3, 28}, {  7,  3, 29}, {  7,  4,  1}, {  7,  4,  2},
  1011.     {  7,  4,  5}, {  7,  4,  9}, {  7,  4, 17}, {  7,  4, 19},
  1012.     {  7,  4, 21}, {  7,  4, 22}, {  7,  4, 23}, {  7,  5,  1},
  1013.     {  7,  5,  2}, {  7,  5,  5}, {  7,  5, 21}, {  7,  5, 23},
  1014.     {  7,  7,  1}, {  7,  7,  2}, {  7,  7,  5}, {  7,  7,  9},
  1015.     {  7,  7, 17}, {  7,  7, 19}, {  7,  7, 21}, {  7,  7, 22},
  1016.     {  7,  7, 23}, {  7,  7, 29}, {  7, 10,  1}, {  7, 10,  2},
  1017.     {  7, 10,  5}, {  7, 10,  9}, {  7, 10, 17}, {  7, 10, 19},
  1018.     {  7, 10, 21}, {  7, 10, 23}, {  7, 11,  1}, {  7, 11,  2},
  1019.     {  7, 11,  5}, {  7, 11,  9}, {  7, 11, 17}, {  7, 11, 19},
  1020.     {  7, 11, 21}, {  7, 11, 22}, {  7, 11, 23}, {  7, 12,  1},
  1021.     {  7, 12,  5}, {  7, 12, 19}, {  7, 12, 21}, {  7, 13,  1},
  1022.     {  7, 13,  2}, {  7, 13,  5}, {  7, 13,  9}, {  7, 13, 17},
  1023.     {  7, 13, 19}, {  7, 13, 21}, {  7, 13, 23}, {  7, 14,  1},
  1024.     {  7, 14,  5}, {  7, 14, 23}, {  7, 15, 22}, {  7, 18,  1},
  1025.     {  7, 18,  5}, {  7, 18,  9}, {  7, 18, 17}, {  7, 18, 19},
  1026.     {  7, 18, 21}, {  7, 18, 23}, {  7, 19,  1}, {  7, 19,  5},
  1027.     {  7, 19,  9}, {  7, 19, 19}, {  7, 19, 21}, {  7, 19, 23},
  1028.     {  7, 20,  1}, {  7, 20,  2}, {  7, 20,  5}, {  7, 20,  9},
  1029.     {  7, 20, 17}, {  7, 20, 19}, {  7, 20, 21}, {  7, 20, 23},
  1030.     {  7, 21,  1}, {  7, 21, 22}, {  7, 22,  1}, {  7, 23,  1},
  1031.     {  7, 23,  2}, {  7, 23,  5}, {  7, 23,  9}, {  7, 23, 17},
  1032.     {  7, 23, 21}, {  7, 23, 23}, {  7, 26,  1}, {  7, 26,  2},
  1033.     {  7, 26,  5}, {  7, 26,  9}, {  7, 26, 17}, {  7, 26, 19},
  1034.     {  7, 26, 21}, {  7, 26, 23}, {  7, 27,  1}, {  7, 27,  2},
  1035.     {  7, 27,  5}, {  7, 27,  9}, {  7, 27, 17}, {  7, 27, 19},
  1036.     {  7, 27, 21}, {  7, 27, 23}, {  7, 27, 24}, {  7, 27, 27},
  1037.     {  7, 27, 28}, {  7, 29,  1}, {  7, 29,  2}, {  7, 29,  5},
  1038.     {  7, 29,  9}, {  7, 29, 17}, {  7, 29, 19}, {  7, 29, 21},
  1039.     {  7, 29, 23}, {  8,  3,  1}, {  8,  3,  2}, {  8,  3,  5},
  1040.     {  8,  3,  7}, {  8,  3,  8}, {  8,  3,  9}, {  8,  3, 10},
  1041.     {  8,  3, 11}, {  8,  3, 17}, {  8,  3, 19}, {  8,  3, 21},
  1042.     {  8,  3, 23}, {  8,  3, 24}, {  8,  3, 27}, {  8,  3, 29},
  1043.     {  8,  4,  1}, {  8,  4,  2}, {  8,  4,  5}, {  8,  4,  9},
  1044.     {  8,  4, 17}, {  8,  4, 19}, {  8,  4, 21}, {  8,  4, 22},
  1045.     {  8,  4, 23}, {  8,  4, 24}, {  8,  5,  1}, {  8,  5,  2},
  1046.     {  8,  5,  9}, {  8,  5, 23}, {  8,  7,  1}, {  8,  7,  2},
  1047.     {  8,  7,  5}, {  8,  7,  9}, {  8,  7, 11}, {  8,  7, 17},
  1048.     {  8,  7, 19}, {  8,  7, 21}, {  8,  7, 23}, {  8,  7, 24},
  1049.     {  8,  7, 29}, {  8, 10,  1}, {  8, 10,  2}, {  8, 10,  5},
  1050.     {  8, 10,  9}, {  8, 10, 17}, {  8, 10, 19}, {  8, 10, 21},
  1051.     {  8, 10, 22}, {  8, 10, 23}, {  8, 11,  1}, {  8, 11,  2},
  1052.     {  8, 11,  5}, {  8, 11,  9}, {  8, 11, 21}, {  8, 11, 22},
  1053.     {  8, 11, 23}, {  8, 11, 25}, {  8, 12,  1}, {  8, 13,  1},
  1054.     {  8, 13,  2}, {  8, 13,  4}, {  8, 13,  5}, {  8, 13,  9},
  1055.     {  8, 13, 11}, {  8, 13, 17}, {  8, 13, 19}, {  8, 13, 21},
  1056.     {  8, 13, 23}, {  8, 14,  1}, {  8, 14,  5}, {  8, 14, 22},
  1057.     {  8, 14, 23}, {  8, 18,  1}, {  8, 18,  5}, {  8, 18,  9},
  1058.     {  8, 18, 19}, {  8, 18, 21}, {  8, 18, 23}, {  8, 19,  1},
  1059.     {  8, 19,  5}, {  8, 19,  9}, {  8, 19, 19}, {  8, 19, 21},
  1060.     {  8, 20,  1}, {  8, 20,  2}, {  8, 20,  3}, {  8, 20,  5},
  1061.     {  8, 20,  8}, {  8, 20,  9}, {  8, 20, 10}, {  8, 20, 11},
  1062.     {  8, 20, 17}, {  8, 20, 19}, {  8, 20, 21}, {  8, 20, 23},
  1063.     {  8, 20, 27}, {  8, 20, 29}, {  8, 21,  1}, {  8, 21,  5},
  1064.     {  8, 21,  9}, {  8, 21, 19}, {  8, 21, 21}, {  8, 22,  1},
  1065.     {  8, 23,  1}, {  8, 23,  5}, {  8, 23,  9}, {  8, 26,  1},
  1066.     {  8, 26,  5}, {  8, 26,  9}, {  8, 26, 17}, {  8, 26, 21},
  1067.     {  8, 27,  1}, {  8, 27,  5}, {  8, 27,  9}, {  8, 27, 17},
  1068.     {  8, 27, 21}, {  8, 29,  1}, {  8, 29,  2}, {  8, 29,  5},
  1069.     {  8, 29,  8}, {  8, 29,  9}, {  8, 29, 11}, {  8, 29, 17},
  1070.     {  8, 29, 19}, {  8, 29, 21}, {  8, 29, 22}, {  8, 29, 23},
  1071.     {  8, 29, 25}, {  8, 29, 27}, {  9,  3,  1}, {  9,  3,  2},
  1072.     {  9,  3,  3}, {  9,  3,  4}, {  9,  3,  5}, {  9,  3,  8},
  1073.     {  9,  3,  9}, {  9,  3, 10}, {  9,  3, 11}, {  9,  3, 12},
  1074.     {  9,  3, 17}, {  9,  3, 19}, {  9,  3, 21}, {  9,  3, 23},
  1075.     {  9,  3, 27}, {  9,  4,  1}, {  9,  4,  2}, {  9,  4,  5},
  1076.     {  9,  4,  9}, {  9,  4, 17}, {  9,  4, 19}, {  9,  4, 21},
  1077.     {  9,  4, 22}, {  9,  4, 23}, {  9,  4, 27}, {  9,  5,  1},
  1078.     {  9,  5,  2}, {  9,  5,  5}, {  9,  5, 19}, {  9,  7,  1},
  1079.     {  9,  7,  2}, {  9,  7,  5}, {  9,  7,  8}, {  9,  7,  9},
  1080.     {  9,  7, 11}, {  9,  7, 17}, {  9,  7, 19}, {  9,  7, 21},
  1081.     {  9,  7, 23}, {  9,  7, 24}, {  9, 10,  1}, {  9, 10,  2},
  1082.     {  9, 10,  5}, {  9, 10,  8}, {  9, 10,  9}, {  9, 10, 17},
  1083.     {  9, 10, 19}, {  9, 10, 21}, {  9, 10, 22}, {  9, 10, 23},
  1084.     {  9, 11,  1}, {  9, 11,  2}, {  9, 11,  5}, {  9, 11,  9},
  1085.     {  9, 11, 19}, {  9, 11, 21}, {  9, 11, 22}, {  9, 11, 23},
  1086.     {  9, 11, 27}, {  9, 12,  1}, {  9, 12,  5}, {  9, 13,  1},
  1087.     {  9, 13,  2}, {  9, 13,  3}, {  9, 13,  5}, {  9, 13,  9},
  1088.     {  9, 13, 17}, {  9, 13, 19}, {  9, 13, 21}, {  9, 13, 23},
  1089.     {  9, 14,  1}, {  9, 14,  5}, {  9, 14, 22}, {  9, 15,  1},
  1090.     {  9, 15, 22}, {  9, 18,  1}, {  9, 18,  2}, {  9, 18,  5},
  1091.     {  9, 18,  9}, {  9, 18, 17}, {  9, 18, 19}, {  9, 19,  1},
  1092.     {  9, 19,  5}, {  9, 20,  1}, {  9, 20,  2}, {  9, 20,  5},
  1093.     {  9, 20,  8}, {  9, 20,  9}, {  9, 20, 10}, {  9, 20, 11},
  1094.     {  9, 20, 17}, {  9, 20, 19}, {  9, 20, 21}, {  9, 20, 23},
  1095.     {  9, 20, 27}, {  9, 20, 28}, {  9, 21,  1}, {  9, 21,  9},
  1096.     {  9, 21, 22}, {  9, 22,  1}, {  9, 23,  1}, {  9, 23,  2},
  1097.     {  9, 23,  5}, {  9, 23,  9}, {  9, 23, 23}, {  9, 26,  1},
  1098.     {  9, 26,  5}, {  9, 26,  9}, {  9, 26, 17}, {  9, 26, 21},
  1099.     {  9, 26, 23}, {  9, 27,  1}, {  9, 27,  2}, {  9, 27,  5},
  1100.     {  9, 27,  9}, {  9, 27, 17}, {  9, 27, 19}, {  9, 27, 21},
  1101.     {  9, 29,  1}, {  9, 29,  2}, {  9, 29,  5}, {  9, 29,  9},
  1102.     {  9, 29, 11}, {  9, 29, 17}, {  9, 29, 19}, {  9, 29, 21},
  1103.     {  9, 29, 23}, {  9, 29, 24}, {  9, 29, 25}, { 10,  3,  1},
  1104.     { 10,  3,  2}, { 10,  3,  5}, { 10,  3,  9}, { 10,  3, 11},
  1105.     { 10,  3, 17}, { 10,  3, 19}, { 10,  3, 21}, { 10,  3, 22},
  1106.     { 10,  3, 23}, { 10,  3, 29}, { 10,  4,  1}, { 10,  4,  2},
  1107.     { 10,  4,  5}, { 10,  4,  9}, { 10,  4, 17}, { 10,  4, 19},
  1108.     { 10,  4, 21}, { 10,  4, 22}, { 10,  4, 23}, { 10,  5,  1},
  1109.     { 10,  5,  2}, { 10,  5, 17}, { 10,  7,  1}, { 10,  7,  2},
  1110.     { 10,  7,  5}, { 10,  7,  8}, { 10,  7,  9}, { 10,  7, 17},
  1111.     { 10,  7, 21}, { 10,  7, 22}, { 10,  7, 23}, { 10, 10,  1},
  1112.     { 10, 10, 23}, { 10, 11,  1}, { 10, 11,  2}, { 10, 11, 17},
  1113.     { 10, 11, 19}, { 10, 11, 21}, { 10, 11, 22}, { 10, 11, 23},
  1114.     { 10, 13,  1}, { 10, 13,  2}, { 10, 13,  5}, { 10, 13,  9},
  1115.     { 10, 13, 17}, { 10, 13, 19}, { 10, 13, 23}, { 10, 18,  1},
  1116.     { 10, 19,  1}, { 10, 19, 23}, { 10, 20,  1}, { 10, 20,  2},
  1117.     { 10, 20,  5}, { 10, 20,  9}, { 10, 20, 17}, { 10, 20, 21},
  1118.     { 10, 20, 23}, { 10, 26,  1}, { 10, 26, 23}, { 10, 27,  1},
  1119.     { 10, 27,  5}, { 10, 27,  9}, { 10, 27, 17}, { 10, 27, 19},
  1120.     { 10, 29,  1}, { 10, 29,  2}, { 10, 29,  5}, { 10, 29,  9},
  1121.     { 10, 29, 17}, { 10, 29, 19}, { 10, 29, 21}, { 10, 29, 23},
  1122.     { 11,  3,  1}, { 11,  3,  2}, { 11,  3,  4}, { 11,  3,  5},
  1123.     { 11,  3,  8}, { 11,  3,  9}, { 11,  3, 10}, { 11,  3, 11},
  1124.     { 11,  3, 17}, { 11,  3, 19}, { 11,  3, 21}, { 11,  3, 22},
  1125.     { 11,  3, 23}, { 11,  3, 27}, { 11,  4,  1}, { 11,  4,  2},
  1126.     { 11,  4,  5}, { 11,  4,  9}, { 11,  4, 17}, { 11,  4, 19},
  1127.     { 11,  4, 21}, { 11,  4, 22}, { 11,  4, 23}, { 11,  5,  1},
  1128.     { 11,  5,  2}, { 11,  5,  5}, { 11,  5,  9}, { 11,  5, 17},
  1129.     { 11,  5, 19}, { 11,  5, 21}, { 11,  5, 23}, { 11,  6,  1},
  1130.     { 11,  6,  5}, { 11,  6,  9}, { 11,  6, 17}, { 11,  6, 23},
  1131.     { 11,  7,  1}, { 11,  7,  2}, { 11,  7,  3}, { 11,  7,  4},
  1132.     { 11,  7,  5}, { 11,  7,  8}, { 11,  7,  9}, { 11,  7, 11},
  1133.     { 11,  7, 12}, { 11,  7, 17}, { 11,  7, 19}, { 11,  7, 21},
  1134.     { 11,  7, 22}, { 11,  7, 23}, { 11,  7, 28}, { 11, 10,  1},
  1135.     { 11, 10,  2}, { 11, 10,  5}, { 11, 10,  9}, { 11, 10, 17},
  1136.     { 11, 10, 19}, { 11, 10, 21}, { 11, 10, 22}, { 11, 10, 23},
  1137.     { 11, 11,  1}, { 11, 11,  2}, { 11, 11,  5}, { 11, 11,  9},
  1138.     { 11, 11, 17}, { 11, 11, 19}, { 11, 11, 21}, { 11, 11, 22},
  1139.     { 11, 11, 23}, { 11, 12,  1}, { 11, 12,  5}, { 11, 12,  9},
  1140.     { 11, 12, 23}, { 11, 13,  1}, { 11, 13,  2}, { 11, 13,  3},
  1141.     { 11, 13,  5}, { 11, 13,  9}, { 11, 13, 11}, { 11, 13, 17},
  1142.     { 11, 13, 19}, { 11, 13, 21}, { 11, 13, 23}, { 11, 13, 27},
  1143.     { 11, 14,  1}, { 11, 14,  2}, { 11, 14,  5}, { 11, 14,  9},
  1144.     { 11, 14, 23}, { 11, 15,  1}, { 11, 15,  5}, { 11, 15,  9},
  1145.     { 11, 15, 17}, { 11, 15, 21}, { 11, 15, 22}, { 11, 18,  1},
  1146.     { 11, 18,  5}, { 11, 18,  9}, { 11, 18, 17}, { 11, 18, 19},
  1147.     { 11, 18, 21}, { 11, 19,  1}, { 11, 19,  2}, { 11, 19,  5},
  1148.     { 11, 19,  9}, { 11, 19, 17}, { 11, 19, 19}, { 11, 19, 21},
  1149.     { 11, 19, 23}, { 11, 20,  1}, { 11, 20,  2}, { 11, 20,  5},
  1150.     { 11, 20,  8}, { 11, 20,  9}, { 11, 20, 17}, { 11, 20, 19},
  1151.     { 11, 20, 21}, { 11, 20, 23}, { 11, 20, 25}, { 11, 20, 27},
  1152.     { 11, 20, 28}, { 11, 21,  1}, { 11, 21, 22}, { 11, 22,  1},
  1153.     { 11, 22,  2}, { 11, 22,  5}, { 11, 22,  9}, { 11, 22, 17},
  1154.     { 11, 22, 23}, { 11, 23,  1}, { 11, 23,  2}, { 11, 23,  5},
  1155.     { 11, 23,  9}, { 11, 23, 17}, { 11, 23, 19}, { 11, 23, 21},
  1156.     { 11, 23, 23}, { 11, 26,  1}, { 11, 26,  2}, { 11, 26,  9},
  1157.     { 11, 26, 17}, { 11, 26, 21}, { 11, 26, 23}, { 11, 27,  1},
  1158.     { 11, 27,  2}, { 11, 27,  5}, { 11, 27,  9}, { 11, 27, 10},
  1159.     { 11, 27, 17}, { 11, 27, 19}, { 11, 27, 21}, { 11, 27, 23},
  1160.     { 11, 29,  1}, { 11, 29,  2}, { 11, 29,  5}, { 11, 29,  8},
  1161.     { 11, 29,  9}, { 11, 29, 16}, { 11, 29, 17}, { 11, 29, 19},
  1162.     { 11, 29, 21}, { 11, 29, 23}, { 11, 29, 28}, { 12,  3,  1},
  1163.     { 12,  3,  2}, { 12,  3,  4}, { 12,  3,  5}, { 12,  3,  9},
  1164.     { 12,  3, 17}, { 12,  3, 19}, { 12,  3, 22}, { 12,  3, 23},
  1165.     { 12,  3, 29}, { 12,  4,  1}, { 12,  4,  2}, { 12,  4,  5},
  1166.     { 12,  4,  9}, { 12,  4, 17}, { 12,  4, 19}, { 12,  4, 22},
  1167.     { 12,  4, 23}, { 12,  5, 23}, { 12,  7,  1}, { 12,  7,  2},
  1168.     { 12,  7,  5}, { 12,  7,  9}, { 12,  7, 11}, { 12,  7, 17},
  1169.     { 12,  7, 19}, { 12,  7, 22}, { 12,  7, 23}, { 12, 10,  1},
  1170.     { 12, 10,  5}, { 12, 10,  9}, { 12, 12,  5}, { 12, 13,  1},
  1171.     { 12, 13,  2}, { 12, 13,  5}, { 12, 13,  8}, { 12, 13,  9},
  1172.     { 12, 13, 11}, { 12, 13, 17}, { 12, 13, 19}, { 12, 13, 23},
  1173.     { 12, 14,  1}, { 12, 14,  2}, { 12, 14,  5}, { 12, 14, 22},
  1174.     { 12, 15,  1}, { 12, 15, 22}, { 12, 18,  1}, { 12, 18,  5},
  1175.     { 12, 18,  9}, { 12, 18, 17}, { 12, 18, 19}, { 12, 19,  1},
  1176.     { 12, 20,  1}, { 12, 20,  2}, { 12, 20,  5}, { 12, 20,  9},
  1177.     { 12, 20, 17}, { 12, 20, 19}, { 12, 20, 23}, { 12, 21,  1},
  1178.     { 12, 21, 22}, { 12, 22,  1}, { 12, 23,  1}, { 12, 23,  5},
  1179.     { 12, 26, 23}, { 12, 27,  1}, { 12, 27,  2}, { 12, 27,  5},
  1180.     { 12, 27,  9}, { 12, 27, 11}, { 12, 27, 16}, { 12, 27, 17},
  1181.     { 12, 27, 19}, { 12, 28,  1}, { 12, 28,  5}, { 12, 28,  9},
  1182.     { 12, 28, 17}, { 12, 29,  1}, { 12, 29,  2}, { 12, 29,  5},
  1183.     { 12, 29,  9}, { 12, 29, 17}, { 12, 29, 19}, { 12, 29, 21},
  1184.     { 12, 29, 23}, { 13,  3,  1}, { 13,  3,  2}, { 13,  3,  5},
  1185.     { 13,  3,  6}, { 13,  3,  7}, { 13,  3,  9}, { 13,  3, 10},
  1186.     { 13,  3, 11}, { 13,  3, 16}, { 13,  3, 17}, { 13,  3, 19},
  1187.     { 13,  3, 21}, { 13,  3, 22}, { 13,  3, 23}, { 13,  3, 27},
  1188.     { 13,  3, 28}, { 13,  4,  1}, { 13,  4,  2}, { 13,  4,  5},
  1189.     { 13,  4,  9}, { 13,  4, 17}, { 13,  4, 19}, { 13,  4, 21},
  1190.     { 13,  4, 22}, { 13,  4, 23}, { 13,  5,  1}, { 13,  5,  2},
  1191.     { 13,  5,  5}, { 13,  5,  9}, { 13,  5, 12}, { 13,  5, 17},
  1192.     { 13,  5, 19}, { 13,  5, 21}, { 13,  5, 23}, { 13,  5, 27},
  1193.     { 13,  5, 29}, { 13,  6,  1}, { 13,  6,  5}, { 13,  6,  9},
  1194.     { 13,  6, 19}, { 13,  7,  1}, { 13,  7,  2}, { 13,  7,  5},
  1195.     { 13,  7,  6}, { 13,  7,  8}, { 13,  7,  9}, { 13,  7, 10},
  1196.     { 13,  7, 11}, { 13,  7, 17}, { 13,  7, 19}, { 13,  7, 20},
  1197.     { 13,  7, 21}, { 13,  7, 22}, { 13,  7, 23}, { 13,  7, 24},
  1198.     { 13,  7, 26}, { 13,  7, 28}, { 13, 10,  1}, { 13, 10,  2},
  1199.     { 13, 10,  5}, { 13, 10,  9}, { 13, 10, 17}, { 13, 10, 19},
  1200.     { 13, 10, 21}, { 13, 10, 23}, { 13, 11,  1}, { 13, 11,  2},
  1201.     { 13, 11,  3}, { 13, 11,  5}, { 13, 11,  9}, { 13, 11, 11},
  1202.     { 13, 11, 12}, { 13, 11, 17}, { 13, 11, 19}, { 13, 11, 20},
  1203.     { 13, 11, 21}, { 13, 11, 22}, { 13, 11, 23}, { 13, 11, 27},
  1204.     { 13, 11, 28}, { 13, 11, 29}, { 13, 12,  1}, { 13, 12,  5},
  1205.     { 13, 12,  9}, { 13, 12, 17}, { 13, 12, 19}, { 13, 12, 21},
  1206.     { 13, 12, 22}, { 13, 13,  1}, { 13, 13,  2}, { 13, 13,  5},
  1207.     { 13, 13,  9}, { 13, 13, 10}, { 13, 13, 11}, { 13, 13, 13},
  1208.     { 13, 13, 16}, { 13, 13, 17}, { 13, 13, 19}, { 13, 13, 21},
  1209.     { 13, 13, 23}, { 13, 13, 25}, { 13, 14,  1}, { 13, 14,  2},
  1210.     { 13, 14,  5}, { 13, 14,  9}, { 13, 14, 17}, { 13, 14, 19},
  1211.     { 13, 14, 21}, { 13, 14, 22}, { 13, 14, 23}, { 13, 15,  1},
  1212.     { 13, 15,  2}, { 13, 15,  5}, { 13, 15, 17}, { 13, 15, 21},
  1213.     { 13, 15, 23}, { 13, 18,  1}, { 13, 18,  2}, { 13, 18,  5},
  1214.     { 13, 18,  9}, { 13, 18, 17}, { 13, 18, 19}, { 13, 18, 21},
  1215.     { 13, 18, 23}, { 13, 19,  1}, { 13, 19,  2}, { 13, 19,  5},
  1216.     { 13, 19,  9}, { 13, 19, 17}, { 13, 19, 19}, { 13, 19, 21},
  1217.     { 13, 19, 23}, { 13, 20,  1}, { 13, 20,  2}, { 13, 20,  5},
  1218.     { 13, 20,  9}, { 13, 20, 10}, { 13, 20, 11}, { 13, 20, 17},
  1219.     { 13, 20, 19}, { 13, 20, 21}, { 13, 20, 23}, { 13, 21,  1},
  1220.     { 13, 21,  2}, { 13, 21,  5}, { 13, 21,  9}, { 13, 21, 17},
  1221.     { 13, 21, 19}, { 13, 21, 22}, { 13, 21, 23}, { 13, 22,  1},
  1222.     { 13, 22,  2}, { 13, 22,  5}, { 13, 22,  9}, { 13, 22, 17},
  1223.     { 13, 22, 19}, { 13, 22, 23}, { 13, 23,  1}, { 13, 23,  2},
  1224.     { 13, 23,  5}, { 13, 23,  9}, { 13, 23, 17}, { 13, 23, 19},
  1225.     { 13, 23, 21}, { 13, 23, 23}, { 13, 26,  1}, { 13, 26,  2},
  1226.     { 13, 26,  5}, { 13, 26,  9}, { 13, 26, 17}, { 13, 26, 19},
  1227.     { 13, 26, 21}, { 13, 26, 23}, { 13, 26, 25}, { 13, 27,  1},
  1228.     { 13, 27,  2}, { 13, 27,  5}, { 13, 27,  9}, { 13, 27, 15},
  1229.     { 13, 27, 17}, { 13, 27, 19}, { 13, 27, 21}, { 13, 27, 23},
  1230.     { 13, 27, 24}, { 13, 27, 25}, { 13, 27, 26}, { 13, 27, 27},
  1231.     { 13, 27, 28}, { 13, 27, 29}, { 13, 28,  1}, { 13, 28,  5},
  1232.     { 13, 28,  9}, { 13, 28, 17}, { 13, 28, 21}, { 13, 29,  1},
  1233.     { 13, 29,  2}, { 13, 29,  5}, { 13, 29,  9}, { 13, 29, 10},
  1234.     { 13, 29, 11}, { 13, 29, 16}, { 13, 29, 17}, { 13, 29, 19},
  1235.     { 13, 29, 21}, { 13, 29, 22}, { 13, 29, 23}, { 13, 29, 24},
  1236.     { 13, 29, 28}, { 14,  3,  1}, { 14,  3,  2}, { 14,  3,  5},
  1237.     { 14,  3,  7}, { 14,  3,  8}, { 14,  3,  9}, { 14,  3, 11},
  1238.     { 14,  3, 17}, { 14,  3, 19}, { 14,  3, 21}, { 14,  3, 22},
  1239.     { 14,  3, 23}, { 14,  3, 24}, { 14,  4,  1}, { 14,  4,  2},
  1240.     { 14,  4,  5}, { 14,  4,  9}, { 14,  4, 17}, { 14,  4, 19},
  1241.     { 14,  4, 21}, { 14,  4, 22}, { 14,  4, 23}, { 14,  5,  1},
  1242.     { 14,  5,  2}, { 14,  5,  5}, { 14,  5,  7}, { 14,  5,  9},
  1243.     { 14,  5, 17}, { 14,  5, 23}, { 14,  6,  1}, { 14,  6,  5},
  1244.     { 14,  6,  9}, { 14,  7,  1}, { 14,  7,  2}, { 14,  7,  5},
  1245.     { 14,  7,  9}, { 14,  7, 11}, { 14,  7, 17}, { 14,  7, 19},
  1246.     { 14,  7, 21}, { 14,  7, 23}, { 14,  7, 24}, { 14, 10,  1},
  1247.     { 14, 10,  2}, { 14, 10,  5}, { 14, 10,  9}, { 14, 10, 17},
  1248.     { 14, 10, 19}, { 14, 10, 21}, { 14, 10, 23}, { 14, 11,  1},
  1249.     { 14, 11,  5}, { 14, 11,  9}, { 14, 11, 17}, { 14, 11, 19},
  1250.     { 14, 11, 22}, { 14, 11, 23}, { 14, 12,  1}, { 14, 13,  1},
  1251.     { 14, 13,  2}, { 14, 13,  5}, { 14, 13,  9}, { 14, 13, 11},
  1252.     { 14, 13, 17}, { 14, 13, 19}, { 14, 13, 21}, { 14, 13, 23},
  1253.     { 14, 13, 24}, { 14, 13, 25}, { 14, 13, 29}, { 14, 14,  1},
  1254.     { 14, 14,  2}, { 14, 14,  9}, { 14, 14, 19}, { 14, 14, 21},
  1255.     { 14, 14, 23}, { 14, 15,  1}, { 14, 15, 22}, { 14, 15, 23},
  1256.     { 14, 18,  1}, { 14, 18,  5}, { 14, 18,  9}, { 14, 18, 17},
  1257.     { 14, 18, 19}, { 14, 18, 21}, { 14, 18, 23}, { 14, 19,  1},
  1258.     { 14, 19,  2}, { 14, 19,  5}, { 14, 19, 23}, { 14, 20,  1},
  1259.     { 14, 20,  2}, { 14, 20,  5}, { 14, 20,  9}, { 14, 20, 10},
  1260.     { 14, 20, 11}, { 14, 20, 17}, { 14, 20, 19}, { 14, 20, 21},
  1261.     { 14, 20, 23}, { 14, 21,  1}, { 14, 21, 22}, { 14, 22,  1},
  1262.     { 14, 23,  1}, { 14, 23,  2}, { 14, 23,  5}, { 14, 23,  9},
  1263.     { 14, 23, 17}, { 14, 23, 19}, { 14, 23, 21}, { 14, 26,  1},
  1264.     { 14, 26,  5}, { 14, 26,  9}, { 14, 26, 17}, { 14, 27,  1},
  1265.     { 14, 27,  2}, { 14, 27,  5}, { 14, 27,  9}, { 14, 27, 17},
  1266.     { 14, 27, 19}, { 14, 27, 21}, { 14, 27, 23}, { 14, 29,  1},
  1267.     { 14, 29,  2}, { 14, 29,  5}, { 14, 29,  8}, { 14, 29,  9},
  1268.     { 14, 29, 11}, { 14, 29, 17}, { 14, 29, 19}, { 14, 29, 21},
  1269.     { 14, 29, 23}, { 14, 29, 24}, { 14, 29, 27}, { 14, 29, 28},
  1270.     { 15,  3,  1}, { 15,  3,  2}, { 15,  3,  5}, { 15,  3,  7},
  1271.     { 15,  3,  9}, { 15,  3, 12}, { 15,  3, 17}, { 15,  3, 19},
  1272.     { 15,  3, 21}, { 15,  3, 22}, { 15,  3, 23}, { 15,  4,  1},
  1273.     { 15,  4,  2}, { 15,  4,  5}, { 15,  4,  9}, { 15,  4, 17},
  1274.     { 15,  4, 19}, { 15,  4, 21}, { 15,  4, 22}, { 15,  4, 23},
  1275.     { 15,  5,  1}, { 15,  5,  5}, { 15,  5, 23}, { 15,  7,  1},
  1276.     { 15,  7,  2}, { 15,  7,  5}, { 15,  7,  9}, { 15,  7, 17},
  1277.     { 15,  7, 19}, { 15,  7, 21}, { 15,  7, 22}, { 15,  7, 23},
  1278.     { 15, 10,  1}, { 15, 10, 23}, { 15, 11,  1}, { 15, 11, 22},
  1279.     { 15, 13,  1}, { 15, 13,  2}, { 15, 13,  5}, { 15, 13,  9},
  1280.     { 15, 13, 17}, { 15, 13, 19}, { 15, 13, 21}, { 15, 13, 23},
  1281.     { 15, 13, 25}, { 15, 14,  1}, { 15, 14,  2}, { 15, 14,  9},
  1282.     { 15, 14, 22}, { 15, 15,  1}, { 15, 15, 22}, { 15, 18,  1},
  1283.     { 15, 18,  5}, { 15, 18,  9}, { 15, 18, 17}, { 15, 18, 19},
  1284.     { 15, 19, 23}, { 15, 20,  1}, { 15, 20,  2}, { 15, 20,  5},
  1285.     { 15, 20,  9}, { 15, 20, 17}, { 15, 20, 19}, { 15, 20, 23},
  1286.     { 15, 21,  1}, { 15, 21, 22}, { 15, 21, 23}, { 15, 23,  1},
  1287.     { 15, 26,  1}, { 15, 27,  1}, { 15, 27, 17}, { 15, 27, 21},
  1288.     { 15, 27, 23}, { 15, 29,  1}, { 15, 29,  2}, { 15, 29,  5},
  1289.     { 15, 29,  9}, { 15, 29, 17}, { 15, 29, 19}, { 15, 29, 23},
  1290.     { 15, 29, 24}, { 15, 29, 29}, { 16,  3,  1}, { 16,  3,  2},
  1291.     { 16,  3,  5}, { 16,  3,  7}, { 16,  3,  9}, { 16,  3, 17},
  1292.     { 16,  3, 19}, { 16,  3, 21}, { 16,  3, 22}, { 16,  3, 23},
  1293.     { 16,  3, 24}, { 16,  4,  1}, { 16,  4,  2}, { 16,  4,  5},
  1294.     { 16,  4,  9}, { 16,  4, 17}, { 16,  4, 19}, { 16,  4, 21},
  1295.     { 16,  4, 22}, { 16,  4, 23}, { 16,  5,  1}, { 16,  5,  5},
  1296.     { 16,  5,  7}, { 16,  5,  9}, { 16,  5, 17}, { 16,  5, 23},
  1297.     { 16,  7,  1}, { 16,  7,  2}, { 16,  7,  5}, { 16,  7,  9},
  1298.     { 16,  7, 17}, { 16,  7, 19}, { 16,  7, 21}, { 16,  7, 22},
  1299.     { 16,  7, 23}, { 16, 10,  1}, { 16, 10,  2}, { 16, 10,  5},
  1300.     { 16, 10,  9}, { 16, 10, 17}, { 16, 10, 19}, { 16, 10, 21},
  1301.     { 16, 10, 23}, { 16, 11,  1}, { 16, 11,  5}, { 16, 11, 22},
  1302.     { 16, 12,  1}, { 16, 12,  5}, { 16, 12, 23}, { 16, 13,  1},
  1303.     { 16, 13,  2}, { 16, 13,  5}, { 16, 13,  9}, { 16, 13, 17},
  1304.     { 16, 13, 19}, { 16, 13, 21}, { 16, 13, 23}, { 16, 14,  1},
  1305.     { 16, 14,  5}, { 16, 14,  9}, { 16, 14, 23}, { 16, 18,  1},
  1306.     { 16, 18,  5}, { 16, 18,  9}, { 16, 18, 17}, { 16, 18, 19},
  1307.     { 16, 18, 21}, { 16, 18, 23}, { 16, 19,  1}, { 16, 19, 17},
  1308.     { 16, 20,  1}, { 16, 20,  2}, { 16, 20,  5}, { 16, 20,  9},
  1309.     { 16, 20, 17}, { 16, 20, 19}, { 16, 20, 21}, { 16, 20, 23},
  1310.     { 16, 21,  1}, { 16, 21, 22}, { 16, 22,  1}, { 16, 22,  5},
  1311.     { 16, 23,  1}, { 16, 23,  5}, { 16, 23,  9}, { 16, 23, 17},
  1312.     { 16, 23, 19}, { 16, 23, 21}, { 16, 23, 23}, { 16, 26,  1},
  1313.     { 16, 26,  5}, { 16, 26,  9}, { 16, 26, 17}, { 16, 26, 23},
  1314.     { 16, 27,  1}, { 16, 27,  2}, { 16, 27,  5}, { 16, 27,  9},
  1315.     { 16, 27, 17}, { 16, 27, 19}, { 16, 27, 21}, { 16, 27, 23},
  1316.     { 16, 29,  1}, { 16, 29,  2}, { 16, 29,  5}, { 16, 29,  8},
  1317.     { 16, 29,  9}, { 16, 29, 10}, { 16, 29, 17}, { 16, 29, 19},
  1318.     { 16, 29, 21}, { 16, 29, 23}, { 17,  3,  1}, { 17,  3,  2},
  1319.     { 17,  3,  5}, { 17,  3,  9}, { 17,  3, 17}, { 17,  3, 19},
  1320.     { 17,  3, 21}, { 17,  3, 23}, { 17,  4,  1}, { 17,  4,  2},
  1321.     { 17,  4,  5}, { 17,  4,  9}, { 17,  4, 17}, { 17,  4, 19},
  1322.     { 17,  4, 21}, { 17,  4, 22}, { 17,  4, 23}, { 17,  5,  1},
  1323.     { 17,  5,  2}, { 17,  5, 23}, { 17,  7,  1}, { 17,  7,  2},
  1324.     { 17,  7,  5}, { 17,  7,  8}, { 17,  7,  9}, { 17,  7, 17},
  1325.     { 17,  7, 19}, { 17,  7, 21}, { 17,  7, 22}, { 17,  7, 23},
  1326.     { 17, 10,  1}, { 17, 10,  2}, { 17, 10,  5}, { 17, 10,  9},
  1327.     { 17, 10, 17}, { 17, 10, 19}, { 17, 10, 21}, { 17, 10, 23},
  1328.     { 17, 11,  1}, { 17, 11,  5}, { 17, 11,  9}, { 17, 11, 17},
  1329.     { 17, 11, 19}, { 17, 11, 21}, { 17, 11, 22}, { 17, 11, 23},
  1330.     { 17, 12,  1}, { 17, 13,  1}, { 17, 13,  2}, { 17, 13,  5},
  1331.     { 17, 13,  9}, { 17, 13, 17}, { 17, 13, 19}, { 17, 13, 21},
  1332.     { 17, 13, 23}, { 17, 14,  1}, { 17, 14,  2}, { 17, 14,  5},
  1333.     { 17, 14,  9}, { 17, 14, 17}, { 17, 14, 23}, { 17, 15,  1},
  1334.     { 17, 15, 23}, { 17, 18,  1}, { 17, 18,  9}, { 17, 19,  1},
  1335.     { 17, 20,  1}, { 17, 20,  2}, { 17, 20,  5}, { 17, 20,  9},
  1336.     { 17, 20, 17}, { 17, 20, 19}, { 17, 20, 21}, { 17, 20, 23},
  1337.     { 17, 21,  1}, { 17, 21,  5}, { 17, 21,  9}, { 17, 21, 23},
  1338.     { 17, 22,  1}, { 17, 22, 23}, { 17, 23,  1}, { 17, 23,  2},
  1339.     { 17, 23,  5}, { 17, 23,  9}, { 17, 23, 17}, { 17, 23, 19},
  1340.     { 17, 23, 21}, { 17, 23, 23}, { 17, 26,  1}, { 17, 26,  5},
  1341.     { 17, 26,  9}, { 17, 26, 17}, { 17, 27,  1}, { 17, 27,  2},
  1342.     { 17, 27,  5}, { 17, 27,  9}, { 17, 27, 17}, { 17, 27, 19},
  1343.     { 17, 27, 23}, { 17, 29,  1}, { 17, 29,  2}, { 17, 29,  5},
  1344.     { 17, 29,  9}, { 17, 29, 17}, { 17, 29, 19}, { 17, 29, 21},
  1345.     { 17, 29, 23}, { 18,  3,  1}, { 18,  3,  2}, { 18,  3,  5},
  1346.     { 18,  3,  9}, { 18,  3, 10}, { 18,  3, 17}, { 18,  3, 19},
  1347.     { 18,  3, 21}, { 18,  3, 22}, { 18,  3, 23}, { 18,  4,  1},
  1348.     { 18,  4,  2}, { 18,  4,  5}, { 18,  4,  9}, { 18,  4, 17},
  1349.     { 18,  4, 19}, { 18,  4, 21}, { 18,  4, 22}, { 18,  4, 23},
  1350.     { 18,  5,  1}, { 18,  5, 23}, { 18,  7,  1}, { 18,  7,  2},
  1351.     { 18,  7,  5}, { 18,  7,  9}, { 18,  7, 11}, { 18,  7, 17},
  1352.     { 18,  7, 19}, { 18,  7, 21}, { 18,  7, 22}, { 18,  7, 23},
  1353.     { 18, 10,  1}, { 18, 10,  2}, { 18, 10,  5}, { 18, 10,  9},
  1354.     { 18, 10, 17}, { 18, 10, 19}, { 18, 10, 21}, { 18, 10, 23},
  1355.     { 18, 11,  1}, { 18, 11,  5}, { 18, 11, 22}, { 18, 12,  1},
  1356.     { 18, 12,  5}, { 18, 13,  1}, { 18, 13,  2}, { 18, 13,  5},
  1357.     { 18, 13,  9}, { 18, 13, 17}, { 18, 13, 19}, { 18, 13, 21},
  1358.     { 18, 13, 23}, { 18, 13, 28}, { 18, 14,  1}, { 18, 14,  5},
  1359.     { 18, 15,  1}, { 18, 18,  1}, { 18, 18,  5}, { 18, 18, 21},
  1360.     { 18, 18, 23}, { 18, 19,  1}, { 18, 20,  1}, { 18, 20,  2},
  1361.     { 18, 20,  5}, { 18, 20,  9}, { 18, 20, 17}, { 18, 20, 19},
  1362.     { 18, 20, 21}, { 18, 20, 23}, { 18, 21,  1}, { 18, 21, 22},
  1363.     { 18, 22,  1}, { 18, 23,  1}, { 18, 23,  2}, { 18, 23,  5},
  1364.     { 18, 23,  9}, { 18, 23, 17}, { 18, 23, 19}, { 18, 23, 23},
  1365.     { 18, 26,  1}, { 18, 26,  5}, { 18, 26,  9}, { 18, 26, 17},
  1366.     { 18, 26, 23}, { 18, 27,  1}, { 18, 27,  2}, { 18, 27,  5},
  1367.     { 18, 27,  8}, { 18, 27,  9}, { 18, 27, 11}, { 18, 27, 17},
  1368.     { 18, 27, 19}, { 18, 27, 21}, { 18, 28,  1}, { 18, 28,  5},
  1369.     { 18, 28,  9}, { 18, 28, 17}, { 18, 28, 19}, { 18, 29,  1},
  1370.     { 18, 29,  2}, { 18, 29,  5}, { 18, 29,  9}, { 18, 29, 17},
  1371.     { 18, 29, 19}, { 18, 29, 21}, { 18, 29, 23}, { 19,  3,  1},
  1372.     { 19,  3,  2}, { 19,  3,  3}, { 19,  3,  5}, { 19,  3,  9},
  1373.     { 19,  3, 11}, { 19,  3, 17}, { 19,  3, 19}, { 19,  3, 21},
  1374.     { 19,  3, 22}, { 19,  3, 23}, { 19,  3, 27}, { 19,  4,  1},
  1375.     { 19,  4,  2}, { 19,  4,  5}, { 19,  4,  9}, { 19,  4, 17},
  1376.     { 19,  4, 19}, { 19,  4, 21}, { 19,  4, 22}, { 19,  4, 23},
  1377.     { 19,  5,  1}, { 19,  5,  2}, { 19,  7,  1}, { 19,  7,  2},
  1378.     { 19,  7,  5}, { 19,  7,  9}, { 19,  7, 17}, { 19,  7, 19},
  1379.     { 19,  7, 21}, { 19,  7, 22}, { 19,  7, 23}, { 19, 10,  1},
  1380.     { 19, 10,  2}, { 19, 10,  5}, { 19, 10,  9}, { 19, 10, 17},
  1381.     { 19, 10, 19}, { 19, 10, 21}, { 19, 10, 23}, { 19, 11,  1},
  1382.     { 19, 11,  5}, { 19, 11,  9}, { 19, 11, 17}, { 19, 11, 19},
  1383.     { 19, 11, 22}, { 19, 11, 23}, { 19, 12,  1}, { 19, 12,  9},
  1384.     { 19, 12, 19}, { 19, 12, 21}, { 19, 13,  1}, { 19, 13,  2},
  1385.     { 19, 13,  5}, { 19, 13,  9}, { 19, 13, 17}, { 19, 13, 19},
  1386.     { 19, 13, 21}, { 19, 13, 23}, { 19, 14,  1}, { 19, 14, 23},
  1387.     { 19, 18,  1}, { 19, 18,  5}, { 19, 19,  1}, { 19, 19,  5},
  1388.     { 19, 19,  9}, { 19, 19, 19}, { 19, 19, 21}, { 19, 20,  1},
  1389.     { 19, 20,  2}, { 19, 20,  5}, { 19, 20,  8}, { 19, 20,  9},
  1390.     { 19, 20, 11}, { 19, 20, 17}, { 19, 20, 19}, { 19, 20, 21},
  1391.     { 19, 20, 23}, { 19, 21,  1}, { 19, 21, 23}, { 19, 23,  1},
  1392.     { 19, 23,  5}, { 19, 23,  9}, { 19, 23, 17}, { 19, 23, 21},
  1393.     { 19, 26,  1}, { 19, 26,  5}, { 19, 26,  9}, { 19, 26, 17},
  1394.     { 19, 26, 21}, { 19, 26, 23}, { 19, 27,  1}, { 19, 27,  5},
  1395.     { 19, 27,  9}, { 19, 27, 17}, { 19, 27, 19}, { 19, 27, 21},
  1396.     { 19, 29,  1}, { 19, 29,  2}, { 19, 29,  5}, { 19, 29,  9},
  1397.     { 19, 29, 17}, { 19, 29, 19}, { 19, 29, 21}, { 19, 29, 23},
  1398.     { 20,  3,  1}, { 20,  3,  2}, { 20,  3,  5}, { 20,  3,  9},
  1399.     { 20,  3, 14}, { 20,  3, 17}, { 20,  3, 19}, { 20,  3, 21},
  1400.     { 20,  3, 23}, { 20,  4,  1}, { 20,  4,  2}, { 20,  4,  5},
  1401.     { 20,  4,  9}, { 20,  4, 17}, { 20,  4, 19}, { 20,  4, 21},
  1402.     { 20,  4, 22}, { 20,  4, 23}, { 20,  5,  1}, { 20,  5, 23},
  1403.     { 20,  7,  1}, { 20,  7,  2}, { 20,  7,  5}, { 20,  7,  9},
  1404.     { 20,  7, 11}, { 20,  7, 17}, { 20,  7, 19}, { 20,  7, 21},
  1405.     { 20,  7, 23}, { 20, 10,  1}, { 20, 10,  2}, { 20, 10,  5},
  1406.     { 20, 10,  9}, { 20, 10, 17}, { 20, 10, 19}, { 20, 10, 21},
  1407.     { 20, 10, 23}, { 20, 11,  1}, { 20, 11,  2}, { 20, 11,  5},
  1408.     { 20, 11,  9}, { 20, 11, 17}, { 20, 11, 19}, { 20, 11, 21},
  1409.     { 20, 11, 22}, { 20, 11, 23}, { 20, 12,  1}, { 20, 12,  5},
  1410.     { 20, 12,  9}, { 20, 12, 19}, { 20, 13,  1}, { 20, 13,  2},
  1411.     { 20, 13,  5}, { 20, 13,  9}, { 20, 13, 14}, { 20, 13, 17},
  1412.     { 20, 13, 19}, { 20, 13, 21}, { 20, 13, 23}, { 20, 13, 27},
  1413.     { 20, 14,  1}, { 20, 14,  2}, { 20, 14,  5}, { 20, 14,  9},
  1414.     { 20, 14, 21}, { 20, 14, 23}, { 20, 15,  1}, { 20, 15,  2},
  1415.     { 20, 15,  5}, { 20, 15, 21}, { 20, 15, 23}, { 20, 18,  1},
  1416.     { 20, 18,  2}, { 20, 18,  5}, { 20, 18,  9}, { 20, 18, 19},
  1417.     { 20, 18, 21}, { 20, 18, 23}, { 20, 19,  1}, { 20, 19,  5},
  1418.     { 20, 19,  9}, { 20, 19, 19}, { 20, 19, 21}, { 20, 20,  1},
  1419.     { 20, 20,  2}, { 20, 20,  5}, { 20, 20,  9}, { 20, 20, 14},
  1420.     { 20, 20, 17}, { 20, 20, 21}, { 20, 20, 23}, { 20, 21,  1},
  1421.     { 20, 21,  5}, { 20, 21,  9}, { 20, 21, 17}, { 20, 21, 23},
  1422.     { 20, 22,  1}, { 20, 22,  2}, { 20, 22,  5}, { 20, 22,  9},
  1423.     { 20, 22, 23}, { 20, 23,  1}, { 20, 23,  2}, { 20, 23,  5},
  1424.     { 20, 23,  9}, { 20, 23, 17}, { 20, 23, 19}, { 20, 23, 21},
  1425.     { 20, 23, 23}, { 20, 26,  1}, { 20, 26,  2}, { 20, 26,  5},
  1426.     { 20, 26,  9}, { 20, 26, 17}, { 20, 26, 21}, { 20, 26, 23},
  1427.     { 20, 27,  1}, { 20, 27,  2}, { 20, 27,  5}, { 20, 27,  7},
  1428.     { 20, 27,  8}, { 20, 27,  9}, { 20, 27, 10}, { 20, 27, 17},
  1429.     { 20, 27, 19}, { 20, 27, 21}, { 20, 27, 23}, { 20, 27, 27},
  1430.     { 20, 28,  1}, { 20, 28,  5}, { 20, 28,  9}, { 20, 28, 17},
  1431.     { 20, 28, 19}, { 20, 28, 23}, { 20, 29,  1}, { 20, 29,  2},
  1432.     { 20, 29,  5}, { 20, 29,  9}, { 20, 29, 17}, { 20, 29, 19},
  1433.     { 20, 29, 21}, { 20, 29, 23},
  1434. };
  1435.  
  1436.  
  1437. static const unsigned short ks_table2[][4] =
  1438. {
  1439.     {0xa4bf,  1,  3,  1},  {0xa4c0,  1,  4,  1},
  1440.     {0xa4c1,  1,  5,  1},  {0xa4c2,  1,  6,  1},
  1441.     {0xa4c3,  1,  7,  1},  {0xa4c4,  1, 10,  1},
  1442.     {0xa4c5,  1, 11,  1},  {0xa4c6,  1, 12,  1},
  1443.     {0xa4c7,  1, 13,  1},  {0xa4c8,  1, 14,  1},
  1444.     {0xa4c9,  1, 15,  1},  {0xa4ca,  1, 18,  1},
  1445.     {0xa4cb,  1, 19,  1},  {0xa4cc,  1, 20,  1},
  1446.     {0xa4cd,  1, 21,  1},  {0xa4ce,  1, 22,  1},
  1447.     {0xa4cf,  1, 23,  1},  {0xa4d0,  1, 26,  1},
  1448.     {0xa4d1,  1, 27,  1},  {0xa4d2,  1, 28,  1},
  1449.     {0xa4d3,  1, 29,  1},  {0xa4a1,  2,  2,  1},
  1450.     {0xa4a2,  3,  2,  1},  {0xa4a4,  4,  2,  1},
  1451.     {0xa4a7,  5,  2,  1},  {0xa4a8,  6,  2,  1},
  1452.     {0xa4a9,  7,  2,  1},  {0xa4b1,  8,  2,  1},
  1453.     {0xa4b2,  9,  2,  1},  {0xa4b3, 10,  2,  1},
  1454.     {0xa4b5, 11,  2,  1},  {0xa4b6, 12,  2,  1},
  1455.     {0xa4b7, 13,  2,  1},  {0xa4b8, 14,  2,  1},
  1456.     {0xa4b9, 15,  2,  1},  {0xa4ba, 16,  2,  1},
  1457.     {0xa4bb, 17,  2,  1},  {0xa4bc, 18,  2,  1},
  1458.     {0xa4bd, 19,  2,  1},  {0xa4be, 20,  2,  1},
  1459. };
  1460.  
  1461. /* ┴╢╟╒╟ⁿ ├╩╝║ - ┐╧╝║╟ⁿ │╣└┌ ║»╚»
  1462.  * conversion: initial sound of compound type - ??? of completion type
  1463.  */
  1464.  
  1465. static const char_u johab_fcon_to_wan[] =
  1466. {
  1467.     0,
  1468.     0xd4, 0xa1, 0xa2, 0xa4, 0xa7,    /* (├ñ┐≥),ñí,ñó,ññ,ñº */
  1469.     0xa8, 0xa9, 0xb1, 0xb2, 0xb3,    /* ñ¿,ñ⌐,ñ▒,ñ▓,ñ│ */
  1470.     0xb5, 0xb6, 0xb7, 0xb8, 0xb9,    /* ñ╡,ñ╢,ñ╖,ñ╕,ñ╣ */
  1471.     0xba, 0xbb, 0xbc, 0xbd, 0xbe     /* ñ║,ñ╗,ñ╝,ñ╜,ñ╛ */
  1472. };
  1473.  
  1474. /* ┴╢╟╒╟ⁿ ┴▀╝║ -> ┐╧╝║╟ⁿ │╣└┌ ║»╚»
  1475.  * conversion: medial vowel of compound type - ??? of completion type
  1476.  */
  1477.  
  1478. static const char_u johab_vow_to_wan[] =
  1479. {
  1480.     0, 0,
  1481.     0xd4, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,    /* (├ñ┐≥),ñ┐,ñ└,ñ┴,ñ┬,ñ├ */
  1482.     0, 0,
  1483.     0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, /* ñ─,ñ┼,ñ╞,ñ╟,ñ╟ñ┐,ñ╟ñ└ */
  1484.     0, 0,
  1485.     0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* ñ╟ñ╙,ñ╦,ñ╠,ñ╠ñ├,ñ╠ñ─,ñ╠ñ╙ */
  1486.     0, 0,
  1487.     0xd0, 0xd1, 0xd2, 0xd3         /* ñ╨,ñ╤,ñ╤ñ╙,ñ╙ */
  1488. };
  1489.  
  1490. /* ┴╢╟╒╟ⁿ ┴╛╝║ -> ┐╧╝║╟ⁿ │╣└┌ ║»╚»
  1491.  * conversion: final consonant of compound type - ??? of completion type
  1492.  */
  1493.  
  1494. static const char_u johab_lcon_to_wan[] =
  1495. {
  1496.     0,
  1497.     0xd4, 0xa1, 0xa2, 0xa3, 0xa4,    /* (├ñ┐≥), ñí, ñó, ñíñ╡, ññ */
  1498.     0xa5, 0xa6, 0xa7, 0xa9, 0xaa,    /* ñññ╕, ñññ╛, ñº, ñ⌐, ñ⌐ñí */
  1499.     0xab, 0xac, 0xad, 0xae, 0xaf,    /* ñ⌐ñ▒, ñ⌐ñ▓, ñ⌐ñ╡, ñ⌐ñ╝, ñ⌐ñ╜ */
  1500.     0xb0, 0xb1, 0,    0xb2, 0xb4,    /* ñ⌐ñ╛, ñ▒, 0, ñ▓, ñ▓ñ╡ */
  1501.     0xb5, 0xb6, 0xb7, 0xb8, 0xba,    /* ñ╡, ñ╢, ñ╖, ñ╕, ñ║ */
  1502.     0xbb, 0xbc, 0xbd, 0xbe         /* ñ╗, ñ╝, ñ╜, ñ╛ */
  1503. };
  1504.  
  1505.     static void
  1506. convert_ks_to_3(src, fp, mp, lp)
  1507.     const char_u    *src;
  1508.     int            *fp;
  1509.     int            *mp;
  1510.     int            *lp;
  1511. {
  1512.     int h = *src;
  1513.     int low = *(src + 1);
  1514.     int c;
  1515.     int i;
  1516.  
  1517.     if ((i = han_index(h, low)) >= 0
  1518.     && i < sizeof(ks_table1)/sizeof(ks_table1[0]))
  1519.     {
  1520.     *fp = ks_table1[i][0];
  1521.     *mp = ks_table1[i][1];
  1522.     *lp = ks_table1[i][2];
  1523.     }
  1524.     else
  1525.     {
  1526.     c = (h << 8) | low;
  1527.     for (i = 0; i < 40; i++)
  1528.         if (ks_table2[i][0] == c)
  1529.         {
  1530.         *fp = ks_table2[i][1];
  1531.         *mp = ks_table2[i][2];
  1532.         *lp = ks_table2[i][3];
  1533.         return;
  1534.         }
  1535.     *fp = 0xff;    /* ▒╫╖í╟╚ ─┌╡σ (graphic code) */
  1536.     *mp = h;
  1537.     *lp = low;
  1538.     }
  1539. }
  1540.  
  1541.     static int
  1542. convert_3_to_ks(fv, mv, lv, des)
  1543.     int        fv;
  1544.     int        mv;
  1545.     int        lv;
  1546.     char_u  *des;
  1547. {
  1548.     char_u key[3];
  1549.     register int hi, lo, mi = 0, result, found;
  1550.  
  1551.     if (fv == 0xff)
  1552.     {
  1553.     des[0] = mv;
  1554.     des[1] = lv;
  1555.     return 2;
  1556.     }
  1557.     key[0] = fv;
  1558.     key[1] = mv;
  1559.     key[2] = lv;
  1560.     lo = 0;
  1561.     hi = sizeof(ks_table1)/3 - 1;
  1562.     found = 0;
  1563.     while (lo + 1 < hi)
  1564.     {
  1565.     mi = (lo + hi)/2;
  1566.     result = STRNCMP(ks_table1[mi], key, 3);
  1567.     if (result == 0)
  1568.     {
  1569.         found = 1;
  1570.         break;
  1571.     }
  1572.     else if (result > 0)
  1573.         hi = mi;
  1574.     else
  1575.         lo = mi;
  1576.     }
  1577.     if (!found)
  1578.     {
  1579.     if (!STRNCMP(ks_table1[lo], key, 3))
  1580.     {
  1581.         found = 1;
  1582.         mi = lo;
  1583.     }
  1584.     if (!STRNCMP(ks_table1[hi], key, 3))
  1585.     {
  1586.         found = 1;
  1587.         mi = hi;
  1588.     }
  1589.     }
  1590.     if (!found)
  1591.     {
  1592.     for (mi = 0; mi < 40; mi++)
  1593.         if (ks_table2[mi][1] == fv && ks_table2[mi][2] == mv &&
  1594.         ks_table2[mi][3] == lv)
  1595.         {
  1596.         des[0] = (unsigned)(ks_table2[mi][0]) >> 8;
  1597.         des[1] = ks_table2[mi][0];
  1598.         return 2;    /* found */
  1599.         }
  1600.     }
  1601.     else
  1602.     {
  1603.     des[0] = mi / (0xff-0xa1) + 0xb0;
  1604.     des[1] = mi % (0xff-0xa1) + 0xa1;
  1605.     return 2;        /* found */
  1606.     }
  1607.  
  1608.     /* ┐╧╝║╟ⁿ ╟Ñ┐í ╛°┤┘. ``KS C 5601 - 1992 ┴ñ║╕ ▒│╚»┐δ ║╬╚ú ╟╪╝│''
  1609.      * 3.3 └²┐í ╝│╕φ╡╚ ╣µ╣²└╕╖╬ encoding ╟╤┤┘.
  1610.      */
  1611.  
  1612.     *des++ = 0xa4;             /* ├ñ┐≥ */
  1613.     *des++ = 0xd4;
  1614.     *des++ = 0xa4;             /* │╣└┌┤┬ ╕≡╡╬ a4 ╟α┐í └╓┤┘. */
  1615.     *des++ = johab_fcon_to_wan[fv];
  1616.     *des++ = 0xa4;
  1617.     *des++ = johab_vow_to_wan[mv];
  1618.     *des++ = 0xa4;
  1619.     *des++ = johab_lcon_to_wan[lv];
  1620.     return 8;
  1621. }
  1622.