tadd dict - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 08708877939323c1e1cb87210193ec25fc472ff7
 (DIR) parent 091f74d0a0db5ba1e098a518922525cb032a97b4
 (HTM) Author: rsc <devnull@localhost>
       Date:   Tue, 25 Nov 2003 03:37:45 +0000
       
       add dict
       
       Diffstat:
         A src/cmd/dict/ahd.c                  |     139 ++++++++++++++++++++++++++++++
         A src/cmd/dict/canonind.awk           |      29 +++++++++++++++++++++++++++++
         A src/cmd/dict/comfix.awk             |      56 +++++++++++++++++++++++++++++++
         A src/cmd/dict/dict.c                 |     681 ++++++++++++++++++++++++++++++
         A src/cmd/dict/dict.h                 |     160 +++++++++++++++++++++++++++++++
         A src/cmd/dict/egfix                  |      15 +++++++++++++++
         A src/cmd/dict/egfix2                 |       8 ++++++++
         A src/cmd/dict/gb2312.c               |    1108 +++++++++++++++++++++++++++++++
         A src/cmd/dict/gefix                  |      23 +++++++++++++++++++++++
         A src/cmd/dict/getneeds               |       8 ++++++++
         A src/cmd/dict/jis208.c               |    1059 +++++++++++++++++++++++++++++++
         A src/cmd/dict/kuten.h                |     114 +++++++++++++++++++++++++++++++
         A src/cmd/dict/mkfile                 |      18 ++++++++++++++++++
         A src/cmd/dict/mkindex.c              |     106 ++++++++++++++++++++++++++++++
         A src/cmd/dict/movie.c                |     328 +++++++++++++++++++++++++++++++
         A src/cmd/dict/oed.c                  |    1425 +++++++++++++++++++++++++++++++
         A src/cmd/dict/pcollins.c             |     226 +++++++++++++++++++++++++++++++
         A src/cmd/dict/pcollinsg.c            |     248 +++++++++++++++++++++++++++++++
         A src/cmd/dict/pgw.c                  |    1165 +++++++++++++++++++++++++++++++
         A src/cmd/dict/rev.awk                |       6 ++++++
         A src/cmd/dict/robert.c               |     312 +++++++++++++++++++++++++++++++
         A src/cmd/dict/simple.c               |      46 +++++++++++++++++++++++++++++++
         A src/cmd/dict/slang.c                |     203 +++++++++++++++++++++++++++++++
         A src/cmd/dict/t.awk                  |      13 +++++++++++++
         A src/cmd/dict/thesaurus.c            |      86 ++++++++++++++++++++++++++++++
         A src/cmd/dict/utils.c                |     577 +++++++++++++++++++++++++++++++
         A src/cmd/dict/world.c                |     184 +++++++++++++++++++++++++++++++
       
       27 files changed, 8343 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/dict/ahd.c b/src/cmd/dict/ahd.c
       t@@ -0,0 +1,139 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/*
       + * American Heritage Dictionary (encrypted)
       + */
       +
       +static Rune intab[256] = {
       +        [0x82] 0xe9,
       +        [0x85] 0xe0,
       +        [0x89] 0xeb,
       +        [0x8a] 0xe8,
       +        [0xa4] 0xf1,
       +        [0xf8] 0xb0,
       +        [0xf9] 0xb7,
       +};
       +
       +static char        tag[64];
       +
       +enum{
       +        Run, Openper, Openat, Closeat
       +};
       +
       +void
       +ahdprintentry(Entry e, int cmd)
       +{
       +        static int inited;
       +        long addr;
       +        char *p, *t = tag;
       +        int obreaklen;
       +        int c, state = Run;
       +
       +        if(!inited){
       +                for(c=0; c<256; c++)
       +                        if(intab[c] == 0)
       +                                intab[c] = c;
       +                inited = 1;
       +        }
       +        obreaklen = breaklen;
       +        breaklen = 80;
       +        addr = e.doff;
       +        for(p=e.start; p<e.end; p++){
       +                c = intab[(*p ^ (addr++>>1))&0xff];
       +                switch(state){
       +                case Run:
       +                        if(c == '%'){
       +                                t = tag;
       +                                state = Openper;
       +                                break;
       +                        }
       +                Putchar:
       +                        if(c == '\n')
       +                                outnl(0);
       +                        else if(c < Runeself)
       +                                outchar(c);
       +                        else
       +                                outrune(c);
       +                        break;
       +
       +                case Openper:
       +                        if(c == '@')
       +                                state = Openat;
       +                        else{
       +                                outchar('%');
       +                                state = Run;
       +                                goto Putchar;
       +                        }
       +                        break;
       +
       +                case Openat:
       +                        if(c == '@')
       +                                state = Closeat;
       +                        else if(t < &tag[sizeof tag-1])
       +                                *t++ = c;
       +                        break;
       +
       +                case Closeat:
       +                        if(c == '%'){
       +                                *t = 0;
       +                                switch(cmd){
       +                                case 'h':
       +                                        if(strcmp("EH", tag) == 0)
       +                                                goto out;
       +                                        break;
       +                                case 'r':
       +                                        outprint("%%@%s@%%", tag);
       +                                        break;
       +                                }
       +                                state = Run;
       +                        }else{
       +                                if(t < &tag[sizeof tag-1])
       +                                        *t++ = '@';
       +                                if(t < &tag[sizeof tag-1])
       +                                        *t++ = c;
       +                                state = Openat;
       +                        }
       +                        break;
       +                }
       +        }
       +out:
       +        outnl(0);
       +        breaklen = obreaklen;
       +}
       +
       +long
       +ahdnextoff(long fromoff)
       +{
       +        static char *patterns[] = { "%@NL@%", "%@2@%", 0 };
       +        int c, k = 0, state = 0;
       +        char *pat = patterns[0];
       +        long defoff = -1;
       +
       +        if(Bseek(bdict, fromoff, 0) < 0)
       +                return -1;
       +        while((c = Bgetc(bdict)) >= 0){
       +                c ^= (fromoff++>>1)&0xff;
       +                if(c != pat[state]){
       +                        state = 0;
       +                        continue;
       +                }
       +                if(pat[++state])
       +                        continue;
       +                if(pat = patterns[++k]){        /* assign = */
       +                        state = 0;
       +                        defoff = fromoff-6;
       +                        continue;
       +                }
       +                return fromoff-5;
       +        }
       +        return defoff;
       +}
       +
       +void
       +ahdprintkey(void)
       +{
       +        Bprint(bout, "No pronunciations.\n");
       +}
 (DIR) diff --git a/src/cmd/dict/canonind.awk b/src/cmd/dict/canonind.awk
       t@@ -0,0 +1,29 @@
       +# turn output of mkindex into form needed by dict
       +BEGIN {
       +        if(ARGC != 2) {
       +                print "Usage: awk -F'        ' -f canonind.awk rawindex > index"
       +                exit 1
       +        }
       +        file = ARGV[1]
       +        ARGV[1] = ""
       +        while ((getline < file) > 0) {
       +                for(i = 2; i <= NF; i++) {
       +                        w = $i
       +                        if(length(w) == 0)
       +                                continue
       +                        b = index(w, "(")
       +                        e = index(w, ")")
       +                        if(b && e && b < e) {
       +                                w1 = substr(w, 1, b-1)
       +                                w2 = substr(w, b+1, e-b-1)
       +                                w3 =  substr(w, e+1)
       +                                printf "%s%s\t%d\n", w1, w3, $1 > "junk"
       +                                printf "%s%s%s\t%d\n", w1, w2, w3, $1 > "junk"
       +                        } else
       +                                printf "%s\t%d\n", w, $1 > "junk"
       +                }
       +        }
       +        system("sort -u -t'        ' +0f -1 +0 -1 +1n -2 < junk")
       +        system("rm junk")
       +        exit 0
       +}
 (DIR) diff --git a/src/cmd/dict/comfix.awk b/src/cmd/dict/comfix.awk
       t@@ -0,0 +1,56 @@
       +# when raw index has a lot of entries like
       +# 1578324        problematico, a, ci, che
       +# apply this algorithm:
       +#  treat things after comma as suffixes
       +#  for each suffix:
       +#      if single letter, replace last letter
       +#      else search backwards for beginning of suffix
       +#      and if it leads to an old suffix of approximately
       +#      the same length, put replace that suffix
       +# This will still leave some commas to fix by hand
       +# Usage: awk -F'        ' -f comfix.awk rawindex > newrawindex
       +
       +NF == 2        {
       +                i = index($2, ",")
       +                if(i == 0 || length($2) == 0)
       +                        print $0
       +                else {
       +                        n = split($2, a, /,[ ]*/)
       +                        w = a[1]
       +                        printf "%s\t%s\n", $1, w
       +                        for(i = 2; i <= n; i++) {
       +                                suf = a[i]
       +                                m = matchsuflen(w, suf)
       +                                if(m) {
       +                                        nw = substr(w, 1, length(w)-m) suf
       +                                        printf "%s\t%s\n", $1, nw
       +                                } else
       +                                        printf "%s\t%s\n", $1, w ", " suf
       +                        }
       +                }
       +        }
       +NF != 2 {
       +        print $0
       +        }
       +
       +function matchsuflen(w, suf,                wlen,suflen,c,pat,k,d)
       +{
       +        wlen = length(w)
       +        suflen = length(suf)
       +        if(suflen == 1)
       +                return 1
       +        else {
       +                c = substr(suf, 1, 1)
       +                for (k = 1; k <= wlen ; k++)
       +                        if(substr(w, wlen-k+1, 1) == c)
       +                                break
       +                if(k > wlen)
       +                        return 0
       +                d = k-suflen
       +                if(d < 0)
       +                        d = -d
       +                if(d > 3)
       +                        return 0
       +                return k
       +        }
       +}
 (DIR) diff --git a/src/cmd/dict/dict.c b/src/cmd/dict/dict.c
       t@@ -0,0 +1,681 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include <regexp.h>
       +#include <ctype.h>
       +#include "dict.h"
       +
       +/*
       + * Assumed index file structure: lines of form
       + *         [^\t]+\t[0-9]+
       + * First field is key, second is byte offset into dictionary.
       + * Should be sorted with args -u -t'        ' +0f -1 +0 -1 +1n -2
       + */
       +typedef struct Addr Addr;
       +
       +struct Addr {
       +        int        n;                /* number of offsets */
       +        int        cur;                /* current position within doff array */
       +        int        maxn;                /* actual current size of doff array */
       +        ulong        doff[1];        /* doff[maxn], with 0..n-1 significant */
       +};
       +
       +Biobuf        binbuf;
       +Biobuf        boutbuf;
       +Biobuf        *bin = &binbuf;                /* user cmd input */
       +Biobuf        *bout = &boutbuf;        /* output */
       +Biobuf        *bdict;                        /* dictionary */
       +Biobuf        *bindex;                /* index file */
       +long        indextop;                /* index offset at end of file */
       +int        lastcmd;                /* last executed command */
       +Addr        *dot;                        /* "current" address */
       +Dict        *dict;                        /* current dictionary */
       +int        linelen;
       +int        breaklen = 60;
       +int        outinhibit;
       +int        debug;
       +
       +void        execcmd(int);
       +int        getpref(char*, Rune*);
       +Entry        getentry(int);
       +int        getfield(Rune*);
       +long        locate(Rune*);
       +int        parseaddr(char*, char**);
       +int        parsecmd(char*);
       +int        search(char*, int);
       +long        seeknextline(Biobuf*, long);
       +void        setdotnext(void);
       +void        setdotprev(void);
       +void        sortaddr(Addr*);
       +void        usage(void);
       +
       +enum {
       +        Plen=300,        /* max length of a search pattern */
       +        Fieldlen=200,        /* max length of an index field */
       +        Aslots=10,        /* initial number of slots in an address */
       +};
       +
       +void
       +main(int argc, char **argv)
       +{
       +        int i, cmd, kflag;
       +        char *line, *p;
       +
       +        Binit(&binbuf, 0, OREAD);
       +        Binit(&boutbuf, 1, OWRITE);
       +        kflag = 0;
       +        line = 0;
       +        dict = 0;
       +        p = getenv("PLAN9");
       +        if(p == nil)
       +                p = "/usr/local/plan9";
       +        if(chdir(p) < 0)
       +                sysfatal("chdir %s: %r", p);
       +
       +        for(i=0; dicts[i].name; i++){
       +                if(access(dicts[i].path, 0)>=0 && access(dicts[i].indexpath, 0)>=0){
       +                        dict = &dicts[i];
       +                        break;
       +                }
       +        }
       +        ARGBEGIN {
       +                case 'd':
       +                        p = ARGF();
       +                        dict = 0;
       +                        if(p) {
       +                                for(i=0; dicts[i].name; i++)
       +                                        if(strcmp(p, dicts[i].name)==0) {
       +                                                dict = &dicts[i];
       +                                                break;
       +                                        }
       +                        }
       +                        if(!dict)
       +                                usage();
       +                        break;
       +                case 'c':
       +                        line = ARGF();
       +                        if(!line)
       +                                usage();
       +                        break;
       +                case 'k':
       +                        kflag++;
       +                        break;
       +                case 'D':
       +                        debug++;
       +                        break;
       +                default:
       +                        usage();
       +        ARGEND }
       +        if(dict == 0){
       +                err("no dictionaries present on this system");
       +                exits("nodict");
       +        }
       +
       +        if(kflag) {
       +                (*dict->printkey)();
       +                exits(0);
       +        }
       +        if(argc > 1)
       +                usage();
       +        else if(argc == 1) {
       +                if(line)
       +                        usage();
       +                p = argv[0];
       +                line = malloc(strlen(p)+5);
       +                sprint(line, "/%s/P\n", p);
       +        }
       +        bdict = Bopen(dict->path, OREAD);
       +        if(!bdict) {
       +                err("can't open dictionary %s/%s", p, dict->path);
       +                exits("nodict");
       +        }
       +        bindex = Bopen(dict->indexpath, OREAD);
       +        if(!bindex) {
       +                err("can't open index %s/%s", p, dict->indexpath);
       +                exits("noindex");
       +        }
       +        indextop = Bseek(bindex, 0L, 2);
       +
       +        dot = malloc(sizeof(Addr)+(Aslots-1)*sizeof(ulong));
       +        dot->n = 0;
       +        dot->cur = 0;
       +        dot->maxn = Aslots;
       +        lastcmd = 0;
       +
       +        if(line) {
       +                cmd = parsecmd(line);
       +                if(cmd)
       +                        execcmd(cmd);
       +        } else {
       +                for(;;) {
       +                        Bprint(bout, "*");
       +                        Bflush(bout);
       +                        line = Brdline(bin, '\n');
       +                        linelen = 0;
       +                        if(!line)
       +                                break;
       +                        cmd = parsecmd(line);
       +                        if(cmd) {
       +                                execcmd(cmd);
       +                                lastcmd = cmd;
       +                        }
       +                }
       +        }
       +        exits(0);
       +}
       +
       +void
       +usage(void)
       +{
       +        int i;
       +        char *a, *b;
       +
       +        Bprint(bout, "Usage: %s [-d dict] [-k] [-c cmd] [word]\n", argv0);
       +        Bprint(bout, "dictionaries (brackets mark dictionaries not present on this system):\n");
       +        for(i = 0; dicts[i].name; i++){
       +                a = b = "";
       +                if(access(dicts[i].path, 0)<0 || access(dicts[i].indexpath, 0)<0){
       +                        a = "[";
       +                        b = "]";
       +                }
       +                Bprint(bout, "   %s%s\t%s%s\n", a, dicts[i].name, dicts[i].desc, b);
       +        }
       +        exits("usage");
       +}
       +
       +int
       +parsecmd(char *line)
       +{
       +        char *e;
       +        int cmd, ans;
       +
       +        if(parseaddr(line, &e) >= 0)
       +                line = e;
       +        else
       +                return 0;
       +        cmd = *line;
       +        ans = cmd;
       +        if(isupper(cmd))
       +                cmd = tolower(cmd);
       +        if(!(cmd == 'a' || cmd == 'h' || cmd == 'p' || cmd == 'r' ||
       +             cmd == '\n')) {
       +                err("unknown command %c", cmd);
       +                return 0;
       +        }
       +        if(cmd == '\n')
       +                switch(lastcmd) {
       +                        case 0:        ans = 'H'; break;
       +                        case 'H':        ans = 'p'; break;
       +                        default :        ans = lastcmd; break;
       +                }
       +        else if(line[1] != '\n' && line[1] != 0)
       +                err("extra stuff after command %c ignored", cmd);
       +        return ans;
       +}
       +
       +void
       +execcmd(int cmd)
       +{
       +        Entry e;
       +        int cur, doall;
       +
       +        if(isupper(cmd)) {
       +                doall = 1;
       +                cmd = tolower(cmd);
       +                cur = 0;
       +        } else {
       +                doall = 0;
       +                cur = dot->cur;
       +        }
       +
       +        if(debug && doall && cmd == 'a')
       +                Bprint(bout, "%d entries, cur=%d\n", dot->n, cur+1);
       +        for(;;){
       +                if(cur >= dot->n)
       +                        break;
       +                if(doall) {
       +                        Bprint(bout, "%d\t", cur+1);
       +                        linelen += 4 + (cur >= 10);
       +                }
       +                switch(cmd) {
       +                case 'a':
       +                        Bprint(bout, "#%lud\n", dot->doff[cur]);
       +                        break;
       +                case 'h':
       +                case 'p':
       +                case 'r':
       +                        e = getentry(cur);
       +                        (*dict->printentry)(e, cmd);
       +                        break;
       +                }
       +                cur++;
       +                if(doall) {
       +                        if(cmd == 'p' || cmd == 'r') {
       +                                Bputc(bout, '\n');
       +                                linelen = 0;
       +                        }
       +                } else
       +                        break;
       +        }
       +        if(cur >= dot->n)
       +                cur = 0;
       +        dot->cur = cur;
       +}
       +
       +/*
       + * Address syntax: ('.' | '/' re '/' | '!' re '!' | number | '#' number) ('+' | '-')*
       + * Answer goes in dot.
       + * Return -1 if address starts, but get error.
       + * Return 0 if no address.
       + */
       +int
       +parseaddr(char *line, char **eptr)
       +{
       +        int delim, plen;
       +        ulong v;
       +        char *e;
       +        char pat[Plen];
       +
       +        if(*line == '/' || *line == '!') {
       +                /* anchored regular expression match; '!' means no folding */
       +                if(*line == '/') {
       +                        delim = '/';
       +                        e = strpbrk(line+1, "/\n");
       +                } else {
       +                        delim = '!';
       +                        e = strpbrk(line+1, "!\n");
       +                }
       +                plen = e-line-1;
       +                if(plen >= Plen-3) {
       +                        err("pattern too big");
       +                        return -1;
       +                }
       +                pat[0] = '^';
       +                memcpy(pat+1, line+1, plen);
       +                pat[plen+1] = '$';
       +                pat[plen+2] = 0;
       +                if(*e == '\n')
       +                        line = e;
       +                else
       +                        line = e+1;
       +                if(!search(pat, delim == '/')) {
       +                        err("pattern not found");
       +                        return -1;
       +                }
       +        } else if(*line == '#') {
       +                /* absolute byte offset into dictionary */
       +                line++;
       +                if(!isdigit(*line))
       +                        return -1;
       +                v = strtoul(line, &e, 10);
       +                line = e;
       +                dot->doff[0] = v;
       +                dot->n = 1;
       +                dot->cur = 0;
       +        } else if(isdigit(*line)) {
       +                v = strtoul(line, &e, 10);
       +                line = e;
       +                if(v < 1 || v > dot->n)
       +                        err(".%d not in range [1,%d], ignored",
       +                                v, dot->n);
       +                else
       +                        dot->cur = v-1;
       +        } else if(*line == '.') {
       +                line++;
       +        } else {
       +                *eptr = line;
       +                return 0;
       +        }
       +        while(*line == '+' || *line == '-') {
       +                if(*line == '+')
       +                        setdotnext();
       +                else
       +                        setdotprev();
       +                line++;
       +        }
       +        *eptr = line;
       +        return 1;
       +}
       +
       +/*
       + * Index file is sorted by folded field1.
       + * Method: find pre, a folded prefix of r.e. pat,
       + * and then low = offset to beginning of
       + * line in index file where first match of prefix occurs.
       + * Then go through index until prefix no longer matches,
       + * adding each line that matches real pattern to dot.
       + * Finally, sort dot offsets (uniquing).
       + * We know pat len < Plen, and that it is surrounded by ^..$
       + */
       +int
       +search(char *pat, int dofold)
       +{
       +        int needre, prelen, match, n;
       +        Reprog *re;
       +        long ioff, v;
       +        Rune pre[Plen];
       +        Rune lit[Plen];
       +        Rune entry[Fieldlen];
       +        char fpat[Plen];
       +
       +        prelen = getpref(pat+1, pre);
       +        if(pat[prelen+1] == 0 || pat[prelen+1] == '$') {
       +                runescpy(lit, pre);
       +                if(dofold)
       +                        fold(lit);
       +                needre = 0;
       +                SET(re);
       +        } else {
       +                needre = 1;
       +                if(dofold) {
       +                        foldre(fpat, pat);
       +                        re = regcomp(fpat);
       +                } else
       +                        re = regcomp(pat);
       +        }
       +        fold(pre);
       +        ioff = locate(pre);
       +        if(ioff < 0)
       +                return 0;
       +        dot->n = 0;
       +        Bseek(bindex, ioff, 0);
       +        for(;;) {
       +                if(!getfield(entry))
       +                        break;
       +                if(dofold)
       +                        fold(entry);
       +                if(needre)
       +                        match = rregexec(re, entry, 0, 0);
       +                else
       +                        match = (acomp(lit, entry) == 0);
       +                if(match) {
       +                        if(!getfield(entry))
       +                                break;
       +                        v = runetol(entry);
       +                        if(dot->n >= dot->maxn) {
       +                                n = 2*dot->maxn;
       +                                dot = realloc(dot,
       +                                        sizeof(Addr)+(n-1)*sizeof(long));
       +                                if(!dot) {
       +                                        err("out of memory");
       +                                        exits("nomem");
       +                                }
       +                                dot->maxn = n;
       +                        }
       +                        dot->doff[dot->n++] = v;
       +                } else {
       +                        if(!dofold)
       +                                fold(entry);
       +                        if(*pre) {
       +                                n = acomp(pre, entry);
       +                                if(n < -1 || (!needre && n < 0))
       +                                        break;
       +                        }
       +                        /* get to next index entry */
       +                        if(!getfield(entry))
       +                                break;
       +                }
       +        }
       +        sortaddr(dot);
       +        dot->cur = 0;
       +        return dot->n;
       +}
       +
       +/*
       + * Return offset in index file of first line whose folded
       + * first field has pre as a prefix.  -1 if none found.
       + */
       +long
       +locate(Rune *pre)
       +{
       +        long top, bot, mid;
       +        Rune entry[Fieldlen];
       +
       +        if(*pre == 0)
       +                return 0;
       +        bot = 0;
       +        top = indextop;
       +        if(debug>1)
       +                fprint(2, "locate looking for prefix %S\n", pre);
       +        for(;;) {
       +                /*
       +                 * Loop invariant: foldkey(bot) < pre <= foldkey(top)
       +                 * and bot < top, and bot,top point at beginning of lines
       +                 */
       +                mid = (top+bot) / 2;
       +                mid = seeknextline(bindex, mid);
       +                if(debug > 1)
       +                        fprint(2, "bot=%ld, mid=%ld->%ld, top=%ld\n",
       +                                bot, (top+bot) / 2, mid, top);
       +                if(mid == top || !getfield(entry))
       +                        break;
       +                if(debug > 1)
       +                        fprint(2, "key=%S\n", entry);
       +                /*
       +                 * here mid is strictly between bot and top
       +                 */
       +                fold(entry);
       +                if(acomp(pre, entry) <= 0)
       +                        top = mid;
       +                else
       +                        bot = mid;
       +        }
       +        /*
       +         * bot < top, but they don't necessarily point at successive lines
       +         * Use linear search from bot to find first line that pre is a
       +         * prefix of
       +         */
       +        while((bot = seeknextline(bindex, bot)) <= top) {
       +                if(!getfield(entry))
       +                        return -1;
       +                if(debug > 1)
       +                        fprint(2, "key=%S\n", entry);
       +                fold(entry);
       +                switch(acomp(pre, entry)) {
       +                case -2:
       +                        return -1;
       +                case -1:
       +                case 0:
       +                        return bot;
       +                case 1:
       +                case 2:
       +                        continue;
       +                }
       +        }
       +        return -1;
       +
       +}
       +
       +/*
       + * Get prefix of non re-metacharacters, runified, into pre,
       + * and return length
       + */
       +int
       +getpref(char *pat, Rune *pre)
       +{
       +        int n, r;
       +        char *p;
       +
       +        p = pat;
       +        while(*p) {
       +                n = chartorune(pre, p);
       +                r = *pre;
       +                switch(r) {
       +                case 0x2e: case 0x2a: case 0x2b: case 0x3f:
       +                case 0x5b: case 0x5d: case 0x28: case ')':
       +                case 0x7c: case 0x5e: case 0x24:
       +                        *pre = 0;
       +                        return p-pat;
       +                case L'\\':
       +                        p += n;
       +                        p += chartorune(++pre, p);
       +                        pre++;
       +                        break;
       +                default:
       +                        p += n;
       +                        pre++;
       +                }
       +        }
       +        return p-pat;
       +}
       +
       +long
       +seeknextline(Biobuf *b, long off)
       +{
       +        long c;
       +
       +        Bseek(b, off, 0);
       +        do {
       +                c = Bgetrune(b);
       +        } while(c>=0 && c!='\n');
       +        return Boffset(b);
       +}
       +
       +/*
       + * Get next field out of index file (either tab- or nl- terminated)
       + * Answer in *rp, assumed to be Fieldlen long.
       + * Return 0 if read error first.
       + */
       +int
       +getfield(Rune *rp)
       +{
       +        long c;
       +        int n;
       +
       +        for(n=Fieldlen; n-- > 0; ) {
       +                if ((c = Bgetrune(bindex)) < 0)
       +                        return 0;
       +                if(c == '\t' || c == '\n') {
       +                        *rp = L'\0';
       +                        return 1;
       +                }
       +                *rp++ = c;
       +        }
       +        err("word too long");
       +        return 0;
       +}
       +
       +/*
       + * A compare longs function suitable for qsort
       + */
       +static int
       +longcmp(const void *av, const void *bv)
       +{
       +        long v;
       +        long *a, *b;
       +
       +        a = (long*)av;
       +        b = (long*)bv;
       +
       +        v = *a - *b;
       +        if(v < 0)
       +                return -1;
       +        else if(v == 0)
       +                return 0;
       +        else
       +                return 1;
       +}
       +
       +void
       +sortaddr(Addr *a)
       +{
       +        int i, j;
       +        long v;
       +
       +        if(a->n <= 1)
       +                return;
       +
       +        qsort(a->doff, a->n, sizeof(long), longcmp);
       +
       +        /* remove duplicates */
       +        for(i=0, j=0; j < a->n; j++) {
       +                v = a->doff[j];
       +                if(i > 0 && v == a->doff[i-1])
       +                        continue;
       +                a->doff[i++] = v;
       +        }
       +        a->n = i;
       +}
       +
       +Entry
       +getentry(int i)
       +{
       +        long b, e, n;
       +        static Entry ans;
       +        static int anslen = 0;
       +
       +        b = dot->doff[i];
       +        e = (*dict->nextoff)(b+1);
       +        ans.doff = b;
       +        if(e < 0) {
       +                err("couldn't seek to entry");
       +                ans.start = 0;
       +                ans.end = 0;
       +        } else {
       +                n = e-b;
       +                if(n+1 > anslen) {
       +                        ans.start = realloc(ans.start, n+1);
       +                        if(!ans.start) {
       +                                err("out of memory");
       +                                exits("nomem");
       +                        }
       +                        anslen = n+1;
       +                }
       +                Bseek(bdict, b, 0);
       +                n = Bread(bdict, ans.start, n);
       +                ans.end = ans.start + n;
       +                *ans.end = 0;
       +        }
       +        return ans;
       +}
       +
       +void
       +setdotnext(void)
       +{
       +        long b;
       +
       +        b = (*dict->nextoff)(dot->doff[dot->cur]+1);
       +        if(b < 0) {
       +                err("couldn't find a next entry");
       +                return;
       +        }
       +        dot->doff[0] = b;
       +        dot->n = 1;
       +        dot->cur = 0;
       +}
       +
       +void
       +setdotprev(void)
       +{
       +        int tryback;
       +        long here, last, p;
       +
       +        if(dot->cur < 0 || dot->cur >= dot->n)
       +                return;
       +        tryback = 2000;
       +        here = dot->doff[dot->cur];
       +        last = 0;
       +        while(last == 0) {
       +                p = here - tryback;
       +                if(p < 0)
       +                        p = 0;
       +                for(;;) {
       +                        p = (*dict->nextoff)(p+1);
       +                        if(p < 0)
       +                                return; /* shouldn't happen */
       +                        if(p >= here)
       +                                break;
       +                        last = p;
       +                }
       +                if(!last) {
       +                        if(here - tryback < 0) {
       +                                err("can't find a previous entry");
       +                                return;
       +                        }
       +                        tryback = 2*tryback;
       +                }
       +        }
       +        dot->doff[0] = last;
       +        dot->n = 1;
       +        dot->cur = 0;
       +}
 (DIR) diff --git a/src/cmd/dict/dict.h b/src/cmd/dict/dict.h
       t@@ -0,0 +1,160 @@
       +/* Runes for special purposes (0xe800-0xfdff is Private Use Area) */
       +enum {        NONE=0xe800,        /* Emit nothing */
       +        TAGS,                /* Start of tag */
       +        TAGE,                /* End of tag */
       +        SPCS,                /* Start of special character name */
       +        PAR,                /* Newline, indent */
       +        LIGS,                /* Start of ligature codes */
       +        LACU=LIGS,        /* Acute (´) ligatures */
       +        LGRV,                /* Grave (ˋ) ligatures */
       +        LUML,                /* Umlaut (¨) ligatures */
       +        LCED,                /* Cedilla (¸) ligatures */
       +        LTIL,                /* Tilde (˜) ligatures */
       +        LBRV,                /* Breve (˘) ligatures */
       +        LRNG,                /* Ring (˚) ligatures */
       +        LDOT,                /* Dot (˙) ligatures */
       +        LDTB,                /* Dot below (.) ligatures */
       +        LFRN,                /* Frown (⌢) ligatures */
       +        LFRB,                /* Frown below (̯) ligatures */
       +        LOGO,                /* Ogonek (˛) ligatures */
       +        LMAC,                /* Macron (¯) ligatures */
       +        LHCK,                /* Hacek (ˇ) ligatures */
       +        LASP,                /* Asper (ʽ) ligatures */
       +        LLEN,                /* Lenis (ʼ) ligatures */
       +        LBRB,                /* Breve below (̮) ligatures */
       +        LIGE,                /* End of ligature codes */
       +        MULTI,                /* Start of multi-rune codes */
       +        MAAS=MULTI,        /* ʽα */
       +        MALN,                /* ʼα */
       +        MAND,                /* and */
       +        MAOQ,                /* a/q */
       +        MBRA,                /* <| */
       +        MDD,                /* .. */
       +        MDDD,                /* ... */
       +        MEAS,                /* ʽε */
       +        MELN,                /* ʼε */
       +        MEMM,                /* —— */
       +        MHAS,                /* ʽη */
       +        MHLN,                /* ʼη */
       +        MIAS,                /* ʽι */
       +        MILN,                /* ʼι */
       +        MLCT,                /* ct */
       +        MLFF,                /* ff */
       +        MLFFI,                /* ffi */
       +        MLFFL,                /* ffl */
       +        MLFL,                /* fl */
       +        MLFI,                /* fi */
       +        MLLS,                /* ll with swing */
       +        MLST,                /* st */
       +        MOAS,                /* ʽο */
       +        MOLN,                /* ʼο */
       +        MOR,                /* or */
       +        MRAS,                /* ʽρ */
       +        MRLN,                /* ʼρ */
       +        MTT,                /* ~~ */
       +        MUAS,                /* ʽυ */
       +        MULN,                /* ʼυ */
       +        MWAS,                /* ʽω */
       +        MWLN,                /* ʼω */
       +        MOE,                /* oe */
       +        MES,                /* em space */
       +        MULTIE,                /* End of multi-rune codes */
       +};
       +#define Nligs (LIGE-LIGS)
       +#define Nmulti (MULTIE-MULTI)
       +
       +typedef struct Entry Entry;
       +typedef struct Assoc Assoc;
       +typedef struct Nassoc Nassoc;
       +typedef struct Dict Dict;
       +
       +struct Entry {
       +        char        *start;                /* entry starts at start */
       +        char        *end;                /* and finishes just before end */
       +        long        doff;                /* dictionary offset (for debugging) */
       +};
       +
       +struct Assoc {
       +        char        *key;
       +        long        val;
       +};
       +
       +struct Nassoc {
       +        long        key;
       +        long        val;
       +};
       +
       +struct Dict {
       +        char        *name;                        /* dictionary name */
       +        char        *desc;                        /* description */
       +        char        *path;                        /* path to dictionary data */
       +        char        *indexpath;                /* path to index data */
       +        long        (*nextoff)(long);        /* function to find next entry offset from arg */
       +        void        (*printentry)(Entry, int); /* function to print entry */
       +        void        (*printkey)(void);        /* function to print pronunciation key */
       +};
       +
       +int        acomp(Rune*, Rune*);
       +Rune        *changett(Rune *, Rune *, int);
       +void        err(char*, ...);
       +void        fold(Rune *);
       +void        foldre(char*, char*);
       +Rune        liglookup(Rune, Rune);
       +long        lookassoc(Assoc*, int, char*);
       +long        looknassoc(Nassoc*, int, long);
       +void        outprint(char*, ...);
       +void        outrune(long);
       +void        outrunes(Rune *);
       +void        outchar(int);
       +void        outchars(char *);
       +void        outnl(int);
       +void        outpiece(char *, char *);
       +void        runescpy(Rune*, Rune*);
       +long        runetol(Rune*);
       +
       +long        oednextoff(long);
       +void        oedprintentry(Entry, int);
       +void        oedprintkey(void);
       +long        ahdnextoff(long);
       +void        ahdprintentry(Entry, int);
       +void        ahdprintkey(void);
       +long        pcollnextoff(long);
       +void        pcollprintentry(Entry, int);
       +void        pcollprintkey(void);
       +long        pcollgnextoff(long);
       +void        pcollgprintentry(Entry, int);
       +void        pcollgprintkey(void);
       +long        movienextoff(long);
       +void        movieprintentry(Entry, int);
       +void        movieprintkey(void);
       +long        pgwnextoff(long);
       +void        pgwprintentry(Entry,int);
       +void        pgwprintkey(void);
       +long        slangnextoff(long);
       +void        slangprintentry(Entry, int);
       +void        slangprintkey(void);
       +long        robertnextoff(long);
       +void        robertindexentry(Entry, int);
       +void        robertprintkey(void);
       +long        robertnextflex(long);
       +void        robertflexentry(Entry, int);
       +long        simplenextoff(long);
       +void        simpleprintentry(Entry, int);
       +void        simpleprintkey(void);
       +long        thesnextoff(long);
       +void        thesprintentry(Entry, int);
       +void        thesprintkey(void);
       +long        worldnextoff(long);
       +void        worldprintentry(Entry, int);
       +void        worldprintkey(void);
       +
       +extern Biobuf        *bdict;
       +extern Biobuf        *bout;
       +extern int        linelen;
       +extern int        breaklen;
       +extern int        outinhibit;
       +extern int        debug;
       +extern Rune        multitab[][5];
       +extern Dict        dicts[];
       +
       +#define asize(a) (sizeof (a)/sizeof(a[0]))
 (DIR) diff --git a/src/cmd/dict/egfix b/src/cmd/dict/egfix
       t@@ -0,0 +1,15 @@
       +#!/bin/rc
       +
       +sed '
       +        s/[         ]+$//
       +        /        /!d
       +        /, /{; h; s/,.*//; p; g; s/        .*, /        /; }
       +' $1 |
       +sed '
       +        /\(/{; h; s/\([^)]+\)//; p; g; s/[()]//g; }
       +' |
       +sed '
       +        s/         +/        /
       +        s/[         ]+$//
       +        s/  +/ /g
       +'
 (DIR) diff --git a/src/cmd/dict/egfix2 b/src/cmd/dict/egfix2
       t@@ -0,0 +1,8 @@
       +#!/bin/rc
       +
       +awk '
       +BEGIN        { FS = "        |, " }
       +        { for(i=2; i<=NF; i++)print $i "        " $1 }
       +' $1 |
       +tr A-Z a-z |
       +sort -u -t'        ' +0f -1 +0 -1 +1n -2
 (DIR) diff --git a/src/cmd/dict/gb2312.c b/src/cmd/dict/gb2312.c
       t@@ -0,0 +1,1108 @@
       +#include <u.h>
       +#include <libc.h>
       +#include "kuten.h"
       +
       +#define        NONE        0xffff
       +
       +Rune tabgb2312[GB2312MAX] = {
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x3000,0x3001,0x3002,
       +0x2024,0x02c9,0x02c7,0x00a8,0x3003,0x3005,0x2015,0x223c,
       +0x2225,0x2026,0x2018,0x2019,0x201c,0x201d,0x3014,0x3015,
       +0x3008,0x3009,0x300a,0x300b,0x300c,0x300d,0x300e,0x300f,
       +0x301a,0x301b,0x3010,0x3011,0x00b1,0x00d7,0x00f7,0x2236,
       +0x2227,0x2228,0x2211,0x220f,0x222a,0x2229,0x2208,0x2237,
       +0x221a,0x22a5,0x01c1,0x2220,0x2322,0x2299,0x222b,0x222e,
       +0x2261,0x224c,0x2248,0x223d,0x221d,0x2260,0x226e,0x226f,
       +0x2264,0x2265,0x221e,0x2235,0x2234,0x2642,0x2640,0x00b0,
       +0x2032,0x2033,0x2103,0x0024,0x00a4,0x00a2,0x00a3,0x2030,
       +0x00a7,0x2116,0x2606,0x2605,0x25cb,0x25cf,0x25ce,0x25c7,
       +0x25c6,0x25a1,0x25a0,0x25b3,0x25b2,0x203b,0x2192,0x2190,
       +0x2191,0x2193,0x3013,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,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,  NONE,  NONE,0x3220,0x3221,0x3222,
       +0x3223,0x3224,0x3225,0x3226,0x3227,0x3228,0x3229,  NONE,
       +  NONE,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
       +0x2167,0x2168,0x2169,0x216a,0x216b,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x0021,0x0022,0x0023,
       +0x00a5,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,
       +0x002c,0x002d,0x002e,0x002f,0x0030,0x0031,0x0032,0x0033,
       +0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,
       +0x003c,0x003d,0x003e,0x003f,0x0040,0x0041,0x0042,0x0043,
       +0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,
       +0x004c,0x004d,0x004e,0x004f,0x0050,0x0051,0x0052,0x0053,
       +0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,
       +0x005c,0x005d,0x005e,0x005f,0x0060,0x0061,0x0062,0x0063,
       +0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,
       +0x006c,0x006d,0x006e,0x006f,0x0070,0x0071,0x0072,0x0073,
       +0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,
       +0x007c,0x007d,0x00af,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,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,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,
       +0x0398,0x0399,0x039a,0x039b,0x039c,0x039d,0x039e,0x039f,
       +0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,
       +0x03a9,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,
       +0x03b8,0x03b9,0x03ba,0x03bb,0x03bc,0x03bd,0x03be,0x03bf,
       +0x03c0,0x03c1,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,
       +0x03c9,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x0101,0x00e1,0x0103,0x00e0,0x0113,0x00e9,0x0115,
       +0x00e8,0x012b,0x00ed,0x012d,0x00ec,0x014d,0x00f3,0x014f,
       +0x00f2,0x016b,0x00fa,0x016d,0x00f9,0x01d6,0x01d8,0x01da,
       +0x01dc,0x00fc,0x00ea,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x3105,0x3106,0x3107,
       +0x3108,0x3109,0x310a,0x310b,0x310c,0x310d,0x310e,0x310f,
       +0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,0x3117,
       +0x3118,0x3119,0x311a,0x311b,0x311c,0x311d,0x311e,0x311f,
       +0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126,0x3127,
       +0x3128,0x3129,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +0x2500,0x2501,0x2502,0x2503,0x2504,0x2505,0x2506,0x2507,
       +0x2508,0x2509,0x250a,0x250b,0x250c,0x250d,0x250e,0x250f,
       +0x2510,0x2511,0x2512,0x2513,0x2514,0x2515,0x2516,0x2517,
       +0x2518,0x2519,0x251a,0x251b,0x251c,0x251d,0x251e,0x251f,
       +0x2520,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,
       +0x2528,0x2529,0x252a,0x252b,0x252c,0x252d,0x252e,0x252f,
       +0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537,
       +0x2538,0x2539,0x253a,0x253b,0x253c,0x253d,0x253e,0x253f,
       +0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,
       +0x2548,0x2549,0x254a,0x254b,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x554a,0x963f,0x57c3,0x6328,0x54ce,0x5509,0x54c0,
       +0x7691,0x764c,0x853c,0x77ee,0x827e,0x788d,0x7231,0x9698,
       +0x978d,0x6c28,0x5b89,0x4ffa,0x6309,0x6697,0x5cb8,0x80fa,
       +0x6848,0x80ae,0x6602,0x76ce,0x51f9,0x6556,0x71ac,0x7ff1,
       +0x8884,0x50b2,0x5965,0x61ca,0x6fb3,0x82ad,0x634c,0x6252,
       +0x53ed,0x5427,0x7b06,0x516b,0x75a4,0x5df4,0x62d4,0x8dcb,
       +0x9776,0x628a,0x8019,0x575d,0x9738,0x7f62,0x7238,0x767d,
       +0x67cf,0x767e,0x6446,0x4f70,0x8d25,0x62dc,0x7a17,0x6591,
       +0x73ed,0x642c,0x6273,0x822c,0x9881,0x677f,0x7248,0x626e,
       +0x62cc,0x4f34,0x74e3,0x534a,0x529e,0x7eca,0x90a6,0x5e2e,
       +0x6886,0x699c,0x8180,0x7ed1,0x68d2,0x78c5,0x868c,0x9551,
       +0x508d,0x8c24,0x82de,0x80de,0x5305,0x8912,0x5265,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8584,0x96f9,0x4fdd,
       +0x5821,0x9971,0x5b9d,0x62b1,0x62a5,0x66b4,0x8c79,0x9c8d,
       +0x7206,0x676f,0x7891,0x60b2,0x5351,0x5317,0x8f88,0x80cc,
       +0x8d1d,0x94a1,0x500d,0x72c8,0x5907,0x60eb,0x7119,0x88ab,
       +0x5954,0x82ef,0x672c,0x7b28,0x5d29,0x7ef7,0x752d,0x6cf5,
       +0x8e66,0x8ff8,0x903c,0x9f3b,0x6bd4,0x9119,0x7b14,0x5f7c,
       +0x78a7,0x84d6,0x853d,0x6bd5,0x6bd9,0x6bd6,0x5e01,0x5e87,
       +0x75f9,0x95ed,0x655d,0x5f0a,0x5fc5,0x8f9f,0x58c1,0x81c2,
       +0x907f,0x965b,0x97ad,0x8fb9,0x7f16,0x8d2c,0x6241,0x4fbf,
       +0x53d8,0x535e,0x8fa8,0x8fa9,0x8fab,0x904d,0x6807,0x5f6a,
       +0x8198,0x8868,0x9cd6,0x618b,0x522b,0x762a,0x5f6c,0x658c,
       +0x6fd2,0x6ee8,0x5bbe,0x6448,0x5175,0x51b0,0x67c4,0x4e19,
       +0x79c9,0x997c,0x70b3,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x75c5,0x5e76,0x73bb,0x83e0,0x64ad,0x62e8,0x94b5,
       +0x6ce2,0x535a,0x52c3,0x640f,0x94c2,0x7b94,0x4f2f,0x5e1b,
       +0x8236,0x8116,0x818a,0x6e24,0x6cca,0x9a73,0x6355,0x535c,
       +0x54fa,0x8865,0x57e0,0x4e0d,0x5e03,0x6b65,0x7c3f,0x90e8,
       +0x6016,0x64e6,0x731c,0x88c1,0x6750,0x624d,0x8d22,0x776c,
       +0x8e29,0x91c7,0x5f69,0x83dc,0x8521,0x9910,0x53c2,0x8695,
       +0x6b8b,0x60ed,0x60e8,0x707f,0x82cd,0x8231,0x4ed3,0x6ca7,
       +0x85cf,0x64cd,0x7cd9,0x69fd,0x66f9,0x8349,0x5395,0x7b56,
       +0x4fa7,0x518c,0x6d4b,0x5c42,0x8e6d,0x63d2,0x53c9,0x832c,
       +0x8336,0x67e5,0x78b4,0x643d,0x5bdf,0x5c94,0x5dee,0x8be7,
       +0x62c6,0x67f4,0x8c7a,0x6400,0x63ba,0x8749,0x998b,0x8c17,
       +0x7f20,0x94f2,0x4ea7,0x9610,0x98a4,0x660c,0x7316,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x573a,0x5c1d,0x5e38,
       +0x957f,0x507f,0x80a0,0x5382,0x655e,0x7545,0x5531,0x5021,
       +0x8d85,0x6284,0x949e,0x671d,0x5632,0x6f6e,0x5de2,0x5435,
       +0x7092,0x8f66,0x626f,0x64a4,0x63a3,0x5f7b,0x6f88,0x90f4,
       +0x81e3,0x8fb0,0x5c18,0x6668,0x5ff1,0x6c89,0x9648,0x8d81,
       +0x886c,0x6491,0x79f0,0x57ce,0x6a59,0x6210,0x5448,0x4e58,
       +0x7a0b,0x60e9,0x6f84,0x8bda,0x627f,0x901e,0x9a8b,0x79e4,
       +0x5403,0x75f4,0x6301,0x5319,0x6c60,0x8fdf,0x5f1b,0x9a70,
       +0x803b,0x9f7f,0x4f88,0x5c3a,0x8d64,0x7fc5,0x65a5,0x70bd,
       +0x5145,0x51b2,0x866b,0x5d07,0x5ba0,0x62bd,0x916c,0x7574,
       +0x8e0c,0x7a20,0x6101,0x7b79,0x4ec7,0x7ef8,0x7785,0x4e11,
       +0x81ed,0x521d,0x51fa,0x6a71,0x53a8,0x8e87,0x9504,0x96cf,
       +0x6ec1,0x9664,0x695a,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7840,0x50a8,0x77d7,0x6410,0x89e6,0x5904,0x63e3,
       +0x5ddd,0x7a7f,0x693d,0x4f20,0x8239,0x5598,0x4e32,0x75ae,
       +0x7a97,0x5e62,0x5e8a,0x95ef,0x521b,0x5439,0x708a,0x6376,
       +0x9524,0x5782,0x6625,0x693f,0x9187,0x5507,0x6df3,0x7eaf,
       +0x8822,0x6233,0x7ef0,0x75b5,0x8328,0x78c1,0x96cc,0x8f9e,
       +0x6148,0x74f7,0x8bcd,0x6b64,0x523a,0x8d50,0x6b21,0x806a,
       +0x8471,0x56f1,0x5306,0x4ece,0x4e1b,0x51d1,0x7c97,0x918b,
       +0x7c07,0x4fc3,0x8e7f,0x7be1,0x7a9c,0x6467,0x5d14,0x50ac,
       +0x8106,0x7601,0x7cb9,0x6dec,0x7fe0,0x6751,0x5b58,0x5bf8,
       +0x78cb,0x64ae,0x6413,0x63aa,0x632b,0x9519,0x642d,0x8fbe,
       +0x7b54,0x7629,0x6253,0x5927,0x5446,0x6b79,0x50a3,0x6234,
       +0x5e26,0x6b86,0x4ee3,0x8d37,0x888b,0x5f85,0x902e,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6020,0x803d,0x62c5,
       +0x4e39,0x5355,0x90f8,0x63b8,0x80c6,0x65e6,0x6c2e,0x4f46,
       +0x60ee,0x6de1,0x8bde,0x5f39,0x86cb,0x5f53,0x6321,0x515a,
       +0x8361,0x6863,0x5200,0x6363,0x8e48,0x5012,0x5c9b,0x7977,
       +0x5bfc,0x5230,0x7a3b,0x60bc,0x9053,0x76d7,0x5fb7,0x5f97,
       +0x7684,0x8e6c,0x706f,0x767b,0x7b49,0x77aa,0x51f3,0x9093,
       +0x5824,0x4f4e,0x6ef4,0x8fea,0x654c,0x7b1b,0x72c4,0x6da4,
       +0x7fdf,0x5ae1,0x62b5,0x5e95,0x5730,0x8482,0x7b2c,0x5e1d,
       +0x5f1f,0x9012,0x7f14,0x98a0,0x6382,0x6ec7,0x7898,0x70b9,
       +0x5178,0x975b,0x57ab,0x7535,0x4f43,0x7538,0x5e97,0x60e6,
       +0x5960,0x6dc0,0x6bbf,0x7889,0x53fc,0x96d5,0x51cb,0x5201,
       +0x6389,0x540a,0x9493,0x8c03,0x8dcc,0x7239,0x789f,0x8776,
       +0x8fed,0x8c0d,0x53e0,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x4e01,0x76ef,0x53ee,0x9489,0x9876,0x9f0e,0x952d,
       +0x5b9a,0x8ba2,0x4e22,0x4e1c,0x51ac,0x8463,0x61c2,0x52a8,
       +0x680b,0x4f97,0x606b,0x51bb,0x6d1e,0x515c,0x6296,0x6597,
       +0x9661,0x8c46,0x9017,0x75d8,0x90fd,0x7763,0x6bd2,0x728a,
       +0x72ec,0x8bfb,0x5835,0x7779,0x8d4c,0x675c,0x9540,0x809a,
       +0x5ea6,0x6e21,0x5992,0x7aef,0x77ed,0x953b,0x6bb5,0x65ad,
       +0x7f0e,0x5806,0x5151,0x961f,0x5bf9,0x58a9,0x5428,0x8e72,
       +0x6566,0x987f,0x56e4,0x949d,0x76fe,0x9041,0x6387,0x54c6,
       +0x591a,0x593a,0x579b,0x8eb2,0x6735,0x8dfa,0x8235,0x5241,
       +0x60f0,0x5815,0x86fe,0x5ce8,0x9e45,0x4fc4,0x989d,0x8bb9,
       +0x5a25,0x6076,0x5384,0x627c,0x904f,0x9102,0x997f,0x6069,
       +0x800c,0x513f,0x8033,0x5c14,0x9975,0x6d31,0x4e8c,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8d30,0x53d1,0x7f5a,
       +0x7b4f,0x4f10,0x4e4f,0x9600,0x6cd5,0x73d0,0x85e9,0x5e06,
       +0x756a,0x7ffb,0x6a0a,0x77fe,0x9492,0x7e41,0x51e1,0x70e6,
       +0x53cd,0x8fd4,0x8303,0x8d29,0x72af,0x996d,0x6cdb,0x574a,
       +0x82b3,0x65b9,0x80aa,0x623f,0x9632,0x59a8,0x4eff,0x8bbf,
       +0x7eba,0x653e,0x83f2,0x975e,0x5561,0x98de,0x80a5,0x532a,
       +0x8bfd,0x5420,0x80ba,0x5e9f,0x6cb8,0x8d39,0x82ac,0x915a,
       +0x5429,0x6c1b,0x5206,0x7eb7,0x575f,0x711a,0x6c7e,0x7c89,
       +0x594b,0x4efd,0x5fff,0x6124,0x7caa,0x4e30,0x5c01,0x67ab,
       +0x8702,0x5cf0,0x950b,0x98ce,0x75af,0x70fd,0x9022,0x51af,
       +0x7f1d,0x8bbd,0x5949,0x51e4,0x4f5b,0x5426,0x592b,0x6577,
       +0x80a4,0x5b75,0x6276,0x62c2,0x8f90,0x5e45,0x6c1f,0x7b26,
       +0x4f0f,0x4fd8,0x670d,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6d6e,0x6daa,0x798f,0x88b1,0x5f17,0x752b,0x629a,
       +0x8f85,0x4fef,0x91dc,0x65a7,0x812f,0x8151,0x5e9c,0x8150,
       +0x8d74,0x526f,0x8986,0x8d4b,0x590d,0x5085,0x4ed8,0x961c,
       +0x7236,0x8179,0x8d1f,0x5bcc,0x8ba3,0x9644,0x5987,0x7f1a,
       +0x5490,0x5676,0x560e,0x8be5,0x6539,0x6982,0x9499,0x76d6,
       +0x6e89,0x5e72,0x7518,0x6746,0x67d1,0x7aff,0x809d,0x8d76,
       +0x611f,0x79c6,0x6562,0x8d63,0x5188,0x521a,0x94a2,0x7f38,
       +0x809b,0x7eb2,0x5c97,0x6e2f,0x6760,0x7bd9,0x768b,0x9ad8,
       +0x818f,0x7f94,0x7cd5,0x641e,0x9550,0x7a3f,0x544a,0x54e5,
       +0x6b4c,0x6401,0x6208,0x9e3d,0x80f3,0x7599,0x5272,0x9769,
       +0x845b,0x683c,0x86e4,0x9601,0x9694,0x94ec,0x4e2a,0x5404,
       +0x7ed9,0x6839,0x8ddf,0x8015,0x66f4,0x5e9a,0x7fb9,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x57c2,0x803f,0x6897,
       +0x5de5,0x653b,0x529f,0x606d,0x9f9a,0x4f9b,0x8eac,0x516c,
       +0x5bab,0x5f13,0x5de9,0x6c5e,0x62f1,0x8d21,0x5171,0x94a9,
       +0x52fe,0x6c9f,0x82df,0x72d7,0x57a2,0x6784,0x8d2d,0x591f,
       +0x8f9c,0x83c7,0x5495,0x7b8d,0x4f30,0x6cbd,0x5b64,0x59d1,
       +0x9f13,0x53e4,0x86ca,0x9aa8,0x8c37,0x80a1,0x6545,0x987e,
       +0x56fa,0x96c7,0x522e,0x74dc,0x5250,0x5be1,0x6302,0x8902,
       +0x4e56,0x62d0,0x602a,0x68fa,0x5173,0x5b98,0x51a0,0x89c2,
       +0x7ba1,0x9986,0x7f50,0x60ef,0x704c,0x8d2f,0x5149,0x5e7f,
       +0x901b,0x7470,0x89c4,0x572d,0x7845,0x5f52,0x9f9f,0x95fa,
       +0x8f68,0x9b3c,0x8be1,0x7678,0x6842,0x67dc,0x8dea,0x8d35,
       +0x523d,0x8f8a,0x6eda,0x68cd,0x9505,0x90ed,0x56fd,0x679c,
       +0x88f9,0x8fc7,0x54c8,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x9ab8,0x5b69,0x6d77,0x6c26,0x4ea5,0x5bb3,0x9a87,
       +0x9163,0x61a8,0x90af,0x97e9,0x542b,0x6db5,0x5bd2,0x51fd,
       +0x558a,0x7f55,0x7ff0,0x64bc,0x634d,0x65f1,0x61be,0x608d,
       +0x710a,0x6c57,0x6c49,0x592f,0x676d,0x822a,0x58d5,0x568e,
       +0x8c6a,0x6beb,0x90dd,0x597d,0x8017,0x53f7,0x6d69,0x5475,
       +0x559d,0x8377,0x83cf,0x6838,0x79be,0x548c,0x4f55,0x5408,
       +0x76d2,0x8c89,0x9602,0x6cb3,0x6db8,0x8d6b,0x8910,0x9e64,
       +0x8d3a,0x563f,0x9ed1,0x75d5,0x5f88,0x72e0,0x6068,0x54fc,
       +0x4ea8,0x6a2a,0x8861,0x6052,0x8f70,0x54c4,0x70d8,0x8679,
       +0x9e3f,0x6d2a,0x5b8f,0x5f18,0x7ea2,0x5589,0x4faf,0x7334,
       +0x543c,0x539a,0x5019,0x540e,0x547c,0x4e4e,0x5ffd,0x745a,
       +0x58f6,0x846b,0x80e1,0x8774,0x72d0,0x7cca,0x6e56,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5f27,0x864e,0x552c,
       +0x62a4,0x4e92,0x6caa,0x6237,0x82b1,0x54d7,0x534e,0x733e,
       +0x6ed1,0x753b,0x5212,0x5316,0x8bdd,0x69d0,0x5f8a,0x6000,
       +0x6dee,0x574f,0x6b22,0x73af,0x6853,0x8fd8,0x7f13,0x6362,
       +0x60a3,0x5524,0x75ea,0x8c62,0x7115,0x6da3,0x5ba6,0x5e7b,
       +0x8352,0x614c,0x9ec4,0x78fa,0x8757,0x7c27,0x7687,0x51f0,
       +0x60f6,0x714c,0x6643,0x5e4c,0x604d,0x8c0e,0x7070,0x6325,
       +0x8f89,0x5fbd,0x6062,0x86d4,0x56de,0x6bc1,0x6094,0x6167,
       +0x5349,0x60e0,0x6666,0x8d3f,0x79fd,0x4f1a,0x70e9,0x6c47,
       +0x8bb3,0x8bf2,0x7ed8,0x8364,0x660f,0x5a5a,0x9b42,0x6d51,
       +0x6df7,0x8c41,0x6d3b,0x4f19,0x706b,0x83b7,0x6216,0x60d1,
       +0x970d,0x8d27,0x7978,0x51fb,0x573e,0x57fa,0x673a,0x7578,
       +0x7a3d,0x79ef,0x7b95,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x808c,0x9965,0x8ff9,0x6fc0,0x8ba5,0x9e21,0x59ec,
       +0x7ee9,0x7f09,0x5409,0x6781,0x68d8,0x8f91,0x7c4d,0x96c6,
       +0x53ca,0x6025,0x75be,0x6c72,0x5373,0x5ac9,0x7ea7,0x6324,
       +0x51e0,0x810a,0x5df1,0x84df,0x6280,0x5180,0x5b63,0x4f0e,
       +0x796d,0x5242,0x60b8,0x6d4e,0x5bc4,0x5bc2,0x8ba1,0x8bb0,
       +0x65e2,0x5fcc,0x9645,0x5993,0x7ee7,0x7eaa,0x5609,0x67b7,
       +0x5939,0x4f73,0x5bb6,0x52a0,0x835a,0x988a,0x8d3e,0x7532,
       +0x94be,0x5047,0x7a3c,0x4ef7,0x67b6,0x9a7e,0x5ac1,0x6b7c,
       +0x76d1,0x575a,0x5c16,0x7b3a,0x95f4,0x714e,0x517c,0x80a9,
       +0x8270,0x5978,0x7f04,0x8327,0x68c0,0x67ec,0x78b1,0x7877,
       +0x62e3,0x6361,0x7b80,0x4fed,0x526a,0x51cf,0x8350,0x69db,
       +0x9274,0x8df5,0x8d31,0x89c1,0x952e,0x7bad,0x4ef6,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5065,0x8230,0x5251,
       +0x996f,0x6e10,0x6e85,0x6da7,0x5efa,0x50f5,0x59dc,0x5c06,
       +0x6d46,0x6c5f,0x7586,0x848b,0x6868,0x5956,0x8bb2,0x5320,
       +0x9171,0x964d,0x8549,0x6912,0x7901,0x7126,0x80f6,0x4ea4,
       +0x90ca,0x6d47,0x9a84,0x5a07,0x56bc,0x6405,0x94f0,0x77eb,
       +0x4fa5,0x811a,0x72e1,0x89d2,0x997a,0x7f34,0x7ede,0x527f,
       +0x6559,0x9175,0x8f7f,0x8f83,0x53eb,0x7a96,0x63ed,0x63a5,
       +0x7686,0x79f8,0x8857,0x9636,0x622a,0x52ab,0x8282,0x6854,
       +0x6770,0x6377,0x776b,0x7aed,0x6d01,0x7ed3,0x89e3,0x59d0,
       +0x6212,0x85c9,0x82a5,0x754c,0x501f,0x4ecb,0x75a5,0x8beb,
       +0x5c4a,0x5dfe,0x7b4b,0x65a4,0x91d1,0x4eca,0x6d25,0x895f,
       +0x7d27,0x9526,0x4ec5,0x8c28,0x8fdb,0x9773,0x664b,0x7981,
       +0x8fd1,0x70ec,0x6d78,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5c3d,0x52b2,0x8346,0x5162,0x830e,0x775b,0x6676,
       +0x9cb8,0x4eac,0x60ca,0x7cbe,0x7cb3,0x7ecf,0x4e95,0x8b66,
       +0x666f,0x9888,0x9759,0x5883,0x656c,0x955c,0x5f84,0x75c9,
       +0x9756,0x7adf,0x7ade,0x51c0,0x70af,0x7a98,0x63ea,0x7a76,
       +0x7ea0,0x7396,0x97ed,0x4e45,0x7078,0x4e5d,0x9152,0x53a9,
       +0x6551,0x65e7,0x81fc,0x8205,0x548e,0x5c31,0x759a,0x97a0,
       +0x62d8,0x72d9,0x75bd,0x5c45,0x9a79,0x83ca,0x5c40,0x5480,
       +0x77e9,0x4e3e,0x6cae,0x805a,0x62d2,0x636e,0x5de8,0x5177,
       +0x8ddd,0x8e1e,0x952f,0x4ff1,0x53e5,0x60e7,0x70ac,0x5267,
       +0x6350,0x9e43,0x5a1f,0x5026,0x7737,0x5377,0x7ee2,0x6485,
       +0x652b,0x6289,0x6398,0x5014,0x7235,0x89c9,0x51b3,0x8bc0,
       +0x7edd,0x5747,0x83cc,0x94a7,0x519b,0x541b,0x5cfb,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x4fca,0x7ae3,0x6d5a,
       +0x90e1,0x9a8f,0x5580,0x5496,0x5361,0x54af,0x5f00,0x63e9,
       +0x6977,0x51ef,0x6168,0x520a,0x582a,0x52d8,0x574e,0x780d,
       +0x770b,0x5eb7,0x6177,0x7ce0,0x625b,0x6297,0x4ea2,0x7095,
       +0x8003,0x62f7,0x70e4,0x9760,0x5777,0x82db,0x67ef,0x68f5,
       +0x78d5,0x9897,0x79d1,0x58f3,0x54b3,0x53ef,0x6e34,0x514b,
       +0x523b,0x5ba2,0x8bfe,0x80af,0x5543,0x57a6,0x6073,0x5751,
       +0x542d,0x7a7a,0x6050,0x5b54,0x63a7,0x62a0,0x53e3,0x6263,
       +0x5bc7,0x67af,0x54ed,0x7a9f,0x82e6,0x9177,0x5e93,0x88e4,
       +0x5938,0x57ae,0x630e,0x8de8,0x80ef,0x5757,0x7b77,0x4fa9,
       +0x5feb,0x5bbd,0x6b3e,0x5321,0x7b50,0x72c2,0x6846,0x77ff,
       +0x7736,0x65f7,0x51b5,0x4e8f,0x76d4,0x5cbf,0x7aa5,0x8475,
       +0x594e,0x9b41,0x5080,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x9988,0x6127,0x6e83,0x5764,0x6606,0x6346,0x56f0,
       +0x62ec,0x6269,0x5ed3,0x9614,0x5783,0x62c9,0x5587,0x8721,
       +0x814a,0x8fa3,0x5566,0x83b1,0x6765,0x8d56,0x84dd,0x5a6a,
       +0x680f,0x62e6,0x7bee,0x9611,0x5170,0x6f9c,0x8c30,0x63fd,
       +0x89c8,0x61d2,0x7f06,0x70c2,0x6ee5,0x7405,0x6994,0x72fc,
       +0x5eca,0x90ce,0x6717,0x6d6a,0x635e,0x52b3,0x7262,0x8001,
       +0x4f6c,0x59e5,0x916a,0x70d9,0x6d9d,0x52d2,0x4e50,0x96f7,
       +0x956d,0x857e,0x78ca,0x7d2f,0x5121,0x5792,0x64c2,0x808b,
       +0x7c7b,0x6cea,0x68f1,0x695e,0x51b7,0x5398,0x68a8,0x7281,
       +0x9ece,0x7bf1,0x72f8,0x79bb,0x6f13,0x7406,0x674e,0x91cc,
       +0x9ca4,0x793c,0x8389,0x8354,0x540f,0x6817,0x4e3d,0x5389,
       +0x52b1,0x783e,0x5386,0x5229,0x5088,0x4f8b,0x4fd0,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x75e2,0x7acb,0x7c92,
       +0x6ca5,0x96b6,0x529b,0x7483,0x54e9,0x4fe9,0x8054,0x83b2,
       +0x8fde,0x9570,0x5ec9,0x601c,0x6d9f,0x5e18,0x655b,0x8138,
       +0x94fe,0x604b,0x70bc,0x7ec3,0x7cae,0x51c9,0x6881,0x7cb1,
       +0x826f,0x4e24,0x8f86,0x91cf,0x667e,0x4eae,0x8c05,0x64a9,
       +0x804a,0x50da,0x7597,0x71ce,0x5be5,0x8fbd,0x6f66,0x4e86,
       +0x6482,0x9563,0x5ed6,0x6599,0x5217,0x88c2,0x70c8,0x52a3,
       +0x730e,0x7433,0x6797,0x78f7,0x9716,0x4e34,0x90bb,0x9cde,
       +0x6dcb,0x51db,0x8d41,0x541d,0x62ce,0x73b2,0x83f1,0x96f6,
       +0x9f84,0x94c3,0x4f36,0x7f9a,0x51cc,0x7075,0x9675,0x5cad,
       +0x9886,0x53e6,0x4ee4,0x6e9c,0x7409,0x69b4,0x786b,0x998f,
       +0x7559,0x5218,0x7624,0x6d41,0x67f3,0x516d,0x9f99,0x804b,
       +0x5499,0x7b3c,0x7abf,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x9686,0x5784,0x62e2,0x9647,0x697c,0x5a04,0x6402,
       +0x7bd3,0x6f0f,0x964b,0x82a6,0x5362,0x9885,0x5e90,0x7089,
       +0x63b3,0x5364,0x864f,0x9c81,0x9e93,0x788c,0x9732,0x8def,
       +0x8d42,0x9e7f,0x6f5e,0x7984,0x5f55,0x9646,0x622e,0x9a74,
       +0x5415,0x94dd,0x4fa3,0x65c5,0x5c65,0x5c61,0x7f15,0x8651,
       +0x6c2f,0x5f8b,0x7387,0x6ee4,0x7eff,0x5ce6,0x631b,0x5b6a,
       +0x6ee6,0x5375,0x4e71,0x63a0,0x7565,0x62a1,0x8f6e,0x4f26,
       +0x4ed1,0x6ca6,0x7eb6,0x8bba,0x841d,0x87ba,0x7f57,0x903b,
       +0x9523,0x7ba9,0x9aa1,0x88f8,0x843d,0x6d1b,0x9a86,0x7edc,
       +0x5988,0x9ebb,0x739b,0x7801,0x8682,0x9a6c,0x9a82,0x561b,
       +0x5417,0x57cb,0x4e70,0x9ea6,0x5356,0x8fc8,0x8109,0x7792,
       +0x9992,0x86ee,0x6ee1,0x8513,0x66fc,0x6162,0x6f2b,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8c29,0x8292,0x832b,
       +0x76f2,0x6c13,0x5fd9,0x83bd,0x732b,0x8305,0x951a,0x6bdb,
       +0x77db,0x94c6,0x536f,0x8302,0x5192,0x5e3d,0x8c8c,0x8d38,
       +0x4e48,0x73ab,0x679a,0x6885,0x9176,0x9709,0x7164,0x6ca1,
       +0x7709,0x5a92,0x9541,0x6bcf,0x7f8e,0x6627,0x5bd0,0x59b9,
       +0x5a9a,0x95e8,0x95f7,0x4eec,0x840c,0x8499,0x6aac,0x76df,
       +0x9530,0x731b,0x68a6,0x5b5f,0x772f,0x919a,0x9761,0x7cdc,
       +0x8ff7,0x8c1c,0x5f25,0x7c73,0x79d8,0x89c5,0x6ccc,0x871c,
       +0x5bc6,0x5e42,0x68c9,0x7720,0x7ef5,0x5195,0x514d,0x52c9,
       +0x5a29,0x7f05,0x9762,0x82d7,0x63cf,0x7784,0x85d0,0x79d2,
       +0x6e3a,0x5e99,0x5999,0x8511,0x706d,0x6c11,0x62bf,0x76bf,
       +0x654f,0x60af,0x95fd,0x660e,0x879f,0x9e23,0x94ed,0x540d,
       +0x547d,0x8c2c,0x6478,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6479,0x8611,0x6a21,0x819c,0x78e8,0x6469,0x9b54,
       +0x62b9,0x672b,0x83ab,0x58a8,0x9ed8,0x6cab,0x6f20,0x5bde,
       +0x964c,0x8c0b,0x725f,0x67d0,0x62c7,0x7261,0x4ea9,0x59c6,
       +0x6bcd,0x5893,0x66ae,0x5e55,0x52df,0x6155,0x6728,0x76ee,
       +0x7766,0x7267,0x7a46,0x62ff,0x54ea,0x5450,0x94a0,0x90a3,
       +0x5a1c,0x7eb3,0x6c16,0x4e43,0x5976,0x8010,0x5948,0x5357,
       +0x7537,0x96be,0x56ca,0x6320,0x8111,0x607c,0x95f9,0x6dd6,
       +0x5462,0x9981,0x5185,0x5ae9,0x80fd,0x59ae,0x9713,0x502a,
       +0x6ce5,0x5c3c,0x62df,0x4f60,0x533f,0x817b,0x9006,0x6eba,
       +0x852b,0x62c8,0x5e74,0x78be,0x64b5,0x637b,0x5ff5,0x5a18,
       +0x917f,0x9e1f,0x5c3f,0x634f,0x8042,0x5b7d,0x556e,0x954a,
       +0x954d,0x6d85,0x60a8,0x67e0,0x72de,0x51dd,0x5b81,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x62e7,0x6cde,0x725b,
       +0x626d,0x94ae,0x7ebd,0x8113,0x6d53,0x519c,0x5f04,0x5974,
       +0x52aa,0x6012,0x5973,0x6696,0x8650,0x759f,0x632a,0x61e6,
       +0x7cef,0x8bfa,0x54e6,0x6b27,0x9e25,0x6bb4,0x85d5,0x5455,
       +0x5076,0x6ca4,0x556a,0x8db4,0x722c,0x5e15,0x6015,0x7436,
       +0x62cd,0x6392,0x724c,0x5f98,0x6e43,0x6d3e,0x6500,0x6f58,
       +0x76d8,0x78d0,0x76fc,0x7554,0x5224,0x53db,0x4e53,0x5e9e,
       +0x65c1,0x802a,0x80d6,0x629b,0x5486,0x5228,0x70ae,0x888d,
       +0x8dd1,0x6ce1,0x5478,0x80da,0x57f9,0x88f4,0x8d54,0x966a,
       +0x914d,0x4f69,0x6c9b,0x55b7,0x76c6,0x7830,0x62a8,0x70f9,
       +0x6f8e,0x5f6d,0x84ec,0x68da,0x787c,0x7bf7,0x81a8,0x670b,
       +0x9e4f,0x6367,0x78b0,0x576f,0x7812,0x9739,0x6279,0x62ab,
       +0x5288,0x7435,0x6bd7,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5564,0x813e,0x75b2,0x76ae,0x5339,0x75de,0x50fb,
       +0x5c41,0x8b6c,0x7bc7,0x504f,0x7247,0x9a97,0x98d8,0x6f02,
       +0x74e2,0x7968,0x6487,0x77a5,0x62fc,0x9891,0x8d2b,0x54c1,
       +0x8058,0x4e52,0x576a,0x82f9,0x840d,0x5e73,0x51ed,0x74f6,
       +0x8bc4,0x5c4f,0x5761,0x6cfc,0x9887,0x5a46,0x7834,0x9b44,
       +0x8feb,0x7c95,0x5256,0x6251,0x94fa,0x4ec6,0x8386,0x8461,
       +0x83e9,0x84b2,0x57d4,0x6734,0x5703,0x666e,0x6d66,0x8c31,
       +0x66dd,0x7011,0x671f,0x6b3a,0x6816,0x621a,0x59bb,0x4e03,
       +0x51c4,0x6f06,0x67d2,0x6c8f,0x5176,0x68cb,0x5947,0x6b67,
       +0x7566,0x5d0e,0x8110,0x9f50,0x65d7,0x7948,0x7941,0x9a91,
       +0x8d77,0x5c82,0x4e5e,0x4f01,0x542f,0x5951,0x780c,0x5668,
       +0x6c14,0x8fc4,0x5f03,0x6c7d,0x6ce3,0x8bab,0x6390,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6070,0x6d3d,0x7275,
       +0x6266,0x948e,0x94c5,0x5343,0x8fc1,0x7b7e,0x4edf,0x8c26,
       +0x4e7e,0x9ed4,0x94b1,0x94b3,0x524d,0x6f5c,0x9063,0x6d45,
       +0x8c34,0x5811,0x5d4c,0x6b20,0x6b49,0x67aa,0x545b,0x8154,
       +0x7f8c,0x5899,0x8537,0x5f3a,0x62a2,0x6a47,0x9539,0x6572,
       +0x6084,0x6865,0x77a7,0x4e54,0x4fa8,0x5de7,0x9798,0x64ac,
       +0x7fd8,0x5ced,0x4fcf,0x7a8d,0x5207,0x8304,0x4e14,0x602f,
       +0x7a83,0x94a6,0x4fb5,0x4eb2,0x79e6,0x7434,0x52e4,0x82b9,
       +0x64d2,0x79bd,0x5bdd,0x6c81,0x9752,0x8f7b,0x6c22,0x503e,
       +0x537f,0x6e05,0x64ce,0x6674,0x6c30,0x60c5,0x9877,0x8bf7,
       +0x5e86,0x743c,0x7a77,0x79cb,0x4e18,0x90b1,0x7403,0x6c42,
       +0x56da,0x914b,0x6cc5,0x8d8b,0x533a,0x86c6,0x66f2,0x8eaf,
       +0x5c48,0x9a71,0x6e20,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x53d6,0x5a36,0x9f8b,0x8da3,0x53bb,0x5708,0x98a7,
       +0x6743,0x919b,0x6cc9,0x5168,0x75ca,0x62f3,0x72ac,0x5238,
       +0x529d,0x7f3a,0x7094,0x7638,0x5374,0x9e4a,0x69b7,0x786e,
       +0x96c0,0x88d9,0x7fa4,0x7136,0x71c3,0x5189,0x67d3,0x74e4,
       +0x58e4,0x6518,0x56b7,0x8ba9,0x9976,0x6270,0x7ed5,0x60f9,
       +0x70ed,0x58ec,0x4ec1,0x4eba,0x5fcd,0x97e7,0x4efb,0x8ba4,
       +0x5203,0x598a,0x7eab,0x6254,0x4ecd,0x65e5,0x620e,0x8338,
       +0x84c9,0x8363,0x878d,0x7194,0x6eb6,0x5bb9,0x7ed2,0x5197,
       +0x63c9,0x67d4,0x8089,0x8339,0x8815,0x5112,0x5b7a,0x5982,
       +0x8fb1,0x4e73,0x6c5d,0x5165,0x8925,0x8f6f,0x962e,0x854a,
       +0x745e,0x9510,0x95f0,0x6da6,0x82e5,0x5f31,0x6492,0x6d12,
       +0x8428,0x816e,0x9cc3,0x585e,0x8d5b,0x4e09,0x53c1,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x4f1e,0x6563,0x6851,
       +0x55d3,0x4e27,0x6414,0x9a9a,0x626b,0x5ac2,0x745f,0x8272,
       +0x6da9,0x68ee,0x50e7,0x838e,0x7802,0x6740,0x5239,0x6c99,
       +0x7eb1,0x50bb,0x5565,0x715e,0x7b5b,0x6652,0x73ca,0x82eb,
       +0x6749,0x5c71,0x5220,0x717d,0x886b,0x95ea,0x9655,0x64c5,
       +0x8d61,0x81b3,0x5584,0x6c55,0x6247,0x7f2e,0x5892,0x4f24,
       +0x5546,0x8d4f,0x664c,0x4e0a,0x5c1a,0x88f3,0x68a2,0x634e,
       +0x7a0d,0x70e7,0x828d,0x52fa,0x97f6,0x5c11,0x54e8,0x90b5,
       +0x7ecd,0x5962,0x8d4a,0x86c7,0x820c,0x820d,0x8d66,0x6444,
       +0x5c04,0x6151,0x6d89,0x793e,0x8bbe,0x7837,0x7533,0x547b,
       +0x4f38,0x8eab,0x6df1,0x5a20,0x7ec5,0x795e,0x6c88,0x5ba1,
       +0x5a76,0x751a,0x80be,0x614e,0x6e17,0x58f0,0x751f,0x7525,
       +0x7272,0x5347,0x7ef3,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7701,0x76db,0x5269,0x80dc,0x5723,0x5e08,0x5931,
       +0x72ee,0x65bd,0x6e7f,0x8bd7,0x5c38,0x8671,0x5341,0x77f3,
       +0x62fe,0x65f6,0x4ec0,0x98df,0x8680,0x5b9e,0x8bc6,0x53f2,
       +0x77e2,0x4f7f,0x5c4e,0x9a76,0x59cb,0x5f0f,0x793a,0x58eb,
       +0x4e16,0x67ff,0x4e8b,0x62ed,0x8a93,0x901d,0x52bf,0x662f,
       +0x55dc,0x566c,0x9002,0x4ed5,0x4f8d,0x91ca,0x9970,0x6c0f,
       +0x5e02,0x6043,0x5ba4,0x89c6,0x8bd5,0x6536,0x624b,0x9996,
       +0x5b88,0x5bff,0x6388,0x552e,0x53d7,0x7626,0x517d,0x852c,
       +0x67a2,0x68b3,0x6b8a,0x6292,0x8f93,0x53d4,0x8212,0x6dd1,
       +0x758f,0x4e66,0x8d4e,0x5b70,0x719f,0x85af,0x6691,0x66d9,
       +0x7f72,0x8700,0x9ecd,0x9f20,0x5c5e,0x672f,0x8ff0,0x6811,
       +0x675f,0x620d,0x7ad6,0x5885,0x5eb6,0x6570,0x6f31,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6055,0x5237,0x800d,
       +0x6454,0x8870,0x7529,0x5e05,0x6813,0x62f4,0x971c,0x53cc,
       +0x723d,0x8c01,0x6c34,0x7761,0x7a0e,0x542e,0x77ac,0x987a,
       +0x821c,0x8bf4,0x7855,0x6714,0x70c1,0x65af,0x6495,0x5636,
       +0x601d,0x79c1,0x53f8,0x4e1d,0x6b7b,0x8086,0x5bfa,0x55e3,
       +0x56db,0x4f3a,0x4f3c,0x9972,0x5df3,0x677e,0x8038,0x6002,
       +0x9882,0x9001,0x5b8b,0x8bbc,0x8bf5,0x641c,0x8258,0x64de,
       +0x55fd,0x82cf,0x9165,0x4fd7,0x7d20,0x901f,0x7c9f,0x50f3,
       +0x5851,0x6eaf,0x5bbf,0x8bc9,0x8083,0x9178,0x849c,0x7b97,
       +0x867d,0x968b,0x968f,0x7ee5,0x9ad3,0x788e,0x5c81,0x7a57,
       +0x9042,0x96a7,0x795f,0x5b59,0x635f,0x7b0b,0x84d1,0x68ad,
       +0x5506,0x7f29,0x7410,0x7d22,0x9501,0x6240,0x584c,0x4ed6,
       +0x5b83,0x5979,0x5854,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x736d,0x631e,0x8e4b,0x8e0f,0x80ce,0x82d4,0x62ac,
       +0x53f0,0x6cf0,0x915e,0x592a,0x6001,0x6c70,0x574d,0x644a,
       +0x8d2a,0x762b,0x6ee9,0x575b,0x6a80,0x75f0,0x6f6d,0x8c2d,
       +0x8c08,0x5766,0x6bef,0x8892,0x78b3,0x63a2,0x53f9,0x70ad,
       +0x6c64,0x5858,0x642a,0x5802,0x68e0,0x819b,0x5510,0x7cd6,
       +0x5018,0x8eba,0x6dcc,0x8d9f,0x70eb,0x638f,0x6d9b,0x6ed4,
       +0x7ee6,0x8404,0x6843,0x9003,0x6dd8,0x9676,0x8ba8,0x5957,
       +0x7279,0x85e4,0x817e,0x75bc,0x8a8a,0x68af,0x5254,0x8e22,
       +0x9511,0x63d0,0x9898,0x8e44,0x557c,0x4f53,0x66ff,0x568f,
       +0x60d5,0x6d95,0x5243,0x5c49,0x5929,0x6dfb,0x586b,0x7530,
       +0x751c,0x606c,0x8214,0x8146,0x6311,0x6761,0x8fe2,0x773a,
       +0x8df3,0x8d34,0x94c1,0x5e16,0x5385,0x542c,0x70c3,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6c40,0x5ef7,0x505c,
       +0x4ead,0x5ead,0x633a,0x8247,0x901a,0x6850,0x916e,0x77b3,
       +0x540c,0x94dc,0x5f64,0x7ae5,0x6876,0x6345,0x7b52,0x7edf,
       +0x75db,0x5077,0x6295,0x5934,0x900f,0x51f8,0x79c3,0x7a81,
       +0x56fe,0x5f92,0x9014,0x6d82,0x5c60,0x571f,0x5410,0x5154,
       +0x6e4d,0x56e2,0x63a8,0x9893,0x817f,0x8715,0x892a,0x9000,
       +0x541e,0x5c6f,0x81c0,0x62d6,0x6258,0x8131,0x9e35,0x9640,
       +0x9a6e,0x9a7c,0x692d,0x59a5,0x62d3,0x553e,0x6316,0x54c7,
       +0x86d9,0x6d3c,0x5a03,0x74e6,0x889c,0x6b6a,0x5916,0x8c4c,
       +0x5f2f,0x6e7e,0x73a9,0x987d,0x4e38,0x70f7,0x5b8c,0x7897,
       +0x633d,0x665a,0x7696,0x60cb,0x5b9b,0x5a49,0x4e07,0x8155,
       +0x6c6a,0x738b,0x4ea1,0x6789,0x7f51,0x5f80,0x65fa,0x671b,
       +0x5fd8,0x5984,0x5a01,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5dcd,0x5fae,0x5371,0x97e6,0x8fdd,0x6845,0x56f4,
       +0x552f,0x60df,0x4e3a,0x6f4d,0x7ef4,0x82c7,0x840e,0x59d4,
       +0x4f1f,0x4f2a,0x5c3e,0x7eac,0x672a,0x851a,0x5473,0x754f,
       +0x80c3,0x5582,0x9b4f,0x4f4d,0x6e2d,0x8c13,0x5c09,0x6170,
       +0x536b,0x761f,0x6e29,0x868a,0x6587,0x95fb,0x7eb9,0x543b,
       +0x7a33,0x7d0a,0x95ee,0x55e1,0x7fc1,0x74ee,0x631d,0x8717,
       +0x6da1,0x7a9d,0x6211,0x65a1,0x5367,0x63e1,0x6c83,0x5deb,
       +0x545c,0x94a8,0x4e4c,0x6c61,0x8bec,0x5c4b,0x65e0,0x829c,
       +0x68a7,0x543e,0x5434,0x6bcb,0x6b66,0x4e94,0x6342,0x5348,
       +0x821e,0x4f0d,0x4fae,0x575e,0x620a,0x96fe,0x6664,0x7269,
       +0x52ff,0x52a1,0x609f,0x8bef,0x6614,0x7199,0x6790,0x897f,
       +0x7852,0x77fd,0x6670,0x563b,0x5438,0x9521,0x727a,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x7a00,0x606f,0x5e0c,
       +0x6089,0x819d,0x5915,0x60dc,0x7184,0x70ef,0x6eaa,0x6c50,
       +0x7280,0x6a84,0x88ad,0x5e2d,0x4e60,0x5ab3,0x559c,0x94e3,
       +0x6d17,0x7cfb,0x9699,0x620f,0x7ec6,0x778e,0x867e,0x5323,
       +0x971e,0x8f96,0x6687,0x5ce1,0x4fa0,0x72ed,0x4e0b,0x53a6,
       +0x590f,0x5413,0x6380,0x9528,0x5148,0x4ed9,0x9c9c,0x7ea4,
       +0x54b8,0x8d24,0x8854,0x8237,0x95f2,0x6d8e,0x5f26,0x5acc,
       +0x663e,0x9669,0x73b0,0x732e,0x53bf,0x817a,0x9985,0x7fa1,
       +0x5baa,0x9677,0x9650,0x7ebf,0x76f8,0x53a2,0x9576,0x9999,
       +0x7bb1,0x8944,0x6e58,0x4e61,0x7fd4,0x7965,0x8be6,0x60f3,
       +0x54cd,0x4eab,0x9879,0x5df7,0x6a61,0x50cf,0x5411,0x8c61,
       +0x8427,0x785d,0x9704,0x524a,0x54ee,0x56a3,0x9500,0x6d88,
       +0x5bb5,0x6dc6,0x6653,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5c0f,0x5b5d,0x6821,0x8096,0x5578,0x7b11,0x6548,
       +0x6954,0x4e9b,0x6b47,0x874e,0x978b,0x534f,0x631f,0x643a,
       +0x90aa,0x659c,0x80c1,0x8c10,0x5199,0x68b0,0x5378,0x87f9,
       +0x61c8,0x6cc4,0x6cfb,0x8c22,0x5c51,0x85aa,0x82af,0x950c,
       +0x6b23,0x8f9b,0x65b0,0x5ffb,0x5fc3,0x4fe1,0x8845,0x661f,
       +0x8165,0x7329,0x60fa,0x5174,0x5211,0x578b,0x5f62,0x90a2,
       +0x884c,0x9192,0x5e78,0x674f,0x6027,0x59d3,0x5144,0x51f6,
       +0x80f8,0x5308,0x6c79,0x96c4,0x718a,0x4f11,0x4fee,0x7f9e,
       +0x673d,0x55c5,0x9508,0x79c0,0x8896,0x7ee3,0x589f,0x620c,
       +0x9700,0x865a,0x5618,0x987b,0x5f90,0x8bb8,0x84c4,0x9157,
       +0x53d9,0x65ed,0x5e8f,0x755c,0x6064,0x7d6e,0x5a7f,0x7eea,
       +0x7eed,0x8f69,0x55a7,0x5ba3,0x60ac,0x65cb,0x7384,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9009,0x7663,0x7729,
       +0x7eda,0x9774,0x859b,0x5b66,0x7a74,0x96ea,0x8840,0x52cb,
       +0x718f,0x5faa,0x65ec,0x8be2,0x5bfb,0x9a6f,0x5de1,0x6b89,
       +0x6c5b,0x8bad,0x8baf,0x900a,0x8fc5,0x538b,0x62bc,0x9e26,
       +0x9e2d,0x5440,0x4e2b,0x82bd,0x7259,0x869c,0x5d16,0x8859,
       +0x6daf,0x96c5,0x54d1,0x4e9a,0x8bb6,0x7109,0x54bd,0x9609,
       +0x70df,0x6df9,0x76d0,0x4e25,0x7814,0x8712,0x5ca9,0x5ef6,
       +0x8a00,0x989c,0x960e,0x708e,0x6cbf,0x5944,0x63a9,0x773c,
       +0x884d,0x6f14,0x8273,0x5830,0x71d5,0x538c,0x781a,0x96c1,
       +0x5501,0x5f66,0x7130,0x5bb4,0x8c1a,0x9a8c,0x6b83,0x592e,
       +0x9e2f,0x79e7,0x6768,0x626c,0x4f6f,0x75a1,0x7f8a,0x6d0b,
       +0x9633,0x6c27,0x4ef0,0x75d2,0x517b,0x6837,0x6f3e,0x9080,
       +0x8170,0x5996,0x7476,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6447,0x5c27,0x9065,0x7a91,0x8c23,0x59da,0x54ac,
       +0x8200,0x836f,0x8981,0x8000,0x6930,0x564e,0x8036,0x7237,
       +0x91ce,0x51b6,0x4e5f,0x9875,0x6396,0x4e1a,0x53f6,0x66f3,
       +0x814b,0x591c,0x6db2,0x4e00,0x58f9,0x533b,0x63d6,0x94f1,
       +0x4f9d,0x4f0a,0x8863,0x9890,0x5937,0x9057,0x79fb,0x4eea,
       +0x80f0,0x7591,0x6c82,0x5b9c,0x59e8,0x5f5d,0x6905,0x8681,
       +0x501a,0x5df2,0x4e59,0x77e3,0x4ee5,0x827a,0x6291,0x6613,
       +0x9091,0x5c79,0x4ebf,0x5f79,0x81c6,0x9038,0x8084,0x75ab,
       +0x4ea6,0x88d4,0x610f,0x6bc5,0x5fc6,0x4e49,0x76ca,0x6ea2,
       +0x8be3,0x8bae,0x8c0a,0x8bd1,0x5f02,0x7ffc,0x7fcc,0x7ece,
       +0x8335,0x836b,0x56e0,0x6bb7,0x97f3,0x9634,0x59fb,0x541f,
       +0x94f6,0x6deb,0x5bc5,0x996e,0x5c39,0x5f15,0x9690,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5370,0x82f1,0x6a31,
       +0x5a74,0x9e70,0x5e94,0x7f28,0x83b9,0x8424,0x8425,0x8367,
       +0x8747,0x8fce,0x8d62,0x76c8,0x5f71,0x9896,0x786c,0x6620,
       +0x54df,0x62e5,0x4f63,0x81c3,0x75c8,0x5eb8,0x96cd,0x8e0a,
       +0x86f9,0x548f,0x6cf3,0x6d8c,0x6c38,0x607f,0x52c7,0x7528,
       +0x5e7d,0x4f18,0x60a0,0x5fe7,0x5c24,0x7531,0x90ae,0x94c0,
       +0x72b9,0x6cb9,0x6e38,0x9149,0x6709,0x53cb,0x53f3,0x4f51,
       +0x91c9,0x8bf1,0x53c8,0x5e7c,0x8fc2,0x6de4,0x4e8e,0x76c2,
       +0x6986,0x865e,0x611a,0x8206,0x4f59,0x4fde,0x903e,0x9c7c,
       +0x6109,0x6e1d,0x6e14,0x9685,0x4e88,0x5a31,0x96e8,0x4e0e,
       +0x5c7f,0x79b9,0x5b87,0x8bed,0x7fbd,0x7389,0x57df,0x828b,
       +0x90c1,0x5401,0x9047,0x55bb,0x5cea,0x5fa1,0x6108,0x6b32,
       +0x72f1,0x80b2,0x8a89,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6d74,0x5bd3,0x88d5,0x9884,0x8c6b,0x9a6d,0x9e33,
       +0x6e0a,0x51a4,0x5143,0x57a3,0x8881,0x539f,0x63f4,0x8f95,
       +0x56ed,0x5458,0x5706,0x733f,0x6e90,0x7f18,0x8fdc,0x82d1,
       +0x613f,0x6028,0x9662,0x66f0,0x7ea6,0x8d8a,0x8dc3,0x94a5,
       +0x5cb3,0x7ca4,0x6708,0x60a6,0x9605,0x8018,0x4e91,0x90e7,
       +0x5300,0x9668,0x5141,0x8fd0,0x8574,0x915d,0x6655,0x97f5,
       +0x5b55,0x531d,0x7838,0x6742,0x683d,0x54c9,0x707e,0x5bb0,
       +0x8f7d,0x518d,0x5728,0x54b1,0x6512,0x6682,0x8d5e,0x8d43,
       +0x810f,0x846c,0x906d,0x7cdf,0x51ff,0x85fb,0x67a3,0x65e9,
       +0x6fa1,0x86a4,0x8e81,0x566a,0x9020,0x7682,0x7076,0x71e5,
       +0x8d23,0x62e9,0x5219,0x6cfd,0x8d3c,0x600e,0x589e,0x618e,
       +0x66fe,0x8d60,0x624e,0x55b3,0x6e23,0x672d,0x8f67,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x94e1,0x95f8,0x7728,
       +0x6805,0x69a8,0x548b,0x4e4d,0x70b8,0x8bc8,0x6458,0x658b,
       +0x5b85,0x7a84,0x503a,0x5be8,0x77bb,0x6be1,0x8a79,0x7c98,
       +0x6cbe,0x76cf,0x65a9,0x8f97,0x5d2d,0x5c55,0x8638,0x6808,
       +0x5360,0x6218,0x7ad9,0x6e5b,0x7efd,0x6a1f,0x7ae0,0x5f70,
       +0x6f33,0x5f20,0x638c,0x6da8,0x6756,0x4e08,0x5e10,0x8d26,
       +0x4ed7,0x80c0,0x7634,0x969c,0x62db,0x662d,0x627e,0x6cbc,
       +0x8d75,0x7167,0x7f69,0x5146,0x8087,0x53ec,0x906e,0x6298,
       +0x54f2,0x86f0,0x8f99,0x8005,0x9517,0x8517,0x8fd9,0x6d59,
       +0x73cd,0x659f,0x771f,0x7504,0x7827,0x81fb,0x8d1e,0x9488,
       +0x4fa6,0x6795,0x75b9,0x8bca,0x9707,0x632f,0x9547,0x9635,
       +0x84b8,0x6323,0x7741,0x5f81,0x72f0,0x4e89,0x6014,0x6574,
       +0x62ef,0x6b63,0x653f,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5e27,0x75c7,0x90d1,0x8bc1,0x829d,0x679d,0x652f,
       +0x5431,0x8718,0x77e5,0x80a2,0x8102,0x6c41,0x4e4b,0x7ec7,
       +0x804c,0x76f4,0x690d,0x6b96,0x6267,0x503c,0x4f84,0x5740,
       +0x6307,0x6b62,0x8dbe,0x53ea,0x65e8,0x7eb8,0x5fd7,0x631a,
       +0x63b7,0x81f3,0x81f4,0x7f6e,0x5e1c,0x5cd9,0x5236,0x667a,
       +0x79e9,0x7a1a,0x8d28,0x7099,0x75d4,0x6ede,0x6cbb,0x7a92,
       +0x4e2d,0x76c5,0x5fe0,0x949f,0x8877,0x7ec8,0x79cd,0x80bf,
       +0x91cd,0x4ef2,0x4f17,0x821f,0x5468,0x5dde,0x6d32,0x8bcc,
       +0x7ca5,0x8f74,0x8098,0x5e1a,0x5492,0x76b1,0x5b99,0x663c,
       +0x9aa4,0x73e0,0x682a,0x86db,0x6731,0x732a,0x8bf8,0x8bdb,
       +0x9010,0x7af9,0x70db,0x716e,0x62c4,0x77a9,0x5631,0x4e3b,
       +0x8457,0x67f1,0x52a9,0x86c0,0x8d2e,0x94f8,0x7b51,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x4f4f,0x6ce8,0x795d,
       +0x9a7b,0x6293,0x722a,0x62fd,0x4e13,0x7816,0x8f6c,0x64b0,
       +0x8d5a,0x7bc6,0x6869,0x5e84,0x88c5,0x5986,0x649e,0x58ee,
       +0x72b6,0x690e,0x9525,0x8ffd,0x8d58,0x5760,0x7f00,0x8c06,
       +0x51c6,0x6349,0x62d9,0x5353,0x684c,0x7422,0x8301,0x914c,
       +0x5544,0x7740,0x707c,0x6d4a,0x5179,0x54a8,0x8d44,0x59ff,
       +0x6ecb,0x6dc4,0x5b5c,0x7d2b,0x4ed4,0x7c7d,0x6ed3,0x5b50,
       +0x81ea,0x6e0d,0x5b57,0x9b03,0x68d5,0x8e2a,0x5b97,0x7efc,
       +0x603b,0x7eb5,0x90b9,0x8d70,0x594f,0x63cd,0x79df,0x8db3,
       +0x5352,0x65cf,0x7956,0x8bc5,0x963b,0x7ec4,0x94bb,0x7e82,
       +0x5634,0x9189,0x6700,0x7f6a,0x5c0a,0x9075,0x6628,0x5de6,
       +0x4f50,0x67de,0x505a,0x4f5c,0x5750,0x5ea7,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x4e8d,0x4e0c,0x5140,0x4e10,0x5eff,0x5345,0x4e15,
       +0x4e98,0x4e1e,0x9b32,0x5b6c,0x5669,0x4e28,0x79ba,0x4e3f,
       +0x5315,0x4e47,0x592d,0x723b,0x536e,0x6c10,0x56df,0x80e4,
       +0x9997,0x6bd3,0x777e,0x9f17,0x4e36,0x4e9f,0x9f10,0x4e5c,
       +0x4e69,0x4e93,0x8288,0x5b5b,0x556c,0x560f,0x4ec4,0x538d,
       +0x539d,0x53a3,0x53a5,0x53ae,0x9765,0x8d5d,0x531a,0x53f5,
       +0x5326,0x532e,0x533e,0x8d5c,0x5366,0x5363,0x5202,0x5208,
       +0x520e,0x522d,0x5233,0x523f,0x5240,0x524c,0x525e,0x5261,
       +0x525c,0x84af,0x527d,0x5282,0x5281,0x5290,0x5293,0x5182,
       +0x7f54,0x4ebb,0x4ec3,0x4ec9,0x4ec2,0x4ee8,0x4ee1,0x4eeb,
       +0x4ede,0x4f1b,0x4ef3,0x4f22,0x4f64,0x4ef5,0x4f25,0x4f27,
       +0x4f09,0x4f2b,0x4f5e,0x4f67,0x6538,0x4f5a,0x4f5d,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x4f5f,0x4f57,0x4f32,
       +0x4f3d,0x4f76,0x4f74,0x4f91,0x4f89,0x4f83,0x4f8f,0x4f7e,
       +0x4f7b,0x4faa,0x4f7c,0x4fac,0x4f94,0x4fe6,0x4fe8,0x4fea,
       +0x4fc5,0x4fda,0x4fe3,0x4fdc,0x4fd1,0x4fdf,0x4ff8,0x5029,
       +0x504c,0x4ff3,0x502c,0x500f,0x502e,0x502d,0x4ffe,0x501c,
       +0x500c,0x5025,0x5028,0x507e,0x5043,0x5055,0x5048,0x504e,
       +0x506c,0x507b,0x50a5,0x50a7,0x50a9,0x50ba,0x50d6,0x5106,
       +0x50ed,0x50ec,0x50e6,0x50ee,0x5107,0x510b,0x4edd,0x6c3d,
       +0x4f58,0x4f65,0x4fce,0x9fa0,0x6c46,0x7c74,0x516e,0x5dfd,
       +0x9ec9,0x9998,0x5181,0x5914,0x52f9,0x530d,0x8a07,0x5310,
       +0x51eb,0x5919,0x5155,0x4ea0,0x5156,0x4eb3,0x886e,0x88a4,
       +0x4eb5,0x8114,0x88d2,0x7980,0x5b34,0x8803,0x7fb8,0x51ab,
       +0x51b1,0x51bd,0x51bc,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x51c7,0x5196,0x51a2,0x51a5,0x8ba0,0x8ba6,0x8ba7,
       +0x8baa,0x8bb4,0x8bb5,0x8bb7,0x8bc2,0x8bc3,0x8bcb,0x8bcf,
       +0x8bce,0x8bd2,0x8bd3,0x8bd4,0x8bd6,0x8bd8,0x8bd9,0x8bdc,
       +0x8bdf,0x8be0,0x8be4,0x8be8,0x8be9,0x8bee,0x8bf0,0x8bf3,
       +0x8bf6,0x8bf9,0x8bfc,0x8bff,0x8c00,0x8c02,0x8c04,0x8c07,
       +0x8c0c,0x8c0f,0x8c11,0x8c12,0x8c14,0x8c15,0x8c16,0x8c19,
       +0x8c1b,0x8c18,0x8c1d,0x8c1f,0x8c20,0x8c21,0x8c25,0x8c27,
       +0x8c2a,0x8c2b,0x8c2e,0x8c2f,0x8c32,0x8c33,0x8c35,0x8c36,
       +0x5369,0x537a,0x961d,0x9622,0x9621,0x9631,0x962a,0x963d,
       +0x963c,0x9642,0x9649,0x9654,0x965f,0x9667,0x966c,0x9672,
       +0x9674,0x9688,0x968d,0x9697,0x96b0,0x9097,0x909b,0x909d,
       +0x9099,0x90ac,0x90a1,0x90b4,0x90b3,0x90b6,0x90ba,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x90b8,0x90b0,0x90cf,
       +0x90c5,0x90be,0x90d0,0x90c4,0x90c7,0x90d3,0x90e6,0x90e2,
       +0x90dc,0x90d7,0x90db,0x90eb,0x90ef,0x90fe,0x9104,0x9122,
       +0x911e,0x9123,0x9131,0x912f,0x9139,0x9143,0x9146,0x520d,
       +0x5942,0x52a2,0x52ac,0x52ad,0x52be,0x54ff,0x52d0,0x52d6,
       +0x52f0,0x53df,0x71ee,0x77cd,0x5ef4,0x51f5,0x51fc,0x9b2f,
       +0x53b6,0x5f01,0x755a,0x5def,0x574c,0x57a9,0x57a1,0x587e,
       +0x58bc,0x58c5,0x58d1,0x5729,0x572c,0x572a,0x5733,0x5739,
       +0x572e,0x572f,0x575c,0x573b,0x5742,0x5769,0x5785,0x576b,
       +0x5786,0x577c,0x577b,0x5768,0x576d,0x5776,0x5773,0x57ad,
       +0x57a4,0x578c,0x57b2,0x57cf,0x57a7,0x57b4,0x5793,0x57a0,
       +0x57d5,0x57d8,0x57da,0x57d9,0x57d2,0x57b8,0x57f4,0x57ef,
       +0x57f8,0x57e4,0x57dd,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x580b,0x580d,0x57fd,0x57ed,0x5800,0x581e,0x5819,
       +0x5844,0x5820,0x5865,0x586c,0x5881,0x5889,0x589a,0x5880,
       +0x99a8,0x9f19,0x61ff,0x8279,0x827d,0x827f,0x828f,0x828a,
       +0x82a8,0x8284,0x828e,0x8291,0x8297,0x8299,0x82ab,0x82b8,
       +0x82be,0x82b0,0x82c8,0x82ca,0x82e3,0x8298,0x82b7,0x82ae,
       +0x82cb,0x82cc,0x82c1,0x82a9,0x82b4,0x82a1,0x82aa,0x829f,
       +0x82c4,0x82ce,0x82a4,0x82e1,0x8309,0x82f7,0x82e4,0x830f,
       +0x8307,0x82dc,0x82f4,0x82d2,0x82d8,0x830c,0x82fb,0x82d3,
       +0x8311,0x831a,0x8306,0x8314,0x8315,0x82e0,0x82d5,0x831c,
       +0x8351,0x835b,0x835c,0x8308,0x8392,0x833c,0x8334,0x8331,
       +0x839b,0x835e,0x832f,0x834f,0x8347,0x8343,0x835f,0x8340,
       +0x8317,0x8360,0x832d,0x833a,0x8333,0x8366,0x8365,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8368,0x831b,0x8369,
       +0x836c,0x836a,0x836d,0x836e,0x83b0,0x8378,0x83b3,0x83b4,
       +0x83a0,0x83aa,0x8393,0x839c,0x8385,0x837c,0x83b6,0x83a9,
       +0x837d,0x83b8,0x837b,0x8398,0x839e,0x83a8,0x83ba,0x83bc,
       +0x83c1,0x8401,0x83e5,0x83d8,0x5807,0x8418,0x840b,0x83dd,
       +0x83fd,0x83d6,0x841c,0x8438,0x8411,0x8406,0x83d4,0x83df,
       +0x840f,0x8403,0x83f8,0x83f9,0x83ea,0x83c5,0x83c0,0x8426,
       +0x83f0,0x83e1,0x845c,0x8451,0x845a,0x8459,0x8473,0x8487,
       +0x8488,0x847a,0x8489,0x8478,0x843c,0x8446,0x8469,0x8476,
       +0x848c,0x848e,0x8431,0x846d,0x84c1,0x84cd,0x84d0,0x84e6,
       +0x84bd,0x84d3,0x84ca,0x84bf,0x84ba,0x84e0,0x84a1,0x84b9,
       +0x84b4,0x8497,0x84e5,0x84e3,0x850c,0x750d,0x8538,0x84f0,
       +0x8539,0x851f,0x853a,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x8556,0x853b,0x84ff,0x84fc,0x8559,0x8548,0x8568,
       +0x8564,0x855e,0x857a,0x77a2,0x8543,0x8572,0x857b,0x85a4,
       +0x85a8,0x8587,0x858f,0x8579,0x85ae,0x859c,0x8585,0x85b9,
       +0x85b7,0x85b0,0x85d3,0x85c1,0x85dc,0x85ff,0x8627,0x8605,
       +0x8629,0x8616,0x863c,0x5efe,0x5f08,0x593c,0x5941,0x8037,
       +0x5955,0x595a,0x5958,0x530f,0x5c22,0x5c25,0x5c2c,0x5c34,
       +0x624c,0x626a,0x629f,0x62bb,0x62ca,0x62da,0x62d7,0x62ee,
       +0x6322,0x62f6,0x6339,0x634b,0x6343,0x63ad,0x63f6,0x6371,
       +0x637a,0x638e,0x63b4,0x636d,0x63ac,0x638a,0x6369,0x63ae,
       +0x63bc,0x63f2,0x63f8,0x63e0,0x63ff,0x63c4,0x63de,0x63ce,
       +0x6452,0x63c6,0x63be,0x6445,0x6441,0x640b,0x641b,0x6420,
       +0x640c,0x6426,0x6421,0x645e,0x6484,0x646d,0x6496,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x647a,0x64b7,0x64b8,
       +0x6499,0x64ba,0x64c0,0x64d0,0x64d7,0x64e4,0x64e2,0x6509,
       +0x6525,0x652e,0x5f0b,0x5fd2,0x7519,0x5f11,0x535f,0x53f1,
       +0x53fd,0x53e9,0x53e8,0x53fb,0x5412,0x5416,0x5406,0x544b,
       +0x5452,0x5453,0x5454,0x5456,0x5443,0x5421,0x5457,0x5459,
       +0x5423,0x5432,0x5482,0x5494,0x5477,0x5471,0x5464,0x549a,
       +0x549b,0x5484,0x5476,0x5466,0x549d,0x54d0,0x54ad,0x54c2,
       +0x54b4,0x54d2,0x54a7,0x54a6,0x54d3,0x54d4,0x5472,0x54a3,
       +0x54d5,0x54bb,0x54bf,0x54cc,0x54d9,0x54da,0x54dc,0x54a9,
       +0x54aa,0x54a4,0x54dd,0x54cf,0x54de,0x551b,0x54e7,0x5520,
       +0x54fd,0x5514,0x54f3,0x5522,0x5523,0x550f,0x5511,0x5527,
       +0x552a,0x5567,0x558f,0x55b5,0x5549,0x556d,0x5541,0x5555,
       +0x553f,0x5550,0x553c,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5537,0x5556,0x5575,0x5576,0x5577,0x5533,0x5530,
       +0x555c,0x558b,0x55d2,0x5583,0x55b1,0x55b9,0x5588,0x5581,
       +0x559f,0x557e,0x55d6,0x5591,0x557b,0x55df,0x55bd,0x55be,
       +0x5594,0x5599,0x55ea,0x55f7,0x55c9,0x561f,0x55d1,0x55eb,
       +0x55ec,0x55d4,0x55e6,0x55dd,0x55c4,0x55ef,0x55e5,0x55f2,
       +0x55f3,0x55cc,0x55cd,0x55e8,0x55f5,0x55e4,0x8f94,0x561e,
       +0x5608,0x560c,0x5601,0x5624,0x5623,0x55fe,0x5600,0x5627,
       +0x562d,0x5658,0x5639,0x5657,0x562c,0x564d,0x5662,0x5659,
       +0x565c,0x564c,0x5654,0x5686,0x5664,0x5671,0x566b,0x567b,
       +0x567c,0x5685,0x5693,0x56af,0x56d4,0x56d7,0x56dd,0x56e1,
       +0x56f5,0x56eb,0x56f9,0x56ff,0x5704,0x570a,0x5709,0x571c,
       +0x5e0f,0x5e19,0x5e14,0x5e11,0x5e31,0x5e3b,0x5e3c,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5e37,0x5e44,0x5e54,
       +0x5e5b,0x5e5e,0x5e61,0x5c8c,0x5c7a,0x5c8d,0x5c90,0x5c96,
       +0x5c88,0x5c98,0x5c99,0x5c91,0x5c9a,0x5c9c,0x5cb5,0x5ca2,
       +0x5cbd,0x5cac,0x5cab,0x5cb1,0x5ca3,0x5cc1,0x5cb7,0x5cc4,
       +0x5cd2,0x5ce4,0x5ccb,0x5ce5,0x5d02,0x5d03,0x5d27,0x5d26,
       +0x5d2e,0x5d24,0x5d1e,0x5d06,0x5d1b,0x5d58,0x5d3e,0x5d34,
       +0x5d3d,0x5d6c,0x5d5b,0x5d6f,0x5d5d,0x5d6b,0x5d4b,0x5d4a,
       +0x5d69,0x5d74,0x5d82,0x5d99,0x5d9d,0x8c73,0x5db7,0x5dc5,
       +0x5f73,0x5f77,0x5f82,0x5f87,0x5f89,0x5f8c,0x5f95,0x5f99,
       +0x5f9c,0x5fa8,0x5fad,0x5fb5,0x5fbc,0x8862,0x5f61,0x72ad,
       +0x72b0,0x72b4,0x72b7,0x72b8,0x72c3,0x72c1,0x72ce,0x72cd,
       +0x72d2,0x72e8,0x72ef,0x72e9,0x72f2,0x72f4,0x72f7,0x7301,
       +0x72f3,0x7303,0x72fa,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x72fb,0x7317,0x7313,0x7321,0x730a,0x731e,0x731d,
       +0x7315,0x7322,0x7339,0x7325,0x732c,0x7338,0x7331,0x7350,
       +0x734d,0x7357,0x7360,0x736c,0x736f,0x737e,0x821b,0x5925,
       +0x98e7,0x5924,0x5902,0x9963,0x9967,0x9968,0x9969,0x996a,
       +0x996b,0x996c,0x9974,0x9977,0x997d,0x9980,0x9984,0x9987,
       +0x998a,0x998d,0x9990,0x9991,0x9993,0x9994,0x9995,0x5e80,
       +0x5e91,0x5e8b,0x5e96,0x5ea5,0x5ea0,0x5eb9,0x5eb5,0x5ebe,
       +0x5eb3,0x8d53,0x5ed2,0x5ed1,0x5edb,0x5ee8,0x5eea,0x81ba,
       +0x5fc4,0x5fc9,0x5fd6,0x5fcf,0x6003,0x5fee,0x6004,0x5fe1,
       +0x5fe4,0x5ffe,0x6005,0x6006,0x5fea,0x5fed,0x5ff8,0x6019,
       +0x6035,0x6026,0x601b,0x600f,0x600d,0x6029,0x602b,0x600a,
       +0x603f,0x6021,0x6078,0x6079,0x607b,0x607a,0x6042,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x606a,0x607d,0x6096,
       +0x609a,0x60ad,0x609d,0x6083,0x6092,0x608c,0x609b,0x60ec,
       +0x60bb,0x60b1,0x60dd,0x60d8,0x60c6,0x60da,0x60b4,0x6120,
       +0x6126,0x6115,0x6123,0x60f4,0x6100,0x610e,0x612b,0x614a,
       +0x6175,0x61ac,0x6194,0x61a7,0x61b7,0x61d4,0x61f5,0x5fdd,
       +0x96b3,0x95e9,0x95eb,0x95f1,0x95f3,0x95f5,0x95f6,0x95fc,
       +0x95fe,0x9603,0x9604,0x9606,0x9608,0x960a,0x960b,0x960c,
       +0x960d,0x960f,0x9612,0x9615,0x9616,0x9617,0x9619,0x961a,
       +0x4e2c,0x723f,0x6215,0x6c35,0x6c54,0x6c5c,0x6c4a,0x6ca3,
       +0x6c85,0x6c90,0x6c94,0x6c8c,0x6c68,0x6c69,0x6c74,0x6c76,
       +0x6c86,0x6ca9,0x6cd0,0x6cd4,0x6cad,0x6cf7,0x6cf8,0x6cf1,
       +0x6cd7,0x6cb2,0x6ce0,0x6cd6,0x6cfa,0x6ceb,0x6cee,0x6cb1,
       +0x6cd3,0x6cef,0x6cfe,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6d39,0x6d27,0x6d0c,0x6d43,0x6d48,0x6d07,0x6d04,
       +0x6d19,0x6d0e,0x6d2b,0x6d4d,0x6d2e,0x6d35,0x6d1a,0x6d4f,
       +0x6d52,0x6d54,0x6d33,0x6d91,0x6d6f,0x6d9e,0x6da0,0x6d5e,
       +0x6d93,0x6d94,0x6d5c,0x6d60,0x6d7c,0x6d63,0x6e1a,0x6dc7,
       +0x6dc5,0x6dde,0x6e0e,0x6dbf,0x6de0,0x6e11,0x6de6,0x6ddd,
       +0x6dd9,0x6e16,0x6dab,0x6e0c,0x6dae,0x6e2b,0x6e6e,0x6e4e,
       +0x6e6b,0x6eb2,0x6e5f,0x6e86,0x6e53,0x6e54,0x6e32,0x6e25,
       +0x6e44,0x6edf,0x6eb1,0x6e98,0x6ee0,0x6f2d,0x6ee2,0x6ea5,
       +0x6ea7,0x6ebd,0x6ebb,0x6eb7,0x6ed7,0x6eb4,0x6ecf,0x6e8f,
       +0x6ec2,0x6e9f,0x6f62,0x6f46,0x6f47,0x6f24,0x6f15,0x6ef9,
       +0x6f2f,0x6f36,0x6f4b,0x6f74,0x6f2a,0x6f09,0x6f29,0x6f89,
       +0x6f8d,0x6f8c,0x6f78,0x6f72,0x6f7c,0x6f7a,0x6fd1,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6fc9,0x6fa7,0x6fb9,
       +0x6fb6,0x6fc2,0x6fe1,0x6fee,0x6fde,0x6fe0,0x6fef,0x701a,
       +0x7023,0x701b,0x7039,0x7035,0x704f,0x705e,0x5b80,0x5b84,
       +0x5b95,0x5b93,0x5ba5,0x5bb8,0x752f,0x9a9e,0x6434,0x5be4,
       +0x5bee,0x8930,0x5bf0,0x8e47,0x8b07,0x8fb6,0x8fd3,0x8fd5,
       +0x8fe5,0x8fee,0x8fe4,0x8fe9,0x8fe6,0x8ff3,0x8fe8,0x9005,
       +0x9004,0x900b,0x9026,0x9011,0x900d,0x9016,0x9021,0x9035,
       +0x9036,0x902d,0x902f,0x9044,0x9051,0x9052,0x9050,0x9068,
       +0x9058,0x9062,0x905b,0x66b9,0x9074,0x907d,0x9082,0x9088,
       +0x9083,0x908b,0x5f50,0x5f57,0x5f56,0x5f58,0x5c3b,0x54ab,
       +0x5c50,0x5c59,0x5b71,0x5c63,0x5c66,0x7fbc,0x5f2a,0x5f29,
       +0x5f2d,0x8274,0x5f3c,0x9b3b,0x5c6e,0x5981,0x5983,0x598d,
       +0x59a9,0x59aa,0x59a3,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5997,0x59ca,0x59ab,0x599e,0x59a4,0x59d2,0x59b2,
       +0x59af,0x59d7,0x59be,0x5a05,0x5a06,0x59dd,0x5a08,0x59e3,
       +0x59d8,0x59f9,0x5a0c,0x5a09,0x5a32,0x5a34,0x5a11,0x5a23,
       +0x5a13,0x5a40,0x5a67,0x5a4a,0x5a55,0x5a3c,0x5a62,0x5a75,
       +0x80ec,0x5aaa,0x5a9b,0x5a77,0x5a7a,0x5abe,0x5aeb,0x5ab2,
       +0x5ad2,0x5ad4,0x5ab8,0x5ae0,0x5ae3,0x5af1,0x5ad6,0x5ae6,
       +0x5ad8,0x5adc,0x5b09,0x5b17,0x5b16,0x5b32,0x5b37,0x5b40,
       +0x5c15,0x5c1c,0x5b5a,0x5b65,0x5b73,0x5b51,0x5b53,0x5b62,
       +0x9a75,0x9a77,0x9a78,0x9a7a,0x9a7f,0x9a7d,0x9a80,0x9a81,
       +0x9a85,0x9a88,0x9a8a,0x9a90,0x9a92,0x9a93,0x9a96,0x9a98,
       +0x9a9b,0x9a9c,0x9a9d,0x9a9f,0x9aa0,0x9aa2,0x9aa3,0x9aa5,
       +0x9aa7,0x7e9f,0x7ea1,0x7ea3,0x7ea5,0x7ea8,0x7ea9,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x7ead,0x7eb0,0x7ebe,
       +0x7ec0,0x7ec1,0x7ec2,0x7ec9,0x7ecb,0x7ecc,0x7ed0,0x7ed4,
       +0x7ed7,0x7edb,0x7ee0,0x7ee1,0x7ee8,0x7eeb,0x7eee,0x7eef,
       +0x7ef1,0x7ef2,0x7f0d,0x7ef6,0x7efa,0x7efb,0x7efe,0x7f01,
       +0x7f02,0x7f03,0x7f07,0x7f08,0x7f0b,0x7f0c,0x7f0f,0x7f11,
       +0x7f12,0x7f17,0x7f19,0x7f1c,0x7f1b,0x7f1f,0x7f21,0x7f22,
       +0x7f23,0x7f24,0x7f25,0x7f26,0x7f27,0x7f2a,0x7f2b,0x7f2c,
       +0x7f2d,0x7f2f,0x7f30,0x7f31,0x7f32,0x7f33,0x7f35,0x5e7a,
       +0x757f,0x5ddb,0x753e,0x9095,0x738e,0x7391,0x73ae,0x73a2,
       +0x739f,0x73cf,0x73c2,0x73d1,0x73b7,0x73b3,0x73c0,0x73c9,
       +0x73c8,0x73e5,0x73d9,0x987c,0x740a,0x73e9,0x73e7,0x73de,
       +0x73ba,0x73f2,0x740f,0x742a,0x745b,0x7426,0x7425,0x7428,
       +0x7430,0x742e,0x742c,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x741b,0x741a,0x7441,0x745c,0x7457,0x7455,0x7459,
       +0x7477,0x746d,0x747e,0x749c,0x748e,0x7480,0x7481,0x7487,
       +0x748b,0x749e,0x74a8,0x74a9,0x7490,0x74a7,0x74d2,0x74ba,
       +0x97ea,0x97eb,0x97ec,0x674c,0x6753,0x675e,0x6748,0x6769,
       +0x67a5,0x6787,0x676a,0x6773,0x6798,0x67a7,0x6775,0x67a8,
       +0x679e,0x67ad,0x678b,0x6777,0x677c,0x67f0,0x6809,0x67d8,
       +0x680a,0x67e9,0x67b0,0x680c,0x67d9,0x67b5,0x67da,0x67b3,
       +0x67dd,0x6800,0x67c3,0x67b8,0x67e2,0x680e,0x67c1,0x67fd,
       +0x6832,0x6833,0x6860,0x6861,0x684e,0x6862,0x6844,0x6864,
       +0x6883,0x681d,0x6855,0x6866,0x6841,0x6867,0x6840,0x683e,
       +0x684a,0x6849,0x6829,0x68b5,0x688f,0x6874,0x6877,0x6893,
       +0x686b,0x68c2,0x696e,0x68fc,0x691f,0x6920,0x68f9,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6924,0x68f0,0x690b,
       +0x6901,0x6957,0x68e3,0x6910,0x6971,0x6939,0x6960,0x6942,
       +0x695d,0x6984,0x696b,0x6980,0x6998,0x6978,0x6934,0x69cc,
       +0x6987,0x6988,0x69ce,0x6989,0x6966,0x6963,0x6979,0x699b,
       +0x69a7,0x69bb,0x69ab,0x69ad,0x69d4,0x69b1,0x69c1,0x69ca,
       +0x69df,0x6995,0x69e0,0x698d,0x69ff,0x6a2f,0x69ed,0x6a17,
       +0x6a18,0x6a65,0x69f2,0x6a44,0x6a3e,0x6aa0,0x6a50,0x6a5b,
       +0x6a35,0x6a8e,0x6a79,0x6a3d,0x6a28,0x6a58,0x6a7c,0x6a91,
       +0x6a90,0x6aa9,0x6a97,0x6aab,0x7337,0x7352,0x6b81,0x6b82,
       +0x6b87,0x6b84,0x6b92,0x6b93,0x6b8d,0x6b9a,0x6b9b,0x6ba1,
       +0x6baa,0x8f6b,0x8f6d,0x8f71,0x8f72,0x8f73,0x8f75,0x8f76,
       +0x8f78,0x8f77,0x8f79,0x8f7a,0x8f7c,0x8f7e,0x8f81,0x8f82,
       +0x8f84,0x8f87,0x8f8b,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x8f8d,0x8f8e,0x8f8f,0x8f98,0x8f9a,0x8ece,0x620b,
       +0x6217,0x621b,0x621f,0x6222,0x6221,0x6225,0x6224,0x622c,
       +0x81e7,0x74ef,0x74f4,0x74ff,0x750f,0x7511,0x7513,0x6534,
       +0x65ee,0x65ef,0x65f0,0x660a,0x6619,0x6772,0x6603,0x6615,
       +0x6600,0x7085,0x66f7,0x661d,0x6634,0x6631,0x6636,0x6635,
       +0x8006,0x665f,0x6654,0x6641,0x664f,0x6656,0x6661,0x6657,
       +0x6677,0x6684,0x668c,0x66a7,0x669d,0x66be,0x66db,0x66dc,
       +0x66e6,0x66e9,0x8d32,0x8d33,0x8d36,0x8d3b,0x8d3d,0x8d40,
       +0x8d45,0x8d46,0x8d48,0x8d49,0x8d47,0x8d4d,0x8d55,0x8d59,
       +0x89c7,0x89ca,0x89cb,0x89cc,0x89ce,0x89cf,0x89d0,0x89d1,
       +0x726e,0x729f,0x725d,0x7266,0x726f,0x727e,0x727f,0x7284,
       +0x728b,0x728d,0x728f,0x7292,0x6308,0x6332,0x63b0,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x643f,0x64d8,0x8004,
       +0x6bea,0x6bf3,0x6bfd,0x6bf5,0x6bf9,0x6c05,0x6c07,0x6c06,
       +0x6c0d,0x6c15,0x6c18,0x6c19,0x6c1a,0x6c21,0x6c29,0x6c24,
       +0x6c2a,0x6c32,0x6535,0x6555,0x656b,0x724d,0x7252,0x7256,
       +0x7230,0x8662,0x5216,0x809f,0x809c,0x8093,0x80bc,0x670a,
       +0x80bd,0x80b1,0x80ab,0x80ad,0x80b4,0x80b7,0x80e7,0x80e8,
       +0x80e9,0x80ea,0x80db,0x80c2,0x80c4,0x80d9,0x80cd,0x80d7,
       +0x6710,0x80dd,0x80eb,0x80f1,0x80f4,0x80ed,0x810d,0x810e,
       +0x80f2,0x80fc,0x6715,0x8112,0x8c5a,0x8136,0x811e,0x812c,
       +0x8118,0x8132,0x8148,0x814c,0x8153,0x8174,0x8159,0x815a,
       +0x8171,0x8160,0x8169,0x817c,0x817d,0x816d,0x8167,0x584d,
       +0x5ab5,0x8188,0x8182,0x8191,0x6ed5,0x81a3,0x81aa,0x81cc,
       +0x6726,0x81ca,0x81bb,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x81c1,0x81a6,0x6b24,0x6b37,0x6b39,0x6b43,0x6b46,
       +0x6b59,0x98d1,0x98d2,0x98d3,0x98d5,0x98d9,0x98da,0x6bb3,
       +0x5f40,0x6bc2,0x89f3,0x6590,0x9f51,0x6593,0x65bc,0x65c6,
       +0x65c4,0x65c3,0x65cc,0x65ce,0x65d2,0x65d6,0x7080,0x709c,
       +0x7096,0x709d,0x70bb,0x70c0,0x70b7,0x70ab,0x70b1,0x70e8,
       +0x70ca,0x7110,0x7113,0x7116,0x712f,0x7131,0x7173,0x715c,
       +0x7168,0x7145,0x7172,0x714a,0x7178,0x717a,0x7198,0x71b3,
       +0x71b5,0x71a8,0x71a0,0x71e0,0x71d4,0x71e7,0x71f9,0x721d,
       +0x7228,0x706c,0x7118,0x7166,0x71b9,0x623e,0x623d,0x6243,
       +0x6248,0x6249,0x793b,0x7940,0x7946,0x7949,0x795b,0x795c,
       +0x7953,0x795a,0x7962,0x7957,0x7960,0x796f,0x7967,0x797a,
       +0x7985,0x798a,0x799a,0x79a7,0x79b3,0x5fd1,0x5fd0,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x603c,0x605d,0x605a,
       +0x6067,0x6041,0x6059,0x6063,0x60ab,0x6106,0x610d,0x615d,
       +0x61a9,0x619d,0x61cb,0x61d1,0x6206,0x8080,0x807f,0x6c93,
       +0x6cf6,0x6dfc,0x77f6,0x77f8,0x7800,0x7809,0x7817,0x7818,
       +0x7811,0x65ab,0x782d,0x781c,0x781d,0x7839,0x783a,0x783b,
       +0x781f,0x783c,0x7825,0x782c,0x7823,0x7829,0x784e,0x786d,
       +0x7856,0x7857,0x7826,0x7850,0x7847,0x784c,0x786a,0x789b,
       +0x7893,0x789a,0x7887,0x789c,0x78a1,0x78a3,0x78b2,0x78b9,
       +0x78a5,0x78d4,0x78d9,0x78c9,0x78ec,0x78f2,0x7905,0x78f4,
       +0x7913,0x7924,0x791e,0x7934,0x9f9b,0x9ef9,0x9efb,0x9efc,
       +0x76f1,0x7704,0x770d,0x76f9,0x7707,0x7708,0x771a,0x7722,
       +0x7719,0x772d,0x7726,0x7735,0x7738,0x7750,0x7751,0x7747,
       +0x7743,0x775a,0x7768,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7762,0x7765,0x777f,0x778d,0x777d,0x7780,0x778c,
       +0x7791,0x779f,0x77a0,0x77b0,0x77b5,0x77bd,0x753a,0x7540,
       +0x754e,0x754b,0x7548,0x755b,0x7572,0x7579,0x7583,0x7f58,
       +0x7f61,0x7f5f,0x8a48,0x7f68,0x7f74,0x7f71,0x7f79,0x7f81,
       +0x7f7e,0x76cd,0x76e5,0x8832,0x9485,0x9486,0x9487,0x948b,
       +0x948a,0x948c,0x948d,0x948f,0x9490,0x9494,0x9497,0x9495,
       +0x949a,0x949b,0x949c,0x94a3,0x94a4,0x94ab,0x94aa,0x94ad,
       +0x94ac,0x94af,0x94b0,0x94b2,0x94b4,0x94b6,0x94b7,0x94b8,
       +0x94b9,0x94ba,0x94bc,0x94bd,0x94bf,0x94c4,0x94c8,0x94c9,
       +0x94ca,0x94cb,0x94cc,0x94cd,0x94ce,0x94d0,0x94d1,0x94d2,
       +0x94d5,0x94d6,0x94d7,0x94d9,0x94d8,0x94db,0x94de,0x94df,
       +0x94e0,0x94e2,0x94e4,0x94e5,0x94e7,0x94e8,0x94ea,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x94e9,0x94eb,0x94ee,
       +0x94ef,0x94f3,0x94f4,0x94f5,0x94f7,0x94f9,0x94fc,0x94fd,
       +0x94ff,0x9503,0x9502,0x9506,0x9507,0x9509,0x950a,0x950d,
       +0x950e,0x950f,0x9512,0x9513,0x9514,0x9515,0x9516,0x9518,
       +0x951b,0x951d,0x951e,0x951f,0x9522,0x952a,0x952b,0x9529,
       +0x952c,0x9531,0x9532,0x9534,0x9536,0x9537,0x9538,0x953c,
       +0x953e,0x953f,0x9542,0x9535,0x9544,0x9545,0x9546,0x9549,
       +0x954c,0x954e,0x954f,0x9552,0x9553,0x9554,0x9556,0x9557,
       +0x9558,0x9559,0x955b,0x955e,0x955f,0x955d,0x9561,0x9562,
       +0x9564,0x9565,0x9566,0x9567,0x9568,0x9569,0x956a,0x956b,
       +0x956c,0x956f,0x9571,0x9572,0x9573,0x953a,0x77e7,0x77ec,
       +0x96c9,0x79d5,0x79ed,0x79e3,0x79eb,0x7a06,0x5d47,0x7a03,
       +0x7a02,0x7a1e,0x7a14,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7a39,0x7a37,0x7a51,0x9ecf,0x99a5,0x7a70,0x7688,
       +0x768e,0x7693,0x7699,0x76a4,0x74de,0x74e0,0x752c,0x9e20,
       +0x9e22,0x9e28,0x9e29,0x9e2a,0x9e2b,0x9e2c,0x9e32,0x9e31,
       +0x9e36,0x9e38,0x9e37,0x9e39,0x9e3a,0x9e3e,0x9e41,0x9e42,
       +0x9e44,0x9e46,0x9e47,0x9e48,0x9e49,0x9e4b,0x9e4c,0x9e4e,
       +0x9e51,0x9e55,0x9e57,0x9e5a,0x9e5b,0x9e5c,0x9e5e,0x9e63,
       +0x9e66,0x9e67,0x9e68,0x9e69,0x9e6a,0x9e6b,0x9e6c,0x9e71,
       +0x9e6d,0x9e73,0x7592,0x7594,0x7596,0x75a0,0x759d,0x75ac,
       +0x75a3,0x75b3,0x75b4,0x75b8,0x75c4,0x75b1,0x75b0,0x75c3,
       +0x75c2,0x75d6,0x75cd,0x75e3,0x75e8,0x75e6,0x75e4,0x75eb,
       +0x75e7,0x7603,0x75f1,0x75fc,0x75ff,0x7610,0x7600,0x7605,
       +0x760c,0x7617,0x760a,0x7625,0x7618,0x7615,0x7619,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x761b,0x763c,0x7622,
       +0x7620,0x7640,0x762d,0x7630,0x763f,0x7635,0x7643,0x763e,
       +0x7633,0x764d,0x765e,0x7654,0x765c,0x7656,0x766b,0x766f,
       +0x7fca,0x7ae6,0x7a78,0x7a79,0x7a80,0x7a86,0x7a88,0x7a95,
       +0x7aa6,0x7aa0,0x7aac,0x7aa8,0x7aad,0x7ab3,0x8864,0x8869,
       +0x8872,0x887d,0x887f,0x8882,0x88a2,0x88c6,0x88b7,0x88bc,
       +0x88c9,0x88e2,0x88ce,0x88e3,0x88e5,0x88f1,0x891a,0x88fc,
       +0x88e8,0x88fe,0x88f0,0x8921,0x8919,0x8913,0x891b,0x890a,
       +0x8934,0x892b,0x8936,0x8941,0x8966,0x897b,0x758b,0x80e5,
       +0x76b2,0x76b4,0x77dc,0x8012,0x8014,0x8016,0x801c,0x8020,
       +0x8022,0x8025,0x8026,0x8027,0x8029,0x8028,0x8031,0x800b,
       +0x8035,0x8043,0x8046,0x804d,0x8052,0x8069,0x8071,0x8983,
       +0x9878,0x9880,0x9883,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x9889,0x988c,0x988d,0x988f,0x9894,0x989a,0x989b,
       +0x989e,0x989f,0x98a1,0x98a2,0x98a5,0x98a6,0x864d,0x8654,
       +0x866c,0x866e,0x867f,0x867a,0x867c,0x867b,0x86a8,0x868d,
       +0x868b,0x86ac,0x869d,0x86a7,0x86a3,0x86aa,0x8693,0x86a9,
       +0x86b6,0x86c4,0x86b5,0x86ce,0x86b0,0x86ba,0x86b1,0x86af,
       +0x86c9,0x86cf,0x86b4,0x86e9,0x86f1,0x86f2,0x86ed,0x86f3,
       +0x86d0,0x8713,0x86de,0x86f4,0x86df,0x86d8,0x86d1,0x8703,
       +0x8707,0x86f8,0x8708,0x870a,0x870d,0x8709,0x8723,0x873b,
       +0x871e,0x8725,0x872e,0x871a,0x873e,0x8748,0x8734,0x8731,
       +0x8729,0x8737,0x873f,0x8782,0x8722,0x877d,0x877e,0x877b,
       +0x8760,0x8770,0x874c,0x876e,0x878b,0x8753,0x8763,0x877c,
       +0x8764,0x8759,0x8765,0x8793,0x87af,0x87a8,0x87d2,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x87c6,0x8788,0x8785,
       +0x87ad,0x8797,0x8783,0x87ab,0x87e5,0x87ac,0x87b5,0x87b3,
       +0x87cb,0x87d3,0x87bd,0x87d1,0x87c0,0x87ca,0x87db,0x87ea,
       +0x87e0,0x87ee,0x8816,0x8813,0x87fe,0x880a,0x881b,0x8821,
       +0x8839,0x883c,0x7f36,0x7f42,0x7f44,0x7f45,0x8210,0x7afa,
       +0x7afd,0x7b08,0x7b03,0x7b04,0x7b15,0x7b0a,0x7b2b,0x7b0f,
       +0x7b47,0x7b38,0x7b2a,0x7b19,0x7b2e,0x7b31,0x7b20,0x7b25,
       +0x7b24,0x7b33,0x7b3e,0x7b1e,0x7b58,0x7b5a,0x7b45,0x7b75,
       +0x7b4c,0x7b5d,0x7b60,0x7b6e,0x7b7b,0x7b62,0x7b72,0x7b71,
       +0x7b90,0x7ba6,0x7ba7,0x7bb8,0x7bac,0x7b9d,0x7ba8,0x7b85,
       +0x7baa,0x7b9c,0x7ba2,0x7bab,0x7bb4,0x7bd1,0x7bc1,0x7bcc,
       +0x7bdd,0x7bda,0x7be5,0x7be6,0x7bea,0x7c0c,0x7bfe,0x7bfc,
       +0x7c0f,0x7c16,0x7c0b,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7c1f,0x7c2a,0x7c26,0x7c38,0x7c41,0x7c40,0x81fe,
       +0x8201,0x8202,0x8204,0x81ec,0x8844,0x8221,0x8222,0x8223,
       +0x822d,0x822f,0x8228,0x822b,0x8238,0x823b,0x8233,0x8234,
       +0x823e,0x8244,0x8249,0x824b,0x824f,0x825a,0x825f,0x8268,
       +0x887e,0x8885,0x8888,0x88d8,0x88df,0x895e,0x7f9d,0x7f9f,
       +0x7fa7,0x7faf,0x7fb0,0x7fb2,0x7c7c,0x6549,0x7c91,0x7c9d,
       +0x7c9c,0x7c9e,0x7ca2,0x7cb2,0x7cbc,0x7cbd,0x7cc1,0x7cc7,
       +0x7ccc,0x7ccd,0x7cc8,0x7cc5,0x7cd7,0x7ce8,0x826e,0x66a8,
       +0x7fbf,0x7fce,0x7fd5,0x7fe5,0x7fe1,0x7fe6,0x7fe9,0x7fee,
       +0x7ff3,0x7cf8,0x7d77,0x7da6,0x7dae,0x7e47,0x7e9b,0x9eb8,
       +0x9eb4,0x8d73,0x8d84,0x8d94,0x8d91,0x8db1,0x8d67,0x8d6d,
       +0x8c47,0x8c49,0x914a,0x9150,0x914e,0x914f,0x9164,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9162,0x9161,0x9170,
       +0x9169,0x916f,0x917d,0x917e,0x9172,0x9174,0x9179,0x918c,
       +0x9185,0x9190,0x918d,0x9191,0x91a2,0x91a3,0x91aa,0x91ad,
       +0x91ae,0x91af,0x91b5,0x91b4,0x91ba,0x8c55,0x9e7e,0x8db8,
       +0x8deb,0x8e05,0x8e59,0x8e69,0x8db5,0x8dbf,0x8dbc,0x8dba,
       +0x8dc4,0x8dd6,0x8dd7,0x8dda,0x8dde,0x8dce,0x8dcf,0x8ddb,
       +0x8dc6,0x8dec,0x8df7,0x8df8,0x8de3,0x8df9,0x8dfb,0x8de4,
       +0x8e09,0x8dfd,0x8e14,0x8e1d,0x8e1f,0x8e2c,0x8e2e,0x8e23,
       +0x8e2f,0x8e3a,0x8e40,0x8e39,0x8e35,0x8e3d,0x8e31,0x8e49,
       +0x8e41,0x8e42,0x8e51,0x8e52,0x8e4a,0x8e70,0x8e76,0x8e7c,
       +0x8e6f,0x8e74,0x8e85,0x8e8f,0x8e94,0x8e90,0x8e9c,0x8e9e,
       +0x8c78,0x8c82,0x8c8a,0x8c85,0x8c98,0x8c94,0x659b,0x89d6,
       +0x89de,0x89da,0x89dc,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x89e5,0x89eb,0x89ef,0x8a3e,0x8b26,0x9753,0x96e9,
       +0x96f3,0x96ef,0x9706,0x9701,0x9708,0x970f,0x970e,0x972a,
       +0x972d,0x9730,0x973e,0x9f80,0x9f83,0x9f85,0x9f86,0x9f87,
       +0x9f88,0x9f89,0x9f8a,0x9f8c,0x9efe,0x9f0b,0x9f0d,0x96b9,
       +0x96bc,0x96bd,0x96ce,0x96d2,0x77bf,0x96e0,0x928e,0x92ae,
       +0x92c8,0x933e,0x936a,0x93ca,0x938f,0x943e,0x946b,0x9c7f,
       +0x9c82,0x9c85,0x9c86,0x9c87,0x9c88,0x7a23,0x9c8b,0x9c8e,
       +0x9c90,0x9c91,0x9c92,0x9c94,0x9c95,0x9c9a,0x9c9b,0x9c9e,
       +0x9c9f,0x9ca0,0x9ca1,0x9ca2,0x9ca3,0x9ca5,0x9ca6,0x9ca7,
       +0x9ca8,0x9ca9,0x9cab,0x9cad,0x9cae,0x9cb0,0x9cb1,0x9cb2,
       +0x9cb3,0x9cb4,0x9cb5,0x9cb6,0x9cb7,0x9cba,0x9cbb,0x9cbc,
       +0x9cbd,0x9cc4,0x9cc5,0x9cc6,0x9cc7,0x9cca,0x9ccb,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9ccc,0x9ccd,0x9cce,
       +0x9ccf,0x9cd0,0x9cd3,0x9cd4,0x9cd5,0x9cd7,0x9cd8,0x9cd9,
       +0x9cdc,0x9cdd,0x9cdf,0x9ce2,0x977c,0x9785,0x9791,0x9792,
       +0x9794,0x97af,0x97ab,0x97a3,0x97b2,0x97b4,0x9ab1,0x9ab0,
       +0x9ab7,0x9e58,0x9ab6,0x9aba,0x9abc,0x9ac1,0x9ac0,0x9ac5,
       +0x9ac2,0x9acb,0x9acc,0x9ad1,0x9b45,0x9b43,0x9b47,0x9b49,
       +0x9b48,0x9b4d,0x9b51,0x98e8,0x990d,0x992e,0x9955,0x9954,
       +0x9adf,0x9ae1,0x9ae6,0x9aef,0x9aeb,0x9afb,0x9aed,0x9af9,
       +0x9b08,0x9b0f,0x9b13,0x9b1f,0x9b23,0x9ebd,0x9ebe,0x7e3b,
       +0x9e82,0x9e87,0x9e88,0x9e8b,0x9e92,0x93d6,0x9e9d,0x9e9f,
       +0x9edb,0x9edc,0x9edd,0x9ee0,0x9edf,0x9ee2,0x9ee9,0x9ee7,
       +0x9ee5,0x9eea,0x9eef,0x9f22,0x9f2c,0x9f2f,0x9f39,0x9f37,
       +0x9f3d,0x9f3e,0x9f44,
       +};
 (DIR) diff --git a/src/cmd/dict/gefix b/src/cmd/dict/gefix
       t@@ -0,0 +1,23 @@
       +#!/bin/rc
       +
       +sed '
       +        s/[         ]+$//
       +        /        /!d
       +        s/\\N''349''//g
       +        s/''//g
       +        s/        -/        /
       +        s/-$//
       +        /\([^,) ]+(\)|$)/{; h; s///; p; g; s/\(//; s/\)//; }
       +        /\(r, s\)$/{; s///; p; s/$/r/; p; s/r$/s/; }
       +' $1 |
       +sed '
       +        /\([^,) ]+(\)|$)/{; h; s///; p; g; s/\(//; s/\)//; }
       +        /\(r, s\)$/{; s///; p; s/$/r/; p; s/r$/s/; }
       +' |
       +sed '/ß/{; p; s/ß/ss/g; }' |
       +awk '
       +BEGIN        { FS = "        |, " }
       +        { for(i=2; i<=NF; i++)print $i "        " $1 }
       +' |
       +tr A-Z a-z |
       +sort -u -t'        ' +0f -1 +0 -1 +1n -2
 (DIR) diff --git a/src/cmd/dict/getneeds b/src/cmd/dict/getneeds
       t@@ -0,0 +1,8 @@
       +#!/bin/rc
       +for (x in spec tag aux status) {
       +        grep ' '^$x^' ' $1 > junk1
       +        sort +4 -5 +3n -4 junk1 > junk2
       +        awk '{if ($5 != prev) print $0; prev = $5}' junk2 > junk3
       +        sort -n +2 -3 junk3 > need$x
       +        rm junk*
       +}
 (DIR) diff --git a/src/cmd/dict/jis208.c b/src/cmd/dict/jis208.c
       t@@ -0,0 +1,1059 @@
       +#include <u.h>
       +#include <libc.h>
       +#include "kuten.h"
       +
       +#define        NONE        0xffff
       +
       +Rune tabjis208[JIS208MAX] = {
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x3000,0x3001,0x3002,
       +0xff0c,0xff0e,0x30fb,0xff1a,0xff1b,0xff1f,0xff01,0x309b,
       +0x309c,0x00b4,0xff40,0x00a8,0xff3e,0x203e,0xff3f,0x30fd,
       +0x30fe,0x309d,0x309e,0x3003,0x4edd,0x3005,0x3006,0x3007,
       +0x30fc,0x2015,0x00ad,0xff0f,0xff3c,0xff5e,0x2225,0xff5c,
       +0x2026,0x2025,0x2018,0x2019,0x201c,0x201d,0xff08,0xff09,
       +0x3014,0x3015,0xff3b,0xff3d,0xff5b,0xff5d,0x3008,0x3009,
       +0x300a,0x300b,0x300c,0x300d,0x300e,0x300f,0x3010,0x3011,
       +0xff0b,0xff0d,0x00b1,0x00d7,0x00f7,0xff1d,0x2260,0xff1c,
       +0xff1e,0x2264,0x2265,0x221e,0x2234,0x2642,0x2640,0x00b0,
       +0x2032,0x2033,0x2103,0x00a5,0xff04,0x00a2,0x00a3,0xff05,
       +0xff03,0xff06,0xff0a,0xff20,0x00a7,0x2606,0x2605,0x25cb,
       +0x25cf,0x25ce,0x25c7,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x25c6,0x25a1,0x25a0,0x25b3,0x25b2,0x25bd,0x25bc,
       +0x203b,0x3012,0x2192,0x2190,0x2191,0x2193,0x3013,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,0x2208,0x220b,0x2286,0x2287,0x2282,0x2283,
       +0x222a,0x2229,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,0x2227,0x2228,0x00ac,0x21d2,0x21d4,0x2200,
       +0x2203,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,0x2220,0x22a5,0x2040,0x2202,
       +0x2207,0x2261,0x2252,0x226a,0x226b,0x221a,0x224c,0x221d,
       +0x2235,0x222b,0x222c,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,0x212b,0x2030,0x266f,0x266d,0x266a,0x2020,
       +0x2021,0x00b6,  NONE,  NONE,  NONE,  NONE,0x20dd,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,0xff10,0xff11,0xff12,0xff13,
       +0xff14,0xff15,0xff16,0xff17,0xff18,0xff19,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,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,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,
       +0x0398,0x0399,0x039a,0x039b,0x039c,0x039d,0x039e,0x039f,
       +0x03a0,0x03a1,0x03a3,0x03a4,0x03a5,0x03a6,0x03a7,0x03a8,
       +0x03a9,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,
       +0x03b8,0x03b9,0x03ba,0x03bb,0x03bc,0x03bd,0x03be,0x03bf,
       +0x03c0,0x03c1,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,
       +0x03c9,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,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,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x2500,0x2502,0x250c,0x2510,0x2518,0x2514,0x251c,
       +0x252c,0x2524,0x2534,0x253c,0x2501,0x2503,0x250f,0x2513,
       +0x251b,0x2517,0x2523,0x2533,0x252b,0x253b,0x254b,0x2520,
       +0x252f,0x2528,0x2537,0x253f,0x251d,0x2530,0x2525,0x2538,
       +0x2542,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x4e9c,0x5516,0x5a03,0x963f,0x54c0,0x611b,0x6328,
       +0x59f6,0x9022,0x8475,0x831c,0x7a50,0x60aa,0x63e1,0x6e25,
       +0x65ed,0x8466,0x82a6,0x9bf5,0x6893,0x5727,0x65a1,0x6271,
       +0x5b9b,0x59d0,0x867b,0x98f4,0x7d62,0x7dbe,0x9b8e,0x6216,
       +0x7c9f,0x88b7,0x5b89,0x5eb5,0x6309,0x6697,0x6848,0x95c7,
       +0x978d,0x674f,0x4ee5,0x4f0a,0x4f4d,0x4f9d,0x5049,0x56f2,
       +0x5937,0x59d4,0x5a01,0x5c09,0x60df,0x610f,0x6170,0x6613,
       +0x6905,0x70ba,0x754f,0x7570,0x79fb,0x7dad,0x7def,0x80c3,
       +0x840e,0x8863,0x8b02,0x9055,0x907a,0x533b,0x4e95,0x4ea5,
       +0x57df,0x80b2,0x90c1,0x78ef,0x4e00,0x58f1,0x6ea2,0x9038,
       +0x7a32,0x8328,0x828b,0x9c2f,0x5141,0x5370,0x54bd,0x54e1,
       +0x56e0,0x59fb,0x5f15,0x98f2,0x6deb,0x80e4,0x852d,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9662,0x9670,0x96a0,
       +0x97fb,0x540b,0x53f3,0x5b87,0x70cf,0x7fbd,0x8fc2,0x96e8,
       +0x536f,0x9d5c,0x7aba,0x4e11,0x7893,0x81fc,0x6e26,0x5618,
       +0x5504,0x6b1d,0x851a,0x9c3b,0x59e5,0x53a9,0x6d66,0x74dc,
       +0x958f,0x5642,0x4e91,0x904b,0x96f2,0x834f,0x990c,0x53e1,
       +0x55b6,0x5b30,0x5f71,0x6620,0x66f3,0x6804,0x6c38,0x6cf3,
       +0x6d29,0x745b,0x76c8,0x7a4e,0x9834,0x82f1,0x885b,0x8a60,
       +0x92ed,0x6db2,0x75ab,0x76ca,0x99c5,0x60a6,0x8b01,0x8d8a,
       +0x95b2,0x698e,0x53ad,0x5186,0x5712,0x5830,0x5944,0x5bb4,
       +0x5ef6,0x6028,0x63a9,0x63f4,0x6cbf,0x6f14,0x708e,0x7114,
       +0x7159,0x71d5,0x733f,0x7e01,0x8276,0x82d1,0x8597,0x9060,
       +0x925b,0x9d1b,0x5869,0x65bc,0x6c5a,0x7525,0x51f9,0x592e,
       +0x5965,0x5f80,0x5fdc,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x62bc,0x65fa,0x6a2a,0x6b27,0x6bb4,0x738b,0x7fc1,
       +0x8956,0x9d2c,0x9d0e,0x9ec4,0x5ca1,0x6c96,0x837b,0x5104,
       +0x5c4b,0x61b6,0x81c6,0x6876,0x7261,0x4e59,0x4ffa,0x5378,
       +0x6069,0x6e29,0x7a4f,0x97f3,0x4e0b,0x5316,0x4eee,0x4f55,
       +0x4f3d,0x4fa1,0x4f73,0x52a0,0x53ef,0x5609,0x590f,0x5ac1,
       +0x5bb6,0x5be1,0x79d1,0x6687,0x679c,0x67b6,0x6b4c,0x6cb3,
       +0x706b,0x73c2,0x798d,0x79be,0x7a3c,0x7b87,0x82b1,0x82db,
       +0x8304,0x8377,0x83ef,0x83d3,0x8766,0x8ab2,0x5629,0x8ca8,
       +0x8fe6,0x904e,0x971e,0x868a,0x4fc4,0x5ce8,0x6211,0x7259,
       +0x753b,0x81e5,0x82bd,0x86fe,0x8cc0,0x96c5,0x9913,0x99d5,
       +0x4ecb,0x4f1a,0x89e3,0x56de,0x584a,0x58ca,0x5efb,0x5feb,
       +0x602a,0x6094,0x6062,0x61d0,0x6212,0x62d0,0x6539,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9b41,0x6666,0x68b0,
       +0x6d77,0x7070,0x754c,0x7686,0x7d75,0x82a5,0x87f9,0x958b,
       +0x968e,0x8c9d,0x51f1,0x52be,0x5916,0x54b3,0x5bb3,0x5d16,
       +0x6168,0x6982,0x6daf,0x788d,0x84cb,0x8857,0x8a72,0x93a7,
       +0x9ab8,0x6d6c,0x99a8,0x86d9,0x57a3,0x67ff,0x86ce,0x920e,
       +0x5283,0x5687,0x5404,0x5ed3,0x62e1,0x64b9,0x683c,0x6838,
       +0x6bbb,0x7372,0x78ba,0x7a6b,0x899a,0x89d2,0x8d6b,0x8f03,
       +0x90ed,0x95a3,0x9694,0x9769,0x5b66,0x5cb3,0x697d,0x984d,
       +0x984e,0x639b,0x7b20,0x6a2b,0x6a7f,0x68b6,0x9c0d,0x6f5f,
       +0x5272,0x559d,0x6070,0x62ec,0x6d3b,0x6e07,0x6ed1,0x845b,
       +0x8910,0x8f44,0x4e14,0x9c39,0x53f6,0x691b,0x6a3a,0x9784,
       +0x682a,0x515c,0x7ac3,0x84b2,0x91dc,0x938c,0x565b,0x9d28,
       +0x6822,0x8305,0x8431,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7ca5,0x5208,0x82c5,0x74e6,0x4e7e,0x4f83,0x51a0,
       +0x5bd2,0x520a,0x52d8,0x52e7,0x5dfb,0x559a,0x582a,0x59e6,
       +0x5b8c,0x5b98,0x5bdb,0x5e72,0x5e79,0x60a3,0x611f,0x6163,
       +0x61be,0x63db,0x6562,0x67d1,0x6853,0x68fa,0x6b3e,0x6b53,
       +0x6c57,0x6f22,0x6f97,0x6f45,0x74b0,0x7518,0x76e3,0x770b,
       +0x7aff,0x7ba1,0x7c21,0x7de9,0x7f36,0x7ff0,0x809d,0x8266,
       +0x839e,0x89b3,0x8acc,0x8cab,0x9084,0x9451,0x9593,0x9591,
       +0x95a2,0x9665,0x97d3,0x9928,0x8218,0x4e38,0x542b,0x5cb8,
       +0x5dcc,0x73a9,0x764c,0x773c,0x5ca9,0x7feb,0x8d0b,0x96c1,
       +0x9811,0x9854,0x9858,0x4f01,0x4f0e,0x5371,0x559c,0x5668,
       +0x57fa,0x5947,0x5b09,0x5bc4,0x5c90,0x5e0c,0x5e7e,0x5fcc,
       +0x63ee,0x673a,0x65d7,0x65e2,0x671f,0x68cb,0x68c4,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6a5f,0x5e30,0x6bc5,
       +0x6c17,0x6c7d,0x757f,0x7948,0x5b63,0x7a00,0x7d00,0x5fbd,
       +0x898f,0x8a18,0x8cb4,0x8d77,0x8ecc,0x8f1d,0x98e2,0x9a0e,
       +0x9b3c,0x4e80,0x507d,0x5100,0x5993,0x5b9c,0x622f,0x6280,
       +0x64ec,0x6b3a,0x72a0,0x7591,0x7947,0x7fa9,0x87fb,0x8abc,
       +0x8b70,0x63ac,0x83ca,0x97a0,0x5409,0x5403,0x55ab,0x6854,
       +0x6a58,0x8a70,0x7827,0x6775,0x9ecd,0x5374,0x5ba2,0x811a,
       +0x8650,0x9006,0x4e18,0x4e45,0x4ec7,0x4f11,0x53ca,0x5438,
       +0x5bae,0x5f13,0x6025,0x6551,0x673d,0x6c42,0x6c72,0x6ce3,
       +0x7078,0x7403,0x7a76,0x7aae,0x7b08,0x7d1a,0x7cfe,0x7d66,
       +0x65e7,0x725b,0x53bb,0x5c45,0x5de8,0x62d2,0x62e0,0x6319,
       +0x6e20,0x865a,0x8a31,0x8ddd,0x92f8,0x6f01,0x79a6,0x9b5a,
       +0x4ea8,0x4eab,0x4eac,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x4f9b,0x4fa0,0x50d1,0x5147,0x7af6,0x5171,0x51f6,
       +0x5354,0x5321,0x537f,0x53eb,0x55ac,0x5883,0x5ce1,0x5f37,
       +0x5f4a,0x602f,0x6050,0x606d,0x631f,0x6559,0x6a4b,0x6cc1,
       +0x72c2,0x72ed,0x77ef,0x80f8,0x8105,0x8208,0x854e,0x90f7,
       +0x93e1,0x97ff,0x9957,0x9a5a,0x4ef0,0x51dd,0x5c2d,0x6681,
       +0x696d,0x5c40,0x66f2,0x6975,0x7389,0x6850,0x7c81,0x50c5,
       +0x52e4,0x5747,0x5dfe,0x9326,0x65a4,0x6b23,0x6b3d,0x7434,
       +0x7981,0x79bd,0x7b4b,0x7dca,0x82b9,0x83cc,0x887f,0x895f,
       +0x8b39,0x8fd1,0x91d1,0x541f,0x9280,0x4e5d,0x5036,0x53e5,
       +0x533a,0x72d7,0x7396,0x77e9,0x82e6,0x8eaf,0x99c6,0x99c8,
       +0x99d2,0x5177,0x611a,0x865e,0x55b0,0x7a7a,0x5076,0x5bd3,
       +0x9047,0x9685,0x4e32,0x6adb,0x91e7,0x5c51,0x5c48,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6398,0x7a9f,0x6c93,
       +0x9774,0x8f61,0x7aaa,0x718a,0x9688,0x7c82,0x6817,0x7e70,
       +0x6851,0x936c,0x52f2,0x541b,0x85ab,0x8a13,0x7fa4,0x8ecd,
       +0x90e1,0x5366,0x8888,0x7941,0x4fc2,0x50be,0x5211,0x5144,
       +0x5553,0x572d,0x73ea,0x578b,0x5951,0x5f62,0x5f84,0x6075,
       +0x6176,0x6167,0x61a9,0x63b2,0x643a,0x656c,0x666f,0x6842,
       +0x6e13,0x7566,0x7a3d,0x7cfb,0x7d4c,0x7d99,0x7e4b,0x7f6b,
       +0x830e,0x834a,0x86cd,0x8a08,0x8a63,0x8b66,0x8efd,0x981a,
       +0x9d8f,0x82b8,0x8fce,0x9be8,0x5287,0x621f,0x6483,0x6fc0,
       +0x9699,0x6841,0x5091,0x6b20,0x6c7a,0x6f54,0x7a74,0x7d50,
       +0x8840,0x8a23,0x6708,0x4ef6,0x5039,0x5026,0x5065,0x517c,
       +0x5238,0x5263,0x55a7,0x570f,0x5805,0x5acc,0x5efa,0x61b2,
       +0x61f8,0x62f3,0x6372,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x691c,0x6a29,0x727d,0x72ac,0x732e,0x7814,0x786f,
       +0x7d79,0x770c,0x80a9,0x898b,0x8b19,0x8ce2,0x8ed2,0x9063,
       +0x9375,0x967a,0x9855,0x9a13,0x9e78,0x5143,0x539f,0x53b3,
       +0x5e7b,0x5f26,0x6e1b,0x6e90,0x7384,0x73fe,0x7d43,0x8237,
       +0x8a00,0x8afa,0x9650,0x4e4e,0x500b,0x53e4,0x547c,0x56fa,
       +0x59d1,0x5b64,0x5df1,0x5eab,0x5f27,0x6238,0x6545,0x67af,
       +0x6e56,0x72d0,0x7cca,0x88b4,0x80a1,0x80e1,0x83f0,0x864e,
       +0x8a87,0x8de8,0x9237,0x96c7,0x9867,0x9f13,0x4e94,0x4e92,
       +0x4f0d,0x5348,0x5449,0x543e,0x5a2f,0x5f8c,0x5fa1,0x609f,
       +0x68a7,0x6a8e,0x745a,0x7881,0x8a9e,0x8aa4,0x8b77,0x9190,
       +0x4e5e,0x9bc9,0x4ea4,0x4f7c,0x4faf,0x5019,0x5016,0x5149,
       +0x516c,0x529f,0x52b9,0x52fe,0x539a,0x53e3,0x5411,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x540e,0x5589,0x5751,
       +0x57a2,0x597d,0x5b54,0x5b5d,0x5b8f,0x5de5,0x5de7,0x5df7,
       +0x5e78,0x5e83,0x5e9a,0x5eb7,0x5f18,0x6052,0x614c,0x6297,
       +0x62d8,0x63a7,0x653b,0x6602,0x6643,0x66f4,0x676d,0x6821,
       +0x6897,0x69cb,0x6c5f,0x6d2a,0x6d69,0x6e2f,0x6e9d,0x7532,
       +0x7687,0x786c,0x7a3f,0x7ce0,0x7d05,0x7d18,0x7d5e,0x7db1,
       +0x8015,0x8003,0x80af,0x80b1,0x8154,0x818f,0x822a,0x8352,
       +0x884c,0x8861,0x8b1b,0x8ca2,0x8cfc,0x90ca,0x9175,0x9271,
       +0x783f,0x92fc,0x95a4,0x964d,0x9805,0x9999,0x9ad8,0x9d3b,
       +0x525b,0x52ab,0x53f7,0x5408,0x58d5,0x62f7,0x6fe0,0x8c6a,
       +0x8f5f,0x9eb9,0x514b,0x523b,0x544a,0x56fd,0x7a40,0x9177,
       +0x9d60,0x9ed2,0x7344,0x6f09,0x8170,0x7511,0x5ffd,0x60da,
       +0x9aa8,0x72db,0x8fbc,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6b64,0x9803,0x4eca,0x56f0,0x5764,0x58be,0x5a5a,
       +0x6068,0x61c7,0x660f,0x6606,0x6839,0x68b1,0x6df7,0x75d5,
       +0x7d3a,0x826e,0x9b42,0x4e9b,0x4f50,0x53c9,0x5506,0x5d6f,
       +0x5de6,0x5dee,0x67fb,0x6c99,0x7473,0x7802,0x8a50,0x9396,
       +0x88df,0x5750,0x5ea7,0x632b,0x50b5,0x50ac,0x518d,0x6700,
       +0x54c9,0x585e,0x59bb,0x5bb0,0x5f69,0x624d,0x63a1,0x683d,
       +0x6b73,0x6e08,0x707d,0x91c7,0x7280,0x7815,0x7826,0x796d,
       +0x658e,0x7d30,0x83dc,0x88c1,0x8f09,0x969b,0x5264,0x5728,
       +0x6750,0x7f6a,0x8ca1,0x51b4,0x5742,0x962a,0x583a,0x698a,
       +0x80b4,0x54b2,0x5d0e,0x57fc,0x7895,0x9dfa,0x4f5c,0x524a,
       +0x548b,0x643e,0x6628,0x6714,0x67f5,0x7a84,0x7b56,0x7d22,
       +0x932f,0x685c,0x9bad,0x7b39,0x5319,0x518a,0x5237,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5bdf,0x62f6,0x64ae,
       +0x64e6,0x672d,0x6bba,0x85a9,0x96d1,0x7690,0x9bd6,0x634c,
       +0x9306,0x9bab,0x76bf,0x6652,0x4e09,0x5098,0x53c2,0x5c71,
       +0x60e8,0x6492,0x6563,0x685f,0x71e6,0x73ca,0x7523,0x7b97,
       +0x7e82,0x8695,0x8b83,0x8cdb,0x9178,0x9910,0x65ac,0x66ab,
       +0x6b8b,0x4ed5,0x4ed4,0x4f3a,0x4f7f,0x523a,0x53f8,0x53f2,
       +0x55e3,0x56db,0x58eb,0x59cb,0x59c9,0x59ff,0x5b50,0x5c4d,
       +0x5e02,0x5e2b,0x5fd7,0x601d,0x6307,0x652f,0x5b5c,0x65af,
       +0x65bd,0x65e8,0x679d,0x6b62,0x6b7b,0x6c0f,0x7345,0x7949,
       +0x79c1,0x7cf8,0x7d19,0x7d2b,0x80a2,0x8102,0x81f3,0x8996,
       +0x8a5e,0x8a69,0x8a66,0x8a8c,0x8aee,0x8cc7,0x8cdc,0x96cc,
       +0x98fc,0x6b6f,0x4e8b,0x4f3c,0x4f8d,0x5150,0x5b57,0x5bfa,
       +0x6148,0x6301,0x6642,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6b21,0x6ecb,0x6cbb,0x723e,0x74bd,0x75d4,0x78c1,
       +0x793a,0x800c,0x8033,0x81ea,0x8494,0x8f9e,0x6c50,0x9e7f,
       +0x5f0f,0x8b58,0x9d2b,0x7afa,0x8ef8,0x5b8d,0x96eb,0x4e03,
       +0x53f1,0x57f7,0x5931,0x5ac9,0x5ba4,0x6089,0x6e7f,0x6f06,
       +0x75be,0x8cea,0x5b9f,0x8500,0x7be0,0x5072,0x67f4,0x829d,
       +0x5c61,0x854a,0x7e1e,0x820e,0x5199,0x5c04,0x6368,0x8d66,
       +0x659c,0x716e,0x793e,0x7d17,0x8005,0x8b1d,0x8eca,0x906e,
       +0x86c7,0x90aa,0x501f,0x52fa,0x5c3a,0x6753,0x707c,0x7235,
       +0x914c,0x91c8,0x932b,0x82e5,0x5bc2,0x5f31,0x60f9,0x4e3b,
       +0x53d6,0x5b88,0x624b,0x6731,0x6b8a,0x72e9,0x73e0,0x7a2e,
       +0x816b,0x8da3,0x9152,0x9996,0x5112,0x53d7,0x546a,0x5bff,
       +0x6388,0x6a39,0x7dac,0x9700,0x56da,0x53ce,0x5468,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5b97,0x5c31,0x5dde,
       +0x4fee,0x6101,0x62fe,0x6d32,0x79c0,0x79cb,0x7d42,0x7e4d,
       +0x7fd2,0x81ed,0x821f,0x8490,0x8846,0x8972,0x8b90,0x8e74,
       +0x8f2f,0x9031,0x914b,0x916c,0x96c6,0x919c,0x4ec0,0x4f4f,
       +0x5145,0x5341,0x5f93,0x620e,0x67d4,0x6c41,0x6e0b,0x7363,
       +0x7e26,0x91cd,0x9283,0x53d4,0x5919,0x5bbf,0x6dd1,0x795d,
       +0x7e2e,0x7c9b,0x587e,0x719f,0x51fa,0x8853,0x8ff0,0x4fca,
       +0x5cfb,0x6625,0x77ac,0x7ae3,0x821c,0x99ff,0x51c6,0x5faa,
       +0x65ec,0x696f,0x6b89,0x6df3,0x6e96,0x6f64,0x76fe,0x7d14,
       +0x5de1,0x9075,0x9187,0x9806,0x51e6,0x521d,0x6240,0x6691,
       +0x66d9,0x6e1a,0x5eb6,0x7dd2,0x7f72,0x66f8,0x85af,0x85f7,
       +0x8af8,0x52a9,0x53d9,0x5973,0x5e8f,0x5f90,0x6055,0x92e4,
       +0x9664,0x50b7,0x511f,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x52dd,0x5320,0x5347,0x53ec,0x54e8,0x5546,0x5531,
       +0x5617,0x5968,0x59be,0x5a3c,0x5bb5,0x5c06,0x5c0f,0x5c11,
       +0x5c1a,0x5e84,0x5e8a,0x5ee0,0x5f70,0x627f,0x6284,0x62db,
       +0x638c,0x6377,0x6607,0x660c,0x662d,0x6676,0x677e,0x68a2,
       +0x6a1f,0x6a35,0x6cbc,0x6d88,0x6e09,0x6e58,0x713c,0x7126,
       +0x7167,0x75c7,0x7701,0x785d,0x7901,0x7965,0x79f0,0x7ae0,
       +0x7b11,0x7ca7,0x7d39,0x8096,0x83d6,0x848b,0x8549,0x885d,
       +0x88f3,0x8a1f,0x8a3c,0x8a54,0x8a73,0x8c61,0x8cde,0x91a4,
       +0x9266,0x937e,0x9418,0x969c,0x9798,0x4e0a,0x4e08,0x4e1e,
       +0x4e57,0x5197,0x5270,0x57ce,0x5834,0x58cc,0x5b22,0x5e38,
       +0x60c5,0x64fe,0x6761,0x6756,0x6d44,0x72b6,0x7573,0x7a63,
       +0x84b8,0x8b72,0x91b8,0x9320,0x5631,0x57f4,0x98fe,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x62ed,0x690d,0x6b96,
       +0x71ed,0x7e54,0x8077,0x8272,0x89e6,0x98df,0x8755,0x8fb1,
       +0x5c3b,0x4f38,0x4fe1,0x4fb5,0x5507,0x5a20,0x5bdd,0x5be9,
       +0x5fc3,0x614e,0x632f,0x65b0,0x664b,0x68ee,0x699b,0x6d78,
       +0x6df1,0x7533,0x75b9,0x771f,0x795e,0x79e6,0x7d33,0x81e3,
       +0x82af,0x85aa,0x89aa,0x8a3a,0x8eab,0x8f9b,0x9032,0x91dd,
       +0x9707,0x4eba,0x4ec1,0x5203,0x5875,0x58ec,0x5c0b,0x751a,
       +0x5c3d,0x814e,0x8a0a,0x8fc5,0x9663,0x976d,0x7b25,0x8acf,
       +0x9808,0x9162,0x56f3,0x53a8,0x9017,0x5439,0x5782,0x5e25,
       +0x63a8,0x6c34,0x708a,0x7761,0x7c8b,0x7fe0,0x8870,0x9042,
       +0x9154,0x9310,0x9318,0x968f,0x745e,0x9ac4,0x5d07,0x5d69,
       +0x6570,0x67a2,0x8da8,0x96db,0x636e,0x6749,0x6919,0x83c5,
       +0x9817,0x96c0,0x88fe,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6f84,0x647a,0x5bf8,0x4e16,0x702c,0x755d,0x662f,
       +0x51c4,0x5236,0x52e2,0x59d3,0x5f81,0x6027,0x6210,0x653f,
       +0x6574,0x661f,0x6674,0x68f2,0x6816,0x6b63,0x6e05,0x7272,
       +0x751f,0x76db,0x7cbe,0x8056,0x58f0,0x88fd,0x897f,0x8aa0,
       +0x8a93,0x8acb,0x901d,0x9192,0x9752,0x9759,0x6589,0x7a0e,
       +0x8106,0x96bb,0x5e2d,0x60dc,0x621a,0x65a5,0x6614,0x6790,
       +0x77f3,0x7a4d,0x7c4d,0x7e3e,0x810a,0x8cac,0x8d64,0x8de1,
       +0x8e5f,0x78a9,0x5207,0x62d9,0x63a5,0x6442,0x6298,0x8a2d,
       +0x7a83,0x7bc0,0x8aac,0x96ea,0x7d76,0x820c,0x8749,0x4ed9,
       +0x5148,0x5343,0x5360,0x5ba3,0x5c02,0x5c16,0x5ddd,0x6226,
       +0x6247,0x64b0,0x6813,0x6834,0x6cc9,0x6d45,0x6d17,0x67d3,
       +0x6f5c,0x714e,0x717d,0x65cb,0x7a7f,0x7bad,0x7dda,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x7e4a,0x7fa8,0x817a,
       +0x821b,0x8239,0x85a6,0x8a6e,0x8cce,0x8df5,0x9078,0x9077,
       +0x92ad,0x9291,0x9583,0x9bae,0x524d,0x5584,0x6f38,0x7136,
       +0x5168,0x7985,0x7e55,0x81b3,0x7cce,0x564c,0x5851,0x5ca8,
       +0x63aa,0x66fe,0x66fd,0x695a,0x72d9,0x758f,0x758e,0x790e,
       +0x7956,0x79df,0x7c97,0x7d20,0x7d44,0x8607,0x8a34,0x963b,
       +0x9061,0x9f20,0x50e7,0x5275,0x53cc,0x53e2,0x5009,0x55aa,
       +0x58ee,0x594f,0x723d,0x5b8b,0x5c64,0x531d,0x60e3,0x60f3,
       +0x635c,0x6383,0x633f,0x63bb,0x64cd,0x65e9,0x66f9,0x5de3,
       +0x69cd,0x69fd,0x6f15,0x71e5,0x4e89,0x75e9,0x76f8,0x7a93,
       +0x7cdf,0x7dcf,0x7d9c,0x8061,0x8349,0x8358,0x846c,0x84bc,
       +0x85fb,0x88c5,0x8d70,0x9001,0x906d,0x9397,0x971c,0x9a12,
       +0x50cf,0x5897,0x618e,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x81d3,0x8535,0x8d08,0x9020,0x4fc3,0x5074,0x5247,
       +0x5373,0x606f,0x6349,0x675f,0x6e2c,0x8db3,0x901f,0x4fd7,
       +0x5c5e,0x8cca,0x65cf,0x7d9a,0x5352,0x8896,0x5176,0x63c3,
       +0x5b58,0x5b6b,0x5c0a,0x640d,0x6751,0x905c,0x4ed6,0x591a,
       +0x592a,0x6c70,0x8a51,0x553e,0x5815,0x59a5,0x60f0,0x6253,
       +0x67c1,0x8235,0x6955,0x9640,0x99c4,0x9a28,0x4f53,0x5806,
       +0x5bfe,0x8010,0x5cb1,0x5e2f,0x5f85,0x6020,0x614b,0x6234,
       +0x66ff,0x6cf0,0x6ede,0x80ce,0x817f,0x82d4,0x888b,0x8cb8,
       +0x9000,0x902e,0x968a,0x9edb,0x9bdb,0x4ee3,0x53f0,0x5927,
       +0x7b2c,0x918d,0x984c,0x9df9,0x6edd,0x7027,0x5353,0x5544,
       +0x5b85,0x6258,0x629e,0x62d3,0x6ca2,0x6fef,0x7422,0x8a17,
       +0x9438,0x6fc1,0x8afe,0x8338,0x51e7,0x86f8,0x53ea,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x53e9,0x4f46,0x9054,
       +0x8fb0,0x596a,0x8131,0x5dfd,0x7aea,0x8fbf,0x68da,0x8c37,
       +0x72f8,0x9c48,0x6a3d,0x8ab0,0x4e39,0x5358,0x5606,0x5766,
       +0x62c5,0x63a2,0x65e6,0x6b4e,0x6de1,0x6e5b,0x70ad,0x77ed,
       +0x7aef,0x7baa,0x7dbb,0x803d,0x80c6,0x86cb,0x8a95,0x935b,
       +0x56e3,0x58c7,0x5f3e,0x65ad,0x6696,0x6a80,0x6bb5,0x7537,
       +0x8ac7,0x5024,0x77e5,0x5730,0x5f1b,0x6065,0x667a,0x6c60,
       +0x75f4,0x7a1a,0x7f6e,0x81f4,0x8718,0x9045,0x99b3,0x7bc9,
       +0x755c,0x7af9,0x7b51,0x84c4,0x9010,0x79e9,0x7a92,0x8336,
       +0x5ae1,0x7740,0x4e2d,0x4ef2,0x5b99,0x5fe0,0x62bd,0x663c,
       +0x67f1,0x6ce8,0x866b,0x8877,0x8a3b,0x914e,0x92f3,0x99d0,
       +0x6a17,0x7026,0x732a,0x82e7,0x8457,0x8caf,0x4e01,0x5146,
       +0x51cb,0x558b,0x5bf5,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5e16,0x5e33,0x5e81,0x5f14,0x5f35,0x5f6b,0x5fb4,
       +0x61f2,0x6311,0x66a2,0x671d,0x6f6e,0x7252,0x753a,0x773a,
       +0x8074,0x8139,0x8178,0x8776,0x8abf,0x8adc,0x8d85,0x8df3,
       +0x929a,0x9577,0x9802,0x9ce5,0x52c5,0x6357,0x76f4,0x6715,
       +0x6c88,0x73cd,0x8cc3,0x93ae,0x9673,0x6d25,0x589c,0x690e,
       +0x69cc,0x8ffd,0x939a,0x75db,0x901a,0x585a,0x6802,0x63b4,
       +0x69fb,0x4f43,0x6f2c,0x67d8,0x8fbb,0x8526,0x7db4,0x9354,
       +0x693f,0x6f70,0x576a,0x58f7,0x5b2c,0x7d2c,0x722a,0x540a,
       +0x91e3,0x9db4,0x4ead,0x4f4e,0x505c,0x5075,0x5243,0x8c9e,
       +0x5448,0x5824,0x5b9a,0x5e1d,0x5e95,0x5ead,0x5ef7,0x5f1f,
       +0x608c,0x62b5,0x633a,0x63d0,0x68af,0x6c40,0x7887,0x798e,
       +0x7a0b,0x7de0,0x8247,0x8a02,0x8ae6,0x8e44,0x9013,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x90b8,0x912d,0x91d8,
       +0x9f0e,0x6ce5,0x6458,0x64e2,0x6575,0x6ef4,0x7684,0x7b1b,
       +0x9069,0x93d1,0x6eba,0x54f2,0x5fb9,0x64a4,0x8f4d,0x8fed,
       +0x9244,0x5178,0x586b,0x5929,0x5c55,0x5e97,0x6dfb,0x7e8f,
       +0x751c,0x8cbc,0x8ee2,0x985b,0x70b9,0x4f1d,0x6bbf,0x6fb1,
       +0x7530,0x96fb,0x514e,0x5410,0x5835,0x5857,0x59ac,0x5c60,
       +0x5f92,0x6597,0x675c,0x6e21,0x767b,0x83df,0x8ced,0x9014,
       +0x90fd,0x934d,0x7825,0x783a,0x52aa,0x5ea6,0x571f,0x5974,
       +0x6012,0x5012,0x515a,0x51ac,0x51cd,0x5200,0x5510,0x5854,
       +0x5858,0x5957,0x5b95,0x5cf6,0x5d8b,0x60bc,0x6295,0x642d,
       +0x6771,0x6843,0x68bc,0x68df,0x76d7,0x6dd8,0x6e6f,0x6d9b,
       +0x706f,0x71c8,0x5f53,0x75d8,0x7977,0x7b49,0x7b54,0x7b52,
       +0x7cd6,0x7d71,0x5230,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x8463,0x8569,0x85e4,0x8a0e,0x8b04,0x8c46,0x8e0f,
       +0x9003,0x900f,0x9419,0x9676,0x982d,0x9a30,0x95d8,0x50cd,
       +0x52d5,0x540c,0x5802,0x5c0e,0x61a7,0x649e,0x6d1e,0x77b3,
       +0x7ae5,0x80f4,0x8404,0x9053,0x9285,0x5ce0,0x9d07,0x533f,
       +0x5f97,0x5fb3,0x6d9c,0x7279,0x7763,0x79bf,0x7be4,0x6bd2,
       +0x72ec,0x8aad,0x6803,0x6a61,0x51f8,0x7a81,0x6934,0x5c4a,
       +0x9cf6,0x82eb,0x5bc5,0x9149,0x701e,0x5678,0x5c6f,0x60c7,
       +0x6566,0x6c8c,0x8c5a,0x9041,0x9813,0x5451,0x66c7,0x920d,
       +0x5948,0x90a3,0x5185,0x4e4d,0x51ea,0x8599,0x8b0e,0x7058,
       +0x637a,0x934b,0x6962,0x99b4,0x7e04,0x7577,0x5357,0x6960,
       +0x8edf,0x96e3,0x6c5d,0x4e8c,0x5c3c,0x5f10,0x8fe9,0x5302,
       +0x8cd1,0x8089,0x8679,0x5eff,0x65e5,0x4e73,0x5165,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5982,0x5c3f,0x97ee,
       +0x4efb,0x598a,0x5fcd,0x8a8d,0x6fe1,0x79b0,0x7962,0x5be7,
       +0x8471,0x732b,0x71b1,0x5e74,0x5ff5,0x637b,0x649a,0x71c3,
       +0x7c98,0x4e43,0x5efc,0x4e4b,0x57dc,0x56a2,0x60a9,0x6fc3,
       +0x7d0d,0x80fd,0x8133,0x81bf,0x8fb2,0x8997,0x86a4,0x5df4,
       +0x628a,0x64ad,0x8987,0x6777,0x6ce2,0x6d3e,0x7436,0x7834,
       +0x5a46,0x7f75,0x82ad,0x99ac,0x4ff3,0x5ec3,0x62dd,0x6392,
       +0x6557,0x676f,0x76c3,0x724c,0x80cc,0x80ba,0x8f29,0x914d,
       +0x500d,0x57f9,0x5a92,0x6885,0x6973,0x7164,0x72fd,0x8cb7,
       +0x58f2,0x8ce0,0x966a,0x9019,0x877f,0x79e4,0x77e7,0x8429,
       +0x4f2f,0x5265,0x535a,0x62cd,0x67cf,0x6cca,0x767d,0x7b94,
       +0x7c95,0x8236,0x8584,0x8feb,0x66dd,0x6f20,0x7206,0x7e1b,
       +0x83ab,0x99c1,0x9ea6,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x51fd,0x7bb1,0x7872,0x7bb8,0x8087,0x7b48,0x6ae8,
       +0x5e61,0x808c,0x7551,0x7560,0x516b,0x9262,0x6e8c,0x767a,
       +0x9197,0x9aea,0x4f10,0x7f70,0x629c,0x7b4f,0x95a5,0x9ce9,
       +0x567a,0x5859,0x86e4,0x96bc,0x4f34,0x5224,0x534a,0x53cd,
       +0x53db,0x5e06,0x642c,0x6591,0x677f,0x6c3e,0x6c4e,0x7248,
       +0x72af,0x73ed,0x7554,0x7e41,0x822c,0x85e9,0x8ca9,0x7bc4,
       +0x91c6,0x7169,0x9812,0x98ef,0x633d,0x6669,0x756a,0x76e4,
       +0x78d0,0x8543,0x86ee,0x532a,0x5351,0x5426,0x5983,0x5e87,
       +0x5f7c,0x60b2,0x6249,0x6279,0x62ab,0x6590,0x6bd4,0x6ccc,
       +0x75b2,0x76ae,0x7891,0x79d8,0x7dcb,0x7f77,0x80a5,0x88ab,
       +0x8ab9,0x8cbb,0x907f,0x975e,0x98db,0x6a0b,0x7c38,0x5099,
       +0x5c3e,0x5fae,0x6787,0x6bd8,0x7435,0x7709,0x7f8e,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9f3b,0x67ca,0x7a17,
       +0x5339,0x758b,0x9aed,0x5f66,0x819d,0x83f1,0x8098,0x5f3c,
       +0x5fc5,0x7562,0x7b46,0x903c,0x6867,0x59eb,0x5a9b,0x7d10,
       +0x767e,0x8b2c,0x4ff5,0x5f6a,0x6a19,0x6c37,0x6f02,0x74e2,
       +0x7968,0x8868,0x8a55,0x8c79,0x5edf,0x63cf,0x75c5,0x79d2,
       +0x82d7,0x9328,0x92f2,0x849c,0x86ed,0x9c2d,0x54c1,0x5f6c,
       +0x658c,0x6d5c,0x7015,0x8ca7,0x8cd3,0x983b,0x654f,0x74f6,
       +0x4e0d,0x4ed8,0x57e0,0x592b,0x5a66,0x5bcc,0x51a8,0x5e03,
       +0x5e9c,0x6016,0x6276,0x6577,0x65a7,0x666e,0x6d6e,0x7236,
       +0x7b26,0x8150,0x819a,0x8299,0x8b5c,0x8ca0,0x8ce6,0x8d74,
       +0x961c,0x9644,0x4fae,0x64ab,0x6b66,0x821e,0x8461,0x856a,
       +0x90e8,0x5c01,0x6953,0x98a8,0x847a,0x8557,0x4f0f,0x526f,
       +0x5fa9,0x5e45,0x670d,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x798f,0x8179,0x8907,0x8986,0x6df5,0x5f17,0x6255,
       +0x6cb8,0x4ecf,0x7269,0x9b92,0x5206,0x543b,0x5674,0x58b3,
       +0x61a4,0x626e,0x711a,0x596e,0x7c89,0x7cde,0x7d1b,0x96f0,
       +0x6587,0x805e,0x4e19,0x4f75,0x5175,0x5840,0x5e63,0x5e73,
       +0x5f0a,0x67c4,0x4e26,0x853d,0x9589,0x965b,0x7c73,0x9801,
       +0x50fb,0x58c1,0x7656,0x78a7,0x5225,0x77a5,0x8511,0x7b86,
       +0x504f,0x5909,0x7247,0x7bc7,0x7de8,0x8fba,0x8fd4,0x904d,
       +0x4fbf,0x52c9,0x5a29,0x5f01,0x97ad,0x4fdd,0x8217,0x92ea,
       +0x5703,0x6355,0x6b69,0x752b,0x88dc,0x8f14,0x7a42,0x52df,
       +0x5893,0x6155,0x620a,0x66ae,0x6bcd,0x7c3f,0x83e9,0x5023,
       +0x4ff8,0x5305,0x5446,0x5831,0x5949,0x5b9d,0x5cf0,0x5cef,
       +0x5d29,0x5e96,0x62b1,0x6367,0x653e,0x65b9,0x670b,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6cd5,0x6ce1,0x70f9,
       +0x7832,0x7e2b,0x80de,0x82b3,0x840c,0x84ec,0x8702,0x8912,
       +0x8a2a,0x8c4a,0x90a6,0x92d2,0x98fd,0x9cf3,0x9d6c,0x4e4f,
       +0x4ea1,0x508d,0x5256,0x574a,0x59a8,0x5e3d,0x5fd8,0x5fd9,
       +0x623f,0x66b4,0x671b,0x67d0,0x68d2,0x5192,0x7d21,0x80aa,
       +0x81a8,0x8b00,0x8c8c,0x8cbf,0x927e,0x9632,0x5420,0x982c,
       +0x5317,0x50d5,0x535c,0x58a8,0x64b2,0x6734,0x7267,0x7766,
       +0x7a46,0x91e6,0x52c3,0x6ca1,0x6b86,0x5800,0x5e4c,0x5954,
       +0x672c,0x7ffb,0x51e1,0x76c6,0x6469,0x78e8,0x9b54,0x9ebb,
       +0x57cb,0x59b9,0x6627,0x679a,0x6bce,0x54e9,0x69d9,0x5e55,
       +0x819c,0x6795,0x9baa,0x67fe,0x9c52,0x685d,0x4ea6,0x4fe3,
       +0x53c8,0x62b9,0x672b,0x6cab,0x8fc4,0x4fad,0x7e6d,0x9ebf,
       +0x4e07,0x6162,0x6e80,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6f2b,0x8513,0x5473,0x672a,0x9b45,0x5df3,0x7b95,
       +0x5cac,0x5bc6,0x871c,0x6e4a,0x84d1,0x7a14,0x8108,0x5999,
       +0x7c8d,0x6c11,0x7720,0x52d9,0x5922,0x7121,0x725f,0x77db,
       +0x9727,0x9d61,0x690b,0x5a7f,0x5a18,0x51a5,0x540d,0x547d,
       +0x660e,0x76df,0x8ff7,0x9298,0x9cf4,0x59ea,0x725d,0x6ec5,
       +0x514d,0x68c9,0x7dbf,0x7dec,0x9762,0x9eba,0x6478,0x6a21,
       +0x8302,0x5984,0x5b5f,0x6bdb,0x731b,0x76f2,0x7db2,0x8017,
       +0x8499,0x5132,0x6728,0x9ed9,0x76ee,0x6762,0x52ff,0x9905,
       +0x5c24,0x623b,0x7c7e,0x8cb0,0x554f,0x60b6,0x7d0b,0x9580,
       +0x5301,0x4e5f,0x51b6,0x591c,0x723a,0x8036,0x91ce,0x5f25,
       +0x77e2,0x5384,0x5f79,0x7d04,0x85ac,0x8a33,0x8e8d,0x9756,
       +0x67f3,0x85ae,0x9453,0x6109,0x6108,0x6cb9,0x7652,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8aed,0x8f38,0x552f,
       +0x4f51,0x512a,0x52c7,0x53cb,0x5ba5,0x5e7d,0x60a0,0x6182,
       +0x63d6,0x6709,0x67da,0x6e67,0x6d8c,0x7336,0x7337,0x7531,
       +0x7950,0x88d5,0x8a98,0x904a,0x9091,0x90f5,0x96c4,0x878d,
       +0x5915,0x4e88,0x4f59,0x4e0e,0x8a89,0x8f3f,0x9810,0x50ad,
       +0x5e7c,0x5996,0x5bb9,0x5eb8,0x63da,0x63fa,0x64c1,0x66dc,
       +0x694a,0x69d8,0x6d0b,0x6eb6,0x7194,0x7528,0x7aaf,0x7f8a,
       +0x8000,0x8449,0x84c9,0x8981,0x8b21,0x8e0a,0x9065,0x967d,
       +0x990a,0x617e,0x6291,0x6b32,0x6c83,0x6d74,0x7fcc,0x7ffc,
       +0x6dc0,0x7f85,0x87ba,0x88f8,0x6765,0x83b1,0x983c,0x96f7,
       +0x6d1b,0x7d61,0x843d,0x916a,0x4e71,0x5375,0x5d50,0x6b04,
       +0x6feb,0x85cd,0x862d,0x89a7,0x5229,0x540f,0x5c65,0x674e,
       +0x68a8,0x7406,0x7483,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x75e2,0x88cf,0x88e1,0x91cc,0x96e2,0x9678,0x5f8b,
       +0x7387,0x7acb,0x844e,0x63a0,0x7565,0x5289,0x6d41,0x6e9c,
       +0x7409,0x7559,0x786b,0x7c92,0x9686,0x7adc,0x9f8d,0x4fb6,
       +0x616e,0x65c5,0x865c,0x4e86,0x4eae,0x50da,0x4e21,0x51cc,
       +0x5bee,0x6599,0x6881,0x6dbc,0x731f,0x7642,0x77ad,0x7a1c,
       +0x7ce7,0x826f,0x8ad2,0x907c,0x91cf,0x9675,0x9818,0x529b,
       +0x7dd1,0x502b,0x5398,0x6797,0x6dcb,0x71d0,0x7433,0x81e8,
       +0x8f2a,0x96a3,0x9c57,0x9e9f,0x7460,0x5841,0x6d99,0x7d2f,
       +0x985e,0x4ee4,0x4f36,0x4f8b,0x51b7,0x52b1,0x5dba,0x601c,
       +0x73b2,0x793c,0x82d3,0x9234,0x96b7,0x96f6,0x970a,0x9e97,
       +0x9f62,0x66a6,0x6b74,0x5217,0x52a3,0x70c8,0x88c2,0x5ec9,
       +0x604b,0x6190,0x6f23,0x7149,0x7c3e,0x7df4,0x806f,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x84ee,0x9023,0x932c,
       +0x5442,0x9b6f,0x6ad3,0x7089,0x8cc2,0x8def,0x9732,0x52b4,
       +0x5a41,0x5eca,0x5f04,0x6717,0x697c,0x6994,0x6d6a,0x6f0f,
       +0x7262,0x72fc,0x7bed,0x8001,0x807e,0x874b,0x90ce,0x516d,
       +0x9e93,0x7984,0x808b,0x9332,0x8ad6,0x502d,0x548c,0x8a71,
       +0x6b6a,0x8cc4,0x8107,0x60d1,0x67a0,0x9df2,0x4e99,0x4e98,
       +0x9c10,0x8a6b,0x85c1,0x8568,0x6900,0x6e7e,0x7897,0x8155,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5f0c,0x4e10,0x4e15,0x4e2a,0x4e31,0x4e36,0x4e3c,
       +0x4e3f,0x4e42,0x4e56,0x4e58,0x4e82,0x4e85,0x8c6b,0x4e8a,
       +0x8212,0x5f0d,0x4e8e,0x4e9e,0x4e9f,0x4ea0,0x4ea2,0x4eb0,
       +0x4eb3,0x4eb6,0x4ece,0x4ecd,0x4ec4,0x4ec6,0x4ec2,0x4ed7,
       +0x4ede,0x4eed,0x4edf,0x4ef7,0x4f09,0x4f5a,0x4f30,0x4f5b,
       +0x4f5d,0x4f57,0x4f47,0x4f76,0x4f88,0x4f8f,0x4f98,0x4f7b,
       +0x4f69,0x4f70,0x4f91,0x4f6f,0x4f86,0x4f96,0x5118,0x4fd4,
       +0x4fdf,0x4fce,0x4fd8,0x4fdb,0x4fd1,0x4fda,0x4fd0,0x4fe4,
       +0x4fe5,0x501a,0x5028,0x5014,0x502a,0x5025,0x5005,0x4f1c,
       +0x4ff6,0x5021,0x5029,0x502c,0x4ffe,0x4fef,0x5011,0x5006,
       +0x5043,0x5047,0x6703,0x5055,0x5050,0x5048,0x505a,0x5056,
       +0x506c,0x5078,0x5080,0x509a,0x5085,0x50b4,0x50b2,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x50c9,0x50ca,0x50b3,
       +0x50c2,0x50d6,0x50de,0x50e5,0x50ed,0x50e3,0x50ee,0x50f9,
       +0x50f5,0x5109,0x5101,0x5102,0x5116,0x5115,0x5114,0x511a,
       +0x5121,0x513a,0x5137,0x513c,0x513b,0x513f,0x5140,0x5152,
       +0x514c,0x5154,0x5162,0x7af8,0x5169,0x516a,0x516e,0x5180,
       +0x5182,0x56d8,0x518c,0x5189,0x518f,0x5191,0x5193,0x5195,
       +0x5196,0x51a4,0x51a6,0x51a2,0x51a9,0x51aa,0x51ab,0x51b3,
       +0x51b1,0x51b2,0x51b0,0x51b5,0x51bd,0x51c5,0x51c9,0x51db,
       +0x51e0,0x8655,0x51e9,0x51ed,0x51f0,0x51f5,0x51fe,0x5204,
       +0x520b,0x5214,0x520e,0x5227,0x522a,0x522e,0x5233,0x5239,
       +0x524f,0x5244,0x524b,0x524c,0x525e,0x5254,0x526a,0x5274,
       +0x5269,0x5273,0x527f,0x527d,0x528d,0x5294,0x5292,0x5271,
       +0x5288,0x5291,0x8fa8,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x8fa7,0x52ac,0x52ad,0x52bc,0x52b5,0x52c1,0x52cd,
       +0x52d7,0x52de,0x52e3,0x52e6,0x98ed,0x52e0,0x52f3,0x52f5,
       +0x52f8,0x52f9,0x5306,0x5308,0x7538,0x530d,0x5310,0x530f,
       +0x5315,0x531a,0x5323,0x532f,0x5331,0x5333,0x5338,0x5340,
       +0x5346,0x5345,0x4e17,0x5349,0x534d,0x51d6,0x535e,0x5369,
       +0x536e,0x5918,0x537b,0x5377,0x5382,0x5396,0x53a0,0x53a6,
       +0x53a5,0x53ae,0x53b0,0x53b6,0x53c3,0x7c12,0x96d9,0x53df,
       +0x66fc,0x71ee,0x53ee,0x53e8,0x53ed,0x53fa,0x5401,0x543d,
       +0x5440,0x542c,0x542d,0x543c,0x542e,0x5436,0x5429,0x541d,
       +0x544e,0x548f,0x5475,0x548e,0x545f,0x5471,0x5477,0x5470,
       +0x5492,0x547b,0x5480,0x5476,0x5484,0x5490,0x5486,0x54c7,
       +0x54a2,0x54b8,0x54a5,0x54ac,0x54c4,0x54c8,0x54a8,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x54ab,0x54c2,0x54a4,
       +0x54be,0x54bc,0x54d8,0x54e5,0x54e6,0x550f,0x5514,0x54fd,
       +0x54ee,0x54ed,0x54fa,0x54e2,0x5539,0x5540,0x5563,0x554c,
       +0x552e,0x555c,0x5545,0x5556,0x5557,0x5538,0x5533,0x555d,
       +0x5599,0x5580,0x54af,0x558a,0x559f,0x557b,0x557e,0x5598,
       +0x559e,0x55ae,0x557c,0x5583,0x55a9,0x5587,0x55a8,0x55da,
       +0x55c5,0x55df,0x55c4,0x55dc,0x55e4,0x55d4,0x5614,0x55f7,
       +0x5616,0x55fe,0x55fd,0x561b,0x55f9,0x564e,0x5650,0x71df,
       +0x5634,0x5636,0x5632,0x5638,0x566b,0x5664,0x562f,0x566c,
       +0x566a,0x5686,0x5680,0x568a,0x56a0,0x5694,0x568f,0x56a5,
       +0x56ae,0x56b6,0x56b4,0x56c2,0x56bc,0x56c1,0x56c3,0x56c0,
       +0x56c8,0x56ce,0x56d1,0x56d3,0x56d7,0x56ee,0x56f9,0x5700,
       +0x56ff,0x5704,0x5709,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5708,0x570b,0x570d,0x5713,0x5718,0x5716,0x55c7,
       +0x571c,0x5726,0x5737,0x5738,0x574e,0x573b,0x5740,0x574f,
       +0x5769,0x57c0,0x5788,0x5761,0x577f,0x5789,0x5793,0x57a0,
       +0x57b3,0x57a4,0x57aa,0x57b0,0x57c3,0x57c6,0x57d4,0x57d2,
       +0x57d3,0x580a,0x57d6,0x57e3,0x580b,0x5819,0x581d,0x5872,
       +0x5821,0x5862,0x584b,0x5870,0x6bc0,0x5852,0x583d,0x5879,
       +0x5885,0x58b9,0x589f,0x58ab,0x58ba,0x58de,0x58bb,0x58b8,
       +0x58ae,0x58c5,0x58d3,0x58d1,0x58d7,0x58d9,0x58d8,0x58e5,
       +0x58dc,0x58e4,0x58df,0x58ef,0x58fa,0x58f9,0x58fb,0x58fc,
       +0x58fd,0x5902,0x590a,0x5910,0x591b,0x68a6,0x5925,0x592c,
       +0x592d,0x5932,0x5938,0x593e,0x7ad2,0x5955,0x5950,0x594e,
       +0x595a,0x5958,0x5962,0x5960,0x5967,0x596c,0x5969,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5978,0x5981,0x599d,
       +0x4f5e,0x4fab,0x59a3,0x59b2,0x59c6,0x59e8,0x59dc,0x598d,
       +0x59d9,0x59da,0x5a25,0x5a1f,0x5a11,0x5a1c,0x5a09,0x5a1a,
       +0x5a40,0x5a6c,0x5a49,0x5a35,0x5a36,0x5a62,0x5a6a,0x5a9a,
       +0x5abc,0x5abe,0x5acb,0x5ac2,0x5abd,0x5ae3,0x5ad7,0x5ae6,
       +0x5ae9,0x5ad6,0x5afa,0x5afb,0x5b0c,0x5b0b,0x5b16,0x5b32,
       +0x5ad0,0x5b2a,0x5b36,0x5b3e,0x5b43,0x5b45,0x5b40,0x5b51,
       +0x5b55,0x5b5a,0x5b5b,0x5b65,0x5b69,0x5b70,0x5b73,0x5b75,
       +0x5b78,0x6588,0x5b7a,0x5b80,0x5b83,0x5ba6,0x5bb8,0x5bc3,
       +0x5bc7,0x5bc9,0x5bd4,0x5bd0,0x5be4,0x5be6,0x5be2,0x5bde,
       +0x5be5,0x5beb,0x5bf0,0x5bf6,0x5bf3,0x5c05,0x5c07,0x5c08,
       +0x5c0d,0x5c13,0x5c20,0x5c22,0x5c28,0x5c38,0x5c39,0x5c41,
       +0x5c46,0x5c4e,0x5c53,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x5c50,0x5c4f,0x5b71,0x5c6c,0x5c6e,0x4e62,0x5c76,
       +0x5c79,0x5c8c,0x5c91,0x5c94,0x599b,0x5cab,0x5cbb,0x5cb6,
       +0x5cbc,0x5cb7,0x5cc5,0x5cbe,0x5cc7,0x5cd9,0x5ce9,0x5cfd,
       +0x5cfa,0x5ced,0x5d8c,0x5cea,0x5d0b,0x5d15,0x5d17,0x5d5c,
       +0x5d1f,0x5d1b,0x5d11,0x5d14,0x5d22,0x5d1a,0x5d19,0x5d18,
       +0x5d4c,0x5d52,0x5d4e,0x5d4b,0x5d6c,0x5d73,0x5d76,0x5d87,
       +0x5d84,0x5d82,0x5da2,0x5d9d,0x5dac,0x5dae,0x5dbd,0x5d90,
       +0x5db7,0x5dbc,0x5dc9,0x5dcd,0x5dd3,0x5dd2,0x5dd6,0x5ddb,
       +0x5deb,0x5df2,0x5df5,0x5e0b,0x5e1a,0x5e19,0x5e11,0x5e1b,
       +0x5e36,0x5e37,0x5e44,0x5e43,0x5e40,0x5e4e,0x5e57,0x5e54,
       +0x5e5f,0x5e62,0x5e64,0x5e47,0x5e75,0x5e76,0x5e7a,0x9ebc,
       +0x5e7f,0x5ea0,0x5ec1,0x5ec2,0x5ec8,0x5ed0,0x5ecf,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x5ed6,0x5ee3,0x5edd,
       +0x5eda,0x5edb,0x5ee2,0x5ee1,0x5ee8,0x5ee9,0x5eec,0x5ef1,
       +0x5ef3,0x5ef0,0x5ef4,0x5ef8,0x5efe,0x5f03,0x5f09,0x5f5d,
       +0x5f5c,0x5f0b,0x5f11,0x5f16,0x5f29,0x5f2d,0x5f38,0x5f41,
       +0x5f48,0x5f4c,0x5f4e,0x5f2f,0x5f51,0x5f56,0x5f57,0x5f59,
       +0x5f61,0x5f6d,0x5f73,0x5f77,0x5f83,0x5f82,0x5f7f,0x5f8a,
       +0x5f88,0x5f91,0x5f87,0x5f9e,0x5f99,0x5f98,0x5fa0,0x5fa8,
       +0x5fad,0x5fbc,0x5fd6,0x5ffb,0x5fe4,0x5ff8,0x5ff1,0x5fdd,
       +0x60b3,0x5fff,0x6021,0x6060,0x6019,0x6010,0x6029,0x600e,
       +0x6031,0x601b,0x6015,0x602b,0x6026,0x600f,0x603a,0x605a,
       +0x6041,0x606a,0x6077,0x605f,0x604a,0x6046,0x604d,0x6063,
       +0x6043,0x6064,0x6042,0x606c,0x606b,0x6059,0x6081,0x608d,
       +0x60e7,0x6083,0x609a,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6084,0x609b,0x6096,0x6097,0x6092,0x60a7,0x608b,
       +0x60e1,0x60b8,0x60e0,0x60d3,0x60b4,0x5ff0,0x60bd,0x60c6,
       +0x60b5,0x60d8,0x614d,0x6115,0x6106,0x60f6,0x60f7,0x6100,
       +0x60f4,0x60fa,0x6103,0x6121,0x60fb,0x60f1,0x610d,0x610e,
       +0x6147,0x613e,0x6128,0x6127,0x614a,0x613f,0x613c,0x612c,
       +0x6134,0x613d,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,
       +0x615a,0x616b,0x6174,0x616f,0x6165,0x6171,0x615f,0x615d,
       +0x6153,0x6175,0x6199,0x6196,0x6187,0x61ac,0x6194,0x619a,
       +0x618a,0x6191,0x61ab,0x61ae,0x61cc,0x61ca,0x61c9,0x61f7,
       +0x61c8,0x61c3,0x61c6,0x61ba,0x61cb,0x7f79,0x61cd,0x61e6,
       +0x61e3,0x61f6,0x61fa,0x61f4,0x61ff,0x61fd,0x61fc,0x61fe,
       +0x6200,0x6208,0x6209,0x620d,0x620c,0x6214,0x621b,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x621e,0x6221,0x622a,
       +0x622e,0x6230,0x6232,0x6233,0x6241,0x624e,0x625e,0x6263,
       +0x625b,0x6260,0x6268,0x627c,0x6282,0x6289,0x627e,0x6292,
       +0x6293,0x6296,0x62d4,0x6283,0x6294,0x62d7,0x62d1,0x62bb,
       +0x62cf,0x62ff,0x62c6,0x64d4,0x62c8,0x62dc,0x62cc,0x62ca,
       +0x62c2,0x62c7,0x629b,0x62c9,0x630c,0x62ee,0x62f1,0x6327,
       +0x6302,0x6308,0x62ef,0x62f5,0x6350,0x633e,0x634d,0x641c,
       +0x634f,0x6396,0x638e,0x6380,0x63ab,0x6376,0x63a3,0x638f,
       +0x6389,0x639f,0x63b5,0x636b,0x6369,0x63be,0x63e9,0x63c0,
       +0x63c6,0x63e3,0x63c9,0x63d2,0x63f6,0x63c4,0x6416,0x6434,
       +0x6406,0x6413,0x6426,0x6436,0x651d,0x6417,0x6428,0x640f,
       +0x6467,0x646f,0x6476,0x644e,0x652a,0x6495,0x6493,0x64a5,
       +0x64a9,0x6488,0x64bc,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x64da,0x64d2,0x64c5,0x64c7,0x64bb,0x64d8,0x64c2,
       +0x64f1,0x64e7,0x8209,0x64e0,0x64e1,0x62ac,0x64e3,0x64ef,
       +0x652c,0x64f6,0x64f4,0x64f2,0x64fa,0x6500,0x64fd,0x6518,
       +0x651c,0x6505,0x6524,0x6523,0x652b,0x6534,0x6535,0x6537,
       +0x6536,0x6538,0x754b,0x6548,0x6556,0x6555,0x654d,0x6558,
       +0x655e,0x655d,0x6572,0x6578,0x6582,0x6583,0x8b8a,0x659b,
       +0x659f,0x65ab,0x65b7,0x65c3,0x65c6,0x65c1,0x65c4,0x65cc,
       +0x65d2,0x65db,0x65d9,0x65e0,0x65e1,0x65f1,0x6772,0x660a,
       +0x6603,0x65fb,0x6773,0x6635,0x6636,0x6634,0x661c,0x664f,
       +0x6644,0x6649,0x6641,0x665e,0x665d,0x6664,0x6667,0x6668,
       +0x665f,0x6662,0x6670,0x6683,0x6688,0x668e,0x6689,0x6684,
       +0x6698,0x669d,0x66c1,0x66b9,0x66c9,0x66be,0x66bc,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x66c4,0x66b8,0x66d6,
       +0x66da,0x66e0,0x663f,0x66e6,0x66e9,0x66f0,0x66f5,0x66f7,
       +0x670f,0x6716,0x671e,0x6726,0x6727,0x9738,0x672e,0x673f,
       +0x6736,0x6741,0x6738,0x6737,0x6746,0x675e,0x6760,0x6759,
       +0x6763,0x6764,0x6789,0x6770,0x67a9,0x677c,0x676a,0x678c,
       +0x678b,0x67a6,0x67a1,0x6785,0x67b7,0x67ef,0x67b4,0x67ec,
       +0x67b3,0x67e9,0x67b8,0x67e4,0x67de,0x67dd,0x67e2,0x67ee,
       +0x67b9,0x67ce,0x67c6,0x67e7,0x6a9c,0x681e,0x6846,0x6829,
       +0x6840,0x684d,0x6832,0x684e,0x68b3,0x682b,0x6859,0x6863,
       +0x6877,0x687f,0x689f,0x688f,0x68ad,0x6894,0x689d,0x689b,
       +0x6883,0x6aae,0x68b9,0x6874,0x68b5,0x68a0,0x68ba,0x690f,
       +0x688d,0x687e,0x6901,0x68ca,0x6908,0x68d8,0x6922,0x6926,
       +0x68e1,0x690c,0x68cd,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x68d4,0x68e7,0x68d5,0x6936,0x6912,0x6904,0x68d7,
       +0x68e3,0x6925,0x68f9,0x68e0,0x68ef,0x6928,0x692a,0x691a,
       +0x6923,0x6921,0x68c6,0x6979,0x6977,0x695c,0x6978,0x696b,
       +0x6954,0x697e,0x696e,0x6939,0x6974,0x693d,0x6959,0x6930,
       +0x6961,0x695e,0x695d,0x6981,0x696a,0x69b2,0x69ae,0x69d0,
       +0x69bf,0x69c1,0x69d3,0x69be,0x69ce,0x5be8,0x69ca,0x69dd,
       +0x69bb,0x69c3,0x69a7,0x6a2e,0x6991,0x69a0,0x699c,0x6995,
       +0x69b4,0x69de,0x69e8,0x6a02,0x6a1b,0x69ff,0x6b0a,0x69f9,
       +0x69f2,0x69e7,0x6a05,0x69b1,0x6a1e,0x69ed,0x6a14,0x69eb,
       +0x6a0a,0x6a12,0x6ac1,0x6a23,0x6a13,0x6a44,0x6a0c,0x6a72,
       +0x6a36,0x6a78,0x6a47,0x6a62,0x6a59,0x6a66,0x6a48,0x6a38,
       +0x6a22,0x6a90,0x6a8d,0x6aa0,0x6a84,0x6aa2,0x6aa3,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6a97,0x8617,0x6abb,
       +0x6ac3,0x6ac2,0x6ab8,0x6ab3,0x6aac,0x6ade,0x6ad1,0x6adf,
       +0x6aaa,0x6ada,0x6aea,0x6afb,0x6b05,0x8616,0x6afa,0x6b12,
       +0x6b16,0x9b31,0x6b1f,0x6b38,0x6b37,0x76dc,0x6b39,0x98ee,
       +0x6b47,0x6b43,0x6b49,0x6b50,0x6b59,0x6b54,0x6b5b,0x6b5f,
       +0x6b61,0x6b78,0x6b79,0x6b7f,0x6b80,0x6b84,0x6b83,0x6b8d,
       +0x6b98,0x6b95,0x6b9e,0x6ba4,0x6baa,0x6bab,0x6baf,0x6bb2,
       +0x6bb1,0x6bb3,0x6bb7,0x6bbc,0x6bc6,0x6bcb,0x6bd3,0x6bdf,
       +0x6bec,0x6beb,0x6bf3,0x6bef,0x9ebe,0x6c08,0x6c13,0x6c14,
       +0x6c1b,0x6c24,0x6c23,0x6c5e,0x6c55,0x6c62,0x6c6a,0x6c82,
       +0x6c8d,0x6c9a,0x6c81,0x6c9b,0x6c7e,0x6c68,0x6c73,0x6c92,
       +0x6c90,0x6cc4,0x6cf1,0x6cd3,0x6cbd,0x6cd7,0x6cc5,0x6cdd,
       +0x6cae,0x6cb1,0x6cbe,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x6cba,0x6cdb,0x6cef,0x6cd9,0x6cea,0x6d1f,0x884d,
       +0x6d36,0x6d2b,0x6d3d,0x6d38,0x6d19,0x6d35,0x6d33,0x6d12,
       +0x6d0c,0x6d63,0x6d93,0x6d64,0x6d5a,0x6d79,0x6d59,0x6d8e,
       +0x6d95,0x6fe4,0x6d85,0x6df9,0x6e15,0x6e0a,0x6db5,0x6dc7,
       +0x6de6,0x6db8,0x6dc6,0x6dec,0x6dde,0x6dcc,0x6de8,0x6dd2,
       +0x6dc5,0x6dfa,0x6dd9,0x6de4,0x6dd5,0x6dea,0x6dee,0x6e2d,
       +0x6e6e,0x6e2e,0x6e19,0x6e72,0x6e5f,0x6e3e,0x6e23,0x6e6b,
       +0x6e2b,0x6e76,0x6e4d,0x6e1f,0x6e43,0x6e3a,0x6e4e,0x6e24,
       +0x6eff,0x6e1d,0x6e38,0x6e82,0x6eaa,0x6e98,0x6ec9,0x6eb7,
       +0x6ed3,0x6ebd,0x6eaf,0x6ec4,0x6eb2,0x6ed4,0x6ed5,0x6e8f,
       +0x6ea5,0x6ec2,0x6e9f,0x6f41,0x6f11,0x704c,0x6eec,0x6ef8,
       +0x6efe,0x6f3f,0x6ef2,0x6f31,0x6eef,0x6f32,0x6ecc,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x6f3e,0x6f13,0x6ef7,
       +0x6f86,0x6f7a,0x6f78,0x6f81,0x6f80,0x6f6f,0x6f5b,0x6ff3,
       +0x6f6d,0x6f82,0x6f7c,0x6f58,0x6f8e,0x6f91,0x6fc2,0x6f66,
       +0x6fb3,0x6fa3,0x6fa1,0x6fa4,0x6fb9,0x6fc6,0x6faa,0x6fdf,
       +0x6fd5,0x6fec,0x6fd4,0x6fd8,0x6ff1,0x6fee,0x6fdb,0x7009,
       +0x700b,0x6ffa,0x7011,0x7001,0x700f,0x6ffe,0x701b,0x701a,
       +0x6f74,0x701d,0x7018,0x701f,0x7030,0x703e,0x7032,0x7051,
       +0x7063,0x7099,0x7092,0x70af,0x70f1,0x70ac,0x70b8,0x70b3,
       +0x70ae,0x70df,0x70cb,0x70dd,0x70d9,0x7109,0x70fd,0x711c,
       +0x7119,0x7165,0x7155,0x7188,0x7166,0x7162,0x714c,0x7156,
       +0x716c,0x718f,0x71fb,0x7184,0x7195,0x71a8,0x71ac,0x71d7,
       +0x71b9,0x71be,0x71d2,0x71c9,0x71d4,0x71ce,0x71e0,0x71ec,
       +0x71e7,0x71f5,0x71fc,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x71f9,0x71ff,0x720d,0x7210,0x721b,0x7228,0x722d,
       +0x722c,0x7230,0x7232,0x723b,0x723c,0x723f,0x7240,0x7246,
       +0x724b,0x7258,0x7274,0x727e,0x7282,0x7281,0x7287,0x7292,
       +0x7296,0x72a2,0x72a7,0x72b9,0x72b2,0x72c3,0x72c6,0x72c4,
       +0x72ce,0x72d2,0x72e2,0x72e0,0x72e1,0x72f9,0x72f7,0x500f,
       +0x7317,0x730a,0x731c,0x7316,0x731d,0x7334,0x732f,0x7329,
       +0x7325,0x733e,0x734e,0x734f,0x9ed8,0x7357,0x736a,0x7368,
       +0x7370,0x7378,0x7375,0x737b,0x737a,0x73c8,0x73b3,0x73ce,
       +0x73bb,0x73c0,0x73e5,0x73ee,0x73de,0x74a2,0x7405,0x746f,
       +0x7425,0x73f8,0x7432,0x743a,0x7455,0x743f,0x745f,0x7459,
       +0x7441,0x745c,0x7469,0x7470,0x7463,0x746a,0x7476,0x747e,
       +0x748b,0x749e,0x74a7,0x74ca,0x74cf,0x74d4,0x73f1,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x74e0,0x74e3,0x74e7,
       +0x74e9,0x74ee,0x74f2,0x74f0,0x74f1,0x74f8,0x74f7,0x7504,
       +0x7503,0x7505,0x750c,0x750e,0x750d,0x7515,0x7513,0x751e,
       +0x7526,0x752c,0x753c,0x7544,0x754d,0x754a,0x7549,0x755b,
       +0x7546,0x755a,0x7569,0x7564,0x7567,0x756b,0x756d,0x7578,
       +0x7576,0x7586,0x7587,0x7574,0x758a,0x7589,0x7582,0x7594,
       +0x759a,0x759d,0x75a5,0x75a3,0x75c2,0x75b3,0x75c3,0x75b5,
       +0x75bd,0x75b8,0x75bc,0x75b1,0x75cd,0x75ca,0x75d2,0x75d9,
       +0x75e3,0x75de,0x75fe,0x75ff,0x75fc,0x7601,0x75f0,0x75fa,
       +0x75f2,0x75f3,0x760b,0x760d,0x7609,0x761f,0x7627,0x7620,
       +0x7621,0x7622,0x7624,0x7634,0x7630,0x763b,0x7647,0x7648,
       +0x7646,0x765c,0x7658,0x7661,0x7662,0x7668,0x7669,0x766a,
       +0x7667,0x766c,0x7670,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7672,0x7676,0x7678,0x767c,0x7680,0x7683,0x7688,
       +0x768b,0x768e,0x7696,0x7693,0x7699,0x769a,0x76b0,0x76b4,
       +0x76b8,0x76b9,0x76ba,0x76c2,0x76cd,0x76d6,0x76d2,0x76de,
       +0x76e1,0x76e5,0x76e7,0x76ea,0x862f,0x76fb,0x7708,0x7707,
       +0x7704,0x7729,0x7724,0x771e,0x7725,0x7726,0x771b,0x7737,
       +0x7738,0x7747,0x775a,0x7768,0x776b,0x775b,0x7765,0x777f,
       +0x777e,0x7779,0x778e,0x778b,0x7791,0x77a0,0x779e,0x77b0,
       +0x77b6,0x77b9,0x77bf,0x77bc,0x77bd,0x77bb,0x77c7,0x77cd,
       +0x77d7,0x77da,0x77dc,0x77e3,0x77ee,0x77fc,0x780c,0x7812,
       +0x7926,0x7820,0x792a,0x7845,0x788e,0x7874,0x7886,0x787c,
       +0x789a,0x788c,0x78a3,0x78b5,0x78aa,0x78af,0x78d1,0x78c6,
       +0x78cb,0x78d4,0x78be,0x78bc,0x78c5,0x78ca,0x78ec,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x78e7,0x78da,0x78fd,
       +0x78f4,0x7907,0x7912,0x7911,0x7919,0x792c,0x792b,0x7940,
       +0x7960,0x7957,0x795f,0x795a,0x7955,0x7953,0x797a,0x797f,
       +0x798a,0x799d,0x79a7,0x9f4b,0x79aa,0x79ae,0x79b3,0x79b9,
       +0x79ba,0x79c9,0x79d5,0x79e7,0x79ec,0x79e1,0x79e3,0x7a08,
       +0x7a0d,0x7a18,0x7a19,0x7a20,0x7a1f,0x7980,0x7a31,0x7a3b,
       +0x7a3e,0x7a37,0x7a43,0x7a57,0x7a49,0x7a61,0x7a62,0x7a69,
       +0x9f9d,0x7a70,0x7a79,0x7a7d,0x7a88,0x7a97,0x7a95,0x7a98,
       +0x7a96,0x7aa9,0x7ac8,0x7ab0,0x7ab6,0x7ac5,0x7ac4,0x7abf,
       +0x9083,0x7ac7,0x7aca,0x7acd,0x7acf,0x7ad5,0x7ad3,0x7ad9,
       +0x7ada,0x7add,0x7ae1,0x7ae2,0x7ae6,0x7aed,0x7af0,0x7b02,
       +0x7b0f,0x7b0a,0x7b06,0x7b33,0x7b18,0x7b19,0x7b1e,0x7b35,
       +0x7b28,0x7b36,0x7b50,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7b7a,0x7b04,0x7b4d,0x7b0b,0x7b4c,0x7b45,0x7b75,
       +0x7b65,0x7b74,0x7b67,0x7b70,0x7b71,0x7b6c,0x7b6e,0x7b9d,
       +0x7b98,0x7b9f,0x7b8d,0x7b9c,0x7b9a,0x7b8b,0x7b92,0x7b8f,
       +0x7b5d,0x7b99,0x7bcb,0x7bc1,0x7bcc,0x7bcf,0x7bb4,0x7bc6,
       +0x7bdd,0x7be9,0x7c11,0x7c14,0x7be6,0x7be5,0x7c60,0x7c00,
       +0x7c07,0x7c13,0x7bf3,0x7bf7,0x7c17,0x7c0d,0x7bf6,0x7c23,
       +0x7c27,0x7c2a,0x7c1f,0x7c37,0x7c2b,0x7c3d,0x7c4c,0x7c43,
       +0x7c54,0x7c4f,0x7c40,0x7c50,0x7c58,0x7c5f,0x7c64,0x7c56,
       +0x7c65,0x7c6c,0x7c75,0x7c83,0x7c90,0x7ca4,0x7cad,0x7ca2,
       +0x7cab,0x7ca1,0x7ca8,0x7cb3,0x7cb2,0x7cb1,0x7cae,0x7cb9,
       +0x7cbd,0x7cc0,0x7cc5,0x7cc2,0x7cd8,0x7cd2,0x7cdc,0x7ce2,
       +0x9b3b,0x7cef,0x7cf2,0x7cf4,0x7cf6,0x7cfa,0x7d06,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x7d02,0x7d1c,0x7d15,
       +0x7d0a,0x7d45,0x7d4b,0x7d2e,0x7d32,0x7d3f,0x7d35,0x7d46,
       +0x7d73,0x7d56,0x7d4e,0x7d72,0x7d68,0x7d6e,0x7d4f,0x7d63,
       +0x7d93,0x7d89,0x7d5b,0x7d8f,0x7d7d,0x7d9b,0x7dba,0x7dae,
       +0x7da3,0x7db5,0x7dc7,0x7dbd,0x7dab,0x7e3d,0x7da2,0x7daf,
       +0x7ddc,0x7db8,0x7d9f,0x7db0,0x7dd8,0x7ddd,0x7de4,0x7dde,
       +0x7dfb,0x7df2,0x7de1,0x7e05,0x7e0a,0x7e23,0x7e21,0x7e12,
       +0x7e31,0x7e1f,0x7e09,0x7e0b,0x7e22,0x7e46,0x7e66,0x7e3b,
       +0x7e35,0x7e39,0x7e43,0x7e37,0x7e32,0x7e3a,0x7e67,0x7e5d,
       +0x7e56,0x7e5e,0x7e59,0x7e5a,0x7e79,0x7e6a,0x7e69,0x7e7c,
       +0x7e7b,0x7e83,0x7dd5,0x7e7d,0x8fae,0x7e7f,0x7e88,0x7e89,
       +0x7e8c,0x7e92,0x7e90,0x7e93,0x7e94,0x7e96,0x7e8e,0x7e9b,
       +0x7e9c,0x7f38,0x7f3a,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x7f45,0x7f4c,0x7f4d,0x7f4e,0x7f50,0x7f51,0x7f55,
       +0x7f54,0x7f58,0x7f5f,0x7f60,0x7f68,0x7f69,0x7f67,0x7f78,
       +0x7f82,0x7f86,0x7f83,0x7f88,0x7f87,0x7f8c,0x7f94,0x7f9e,
       +0x7f9d,0x7f9a,0x7fa3,0x7faf,0x7fb2,0x7fb9,0x7fae,0x7fb6,
       +0x7fb8,0x8b71,0x7fc5,0x7fc6,0x7fca,0x7fd5,0x7fd4,0x7fe1,
       +0x7fe6,0x7fe9,0x7ff3,0x7ff9,0x98dc,0x8006,0x8004,0x800b,
       +0x8012,0x8018,0x8019,0x801c,0x8021,0x8028,0x803f,0x803b,
       +0x804a,0x8046,0x8052,0x8058,0x805a,0x805f,0x8062,0x8068,
       +0x8073,0x8072,0x8070,0x8076,0x8079,0x807d,0x807f,0x8084,
       +0x8086,0x8085,0x809b,0x8093,0x809a,0x80ad,0x5190,0x80ac,
       +0x80db,0x80e5,0x80d9,0x80dd,0x80c4,0x80da,0x80d6,0x8109,
       +0x80ef,0x80f1,0x811b,0x8129,0x8123,0x812f,0x814b,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x968b,0x8146,0x813e,
       +0x8153,0x8151,0x80fc,0x8171,0x816e,0x8165,0x8166,0x8174,
       +0x8183,0x8188,0x818a,0x8180,0x8182,0x81a0,0x8195,0x81a4,
       +0x81a3,0x815f,0x8193,0x81a9,0x81b0,0x81b5,0x81be,0x81b8,
       +0x81bd,0x81c0,0x81c2,0x81ba,0x81c9,0x81cd,0x81d1,0x81d9,
       +0x81d8,0x81c8,0x81da,0x81df,0x81e0,0x81e7,0x81fa,0x81fb,
       +0x81fe,0x8201,0x8202,0x8205,0x8207,0x820a,0x820d,0x8210,
       +0x8216,0x8229,0x822b,0x8238,0x8233,0x8240,0x8259,0x8258,
       +0x825d,0x825a,0x825f,0x8264,0x8262,0x8268,0x826a,0x826b,
       +0x822e,0x8271,0x8277,0x8278,0x827e,0x828d,0x8292,0x82ab,
       +0x829f,0x82bb,0x82ac,0x82e1,0x82e3,0x82df,0x82d2,0x82f4,
       +0x82f3,0x82fa,0x8393,0x8303,0x82fb,0x82f9,0x82de,0x8306,
       +0x82dc,0x8309,0x82d9,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x8335,0x8334,0x8316,0x8332,0x8331,0x8340,0x8339,
       +0x8350,0x8345,0x832f,0x832b,0x8317,0x8318,0x8385,0x839a,
       +0x83aa,0x839f,0x83a2,0x8396,0x8323,0x838e,0x8387,0x838a,
       +0x837c,0x83b5,0x8373,0x8375,0x83a0,0x8389,0x83a8,0x83f4,
       +0x8413,0x83eb,0x83ce,0x83fd,0x8403,0x83d8,0x840b,0x83c1,
       +0x83f7,0x8407,0x83e0,0x83f2,0x840d,0x8422,0x8420,0x83bd,
       +0x8438,0x8506,0x83fb,0x846d,0x842a,0x843c,0x855a,0x8484,
       +0x8477,0x846b,0x84ad,0x846e,0x8482,0x8469,0x8446,0x842c,
       +0x846f,0x8479,0x8435,0x84ca,0x8462,0x84b9,0x84bf,0x849f,
       +0x84d9,0x84cd,0x84bb,0x84da,0x84d0,0x84c1,0x84c6,0x84d6,
       +0x84a1,0x8521,0x84ff,0x84f4,0x8517,0x8518,0x852c,0x851f,
       +0x8515,0x8514,0x84fc,0x8540,0x8563,0x8558,0x8548,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8541,0x8602,0x854b,
       +0x8555,0x8580,0x85a4,0x8588,0x8591,0x858a,0x85a8,0x856d,
       +0x8594,0x859b,0x85ea,0x8587,0x859c,0x8577,0x857e,0x8590,
       +0x85c9,0x85ba,0x85cf,0x85b9,0x85d0,0x85d5,0x85dd,0x85e5,
       +0x85dc,0x85f9,0x860a,0x8613,0x860b,0x85fe,0x85fa,0x8606,
       +0x8622,0x861a,0x8630,0x863f,0x864d,0x4e55,0x8654,0x865f,
       +0x8667,0x8671,0x8693,0x86a3,0x86a9,0x86aa,0x868b,0x868c,
       +0x86b6,0x86af,0x86c4,0x86c6,0x86b0,0x86c9,0x8823,0x86ab,
       +0x86d4,0x86de,0x86e9,0x86ec,0x86df,0x86db,0x86ef,0x8712,
       +0x8706,0x8708,0x8700,0x8703,0x86fb,0x8711,0x8709,0x870d,
       +0x86f9,0x870a,0x8734,0x873f,0x8737,0x873b,0x8725,0x8729,
       +0x871a,0x8760,0x875f,0x8778,0x874c,0x874e,0x8774,0x8757,
       +0x8768,0x876e,0x8759,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x8753,0x8763,0x876a,0x8805,0x87a2,0x879f,0x8782,
       +0x87af,0x87cb,0x87bd,0x87c0,0x87d0,0x96d6,0x87ab,0x87c4,
       +0x87b3,0x87c7,0x87c6,0x87bb,0x87ef,0x87f2,0x87e0,0x880f,
       +0x880d,0x87fe,0x87f6,0x87f7,0x880e,0x87d2,0x8811,0x8816,
       +0x8815,0x8822,0x8821,0x8831,0x8836,0x8839,0x8827,0x883b,
       +0x8844,0x8842,0x8852,0x8859,0x885e,0x8862,0x886b,0x8881,
       +0x887e,0x889e,0x8875,0x887d,0x88b5,0x8872,0x8882,0x8897,
       +0x8892,0x88ae,0x8899,0x88a2,0x888d,0x88a4,0x88b0,0x88bf,
       +0x88b1,0x88c3,0x88c4,0x88d4,0x88d8,0x88d9,0x88dd,0x88f9,
       +0x8902,0x88fc,0x88f4,0x88e8,0x88f2,0x8904,0x890c,0x890a,
       +0x8913,0x8943,0x891e,0x8925,0x892a,0x892b,0x8941,0x8944,
       +0x893b,0x8936,0x8938,0x894c,0x891d,0x8960,0x895e,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8966,0x8964,0x896d,
       +0x896a,0x896f,0x8974,0x8977,0x897e,0x8983,0x8988,0x898a,
       +0x8993,0x8998,0x89a1,0x89a9,0x89a6,0x89ac,0x89af,0x89b2,
       +0x89ba,0x89bd,0x89bf,0x89c0,0x89da,0x89dc,0x89dd,0x89e7,
       +0x89f4,0x89f8,0x8a03,0x8a16,0x8a10,0x8a0c,0x8a1b,0x8a1d,
       +0x8a25,0x8a36,0x8a41,0x8a5b,0x8a52,0x8a46,0x8a48,0x8a7c,
       +0x8a6d,0x8a6c,0x8a62,0x8a85,0x8a82,0x8a84,0x8aa8,0x8aa1,
       +0x8a91,0x8aa5,0x8aa6,0x8a9a,0x8aa3,0x8ac4,0x8acd,0x8ac2,
       +0x8ada,0x8aeb,0x8af3,0x8ae7,0x8ae4,0x8af1,0x8b14,0x8ae0,
       +0x8ae2,0x8af7,0x8ade,0x8adb,0x8b0c,0x8b07,0x8b1a,0x8ae1,
       +0x8b16,0x8b10,0x8b17,0x8b20,0x8b33,0x97ab,0x8b26,0x8b2b,
       +0x8b3e,0x8b28,0x8b41,0x8b4c,0x8b4f,0x8b4e,0x8b49,0x8b56,
       +0x8b5b,0x8b5a,0x8b6b,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x8b5f,0x8b6c,0x8b6f,0x8b74,0x8b7d,0x8b80,0x8b8c,
       +0x8b8e,0x8b92,0x8b93,0x8b96,0x8b99,0x8b9a,0x8c3a,0x8c41,
       +0x8c3f,0x8c48,0x8c4c,0x8c4e,0x8c50,0x8c55,0x8c62,0x8c6c,
       +0x8c78,0x8c7a,0x8c82,0x8c89,0x8c85,0x8c8a,0x8c8d,0x8c8e,
       +0x8c94,0x8c7c,0x8c98,0x621d,0x8cad,0x8caa,0x8cbd,0x8cb2,
       +0x8cb3,0x8cae,0x8cb6,0x8cc8,0x8cc1,0x8ce4,0x8ce3,0x8cda,
       +0x8cfd,0x8cfa,0x8cfb,0x8d04,0x8d05,0x8d0a,0x8d07,0x8d0f,
       +0x8d0d,0x8d10,0x9f4e,0x8d13,0x8ccd,0x8d14,0x8d16,0x8d67,
       +0x8d6d,0x8d71,0x8d73,0x8d81,0x8d99,0x8dc2,0x8dbe,0x8dba,
       +0x8dcf,0x8dda,0x8dd6,0x8dcc,0x8ddb,0x8dcb,0x8dea,0x8deb,
       +0x8ddf,0x8de3,0x8dfc,0x8e08,0x8e09,0x8dff,0x8e1d,0x8e1e,
       +0x8e10,0x8e1f,0x8e42,0x8e35,0x8e30,0x8e34,0x8e4a,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x8e47,0x8e49,0x8e4c,
       +0x8e50,0x8e48,0x8e59,0x8e64,0x8e60,0x8e2a,0x8e63,0x8e55,
       +0x8e76,0x8e72,0x8e7c,0x8e81,0x8e87,0x8e85,0x8e84,0x8e8b,
       +0x8e8a,0x8e93,0x8e91,0x8e94,0x8e99,0x8eaa,0x8ea1,0x8eac,
       +0x8eb0,0x8ec6,0x8eb1,0x8ebe,0x8ec5,0x8ec8,0x8ecb,0x8edb,
       +0x8ee3,0x8efc,0x8efb,0x8eeb,0x8efe,0x8f0a,0x8f05,0x8f15,
       +0x8f12,0x8f19,0x8f13,0x8f1c,0x8f1f,0x8f1b,0x8f0c,0x8f26,
       +0x8f33,0x8f3b,0x8f39,0x8f45,0x8f42,0x8f3e,0x8f4c,0x8f49,
       +0x8f46,0x8f4e,0x8f57,0x8f5c,0x8f62,0x8f63,0x8f64,0x8f9c,
       +0x8f9f,0x8fa3,0x8fad,0x8faf,0x8fb7,0x8fda,0x8fe5,0x8fe2,
       +0x8fea,0x8fef,0x9087,0x8ff4,0x9005,0x8ff9,0x8ffa,0x9011,
       +0x9015,0x9021,0x900d,0x901e,0x9016,0x900b,0x9027,0x9036,
       +0x9035,0x9039,0x8ff8,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x904f,0x9050,0x9051,0x9052,0x900e,0x9049,0x903e,
       +0x9056,0x9058,0x905e,0x9068,0x906f,0x9076,0x96a8,0x9072,
       +0x9082,0x907d,0x9081,0x9080,0x908a,0x9089,0x908f,0x90a8,
       +0x90af,0x90b1,0x90b5,0x90e2,0x90e4,0x6248,0x90db,0x9102,
       +0x9112,0x9119,0x9132,0x9130,0x914a,0x9156,0x9158,0x9163,
       +0x9165,0x9169,0x9173,0x9172,0x918b,0x9189,0x9182,0x91a2,
       +0x91ab,0x91af,0x91aa,0x91b5,0x91b4,0x91ba,0x91c0,0x91c1,
       +0x91c9,0x91cb,0x91d0,0x91d6,0x91df,0x91e1,0x91db,0x91fc,
       +0x91f5,0x91f6,0x921e,0x91ff,0x9214,0x922c,0x9215,0x9211,
       +0x925e,0x9257,0x9245,0x9249,0x9264,0x9248,0x9295,0x923f,
       +0x924b,0x9250,0x929c,0x9296,0x9293,0x929b,0x925a,0x92cf,
       +0x92b9,0x92b7,0x92e9,0x930f,0x92fa,0x9344,0x932e,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9319,0x9322,0x931a,
       +0x9323,0x933a,0x9335,0x933b,0x935c,0x9360,0x937c,0x936e,
       +0x9356,0x93b0,0x93ac,0x93ad,0x9394,0x93b9,0x93d6,0x93d7,
       +0x93e8,0x93e5,0x93d8,0x93c3,0x93dd,0x93d0,0x93c8,0x93e4,
       +0x941a,0x9414,0x9413,0x9403,0x9407,0x9410,0x9436,0x942b,
       +0x9435,0x9421,0x943a,0x9441,0x9452,0x9444,0x945b,0x9460,
       +0x9462,0x945e,0x946a,0x9229,0x9470,0x9475,0x9477,0x947d,
       +0x945a,0x947c,0x947e,0x9481,0x947f,0x9582,0x9587,0x958a,
       +0x9594,0x9596,0x9598,0x9599,0x95a0,0x95a8,0x95a7,0x95ad,
       +0x95bc,0x95bb,0x95b9,0x95be,0x95ca,0x6ff6,0x95c3,0x95cd,
       +0x95cc,0x95d5,0x95d4,0x95d6,0x95dc,0x95e1,0x95e5,0x95e2,
       +0x9621,0x9628,0x962e,0x962f,0x9642,0x964c,0x964f,0x964b,
       +0x9677,0x965c,0x965e,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x965d,0x965f,0x9666,0x9672,0x966c,0x968d,0x9698,
       +0x9695,0x9697,0x96aa,0x96a7,0x96b1,0x96b2,0x96b0,0x96b4,
       +0x96b6,0x96b8,0x96b9,0x96ce,0x96cb,0x96c9,0x96cd,0x894d,
       +0x96dc,0x970d,0x96d5,0x96f9,0x9704,0x9706,0x9708,0x9713,
       +0x970e,0x9711,0x970f,0x9716,0x9719,0x9724,0x972a,0x9730,
       +0x9739,0x973d,0x973e,0x9744,0x9746,0x9748,0x9742,0x9749,
       +0x975c,0x9760,0x9764,0x9766,0x9768,0x52d2,0x976b,0x9771,
       +0x9779,0x9785,0x977c,0x9781,0x977a,0x9786,0x978b,0x978f,
       +0x9790,0x979c,0x97a8,0x97a6,0x97a3,0x97b3,0x97b4,0x97c3,
       +0x97c6,0x97c8,0x97cb,0x97dc,0x97ed,0x9f4f,0x97f2,0x7adf,
       +0x97f6,0x97f5,0x980f,0x980c,0x9838,0x9824,0x9821,0x9837,
       +0x983d,0x9846,0x984f,0x984b,0x986b,0x986f,0x9870,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9871,0x9874,0x9873,
       +0x98aa,0x98af,0x98b1,0x98b6,0x98c4,0x98c3,0x98c6,0x98e9,
       +0x98eb,0x9903,0x9909,0x9912,0x9914,0x9918,0x9921,0x991d,
       +0x991e,0x9924,0x9920,0x992c,0x992e,0x993d,0x993e,0x9942,
       +0x9949,0x9945,0x9950,0x994b,0x9951,0x9952,0x994c,0x9955,
       +0x9997,0x9998,0x99a5,0x99ad,0x99ae,0x99bc,0x99df,0x99db,
       +0x99dd,0x99d8,0x99d1,0x99ed,0x99ee,0x99f1,0x99f2,0x99fb,
       +0x99f8,0x9a01,0x9a0f,0x9a05,0x99e2,0x9a19,0x9a2b,0x9a37,
       +0x9a45,0x9a42,0x9a40,0x9a43,0x9a3e,0x9a55,0x9a4d,0x9a5b,
       +0x9a57,0x9a5f,0x9a62,0x9a65,0x9a64,0x9a69,0x9a6b,0x9a6a,
       +0x9aad,0x9ab0,0x9abc,0x9ac0,0x9acf,0x9ad1,0x9ad3,0x9ad4,
       +0x9ade,0x9adf,0x9ae2,0x9ae3,0x9ae6,0x9aef,0x9aeb,0x9aee,
       +0x9af4,0x9af1,0x9af7,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x9afb,0x9b06,0x9b18,0x9b1a,0x9b1f,0x9b22,0x9b23,
       +0x9b25,0x9b27,0x9b28,0x9b29,0x9b2a,0x9b2e,0x9b2f,0x9b32,
       +0x9b44,0x9b43,0x9b4f,0x9b4d,0x9b4e,0x9b51,0x9b58,0x9b74,
       +0x9b93,0x9b83,0x9b91,0x9b96,0x9b97,0x9b9f,0x9ba0,0x9ba8,
       +0x9bb4,0x9bc0,0x9bca,0x9bb9,0x9bc6,0x9bcf,0x9bd1,0x9bd2,
       +0x9be3,0x9be2,0x9be4,0x9bd4,0x9be1,0x9c3a,0x9bf2,0x9bf1,
       +0x9bf0,0x9c15,0x9c14,0x9c09,0x9c13,0x9c0c,0x9c06,0x9c08,
       +0x9c12,0x9c0a,0x9c04,0x9c2e,0x9c1b,0x9c25,0x9c24,0x9c21,
       +0x9c30,0x9c47,0x9c32,0x9c46,0x9c3e,0x9c5a,0x9c60,0x9c67,
       +0x9c76,0x9c78,0x9ce7,0x9cec,0x9cf0,0x9d09,0x9d08,0x9ceb,
       +0x9d03,0x9d06,0x9d2a,0x9d26,0x9daf,0x9d23,0x9d1f,0x9d44,
       +0x9d15,0x9d12,0x9d41,0x9d3f,0x9d3e,0x9d46,0x9d48,  NONE,
       +  NONE,  NONE,  NONE,  NONE,  NONE,0x9d5d,0x9d5e,0x9d64,
       +0x9d51,0x9d50,0x9d59,0x9d72,0x9d89,0x9d87,0x9dab,0x9d6f,
       +0x9d7a,0x9d9a,0x9da4,0x9da9,0x9db2,0x9dc4,0x9dc1,0x9dbb,
       +0x9db8,0x9dba,0x9dc6,0x9dcf,0x9dc2,0x9dd9,0x9dd3,0x9df8,
       +0x9de6,0x9ded,0x9def,0x9dfd,0x9e1a,0x9e1b,0x9e1e,0x9e75,
       +0x9e79,0x9e7d,0x9e81,0x9e88,0x9e8b,0x9e8c,0x9e92,0x9e95,
       +0x9e91,0x9e9d,0x9ea5,0x9ea9,0x9eb8,0x9eaa,0x9ead,0x9761,
       +0x9ecc,0x9ece,0x9ecf,0x9ed0,0x9ed4,0x9edc,0x9ede,0x9edd,
       +0x9ee0,0x9ee5,0x9ee8,0x9eef,0x9ef4,0x9ef6,0x9ef7,0x9ef9,
       +0x9efb,0x9efc,0x9efd,0x9f07,0x9f08,0x76b7,0x9f15,0x9f21,
       +0x9f2c,0x9f3e,0x9f4a,0x9f52,0x9f54,0x9f63,0x9f5f,0x9f60,
       +0x9f61,0x9f66,0x9f67,0x9f6c,0x9f6a,0x9f77,0x9f72,0x9f76,
       +0x9f95,0x9f9c,0x9fa0,  NONE,  NONE,  NONE,  NONE,  NONE,
       +  NONE,0x582f,0x69c7,0x9059,0x7464,0x51dc,0x7199,
       +};
 (DIR) diff --git a/src/cmd/dict/kuten.h b/src/cmd/dict/kuten.h
       t@@ -0,0 +1,114 @@
       +/*
       +        following astonishing goo courtesy of kogure.
       +*/
       +/*
       + * MicroSoft Kanji Encoding (SJIS) Transformation
       + */
       +
       +/*
       + * void
       + * J2S(unsigned char *_h, unsigned char *_l)
       + *        JIS X 208 to MS kanji transformation.
       + *
       + * Calling/Exit State:
       + *        _h and _l should be in their valid range.
       + *        No return value.
       + */
       +#define J2S(_h, _l) { \
       +        /* lower: 21-7e >> 40-9d,9e-fb >> 40-7e,(skip 7f),80-fc */ \
       +        if (((_l) += (((_h)-- % 2) ? 0x1f : 0x7d)) > 0x7e) (_l)++; \
       +        /* upper: 21-7e >> 81-af >> 81-9f,(skip a0-df),e0-ef */ \
       +        if (((_h) = ((_h) / 2 + 0x71)) > 0x9f) (_h) += 0x40; \
       +}
       +
       +/*
       + * void
       + * S2J(unsigned char *_h, unsigned char *_l)
       + *        MS kanji to JIS X 208 transformation.
       + *
       + * Calling/Exit State:
       + *        _h and _l should be in valid range.
       + *        No return value.
       + */
       +#define S2J(_h, _l) { \
       +        /* lower: 40-7e,80-fc >> 21-5f,61-dd >> 21-7e,7f-dc */ \
       +        if (((_l) -= 0x1f) > 0x60) (_l)--; \
       +        /* upper: 81-9f,e0-ef >> 00-1e,5f-6e >> 00-2e >> 21-7d */ \
       +        if (((_h) -= 0x81) > 0x5e) (_h) -= 0x40; (_h) *= 2, (_h) += 0x21; \
       +        /* upper: ,21-7d >> ,22-7e ; lower: ,7f-dc >> ,21-7e */ \
       +        if ((_l) > 0x7e) (_h)++, (_l) -= 0x5e; \
       +}
       +
       +/*
       + * int
       + * ISJKANA(const unsigned char *_b)
       + *        Tests given byte is in the range of JIS X 0201 katakana.
       + *
       + * Calling/Exit State:
       + *        Returns 1 if it is, or 0 otherwise.
       + */
       +#define        ISJKANA(_b)        (0xa0 <= (_b) && (_b) < 0xe0)
       +
       +/*
       + * int
       + * CANS2JH(const unsigned char *_h)
       + *        Tests given byte is in the range of valid first byte of MS
       + *        kanji code; either acts as a subroutine of CANS2J() macro
       + *        or can be used to parse MS kanji encoded strings.
       + *
       + * Calling/Exit State:
       + *        Returns 1 if it is, or 0 otherwise.
       + */
       +#define CANS2JH(_h)        ((0x81 <= (_h) && (_h) < 0xf0) && !ISJKANA(_h))
       +
       +/*
       + * int
       + * CANS2JL(const unsigned char *_l)
       + *        Tests given byte is in the range of valid second byte of MS
       + *        kanji code; acts as a subroutine of CANS2J() macro.
       + *
       + * Calling/Exit State:
       + *        Returns 1 if it is, or 0 otherwise.
       + */
       +#define CANS2JL(_l)        (0x40 <= (_l) && (_l) < 0xfd && (_l) != 0x7f)
       +
       +/*
       + * int
       + * CANS2J(const unsigned char *_h, const unsinged char *_l)
       + *        Tests given bytes form a MS kanji code point which can be
       + *        transformed to a valid JIS X 208 code point.
       + *
       + * Calling/Exit State:
       + *        Returns 1 if they are, or 0 otherwise.
       + */
       +#define CANS2J(_h, _l)  (CANS2JH(_h) && CANS2JL(_l))
       +
       +/*
       + * int
       + * CANJ2SB(const unsigned char *_b)
       + *        Tests given bytes is in the range of valid 94 graphic
       + *        character set; acts as a subroutine of CANJ2S() macro.
       + *
       + * Calling/Exit State:
       + *        Returns 1 if it is, or 0 otherwise.
       + */
       +#define CANJ2SB(_b)        (0x21 <= (_b) && (_b) < 0x7f)
       +
       +/*
       + * int
       + * CANJ2S(const unsigned char *_h, const unsigned char *_l)
       + *        Tests given bytes form valid JIS X 208 code points
       + *        (which can be transformed to MS kanji).
       + *
       + * Calling/Exit State:
       + *        Returns 1 if they are, or 0 otherwise.
       + */
       +#define CANJ2S(_h, _l)        (CANJ2SB(_h) && CANJ2SB(_l))
       +
       +#define                JIS208MAX        8407
       +#define                GB2312MAX        8795
       +#define                BIG5MAX                13973
       +
       +extern Rune tabjis208[JIS208MAX];        /* runes indexed by kuten */
       +extern Rune tabgb2312[GB2312MAX];
       +extern Rune tabbig5[BIG5MAX];
 (DIR) diff --git a/src/cmd/dict/mkfile b/src/cmd/dict/mkfile
       t@@ -0,0 +1,18 @@
       +PLAN9=../../..
       +<$PLAN9/src/mkhdr
       +
       +TARG=dict
       +LFILES=oed.$O ahd.$O pcollins.$O pcollinsg.$O movie.$O slang.$O robert.$O\
       +        world.$O jis208.$O gb2312.$O thesaurus.$O simple.$O pgw.$O
       +
       +OFILES=dict.$O\
       +        $LFILES\
       +        utils.$O
       +
       +HFILES=dict.h kuten.h
       +
       +LDFLAGS=$LDFLAGS -lbio -l9 -lregexp9 -lfmt -lutf
       +<$PLAN9/src/mkone
       +
       +mkindex: mkindex.$O $LFILES utils.$O
       +        $LD $LDFLAGS -o $target $prereq
 (DIR) diff --git a/src/cmd/dict/mkindex.c b/src/cmd/dict/mkindex.c
       t@@ -0,0 +1,106 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/*
       + * Use this to start making an index for a new dictionary.
       + * Get the dictionary-specific nextoff and printentry(_,'h')
       + * commands working, add a record to the dicts[] array below,
       + * and run this program to get a list of offset,headword
       + * pairs
       + */
       +Biobuf        boutbuf;
       +Biobuf        *bdict;
       +Biobuf        *bout = &boutbuf;
       +int        linelen;
       +int        breaklen = 2000;
       +int        outinhibit;
       +int        debug;
       +
       +Dict        *dict;        /* current dictionary */
       +
       +Entry        getentry(long);
       +
       +void
       +main(int argc, char **argv)
       +{
       +        int i;
       +        long a, ae;
       +        char *p;
       +        Entry e;
       +
       +        Binit(&boutbuf, 1, OWRITE);
       +        dict = &dicts[0];
       +        ARGBEGIN {
       +                case 'd':
       +                        p = ARGF();
       +                        dict = 0;
       +                        if(p) {
       +                                for(i=0; dicts[i].name; i++)
       +                                        if(strcmp(p, dicts[i].name)==0) {
       +                                                dict = &dicts[i];
       +                                                break;
       +                                        }
       +                        }
       +                        if(!dict) {
       +                                err("unknown dictionary: %s", p);
       +                                exits("nodict");
       +                        }
       +                        break;
       +                case 'D':
       +                        debug++;
       +                        break;
       +        ARGEND }
       +        USED(argc,argv);
       +        bdict = Bopen(dict->path, OREAD);
       +        ae = Bseek(bdict, 0, 2);
       +        if(!bdict) {
       +                err("can't open dictionary %s", dict->path);
       +                exits("nodict");
       +        }
       +        for(a = 0; a < ae; a = (*dict->nextoff)(a+1)) {
       +                linelen = 0;
       +                e = getentry(a);
       +                Bprint(bout, "%ld\t", a);
       +                linelen = 4;        /* only has to be approx right */
       +                (*dict->printentry)(e, 'h');
       +        }
       +        exits(0);
       +}
       +
       +Entry
       +getentry(long b)
       +{
       +        long e, n, dtop;
       +        static Entry ans;
       +        static int anslen = 0;
       +
       +        e = (*dict->nextoff)(b+1);
       +        ans.doff = b;
       +        if(e < 0) {
       +                dtop = Bseek(bdict, 0L, 2);
       +                if(b < dtop) {
       +                        e = dtop;
       +                } else {
       +                        err("couldn't seek to entry");
       +                        ans.start = 0;
       +                        ans.end = 0;
       +                }
       +        }
       +        n = e-b;
       +        if(n) {
       +                if(n > anslen) {
       +                        ans.start = realloc(ans.start, n);
       +                        if(!ans.start) {
       +                                err("out of memory");
       +                                exits("nomem");
       +                        }
       +                        anslen = n;
       +                }
       +                Bseek(bdict, b, 0);
       +                n = Bread(bdict, ans.start, n);
       +                ans.end = ans.start + n;
       +        }
       +        return ans;
       +}
 (DIR) diff --git a/src/cmd/dict/movie.c b/src/cmd/dict/movie.c
       t@@ -0,0 +1,328 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/* Possible tags */
       +enum {
       +        BEG,        /* beginning of entry */
       +        AB,        /* abstract */
       +        AN,        /* database serial number */
       +        AS,        /* author (one at a time) */
       +        AU,        /* all authors */
       +        AW,        /* award_awardee */
       +        BW,        /* bw or c */
       +        CA,        /* cast: character_actor */
       +        CN,        /* cinematography */
       +        CO,        /* country */
       +        CR,        /* miscellaneous job_name */
       +        DE,        /* topic keyword */
       +        DR,        /* director */
       +        ED,        /* editor */
       +        MP,        /* MPAA rating (R, PG, etc.) */
       +        NT,        /* note */
       +        PR,        /* producer and for ...*/
       +        PS,        /* producer (repeats info in PR) */
       +        RA,        /* rating (letter) */
       +        RD,        /* release date */
       +        RT,        /* running time */
       +        RV,        /* review citation */
       +        ST,        /* production or release company (repeats info in PR) */
       +        TI,        /* title[; original foreign title] */
       +        TX,        /* paragraph of descriptive text */
       +        VD,        /* video information (format_time_company; or "Not Avail.") */
       +        NTAG        /* number of tags */
       +};
       +
       +/* Assoc tables must be sorted on first field */
       +
       +static char *tagtab[] = {
       +[BEG]        "$$",
       +[AB]        "AB",
       +[AN]        "AN",
       +[AS]        "AS",
       +[AU]        "AU",
       +[AW]        "AW",
       +[BW]        "BW",
       +[CA]        "CA",
       +[CN]        "CN",
       +[CO]        "CO",
       +[CR]        "CR",
       +[DE]        "DE",
       +[DR]        "DR",
       +[ED]        "ED",
       +[MP]        "MP",
       +[NT]        "NT",
       +[PR]        "PR",
       +[PS]        "PS",
       +[RA]        "RA",
       +[RD]        "RD",
       +[RT]        "RT",
       +[RV]        "RV",
       +[ST]        "ST",
       +[TI]        "TI",
       +[TX]        "TX",
       +[VD]        "VD",
       +};
       +
       +static char        *mget(int, char *, char *, char **);
       +#if 0
       +static void        moutall(int, char *, char *);
       +#endif
       +static void        moutall2(int, char *, char *);
       +
       +void
       +movieprintentry(Entry ent, int cmd)
       +{
       +        char *p, *e, *ps, *pe, *pn;
       +        int n;
       +
       +        ps = ent.start;
       +        pe = ent.end;
       +        if(cmd == 'r') {
       +                Bwrite(bout, ps, pe-ps);
       +                return;
       +        }
       +        p = mget(TI, ps, pe, &e);
       +        if(p) {
       +                outpiece(p, e);
       +                outnl(0);
       +        }
       +        if(cmd == 'h')
       +                return;
       +        outnl(2);
       +        n = 0;
       +        p = mget(RD, ps, pe, &e);
       +        if(p) {
       +                outchars("Released: ");
       +                outpiece(p, e);
       +                n++;
       +        }
       +        p = mget(CO, ps, pe, &e);
       +        if(p) {
       +                if(n)
       +                        outchars(", ");
       +                outpiece(p, e);
       +                n++;
       +        }
       +        p = mget(RT, ps, pe, &e);
       +        if(p) {
       +                if(n)
       +                        outchars(", ");
       +                outchars("Running time: ");
       +                outpiece(p, e);
       +                n++;
       +        }
       +        p = mget(MP, ps, pe, &e);
       +        if(p) {
       +                if(n)
       +                        outchars(", ");
       +                outpiece(p, e);
       +                n++;
       +        }
       +        p = mget(BW, ps, pe, &e);
       +        if(p) {
       +                if(n)
       +                        outchars(", ");
       +                if(*p == 'c' || *p == 'C')
       +                        outchars("Color");
       +                else
       +                        outchars("B&W");
       +                n++;
       +        }
       +        if(n) {
       +                outchar('.');
       +                outnl(1);
       +        }
       +        p = mget(VD, ps, pe, &e);
       +        if(p) {
       +                outchars("Video: ");
       +                outpiece(p, e);
       +                outnl(1);
       +        }
       +        p = mget(AU, ps, pe, &e);
       +        if(p) {
       +                outchars("By: ");
       +                moutall2(AU, ps, pe);
       +                outnl(1);
       +        }
       +        p = mget(DR, ps, pe, &e);
       +        if(p) {
       +                outchars("Director: ");
       +                outpiece(p, e);
       +                outnl(1);
       +        }
       +        p = mget(PR, ps, pe, &e);
       +        if(p) {
       +                outchars("Producer: ");
       +                outpiece(p, e);
       +                outnl(1);
       +        }
       +        p = mget(CN, ps, pe, &e);
       +        if(p) {
       +                outchars("Cinematograpy: ");
       +                outpiece(p, e);
       +                outnl(1);
       +        }
       +        p = mget(CR, ps, pe, &e);
       +        if(p) {
       +                outchars("Other Credits: ");
       +                moutall2(CR, ps, pe);
       +        }
       +        outnl(2);
       +        p = mget(CA, ps, pe, &e);
       +        if(p) {
       +                outchars("Cast: ");
       +                moutall2(CA, ps, pe);
       +        }
       +        outnl(2);
       +        p = mget(AW, ps, pe, &e);
       +        if(p) {
       +                outchars("Awards: ");
       +                moutall2(AW, ps, pe);
       +                outnl(2);
       +        }
       +        p = mget(NT, ps, pe, &e);
       +        if(p) {
       +                outpiece(p, e);
       +                outnl(2);
       +        }
       +        p = mget(AB, ps, pe, &e);
       +        if(p) {
       +                outpiece(p, e);
       +                outnl(2);
       +        }
       +        pn = ps;
       +        n = 0;
       +        while((p = mget(TX, pn, pe, &pn)) != 0) {
       +                if(n++)
       +                        outnl(1);
       +                outpiece(p, pn);
       +        }
       +        outnl(0);
       +}
       +
       +long
       +movienextoff(long fromoff)
       +{
       +        long a;
       +        char *p;
       +
       +        a = Bseek(bdict, fromoff, 0);
       +        if(a < 0)
       +                return -1;
       +        for(;;) {
       +                p = Brdline(bdict, '\n');
       +                if(!p)
       +                        break;
       +                if(p[0] == '$' && p[1] == '$')
       +                        return (Boffset(bdict)-Blinelen(bdict));
       +        }
       +        return -1;
       +}
       +
       +void
       +movieprintkey(void)
       +{
       +        Bprint(bout, "No key\n");
       +}
       +
       +/*
       + * write a comma-separated list of all tag values between b and e
       + */
       +#if 0
       +static void
       +moutall(int tag, char *b, char *e)
       +{
       +        char *p, *pn;
       +        int n;
       +
       +        n = 0;
       +        pn = b;
       +        while((p = mget(tag, pn, e, &pn)) != 0) {
       +                if(n++)
       +                        outchars(", ");
       +                outpiece(p, pn);
       +        }
       +}
       +#endif
       +
       +/*
       + * like moutall, but values are expected to have form:
       + *    field1_field2
       + * and we are to output 'field2 (field1)' for each
       + * (sometimes field1 has underscores, so search from end)
       + */
       +static void
       +moutall2(int tag, char *b, char *e)
       +{
       +        char *p, *pn, *us, *q;
       +        int n;
       +
       +        n = 0;
       +        pn = b;
       +        while((p = mget(tag, pn, e, &pn)) != 0) {
       +                if(n++)
       +                        outchars(", ");
       +                us = 0;
       +                for(q = pn-1; q >= p; q--)
       +                        if(*q == '_') {
       +                                us = q;
       +                                break;
       +                        }
       +                if(us) {
       +                        /*
       +                         * Hack to fix cast list Himself/Herself
       +                         */
       +                        if(strncmp(us+1, "Himself", 7) == 0 ||
       +                           strncmp(us+1, "Herself", 7) == 0) {
       +                                outpiece(p, us);
       +                                outchars(" (");
       +                                outpiece(us+1, pn);
       +                                outchar(')');
       +                        } else {
       +                                outpiece(us+1, pn);
       +                                outchars(" (");
       +                                outpiece(p, us);
       +                                outchar(')');
       +                        }
       +                } else {
       +                        outpiece(p, pn);
       +                }
       +        }
       +}
       +
       +/*
       + * Starting from b, find next line beginning with tagtab[tag].
       + * Don't go past e, but assume *e==0.
       + * Return pointer to beginning of value (after tag), and set
       + * eptr to point at newline that ends the value
       + */
       +static char *
       +mget(int tag, char *b, char *e, char **eptr)
       +{
       +        char *p, *t, *ans;
       +
       +        if(tag < 0 || tag >= NTAG)
       +                return 0;
       +        t = tagtab[tag];
       +        ans = 0;
       +        for(p = b;;) {
       +                p = strchr(p, '\n');
       +                if(!p || ++p >= e) {
       +                        if(ans)
       +                                *eptr = e-1;
       +                        break;
       +                }
       +                if(!ans) {
       +                        if(p[0] == t[0] && p[1] == t[1])
       +                                ans = p+3;
       +                } else {
       +                        if(p[0] != ' ') {
       +                                *eptr = p-1;
       +                                break;
       +                        }
       +                }
       +        }
       +        return ans;
       +}
 (DIR) diff --git a/src/cmd/dict/oed.c b/src/cmd/dict/oed.c
       t@@ -0,0 +1,1425 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +enum {
       +        Buflen=1000,
       +        Maxaux=5,
       +};
       +
       +/* Possible tags */
       +enum {
       +        A,                /* author in quote (small caps) */
       +        B,                /* bold */
       +        Ba,                /* author inside bib */
       +        Bch,                /* builtup chem component */
       +        Bib,                /* surrounds word 'in' for bibliographic ref */
       +        Bl,                /* bold */
       +        Bo,                /* bond over */
       +        Bu,                /* bond under */
       +        Cb,                /* ? block of stuff (indent) */
       +        Cf,                /* cross ref to another entry (italics) */
       +        Chem,                /* chemistry formula */
       +        Co,                /* over (preceding sum, integral, etc.) */
       +        Col,                /* column of table (aux just may be r) */
       +        Cu,                /* under (preceding sum, integral, etc.) */
       +        Dat,                /* date */
       +        Db,                /* def block? indent */
       +        Dn,                /* denominator of fraction */
       +        E,                /* main entry */
       +        Ed,                /* editor's comments (in [...]) */
       +        Etym,                /* etymology (in [...]) */
       +        Fq,                /* frequency count (superscript) */
       +        Form,                /* formula */
       +        Fr,                /* fraction (contains <nu>, then <dn>) */
       +        Gk,                /* greek (transliteration) */
       +        Gr,                /* grammar? (e.g., around 'pa.' in 'pa. pple.') */
       +        Hg,                /* headword group */
       +        Hm,                /* homonym (superscript) */
       +        Hw,                /* headword (bold) */
       +        I,                /* italics */
       +        Il,                /* italic list? */
       +        In,                /* inferior (subscript) */
       +        L,                /* row of col of table */
       +        La,                /* status or usage label (italic) */
       +        Lc,                /* chapter/verse sort of thing for works */
       +        N,                /* note (smaller type) */
       +        Nu,                /* numerator of fraction */
       +        Ov,                /* needs overline */
       +        P,                /* paragraph (indent) */
       +        Ph,                /* pronunciation (transliteration) */
       +        Pi,                /* pile (frac without line) */
       +        Pqp,                /* subblock of quote */
       +        Pr,                /* pronunciation (in (...)) */
       +        Ps,                /* position (e.g., adv.) (italic) */
       +        Pt,                /* part (in lc) */
       +        Q,                /* quote in quote block */
       +        Qd,                /* quote date (bold) */
       +        Qig,                /* quote number (greek) */
       +        Qla,                /* status or usage label in quote (italic) */
       +        Qp,                /* quote block (small type, indent) */
       +        Qsn,                /* quote number */
       +        Qt,                /* quote words */
       +        R,                /* roman type style */
       +        Rx,                /* relative cross reference (e.g., next) */
       +        S,                /* another form? (italic) */
       +        S0,                /* sense (sometimes surrounds several sx's) */
       +        S1,                /* sense (aux num: indented bold letter) */
       +        S2,                /* sense (aux num: indented bold capital rom num) */
       +        S3,                /* sense (aux num: indented number of asterisks) */
       +        S4,                /* sense (aux num: indented bold number) */
       +        S5,                /* sense (aux num: indented number of asterisks) */
       +        S6,                /* subsense (aux num: bold letter) */
       +        S7a,                /* subsense (aux num: letter) */
       +        S7n,                /* subsense (aux num: roman numeral) */
       +        Sc,                /* small caps */
       +        Sgk,                /* subsense (aux num: transliterated greek) */
       +        Sn,                /* sense of subdefinition (aux num: roman letter) */
       +        Ss,                /* sans serif */
       +        Ssb,                /* sans serif bold */
       +        Ssi,                /* sans serif italic */
       +        Su,                /* superior (superscript) */
       +        Sub,                /* subdefinition */
       +        Table,                /* table (aux cols=number of columns) */
       +        Tt,                /* title? (italics) */
       +        Vd,                /* numeric label for variant form */
       +        Ve,                /* variant entry */
       +        Vf,                /* variant form (light bold) */
       +        Vfl,                /* list of vf's (starts with Also or Forms) */
       +        W,                /* work (e.g., Beowulf) (italics) */
       +        X,                /* cross reference to main word (small caps) */
       +        Xd,                /* cross reference to quotation by date */
       +        Xi,                /* internal cross reference ? (italic) */
       +        Xid,                /* cross reference identifer, in quote ? */
       +        Xs,                /* cross reference sense (lower number) */
       +        Xr,                /* list of x's */
       +        Ntag                /* end of tags */
       +};
       +
       +/* Assoc tables must be sorted on first field */
       +
       +static Assoc tagtab[] = {
       +        {"a",                A},
       +        {"b",                B},
       +        {"ba",                Ba},
       +        {"bch",                Bch},
       +        {"bib",                Bib},
       +        {"bl",                Bl},
       +        {"bo",                Bo},
       +        {"bu",                Bu},
       +        {"cb",                Cb},
       +        {"cf",                Cf},
       +        {"chem",        Chem},
       +        {"co",                Co},
       +        {"col",                Col},
       +        {"cu",                Cu},
       +        {"dat",                Dat},
       +        {"db",                Db},
       +        {"dn",                Dn},
       +        {"e",                E},
       +        {"ed",                Ed},
       +        {"et",                Etym},
       +        {"etym",        Etym},
       +        {"form",        Form},
       +        {"fq",                Fq},
       +        {"fr",                Fr},
       +        {"frac",        Fr},
       +        {"gk",                Gk},
       +        {"gr",                Gr},
       +        {"hg",                Hg},
       +        {"hm",                Hm},
       +        {"hw",                Hw},
       +        {"i",                I},
       +        {"il",                Il},
       +        {"in",                In},
       +        {"l",                L},
       +        {"la",                La},
       +        {"lc",                Lc},
       +        {"n",                N},
       +        {"nu",                Nu},
       +        {"ov",                Ov},
       +        {"p",                P},
       +        {"ph",                Ph},
       +        {"pi",                Pi},
       +        {"pqp",                Pqp},
       +        {"pr",                Pr},
       +        {"ps",                Ps},
       +        {"pt",                Pt},
       +        {"q",                Q},
       +        {"qd",                Qd},
       +        {"qig",                Qig},
       +        {"qla",                Qla},
       +        {"qp",                Qp},
       +        {"qsn",                Qsn},
       +        {"qt",                Qt},
       +        {"r",                R},
       +        {"rx",                Rx},
       +        {"s",                S},
       +        {"s0",                S0},
       +        {"s1",                S1},
       +        {"s2",                S2},
       +        {"s3",                S3},
       +        {"s4",                S4},
       +        {"s5",                S5},
       +        {"s6",                S6},
       +        {"s7a",                S7a},
       +        {"s7n",                S7n},
       +        {"sc",                Sc},
       +        {"sgk",                Sgk},
       +        {"sn",                Sn},
       +        {"ss",                Ss,},
       +        {"ssb",                Ssb},
       +        {"ssi",                Ssi},
       +        {"su",                Su},
       +        {"sub",                Sub},
       +        {"table",        Table},
       +        {"tt",                Tt},
       +        {"vd",                Vd},
       +        {"ve",                Ve},
       +        {"vf",                Vf},
       +        {"vfl",                Vfl},
       +        {"w",                W},
       +        {"x",                X},
       +        {"xd",                Xd},
       +        {"xi",                Xi},
       +        {"xid",                Xid},
       +        {"xr",                Xr},
       +        {"xs",                Xs},
       +};
       +
       +/* Possible tag auxilliary info */
       +enum {
       +        Cols,                /* number of columns in a table */
       +        Num,                /* letter or number, for a sense */
       +        St,                /* status (e.g., obs) */
       +        Naux
       +};
       +
       +static Assoc auxtab[] = {
       +        {"cols",        Cols},
       +        {"num",                Num},
       +        {"st",                St}
       +};
       +
       +static Assoc spectab[] = {
       +        {"3on4",        0xbe},
       +        {"Aacu",        0xc1},
       +        {"Aang",        0xc5},
       +        {"Abarab",        0x100},
       +        {"Acirc",        0xc2},
       +        {"Ae",                0xc6},
       +        {"Agrave",        0xc0},
       +        {"Alpha",        0x391},
       +        {"Amac",        0x100},
       +        {"Asg",                0x1b7},                /* Unicyle. Cf "Sake" */
       +        {"Auml",        0xc4},
       +        {"Beta",        0x392},
       +        {"Cced",        0xc7},
       +        {"Chacek",        0x10c},
       +        {"Chi",                0x3a7},
       +        {"Chirho",        0x2627},                /* Chi Rho U+2627 */
       +        {"Csigma",        0x3da},
       +        {"Delta",        0x394},
       +        {"Eacu",        0xc9},
       +        {"Ecirc",        0xca},
       +        {"Edh",                0xd0},
       +        {"Epsilon",        0x395},
       +        {"Eta",                0x397},
       +        {"Gamma",        0x393},
       +        {"Iacu",        0xcd},
       +        {"Icirc",        0xce},
       +        {"Imac",        0x12a},
       +        {"Integ",        0x222b},
       +        {"Iota",        0x399},
       +        {"Kappa",        0x39a},
       +        {"Koppa",        0x3de},
       +        {"Lambda",        0x39b},
       +        {"Lbar",        0x141},
       +        {"Mu",                0x39c},
       +        {"Naira",        0x4e},                /* should have bar through */
       +        {"Nplus",        0x4e},                /* should have plus above */
       +        {"Ntilde",        0xd1},
       +        {"Nu",                0x39d},
       +        {"Oacu",        0xd3},
       +        {"Obar",        0xd8},
       +        {"Ocirc",        0xd4},
       +        {"Oe",                0x152},
       +        {"Omega",        0x3a9},
       +        {"Omicron",        0x39f},
       +        {"Ouml",        0xd6},
       +        {"Phi",                0x3a6},
       +        {"Pi",                0x3a0},
       +        {"Psi",                0x3a8},
       +        {"Rho",                0x3a1},
       +        {"Sacu",        0x15a},
       +        {"Sigma",        0x3a3},
       +        {"Summ",        0x2211},
       +        {"Tau",                0x3a4},
       +        {"Th",                0xde},
       +        {"Theta",        0x398},
       +        {"Tse",                0x426},
       +        {"Uacu",        0xda},
       +        {"Ucirc",        0xdb},
       +        {"Upsilon",        0x3a5},
       +        {"Uuml",        0xdc},
       +        {"Wyn",                0x1bf},                /* wynn U+01BF */
       +        {"Xi",                0x39e},
       +        {"Ygh",                0x1b7},                /* Yogh        U+01B7 */
       +        {"Zeta",        0x396},
       +        {"Zh",                0x1b7},                /* looks like Yogh. Cf "Sake" */
       +        {"a",                0x61},                /* ante */
       +        {"aacu",        0xe1},
       +        {"aang",        0xe5},
       +        {"aasper",        MAAS},
       +        {"abreve",        0x103},
       +        {"acirc",        0xe2},
       +        {"acu",                LACU},
       +        {"ae",                0xe6},
       +        {"agrave",        0xe0},
       +        {"ahook",        0x105},
       +        {"alenis",        MALN},
       +        {"alpha",        0x3b1},
       +        {"amac",        0x101},
       +        {"amp",                0x26},
       +        {"and",                MAND},
       +        {"ang",                LRNG},
       +        {"angle",        0x2220},
       +        {"ankh",        0x2625},                /* ankh U+2625 */
       +        {"ante",        0x61},                /* before (year) */
       +        {"aonq",        MAOQ},
       +        {"appreq",        0x2243},
       +        {"aquar",        0x2652},
       +        {"arDadfull",        0x636},                /* Dad U+0636 */
       +        {"arHa",        0x62d},                /* haa U+062D */
       +        {"arTa",        0x62a},                /* taa U+062A */
       +        {"arain",        0x639},                /* ain U+0639 */
       +        {"arainfull",        0x639},                /* ain U+0639 */
       +        {"aralif",        0x627},                /* alef U+0627 */
       +        {"arba",        0x628},                /* baa U+0628 */
       +        {"arha",        0x647},                /* ha U+0647 */
       +        {"aries",        0x2648},
       +        {"arnun",        0x646},                /* noon U+0646 */
       +        {"arnunfull",        0x646},                /* noon U+0646 */
       +        {"arpa",        0x647},                /* ha U+0647 */
       +        {"arqoph",        0x642},                /* qaf U+0642 */
       +        {"arshinfull",        0x634},                /* sheen U+0634 */
       +        {"arta",        0x62a},                /* taa U+062A */
       +        {"artafull",        0x62a},                /* taa U+062A */
       +        {"artha",        0x62b},                /* thaa U+062B */
       +        {"arwaw",        0x648},                /* waw U+0648 */
       +        {"arya",        0x64a},                /* ya U+064A */
       +        {"aryafull",        0x64a},                /* ya U+064A */
       +        {"arzero",        0x660},                /* indic zero U+0660 */
       +        {"asg",                0x292},                /* unicycle character. Cf "hallow" */
       +        {"asper",        LASP},
       +        {"assert",        0x22a2},
       +        {"astm",        0x2042},                /* asterism: should be upside down */
       +        {"at",                0x40},
       +        {"atilde",        0xe3},
       +        {"auml",        0xe4},
       +        {"ayin",        0x639},                /* arabic ain U+0639 */
       +        {"b1",                0x2d},                /* single bond */
       +        {"b2",                0x3d},                /* double bond */
       +        {"b3",                0x2261},                /* triple bond */
       +        {"bbar",        0x180},                /* b with bar U+0180 */
       +        {"beta",        0x3b2},
       +        {"bigobl",        0x2f},
       +        {"blC",                0x43},                /* should be black letter */
       +        {"blJ",                0x4a},                /* should be black letter */
       +        {"blU",                0x55},                /* should be black letter */
       +        {"blb",                0x62},                /* should be black letter */
       +        {"blozenge",        0x25ca},                /* U+25CA; should be black */
       +        {"bly",                0x79},                /* should be black letter */
       +        {"bra",                MBRA},
       +        {"brbl",        LBRB},
       +        {"breve",        LBRV},
       +        {"bslash",        L'\\'},
       +        {"bsquare",        0x25a0},                /* black square U+25A0 */
       +        {"btril",        0x25c0},                /* U+25C0 */
       +        {"btrir",        0x25b6},                /* U+25B6 */
       +        {"c",                0x63},                /* circa */
       +        {"cab",                0x232a},
       +        {"cacu",        0x107},
       +        {"canc",        0x264b},
       +        {"capr",        0x2651},
       +        {"caret",        0x5e},
       +        {"cb",                0x7d},
       +        {"cbigb",        0x7d},
       +        {"cbigpren",        0x29},
       +        {"cbigsb",        0x5d},
       +        {"cced",        0xe7},
       +        {"cdil",        LCED},
       +        {"cdsb",        0x301b},                /* ]] U+301b */
       +        {"cent",        0xa2},
       +        {"chacek",        0x10d},
       +        {"chi",                0x3c7},
       +        {"circ",        LRNG},
       +        {"circa",        0x63},                /* about (year) */
       +        {"circbl",        0x325},                /* ring below accent U+0325 */
       +        {"circle",        0x25cb},                /* U+25CB */
       +        {"circledot",        0x2299},
       +        {"click",        0x296},
       +        {"club",        0x2663},
       +        {"comtime",        0x43},
       +        {"conj",        0x260c},
       +        {"cprt",        0xa9},
       +        {"cq",                '\''},
       +        {"cqq",                0x201d},
       +        {"cross",        0x2720},                /* maltese cross U+2720 */
       +        {"crotchet",        0x2669},
       +        {"csb",                0x5d},
       +        {"ctilde",        0x63},                /* +tilde */
       +        {"ctlig",        MLCT},
       +        {"cyra",        0x430},
       +        {"cyre",        0x435},
       +        {"cyrhard",        0x44a},
       +        {"cyrjat",        0x463},
       +        {"cyrm",        0x43c},
       +        {"cyrn",        0x43d},
       +        {"cyrr",        0x440},
       +        {"cyrsoft",        0x44c},
       +        {"cyrt",        0x442},
       +        {"cyry",        0x44b},
       +        {"dag",                0x2020},
       +        {"dbar",        0x111},
       +        {"dblar",        0x21cb},
       +        {"dblgt",        0x226b},
       +        {"dbllt",        0x226a},
       +        {"dced",        0x64},                /* +cedilla */
       +        {"dd",                MDD},
       +        {"ddag",        0x2021},
       +        {"ddd",                MDDD},
       +        {"decr",        0x2193},
       +        {"deg",                0xb0},
       +        {"dele",        0x64},                /* should be dele */
       +        {"delta",        0x3b4},
       +        {"descnode",        0x260b},                /* descending node U+260B */
       +        {"diamond",        0x2662},
       +        {"digamma",        0x3dd},
       +        {"div",                0xf7},
       +        {"dlessi",        0x131},
       +        {"dlessj1",        0x6a},                /* should be dotless */
       +        {"dlessj2",        0x6a},                /* should be dotless */
       +        {"dlessj3",        0x6a},                /* should be dotless */
       +        {"dollar",        0x24},
       +        {"dotab",        LDOT},
       +        {"dotbl",        LDTB},
       +        {"drachm",        0x292},
       +        {"dubh",        0x2d},
       +        {"eacu",        0xe9},
       +        {"earth",        0x2641},
       +        {"easper",        MEAS},
       +        {"ebreve",        0x115},
       +        {"ecirc",        0xea},
       +        {"edh",                0xf0},
       +        {"egrave",        0xe8},
       +        {"ehacek",        0x11b},
       +        {"ehook",        0x119},
       +        {"elem",        0x220a},
       +        {"elenis",        MELN},
       +        {"em",                0x2014},
       +        {"emac",        0x113},
       +        {"emem",        MEMM},
       +        {"en",                0x2013},
       +        {"epsilon",        0x3b5},
       +        {"equil",        0x21cb},
       +        {"ergo",        0x2234},
       +        {"es",                MES},
       +        {"eszett",        0xdf},
       +        {"eta",                0x3b7},
       +        {"eth",                0xf0},
       +        {"euml",        0xeb},
       +        {"expon",        0x2191},
       +        {"fact",        0x21},
       +        {"fata",        0x251},
       +        {"fatpara",        0xb6},                /* should have fatter, filled in bowl */
       +        {"female",        0x2640},
       +        {"ffilig",        MLFFI},
       +        {"fflig",        MLFF},
       +        {"ffllig",        MLFFL},
       +        {"filig",        MLFI},
       +        {"flat",        0x266d},
       +        {"fllig",        MLFL},
       +        {"frE",                0x45},                /* should be curly */
       +        {"frL",                L'L'},                /* should be curly */
       +        {"frR",                0x52},                /* should be curly */
       +        {"frakB",        0x42},                /* should have fraktur style */
       +        {"frakG",        0x47},
       +        {"frakH",        0x48},
       +        {"frakI",        0x49},
       +        {"frakM",        0x4d},
       +        {"frakU",        0x55},
       +        {"frakX",        0x58},
       +        {"frakY",        0x59},
       +        {"frakh",        0x68},
       +        {"frbl",        LFRB},
       +        {"frown",        LFRN},
       +        {"fs",                0x20},
       +        {"fsigma",        0x3c2},
       +        {"gAacu",        0xc1},                /* should be Α+acute */
       +        {"gaacu",        0x3b1},                /* +acute */
       +        {"gabreve",        0x3b1},                /* +breve */
       +        {"gafrown",        0x3b1},                /* +frown */
       +        {"gagrave",        0x3b1},                /* +grave */
       +        {"gamac",        0x3b1},                /* +macron */
       +        {"gamma",        0x3b3},
       +        {"gauml",        0x3b1},                /* +umlaut */
       +        {"ge",                0x2267},
       +        {"geacu",        0x3b5},                /* +acute */
       +        {"gegrave",        0x3b5},                /* +grave */
       +        {"ghacu",        0x3b7},                /* +acute */
       +        {"ghfrown",        0x3b7},                /* +frown */
       +        {"ghgrave",        0x3b7},                /* +grave */
       +        {"ghmac",        0x3b7},                /* +macron */
       +        {"giacu",        0x3b9},                /* +acute */
       +        {"gibreve",        0x3b9},                /* +breve */
       +        {"gifrown",        0x3b9},                /* +frown */
       +        {"gigrave",        0x3b9},                /* +grave */
       +        {"gimac",        0x3b9},                /* +macron */
       +        {"giuml",        0x3b9},                /* +umlaut */
       +        {"glagjat",        0x467},
       +        {"glots",        0x2c0},
       +        {"goacu",        0x3bf},                /* +acute */
       +        {"gobreve",        0x3bf},                /* +breve */
       +        {"grave",        LGRV},
       +        {"gt",                0x3e},
       +        {"guacu",        0x3c5},                /* +acute */
       +        {"gufrown",        0x3c5},                /* +frown */
       +        {"gugrave",        0x3c5},                /* +grave */
       +        {"gumac",        0x3c5},                /* +macron */
       +        {"guuml",        0x3c5},                /* +umlaut */
       +        {"gwacu",        0x3c9},                /* +acute */
       +        {"gwfrown",        0x3c9},                /* +frown */
       +        {"gwgrave",        0x3c9},                /* +grave */
       +        {"hacek",        LHCK},
       +        {"halft",        0x2308},
       +        {"hash",        0x23},
       +        {"hasper",        MHAS},
       +        {"hatpath",        0x5b2},                /* hataf patah U+05B2 */
       +        {"hatqam",        0x5b3},                /* hataf qamats U+05B3 */
       +        {"hatseg",        0x5b1},                /* hataf segol U+05B1 */
       +        {"hbar",        0x127},
       +        {"heart",        0x2661},
       +        {"hebaleph",        0x5d0},                /* aleph U+05D0 */
       +        {"hebayin",        0x5e2},                /* ayin U+05E2 */
       +        {"hebbet",        0x5d1},                /* bet U+05D1 */
       +        {"hebbeth",        0x5d1},                /* bet U+05D1 */
       +        {"hebcheth",        0x5d7},                /* bet U+05D7 */
       +        {"hebdaleth",        0x5d3},                /* dalet U+05D3 */
       +        {"hebgimel",        0x5d2},                /* gimel U+05D2 */
       +        {"hebhe",        0x5d4},                /* he U+05D4 */
       +        {"hebkaph",        0x5db},                /* kaf U+05DB */
       +        {"heblamed",        0x5dc},                /* lamed U+05DC */
       +        {"hebmem",        0x5de},                /* mem U+05DE */
       +        {"hebnun",        0x5e0},                /* nun U+05E0 */
       +        {"hebnunfin",        0x5df},                /* final nun U+05DF */
       +        {"hebpe",        0x5e4},                /* pe U+05E4 */
       +        {"hebpedag",        0x5e3},                /* final pe? U+05E3 */
       +        {"hebqoph",        0x5e7},                /* qof U+05E7 */
       +        {"hebresh",        0x5e8},                /* resh U+05E8 */
       +        {"hebshin",        0x5e9},                /* shin U+05E9 */
       +        {"hebtav",        0x5ea},                /* tav U+05EA */
       +        {"hebtsade",        0x5e6},                /* tsadi U+05E6 */
       +        {"hebwaw",        0x5d5},                /* vav? U+05D5 */
       +        {"hebyod",        0x5d9},                /* yod U+05D9 */
       +        {"hebzayin",        0x5d6},                /* zayin U+05D6 */
       +        {"hgz",                0x292},                /* ??? Cf "alet" */
       +        {"hireq",        0x5b4},                /* U+05B4 */
       +        {"hlenis",        MHLN},
       +        {"hook",        LOGO},
       +        {"horizE",        0x45},                /* should be on side */
       +        {"horizP",        0x50},                /* should be on side */
       +        {"horizS",        0x223d},
       +        {"horizT",        0x22a3},
       +        {"horizb",        0x7b},                /* should be underbrace */
       +        {"ia",                0x3b1},
       +        {"iacu",        0xed},
       +        {"iasper",        MIAS},
       +        {"ib",                0x3b2},
       +        {"ibar",        0x268},
       +        {"ibreve",        0x12d},
       +        {"icirc",        0xee},
       +        {"id",                0x3b4},
       +        {"ident",        0x2261},
       +        {"ie",                0x3b5},
       +        {"ifilig",        MLFI},
       +        {"ifflig",        MLFF},
       +        {"ig",                0x3b3},
       +        {"igrave",        0xec},
       +        {"ih",                0x3b7},
       +        {"ii",                0x3b9},
       +        {"ik",                0x3ba},
       +        {"ilenis",        MILN},
       +        {"imac",        0x12b},
       +        {"implies",        0x21d2},
       +        {"index",        0x261e},
       +        {"infin",        0x221e},
       +        {"integ",        0x222b},
       +        {"intsec",        0x2229},
       +        {"invpri",        0x2cf},
       +        {"iota",        0x3b9},
       +        {"iq",                0x3c8},
       +        {"istlig",        MLST},
       +        {"isub",        0x3f5},                /* iota below accent */
       +        {"iuml",        0xef},
       +        {"iz",                0x3b6},
       +        {"jup",                0x2643},
       +        {"kappa",        0x3ba},
       +        {"koppa",        0x3df},
       +        {"lambda",        0x3bb},
       +        {"lar",                0x2190},
       +        {"lbar",        0x142},
       +        {"le",                0x2266},
       +        {"lenis",        LLEN},
       +        {"leo",                0x264c},
       +        {"lhalfbr",        0x2308},
       +        {"lhshoe",        0x2283},
       +        {"libra",        0x264e},
       +        {"llswing",        MLLS},
       +        {"lm",                0x2d0},
       +        {"logicand",        0x2227},
       +        {"logicor",        0x2228},
       +        {"longs",        0x283},
       +        {"lrar",        0x2194},
       +        {"lt",                0x3c},
       +        {"ltappr",        0x227e},
       +        {"ltflat",        0x2220},
       +        {"lumlbl",        0x6c},                /* +umlaut below */
       +        {"mac",                LMAC},
       +        {"male",        0x2642},
       +        {"mc",                0x63},                /* should be raised */
       +        {"merc",        0x263f},                /* mercury U+263F */
       +        {"min",                0x2212},
       +        {"moonfq",        0x263d},                /* first quarter moon U+263D */
       +        {"moonlq",        0x263e},                /* last quarter moon U+263E */
       +        {"msylab",        0x6d},                /* +sylab (ˌ) */
       +        {"mu",                0x3bc},
       +        {"nacu",        0x144},
       +        {"natural",        0x266e},
       +        {"neq",                0x2260},
       +        {"nfacu",        0x2032},
       +        {"nfasper",        0x2bd},
       +        {"nfbreve",        0x2d8},
       +        {"nfced",        0xb8},
       +        {"nfcirc",        0x2c6},
       +        {"nffrown",        0x2322},
       +        {"nfgra",        0x2cb},
       +        {"nfhacek",        0x2c7},
       +        {"nfmac",        0xaf},
       +        {"nftilde",        0x2dc},
       +        {"nfuml",        0xa8},
       +        {"ng",                0x14b},
       +        {"not",                0xac},
       +        {"notelem",        0x2209},
       +        {"ntilde",        0xf1},
       +        {"nu",                0x3bd},
       +        {"oab",                0x2329},
       +        {"oacu",        0xf3},
       +        {"oasper",        MOAS},
       +        {"ob",                0x7b},
       +        {"obar",        0xf8},
       +        {"obigb",        0x7b},                /* should be big */
       +        {"obigpren",        0x28},
       +        {"obigsb",        0x5b},                /* should be big */
       +        {"obreve",        0x14f},
       +        {"ocirc",        0xf4},
       +        {"odsb",        0x301a},                /* [[ U+301A */
       +        {"oe",                0x153},
       +        {"oeamp",        0x26},
       +        {"ograve",        0xf2},
       +        {"ohook",        0x6f},                /* +hook */
       +        {"olenis",        MOLN},
       +        {"omac",        0x14d},
       +        {"omega",        0x3c9},
       +        {"omicron",        0x3bf},
       +        {"ope",                0x25b},
       +        {"opp",                0x260d},
       +        {"oq",                0x60},
       +        {"oqq",                0x201c},
       +        {"or",                MOR},
       +        {"osb",                0x5b},
       +        {"otilde",        0xf5},
       +        {"ouml",        0xf6},
       +        {"ounce",        0x2125},                /* ounce U+2125 */
       +        {"ovparen",        0x2322},                /* should be sideways ( */
       +        {"p",                0x2032},
       +        {"pa",                0x2202},
       +        {"page",        0x50},
       +        {"pall",        0x28e},
       +        {"paln",        0x272},
       +        {"par",                PAR},
       +        {"para",        0xb6},
       +        {"pbar",        0x70},                /* +bar */
       +        {"per",                0x2118},                /* per U+2118 */
       +        {"phi",                0x3c6},
       +        {"phi2",        0x3d5},
       +        {"pi",                0x3c0},
       +        {"pisces",        0x2653},
       +        {"planck",        0x127},
       +        {"plantinJ",        0x4a},                /* should be script */
       +        {"pm",                0xb1},
       +        {"pmil",        0x2030},
       +        {"pp",                0x2033},
       +        {"ppp",                0x2034},
       +        {"prop",        0x221d},
       +        {"psi",                0x3c8},
       +        {"pstlg",        0xa3},
       +        {"q",                0x3f},                /* should be raised */
       +        {"qamets",        0x5b3},                /* U+05B3 */
       +        {"quaver",        0x266a},
       +        {"rar",                0x2192},
       +        {"rasper",        MRAS},
       +        {"rdot",        0xb7},
       +        {"recipe",        0x211e},                /* U+211E */
       +        {"reg",                0xae},
       +        {"revC",        0x186},                /* open O U+0186 */
       +        {"reva",        0x252},
       +        {"revc",        0x254},
       +        {"revope",        0x25c},
       +        {"revr",        0x279},
       +        {"revsc",        0x2d2},                /* upside-down semicolon */
       +        {"revv",        0x28c},
       +        {"rfa",                0x6f},                /* +hook (Cf "goal") */
       +        {"rhacek",        0x159},
       +        {"rhalfbr",        0x2309},
       +        {"rho",                0x3c1},
       +        {"rhshoe",        0x2282},
       +        {"rlenis",        MRLN},
       +        {"rsylab",        0x72},                /* +sylab */
       +        {"runash",        0x46},                /* should be runic 'ash' */
       +        {"rvow",        0x2d4},
       +        {"sacu",        0x15b},
       +        {"sagit",        0x2650},
       +        {"sampi",        0x3e1},
       +        {"saturn",        0x2644},
       +        {"sced",        0x15f},
       +        {"schwa",        0x259},
       +        {"scorpio",        0x264f},
       +        {"scrA",        0x41},                /* should be script */
       +        {"scrC",        0x43},
       +        {"scrE",        0x45},
       +        {"scrF",        0x46},
       +        {"scrI",        0x49},
       +        {"scrJ",        0x4a},
       +        {"scrL",        L'L'},
       +        {"scrO",        0x4f},
       +        {"scrP",        0x50},
       +        {"scrQ",        0x51},
       +        {"scrS",        0x53},
       +        {"scrT",        0x54},
       +        {"scrb",        0x62},
       +        {"scrd",        0x64},
       +        {"scrh",        0x68},
       +        {"scrl",        0x6c},
       +        {"scruple",        0x2108},                /* U+2108 */
       +        {"sdd",                0x2d0},
       +        {"sect",        0xa7},
       +        {"semE",        0x2203},
       +        {"sh",                0x283},
       +        {"shacek",        0x161},
       +        {"sharp",        0x266f},
       +        {"sheva",        0x5b0},                /* U+05B0 */
       +        {"shti",        0x26a},
       +        {"shtsyll",        0x222a},
       +        {"shtu",        0x28a},
       +        {"sidetri",        0x22b2},
       +        {"sigma",        0x3c3},
       +        {"since",        0x2235},
       +        {"slge",        0x2265},                /* should have slanted line under */
       +        {"slle",        0x2264},                /* should have slanted line under */
       +        {"sm",                0x2c8},
       +        {"smm",                0x2cc},
       +        {"spade",        0x2660},
       +        {"sqrt",        0x221a},
       +        {"square",        0x25a1},                /* U+25A1 */
       +        {"ssChi",        0x3a7},                /* should be sans serif */
       +        {"ssIota",        0x399},
       +        {"ssOmicron",        0x39f},
       +        {"ssPi",        0x3a0},
       +        {"ssRho",        0x3a1},
       +        {"ssSigma",        0x3a3},
       +        {"ssTau",        0x3a4},
       +        {"star",        0x2a},
       +        {"stlig",        MLST},
       +        {"sup2",        0x2072},
       +        {"supgt",        0x2c3},
       +        {"suplt",        0x2c2},
       +        {"sur",                0x2b3},
       +        {"swing",        0x223c},
       +        {"tau",                0x3c4},
       +        {"taur",        0x2649},
       +        {"th",                0xfe},
       +        {"thbar",        0xfe},                /* +bar */
       +        {"theta",        0x3b8},
       +        {"thinqm",        0x3f},                /* should be thinner */
       +        {"tilde",        LTIL},
       +        {"times",        0xd7},
       +        {"tri",                0x2206},
       +        {"trli",        0x2016},
       +        {"ts",                0x2009},
       +        {"uacu",        0xfa},
       +        {"uasper",        MUAS},
       +        {"ubar",        0x75},                /* +bar */
       +        {"ubreve",        0x16d},
       +        {"ucirc",        0xfb},
       +        {"udA",                0x2200},
       +        {"udT",                0x22a5},
       +        {"uda",                0x250},
       +        {"udh",                0x265},
       +        {"udqm",        0xbf},
       +        {"udpsi",        0x22d4},
       +        {"udtr",        0x2207},
       +        {"ugrave",        0xf9},
       +        {"ulenis",        MULN},
       +        {"umac",        0x16b},
       +        {"uml",                LUML},
       +        {"undl",        0x2cd},                /* underline accent */
       +        {"union",        0x222a},
       +        {"upsilon",        0x3c5},
       +        {"uuml",        0xfc},
       +        {"vavpath",        0x5d5},                /* vav U+05D5 (+patah) */
       +        {"vavsheva",        0x5d5},                /* vav U+05D5 (+sheva) */
       +        {"vb",                0x7c},
       +        {"vddd",        0x22ee},
       +        {"versicle2",        0x2123},                /* U+2123 */
       +        {"vinc",        0xaf},
       +        {"virgo",        0x264d},
       +        {"vpal",        0x25f},
       +        {"vvf",                0x263},
       +        {"wasper",        MWAS},
       +        {"wavyeq",        0x2248},
       +        {"wlenis",        MWLN},
       +        {"wyn",                0x1bf},                /* wynn U+01BF */
       +        {"xi",                0x3be},
       +        {"yacu",        0xfd},
       +        {"ycirc",        0x177},
       +        {"ygh",                0x292},
       +        {"ymac",        0x79},                /* +macron */
       +        {"yuml",        0xff},
       +        {"zced",        0x7a},                /* +cedilla */
       +        {"zeta",        0x3b6},
       +        {"zh",                0x292},
       +        {"zhacek",        0x17e},
       +};
       +/*
       +   The following special characters don't have close enough
       +   equivalents in Unicode, so aren't in the above table.
       +        22n                2^(2^n) Cf Fermat
       +        2on4                2/4
       +        3on8                3/8
       +        Bantuo                Bantu O. Cf Otshi-herero
       +        Car                C with circular arrow on top
       +        albrtime         cut-time: C with vertical line
       +        ardal                Cf dental
       +        bantuo                Bantu o. Cf Otshi-herero
       +        bbc1                single chem bond below
       +        bbc2                double chem bond below
       +        bbl1                chem bond like /
       +        bbl2                chem bond like //
       +        bbr1                chem bond like \
       +        bbr2                chem bond \\
       +        bcop1                copper symbol. Cf copper
       +        bcop2                copper symbol. Cf copper
       +        benchm                Cf benchmark
       +        btc1                single chem bond above
       +        btc2                double chem bond above
       +        btl1                chem bond like \
       +        btl2                chem bond like \\
       +        btr1                chem bond like /
       +        btr2                chem bond line //
       +        burman                Cf Burman
       +        devph                sanskrit letter. Cf ph
       +        devrfls                sanskrit letter. Cf cerebral
       +        duplong[12]        musical note
       +        egchi                early form of chi
       +        eggamma[12]        early form of gamma
       +        egiota                early form of iota
       +        egkappa                early form of kappa
       +        eglambda        early form of lambda
       +        egmu[12]        early form of mu
       +        egnu[12]        early form of nu
       +        egpi[123]        early form of pi
       +        egrho[12]        early form of rho
       +        egsampi                early form of sampi
       +        egsan                early form of san
       +        egsigma[12]        early form of sigma
       +        egxi[123]        early form of xi
       +        elatS                early form of S
       +        elatc[12]        early form of C
       +        elatg[12]        early form of G
       +        glagjeri        Slavonic Glagolitic jeri
       +        glagjeru        Slavonic Glagolitic jeru
       +        hypolem                hypolemisk (line with underdot)
       +        lhrbr                lower half }
       +        longmord        long mordent
       +        mbwvow                backwards scretched C. Cf retract.
       +        mord                music symbol.  Cf mordent
       +        mostra                Cf direct
       +        ohgcirc                old form of circumflex
       +        oldbeta                old form of β. Cf perturbate
       +        oldsemibr[12]        old forms of semibreve. Cf prolation
       +        ormg                old form of g. Cf G
       +        para[12345]        form of ¶
       +        pauseo                musical pause sign
       +        pauseu                musical pause sign
       +        pharyng                Cf pharyngal
       +        ragr                Black letter ragged r
       +        repetn                musical repeat. Cf retort
       +        segno                musical segno sign
       +        semain[12]        semitic ain
       +        semhe                semitic he
       +        semheth                semitic heth
       +        semkaph                semitic kaph
       +        semlamed[12]        semitic lamed
       +        semmem                semitic mem
       +        semnum                semitic nun
       +        sempe                semitic pe
       +        semqoph[123]        semitic qoph
       +        semresh                semitic resh
       +        semtav[1234]        semitic tav
       +        semyod                semitic yod
       +        semzayin[123]        semitic zayin
       +        shtlong[12]        U with underbar. Cf glyconic
       +        sigmatau        σ,τ combination
       +        squaver                sixteenth note
       +        sqbreve                square musical breve note
       +        swast                swastika
       +        uhrbr                upper half of big }
       +        versicle1                Cf versicle
       + */
       +
       +
       +static Rune normtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        TAGS,        0x3d,        TAGE,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +static Rune phtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x2c8,        0x23,        0x24,        0x2cc,        0xe6,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x25c,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0xf8,        0x2d0,        0x3b,        TAGS,        0x3d,        TAGE,        0x3f,
       +/*40*/  0x259,        0x251,        0x42,        0x43,        0xf0,        0x25b,        0x46,        0x47,
       +        0x48,        0x26a,        0x4a,        0x4b,        L'L',        0x4d,        0x14b,        0x254,
       +/*50*/        0x50,        0x252,        0x52,        0x283,        0x3b8,        0x28a,        0x28c,        0x57,
       +        0x58,        0x59,        0x292,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +static Rune grtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        TAGS,        0x3d,        TAGE,        0x3f,
       +/*40*/  0x40,        0x391,        0x392,        0x39e,        0x394,        0x395,        0x3a6,        0x393,
       +        0x397,        0x399,        0x3da,        0x39a,        0x39b,        0x39c,        0x39d,        0x39f,
       +/*50*/        0x3a0,        0x398,        0x3a1,        0x3a3,        0x3a4,        0x3a5,        0x56,        0x3a9,
       +        0x3a7,        0x3a8,        0x396,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x3b1,        0x3b2,        0x3be,        0x3b4,        0x3b5,        0x3c6,        0x3b3,
       +        0x3b7,        0x3b9,        0x3c2,        0x3ba,        0x3bb,        0x3bc,        0x3bd,        0x3bf,
       +/*70*/        0x3c0,        0x3b8,        0x3c1,        0x3c3,        0x3c4,        0x3c5,        0x76,        0x3c9,
       +        0x3c7,        0x3c8,        0x3b6,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +static Rune subtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x208d,        0x208e,        0x2a,        0x208a,        0x2c,        0x208b,        0x2e,        0x2f,
       +/*30*/  0x2080,        0x2081,        0x2082,        0x2083,        0x2084,        0x2085,        0x2086,        0x2087,
       +        0x2088,        0x2089,        0x3a,        0x3b,        TAGS,        0x208c,        TAGE,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +static Rune suptab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x207d,        0x207e,        0x2a,        0x207a,        0x2c,        0x207b,        0x2e,        0x2f,
       +/*30*/  0x2070,        0x2071,        0x2072,        0x2073,        0x2074,        0x2075,        0x2076,        0x2077,
       +        0x2078,        0x2079,        0x3a,        0x3b,        TAGS,        0x207c,        TAGE,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +
       +static int        tagstarts;
       +static char        tag[Buflen];
       +static int        naux;
       +static char        auxname[Maxaux][Buflen];
       +static char        auxval[Maxaux][Buflen];
       +static char        spec[Buflen];
       +static uchar        *auxstate[Naux];        /* vals for most recent tag */
       +static Entry        curentry;
       +#define cursize (curentry.end-curentry.start)
       +
       +static char        *getspec(char *, char *);
       +static char        *gettag(char *, char *);
       +static void        dostatus(void);
       +
       +/*
       + * cmd is one of:
       + *    'p': normal print
       + *    'h': just print headwords
       + *    'P': print raw
       + */
       +void
       +oedprintentry(Entry e, int cmd)
       +{
       +        char *p, *pe;
       +        int t, a, i;
       +        long r, rprev, rlig;
       +        Rune *transtab;
       +
       +        p = e.start;
       +        pe = e.end;
       +        transtab = normtab;
       +        rprev = NONE;
       +        changett(0, 0, 0);
       +        curentry = e;
       +        if(cmd == 'h')
       +                outinhibit = 1;
       +        while(p < pe) {
       +                if(cmd == 'r') {
       +                        outchar(*p++);
       +                        continue;
       +                }
       +                r = transtab[(*p++)&0x7F];
       +                if(r < NONE) {
       +                        /* Emit the rune, but buffer in case of ligature */
       +                        if(rprev != NONE)
       +                                outrune(rprev);
       +                        rprev = r;
       +                } else if(r == SPCS) {
       +                        /* Start of special character name */
       +                        p = getspec(p, pe);
       +                        r = lookassoc(spectab, asize(spectab), spec);
       +                        if(r == -1) {
       +                                if(debug)
       +                                        err("spec %ld %d %s",
       +                                                e.doff, cursize, spec);
       +                                r = 0xfffd;
       +                        }
       +                        if(r >= LIGS && r < LIGE) {
       +                                /* handle possible ligature */
       +                                rlig = liglookup(r, rprev);
       +                                if(rlig != NONE)
       +                                        rprev = rlig;        /* overwrite rprev */
       +                                else {
       +                                        /* could print accent, but let's not */
       +                                        if(rprev != NONE) outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                        } else if(r >= MULTI && r < MULTIE) {
       +                                if(rprev != NONE) {
       +                                        outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                                outrunes(multitab[r-MULTI]);
       +                        } else if(r == PAR) {
       +                                if(rprev != NONE) {
       +                                        outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                                outnl(1);
       +                        } else {
       +                                if(rprev != NONE) outrune(rprev);
       +                                rprev = r;
       +                        }
       +                } else if(r == TAGS) {
       +                        /* Start of tag name */
       +                        if(rprev != NONE) {
       +                                outrune(rprev);
       +                                rprev = NONE;
       +                        }
       +                        p = gettag(p, pe);
       +                        t = lookassoc(tagtab, asize(tagtab), tag);
       +                        if(t == -1) {
       +                                if(debug)
       +                                        err("tag %ld %d %s",
       +                                                e.doff, cursize, tag);
       +                                continue;
       +                        }
       +                        for(i = 0; i < Naux; i++)
       +                                auxstate[i] = 0;
       +                        for(i = 0; i < naux; i++) {
       +                                a = lookassoc(auxtab, asize(auxtab), auxname[i]);
       +                                if(a == -1) {
       +                                        if(debug)
       +                                                err("aux %ld %d %s",
       +                                                        e.doff, cursize, auxname[i]);
       +                                } else
       +                                        auxstate[a] = auxval[i];
       +                        }
       +                        switch(t){
       +                        case E:
       +                        case Ve:
       +                                outnl(0);
       +                                if(tagstarts)
       +                                        dostatus();
       +                                break;
       +                        case Ed:
       +                        case Etym:
       +                                outchar(tagstarts? '[' : ']');
       +                                break;
       +                        case Pr:
       +                                outchar(tagstarts? '(' : ')');
       +                                break;
       +                        case In:
       +                                transtab = changett(transtab, subtab, tagstarts);
       +                                break;
       +                        case Hm:
       +                        case Su:
       +                        case Fq:
       +                                transtab = changett(transtab, suptab, tagstarts);
       +                                break;
       +                        case Gk:
       +                                transtab = changett(transtab, grtab, tagstarts);
       +                                break;
       +                        case Ph:
       +                                transtab = changett(transtab, phtab, tagstarts);
       +                                break;
       +                        case Hw:
       +                                if(cmd == 'h') {
       +                                        if(!tagstarts)
       +                                                outchar(' ');
       +                                        outinhibit = !tagstarts;
       +                                }
       +                                break;
       +                        case S0:
       +                        case S1:
       +                        case S2:
       +                        case S3:
       +                        case S4:
       +                        case S5:
       +                        case S6:
       +                        case S7a:
       +                        case S7n:
       +                        case Sn:
       +                        case Sgk:
       +                                if(tagstarts) {
       +                                        outnl(2);
       +                                        dostatus();
       +                                        if(auxstate[Num]) {
       +                                                if(t == S3 || t == S5) {
       +                                                        i = atoi(auxstate[Num]);
       +                                                        while(i--)
       +                                                                outchar('*');
       +                                                        outchars("  ");
       +                                                } else if(t == S7a || t == S7n || t == Sn) {
       +                                                        outchar('(');
       +                                                        outchars(auxstate[Num]);
       +                                                        outchars(") ");
       +                                                } else if(t == Sgk) {
       +                                                        i = grtab[auxstate[Num][0]];
       +                                                        if(i != NONE)
       +                                                                outrune(i);
       +                                                        outchars(".  ");
       +                                                } else {
       +                                                        outchars(auxstate[Num]);
       +                                                        outchars(".  ");
       +                                                }
       +                                        }
       +                                }
       +                                break;
       +                        case Cb:
       +                        case Db:
       +                        case Qp:
       +                        case P:
       +                                if(tagstarts)
       +                                        outnl(1);
       +                                break;
       +                        case Table:
       +                                /*
       +                                 * Todo: gather columns, justify them, etc.
       +                                 * For now, just let colums come out as rows
       +                                 */
       +                                if(!tagstarts)
       +                                        outnl(0);
       +                                break;
       +                        case Col:
       +                                if(tagstarts)
       +                                        outnl(0);
       +                                break;
       +                        case Dn:
       +                                if(tagstarts)
       +                                        outchar('/');
       +                                break;
       +                        }
       +                }
       +        }
       +        if(cmd == 'h') {
       +                outinhibit = 0;
       +                outnl(0);
       +        }
       +}
       +
       +/*
       + * Return offset into bdict where next oed entry after fromoff starts.
       + * Oed entries start with <e>, <ve>, <e st=...>, or <ve st=...>
       + */
       +long
       +oednextoff(long fromoff)
       +{
       +        long a, n;
       +        int c;
       +
       +        a = Bseek(bdict, fromoff, 0);
       +        if(a < 0)
       +                return -1;
       +        n = 0;
       +        for(;;) {
       +                c = Bgetc(bdict);
       +                if(c < 0)
       +                        break;
       +                if(c == '<') {
       +                        c = Bgetc(bdict);
       +                        if(c == 'e') {
       +                                c = Bgetc(bdict);
       +                                if(c == '>' || c == ' ')
       +                                        n = 3;
       +                        } else if(c == 'v' && Bgetc(bdict) == 'e') {
       +                                c = Bgetc(bdict);
       +                                if(c == '>' || c == ' ')
       +                                        n = 4;
       +                        }
       +                        if(n)
       +                                break;
       +                }
       +        }
       +        return (Boffset(bdict)-n);
       +}
       +
       +static char *prkey =
       +"KEY TO THE PRONUNCIATION\n"
       +"\n"
       +"I. CONSONANTS\n"
       +"b, d, f, k, l, m, n, p, t, v, z: usual English values\n"
       +"\n"
       +"g as in go (gəʊ)\n"
       +"h  ...  ho! (həʊ)\n"
       +"r  ...  run (rʌn), terrier (ˈtɛriə(r))\n"
       +"(r)...  her (hɜː(r))\n"
       +"s  ...  see (siː), success (səkˈsɜs)\n"
       +"w  ...  wear (wɛə(r))\n"
       +"hw ...  when (hwɛn)\n"
       +"j  ...  yes (jɛs)\n"
       +"θ  ...  thin (θin), bath (bɑːθ)\n"
       +"ð  ...  then (ðɛn), bathe (beɪð)\n"
       +"ʃ  ...  shop (ʃɒp), dish (dɪʃ)\n"
       +"tʃ ...  chop (tʃɒp), ditch (dɪtʃ)\n"
       +"ʒ  ...  vision (ˈvɪʒən), déjeuner (deʒøne)\n"
       +"dʒ ...  judge (dʒʌdʒ)\n"
       +"ŋ  ...  singing (ˈsɪŋɪŋ), think (θiŋk)\n"
       +"ŋg ...  finger (ˈfiŋgə(r))\n"
       +"\n"
       +"Foreign\n"
       +"ʎ as in It. seraglio (serˈraʎo)\n"
       +"ɲ  ...  Fr. cognac (kɔɲak)\n"
       +"x  ...  Ger. ach (ax), Sc. loch (lɒx)\n"
       +"ç  ...  Ger. ich (ɪç), Sc. nicht (nɪçt)\n"
       +"ɣ  ...  North Ger. sagen (ˈzaːɣən)\n"
       +"c  ...  Afrikaans baardmannetjie (ˈbaːrtmanəci)\n"
       +"ɥ  ...  Fr. cuisine (kɥizin)\n"
       +"\n"
       +"II. VOWELS AND DIPTHONGS\n"
       +"\n"
       +"Short\n"
       +"ɪ as in pit (pɪt), -ness (-nɪs)\n"
       +"ɛ  ...  pet (pɛt), Fr. sept (sɛt)\n"
       +"æ  ...  pat (pæt)\n"
       +"ʌ  ...  putt (pʌt)\n"
       +"ɒ  ...  pot (pɒt)\n"
       +"ʊ  ...  put (pʊt)\n"
       +"ə  ...  another (əˈnʌðə(r))\n"
       +"(ə)...  beaten (ˈbiːt(ə)n)\n"
       +"i  ...  Fr. si (si)\n"
       +"e  ...  Fr. bébé (bebe)\n"
       +"a  ...  Fr. mari (mari)\n"
       +"ɑ  ...  Fr. bâtiment (bɑtimã)\n"
       +"ɔ  ...  Fr. homme (ɔm)\n"
       +"o  ...  Fr. eau (o)\n"
       +"ø  ...  Fr. peu (pø)\n"
       +"œ  ...  Fr. boeuf (bœf), coeur (kœr)\n"
       +"u  ...  Fr. douce (dus)\n"
       +"ʏ  ...  Ger. Müller (ˈmʏlər)\n"
       +"y  ...  Fr. du (dy)\n"
       +"\n"
       +"Long\n"
       +"iː as in bean (biːn)\n"
       +"ɑː ...  barn (bɑːn)\n"
       +"ɔː ...  born (bɔːn)\n"
       +"uː ...  boon (buːn)\n"
       +"ɜː ...  burn (bɜːn)\n"
       +"eː ...  Ger. Schnee (ʃneː)\n"
       +"ɛː ...  Ger. Fähre (ˈfɛːrə)\n"
       +"aː ...  Ger. Tag (taːk)\n"
       +"oː ...  Ger. Sohn (zoːn)\n"
       +"øː ...  Ger. Goethe (gøːtə)\n"
       +"yː ...  Ger. grün (gryːn)\n"
       +"\n"
       +"Nasal\n"
       +"ɛ˜, æ˜ as in Fr. fin (fɛ˜, fæ˜)\n"
       +"ã  ...  Fr. franc (frã)\n"
       +"ɔ˜ ...  Fr. bon (bɔ˜n)\n"
       +"œ˜ ...  Fr. un (œ˜)\n"
       +"\n"
       +"Dipthongs, etc.\n"
       +"eɪ as in bay (beɪ)\n"
       +"aɪ ...  buy (baɪ)\n"
       +"ɔɪ ...  boy (bɔɪ)\n"
       +"əʊ ...  no (nəʊ)\n"
       +"aʊ ...  now (naʊ)\n"
       +"ɪə ...  peer (pɪə(r))\n"
       +"ɛə ...  pair (pɛə(r))\n"
       +"ʊə ...  tour (tʊə(r))\n"
       +"ɔə ...  boar (bɔə(r))\n"
       +"\n"
       +"III. STRESS\n"
       +"\n"
       +"Main stress: ˈ preceding stressed syllable\n"
       +"Secondary stress: ˌ preceding stressed syllable\n"
       +"\n"
       +"E.g.: pronunciation (prəˌnʌnsɪˈeɪʃ(ə)n)\n";
       +/* TODO: find transcriptions of foreign consonents, œ, ʏ, nasals */
       +
       +void
       +oedprintkey(void)
       +{
       +        Bprint(bout, "%s", prkey);
       +}
       +
       +/*
       + * f points just after a '&', fe points at end of entry.
       + * Accumulate the special name, starting after the &
       + * and continuing until the next '.', in spec[].
       + * Return pointer to char after '.'.
       + */
       +static char *
       +getspec(char *f, char *fe)
       +{
       +        char *t;
       +        int c, i;
       +
       +        t = spec;
       +        i = sizeof spec;
       +        while(--i > 0) {
       +                c = *f++;
       +                if(c == '.' || f == fe)
       +                        break;
       +                *t++ = c;
       +        }
       +        *t = 0;
       +        return f;
       +}
       +
       +/*
       + * f points just after '<'; fe points at end of entry.
       + * Expect next characters from bin to match:
       + *  [/][^ >]+( [^>=]+=[^ >]+)*>
       + *      tag   auxname auxval
       + * Accumulate the tag and its auxilliary information in
       + * tag[], auxname[][] and auxval[][].
       + * Set tagstarts=1 if the tag is 'starting' (has no '/'), else 0.
       + * Set naux to the number of aux pairs found.
       + * Return pointer to after final '>'.
       + */
       +static char *
       +gettag(char *f, char *fe)
       +{
       +        char *t;
       +        int c, i;
       +
       +        t = tag;
       +        c = *f++;
       +        if(c == '/')
       +                tagstarts = 0;
       +        else {
       +                tagstarts = 1;
       +                *t++ = c;
       +        }
       +        i = Buflen;
       +        naux = 0;
       +        while(--i > 0) {
       +                c = *f++;
       +                if(c == '>' || f == fe)
       +                        break;
       +                if(c == ' ') {
       +                        *t = 0;
       +                        t = auxname[naux];
       +                        i = Buflen;
       +                        if(naux < Maxaux-1)
       +                                naux++;
       +                } else if(naux && c == '=') {
       +                        *t = 0;
       +                        t = auxval[naux-1];
       +                        i = Buflen;
       +                } else
       +                        *t++ = c;
       +        }
       +        *t = 0;
       +        return f;
       +}
       +
       +static void
       +dostatus(void)
       +{
       +        char *s;
       +
       +        s = auxstate[St];
       +        if(s) {
       +                if(strcmp(s, "obs") == 0)
       +                        outrune(0x2020);
       +                else if(strcmp(s, "ali") == 0)
       +                        outrune(0x2016);
       +                else if(strcmp(s, "err") == 0 || strcmp(s, "spu") == 0)
       +                        outrune(0xb6);
       +                else if(strcmp(s, "xref") == 0)
       +                        {/* nothing */}
       +                else if(debug)
       +                        err("status %ld %d %s", curentry.doff, cursize, s);
       +        }
       +}
 (DIR) diff --git a/src/cmd/dict/pcollins.c b/src/cmd/dict/pcollins.c
       t@@ -0,0 +1,226 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/*
       + * Routines for handling dictionaries in the "Paperback Collins"
       + * format (with tags surrounded by >....<)
       + */
       +enum {
       +        Buflen=1000,
       +};
       +
       +/* More special runes */
       +enum {
       +        B = MULTIE+1,        /* bold */
       +        H,                /* headword start */
       +        I,                /* italics */
       +        Ps,                /* pronunciation start */
       +        Pe,                /* pronunciation end */
       +        R,                /* roman */
       +        X,                /* headword end */
       +};
       +
       +/* Assoc tables must be sorted on first field */
       +
       +static Assoc tagtab[] = {
       +        {"AA",                0xc5},
       +        {"AC",                LACU},
       +        {"B",                B},
       +        {"CE",                LCED},
       +        {"CI",                LFRN},
       +        {"Di",                0x131},
       +        {"EL",                0x2d},
       +        {"GR",                LGRV},
       +        {"H",                H},
       +        {"I",                I},
       +        {"OE",                0x152},
       +        {"R",                R},
       +        {"TI",                LTIL},
       +        {"UM",                LUML},
       +        {"X",                X},
       +        {"[",                Ps},
       +        {"]",                Pe},
       +        {"ac",                LACU},
       +        {"ce",                LCED},
       +        {"ci",                LFRN},
       +        {"gr",                LGRV},
       +        {"oe",                0x153},
       +        {"supe",        0x65},                /* should be raised */
       +        {"supo",        0x6f},                /* should be raised */
       +        {"ti",                LTIL},
       +        {"um",                LUML},
       +        {"{",                Ps},
       +        {"~",                0x7e},
       +        {"~~",                MTT},
       +};
       +
       +static Rune normtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        0x20,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        0x26,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        TAGE,        0x3d,        TAGS,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +
       +static char *gettag(char *, char *);
       +
       +static Entry        curentry;
       +static char        tag[Buflen];
       +#define cursize (curentry.end-curentry.start)
       +
       +void
       +pcollprintentry(Entry e, int cmd)
       +{
       +        char *p, *pe;
       +        long r, rprev, t, rlig;
       +        int saveoi;
       +        Rune *transtab;
       +
       +        p = e.start;
       +        pe = e.end;
       +        transtab = normtab;
       +        rprev = NONE;
       +        changett(0, 0, 0);
       +        curentry = e;
       +        saveoi = 0;
       +        if(cmd == 'h')
       +                outinhibit = 1;
       +        while(p < pe) {
       +                if(cmd == 'r') {
       +                        outchar(*p++);
       +                        continue;
       +                }
       +                r = transtab[(*p++)&0x7F];
       +                if(r < NONE) {
       +                        /* Emit the rune, but buffer in case of ligature */
       +                        if(rprev != NONE)
       +                                outrune(rprev);
       +                        rprev = r;
       +                } else if(r == TAGS) {
       +                        p = gettag(p, pe);
       +                        t = lookassoc(tagtab, asize(tagtab), tag);
       +                        if(t == -1) {
       +                                if(debug && !outinhibit)
       +                                        err("tag %ld %d %s",
       +                                                e.doff, cursize, tag);
       +                                continue;
       +                        }
       +                        if(t < NONE) {
       +                                if(rprev != NONE)
       +                                        outrune(rprev);
       +                                rprev = t;
       +                        } else if(t >= LIGS && t < LIGE) {
       +                                /* handle possible ligature */
       +                                rlig = liglookup(t, rprev);
       +                                if(rlig != NONE)
       +                                        rprev = rlig;        /* overwrite rprev */
       +                                else {
       +                                        /* could print accent, but let's not */
       +                                        if(rprev != NONE) outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                        } else if(t >= MULTI && t < MULTIE) {
       +                                if(rprev != NONE) {
       +                                        outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                                outrunes(multitab[t-MULTI]);
       +                        } else {
       +                                if(rprev != NONE) {
       +                                        outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                                switch(t){
       +                                case H:
       +                                        if(cmd == 'h')
       +                                                outinhibit = 0;
       +                                        else
       +                                                outnl(0);
       +                                        break;
       +                                case X:
       +                                        if(cmd == 'h')
       +                                                outinhibit = 1;
       +                                        else
       +                                                outchars(".  ");
       +                                        break;
       +                                case Ps:
       +                                        /* don't know enough of pron. key yet */
       +                                        saveoi = outinhibit;
       +                                        outinhibit = 1;
       +                                        break;
       +                                case Pe:
       +                                        outinhibit = saveoi;
       +                                        break;
       +                                }
       +                        }
       +                }
       +        }
       +        if(cmd == 'h')
       +                outinhibit = 0;
       +        outnl(0);
       +}
       +
       +long
       +pcollnextoff(long fromoff)
       +{
       +        long a;
       +        char *p;
       +
       +        a = Bseek(bdict, fromoff, 0);
       +        if(a < 0)
       +                return -1;
       +        for(;;) {
       +                p = Brdline(bdict, '\n');
       +                if(!p)
       +                        break;
       +                if(p[0] == '>' && p[1] == 'H' && p[2] == '<')
       +                        return (Boffset(bdict)-Blinelen(bdict));
       +        }
       +        return -1;
       +}
       +
       +void
       +pcollprintkey(void)
       +{
       +        Bprint(bout, "No pronunciation key yet\n");
       +}
       +
       +/*
       + * f points just after '>'; fe points at end of entry.
       + * Expect next characters from bin to match:
       + *  [^ <]+<
       + *     tag
       + * Accumulate the tag in tag[].
       + * Return pointer to after final '<'.
       + */
       +static char *
       +gettag(char *f, char *fe)
       +{
       +        char *t;
       +        int c, i;
       +
       +        t = tag;
       +        i = Buflen;
       +        while(--i > 0) {
       +                c = *f++;
       +                if(c == '<' || f == fe)
       +                        break;
       +                *t++ = c;
       +        }
       +        *t = 0;
       +        return f;
       +}
 (DIR) diff --git a/src/cmd/dict/pcollinsg.c b/src/cmd/dict/pcollinsg.c
       t@@ -0,0 +1,248 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/*
       + * Routines for handling dictionaries in the "Paperback Collins"
       + * `German' format (with tags surrounded by \5⋯\6 and \xba⋯\xba)
       + */
       +
       +/*
       + *        \5...\6 escapes (fonts, mostly)
       + *
       + *        h        headword (helvetica 7 pt)
       + *        c        clause (helvetica 7 pt)
       + *        3        helvetica 7 pt
       + *        4        helvetica 6.5 pt
       + *        s        helvetica 8 pt
       + *        x        helvetica 8 pt
       + *        y        helvetica 5 pt
       + *        m        helvetica 30 pt
       + *        1        roman 6 pt
       + *        9        roman 4.5 pt
       + *        p        roman 7 pt
       + *        q        roman 4.5 pt
       + *        2        italic 6 pt
       + *        7        italic 4.5 pt
       + *        b        bold 6 pt
       + *        a        `indent 0:4 left'
       + *        k        `keep 9'
       + *        l        `size 12'
       + */
       +
       +enum {
       +        IBASE=0x69,        /* dotless i */
       +        Taglen=32,
       +};
       +
       +static Rune intab[256] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        TAGS,        TAGE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        0x20,        NONE,        NONE,
       +/*10*/        NONE,        0x2d,        0x20,        0x20,        NONE,        NONE,        NONE,        NONE,
       +        0x20,        NONE,        NONE,        NONE,        0x20,        NONE,        NONE,        0x2d,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        0x26,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        0x3c,        0x3d,        0x3e,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +/*80*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        0x20,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*90*/        0xdf,        0xe6,        NONE,        MOE,        NONE,        NONE,        NONE,        0xf8,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*A0*/        NONE,        NONE,        0x22,        0xa3,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*B0*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        0x7e,
       +        NONE,        IBASE,        SPCS,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*C0*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*D0*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*E0*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*F0*/        0x20,        0x20,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +};
       +
       +static Nassoc numtab[] = {
       +        {1,        0x2b},
       +        {4,        0x3d},
       +        {7,        0xb0},
       +        {11,        0x2248},
       +        {69,        0x2666},
       +        {114,        0xae},
       +        {340,        0x25b},
       +        {341,        0x254},
       +        {342,        0x28c},
       +        {343,        0x259},
       +        {345,        0x292},
       +        {346,        0x283},
       +        {347,        0x275},
       +        {348,        0x28a},
       +        {349,        0x2c8},
       +        {351,        0x26a},
       +        {352,        0x25c},
       +        {354,        0x251},
       +        {355,        0x7e},
       +        {356,        0x252},
       +        {384,        0x273},
       +        {445,        0xf0},        /* BUG -- should be script eth */
       +};
       +
       +static Nassoc overtab[] = {
       +        {0x2c,        LCED},
       +        {0x2f,        LACU},
       +        {0x3a,        LUML},
       +        {L'\\',        LGRV},
       +        {0x5e,        LFRN},
       +        {0x7e,        LTIL},
       +};
       +
       +static uchar *reach(uchar*, int);
       +
       +static Entry        curentry;
       +static char        tag[Taglen];
       +
       +void
       +pcollgprintentry(Entry e, int cmd)
       +{
       +        uchar *p, *pe;
       +        int r, rprev = NONE, rx, over = 0, font;
       +        char buf[16];
       +
       +        p = (uchar *)e.start;
       +        pe = (uchar *)e.end;
       +        curentry = e;
       +        if(cmd == 'h')
       +                outinhibit = 1;
       +        while(p < pe){
       +                if(cmd == 'r'){
       +                        outchar(*p++);
       +                        continue;
       +                }
       +                switch(r = intab[*p++]){        /* assign = */
       +                case TAGS:
       +                        if(rprev != NONE){
       +                                outrune(rprev);
       +                                rprev = NONE;
       +                        }
       +                        p = reach(p, 0x06);
       +                        font = tag[0];
       +                        if(cmd == 'h')
       +                                outinhibit = (font != 'h');
       +                        break;
       +
       +                case TAGE:        /* an extra one */
       +                        break;
       +        
       +                case SPCS:
       +                        p = reach(p, 0xba);
       +                        r = looknassoc(numtab, asize(numtab), strtol(tag,0,0));
       +                        if(r < 0){
       +                                if(rprev != NONE){
       +                                        outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                                sprint(buf, "\\N'%s'", tag);
       +                                outchars(buf);
       +                                break;
       +                        }
       +                        /* else fall through */
       +
       +                default:
       +                        if(over){
       +                                rx = looknassoc(overtab, asize(overtab), r);
       +                                if(rx > 0)
       +                                        rx = liglookup(rx, rprev);
       +                                if(rx > 0 && rx != NONE)
       +                                        outrune(rx);
       +                                else{
       +                                        outrune(rprev);
       +                                        if(r == ':')
       +                                                outrune(0xa8);
       +                                        else{
       +                                                outrune(0x5e);
       +                                                outrune(r);
       +                                        }
       +                                }
       +                                over = 0;
       +                                rprev = NONE;
       +                        }else if(r == '^'){
       +                                over = 1;
       +                        }else{
       +                                if(rprev != NONE)
       +                                        outrune(rprev);
       +                                rprev = r;
       +                        }
       +                }
       +                
       +        }
       +        if(rprev != NONE)
       +                outrune(rprev);
       +        if(cmd == 'h')
       +                outinhibit = 0;
       +        outnl(0);
       +}
       +
       +long
       +pcollgnextoff(long fromoff)
       +{
       +        int c, state = 0, defoff = -1;
       +
       +        if(Bseek(bdict, fromoff, 0) < 0)
       +                return -1;
       +        while((c = Bgetc(bdict)) >= 0){
       +                if(c == '\r')
       +                        defoff = Boffset(bdict);
       +                switch(state){
       +                case 0:
       +                        if(c == 0x05)
       +                                state = 1;
       +                        break;
       +                case 1:
       +                        if(c == 'h')
       +                                state = 2;
       +                        else
       +                                state = 0;
       +                        break;
       +                case 2:
       +                        if(c == 0x06)
       +                                return (Boffset(bdict)-3);
       +                        else
       +                                state = 0;
       +                        break;
       +                }
       +        }
       +        return defoff;
       +}
       +
       +void
       +pcollgprintkey(void)
       +{
       +        Bprint(bout, "No pronunciation key yet\n");
       +}
       +
       +static uchar *
       +reach(uchar *p, int tagchar)
       +{
       +        int c; char *q=tag;
       +
       +        while(p < (uchar *)curentry.end){
       +                c = *p++;
       +                if(c == tagchar)
       +                        break;
       +                *q++ = c;
       +                if(q >= &tag[sizeof tag-1])
       +                        break;
       +        }
       +        *q = 0;
       +        return p;
       +}
 (DIR) diff --git a/src/cmd/dict/pgw.c b/src/cmd/dict/pgw.c
       t@@ -0,0 +1,1165 @@
       +/* thanks to Caerwyn Jones <caerwyn@comcast.net> for this module */
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +enum {
       +        Buflen=1000,
       +        Maxaux=5,
       +};
       +
       +/* Possible tags */
       +enum {
       +        B,                /* Bold */
       +        Blockquote,        /* Block quote */
       +        Br,                /* Break line */
       +        Cd,                /* ? coloquial data */
       +        Col,                /* ? Coloquial */
       +        Def,                /* Definition */
       +        Hw,                 /* Head Word */
       +        I,                /* Italics */
       +        P,                /* Paragraph */
       +        Pos,                /* Part of Speach */
       +        Sn,                /* Sense */
       +        U,                /* ? cross reference*/
       +        Wf,                /* ? word form */
       +        Ntag                /* end of tags */
       +};
       +
       +/* Assoc tables must be sorted on first field */
       +
       +static Assoc tagtab[] = {
       +        {"b",                        B},
       +        {"blockquote",        Blockquote},
       +        {"BR",                Br},
       +        {"cd",                Cd},
       +        {"col",                Col},
       +        {"def",                Def},
       +        {"hw",                Hw},
       +        {"i",                        I},
       +        {"p",                        P},
       +        {"pos",                Pos},
       +        {"sn",                Sn},
       +        {"u",                        U},
       +        {"wf",                Wf},
       +};
       +
       +/* Possible tag auxilliary info */
       +enum {
       +        Cols,                /* number of columns in a table */
       +        Num,                /* letter or number, for a sense */
       +        St,                /* status (e.g., obs) */
       +        Naux
       +};
       +
       +#if 0
       +static Assoc auxtab[] = {
       +        {"cols",        Cols},
       +        {"num",                Num},
       +        {"st",                St}
       +};
       +#endif
       +
       +static Assoc spectab[] = {
       +        {"3on4",        0xbe},
       +        {"AElig",                0xc6},
       +        {"Aacute",        0xc1},
       +        {"Aang",        0xc5},
       +        {"Abarab",        0x100},
       +        {"Acirc",        0xc2},
       +        {"Agrave",        0xc0},
       +        {"Alpha",        0x391},
       +        {"Amacr",        0x100},
       +        {"Asg",                0x1b7},                /* Unicyle. Cf "Sake" */
       +        {"Auml",        0xc4},
       +        {"Beta",        0x392},
       +        {"Cced",        0xc7},
       +        {"Chacek",        0x10c},
       +        {"Chi",                0x3a7},
       +        {"Chirho",        0x2627},                /* Chi Rho U+2627 */
       +        {"Csigma",        0x3da},
       +        {"Delta",        0x394},
       +        {"Eacute",        0xc9},
       +        {"Ecirc",        0xca},
       +        {"Edh",                0xd0},
       +        {"Epsilon",        0x395},
       +        {"Eta",                0x397},
       +        {"Gamma",        0x393},
       +        {"Iacute",        0xcd},
       +        {"Icirc",        0xce},
       +        {"Imacr",        0x12a},
       +        {"Integ",        0x222b},
       +        {"Iota",        0x399},
       +        {"Kappa",        0x39a},
       +        {"Koppa",        0x3de},
       +        {"Lambda",        0x39b},
       +        {"Lbar",        0x141},
       +        {"Mu",                0x39c},
       +        {"Naira",        0x4e},                /* should have bar through */
       +        {"Nplus",        0x4e},                /* should have plus above */
       +        {"Ntilde",        0xd1},
       +        {"Nu",                0x39d},
       +        {"Oacute",        0xd3},
       +        {"Obar",        0xd8},
       +        {"Ocirc",        0xd4},
       +        {"Oe",                0x152},
       +        {"Omega",        0x3a9},
       +        {"Omicron",        0x39f},
       +        {"Ouml",        0xd6},
       +        {"Phi",                0x3a6},
       +        {"Pi",                0x3a0},
       +        {"Psi",                0x3a8},
       +        {"Rho",                0x3a1},
       +        {"Sacute",        0x15a},
       +        {"Sigma",        0x3a3},
       +        {"Summ",        0x2211},
       +        {"Tau",                0x3a4},
       +        {"Th",                0xde},
       +        {"Theta",        0x398},
       +        {"Tse",                0x426},
       +        {"Uacute",        0xda},
       +        {"Ucirc",        0xdb},
       +        {"Upsilon",        0x3a5},
       +        {"Uuml",        0xdc},
       +        {"Wyn",                0x1bf},                /* wynn U+01BF */
       +        {"Xi",                0x39e},
       +        {"Ygh",                0x1b7},                /* Yogh        U+01B7 */
       +        {"Zeta",        0x396},
       +        {"Zh",                0x1b7},                /* looks like Yogh. Cf "Sake" */
       +        {"a",                0x61},                /* ante */
       +        {"aacute",        0xe1},
       +        {"aang",        0xe5},
       +        {"aasper",        MAAS},
       +        {"abreve",        0x103},
       +        {"acirc",        0xe2},
       +        {"acute",                LACU},
       +        {"aelig",                0xe6},
       +        {"agrave",        0xe0},
       +        {"ahook",        0x105},
       +        {"alenis",        MALN},
       +        {"alpha",        0x3b1},
       +        {"amacr",        0x101},
       +        {"amp",                0x26},
       +        {"and",                MAND},
       +        {"ang",                LRNG},
       +        {"angle",        0x2220},
       +        {"ankh",        0x2625},                /* ankh U+2625 */
       +        {"ante",        0x61},                /* before (year) */
       +        {"aonq",        MAOQ},
       +        {"appreq",        0x2243},
       +        {"aquar",        0x2652},
       +        {"arDadfull",        0x636},                /* Dad U+0636 */
       +        {"arHa",        0x62d},                /* haa U+062D */
       +        {"arTa",        0x62a},                /* taa U+062A */
       +        {"arain",        0x639},                /* ain U+0639 */
       +        {"arainfull",        0x639},                /* ain U+0639 */
       +        {"aralif",        0x627},                /* alef U+0627 */
       +        {"arba",        0x628},                /* baa U+0628 */
       +        {"arha",        0x647},                /* ha U+0647 */
       +        {"aries",        0x2648},
       +        {"arnun",        0x646},                /* noon U+0646 */
       +        {"arnunfull",        0x646},                /* noon U+0646 */
       +        {"arpa",        0x647},                /* ha U+0647 */
       +        {"arqoph",        0x642},                /* qaf U+0642 */
       +        {"arshinfull",        0x634},                /* sheen U+0634 */
       +        {"arta",        0x62a},                /* taa U+062A */
       +        {"artafull",        0x62a},                /* taa U+062A */
       +        {"artha",        0x62b},                /* thaa U+062B */
       +        {"arwaw",        0x648},                /* waw U+0648 */
       +        {"arya",        0x64a},                /* ya U+064A */
       +        {"aryafull",        0x64a},                /* ya U+064A */
       +        {"arzero",        0x660},                /* indic zero U+0660 */
       +        {"asg",                0x292},                /* unicycle character. Cf "hallow" */
       +        {"asper",        LASP},
       +        {"assert",        0x22a2},
       +        {"astm",        0x2042},                /* asterism: should be upside down */
       +        {"at",                0x40},
       +        {"atilde",        0xe3},
       +        {"auml",        0xe4},
       +        {"ayin",        0x639},                /* arabic ain U+0639 */
       +        {"b1",                0x2d},                /* single bond */
       +        {"b2",                0x3d},                /* double bond */
       +        {"b3",                0x2261},                /* triple bond */
       +        {"bbar",        0x180},                /* b with bar U+0180 */
       +        {"beta",        0x3b2},
       +        {"bigobl",        0x2f},
       +        {"blC",                0x43},                /* should be black letter */
       +        {"blJ",                0x4a},                /* should be black letter */
       +        {"blU",                0x55},                /* should be black letter */
       +        {"blb",                0x62},                /* should be black letter */
       +        {"blozenge",        0x25ca},                /* U+25CA; should be black */
       +        {"bly",                0x79},                /* should be black letter */
       +        {"bra",                MBRA},
       +        {"brbl",        LBRB},
       +        {"breve",        LBRV},
       +        {"bslash",        L'\\'},
       +        {"bsquare",        0x25a0},                /* black square U+25A0 */
       +        {"btril",        0x25c0},                /* U+25C0 */
       +        {"btrir",        0x25b6},                /* U+25B6 */
       +        {"c",                0x63},                /* circa */
       +        {"cab",                0x232a},
       +        {"cacute",        0x107},
       +        {"canc",        0x264b},
       +        {"capr",        0x2651},
       +        {"caret",        0x5e},
       +        {"cb",                0x7d},
       +        {"cbigb",        0x7d},
       +        {"cbigpren",        0x29},
       +        {"cbigsb",        0x5d},
       +        {"cced",        0xe7},
       +        {"cdil",        LCED},
       +        {"cdsb",        0x301b},                /* ]] U+301b */
       +        {"cent",        0xa2},
       +        {"chacek",        0x10d},
       +        {"chi",                0x3c7},
       +        {"circ",        LRNG},
       +        {"circa",        0x63},                /* about (year) */
       +        {"circbl",        0x325},                /* ring below accent U+0325 */
       +        {"circle",        0x25cb},                /* U+25CB */
       +        {"circledot",        0x2299},
       +        {"click",        0x296},
       +        {"club",        0x2663},
       +        {"comtime",        0x43},
       +        {"conj",        0x260c},
       +        {"cprt",        0xa9},
       +        {"cq",                '\''},
       +        {"cqq",                0x201d},
       +        {"cross",        0x2720},                /* maltese cross U+2720 */
       +        {"crotchet",        0x2669},
       +        {"csb",                0x5d},
       +        {"ctilde",        0x63},                /* +tilde */
       +        {"ctlig",        MLCT},
       +        {"cyra",        0x430},
       +        {"cyre",        0x435},
       +        {"cyrhard",        0x44a},
       +        {"cyrjat",        0x463},
       +        {"cyrm",        0x43c},
       +        {"cyrn",        0x43d},
       +        {"cyrr",        0x440},
       +        {"cyrsoft",        0x44c},
       +        {"cyrt",        0x442},
       +        {"cyry",        0x44b},
       +        {"dag",                0x2020},
       +        {"dbar",        0x111},
       +        {"dblar",        0x21cb},
       +        {"dblgt",        0x226b},
       +        {"dbllt",        0x226a},
       +        {"dced",        0x64},                /* +cedilla */
       +        {"dd",                MDD},
       +        {"ddag",        0x2021},
       +        {"ddd",                MDDD},
       +        {"decr",        0x2193},
       +        {"deg",                0xb0},
       +        {"dele",        0x64},                /* should be dele */
       +        {"delta",        0x3b4},
       +        {"descnode",        0x260b},                /* descending node U+260B */
       +        {"diamond",        0x2662},
       +        {"digamma",        0x3dd},
       +        {"div",                0xf7},
       +        {"dlessi",        0x131},
       +        {"dlessj1",        0x6a},                /* should be dotless */
       +        {"dlessj2",        0x6a},                /* should be dotless */
       +        {"dlessj3",        0x6a},                /* should be dotless */
       +        {"dollar",        0x24},
       +        {"dotab",        LDOT},
       +        {"dotbl",        LDTB},
       +        {"drachm",        0x292},
       +        {"dubh",        0x2d},
       +        {"eacute",        0xe9},
       +        {"earth",        0x2641},
       +        {"easper",        MEAS},
       +        {"ebreve",        0x115},
       +        {"ecirc",        0xea},
       +        {"edh",                0xf0},
       +        {"egrave",        0xe8},
       +        {"ehacek",        0x11b},
       +        {"ehook",        0x119},
       +        {"elem",        0x220a},
       +        {"elenis",        MELN},
       +        {"em",                0x2014},
       +        {"emacr",        0x113},
       +        {"emem",        MEMM},
       +        {"en",                0x2013},
       +        {"epsilon",        0x3b5},
       +        {"equil",        0x21cb},
       +        {"ergo",        0x2234},
       +        {"es",                MES},
       +        {"eszett",        0xdf},
       +        {"eta",                0x3b7},
       +        {"eth",                0xf0},
       +        {"euml",        0xeb},
       +        {"expon",        0x2191},
       +        {"fact",        0x21},
       +        {"fata",        0x251},
       +        {"fatpara",        0xb6},                /* should have fatter, filled in bowl */
       +        {"female",        0x2640},
       +        {"ffilig",        MLFFI},
       +        {"fflig",        MLFF},
       +        {"ffllig",        MLFFL},
       +        {"filig",        MLFI},
       +        {"flat",        0x266d},
       +        {"fllig",        MLFL},
       +        {"frE",                0x45},                /* should be curly */
       +        {"frL",                L'L'},                /* should be curly */
       +        {"frR",                0x52},                /* should be curly */
       +        {"frakB",        0x42},                /* should have fraktur style */
       +        {"frakG",        0x47},
       +        {"frakH",        0x48},
       +        {"frakI",        0x49},
       +        {"frakM",        0x4d},
       +        {"frakU",        0x55},
       +        {"frakX",        0x58},
       +        {"frakY",        0x59},
       +        {"frakh",        0x68},
       +        {"frbl",        LFRB},
       +        {"frown",        LFRN},
       +        {"fs",                0x20},
       +        {"fsigma",        0x3c2},
       +        {"gAacute",        0xc1},                /* should be Α+acute */
       +        {"gaacute",        0x3b1},                /* +acute */
       +        {"gabreve",        0x3b1},                /* +breve */
       +        {"gafrown",        0x3b1},                /* +frown */
       +        {"gagrave",        0x3b1},                /* +grave */
       +        {"gamacr",        0x3b1},                /* +macron */
       +        {"gamma",        0x3b3},
       +        {"gauml",        0x3b1},                /* +umlaut */
       +        {"ge",                0x2267},
       +        {"geacute",        0x3b5},                /* +acute */
       +        {"gegrave",        0x3b5},                /* +grave */
       +        {"ghacute",        0x3b7},                /* +acute */
       +        {"ghfrown",        0x3b7},                /* +frown */
       +        {"ghgrave",        0x3b7},                /* +grave */
       +        {"ghmacr",        0x3b7},                /* +macron */
       +        {"giacute",        0x3b9},                /* +acute */
       +        {"gibreve",        0x3b9},                /* +breve */
       +        {"gifrown",        0x3b9},                /* +frown */
       +        {"gigrave",        0x3b9},                /* +grave */
       +        {"gimacr",        0x3b9},                /* +macron */
       +        {"giuml",        0x3b9},                /* +umlaut */
       +        {"glagjat",        0x467},
       +        {"glots",        0x2c0},
       +        {"goacute",        0x3bf},                /* +acute */
       +        {"gobreve",        0x3bf},                /* +breve */
       +        {"grave",        LGRV},
       +        {"gt",                0x3e},
       +        {"guacute",        0x3c5},                /* +acute */
       +        {"gufrown",        0x3c5},                /* +frown */
       +        {"gugrave",        0x3c5},                /* +grave */
       +        {"gumacr",        0x3c5},                /* +macron */
       +        {"guuml",        0x3c5},                /* +umlaut */
       +        {"gwacute",        0x3c9},                /* +acute */
       +        {"gwfrown",        0x3c9},                /* +frown */
       +        {"gwgrave",        0x3c9},                /* +grave */
       +        {"hacek",        LHCK},
       +        {"halft",        0x2308},
       +        {"hash",        0x23},
       +        {"hasper",        MHAS},
       +        {"hatpath",        0x5b2},                /* hataf patah U+05B2 */
       +        {"hatqam",        0x5b3},                /* hataf qamats U+05B3 */
       +        {"hatseg",        0x5b1},                /* hataf segol U+05B1 */
       +        {"hbar",        0x127},
       +        {"heart",        0x2661},
       +        {"hebaleph",        0x5d0},                /* aleph U+05D0 */
       +        {"hebayin",        0x5e2},                /* ayin U+05E2 */
       +        {"hebbet",        0x5d1},                /* bet U+05D1 */
       +        {"hebbeth",        0x5d1},                /* bet U+05D1 */
       +        {"hebcheth",        0x5d7},                /* bet U+05D7 */
       +        {"hebdaleth",        0x5d3},                /* dalet U+05D3 */
       +        {"hebgimel",        0x5d2},                /* gimel U+05D2 */
       +        {"hebhe",        0x5d4},                /* he U+05D4 */
       +        {"hebkaph",        0x5db},                /* kaf U+05DB */
       +        {"heblamed",        0x5dc},                /* lamed U+05DC */
       +        {"hebmem",        0x5de},                /* mem U+05DE */
       +        {"hebnun",        0x5e0},                /* nun U+05E0 */
       +        {"hebnunfin",        0x5df},                /* final nun U+05DF */
       +        {"hebpe",        0x5e4},                /* pe U+05E4 */
       +        {"hebpedag",        0x5e3},                /* final pe? U+05E3 */
       +        {"hebqoph",        0x5e7},                /* qof U+05E7 */
       +        {"hebresh",        0x5e8},                /* resh U+05E8 */
       +        {"hebshin",        0x5e9},                /* shin U+05E9 */
       +        {"hebtav",        0x5ea},                /* tav U+05EA */
       +        {"hebtsade",        0x5e6},                /* tsadi U+05E6 */
       +        {"hebwaw",        0x5d5},                /* vav? U+05D5 */
       +        {"hebyod",        0x5d9},                /* yod U+05D9 */
       +        {"hebzayin",        0x5d6},                /* zayin U+05D6 */
       +        {"hgz",                0x292},                /* ??? Cf "alet" */
       +        {"hireq",        0x5b4},                /* U+05B4 */
       +        {"hlenis",        MHLN},
       +        {"hook",        LOGO},
       +        {"horizE",        0x45},                /* should be on side */
       +        {"horizP",        0x50},                /* should be on side */
       +        {"horizS",        0x223d},
       +        {"horizT",        0x22a3},
       +        {"horizb",        0x7b},                /* should be underbrace */
       +        {"ia",                0x3b1},
       +        {"iacute",        0xed},
       +        {"iasper",        MIAS},
       +        {"ib",                0x3b2},
       +        {"ibar",        0x268},
       +        {"ibreve",        0x12d},
       +        {"icirc",        0xee},
       +        {"id",                0x3b4},
       +        {"ident",        0x2261},
       +        {"ie",                0x3b5},
       +        {"ifilig",        MLFI},
       +        {"ifflig",        MLFF},
       +        {"ig",                0x3b3},
       +        {"igrave",        0xec},
       +        {"ih",                0x3b7},
       +        {"ii",                0x3b9},
       +        {"ik",                0x3ba},
       +        {"ilenis",        MILN},
       +        {"imacr",        0x12b},
       +        {"implies",        0x21d2},
       +        {"index",        0x261e},
       +        {"infin",        0x221e},
       +        {"integ",        0x222b},
       +        {"intsec",        0x2229},
       +        {"invpri",        0x2cf},
       +        {"iota",        0x3b9},
       +        {"iq",                0x3c8},
       +        {"istlig",        MLST},
       +        {"isub",        0x3f5},                /* iota below accent */
       +        {"iuml",        0xef},
       +        {"iz",                0x3b6},
       +        {"jup",                0x2643},
       +        {"kappa",        0x3ba},
       +        {"koppa",        0x3df},
       +        {"lambda",        0x3bb},
       +        {"lar",                0x2190},
       +        {"lbar",        0x142},
       +        {"le",                0x2266},
       +        {"lenis",        LLEN},
       +        {"leo",                0x264c},
       +        {"lhalfbr",        0x2308},
       +        {"lhshoe",        0x2283},
       +        {"libra",        0x264e},
       +        {"llswing",        MLLS},
       +        {"lm",                0x2d0},
       +        {"logicand",        0x2227},
       +        {"logicor",        0x2228},
       +        {"longs",        0x283},
       +        {"lrar",        0x2194},
       +        {"lt",                0x3c},
       +        {"ltappr",        0x227e},
       +        {"ltflat",        0x2220},
       +        {"lumlbl",        0x6c},                /* +umlaut below */
       +        {"mac",                LMAC},
       +        {"male",        0x2642},
       +        {"mc",                0x63},                /* should be raised */
       +        {"merc",        0x263f},                /* mercury U+263F */
       +        {"min",                0x2212},
       +        {"moonfq",        0x263d},                /* first quarter moon U+263D */
       +        {"moonlq",        0x263e},                /* last quarter moon U+263E */
       +        {"msylab",        0x6d},                /* +sylab (ˌ) */
       +        {"mu",                0x3bc},
       +        {"nacute",        0x144},
       +        {"natural",        0x266e},
       +        {"neq",                0x2260},
       +        {"nfacute",        0x2032},
       +        {"nfasper",        0x2bd},
       +        {"nfbreve",        0x2d8},
       +        {"nfced",        0xb8},
       +        {"nfcirc",        0x2c6},
       +        {"nffrown",        0x2322},
       +        {"nfgra",        0x2cb},
       +        {"nfhacek",        0x2c7},
       +        {"nfmac",        0xaf},
       +        {"nftilde",        0x2dc},
       +        {"nfuml",        0xa8},
       +        {"ng",                0x14b},
       +        {"not",                0xac},
       +        {"notelem",        0x2209},
       +        {"ntilde",        0xf1},
       +        {"nu",                0x3bd},
       +        {"oab",                0x2329},
       +        {"oacute",        0xf3},
       +        {"oasper",        MOAS},
       +        {"ob",                0x7b},
       +        {"obar",        0xf8},
       +        {"obigb",        0x7b},                /* should be big */
       +        {"obigpren",        0x28},
       +        {"obigsb",        0x5b},                /* should be big */
       +        {"obreve",        0x14f},
       +        {"ocirc",        0xf4},
       +        {"odsb",        0x301a},                /* [[ U+301A */
       +        {"oelig",                0x153},
       +        {"oeamp",        0x26},
       +        {"ograve",        0xf2},
       +        {"ohook",        0x6f},                /* +hook */
       +        {"olenis",        MOLN},
       +        {"omacr",        0x14d},
       +        {"omega",        0x3c9},
       +        {"omicron",        0x3bf},
       +        {"ope",                0x25b},
       +        {"opp",                0x260d},
       +        {"oq",                0x60},
       +        {"oqq",                0x201c},
       +        {"or",                MOR},
       +        {"osb",                0x5b},
       +        {"otilde",        0xf5},
       +        {"ouml",        0xf6},
       +        {"ounce",        0x2125},                /* ounce U+2125 */
       +        {"ovparen",        0x2322},                /* should be sideways ( */
       +        {"p",                0x2032},
       +        {"pa",                0x2202},
       +        {"page",        0x50},
       +        {"pall",        0x28e},
       +        {"paln",        0x272},
       +        {"par",                PAR},
       +        {"para",        0xb6},
       +        {"pbar",        0x70},                /* +bar */
       +        {"per",                0x2118},                /* per U+2118 */
       +        {"phi",                0x3c6},
       +        {"phi2",        0x3d5},
       +        {"pi",                0x3c0},
       +        {"pisces",        0x2653},
       +        {"planck",        0x127},
       +        {"plantinJ",        0x4a},                /* should be script */
       +        {"pm",                0xb1},
       +        {"pmil",        0x2030},
       +        {"pp",                0x2033},
       +        {"ppp",                0x2034},
       +        {"prop",        0x221d},
       +        {"psi",                0x3c8},
       +        {"pstlg",        0xa3},
       +        {"q",                0x3f},                /* should be raised */
       +        {"qamets",        0x5b3},                /* U+05B3 */
       +        {"quaver",        0x266a},
       +        {"rar",                0x2192},
       +        {"rasper",        MRAS},
       +        {"rdot",        0xb7},
       +        {"recipe",        0x211e},                /* U+211E */
       +        {"reg",                0xae},
       +        {"revC",        0x186},                /* open O U+0186 */
       +        {"reva",        0x252},
       +        {"revc",        0x254},
       +        {"revope",        0x25c},
       +        {"revr",        0x279},
       +        {"revsc",        0x2d2},                /* upside-down semicolon */
       +        {"revv",        0x28c},
       +        {"rfa",                0x6f},                /* +hook (Cf "goal") */
       +        {"rhacek",        0x159},
       +        {"rhalfbr",        0x2309},
       +        {"rho",                0x3c1},
       +        {"rhshoe",        0x2282},
       +        {"rlenis",        MRLN},
       +        {"rsylab",        0x72},                /* +sylab */
       +        {"runash",        0x46},                /* should be runic 'ash' */
       +        {"rvow",        0x2d4},
       +        {"sacute",        0x15b},
       +        {"sagit",        0x2650},
       +        {"sampi",        0x3e1},
       +        {"saturn",        0x2644},
       +        {"sced",        0x15f},
       +        {"schwa",        0x259},
       +        {"scorpio",        0x264f},
       +        {"scrA",        0x41},                /* should be script */
       +        {"scrC",        0x43},
       +        {"scrE",        0x45},
       +        {"scrF",        0x46},
       +        {"scrI",        0x49},
       +        {"scrJ",        0x4a},
       +        {"scrL",        L'L'},
       +        {"scrO",        0x4f},
       +        {"scrP",        0x50},
       +        {"scrQ",        0x51},
       +        {"scrS",        0x53},
       +        {"scrT",        0x54},
       +        {"scrb",        0x62},
       +        {"scrd",        0x64},
       +        {"scrh",        0x68},
       +        {"scrl",        0x6c},
       +        {"scruple",        0x2108},                /* U+2108 */
       +        {"sdd",                0x2d0},
       +        {"sect",        0xa7},
       +        {"semE",        0x2203},
       +        {"sh",                0x283},
       +        {"shacek",        0x161},
       +        {"sharp",        0x266f},
       +        {"sheva",        0x5b0},                /* U+05B0 */
       +        {"shti",        0x26a},
       +        {"shtsyll",        0x222a},
       +        {"shtu",        0x28a},
       +        {"sidetri",        0x22b2},
       +        {"sigma",        0x3c3},
       +        {"since",        0x2235},
       +        {"slge",        0x2265},                /* should have slanted line under */
       +        {"slle",        0x2264},                /* should have slanted line under */
       +        {"sm",                0x2c8},
       +        {"smm",                0x2cc},
       +        {"spade",        0x2660},
       +        {"sqrt",        0x221a},
       +        {"square",        0x25a1},                /* U+25A1 */
       +        {"ssChi",        0x3a7},                /* should be sans serif */
       +        {"ssIota",        0x399},
       +        {"ssOmicron",        0x39f},
       +        {"ssPi",        0x3a0},
       +        {"ssRho",        0x3a1},
       +        {"ssSigma",        0x3a3},
       +        {"ssTau",        0x3a4},
       +        {"star",        0x2a},
       +        {"stlig",        MLST},
       +        {"sup2",        0x2072},
       +        {"supgt",        0x2c3},
       +        {"suplt",        0x2c2},
       +        {"sur",                0x2b3},
       +        {"swing",        0x223c},
       +        {"tau",                0x3c4},
       +        {"taur",        0x2649},
       +        {"th",                0xfe},
       +        {"thbar",        0xfe},                /* +bar */
       +        {"theta",        0x3b8},
       +        {"thinqm",        0x3f},                /* should be thinner */
       +        {"tilde",        LTIL},
       +        {"times",        0xd7},
       +        {"tri",                0x2206},
       +        {"trli",        0x2016},
       +        {"ts",                0x2009},
       +        {"uacute",        0xfa},
       +        {"uasper",        MUAS},
       +        {"ubar",        0x75},                /* +bar */
       +        {"ubreve",        0x16d},
       +        {"ucirc",        0xfb},
       +        {"udA",                0x2200},
       +        {"udT",                0x22a5},
       +        {"uda",                0x250},
       +        {"udh",                0x265},
       +        {"udqm",        0xbf},
       +        {"udpsi",        0x22d4},
       +        {"udtr",        0x2207},
       +        {"ugrave",        0xf9},
       +        {"ulenis",        MULN},
       +        {"umacr",        0x16b},
       +        {"uml",                LUML},
       +        {"undl",        0x2cd},                /* underline accent */
       +        {"union",        0x222a},
       +        {"upsilon",        0x3c5},
       +        {"uuml",        0xfc},
       +        {"vavpath",        0x5d5},                /* vav U+05D5 (+patah) */
       +        {"vavsheva",        0x5d5},                /* vav U+05D5 (+sheva) */
       +        {"vb",                0x7c},
       +        {"vddd",        0x22ee},
       +        {"versicle2",        0x2123},                /* U+2123 */
       +        {"vinc",        0xaf},
       +        {"virgo",        0x264d},
       +        {"vpal",        0x25f},
       +        {"vvf",                0x263},
       +        {"wasper",        MWAS},
       +        {"wavyeq",        0x2248},
       +        {"wlenis",        MWLN},
       +        {"wyn",                0x1bf},                /* wynn U+01BF */
       +        {"xi",                0x3be},
       +        {"yacute",        0xfd},
       +        {"ycirc",        0x177},
       +        {"ygh",                0x292},
       +        {"ymacr",        0x79},                /* +macron */
       +        {"yuml",        0xff},
       +        {"zced",        0x7a},                /* +cedilla */
       +        {"zeta",        0x3b6},
       +        {"zh",                0x292},
       +        {"zhacek",        0x17e},
       +};
       +/*
       +   The following special characters don't have close enough
       +   equivalents in Unicode, so aren't in the above table.
       +        22n                2^(2^n) Cf Fermat
       +        2on4                2/4
       +        3on8                3/8
       +        Bantuo                Bantu O. Cf Otshi-herero
       +        Car                C with circular arrow on top
       +        albrtime         cut-time: C with vertical line
       +        ardal                Cf dental
       +        bantuo                Bantu o. Cf Otshi-herero
       +        bbc1                single chem bond below
       +        bbc2                double chem bond below
       +        bbl1                chem bond like /
       +        bbl2                chem bond like //
       +        bbr1                chem bond like \
       +        bbr2                chem bond \\
       +        bcop1                copper symbol. Cf copper
       +        bcop2                copper symbol. Cf copper
       +        benchm                Cf benchmark
       +        btc1                single chem bond above
       +        btc2                double chem bond above
       +        btl1                chem bond like \
       +        btl2                chem bond like \\
       +        btr1                chem bond like /
       +        btr2                chem bond line //
       +        burman                Cf Burman
       +        devph                sanskrit letter. Cf ph
       +        devrfls                sanskrit letter. Cf cerebral
       +        duplong[12]        musical note
       +        egchi                early form of chi
       +        eggamma[12]        early form of gamma
       +        egiota                early form of iota
       +        egkappa                early form of kappa
       +        eglambda        early form of lambda
       +        egmu[12]        early form of mu
       +        egnu[12]        early form of nu
       +        egpi[123]        early form of pi
       +        egrho[12]        early form of rho
       +        egsampi                early form of sampi
       +        egsan                early form of san
       +        egsigma[12]        early form of sigma
       +        egxi[123]        early form of xi
       +        elatS                early form of S
       +        elatc[12]        early form of C
       +        elatg[12]        early form of G
       +        glagjeri        Slavonic Glagolitic jeri
       +        glagjeru        Slavonic Glagolitic jeru
       +        hypolem                hypolemisk (line with underdot)
       +        lhrbr                lower half }
       +        longmord        long mordent
       +        mbwvow                backwards scretched C. Cf retract.
       +        mord                music symbol.  Cf mordent
       +        mostra                Cf direct
       +        ohgcirc                old form of circumflex
       +        oldbeta                old form of β. Cf perturbate
       +        oldsemibr[12]        old forms of semibreve. Cf prolation
       +        ormg                old form of g. Cf G
       +        para[12345]        form of ¶
       +        pauseo                musical pause sign
       +        pauseu                musical pause sign
       +        pharyng                Cf pharyngal
       +        ragr                Black letter ragged r
       +        repetn                musical repeat. Cf retort
       +        segno                musical segno sign
       +        semain[12]        semitic ain
       +        semhe                semitic he
       +        semheth                semitic heth
       +        semkaph                semitic kaph
       +        semlamed[12]        semitic lamed
       +        semmem                semitic mem
       +        semnum                semitic nun
       +        sempe                semitic pe
       +        semqoph[123]        semitic qoph
       +        semresh                semitic resh
       +        semtav[1234]        semitic tav
       +        semyod                semitic yod
       +        semzayin[123]        semitic zayin
       +        shtlong[12]        U with underbar. Cf glyconic
       +        sigmatau        σ,τ combination
       +        squaver                sixteenth note
       +        sqbreve                square musical breve note
       +        swast                swastika
       +        uhrbr                upper half of big }
       +        versicle1                Cf versicle
       + */
       +
       +
       +static Rune normtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        ' ',        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        TAGS,        0x3d,        TAGE,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +#if 0
       +static Rune phtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x2c8,        0x23,        0x24,        0x2cc,        0xe6,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x25c,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0xf8,        0x2d0,        0x3b,        TAGS,        0x3d,        TAGE,        0x3f,
       +/*40*/  0x259,        0x251,        0x42,        0x43,        0xf0,        0x25b,        0x46,        0x47,
       +        0x48,        0x26a,        0x4a,        0x4b,        L'L',        0x4d,        0x14b,        0x254,
       +/*50*/        0x50,        0x252,        0x52,        0x283,        0x3b8,        0x28a,        0x28c,        0x57,
       +        0x58,        0x59,        0x292,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +static Rune grtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        TAGS,        0x3d,        TAGE,        0x3f,
       +/*40*/  0x40,        0x391,        0x392,        0x39e,        0x394,        0x395,        0x3a6,        0x393,
       +        0x397,        0x399,        0x3da,        0x39a,        0x39b,        0x39c,        0x39d,        0x39f,
       +/*50*/        0x3a0,        0x398,        0x3a1,        0x3a3,        0x3a4,        0x3a5,        0x56,        0x3a9,
       +        0x3a7,        0x3a8,        0x396,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x3b1,        0x3b2,        0x3be,        0x3b4,        0x3b5,        0x3c6,        0x3b3,
       +        0x3b7,        0x3b9,        0x3c2,        0x3ba,        0x3bb,        0x3bc,        0x3bd,        0x3bf,
       +/*70*/        0x3c0,        0x3b8,        0x3c1,        0x3c3,        0x3c4,        0x3c5,        0x76,        0x3c9,
       +        0x3c7,        0x3c8,        0x3b6,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +static Rune subtab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x208d,        0x208e,        0x2a,        0x208a,        0x2c,        0x208b,        0x2e,        0x2f,
       +/*30*/  0x2080,        0x2081,        0x2082,        0x2083,        0x2084,        0x2085,        0x2086,        0x2087,
       +        0x2088,        0x2089,        0x3a,        0x3b,        TAGS,        0x208c,        TAGE,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +static Rune suptab[128] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        SPCS,        '\'',
       +        0x207d,        0x207e,        0x2a,        0x207a,        0x2c,        0x207b,        0x2e,        0x2f,
       +/*30*/  0x2070,        0x2071,        0x2072,        0x2073,        0x2074,        0x2075,        0x2076,        0x2077,
       +        0x2078,        0x2079,        0x3a,        0x3b,        TAGS,        0x207c,        TAGE,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +};
       +#endif
       +
       +static int        tagstarts;
       +static char        tag[Buflen];
       +static char        spec[Buflen];
       +static Entry        curentry;
       +#define cursize (curentry.end-curentry.start)
       +
       +static char        *getspec(char *, char *);
       +static char        *gettag(char *, char *);
       +
       +/*
       + * cmd is one of:
       + *    'p': normal print
       + *    'h': just print headwords
       + *    'P': print raw
       + */
       +void
       +pgwprintentry(Entry e, int cmd)
       +{
       +        char *p, *pe;
       +        int t;
       +        long r, rprev, rlig;
       +        Rune *transtab;
       +
       +        p = e.start;
       +        pe = e.end;
       +        transtab = normtab;
       +        rprev = NONE;
       +        changett(0, 0, 0);
       +        curentry = e;
       +        if(cmd == 'h')
       +                outinhibit = 1;
       +        while(p < pe) {
       +                if(cmd == 'r') {
       +                        outchar(*p++);
       +                        continue;
       +                }
       +                r = transtab[(*p++)&0x7F];
       +                if(r < NONE) {
       +                        /* Emit the rune, but buffer in case of ligature */
       +                        if(rprev != NONE)
       +                                outrune(rprev);
       +                        rprev = r;
       +                } else if(r == SPCS) {
       +                        /* Start of special character name */
       +                        p = getspec(p, pe);
       +                        r = lookassoc(spectab, asize(spectab), spec);
       +                        if(r == -1) {
       +                                if(debug)
       +                                        err("spec %ld %d %s",
       +                                                e.doff, cursize, spec);
       +                                r = 0xfffd;
       +                        }
       +                        if(r >= LIGS && r < LIGE) {
       +                                /* handle possible ligature */
       +                                rlig = liglookup(r, rprev);
       +                                if(rlig != NONE)
       +                                        rprev = rlig;        /* overwrite rprev */
       +                                else {
       +                                        /* could print accent, but let's not */
       +                                        if(rprev != NONE) outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                        } else if(r >= MULTI && r < MULTIE) {
       +                                if(rprev != NONE) {
       +                                        outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                                outrunes(multitab[r-MULTI]);
       +                        } else if(r == PAR) {
       +                                if(rprev != NONE) {
       +                                        outrune(rprev);
       +                                        rprev = NONE;
       +                                }
       +                                outnl(1);
       +                        } else {
       +                                if(rprev != NONE) outrune(rprev);
       +                                rprev = r;
       +                        }
       +                } else if(r == TAGS) {
       +                        /* Start of tag name */
       +                        if(rprev != NONE) {
       +                                outrune(rprev);
       +                                rprev = NONE;
       +                        }
       +                        p = gettag(p, pe);
       +                        t = lookassoc(tagtab, asize(tagtab), tag);
       +                        if(t == -1) {
       +                                if(debug)
       +                                        err("tag %ld %d %s",
       +                                                e.doff, cursize, tag);
       +                                continue;
       +                        }
       +                        switch(t){
       +                        case Hw:
       +                                if(cmd == 'h') {
       +                                        if(!tagstarts)
       +                                                outchar(' ');
       +                                        outinhibit = !tagstarts;
       +                                }
       +                                break;
       +                        case Sn:
       +                                if(tagstarts) {
       +                                        outnl(2);
       +                                }
       +                                break;
       +                        case P:
       +                                outnl(tagstarts);
       +                                break;
       +                        case Col:
       +                        case Br:
       +                        case Blockquote:
       +                                if(tagstarts)
       +                                        outnl(1);
       +                                break;
       +                        case U:
       +                                outchar('/');
       +                        }
       +                }
       +        }
       +        if(cmd == 'h') {
       +                outinhibit = 0;
       +                outnl(0);
       +        }
       +}
       +
       +/*
       + * Return offset into bdict where next webster entry after fromoff starts.
       + * Webster entries start with <p><hw>
       + */
       +long
       +pgwnextoff(long fromoff)
       +{
       +        long a, n;
       +        int c;
       +
       +        a = Bseek(bdict, fromoff, 0);
       +        if(a != fromoff)
       +                return -1;
       +        n = 0;
       +        for(;;) {
       +                c = Bgetc(bdict);
       +                if(c < 0)
       +                        break;
       +                if(c == '<' && Bgetc(bdict) == 'p' && Bgetc(bdict) == '>') {
       +                        c = Bgetc(bdict);
       +                        if(c == '<') {
       +                                if (Bgetc(bdict) == 'h' && Bgetc(bdict) == 'w' 
       +                                        && Bgetc(bdict) == '>')
       +                                                n = 7;
       +                        }else if (c == '{')
       +                                n = 4;
       +                        if(n)
       +                                break;
       +                }
       +        }
       +        return (Boffset(bdict)-n);
       +}
       +
       +static char *prkey =
       +"KEY TO THE PRONUNCIATION\n"
       +"\n"
       +"I. CONSONANTS\n"
       +"b, d, f, k, l, m, n, p, t, v, z: usual English values\n"
       +"\n"
       +"g as in go (gəʊ)\n"
       +"h  ...  ho! (həʊ)\n"
       +"r  ...  run (rʌn), terrier (ˈtɛriə(r))\n"
       +"(r)...  her (hɜː(r))\n"
       +"s  ...  see (siː), success (səkˈsɜs)\n"
       +"w  ...  wear (wɛə(r))\n"
       +"hw ...  when (hwɛn)\n"
       +"j  ...  yes (jɛs)\n"
       +"θ  ...  thin (θin), bath (bɑːθ)\n"
       +"ð  ...  then (ðɛn), bathe (beɪð)\n"
       +"ʃ  ...  shop (ʃɒp), dish (dɪʃ)\n"
       +"tʃ ...  chop (tʃɒp), ditch (dɪtʃ)\n"
       +"ʒ  ...  vision (ˈvɪʒən), déjeuner (deʒøne)\n"
       +"dʒ ...  judge (dʒʌdʒ)\n"
       +"ŋ  ...  singing (ˈsɪŋɪŋ), think (θiŋk)\n"
       +"ŋg ...  finger (ˈfiŋgə(r))\n"
       +"\n"
       +"Foreign\n"
       +"ʎ as in It. seraglio (serˈraʎo)\n"
       +"ɲ  ...  Fr. cognac (kɔɲak)\n"
       +"x  ...  Ger. ach (ax), Sc. loch (lɒx)\n"
       +"ç  ...  Ger. ich (ɪç), Sc. nicht (nɪçt)\n"
       +"ɣ  ...  North Ger. sagen (ˈzaːɣən)\n"
       +"c  ...  Afrikaans baardmannetjie (ˈbaːrtmanəci)\n"
       +"ɥ  ...  Fr. cuisine (kɥizin)\n"
       +"\n"
       +"II. VOWELS AND DIPTHONGS\n"
       +"\n"
       +"Short\n"
       +"ɪ as in pit (pɪt), -ness (-nɪs)\n"
       +"ɛ  ...  pet (pɛt), Fr. sept (sɛt)\n"
       +"æ  ...  pat (pæt)\n"
       +"ʌ  ...  putt (pʌt)\n"
       +"ɒ  ...  pot (pɒt)\n"
       +"ʊ  ...  put (pʊt)\n"
       +"ə  ...  another (əˈnʌðə(r))\n"
       +"(ə)...  beaten (ˈbiːt(ə)n)\n"
       +"i  ...  Fr. si (si)\n"
       +"e  ...  Fr. bébé (bebe)\n"
       +"a  ...  Fr. mari (mari)\n"
       +"ɑ  ...  Fr. bâtiment (bɑtimã)\n"
       +"ɔ  ...  Fr. homme (ɔm)\n"
       +"o  ...  Fr. eau (o)\n"
       +"ø  ...  Fr. peu (pø)\n"
       +"œ  ...  Fr. boeuf (bœf), coeur (kœr)\n"
       +"u  ...  Fr. douce (dus)\n"
       +"ʏ  ...  Ger. Müller (ˈmʏlər)\n"
       +"y  ...  Fr. du (dy)\n"
       +"\n"
       +"Long\n"
       +"iː as in bean (biːn)\n"
       +"ɑː ...  barn (bɑːn)\n"
       +"ɔː ...  born (bɔːn)\n"
       +"uː ...  boon (buːn)\n"
       +"ɜː ...  burn (bɜːn)\n"
       +"eː ...  Ger. Schnee (ʃneː)\n"
       +"ɛː ...  Ger. Fähre (ˈfɛːrə)\n"
       +"aː ...  Ger. Tag (taːk)\n"
       +"oː ...  Ger. Sohn (zoːn)\n"
       +"øː ...  Ger. Goethe (gøːtə)\n"
       +"yː ...  Ger. grün (gryːn)\n"
       +"\n"
       +"Nasal\n"
       +"ɛ˜, æ˜ as in Fr. fin (fɛ˜, fæ˜)\n"
       +"ã  ...  Fr. franc (frã)\n"
       +"ɔ˜ ...  Fr. bon (bɔ˜n)\n"
       +"œ˜ ...  Fr. un (œ˜)\n"
       +"\n"
       +"Dipthongs, etc.\n"
       +"eɪ as in bay (beɪ)\n"
       +"aɪ ...  buy (baɪ)\n"
       +"ɔɪ ...  boy (bɔɪ)\n"
       +"əʊ ...  no (nəʊ)\n"
       +"aʊ ...  now (naʊ)\n"
       +"ɪə ...  peer (pɪə(r))\n"
       +"ɛə ...  pair (pɛə(r))\n"
       +"ʊə ...  tour (tʊə(r))\n"
       +"ɔə ...  boar (bɔə(r))\n"
       +"\n"
       +"III. STRESS\n"
       +"\n"
       +"Main stress: ˈ preceding stressed syllable\n"
       +"Secondary stress: ˌ preceding stressed syllable\n"
       +"\n"
       +"E.g.: pronunciation (prəˌnʌnsɪˈeɪʃ(ə)n)\n";
       +/* TODO: find transcriptions of foreign consonents, œ, ʏ, nasals */
       +
       +void
       +pgwprintkey(void)
       +{
       +        Bprint(bout, "%s", prkey);
       +}
       +
       +/*
       + * f points just after a '&', fe points at end of entry.
       + * Accumulate the special name, starting after the &
       + * and continuing until the next ';', in spec[].
       + * Return pointer to char after ';'.
       + */
       +static char *
       +getspec(char *f, char *fe)
       +{
       +        char *t;
       +        int c, i;
       +
       +        t = spec;
       +        i = sizeof spec;
       +        while(--i > 0) {
       +                c = *f++;
       +                if(c == ';' || f == fe)
       +                        break;
       +                *t++ = c;
       +        }
       +        *t = 0;
       +        return f;
       +}
       +
       +/*
       + * f points just after '<'; fe points at end of entry.
       + * Expect next characters from bin to match:
       + *  [/][^ >]+( [^>=]+=[^ >]+)*>
       + *      tag   auxname auxval
       + * Accumulate the tag and its auxilliary information in
       + * tag[], auxname[][] and auxval[][].
       + * Set tagstarts=1 if the tag is 'starting' (has no '/'), else 0.
       + * Set naux to the number of aux pairs found.
       + * Return pointer to after final '>'.
       + */
       +static char *
       +gettag(char *f, char *fe)
       +{
       +        char *t;
       +        int c, i;
       +
       +        t = tag;
       +        c = *f++;
       +        if(c == '/')
       +                tagstarts = 0;
       +        else {
       +                tagstarts = 1;
       +                *t++ = c;
       +        }
       +        i = Buflen;
       +        while(--i > 0) {
       +                c = *f++;
       +                if(c == '>' || f == fe)
       +                        break;
       +                *t++ = c;
       +        }
       +        *t = 0;
       +        return f;
       +}
 (DIR) diff --git a/src/cmd/dict/rev.awk b/src/cmd/dict/rev.awk
       t@@ -0,0 +1,6 @@
       +NF == 2        {
       +                printf "%s\t%s\n", $2, $1
       +        }
       +NF != 2 {
       +                print "ERROR " $0
       +        }
 (DIR) diff --git a/src/cmd/dict/robert.c b/src/cmd/dict/robert.c
       t@@ -0,0 +1,312 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/*
       + * Robert Électronique.
       + */
       +
       +enum
       +{
       +        CIT = MULTIE+1,        /* citation ptr followed by long int and ascii label */
       +        BROM,                /* bold roman */
       +        ITON,                /* start italic */
       +        ROM,                /* roman */
       +        SYM,                /* symbol font? */
       +        HEL,                /* helvetica */
       +        BHEL,                /* helvetica bold */
       +        SMALL,                /* smaller? */
       +        ITOFF,                /* end italic */
       +        SUP,                /* following character is superscript */
       +        SUB                /* following character is subscript */
       +};
       +
       +static Rune intab[256] = {
       +        /*0*/        /*1*/        /*2*/        /*3*/        /*4*/        /*5*/        /*6*/        /*7*/
       +/*00*/        NONE,        0x263a,        0x263b,        0x2665,        0x2666,        0x2663,        0x2660,        0x2022,
       +        0x25d8,        0x298,        L'\n',        0x2642,        0x2640,        0x266a,        0x266b,        0x203b,
       +/*10*/        0x21e8,        0x21e6,        0x2195,        0x203c,        0xb6,        0xa7,        0x2043,        0x21a8,
       +        0x2191,        0x2193,        0x2192,        0x2190,        0x2319,        0x2194,        0x25b4,        0x25be,
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        0x26,        L'\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/        0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        0x3c,        0x3d,        0x3e,        0x3f,
       +/*40*/        0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        0x7f,
       +/*80*/        0xc7,        0xfc,        0xe9,        0xe2,        0xe4,        0xe0,        0xe5,        0xe7,
       +        0xea,        0xeb,        0xe8,        0xef,        0xee,        0xec,        0xc4,        0xc5,
       +/*90*/        0xc9,        0xe6,        0xc6,        0xf4,        0xf6,        0xf2,        0xfb,        0xf9,
       +        0xff,        0xd6,        0xdc,        0xa2,        0xa3,        0xa5,        0x20a7,        0x283,
       +/*a0*/        0xe1,        0xed,        0xf3,        0xfa,        0xf1,        0xd1,        0xaa,        0xba,
       +        0xbf,        0x2310,        0xac,        0xbd,        0xbc,        0xa1,        0xab,        0xbb,
       +/*b0*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*c0*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        CIT,        BROM,        NONE,        ITON,        ROM,        SYM,        HEL,        BHEL,
       +/*d0*/        NONE,        SMALL,        ITOFF,        SUP,        SUB,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +/*e0*/        0x3b1,        0xdf,        0x3b3,        0x3c0,        0x3a3,        0x3c3,        0xb5,        0x3c4,
       +        0x3a6,        0x398,        0x3a9,        0x3b4,        0x221e,        0xd8,        0x3b5,        0x2229,
       +/*f0*/        0x2261,        0xb1,        0x2265,        0x2264,        0x2320,        0x2321,        0xf7,        0x2248,
       +        0xb0,        0x2219,        0xb7,        0x221a,        0x207f,        0xb2,        0x220e,        0xa0,
       +};
       +
       +static Rune suptab[] = {
       +        ['0'] 0x2070,        ['1'] 0x2071,        ['2'] 0x2072,        ['3'] 0x2073,
       +        ['4'] 0x2074,        ['5'] 0x2075,        ['6'] 0x2076,        ['7'] 0x2077,
       +        ['8'] 0x2078,        ['9'] 0x2079,        ['+'] 0x207a,        ['-'] 0x207b,
       +        ['='] 0x207c,        ['('] 0x207d,        [')'] 0x207e,        ['a'] 0xaa,
       +        ['n'] 0x207f,        ['o'] 0xba
       +};
       +
       +static Rune subtab[] = {
       +        ['0'] 0x2080,        ['1'] 0x2081,        ['2'] 0x2082,        ['3'] 0x2083,
       +        ['4'] 0x2084,        ['5'] 0x2085,        ['6'] 0x2086,        ['7'] 0x2087,
       +        ['8'] 0x2088,        ['9'] 0x2089,        ['+'] 0x208a,        ['-'] 0x208b,
       +        ['='] 0x208c,        ['('] 0x208d,        [')'] 0x208e
       +};
       +
       +#define        GSHORT(p)        (((p)[0]<<8) | (p)[1])
       +#define        GLONG(p)        (((p)[0]<<24) | ((p)[1]<<16) | ((p)[2]<<8) | (p)[3])
       +
       +static char        cfile[] = "/lib/dict/robert/cits.rob";
       +static char        dfile[] = "/lib/dict/robert/defs.rob";
       +static char        efile[] = "/lib/dict/robert/etym.rob";
       +static char        kfile[] = "/lib/dict/robert/_phon";
       +
       +static Biobuf *        cb;
       +static Biobuf *        db;
       +static Biobuf *        eb;
       +
       +static Biobuf *        Bouvrir(char*);
       +static void        citation(int, int);
       +static void        robertprintentry(Entry*, Entry*, int);
       +
       +void
       +robertindexentry(Entry e, int cmd)
       +{
       +        uchar *p = (uchar *)e.start;
       +        long ea, el, da, dl, fa;
       +        Entry def, etym;
       +
       +        ea = GLONG(&p[0]);
       +        el = GSHORT(&p[4]);
       +        da = GLONG(&p[6]);
       +        dl = GSHORT(&p[10]);
       +        fa = GLONG(&p[12]);
       +        USED(fa);
       +
       +        if(db == 0)
       +                db = Bouvrir(dfile);
       +        def.start = malloc(dl+1);
       +        def.end = def.start + dl;
       +        def.doff = da;
       +        Bseek(db, da, 0);
       +        Bread(db, def.start, dl);
       +        *def.end = 0;
       +        if(cmd == 'h'){
       +                robertprintentry(&def, 0, cmd);
       +        }else{
       +                if(eb == 0)
       +                        eb = Bouvrir(efile);
       +                etym.start = malloc(el+1);
       +                etym.end = etym.start + el;
       +                etym.doff = ea;
       +                Bseek(eb, ea, 0);
       +                Bread(eb, etym.start, el);
       +                *etym.end = 0;
       +                robertprintentry(&def, &etym, cmd);
       +                free(etym.start);
       +        }
       +        free(def.start);
       +}
       +
       +static void
       +robertprintentry(Entry *def, Entry *etym, int cmd)
       +{
       +        uchar *p, *pe;
       +        Rune r; int c, n;
       +        int baseline = 0;
       +        int lineno = 0;
       +        int cit = 0;
       +
       +        p = (uchar *)def->start;
       +        pe = (uchar *)def->end;
       +        while(p < pe){
       +                if(cmd == 'r'){
       +                        outchar(*p++);
       +                        continue;
       +                }
       +                c = *p++;
       +                switch(r = intab[c]){        /* assign = */
       +                case BROM:
       +                case ITON:
       +                case ROM:
       +                case SYM:
       +                case HEL:
       +                case BHEL:
       +                case SMALL:
       +                case ITOFF:
       +                case NONE:
       +                        if(debug)
       +                                outprint("\\%.2ux", c);
       +                        baseline = 0;
       +                        break;
       +
       +                case SUP:
       +                        baseline = 1;
       +                        break;
       +
       +                case SUB:
       +                        baseline = -1;
       +                        break;
       +
       +                case CIT:
       +                        n = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24);
       +                        p += 4;
       +                        if(debug)
       +                                outprint("[%d]", n);
       +                        while(*p == ' ' || ('0'<=*p && *p<='9') || *p == '.'){
       +                                if(debug)
       +                                        outchar(*p);
       +                                ++p;
       +                        }
       +                        ++cit;
       +                        outnl(2);
       +                        citation(n, cmd);
       +                        baseline = 0;
       +                        break;
       +
       +                case '\n':
       +                        outnl(0);
       +                        baseline = 0;
       +                        ++lineno;
       +                        break;
       +
       +                default:
       +                        if(baseline > 0 && r < nelem(suptab))
       +                                r = suptab[r];
       +                        else if(baseline < 0 && r < nelem(subtab))
       +                                r = subtab[r];
       +                        if(cit){
       +                                outchar('\n');
       +                                cit = 0;
       +                        }
       +                        outrune(r);
       +                        baseline = 0;
       +                        break;
       +                }
       +                if(r == '\n'){
       +                        if(cmd == 'h')
       +                                break;
       +                        if(lineno == 1 && etym)
       +                                robertprintentry(etym, 0, cmd);
       +                }
       +        }
       +        outnl(0);
       +}
       +
       +static void
       +citation(int addr, int cmd)
       +{
       +        Entry cit;
       +
       +        if(cb == 0)
       +                cb = Bouvrir(cfile);
       +        Bseek(cb, addr, 0);
       +        cit.start = Brdline(cb, 0xc8);
       +        cit.end = cit.start + Blinelen(cb) - 1;
       +        cit.doff = addr;
       +        *cit.end = 0;
       +        robertprintentry(&cit, 0, cmd);
       +}
       +
       +long
       +robertnextoff(long fromoff)
       +{
       +        return (fromoff & ~15) + 16;
       +}
       +
       +void
       +robertprintkey(void)
       +{
       +        Biobuf *db;
       +        char *l;
       +
       +        db = Bouvrir(kfile);
       +        while(l = Brdline(db, '\n'))        /* assign = */
       +                Bwrite(bout, l, Blinelen(db));
       +        Bterm(db);
       +}
       +
       +void
       +robertflexentry(Entry e, int cmd)
       +{
       +        uchar *p, *pe;
       +        Rune r; int c;
       +        int lineno = 1;
       +
       +        p = (uchar *)e.start;
       +        pe = (uchar *)e.end;
       +        while(p < pe){
       +                if(cmd == 'r'){
       +                        Bputc(bout, *p++);
       +                        continue;
       +                }
       +                c = *p++;
       +                r = intab[c];
       +                if(r == '$')
       +                        r = '\n';
       +                if(r == '\n'){
       +                        ++lineno;
       +                        if(cmd == 'h' && lineno > 2)
       +                                break;
       +                }
       +                if(cmd == 'h' && lineno < 2)
       +                        continue;
       +                if(r > MULTIE){
       +                        if(debug)
       +                                Bprint(bout, "\\%.2ux", c);
       +                        continue;
       +                }
       +                if(r < Runeself)
       +                        Bputc(bout, r);
       +                else
       +                        Bputrune(bout, r);
       +        }
       +        outnl(0);
       +}
       +
       +long
       +robertnextflex(long fromoff)
       +{
       +        int c;
       +
       +        if(Bseek(bdict, fromoff, 0) < 0)
       +                return -1;
       +        while((c = Bgetc(bdict)) >= 0){
       +                if(c == '$')
       +                        return Boffset(bdict);
       +        }
       +        return -1;
       +}
       +
       +static Biobuf *
       +Bouvrir(char *fichier)
       +{
       +        Biobuf *db;
       +
       +        db = Bopen(fichier, OREAD);
       +        if(db == 0){
       +                fprint(2, "%s: impossible d'ouvrir %s: %r\n", argv0, fichier);
       +                exits("ouvrir");
       +        }
       +        return db;
       +}
 (DIR) diff --git a/src/cmd/dict/simple.c b/src/cmd/dict/simple.c
       t@@ -0,0 +1,46 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/*
       + * Routines for handling dictionaries in UTF, headword
       + * separated from entry by tab, entries separated by newline.
       + */
       +
       +void
       +simpleprintentry(Entry e, int cmd)
       +{
       +        uchar *p, *pe;
       +
       +        p = (uchar *)e.start;
       +        pe = (uchar *)e.end;
       +        while(p < pe){
       +                if(*p == '\t'){
       +                        if(cmd == 'h')
       +                                break;
       +                        else
       +                                outchar(' '), ++p;
       +                }else if(*p == '\n')
       +                        break;
       +                else
       +                        outchar(*p++);
       +        }
       +        outnl(0);
       +}
       +
       +long
       +simplenextoff(long fromoff)
       +{
       +        if(Bseek(bdict, fromoff, 0) < 0)
       +                return -1;
       +        if(Brdline(bdict, '\n') == 0)
       +                return -1;
       +        return Boffset(bdict);
       +}
       +
       +void
       +simpleprintkey(void)
       +{
       +        Bprint(bout, "No pronunciation key.\n");
       +}
 (DIR) diff --git a/src/cmd/dict/slang.c b/src/cmd/dict/slang.c
       t@@ -0,0 +1,203 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +/* Possible tags */
       +enum {
       +        DF,                /* definition */
       +        DX,                /* definition/example */
       +        ET,                /* etymology */
       +        EX,                /* example */
       +        LA,                /* label */
       +        ME,                /* main entry */
       +        NU,                /* sense number */
       +        PR,                /* pronunciation */
       +        PS,                /* grammar part */
       +        XR,                /* cross reference */
       +        XX,                /* cross reference (whole entry) */
       +};
       +
       +/* Assoc tables must be sorted on first field */
       +
       +static Assoc tagtab[] = {
       +        {"df",        DF},
       +        {"dx",        DX},
       +        {"et",        ET},
       +        {"ex",        EX},
       +        {"la",        LA},
       +        {"me",        ME},
       +        {"nu",        NU},
       +        {"pr",        PR},
       +        {"ps",        PS},
       +        {"xr",        XR},
       +        {"xx",        XX},
       +};
       +static long        sget(char *, char *, char **, char **);
       +static void        soutpiece(char *, char *);
       +
       +void
       +slangprintentry(Entry e, int cmd)
       +{
       +        char *p, *pe, *vs, *ve;
       +        long t;
       +
       +        p = e.start;
       +        pe = e.end;
       +        if(cmd == 'h') {
       +                t = sget(p, pe, &vs, &ve);
       +                if(t == ME)
       +                        soutpiece(vs, ve);
       +                outnl(0);
       +                return;
       +        }
       +        while(p < pe) {
       +                switch(sget(p, pe, &vs, &ve)) {
       +                case DF:
       +                        soutpiece(vs, ve);
       +                        outchars(".  ");
       +                        break;
       +                case DX:
       +                        soutpiece(vs, ve);
       +                        outchars(".  ");
       +                        break;
       +                case ET:
       +                        outchars("[");
       +                        soutpiece(vs, ve);
       +                        outchars("] ");
       +                        break;
       +                case EX:
       +                        outchars("E.g., ");
       +                        soutpiece(vs, ve);
       +                        outchars(".  ");
       +                        break;
       +                case LA:
       +                        outchars("(");
       +                        soutpiece(vs, ve);
       +                        outchars(") ");
       +                        break;
       +                case ME:
       +                        outnl(0);
       +                        soutpiece(vs, ve);
       +                        outnl(0);
       +                        break;
       +                case NU:
       +                        outnl(2);
       +                        soutpiece(vs, ve);
       +                        outchars(".  ");
       +                        break;
       +                case PR:
       +                        outchars("[");
       +                        soutpiece(vs, ve);
       +                        outchars("] ");
       +                        break;
       +                case PS:
       +                        outnl(1);
       +                        soutpiece(vs, ve);
       +                        outchars(". ");
       +                        break;
       +                case XR:
       +                        outchars("See ");
       +                        soutpiece(vs, ve);
       +                        outchars(".  ");
       +                        break;
       +                case XX:
       +                        outchars("See ");
       +                        soutpiece(vs, ve);
       +                        outchars(".  ");
       +                        break;
       +                default:
       +                        ve = pe;        /* will end loop */
       +                        break;
       +                }
       +                p = ve;
       +        }
       +        outnl(0);
       +}
       +
       +long
       +slangnextoff(long fromoff)
       +{
       +        long a;
       +        char *p;
       +
       +        a = Bseek(bdict, fromoff, 0);
       +        if(a < 0)
       +                return -1;
       +        for(;;) {
       +                p = Brdline(bdict, '\n');
       +                if(!p)
       +                        break;
       +                if(p[0] == 'm' && p[1] == 'e' && p[2] == ' ')
       +                        return (Boffset(bdict)-Blinelen(bdict));
       +        }
       +        return -1;
       +}
       +
       +void
       +slangprintkey(void)
       +{
       +        Bprint(bout, "No key\n");
       +}
       +
       +/*
       + * Starting from b, find next line beginning with a tag.
       + * Don't go past e, but assume *e==0.
       + * Return tag value, or -1 if no more tags before e.
       + * Set pvb to beginning of value (after tag).
       + * Set pve to point at newline that ends the value.
       + */
       +static long
       +sget(char *b, char *e, char **pvb, char **pve)
       +{
       +        char *p;
       +        char buf[3];
       +        long t, tans;
       +
       +        buf[2] = 0;
       +        tans = -1;
       +        for(p = b;;) {
       +                if(p[2] == ' ') {
       +                        buf[0] = p[0];
       +                        buf[1] = p[1];
       +                        t = lookassoc(tagtab, asize(tagtab), buf);
       +                        if(t < 0) {
       +                                if(debug)
       +                                        err("tag %s\n", buf);
       +                                p += 3;
       +                        } else {
       +                                if(tans < 0) {
       +                                        p += 3;
       +                                        tans = t;
       +                                        *pvb = p;
       +                                } else {
       +                                        *pve = p;
       +                                        break;
       +                                }
       +                        }
       +                }
       +                p = strchr(p, '\n');
       +                if(!p || ++p >= e) {
       +                        if(tans >= 0)
       +                                *pve = e-1;
       +                        break;
       +                }
       +        }
       +        return tans;
       +}
       +
       +static void
       +soutpiece(char *b, char *e)
       +{
       +        int c, lastc;
       +
       +        lastc = 0;
       +        while(b < e) {
       +                c = *b++;
       +                if(c == '\n')
       +                        c = ' ';
       +                if(!(c == ' ' && lastc == ' ') && c != '@')
       +                        outchar(c);
       +                lastc = c;
       +        }
       +}
 (DIR) diff --git a/src/cmd/dict/t.awk b/src/cmd/dict/t.awk
       t@@ -0,0 +1,13 @@
       +NF == 2        {
       +                if($2 !~ / or / || $2 ~ /\(or/)
       +                        print $0
       +                else {
       +                        n = split($2, a, / or /)
       +                        for(i = 1; i <= n; i++) {
       +                                printf "%s\t%s\n", $1, a[i]
       +                        }
       +                }
       +        }
       +NF != 2 {
       +        print $0
       +        }
 (DIR) diff --git a/src/cmd/dict/thesaurus.c b/src/cmd/dict/thesaurus.c
       t@@ -0,0 +1,86 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +void
       +thesprintentry(Entry e, int cmd)
       +{
       +        char *p, *pe;
       +        int c, i;
       +
       +        p = e.start;
       +        pe = e.end;
       +        while(p < pe) {
       +                c = *p++;
       +                if(cmd == 'r') {
       +                        outchar(c);
       +                        continue;
       +                }
       +                switch(c) {
       +                case '*':
       +                        c = *p++;
       +                        if(cmd == 'h' && c != 'L') {
       +                                outnl(0);
       +                                return;
       +                        }
       +                        if(c == 'L' && cmd != 'h')
       +                                outnl(0);
       +                        if(c == 'S') {
       +                                outchar('(');
       +                                outchar(*p++);
       +                                outchar(')');
       +                        }
       +                        break;
       +                case '#':
       +                        c = *p++;
       +                        i = *p++ - '0' - 1;
       +                        if(i < 0 || i > 4)
       +                                break;
       +                        switch(c) {
       +                        case 'a': outrune(L"áàâäa"[i]); break;
       +                        case 'e': outrune(L"éèêëe"[i]); break;
       +                        case 'o': outrune(L"óòôöo"[i]); break;
       +                        case 'c': outrune(L"ccccç"[i]); break;
       +                        default: outchar(c); break;
       +                        }
       +                        break;
       +                case '+':
       +                case '<':
       +                        break;
       +                case ' ':
       +                        if(cmd == 'h' && *p == '*') {
       +                                outnl(0);
       +                                return;
       +                        }
       +                default:
       +                        outchar(c);
       +                }
       +        }
       +        outnl(0);
       +}
       +
       +long
       +thesnextoff(long fromoff)
       +{
       +        long a;
       +        char *p;
       +
       +        a = Bseek(bdict, fromoff, 0);
       +        if(a < 0)
       +                return -1;
       +        for(;;) {
       +                p = Brdline(bdict, '\n');
       +                if(!p)
       +                        break;
       +                if(p[0] == '*' && p[1] == 'L')
       +                        return (Boffset(bdict)-Blinelen(bdict));
       +        }
       +        return -1;
       +}
       +
       +void
       +thesprintkey(void)
       +{
       +        Bprint(bout, "No key\n");
       +}
 (DIR) diff --git a/src/cmd/dict/utils.c b/src/cmd/dict/utils.c
       t@@ -0,0 +1,577 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +
       +Dict dicts[] = {
       +        {"oed",                "Oxford English Dictionary, 2nd Ed.",
       +         "dict/oed2",        "dict/oed2index",
       +         oednextoff,        oedprintentry,                oedprintkey},
       +        {"ahd",                "American Heritage Dictionary, 2nd College Ed.",
       +         "ahd/DICT.DB",        "ahd/index",
       +         ahdnextoff,        ahdprintentry,                ahdprintkey},
       +        {"pgw",                "Project Gutenberg Webster Dictionary",
       +         "dict/pgw",        "dict/pgwindex",
       +         pgwnextoff,        pgwprintentry,                pgwprintkey},
       +        {"thesaurus",        "Collins Thesaurus",
       +         "dict/thesaurus",        "dict/thesindex",
       +         thesnextoff,        thesprintentry,        thesprintkey},
       +
       +        {"ce",                "Gendai Chinese->English",
       +         "dict/world/sansdata/sandic24.dat",
       +         "dict/world/sansdata/ceindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"ceh",                "Gendai Chinese->English (Hanzi index)",
       +         "dict/world/sansdata/sandic24.dat",
       +         "dict/world/sansdata/cehindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"ec",                "Gendai English->Chinese",
       +         "dict/world/sansdata/sandic24.dat",
       +         "dict/world/sansdata/ecindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"dae",                "Gyldendal Danish->English",
       +         "dict/world/gylddata/sandic30.dat",
       +         "dict/world/gylddata/daeindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"eda",                "Gyldendal English->Danish",
       +         "dict/world/gylddata/sandic29.dat",
       +         "dict/world/gylddata/edaindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"due",                "Wolters-Noordhoff Dutch->English",
       +         "dict/world/woltdata/sandic07.dat",
       +         "dict/world/woltdata/deindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"edu",                "Wolters-Noordhoff English->Dutch",
       +         "dict/world/woltdata/sandic06.dat",
       +         "dict/world/woltdata/edindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"fie",                "WSOY Finnish->English",
       +         "dict/world/werndata/sandic32.dat",
       +         "dict/world/werndata/fieindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"efi",                "WSOY English->Finnish",
       +         "dict/world/werndata/sandic31.dat",
       +         "dict/world/werndata/efiindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"fe",                "Collins French->English",
       +         "dict/fe",        "dict/feindex",
       +         pcollnextoff,        pcollprintentry,        pcollprintkey},
       +        {"ef",                "Collins English->French",
       +         "dict/ef",        "dict/efindex",
       +         pcollnextoff,        pcollprintentry,        pcollprintkey},
       +
       +        {"ge",                "Collins German->English",
       +         "dict/ge",        "dict/geindex",
       +         pcollgnextoff,        pcollgprintentry,        pcollgprintkey},
       +        {"eg",                "Collins English->German",
       +         "dict/eg",        "dict/egindex",
       +         pcollgnextoff,        pcollgprintentry,        pcollgprintkey},
       +
       +        {"ie",                "Collins Italian->English",
       +         "dict/ie",        "dict/ieindex",
       +         pcollnextoff,        pcollprintentry,        pcollprintkey},
       +        {"ei",                "Collins English->Italian",
       +         "dict/ei",        "dict/eiindex",
       +         pcollnextoff,        pcollprintentry,        pcollprintkey},
       +
       +        {"je",                "Sanshusha Japanese->English",
       +         "dict/world/sansdata/sandic18.dat",
       +         "dict/world/sansdata/jeindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"jek",                "Sanshusha Japanese->English (Kanji index)",
       +         "dict/world/sansdata/sandic18.dat",
       +         "dict/world/sansdata/jekindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"ej",                "Sanshusha English->Japanese",
       +         "dict/world/sansdata/sandic18.dat",
       +         "dict/world/sansdata/ejindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"tjeg",        "Sanshusha technical Japanese->English,German",
       +         "dict/world/sansdata/sandic16.dat",
       +         "dict/world/sansdata/tjegindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"tjegk",        "Sanshusha technical Japanese->English,German (Kanji index)",
       +         "dict/world/sansdata/sandic16.dat",
       +         "dict/world/sansdata/tjegkindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"tegj",        "Sanshusha technical English->German,Japanese",
       +         "dict/world/sansdata/sandic16.dat",
       +         "dict/world/sansdata/tegjindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"tgje",        "Sanshusha technical German->Japanese,English",
       +         "dict/world/sansdata/sandic16.dat",
       +         "dict/world/sansdata/tgjeindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"ne",                "Kunnskapforlaget Norwegian->English",
       +         "dict/world/kunndata/sandic28.dat",
       +         "dict/world/kunndata/neindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"en",                "Kunnskapforlaget English->Norwegian",
       +         "dict/world/kunndata/sandic27.dat",
       +         "dict/world/kunndata/enindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"re",                "Leon Ungier Russian->English",
       +         "dict/re",        "dict/reindex",
       +         simplenextoff,        simpleprintentry,        simpleprintkey},
       +        {"er",                "Leon Ungier English->Russian",
       +         "dict/re",        "dict/erindex",
       +         simplenextoff,        simpleprintentry,        simpleprintkey},
       +
       +        {"se",                "Collins Spanish->English",
       +         "dict/se",        "dict/seindex",
       +         pcollnextoff,        pcollprintentry,        pcollprintkey},
       +        {"es",                "Collins English->Spanish",
       +         "dict/es",        "dict/esindex",
       +         pcollnextoff,        pcollprintentry,        pcollprintkey},
       +
       +        {"swe",                "Esselte Studium Swedish->English",
       +         "dict/world/essedata/sandic34.dat",
       +         "dict/world/essedata/sweindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +        {"esw",                "Esselte Studium English->Swedish",
       +         "dict/world/essedata/sandic33.dat",
       +         "dict/world/essedata/eswindex",
       +         worldnextoff,        worldprintentry,        worldprintkey},
       +
       +        {"movie",        "Movies -- by title",
       +         "movie/data",        "dict/movtindex",
       +         movienextoff,        movieprintentry,        movieprintkey},
       +        {"moviea",        "Movies -- by actor",
       +         "movie/data",        "dict/movaindex",
       +         movienextoff,        movieprintentry,        movieprintkey},
       +        {"movied",        "Movies -- by director",
       +         "movie/data",        "dict/movdindex",
       +         movienextoff,        movieprintentry,        movieprintkey},
       +
       +        {"slang",        "English Slang",
       +         "dict/slang",        "dict/slangindex",
       +         slangnextoff,        slangprintentry,        slangprintkey},
       +
       +        {"robert",        "Robert Électronique",
       +         "dict/robert/_pointers",        "dict/robert/_index",
       +         robertnextoff,        robertindexentry,        robertprintkey},
       +        {"robertv",        "Robert Électronique - formes des verbes",
       +         "dict/robert/flex.rob",        "dict/robert/_flexindex",
       +         robertnextflex,        robertflexentry,        robertprintkey},
       +
       +        {0, 0, 0, 0, 0}
       +};
       +
       +typedef struct Lig Lig;
       +struct Lig {
       +        Rune        start;                /* accent rune */
       +        Rune        pairs[100];                /* <char,accented version> pairs */
       +};
       +
       +static Lig ligtab[Nligs] = {
       +[LACU-LIGS]        {0xb4,        {0x41, 0xc1, 0x61, 0xe1, 0x43, 0x106, 0x63, 0x107, 0x45, 0xc9, 0x65, 0xe9, 0x67, 0x123, 0x49, 0xcd, 0x69, 0xed, 0x131, 0xed, 0x4c, 0x139, 0x6c, 0x13a, 0x4e, 0x143, 0x6e, 0x144, 0x4f, 0xd3, 0x6f, 0xf3, 0x52, 0x154, 0x72, 0x155, 0x53, 0x15a, 0x73, 0x15b, 0x55, 0xda, 0x75, 0xfa, 0x59, 0xdd, 0x79, 0xfd, 0x5a, 0x179, 0x7a, 0x17a, 0}},
       +[LGRV-LIGS]        {0x2cb,        {0x41, 0xc0, 0x61, 0xe0, 0x45, 0xc8, 0x65, 0xe8, 0x49, 0xcc, 0x69, 0xec, 0x131, 0xec, 0x4f, 0xd2, 0x6f, 0xf2, 0x55, 0xd9, 0x75, 0xf9, 0}},
       +[LUML-LIGS]        {0xa8,        {0x41, 0xc4, 0x61, 0xe4, 0x45, 0xcb, 0x65, 0xeb, 0x49, 0xcf, 0x69, 0xef, 0x4f, 0xd6, 0x6f, 0xf6, 0x55, 0xdc, 0x75, 0xfc, 0x59, 0x178, 0x79, 0xff, 0}},
       +[LCED-LIGS]        {0xb8,        {0x43, 0xc7, 0x63, 0xe7, 0x47, 0x122, 0x4b, 0x136, 0x6b, 0x137, 0x4c, 0x13b, 0x6c, 0x13c, 0x4e, 0x145, 0x6e, 0x146, 0x52, 0x156, 0x72, 0x157, 0x53, 0x15e, 0x73, 0x15f, 0x54, 0x162, 0x74, 0x163, 0}},
       +[LTIL-LIGS]        {0x2dc,        {0x41, 0xc3, 0x61, 0xe3, 0x49, 0x128, 0x69, 0x129, 0x131, 0x129, 0x4e, 0xd1, 0x6e, 0xf1, 0x4f, 0xd5, 0x6f, 0xf5, 0x55, 0x168, 0x75, 0x169, 0}},
       +[LBRV-LIGS]        {0x2d8,        {0x41, 0x102, 0x61, 0x103, 0x45, 0x114, 0x65, 0x115, 0x47, 0x11e, 0x67, 0x11f, 0x49, 0x12c, 0x69, 0x12d, 0x131, 0x12d, 0x4f, 0x14e, 0x6f, 0x14f, 0x55, 0x16c, 0x75, 0x16d, 0}},
       +[LRNG-LIGS]        {0x2da,        {0x41, 0xc5, 0x61, 0xe5, 0x55, 0x16e, 0x75, 0x16f, 0}},
       +[LDOT-LIGS]        {0x2d9,        {0x43, 0x10a, 0x63, 0x10b, 0x45, 0x116, 0x65, 0x117, 0x47, 0x120, 0x67, 0x121, 0x49, 0x130, 0x4c, 0x13f, 0x6c, 0x140, 0x5a, 0x17b, 0x7a, 0x17c, 0}},
       +[LDTB-LIGS]        {0x2e,        {0}},
       +[LFRN-LIGS]        {0x2322,        {0x41, 0xc2, 0x61, 0xe2, 0x43, 0x108, 0x63, 0x109, 0x45, 0xca, 0x65, 0xea, 0x47, 0x11c, 0x67, 0x11d, 0x48, 0x124, 0x68, 0x125, 0x49, 0xce, 0x69, 0xee, 0x131, 0xee, 0x4a, 0x134, 0x6a, 0x135, 0x4f, 0xd4, 0x6f, 0xf4, 0x53, 0x15c, 0x73, 0x15d, 0x55, 0xdb, 0x75, 0xfb, 0x57, 0x174, 0x77, 0x175, 0x59, 0x176, 0x79, 0x177, 0}},
       +[LFRB-LIGS]        {0x32f,        {0}},
       +[LOGO-LIGS]        {0x2db,        {0x41, 0x104, 0x61, 0x105, 0x45, 0x118, 0x65, 0x119, 0x49, 0x12e, 0x69, 0x12f, 0x131, 0x12f, 0x55, 0x172, 0x75, 0x173, 0}},
       +[LMAC-LIGS]        {0xaf,        {0x41, 0x100, 0x61, 0x101, 0x45, 0x112, 0x65, 0x113, 0x49, 0x12a, 0x69, 0x12b, 0x131, 0x12b, 0x4f, 0x14c, 0x6f, 0x14d, 0x55, 0x16a, 0x75, 0x16b, 0}},
       +[LHCK-LIGS]        {0x2c7,        {0x43, 0x10c, 0x63, 0x10d, 0x44, 0x10e, 0x64, 0x10f, 0x45, 0x11a, 0x65, 0x11b, 0x4c, 0x13d, 0x6c, 0x13e, 0x4e, 0x147, 0x6e, 0x148, 0x52, 0x158, 0x72, 0x159, 0x53, 0x160, 0x73, 0x161, 0x54, 0x164, 0x74, 0x165, 0x5a, 0x17d, 0x7a, 0x17e, 0}},
       +[LASP-LIGS]        {0x2bd,        {0}},
       +[LLEN-LIGS]        {0x2bc,        {0}},
       +[LBRB-LIGS]        {0x32e,        {0}}
       +};
       +
       +Rune multitab[Nmulti][5] = {
       +[MAAS-MULTI]        {0x2bd, 0x3b1, 0},
       +[MALN-MULTI]        {0x2bc, 0x3b1, 0},
       +[MAND-MULTI]        {0x61, 0x6e, 0x64, 0},
       +[MAOQ-MULTI]        {0x61, 0x2f, 0x71, 0},
       +[MBRA-MULTI]        {0x3c, 0x7c, 0},
       +[MDD-MULTI]        {0x2e, 0x2e, 0},
       +[MDDD-MULTI]        {0x2e, 0x2e, 0x2e, 0},
       +[MEAS-MULTI]        {0x2bd, 0x3b5, 0},
       +[MELN-MULTI]        {0x2bc, 0x3b5, 0},
       +[MEMM-MULTI]        {0x2014, 0x2014, 0},
       +[MHAS-MULTI]        {0x2bd, 0x3b7, 0},
       +[MHLN-MULTI]        {0x2bc, 0x3b7, 0},
       +[MIAS-MULTI]        {0x2bd, 0x3b9, 0},
       +[MILN-MULTI]        {0x2bc, 0x3b9, 0},
       +[MLCT-MULTI]        {0x63, 0x74, 0},
       +[MLFF-MULTI]        {0x66, 0x66, 0},
       +[MLFFI-MULTI]        {0x66, 0x66, 0x69, 0},
       +[MLFFL-MULTI]        {0x66, 0x66, 0x6c, 0},
       +[MLFL-MULTI]        {0x66, 0x6c, 0},
       +[MLFI-MULTI]        {0x66, 0x69, 0},
       +[MLLS-MULTI]        {0x26b, 0x26b, 0},
       +[MLST-MULTI]        {0x73, 0x74, 0},
       +[MOAS-MULTI]        {0x2bd, 0x3bf, 0},
       +[MOLN-MULTI]        {0x2bc, 0x3bf, 0},
       +[MOR-MULTI]        {0x6f, 0x72, 0},
       +[MRAS-MULTI]        {0x2bd, 0x3c1, 0},
       +[MRLN-MULTI]        {0x2bc, 0x3c1, 0},
       +[MTT-MULTI]        {0x7e, 0x7e, 0},
       +[MUAS-MULTI]        {0x2bd, 0x3c5, 0},
       +[MULN-MULTI]        {0x2bc, 0x3c5, 0},
       +[MWAS-MULTI]        {0x2bd, 0x3c9, 0},
       +[MWLN-MULTI]        {0x2bc, 0x3c9, 0},
       +[MOE-MULTI]        {0x6f, 0x65, 0},
       +[MES-MULTI]        {0x20, 0x20, 0},
       +};
       +
       +#define        risupper(r)        (0x41 <= (r) && (r) <= 0x5a)
       +#define        rislatin1(r)        (0xC0 <= (r) && (r) <= 0xFF)
       +#define        rtolower(r)        ((r)-'A'+'a')
       +
       +static Rune latin_fold_tab[] =
       +{
       +/*        Table to fold latin 1 characters to ASCII equivalents
       +                        based at Rune value 0xc0
       +
       +         À    Á    Â    Ã    Ä    Å    Æ    Ç
       +         È    É    Ê    Ë    Ì    Í    Î    Ï
       +         Ð    Ñ    Ò    Ó    Ô    Õ    Ö    ×
       +         Ø    Ù    Ú    Û    Ü    Ý    Þ    ß
       +         à    á    â    ã    ä    å    æ    ç
       +         è    é    ê    ë    ì    í    î    ï
       +         ð    ñ    ò    ó    ô    õ    ö    ÷
       +         ø    ù    ú    û    ü    ý    þ    ÿ
       +*/
       +        'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c',
       +        'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
       +        'd', 'n', 'o', 'o', 'o', 'o', 'o',  0 ,
       +        'o', 'u', 'u', 'u', 'u', 'y',  0 ,  0 ,
       +        'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c',
       +        'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
       +        'd', 'n', 'o', 'o', 'o', 'o', 'o',  0 ,
       +        'o', 'u', 'u', 'u', 'u', 'y',  0 , 'y',
       +};
       +
       +static Rune         *ttabstack[20];
       +static int        ntt;
       +
       +/*
       + * tab is an array of n Assoc's, sorted by key.
       + * Look for key in tab, and return corresponding val
       + * or -1 if not there
       + */
       +long
       +lookassoc(Assoc *tab, int n, char *key)
       +{
       +        Assoc *q;
       +        long i, low, high;
       +        int r;
       +
       +        for(low = -1, high = n; high > low+1; ){
       +                i = (high+low)/2;
       +                q = &tab[i];
       +                if((r=strcmp(key, q->key))<0)
       +                        high = i;
       +                else if(r == 0)
       +                        return q->val;
       +                else
       +                        low=i;
       +        }
       +        return -1;
       +}
       +
       +long
       +looknassoc(Nassoc *tab, int n, long key)
       +{
       +        Nassoc *q;
       +        long i, low, high;
       +
       +        for(low = -1, high = n; high > low+1; ){
       +                i = (high+low)/2;
       +                q = &tab[i];
       +                if(key < q->key)
       +                        high = i;
       +                else if(key == q->key)
       +                        return q->val;
       +                else
       +                        low=i;
       +        }
       +        return -1;
       +}
       +
       +void
       +err(char *fmt, ...)
       +{
       +        char buf[1000];
       +        va_list v;
       +
       +        va_start(v, fmt);
       +        vsnprint(buf, sizeof(buf), fmt, v);
       +        va_end(v);
       +        fprint(2, "%s: %s\n", argv0, buf);
       +}
       +
       +/*
       + * Write the rune r to bout, keeping track of line length
       + * and breaking the lines (at blanks) when they get too long
       + */
       +void
       +outrune(long r)
       +{
       +        if(outinhibit)
       +                return;
       +        if(++linelen > breaklen && r == 0x20) {
       +                Bputc(bout, '\n');
       +                linelen = 0;
       +        } else
       +                Bputrune(bout, r);
       +}
       +
       +void
       +outrunes(Rune *rp)
       +{
       +        Rune r;
       +
       +        while((r = *rp++) != 0)
       +                outrune(r);
       +}
       +
       +/* like outrune, but when arg is know to be a char */
       +void
       +outchar(int c)
       +{
       +        if(outinhibit)
       +                return;
       +        if(++linelen > breaklen && c == ' ') {
       +                c ='\n';
       +                linelen = 0;
       +        }
       +        Bputc(bout, c);
       +}
       +
       +void
       +outchars(char *s)
       +{
       +        char c;
       +
       +        while((c = *s++) != 0)
       +                outchar(c);
       +}
       +
       +void
       +outprint(char *fmt, ...)
       +{
       +        char buf[1000];
       +        va_list v;
       +
       +        va_start(v, fmt);
       +        vsnprint(buf, sizeof(buf), fmt, v);
       +        va_end(v);
       +        outchars(buf);
       +}
       +
       +void
       +outpiece(char *b, char *e)
       +{
       +        int c, lastc;
       +
       +        lastc = 0;
       +        while(b < e) {
       +                c = *b++;
       +                if(c == '\n')
       +                        c = ' ';
       +                if(!(c == ' ' && lastc == ' '))
       +                        outchar(c);
       +                lastc = c;
       +        }
       +}
       +
       +/*
       + * Go to new line if not already there; indent if ind != 0.
       + * If ind > 1, leave a blank line too.
       + * Slight hack: assume if current line is only one or two
       + * characters long, then they were spaces.
       + */
       +void
       +outnl(int ind)
       +{
       +        if(outinhibit)
       +                return;
       +        if(ind) {
       +                if(ind > 1) {
       +                        if(linelen > 2)
       +                                Bputc(bout, '\n');
       +                        Bprint(bout, "\n  ");
       +                } else if(linelen == 0)
       +                        Bprint(bout, "  ");
       +                else if(linelen == 1)
       +                        Bputc(bout, ' ');
       +                else if(linelen != 2)
       +                        Bprint(bout, "\n  ");
       +                linelen = 2;
       +        } else {
       +                if(linelen) {
       +                        Bputc(bout, '\n');
       +                        linelen = 0;
       +                }
       +        }
       +}
       +
       +/*
       + * Fold the runes in null-terminated rp.
       + * Use the sort(1) definition of folding (uppercase to lowercase,
       + * latin1-accented characters to corresponding unaccented chars)
       + */
       +void
       +fold(Rune *rp)
       +{
       +        Rune r;
       +
       +        while((r = *rp) != 0) {
       +                if (rislatin1(r) && latin_fold_tab[r-0xc0])
       +                                r = latin_fold_tab[r-0xc0];
       +                if(risupper(r))
       +                        r = rtolower(r);
       +                *rp++ = r;
       +        }
       +}
       +
       +/*
       + * Like fold, but put folded result into new
       + * (assumed to have enough space).
       + * old is a regular expression, but we know that
       + * metacharacters aren't affected
       + */
       +void
       +foldre(char *new, char *old)
       +{
       +        Rune r;
       +
       +        while(*old) {
       +                old += chartorune(&r, old);
       +                if (rislatin1(r) && latin_fold_tab[r-0xc0])
       +                                r = latin_fold_tab[r-0xc0];
       +                if(risupper(r))
       +                        r = rtolower(r);
       +                new += runetochar(new, &r);
       +        }
       +        *new = 0;
       +}
       +
       +/*
       + *        acomp(s, t) returns:
       + *                -2 if s strictly precedes t
       + *                -1 if s is a prefix of t
       + *                0 if s is the same as t
       + *                1 if t is a prefix of s
       + *                2 if t strictly precedes s
       + */
       +
       +int
       +acomp(Rune *s, Rune *t)
       +{
       +        int cs, ct;
       +
       +        for(;;) {
       +                cs = *s;
       +                ct = *t;
       +                if(cs != ct)
       +                        break;
       +                if(cs == 0)
       +                        return 0;
       +                s++;
       +                t++;
       +        }
       +        if(cs == 0)
       +                return -1;
       +        if(ct == 0)
       +                return 1;
       +        if(cs < ct)
       +                return -2;
       +        return 2;
       +}
       +
       +/*
       + * Copy null terminated Runes from 'from' to 'to'.
       + */
       +void
       +runescpy(Rune *to, Rune *from)
       +{
       +        while((*to++ = *from++) != 0)
       +                continue;
       +}
       +
       +/*
       + * Conversion of unsigned number to long, no overflow detection
       + */
       +long
       +runetol(Rune *r)
       +{
       +        int c;
       +        long n;
       +
       +        n = 0;
       +        for(;; r++){
       +                c = *r;
       +                if(0x30<=c && c<=0x39)
       +                        c -= '0';
       +                else
       +                        break;
       +                n = n*10 + c;
       +        }
       +        return n;
       +}
       +
       +/*
       + * See if there is a rune corresponding to the accented
       + * version of r with accent acc (acc in [LIGS..LIGE-1]),
       + * and return it if so, else return NONE.
       + */
       +Rune
       +liglookup(Rune acc, Rune r)
       +{
       +        Rune *p;
       +
       +        if(acc < LIGS || acc >= LIGE)
       +                return NONE;
       +        for(p = ligtab[acc-LIGS].pairs; *p; p += 2)
       +                if(*p == r)
       +                        return *(p+1);
       +        return NONE;
       +}
       +
       +/*
       + * Maintain a translation table stack (a translation table
       + * is an array of Runes indexed by bytes or 7-bit bytes).
       + * If starting is true, push the curtab onto the stack
       + * and return newtab; else pop the top of the stack and
       + * return it.
       + * If curtab is 0, initialize the stack and return.
       + */
       +Rune *
       +changett(Rune *curtab, Rune *newtab, int starting)
       +{
       +        if(curtab == 0) {
       +                ntt = 0;
       +                return 0;
       +        }
       +        if(starting) {
       +                if(ntt >= asize(ttabstack)) {
       +                        if(debug)
       +                                err("translation stack overflow");
       +                        return curtab;
       +                }
       +                ttabstack[ntt++] = curtab;
       +                return newtab;
       +        } else {
       +                if(ntt == 0) {
       +                        if(debug)
       +                                err("translation stack underflow");
       +                        return curtab;
       +                }
       +                return ttabstack[--ntt];
       +        }
       +}
 (DIR) diff --git a/src/cmd/dict/world.c b/src/cmd/dict/world.c
       t@@ -0,0 +1,184 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <bio.h>
       +#include "dict.h"
       +#include "kuten.h"
       +
       +/*
       + * Routines for handling dictionaries in the "Languages of the World"
       + * format.  worldnextoff *must* be called with <address of valid entry>+1.
       + */
       +
       +#define        GSHORT(p)        (((p)[0]<<8)|(p)[1])
       +
       +static void        putchar(int, int*);
       +
       +#define        NONE        0xffff
       +
       +/* adapted from jhelling@cs.ruu.nl (Jeroen Hellingman) */
       +
       +static Rune chartab[] = {
       +
       +/*00*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        L'\n',        0xe6,        0xf8,        0xe5,        0xe4,        0xf6,
       +/*10*/        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,        NONE,
       +        NONE,        NONE,        NONE,        0xc6,        0xd8,        0xc5,        0xc4,        0xd6,
       +
       +/*20*/        0x20,        0x21,        0x22,        0x23,        0x24,        0x25,        0x26,        '\'',
       +        0x28,        0x29,        0x2a,        0x2b,        0x2c,        0x2d,        0x2e,        0x2f,
       +/*30*/  0x30,        0x31,        0x32,        0x33,        0x34,        0x35,        0x36,        0x37,
       +        0x38,        0x39,        0x3a,        0x3b,        0x3c,        0x3d,        0x3e,        0x3f,
       +/*40*/  0x40,        0x41,        0x42,        0x43,        0x44,        0x45,        0x46,        0x47,
       +        0x48,        0x49,        0x4a,        0x4b,        L'L',        0x4d,        0x4e,        0x4f,
       +/*50*/        0x50,        0x51,        0x52,        0x53,        0x54,        0x55,        0x56,        0x57,
       +        0x58,        0x59,        0x5a,        0x5b,        L'\\',        0x5d,        0x5e,        0x5f,
       +/*60*/        0x60,        0x61,        0x62,        0x63,        0x64,        0x65,        0x66,        0x67,
       +        0x68,        0x69,        0x6a,        0x6b,        0x6c,        0x6d,        0x6e,        0x6f,
       +/*70*/        0x70,        0x71,        0x72,        0x73,        0x74,        0x75,        0x76,        0x77,
       +        0x78,        0x79,        0x7a,        0x7b,        0x7c,        0x7d,        0x7e,        NONE,
       +
       +/*80*/        0xc7,        0xfc,        0xe9,        0xe2,        0xe4,        0xe0,        0xe5,        0xe7,
       +        0xea,        0xeb,        0xe8,        0xef,        0xee,        0xec,        0xc4,        0xc5,
       +/*90*/        0xc9,        0xe6,        0xc6,        0xf4,        0xf6,        0xf2,        0xfb,        0xf9,
       +        0xff,        0xd6,        0xdc,        0xa2,        0xa3,        0xa5,        0x20a7,        0x283,
       +/*a0*/        0xe1,        0xed,        0xf3,        0xfa,        0xf1,        0xd1,        0xaa,        0xba,
       +        0xbf,        0x2310,        0xac,        0xbd,        0xbc,        0xa1,        0xab,        0xbb,
       +
       +/*b0*/        0x254,        0x259,        0xf0,        0x283,        0x292,        0x14b,        0x251,        0x7a,
       +        0x26a,        0xf0,        0x292,        0xe3,        0x153,        0x169,        0x28c,        0x265,
       +/*c0*/        0x280,        0xeb,        0x6c,        0x28c,        0xf5,        0xf1,        0x152,        NONE,
       +        NONE,        0x53,        0x73,        0x5a,        0x7a,        NONE,        NONE,        NONE,
       +/*d0*/        0xdf,        NONE,        NONE,        0x101,        0x12b,        0x16b,        0x113,        0x14d,        
       +        NONE,        NONE,        NONE,        0x20,        NONE,        NONE,        NONE,        NONE,
       +
       +/*e0*/        0x3b1,        0x3b2,        0x3b3,        0x3c0,        0x3a3,        0x3c3,        0xb5,        0x3c4,
       +        0x3a6,        0x398,        0x3a9,        0x3b4,        0x221e,        0xd8,        0x3b5,        0x2229,
       +/*f0*/        0x2261,        0xb1,        0x2265,        0x2264,        0x2320,        0x2321,        0xf7,        0x2248,
       +        0xb0,        0x2219,        0xb7,        NONE,        NONE,        NONE,        NONE,        NONE,
       +};
       +
       +enum{ Utf, Kanahi, Kanalo=Kanahi+1, GBhi, GBlo=GBhi+1, };
       +
       +void
       +worldprintentry(Entry e, int cmd)
       +{
       +        int nh, state[3];
       +        uchar *p, *pe;
       +
       +        p = (uchar *)e.start;
       +        pe = (uchar *)e.end;
       +        nh = GSHORT(p);
       +        p += 6;
       +        if(cmd == 'h')
       +                pe = p+nh;
       +        state[0] = Utf;
       +        state[1] = 0;
       +        state[2] = 0;
       +        while(p < pe){
       +                if(cmd == 'r')
       +                        outchar(*p++);
       +                else
       +                        putchar(*p++, state);
       +        }
       +        outnl(0);
       +}
       +
       +long
       +worldnextoff(long fromoff)
       +{
       +        int nh, np, nd;
       +        uchar buf[6];
       +
       +        if(Bseek(bdict, fromoff-1, 0) < 0)
       +                return -1;
       +        if(Bread(bdict, buf, 6) != 6)
       +                return -1;
       +        nh = GSHORT(buf);
       +        np = GSHORT(buf+2);
       +        nd = GSHORT(buf+4);
       +        return fromoff-1 + 6 + nh + np + nd;
       +}
       +
       +static void
       +putchar(int c, int *state)
       +{
       +        int xflag = 0;
       +        Rune r;
       +        int hi, lo;
       +
       +        switch(state[0]){
       +        case Kanahi:
       +        case GBhi:
       +                if(CANS2JH(c) || c == 0xff){
       +                        state[0]++;
       +                        state[1] = c;
       +                        break;
       +                }
       +                /* fall through */
       +        case Utf:
       +                if(c == 0xfe){
       +                        state[0] = Kanahi;
       +                        break;
       +                }else if(c == 0xff){
       +                        state[0] = GBhi;
       +                        break;
       +                }
       +                r = chartab[c];
       +                if(r < 0x80 && state[2] == 0)
       +                        outchar(r);
       +                else if(r == NONE){
       +                        switch(c){
       +                        case 0xfb:
       +                                if(!xflag){
       +                                        state[2] = 1;
       +                                        break;
       +                                }
       +                        case 0xfc:
       +                                if(!xflag){
       +                                        state[2] = 0;
       +                                        break;
       +                                }
       +                        case 0x10:
       +                        case 0xc7: case 0xc8:
       +                        case 0xd8: case 0xd9: case 0xda:
       +                        case 0xdc: case 0xdd: case 0xde: case 0xdf:
       +                        case 0xfd:
       +                                if(!xflag)
       +                                        break;
       +                                /* fall through */
       +                        default:
       +                                outprint("\\%.2ux", c);
       +                        }
       +                }else if(state[2] == 0)
       +                        outrune(r);
       +                break;
       +        case Kanalo:
       +        case GBlo:
       +                if(state[1] == 0xff && c == 0xff){
       +                        state[0] = Utf;
       +                        break;
       +                }
       +                state[0]--;
       +                hi = state[1];
       +                lo = c;
       +                S2J(hi, lo);                /* convert to JIS */
       +                r = hi*100 + lo - 3232;        /* convert to jis208 */
       +                if(state[0] == Kanahi && r < JIS208MAX)
       +                        r = tabjis208[r];
       +                else if(state[0] == GBhi && r < GB2312MAX)
       +                        r = tabgb2312[r];
       +                else
       +                        r = NONE;
       +                if(r == NONE)
       +                        outprint("\\%.2ux\\%.2ux", state[1], c);
       +                else
       +                        outrune(r);
       +                break;
       +        }
       +}
       +
       +void
       +worldprintkey(void)
       +{
       +        Bprint(bout, "No pronunciation key.\n");
       +}