#include <stdint.h>

typedef struct Summary16
{
    unsigned short idx, used;
} Summary16;

/*
 * gbkext5
 */

static const unsigned short gbkext5_2uni_pagea1[658] = {
  /* 0xa1 */
  0x3000, 0x3001, 0x3002, 0x00b7, 0x02c9, 0x02c7, 0x00a8, 0x3003,
  0x3005, 0x2014, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c,
  0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
  0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1,
  0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a,
  0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312,
  0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d,
  0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234,
  0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4,
  0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb,
  0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2,
  0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013,
  /* 0xa2 */
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f,
  0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497,
  0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477,
  0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f,
  0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487,
  0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
  0x2468, 0x2469, 0x20ac, 0x3020, 0x3220, 0x3221, 0x3222, 0x3223,
  0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0xa3 */
  0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08,
  0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10,
  0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18,
  0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20,
  0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28,
  0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30,
  0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38,
  0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40,
  0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48,
  0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50,
  0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58,
  0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3,
  /* 0xa4 */
  0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048,
  0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050,
  0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
  0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060,
  0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
  0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070,
  0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
  0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080,
  0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
  0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090,
  0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0xa5 */
  0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8,
  0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0,
  0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8,
  0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0,
  0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8,
  0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0,
  0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8,
  0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0,
  0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8,
  0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0,
  0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0xa6 */
  0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
  0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
  0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
  0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
  0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9,
  0xfe10, 0xfe12, 0xfe11, 0xfe13, 0xfe14, 0xfe15, 0xfe16, 0xfe35,
  0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41,
  0xfe42, 0xfe43, 0xfe44, 0xfe17, 0xfe18, 0xfe3b, 0xfe3c, 0xfe37,
  0xfe38, 0xfe31, 0xfe19, 0xfe33, 0xfe34, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  /* 0xa7 */
  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416,
  0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
  0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426,
  0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e,
  0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436,
  0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
  0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446,
  0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e,
  0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
};

int
gbkext5_mbtowc (unsigned short *pwc, const unsigned char *s, unsigned int n)
{
  unsigned short wc = 0xfffd;
  if (n >= 2) {
    unsigned char c1 = s[0]-0xa1;
    if (c1 < 0x07) {
      unsigned char c2 = s[1];
      if (c2 >= 0xa1 && c2 < 0xff) {
        unsigned int i = 94*c1 + (c2 - 0xa1);
        if (i < 645)
          wc = gbkext5_2uni_pagea1[i];
      }
    }
    *pwc = wc;
    return 2;
  }
  return -1;
}

static const unsigned short gbkext5_2charset[561] = {
  0xa1e8, 0xa1ec, 0xa1a7, 0xa1e3, 0xa1c0, 0xa1a4, 0xa1c1, 0xa1c2,
  0xa1a6, 0xa1a5, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4, 0xa6a5, 0xa6a6,
  0xa6a7, 0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ad, 0xa6ae,
  0xa6af, 0xa6b0, 0xa6b1, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b5, 0xa6b6,
  0xa6b7, 0xa6b8, 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5, 0xa6c6,
  0xa6c7, 0xa6c8, 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd, 0xa6ce,
  0xa6cf, 0xa6d0, 0xa6d1, 0xa6d2, 0xa6d3, 0xa6d4, 0xa6d5, 0xa6d6,
  0xa6d7, 0xa6d8, 0xa7a7, 0xa7a1, 0xa7a2, 0xa7a3, 0xa7a4, 0xa7a5,
  0xa7a6, 0xa7a8, 0xa7a9, 0xa7aa, 0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae,
  0xa7af, 0xa7b0, 0xa7b1, 0xa7b2, 0xa7b3, 0xa7b4, 0xa7b5, 0xa7b6,
  0xa7b7, 0xa7b8, 0xa7b9, 0xa7ba, 0xa7bb, 0xa7bc, 0xa7bd, 0xa7be,
  0xa7bf, 0xa7c0, 0xa7c1, 0xa7d1, 0xa7d2, 0xa7d3, 0xa7d4, 0xa7d5,
  0xa7d6, 0xa7d8, 0xa7d9, 0xa7da, 0xa7db, 0xa7dc, 0xa7dd, 0xa7de,
  0xa7df, 0xa7e0, 0xa7e1, 0xa7e2, 0xa7e3, 0xa7e4, 0xa7e5, 0xa7e6,
  0xa7e7, 0xa7e8, 0xa7e9, 0xa7ea, 0xa7eb, 0xa7ec, 0xa7ed, 0xa7ee,
  0xa7ef, 0xa7f0, 0xa7f1, 0xa7d7, 0xa1aa, 0xa1ac, 0xa1ae, 0xa1af,
  0xa1b0, 0xa1b1, 0xa1ad, 0xa1eb, 0xa1e4, 0xa1e5, 0xa1f9, 0xa2e3,
  0xa1e6, 0xa1ed, 0xa1fb, 0xa1fc, 0xa1fa, 0xa1fd, 0xa1ca, 0xa1c7,
  0xa1c6, 0xa1cc, 0xa1d8, 0xa1de, 0xa1cf, 0xa1ce, 0xa1c4, 0xa1c5,
  0xa1c9, 0xa1c8, 0xa1d2, 0xa1d3, 0xa1e0, 0xa1df, 0xa1c3, 0xa1cb,
  0xa1d7, 0xa1d6, 0xa1d5, 0xa1d9, 0xa1d4, 0xa1dc, 0xa1dd, 0xa1da,
  0xa1db, 0xa1d1, 0xa1cd, 0xa1d0, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc,
  0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2, 0xa2c5, 0xa2c6,
  0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb, 0xa2cc, 0xa2cd, 0xa2ce,
  0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6,
  0xa2d7, 0xa2d8, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6,
  0xa2b7, 0xa2b8, 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be,
  0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2, 0xa2c3, 0xa2c4, 0xa1f6, 0xa1f5,
  0xa1f8, 0xa1f7, 0xa1f4, 0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa1ef,
  0xa1ee, 0xa1e2, 0xa1e1, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a8, 0xa1a9,
  0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb,
  0xa1be, 0xa1bf, 0xa1fe, 0xa1b2, 0xa1b3, 0xa1bc, 0xa1bd, 0xa2e4,
  0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7, 0xa4a8,
  0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af, 0xa4b0,
  0xa4b1, 0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7, 0xa4b8,
  0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf, 0xa4c0,
  0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7, 0xa4c8,
  0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf, 0xa4d0,
  0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7, 0xa4d8,
  0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df, 0xa4e0,
  0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7, 0xa4e8,
  0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef, 0xa4f0,
  0xa4f1, 0xa4f2, 0xa4f3, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5,
  0xa5a6, 0xa5a7, 0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac, 0xa5ad,
  0xa5ae, 0xa5af, 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5,
  0xa5b6, 0xa5b7, 0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd,
  0xa5be, 0xa5bf, 0xa5c0, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5,
  0xa5c6, 0xa5c7, 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd,
  0xa5ce, 0xa5cf, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5,
  0xa5d6, 0xa5d7, 0xa5d8, 0xa5d9, 0xa5da, 0xa5db, 0xa5dc, 0xa5dd,
  0xa5de, 0xa5df, 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5,
  0xa5e6, 0xa5e7, 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed,
  0xa5ee, 0xa5ef, 0xa5f0, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5,
  0xa5f6, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa2e9, 0xa2ea, 0xa2eb,
  0xa2ec, 0xa2ed, 0xa2ee, 0xa6d9, 0xa6db, 0xa6da, 0xa6dc, 0xa6dd,
  0xa6de, 0xa6df, 0xa6ec, 0xa6ed, 0xa6f3, 0xa6f2, 0xa6f4, 0xa6f5,
  0xa6e0, 0xa6e1, 0xa6f0, 0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef,
  0xa6e6, 0xa6e7, 0xa6e4, 0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb,
  0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8,
  0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0,
  0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8,
  0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa3be, 0xa3bf, 0xa3c0,
  0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7, 0xa3c8,
  0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf, 0xa3d0,
  0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7, 0xa3d8,
  0xa3d9, 0xa3da, 0xa3db, 0xa3dc, 0xa3dd, 0xa3de, 0xa3df, 0xa3e0,
  0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7, 0xa3e8,
  0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef, 0xa3f0,
  0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7, 0xa3f8,
  0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd, 0xa1ab, 0xa1e9, 0xa1ea,
  0xa3fe,
};

static const Summary16 gbkext5_uni2indx_page00[16] = {
  /* 0x0000 */
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0190 }, {    3, 0x0083 },
  {    6, 0x0000 }, {    6, 0x0080 }, {    7, 0x0000 }, {    7, 0x0080 },
};
static const Summary16 gbkext5_uni2indx_page02[38] = {
  /* 0x0200 */
  {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 },
  {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 },
  {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 },
  {    8, 0x0280 }, {   10, 0x0000 }, {   10, 0x0000 }, {   10, 0x0000 },
  /* 0x0300 */
  {   10, 0x0000 }, {   10, 0x0000 }, {   10, 0x0000 }, {   10, 0x0000 },
  {   10, 0x0000 }, {   10, 0x0000 }, {   10, 0x0000 }, {   10, 0x0000 },
  {   10, 0x0000 }, {   10, 0xfffe }, {   25, 0x03fb }, {   34, 0xfffe },
  {   49, 0x03fb }, {   58, 0x0000 }, {   58, 0x0000 }, {   58, 0x0000 },
  /* 0x0400 */
  {   58, 0x0002 }, {   59, 0xffff }, {   75, 0xffff }, {   91, 0xffff },
  {  107, 0xffff }, {  123, 0x0002 },
};
static const Summary16 gbkext5_uni2indx_page20[101] = {
  /* 0x2000 */
  {  124, 0x0000 }, {  124, 0x3350 }, {  130, 0x0040 }, {  131, 0x080d },
  {  135, 0x0000 }, {  135, 0x0000 }, {  135, 0x0000 }, {  135, 0x0000 },
  {  135, 0x0000 }, {  135, 0x0000 }, {  135, 0x1000 }, {  136, 0x0000 },
  {  136, 0x0000 }, {  136, 0x0000 }, {  136, 0x0000 }, {  136, 0x0000 },
  /* 0x2100 */
  {  136, 0x0008 }, {  137, 0x0040 }, {  138, 0x0000 }, {  138, 0x0000 },
  {  138, 0x0000 }, {  138, 0x0000 }, {  138, 0x0000 }, {  138, 0x0000 },
  {  138, 0x0000 }, {  138, 0x000f }, {  142, 0x0000 }, {  142, 0x0000 },
  {  142, 0x0000 }, {  142, 0x0000 }, {  142, 0x0000 }, {  142, 0x0000 },
  /* 0x2200 */
  {  142, 0x8100 }, {  144, 0x6402 }, {  148, 0x4fa1 }, {  156, 0x20f0 },
  {  161, 0x1100 }, {  163, 0x0000 }, {  163, 0xc033 }, {  169, 0x0000 },
  {  169, 0x0000 }, {  169, 0x0200 }, {  170, 0x0020 }, {  171, 0x0000 },
  {  171, 0x0000 }, {  171, 0x0000 }, {  171, 0x0000 }, {  171, 0x0000 },
  /* 0x2300 */
  {  171, 0x0000 }, {  171, 0x0004 }, {  172, 0x0000 }, {  172, 0x0000 },
  {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 },
  {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 },
  {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 },
  /* 0x2400 */
  {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 },
  {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x03ff }, {  182, 0xfff0 },
  {  194, 0xffff }, {  210, 0x0fff }, {  222, 0x0000 }, {  222, 0x0000 },
  {  222, 0x0000 }, {  222, 0x0000 }, {  222, 0x0000 }, {  222, 0x0000 },
  /* 0x2500 */
  {  222, 0x0000 }, {  222, 0x0000 }, {  222, 0x0000 }, {  222, 0x0000 },
  {  222, 0x0000 }, {  222, 0x0000 }, {  222, 0x0000 }, {  222, 0x0000 },
  {  222, 0x0000 }, {  222, 0x0000 }, {  222, 0x0003 }, {  224, 0x000c },
  {  226, 0xc8c0 }, {  231, 0x0000 }, {  231, 0x0000 }, {  231, 0x0000 },
  /* 0x2600 */
  {  231, 0x0060 }, {  233, 0x0000 }, {  233, 0x0000 }, {  233, 0x0000 },
  {  233, 0x0005 },
};
static const Summary16 gbkext5_uni2indx_page30[16] = {
  /* 0x3000 */
  {  235, 0xff2f }, {  248, 0x00fb }, {  255, 0x0001 }, {  256, 0x0000 },
  {  256, 0xfffe }, {  271, 0xffff }, {  287, 0xffff }, {  303, 0xffff },
  {  319, 0xffff }, {  335, 0x000f }, {  339, 0xfffe }, {  354, 0xffff },
  {  370, 0xffff }, {  386, 0xffff }, {  402, 0xffff }, {  418, 0x007f },
};
static const Summary16 gbkext5_uni2indx_page32[3] = {
  /* 0x3200 */
  {  425, 0x0000 }, {  425, 0x0000 }, {  425, 0x03ff },
};
static const Summary16 gbkext5_uni2indx_pagefe[31] = {
  /* 0xfe00 */
  {  435, 0x0000 }, {  435, 0x03ff }, {  445, 0x0000 }, {  445, 0xfffa },
  {  459, 0x001f }, {  464, 0x0000 }, {  464, 0x0000 }, {  464, 0x0000 },
  {  464, 0x0000 }, {  464, 0x0000 }, {  464, 0x0000 }, {  464, 0x0000 },
  {  464, 0x0000 }, {  464, 0x0000 }, {  464, 0x0000 }, {  464, 0x0000 },
  /* 0xff00 */
  {  464, 0xfffe }, {  479, 0xffff }, {  495, 0xffff }, {  511, 0xffff },
  {  527, 0xffff }, {  543, 0x7fff }, {  558, 0x0000 }, {  558, 0x0000 },
  {  558, 0x0000 }, {  558, 0x0000 }, {  558, 0x0000 }, {  558, 0x0000 },
  {  558, 0x0000 }, {  558, 0x0000 }, {  558, 0x000b },
};

int
gbkext5_wctomb (unsigned char *r, unsigned int wc, unsigned int n)
{
  if (n >= 2) {
    unsigned short c = 0;
    const Summary16 *summary = 0;
    if (wc >= 0x0000 && wc < 0x0100)
      summary = &gbkext5_uni2indx_page00[(wc>>4)];
    else if (wc >= 0x0200 && wc < 0x0460)
      summary = &gbkext5_uni2indx_page02[(wc>>4)-0x020];
    else if (wc >= 0x2000 && wc < 0x2650)
      summary = &gbkext5_uni2indx_page20[(wc>>4)-0x200];
    else if (wc >= 0x3000 && wc < 0x3100)
      summary = &gbkext5_uni2indx_page30[(wc>>4)-0x300];
    else if (wc >= 0x3200 && wc < 0x3230)
      summary = &gbkext5_uni2indx_page32[(wc>>4)-0x320];
    else if (wc >= 0xfe00 && wc < 0xfff0)
      summary = &gbkext5_uni2indx_pagefe[(wc>>4)-0xfe0];
    if (summary) {
      unsigned short used = summary->used;
      unsigned int i = wc & 0x0f;
      if (used & ((unsigned short) 1 << i)) {
        /* Keep in `used' only the bits 0..i-1. */
        used &= ((unsigned short) 1 << i) - 1;
        /* Add `summary->idx' and the number of bits set in `used'. */
        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
        used = (used & 0x3333) + ((used & 0xcccc) >> 2);
        used = ((used + (used >> 4)) & 0x0f0f);
        used = ((used + (used >> 8)) & 0x00ff);
        c = gbkext5_2charset[summary->idx + used];
      }
    }
    if (c) {
      r[0] = (c >> 8); r[1] = (c & 0xff);
      return 2;
    }
    return -1;
  }
  return 0;
}

