diff options
author | rsc <devnull@localhost> | 2003-11-25 03:37:45 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-11-25 03:37:45 +0000 |
commit | 08708877939323c1e1cb87210193ec25fc472ff7 (patch) | |
tree | bd34e2144a3e9532ab228619d7ae8d4a0078aeeb /src/cmd/dict | |
parent | 091f74d0a0db5ba1e098a518922525cb032a97b4 (diff) | |
download | plan9port-08708877939323c1e1cb87210193ec25fc472ff7.tar.gz plan9port-08708877939323c1e1cb87210193ec25fc472ff7.tar.bz2 plan9port-08708877939323c1e1cb87210193ec25fc472ff7.zip |
add dict
Diffstat (limited to 'src/cmd/dict')
-rw-r--r-- | src/cmd/dict/ahd.c | 139 | ||||
-rw-r--r-- | src/cmd/dict/canonind.awk | 29 | ||||
-rw-r--r-- | src/cmd/dict/comfix.awk | 56 | ||||
-rw-r--r-- | src/cmd/dict/dict.c | 681 | ||||
-rw-r--r-- | src/cmd/dict/dict.h | 160 | ||||
-rwxr-xr-x | src/cmd/dict/egfix | 15 | ||||
-rwxr-xr-x | src/cmd/dict/egfix2 | 8 | ||||
-rw-r--r-- | src/cmd/dict/gb2312.c | 1108 | ||||
-rwxr-xr-x | src/cmd/dict/gefix | 23 | ||||
-rwxr-xr-x | src/cmd/dict/getneeds | 8 | ||||
-rw-r--r-- | src/cmd/dict/jis208.c | 1059 | ||||
-rw-r--r-- | src/cmd/dict/kuten.h | 114 | ||||
-rw-r--r-- | src/cmd/dict/mkfile | 18 | ||||
-rw-r--r-- | src/cmd/dict/mkindex.c | 106 | ||||
-rw-r--r-- | src/cmd/dict/movie.c | 328 | ||||
-rw-r--r-- | src/cmd/dict/oed.c | 1425 | ||||
-rw-r--r-- | src/cmd/dict/pcollins.c | 226 | ||||
-rw-r--r-- | src/cmd/dict/pcollinsg.c | 248 | ||||
-rw-r--r-- | src/cmd/dict/pgw.c | 1165 | ||||
-rw-r--r-- | src/cmd/dict/rev.awk | 6 | ||||
-rw-r--r-- | src/cmd/dict/robert.c | 312 | ||||
-rw-r--r-- | src/cmd/dict/simple.c | 46 | ||||
-rw-r--r-- | src/cmd/dict/slang.c | 203 | ||||
-rw-r--r-- | src/cmd/dict/t.awk | 13 | ||||
-rw-r--r-- | src/cmd/dict/thesaurus.c | 86 | ||||
-rw-r--r-- | src/cmd/dict/utils.c | 577 | ||||
-rw-r--r-- | src/cmd/dict/world.c | 184 |
27 files changed, 8343 insertions, 0 deletions
diff --git a/src/cmd/dict/ahd.c b/src/cmd/dict/ahd.c new file mode 100644 index 00000000..18a56d00 --- /dev/null +++ b/src/cmd/dict/ahd.c @@ -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"); +} diff --git a/src/cmd/dict/canonind.awk b/src/cmd/dict/canonind.awk new file mode 100644 index 00000000..41c6ee75 --- /dev/null +++ b/src/cmd/dict/canonind.awk @@ -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 +} diff --git a/src/cmd/dict/comfix.awk b/src/cmd/dict/comfix.awk new file mode 100644 index 00000000..9a51b98e --- /dev/null +++ b/src/cmd/dict/comfix.awk @@ -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 + } +} diff --git a/src/cmd/dict/dict.c b/src/cmd/dict/dict.c new file mode 100644 index 00000000..bafe90d5 --- /dev/null +++ b/src/cmd/dict/dict.c @@ -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; +} diff --git a/src/cmd/dict/dict.h b/src/cmd/dict/dict.h new file mode 100644 index 00000000..8b558ac5 --- /dev/null +++ b/src/cmd/dict/dict.h @@ -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])) diff --git a/src/cmd/dict/egfix b/src/cmd/dict/egfix new file mode 100755 index 00000000..192320c2 --- /dev/null +++ b/src/cmd/dict/egfix @@ -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 +' diff --git a/src/cmd/dict/egfix2 b/src/cmd/dict/egfix2 new file mode 100755 index 00000000..d5af3bfe --- /dev/null +++ b/src/cmd/dict/egfix2 @@ -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 diff --git a/src/cmd/dict/gb2312.c b/src/cmd/dict/gb2312.c new file mode 100644 index 00000000..d667aafd --- /dev/null +++ b/src/cmd/dict/gb2312.c @@ -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, +}; diff --git a/src/cmd/dict/gefix b/src/cmd/dict/gefix new file mode 100755 index 00000000..74df8de0 --- /dev/null +++ b/src/cmd/dict/gefix @@ -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 diff --git a/src/cmd/dict/getneeds b/src/cmd/dict/getneeds new file mode 100755 index 00000000..7f50edff --- /dev/null +++ b/src/cmd/dict/getneeds @@ -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* +} diff --git a/src/cmd/dict/jis208.c b/src/cmd/dict/jis208.c new file mode 100644 index 00000000..d2086e6a --- /dev/null +++ b/src/cmd/dict/jis208.c @@ -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, +}; diff --git a/src/cmd/dict/kuten.h b/src/cmd/dict/kuten.h new file mode 100644 index 00000000..af59d833 --- /dev/null +++ b/src/cmd/dict/kuten.h @@ -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]; diff --git a/src/cmd/dict/mkfile b/src/cmd/dict/mkfile new file mode 100644 index 00000000..62b28be2 --- /dev/null +++ b/src/cmd/dict/mkfile @@ -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 diff --git a/src/cmd/dict/mkindex.c b/src/cmd/dict/mkindex.c new file mode 100644 index 00000000..23024792 --- /dev/null +++ b/src/cmd/dict/mkindex.c @@ -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; +} diff --git a/src/cmd/dict/movie.c b/src/cmd/dict/movie.c new file mode 100644 index 00000000..f1042fd6 --- /dev/null +++ b/src/cmd/dict/movie.c @@ -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; +} diff --git a/src/cmd/dict/oed.c b/src/cmd/dict/oed.c new file mode 100644 index 00000000..868eb486 --- /dev/null +++ b/src/cmd/dict/oed.c @@ -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); + } +} diff --git a/src/cmd/dict/pcollins.c b/src/cmd/dict/pcollins.c new file mode 100644 index 00000000..83ee3abc --- /dev/null +++ b/src/cmd/dict/pcollins.c @@ -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; +} diff --git a/src/cmd/dict/pcollinsg.c b/src/cmd/dict/pcollinsg.c new file mode 100644 index 00000000..bbd31c09 --- /dev/null +++ b/src/cmd/dict/pcollinsg.c @@ -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; +} diff --git a/src/cmd/dict/pgw.c b/src/cmd/dict/pgw.c new file mode 100644 index 00000000..88a490c8 --- /dev/null +++ b/src/cmd/dict/pgw.c @@ -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; +} diff --git a/src/cmd/dict/rev.awk b/src/cmd/dict/rev.awk new file mode 100644 index 00000000..3c77d684 --- /dev/null +++ b/src/cmd/dict/rev.awk @@ -0,0 +1,6 @@ +NF == 2 { + printf "%s\t%s\n", $2, $1 + } +NF != 2 { + print "ERROR " $0 + } diff --git a/src/cmd/dict/robert.c b/src/cmd/dict/robert.c new file mode 100644 index 00000000..53b72dfb --- /dev/null +++ b/src/cmd/dict/robert.c @@ -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; +} diff --git a/src/cmd/dict/simple.c b/src/cmd/dict/simple.c new file mode 100644 index 00000000..ea0443ba --- /dev/null +++ b/src/cmd/dict/simple.c @@ -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"); +} diff --git a/src/cmd/dict/slang.c b/src/cmd/dict/slang.c new file mode 100644 index 00000000..bd32b976 --- /dev/null +++ b/src/cmd/dict/slang.c @@ -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; + } +} diff --git a/src/cmd/dict/t.awk b/src/cmd/dict/t.awk new file mode 100644 index 00000000..e722a3cc --- /dev/null +++ b/src/cmd/dict/t.awk @@ -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 + } diff --git a/src/cmd/dict/thesaurus.c b/src/cmd/dict/thesaurus.c new file mode 100644 index 00000000..8ad3006b --- /dev/null +++ b/src/cmd/dict/thesaurus.c @@ -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"); +} diff --git a/src/cmd/dict/utils.c b/src/cmd/dict/utils.c new file mode 100644 index 00000000..8e4db9e9 --- /dev/null +++ b/src/cmd/dict/utils.c @@ -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]; + } +} diff --git a/src/cmd/dict/world.c b/src/cmd/dict/world.c new file mode 100644 index 00000000..19f3fb10 --- /dev/null +++ b/src/cmd/dict/world.c @@ -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"); +} |