diff options
Diffstat (limited to 'console-client')
-rw-r--r-- | console-client/xkb/Compose | 441 | ||||
-rw-r--r-- | console-client/xkb/MISSING-FEATURES | 32 | ||||
-rw-r--r-- | console-client/xkb/README | 177 | ||||
-rw-r--r-- | console-client/xkb/TODO | 7 | ||||
-rw-r--r-- | console-client/xkb/compose.c | 422 | ||||
-rw-r--r-- | console-client/xkb/default.xkb | 1316 | ||||
-rw-r--r-- | console-client/xkb/keysymdef.h | 2016 | ||||
-rw-r--r-- | console-client/xkb/ks_tables.h | 2380 | ||||
-rw-r--r-- | console-client/xkb/kstoucs.c | 317 | ||||
-rw-r--r-- | console-client/xkb/lex.l | 367 | ||||
-rw-r--r-- | console-client/xkb/makeconf.sh | 26 | ||||
-rw-r--r-- | console-client/xkb/parser.y | 1529 | ||||
-rw-r--r-- | console-client/xkb/symname.c | 96 | ||||
-rw-r--r-- | console-client/xkb/xkb-data/keymap/hurd | 347 | ||||
-rw-r--r-- | console-client/xkb/xkb-data/symbols/hurd | 125 | ||||
-rw-r--r-- | console-client/xkb/xkb-data/types/hurd | 18 | ||||
-rw-r--r-- | console-client/xkb/xkb.c | 1859 | ||||
-rw-r--r-- | console-client/xkb/xkb.h | 435 | ||||
-rw-r--r-- | console-client/xkb/xkbdata.c | 456 | ||||
-rw-r--r-- | console-client/xkb/xkbdefaults.c | 1318 | ||||
-rw-r--r-- | console-client/xkb/xkbtimer.c | 236 |
21 files changed, 13920 insertions, 0 deletions
diff --git a/console-client/xkb/Compose b/console-client/xkb/Compose new file mode 100644 index 00000000..1a6d8836 --- /dev/null +++ b/console-client/xkb/Compose @@ -0,0 +1,441 @@ +# $TOG: fcd8859-15 /main/2 1998/06/17 15:53:45 kaleb $ +# +# ISO 8859-15 (Latin1) Compose Sequence +# +# $XFree86: xc/nls/Compose/iso8859-15,v 1.3 2000/10/27 18:30:51 dawes Exp $ +# +# Sequence Definition +# +# <Multi_key> Means <Compose> +# Special Character +<Multi_key> <plus> <plus> : "#" numbersign +<Multi_key> <apostrophe> <space> : "'" apostrophe +<Multi_key> <space> <apostrophe> : "'" apostrophe +<Multi_key> <A> <T> : "@" at +<Multi_key> <parenleft> <parenleft> : "[" bracketleft +<Multi_key> <slash> <slash> : "\\" backslash +<Multi_key> <slash> <less> : "\\" backslash +<Multi_key> <less> <slash> : "\\" backslash +<Multi_key> <parenright> <parenright> : "]" bracketright +<Multi_key> <asciicircum> <space> : "^" asciicircum +<Multi_key> <space> <asciicircum> : "^" asciicircum +<Multi_key> <greater> <space> : "^" asciicirum +<Multi_key> <space> <greater> : "^" asciicirum +<Multi_key> <grave> <space> : "`" grave +<Multi_key> <space> <grave> : "`" grave +<Multi_key> <parenleft> <minus> : "{" braceleft +<Multi_key> <minus> <parenleft> : "{" braceleft +<Multi_key> <slash> <asciicircum> : "|" bar +<Multi_key> <asciicircum> <slash> : "|" bar +<Multi_key> <V> <L> : "|" bar +<Multi_key> <L> <V> : "|" bar +<Multi_key> <v> <l> : "|" bar +<Multi_key> <l> <v> : "|" bar +<Multi_key> <parenright> <minus> : "}" braceright +<Multi_key> <minus> <parenright> : "}" braceright +<Multi_key> <asciitilde> <space> : "~" asciitilde +<Multi_key> <space> <asciitilde> : "~" asciitilde +<Multi_key> <minus> <space> : "~" asciitilde +<Multi_key> <space> <minus> : "~" asciitilde +<Multi_key> <exclam> <exclam> : "\241" exclamdown +<Multi_key> <c> <slash> : "\242" cent +<Multi_key> <slash> <c> : "\242" cent +<Multi_key> <C> <slash> : "\242" cent +<Multi_key> <slash> <C> : "\242" cent +<Multi_key> <C> <bar> : "\242" cent +<Multi_key> <bar> <C> : "\242" cent +<Multi_key> <c> <bar> : "\242" cent +<Multi_key> <bar> <c> : "\242" cent +<Multi_key> <l> <minus> : "\243" sterling +<Multi_key> <minus> <l> : "\243" sterling +<Multi_key> <L> <minus> : "\243" sterling +<Multi_key> <minus> <L> : "\243" sterling +<Multi_key> <l> <equal> : "\243" sterling +<Multi_key> <equal> <l> : "\243" sterling +<Multi_key> <L> <equal> : "\243" sterling +<Multi_key> <equal> <L> : "\243" sterling +<Multi_key> <C> <equal> : "\244" EuroSign +<Multi_key> <equal> <C> : "\244" EuroSign +<Multi_key> <E> <equal> : "\244" EuroSign +<Multi_key> <e> <equal> : "\244" EuroSign +<Multi_key> <y> <minus> : "\245" yen +<Multi_key> <minus> <y> : "\245" yen +<Multi_key> <Y> <minus> : "\245" yen +<Multi_key> <minus> <Y> : "\245" yen +<Multi_key> <y> <equal> : "\245" yen +<Multi_key> <equal> <y> : "\245" yen +<Multi_key> <Y> <equal> : "\245" yen +<Multi_key> <equal> <Y> : "\245" yen +<Multi_key> <s> <o> : "\247" section +<Multi_key> <o> <s> : "\247" section +<Multi_key> <S> <O> : "\247" section +<Multi_key> <O> <S> : "\247" section +<Multi_key> <S> <exclam> : "\247" section +<Multi_key> <exclam> <S> : "\247" section +<Multi_key> <s> <exclam> : "\247" section +<Multi_key> <exclam> <s> : "\247" section +<Multi_key> <S> <0> : "\247" section +<Multi_key> <0> <S> : "\247" section +<Multi_key> <s> <0> : "\247" section +<Multi_key> <0> <s> : "\247" section +<Multi_key> <c> <o> : "\251" copyright +<Multi_key> <o> <c> : "\251" copyright +<Multi_key> <C> <O> : "\251" copyright +<Multi_key> <O> <C> : "\251" copyright +<Multi_key> <c> <O> : "\251" copyright +<Multi_key> <O> <c> : "\251" copyright +<Multi_key> <C> <o> : "\251" copyright +<Multi_key> <o> <C> : "\251" copyright +<Multi_key> <c> <0> : "\251" copyright +<Multi_key> <0> <c> : "\251" copyright +<Multi_key> <C> <0> : "\251" copyright +<Multi_key> <0> <C> : "\251" copyright +<Multi_key> <parenleft> <c> : "\251" copyright +<Multi_key> <parenleft> <C> : "\251" copyright +<Multi_key> <a> <underscore> : "\252" ordfeminine +<Multi_key> <underscore> <a> : "\252" ordfeminine +<Multi_key> <A> <underscore> : "\252" ordfeminine +<Multi_key> <underscore> <A> : "\252" ordfeminine +<Multi_key> <o> <underscore> : "\272" masculine +<Multi_key> <underscore> <o> : "\272" masculine +<Multi_key> <O> <underscore> : "\272" masculine +<Multi_key> <underscore> <O> : "\272" masculine +<Multi_key> <less> <less> : "\253" guillemotleft +<Multi_key> <greater> <greater> : "\273" guillemotright +<Multi_key> <0> <asciicircum> : "\260" degree +<Multi_key> <asciicircum> <0> : "\260" degree +<Multi_key> <0> <asterisk> : "\260" degree +<Multi_key> <asterisk> <0> : "\260" degree +<Multi_key> <plus> <minus> : "\261" plusminus +<Multi_key> <minus> <plus> : "\261" plusminus +<Multi_key> <slash> <u> : "\265" mu +<Multi_key> <u> <slash> : "\265" mu +<Multi_key> <slash> <U> : "\265" mu +<Multi_key> <U> <slash> : "\265" mu +<Multi_key> <1> <asciicircum> : "\271" onesuperior +<Multi_key> <asciicircum> <1> : "\271" onesuperior +<Multi_key> <S> <1> : "\271" onesuperior +<Multi_key> <1> <S> : "\271" onesuperior +<Multi_key> <s> <1> : "\271" onesuperior +<Multi_key> <1> <s> : "\271" onesuperior +<Multi_key> <2> <asciicircum> : "\262" twosuperior +<Multi_key> <asciicircum> <2> : "\262" twosuperior +<Multi_key> <S> <2> : "\262" twosuperior +<Multi_key> <2> <S> : "\262" twosuperior +<Multi_key> <s> <2> : "\262" twosuperior +<Multi_key> <2> <s> : "\262" twosuperior +<Multi_key> <3> <asciicircum> : "\263" threesuperior +<Multi_key> <asciicircum> <3> : "\263" threesuperior +<Multi_key> <S> <3> : "\263" threesuperior +<Multi_key> <3> <S> : "\263" threesuperior +<Multi_key> <s> <3> : "\263" threesuperior +<Multi_key> <3> <s> : "\263" threesuperior +<Multi_key> <p> <exclam> : "\266" paragraph +<Multi_key> <exclam> <p> : "\266" paragraph +<Multi_key> <P> <exclam> : "\266" paragraph +<Multi_key> <exclam> <P> : "\266" paragraph +<Multi_key> <period> <asciicircum> : "\267" periodcentered +<Multi_key> <asciicircum> <period> : "\267" periodcentered +<Multi_key> <period> <period> : "\267" periodcentered +<Multi_key> <question> <question> : "\277" questiondown +<Multi_key> <space> <space> : "\240" nobreakspace +<Multi_key> <minus> <comma> : "\254" notsign +<Multi_key> <comma> <minus> : "\254" notsign +<Multi_key> <minus> <minus> : "\255" hyphen +<Multi_key> <R> <O> : "\256" registered +<Multi_key> <O> <R> : "\256" registered +<Multi_key> <parenleft> <r> : "\256" registered +<Multi_key> <minus> <asciicircum> : "\257" macron +<Multi_key> <asciicircum> <minus> : "\257" macron +<Multi_key> <underscore> <asciicircum> : "\257" macron +<Multi_key> <asciicircum> <underscore> : "\257" macron +<Multi_key> <underscore> <underscore> : "\257" macron +<Multi_key> <minus> <colon> : "\367" division +<Multi_key> <colon> <minus> : "\367" division +<Multi_key> <x> <x> : "\327" multiply +<Multi_key> <apostrophe> <apostrophe> : "'" apostrophe +<Multi_key> <quotedbl> <quotedbl> : "\"" quotedbl +# Accented Alphabet +<Multi_key> <A> <grave> : "\300" Agrave +<Multi_key> <grave> <A> : "\300" Agrave +<Multi_key> <A> <acute> : "\301" Aacute +<Multi_key> <acute> <A> : "\301" Aacute +<Multi_key> <A> <apostrophe> : "\301" Aacute +<Multi_key> <apostrophe> <A> : "\301" Aacute +<Multi_key> <A> <asciicircum> : "\302" Acircumflex +<Multi_key> <asciicircum> <A> : "\302" Acircumflex +<Multi_key> <A> <greater> : "\302" Acircumflex +<Multi_key> <greater> <A> : "\302" Acircumflex +<Multi_key> <A> <asciitilde> : "\303" Atilde +<Multi_key> <asciitilde> <A> : "\303" Atilde +<Multi_key> <A> <minus> : "\303" Atilde +<Multi_key> <minus> <A> : "\303" Atilde +<Multi_key> <A> <quotedbl> : "\304" Adiaeresis +<Multi_key> <quotedbl> <A> : "\304" Adiaeresis +<Multi_key> <A> <asterisk> : "\305" Aring +<Multi_key> <asterisk> <A> : "\305" Aring +<Multi_key> <A> <A> : "\305" Aring +<Multi_key> <A> <O> : "\305" Aring +<Multi_key> <A> <E> : "\306" AE +<Multi_key> <a> <grave> : "\340" agrave +<Multi_key> <grave> <a> : "\340" agrave +<Multi_key> <a> <acute> : "\341" aacute +<Multi_key> <acute> <a> : "\341" aacute +<Multi_key> <a> <apostrophe> : "\341" aacute +<Multi_key> <apostrophe> <a> : "\341" aacute +<Multi_key> <a> <asciicircum> : "\342" acircumflex +<Multi_key> <asciicircum> <a> : "\342" acircumflex +<Multi_key> <a> <greater> : "\342" acircumflex +<Multi_key> <greater> <a> : "\342" acircumflex +<Multi_key> <a> <asciitilde> : "\343" atilde +<Multi_key> <asciitilde> <a> : "\343" atilde +<Multi_key> <a> <minus> : "\343" atilde +<Multi_key> <minus> <a> : "\343" atilde +<Multi_key> <a> <quotedbl> : "\344" adiaeresis +<Multi_key> <quotedbl> <a> : "\344" adiaeresis +<Multi_key> <a> <asterisk> : "\345" aring +<Multi_key> <asterisk> <a> : "\345" aring +<Multi_key> <a> <a> : "\345" aring +<Multi_key> <a> <o> : "\345" aring +<Multi_key> <a> <e> : "\346" ae +<Multi_key> <acute> <C> : "\307" Ccedilla +<Multi_key> <acute> <c> : "\347" ccedilla +<Multi_key> <C> <comma> : "\307" Ccedilla +<Multi_key> <comma> <C> : "\307" Ccedilla +<Multi_key> <c> <comma> : "\347" ccedilla +<Multi_key> <comma> <c> : "\347" ccedilla +<Multi_key> <minus> <D> : "\320" ETH +<Multi_key> <D> <minus> : "\320" ETH +<Multi_key> <minus> <d> : "\360" eth +<Multi_key> <d> <minus> : "\360" eth +<Multi_key> <E> <grave> : "\310" Egrave +<Multi_key> <grave> <E> : "\310" Egrave +<Multi_key> <E> <acute> : "\311" Eacute +<Multi_key> <acute> <E> : "\311" Eacute +<Multi_key> <E> <apostrophe> : "\311" Eacute +<Multi_key> <apostrophe> <E> : "\311" Eacute +<Multi_key> <E> <asciicircum> : "\312" Ecircumflex +<Multi_key> <asciicircum> <E> : "\312" Ecircumflex +<Multi_key> <E> <greater> : "\312" Ecircumflex +<Multi_key> <greater> <E> : "\312" Ecircumflex +<Multi_key> <E> <quotedbl> : "\313" Ediaeresis +<Multi_key> <quotedbl> <E> : "\313" Ediaeresis +<Multi_key> <e> <grave> : "\350" egrave +<Multi_key> <grave> <e> : "\350" egrave +<Multi_key> <e> <acute> : "\351" eacute +<Multi_key> <acute> <e> : "\351" eacute +<Multi_key> <e> <apostrophe> : "\351" eacute +<Multi_key> <apostrophe> <e> : "\351" eacute +<Multi_key> <e> <asciicircum> : "\352" ecircumflex +<Multi_key> <asciicircum> <e> : "\352" ecircumflex +<Multi_key> <e> <greater> : "\352" ecircumflex +<Multi_key> <greater> <e> : "\352" ecircumflex +<Multi_key> <e> <quotedbl> : "\353" ediaeresis +<Multi_key> <quotedbl> <e> : "\353" ediaeresis +<Multi_key> <I> <grave> : "\314" Igrave +<Multi_key> <grave> <I> : "\314" Igrave +<Multi_key> <I> <acute> : "\315" Iacute +<Multi_key> <acute> <I> : "\315" Iacute +<Multi_key> <I> <apostrophe> : "\315" Iacute +<Multi_key> <apostrophe> <I> : "\315" Iacute +<Multi_key> <I> <asciicircum> : "\316" Icircumflex +<Multi_key> <asciicircum> <I> : "\316" Icircumflex +<Multi_key> <I> <greater> : "\316" Icircumflex +<Multi_key> <greater> <I> : "\316" Icircumflex +<Multi_key> <I> <quotedbl> : "\317" Idiaeresis +<Multi_key> <quotedbl> <I> : "\317" Idiaeresis +<Multi_key> <i> <grave> : "\354" igrave +<Multi_key> <grave> <i> : "\354" igrave +<Multi_key> <i> <acute> : "\355" iacute +<Multi_key> <acute> <i> : "\355" iacute +<Multi_key> <i> <apostrophe> : "\355" iacute +<Multi_key> <apostrophe> <i> : "\355" iacute +<Multi_key> <i> <asciicircum> : "\356" icircumflex +<Multi_key> <asciicircum> <i> : "\356" icircumflex +<Multi_key> <i> <greater> : "\356" icircumflex +<Multi_key> <greater> <i> : "\356" icircumflex +<Multi_key> <i> <quotedbl> : "\357" idiaeresis +<Multi_key> <quotedbl> <i> : "\357" idiaeresis +<Multi_key> <N> <asciitilde> : "\321" Ntilde +<Multi_key> <asciitilde> <N> : "\321" Ntilde +<Multi_key> <N> <minus> : "\321" Ntilde +<Multi_key> <minus> <N> : "\321" Ntilde +<Multi_key> <n> <asciitilde> : "\361" ntilde +<Multi_key> <asciitilde> <n> : "\361" ntilde +<Multi_key> <n> <minus> : "\361" ntilde +<Multi_key> <minus> <n> : "\361" ntilde +<Multi_key> <O> <grave> : "\322" Ograve +<Multi_key> <grave> <O> : "\322" Ograve +<Multi_key> <O> <acute> : "\323" Oacute +<Multi_key> <acute> <O> : "\323" Oacute +<Multi_key> <O> <apostrophe> : "\323" Oacute +<Multi_key> <apostrophe> <O> : "\323" Oacute +<Multi_key> <O> <asciicircum> : "\324" Ocircumflex +<Multi_key> <asciicircum> <O> : "\324" Ocircumflex +<Multi_key> <O> <greater> : "\324" Ocircumflex +<Multi_key> <greater> <O> : "\324" Ocircumflex +<Multi_key> <O> <asciitilde> : "\325" Otilde +<Multi_key> <asciitilde> <O> : "\325" Otilde +<Multi_key> <O> <minus> : "\325" Otilde +<Multi_key> <minus> <O> : "\325" Otilde +<Multi_key> <O> <quotedbl> : "\326" Odiaeresis +<Multi_key> <quotedbl> <O> : "\326" Odiaeresis +<Multi_key> <O> <slash> : "\330" Ooblique +<Multi_key> <slash> <O> : "\330" Ooblique +<Multi_key> <O> <E> : "\274" OE +<Multi_key> <o> <grave> : "\362" ograve +<Multi_key> <grave> <o> : "\362" ograve +<Multi_key> <o> <acute> : "\363" oacute +<Multi_key> <acute> <o> : "\363" oacute +<Multi_key> <o> <apostrophe> : "\363" oacute +<Multi_key> <apostrophe> <o> : "\363" oacute +<Multi_key> <o> <asciicircum> : "\364" ocircumflex +<Multi_key> <asciicircum> <o> : "\364" ocircumflex +<Multi_key> <o> <greater> : "\364" ocircumflex +<Multi_key> <greater> <o> : "\364" ocircumflex +<Multi_key> <o> <asciitilde> : "\365" otilde +<Multi_key> <asciitilde> <o> : "\365" otilde +<Multi_key> <o> <minus> : "\365" otilde +<Multi_key> <minus> <o> : "\365" otilde +<Multi_key> <o> <quotedbl> : "\366" odiaeresis +<Multi_key> <quotedbl> <o> : "\366" odiaeresis +<Multi_key> <o> <slash> : "\370" oslash +<Multi_key> <slash> <o> : "\370" oslash +<Multi_key> <o> <e> : "\275" oe +<Multi_key> <S> <less> : "\246" Scaron +<Multi_key> <less> <S> : "\246" Scaron +<Multi_key> <s> <less> : "\250" scaron +<Multi_key> <less> <s> : "\250" scaron +<Multi_key> <U> <grave> : "\331" Ugrave +<Multi_key> <grave> <U> : "\331" Ugrave +<Multi_key> <U> <acute> : "\332" Uacute +<Multi_key> <acute> <U> : "\332" Uacute +<Multi_key> <U> <apostrophe> : "\332" Uacute +<Multi_key> <apostrophe> <U> : "\332" Uacute +<Multi_key> <U> <asciicircum> : "\333" Ucircumflex +<Multi_key> <asciicircum> <U> : "\333" Ucircumflex +<Multi_key> <U> <greater> : "\333" Ucircumflex +<Multi_key> <greater> <U> : "\333" Ucircumflex +<Multi_key> <U> <quotedbl> : "\334" Udiaeresis +<Multi_key> <quotedbl> <U> : "\334" Udiaeresis +<Multi_key> <u> <grave> : "\371" ugrave +<Multi_key> <grave> <u> : "\371" ugrave +<Multi_key> <u> <acute> : "\372" uacute +<Multi_key> <acute> <u> : "\372" uacute +<Multi_key> <u> <apostrophe> : "\372" uacute +<Multi_key> <apostrophe> <u> : "\372" uacute +<Multi_key> <u> <asciicircum> : "\373" ucircumflex +<Multi_key> <asciicircum> <u> : "\373" ucircumflex +<Multi_key> <u> <greater> : "\373" ucircumflex +<Multi_key> <greater> <u> : "\373" ucircumflex +<Multi_key> <u> <quotedbl> : "\374" udiaeresis +<Multi_key> <quotedbl> <u> : "\374" udiaeresis +<Multi_key> <s> <s> : "\337" ssharp +<Multi_key> <T> <H> : "\336" THORN +<Multi_key> <t> <h> : "\376" thorn +<Multi_key> <Y> <acute> : "\335" Yacute +<Multi_key> <acute> <Y> : "\335" Yacute +<Multi_key> <Y> <apostrophe> : "\335" Yacute +<Multi_key> <apostrophe> <Y> : "\335" Yacute +<Multi_key> <Y> <quotedbl> : "\276" Ydiaeresis +<Multi_key> <quotedbl> <Y> : "\276" Ydiaeresis +<Multi_key> <y> <acute> : "\375" yacute +<Multi_key> <acute> <y> : "\375" yacute +<Multi_key> <y> <apostrophe> : "\375" yacute +<Multi_key> <apostrophe> <y> : "\375" yacute +<Multi_key> <y> <quotedbl> : "\377" ydiaeresis +<Multi_key> <quotedbl> <y> : "\377" ydiaeresis +<Multi_key> <Z> <less> : "\264" Zcaron +<Multi_key> <less> <Z> : "\264" Zcaron +<Multi_key> <z> <less> : "\270" zcaron +<Multi_key> <less> <z> : "\270" zcaron +# +# dead key accent keysyms +# Special Character +<dead_circumflex> <slash> : "|" bar +<dead_grave> <space> : "`" grave +<dead_acute> <space> : "'" apostrophe +<dead_diaeresis> <space> : "\"" quotedbl +<dead_circumflex> <space> : "^" asciicircum +<dead_circumflex> <dead_circumflex> : "^" asciicircum +<dead_tilde> <space> : "~" asciitilde +<dead_tilde> <dead_tilde> : "~" asciitilde +<dead_circumflex> <0> : "\260" degree +<dead_circumflex> <1> : "\271" onesuperior +<dead_circumflex> <2> : "\262" twosuperior +<dead_circumflex> <3> : "\263" threesuperior +<dead_circumflex> <period> : "\267" periodcentered +<dead_cedilla> <minus> : "\254" notsign +<dead_circumflex> <minus> : "\257" macron +<dead_circumflex> <underscore> : "\257" macron +<dead_acute> <apostrophe> : "'" apostrophe +<dead_diaeresis> <quotedbl> : "\"" quotedbl +# Accented Alphabet +<dead_abovering> <A> : "\305" Aring +<dead_grave> <A> : "\300" Agrave +<dead_acute> <A> : "\301" Aacute +<dead_circumflex> <A> : "\302" Acircumflex +<dead_tilde> <A> : "\303" Atilde +<dead_diaeresis> <A> : "\304" Adiaeresis +<dead_abovering> <a> : "\345" aring +<dead_grave> <a> : "\340" agrave +<dead_acute> <a> : "\341" aacute +<dead_circumflex> <a> : "\342" acircumflex +<dead_tilde> <a> : "\343" atilde +<dead_diaeresis> <a> : "\344" adiaeresis +<dead_cedilla> <C> : "\307" Ccedilla +<dead_cedilla> <c> : "\347" ccedilla +<dead_grave> <E> : "\310" Egrave +<dead_acute> <E> : "\311" Eacute +<dead_circumflex> <E> : "\312" Ecircumflex +<dead_diaeresis> <E> : "\313" Ediaeresis +<dead_grave> <e> : "\350" egrave +<dead_acute> <e> : "\351" eacute +<dead_circumflex> <e> : "\352" ecircumflex +<dead_diaeresis> <e> : "\353" ediaeresis +<dead_grave> <I> : "\314" Igrave +<dead_acute> <I> : "\315" Iacute +<dead_circumflex> <I> : "\316" Icircumflex +<dead_diaeresis> <I> : "\317" Idiaeresis +<dead_grave> <i> : "\354" igrave +<dead_acute> <i> : "\355" iacute +<dead_circumflex> <i> : "\356" icircumflex +<dead_diaeresis> <i> : "\357" idiaeresis +<dead_tilde> <N> : "\321" Ntilde +<dead_tilde> <n> : "\361" ntilde +<dead_grave> <O> : "\322" Ograve +<dead_acute> <O> : "\323" Oacute +<dead_circumflex> <O> : "\324" Ocircumflex +<dead_tilde> <O> : "\325" Otilde +<dead_diaeresis> <O> : "\326" Odiaeresis +<dead_grave> <o> : "\362" ograve +<dead_acute> <o> : "\363" oacute +<dead_circumflex> <o> : "\364" ocircumflex +<dead_tilde> <o> : "\365" otilde +<dead_diaeresis> <o> : "\366" odiaeresis +<dead_caron> <S> : "\246" Scaron +<dead_caron> <s> : "\250" scaron +<dead_circumflex> <S> : "\246" Scaron +<dead_circumflex> <s> : "\250" scaron +<dead_grave> <U> : "\331" Ugrave +<dead_acute> <U> : "\332" Uacute +<dead_circumflex> <U> : "\333" Ucircumflex +<dead_diaeresis> <U> : "\334" Udiaeresis +<dead_grave> <u> : "\371" ugrave +<dead_acute> <u> : "\372" uacute +<dead_circumflex> <u> : "\373" ucircumflex +<dead_diaeresis> <u> : "\374" udiaeresis +<dead_acute> <Y> : "\335" Yacute +<dead_diaeresis> <Y> : "\276" Ydiaeresis +<dead_acute> <y> : "\375" yacute +<dead_diaeresis> <y> : "\377" ydiaeresis +<dead_caron> <Z> : "\264" Zcaron +<dead_caron> <z> : "\270" zcaron +<dead_circumflex> <Z> : "\264" Zcaron +<dead_circumflex> <z> : "\270" zcaron +# Useful for portuguese language +<dead_acute> <C> : "\307" Ccedilla +<dead_acute> <c> : "\347" ccedilla +<dead_acute> <dead_acute> : "'" apostrophe +<dead_grave> <dead_grave> : "`" grave +# End of Sequence Definition diff --git a/console-client/xkb/MISSING-FEATURES b/console-client/xkb/MISSING-FEATURES new file mode 100644 index 00000000..237c13d7 --- /dev/null +++ b/console-client/xkb/MISSING-FEATURES @@ -0,0 +1,32 @@ +Required for 100% compatibility with XKB: + +- Jukebox (possibility that this won't ever be done) +- Loading the keydatabase +- Proper indicator support +- ISOLock +- key lock +- radio groups +- overlays +- Latching (properly, mostly works) +- Enabling/disabling controls +- The following controls are not implemented at all: + - SlowKeys + - BounceKeys + - StickyKeys + - MouseKeysAccel + - AccesXKeys + - AccesXTimeout + - AccessXFreedback (jukebox required) + - Overlay1 + Overlay2 + - AudibleBell + - IgnoreGroupLock + - EnabledControls + +Hurd features: + +- Binding a string to a key (requires new action) + (It should be possible to insert this on other vcs too) +- Binding executable to a key (requires new action) + +I'm sure I forgot some missing features, please report them: +metgerards@student.han.nl diff --git a/console-client/xkb/README b/console-client/xkb/README new file mode 100644 index 00000000..56895b88 --- /dev/null +++ b/console-client/xkb/README @@ -0,0 +1,177 @@ +-- Some random notes about the XKB input driver. -- + +This XKB input driver can be compared with the pc_kbd input driver, it +has the same function. But this input driver has many advantages. It +can load XKB configuration files. XKB configuration files, the keymap +files currently used in XFree, are very versatile. + +One of the biggest advantages of using XKB configurations is that both +the Hurd and XFree work simular. Another advantage is that it has many +features: + +* Human readable configuration files with mechanisms like include + files, replacing keys, etc. + +* Many shift levels, all configurable per key type. + +* Support for four groups. These groups can be used for things like + additional alphabets. + +* Accessibility features like SlowKeys, StickyKeys, etc. + +* Dynamic behaviour; the user can define how all keys and indicators operate. + + +Most support for basic operation have been implemented. Still there +are many things not implemented. If some of these things are really +important to you, please tell me! + +List of not implemented XKB features: + +* Accessibility and software repeat. +* Jukebox support (user configurable audible messages) +* Key database; loading new keynames from the X key database. +* Error handling; partially done. +* Indicators (Keyboard LEDs, etc.) not working, partially implemented. +* ISOLock not implemented. +* Key repeater for >> X. +* No support for non UTF-8 locales. +* No support for rarely used features (Many of they don't even work in + X AFAIK). +* Many other stuff doesn't work (lock, radio group, overlays, etc.). + If I forgot something important, please report it :) + +* The scanner and parser are still ugly and far from optimal! + +--- + +Installation: + +You need gcc, binutils and the glibc- and GNUMach headerfiles to +compile this. If you want to generate the scanner and parser yourself +you need bison and flex, but this is not required because I included +the generated files. + +Run "make" to compile it. This will result in xkb.so.0.3, the actual +plugin. Copy this file to the console-client driver directory (For the +current Hurd version this is /lib/hurd/console). + +-- + +Using it: + +To use it you need XKB configuration files. These are included with +XFree and will be placed in /etc/X11/xkb on most systems. + +You can replace "pc_kbd" in your console client startup line with +"xkb" and it will work with the default configuration. If you want a +non-default configuration these options exists: + +--xkbdir : The root directory of the xkb configuration, by default + this is /etc/X11/xkb. + +--keymapfile : The file that hold the descriptions of the default + keymaps file. This file holds the description of all keymaps. This + path should be relative to the path set by `xkbdir'. By default + "keymap/xfree86" is used. + +--keymap : The keymap to use. By default en_US is used. Examples of + some other keymaps are: fr, us, de, dvorak. + +--ctrlaltbs : CTRL+Alt+Backspace will exit the console client. +--no-ctrlaltbs : CTRL+Alt+Backspace will not exit the console client. + + +By default console switching, etc. is not possible. I wrote some XKB +extensions and configuration files to use these extensions. You can +find these files in the xkb directory in the tarball. Copy these files +to where your XKB configuration files are (usually /etc/X11/xkb). + +for example: xkb/keymap/hurd will be copied to /etc/X11/xkb/keymap. + +To use these extensions you have to use the hurd keymaps file. This +holds all keymaps extended with Hurd features. Use "--keymapfile +keymap/hurd" to select this file. + +After that you can use these keybindings: + +Alt + F1...F12: Switch VC. + +Alt + Left, Right: Switch to the console left or right of the current + console. + +Alt + Up, Down: Scroll the console by one line up or down. +Ctrl + PgUp, PgDown: Scroll the console up or down with 1/2 screen. + +Alt + Home: Scroll the console to the 0% of the scrollback buffer. +Ctrl + Home: Scroll the console to the 25% of the scrollback buffer. +Alt + End: Scroll the console to the 100% of the scrollback buffer. +Alt + End: Scroll the console to the 75% of the scrollback buffer. + +-- + +Hurd features: + +If you want to use the Hurd features yourself make sure you put the +changes in files that are not used by Xfree because it cannot parse +these options. See how I did it for the configuration described in the +previous paragraph. + +Function list: + +-- +ConsScroll: scroll the console x lines or to a fixed position. + +parameters: +Screen = pos : Scroll to screen #pos. +Screen += i : Scroll i screens up. +Screen -= i : Scroll i screens down. +line = pos : Scroll to line #pos. +line += i : Scroll i lines up. +line -= i : Scroll i lines down. +percent = percentage : Scroll to PERCENTAGE % of the scrollback + buffer. + +Example: +ConsScroll (screen += 0.5) --> Scroll down a 1/2 screen. + +-- +SwitchScreen: Switch to a VC. + +paramaters: +screen = i : Switch to VC #i. +screen += i : Switch to #i consoles to the right. +screen -= i : Switch to #i consoles to the left. + +sameserver is a flag that will be added. I want to use it to switch to +external consoles like X servers and SVGALib screens. + +example: +SwitchScreen (screen += 1) --> Switch to the console right of the + current console. + + +-- +More functions will be added. One to send keysyms to other VCs (can be +usefull to control a mixer, ogg vorbis player, etc.). It should also +be capable of inserting often used strings like "apfelkorn" :). + +A function to call the configuration dialog should be added. + +Functions to execute things should be added. Think about binding the +reboot command to Ctrl+Alt+Delete for example. Wolfgang also asked me +for scheme support, but I don't know enough about scheme to know what +cool stuff is possible with this (I don't know scheme... Hey! Not +everyone can be perfect ;)). + +Perhaps functions can be added to control the console client in other +ways. + +More ideas would be interesting to hear :) + +-- + +Enjoy this stuff and please send me many bug reports :) + +Marco Gerards +(metgerards@student.han.nl) diff --git a/console-client/xkb/TODO b/console-client/xkb/TODO new file mode 100644 index 00000000..275cbaf5 --- /dev/null +++ b/console-client/xkb/TODO @@ -0,0 +1,7 @@ +For release: + +Indicators. +Use libihash. +Better memory handling. +Better debug output +CLEAN UP! diff --git a/console-client/xkb/compose.c b/console-client/xkb/compose.c new file mode 100644 index 00000000..38bcb47b --- /dev/null +++ b/console-client/xkb/compose.c @@ -0,0 +1,422 @@ +/* compose.c -- Keysym composing + + Copyright (C) 2003 Marco Gerards + + Written by Marco Gerards <metgerards@student.han.nl> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include <stdio.h> +#include <stdlib.h> +#include "keysymdef.h" +#include "xkb.h" +#include <ctype.h> +#include <string.h> + +#define NoSymbol 0 + +/* Tokens that can be recognised by the scanner. */ +enum tokentype + { + UNKNOWN, + EOL, + REQKS, + SEMICOL, + STR, + PRODKS, + END + }; + +/* The current token. */ +struct token +{ + enum tokentype toktype; + char value[50]; +} tok; + +/* The linenumber of the line currently parsed, used for returning + errors and warnings. */ +static int linenum; + +/* Read a token from the file CF. */ +static void +read_token (FILE *cf) +{ + int c = fgetc (cf); + int pos = 0; + + /* Remove whitespaces. */ + while (c == ' ' || c == '\t') + c = fgetc (cf); + + /* Comment, remove until end of line and return a EOL token. */ + if (c == '#') + { + while (c != '\n') + c = fgetc (cf); + tok.toktype = EOL; + linenum++; + return; + } + + /* End of file. */ + if (c == EOF) + { + tok.toktype = END; + return; + } + + /* Semicolon. */ + if (c == ':') + { + tok.toktype = SEMICOL; + return; + } + + /* End of line. */ + if (c == '\n') + { + linenum++; + tok.toktype = EOL; + return; + } + + + /* Required keysym. */ + if (c == '<') + { + while ((c = fgetc (cf)) != '>') + tok.value[pos++] = c; + tok.value[pos] = '\0'; + tok.toktype = REQKS; + return; + } + + /* Character string. */ + if (c == '"') + { + while ((c = fgetc (cf)) != '"') + { + if (c == '\\') + c = fgetc (cf); + + tok.value[pos++] = c; + } + tok.value[pos] = '\0'; + tok.toktype = STR; + return; + } + + /* Produced keysym. */ + if (isalpha (c)) + { + tok.value[pos++] = c; + while (isgraph (c = fgetc (cf))) + tok.value[pos++] = c; + tok.value[pos] = '\0'; + tok.toktype = PRODKS; + ungetc (c, cf); + return; + } + + /* Unknown token. */ + tok.toktype = UNKNOWN; + return; +} + +/* Compose sequence. */ +struct compose +{ + struct compose *left; + struct compose *right; + symbol *expected; + symbol produced; +} *compose_tree; + + +/* Compare symbol sequence s1 to symbol sequence s1. This function + works just like the strcmp function. */ +static int +symbolscmp (symbol *s1, symbol *s2) +{ + while (*s1 && *s2 && (*s1 == *s2)) + { + s1++;s2++; + } + if (*s1 < *s2) + return -1; + if (*s1 > *s2) + return 1; + return 0; +} + +/* Compare symbol sequence s1 to symbol sequence s1, compare a maximum + of N symbols. This function works just like the strcmp function. + */ +static int +symbolsncmp (symbol *s1, symbol *s2, int n) +{ + int cnt = 0; + while (*s1 && *s2 && (*s1 == *s2)) + { + if (++cnt == n) + break; + s1++;s2++; + } + + if (*s1 < *s2) + return -1; + if (*s1 > *s2) + return 1; + return 0; +} + + +/* Add the compose sequence EXP to the binary tree, store RESULT as + the keysym produced by EXP. */ +static struct compose * +composetree_add (struct compose *tree, symbol *exp, symbol result) +{ + int cmp; + + if (tree == NULL) + { + tree = malloc (sizeof (struct compose)); + tree->expected = exp; + tree->produced = result; + tree->left = tree->right = NULL; + + return tree; + } + + cmp = symbolscmp (exp, tree->expected); + if (cmp == 0) + { + printf ("Warning: line %d: Double sequence.\n", linenum); + free (exp); + } + else if (cmp < 0) + tree->left = composetree_add (tree->left, exp, result); + else + tree->right = composetree_add (tree->right, exp, result); + return tree; +} + +/* Parse the composefile CF and put all sequences in the binary tree + COMPOSE_TREE. This function may never fail because of syntactical or + lexalical errors, generate a warning instead. */ +static error_t +parse_composefile (FILE *cf) +{ + void skip_line (void) + { + while (tok.toktype != EOL && tok.toktype != END) + read_token (cf); + } + + for (;;) + { + /* Expected keysyms. */ + symbol exp[50]; + symbol *exps; + size_t expcnt = 0; + symbol sym; + + read_token (cf); + /* Blank line. */ + if (tok.toktype == EOL) + continue; + + /* End of file, done parsing. */ + if (tok.toktype == END) + return 0; + + if (tok.toktype != REQKS) + { + printf ("Warning: line %d: Keysym expected on beginning of line.\n", + linenum); + skip_line (); + continue; + } + + /* Keysym was recognised, add it. */ + sym = XStringToKeysym (tok.value); + if (!sym) + { + printf ("Warning: line %d: Unknown keysym \"%s\".\n", linenum, + tok.value); + skip_line (); + continue; + } + exp[expcnt++] = sym; + + do + { + read_token (cf); + /* If another required keysym is recognised, add it. */ + if (tok.toktype == REQKS) + { + sym = XStringToKeysym (tok.value); + if (!sym) + { + printf ("Warning: line %d: Unknown keysym \"%s\".\n", + linenum, tok.value); + skip_line (); + continue; + } + exp[expcnt++] = sym; + } + } while (tok.toktype == REQKS); + + if (tok.toktype != SEMICOL) + { + printf ("Warning: line %d: Semicolon expected.\n", linenum); + skip_line (); + continue; + } + + read_token (cf); + /* Force token and ignore it. */ + if (tok.toktype != STR) + { + printf ("Warning: line %d: string expected.\n", linenum); + skip_line (); + continue; + } + + read_token (cf); + if (tok.toktype != PRODKS) + { + printf ("Warning: line %d: keysym expected.\n", linenum); + skip_line (); + continue; + } + sym = XStringToKeysym (tok.value); + if (!sym) + { + printf ("Warning: line %d: Unknown keysym \"%s\".\n", linenum, + tok.value); + skip_line (); + continue; + } + + read_token (cf); + if (tok.toktype != EOL && tok.toktype != END) + { + printf ("Warning: line %d: end of line or end of file expected.\n", + linenum); + skip_line (); + continue; + } + + /* Add the production rule. */ + exp[expcnt++] = 0; + exps = malloc (sizeof (symbol) * expcnt); + memcpy (exps, exp, sizeof (symbol) * expcnt); + compose_tree = composetree_add (compose_tree, exps, sym); + } + return 0; +} + +/* Read keysyms passed to this function by S until a keysym can be + composed. If the first keysym cannot start a compose sequence return + the keysym. */ +symbol +compose_symbols (symbol s) +{ + /* Current position in the compose tree. */ + static struct compose *treepos = NULL; + /* Current compose sequence. */ + static symbol syms[100]; + /* Current position in the compose sequence. */ + static int pos = 0; + int cmp; + + if (!treepos) + treepos = compose_tree; + + /* Maximum sequence length reached. Some idiot typed this many + symbols and now we throw it all away, wheee!!! */ + if (pos == 99) + { + treepos = compose_tree; + pos = 0; + } + + /* Put the keysym in the compose sequence array. */ + syms[pos++] = s; + syms[pos] = 0; + + /* Search the tree for a keysym sequence that can match the current one. */ + while (treepos) + { + cmp = symbolsncmp (syms, treepos->expected, pos); + if (cmp == 0) + { + /* The keysym sequence was partially recognised, check if it + can completely match. */ + if (!symbolscmp (syms, treepos->expected)) + { + symbol ret = treepos->produced; + treepos = compose_tree; + pos = 0; + return ret; + } + + /* The sequence was partially recognised. */ + return -1; + } + + if (cmp < 0) + treepos = treepos->left; + else + treepos = treepos->right; + } + + /* Nothing can be found. */ + treepos = compose_tree; + + /* This ks should've started a sequence but couldn't be found, + just return it. */ + if (pos == 1) + { + pos = 0; + return s; + } + + debug_printf ("Invalid\n"); + /* Invalid keysym sequence. */ + pos = 0; + return -1; +} + +/* Read a Compose file. */ +error_t +read_composefile (char *composefn) +{ + FILE *cf; + + error_t err; + cf = fopen (composefn, "r"); + if (cf == NULL) + return errno; + + err = parse_composefile (cf); + if (err) + fclose (cf); + + return err; +} diff --git a/console-client/xkb/default.xkb b/console-client/xkb/default.xkb new file mode 100644 index 00000000..64f5c1fc --- /dev/null +++ b/console-client/xkb/default.xkb @@ -0,0 +1,1316 @@ +xkb_keymap { +xkb_keycodes "xfree86" { + minimum = 8; + maximum = 255; + <ESC> = 9; + <AE01> = 10; + <AE02> = 11; + <AE03> = 12; + <AE04> = 13; + <AE05> = 14; + <AE06> = 15; + <AE07> = 16; + <AE08> = 17; + <AE09> = 18; + <AE10> = 19; + <AE11> = 20; + <AE12> = 21; + <BKSP> = 22; + <TAB> = 23; + <AD01> = 24; + <AD02> = 25; + <AD03> = 26; + <AD04> = 27; + <AD05> = 28; + <AD06> = 29; + <AD07> = 30; + <AD08> = 31; + <AD09> = 32; + <AD10> = 33; + <AD11> = 34; + <AD12> = 35; + <RTRN> = 36; + <LCTL> = 37; + <AC01> = 38; + <AC02> = 39; + <AC03> = 40; + <AC04> = 41; + <AC05> = 42; + <AC06> = 43; + <AC07> = 44; + <AC08> = 45; + <AC09> = 46; + <AC10> = 47; + <AC11> = 48; + <TLDE> = 49; + <LFSH> = 50; + <BKSL> = 51; + <AB01> = 52; + <AB02> = 53; + <AB03> = 54; + <AB04> = 55; + <AB05> = 56; + <AB06> = 57; + <AB07> = 58; + <AB08> = 59; + <AB09> = 60; + <AB10> = 61; + <RTSH> = 62; + <KPMU> = 63; + <LALT> = 64; + <SPCE> = 65; + <CAPS> = 66; + <FK01> = 67; + <FK02> = 68; + <FK03> = 69; + <FK04> = 70; + <FK05> = 71; + <FK06> = 72; + <FK07> = 73; + <FK08> = 74; + <FK09> = 75; + <FK10> = 76; + <NMLK> = 77; + <SCLK> = 78; + <KP7> = 79; + <KP8> = 80; + <KP9> = 81; + <KPSU> = 82; + <KP4> = 83; + <KP5> = 84; + <KP6> = 85; + <KPAD> = 86; + <KP1> = 87; + <KP2> = 88; + <KP3> = 89; + <KP0> = 90; + <KPDL> = 91; + <SYRQ> = 92; + <LSGT> = 94; + <FK11> = 95; + <FK12> = 96; + <HOME> = 97; + <UP> = 98; + <PGUP> = 99; + <LEFT> = 100; + <RGHT> = 102; + <END> = 103; + <DOWN> = 104; + <PGDN> = 105; + <INS> = 106; + <DELE> = 107; + <KPEN> = 108; + <RCTL> = 109; + <PAUS> = 110; + <PRSC> = 111; + <KPDV> = 112; + <RALT> = 113; + <BRK> = 114; + <LWIN> = 115; + <RWIN> = 116; + <MENU> = 117; + <FK13> = 118; + <FK14> = 119; + <FK15> = 120; + <FK16> = 121; + <FK17> = 122; + <KPDC> = 123; + <XFER> = 129; + <I02> = 130; + <NFER> = 131; + <I04> = 132; + <AE13> = 133; + <I06> = 134; + <I07> = 135; + <I08> = 136; + <I09> = 137; + <I0A> = 138; + <I0B> = 139; + <I0C> = 140; + <I0D> = 141; + <I0E> = 142; + <I0F> = 143; + <I10> = 144; + <I11> = 145; + <I12> = 146; + <I13> = 147; + <I14> = 148; + <I15> = 149; + <I16> = 150; + <I17> = 151; + <I18> = 152; + <I19> = 153; + <I1A> = 154; + <I1B> = 155; + <I1E> = 158; + <I1F> = 159; + <I20> = 160; + <I21> = 161; + <I22> = 162; + <I23> = 163; + <I24> = 164; + <I25> = 165; + <I26> = 166; + <I27> = 167; + <I28> = 168; + <I29> = 169; + <I2B> = 171; + <I2C> = 172; + <I2D> = 173; + <I2E> = 174; + <I2F> = 175; + <I30> = 176; + <I31> = 177; + <I32> = 178; + <I33> = 179; + <I34> = 180; + <I39> = 185; + <I3A> = 186; + <I3B> = 187; + <I3C> = 188; + <I42> = 194; + <I43> = 195; + <I44> = 196; + <I45> = 197; + <I4A> = 202; + <I54> = 212; + <I55> = 213; + <I56> = 214; + <I57> = 215; + <I58> = 216; + <I59> = 217; + <I5A> = 218; + <I5E> = 222; + <I5F> = 223; + <I60> = 224; + <I61> = 225; + <I62> = 226; + <I63> = 227; + <I64> = 228; + <I65> = 229; + <I66> = 230; + <I67> = 231; + <I68> = 232; + <I69> = 233; + <I6A> = 234; + <I6B> = 235; + <I6C> = 236; + <I6D> = 237; + <I6E> = 238; + <I6F> = 239; + <I70> = 240; + <I71> = 241; + <I72> = 242; + <I73> = 243; + <I74> = 244; + <I75> = 245; + <I76> = 246; + <I77> = 247; + <I78> = 248; + <I79> = 249; + <I7A> = 250; + <I7B> = 251; + <I7C> = 252; + <I7D> = 253; + <I7E> = 254; + <I7F> = 255; + indicator 1 = "Caps Lock"; + indicator 2 = "Num Lock"; + indicator 3 = "Scroll Lock"; + virtual indicator 4 = "Shift Lock"; + virtual indicator 5 = "Group 2"; + virtual indicator 6 = "Mouse Keys"; + alias <HZTG> = <TLDE>; + alias <HKTG> = <FK15>; + alias <AB11> = <KPDC>; + alias <AC12> = <BKSL>; + alias <ALGR> = <RALT>; +}; + +xkb_types "complete" { + + virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock; + + type "ONE_LEVEL" { + modifiers= none; + level_name[Level1]= "Any"; + }; + type "TWO_LEVEL" { + modifiers= Shift; + map[Shift]= Level2; + level_name[Level1]= "Base"; + level_name[Level2]= "Shift"; + }; + type "ALPHABETIC" { + modifiers= Shift+Lock; + map[Shift]= Level2; + map[Lock]= Level1; + preserve[Lock]= Lock; + level_name[Level1]= "Base"; + level_name[Level2]= "Caps"; + }; + type "KEYPAD" { + modifiers= Shift+NumLock; + map[Shift]= Level2; + map[NumLock]= Level2; + level_name[Level1]= "Base"; + level_name[Level2]= "Number"; + }; + type "SHIFT+ALT" { + modifiers= Shift+Alt; + map[Shift+Alt]= Level2; + level_name[Level1]= "Base"; + level_name[Level2]= "Shift+Alt"; + }; + type "PC_BREAK" { + modifiers= Control; + map[Control]= Level2; + level_name[Level1]= "Base"; + level_name[Level2]= "Control"; + }; + type "PC_SYSRQ" { + modifiers= Alt; + map[Alt]= Level2; + level_name[Level1]= "Base"; + level_name[Level2]= "Alt"; + }; + type "CTRL+ALT" { + modifiers= Control+Alt; + map[Control+Alt]= Level2; + level_name[Level1]= "Base"; + level_name[Level2]= "Ctrl+Alt"; + }; + type "THREE_LEVEL" { + modifiers= Shift+LevelThree; + map[Shift]= Level2; + map[LevelThree]= Level3; + map[Shift+LevelThree]= Level3; + level_name[Level1]= "Base"; + level_name[Level2]= "Shift"; + level_name[Level3]= "Level3"; + }; + type "FOUR_LEVEL" { + modifiers= Shift+LevelThree; + map[Shift]= Level2; + map[LevelThree]= Level3; + map[Shift+LevelThree]= Level4; + level_name[Level1]= "Base"; + level_name[Level2]= "Shift"; + level_name[Level3]= "Alt Base"; + level_name[Level4]= "Shift Alt"; + }; + type "FOUR_LEVEL_KEYPAD" { + modifiers= Shift+NumLock+LevelThree; + map[Shift]= Level2; + map[NumLock]= Level2; + map[LevelThree]= Level3; + map[Shift+LevelThree]= Level4; + map[NumLock+LevelThree]= Level4; + map[Shift+NumLock+LevelThree]= Level3; + level_name[Level1]= "Base"; + level_name[Level2]= "Number"; + level_name[Level3]= "Alt Base"; + level_name[Level4]= "Alt Number"; + }; +}; + +xkb_compatibility "complete" { + + virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock; + + interpret.useModMapMods= AnyLevel; + interpret.repeat= False; + interpret.locking= False; + interpret ISO_Level2_Latch+Exactly(Shift) { + useModMapMods=level1; + action= LatchMods(modifiers=Shift,clearLocks,latchToLock); + }; + interpret Shift_Lock+AnyOf(Shift+Lock) { + action= LockMods(modifiers=Shift); + }; + interpret Num_Lock+AnyOf(all) { + virtualModifier= NumLock; + action= LockMods(modifiers=NumLock); + }; + interpret ISO_Lock+AnyOf(all) { + action= ISOLock(modifiers=modMapMods,affect=all); + }; + interpret ISO_Level3_Shift+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= SetMods(modifiers=LevelThree,clearLocks); + }; + interpret ISO_Level3_Latch+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); + }; + interpret Alt_L+AnyOf(all) { + virtualModifier= Alt; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Alt_R+AnyOf(all) { + virtualModifier= Alt; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Scroll_Lock+AnyOf(all) { + virtualModifier= ScrollLock; + action= LockMods(modifiers=modMapMods); + }; + interpret Mode_switch+AnyOfOrNone(all) { + virtualModifier= AltGr; + useModMapMods=level1; + action= SetGroup(group=+1); + }; + interpret ISO_Group_Latch+AnyOfOrNone(all) { + virtualModifier= AltGr; + useModMapMods=level1; + action= LatchGroup(group=2); + }; + interpret ISO_Next_Group+AnyOfOrNone(all) { + virtualModifier= AltGr; + useModMapMods=level1; + action= LockGroup(group=+1); + }; + interpret ISO_Prev_Group+AnyOfOrNone(all) { + virtualModifier= AltGr; + useModMapMods=level1; + action= LockGroup(group=-1); + }; + interpret ISO_First_Group+AnyOfOrNone(all) { + action= LockGroup(group=1); + }; + interpret ISO_Last_Group+AnyOfOrNone(all) { + action= LockGroup(group=2); + }; + interpret KP_1+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret KP_End+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret KP_2+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=+1); + }; + interpret KP_Down+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=+1); + }; + interpret KP_3+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret KP_Next+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret KP_4+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+0); + }; + interpret KP_Left+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+0); + }; + interpret KP_6+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+0); + }; + interpret KP_Right+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+0); + }; + interpret KP_7+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret KP_Home+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret KP_8+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=-1); + }; + interpret KP_Up+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=-1); + }; + interpret KP_9+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret KP_Prior+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret KP_5+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret KP_Begin+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret KP_F2+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret KP_Divide+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret KP_F3+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret KP_Multiply+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret KP_F4+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=3); + }; + interpret KP_Subtract+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=3); + }; + interpret KP_Separator+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default,count=2); + }; + interpret KP_Add+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default,count=2); + }; + interpret KP_0+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=lock); + }; + interpret KP_Insert+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=lock); + }; + interpret KP_Decimal+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=unlock); + }; + interpret KP_Delete+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=unlock); + }; + interpret Pointer_Button_Dflt+AnyOfOrNone(all) { + action= PtrBtn(button=default); + }; + interpret Pointer_Button1+AnyOfOrNone(all) { + action= PtrBtn(button=1); + }; + interpret Pointer_Button2+AnyOfOrNone(all) { + action= PtrBtn(button=2); + }; + interpret Pointer_Button3+AnyOfOrNone(all) { + action= PtrBtn(button=3); + }; + interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { + action= PtrBtn(button=default,count=2); + }; + interpret Pointer_DblClick1+AnyOfOrNone(all) { + action= PtrBtn(button=1,count=2); + }; + interpret Pointer_DblClick2+AnyOfOrNone(all) { + action= PtrBtn(button=2,count=2); + }; + interpret Pointer_DblClick3+AnyOfOrNone(all) { + action= PtrBtn(button=3,count=2); + }; + interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { + action= LockPtrBtn(button=default,affect=both); + }; + interpret Pointer_Drag1+AnyOfOrNone(all) { + action= LockPtrBtn(button=1,affect=both); + }; + interpret Pointer_Drag2+AnyOfOrNone(all) { + action= LockPtrBtn(button=2,affect=both); + }; + interpret Pointer_Drag3+AnyOfOrNone(all) { + action= LockPtrBtn(button=3,affect=both); + }; + interpret Pointer_EnableKeys+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeys); + }; + interpret Pointer_Accelerate+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeysAccel); + }; + interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { + action= SetPtrDflt(affect=button,button=+1); + }; + interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { + action= SetPtrDflt(affect=button,button=-1); + }; + interpret AccessX_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AccessXKeys); + }; + interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AccessXFeedback); + }; + interpret RepeatKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=RepeatKeys); + }; + interpret SlowKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=SlowKeys); + }; + interpret BounceKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=BounceKeys); + }; + interpret StickyKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=StickyKeys); + }; + interpret MouseKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeys); + }; + interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeysAccel); + }; + interpret Overlay1_Enable+AnyOfOrNone(all) { + action= LockControls(controls=Overlay1); + }; + interpret Overlay2_Enable+AnyOfOrNone(all) { + action= LockControls(controls=Overlay2); + }; + interpret AudibleBell_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AudibleBell); + }; + interpret Terminate_Server+AnyOfOrNone(all) { + action= Terminate(); + }; + interpret Any+Exactly(Lock) { + action= LockMods(modifiers=Lock); + }; + interpret Any+AnyOf(all) { + action= SetMods(modifiers=modMapMods,clearLocks); + }; + group 2 = AltGr; + group 3 = AltGr; + group 4 = AltGr; + indicator "Caps Lock" { + !allowExplicit; + whichModState= locked; + modifiers= Lock; + }; + indicator "Num Lock" { + !allowExplicit; + whichModState= locked; + modifiers= NumLock; + }; + indicator "Scroll Lock" { + whichModState= locked; + modifiers= ScrollLock; + }; + indicator "Shift Lock" { + !allowExplicit; + whichModState= locked; + modifiers= Shift; + }; + indicator "Group 2" { + !allowExplicit; + groups= 0xfe; + }; + indicator "Mouse Keys" { + indicatorDrivesKeyboard; + controls= mouseKeys; + }; +}; + +xkb_symbols "en_US(pc104)" { + + name[group1]="US/ASCII"; + name[group2]="ISO9995-3"; + + key <ESC> { [ Escape ] }; + key <AE01> { + symbols[Group1]= [ 1, exclam ], + symbols[Group2]= [ onesuperior, exclamdown ] + }; + key <AE02> { + symbols[Group1]= [ 2, at ], + symbols[Group2]= [ twosuperior, oneeighth ] + }; + key <AE03> { + symbols[Group1]= [ 3, numbersign ], + symbols[Group2]= [ threesuperior, sterling ] + }; + key <AE04> { + symbols[Group1]= [ 4, dollar ], + symbols[Group2]= [ onequarter, dollar ] + }; + key <AE05> { + symbols[Group1]= [ 5, percent ], + symbols[Group2]= [ onehalf, threeeighths ] + }; + key <AE06> { + symbols[Group1]= [ 6, asciicircum ], + symbols[Group2]= [ threequarters, fiveeighths ] + }; + key <AE07> { + symbols[Group1]= [ 7, ampersand ], + symbols[Group2]= [ braceleft, seveneighths ] + }; + key <AE08> { + symbols[Group1]= [ 8, asterisk ], + symbols[Group2]= [ bracketleft, trademark ] + }; + key <AE09> { + symbols[Group1]= [ 9, parenleft ], + symbols[Group2]= [ bracketright, plusminus ] + }; + key <AE10> { + symbols[Group1]= [ 0, parenright ], + symbols[Group2]= [ braceright, degree ] + }; + key <AE11> { + symbols[Group1]= [ minus, underscore ], + symbols[Group2]= [ backslash, questiondown ] + }; + key <AE12> { + symbols[Group1]= [ equal, plus ], + symbols[Group2]= [ dead_cedilla, dead_ogonek ] + }; + key <BKSP> { [ BackSpace ] }; + key <TAB> { [ Tab, ISO_Left_Tab ] }; + key <AD01> { + symbols[Group1]= [ q, Q ], + symbols[Group2]= [ at, Greek_OMEGA ] + }; + key <AD02> { + symbols[Group1]= [ w, W ], + symbols[Group2]= [ lstroke, Lstroke ] + }; + key <AD03> { + symbols[Group1]= [ e, E ], + symbols[Group2]= [ EuroSign ] + }; + key <AD04> { + symbols[Group1]= [ r, R ], + symbols[Group2]= [ paragraph, registered ] + }; + key <AD05> { + symbols[Group1]= [ t, T ], + symbols[Group2]= [ tslash, Tslash ] + }; + key <AD06> { + symbols[Group1]= [ y, Y ], + symbols[Group2]= [ leftarrow, yen ] + }; + key <AD07> { + symbols[Group1]= [ u, U ], + symbols[Group2]= [ downarrow, uparrow ] + }; + key <AD08> { + symbols[Group1]= [ i, I ], + symbols[Group2]= [ rightarrow, idotless ] + }; + key <AD09> { + symbols[Group1]= [ o, O ], + symbols[Group2]= [ oslash, Ooblique ] + }; + key <AD10> { + symbols[Group1]= [ p, P ], + symbols[Group2]= [ thorn, THORN ] + }; + key <AD11> { + symbols[Group1]= [ bracketleft, braceleft ], + symbols[Group2]= [ dead_diaeresis, dead_abovering ] + }; + key <AD12> { + symbols[Group1]= [ bracketright, braceright ], + symbols[Group2]= [ dead_tilde, dead_macron ] + }; + key <RTRN> { [ Return ] }; + key <LCTL> { + symbols[Group1]= [ Control_L ], + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ] + }; + key <AC01> { + symbols[Group1]= [ a, A ], + symbols[Group2]= [ ae, AE ] + }; + key <AC02> { + symbols[Group1]= [ s, S ], + symbols[Group2]= [ ssharp, section ] + }; + key <AC03> { + symbols[Group1]= [ d, D ], + symbols[Group2]= [ eth, ETH ] + }; + key <AC04> { + symbols[Group1]= [ f, F ], + symbols[Group2]= [ dstroke, ordfeminine ] + }; + key <AC05> { + symbols[Group1]= [ g, G ], + symbols[Group2]= [ eng, ENG ] + }; + key <AC06> { + symbols[Group1]= [ h, H ], + symbols[Group2]= [ hstroke, Hstroke ] + }; + key <AC07> { [ j, J ] }; + key <AC08> { + symbols[Group1]= [ k, K ], + symbols[Group2]= [ kra, ampersand ] + }; + key <AC09> { + symbols[Group1]= [ l, L ], + symbols[Group2]= [ lstroke, Lstroke ] + }; + key <AC10> { + symbols[Group1]= [ semicolon, colon ], + symbols[Group2]= [ dead_acute, dead_doubleacute ] + }; + key <AC11> { + symbols[Group1]= [ apostrophe, quotedbl ], + symbols[Group2]= [ dead_circumflex, dead_caron ] + }; + key <TLDE> { + symbols[Group1]= [ grave, asciitilde ], + symbols[Group2]= [ notsign ] + }; + key <LFSH> { + symbols[Group1]= [ Shift_L ], + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ] + }; + key <BKSL> { + symbols[Group1]= [ backslash, bar ], + symbols[Group2]= [ dead_grave, dead_breve ] + }; + key <AB01> { + symbols[Group1]= [ z, Z ], + symbols[Group2]= [ guillemotleft, less ] + }; + key <AB02> { + symbols[Group1]= [ x, X ], + symbols[Group2]= [ guillemotright, greater ] + }; + key <AB03> { + symbols[Group1]= [ c, C ], + symbols[Group2]= [ cent, copyright ] + }; + key <AB04> { + symbols[Group1]= [ v, V ], + symbols[Group2]= [ leftdoublequotemark, grave ] + }; + key <AB05> { + symbols[Group1]= [ b, B ], + symbols[Group2]= [ rightdoublequotemark, apostrophe ] + }; + key <AB06> { [ n, N ] }; + key <AB07> { + symbols[Group1]= [ m, M ], + symbols[Group2]= [ mu, masculine ] + }; + key <AB08> { + symbols[Group1]= [ comma, less ], + symbols[Group2]= [ horizconnector, multiply ] + }; + key <AB09> { + symbols[Group1]= [ period, greater ], + symbols[Group2]= [ periodcentered, division ] + }; + key <AB10> { + symbols[Group1]= [ slash, question ], + symbols[Group2]= [ dead_belowdot, dead_abovedot ] + }; + key <RTSH> { + symbols[Group1]= [ Shift_R ], + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ] + }; + key <KPMU> { + symbols[Group1]= [ KP_Multiply ], + actions[Group1]= [ SetPtrDflt(affect=button,button=2) ] + }; + key <LALT> { + symbols[Group1]= [ Alt_L, Meta_L ], + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks), SetMods(modifiers=modMapMods,clearLocks) ] + }; + key <SPCE> { [ space ] }; + key <CAPS> { + symbols[Group1]= [ Caps_Lock ], + actions[Group1]= [ LockMods(modifiers=Lock) ] + }; + key <FK01> { [ F1 ] }; + key <FK02> { [ F2 ] }; + key <FK03> { [ F3 ] }; + key <FK04> { [ F4 ] }; + key <FK05> { [ F5 ] }; + key <FK06> { [ F6 ] }; + key <FK07> { [ F7 ] }; + key <FK08> { [ F8 ] }; + key <FK09> { [ F9 ] }; + key <FK10> { [ F10 ] }; + key <NMLK> { + symbols[Group1]= [ Num_Lock, Pointer_EnableKeys ], + actions[Group1]= [ LockMods(modifiers=NumLock), LockControls(controls=MouseKeys) ] + }; + key <SCLK> { + symbols[Group1]= [ Scroll_Lock ], + actions[Group1]= [ LockMods(modifiers=modMapMods) ] + }; + key <KP7> { + symbols[Group1]= [ KP_Home, KP_7 ], + actions[Group1]= [ MovePtr(x=-1,y=-1), MovePtr(x=-1,y=-1) ] + }; + key <KP8> { + symbols[Group1]= [ KP_Up, KP_8 ], + actions[Group1]= [ MovePtr(x=+0,y=-1), MovePtr(x=+0,y=-1) ] + }; + key <KP9> { + symbols[Group1]= [ KP_Prior, KP_9 ], + actions[Group1]= [ MovePtr(x=+1,y=-1), MovePtr(x=+1,y=-1) ] + }; + key <KPSU> { + symbols[Group1]= [ KP_Subtract ], + actions[Group1]= [ SetPtrDflt(affect=button,button=3) ] + }; + key <KP4> { + symbols[Group1]= [ KP_Left, KP_4 ], + actions[Group1]= [ MovePtr(x=-1,y=+0), MovePtr(x=-1,y=+0) ] + }; + key <KP5> { + symbols[Group1]= [ KP_Begin, KP_5 ], + actions[Group1]= [ PtrBtn(button=default), PtrBtn(button=default) ] + }; + key <KP6> { + symbols[Group1]= [ KP_Right, KP_6 ], + actions[Group1]= [ MovePtr(x=+1,y=+0), MovePtr(x=+1,y=+0) ] + }; + key <KPAD> { + symbols[Group1]= [ KP_Add ], + actions[Group1]= [ PtrBtn(button=default,count=2) ] + }; + key <KP1> { + symbols[Group1]= [ KP_End, KP_1 ], + actions[Group1]= [ MovePtr(x=-1,y=+1), MovePtr(x=-1,y=+1) ] + }; + key <KP2> { + symbols[Group1]= [ KP_Down, KP_2 ], + actions[Group1]= [ MovePtr(x=+0,y=+1), MovePtr(x=+0,y=+1) ] + }; + key <KP3> { + symbols[Group1]= [ KP_Next, KP_3 ], + actions[Group1]= [ MovePtr(x=+1,y=+1), MovePtr(x=+1,y=+1) ] + }; + key <KP0> { + symbols[Group1]= [ KP_Insert, KP_0 ], + actions[Group1]= [ LockPtrBtn(button=default,affect=lock), LockPtrBtn(button=default,affect=lock) ] + }; + key <KPDL> { + symbols[Group1]= [ KP_Delete, KP_Decimal ], + actions[Group1]= [ LockPtrBtn(button=default,affect=unlock), LockPtrBtn(button=default,affect=unlock) ] + }; + key <SYRQ> { + type= "PC_SYSRQ", + symbols[Group1]= [ Print, Sys_Req ] + }; + key <FK11> { [ F11 ] }; + key <FK12> { [ F12 ] }; + key <HOME> { [ Home ] }; + key <UP> { [ Up ] }; + key <PGUP> { [ Prior ] }; + key <LEFT> { [ Left ] }; + key <RGHT> { [ Right ] }; + key <END> { [ End ] }; + key <DOWN> { [ Down ] }; + key <PGDN> { [ Next ] }; + key <INS> { [ Insert ] }; + key <DELE> { [ Delete ] }; + key <KPEN> { [ KP_Enter ] }; + key <RCTL> { + symbols[Group1]= [ Control_R ], + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ] + }; + key <PAUS> { + type= "PC_BREAK", + symbols[Group1]= [ Pause, Break ] + }; + key <PRSC> { + type= "PC_SYSRQ", + symbols[Group1]= [ Print, Sys_Req ] + }; + key <KPDV> { + symbols[Group1]= [ KP_Divide ], + actions[Group1]= [ SetPtrDflt(affect=button,button=1) ] + }; + key <RALT> { + symbols[Group1]= [ Mode_switch ], + actions[Group1]= [ SetGroup(group=+1) ] + }; + key <BRK> { + type= "PC_BREAK", + symbols[Group1]= [ Pause, Break ] + }; + key <LWIN> { + symbols[Group1]= [ Super_L ], + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ] + }; + key <RWIN> { [ Multi_key ] }; + key <MENU> { [ Menu ] }; + modifier_map Control { <LCTL> }; + modifier_map Shift { <LFSH> }; + modifier_map Shift { <RTSH> }; + modifier_map Mod1 { <LALT> }; + modifier_map Lock { <CAPS> }; + modifier_map Mod2 { <NMLK> }; + modifier_map Mod5 { <SCLK> }; + modifier_map Control { <RCTL> }; + modifier_map Mod3 { <RALT> }; + modifier_map Mod4 { <LWIN> }; +}; + +xkb_geometry "pc(pc104)" { + + width= 470; + height= 210; + + alias <AC00> = <CAPS>; + alias <AA00> = <LCTL>; + + baseColor= "white"; + labelColor= "black"; + xfont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; + description= "Generic 104"; + + shape "NORM" { + corner= 1, + { [ 18, 18 ] }, + { [ 2, 1 ], [ 16, 16 ] } + }; + shape "BKSP" { + corner= 1, + { [ 38, 18 ] }, + { [ 2, 1 ], [ 36, 16 ] } + }; + shape "TABK" { + corner= 1, + { [ 28, 18 ] }, + { [ 2, 1 ], [ 26, 16 ] } + }; + shape "BKSL" { + corner= 1, + { [ 28, 18 ] }, + { [ 2, 1 ], [ 26, 16 ] } + }; + shape "RTRN" { + corner= 1, + { [ 42, 18 ] }, + { [ 2, 1 ], [ 40, 16 ] } + }; + shape "CAPS" { + corner= 1, + { [ 33, 18 ] }, + { [ 2, 1 ], [ 31, 16 ] } + }; + shape "LFSH" { + corner= 1, + { [ 42, 18 ] }, + { [ 2, 1 ], [ 40, 16 ] } + }; + shape "RTSH" { + corner= 1, + { [ 52, 18 ] }, + { [ 2, 1 ], [ 50, 16 ] } + }; + shape "MODK" { + corner= 1, + { [ 27, 18 ] }, + { [ 2, 1 ], [ 25, 16 ] } + }; + shape "SMOD" { + corner= 1, + { [ 23, 18 ] }, + { [ 2, 1 ], [ 21, 16 ] } + }; + shape "SPCE" { + corner= 1, + { [ 113, 18 ] }, + { [ 2, 1 ], [ 111, 16 ] } + }; + shape "KP0" { + corner= 1, + { [ 37, 18 ] }, + { [ 2, 1 ], [ 35, 16 ] } + }; + shape "KPAD" { + corner= 1, + { [ 18, 37 ] }, + { [ 2, 1 ], [ 16, 35 ] } + }; + shape "LEDS" { { [ 75, 20 ] } }; + shape "LED" { { [ 5, 1 ] } }; + section "Function" { + key.color= "grey20"; + priority= 7; + top= 52; + left= 19; + width= 351; + height= 19; + row { + top= 1; + left= 1; + keys { + { <ESC>, "NORM", 1 }, + { <FK01>, "NORM", 20, color="white" }, + { <FK02>, "NORM", 1, color="white" }, + { <FK03>, "NORM", 1, color="white" }, + { <FK04>, "NORM", 1, color="white" }, + { <FK05>, "NORM", 11, color="white" }, + { <FK06>, "NORM", 1, color="white" }, + { <FK07>, "NORM", 1, color="white" }, + { <FK08>, "NORM", 1, color="white" }, + { <FK09>, "NORM", 11, color="white" }, + { <FK10>, "NORM", 1, color="white" }, + { <FK11>, "NORM", 1, color="white" }, + { <FK12>, "NORM", 1, color="white" }, + { <PRSC>, "NORM", 8, color="white" }, + { <SCLK>, "NORM", 1, color="white" }, + { <PAUS>, "NORM", 1, color="white" } + }; + }; + }; // End of "Function" section + + section "Alpha" { + key.color= "white"; + priority= 8; + top= 91; + left= 19; + width= 287; + height= 95; + row { + top= 1; + left= 1; + keys { + { <TLDE>, "NORM", 1 }, { <AE01>, "NORM", 1 }, + { <AE02>, "NORM", 1 }, { <AE03>, "NORM", 1 }, + { <AE04>, "NORM", 1 }, { <AE05>, "NORM", 1 }, + { <AE06>, "NORM", 1 }, { <AE07>, "NORM", 1 }, + { <AE08>, "NORM", 1 }, { <AE09>, "NORM", 1 }, + { <AE10>, "NORM", 1 }, { <AE11>, "NORM", 1 }, + { <AE12>, "NORM", 1 }, + { <BKSP>, "BKSP", 1, color="grey20" } + }; + }; + row { + top= 20; + left= 1; + keys { + { <TAB>, "TABK", 1, color="grey20" }, + { <AD01>, "NORM", 1 }, { <AD02>, "NORM", 1 }, + { <AD03>, "NORM", 1 }, { <AD04>, "NORM", 1 }, + { <AD05>, "NORM", 1 }, { <AD06>, "NORM", 1 }, + { <AD07>, "NORM", 1 }, { <AD08>, "NORM", 1 }, + { <AD09>, "NORM", 1 }, { <AD10>, "NORM", 1 }, + { <AD11>, "NORM", 1 }, { <AD12>, "NORM", 1 }, + { <BKSL>, "BKSL", 1 } + }; + }; + row { + top= 39; + left= 1; + keys { + { <CAPS>, "CAPS", 1, color="grey20" }, + { <AC01>, "NORM", 1 }, { <AC02>, "NORM", 1 }, + { <AC03>, "NORM", 1 }, { <AC04>, "NORM", 1 }, + { <AC05>, "NORM", 1 }, { <AC06>, "NORM", 1 }, + { <AC07>, "NORM", 1 }, { <AC08>, "NORM", 1 }, + { <AC09>, "NORM", 1 }, { <AC10>, "NORM", 1 }, + { <AC11>, "NORM", 1 }, + { <RTRN>, "RTRN", 1, color="grey20" } + }; + }; + row { + top= 58; + left= 1; + keys { + { <LFSH>, "LFSH", 1, color="grey20" }, + { <AB01>, "NORM", 1 }, { <AB02>, "NORM", 1 }, + { <AB03>, "NORM", 1 }, { <AB04>, "NORM", 1 }, + { <AB05>, "NORM", 1 }, { <AB06>, "NORM", 1 }, + { <AB07>, "NORM", 1 }, { <AB08>, "NORM", 1 }, + { <AB09>, "NORM", 1 }, { <AB10>, "NORM", 1 }, + { <RTSH>, "RTSH", 1, color="grey20" } + }; + }; + row { + top= 77; + left= 1; + keys { + { <LCTL>, "MODK", 1, color="grey20" }, + { <LWIN>, "SMOD", 1, color="grey20" }, + { <LALT>, "SMOD", 1, color="grey20" }, + { <SPCE>, "SPCE", 1 }, + { <RALT>, "SMOD", 1, color="grey20" }, + { <RWIN>, "SMOD", 1, color="grey20" }, + { <MENU>, "SMOD", 1, color="grey20" }, + { <RCTL>, "SMOD", 1, color="grey20" } + }; + }; + }; // End of "Alpha" section + + section "Editing" { + key.color= "grey20"; + priority= 9; + top= 91; + left= 312; + width= 58; + height= 95; + row { + top= 1; + left= 1; + keys { + { <INS>, "NORM", 1 }, { <HOME>, "NORM", 1 }, + { <PGUP>, "NORM", 1 } + }; + }; + row { + top= 20; + left= 1; + keys { + { <DELE>, "NORM", 1 }, { <END>, "NORM", 1 }, + { <PGDN>, "NORM", 1 } + }; + }; + row { + top= 58; + left= 20; + keys { + { <UP>, "NORM", 1 } + }; + }; + row { + top= 77; + left= 1; + keys { + { <LEFT>, "NORM", 1 }, { <DOWN>, "NORM", 1 }, + { <RGHT>, "NORM", 1 } + }; + }; + }; // End of "Editing" section + + section "Keypad" { + key.color= "grey20"; + priority= 10; + top= 91; + left= 376; + width= 77; + height= 95; + row { + top= 1; + left= 1; + keys { + { <NMLK>, "NORM", 1 }, { <KPDV>, "NORM", 1 }, + { <KPMU>, "NORM", 1 }, { <KPSU>, "NORM", 1 } + }; + }; + row { + top= 20; + left= 1; + keys { + { <KP7>, "NORM", 1, color="white" }, + { <KP8>, "NORM", 1, color="white" }, + { <KP9>, "NORM", 1, color="white" }, + { <KPAD>, "KPAD", 1 } + }; + }; + row { + top= 39; + left= 1; + keys { + { <KP4>, "NORM", 1, color="white" }, + { <KP5>, "NORM", 1, color="white" }, + { <KP6>, "NORM", 1, color="white" } + }; + }; + row { + top= 58; + left= 1; + keys { + { <KP1>, "NORM", 1, color="white" }, + { <KP2>, "NORM", 1, color="white" }, + { <KP3>, "NORM", 1, color="white" }, + { <KPEN>, "KPAD", 1 } + }; + }; + row { + top= 77; + left= 1; + keys { + { <KP0>, "KP0", 1, color="white" }, + { <KPDL>, "NORM", 1, color="white" } + }; + }; + }; // End of "Keypad" section + + solid "LedPanel" { + top= 52; + left= 377; + priority= 0; + color= "grey10"; + shape= "LEDS"; + }; + indicator "NumLock" { + top= 67; + left= 382; + priority= 1; + onColor= "green"; + offColor= "green30"; + shape= "LED"; + }; + indicator "CapsLock" { + top= 67; + left= 407; + priority= 2; + onColor= "green"; + offColor= "green30"; + shape= "LED"; + }; + indicator "ScrollLock" { + top= 67; + left= 433; + priority= 3; + onColor= "green"; + offColor= "green30"; + shape= "LED"; + }; + text "NumLockLabel" { + top= 55; + left= 378; + priority= 4; + width= 19.8; + height= 10; + XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; + text= "Num\nLock"; + }; + text "CapsLockLabel" { + top= 55; + left= 403; + priority= 5; + width= 26.4; + height= 10; + XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; + text= "Caps\nLock"; + }; + text "ScrollLockLabel" { + top= 55; + left= 428; + priority= 6; + width= 39.6; + height= 10; + XFont= "-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1"; + text= "Scroll\nLock"; + }; +}; + +}; diff --git a/console-client/xkb/keysymdef.h b/console-client/xkb/keysymdef.h new file mode 100644 index 00000000..728a412e --- /dev/null +++ b/console-client/xkb/keysymdef.h @@ -0,0 +1,2016 @@ +/* $Xorg: keysymdef.h,v 1.4 2001/02/09 02:03:23 xorgcvs Exp $ */ + +/*********************************************************** +Copyright 1987, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ +/* $XFree86: xc/include/keysymdef.h,v 1.12 2001/12/14 19:53:26 dawes Exp $ */ + +#define XK_VoidSymbol 0xFFFFFF /* void symbol */ + +#ifdef XK_MISCELLANY +/* + * TTY Functions, cleverly chosen to map to ascii, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code. + */ + +#define XK_BackSpace 0xFF08 /* back space, back char */ +#define XK_Tab 0xFF09 +#define XK_Linefeed 0xFF0A /* Linefeed, LF */ +#define XK_Clear 0xFF0B +#define XK_Return 0xFF0D /* Return, enter */ +#define XK_Pause 0xFF13 /* Pause, hold */ +#define XK_Scroll_Lock 0xFF14 +#define XK_Sys_Req 0xFF15 +#define XK_Escape 0xFF1B +#define XK_Delete 0xFFFF /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xFF20 /* Multi-key character compose */ +#define XK_Codeinput 0xFF37 +#define XK_SingleCandidate 0xFF3C +#define XK_MultipleCandidate 0xFF3D +#define XK_PreviousCandidate 0xFF3E + +/* Japanese keyboard support */ + +#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xFF22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */ +#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xFF24 /* to Romaji */ +#define XK_Hiragana 0xFF25 /* to Hiragana */ +#define XK_Katakana 0xFF26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xFF28 /* to Zenkaku */ +#define XK_Hankaku 0xFF29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xFF2B /* Add to Dictionary */ +#define XK_Massyo 0xFF2C /* Delete from Dictionary */ +#define XK_Kana_Lock 0xFF2D /* Kana Lock */ +#define XK_Kana_Shift 0xFF2E /* Kana Shift */ +#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */ +#define XK_Kanji_Bangou 0xFF37 /* Codeinput */ +#define XK_Zen_Koho 0xFF3D /* Multiple/All Candidate(s) */ +#define XK_Mae_Koho 0xFF3E /* Previous Candidate */ + +/* 0xFF31 thru 0xFF3F are under XK_KOREAN */ + +/* Cursor control & motion */ + +#define XK_Home 0xFF50 +#define XK_Left 0xFF51 /* Move left, left arrow */ +#define XK_Up 0xFF52 /* Move up, up arrow */ +#define XK_Right 0xFF53 /* Move right, right arrow */ +#define XK_Down 0xFF54 /* Move down, down arrow */ +#define XK_Prior 0xFF55 /* Prior, previous */ +#define XK_Page_Up 0xFF55 +#define XK_Next 0xFF56 /* Next */ +#define XK_Page_Down 0xFF56 +#define XK_End 0xFF57 /* EOL */ +#define XK_Begin 0xFF58 /* BOL */ + + +/* Misc Functions */ + +#define XK_Select 0xFF60 /* Select, mark */ +#define XK_Print 0xFF61 +#define XK_Execute 0xFF62 /* Execute, run, do */ +#define XK_Insert 0xFF63 /* Insert, insert here */ +#define XK_Undo 0xFF65 /* Undo, oops */ +#define XK_Redo 0xFF66 /* redo, again */ +#define XK_Menu 0xFF67 +#define XK_Find 0xFF68 /* Find, search */ +#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xFF6A /* Help */ +#define XK_Break 0xFF6B +#define XK_Mode_switch 0xFF7E /* Character set switch */ +#define XK_script_switch 0xFF7E /* Alias for mode_switch */ +#define XK_Num_Lock 0xFF7F + +/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + +#define XK_KP_Space 0xFF80 /* space */ +#define XK_KP_Tab 0xFF89 +#define XK_KP_Enter 0xFF8D /* enter */ +#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xFF92 +#define XK_KP_F3 0xFF93 +#define XK_KP_F4 0xFF94 +#define XK_KP_Home 0xFF95 +#define XK_KP_Left 0xFF96 +#define XK_KP_Up 0xFF97 +#define XK_KP_Right 0xFF98 +#define XK_KP_Down 0xFF99 +#define XK_KP_Prior 0xFF9A +#define XK_KP_Page_Up 0xFF9A +#define XK_KP_Next 0xFF9B +#define XK_KP_Page_Down 0xFF9B +#define XK_KP_End 0xFF9C +#define XK_KP_Begin 0xFF9D +#define XK_KP_Insert 0xFF9E +#define XK_KP_Delete 0xFF9F +#define XK_KP_Equal 0xFFBD /* equals */ +#define XK_KP_Multiply 0xFFAA +#define XK_KP_Add 0xFFAB +#define XK_KP_Separator 0xFFAC /* separator, often comma */ +#define XK_KP_Subtract 0xFFAD +#define XK_KP_Decimal 0xFFAE +#define XK_KP_Divide 0xFFAF + +#define XK_KP_0 0xFFB0 +#define XK_KP_1 0xFFB1 +#define XK_KP_2 0xFFB2 +#define XK_KP_3 0xFFB3 +#define XK_KP_4 0xFFB4 +#define XK_KP_5 0xFFB5 +#define XK_KP_6 0xFFB6 +#define XK_KP_7 0xFFB7 +#define XK_KP_8 0xFFB8 +#define XK_KP_9 0xFFB9 + + + +/* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xFFBE +#define XK_F2 0xFFBF +#define XK_F3 0xFFC0 +#define XK_F4 0xFFC1 +#define XK_F5 0xFFC2 +#define XK_F6 0xFFC3 +#define XK_F7 0xFFC4 +#define XK_F8 0xFFC5 +#define XK_F9 0xFFC6 +#define XK_F10 0xFFC7 +#define XK_F11 0xFFC8 +#define XK_L1 0xFFC8 +#define XK_F12 0xFFC9 +#define XK_L2 0xFFC9 +#define XK_F13 0xFFCA +#define XK_L3 0xFFCA +#define XK_F14 0xFFCB +#define XK_L4 0xFFCB +#define XK_F15 0xFFCC +#define XK_L5 0xFFCC +#define XK_F16 0xFFCD +#define XK_L6 0xFFCD +#define XK_F17 0xFFCE +#define XK_L7 0xFFCE +#define XK_F18 0xFFCF +#define XK_L8 0xFFCF +#define XK_F19 0xFFD0 +#define XK_L9 0xFFD0 +#define XK_F20 0xFFD1 +#define XK_L10 0xFFD1 +#define XK_F21 0xFFD2 +#define XK_R1 0xFFD2 +#define XK_F22 0xFFD3 +#define XK_R2 0xFFD3 +#define XK_F23 0xFFD4 +#define XK_R3 0xFFD4 +#define XK_F24 0xFFD5 +#define XK_R4 0xFFD5 +#define XK_F25 0xFFD6 +#define XK_R5 0xFFD6 +#define XK_F26 0xFFD7 +#define XK_R6 0xFFD7 +#define XK_F27 0xFFD8 +#define XK_R7 0xFFD8 +#define XK_F28 0xFFD9 +#define XK_R8 0xFFD9 +#define XK_F29 0xFFDA +#define XK_R9 0xFFDA +#define XK_F30 0xFFDB +#define XK_R10 0xFFDB +#define XK_F31 0xFFDC +#define XK_R11 0xFFDC +#define XK_F32 0xFFDD +#define XK_R12 0xFFDD +#define XK_F33 0xFFDE +#define XK_R13 0xFFDE +#define XK_F34 0xFFDF +#define XK_R14 0xFFDF +#define XK_F35 0xFFE0 +#define XK_R15 0xFFE0 + +/* Modifiers */ + +#define XK_Shift_L 0xFFE1 /* Left shift */ +#define XK_Shift_R 0xFFE2 /* Right shift */ +#define XK_Control_L 0xFFE3 /* Left control */ +#define XK_Control_R 0xFFE4 /* Right control */ +#define XK_Caps_Lock 0xFFE5 /* Caps lock */ +#define XK_Shift_Lock 0xFFE6 /* Shift lock */ + +#define XK_Meta_L 0xFFE7 /* Left meta */ +#define XK_Meta_R 0xFFE8 /* Right meta */ +#define XK_Alt_L 0xFFE9 /* Left alt */ +#define XK_Alt_R 0xFFEA /* Right alt */ +#define XK_Super_L 0xFFEB /* Left super */ +#define XK_Super_R 0xFFEC /* Right super */ +#define XK_Hyper_L 0xFFED /* Left hyper */ +#define XK_Hyper_R 0xFFEE /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * ISO 9995 Function and Modifier Keys + * Byte 3 = 0xFE + */ + +#ifdef XK_XKB_KEYS +#define XK_ISO_Lock 0xFE01 +#define XK_ISO_Level2_Latch 0xFE02 +#define XK_ISO_Level3_Shift 0xFE03 +#define XK_ISO_Level3_Latch 0xFE04 +#define XK_ISO_Level3_Lock 0xFE05 +#define XK_ISO_Group_Shift 0xFF7E /* Alias for mode_switch */ +#define XK_ISO_Group_Latch 0xFE06 +#define XK_ISO_Group_Lock 0xFE07 +#define XK_ISO_Next_Group 0xFE08 +#define XK_ISO_Next_Group_Lock 0xFE09 +#define XK_ISO_Prev_Group 0xFE0A +#define XK_ISO_Prev_Group_Lock 0xFE0B +#define XK_ISO_First_Group 0xFE0C +#define XK_ISO_First_Group_Lock 0xFE0D +#define XK_ISO_Last_Group 0xFE0E +#define XK_ISO_Last_Group_Lock 0xFE0F + +#define XK_ISO_Left_Tab 0xFE20 +#define XK_ISO_Move_Line_Up 0xFE21 +#define XK_ISO_Move_Line_Down 0xFE22 +#define XK_ISO_Partial_Line_Up 0xFE23 +#define XK_ISO_Partial_Line_Down 0xFE24 +#define XK_ISO_Partial_Space_Left 0xFE25 +#define XK_ISO_Partial_Space_Right 0xFE26 +#define XK_ISO_Set_Margin_Left 0xFE27 +#define XK_ISO_Set_Margin_Right 0xFE28 +#define XK_ISO_Release_Margin_Left 0xFE29 +#define XK_ISO_Release_Margin_Right 0xFE2A +#define XK_ISO_Release_Both_Margins 0xFE2B +#define XK_ISO_Fast_Cursor_Left 0xFE2C +#define XK_ISO_Fast_Cursor_Right 0xFE2D +#define XK_ISO_Fast_Cursor_Up 0xFE2E +#define XK_ISO_Fast_Cursor_Down 0xFE2F +#define XK_ISO_Continuous_Underline 0xFE30 +#define XK_ISO_Discontinuous_Underline 0xFE31 +#define XK_ISO_Emphasize 0xFE32 +#define XK_ISO_Center_Object 0xFE33 +#define XK_ISO_Enter 0xFE34 + +#define XK_dead_grave 0xFE50 +#define XK_dead_acute 0xFE51 +#define XK_dead_circumflex 0xFE52 +#define XK_dead_tilde 0xFE53 +#define XK_dead_macron 0xFE54 +#define XK_dead_breve 0xFE55 +#define XK_dead_abovedot 0xFE56 +#define XK_dead_diaeresis 0xFE57 +#define XK_dead_abovering 0xFE58 +#define XK_dead_doubleacute 0xFE59 +#define XK_dead_caron 0xFE5A +#define XK_dead_cedilla 0xFE5B +#define XK_dead_ogonek 0xFE5C +#define XK_dead_iota 0xFE5D +#define XK_dead_voiced_sound 0xFE5E +#define XK_dead_semivoiced_sound 0xFE5F +#define XK_dead_belowdot 0xFE60 +#define XK_dead_hook 0xFE61 +#define XK_dead_horn 0xFE62 + +#define XK_First_Virtual_Screen 0xFED0 +#define XK_Prev_Virtual_Screen 0xFED1 +#define XK_Next_Virtual_Screen 0xFED2 +#define XK_Last_Virtual_Screen 0xFED4 +#define XK_Terminate_Server 0xFED5 + +#define XK_AccessX_Enable 0xFE70 +#define XK_AccessX_Feedback_Enable 0xFE71 +#define XK_RepeatKeys_Enable 0xFE72 +#define XK_SlowKeys_Enable 0xFE73 +#define XK_BounceKeys_Enable 0xFE74 +#define XK_StickyKeys_Enable 0xFE75 +#define XK_MouseKeys_Enable 0xFE76 +#define XK_MouseKeys_Accel_Enable 0xFE77 +#define XK_Overlay1_Enable 0xFE78 +#define XK_Overlay2_Enable 0xFE79 +#define XK_AudibleBell_Enable 0xFE7A + +#define XK_Pointer_Left 0xFEE0 +#define XK_Pointer_Right 0xFEE1 +#define XK_Pointer_Up 0xFEE2 +#define XK_Pointer_Down 0xFEE3 +#define XK_Pointer_UpLeft 0xFEE4 +#define XK_Pointer_UpRight 0xFEE5 +#define XK_Pointer_DownLeft 0xFEE6 +#define XK_Pointer_DownRight 0xFEE7 +#define XK_Pointer_Button_Dflt 0xFEE8 +#define XK_Pointer_Button1 0xFEE9 +#define XK_Pointer_Button2 0xFEEA +#define XK_Pointer_Button3 0xFEEB +#define XK_Pointer_Button4 0xFEEC +#define XK_Pointer_Button5 0xFEED +#define XK_Pointer_DblClick_Dflt 0xFEEE +#define XK_Pointer_DblClick1 0xFEEF +#define XK_Pointer_DblClick2 0xFEF0 +#define XK_Pointer_DblClick3 0xFEF1 +#define XK_Pointer_DblClick4 0xFEF2 +#define XK_Pointer_DblClick5 0xFEF3 +#define XK_Pointer_Drag_Dflt 0xFEF4 +#define XK_Pointer_Drag1 0xFEF5 +#define XK_Pointer_Drag2 0xFEF6 +#define XK_Pointer_Drag3 0xFEF7 +#define XK_Pointer_Drag4 0xFEF8 +#define XK_Pointer_Drag5 0xFEFD + +#define XK_Pointer_EnableKeys 0xFEF9 +#define XK_Pointer_Accelerate 0xFEFA +#define XK_Pointer_DfltBtnNext 0xFEFB +#define XK_Pointer_DfltBtnPrev 0xFEFC + +#endif + +/* + * 3270 Terminal Keys + * Byte 3 = 0xFD + */ + +#ifdef XK_3270 +#define XK_3270_Duplicate 0xFD01 +#define XK_3270_FieldMark 0xFD02 +#define XK_3270_Right2 0xFD03 +#define XK_3270_Left2 0xFD04 +#define XK_3270_BackTab 0xFD05 +#define XK_3270_EraseEOF 0xFD06 +#define XK_3270_EraseInput 0xFD07 +#define XK_3270_Reset 0xFD08 +#define XK_3270_Quit 0xFD09 +#define XK_3270_PA1 0xFD0A +#define XK_3270_PA2 0xFD0B +#define XK_3270_PA3 0xFD0C +#define XK_3270_Test 0xFD0D +#define XK_3270_Attn 0xFD0E +#define XK_3270_CursorBlink 0xFD0F +#define XK_3270_AltCursor 0xFD10 +#define XK_3270_KeyClick 0xFD11 +#define XK_3270_Jump 0xFD12 +#define XK_3270_Ident 0xFD13 +#define XK_3270_Rule 0xFD14 +#define XK_3270_Copy 0xFD15 +#define XK_3270_Play 0xFD16 +#define XK_3270_Setup 0xFD17 +#define XK_3270_Record 0xFD18 +#define XK_3270_ChangeScreen 0xFD19 +#define XK_3270_DeleteWord 0xFD1A +#define XK_3270_ExSelect 0xFD1B +#define XK_3270_CursorSelect 0xFD1C +#define XK_3270_PrintScreen 0xFD1D +#define XK_3270_Enter 0xFD1E +#endif + +/* + * Latin 1 + * Byte 3 = 0 + */ +#ifdef XK_LATIN1 +#define XK_space 0x020 +#define XK_exclam 0x021 +#define XK_quotedbl 0x022 +#define XK_numbersign 0x023 +#define XK_dollar 0x024 +#define XK_percent 0x025 +#define XK_ampersand 0x026 +#define XK_apostrophe 0x027 +#define XK_quoteright 0x027 /* deprecated */ +#define XK_parenleft 0x028 +#define XK_parenright 0x029 +#define XK_asterisk 0x02a +#define XK_plus 0x02b +#define XK_comma 0x02c +#define XK_minus 0x02d +#define XK_period 0x02e +#define XK_slash 0x02f +#define XK_0 0x030 +#define XK_1 0x031 +#define XK_2 0x032 +#define XK_3 0x033 +#define XK_4 0x034 +#define XK_5 0x035 +#define XK_6 0x036 +#define XK_7 0x037 +#define XK_8 0x038 +#define XK_9 0x039 +#define XK_colon 0x03a +#define XK_semicolon 0x03b +#define XK_less 0x03c +#define XK_equal 0x03d +#define XK_greater 0x03e +#define XK_question 0x03f +#define XK_at 0x040 +#define XK_A 0x041 +#define XK_B 0x042 +#define XK_C 0x043 +#define XK_D 0x044 +#define XK_E 0x045 +#define XK_F 0x046 +#define XK_G 0x047 +#define XK_H 0x048 +#define XK_I 0x049 +#define XK_J 0x04a +#define XK_K 0x04b +#define XK_L 0x04c +#define XK_M 0x04d +#define XK_N 0x04e +#define XK_O 0x04f +#define XK_P 0x050 +#define XK_Q 0x051 +#define XK_R 0x052 +#define XK_S 0x053 +#define XK_T 0x054 +#define XK_U 0x055 +#define XK_V 0x056 +#define XK_W 0x057 +#define XK_X 0x058 +#define XK_Y 0x059 +#define XK_Z 0x05a +#define XK_bracketleft 0x05b +#define XK_backslash 0x05c +#define XK_bracketright 0x05d +#define XK_asciicircum 0x05e +#define XK_underscore 0x05f +#define XK_grave 0x060 +#define XK_quoteleft 0x060 /* deprecated */ +#define XK_a 0x061 +#define XK_b 0x062 +#define XK_c 0x063 +#define XK_d 0x064 +#define XK_e 0x065 +#define XK_f 0x066 +#define XK_g 0x067 +#define XK_h 0x068 +#define XK_i 0x069 +#define XK_j 0x06a +#define XK_k 0x06b +#define XK_l 0x06c +#define XK_m 0x06d +#define XK_n 0x06e +#define XK_o 0x06f +#define XK_p 0x070 +#define XK_q 0x071 +#define XK_r 0x072 +#define XK_s 0x073 +#define XK_t 0x074 +#define XK_u 0x075 +#define XK_v 0x076 +#define XK_w 0x077 +#define XK_x 0x078 +#define XK_y 0x079 +#define XK_z 0x07a +#define XK_braceleft 0x07b +#define XK_bar 0x07c +#define XK_braceright 0x07d +#define XK_asciitilde 0x07e + +#define XK_nobreakspace 0x0a0 +#define XK_exclamdown 0x0a1 +#define XK_cent 0x0a2 +#define XK_sterling 0x0a3 +#define XK_currency 0x0a4 +#define XK_yen 0x0a5 +#define XK_brokenbar 0x0a6 +#define XK_section 0x0a7 +#define XK_diaeresis 0x0a8 +#define XK_copyright 0x0a9 +#define XK_ordfeminine 0x0aa +#define XK_guillemotleft 0x0ab /* left angle quotation mark */ +#define XK_notsign 0x0ac +#define XK_hyphen 0x0ad +#define XK_registered 0x0ae +#define XK_macron 0x0af +#define XK_degree 0x0b0 +#define XK_plusminus 0x0b1 +#define XK_twosuperior 0x0b2 +#define XK_threesuperior 0x0b3 +#define XK_acute 0x0b4 +#define XK_mu 0x0b5 +#define XK_paragraph 0x0b6 +#define XK_periodcentered 0x0b7 +#define XK_cedilla 0x0b8 +#define XK_onesuperior 0x0b9 +#define XK_masculine 0x0ba +#define XK_guillemotright 0x0bb /* right angle quotation mark */ +#define XK_onequarter 0x0bc +#define XK_onehalf 0x0bd +#define XK_threequarters 0x0be +#define XK_questiondown 0x0bf +#define XK_Agrave 0x0c0 +#define XK_Aacute 0x0c1 +#define XK_Acircumflex 0x0c2 +#define XK_Atilde 0x0c3 +#define XK_Adiaeresis 0x0c4 +#define XK_Aring 0x0c5 +#define XK_AE 0x0c6 +#define XK_Ccedilla 0x0c7 +#define XK_Egrave 0x0c8 +#define XK_Eacute 0x0c9 +#define XK_Ecircumflex 0x0ca +#define XK_Ediaeresis 0x0cb +#define XK_Igrave 0x0cc +#define XK_Iacute 0x0cd +#define XK_Icircumflex 0x0ce +#define XK_Idiaeresis 0x0cf +#define XK_ETH 0x0d0 +#define XK_Eth 0x0d0 /* deprecated */ +#define XK_Ntilde 0x0d1 +#define XK_Ograve 0x0d2 +#define XK_Oacute 0x0d3 +#define XK_Ocircumflex 0x0d4 +#define XK_Otilde 0x0d5 +#define XK_Odiaeresis 0x0d6 +#define XK_multiply 0x0d7 +#define XK_Ooblique 0x0d8 +#define XK_Oslash XK_Ooblique +#define XK_Ugrave 0x0d9 +#define XK_Uacute 0x0da +#define XK_Ucircumflex 0x0db +#define XK_Udiaeresis 0x0dc +#define XK_Yacute 0x0dd +#define XK_THORN 0x0de +#define XK_Thorn 0x0de /* deprecated */ +#define XK_ssharp 0x0df +#define XK_agrave 0x0e0 +#define XK_aacute 0x0e1 +#define XK_acircumflex 0x0e2 +#define XK_atilde 0x0e3 +#define XK_adiaeresis 0x0e4 +#define XK_aring 0x0e5 +#define XK_ae 0x0e6 +#define XK_ccedilla 0x0e7 +#define XK_egrave 0x0e8 +#define XK_eacute 0x0e9 +#define XK_ecircumflex 0x0ea +#define XK_ediaeresis 0x0eb +#define XK_igrave 0x0ec +#define XK_iacute 0x0ed +#define XK_icircumflex 0x0ee +#define XK_idiaeresis 0x0ef +#define XK_eth 0x0f0 +#define XK_ntilde 0x0f1 +#define XK_ograve 0x0f2 +#define XK_oacute 0x0f3 +#define XK_ocircumflex 0x0f4 +#define XK_otilde 0x0f5 +#define XK_odiaeresis 0x0f6 +#define XK_division 0x0f7 +#define XK_oslash 0x0f8 +#define XK_ooblique XK_oslash +#define XK_ugrave 0x0f9 +#define XK_uacute 0x0fa +#define XK_ucircumflex 0x0fb +#define XK_udiaeresis 0x0fc +#define XK_yacute 0x0fd +#define XK_thorn 0x0fe +#define XK_ydiaeresis 0x0ff +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#ifdef XK_LATIN2 +#define XK_Aogonek 0x1a1 +#define XK_breve 0x1a2 +#define XK_Lstroke 0x1a3 +#define XK_Lcaron 0x1a5 +#define XK_Sacute 0x1a6 +#define XK_Scaron 0x1a9 +#define XK_Scedilla 0x1aa +#define XK_Tcaron 0x1ab +#define XK_Zacute 0x1ac +#define XK_Zcaron 0x1ae +#define XK_Zabovedot 0x1af +#define XK_aogonek 0x1b1 +#define XK_ogonek 0x1b2 +#define XK_lstroke 0x1b3 +#define XK_lcaron 0x1b5 +#define XK_sacute 0x1b6 +#define XK_caron 0x1b7 +#define XK_scaron 0x1b9 +#define XK_scedilla 0x1ba +#define XK_tcaron 0x1bb +#define XK_zacute 0x1bc +#define XK_doubleacute 0x1bd +#define XK_zcaron 0x1be +#define XK_zabovedot 0x1bf +#define XK_Racute 0x1c0 +#define XK_Abreve 0x1c3 +#define XK_Lacute 0x1c5 +#define XK_Cacute 0x1c6 +#define XK_Ccaron 0x1c8 +#define XK_Eogonek 0x1ca +#define XK_Ecaron 0x1cc +#define XK_Dcaron 0x1cf +#define XK_Dstroke 0x1d0 +#define XK_Nacute 0x1d1 +#define XK_Ncaron 0x1d2 +#define XK_Odoubleacute 0x1d5 +#define XK_Rcaron 0x1d8 +#define XK_Uring 0x1d9 +#define XK_Udoubleacute 0x1db +#define XK_Tcedilla 0x1de +#define XK_racute 0x1e0 +#define XK_abreve 0x1e3 +#define XK_lacute 0x1e5 +#define XK_cacute 0x1e6 +#define XK_ccaron 0x1e8 +#define XK_eogonek 0x1ea +#define XK_ecaron 0x1ec +#define XK_dcaron 0x1ef +#define XK_dstroke 0x1f0 +#define XK_nacute 0x1f1 +#define XK_ncaron 0x1f2 +#define XK_odoubleacute 0x1f5 +#define XK_udoubleacute 0x1fb +#define XK_rcaron 0x1f8 +#define XK_uring 0x1f9 +#define XK_tcedilla 0x1fe +#define XK_abovedot 0x1ff +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#ifdef XK_LATIN3 +#define XK_Hstroke 0x2a1 +#define XK_Hcircumflex 0x2a6 +#define XK_Iabovedot 0x2a9 +#define XK_Gbreve 0x2ab +#define XK_Jcircumflex 0x2ac +#define XK_hstroke 0x2b1 +#define XK_hcircumflex 0x2b6 +#define XK_idotless 0x2b9 +#define XK_gbreve 0x2bb +#define XK_jcircumflex 0x2bc +#define XK_Cabovedot 0x2c5 +#define XK_Ccircumflex 0x2c6 +#define XK_Gabovedot 0x2d5 +#define XK_Gcircumflex 0x2d8 +#define XK_Ubreve 0x2dd +#define XK_Scircumflex 0x2de +#define XK_cabovedot 0x2e5 +#define XK_ccircumflex 0x2e6 +#define XK_gabovedot 0x2f5 +#define XK_gcircumflex 0x2f8 +#define XK_ubreve 0x2fd +#define XK_scircumflex 0x2fe +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#ifdef XK_LATIN4 +#define XK_kra 0x3a2 +#define XK_kappa 0x3a2 /* deprecated */ +#define XK_Rcedilla 0x3a3 +#define XK_Itilde 0x3a5 +#define XK_Lcedilla 0x3a6 +#define XK_Emacron 0x3aa +#define XK_Gcedilla 0x3ab +#define XK_Tslash 0x3ac +#define XK_rcedilla 0x3b3 +#define XK_itilde 0x3b5 +#define XK_lcedilla 0x3b6 +#define XK_emacron 0x3ba +#define XK_gcedilla 0x3bb +#define XK_tslash 0x3bc +#define XK_ENG 0x3bd +#define XK_eng 0x3bf +#define XK_Amacron 0x3c0 +#define XK_Iogonek 0x3c7 +#define XK_Eabovedot 0x3cc +#define XK_Imacron 0x3cf +#define XK_Ncedilla 0x3d1 +#define XK_Omacron 0x3d2 +#define XK_Kcedilla 0x3d3 +#define XK_Uogonek 0x3d9 +#define XK_Utilde 0x3dd +#define XK_Umacron 0x3de +#define XK_amacron 0x3e0 +#define XK_iogonek 0x3e7 +#define XK_eabovedot 0x3ec +#define XK_imacron 0x3ef +#define XK_ncedilla 0x3f1 +#define XK_omacron 0x3f2 +#define XK_kcedilla 0x3f3 +#define XK_uogonek 0x3f9 +#define XK_utilde 0x3fd +#define XK_umacron 0x3fe +#endif /* XK_LATIN4 */ + +/* + * Latin-8 + * Byte 3 = 18 + */ +#ifdef XK_LATIN8 +#define XK_Babovedot 0x12a1 +#define XK_babovedot 0x12a2 +#define XK_Dabovedot 0x12a6 +#define XK_Wgrave 0x12a8 +#define XK_Wacute 0x12aa +#define XK_dabovedot 0x12ab +#define XK_Ygrave 0x12ac +#define XK_Fabovedot 0x12b0 +#define XK_fabovedot 0x12b1 +#define XK_Mabovedot 0x12b4 +#define XK_mabovedot 0x12b5 +#define XK_Pabovedot 0x12b7 +#define XK_wgrave 0x12b8 +#define XK_pabovedot 0x12b9 +#define XK_wacute 0x12ba +#define XK_Sabovedot 0x12bb +#define XK_ygrave 0x12bc +#define XK_Wdiaeresis 0x12bd +#define XK_wdiaeresis 0x12be +#define XK_sabovedot 0x12bf +#define XK_Wcircumflex 0x12d0 +#define XK_Tabovedot 0x12d7 +#define XK_Ycircumflex 0x12de +#define XK_wcircumflex 0x12f0 +#define XK_tabovedot 0x12f7 +#define XK_ycircumflex 0x12fe +#endif /* XK_LATIN8 */ + +/* + * Latin-9 (a.k.a. Latin-0) + * Byte 3 = 19 + */ + +#ifdef XK_LATIN9 +#define XK_OE 0x13bc +#define XK_oe 0x13bd +#define XK_Ydiaeresis 0x13be +#endif /* XK_LATIN9 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#ifdef XK_KATAKANA +#define XK_overline 0x47e +#define XK_kana_fullstop 0x4a1 +#define XK_kana_openingbracket 0x4a2 +#define XK_kana_closingbracket 0x4a3 +#define XK_kana_comma 0x4a4 +#define XK_kana_conjunctive 0x4a5 +#define XK_kana_middledot 0x4a5 /* deprecated */ +#define XK_kana_WO 0x4a6 +#define XK_kana_a 0x4a7 +#define XK_kana_i 0x4a8 +#define XK_kana_u 0x4a9 +#define XK_kana_e 0x4aa +#define XK_kana_o 0x4ab +#define XK_kana_ya 0x4ac +#define XK_kana_yu 0x4ad +#define XK_kana_yo 0x4ae +#define XK_kana_tsu 0x4af +#define XK_kana_tu 0x4af /* deprecated */ +#define XK_prolongedsound 0x4b0 +#define XK_kana_A 0x4b1 +#define XK_kana_I 0x4b2 +#define XK_kana_U 0x4b3 +#define XK_kana_E 0x4b4 +#define XK_kana_O 0x4b5 +#define XK_kana_KA 0x4b6 +#define XK_kana_KI 0x4b7 +#define XK_kana_KU 0x4b8 +#define XK_kana_KE 0x4b9 +#define XK_kana_KO 0x4ba +#define XK_kana_SA 0x4bb +#define XK_kana_SHI 0x4bc +#define XK_kana_SU 0x4bd +#define XK_kana_SE 0x4be +#define XK_kana_SO 0x4bf +#define XK_kana_TA 0x4c0 +#define XK_kana_CHI 0x4c1 +#define XK_kana_TI 0x4c1 /* deprecated */ +#define XK_kana_TSU 0x4c2 +#define XK_kana_TU 0x4c2 /* deprecated */ +#define XK_kana_TE 0x4c3 +#define XK_kana_TO 0x4c4 +#define XK_kana_NA 0x4c5 +#define XK_kana_NI 0x4c6 +#define XK_kana_NU 0x4c7 +#define XK_kana_NE 0x4c8 +#define XK_kana_NO 0x4c9 +#define XK_kana_HA 0x4ca +#define XK_kana_HI 0x4cb +#define XK_kana_FU 0x4cc +#define XK_kana_HU 0x4cc /* deprecated */ +#define XK_kana_HE 0x4cd +#define XK_kana_HO 0x4ce +#define XK_kana_MA 0x4cf +#define XK_kana_MI 0x4d0 +#define XK_kana_MU 0x4d1 +#define XK_kana_ME 0x4d2 +#define XK_kana_MO 0x4d3 +#define XK_kana_YA 0x4d4 +#define XK_kana_YU 0x4d5 +#define XK_kana_YO 0x4d6 +#define XK_kana_RA 0x4d7 +#define XK_kana_RI 0x4d8 +#define XK_kana_RU 0x4d9 +#define XK_kana_RE 0x4da +#define XK_kana_RO 0x4db +#define XK_kana_WA 0x4dc +#define XK_kana_N 0x4dd +#define XK_voicedsound 0x4de +#define XK_semivoicedsound 0x4df +#define XK_kana_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#ifdef XK_ARABIC +#define XK_Farsi_0 0x590 +#define XK_Farsi_1 0x591 +#define XK_Farsi_2 0x592 +#define XK_Farsi_3 0x593 +#define XK_Farsi_4 0x594 +#define XK_Farsi_5 0x595 +#define XK_Farsi_6 0x596 +#define XK_Farsi_7 0x597 +#define XK_Farsi_8 0x598 +#define XK_Farsi_9 0x599 +#define XK_Arabic_percent 0x5a5 +#define XK_Arabic_superscript_alef 0x5a6 +#define XK_Arabic_tteh 0x5a7 +#define XK_Arabic_peh 0x5a8 +#define XK_Arabic_tcheh 0x5a9 +#define XK_Arabic_ddal 0x5aa +#define XK_Arabic_rreh 0x5ab +#define XK_Arabic_comma 0x5ac +#define XK_Arabic_fullstop 0x5ae +#define XK_Arabic_0 0x5b0 +#define XK_Arabic_1 0x5b1 +#define XK_Arabic_2 0x5b2 +#define XK_Arabic_3 0x5b3 +#define XK_Arabic_4 0x5b4 +#define XK_Arabic_5 0x5b5 +#define XK_Arabic_6 0x5b6 +#define XK_Arabic_7 0x5b7 +#define XK_Arabic_8 0x5b8 +#define XK_Arabic_9 0x5b9 +#define XK_Arabic_semicolon 0x5bb +#define XK_Arabic_question_mark 0x5bf +#define XK_Arabic_hamza 0x5c1 +#define XK_Arabic_maddaonalef 0x5c2 +#define XK_Arabic_hamzaonalef 0x5c3 +#define XK_Arabic_hamzaonwaw 0x5c4 +#define XK_Arabic_hamzaunderalef 0x5c5 +#define XK_Arabic_hamzaonyeh 0x5c6 +#define XK_Arabic_alef 0x5c7 +#define XK_Arabic_beh 0x5c8 +#define XK_Arabic_tehmarbuta 0x5c9 +#define XK_Arabic_teh 0x5ca +#define XK_Arabic_theh 0x5cb +#define XK_Arabic_jeem 0x5cc +#define XK_Arabic_hah 0x5cd +#define XK_Arabic_khah 0x5ce +#define XK_Arabic_dal 0x5cf +#define XK_Arabic_thal 0x5d0 +#define XK_Arabic_ra 0x5d1 +#define XK_Arabic_zain 0x5d2 +#define XK_Arabic_seen 0x5d3 +#define XK_Arabic_sheen 0x5d4 +#define XK_Arabic_sad 0x5d5 +#define XK_Arabic_dad 0x5d6 +#define XK_Arabic_tah 0x5d7 +#define XK_Arabic_zah 0x5d8 +#define XK_Arabic_ain 0x5d9 +#define XK_Arabic_ghain 0x5da +#define XK_Arabic_tatweel 0x5e0 +#define XK_Arabic_feh 0x5e1 +#define XK_Arabic_qaf 0x5e2 +#define XK_Arabic_kaf 0x5e3 +#define XK_Arabic_lam 0x5e4 +#define XK_Arabic_meem 0x5e5 +#define XK_Arabic_noon 0x5e6 +#define XK_Arabic_ha 0x5e7 +#define XK_Arabic_heh 0x5e7 /* deprecated */ +#define XK_Arabic_waw 0x5e8 +#define XK_Arabic_alefmaksura 0x5e9 +#define XK_Arabic_yeh 0x5ea +#define XK_Arabic_fathatan 0x5eb +#define XK_Arabic_dammatan 0x5ec +#define XK_Arabic_kasratan 0x5ed +#define XK_Arabic_fatha 0x5ee +#define XK_Arabic_damma 0x5ef +#define XK_Arabic_kasra 0x5f0 +#define XK_Arabic_shadda 0x5f1 +#define XK_Arabic_sukun 0x5f2 +#define XK_Arabic_madda_above 0x5f3 +#define XK_Arabic_hamza_above 0x5f4 +#define XK_Arabic_hamza_below 0x5f5 +#define XK_Arabic_jeh 0x5f6 +#define XK_Arabic_veh 0x5f7 +#define XK_Arabic_keheh 0x5f8 +#define XK_Arabic_gaf 0x5f9 +#define XK_Arabic_noon_ghunna 0x5fa +#define XK_Arabic_heh_doachashmee 0x5fb +#define XK_Farsi_yeh 0x5fc +#define XK_Arabic_farsi_yeh XK_Farsi_yeh +#define XK_Arabic_yeh_baree 0x5fd +#define XK_Arabic_heh_goal 0x5fe +#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#ifdef XK_CYRILLIC +#define XK_Cyrillic_GHE_bar 0x680 +#define XK_Cyrillic_ghe_bar 0x690 +#define XK_Cyrillic_ZHE_descender 0x681 +#define XK_Cyrillic_zhe_descender 0x691 +#define XK_Cyrillic_KA_descender 0x682 +#define XK_Cyrillic_ka_descender 0x692 +#define XK_Cyrillic_KA_vertstroke 0x683 +#define XK_Cyrillic_ka_vertstroke 0x693 +#define XK_Cyrillic_EN_descender 0x684 +#define XK_Cyrillic_en_descender 0x694 +#define XK_Cyrillic_U_straight 0x685 +#define XK_Cyrillic_u_straight 0x695 +#define XK_Cyrillic_U_straight_bar 0x686 +#define XK_Cyrillic_u_straight_bar 0x696 +#define XK_Cyrillic_HA_descender 0x687 +#define XK_Cyrillic_ha_descender 0x697 +#define XK_Cyrillic_CHE_descender 0x688 +#define XK_Cyrillic_che_descender 0x698 +#define XK_Cyrillic_CHE_vertstroke 0x689 +#define XK_Cyrillic_che_vertstroke 0x699 +#define XK_Cyrillic_SHHA 0x68a +#define XK_Cyrillic_shha 0x69a + +#define XK_Cyrillic_SCHWA 0x68c +#define XK_Cyrillic_schwa 0x69c +#define XK_Cyrillic_I_macron 0x68d +#define XK_Cyrillic_i_macron 0x69d +#define XK_Cyrillic_O_bar 0x68e +#define XK_Cyrillic_o_bar 0x69e +#define XK_Cyrillic_U_macron 0x68f +#define XK_Cyrillic_u_macron 0x69f + +#define XK_Serbian_dje 0x6a1 +#define XK_Macedonia_gje 0x6a2 +#define XK_Cyrillic_io 0x6a3 +#define XK_Ukrainian_ie 0x6a4 +#define XK_Ukranian_je 0x6a4 /* deprecated */ +#define XK_Macedonia_dse 0x6a5 +#define XK_Ukrainian_i 0x6a6 +#define XK_Ukranian_i 0x6a6 /* deprecated */ +#define XK_Ukrainian_yi 0x6a7 +#define XK_Ukranian_yi 0x6a7 /* deprecated */ +#define XK_Cyrillic_je 0x6a8 +#define XK_Serbian_je 0x6a8 /* deprecated */ +#define XK_Cyrillic_lje 0x6a9 +#define XK_Serbian_lje 0x6a9 /* deprecated */ +#define XK_Cyrillic_nje 0x6aa +#define XK_Serbian_nje 0x6aa /* deprecated */ +#define XK_Serbian_tshe 0x6ab +#define XK_Macedonia_kje 0x6ac +#define XK_Ukrainian_ghe_with_upturn 0x6ad +#define XK_Byelorussian_shortu 0x6ae +#define XK_Cyrillic_dzhe 0x6af +#define XK_Serbian_dze 0x6af /* deprecated */ +#define XK_numerosign 0x6b0 +#define XK_Serbian_DJE 0x6b1 +#define XK_Macedonia_GJE 0x6b2 +#define XK_Cyrillic_IO 0x6b3 +#define XK_Ukrainian_IE 0x6b4 +#define XK_Ukranian_JE 0x6b4 /* deprecated */ +#define XK_Macedonia_DSE 0x6b5 +#define XK_Ukrainian_I 0x6b6 +#define XK_Ukranian_I 0x6b6 /* deprecated */ +#define XK_Ukrainian_YI 0x6b7 +#define XK_Ukranian_YI 0x6b7 /* deprecated */ +#define XK_Cyrillic_JE 0x6b8 +#define XK_Serbian_JE 0x6b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x6b9 +#define XK_Serbian_LJE 0x6b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x6ba +#define XK_Serbian_NJE 0x6ba /* deprecated */ +#define XK_Serbian_TSHE 0x6bb +#define XK_Macedonia_KJE 0x6bc +#define XK_Ukrainian_GHE_WITH_UPTURN 0x6bd +#define XK_Byelorussian_SHORTU 0x6be +#define XK_Cyrillic_DZHE 0x6bf +#define XK_Serbian_DZE 0x6bf /* deprecated */ +#define XK_Cyrillic_yu 0x6c0 +#define XK_Cyrillic_a 0x6c1 +#define XK_Cyrillic_be 0x6c2 +#define XK_Cyrillic_tse 0x6c3 +#define XK_Cyrillic_de 0x6c4 +#define XK_Cyrillic_ie 0x6c5 +#define XK_Cyrillic_ef 0x6c6 +#define XK_Cyrillic_ghe 0x6c7 +#define XK_Cyrillic_ha 0x6c8 +#define XK_Cyrillic_i 0x6c9 +#define XK_Cyrillic_shorti 0x6ca +#define XK_Cyrillic_ka 0x6cb +#define XK_Cyrillic_el 0x6cc +#define XK_Cyrillic_em 0x6cd +#define XK_Cyrillic_en 0x6ce +#define XK_Cyrillic_o 0x6cf +#define XK_Cyrillic_pe 0x6d0 +#define XK_Cyrillic_ya 0x6d1 +#define XK_Cyrillic_er 0x6d2 +#define XK_Cyrillic_es 0x6d3 +#define XK_Cyrillic_te 0x6d4 +#define XK_Cyrillic_u 0x6d5 +#define XK_Cyrillic_zhe 0x6d6 +#define XK_Cyrillic_ve 0x6d7 +#define XK_Cyrillic_softsign 0x6d8 +#define XK_Cyrillic_yeru 0x6d9 +#define XK_Cyrillic_ze 0x6da +#define XK_Cyrillic_sha 0x6db +#define XK_Cyrillic_e 0x6dc +#define XK_Cyrillic_shcha 0x6dd +#define XK_Cyrillic_che 0x6de +#define XK_Cyrillic_hardsign 0x6df +#define XK_Cyrillic_YU 0x6e0 +#define XK_Cyrillic_A 0x6e1 +#define XK_Cyrillic_BE 0x6e2 +#define XK_Cyrillic_TSE 0x6e3 +#define XK_Cyrillic_DE 0x6e4 +#define XK_Cyrillic_IE 0x6e5 +#define XK_Cyrillic_EF 0x6e6 +#define XK_Cyrillic_GHE 0x6e7 +#define XK_Cyrillic_HA 0x6e8 +#define XK_Cyrillic_I 0x6e9 +#define XK_Cyrillic_SHORTI 0x6ea +#define XK_Cyrillic_KA 0x6eb +#define XK_Cyrillic_EL 0x6ec +#define XK_Cyrillic_EM 0x6ed +#define XK_Cyrillic_EN 0x6ee +#define XK_Cyrillic_O 0x6ef +#define XK_Cyrillic_PE 0x6f0 +#define XK_Cyrillic_YA 0x6f1 +#define XK_Cyrillic_ER 0x6f2 +#define XK_Cyrillic_ES 0x6f3 +#define XK_Cyrillic_TE 0x6f4 +#define XK_Cyrillic_U 0x6f5 +#define XK_Cyrillic_ZHE 0x6f6 +#define XK_Cyrillic_VE 0x6f7 +#define XK_Cyrillic_SOFTSIGN 0x6f8 +#define XK_Cyrillic_YERU 0x6f9 +#define XK_Cyrillic_ZE 0x6fa +#define XK_Cyrillic_SHA 0x6fb +#define XK_Cyrillic_E 0x6fc +#define XK_Cyrillic_SHCHA 0x6fd +#define XK_Cyrillic_CHE 0x6fe +#define XK_Cyrillic_HARDSIGN 0x6ff +#endif /* XK_CYRILLIC */ + +/* + * Greek + * Byte 3 = 7 + */ + +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x7a1 +#define XK_Greek_EPSILONaccent 0x7a2 +#define XK_Greek_ETAaccent 0x7a3 +#define XK_Greek_IOTAaccent 0x7a4 +#define XK_Greek_IOTAdieresis 0x7a5 +#define XK_Greek_IOTAdiaeresis XK_Greek_IOTAdieresis /* old typo */ +#define XK_Greek_OMICRONaccent 0x7a7 +#define XK_Greek_UPSILONaccent 0x7a8 +#define XK_Greek_UPSILONdieresis 0x7a9 +#define XK_Greek_OMEGAaccent 0x7ab +#define XK_Greek_accentdieresis 0x7ae +#define XK_Greek_horizbar 0x7af +#define XK_Greek_alphaaccent 0x7b1 +#define XK_Greek_epsilonaccent 0x7b2 +#define XK_Greek_etaaccent 0x7b3 +#define XK_Greek_iotaaccent 0x7b4 +#define XK_Greek_iotadieresis 0x7b5 +#define XK_Greek_iotaaccentdieresis 0x7b6 +#define XK_Greek_omicronaccent 0x7b7 +#define XK_Greek_upsilonaccent 0x7b8 +#define XK_Greek_upsilondieresis 0x7b9 +#define XK_Greek_upsilonaccentdieresis 0x7ba +#define XK_Greek_omegaaccent 0x7bb +#define XK_Greek_ALPHA 0x7c1 +#define XK_Greek_BETA 0x7c2 +#define XK_Greek_GAMMA 0x7c3 +#define XK_Greek_DELTA 0x7c4 +#define XK_Greek_EPSILON 0x7c5 +#define XK_Greek_ZETA 0x7c6 +#define XK_Greek_ETA 0x7c7 +#define XK_Greek_THETA 0x7c8 +#define XK_Greek_IOTA 0x7c9 +#define XK_Greek_KAPPA 0x7ca +#define XK_Greek_LAMDA 0x7cb +#define XK_Greek_LAMBDA 0x7cb +#define XK_Greek_MU 0x7cc +#define XK_Greek_NU 0x7cd +#define XK_Greek_XI 0x7ce +#define XK_Greek_OMICRON 0x7cf +#define XK_Greek_PI 0x7d0 +#define XK_Greek_RHO 0x7d1 +#define XK_Greek_SIGMA 0x7d2 +#define XK_Greek_TAU 0x7d4 +#define XK_Greek_UPSILON 0x7d5 +#define XK_Greek_PHI 0x7d6 +#define XK_Greek_CHI 0x7d7 +#define XK_Greek_PSI 0x7d8 +#define XK_Greek_OMEGA 0x7d9 +#define XK_Greek_alpha 0x7e1 +#define XK_Greek_beta 0x7e2 +#define XK_Greek_gamma 0x7e3 +#define XK_Greek_delta 0x7e4 +#define XK_Greek_epsilon 0x7e5 +#define XK_Greek_zeta 0x7e6 +#define XK_Greek_eta 0x7e7 +#define XK_Greek_theta 0x7e8 +#define XK_Greek_iota 0x7e9 +#define XK_Greek_kappa 0x7ea +#define XK_Greek_lamda 0x7eb +#define XK_Greek_lambda 0x7eb +#define XK_Greek_mu 0x7ec +#define XK_Greek_nu 0x7ed +#define XK_Greek_xi 0x7ee +#define XK_Greek_omicron 0x7ef +#define XK_Greek_pi 0x7f0 +#define XK_Greek_rho 0x7f1 +#define XK_Greek_sigma 0x7f2 +#define XK_Greek_finalsmallsigma 0x7f3 +#define XK_Greek_tau 0x7f4 +#define XK_Greek_upsilon 0x7f5 +#define XK_Greek_phi 0x7f6 +#define XK_Greek_chi 0x7f7 +#define XK_Greek_psi 0x7f8 +#define XK_Greek_omega 0x7f9 +#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * Byte 3 = 8 + */ + +#ifdef XK_TECHNICAL +#define XK_leftradical 0x8a1 +#define XK_topleftradical 0x8a2 +#define XK_horizconnector 0x8a3 +#define XK_topintegral 0x8a4 +#define XK_botintegral 0x8a5 +#define XK_vertconnector 0x8a6 +#define XK_topleftsqbracket 0x8a7 +#define XK_botleftsqbracket 0x8a8 +#define XK_toprightsqbracket 0x8a9 +#define XK_botrightsqbracket 0x8aa +#define XK_topleftparens 0x8ab +#define XK_botleftparens 0x8ac +#define XK_toprightparens 0x8ad +#define XK_botrightparens 0x8ae +#define XK_leftmiddlecurlybrace 0x8af +#define XK_rightmiddlecurlybrace 0x8b0 +#define XK_topleftsummation 0x8b1 +#define XK_botleftsummation 0x8b2 +#define XK_topvertsummationconnector 0x8b3 +#define XK_botvertsummationconnector 0x8b4 +#define XK_toprightsummation 0x8b5 +#define XK_botrightsummation 0x8b6 +#define XK_rightmiddlesummation 0x8b7 +#define XK_lessthanequal 0x8bc +#define XK_notequal 0x8bd +#define XK_greaterthanequal 0x8be +#define XK_integral 0x8bf +#define XK_therefore 0x8c0 +#define XK_variation 0x8c1 +#define XK_infinity 0x8c2 +#define XK_nabla 0x8c5 +#define XK_approximate 0x8c8 +#define XK_similarequal 0x8c9 +#define XK_ifonlyif 0x8cd +#define XK_implies 0x8ce +#define XK_identical 0x8cf +#define XK_radical 0x8d6 +#define XK_includedin 0x8da +#define XK_includes 0x8db +#define XK_intersection 0x8dc +#define XK_union 0x8dd +#define XK_logicaland 0x8de +#define XK_logicalor 0x8df +#define XK_partialderivative 0x8ef +#define XK_function 0x8f6 +#define XK_leftarrow 0x8fb +#define XK_uparrow 0x8fc +#define XK_rightarrow 0x8fd +#define XK_downarrow 0x8fe +#endif /* XK_TECHNICAL */ + +/* + * Special + * Byte 3 = 9 + */ + +#ifdef XK_SPECIAL +#define XK_blank 0x9df +#define XK_soliddiamond 0x9e0 +#define XK_checkerboard 0x9e1 +#define XK_ht 0x9e2 +#define XK_ff 0x9e3 +#define XK_cr 0x9e4 +#define XK_lf 0x9e5 +#define XK_nl 0x9e8 +#define XK_vt 0x9e9 +#define XK_lowrightcorner 0x9ea +#define XK_uprightcorner 0x9eb +#define XK_upleftcorner 0x9ec +#define XK_lowleftcorner 0x9ed +#define XK_crossinglines 0x9ee +#define XK_horizlinescan1 0x9ef +#define XK_horizlinescan3 0x9f0 +#define XK_horizlinescan5 0x9f1 +#define XK_horizlinescan7 0x9f2 +#define XK_horizlinescan9 0x9f3 +#define XK_leftt 0x9f4 +#define XK_rightt 0x9f5 +#define XK_bott 0x9f6 +#define XK_topt 0x9f7 +#define XK_vertbar 0x9f8 +#endif /* XK_SPECIAL */ + +/* + * Publishing + * Byte 3 = a + */ + +#ifdef XK_PUBLISHING +#define XK_emspace 0xaa1 +#define XK_enspace 0xaa2 +#define XK_em3space 0xaa3 +#define XK_em4space 0xaa4 +#define XK_digitspace 0xaa5 +#define XK_punctspace 0xaa6 +#define XK_thinspace 0xaa7 +#define XK_hairspace 0xaa8 +#define XK_emdash 0xaa9 +#define XK_endash 0xaaa +#define XK_signifblank 0xaac +#define XK_ellipsis 0xaae +#define XK_doubbaselinedot 0xaaf +#define XK_onethird 0xab0 +#define XK_twothirds 0xab1 +#define XK_onefifth 0xab2 +#define XK_twofifths 0xab3 +#define XK_threefifths 0xab4 +#define XK_fourfifths 0xab5 +#define XK_onesixth 0xab6 +#define XK_fivesixths 0xab7 +#define XK_careof 0xab8 +#define XK_figdash 0xabb +#define XK_leftanglebracket 0xabc +#define XK_decimalpoint 0xabd +#define XK_rightanglebracket 0xabe +#define XK_marker 0xabf +#define XK_oneeighth 0xac3 +#define XK_threeeighths 0xac4 +#define XK_fiveeighths 0xac5 +#define XK_seveneighths 0xac6 +#define XK_trademark 0xac9 +#define XK_signaturemark 0xaca +#define XK_trademarkincircle 0xacb +#define XK_leftopentriangle 0xacc +#define XK_rightopentriangle 0xacd +#define XK_emopencircle 0xace +#define XK_emopenrectangle 0xacf +#define XK_leftsinglequotemark 0xad0 +#define XK_rightsinglequotemark 0xad1 +#define XK_leftdoublequotemark 0xad2 +#define XK_rightdoublequotemark 0xad3 +#define XK_prescription 0xad4 +#define XK_minutes 0xad6 +#define XK_seconds 0xad7 +#define XK_latincross 0xad9 +#define XK_hexagram 0xada +#define XK_filledrectbullet 0xadb +#define XK_filledlefttribullet 0xadc +#define XK_filledrighttribullet 0xadd +#define XK_emfilledcircle 0xade +#define XK_emfilledrect 0xadf +#define XK_enopencircbullet 0xae0 +#define XK_enopensquarebullet 0xae1 +#define XK_openrectbullet 0xae2 +#define XK_opentribulletup 0xae3 +#define XK_opentribulletdown 0xae4 +#define XK_openstar 0xae5 +#define XK_enfilledcircbullet 0xae6 +#define XK_enfilledsqbullet 0xae7 +#define XK_filledtribulletup 0xae8 +#define XK_filledtribulletdown 0xae9 +#define XK_leftpointer 0xaea +#define XK_rightpointer 0xaeb +#define XK_club 0xaec +#define XK_diamond 0xaed +#define XK_heart 0xaee +#define XK_maltesecross 0xaf0 +#define XK_dagger 0xaf1 +#define XK_doubledagger 0xaf2 +#define XK_checkmark 0xaf3 +#define XK_ballotcross 0xaf4 +#define XK_musicalsharp 0xaf5 +#define XK_musicalflat 0xaf6 +#define XK_malesymbol 0xaf7 +#define XK_femalesymbol 0xaf8 +#define XK_telephone 0xaf9 +#define XK_telephonerecorder 0xafa +#define XK_phonographcopyright 0xafb +#define XK_caret 0xafc +#define XK_singlelowquotemark 0xafd +#define XK_doublelowquotemark 0xafe +#define XK_cursor 0xaff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = b + */ + +#ifdef XK_APL +#define XK_leftcaret 0xba3 +#define XK_rightcaret 0xba6 +#define XK_downcaret 0xba8 +#define XK_upcaret 0xba9 +#define XK_overbar 0xbc0 +#define XK_downtack 0xbc2 +#define XK_upshoe 0xbc3 +#define XK_downstile 0xbc4 +#define XK_underbar 0xbc6 +#define XK_jot 0xbca +#define XK_quad 0xbcc +#define XK_uptack 0xbce +#define XK_circle 0xbcf +#define XK_upstile 0xbd3 +#define XK_downshoe 0xbd6 +#define XK_rightshoe 0xbd8 +#define XK_leftshoe 0xbda +#define XK_lefttack 0xbdc +#define XK_righttack 0xbfc +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = c + */ + +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0xcdf +#define XK_hebrew_aleph 0xce0 +#define XK_hebrew_bet 0xce1 +#define XK_hebrew_beth 0xce1 /* deprecated */ +#define XK_hebrew_gimel 0xce2 +#define XK_hebrew_gimmel 0xce2 /* deprecated */ +#define XK_hebrew_dalet 0xce3 +#define XK_hebrew_daleth 0xce3 /* deprecated */ +#define XK_hebrew_he 0xce4 +#define XK_hebrew_waw 0xce5 +#define XK_hebrew_zain 0xce6 +#define XK_hebrew_zayin 0xce6 /* deprecated */ +#define XK_hebrew_chet 0xce7 +#define XK_hebrew_het 0xce7 /* deprecated */ +#define XK_hebrew_tet 0xce8 +#define XK_hebrew_teth 0xce8 /* deprecated */ +#define XK_hebrew_yod 0xce9 +#define XK_hebrew_finalkaph 0xcea +#define XK_hebrew_kaph 0xceb +#define XK_hebrew_lamed 0xcec +#define XK_hebrew_finalmem 0xced +#define XK_hebrew_mem 0xcee +#define XK_hebrew_finalnun 0xcef +#define XK_hebrew_nun 0xcf0 +#define XK_hebrew_samech 0xcf1 +#define XK_hebrew_samekh 0xcf1 /* deprecated */ +#define XK_hebrew_ayin 0xcf2 +#define XK_hebrew_finalpe 0xcf3 +#define XK_hebrew_pe 0xcf4 +#define XK_hebrew_finalzade 0xcf5 +#define XK_hebrew_finalzadi 0xcf5 /* deprecated */ +#define XK_hebrew_zade 0xcf6 +#define XK_hebrew_zadi 0xcf6 /* deprecated */ +#define XK_hebrew_qoph 0xcf7 +#define XK_hebrew_kuf 0xcf7 /* deprecated */ +#define XK_hebrew_resh 0xcf8 +#define XK_hebrew_shin 0xcf9 +#define XK_hebrew_taw 0xcfa +#define XK_hebrew_taf 0xcfa /* deprecated */ +#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + +/* + * Thai + * Byte 3 = d + */ + +#ifdef XK_THAI +#define XK_Thai_kokai 0xda1 +#define XK_Thai_khokhai 0xda2 +#define XK_Thai_khokhuat 0xda3 +#define XK_Thai_khokhwai 0xda4 +#define XK_Thai_khokhon 0xda5 +#define XK_Thai_khorakhang 0xda6 +#define XK_Thai_ngongu 0xda7 +#define XK_Thai_chochan 0xda8 +#define XK_Thai_choching 0xda9 +#define XK_Thai_chochang 0xdaa +#define XK_Thai_soso 0xdab +#define XK_Thai_chochoe 0xdac +#define XK_Thai_yoying 0xdad +#define XK_Thai_dochada 0xdae +#define XK_Thai_topatak 0xdaf +#define XK_Thai_thothan 0xdb0 +#define XK_Thai_thonangmontho 0xdb1 +#define XK_Thai_thophuthao 0xdb2 +#define XK_Thai_nonen 0xdb3 +#define XK_Thai_dodek 0xdb4 +#define XK_Thai_totao 0xdb5 +#define XK_Thai_thothung 0xdb6 +#define XK_Thai_thothahan 0xdb7 +#define XK_Thai_thothong 0xdb8 +#define XK_Thai_nonu 0xdb9 +#define XK_Thai_bobaimai 0xdba +#define XK_Thai_popla 0xdbb +#define XK_Thai_phophung 0xdbc +#define XK_Thai_fofa 0xdbd +#define XK_Thai_phophan 0xdbe +#define XK_Thai_fofan 0xdbf +#define XK_Thai_phosamphao 0xdc0 +#define XK_Thai_moma 0xdc1 +#define XK_Thai_yoyak 0xdc2 +#define XK_Thai_rorua 0xdc3 +#define XK_Thai_ru 0xdc4 +#define XK_Thai_loling 0xdc5 +#define XK_Thai_lu 0xdc6 +#define XK_Thai_wowaen 0xdc7 +#define XK_Thai_sosala 0xdc8 +#define XK_Thai_sorusi 0xdc9 +#define XK_Thai_sosua 0xdca +#define XK_Thai_hohip 0xdcb +#define XK_Thai_lochula 0xdcc +#define XK_Thai_oang 0xdcd +#define XK_Thai_honokhuk 0xdce +#define XK_Thai_paiyannoi 0xdcf +#define XK_Thai_saraa 0xdd0 +#define XK_Thai_maihanakat 0xdd1 +#define XK_Thai_saraaa 0xdd2 +#define XK_Thai_saraam 0xdd3 +#define XK_Thai_sarai 0xdd4 +#define XK_Thai_saraii 0xdd5 +#define XK_Thai_saraue 0xdd6 +#define XK_Thai_sarauee 0xdd7 +#define XK_Thai_sarau 0xdd8 +#define XK_Thai_sarauu 0xdd9 +#define XK_Thai_phinthu 0xdda +#define XK_Thai_maihanakat_maitho 0xdde +#define XK_Thai_baht 0xddf +#define XK_Thai_sarae 0xde0 +#define XK_Thai_saraae 0xde1 +#define XK_Thai_sarao 0xde2 +#define XK_Thai_saraaimaimuan 0xde3 +#define XK_Thai_saraaimaimalai 0xde4 +#define XK_Thai_lakkhangyao 0xde5 +#define XK_Thai_maiyamok 0xde6 +#define XK_Thai_maitaikhu 0xde7 +#define XK_Thai_maiek 0xde8 +#define XK_Thai_maitho 0xde9 +#define XK_Thai_maitri 0xdea +#define XK_Thai_maichattawa 0xdeb +#define XK_Thai_thanthakhat 0xdec +#define XK_Thai_nikhahit 0xded +#define XK_Thai_leksun 0xdf0 +#define XK_Thai_leknung 0xdf1 +#define XK_Thai_leksong 0xdf2 +#define XK_Thai_leksam 0xdf3 +#define XK_Thai_leksi 0xdf4 +#define XK_Thai_lekha 0xdf5 +#define XK_Thai_lekhok 0xdf6 +#define XK_Thai_lekchet 0xdf7 +#define XK_Thai_lekpaet 0xdf8 +#define XK_Thai_lekkao 0xdf9 +#endif /* XK_THAI */ + +/* + * Korean + * Byte 3 = e + */ + +#ifdef XK_KOREAN + +#define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */ +#define XK_Hangul_Start 0xff32 /* Hangul start */ +#define XK_Hangul_End 0xff33 /* Hangul end, English start */ +#define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ +#define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ +#define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ +#define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */ +#define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */ +#define XK_Hangul_Banja 0xff39 /* Banja mode */ +#define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ +#define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ +#define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */ +#define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ +#define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ +#define XK_Hangul_Special 0xff3f /* Special symbols */ +#define XK_Hangul_switch 0xFF7E /* Alias for mode_switch */ + +/* Hangul Consonant Characters */ +#define XK_Hangul_Kiyeog 0xea1 +#define XK_Hangul_SsangKiyeog 0xea2 +#define XK_Hangul_KiyeogSios 0xea3 +#define XK_Hangul_Nieun 0xea4 +#define XK_Hangul_NieunJieuj 0xea5 +#define XK_Hangul_NieunHieuh 0xea6 +#define XK_Hangul_Dikeud 0xea7 +#define XK_Hangul_SsangDikeud 0xea8 +#define XK_Hangul_Rieul 0xea9 +#define XK_Hangul_RieulKiyeog 0xeaa +#define XK_Hangul_RieulMieum 0xeab +#define XK_Hangul_RieulPieub 0xeac +#define XK_Hangul_RieulSios 0xead +#define XK_Hangul_RieulTieut 0xeae +#define XK_Hangul_RieulPhieuf 0xeaf +#define XK_Hangul_RieulHieuh 0xeb0 +#define XK_Hangul_Mieum 0xeb1 +#define XK_Hangul_Pieub 0xeb2 +#define XK_Hangul_SsangPieub 0xeb3 +#define XK_Hangul_PieubSios 0xeb4 +#define XK_Hangul_Sios 0xeb5 +#define XK_Hangul_SsangSios 0xeb6 +#define XK_Hangul_Ieung 0xeb7 +#define XK_Hangul_Jieuj 0xeb8 +#define XK_Hangul_SsangJieuj 0xeb9 +#define XK_Hangul_Cieuc 0xeba +#define XK_Hangul_Khieuq 0xebb +#define XK_Hangul_Tieut 0xebc +#define XK_Hangul_Phieuf 0xebd +#define XK_Hangul_Hieuh 0xebe + +/* Hangul Vowel Characters */ +#define XK_Hangul_A 0xebf +#define XK_Hangul_AE 0xec0 +#define XK_Hangul_YA 0xec1 +#define XK_Hangul_YAE 0xec2 +#define XK_Hangul_EO 0xec3 +#define XK_Hangul_E 0xec4 +#define XK_Hangul_YEO 0xec5 +#define XK_Hangul_YE 0xec6 +#define XK_Hangul_O 0xec7 +#define XK_Hangul_WA 0xec8 +#define XK_Hangul_WAE 0xec9 +#define XK_Hangul_OE 0xeca +#define XK_Hangul_YO 0xecb +#define XK_Hangul_U 0xecc +#define XK_Hangul_WEO 0xecd +#define XK_Hangul_WE 0xece +#define XK_Hangul_WI 0xecf +#define XK_Hangul_YU 0xed0 +#define XK_Hangul_EU 0xed1 +#define XK_Hangul_YI 0xed2 +#define XK_Hangul_I 0xed3 + +/* Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_Kiyeog 0xed4 +#define XK_Hangul_J_SsangKiyeog 0xed5 +#define XK_Hangul_J_KiyeogSios 0xed6 +#define XK_Hangul_J_Nieun 0xed7 +#define XK_Hangul_J_NieunJieuj 0xed8 +#define XK_Hangul_J_NieunHieuh 0xed9 +#define XK_Hangul_J_Dikeud 0xeda +#define XK_Hangul_J_Rieul 0xedb +#define XK_Hangul_J_RieulKiyeog 0xedc +#define XK_Hangul_J_RieulMieum 0xedd +#define XK_Hangul_J_RieulPieub 0xede +#define XK_Hangul_J_RieulSios 0xedf +#define XK_Hangul_J_RieulTieut 0xee0 +#define XK_Hangul_J_RieulPhieuf 0xee1 +#define XK_Hangul_J_RieulHieuh 0xee2 +#define XK_Hangul_J_Mieum 0xee3 +#define XK_Hangul_J_Pieub 0xee4 +#define XK_Hangul_J_PieubSios 0xee5 +#define XK_Hangul_J_Sios 0xee6 +#define XK_Hangul_J_SsangSios 0xee7 +#define XK_Hangul_J_Ieung 0xee8 +#define XK_Hangul_J_Jieuj 0xee9 +#define XK_Hangul_J_Cieuc 0xeea +#define XK_Hangul_J_Khieuq 0xeeb +#define XK_Hangul_J_Tieut 0xeec +#define XK_Hangul_J_Phieuf 0xeed +#define XK_Hangul_J_Hieuh 0xeee + +/* Ancient Hangul Consonant Characters */ +#define XK_Hangul_RieulYeorinHieuh 0xeef +#define XK_Hangul_SunkyeongeumMieum 0xef0 +#define XK_Hangul_SunkyeongeumPieub 0xef1 +#define XK_Hangul_PanSios 0xef2 +#define XK_Hangul_KkogjiDalrinIeung 0xef3 +#define XK_Hangul_SunkyeongeumPhieuf 0xef4 +#define XK_Hangul_YeorinHieuh 0xef5 + +/* Ancient Hangul Vowel Characters */ +#define XK_Hangul_AraeA 0xef6 +#define XK_Hangul_AraeAE 0xef7 + +/* Ancient Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_PanSios 0xef8 +#define XK_Hangul_J_KkogjiDalrinIeung 0xef9 +#define XK_Hangul_J_YeorinHieuh 0xefa + +/* Korean currency symbol */ +#define XK_Korean_Won 0xeff + +#endif /* XK_KOREAN */ + +/* + * Armenian + * Byte 3 = 0x14 + */ + +#ifdef XK_ARMENIAN +#define XK_Armenian_eternity 0x14a1 +#define XK_Armenian_ligature_ew 0x14a2 +#define XK_Armenian_full_stop 0x14a3 +#define XK_Armenian_verjaket 0x14a3 +#define XK_Armenian_parenright 0x14a4 +#define XK_Armenian_parenleft 0x14a5 +#define XK_Armenian_guillemotright 0x14a6 +#define XK_Armenian_guillemotleft 0x14a7 +#define XK_Armenian_em_dash 0x14a8 +#define XK_Armenian_dot 0x14a9 +#define XK_Armenian_mijaket 0x14a9 +#define XK_Armenian_separation_mark 0x14aa +#define XK_Armenian_but 0x14aa +#define XK_Armenian_comma 0x14ab +#define XK_Armenian_en_dash 0x14ac +#define XK_Armenian_hyphen 0x14ad +#define XK_Armenian_yentamna 0x14ad +#define XK_Armenian_ellipsis 0x14ae +#define XK_Armenian_exclam 0x14af +#define XK_Armenian_amanak 0x14af +#define XK_Armenian_accent 0x14b0 +#define XK_Armenian_shesht 0x14b0 +#define XK_Armenian_question 0x14b1 +#define XK_Armenian_paruyk 0x14b1 +#define XK_Armenian_AYB 0x14b2 +#define XK_Armenian_ayb 0x14b3 +#define XK_Armenian_BEN 0x14b4 +#define XK_Armenian_ben 0x14b5 +#define XK_Armenian_GIM 0x14b6 +#define XK_Armenian_gim 0x14b7 +#define XK_Armenian_DA 0x14b8 +#define XK_Armenian_da 0x14b9 +#define XK_Armenian_YECH 0x14ba +#define XK_Armenian_yech 0x14bb +#define XK_Armenian_ZA 0x14bc +#define XK_Armenian_za 0x14bd +#define XK_Armenian_E 0x14be +#define XK_Armenian_e 0x14bf +#define XK_Armenian_AT 0x14c0 +#define XK_Armenian_at 0x14c1 +#define XK_Armenian_TO 0x14c2 +#define XK_Armenian_to 0x14c3 +#define XK_Armenian_ZHE 0x14c4 +#define XK_Armenian_zhe 0x14c5 +#define XK_Armenian_INI 0x14c6 +#define XK_Armenian_ini 0x14c7 +#define XK_Armenian_LYUN 0x14c8 +#define XK_Armenian_lyun 0x14c9 +#define XK_Armenian_KHE 0x14ca +#define XK_Armenian_khe 0x14cb +#define XK_Armenian_TSA 0x14cc +#define XK_Armenian_tsa 0x14cd +#define XK_Armenian_KEN 0x14ce +#define XK_Armenian_ken 0x14cf +#define XK_Armenian_HO 0x14d0 +#define XK_Armenian_ho 0x14d1 +#define XK_Armenian_DZA 0x14d2 +#define XK_Armenian_dza 0x14d3 +#define XK_Armenian_GHAT 0x14d4 +#define XK_Armenian_ghat 0x14d5 +#define XK_Armenian_TCHE 0x14d6 +#define XK_Armenian_tche 0x14d7 +#define XK_Armenian_MEN 0x14d8 +#define XK_Armenian_men 0x14d9 +#define XK_Armenian_HI 0x14da +#define XK_Armenian_hi 0x14db +#define XK_Armenian_NU 0x14dc +#define XK_Armenian_nu 0x14dd +#define XK_Armenian_SHA 0x14de +#define XK_Armenian_sha 0x14df +#define XK_Armenian_VO 0x14e0 +#define XK_Armenian_vo 0x14e1 +#define XK_Armenian_CHA 0x14e2 +#define XK_Armenian_cha 0x14e3 +#define XK_Armenian_PE 0x14e4 +#define XK_Armenian_pe 0x14e5 +#define XK_Armenian_JE 0x14e6 +#define XK_Armenian_je 0x14e7 +#define XK_Armenian_RA 0x14e8 +#define XK_Armenian_ra 0x14e9 +#define XK_Armenian_SE 0x14ea +#define XK_Armenian_se 0x14eb +#define XK_Armenian_VEV 0x14ec +#define XK_Armenian_vev 0x14ed +#define XK_Armenian_TYUN 0x14ee +#define XK_Armenian_tyun 0x14ef +#define XK_Armenian_RE 0x14f0 +#define XK_Armenian_re 0x14f1 +#define XK_Armenian_TSO 0x14f2 +#define XK_Armenian_tso 0x14f3 +#define XK_Armenian_VYUN 0x14f4 +#define XK_Armenian_vyun 0x14f5 +#define XK_Armenian_PYUR 0x14f6 +#define XK_Armenian_pyur 0x14f7 +#define XK_Armenian_KE 0x14f8 +#define XK_Armenian_ke 0x14f9 +#define XK_Armenian_O 0x14fa +#define XK_Armenian_o 0x14fb +#define XK_Armenian_FE 0x14fc +#define XK_Armenian_fe 0x14fd +#define XK_Armenian_apostrophe 0x14fe +#define XK_Armenian_section_sign 0x14ff +#endif /* XK_ARMENIAN */ + +/* + * Georgian + * Byte 3 = 0x15 + */ + +#ifdef XK_GEORGIAN +#define XK_Georgian_an 0x15d0 +#define XK_Georgian_ban 0x15d1 +#define XK_Georgian_gan 0x15d2 +#define XK_Georgian_don 0x15d3 +#define XK_Georgian_en 0x15d4 +#define XK_Georgian_vin 0x15d5 +#define XK_Georgian_zen 0x15d6 +#define XK_Georgian_tan 0x15d7 +#define XK_Georgian_in 0x15d8 +#define XK_Georgian_kan 0x15d9 +#define XK_Georgian_las 0x15da +#define XK_Georgian_man 0x15db +#define XK_Georgian_nar 0x15dc +#define XK_Georgian_on 0x15dd +#define XK_Georgian_par 0x15de +#define XK_Georgian_zhar 0x15df +#define XK_Georgian_rae 0x15e0 +#define XK_Georgian_san 0x15e1 +#define XK_Georgian_tar 0x15e2 +#define XK_Georgian_un 0x15e3 +#define XK_Georgian_phar 0x15e4 +#define XK_Georgian_khar 0x15e5 +#define XK_Georgian_ghan 0x15e6 +#define XK_Georgian_qar 0x15e7 +#define XK_Georgian_shin 0x15e8 +#define XK_Georgian_chin 0x15e9 +#define XK_Georgian_can 0x15ea +#define XK_Georgian_jil 0x15eb +#define XK_Georgian_cil 0x15ec +#define XK_Georgian_char 0x15ed +#define XK_Georgian_xan 0x15ee +#define XK_Georgian_jhan 0x15ef +#define XK_Georgian_hae 0x15f0 +#define XK_Georgian_he 0x15f1 +#define XK_Georgian_hie 0x15f2 +#define XK_Georgian_we 0x15f3 +#define XK_Georgian_har 0x15f4 +#define XK_Georgian_hoe 0x15f5 +#define XK_Georgian_fi 0x15f6 +#endif /* XK_GEORGIAN */ + +/* + * Azeri (and other Turkic or Caucasian languages of ex-USSR) + * Byte 3 = 0x16 + */ + +#ifdef XK_CAUCASUS +/* latin */ +#define XK_Ccedillaabovedot 0x16a2 +#define XK_Xabovedot 0x16a3 +#define XK_Qabovedot 0x16a5 +#define XK_Ibreve 0x16a6 +#define XK_IE 0x16a7 +#define XK_UO 0x16a8 +#define XK_Zstroke 0x16a9 +#define XK_Gcaron 0x16aa +#define XK_Obarred 0x16af +#define XK_ccedillaabovedot 0x16b2 +#define XK_xabovedot 0x16b3 +#define XK_Ocaron 0x16b4 +#define XK_qabovedot 0x16b5 +#define XK_ibreve 0x16b6 +#define XK_ie 0x16b7 +#define XK_uo 0x16b8 +#define XK_zstroke 0x16b9 +#define XK_gcaron 0x16ba +#define XK_ocaron 0x16bd +#define XK_obarred 0x16bf +#define XK_SCHWA 0x16c6 +#define XK_schwa 0x16f6 +/* those are not really Caucasus, but I put them here for now */ +/* For Inupiak */ +#define XK_Lbelowdot 0x16d1 +#define XK_Lstrokebelowdot 0x16d2 +#define XK_lbelowdot 0x16e1 +#define XK_lstrokebelowdot 0x16e2 +/* For Guarani */ +#define XK_Gtilde 0x16d3 +#define XK_gtilde 0x16e3 +#endif /* XK_CAUCASUS */ + +/* + * Vietnamese + * Byte 3 = 0x1e + */ + +#ifdef XK_VIETNAMESE +#define XK_Abelowdot 0x1ea0 +#define XK_abelowdot 0x1ea1 +#define XK_Ahook 0x1ea2 +#define XK_ahook 0x1ea3 +#define XK_Acircumflexacute 0x1ea4 +#define XK_acircumflexacute 0x1ea5 +#define XK_Acircumflexgrave 0x1ea6 +#define XK_acircumflexgrave 0x1ea7 +#define XK_Acircumflexhook 0x1ea8 +#define XK_acircumflexhook 0x1ea9 +#define XK_Acircumflextilde 0x1eaa +#define XK_acircumflextilde 0x1eab +#define XK_Acircumflexbelowdot 0x1eac +#define XK_acircumflexbelowdot 0x1ead +#define XK_Abreveacute 0x1eae +#define XK_abreveacute 0x1eaf +#define XK_Abrevegrave 0x1eb0 +#define XK_abrevegrave 0x1eb1 +#define XK_Abrevehook 0x1eb2 +#define XK_abrevehook 0x1eb3 +#define XK_Abrevetilde 0x1eb4 +#define XK_abrevetilde 0x1eb5 +#define XK_Abrevebelowdot 0x1eb6 +#define XK_abrevebelowdot 0x1eb7 +#define XK_Ebelowdot 0x1eb8 +#define XK_ebelowdot 0x1eb9 +#define XK_Ehook 0x1eba +#define XK_ehook 0x1ebb +#define XK_Etilde 0x1ebc +#define XK_etilde 0x1ebd +#define XK_Ecircumflexacute 0x1ebe +#define XK_ecircumflexacute 0x1ebf +#define XK_Ecircumflexgrave 0x1ec0 +#define XK_ecircumflexgrave 0x1ec1 +#define XK_Ecircumflexhook 0x1ec2 +#define XK_ecircumflexhook 0x1ec3 +#define XK_Ecircumflextilde 0x1ec4 +#define XK_ecircumflextilde 0x1ec5 +#define XK_Ecircumflexbelowdot 0x1ec6 +#define XK_ecircumflexbelowdot 0x1ec7 +#define XK_Ihook 0x1ec8 +#define XK_ihook 0x1ec9 +#define XK_Ibelowdot 0x1eca +#define XK_ibelowdot 0x1ecb +#define XK_Obelowdot 0x1ecc +#define XK_obelowdot 0x1ecd +#define XK_Ohook 0x1ece +#define XK_ohook 0x1ecf +#define XK_Ocircumflexacute 0x1ed0 +#define XK_ocircumflexacute 0x1ed1 +#define XK_Ocircumflexgrave 0x1ed2 +#define XK_ocircumflexgrave 0x1ed3 +#define XK_Ocircumflexhook 0x1ed4 +#define XK_ocircumflexhook 0x1ed5 +#define XK_Ocircumflextilde 0x1ed6 +#define XK_ocircumflextilde 0x1ed7 +#define XK_Ocircumflexbelowdot 0x1ed8 +#define XK_ocircumflexbelowdot 0x1ed9 +#define XK_Ohornacute 0x1eda +#define XK_ohornacute 0x1edb +#define XK_Ohorngrave 0x1edc +#define XK_ohorngrave 0x1edd +#define XK_Ohornhook 0x1ede +#define XK_ohornhook 0x1edf +#define XK_Ohorntilde 0x1ee0 +#define XK_ohorntilde 0x1ee1 +#define XK_Ohornbelowdot 0x1ee2 +#define XK_ohornbelowdot 0x1ee3 +#define XK_Ubelowdot 0x1ee4 +#define XK_ubelowdot 0x1ee5 +#define XK_Uhook 0x1ee6 +#define XK_uhook 0x1ee7 +#define XK_Uhornacute 0x1ee8 +#define XK_uhornacute 0x1ee9 +#define XK_Uhorngrave 0x1eea +#define XK_uhorngrave 0x1eeb +#define XK_Uhornhook 0x1eec +#define XK_uhornhook 0x1eed +#define XK_Uhorntilde 0x1eee +#define XK_uhorntilde 0x1eef +#define XK_Uhornbelowdot 0x1ef0 +#define XK_uhornbelowdot 0x1ef1 +#define XK_Ybelowdot 0x1ef4 +#define XK_ybelowdot 0x1ef5 +#define XK_Yhook 0x1ef6 +#define XK_yhook 0x1ef7 +#define XK_Ytilde 0x1ef8 +#define XK_ytilde 0x1ef9 +#define XK_Ohorn 0x1efa /* U+01a0 */ +#define XK_ohorn 0x1efb /* U+01a1 */ +#define XK_Uhorn 0x1efc /* U+01af */ +#define XK_uhorn 0x1efd /* U+01b0 */ + +#define XK_combining_tilde 0x1e9f /* U+0303 */ +#define XK_combining_grave 0x1ef2 /* U+0300 */ +#define XK_combining_acute 0x1ef3 /* U+0301 */ +#define XK_combining_hook 0x1efe /* U+0309 */ +#define XK_combining_belowdot 0x1eff /* U+0323 */ +#endif /* XK_VIETNAMESE */ + +#ifdef XK_CURRENCY +#define XK_EcuSign 0x20a0 +#define XK_ColonSign 0x20a1 +#define XK_CruzeiroSign 0x20a2 +#define XK_FFrancSign 0x20a3 +#define XK_LiraSign 0x20a4 +#define XK_MillSign 0x20a5 +#define XK_NairaSign 0x20a6 +#define XK_PesetaSign 0x20a7 +#define XK_RupeeSign 0x20a8 +#define XK_WonSign 0x20a9 +#define XK_NewSheqelSign 0x20aa +#define XK_DongSign 0x20ab +#define XK_EuroSign 0x20ac +#endif diff --git a/console-client/xkb/ks_tables.h b/console-client/xkb/ks_tables.h new file mode 100644 index 00000000..f1edbc53 --- /dev/null +++ b/console-client/xkb/ks_tables.h @@ -0,0 +1,2380 @@ +/* This file is generated from keysymdef.h. */ +/* Do not edit. */ + +#ifdef NEEDKTABLE +const unsigned char _XkeyTable[] = { +0, +0x80, 0xaa, 0x00, 0x00, 'V','o','i','d','S','y','m','b','o','l',0, +0xa3, 0xff, 0xff, 0x08, 'B','a','c','k','S','p','a','c','e',0, +0x02, 0x74, 0xff, 0x09, 'T','a','b',0, +0x5a, 0x42, 0xff, 0x0a, 'L','i','n','e','f','e','e','d',0, +0x0a, 0x58, 0xff, 0x0b, 'C','l','e','a','r',0, +0x17, 0x56, 0xff, 0x0d, 'R','e','t','u','r','n',0, +0x0b, 0x27, 0xff, 0x13, 'P','a','u','s','e',0, +0xef, 0x3d, 0xff, 0x14, 'S','c','r','o','l','l','_','L','o','c','k',0, +0x30, 0x8b, 0xff, 0x15, 'S','y','s','_','R','e','q',0, +0x15, 0xb1, 0xff, 0x1b, 'E','s','c','a','p','e',0, +0x15, 0x11, 0xff, 0xff, 'D','e','l','e','t','e',0, +0xbd, 0x77, 0xff, 0x20, 'M','u','l','t','i','_','k','e','y',0, +0xad, 0x3e, 0xff, 0x37, 'C','o','d','e','i','n','p','u','t',0, +0x1a, 0x01, 0xff, 0x3c, 'S','i','n','g','l','e','C','a','n','d','i','d','a','t','e',0, +0x32, 0x01, 0xff, 0x3d, 'M','u','l','t','i','p','l','e','C','a','n','d','i','d','a','t','e',0, +0x6a, 0x01, 0xff, 0x3e, 'P','r','e','v','i','o','u','s','C','a','n','d','i','d','a','t','e',0, +0x0a, 0xad, 0xff, 0x21, 'K','a','n','j','i',0, +0x5d, 0x5c, 0xff, 0x22, 'M','u','h','e','n','k','a','n',0, +0xbe, 0xc1, 0xff, 0x23, 'H','e','n','k','a','n','_','M','o','d','e',0, +0x15, 0x9c, 0xff, 0x23, 'H','e','n','k','a','n',0, +0x17, 0x59, 0xff, 0x24, 'R','o','m','a','j','i',0, +0x58, 0x89, 0xff, 0x25, 'H','i','r','a','g','a','n','a',0, +0x58, 0x69, 0xff, 0x26, 'K','a','t','a','k','a','n','a',0, +0xc9, 0x69, 0xff, 0x27, 'H','i','r','a','g','a','n','a','_','K','a','t','a','k','a','n','a',0, +0x30, 0x27, 0xff, 0x28, 'Z','e','n','k','a','k','u',0, +0x2b, 0x27, 0xff, 0x29, 'H','a','n','k','a','k','u',0, +0x81, 0xa7, 0xff, 0x2a, 'Z','e','n','k','a','k','u','_','H','a','n','k','a','k','u',0, +0x30, 0xc7, 0xff, 0x2b, 'T','o','u','r','o','k','u',0, +0x16, 0x75, 0xff, 0x2c, 'M','a','s','s','y','o',0, +0xae, 0x5d, 0xff, 0x2d, 'K','a','n','a','_','L','o','c','k',0, +0x5d, 0x74, 0xff, 0x2e, 'K','a','n','a','_','S','h','i','f','t',0, +0x60, 0xf4, 0xff, 0x2f, 'E','i','s','u','_','S','h','i','f','t',0, +0xc6, 0xc1, 0xff, 0x30, 'E','i','s','u','_','t','o','g','g','l','e',0, +0x82, 0xef, 0xff, 0x37, 'K','a','n','j','i','_','B','a','n','g','o','u',0, +0x5f, 0x43, 0xff, 0x3d, 'Z','e','n','_','K','o','h','o',0, +0x56, 0xa3, 0xff, 0x3e, 'M','a','e','_','K','o','h','o',0, +0x05, 0x3b, 0xff, 0x50, 'H','o','m','e',0, +0x05, 0x34, 0xff, 0x51, 'L','e','f','t',0, +0x01, 0x1a, 0xff, 0x52, 'U','p',0, +0x0b, 0x48, 0xff, 0x53, 'R','i','g','h','t',0, +0x05, 0x38, 0xff, 0x54, 'D','o','w','n',0, +0x0b, 0x84, 0xff, 0x55, 'P','r','i','o','r',0, +0x2c, 0x4e, 0xff, 0x55, 'P','a','g','e','_','U','p',0, +0x05, 0x68, 0xff, 0x56, 'N','e','x','t',0, +0xb2, 0x08, 0xff, 0x56, 'P','a','g','e','_','D','o','w','n',0, +0x02, 0x54, 0xff, 0x57, 'E','n','d',0, +0x0a, 0x24, 0xff, 0x58, 'B','e','g','i','n',0, +0x16, 0xde, 0xff, 0x60, 'S','e','l','e','c','t',0, +0x0b, 0x84, 0xff, 0x61, 'P','r','i','n','t',0, +0x2c, 0xc9, 0xff, 0x62, 'E','x','e','c','u','t','e',0, +0x16, 0x84, 0xff, 0x63, 'I','n','s','e','r','t',0, +0x05, 0x97, 0xff, 0x65, 'U','n','d','o',0, +0x05, 0x5b, 0xff, 0x66, 'R','e','d','o',0, +0x05, 0x4d, 0xff, 0x67, 'M','e','n','u',0, +0x05, 0x14, 0xff, 0x68, 'F','i','n','d',0, +0x14, 0xa2, 0xff, 0x69, 'C','a','n','c','e','l',0, +0x05, 0x1c, 0xff, 0x6a, 'H','e','l','p',0, +0x0a, 0x71, 0xff, 0x6b, 'B','r','e','a','k',0, +0xdc, 0x56, 0xff, 0x7e, 'M','o','d','e','_','s','w','i','t','c','h',0, +0xbf, 0xd6, 0xff, 0x7e, 's','c','r','i','p','t','_','s','w','i','t','c','h',0, +0x5d, 0x1d, 0xff, 0x7f, 'N','u','m','_','L','o','c','k',0, +0x50, 0xbf, 0xff, 0x80, 'K','P','_','S','p','a','c','e',0, +0x13, 0xcc, 0xff, 0x89, 'K','P','_','T','a','b',0, +0x50, 0x2c, 0xff, 0x8d, 'K','P','_','E','n','t','e','r',0, +0x09, 0x69, 0xff, 0x91, 'K','P','_','F','1',0, +0x09, 0x6a, 0xff, 0x92, 'K','P','_','F','2',0, +0x09, 0x6b, 0xff, 0x93, 'K','P','_','F','3',0, +0x09, 0x6c, 0xff, 0x94, 'K','P','_','F','4',0, +0x27, 0xeb, 0xff, 0x95, 'K','P','_','H','o','m','e',0, +0x27, 0xe4, 0xff, 0x96, 'K','P','_','L','e','f','t',0, +0x09, 0xc6, 0xff, 0x97, 'K','P','_','U','p',0, +0x50, 0xa8, 0xff, 0x98, 'K','P','_','R','i','g','h','t',0, +0x27, 0xe8, 0xff, 0x99, 'K','P','_','D','o','w','n',0, +0x50, 0xe4, 0xff, 0x9a, 'K','P','_','P','r','i','o','r',0, +0x41, 0xce, 0xff, 0x9a, 'K','P','_','P','a','g','e','_','U','p',0, +0x28, 0x18, 0xff, 0x9b, 'K','P','_','N','e','x','t',0, +0x08, 0x08, 0xff, 0x9b, 'K','P','_','P','a','g','e','_','D','o','w','n',0, +0x13, 0xac, 0xff, 0x9c, 'K','P','_','E','n','d',0, +0x4f, 0x84, 0xff, 0x9d, 'K','P','_','B','e','g','i','n',0, +0xa1, 0x44, 0xff, 0x9e, 'K','P','_','I','n','s','e','r','t',0, +0x9f, 0xd1, 0xff, 0x9f, 'K','P','_','D','e','l','e','t','e',0, +0x50, 0x3a, 0xff, 0xbd, 'K','P','_','E','q','u','a','l',0, +0x89, 0xd9, 0xff, 0xaa, 'K','P','_','M','u','l','t','i','p','l','y',0, +0x13, 0x88, 0xff, 0xab, 'K','P','_','A','d','d',0, +0x10, 0xe8, 0xff, 0xac, 'K','P','_','S','e','p','a','r','a','t','o','r',0, +0x8b, 0x8e, 0xff, 0xad, 'K','P','_','S','u','b','t','r','a','c','t',0, +0x3f, 0x7a, 0xff, 0xae, 'K','P','_','D','e','c','i','m','a','l',0, +0xa0, 0x51, 0xff, 0xaf, 'K','P','_','D','i','v','i','d','e',0, +0x04, 0x86, 0xff, 0xb0, 'K','P','_','0',0, +0x04, 0x87, 0xff, 0xb1, 'K','P','_','1',0, +0x04, 0x88, 0xff, 0xb2, 'K','P','_','2',0, +0x04, 0x89, 0xff, 0xb3, 'K','P','_','3',0, +0x04, 0x8a, 0xff, 0xb4, 'K','P','_','4',0, +0x04, 0x8b, 0xff, 0xb5, 'K','P','_','5',0, +0x04, 0x8c, 0xff, 0xb6, 'K','P','_','6',0, +0x04, 0x8d, 0xff, 0xb7, 'K','P','_','7',0, +0x04, 0x8e, 0xff, 0xb8, 'K','P','_','8',0, +0x04, 0x8f, 0xff, 0xb9, 'K','P','_','9',0, +0x00, 0xbd, 0xff, 0xbe, 'F','1',0, +0x00, 0xbe, 0xff, 0xbf, 'F','2',0, +0x00, 0xbf, 0xff, 0xc0, 'F','3',0, +0x00, 0xc0, 0xff, 0xc1, 'F','4',0, +0x00, 0xc1, 0xff, 0xc2, 'F','5',0, +0x00, 0xc2, 0xff, 0xc3, 'F','6',0, +0x00, 0xc3, 0xff, 0xc4, 'F','7',0, +0x00, 0xc4, 0xff, 0xc5, 'F','8',0, +0x00, 0xc5, 0xff, 0xc6, 'F','9',0, +0x01, 0xaa, 0xff, 0xc7, 'F','1','0',0, +0x01, 0xab, 0xff, 0xc8, 'F','1','1',0, +0x00, 0xc9, 0xff, 0xc8, 'L','1',0, +0x01, 0xac, 0xff, 0xc9, 'F','1','2',0, +0x00, 0xca, 0xff, 0xc9, 'L','2',0, +0x01, 0xad, 0xff, 0xca, 'F','1','3',0, +0x00, 0xcb, 0xff, 0xca, 'L','3',0, +0x01, 0xae, 0xff, 0xcb, 'F','1','4',0, +0x00, 0xcc, 0xff, 0xcb, 'L','4',0, +0x01, 0xaf, 0xff, 0xcc, 'F','1','5',0, +0x00, 0xcd, 0xff, 0xcc, 'L','5',0, +0x01, 0xb0, 0xff, 0xcd, 'F','1','6',0, +0x00, 0xce, 0xff, 0xcd, 'L','6',0, +0x01, 0xb1, 0xff, 0xce, 'F','1','7',0, +0x00, 0xcf, 0xff, 0xce, 'L','7',0, +0x01, 0xb2, 0xff, 0xcf, 'F','1','8',0, +0x00, 0xd0, 0xff, 0xcf, 'L','8',0, +0x01, 0xb3, 0xff, 0xd0, 'F','1','9',0, +0x00, 0xd1, 0xff, 0xd0, 'L','9',0, +0x01, 0xac, 0xff, 0xd1, 'F','2','0',0, +0x01, 0xc2, 0xff, 0xd1, 'L','1','0',0, +0x01, 0xad, 0xff, 0xd2, 'F','2','1',0, +0x00, 0xd5, 0xff, 0xd2, 'R','1',0, +0x01, 0xae, 0xff, 0xd3, 'F','2','2',0, +0x00, 0xd6, 0xff, 0xd3, 'R','2',0, +0x01, 0xaf, 0xff, 0xd4, 'F','2','3',0, +0x00, 0xd7, 0xff, 0xd4, 'R','3',0, +0x01, 0xb0, 0xff, 0xd5, 'F','2','4',0, +0x00, 0xd8, 0xff, 0xd5, 'R','4',0, +0x01, 0xb1, 0xff, 0xd6, 'F','2','5',0, +0x00, 0xd9, 0xff, 0xd6, 'R','5',0, +0x01, 0xb2, 0xff, 0xd7, 'F','2','6',0, +0x00, 0xda, 0xff, 0xd7, 'R','6',0, +0x01, 0xb3, 0xff, 0xd8, 'F','2','7',0, +0x00, 0xdb, 0xff, 0xd8, 'R','7',0, +0x01, 0xb4, 0xff, 0xd9, 'F','2','8',0, +0x00, 0xdc, 0xff, 0xd9, 'R','8',0, +0x01, 0xb5, 0xff, 0xda, 'F','2','9',0, +0x00, 0xdd, 0xff, 0xda, 'R','9',0, +0x01, 0xae, 0xff, 0xdb, 'F','3','0',0, +0x01, 0xda, 0xff, 0xdb, 'R','1','0',0, +0x01, 0xaf, 0xff, 0xdc, 'F','3','1',0, +0x01, 0xdb, 0xff, 0xdc, 'R','1','1',0, +0x01, 0xb0, 0xff, 0xdd, 'F','3','2',0, +0x01, 0xdc, 0xff, 0xdd, 'R','1','2',0, +0x01, 0xb1, 0xff, 0xde, 'F','3','3',0, +0x01, 0xdd, 0xff, 0xde, 'R','1','3',0, +0x01, 0xb2, 0xff, 0xdf, 'F','3','4',0, +0x01, 0xde, 0xff, 0xdf, 'R','1','4',0, +0x01, 0xb3, 0xff, 0xe0, 'F','3','5',0, +0x01, 0xdf, 0xff, 0xe0, 'R','1','5',0, +0x2e, 0x5a, 0xff, 0xe1, 'S','h','i','f','t','_','L',0, +0x2e, 0x60, 0xff, 0xe2, 'S','h','i','f','t','_','R',0, +0xb1, 0xd2, 0xff, 0xe3, 'C','o','n','t','r','o','l','_','L',0, +0xb1, 0xd8, 0xff, 0xe4, 'C','o','n','t','r','o','l','_','R',0, +0xa9, 0x1d, 0xff, 0xe5, 'C','a','p','s','_','L','o','c','k',0, +0x75, 0xbd, 0xff, 0xe6, 'S','h','i','f','t','_','L','o','c','k',0, +0x16, 0x1e, 0xff, 0xe7, 'M','e','t','a','_','L',0, +0x16, 0x24, 0xff, 0xe8, 'M','e','t','a','_','R',0, +0x0a, 0x4a, 0xff, 0xe9, 'A','l','t','_','L',0, +0x0a, 0x50, 0xff, 0xea, 'A','l','t','_','R',0, +0x30, 0x5a, 0xff, 0xeb, 'S','u','p','e','r','_','L',0, +0x30, 0x60, 0xff, 0xec, 'S','u','p','e','r','_','R',0, +0x2e, 0x1a, 0xff, 0xed, 'H','y','p','e','r','_','L',0, +0x2e, 0x20, 0xff, 0xee, 'H','y','p','e','r','_','R',0, +0x4e, 0x5d, 0xfe, 0x01, 'I','S','O','_','L','o','c','k',0, +0xae, 0x26, 0xfe, 0x02, 'I','S','O','_','L','e','v','e','l','2','_','L','a','t','c','h',0, +0xae, 0xf4, 0xfe, 0x03, 'I','S','O','_','L','e','v','e','l','3','_','S','h','i','f','t',0, +0xae, 0x66, 0xfe, 0x04, 'I','S','O','_','L','e','v','e','l','3','_','L','a','t','c','h',0, +0x57, 0x1d, 0xfe, 0x05, 'I','S','O','_','L','e','v','e','l','3','_','L','o','c','k',0, +0x64, 0xb4, 0xff, 0x7e, 'I','S','O','_','G','r','o','u','p','_','S','h','i','f','t',0, +0x64, 0x26, 0xfe, 0x06, 'I','S','O','_','G','r','o','u','p','_','L','a','t','c','h',0, +0xb1, 0xfd, 0xfe, 0x07, 'I','S','O','_','G','r','o','u','p','_','L','o','c','k',0, +0xb4, 0xf6, 0xfe, 0x08, 'I','S','O','_','N','e','x','t','_','G','r','o','u','p',0, +0xa9, 0xfd, 0xfe, 0x09, 'I','S','O','_','N','e','x','t','_','G','r','o','u','p','_','L','o','c','k',0, +0xbc, 0xf6, 0xfe, 0x0a, 'I','S','O','_','P','r','e','v','_','G','r','o','u','p',0, +0xa9, 0xfd, 0xfe, 0x0b, 'I','S','O','_','P','r','e','v','_','G','r','o','u','p','_','L','o','c','k',0, +0x51, 0x76, 0xfe, 0x0c, 'I','S','O','_','F','i','r','s','t','_','G','r','o','u','p',0, +0x39, 0xfd, 0xfe, 0x0d, 'I','S','O','_','F','i','r','s','t','_','G','r','o','u','p','_','L','o','c','k',0, +0xaa, 0x76, 0xfe, 0x0e, 'I','S','O','_','L','a','s','t','_','G','r','o','u','p',0, +0x59, 0xfd, 0xfe, 0x0f, 'I','S','O','_','L','a','s','t','_','G','r','o','u','p','_','L','o','c','k',0, +0xe9, 0xac, 0xfe, 0x20, 'I','S','O','_','L','e','f','t','_','T','a','b',0, +0xe1, 0x3e, 0xfe, 0x21, 'I','S','O','_','M','o','v','e','_','L','i','n','e','_','U','p',0, +0x85, 0xc8, 0xfe, 0x22, 'I','S','O','_','M','o','v','e','_','L','i','n','e','_','D','o','w','n',0, +0x8e, 0x3e, 0xfe, 0x23, 'I','S','O','_','P','a','r','t','i','a','l','_','L','i','n','e','_','U','p',0, +0x39, 0xc8, 0xfe, 0x24, 'I','S','O','_','P','a','r','t','i','a','l','_','L','i','n','e','_','D','o','w','n',0, +0x83, 0x04, 0xfe, 0x25, 'I','S','O','_','P','a','r','t','i','a','l','_','S','p','a','c','e','_','L','e','f','t',0, +0x06, 0xe8, 0xfe, 0x26, 'I','S','O','_','P','a','r','t','i','a','l','_','S','p','a','c','e','_','R','i','g','h','t',0, +0xe6, 0xa4, 0xfe, 0x27, 'I','S','O','_','S','e','t','_','M','a','r','g','i','n','_','L','e','f','t',0, +0xce, 0x28, 0xfe, 0x28, 'I','S','O','_','S','e','t','_','M','a','r','g','i','n','_','R','i','g','h','t',0, +0x36, 0xa4, 0xfe, 0x29, 'I','S','O','_','R','e','l','e','a','s','e','_','M','a','r','g','i','n','_','L','e','f','t',0, +0x6e, 0x28, 0xfe, 0x2a, 'I','S','O','_','R','e','l','e','a','s','e','_','M','a','r','g','i','n','_','R','i','g','h','t',0, +0x48, 0x2b, 0xfe, 0x2b, 'I','S','O','_','R','e','l','e','a','s','e','_','B','o','t','h','_','M','a','r','g','i','n','s',0, +0xae, 0xa4, 0xfe, 0x2c, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','L','e','f','t',0, +0x5e, 0x28, 0xfe, 0x2d, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','R','i','g','h','t',0, +0xeb, 0x76, 0xfe, 0x2e, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','U','p',0, +0xae, 0xa8, 0xfe, 0x2f, 'I','S','O','_','F','a','s','t','_','C','u','r','s','o','r','_','D','o','w','n',0, +0x81, 0x05, 0xfe, 0x30, 'I','S','O','_','C','o','n','t','i','n','u','o','u','s','_','U','n','d','e','r','l','i','n','e',0, +0x81, 0x05, 0xfe, 0x31, 'I','S','O','_','D','i','s','c','o','n','t','i','n','u','o','u','s','_','U','n','d','e','r','l','i','n','e',0, +0xd3, 0x25, 0xfe, 0x32, 'I','S','O','_','E','m','p','h','a','s','i','z','e',0, +0xe3, 0xde, 0xfe, 0x33, 'I','S','O','_','C','e','n','t','e','r','_','O','b','j','e','c','t',0, +0x9c, 0xec, 0xfe, 0x34, 'I','S','O','_','E','n','t','e','r',0, +0x8f, 0x35, 0xfe, 0x50, 'd','e','a','d','_','g','r','a','v','e',0, +0x8e, 0xa9, 0xfe, 0x51, 'd','e','a','d','_','a','c','u','t','e',0, +0xe8, 0x52, 0xfe, 0x52, 'd','e','a','d','_','c','i','r','c','u','m','f','l','e','x',0, +0x8f, 0xc5, 0xfe, 0x53, 'd','e','a','d','_','t','i','l','d','e',0, +0x1e, 0x9c, 0xfe, 0x54, 'd','e','a','d','_','m','a','c','r','o','n',0, +0x8e, 0xf5, 0xfe, 0x55, 'd','e','a','d','_','b','r','e','v','e',0, +0x77, 0x4a, 0xfe, 0x56, 'd','e','a','d','_','a','b','o','v','e','d','o','t',0, +0xf0, 0xb9, 0xfe, 0x57, 'd','e','a','d','_','d','i','a','e','r','e','s','i','s',0, +0xef, 0x47, 0xfe, 0x58, 'd','e','a','d','_','a','b','o','v','e','r','i','n','g',0, +0xdf, 0xe9, 0xfe, 0x59, 'd','e','a','d','_','d','o','u','b','l','e','a','c','u','t','e',0, +0x8e, 0xac, 0xfe, 0x5a, 'd','e','a','d','_','c','a','r','o','n',0, +0x3b, 0x51, 0xfe, 0x5b, 'd','e','a','d','_','c','e','d','i','l','l','a',0, +0x1f, 0x75, 0xfe, 0x5c, 'd','e','a','d','_','o','g','o','n','e','k',0, +0xc7, 0x7d, 0xfe, 0x5d, 'd','e','a','d','_','i','o','t','a',0, +0x36, 0x1c, 0xfe, 0x5e, 'd','e','a','d','_','v','o','i','c','e','d','_','s','o','u','n','d',0, +0xf6, 0x1c, 0xfe, 0x5f, 'd','e','a','d','_','s','e','m','i','v','o','i','c','e','d','_','s','o','u','n','d',0, +0x78, 0x4a, 0xfe, 0x60, 'd','e','a','d','_','b','e','l','o','w','d','o','t',0, +0xc7, 0x75, 0xfe, 0x61, 'd','e','a','d','_','h','o','o','k',0, +0xc7, 0x7e, 0xfe, 0x62, 'd','e','a','d','_','h','o','r','n',0, +0x1f, 0xac, 0xfe, 0xd0, 'F','i','r','s','t','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0, +0x1f, 0xac, 0xfe, 0xd1, 'P','r','e','v','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0, +0x1f, 0xac, 0xfe, 0xd2, 'N','e','x','t','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0, +0x1f, 0xac, 0xfe, 0xd4, 'L','a','s','t','_','V','i','r','t','u','a','l','_','S','c','r','e','e','n',0, +0xe7, 0x94, 0xfe, 0xd5, 'T','e','r','m','i','n','a','t','e','_','S','e','r','v','e','r',0, +0xae, 0x0d, 0xfe, 0x70, 'A','c','c','e','s','s','X','_','E','n','a','b','l','e',0, +0x1f, 0x8d, 0xfe, 0x71, 'A','c','c','e','s','s','X','_','F','e','e','d','b','a','c','k','_','E','n','a','b','l','e',0, +0xa5, 0x8d, 0xfe, 0x72, 'R','e','p','e','a','t','K','e','y','s','_','E','n','a','b','l','e',0, +0xbd, 0x8d, 0xfe, 0x73, 'S','l','o','w','K','e','y','s','_','E','n','a','b','l','e',0, +0xad, 0x8d, 0xfe, 0x74, 'B','o','u','n','c','e','K','e','y','s','_','E','n','a','b','l','e',0, +0xed, 0x8d, 0xfe, 0x75, 'S','t','i','c','k','y','K','e','y','s','_','E','n','a','b','l','e',0, +0x0d, 0x8d, 0xfe, 0x76, 'M','o','u','s','e','K','e','y','s','_','E','n','a','b','l','e',0, +0x32, 0x0d, 0xfe, 0x77, 'M','o','u','s','e','K','e','y','s','_','A','c','c','e','l','_','E','n','a','b','l','e',0, +0x90, 0x8d, 0xfe, 0x78, 'O','v','e','r','l','a','y','1','_','E','n','a','b','l','e',0, +0x91, 0x0d, 0xfe, 0x79, 'O','v','e','r','l','a','y','2','_','E','n','a','b','l','e',0, +0x09, 0x0d, 0xfe, 0x7a, 'A','u','d','i','b','l','e','B','e','l','l','_','E','n','a','b','l','e',0, +0xe8, 0xa4, 0xfe, 0xe0, 'P','o','i','n','t','e','r','_','L','e','f','t',0, +0xd2, 0x28, 0xfe, 0xe1, 'P','o','i','n','t','e','r','_','R','i','g','h','t',0, +0x79, 0xf6, 0xfe, 0xe2, 'P','o','i','n','t','e','r','_','U','p',0, +0xe8, 0xa8, 0xfe, 0xe3, 'P','o','i','n','t','e','r','_','D','o','w','n',0, +0xa4, 0x94, 0xfe, 0xe4, 'P','o','i','n','t','e','r','_','U','p','L','e','f','t',0, +0x4a, 0x08, 0xfe, 0xe5, 'P','o','i','n','t','e','r','_','U','p','R','i','g','h','t',0, +0x8f, 0xb4, 0xfe, 0xe6, 'P','o','i','n','t','e','r','_','D','o','w','n','L','e','f','t',0, +0x20, 0x48, 0xfe, 0xe7, 'P','o','i','n','t','e','r','_','D','o','w','n','R','i','g','h','t',0, +0x8c, 0x74, 0xfe, 0xe8, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','_','D','f','l','t',0, +0x48, 0x49, 0xfe, 0xe9, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','1',0, +0x48, 0x4a, 0xfe, 0xea, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','2',0, +0x48, 0x4b, 0xfe, 0xeb, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','3',0, +0x48, 0x4c, 0xfe, 0xec, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','4',0, +0x48, 0x4d, 0xfe, 0xed, 'P','o','i','n','t','e','r','_','B','u','t','t','o','n','5',0, +0x37, 0x94, 0xfe, 0xee, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','_','D','f','l','t',0, +0x12, 0xfb, 0xfe, 0xef, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','1',0, +0x12, 0xfc, 0xfe, 0xf0, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','2',0, +0x12, 0xfd, 0xfe, 0xf1, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','3',0, +0x12, 0xfe, 0xfe, 0xf2, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','4',0, +0x12, 0xff, 0xfe, 0xf3, 'P','o','i','n','t','e','r','_','D','b','l','C','l','i','c','k','5',0, +0x1b, 0x14, 0xfe, 0xf4, 'P','o','i','n','t','e','r','_','D','r','a','g','_','D','f','l','t',0, +0xd1, 0x33, 0xfe, 0xf5, 'P','o','i','n','t','e','r','_','D','r','a','g','1',0, +0xd1, 0x34, 0xfe, 0xf6, 'P','o','i','n','t','e','r','_','D','r','a','g','2',0, +0xd1, 0x35, 0xfe, 0xf7, 'P','o','i','n','t','e','r','_','D','r','a','g','3',0, +0xd1, 0x36, 0xfe, 0xf8, 'P','o','i','n','t','e','r','_','D','r','a','g','4',0, +0xd1, 0x37, 0xfe, 0xfd, 'P','o','i','n','t','e','r','_','D','r','a','g','5',0, +0x36, 0x21, 0xfe, 0xf9, 'P','o','i','n','t','e','r','_','E','n','a','b','l','e','K','e','y','s',0, +0x25, 0xf1, 0xfe, 0xfa, 'P','o','i','n','t','e','r','_','A','c','c','e','l','e','r','a','t','e',0, +0x65, 0x48, 0xfe, 0xfb, 'P','o','i','n','t','e','r','_','D','f','l','t','B','t','n','N','e','x','t',0, +0x65, 0x68, 0xfe, 0xfc, 'P','o','i','n','t','e','r','_','D','f','l','t','B','t','n','P','r','e','v',0, +0x6a, 0x79, 0xfd, 0x01, '3','2','7','0','_','D','u','p','l','i','c','a','t','e',0, +0x62, 0xbb, 0xfd, 0x02, '3','2','7','0','_','F','i','e','l','d','M','a','r','k',0, +0xad, 0x82, 0xfd, 0x03, '3','2','7','0','_','R','i','g','h','t','2',0, +0xd5, 0xfa, 0xfd, 0x04, '3','2','7','0','_','L','e','f','t','2',0, +0x56, 0x1c, 0xfd, 0x05, '3','2','7','0','_','B','a','c','k','T','a','b',0, +0xb2, 0x70, 0xfd, 0x06, '3','2','7','0','_','E','r','a','s','e','E','O','F',0, +0xcc, 0xfe, 0xfd, 0x07, '3','2','7','0','_','E','r','a','s','e','I','n','p','u','t',0, +0xd6, 0xb2, 0xfd, 0x08, '3','2','7','0','_','R','e','s','e','t',0, +0x6b, 0x52, 0xfd, 0x09, '3','2','7','0','_','Q','u','i','t',0, +0x34, 0xcb, 0xfd, 0x0a, '3','2','7','0','_','P','A','1',0, +0x34, 0xcc, 0xfd, 0x0b, '3','2','7','0','_','P','A','2',0, +0x34, 0xcd, 0xfd, 0x0c, '3','2','7','0','_','P','A','3',0, +0x6b, 0x3e, 0xfd, 0x0d, '3','2','7','0','_','T','e','s','t',0, +0x6a, 0xde, 0xfd, 0x0e, '3','2','7','0','_','A','t','t','n',0, +0xad, 0xeb, 0xfd, 0x0f, '3','2','7','0','_','C','u','r','s','o','r','B','l','i','n','k',0, +0x60, 0x5c, 0xfd, 0x10, '3','2','7','0','_','A','l','t','C','u','r','s','o','r',0, +0xb3, 0x45, 0xfd, 0x11, '3','2','7','0','_','K','e','y','C','l','i','c','k',0, +0x6b, 0x1e, 0xfd, 0x12, '3','2','7','0','_','J','u','m','p',0, +0xd5, 0xf4, 0xfd, 0x13, '3','2','7','0','_','I','d','e','n','t',0, +0x6b, 0x51, 0xfd, 0x14, '3','2','7','0','_','R','u','l','e',0, +0x6a, 0xdd, 0xfd, 0x15, '3','2','7','0','_','C','o','p','y',0, +0x6b, 0x1b, 0xfd, 0x16, '3','2','7','0','_','P','l','a','y',0, +0xd6, 0xe2, 0xfd, 0x17, '3','2','7','0','_','S','e','t','u','p',0, +0xad, 0x6c, 0xfd, 0x18, '3','2','7','0','_','R','e','c','o','r','d',0, +0xfb, 0xac, 0xfd, 0x19, '3','2','7','0','_','C','h','a','n','g','e','S','c','r','e','e','n',0, +0xc2, 0xcc, 0xfd, 0x1a, '3','2','7','0','_','D','e','l','e','t','e','W','o','r','d',0, +0xb2, 0x5e, 0xfd, 0x1b, '3','2','7','0','_','E','x','S','e','l','e','c','t',0, +0x5d, 0xde, 0xfd, 0x1c, '3','2','7','0','_','C','u','r','s','o','r','S','e','l','e','c','t',0, +0xcf, 0xec, 0xfd, 0x1d, '3','2','7','0','_','P','r','i','n','t','S','c','r','e','e','n',0, +0xd6, 0x2c, 0xfd, 0x1e, '3','2','7','0','_','E','n','t','e','r',0, +0x0d, 0x5f, 0x00, 0x20, 's','p','a','c','e',0, +0x1a, 0x17, 0x00, 0x21, 'e','x','c','l','a','m',0, +0x70, 0xc8, 0x00, 0x22, 'q','u','o','t','e','d','b','l',0, +0xba, 0x38, 0x00, 0x23, 'n','u','m','b','e','r','s','i','g','n',0, +0x19, 0xb4, 0x00, 0x24, 'd','o','l','l','a','r',0, +0x35, 0xbc, 0x00, 0x25, 'p','e','r','c','e','n','t',0, +0xcd, 0x9c, 0x00, 0x26, 'a','m','p','e','r','s','a','n','d',0, +0xa2, 0x4d, 0x00, 0x27, 'a','p','o','s','t','r','o','p','h','e',0, +0xc5, 0x68, 0x00, 0x27, 'q','u','o','t','e','r','i','g','h','t',0, +0xd6, 0xb4, 0x00, 0x28, 'p','a','r','e','n','l','e','f','t',0, +0xae, 0x48, 0x00, 0x29, 'p','a','r','e','n','r','i','g','h','t',0, +0x68, 0x95, 0x00, 0x2a, 'a','s','t','e','r','i','s','k',0, +0x06, 0x8d, 0x00, 0x2b, 'p','l','u','s',0, +0x0c, 0x97, 0x00, 0x2c, 'c','o','m','m','a',0, +0x0d, 0x2d, 0x00, 0x2d, 'm','i','n','u','s',0, +0x1a, 0xc6, 0x00, 0x2e, 'p','e','r','i','o','d',0, +0x0d, 0x62, 0x00, 0x2f, 's','l','a','s','h',0, +0x00, 0x30, 0x00, 0x30, '0',0, +0x00, 0x31, 0x00, 0x31, '1',0, +0x00, 0x32, 0x00, 0x32, '2',0, +0x00, 0x33, 0x00, 0x33, '3',0, +0x00, 0x34, 0x00, 0x34, '4',0, +0x00, 0x35, 0x00, 0x35, '5',0, +0x00, 0x36, 0x00, 0x36, '6',0, +0x00, 0x37, 0x00, 0x37, '7',0, +0x00, 0x38, 0x00, 0x38, '8',0, +0x00, 0x39, 0x00, 0x39, '9',0, +0x0c, 0xa4, 0x00, 0x3a, 'c','o','l','o','n',0, +0xda, 0x84, 0x00, 0x3b, 's','e','m','i','c','o','l','o','n',0, +0x06, 0x4d, 0x00, 0x3c, 'l','e','s','s',0, +0x0c, 0xda, 0x00, 0x3d, 'e','q','u','a','l',0, +0x34, 0x64, 0x00, 0x3e, 'g','r','e','a','t','e','r',0, +0x70, 0x20, 0x00, 0x3f, 'q','u','e','s','t','i','o','n',0, +0x01, 0x36, 0x00, 0x40, 'a','t',0, +0x00, 0x41, 0x00, 0x41, 'A',0, +0x00, 0x42, 0x00, 0x42, 'B',0, +0x00, 0x43, 0x00, 0x43, 'C',0, +0x00, 0x44, 0x00, 0x44, 'D',0, +0x00, 0x45, 0x00, 0x45, 'E',0, +0x00, 0x46, 0x00, 0x46, 'F',0, +0x00, 0x47, 0x00, 0x47, 'G',0, +0x00, 0x48, 0x00, 0x48, 'H',0, +0x00, 0x49, 0x00, 0x49, 'I',0, +0x00, 0x4a, 0x00, 0x4a, 'J',0, +0x00, 0x4b, 0x00, 0x4b, 'K',0, +0x00, 0x4c, 0x00, 0x4c, 'L',0, +0x00, 0x4d, 0x00, 0x4d, 'M',0, +0x00, 0x4e, 0x00, 0x4e, 'N',0, +0x00, 0x4f, 0x00, 0x4f, 'O',0, +0x00, 0x50, 0x00, 0x50, 'P',0, +0x00, 0x51, 0x00, 0x51, 'Q',0, +0x00, 0x52, 0x00, 0x52, 'R',0, +0x00, 0x53, 0x00, 0x53, 'S',0, +0x00, 0x54, 0x00, 0x54, 'T',0, +0x00, 0x55, 0x00, 0x55, 'U',0, +0x00, 0x56, 0x00, 0x56, 'V',0, +0x00, 0x57, 0x00, 0x57, 'W',0, +0x00, 0x58, 0x00, 0x58, 'X',0, +0x00, 0x59, 0x00, 0x59, 'Y',0, +0x00, 0x5a, 0x00, 0x5a, 'Z',0, +0x33, 0x54, 0x00, 0x5b, 'b','r','a','c','k','e','t','l','e','f','t',0, +0xc6, 0x02, 0x00, 0x5c, 'b','a','c','k','s','l','a','s','h',0, +0x67, 0x88, 0x00, 0x5d, 'b','r','a','c','k','e','t','r','i','g','h','t',0, +0x35, 0x23, 0x00, 0x5e, 'a','s','c','i','i','c','i','r','c','u','m',0, +0xbe, 0xcd, 0x00, 0x5f, 'u','n','d','e','r','s','c','o','r','e',0, +0x0c, 0xd5, 0x00, 0x60, 'g','r','a','v','e',0, +0xe2, 0x44, 0x00, 0x60, 'q','u','o','t','e','l','e','f','t',0, +0x00, 0x61, 0x00, 0x61, 'a',0, +0x00, 0x62, 0x00, 0x62, 'b',0, +0x00, 0x63, 0x00, 0x63, 'c',0, +0x00, 0x64, 0x00, 0x64, 'd',0, +0x00, 0x65, 0x00, 0x65, 'e',0, +0x00, 0x66, 0x00, 0x66, 'f',0, +0x00, 0x67, 0x00, 0x67, 'g',0, +0x00, 0x68, 0x00, 0x68, 'h',0, +0x00, 0x69, 0x00, 0x69, 'i',0, +0x00, 0x6a, 0x00, 0x6a, 'j',0, +0x00, 0x6b, 0x00, 0x6b, 'k',0, +0x00, 0x6c, 0x00, 0x6c, 'l',0, +0x00, 0x6d, 0x00, 0x6d, 'm',0, +0x00, 0x6e, 0x00, 0x6e, 'n',0, +0x00, 0x6f, 0x00, 0x6f, 'o',0, +0x00, 0x70, 0x00, 0x70, 'p',0, +0x00, 0x71, 0x00, 0x71, 'q',0, +0x00, 0x72, 0x00, 0x72, 'r',0, +0x00, 0x73, 0x00, 0x73, 's',0, +0x00, 0x74, 0x00, 0x74, 't',0, +0x00, 0x75, 0x00, 0x75, 'u',0, +0x00, 0x76, 0x00, 0x76, 'v',0, +0x00, 0x77, 0x00, 0x77, 'w',0, +0x00, 0x78, 0x00, 0x78, 'x',0, +0x00, 0x79, 0x00, 0x79, 'y',0, +0x00, 0x7a, 0x00, 0x7a, 'z',0, +0xcc, 0x24, 0x00, 0x7b, 'b','r','a','c','e','l','e','f','t',0, +0x02, 0xbc, 0x00, 0x7c, 'b','a','r',0, +0x99, 0x28, 0x00, 0x7d, 'b','r','a','c','e','r','i','g','h','t',0, +0x9b, 0x45, 0x00, 0x7e, 'a','s','c','i','i','t','i','l','d','e',0, +0xc7, 0x7f, 0x00, 0xa0, 'n','o','b','r','e','a','k','s','p','a','c','e',0, +0xa7, 0xa8, 0x00, 0xa1, 'e','x','c','l','a','m','d','o','w','n',0, +0x05, 0xfc, 0x00, 0xa2, 'c','e','n','t',0, +0x70, 0x87, 0x00, 0xa3, 's','t','e','r','l','i','n','g',0, +0x6a, 0x3f, 0x00, 0xa4, 'c','u','r','r','e','n','c','y',0, +0x03, 0x1c, 0x00, 0xa5, 'y','e','n',0, +0xd0, 0x9c, 0x00, 0xa6, 'b','r','o','k','e','n','b','a','r',0, +0x36, 0x20, 0x00, 0xa7, 's','e','c','t','i','o','n',0, +0xca, 0xb9, 0x00, 0xa8, 'd','i','a','e','r','e','s','i','s',0, +0xd2, 0xe8, 0x00, 0xa9, 'c','o','p','y','r','i','g','h','t',0, +0x6a, 0xc5, 0x00, 0xaa, 'o','r','d','f','e','m','i','n','i','n','e',0, +0x69, 0x14, 0x00, 0xab, 'g','u','i','l','l','e','m','o','t','l','e','f','t',0, +0x37, 0x18, 0x00, 0xac, 'n','o','t','s','i','g','n',0, +0x1a, 0xe8, 0x00, 0xad, 'h','y','p','h','e','n',0, +0xb2, 0x7e, 0x00, 0xae, 'r','e','g','i','s','t','e','r','e','d',0, +0x19, 0xdc, 0x00, 0xaf, 'm','a','c','r','o','n',0, +0x18, 0xff, 0x00, 0xb0, 'd','e','g','r','e','e',0, +0xde, 0xcd, 0x00, 0xb1, 'p','l','u','s','m','i','n','u','s',0, +0x9e, 0x94, 0x00, 0xb2, 't','w','o','s','u','p','e','r','i','o','r',0, +0xe8, 0x94, 0x00, 0xb3, 't','h','r','e','e','s','u','p','e','r','i','o','r',0, +0x0c, 0x49, 0x00, 0xb4, 'a','c','u','t','e',0, +0x01, 0x4f, 0x00, 0xb5, 'm','u',0, +0xd5, 0xec, 0x00, 0xb6, 'p','a','r','a','g','r','a','p','h',0, +0x2b, 0xde, 0x00, 0xb7, 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, +0x31, 0xd1, 0x00, 0xb8, 'c','e','d','i','l','l','a',0, +0x6e, 0x94, 0x00, 0xb9, 'o','n','e','s','u','p','e','r','i','o','r',0, +0xd4, 0x35, 0x00, 0xba, 'm','a','s','c','u','l','i','n','e',0, +0xd3, 0x08, 0x00, 0xbb, 'g','u','i','l','l','e','m','o','t','r','i','g','h','t',0, +0xb6, 0x0c, 0x00, 0xbc, 'o','n','e','q','u','a','r','t','e','r',0, +0x35, 0xd2, 0x00, 0xbd, 'o','n','e','h','a','l','f',0, +0xe6, 0x8b, 0x00, 0xbe, 't','h','r','e','e','q','u','a','r','t','e','r','s',0, +0x08, 0x38, 0x00, 0xbf, 'q','u','e','s','t','i','o','n','d','o','w','n',0, +0x14, 0xf5, 0x00, 0xc0, 'A','g','r','a','v','e',0, +0x14, 0x69, 0x00, 0xc1, 'A','a','c','u','t','e',0, +0xa0, 0x52, 0x00, 0xc2, 'A','c','i','r','c','u','m','f','l','e','x',0, +0x15, 0x85, 0x00, 0xc3, 'A','t','i','l','d','e',0, +0x4c, 0xb9, 0x00, 0xc4, 'A','d','i','a','e','r','e','s','i','s',0, +0x0a, 0x87, 0x00, 0xc5, 'A','r','i','n','g',0, +0x00, 0xc7, 0x00, 0xc6, 'A','E',0, +0x53, 0x51, 0x00, 0xc7, 'C','c','e','d','i','l','l','a',0, +0x15, 0x75, 0x00, 0xc8, 'E','g','r','a','v','e',0, +0x14, 0xe9, 0x00, 0xc9, 'E','a','c','u','t','e',0, +0xb0, 0x52, 0x00, 0xca, 'E','c','i','r','c','u','m','f','l','e','x',0, +0x54, 0xb9, 0x00, 0xcb, 'E','d','i','a','e','r','e','s','i','s',0, +0x15, 0xf5, 0x00, 0xcc, 'I','g','r','a','v','e',0, +0x15, 0x69, 0x00, 0xcd, 'I','a','c','u','t','e',0, +0xc0, 0x52, 0x00, 0xce, 'I','c','i','r','c','u','m','f','l','e','x',0, +0x5c, 0xb9, 0x00, 0xcf, 'I','d','i','a','e','r','e','s','i','s',0, +0x02, 0x04, 0x00, 0xd0, 'E','T','H',0, +0x02, 0x64, 0x00, 0xd0, 'E','t','h',0, +0x17, 0x25, 0x00, 0xd1, 'N','t','i','l','d','e',0, +0x16, 0xb5, 0x00, 0xd2, 'O','g','r','a','v','e',0, +0x16, 0x29, 0x00, 0xd3, 'O','a','c','u','t','e',0, +0xd8, 0x52, 0x00, 0xd4, 'O','c','i','r','c','u','m','f','l','e','x',0, +0x17, 0x45, 0x00, 0xd5, 'O','t','i','l','d','e',0, +0x68, 0xb9, 0x00, 0xd6, 'O','d','i','a','e','r','e','s','i','s',0, +0x6e, 0xd9, 0x00, 0xd7, 'm','u','l','t','i','p','l','y',0, +0x5c, 0x9b, 0x00, 0xd8, 'O','o','b','l','i','q','u','e',0, +0x17, 0x75, 0x00, 0xd9, 'U','g','r','a','v','e',0, +0x16, 0xe9, 0x00, 0xda, 'U','a','c','u','t','e',0, +0xf0, 0x52, 0x00, 0xdb, 'U','c','i','r','c','u','m','f','l','e','x',0, +0x74, 0xb9, 0x00, 0xdc, 'U','d','i','a','e','r','e','s','i','s',0, +0x17, 0x69, 0x00, 0xdd, 'Y','a','c','u','t','e',0, +0x09, 0xae, 0x00, 0xde, 'T','H','O','R','N',0, +0x0b, 0x8e, 0x00, 0xde, 'T','h','o','r','n',0, +0x1b, 0xa8, 0x00, 0xdf, 's','s','h','a','r','p',0, +0x18, 0xf5, 0x00, 0xe0, 'a','g','r','a','v','e',0, +0x18, 0x69, 0x00, 0xe1, 'a','a','c','u','t','e',0, +0x20, 0x52, 0x00, 0xe2, 'a','c','i','r','c','u','m','f','l','e','x',0, +0x19, 0x85, 0x00, 0xe3, 'a','t','i','l','d','e',0, +0x8c, 0xb9, 0x00, 0xe4, 'a','d','i','a','e','r','e','s','i','s',0, +0x0c, 0x87, 0x00, 0xe5, 'a','r','i','n','g',0, +0x01, 0x27, 0x00, 0xe6, 'a','e',0, +0x63, 0x51, 0x00, 0xe7, 'c','c','e','d','i','l','l','a',0, +0x19, 0x75, 0x00, 0xe8, 'e','g','r','a','v','e',0, +0x18, 0xe9, 0x00, 0xe9, 'e','a','c','u','t','e',0, +0x30, 0x52, 0x00, 0xea, 'e','c','i','r','c','u','m','f','l','e','x',0, +0x94, 0xb9, 0x00, 0xeb, 'e','d','i','a','e','r','e','s','i','s',0, +0x19, 0xf5, 0x00, 0xec, 'i','g','r','a','v','e',0, +0x19, 0x69, 0x00, 0xed, 'i','a','c','u','t','e',0, +0x40, 0x52, 0x00, 0xee, 'i','c','i','r','c','u','m','f','l','e','x',0, +0x9c, 0xb9, 0x00, 0xef, 'i','d','i','a','e','r','e','s','i','s',0, +0x02, 0xe4, 0x00, 0xf0, 'e','t','h',0, +0x1b, 0x25, 0x00, 0xf1, 'n','t','i','l','d','e',0, +0x1a, 0xb5, 0x00, 0xf2, 'o','g','r','a','v','e',0, +0x1a, 0x29, 0x00, 0xf3, 'o','a','c','u','t','e',0, +0x58, 0x52, 0x00, 0xf4, 'o','c','i','r','c','u','m','f','l','e','x',0, +0x1b, 0x45, 0x00, 0xf5, 'o','t','i','l','d','e',0, +0xa8, 0xb9, 0x00, 0xf6, 'o','d','i','a','e','r','e','s','i','s',0, +0x68, 0x18, 0x00, 0xf7, 'd','i','v','i','s','i','o','n',0, +0x1b, 0x42, 0x00, 0xf8, 'o','s','l','a','s','h',0, +0x1b, 0x75, 0x00, 0xf9, 'u','g','r','a','v','e',0, +0x1a, 0xe9, 0x00, 0xfa, 'u','a','c','u','t','e',0, +0x70, 0x52, 0x00, 0xfb, 'u','c','i','r','c','u','m','f','l','e','x',0, +0xb4, 0xb9, 0x00, 0xfc, 'u','d','i','a','e','r','e','s','i','s',0, +0x1b, 0x69, 0x00, 0xfd, 'y','a','c','u','t','e',0, +0x0d, 0x8e, 0x00, 0xfe, 't','h','o','r','n',0, +0xbc, 0xb9, 0x00, 0xff, 'y','d','i','a','e','r','e','s','i','s',0, +0x2a, 0xf5, 0x01, 0xa1, 'A','o','g','o','n','e','k',0, +0x0c, 0x95, 0x01, 0xa2, 'b','r','e','v','e',0, +0x2f, 0x27, 0x01, 0xa3, 'L','s','t','r','o','k','e',0, +0x15, 0xcc, 0x01, 0xa5, 'L','c','a','r','o','n',0, +0x16, 0xa9, 0x01, 0xa6, 'S','a','c','u','t','e',0, +0x16, 0xac, 0x01, 0xa9, 'S','c','a','r','o','n',0, +0x5b, 0x51, 0x01, 0xaa, 'S','c','e','d','i','l','l','a',0, +0x16, 0xcc, 0x01, 0xab, 'T','c','a','r','o','n',0, +0x17, 0x89, 0x01, 0xac, 'Z','a','c','u','t','e',0, +0x17, 0x8c, 0x01, 0xae, 'Z','c','a','r','o','n',0, +0xbe, 0x4a, 0x01, 0xaf, 'Z','a','b','o','v','e','d','o','t',0, +0x32, 0xf5, 0x01, 0xb1, 'a','o','g','o','n','e','k',0, +0x1a, 0xb5, 0x01, 0xb2, 'o','g','o','n','e','k',0, +0x37, 0x27, 0x01, 0xb3, 'l','s','t','r','o','k','e',0, +0x19, 0xcc, 0x01, 0xb5, 'l','c','a','r','o','n',0, +0x1a, 0xa9, 0x01, 0xb6, 's','a','c','u','t','e',0, +0x0c, 0x4c, 0x01, 0xb7, 'c','a','r','o','n',0, +0x1a, 0xac, 0x01, 0xb9, 's','c','a','r','o','n',0, +0x6b, 0x51, 0x01, 0xba, 's','c','e','d','i','l','l','a',0, +0x1a, 0xcc, 0x01, 0xbb, 't','c','a','r','o','n',0, +0x1b, 0x89, 0x01, 0xbc, 'z','a','c','u','t','e',0, +0x47, 0xe9, 0x01, 0xbd, 'd','o','u','b','l','e','a','c','u','t','e',0, +0x1b, 0x8c, 0x01, 0xbe, 'z','c','a','r','o','n',0, +0xde, 0x4a, 0x01, 0xbf, 'z','a','b','o','v','e','d','o','t',0, +0x16, 0x89, 0x01, 0xc0, 'R','a','c','u','t','e',0, +0x14, 0xb5, 0x01, 0xc3, 'A','b','r','e','v','e',0, +0x15, 0xc9, 0x01, 0xc5, 'L','a','c','u','t','e',0, +0x14, 0xa9, 0x01, 0xc6, 'C','a','c','u','t','e',0, +0x14, 0xac, 0x01, 0xc8, 'C','c','a','r','o','n',0, +0x2b, 0xf5, 0x01, 0xca, 'E','o','g','o','n','e','k',0, +0x14, 0xec, 0x01, 0xcc, 'E','c','a','r','o','n',0, +0x14, 0xcc, 0x01, 0xcf, 'D','c','a','r','o','n',0, +0x2d, 0x27, 0x01, 0xd0, 'D','s','t','r','o','k','e',0, +0x16, 0x09, 0x01, 0xd1, 'N','a','c','u','t','e',0, +0x16, 0x0c, 0x01, 0xd2, 'N','c','a','r','o','n',0, +0xbf, 0xe9, 0x01, 0xd5, 'O','d','o','u','b','l','e','a','c','u','t','e',0, +0x16, 0x8c, 0x01, 0xd8, 'R','c','a','r','o','n',0, +0x0b, 0xc7, 0x01, 0xd9, 'U','r','i','n','g',0, +0xef, 0xe9, 0x01, 0xdb, 'U','d','o','u','b','l','e','a','c','u','t','e',0, +0x5b, 0xd1, 0x01, 0xde, 'T','c','e','d','i','l','l','a',0, +0x1a, 0x89, 0x01, 0xe0, 'r','a','c','u','t','e',0, +0x18, 0xb5, 0x01, 0xe3, 'a','b','r','e','v','e',0, +0x19, 0xc9, 0x01, 0xe5, 'l','a','c','u','t','e',0, +0x18, 0xa9, 0x01, 0xe6, 'c','a','c','u','t','e',0, +0x18, 0xac, 0x01, 0xe8, 'c','c','a','r','o','n',0, +0x33, 0xf5, 0x01, 0xea, 'e','o','g','o','n','e','k',0, +0x18, 0xec, 0x01, 0xec, 'e','c','a','r','o','n',0, +0x18, 0xcc, 0x01, 0xef, 'd','c','a','r','o','n',0, +0x35, 0x27, 0x01, 0xf0, 'd','s','t','r','o','k','e',0, +0x1a, 0x09, 0x01, 0xf1, 'n','a','c','u','t','e',0, +0x1a, 0x0c, 0x01, 0xf2, 'n','c','a','r','o','n',0, +0xbf, 0xe9, 0x01, 0xf5, 'o','d','o','u','b','l','e','a','c','u','t','e',0, +0xef, 0xe9, 0x01, 0xfb, 'u','d','o','u','b','l','e','a','c','u','t','e',0, +0x1a, 0x8c, 0x01, 0xf8, 'r','c','a','r','o','n',0, +0x0d, 0xc7, 0x01, 0xf9, 'u','r','i','n','g',0, +0x6b, 0xd1, 0x01, 0xfe, 't','c','e','d','i','l','l','a',0, +0x64, 0x4a, 0x01, 0xff, 'a','b','o','v','e','d','o','t',0, +0x2e, 0x27, 0x02, 0xa1, 'H','s','t','r','o','k','e',0, +0xbc, 0x52, 0x02, 0xa6, 'H','c','i','r','c','u','m','f','l','e','x',0, +0xad, 0x4a, 0x02, 0xa9, 'I','a','b','o','v','e','d','o','t',0, +0x15, 0x75, 0x02, 0xab, 'G','b','r','e','v','e',0, +0xc4, 0x52, 0x02, 0xac, 'J','c','i','r','c','u','m','f','l','e','x',0, +0x36, 0x27, 0x02, 0xb1, 'h','s','t','r','o','k','e',0, +0x3c, 0x52, 0x02, 0xb6, 'h','c','i','r','c','u','m','f','l','e','x',0, +0x68, 0xed, 0x02, 0xb9, 'i','d','o','t','l','e','s','s',0, +0x19, 0x75, 0x02, 0xbb, 'g','b','r','e','v','e',0, +0x44, 0x52, 0x02, 0xbc, 'j','c','i','r','c','u','m','f','l','e','x',0, +0xa7, 0x4a, 0x02, 0xc5, 'C','a','b','o','v','e','d','o','t',0, +0xa8, 0x52, 0x02, 0xc6, 'C','c','i','r','c','u','m','f','l','e','x',0, +0xab, 0x4a, 0x02, 0xd5, 'G','a','b','o','v','e','d','o','t',0, +0xb8, 0x52, 0x02, 0xd8, 'G','c','i','r','c','u','m','f','l','e','x',0, +0x17, 0x35, 0x02, 0xdd, 'U','b','r','e','v','e',0, +0xe8, 0x52, 0x02, 0xde, 'S','c','i','r','c','u','m','f','l','e','x',0, +0xc7, 0x4a, 0x02, 0xe5, 'c','a','b','o','v','e','d','o','t',0, +0x28, 0x52, 0x02, 0xe6, 'c','c','i','r','c','u','m','f','l','e','x',0, +0xcb, 0x4a, 0x02, 0xf5, 'g','a','b','o','v','e','d','o','t',0, +0x38, 0x52, 0x02, 0xf8, 'g','c','i','r','c','u','m','f','l','e','x',0, +0x1b, 0x35, 0x02, 0xfd, 'u','b','r','e','v','e',0, +0x68, 0x52, 0x02, 0xfe, 's','c','i','r','c','u','m','f','l','e','x',0, +0x02, 0xf1, 0x03, 0xa2, 'k','r','a',0, +0x0c, 0xb9, 0x03, 0xa2, 'k','a','p','p','a',0, +0x5a, 0xd1, 0x03, 0xa3, 'R','c','e','d','i','l','l','a',0, +0x16, 0x85, 0x03, 0xa5, 'I','t','i','l','d','e',0, +0x57, 0xd1, 0x03, 0xa6, 'L','c','e','d','i','l','l','a',0, +0x2b, 0x1c, 0x03, 0xaa, 'E','m','a','c','r','o','n',0, +0x55, 0x51, 0x03, 0xab, 'G','c','e','d','i','l','l','a',0, +0x17, 0xe2, 0x03, 0xac, 'T','s','l','a','s','h',0, +0x6a, 0xd1, 0x03, 0xb3, 'r','c','e','d','i','l','l','a',0, +0x1a, 0x85, 0x03, 0xb5, 'i','t','i','l','d','e',0, +0x67, 0xd1, 0x03, 0xb6, 'l','c','e','d','i','l','l','a',0, +0x33, 0x1c, 0x03, 0xba, 'e','m','a','c','r','o','n',0, +0x65, 0x51, 0x03, 0xbb, 'g','c','e','d','i','l','l','a',0, +0x1b, 0xe2, 0x03, 0xbc, 't','s','l','a','s','h',0, +0x01, 0xf7, 0x03, 0xbd, 'E','N','G',0, +0x02, 0xd7, 0x03, 0xbf, 'e','n','g',0, +0x2a, 0x1c, 0x03, 0xc0, 'A','m','a','c','r','o','n',0, +0x2c, 0xf5, 0x03, 0xc7, 'I','o','g','o','n','e','k',0, +0xa9, 0x4a, 0x03, 0xcc, 'E','a','b','o','v','e','d','o','t',0, +0x2c, 0x1c, 0x03, 0xcf, 'I','m','a','c','r','o','n',0, +0x58, 0xd1, 0x03, 0xd1, 'N','c','e','d','i','l','l','a',0, +0x2d, 0x9c, 0x03, 0xd2, 'O','m','a','c','r','o','n',0, +0x57, 0x51, 0x03, 0xd3, 'K','c','e','d','i','l','l','a',0, +0x2f, 0xf5, 0x03, 0xd9, 'U','o','g','o','n','e','k',0, +0x18, 0x05, 0x03, 0xdd, 'U','t','i','l','d','e',0, +0x2f, 0x1c, 0x03, 0xde, 'U','m','a','c','r','o','n',0, +0x32, 0x1c, 0x03, 0xe0, 'a','m','a','c','r','o','n',0, +0x34, 0xf5, 0x03, 0xe7, 'i','o','g','o','n','e','k',0, +0xc9, 0x4a, 0x03, 0xec, 'e','a','b','o','v','e','d','o','t',0, +0x34, 0x1c, 0x03, 0xef, 'i','m','a','c','r','o','n',0, +0x68, 0xd1, 0x03, 0xf1, 'n','c','e','d','i','l','l','a',0, +0x35, 0x9c, 0x03, 0xf2, 'o','m','a','c','r','o','n',0, +0x67, 0x51, 0x03, 0xf3, 'k','c','e','d','i','l','l','a',0, +0x37, 0xf5, 0x03, 0xf9, 'u','o','g','o','n','e','k',0, +0x1c, 0x05, 0x03, 0xfd, 'u','t','i','l','d','e',0, +0x37, 0x1c, 0x03, 0xfe, 'u','m','a','c','r','o','n',0, +0xa6, 0x4a, 0x12, 0xa1, 'B','a','b','o','v','e','d','o','t',0, +0xc6, 0x4a, 0x12, 0xa2, 'b','a','b','o','v','e','d','o','t',0, +0xa8, 0x4a, 0x12, 0xa6, 'D','a','b','o','v','e','d','o','t',0, +0x17, 0xb5, 0x12, 0xa8, 'W','g','r','a','v','e',0, +0x17, 0x29, 0x12, 0xaa, 'W','a','c','u','t','e',0, +0xc8, 0x4a, 0x12, 0xab, 'd','a','b','o','v','e','d','o','t',0, +0x17, 0xf5, 0x12, 0xac, 'Y','g','r','a','v','e',0, +0xaa, 0x4a, 0x12, 0xb0, 'F','a','b','o','v','e','d','o','t',0, +0xca, 0x4a, 0x12, 0xb1, 'f','a','b','o','v','e','d','o','t',0, +0xb1, 0x4a, 0x12, 0xb4, 'M','a','b','o','v','e','d','o','t',0, +0xd1, 0x4a, 0x12, 0xb5, 'm','a','b','o','v','e','d','o','t',0, +0xb4, 0x4a, 0x12, 0xb7, 'P','a','b','o','v','e','d','o','t',0, +0x1b, 0xb5, 0x12, 0xb8, 'w','g','r','a','v','e',0, +0xd4, 0x4a, 0x12, 0xb9, 'p','a','b','o','v','e','d','o','t',0, +0x1b, 0x29, 0x12, 0xba, 'w','a','c','u','t','e',0, +0xb7, 0x4a, 0x12, 0xbb, 'S','a','b','o','v','e','d','o','t',0, +0x1b, 0xf5, 0x12, 0xbc, 'y','g','r','a','v','e',0, +0x78, 0xb9, 0x12, 0xbd, 'W','d','i','a','e','r','e','s','i','s',0, +0xb8, 0xb9, 0x12, 0xbe, 'w','d','i','a','e','r','e','s','i','s',0, +0xd7, 0x4a, 0x12, 0xbf, 's','a','b','o','v','e','d','o','t',0, +0xf8, 0x52, 0x12, 0xd0, 'W','c','i','r','c','u','m','f','l','e','x',0, +0xb8, 0x4a, 0x12, 0xd7, 'T','a','b','o','v','e','d','o','t',0, +0x00, 0x52, 0x12, 0xde, 'Y','c','i','r','c','u','m','f','l','e','x',0, +0x78, 0x52, 0x12, 0xf0, 'w','c','i','r','c','u','m','f','l','e','x',0, +0xd8, 0x4a, 0x12, 0xf7, 't','a','b','o','v','e','d','o','t',0, +0x80, 0x52, 0x12, 0xfe, 'y','c','i','r','c','u','m','f','l','e','x',0, +0x00, 0xe3, 0x13, 0xbc, 'O','E',0, +0x01, 0x43, 0x13, 0xbd, 'o','e',0, +0x7c, 0xb9, 0x13, 0xbe, 'Y','d','i','a','e','r','e','s','i','s',0, +0x6f, 0x05, 0x04, 0x7e, 'o','v','e','r','l','i','n','e',0, +0xfc, 0x36, 0x04, 0xa1, 'k','a','n','a','_','f','u','l','l','s','t','o','p',0, +0xa6, 0x52, 0x04, 0xa2, 'k','a','n','a','_','o','p','e','n','i','n','g','b','r','a','c','k','e','t',0, +0x4a, 0x52, 0x04, 0xa3, 'k','a','n','a','_','c','l','o','s','i','n','g','b','r','a','c','k','e','t',0, +0x9e, 0xb7, 0x04, 0xa4, 'k','a','n','a','_','c','o','m','m','a',0, +0xcc, 0xc5, 0x04, 0xa5, 'k','a','n','a','_','c','o','n','j','u','n','c','t','i','v','e',0, +0xf5, 0xca, 0x04, 0xa5, 'k','a','n','a','_','m','i','d','d','l','e','d','o','t',0, +0x33, 0x41, 0x04, 0xa6, 'k','a','n','a','_','W','O',0, +0x19, 0x83, 0x04, 0xa7, 'k','a','n','a','_','a',0, +0x19, 0x8b, 0x04, 0xa8, 'k','a','n','a','_','i',0, +0x19, 0x97, 0x04, 0xa9, 'k','a','n','a','_','u',0, +0x19, 0x87, 0x04, 0xaa, 'k','a','n','a','_','e',0, +0x19, 0x91, 0x04, 0xab, 'k','a','n','a','_','o',0, +0x33, 0x97, 0x04, 0xac, 'k','a','n','a','_','y','a',0, +0x33, 0xab, 0x04, 0xad, 'k','a','n','a','_','y','u',0, +0x33, 0xa5, 0x04, 0xae, 'k','a','n','a','_','y','o',0, +0x67, 0xb3, 0x04, 0xaf, 'k','a','n','a','_','t','s','u',0, +0x33, 0xa1, 0x04, 0xaf, 'k','a','n','a','_','t','u',0, +0xfa, 0xfc, 0x04, 0xb0, 'p','r','o','l','o','n','g','e','d','s','o','u','n','d',0, +0x19, 0x63, 0x04, 0xb1, 'k','a','n','a','_','A',0, +0x19, 0x6b, 0x04, 0xb2, 'k','a','n','a','_','I',0, +0x19, 0x77, 0x04, 0xb3, 'k','a','n','a','_','U',0, +0x19, 0x67, 0x04, 0xb4, 'k','a','n','a','_','E',0, +0x19, 0x71, 0x04, 0xb5, 'k','a','n','a','_','O',0, +0x33, 0x1b, 0x04, 0xb6, 'k','a','n','a','_','K','A',0, +0x33, 0x23, 0x04, 0xb7, 'k','a','n','a','_','K','I',0, +0x33, 0x2f, 0x04, 0xb8, 'k','a','n','a','_','K','U',0, +0x33, 0x1f, 0x04, 0xb9, 'k','a','n','a','_','K','E',0, +0x33, 0x29, 0x04, 0xba, 'k','a','n','a','_','K','O',0, +0x33, 0x2b, 0x04, 0xbb, 'k','a','n','a','_','S','A',0, +0x66, 0xad, 0x04, 0xbc, 'k','a','n','a','_','S','H','I',0, +0x33, 0x3f, 0x04, 0xbd, 'k','a','n','a','_','S','U',0, +0x33, 0x2f, 0x04, 0xbe, 'k','a','n','a','_','S','E',0, +0x33, 0x39, 0x04, 0xbf, 'k','a','n','a','_','S','O',0, +0x33, 0x2d, 0x04, 0xc0, 'k','a','n','a','_','T','A',0, +0x66, 0x6d, 0x04, 0xc1, 'k','a','n','a','_','C','H','I',0, +0x33, 0x35, 0x04, 0xc1, 'k','a','n','a','_','T','I',0, +0x66, 0xd3, 0x04, 0xc2, 'k','a','n','a','_','T','S','U',0, +0x33, 0x41, 0x04, 0xc2, 'k','a','n','a','_','T','U',0, +0x33, 0x31, 0x04, 0xc3, 'k','a','n','a','_','T','E',0, +0x33, 0x3b, 0x04, 0xc4, 'k','a','n','a','_','T','O',0, +0x33, 0x21, 0x04, 0xc5, 'k','a','n','a','_','N','A',0, +0x33, 0x29, 0x04, 0xc6, 'k','a','n','a','_','N','I',0, +0x33, 0x35, 0x04, 0xc7, 'k','a','n','a','_','N','U',0, +0x33, 0x25, 0x04, 0xc8, 'k','a','n','a','_','N','E',0, +0x33, 0x2f, 0x04, 0xc9, 'k','a','n','a','_','N','O',0, +0x33, 0x15, 0x04, 0xca, 'k','a','n','a','_','H','A',0, +0x33, 0x1d, 0x04, 0xcb, 'k','a','n','a','_','H','I',0, +0x33, 0x25, 0x04, 0xcc, 'k','a','n','a','_','F','U',0, +0x33, 0x29, 0x04, 0xcc, 'k','a','n','a','_','H','U',0, +0x33, 0x19, 0x04, 0xcd, 'k','a','n','a','_','H','E',0, +0x33, 0x23, 0x04, 0xce, 'k','a','n','a','_','H','O',0, +0x33, 0x1f, 0x04, 0xcf, 'k','a','n','a','_','M','A',0, +0x33, 0x27, 0x04, 0xd0, 'k','a','n','a','_','M','I',0, +0x33, 0x33, 0x04, 0xd1, 'k','a','n','a','_','M','U',0, +0x33, 0x23, 0x04, 0xd2, 'k','a','n','a','_','M','E',0, +0x33, 0x2d, 0x04, 0xd3, 'k','a','n','a','_','M','O',0, +0x33, 0x37, 0x04, 0xd4, 'k','a','n','a','_','Y','A',0, +0x33, 0x4b, 0x04, 0xd5, 'k','a','n','a','_','Y','U',0, +0x33, 0x45, 0x04, 0xd6, 'k','a','n','a','_','Y','O',0, +0x33, 0x29, 0x04, 0xd7, 'k','a','n','a','_','R','A',0, +0x33, 0x31, 0x04, 0xd8, 'k','a','n','a','_','R','I',0, +0x33, 0x3d, 0x04, 0xd9, 'k','a','n','a','_','R','U',0, +0x33, 0x2d, 0x04, 0xda, 'k','a','n','a','_','R','E',0, +0x33, 0x37, 0x04, 0xdb, 'k','a','n','a','_','R','O',0, +0x33, 0x33, 0x04, 0xdc, 'k','a','n','a','_','W','A',0, +0x19, 0x70, 0x04, 0xdd, 'k','a','n','a','_','N',0, +0x83, 0xfc, 0x04, 0xde, 'v','o','i','c','e','d','s','o','u','n','d',0, +0xfb, 0xfc, 0x04, 0xdf, 's','e','m','i','v','o','i','c','e','d','s','o','u','n','d',0, +0x40, 0x56, 0xff, 0x7e, 'k','a','n','a','_','s','w','i','t','c','h',0, +0x2a, 0xea, 0x05, 0x90, 'F','a','r','s','i','_','0',0, +0x2a, 0xeb, 0x05, 0x91, 'F','a','r','s','i','_','1',0, +0x2a, 0xec, 0x05, 0x92, 'F','a','r','s','i','_','2',0, +0x2a, 0xed, 0x05, 0x93, 'F','a','r','s','i','_','3',0, +0x2a, 0xee, 0x05, 0x94, 'F','a','r','s','i','_','4',0, +0x2a, 0xef, 0x05, 0x95, 'F','a','r','s','i','_','5',0, +0x2a, 0xf0, 0x05, 0x96, 'F','a','r','s','i','_','6',0, +0x2a, 0xf1, 0x05, 0x97, 'F','a','r','s','i','_','7',0, +0x2a, 0xf2, 0x05, 0x98, 'F','a','r','s','i','_','8',0, +0x2a, 0xf3, 0x05, 0x99, 'F','a','r','s','i','_','9',0, +0x6a, 0x3c, 0x05, 0xa5, 'A','r','a','b','i','c','_','p','e','r','c','e','n','t',0, +0x0e, 0xd8, 0x05, 0xa6, 'A','r','a','b','i','c','_','s','u','p','e','r','s','c','r','i','p','t','_','a','l','e','f',0, +0xad, 0x32, 0x05, 0xa7, 'A','r','a','b','i','c','_','t','t','e','h',0, +0x56, 0x3a, 0x05, 0xa8, 'A','r','a','b','i','c','_','p','e','h',0, +0x5a, 0x4a, 0x05, 0xa9, 'A','r','a','b','i','c','_','t','c','h','e','h',0, +0xac, 0x6e, 0x05, 0xaa, 'A','r','a','b','i','c','_','d','d','a','l',0, +0xad, 0x1a, 0x05, 0xab, 'A','r','a','b','i','c','_','r','r','e','h',0, +0x59, 0xb7, 0x05, 0xac, 'A','r','a','b','i','c','_','c','o','m','m','a',0, +0xd4, 0x36, 0x05, 0xae, 'A','r','a','b','i','c','_','f','u','l','l','s','t','o','p',0, +0x55, 0x02, 0x05, 0xb0, 'A','r','a','b','i','c','_','0',0, +0x55, 0x03, 0x05, 0xb1, 'A','r','a','b','i','c','_','1',0, +0x55, 0x04, 0x05, 0xb2, 'A','r','a','b','i','c','_','2',0, +0x55, 0x05, 0x05, 0xb3, 'A','r','a','b','i','c','_','3',0, +0x55, 0x06, 0x05, 0xb4, 'A','r','a','b','i','c','_','4',0, +0x55, 0x07, 0x05, 0xb5, 'A','r','a','b','i','c','_','5',0, +0x55, 0x08, 0x05, 0xb6, 'A','r','a','b','i','c','_','6',0, +0x55, 0x09, 0x05, 0xb7, 'A','r','a','b','i','c','_','7',0, +0x55, 0x0a, 0x05, 0xb8, 'A','r','a','b','i','c','_','8',0, +0x55, 0x0b, 0x05, 0xb9, 'A','r','a','b','i','c','_','9',0, +0xac, 0x84, 0x05, 0xbb, 'A','r','a','b','i','c','_','s','e','m','i','c','o','l','o','n',0, +0x30, 0x2b, 0x05, 0xbf, 'A','r','a','b','i','c','_','q','u','e','s','t','i','o','n','_','m','a','r','k',0, +0x59, 0xb1, 0x05, 0xc1, 'A','r','a','b','i','c','_','h','a','m','z','a',0, +0x86, 0xe8, 0x05, 0xc2, 'A','r','a','b','i','c','_','m','a','d','d','a','o','n','a','l','e','f',0, +0x86, 0xe8, 0x05, 0xc3, 'A','r','a','b','i','c','_','h','a','m','z','a','o','n','a','l','e','f',0, +0x43, 0x95, 0x05, 0xc4, 'A','r','a','b','i','c','_','h','a','m','z','a','o','n','w','a','w',0, +0x40, 0xa8, 0x05, 0xc5, 'A','r','a','b','i','c','_','h','a','m','z','a','u','n','d','e','r','a','l','e','f',0, +0x43, 0x96, 0x05, 0xc6, 'A','r','a','b','i','c','_','h','a','m','z','a','o','n','y','e','h',0, +0xac, 0x78, 0x05, 0xc7, 'A','r','a','b','i','c','_','a','l','e','f',0, +0x56, 0x02, 0x05, 0xc8, 'A','r','a','b','i','c','_','b','e','h',0, +0x59, 0xad, 0x05, 0xc9, 'A','r','a','b','i','c','_','t','e','h','m','a','r','b','u','t','a',0, +0x56, 0x4a, 0x05, 0xca, 'A','r','a','b','i','c','_','t','e','h',0, +0xad, 0x02, 0x05, 0xcb, 'A','r','a','b','i','c','_','t','h','e','h',0, +0xac, 0xab, 0x05, 0xcc, 'A','r','a','b','i','c','_','j','e','e','m',0, +0x56, 0x12, 0x05, 0xcd, 'A','r','a','b','i','c','_','h','a','h',0, +0xac, 0xb2, 0x05, 0xce, 'A','r','a','b','i','c','_','k','h','a','h',0, +0x56, 0x06, 0x05, 0xcf, 'A','r','a','b','i','c','_','d','a','l',0, +0xac, 0xfe, 0x05, 0xd0, 'A','r','a','b','i','c','_','t','h','a','l',0, +0xaa, 0xe9, 0x05, 0xd1, 'A','r','a','b','i','c','_','r','a',0, +0xad, 0x24, 0x05, 0xd2, 'A','r','a','b','i','c','_','z','a','i','n',0, +0xac, 0xf4, 0x05, 0xd3, 'A','r','a','b','i','c','_','s','e','e','n',0, +0x5a, 0x5c, 0x05, 0xd4, 'A','r','a','b','i','c','_','s','h','e','e','n',0, +0x56, 0x3a, 0x05, 0xd5, 'A','r','a','b','i','c','_','s','a','d',0, +0x55, 0xfe, 0x05, 0xd6, 'A','r','a','b','i','c','_','d','a','d',0, +0x56, 0x42, 0x05, 0xd7, 'A','r','a','b','i','c','_','t','a','h',0, +0x56, 0x5a, 0x05, 0xd8, 'A','r','a','b','i','c','_','z','a','h',0, +0x56, 0x0c, 0x05, 0xd9, 'A','r','a','b','i','c','_','a','i','n',0, +0x59, 0x94, 0x05, 0xda, 'A','r','a','b','i','c','_','g','h','a','i','n',0, +0x6b, 0x62, 0x05, 0xe0, 'A','r','a','b','i','c','_','t','a','t','w','e','e','l',0, +0x56, 0x12, 0x05, 0xe1, 'A','r','a','b','i','c','_','f','e','h',0, +0x56, 0x34, 0x05, 0xe2, 'A','r','a','b','i','c','_','q','a','f',0, +0x56, 0x1c, 0x05, 0xe3, 'A','r','a','b','i','c','_','k','a','f',0, +0x56, 0x27, 0x05, 0xe4, 'A','r','a','b','i','c','_','l','a','m',0, +0xac, 0xc3, 0x05, 0xe5, 'A','r','a','b','i','c','_','m','e','e','m',0, +0xad, 0x08, 0x05, 0xe6, 'A','r','a','b','i','c','_','n','o','o','n',0, +0xaa, 0xd5, 0x05, 0xe7, 'A','r','a','b','i','c','_','h','a',0, +0x56, 0x1a, 0x05, 0xe7, 'A','r','a','b','i','c','_','h','e','h',0, +0x56, 0x5d, 0x05, 0xe8, 'A','r','a','b','i','c','_','w','a','w',0, +0x70, 0xc1, 0x05, 0xe9, 'A','r','a','b','i','c','_','a','l','e','f','m','a','k','s','u','r','a',0, +0x56, 0x5e, 0x05, 0xea, 'A','r','a','b','i','c','_','y','e','h',0, +0xcf, 0x48, 0x05, 0xeb, 'A','r','a','b','i','c','_','f','a','t','h','a','t','a','n',0, +0xcd, 0xb8, 0x05, 0xec, 'A','r','a','b','i','c','_','d','a','m','m','a','t','a','n',0, +0xd2, 0x48, 0x05, 0xed, 'A','r','a','b','i','c','_','k','a','s','r','a','t','a','n',0, +0x59, 0x89, 0x05, 0xee, 'A','r','a','b','i','c','_','f','a','t','h','a',0, +0x59, 0x57, 0x05, 0xef, 'A','r','a','b','i','c','_','d','a','m','m','a',0, +0x59, 0xe9, 0x05, 0xf0, 'A','r','a','b','i','c','_','k','a','s','r','a',0, +0xb4, 0xe1, 0x05, 0xf1, 'A','r','a','b','i','c','_','s','h','a','d','d','a',0, +0x5a, 0xfc, 0x05, 0xf2, 'A','r','a','b','i','c','_','s','u','k','u','n',0, +0x84, 0x4d, 0x05, 0xf3, 'A','r','a','b','i','c','_','m','a','d','d','a','_','a','b','o','v','e',0, +0x84, 0x4d, 0x05, 0xf4, 'A','r','a','b','i','c','_','h','a','m','z','a','_','a','b','o','v','e',0, +0x84, 0x6d, 0x05, 0xf5, 'A','r','a','b','i','c','_','h','a','m','z','a','_','b','e','l','o','w',0, +0x56, 0x22, 0x05, 0xf6, 'A','r','a','b','i','c','_','j','e','h',0, +0x56, 0x52, 0x05, 0xf7, 'A','r','a','b','i','c','_','v','e','h',0, +0x59, 0xca, 0x05, 0xf8, 'A','r','a','b','i','c','_','k','e','h','e','h',0, +0x56, 0x0c, 0x05, 0xf9, 'A','r','a','b','i','c','_','g','a','f',0, +0xb5, 0xbd, 0x05, 0xfa, 'A','r','a','b','i','c','_','n','o','o','n','_','g','h','u','n','n','a',0, +0xcb, 0xf3, 0x05, 0xfb, 'A','r','a','b','i','c','_','h','e','h','_','d','o','a','c','h','a','s','h','m','e','e',0, +0xad, 0xfe, 0x05, 0xfc, 'F','a','r','s','i','_','y','e','h',0, +0xaf, 0x7f, 0x05, 0xfd, 'A','r','a','b','i','c','_','y','e','h','_','b','a','r','e','e',0, +0xcf, 0x52, 0x05, 0xfe, 'A','r','a','b','i','c','_','h','e','h','_','g','o','a','l',0, +0xb6, 0x56, 0xff, 0x7e, 'A','r','a','b','i','c','_','s','w','i','t','c','h',0, +0x29, 0x44, 0x06, 0x80, 'C','y','r','i','l','l','i','c','_','G','H','E','_','b','a','r',0, +0x37, 0x44, 0x06, 0x90, 'C','y','r','i','l','l','i','c','_','g','h','e','_','b','a','r',0, +0x9e, 0x2c, 0x06, 0x81, 'C','y','r','i','l','l','i','c','_','Z','H','E','_','d','e','s','c','e','n','d','e','r',0, +0x1e, 0x2c, 0x06, 0x91, 'C','y','r','i','l','l','i','c','_','z','h','e','_','d','e','s','c','e','n','d','e','r',0, +0x76, 0x2c, 0x06, 0x82, 'C','y','r','i','l','l','i','c','_','K','A','_','d','e','s','c','e','n','d','e','r',0, +0xf6, 0x2c, 0x06, 0x92, 'C','y','r','i','l','l','i','c','_','k','a','_','d','e','s','c','e','n','d','e','r',0, +0x17, 0x27, 0x06, 0x83, 'C','y','r','i','l','l','i','c','_','K','A','_','v','e','r','t','s','t','r','o','k','e',0, +0x17, 0x27, 0x06, 0x93, 'C','y','r','i','l','l','i','c','_','k','a','_','v','e','r','t','s','t','r','o','k','e',0, +0x7a, 0x2c, 0x06, 0x84, 'C','y','r','i','l','l','i','c','_','E','N','_','d','e','s','c','e','n','d','e','r',0, +0xfa, 0x2c, 0x06, 0x94, 'C','y','r','i','l','l','i','c','_','e','n','_','d','e','s','c','e','n','d','e','r',0, +0x9d, 0xf8, 0x06, 0x85, 'C','y','r','i','l','l','i','c','_','U','_','s','t','r','a','i','g','h','t',0, +0xdd, 0xf8, 0x06, 0x95, 'C','y','r','i','l','l','i','c','_','u','_','s','t','r','a','i','g','h','t',0, +0xe5, 0x34, 0x06, 0x86, 'C','y','r','i','l','l','i','c','_','U','_','s','t','r','a','i','g','h','t','_','b','a','r',0, +0xe5, 0x34, 0x06, 0x96, 'C','y','r','i','l','l','i','c','_','u','_','s','t','r','a','i','g','h','t','_','b','a','r',0, +0x5e, 0x2c, 0x06, 0x87, 'C','y','r','i','l','l','i','c','_','H','A','_','d','e','s','c','e','n','d','e','r',0, +0xde, 0x2c, 0x06, 0x97, 'C','y','r','i','l','l','i','c','_','h','a','_','d','e','s','c','e','n','d','e','r',0, +0x2e, 0x2c, 0x06, 0x88, 'C','y','r','i','l','l','i','c','_','C','H','E','_','d','e','s','c','e','n','d','e','r',0, +0xae, 0x2c, 0x06, 0x98, 'C','y','r','i','l','l','i','c','_','c','h','e','_','d','e','s','c','e','n','d','e','r',0, +0x87, 0x27, 0x06, 0x89, 'C','y','r','i','l','l','i','c','_','C','H','E','_','v','e','r','t','s','t','r','o','k','e',0, +0x87, 0x27, 0x06, 0x99, 'C','y','r','i','l','l','i','c','_','c','h','e','_','v','e','r','t','s','t','r','o','k','e',0, +0x65, 0x19, 0x06, 0x8a, 'C','y','r','i','l','l','i','c','_','S','H','H','A',0, +0x66, 0xf9, 0x06, 0x9a, 'C','y','r','i','l','l','i','c','_','s','h','h','a',0, +0xca, 0x77, 0x06, 0x8c, 'C','y','r','i','l','l','i','c','_','S','C','H','W','A',0, +0xce, 0x57, 0x06, 0x9c, 'C','y','r','i','l','l','i','c','_','s','c','h','w','a',0, +0x5f, 0x1c, 0x06, 0x8d, 'C','y','r','i','l','l','i','c','_','I','_','m','a','c','r','o','n',0, +0x6f, 0x1c, 0x06, 0x9d, 'C','y','r','i','l','l','i','c','_','i','_','m','a','c','r','o','n',0, +0xcb, 0xc4, 0x06, 0x8e, 'C','y','r','i','l','l','i','c','_','O','_','b','a','r',0, +0xcd, 0xc4, 0x06, 0x9e, 'C','y','r','i','l','l','i','c','_','o','_','b','a','r',0, +0x65, 0x1c, 0x06, 0x8f, 'C','y','r','i','l','l','i','c','_','U','_','m','a','c','r','o','n',0, +0x75, 0x1c, 0x06, 0x9f, 'C','y','r','i','l','l','i','c','_','u','_','m','a','c','r','o','n',0, +0xec, 0x01, 0x06, 0xa1, 'S','e','r','b','i','a','n','_','d','j','e',0, +0xfd, 0xfd, 0x06, 0xa2, 'M','a','c','e','d','o','n','i','a','_','g','j','e',0, +0xd9, 0x65, 0x06, 0xa3, 'C','y','r','i','l','l','i','c','_','i','o',0, +0x02, 0x53, 0x06, 0xa4, 'U','k','r','a','i','n','i','a','n','_','i','e',0, +0x01, 0x55, 0x06, 0xa4, 'U','k','r','a','n','i','a','n','_','j','e',0, +0xfe, 0x03, 0x06, 0xa5, 'M','a','c','e','d','o','n','i','a','_','d','s','e',0, +0x00, 0xf7, 0x06, 0xa6, 'U','k','r','a','i','n','i','a','n','_','i',0, +0x80, 0x77, 0x06, 0xa6, 'U','k','r','a','n','i','a','n','_','i',0, +0x02, 0x77, 0x06, 0xa7, 'U','k','r','a','i','n','i','a','n','_','y','i',0, +0x01, 0x77, 0x06, 0xa7, 'U','k','r','a','n','i','a','n','_','y','i',0, +0xd9, 0x5d, 0x06, 0xa8, 'C','y','r','i','l','l','i','c','_','j','e',0, +0x75, 0xd5, 0x06, 0xa8, 'S','e','r','b','i','a','n','_','j','e',0, +0xb3, 0x31, 0x06, 0xa9, 'C','y','r','i','l','l','i','c','_','l','j','e',0, +0xec, 0x21, 0x06, 0xa9, 'S','e','r','b','i','a','n','_','l','j','e',0, +0xb3, 0x39, 0x06, 0xaa, 'C','y','r','i','l','l','i','c','_','n','j','e',0, +0xec, 0x29, 0x06, 0xaa, 'S','e','r','b','i','a','n','_','n','j','e',0, +0xd9, 0x11, 0x06, 0xab, 'S','e','r','b','i','a','n','_','t','s','h','e',0, +0xfe, 0x0d, 0x06, 0xac, 'M','a','c','e','d','o','n','i','a','_','k','j','e',0, +0x12, 0x26, 0x06, 0xad, 'U','k','r','a','i','n','i','a','n','_','g','h','e','_','w','i','t','h','_','u','p','t','u','r','n',0, +0x51, 0x3d, 0x06, 0xae, 'B','y','e','l','o','r','u','s','s','i','a','n','_','s','h','o','r','t','u',0, +0x66, 0xcd, 0x06, 0xaf, 'C','y','r','i','l','l','i','c','_','d','z','h','e',0, +0xec, 0x21, 0x06, 0xaf, 'S','e','r','b','i','a','n','_','d','z','e',0, +0xbc, 0x68, 0x06, 0xb0, 'n','u','m','e','r','o','s','i','g','n',0, +0xeb, 0x21, 0x06, 0xb1, 'S','e','r','b','i','a','n','_','D','J','E',0, +0xfd, 0x1d, 0x06, 0xb2, 'M','a','c','e','d','o','n','i','a','_','G','J','E',0, +0xd9, 0x05, 0x06, 0xb3, 'C','y','r','i','l','l','i','c','_','I','O',0, +0x01, 0xf3, 0x06, 0xb4, 'U','k','r','a','i','n','i','a','n','_','I','E',0, +0x00, 0xf5, 0x06, 0xb4, 'U','k','r','a','n','i','a','n','_','J','E',0, +0xfd, 0x23, 0x06, 0xb5, 'M','a','c','e','d','o','n','i','a','_','D','S','E',0, +0x00, 0xd7, 0x06, 0xb6, 'U','k','r','a','i','n','i','a','n','_','I',0, +0x80, 0x57, 0x06, 0xb6, 'U','k','r','a','n','i','a','n','_','I',0, +0x02, 0x17, 0x06, 0xb7, 'U','k','r','a','i','n','i','a','n','_','Y','I',0, +0x01, 0x17, 0x06, 0xb7, 'U','k','r','a','n','i','a','n','_','Y','I',0, +0xd8, 0xfd, 0x06, 0xb8, 'C','y','r','i','l','l','i','c','_','J','E',0, +0x75, 0x75, 0x06, 0xb8, 'S','e','r','b','i','a','n','_','J','E',0, +0xb2, 0x51, 0x06, 0xb9, 'C','y','r','i','l','l','i','c','_','L','J','E',0, +0xeb, 0x41, 0x06, 0xb9, 'S','e','r','b','i','a','n','_','L','J','E',0, +0xb2, 0x59, 0x06, 0xba, 'C','y','r','i','l','l','i','c','_','N','J','E',0, +0xeb, 0x49, 0x06, 0xba, 'S','e','r','b','i','a','n','_','N','J','E',0, +0xd7, 0x31, 0x06, 0xbb, 'S','e','r','b','i','a','n','_','T','S','H','E',0, +0xfd, 0x2d, 0x06, 0xbc, 'M','a','c','e','d','o','n','i','a','_','K','J','E',0, +0x1a, 0x46, 0x06, 0xbd, 'U','k','r','a','i','n','i','a','n','_','G','H','E','_','W','I','T','H','_','U','P','T','U','R','N',0, +0x49, 0x5d, 0x06, 0xbe, 'B','y','e','l','o','r','u','s','s','i','a','n','_','S','H','O','R','T','U',0, +0x64, 0xed, 0x06, 0xbf, 'C','y','r','i','l','l','i','c','_','D','Z','H','E',0, +0xeb, 0x41, 0x06, 0xbf, 'S','e','r','b','i','a','n','_','D','Z','E',0, +0xd9, 0x8b, 0x06, 0xc0, 'C','y','r','i','l','l','i','c','_','y','u',0, +0x6c, 0x73, 0x06, 0xc1, 'C','y','r','i','l','l','i','c','_','a',0, +0xd9, 0x4d, 0x06, 0xc2, 'C','y','r','i','l','l','i','c','_','b','e',0, +0xb3, 0x63, 0x06, 0xc3, 'C','y','r','i','l','l','i','c','_','t','s','e',0, +0xd9, 0x51, 0x06, 0xc4, 'C','y','r','i','l','l','i','c','_','d','e',0, +0xd9, 0x5b, 0x06, 0xc5, 'C','y','r','i','l','l','i','c','_','i','e',0, +0xd9, 0x54, 0x06, 0xc6, 'C','y','r','i','l','l','i','c','_','e','f',0, +0xb3, 0x19, 0x06, 0xc7, 'C','y','r','i','l','l','i','c','_','g','h','e',0, +0xd9, 0x55, 0x06, 0xc8, 'C','y','r','i','l','l','i','c','_','h','a',0, +0x6c, 0x7b, 0x06, 0xc9, 'C','y','r','i','l','l','i','c','_','i',0, +0x9d, 0xb1, 0x06, 0xca, 'C','y','r','i','l','l','i','c','_','s','h','o','r','t','i',0, +0xd9, 0x5b, 0x06, 0xcb, 'C','y','r','i','l','l','i','c','_','k','a',0, +0xd9, 0x5a, 0x06, 0xcc, 'C','y','r','i','l','l','i','c','_','e','l',0, +0xd9, 0x5b, 0x06, 0xcd, 'C','y','r','i','l','l','i','c','_','e','m',0, +0xd9, 0x5c, 0x06, 0xce, 'C','y','r','i','l','l','i','c','_','e','n',0, +0x6c, 0x81, 0x06, 0xcf, 'C','y','r','i','l','l','i','c','_','o',0, +0xd9, 0x69, 0x06, 0xd0, 'C','y','r','i','l','l','i','c','_','p','e',0, +0xd9, 0x77, 0x06, 0xd1, 'C','y','r','i','l','l','i','c','_','y','a',0, +0xd9, 0x60, 0x06, 0xd2, 'C','y','r','i','l','l','i','c','_','e','r',0, +0xd9, 0x61, 0x06, 0xd3, 'C','y','r','i','l','l','i','c','_','e','s',0, +0xd9, 0x71, 0x06, 0xd4, 'C','y','r','i','l','l','i','c','_','t','e',0, +0x6c, 0x87, 0x06, 0xd5, 'C','y','r','i','l','l','i','c','_','u',0, +0xb3, 0x65, 0x06, 0xd6, 'C','y','r','i','l','l','i','c','_','z','h','e',0, +0xd9, 0x75, 0x06, 0xd7, 'C','y','r','i','l','l','i','c','_','v','e',0, +0x78, 0xb8, 0x06, 0xd8, 'C','y','r','i','l','l','i','c','_','s','o','f','t','s','i','g','n',0, +0x67, 0x45, 0x06, 0xd9, 'C','y','r','i','l','l','i','c','_','y','e','r','u',0, +0xd9, 0x7d, 0x06, 0xda, 'C','y','r','i','l','l','i','c','_','z','e',0, +0xb3, 0x45, 0x06, 0xdb, 'C','y','r','i','l','l','i','c','_','s','h','a',0, +0x6c, 0x77, 0x06, 0xdc, 'C','y','r','i','l','l','i','c','_','e',0, +0xce, 0x4d, 0x06, 0xdd, 'C','y','r','i','l','l','i','c','_','s','h','c','h','a',0, +0xb3, 0x09, 0x06, 0xde, 'C','y','r','i','l','l','i','c','_','c','h','e',0, +0x70, 0x38, 0x06, 0xdf, 'C','y','r','i','l','l','i','c','_','h','a','r','d','s','i','g','n',0, +0xd9, 0x2b, 0x06, 0xe0, 'C','y','r','i','l','l','i','c','_','Y','U',0, +0x6c, 0x53, 0x06, 0xe1, 'C','y','r','i','l','l','i','c','_','A',0, +0xd8, 0xed, 0x06, 0xe2, 'C','y','r','i','l','l','i','c','_','B','E',0, +0xb2, 0x83, 0x06, 0xe3, 'C','y','r','i','l','l','i','c','_','T','S','E',0, +0xd8, 0xf1, 0x06, 0xe4, 'C','y','r','i','l','l','i','c','_','D','E',0, +0xd8, 0xfb, 0x06, 0xe5, 'C','y','r','i','l','l','i','c','_','I','E',0, +0xd8, 0xf4, 0x06, 0xe6, 'C','y','r','i','l','l','i','c','_','E','F',0, +0xb2, 0x39, 0x06, 0xe7, 'C','y','r','i','l','l','i','c','_','G','H','E',0, +0xd8, 0xf5, 0x06, 0xe8, 'C','y','r','i','l','l','i','c','_','H','A',0, +0x6c, 0x5b, 0x06, 0xe9, 'C','y','r','i','l','l','i','c','_','I',0, +0x95, 0xd1, 0x06, 0xea, 'C','y','r','i','l','l','i','c','_','S','H','O','R','T','I',0, +0xd8, 0xfb, 0x06, 0xeb, 'C','y','r','i','l','l','i','c','_','K','A',0, +0xd8, 0xfa, 0x06, 0xec, 'C','y','r','i','l','l','i','c','_','E','L',0, +0xd8, 0xfb, 0x06, 0xed, 'C','y','r','i','l','l','i','c','_','E','M',0, +0xd8, 0xfc, 0x06, 0xee, 'C','y','r','i','l','l','i','c','_','E','N',0, +0x6c, 0x61, 0x06, 0xef, 'C','y','r','i','l','l','i','c','_','O',0, +0xd9, 0x09, 0x06, 0xf0, 'C','y','r','i','l','l','i','c','_','P','E',0, +0xd9, 0x17, 0x06, 0xf1, 'C','y','r','i','l','l','i','c','_','Y','A',0, +0xd9, 0x00, 0x06, 0xf2, 'C','y','r','i','l','l','i','c','_','E','R',0, +0xd9, 0x01, 0x06, 0xf3, 'C','y','r','i','l','l','i','c','_','E','S',0, +0xd9, 0x11, 0x06, 0xf4, 'C','y','r','i','l','l','i','c','_','T','E',0, +0x6c, 0x67, 0x06, 0xf5, 'C','y','r','i','l','l','i','c','_','U',0, +0xb2, 0x85, 0x06, 0xf6, 'C','y','r','i','l','l','i','c','_','Z','H','E',0, +0xd9, 0x15, 0x06, 0xf7, 'C','y','r','i','l','l','i','c','_','V','E',0, +0x58, 0xd8, 0x06, 0xf8, 'C','y','r','i','l','l','i','c','_','S','O','F','T','S','I','G','N',0, +0x65, 0x65, 0x06, 0xf9, 'C','y','r','i','l','l','i','c','_','Y','E','R','U',0, +0xd9, 0x1d, 0x06, 0xfa, 'C','y','r','i','l','l','i','c','_','Z','E',0, +0xb2, 0x65, 0x06, 0xfb, 'C','y','r','i','l','l','i','c','_','S','H','A',0, +0x6c, 0x57, 0x06, 0xfc, 'C','y','r','i','l','l','i','c','_','E',0, +0xca, 0x6d, 0x06, 0xfd, 'C','y','r','i','l','l','i','c','_','S','H','C','H','A',0, +0xb2, 0x29, 0x06, 0xfe, 'C','y','r','i','l','l','i','c','_','C','H','E',0, +0x50, 0x58, 0x06, 0xff, 'C','y','r','i','l','l','i','c','_','H','A','R','D','S','I','G','N',0, +0xc0, 0x8c, 0x07, 0xa1, 'G','r','e','e','k','_','A','L','P','H','A','a','c','c','e','n','t',0, +0x6d, 0x4c, 0x07, 0xa2, 'G','r','e','e','k','_','E','P','S','I','L','O','N','a','c','c','e','n','t',0, +0x79, 0x8c, 0x07, 0xa3, 'G','r','e','e','k','_','E','T','A','a','c','c','e','n','t',0, +0xf7, 0x8c, 0x07, 0xa4, 'G','r','e','e','k','_','I','O','T','A','a','c','c','e','n','t',0, +0xe3, 0x39, 0x07, 0xa5, 'G','r','e','e','k','_','I','O','T','A','d','i','e','r','e','s','i','s',0, +0xc7, 0x4c, 0x07, 0xa7, 'G','r','e','e','k','_','O','M','I','C','R','O','N','a','c','c','e','n','t',0, +0x6d, 0x4c, 0x07, 0xa8, 'G','r','e','e','k','_','U','P','S','I','L','O','N','a','c','c','e','n','t',0, +0xba, 0x39, 0x07, 0xa9, 'G','r','e','e','k','_','U','P','S','I','L','O','N','d','i','e','r','e','s','i','s',0, +0xef, 0x0c, 0x07, 0xab, 'G','r','e','e','k','_','O','M','E','G','A','a','c','c','e','n','t',0, +0xf2, 0x39, 0x07, 0xae, 'G','r','e','e','k','_','a','c','c','e','n','t','d','i','e','r','e','s','i','s',0, +0x5c, 0x1c, 0x07, 0xaf, 'G','r','e','e','k','_','h','o','r','i','z','b','a','r',0, +0xb8, 0x8c, 0x07, 0xb1, 'G','r','e','e','k','_','a','l','p','h','a','a','c','c','e','n','t',0, +0x65, 0x4c, 0x07, 0xb2, 'G','r','e','e','k','_','e','p','s','i','l','o','n','a','c','c','e','n','t',0, +0xb1, 0x8c, 0x07, 0xb3, 'G','r','e','e','k','_','e','t','a','a','c','c','e','n','t',0, +0x6f, 0x8c, 0x07, 0xb4, 'G','r','e','e','k','_','i','o','t','a','a','c','c','e','n','t',0, +0xc3, 0x39, 0x07, 0xb5, 'G','r','e','e','k','_','i','o','t','a','d','i','e','r','e','s','i','s',0, +0xf2, 0x39, 0x07, 0xb6, 'G','r','e','e','k','_','i','o','t','a','a','c','c','e','n','t','d','i','e','r','e','s','i','s',0, +0xbf, 0x4c, 0x07, 0xb7, 'G','r','e','e','k','_','o','m','i','c','r','o','n','a','c','c','e','n','t',0, +0x65, 0x4c, 0x07, 0xb8, 'G','r','e','e','k','_','u','p','s','i','l','o','n','a','c','c','e','n','t',0, +0x9a, 0x39, 0x07, 0xb9, 'G','r','e','e','k','_','u','p','s','i','l','o','n','d','i','e','r','e','s','i','s',0, +0xb2, 0x39, 0x07, 0xba, 'G','r','e','e','k','_','u','p','s','i','l','o','n','a','c','c','e','n','t','d','i','e','r','e','s','i','s',0, +0xe7, 0x0c, 0x07, 0xbb, 'G','r','e','e','k','_','o','m','e','g','a','a','c','c','e','n','t',0, +0xc6, 0xa1, 0x07, 0xc1, 'G','r','e','e','k','_','A','L','P','H','A',0, +0x63, 0x1d, 0x07, 0xc2, 'G','r','e','e','k','_','B','E','T','A',0, +0xc6, 0xa7, 0x07, 0xc3, 'G','r','e','e','k','_','G','A','M','M','A',0, +0xc6, 0xa1, 0x07, 0xc4, 'G','r','e','e','k','_','D','E','L','T','A',0, +0x1d, 0x54, 0x07, 0xc5, 'G','r','e','e','k','_','E','P','S','I','L','O','N',0, +0x63, 0xdd, 0x07, 0xc6, 'G','r','e','e','k','_','Z','E','T','A',0, +0xb1, 0x85, 0x07, 0xc7, 'G','r','e','e','k','_','E','T','A',0, +0xc7, 0x9d, 0x07, 0xc8, 'G','r','e','e','k','_','T','H','E','T','A',0, +0x63, 0x7d, 0x07, 0xc9, 'G','r','e','e','k','_','I','O','T','A',0, +0xc6, 0xf9, 0x07, 0xca, 'G','r','e','e','k','_','K','A','P','P','A',0, +0xc6, 0xe5, 0x07, 0xcb, 'G','r','e','e','k','_','L','A','M','D','A',0, +0x8e, 0x09, 0x07, 0xcb, 'G','r','e','e','k','_','L','A','M','B','D','A',0, +0x58, 0xb3, 0x07, 0xcc, 'G','r','e','e','k','_','M','U',0, +0x58, 0xb5, 0x07, 0xcd, 'G','r','e','e','k','_','N','U',0, +0x58, 0xbd, 0x07, 0xce, 'G','r','e','e','k','_','X','I',0, +0x1e, 0xbc, 0x07, 0xcf, 'G','r','e','e','k','_','O','M','I','C','R','O','N',0, +0x58, 0xad, 0x07, 0xd0, 'G','r','e','e','k','_','P','I',0, +0xb1, 0xaf, 0x07, 0xd1, 'G','r','e','e','k','_','R','H','O',0, +0xc7, 0x8f, 0x07, 0xd2, 'G','r','e','e','k','_','S','I','G','M','A',0, +0xb1, 0xaf, 0x07, 0xd4, 'G','r','e','e','k','_','T','A','U',0, +0x21, 0x54, 0x07, 0xd5, 'G','r','e','e','k','_','U','P','S','I','L','O','N',0, +0xb1, 0xa1, 0x07, 0xd6, 'G','r','e','e','k','_','P','H','I',0, +0xb1, 0x6d, 0x07, 0xd7, 'G','r','e','e','k','_','C','H','I',0, +0xb1, 0xb7, 0x07, 0xd8, 'G','r','e','e','k','_','P','S','I',0, +0xc7, 0x5b, 0x07, 0xd9, 'G','r','e','e','k','_','O','M','E','G','A',0, +0xca, 0x81, 0x07, 0xe1, 'G','r','e','e','k','_','a','l','p','h','a',0, +0x64, 0xfd, 0x07, 0xe2, 'G','r','e','e','k','_','b','e','t','a',0, +0xca, 0x87, 0x07, 0xe3, 'G','r','e','e','k','_','g','a','m','m','a',0, +0xca, 0x81, 0x07, 0xe4, 'G','r','e','e','k','_','d','e','l','t','a',0, +0x2d, 0x34, 0x07, 0xe5, 'G','r','e','e','k','_','e','p','s','i','l','o','n',0, +0x65, 0xbd, 0x07, 0xe6, 'G','r','e','e','k','_','z','e','t','a',0, +0xb2, 0x65, 0x07, 0xe7, 'G','r','e','e','k','_','e','t','a',0, +0xcb, 0x7d, 0x07, 0xe8, 'G','r','e','e','k','_','t','h','e','t','a',0, +0x65, 0x5d, 0x07, 0xe9, 'G','r','e','e','k','_','i','o','t','a',0, +0xca, 0xd9, 0x07, 0xea, 'G','r','e','e','k','_','k','a','p','p','a',0, +0xca, 0xc5, 0x07, 0xeb, 'G','r','e','e','k','_','l','a','m','d','a',0, +0x95, 0xe9, 0x07, 0xeb, 'G','r','e','e','k','_','l','a','m','b','d','a',0, +0x59, 0x13, 0x07, 0xec, 'G','r','e','e','k','_','m','u',0, +0x59, 0x15, 0x07, 0xed, 'G','r','e','e','k','_','n','u',0, +0x59, 0x1d, 0x07, 0xee, 'G','r','e','e','k','_','x','i',0, +0x2e, 0x9c, 0x07, 0xef, 'G','r','e','e','k','_','o','m','i','c','r','o','n',0, +0x59, 0x0d, 0x07, 0xf0, 'G','r','e','e','k','_','p','i',0, +0xb2, 0x8f, 0x07, 0xf1, 'G','r','e','e','k','_','r','h','o',0, +0xcb, 0x6f, 0x07, 0xf2, 'G','r','e','e','k','_','s','i','g','m','a',0, +0x71, 0x4f, 0x07, 0xf3, 'G','r','e','e','k','_','f','i','n','a','l','s','m','a','l','l','s','i','g','m','a',0, +0xb2, 0x8f, 0x07, 0xf4, 'G','r','e','e','k','_','t','a','u',0, +0x31, 0x34, 0x07, 0xf5, 'G','r','e','e','k','_','u','p','s','i','l','o','n',0, +0xb2, 0x81, 0x07, 0xf6, 'G','r','e','e','k','_','p','h','i',0, +0xb2, 0x4d, 0x07, 0xf7, 'G','r','e','e','k','_','c','h','i',0, +0xb2, 0x97, 0x07, 0xf8, 'G','r','e','e','k','_','p','s','i',0, +0xcb, 0x3b, 0x07, 0xf9, 'G','r','e','e','k','_','o','m','e','g','a',0, +0x98, 0x56, 0xff, 0x7e, 'G','r','e','e','k','_','s','w','i','t','c','h',0, +0x4e, 0xe2, 0x08, 0xa1, 'l','e','f','t','r','a','d','i','c','a','l',0, +0x3e, 0xe2, 0x08, 0xa2, 't','o','p','l','e','f','t','r','a','d','i','c','a','l',0, +0xe8, 0x48, 0x08, 0xa3, 'h','o','r','i','z','c','o','n','n','e','c','t','o','r',0, +0x88, 0xfe, 0x08, 0xa4, 't','o','p','i','n','t','e','g','r','a','l',0, +0x44, 0xfe, 0x08, 0xa5, 'b','o','t','i','n','t','e','g','r','a','l',0, +0x08, 0x48, 0x08, 0xa6, 'v','e','r','t','c','o','n','n','e','c','t','o','r',0, +0x06, 0x52, 0x08, 0xa7, 't','o','p','l','e','f','t','s','q','b','r','a','c','k','e','t',0, +0x86, 0x52, 0x08, 0xa8, 'b','o','t','l','e','f','t','s','q','b','r','a','c','k','e','t',0, +0xee, 0x52, 0x08, 0xa9, 't','o','p','r','i','g','h','t','s','q','b','r','a','c','k','e','t',0, +0xee, 0x52, 0x08, 0xaa, 'b','o','t','r','i','g','h','t','s','q','b','r','a','c','k','e','t',0, +0x1f, 0x83, 0x08, 0xab, 't','o','p','l','e','f','t','p','a','r','e','n','s',0, +0x0f, 0x83, 0x08, 0xac, 'b','o','t','l','e','f','t','p','a','r','e','n','s',0, +0x5c, 0x83, 0x08, 0xad, 't','o','p','r','i','g','h','t','p','a','r','e','n','s',0, +0x3c, 0x83, 0x08, 0xae, 'b','o','t','r','i','g','h','t','p','a','r','e','n','s',0, +0x1e, 0x7f, 0x08, 0xaf, 'l','e','f','t','m','i','d','d','l','e','c','u','r','l','y','b','r','a','c','e',0, +0x1e, 0x7f, 0x08, 0xb0, 'r','i','g','h','t','m','i','d','d','l','e','c','u','r','l','y','b','r','a','c','e',0, +0x0b, 0x00, 0x08, 0xb1, 't','o','p','l','e','f','t','s','u','m','m','a','t','i','o','n',0, +0x8b, 0x00, 0x08, 0xb2, 'b','o','t','l','e','f','t','s','u','m','m','a','t','i','o','n',0, +0xd0, 0x48, 0x08, 0xb3, 't','o','p','v','e','r','t','s','u','m','m','a','t','i','o','n','c','o','n','n','e','c','t','o','r',0, +0xd0, 0x48, 0x08, 0xb4, 'b','o','t','v','e','r','t','s','u','m','m','a','t','i','o','n','c','o','n','n','e','c','t','o','r',0, +0xf3, 0x00, 0x08, 0xb5, 't','o','p','r','i','g','h','t','s','u','m','m','a','t','i','o','n',0, +0xf3, 0x00, 0x08, 0xb6, 'b','o','t','r','i','g','h','t','s','u','m','m','a','t','i','o','n',0, +0x1d, 0x00, 0x08, 0xb7, 'r','i','g','h','t','m','i','d','d','l','e','s','u','m','m','a','t','i','o','n',0, +0x74, 0xda, 0x08, 0xbc, 'l','e','s','s','t','h','a','n','e','q','u','a','l',0, +0x6e, 0x1a, 0x08, 0xbd, 'n','o','t','e','q','u','a','l',0, +0xa2, 0xda, 0x08, 0xbe, 'g','r','e','a','t','e','r','t','h','a','n','e','q','u','a','l',0, +0x6a, 0xfe, 0x08, 0xbf, 'i','n','t','e','g','r','a','l',0, +0xdc, 0x05, 0x08, 0xc0, 't','h','e','r','e','f','o','r','e',0, +0xdc, 0xc0, 0x08, 0xc1, 'v','a','r','i','a','t','i','o','n',0, +0x69, 0xc5, 0x08, 0xc2, 'i','n','f','i','n','i','t','y',0, +0x0c, 0xa9, 0x08, 0xc5, 'n','a','b','l','a',0, +0x44, 0x89, 0x08, 0xc8, 'a','p','p','r','o','x','i','m','a','t','e',0, +0xe8, 0x5a, 0x08, 0xc9, 's','i','m','i','l','a','r','e','q','u','a','l',0, +0x69, 0x3c, 0x08, 0xcd, 'i','f','o','n','l','y','i','f',0, +0x35, 0x21, 0x08, 0xce, 'i','m','p','l','i','e','s',0, +0xcf, 0x42, 0x08, 0xcf, 'i','d','e','n','t','i','c','a','l',0, +0x34, 0xe2, 0x08, 0xd6, 'r','a','d','i','c','a','l',0, +0xa7, 0x58, 0x08, 0xda, 'i','n','c','l','u','d','e','d','i','n',0, +0x69, 0x95, 0x08, 0xdb, 'i','n','c','l','u','d','e','s',0, +0xbc, 0x20, 0x08, 0xdc, 'i','n','t','e','r','s','e','c','t','i','o','n',0, +0x0d, 0xb0, 0x08, 0xdd, 'u','n','i','o','n',0, +0xad, 0x54, 0x08, 0xde, 'l','o','g','i','c','a','l','a','n','d',0, +0xd6, 0x98, 0x08, 0xdf, 'l','o','g','i','c','a','l','o','r',0, +0x63, 0xa5, 0x08, 0xef, 'p','a','r','t','i','a','l','d','e','r','i','v','a','t','i','v','e',0, +0x6a, 0xc0, 0x08, 0xf6, 'f','u','n','c','t','i','o','n',0, +0xd3, 0x3d, 0x08, 0xfb, 'l','e','f','t','a','r','r','o','w',0, +0x37, 0xfd, 0x08, 0xfc, 'u','p','a','r','r','o','w',0, +0xb5, 0xbd, 0x08, 0xfd, 'r','i','g','h','t','a','r','r','o','w',0, +0xd3, 0xbd, 0x08, 0xfe, 'd','o','w','n','a','r','r','o','w',0, +0x0c, 0x4b, 0x09, 0xdf, 'b','l','a','n','k',0, +0xf9, 0x94, 0x09, 0xe0, 's','o','l','i','d','d','i','a','m','o','n','d',0, +0x4e, 0x64, 0x09, 0xe1, 'c','h','e','c','k','e','r','b','o','a','r','d',0, +0x01, 0x44, 0x09, 0xe2, 'h','t',0, +0x01, 0x32, 0x09, 0xe3, 'f','f',0, +0x01, 0x38, 0x09, 0xe4, 'c','r',0, +0x01, 0x3e, 0x09, 0xe5, 'l','f',0, +0x01, 0x48, 0x09, 0xe8, 'n','l',0, +0x01, 0x60, 0x09, 0xe9, 'v','t',0, +0x93, 0xd4, 0x09, 0xea, 'l','o','w','r','i','g','h','t','c','o','r','n','e','r',0, +0x3b, 0xd4, 0x09, 0xeb, 'u','p','r','i','g','h','t','c','o','r','n','e','r',0, +0x0e, 0xd4, 0x09, 0xec, 'u','p','l','e','f','t','c','o','r','n','e','r',0, +0xba, 0xd4, 0x09, 0xed, 'l','o','w','l','e','f','t','c','o','r','n','e','r',0, +0x3e, 0xdd, 0x09, 0xee, 'c','r','o','s','s','i','n','g','l','i','n','e','s',0, +0xed, 0x79, 0x09, 0xef, 'h','o','r','i','z','l','i','n','e','s','c','a','n','1',0, +0xed, 0x7b, 0x09, 0xf0, 'h','o','r','i','z','l','i','n','e','s','c','a','n','3',0, +0xed, 0x7d, 0x09, 0xf1, 'h','o','r','i','z','l','i','n','e','s','c','a','n','5',0, +0xed, 0x7f, 0x09, 0xf2, 'h','o','r','i','z','l','i','n','e','s','c','a','n','7',0, +0xed, 0x81, 0x09, 0xf3, 'h','o','r','i','z','l','i','n','e','s','c','a','n','9',0, +0x0c, 0xdc, 0x09, 0xf4, 'l','e','f','t','t',0, +0x1b, 0x04, 0x09, 0xf5, 'r','i','g','h','t','t',0, +0x06, 0x28, 0x09, 0xf6, 'b','o','t','t',0, +0x06, 0xb0, 0x09, 0xf7, 't','o','p','t',0, +0x37, 0x9c, 0x09, 0xf8, 'v','e','r','t','b','a','r',0, +0x34, 0x3f, 0x0a, 0xa1, 'e','m','s','p','a','c','e',0, +0x34, 0x5f, 0x0a, 0xa2, 'e','n','s','p','a','c','e',0, +0x61, 0x7f, 0x0a, 0xa3, 'e','m','3','s','p','a','c','e',0, +0x61, 0x9f, 0x0a, 0xa4, 'e','m','4','s','p','a','c','e',0, +0x9a, 0x9f, 0x0a, 0xa5, 'd','i','g','i','t','s','p','a','c','e',0, +0xc0, 0x9f, 0x0a, 0xa6, 'p','u','n','c','t','s','p','a','c','e',0, +0xdd, 0x5f, 0x0a, 0xa7, 't','h','i','n','s','p','a','c','e',0, +0xce, 0x5f, 0x0a, 0xa8, 'h','a','i','r','s','p','a','c','e',0, +0x19, 0x62, 0x0a, 0xa9, 'e','m','d','a','s','h',0, +0x19, 0x72, 0x0a, 0xaa, 'e','n','d','a','s','h',0, +0x6f, 0x4b, 0x0a, 0xac, 's','i','g','n','i','f','b','l','a','n','k',0, +0x68, 0x21, 0x0a, 0xae, 'e','l','l','i','p','s','i','s',0, +0x64, 0x8a, 0x0a, 0xaf, 'd','o','u','b','b','a','s','e','l','i','n','e','d','o','t',0, +0x6d, 0x0c, 0x0a, 0xb0, 'o','n','e','t','h','i','r','d',0, +0xe6, 0x8b, 0x0a, 0xb1, 't','w','o','t','h','i','r','d','s',0, +0x6c, 0x30, 0x0a, 0xb2, 'o','n','e','f','i','f','t','h',0, +0xe4, 0xd3, 0x0a, 0xb3, 't','w','o','f','i','f','t','h','s',0, +0x77, 0x53, 0x0a, 0xb4, 't','h','r','e','e','f','i','f','t','h','s',0, +0xab, 0x93, 0x0a, 0xb5, 'f','o','u','r','f','i','f','t','h','s',0, +0x6d, 0x48, 0x0a, 0xb6, 'o','n','e','s','i','x','t','h',0, +0xa5, 0x03, 0x0a, 0xb7, 'f','i','v','e','s','i','x','t','h','s',0, +0x18, 0xd8, 0x0a, 0xb8, 'c','a','r','e','o','f',0, +0x33, 0x02, 0x0a, 0xbb, 'f','i','g','d','a','s','h',0, +0x9f, 0x52, 0x0a, 0xbc, 'l','e','f','t','a','n','g','l','e','b','r','a','c','k','e','t',0, +0x4c, 0xac, 0x0a, 0xbd, 'd','e','c','i','m','a','l','p','o','i','n','t',0, +0xdf, 0x52, 0x0a, 0xbe, 'r','i','g','h','t','a','n','g','l','e','b','r','a','c','k','e','t',0, +0x1a, 0x28, 0x0a, 0xbf, 'm','a','r','k','e','r',0, +0xd8, 0x98, 0x0a, 0xc3, 'o','n','e','e','i','g','h','t','h',0, +0xee, 0xa3, 0x0a, 0xc4, 't','h','r','e','e','e','i','g','h','t','h','s',0, +0x45, 0xa3, 0x0a, 0xc5, 'f','i','v','e','e','i','g','h','t','h','s',0, +0xe7, 0x23, 0x0a, 0xc6, 's','e','v','e','n','e','i','g','h','t','h','s',0, +0xde, 0x4b, 0x0a, 0xc9, 't','r','a','d','e','m','a','r','k',0, +0xc3, 0x0b, 0x0a, 0xca, 's','i','g','n','a','t','u','r','e','m','a','r','k',0, +0xb4, 0x49, 0x0a, 0xcb, 't','r','a','d','e','m','a','r','k','i','n','c','i','r','c','l','e',0, +0x1f, 0xf9, 0x0a, 0xcc, 'l','e','f','t','o','p','e','n','t','r','i','a','n','g','l','e',0, +0x5f, 0xf9, 0x0a, 0xcd, 'r','i','g','h','t','o','p','e','n','t','r','i','a','n','g','l','e',0, +0x91, 0x49, 0x0a, 0xce, 'e','m','o','p','e','n','c','i','r','c','l','e',0, +0x98, 0x19, 0x0a, 0xcf, 'e','m','o','p','e','n','r','e','c','t','a','n','g','l','e',0, +0x54, 0x4b, 0x0a, 0xd0, 'l','e','f','t','s','i','n','g','l','e','q','u','o','t','e','m','a','r','k',0, +0x54, 0x4b, 0x0a, 0xd1, 'r','i','g','h','t','s','i','n','g','l','e','q','u','o','t','e','m','a','r','k',0, +0x9c, 0x4b, 0x0a, 0xd2, 'l','e','f','t','d','o','u','b','l','e','q','u','o','t','e','m','a','r','k',0, +0x9c, 0x4b, 0x0a, 0xd3, 'r','i','g','h','t','d','o','u','b','l','e','q','u','o','t','e','m','a','r','k',0, +0xed, 0xb0, 0x0a, 0xd4, 'p','r','e','s','c','r','i','p','t','i','o','n',0, +0x35, 0xf5, 0x0a, 0xd6, 'm','i','n','u','t','e','s',0, +0x35, 0xfb, 0x0a, 0xd7, 's','e','c','o','n','d','s',0, +0xa7, 0xd5, 0x0a, 0xd9, 'l','a','t','i','n','c','r','o','s','s',0, +0x68, 0x7f, 0x0a, 0xda, 'h','e','x','a','g','r','a','m',0, +0xe9, 0x5e, 0x0a, 0xdb, 'f','i','l','l','e','d','r','e','c','t','b','u','l','l','e','t',0, +0x09, 0x1e, 0x0a, 0xdc, 'f','i','l','l','e','d','l','e','f','t','t','r','i','b','u','l','l','e','t',0, +0xf1, 0x1e, 0x0a, 0xdd, 'f','i','l','l','e','d','r','i','g','h','t','t','r','i','b','u','l','l','e','t',0, +0xec, 0xc9, 0x0a, 0xde, 'e','m','f','i','l','l','e','d','c','i','r','c','l','e',0, +0x7b, 0x3e, 0x0a, 0xdf, 'e','m','f','i','l','l','e','d','r','e','c','t',0, +0x5a, 0x9e, 0x0a, 0xe0, 'e','n','o','p','e','n','c','i','r','c','b','u','l','l','e','t',0, +0x13, 0x1e, 0x0a, 0xe1, 'e','n','o','p','e','n','s','q','u','a','r','e','b','u','l','l','e','t',0, +0x71, 0x5e, 0x0a, 0xe2, 'o','p','e','n','r','e','c','t','b','u','l','l','e','t',0, +0x05, 0xd2, 0x0a, 0xe3, 'o','p','e','n','t','r','i','b','u','l','l','e','t','u','p',0, +0x18, 0x18, 0x0a, 0xe4, 'o','p','e','n','t','r','i','b','u','l','l','e','t','d','o','w','n',0, +0x6d, 0x9c, 0x0a, 0xe5, 'o','p','e','n','s','t','a','r',0, +0xd2, 0x9e, 0x0a, 0xe6, 'e','n','f','i','l','l','e','d','c','i','r','c','b','u','l','l','e','t',0, +0xfd, 0x9e, 0x0a, 0xe7, 'e','n','f','i','l','l','e','d','s','q','b','u','l','l','e','t',0, +0xf5, 0xd2, 0x0a, 0xe8, 'f','i','l','l','e','d','t','r','i','b','u','l','l','e','t','u','p',0, +0xd8, 0x18, 0x0a, 0xe9, 'f','i','l','l','e','d','t','r','i','b','u','l','l','e','t','d','o','w','n',0, +0x50, 0xec, 0x0a, 0xea, 'l','e','f','t','p','o','i','n','t','e','r',0, +0xda, 0xec, 0x0a, 0xeb, 'r','i','g','h','t','p','o','i','n','t','e','r',0, +0x06, 0x14, 0x0a, 0xec, 'c','l','u','b',0, +0x32, 0x94, 0x0a, 0xed, 'd','i','a','m','o','n','d',0, +0x0c, 0x84, 0x0a, 0xee, 'h','e','a','r','t',0, +0xa0, 0xb5, 0x0a, 0xf0, 'm','a','l','t','e','s','e','c','r','o','s','s',0, +0x18, 0xa0, 0x0a, 0xf1, 'd','a','g','g','e','r',0, +0x8f, 0xe0, 0x0a, 0xf2, 'd','o','u','b','l','e','d','a','g','g','e','r',0, +0xc9, 0x8b, 0x0a, 0xf3, 'c','h','e','c','k','m','a','r','k',0, +0x23, 0x15, 0x0a, 0xf4, 'b','a','l','l','o','t','c','r','o','s','s',0, +0xef, 0x88, 0x0a, 0xf5, 'm','u','s','i','c','a','l','s','h','a','r','p',0, +0x77, 0x36, 0x0a, 0xf6, 'm','u','s','i','c','a','l','f','l','a','t',0, +0xa6, 0x6a, 0x0a, 0xf7, 'm','a','l','e','s','y','m','b','o','l',0, +0x6a, 0x6a, 0x0a, 0xf8, 'f','e','m','a','l','e','s','y','m','b','o','l',0, +0xdb, 0x5d, 0x0a, 0xf9, 't','e','l','e','p','h','o','n','e',0, +0xc8, 0xec, 0x0a, 0xfa, 't','e','l','e','p','h','o','n','e','r','e','c','o','r','d','e','r',0, +0x2a, 0xe8, 0x0a, 0xfb, 'p','h','o','n','o','g','r','a','p','h','c','o','p','y','r','i','g','h','t',0, +0x0c, 0x3e, 0x0a, 0xfc, 'c','a','r','e','t',0, +0x7c, 0x4b, 0x0a, 0xfd, 's','i','n','g','l','e','l','o','w','q','u','o','t','e','m','a','r','k',0, +0xbc, 0x4b, 0x0a, 0xfe, 'd','o','u','b','l','e','l','o','w','q','u','o','t','e','m','a','r','k',0, +0x1a, 0x5c, 0x0a, 0xff, 'c','u','r','s','o','r',0, +0xd2, 0xbe, 0x0b, 0xa3, 'l','e','f','t','c','a','r','e','t',0, +0xb5, 0x3e, 0x0b, 0xa6, 'r','i','g','h','t','c','a','r','e','t',0, +0xd3, 0x3e, 0x0b, 0xa8, 'd','o','w','n','c','a','r','e','t',0, +0x37, 0x7e, 0x0b, 0xa9, 'u','p','c','a','r','e','t',0, +0x37, 0x1c, 0x0b, 0xc0, 'o','v','e','r','b','a','r',0, +0x69, 0xd5, 0x0b, 0xc2, 'd','o','w','n','t','a','c','k',0, +0x1c, 0x1b, 0x0b, 0xc3, 'u','p','s','h','o','e',0, +0xd4, 0xb1, 0x0b, 0xc4, 'd','o','w','n','s','t','i','l','e',0, +0x6f, 0x1c, 0x0b, 0xc6, 'u','n','d','e','r','b','a','r',0, +0x02, 0xfa, 0x0b, 0xca, 'j','o','t',0, +0x06, 0x82, 0x0b, 0xcc, 'q','u','a','d',0, +0x1b, 0xf5, 0x0b, 0xce, 'u','p','t','a','c','k',0, +0x19, 0x49, 0x0b, 0xcf, 'c','i','r','c','l','e',0, +0x38, 0xf1, 0x0b, 0xd3, 'u','p','s','t','i','l','e',0, +0x69, 0xfb, 0x0b, 0xd6, 'd','o','w','n','s','h','o','e',0, +0xda, 0xfb, 0x0b, 0xd8, 'r','i','g','h','t','s','h','o','e',0, +0x69, 0xbb, 0x0b, 0xda, 'l','e','f','t','s','h','o','e',0, +0x69, 0x95, 0x0b, 0xdc, 'l','e','f','t','t','a','c','k',0, +0xda, 0xd5, 0x0b, 0xfc, 'r','i','g','h','t','t','a','c','k',0, +0x45, 0x15, 0x0c, 0xdf, 'h','e','b','r','e','w','_','d','o','u','b','l','e','l','o','w','l','i','n','e',0, +0x72, 0x6c, 0x0c, 0xe0, 'h','e','b','r','e','w','_','a','l','e','p','h',0, +0x9c, 0x4e, 0x0c, 0xe1, 'h','e','b','r','e','w','_','b','e','t',0, +0x39, 0x04, 0x0c, 0xe1, 'h','e','b','r','e','w','_','b','e','t','h',0, +0x72, 0xc2, 0x0c, 0xe2, 'h','e','b','r','e','w','_','g','i','m','e','l',0, +0xe6, 0x02, 0x0c, 0xe2, 'h','e','b','r','e','w','_','g','i','m','m','e','l',0, +0x72, 0x56, 0x0c, 0xe3, 'h','e','b','r','e','w','_','d','a','l','e','t',0, +0xe5, 0x14, 0x0c, 0xe3, 'h','e','b','r','e','w','_','d','a','l','e','t','h',0, +0xcd, 0xf9, 0x0c, 0xe4, 'h','e','b','r','e','w','_','h','e',0, +0x9c, 0x9d, 0x0c, 0xe5, 'h','e','b','r','e','w','_','w','a','w',0, +0x39, 0xa4, 0x0c, 0xe6, 'h','e','b','r','e','w','_','z','a','i','n',0, +0x73, 0xec, 0x0c, 0xe6, 'h','e','b','r','e','w','_','z','a','y','i','n',0, +0x39, 0x06, 0x0c, 0xe7, 'h','e','b','r','e','w','_','c','h','e','t',0, +0x9c, 0x66, 0x0c, 0xe7, 'h','e','b','r','e','w','_','h','e','t',0, +0x9c, 0x96, 0x0c, 0xe8, 'h','e','b','r','e','w','_','t','e','t',0, +0x39, 0x94, 0x0c, 0xe8, 'h','e','b','r','e','w','_','t','e','t','h',0, +0x9c, 0xae, 0x0c, 0xe9, 'h','e','b','r','e','w','_','y','o','d',0, +0x31, 0x04, 0x0c, 0xea, 'h','e','b','r','e','w','_','f','i','n','a','l','k','a','p','h',0, +0x39, 0x34, 0x0c, 0xeb, 'h','e','b','r','e','w','_','k','a','p','h',0, +0x72, 0xca, 0x0c, 0xec, 'h','e','b','r','e','w','_','l','a','m','e','d',0, +0x98, 0x5b, 0x0c, 0xed, 'h','e','b','r','e','w','_','f','i','n','a','l','m','e','m',0, +0x9c, 0x73, 0x0c, 0xee, 'h','e','b','r','e','w','_','m','e','m',0, +0x98, 0x80, 0x0c, 0xef, 'h','e','b','r','e','w','_','f','i','n','a','l','n','u','n',0, +0x9c, 0x98, 0x0c, 0xf0, 'h','e','b','r','e','w','_','n','u','n',0, +0xe6, 0xda, 0x0c, 0xf1, 'h','e','b','r','e','w','_','s','a','m','e','c','h',0, +0xe6, 0xea, 0x0c, 0xf1, 'h','e','b','r','e','w','_','s','a','m','e','k','h',0, +0x39, 0x3c, 0x0c, 0xf2, 'h','e','b','r','e','w','_','a','y','i','n',0, +0xcb, 0xfd, 0x0c, 0xf3, 'h','e','b','r','e','w','_','f','i','n','a','l','p','e',0, +0xce, 0x09, 0x0c, 0xf4, 'h','e','b','r','e','w','_','p','e',0, +0x31, 0x61, 0x0c, 0xf5, 'h','e','b','r','e','w','_','f','i','n','a','l','z','a','d','e',0, +0x31, 0x65, 0x0c, 0xf5, 'h','e','b','r','e','w','_','f','i','n','a','l','z','a','d','i',0, +0x39, 0x91, 0x0c, 0xf6, 'h','e','b','r','e','w','_','z','a','d','e',0, +0x39, 0x95, 0x0c, 0xf6, 'h','e','b','r','e','w','_','z','a','d','i',0, +0x39, 0x9c, 0x0c, 0xf7, 'h','e','b','r','e','w','_','q','o','p','h',0, +0x9c, 0x84, 0x0c, 0xf7, 'h','e','b','r','e','w','_','k','u','f',0, +0x39, 0x82, 0x0c, 0xf8, 'h','e','b','r','e','w','_','r','e','s','h',0, +0x39, 0x88, 0x0c, 0xf9, 'h','e','b','r','e','w','_','s','h','i','n',0, +0x9c, 0x91, 0x0c, 0xfa, 'h','e','b','r','e','w','_','t','a','w',0, +0x9c, 0x80, 0x0c, 0xfa, 'h','e','b','r','e','w','_','t','a','f',0, +0xe8, 0x56, 0xff, 0x7e, 'H','e','b','r','e','w','_','s','w','i','t','c','h',0, +0x73, 0x9f, 0x0d, 0xa1, 'T','h','a','i','_','k','o','k','a','i',0, +0xcf, 0x53, 0x0d, 0xa2, 'T','h','a','i','_','k','h','o','k','h','a','i',0, +0x9f, 0x5a, 0x0d, 0xa3, 'T','h','a','i','_','k','h','o','k','h','u','a','t',0, +0x9f, 0x57, 0x0d, 0xa4, 'T','h','a','i','_','k','h','o','k','h','w','a','i',0, +0xcf, 0x74, 0x0d, 0xa5, 'T','h','a','i','_','k','h','o','k','h','o','n',0, +0x7e, 0xd7, 0x0d, 0xa6, 'T','h','a','i','_','k','h','o','r','a','k','h','a','n','g',0, +0xe7, 0xe3, 0x0d, 0xa7, 'T','h','a','i','_','n','g','o','n','g','u',0, +0xcd, 0x18, 0x0d, 0xa8, 'T','h','a','i','_','c','h','o','c','h','a','n',0, +0x9a, 0xb7, 0x0d, 0xa9, 'T','h','a','i','_','c','h','o','c','h','i','n','g',0, +0x9a, 0x97, 0x0d, 0xaa, 'T','h','a','i','_','c','h','o','c','h','a','n','g',0, +0xb9, 0xf9, 0x0d, 0xab, 'T','h','a','i','_','s','o','s','o',0, +0xcd, 0x2b, 0x0d, 0xac, 'T','h','a','i','_','c','h','o','c','h','o','e',0, +0xe9, 0xff, 0x0d, 0xad, 'T','h','a','i','_','y','o','y','i','n','g',0, +0xcd, 0x7d, 0x0d, 0xae, 'T','h','a','i','_','d','o','c','h','a','d','a',0, +0xd2, 0x65, 0x0d, 0xaf, 'T','h','a','i','_','t','o','p','a','t','a','k',0, +0xd1, 0xe0, 0x0d, 0xb0, 'T','h','a','i','_','t','h','o','t','h','a','n',0, +0x84, 0xcf, 0x0d, 0xb1, 'T','h','a','i','_','t','h','o','n','a','n','g','m','o','n','t','h','o',0, +0x92, 0x41, 0x0d, 0xb2, 'T','h','a','i','_','t','h','o','p','h','u','t','h','a','o',0, +0x73, 0xe8, 0x0d, 0xb3, 'T','h','a','i','_','n','o','n','e','n',0, +0x73, 0x1d, 0x0d, 0xb4, 'T','h','a','i','_','d','o','d','e','k',0, +0x74, 0x59, 0x0d, 0xb5, 'T','h','a','i','_','t','o','t','a','o',0, +0xa4, 0x77, 0x0d, 0xb6, 'T','h','a','i','_','t','h','o','t','h','u','n','g',0, +0x48, 0x98, 0x0d, 0xb7, 'T','h','a','i','_','t','h','o','t','h','a','h','a','n',0, +0xa4, 0x5f, 0x0d, 0xb8, 'T','h','a','i','_','t','h','o','t','h','o','n','g',0, +0xb9, 0xcd, 0x0d, 0xb9, 'T','h','a','i','_','n','o','n','u',0, +0x9a, 0x37, 0x0d, 0xba, 'T','h','a','i','_','b','o','b','a','i','m','a','i',0, +0x74, 0x11, 0x0d, 0xbb, 'T','h','a','i','_','p','o','p','l','a',0, +0xa2, 0x37, 0x0d, 0xbc, 'T','h','a','i','_','p','h','o','p','h','u','n','g',0, +0xb9, 0x69, 0x0d, 0xbd, 'T','h','a','i','_','f','o','f','a',0, +0xd0, 0xc0, 0x0d, 0xbe, 'T','h','a','i','_','p','h','o','p','h','a','n',0, +0x73, 0x40, 0x0d, 0xbf, 'T','h','a','i','_','f','o','f','a','n',0, +0x89, 0x81, 0x0d, 0xc0, 'T','h','a','i','_','p','h','o','s','a','m','p','h','a','o',0, +0xb9, 0xaf, 0x0d, 0xc1, 'T','h','a','i','_','m','o','m','a',0, +0x74, 0xb9, 0x0d, 0xc2, 'T','h','a','i','_','y','o','y','a','k',0, +0x74, 0x4b, 0x0d, 0xc3, 'T','h','a','i','_','r','o','r','u','a',0, +0x2e, 0x2d, 0x0d, 0xc4, 'T','h','a','i','_','r','u',0, +0xe7, 0xf7, 0x0d, 0xc5, 'T','h','a','i','_','l','o','l','i','n','g',0, +0x2e, 0x21, 0x0d, 0xc6, 'T','h','a','i','_','l','u',0, +0xe9, 0x84, 0x0d, 0xc7, 'T','h','a','i','_','w','o','w','a','e','n',0, +0xe8, 0xe5, 0x0d, 0xc8, 'T','h','a','i','_','s','o','s','a','l','a',0, +0xe9, 0x43, 0x0d, 0xc9, 'T','h','a','i','_','s','o','r','u','s','i',0, +0x74, 0x5f, 0x0d, 0xca, 'T','h','a','i','_','s','o','s','u','a',0, +0x73, 0x7a, 0x0d, 0xcb, 'T','h','a','i','_','h','o','h','i','p',0, +0xcf, 0xdd, 0x0d, 0xcc, 'T','h','a','i','_','l','o','c','h','u','l','a',0, +0xb9, 0x8f, 0x0d, 0xcd, 'T','h','a','i','_','o','a','n','g',0, +0x9f, 0xbd, 0x0d, 0xce, 'T','h','a','i','_','h','o','n','o','k','h','u','k',0, +0x40, 0x5f, 0x0d, 0xcf, 'T','h','a','i','_','p','a','i','y','a','n','n','o','i',0, +0x73, 0xc3, 0x0d, 0xd0, 'T','h','a','i','_','s','a','r','a','a',0, +0x76, 0x6a, 0x0d, 0xd1, 'T','h','a','i','_','m','a','i','h','a','n','a','k','a','t',0, +0xe7, 0xe7, 0x0d, 0xd2, 'T','h','a','i','_','s','a','r','a','a','a',0, +0xe7, 0xf3, 0x0d, 0xd3, 'T','h','a','i','_','s','a','r','a','a','m',0, +0x73, 0xcb, 0x0d, 0xd4, 'T','h','a','i','_','s','a','r','a','i',0, +0xe7, 0xff, 0x0d, 0xd5, 'T','h','a','i','_','s','a','r','a','i','i',0, +0xe8, 0x13, 0x0d, 0xd6, 'T','h','a','i','_','s','a','r','a','u','e',0, +0xd0, 0x8b, 0x0d, 0xd7, 'T','h','a','i','_','s','a','r','a','u','e','e',0, +0x73, 0xd7, 0x0d, 0xd8, 'T','h','a','i','_','s','a','r','a','u',0, +0xe8, 0x23, 0x0d, 0xd9, 'T','h','a','i','_','s','a','r','a','u','u',0, +0xd0, 0x95, 0x0d, 0xda, 'T','h','a','i','_','p','h','i','n','t','h','u',0, +0x66, 0xc7, 0x0d, 0xde, 'T','h','a','i','_','m','a','i','h','a','n','a','k','a','t','_','m','a','i','t','h','o',0, +0xb9, 0x28, 0x0d, 0xdf, 'T','h','a','i','_','b','a','h','t',0, +0x73, 0xc7, 0x0d, 0xe0, 'T','h','a','i','_','s','a','r','a','e',0, +0xe7, 0xeb, 0x0d, 0xe1, 'T','h','a','i','_','s','a','r','a','a','e',0, +0x73, 0xd1, 0x0d, 0xe2, 'T','h','a','i','_','s','a','r','a','o',0, +0x2b, 0xdc, 0x0d, 0xe3, 'T','h','a','i','_','s','a','r','a','a','i','m','a','i','m','u','a','n',0, +0x57, 0x93, 0x0d, 0xe4, 'T','h','a','i','_','s','a','r','a','a','i','m','a','i','m','a','l','a','i',0, +0xed, 0xcd, 0x0d, 0xe5, 'T','h','a','i','_','l','a','k','k','h','a','n','g','y','a','o',0, +0x9e, 0x75, 0x0d, 0xe6, 'T','h','a','i','_','m','a','i','y','a','m','o','k',0, +0x3c, 0x89, 0x0d, 0xe7, 'T','h','a','i','_','m','a','i','t','a','i','k','h','u',0, +0x73, 0x51, 0x0d, 0xe8, 'T','h','a','i','_','m','a','i','e','k',0, +0xe7, 0x47, 0x0d, 0xe9, 'T','h','a','i','_','m','a','i','t','h','o',0, +0xe7, 0x55, 0x0d, 0xea, 'T','h','a','i','_','m','a','i','t','r','i',0, +0xec, 0x53, 0x0d, 0xeb, 'T','h','a','i','_','m','a','i','c','h','a','t','t','a','w','a',0, +0x16, 0x3e, 0x0d, 0xec, 'T','h','a','i','_','t','h','a','n','t','h','a','k','h','a','t',0, +0xa0, 0x0e, 0x0d, 0xed, 'T','h','a','i','_','n','i','k','h','a','h','i','t',0, +0xe7, 0x8c, 0x0d, 0xf0, 'T','h','a','i','_','l','e','k','s','u','n',0, +0xcf, 0x57, 0x0d, 0xf1, 'T','h','a','i','_','l','e','k','n','u','n','g',0, +0xcf, 0x67, 0x0d, 0xf2, 'T','h','a','i','_','l','e','k','s','o','n','g',0, +0xe7, 0x63, 0x0d, 0xf3, 'T','h','a','i','_','l','e','k','s','a','m',0, +0x73, 0x83, 0x0d, 0xf4, 'T','h','a','i','_','l','e','k','s','i',0, +0x73, 0x65, 0x0d, 0xf5, 'T','h','a','i','_','l','e','k','h','a',0, +0xe7, 0x51, 0x0d, 0xf6, 'T','h','a','i','_','l','e','k','h','o','k',0, +0xce, 0xc6, 0x0d, 0xf7, 'T','h','a','i','_','l','e','k','c','h','e','t',0, +0xcf, 0x12, 0x0d, 0xf8, 'T','h','a','i','_','l','e','k','p','a','e','t',0, +0xe7, 0x45, 0x0d, 0xf9, 'T','h','a','i','_','l','e','k','k','a','o',0, +0x15, 0x72, 0xff, 0x31, 'H','a','n','g','u','l',0, +0x74, 0x0c, 0xff, 0x32, 'H','a','n','g','u','l','_','S','t','a','r','t',0, +0x5c, 0x6c, 0xff, 0x33, 'H','a','n','g','u','l','_','E','n','d',0, +0x72, 0xd5, 0xff, 0x34, 'H','a','n','g','u','l','_','H','a','n','j','a',0, +0xb9, 0x4d, 0xff, 0x35, 'H','a','n','g','u','l','_','J','a','m','o',0, +0xe8, 0x11, 0xff, 0x36, 'H','a','n','g','u','l','_','R','o','m','a','j','a',0, +0x33, 0x3e, 0xff, 0x37, 'H','a','n','g','u','l','_','C','o','d','e','i','n','p','u','t',0, +0xe6, 0xb5, 0xff, 0x38, 'H','a','n','g','u','l','_','J','e','o','n','j','a',0, +0x72, 0x75, 0xff, 0x39, 'H','a','n','g','u','l','_','B','a','n','j','a',0, +0x9e, 0x95, 0xff, 0x3a, 'H','a','n','g','u','l','_','P','r','e','H','a','n','j','a',0, +0x43, 0x35, 0xff, 0x3b, 'H','a','n','g','u','l','_','P','o','s','t','H','a','n','j','a',0, +0x9a, 0x01, 0xff, 0x3c, 'H','a','n','g','u','l','_','S','i','n','g','l','e','C','a','n','d','i','d','a','t','e',0, +0x32, 0x01, 0xff, 0x3d, 'H','a','n','g','u','l','_','M','u','l','t','i','p','l','e','C','a','n','d','i','d','a','t','e',0, +0x6a, 0x01, 0xff, 0x3e, 'H','a','n','g','u','l','_','P','r','e','v','i','o','u','s','C','a','n','d','i','d','a','t','e',0, +0xd0, 0x7a, 0xff, 0x3f, 'H','a','n','g','u','l','_','S','p','e','c','i','a','l',0, +0xec, 0xd6, 0xff, 0x7e, 'H','a','n','g','u','l','_','s','w','i','t','c','h',0, +0xe7, 0x51, 0x0e, 0xa1, 'H','a','n','g','u','l','_','K','i','y','e','o','g',0, +0x12, 0x51, 0x0e, 0xa2, 'H','a','n','g','u','l','_','S','s','a','n','g','K','i','y','e','o','g',0, +0x7a, 0x9d, 0x0e, 0xa3, 'H','a','n','g','u','l','_','K','i','y','e','o','g','S','i','o','s',0, +0x73, 0x74, 0x0e, 0xa4, 'H','a','n','g','u','l','_','N','i','e','u','n',0, +0x79, 0x50, 0x0e, 0xa5, 'H','a','n','g','u','l','_','N','i','e','u','n','J','i','e','u','j',0, +0x79, 0x2e, 0x0e, 0xa6, 'H','a','n','g','u','l','_','N','i','e','u','n','H','i','e','u','h',0, +0xe6, 0x0a, 0x0e, 0xa7, 'H','a','n','g','u','l','_','D','i','k','e','u','d',0, +0x11, 0x0a, 0x0e, 0xa8, 'H','a','n','g','u','l','_','S','s','a','n','g','D','i','k','e','u','d',0, +0x73, 0xb2, 0x0e, 0xa9, 'H','a','n','g','u','l','_','R','i','e','u','l',0, +0x03, 0x11, 0x0e, 0xaa, 'H','a','n','g','u','l','_','R','i','e','u','l','K','i','y','e','o','g',0, +0x81, 0x43, 0x0e, 0xab, 'H','a','n','g','u','l','_','R','i','e','u','l','M','i','e','u','m',0, +0x81, 0x68, 0x0e, 0xac, 'H','a','n','g','u','l','_','R','i','e','u','l','P','i','e','u','b',0, +0x40, 0xad, 0x0e, 0xad, 'H','a','n','g','u','l','_','R','i','e','u','l','S','i','o','s',0, +0x81, 0xba, 0x0e, 0xae, 'H','a','n','g','u','l','_','R','i','e','u','l','T','i','e','u','t',0, +0x03, 0x2c, 0x0e, 0xaf, 'H','a','n','g','u','l','_','R','i','e','u','l','P','h','i','e','u','f',0, +0x80, 0xee, 0x0e, 0xb0, 'H','a','n','g','u','l','_','R','i','e','u','l','H','i','e','u','h',0, +0x73, 0x63, 0x0e, 0xb1, 'H','a','n','g','u','l','_','M','i','e','u','m',0, +0x73, 0x88, 0x0e, 0xb2, 'H','a','n','g','u','l','_','P','i','e','u','b',0, +0x89, 0x08, 0x0e, 0xb3, 'H','a','n','g','u','l','_','S','s','a','n','g','P','i','e','u','b',0, +0x3e, 0x0d, 0x0e, 0xb4, 'H','a','n','g','u','l','_','P','i','e','u','b','S','i','o','s',0, +0xb9, 0xbd, 0x0e, 0xb5, 'H','a','n','g','u','l','_','S','i','o','s',0, +0x44, 0x7d, 0x0e, 0xb6, 'H','a','n','g','u','l','_','S','s','a','n','g','S','i','o','s',0, +0x73, 0x2f, 0x0e, 0xb7, 'H','a','n','g','u','l','_','I','e','u','n','g',0, +0x73, 0x30, 0x0e, 0xb8, 'H','a','n','g','u','l','_','J','i','e','u','j',0, +0x88, 0xb0, 0x0e, 0xb9, 'H','a','n','g','u','l','_','S','s','a','n','g','J','i','e','u','j',0, +0x72, 0xb9, 0x0e, 0xba, 'H','a','n','g','u','l','_','C','i','e','u','c',0, +0xe6, 0xd7, 0x0e, 0xbb, 'H','a','n','g','u','l','_','K','h','i','e','u','q',0, +0x73, 0xda, 0x0e, 0xbc, 'H','a','n','g','u','l','_','T','i','e','u','t',0, +0xe7, 0x6c, 0x0e, 0xbd, 'H','a','n','g','u','l','_','P','h','i','e','u','f',0, +0x73, 0x0e, 0x0e, 0xbe, 'H','a','n','g','u','l','_','H','i','e','u','h',0, +0x56, 0xc7, 0x0e, 0xbf, 'H','a','n','g','u','l','_','A',0, +0xad, 0xd3, 0x0e, 0xc0, 'H','a','n','g','u','l','_','A','E',0, +0xad, 0xff, 0x0e, 0xc1, 'H','a','n','g','u','l','_','Y','A',0, +0x5c, 0x43, 0x0e, 0xc2, 'H','a','n','g','u','l','_','Y','A','E',0, +0xad, 0xe5, 0x0e, 0xc3, 'H','a','n','g','u','l','_','E','O',0, +0x56, 0xcb, 0x0e, 0xc4, 'H','a','n','g','u','l','_','E',0, +0x5c, 0x55, 0x0e, 0xc5, 'H','a','n','g','u','l','_','Y','E','O',0, +0xae, 0x03, 0x0e, 0xc6, 'H','a','n','g','u','l','_','Y','E',0, +0x56, 0xd5, 0x0e, 0xc7, 'H','a','n','g','u','l','_','O',0, +0xad, 0xfb, 0x0e, 0xc8, 'H','a','n','g','u','l','_','W','A',0, +0x5c, 0x3b, 0x0e, 0xc9, 'H','a','n','g','u','l','_','W','A','E',0, +0xad, 0xef, 0x0e, 0xca, 'H','a','n','g','u','l','_','O','E',0, +0xae, 0x0d, 0x0e, 0xcb, 'H','a','n','g','u','l','_','Y','O',0, +0x56, 0xdb, 0x0e, 0xcc, 'H','a','n','g','u','l','_','U',0, +0x5c, 0x4d, 0x0e, 0xcd, 'H','a','n','g','u','l','_','W','E','O',0, +0xad, 0xff, 0x0e, 0xce, 'H','a','n','g','u','l','_','W','E',0, +0xae, 0x03, 0x0e, 0xcf, 'H','a','n','g','u','l','_','W','I',0, +0xae, 0x13, 0x0e, 0xd0, 'H','a','n','g','u','l','_','Y','U',0, +0xad, 0xeb, 0x0e, 0xd1, 'H','a','n','g','u','l','_','E','U',0, +0xae, 0x07, 0x0e, 0xd2, 'H','a','n','g','u','l','_','Y','I',0, +0x56, 0xcf, 0x0e, 0xd3, 'H','a','n','g','u','l','_','I',0, +0x96, 0x51, 0x0e, 0xd4, 'H','a','n','g','u','l','_','J','_','K','i','y','e','o','g',0, +0xf2, 0x51, 0x0e, 0xd5, 'H','a','n','g','u','l','_','J','_','S','s','a','n','g','K','i','y','e','o','g',0, +0x6a, 0x9d, 0x0e, 0xd6, 'H','a','n','g','u','l','_','J','_','K','i','y','e','o','g','S','i','o','s',0, +0xca, 0xf4, 0x0e, 0xd7, 'H','a','n','g','u','l','_','J','_','N','i','e','u','n',0, +0x69, 0x50, 0x0e, 0xd8, 'H','a','n','g','u','l','_','J','_','N','i','e','u','n','J','i','e','u','j',0, +0x69, 0x2e, 0x0e, 0xd9, 'H','a','n','g','u','l','_','J','_','N','i','e','u','n','H','i','e','u','h',0, +0x95, 0x0a, 0x0e, 0xda, 'H','a','n','g','u','l','_','J','_','D','i','k','e','u','d',0, +0xcb, 0x32, 0x0e, 0xdb, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l',0, +0xe3, 0x11, 0x0e, 0xdc, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','K','i','y','e','o','g',0, +0x71, 0x43, 0x0e, 0xdd, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','M','i','e','u','m',0, +0x71, 0x68, 0x0e, 0xde, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','P','i','e','u','b',0, +0xb8, 0xad, 0x0e, 0xdf, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','S','i','o','s',0, +0x71, 0xba, 0x0e, 0xe0, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','T','i','e','u','t',0, +0xe3, 0x2c, 0x0e, 0xe1, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','P','h','i','e','u','f',0, +0x70, 0xee, 0x0e, 0xe2, 'H','a','n','g','u','l','_','J','_','R','i','e','u','l','H','i','e','u','h',0, +0xca, 0xe3, 0x0e, 0xe3, 'H','a','n','g','u','l','_','J','_','M','i','e','u','m',0, +0xcb, 0x08, 0x0e, 0xe4, 'H','a','n','g','u','l','_','J','_','P','i','e','u','b',0, +0xb6, 0x0d, 0x0e, 0xe5, 'H','a','n','g','u','l','_','J','_','P','i','e','u','b','S','i','o','s',0, +0xe5, 0x7d, 0x0e, 0xe6, 'H','a','n','g','u','l','_','J','_','S','i','o','s',0, +0xbc, 0x7d, 0x0e, 0xe7, 'H','a','n','g','u','l','_','J','_','S','s','a','n','g','S','i','o','s',0, +0xca, 0xaf, 0x0e, 0xe8, 'H','a','n','g','u','l','_','J','_','I','e','u','n','g',0, +0xca, 0xb0, 0x0e, 0xe9, 'H','a','n','g','u','l','_','J','_','J','i','e','u','j',0, +0xca, 0x39, 0x0e, 0xea, 'H','a','n','g','u','l','_','J','_','C','i','e','u','c',0, +0x95, 0xd7, 0x0e, 0xeb, 'H','a','n','g','u','l','_','J','_','K','h','i','e','u','q',0, +0xcb, 0x5a, 0x0e, 0xec, 'H','a','n','g','u','l','_','J','_','T','i','e','u','t',0, +0x96, 0x6c, 0x0e, 0xed, 'H','a','n','g','u','l','_','J','_','P','h','i','e','u','f',0, +0xca, 0x8e, 0x0e, 0xee, 'H','a','n','g','u','l','_','J','_','H','i','e','u','h',0, +0x98, 0xae, 0x0e, 0xef, 'H','a','n','g','u','l','_','R','i','e','u','l','Y','e','o','r','i','n','H','i','e','u','h',0, +0x7f, 0x63, 0x0e, 0xf0, 'H','a','n','g','u','l','_','S','u','n','k','y','e','o','n','g','e','u','m','M','i','e','u','m',0, +0x7f, 0x88, 0x0e, 0xf1, 'H','a','n','g','u','l','_','S','u','n','k','y','e','o','n','g','e','u','m','P','i','e','u','b',0, +0xce, 0x0d, 0x0e, 0xf2, 'H','a','n','g','u','l','_','P','a','n','S','i','o','s',0, +0xb1, 0xcf, 0x0e, 0xf3, 'H','a','n','g','u','l','_','K','k','o','g','j','i','D','a','l','r','i','n','I','e','u','n','g',0, +0xff, 0x6c, 0x0e, 0xf4, 'H','a','n','g','u','l','_','S','u','n','k','y','e','o','n','g','e','u','m','P','h','i','e','u','f',0, +0x20, 0xae, 0x0e, 0xf5, 'H','a','n','g','u','l','_','Y','e','o','r','i','n','H','i','e','u','h',0, +0x72, 0x8f, 0x0e, 0xf6, 'H','a','n','g','u','l','_','A','r','a','e','A',0, +0xe5, 0x63, 0x0e, 0xf7, 'H','a','n','g','u','l','_','A','r','a','e','A','E',0, +0x2c, 0x0d, 0x0e, 0xf8, 'H','a','n','g','u','l','_','J','_','P','a','n','S','i','o','s',0, +0xb1, 0xcf, 0x0e, 0xf9, 'H','a','n','g','u','l','_','J','_','K','k','o','g','j','i','D','a','l','r','i','n','I','e','u','n','g',0, +0x00, 0xae, 0x0e, 0xfa, 'H','a','n','g','u','l','_','J','_','Y','e','o','r','i','n','H','i','e','u','h',0, +0x6f, 0xe0, 0x0e, 0xff, 'K','o','r','e','a','n','_','W','o','n',0, +0x30, 0xb5, 0x14, 0xa1, 'A','r','m','e','n','i','a','n','_','e','t','e','r','n','i','t','y',0, +0x8a, 0x25, 0x14, 0xa2, 'A','r','m','e','n','i','a','n','_','l','i','g','a','t','u','r','e','_','e','w',0, +0x63, 0xa6, 0x14, 0xa3, 'A','r','m','e','n','i','a','n','_','f','u','l','l','_','s','t','o','p',0, +0x36, 0x12, 0x14, 0xa3, 'A','r','m','e','n','i','a','n','_','v','e','r','j','a','k','e','t',0, +0xca, 0x48, 0x14, 0xa4, 'A','r','m','e','n','i','a','n','_','p','a','r','e','n','r','i','g','h','t',0, +0x64, 0xb4, 0x14, 0xa5, 'A','r','m','e','n','i','a','n','_','p','a','r','e','n','l','e','f','t',0, +0x93, 0x08, 0x14, 0xa6, 'A','r','m','e','n','i','a','n','_','g','u','i','l','l','e','m','o','t','r','i','g','h','t',0, +0x49, 0x14, 0x14, 0xa7, 'A','r','m','e','n','i','a','n','_','g','u','i','l','l','e','m','o','t','l','e','f','t',0, +0x96, 0x42, 0x14, 0xa8, 'A','r','m','e','n','i','a','n','_','e','m','_','d','a','s','h',0, +0x79, 0x1a, 0x14, 0xa9, 'A','r','m','e','n','i','a','n','_','d','o','t',0, +0x98, 0x72, 0x14, 0xa9, 'A','r','m','e','n','i','a','n','_','m','i','j','a','k','e','t',0, +0x50, 0x2b, 0x14, 0xaa, 'A','r','m','e','n','i','a','n','_','s','e','p','a','r','a','t','i','o','n','_','m','a','r','k',0, +0x79, 0x1e, 0x14, 0xaa, 'A','r','m','e','n','i','a','n','_','b','u','t',0, +0xe5, 0x77, 0x14, 0xab, 'A','r','m','e','n','i','a','n','_','c','o','m','m','a',0, +0x96, 0x62, 0x14, 0xac, 'A','r','m','e','n','i','a','n','_','e','n','_','d','a','s','h',0, +0xcc, 0xa8, 0x14, 0xad, 'A','r','m','e','n','i','a','n','_','h','y','p','h','e','n',0, +0x37, 0xb9, 0x14, 0xad, 'A','r','m','e','n','i','a','n','_','y','e','n','t','a','m','n','a',0, +0x2f, 0x21, 0x14, 0xae, 'A','r','m','e','n','i','a','n','_','e','l','l','i','p','s','i','s',0, +0xcb, 0xd7, 0x14, 0xaf, 'A','r','m','e','n','i','a','n','_','e','x','c','l','a','m',0, +0xca, 0x9d, 0x14, 0xaf, 'A','r','m','e','n','i','a','n','_','a','m','a','n','a','k',0, +0xca, 0x0c, 0x14, 0xb0, 'A','r','m','e','n','i','a','n','_','a','c','c','e','n','t',0, +0xcc, 0xd8, 0x14, 0xb0, 'A','r','m','e','n','i','a','n','_','s','h','e','s','h','t',0, +0x37, 0x20, 0x14, 0xb1, 'A','r','m','e','n','i','a','n','_','q','u','e','s','t','i','o','n',0, +0xcc, 0x91, 0x14, 0xb1, 'A','r','m','e','n','i','a','n','_','p','a','r','u','y','k',0, +0x78, 0x30, 0x14, 0xb2, 'A','r','m','e','n','i','a','n','_','A','Y','B',0, +0x79, 0x10, 0x14, 0xb3, 'A','r','m','e','n','i','a','n','_','a','y','b',0, +0x78, 0x18, 0x14, 0xb4, 'A','r','m','e','n','i','a','n','_','B','E','N',0, +0x78, 0xf8, 0x14, 0xb5, 'A','r','m','e','n','i','a','n','_','b','e','n',0, +0x78, 0x33, 0x14, 0xb6, 'A','r','m','e','n','i','a','n','_','G','I','M',0, +0x79, 0x13, 0x14, 0xb7, 'A','r','m','e','n','i','a','n','_','g','i','m',0, +0xbb, 0xe5, 0x14, 0xb8, 'A','r','m','e','n','i','a','n','_','D','A',0, +0xbc, 0x45, 0x14, 0xb9, 'A','r','m','e','n','i','a','n','_','d','a',0, +0xf1, 0x1a, 0x14, 0xba, 'A','r','m','e','n','i','a','n','_','Y','E','C','H',0, +0xf2, 0xfa, 0x14, 0xbb, 'A','r','m','e','n','i','a','n','_','y','e','c','h',0, +0xbc, 0x11, 0x14, 0xbc, 'A','r','m','e','n','i','a','n','_','Z','A',0, +0xbc, 0x71, 0x14, 0xbd, 'A','r','m','e','n','i','a','n','_','z','a',0, +0x5d, 0xd3, 0x14, 0xbe, 'A','r','m','e','n','i','a','n','_','E',0, +0x5d, 0xf3, 0x14, 0xbf, 'A','r','m','e','n','i','a','n','_','e',0, +0xbb, 0xf2, 0x14, 0xc0, 'A','r','m','e','n','i','a','n','_','A','T',0, +0xbc, 0x52, 0x14, 0xc1, 'A','r','m','e','n','i','a','n','_','a','t',0, +0xbc, 0x13, 0x14, 0xc2, 'A','r','m','e','n','i','a','n','_','T','O',0, +0xbc, 0x73, 0x14, 0xc3, 'A','r','m','e','n','i','a','n','_','t','o',0, +0x78, 0x75, 0x14, 0xc4, 'A','r','m','e','n','i','a','n','_','Z','H','E',0, +0x79, 0x55, 0x14, 0xc5, 'A','r','m','e','n','i','a','n','_','z','h','e',0, +0x78, 0x41, 0x14, 0xc6, 'A','r','m','e','n','i','a','n','_','I','N','I',0, +0x79, 0x21, 0x14, 0xc7, 'A','r','m','e','n','i','a','n','_','i','n','i',0, +0xf1, 0x2c, 0x14, 0xc8, 'A','r','m','e','n','i','a','n','_','L','Y','U','N',0, +0xf3, 0x0c, 0x14, 0xc9, 'A','r','m','e','n','i','a','n','_','l','y','u','n',0, +0x78, 0x39, 0x14, 0xca, 'A','r','m','e','n','i','a','n','_','K','H','E',0, +0x79, 0x19, 0x14, 0xcb, 'A','r','m','e','n','i','a','n','_','k','h','e',0, +0x78, 0x6f, 0x14, 0xcc, 'A','r','m','e','n','i','a','n','_','T','S','A',0, +0x79, 0x4f, 0x14, 0xcd, 'A','r','m','e','n','i','a','n','_','t','s','a',0, +0x78, 0x3c, 0x14, 0xce, 'A','r','m','e','n','i','a','n','_','K','E','N',0, +0x79, 0x1c, 0x14, 0xcf, 'A','r','m','e','n','i','a','n','_','k','e','n',0, +0xbb, 0xfb, 0x14, 0xd0, 'A','r','m','e','n','i','a','n','_','H','O',0, +0xbc, 0x5b, 0x14, 0xd1, 'A','r','m','e','n','i','a','n','_','h','o',0, +0x78, 0x3d, 0x14, 0xd2, 'A','r','m','e','n','i','a','n','_','D','Z','A',0, +0x79, 0x1d, 0x14, 0xd3, 'A','r','m','e','n','i','a','n','_','d','z','a',0, +0xf0, 0x9e, 0x14, 0xd4, 'A','r','m','e','n','i','a','n','_','G','H','A','T',0, +0xf2, 0x7e, 0x14, 0xd5, 'A','r','m','e','n','i','a','n','_','g','h','a','t',0, +0xf0, 0xf1, 0x14, 0xd6, 'A','r','m','e','n','i','a','n','_','T','C','H','E',0, +0xf2, 0xd1, 0x14, 0xd7, 'A','r','m','e','n','i','a','n','_','t','c','h','e',0, +0x78, 0x44, 0x14, 0xd8, 'A','r','m','e','n','i','a','n','_','M','E','N',0, +0x79, 0x24, 0x14, 0xd9, 'A','r','m','e','n','i','a','n','_','m','e','n',0, +0xbb, 0xf5, 0x14, 0xda, 'A','r','m','e','n','i','a','n','_','H','I',0, +0xbc, 0x55, 0x14, 0xdb, 'A','r','m','e','n','i','a','n','_','h','i',0, +0xbc, 0x0d, 0x14, 0xdc, 'A','r','m','e','n','i','a','n','_','N','U',0, +0xbc, 0x6d, 0x14, 0xdd, 'A','r','m','e','n','i','a','n','_','n','u',0, +0x78, 0x55, 0x14, 0xde, 'A','r','m','e','n','i','a','n','_','S','H','A',0, +0x79, 0x35, 0x14, 0xdf, 'A','r','m','e','n','i','a','n','_','s','h','a',0, +0xbc, 0x17, 0x14, 0xe0, 'A','r','m','e','n','i','a','n','_','V','O',0, +0xbc, 0x77, 0x14, 0xe1, 'A','r','m','e','n','i','a','n','_','v','o',0, +0x78, 0x15, 0x14, 0xe2, 'A','r','m','e','n','i','a','n','_','C','H','A',0, +0x78, 0xf5, 0x14, 0xe3, 'A','r','m','e','n','i','a','n','_','c','h','a',0, +0xbc, 0x01, 0x14, 0xe4, 'A','r','m','e','n','i','a','n','_','P','E',0, +0xbc, 0x61, 0x14, 0xe5, 'A','r','m','e','n','i','a','n','_','p','e',0, +0xbb, 0xf5, 0x14, 0xe6, 'A','r','m','e','n','i','a','n','_','J','E',0, +0xbc, 0x55, 0x14, 0xe7, 'A','r','m','e','n','i','a','n','_','j','e',0, +0xbc, 0x01, 0x14, 0xe8, 'A','r','m','e','n','i','a','n','_','R','A',0, +0xbc, 0x61, 0x14, 0xe9, 'A','r','m','e','n','i','a','n','_','r','a',0, +0xbc, 0x07, 0x14, 0xea, 'A','r','m','e','n','i','a','n','_','S','E',0, +0xbc, 0x67, 0x14, 0xeb, 'A','r','m','e','n','i','a','n','_','s','e',0, +0x78, 0x70, 0x14, 0xec, 'A','r','m','e','n','i','a','n','_','V','E','V',0, +0x79, 0x50, 0x14, 0xed, 'A','r','m','e','n','i','a','n','_','v','e','v',0, +0xf1, 0x6c, 0x14, 0xee, 'A','r','m','e','n','i','a','n','_','T','Y','U','N',0, +0xf3, 0x4c, 0x14, 0xef, 'A','r','m','e','n','i','a','n','_','t','y','u','n',0, +0xbc, 0x05, 0x14, 0xf0, 'A','r','m','e','n','i','a','n','_','R','E',0, +0xbc, 0x65, 0x14, 0xf1, 'A','r','m','e','n','i','a','n','_','r','e',0, +0x78, 0x7d, 0x14, 0xf2, 'A','r','m','e','n','i','a','n','_','T','S','O',0, +0x79, 0x5d, 0x14, 0xf3, 'A','r','m','e','n','i','a','n','_','t','s','o',0, +0xf1, 0x7c, 0x14, 0xf4, 'A','r','m','e','n','i','a','n','_','V','Y','U','N',0, +0xf3, 0x5c, 0x14, 0xf5, 'A','r','m','e','n','i','a','n','_','v','y','u','n',0, +0xf1, 0x50, 0x14, 0xf6, 'A','r','m','e','n','i','a','n','_','P','Y','U','R',0, +0xf3, 0x30, 0x14, 0xf7, 'A','r','m','e','n','i','a','n','_','p','y','u','r',0, +0xbb, 0xf7, 0x14, 0xf8, 'A','r','m','e','n','i','a','n','_','K','E',0, +0xbc, 0x57, 0x14, 0xf9, 'A','r','m','e','n','i','a','n','_','k','e',0, +0x5d, 0xdd, 0x14, 0xfa, 'A','r','m','e','n','i','a','n','_','O',0, +0x5d, 0xfd, 0x14, 0xfb, 'A','r','m','e','n','i','a','n','_','o',0, +0xbb, 0xed, 0x14, 0xfc, 'A','r','m','e','n','i','a','n','_','F','E',0, +0xbc, 0x4d, 0x14, 0xfd, 'A','r','m','e','n','i','a','n','_','f','e',0, +0xbe, 0x4d, 0x14, 0xfe, 'A','r','m','e','n','i','a','n','_','a','p','o','s','t','r','o','p','h','e',0, +0x40, 0x68, 0x14, 0xff, 'A','r','m','e','n','i','a','n','_','s','e','c','t','i','o','n','_','s','i','g','n',0, +0xc1, 0x0c, 0x15, 0xd0, 'G','e','o','r','g','i','a','n','_','a','n',0, +0x82, 0x70, 0x15, 0xd1, 'G','e','o','r','g','i','a','n','_','b','a','n',0, +0x82, 0x84, 0x15, 0xd2, 'G','e','o','r','g','i','a','n','_','g','a','n',0, +0x82, 0x94, 0x15, 0xd3, 'G','e','o','r','g','i','a','n','_','d','o','n',0, +0xc1, 0x14, 0x15, 0xd4, 'G','e','o','r','g','i','a','n','_','e','n',0, +0x82, 0xd0, 0x15, 0xd5, 'G','e','o','r','g','i','a','n','_','v','i','n',0, +0x82, 0xd8, 0x15, 0xd6, 'G','e','o','r','g','i','a','n','_','z','e','n',0, +0x82, 0xb8, 0x15, 0xd7, 'G','e','o','r','g','i','a','n','_','t','a','n',0, +0xc1, 0x1c, 0x15, 0xd8, 'G','e','o','r','g','i','a','n','_','i','n',0, +0x82, 0x94, 0x15, 0xd9, 'G','e','o','r','g','i','a','n','_','k','a','n',0, +0x82, 0x9d, 0x15, 0xda, 'G','e','o','r','g','i','a','n','_','l','a','s',0, +0x82, 0x9c, 0x15, 0xdb, 'G','e','o','r','g','i','a','n','_','m','a','n',0, +0x82, 0xa4, 0x15, 0xdc, 'G','e','o','r','g','i','a','n','_','n','a','r',0, +0xc1, 0x28, 0x15, 0xdd, 'G','e','o','r','g','i','a','n','_','o','n',0, +0x82, 0xac, 0x15, 0xde, 'G','e','o','r','g','i','a','n','_','p','a','r',0, +0x06, 0x14, 0x15, 0xdf, 'G','e','o','r','g','i','a','n','_','z','h','a','r',0, +0x82, 0xa7, 0x15, 0xe0, 'G','e','o','r','g','i','a','n','_','r','a','e',0, +0x82, 0xb4, 0x15, 0xe1, 'G','e','o','r','g','i','a','n','_','s','a','n',0, +0x82, 0xbc, 0x15, 0xe2, 'G','e','o','r','g','i','a','n','_','t','a','r',0, +0xc1, 0x34, 0x15, 0xe3, 'G','e','o','r','g','i','a','n','_','u','n',0, +0x05, 0xc4, 0x15, 0xe4, 'G','e','o','r','g','i','a','n','_','p','h','a','r',0, +0x05, 0x9c, 0x15, 0xe5, 'G','e','o','r','g','i','a','n','_','k','h','a','r',0, +0x05, 0x78, 0x15, 0xe6, 'G','e','o','r','g','i','a','n','_','g','h','a','n',0, +0x82, 0xb0, 0x15, 0xe7, 'G','e','o','r','g','i','a','n','_','q','a','r',0, +0x05, 0xe8, 0x15, 0xe8, 'G','e','o','r','g','i','a','n','_','s','h','i','n',0, +0x05, 0x68, 0x15, 0xe9, 'G','e','o','r','g','i','a','n','_','c','h','i','n',0, +0x82, 0x74, 0x15, 0xea, 'G','e','o','r','g','i','a','n','_','c','a','n',0, +0x82, 0x9e, 0x15, 0xeb, 'G','e','o','r','g','i','a','n','_','j','i','l',0, +0x82, 0x82, 0x15, 0xec, 'G','e','o','r','g','i','a','n','_','c','i','l',0, +0x05, 0x5c, 0x15, 0xed, 'G','e','o','r','g','i','a','n','_','c','h','a','r',0, +0x82, 0xc8, 0x15, 0xee, 'G','e','o','r','g','i','a','n','_','x','a','n',0, +0x05, 0x90, 0x15, 0xef, 'G','e','o','r','g','i','a','n','_','j','h','a','n',0, +0x82, 0x7f, 0x15, 0xf0, 'G','e','o','r','g','i','a','n','_','h','a','e',0, +0xc1, 0x11, 0x15, 0xf1, 'G','e','o','r','g','i','a','n','_','h','e',0, +0x82, 0x8f, 0x15, 0xf2, 'G','e','o','r','g','i','a','n','_','h','i','e',0, +0xc1, 0x2f, 0x15, 0xf3, 'G','e','o','r','g','i','a','n','_','w','e',0, +0x82, 0x8c, 0x15, 0xf4, 'G','e','o','r','g','i','a','n','_','h','a','r',0, +0x82, 0x9b, 0x15, 0xf5, 'G','e','o','r','g','i','a','n','_','h','o','e',0, +0xc1, 0x11, 0x15, 0xf6, 'G','e','o','r','g','i','a','n','_','f','i',0, +0xb5, 0x4a, 0x16, 0xa2, 'C','c','e','d','i','l','l','a','a','b','o','v','e','d','o','t',0, +0xbc, 0x4a, 0x16, 0xa3, 'X','a','b','o','v','e','d','o','t',0, +0xb5, 0x4a, 0x16, 0xa5, 'Q','a','b','o','v','e','d','o','t',0, +0x15, 0xb5, 0x16, 0xa6, 'I','b','r','e','v','e',0, +0x00, 0xd7, 0x16, 0xa7, 'I','E',0, +0x00, 0xf9, 0x16, 0xa8, 'U','O',0, +0x32, 0xa7, 0x16, 0xa9, 'Z','s','t','r','o','k','e',0, +0x15, 0x2c, 0x16, 0xaa, 'G','c','a','r','o','n',0, +0x2c, 0x96, 0x16, 0xaf, 'O','b','a','r','r','e','d',0, +0xb5, 0x4a, 0x16, 0xb2, 'c','c','e','d','i','l','l','a','a','b','o','v','e','d','o','t',0, +0xdc, 0x4a, 0x16, 0xb3, 'x','a','b','o','v','e','d','o','t',0, +0x16, 0x2c, 0x16, 0xb4, 'O','c','a','r','o','n',0, +0xd5, 0x4a, 0x16, 0xb5, 'q','a','b','o','v','e','d','o','t',0, +0x19, 0xb5, 0x16, 0xb6, 'i','b','r','e','v','e',0, +0x01, 0x37, 0x16, 0xb7, 'i','e',0, +0x01, 0x59, 0x16, 0xb8, 'u','o',0, +0x3a, 0xa7, 0x16, 0xb9, 'z','s','t','r','o','k','e',0, +0x19, 0x2c, 0x16, 0xba, 'g','c','a','r','o','n',0, +0x1a, 0x2c, 0x16, 0xbd, 'o','c','a','r','o','n',0, +0x34, 0x96, 0x16, 0xbf, 'o','b','a','r','r','e','d',0, +0x09, 0x57, 0x16, 0xc6, 'S','C','H','W','A',0, +0x0d, 0x37, 0x16, 0xf6, 's','c','h','w','a',0, +0xb1, 0x4a, 0x16, 0xd1, 'L','b','e','l','o','w','d','o','t',0, +0x8c, 0x4a, 0x16, 0xd2, 'L','s','t','r','o','k','e','b','e','l','o','w','d','o','t',0, +0xd1, 0x4a, 0x16, 0xe1, 'l','b','e','l','o','w','d','o','t',0, +0x8c, 0x4a, 0x16, 0xe2, 'l','s','t','r','o','k','e','b','e','l','o','w','d','o','t',0, +0x16, 0x45, 0x16, 0xd3, 'G','t','i','l','d','e',0, +0x1a, 0x45, 0x16, 0xe3, 'g','t','i','l','d','e',0, +0xa6, 0x4a, 0x1e, 0xa0, 'A','b','e','l','o','w','d','o','t',0, +0xc6, 0x4a, 0x1e, 0xa1, 'a','b','e','l','o','w','d','o','t',0, +0x0a, 0x55, 0x1e, 0xa2, 'A','h','o','o','k',0, +0x0c, 0x55, 0x1e, 0xa3, 'a','h','o','o','k',0, +0x16, 0x89, 0x1e, 0xa4, 'A','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0, +0x16, 0x89, 0x1e, 0xa5, 'a','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0, +0x17, 0x15, 0x1e, 0xa6, 'A','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0, +0x17, 0x15, 0x1e, 0xa7, 'a','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0, +0x0b, 0x65, 0x1e, 0xa8, 'A','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0, +0x0b, 0x65, 0x1e, 0xa9, 'a','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0, +0x17, 0xa5, 0x1e, 0xaa, 'A','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0, +0x17, 0xa5, 0x1e, 0xab, 'a','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0, +0xb7, 0x4a, 0x1e, 0xac, 'A','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0, +0xb7, 0x4a, 0x1e, 0xad, 'a','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0, +0xa2, 0xe9, 0x1e, 0xae, 'A','b','r','e','v','e','a','c','u','t','e',0, +0x22, 0xe9, 0x1e, 0xaf, 'a','b','r','e','v','e','a','c','u','t','e',0, +0xa3, 0x75, 0x1e, 0xb0, 'A','b','r','e','v','e','g','r','a','v','e',0, +0x23, 0x75, 0x1e, 0xb1, 'a','b','r','e','v','e','g','r','a','v','e',0, +0x51, 0x95, 0x1e, 0xb2, 'A','b','r','e','v','e','h','o','o','k',0, +0x91, 0x95, 0x1e, 0xb3, 'a','b','r','e','v','e','h','o','o','k',0, +0xa4, 0x05, 0x1e, 0xb4, 'A','b','r','e','v','e','t','i','l','d','e',0, +0x24, 0x05, 0x1e, 0xb5, 'a','b','r','e','v','e','t','i','l','d','e',0, +0x1a, 0x4a, 0x1e, 0xb6, 'A','b','r','e','v','e','b','e','l','o','w','d','o','t',0, +0x1a, 0x4a, 0x1e, 0xb7, 'a','b','r','e','v','e','b','e','l','o','w','d','o','t',0, +0xaa, 0x4a, 0x1e, 0xb8, 'E','b','e','l','o','w','d','o','t',0, +0xca, 0x4a, 0x1e, 0xb9, 'e','b','e','l','o','w','d','o','t',0, +0x0a, 0x95, 0x1e, 0xba, 'E','h','o','o','k',0, +0x0c, 0x95, 0x1e, 0xbb, 'e','h','o','o','k',0, +0x16, 0x05, 0x1e, 0xbc, 'E','t','i','l','d','e',0, +0x1a, 0x05, 0x1e, 0xbd, 'e','t','i','l','d','e',0, +0x16, 0x89, 0x1e, 0xbe, 'E','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0, +0x16, 0x89, 0x1e, 0xbf, 'e','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0, +0x17, 0x15, 0x1e, 0xc0, 'E','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0, +0x17, 0x15, 0x1e, 0xc1, 'e','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0, +0x0b, 0x65, 0x1e, 0xc2, 'E','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0, +0x0b, 0x65, 0x1e, 0xc3, 'e','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0, +0x17, 0xa5, 0x1e, 0xc4, 'E','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0, +0x17, 0xa5, 0x1e, 0xc5, 'e','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0, +0xb7, 0x4a, 0x1e, 0xc6, 'E','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0, +0xb7, 0x4a, 0x1e, 0xc7, 'e','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0, +0x0a, 0xd5, 0x1e, 0xc8, 'I','h','o','o','k',0, +0x0c, 0xd5, 0x1e, 0xc9, 'i','h','o','o','k',0, +0xae, 0x4a, 0x1e, 0xca, 'I','b','e','l','o','w','d','o','t',0, +0xce, 0x4a, 0x1e, 0xcb, 'i','b','e','l','o','w','d','o','t',0, +0xb4, 0x4a, 0x1e, 0xcc, 'O','b','e','l','o','w','d','o','t',0, +0xd4, 0x4a, 0x1e, 0xcd, 'o','b','e','l','o','w','d','o','t',0, +0x0b, 0x35, 0x1e, 0xce, 'O','h','o','o','k',0, +0x0d, 0x35, 0x1e, 0xcf, 'o','h','o','o','k',0, +0x16, 0x89, 0x1e, 0xd0, 'O','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0, +0x16, 0x89, 0x1e, 0xd1, 'o','c','i','r','c','u','m','f','l','e','x','a','c','u','t','e',0, +0x17, 0x15, 0x1e, 0xd2, 'O','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0, +0x17, 0x15, 0x1e, 0xd3, 'o','c','i','r','c','u','m','f','l','e','x','g','r','a','v','e',0, +0x8b, 0x65, 0x1e, 0xd4, 'O','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0, +0x8b, 0x65, 0x1e, 0xd5, 'o','c','i','r','c','u','m','f','l','e','x','h','o','o','k',0, +0x17, 0xa5, 0x1e, 0xd6, 'O','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0, +0x17, 0xa5, 0x1e, 0xd7, 'o','c','i','r','c','u','m','f','l','e','x','t','i','l','d','e',0, +0xb7, 0x4a, 0x1e, 0xd8, 'O','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0, +0xb7, 0x4a, 0x1e, 0xd9, 'o','c','i','r','c','u','m','f','l','e','x','b','e','l','o','w','d','o','t',0, +0x74, 0x09, 0x1e, 0xda, 'O','h','o','r','n','a','c','u','t','e',0, +0xb4, 0x09, 0x1e, 0xdb, 'o','h','o','r','n','a','c','u','t','e',0, +0x74, 0x95, 0x1e, 0xdc, 'O','h','o','r','n','g','r','a','v','e',0, +0xb4, 0x95, 0x1e, 0xdd, 'o','h','o','r','n','g','r','a','v','e',0, +0xba, 0x25, 0x1e, 0xde, 'O','h','o','r','n','h','o','o','k',0, +0xda, 0x25, 0x1e, 0xdf, 'o','h','o','r','n','h','o','o','k',0, +0x75, 0x25, 0x1e, 0xe0, 'O','h','o','r','n','t','i','l','d','e',0, +0xb5, 0x25, 0x1e, 0xe1, 'o','h','o','r','n','t','i','l','d','e',0, +0xa3, 0x4a, 0x1e, 0xe2, 'O','h','o','r','n','b','e','l','o','w','d','o','t',0, +0xa3, 0x4a, 0x1e, 0xe3, 'o','h','o','r','n','b','e','l','o','w','d','o','t',0, +0xba, 0x4a, 0x1e, 0xe4, 'U','b','e','l','o','w','d','o','t',0, +0xda, 0x4a, 0x1e, 0xe5, 'u','b','e','l','o','w','d','o','t',0, +0x0b, 0x95, 0x1e, 0xe6, 'U','h','o','o','k',0, +0x0d, 0x95, 0x1e, 0xe7, 'u','h','o','o','k',0, +0x80, 0x09, 0x1e, 0xe8, 'U','h','o','r','n','a','c','u','t','e',0, +0xc0, 0x09, 0x1e, 0xe9, 'u','h','o','r','n','a','c','u','t','e',0, +0x80, 0x95, 0x1e, 0xea, 'U','h','o','r','n','g','r','a','v','e',0, +0xc0, 0x95, 0x1e, 0xeb, 'u','h','o','r','n','g','r','a','v','e',0, +0xc0, 0x25, 0x1e, 0xec, 'U','h','o','r','n','h','o','o','k',0, +0xe0, 0x25, 0x1e, 0xed, 'u','h','o','r','n','h','o','o','k',0, +0x81, 0x25, 0x1e, 0xee, 'U','h','o','r','n','t','i','l','d','e',0, +0xc1, 0x25, 0x1e, 0xef, 'u','h','o','r','n','t','i','l','d','e',0, +0x03, 0x4a, 0x1e, 0xf0, 'U','h','o','r','n','b','e','l','o','w','d','o','t',0, +0x03, 0x4a, 0x1e, 0xf1, 'u','h','o','r','n','b','e','l','o','w','d','o','t',0, +0xbe, 0x4a, 0x1e, 0xf4, 'Y','b','e','l','o','w','d','o','t',0, +0xde, 0x4a, 0x1e, 0xf5, 'y','b','e','l','o','w','d','o','t',0, +0x0b, 0xd5, 0x1e, 0xf6, 'Y','h','o','o','k',0, +0x0d, 0xd5, 0x1e, 0xf7, 'y','h','o','o','k',0, +0x18, 0x85, 0x1e, 0xf8, 'Y','t','i','l','d','e',0, +0x1c, 0x85, 0x1e, 0xf9, 'y','t','i','l','d','e',0, +0x0b, 0x3e, 0x1e, 0xfa, 'O','h','o','r','n',0, +0x0d, 0x3e, 0x1e, 0xfb, 'o','h','o','r','n',0, +0x0b, 0x9e, 0x1e, 0xfc, 'U','h','o','r','n',0, +0x0d, 0x9e, 0x1e, 0xfd, 'u','h','o','r','n',0, +0xd3, 0x05, 0x1e, 0x9f, 'c','o','m','b','i','n','i','n','g','_','t','i','l','d','e',0, +0xd2, 0x75, 0x1e, 0xf2, 'c','o','m','b','i','n','i','n','g','_','g','r','a','v','e',0, +0xd1, 0xe9, 0x1e, 0xf3, 'c','o','m','b','i','n','i','n','g','_','a','c','u','t','e',0, +0xe9, 0x15, 0x1e, 0xfe, 'c','o','m','b','i','n','i','n','g','_','h','o','o','k',0, +0x92, 0x4a, 0x1e, 0xff, 'c','o','m','b','i','n','i','n','g','_','b','e','l','o','w','d','o','t',0, +0x2a, 0x68, 0x20, 0xa0, 'E','c','u','S','i','g','n',0, +0xaf, 0xb8, 0x20, 0xa1, 'C','o','l','o','n','S','i','g','n',0, +0xab, 0x68, 0x20, 0xa2, 'C','r','u','z','e','i','r','o','S','i','g','n',0, +0x3c, 0xa8, 0x20, 0xa3, 'F','F','r','a','n','c','S','i','g','n',0, +0x5a, 0x08, 0x20, 0xa4, 'L','i','r','a','S','i','g','n',0, +0x5a, 0x78, 0x20, 0xa5, 'M','i','l','l','S','i','g','n',0, +0xb2, 0x88, 0x20, 0xa6, 'N','a','i','r','a','S','i','g','n',0, +0x71, 0xc8, 0x20, 0xa7, 'P','e','s','e','t','a','S','i','g','n',0, +0xc0, 0xe8, 0x20, 0xa8, 'R','u','p','e','e','S','i','g','n',0, +0x2f, 0xf8, 0x20, 0xa9, 'W','o','n','S','i','g','n',0, +0x59, 0x98, 0x20, 0xaa, 'N','e','w','S','h','e','q','e','l','S','i','g','n',0, +0x57, 0x68, 0x20, 0xab, 'D','o','n','g','S','i','g','n',0, +0x5a, 0x68, 0x20, 0xac, 'E','u','r','o','S','i','g','n',0 +}; + +#define KTABLESIZE 2909 +#define KMAXHASH 10 + +static const unsigned short hashString[KTABLESIZE] = { +0x0000, 0x0000, 0x21eb, 0x0000, 0x0000, 0x2356, 0x2302, 0x0000, +0x4090, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c60, 0x220f, 0x522c, +0x666b, 0x3d02, 0x19d9, 0x0000, 0x1487, 0x0000, 0x2362, 0x0000, +0x0000, 0x622d, 0x21f7, 0x0000, 0x5717, 0x230e, 0x239e, 0x0000, +0x43da, 0x6164, 0x23ce, 0x534a, 0x0262, 0x5601, 0x22c6, 0x0223, +0x1e57, 0x48bb, 0x23c2, 0x0000, 0x0000, 0x0000, 0x0000, 0x17a9, +0x124c, 0x1252, 0x1258, 0x125e, 0x1264, 0x126a, 0x1270, 0x1276, +0x127c, 0x1282, 0x6547, 0x5283, 0x0000, 0x426d, 0x2115, 0x0000, +0x0000, 0x12d3, 0x12d9, 0x12df, 0x12e5, 0x12eb, 0x12f1, 0x12f7, +0x12fd, 0x1303, 0x1309, 0x130f, 0x1315, 0x131b, 0x1321, 0x026d, +0x132d, 0x1333, 0x0bea, 0x133f, 0x1345, 0x134b, 0x1351, 0x1357, +0x135d, 0x1363, 0x1369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x13d5, 0x13db, 0x13e1, 0x13e7, 0x13ed, 0x13f3, 0x13f9, +0x13ff, 0x1405, 0x140b, 0x1411, 0x1417, 0x141d, 0x1423, 0x1429, +0x142f, 0x1435, 0x143b, 0x1441, 0x1447, 0x144d, 0x1453, 0x1459, +0x145f, 0x1465, 0x146b, 0x1cf2, 0x3371, 0x07d2, 0x0000, 0x405a, +0x0000, 0x0000, 0x3c6a, 0x6566, 0x0000, 0x0000, 0x28a4, 0x0842, +0x2eed, 0x4f73, 0x0000, 0x176a, 0x0000, 0x0000, 0x227d, 0x4f3c, +0x391a, 0x0000, 0x3ede, 0x0000, 0x0000, 0x17e8, 0x1a14, 0x0000, +0x4e1c, 0x3f7a, 0x0000, 0x6378, 0x003d, 0x0000, 0x4111, 0x0112, +0x0000, 0x0317, 0x3489, 0x2264, 0x0000, 0x1339, 0x070c, 0x0000, +0x0000, 0x5e0c, 0x645e, 0x6326, 0x0718, 0x4937, 0x5cf7, 0x03f4, +0x0db8, 0x01ad, 0x0000, 0x1c2d, 0x0000, 0x0000, 0x4af6, 0x33ba, +0x0000, 0x491b, 0x0000, 0x03e6, 0x0000, 0x04b4, 0x04bb, 0x04c2, +0x04c9, 0x04d0, 0x04d7, 0x04de, 0x04e5, 0x04ec, 0x0000, 0x16ab, +0x0000, 0x0503, 0x0512, 0x0521, 0x0530, 0x053f, 0x054e, 0x055d, +0x056c, 0x057b, 0x19ef, 0x19cc, 0x0000, 0x059a, 0x05a9, 0x05b8, +0x05c7, 0x05d6, 0x05e5, 0x05f4, 0x0603, 0x0612, 0x0000, 0x1f43, +0x2a8c, 0x30cd, 0x0c1a, 0x2072, 0x0000, 0x0000, 0x0679, 0x312c, +0x0000, 0x1b54, 0x0000, 0x0000, 0x0685, 0x270c, 0x3c87, 0x1327, +0x0000, 0x6528, 0x0a7f, 0x0000, 0x6642, 0x0b1d, 0x0000, 0x0000, +0x5fd2, 0x5e91, 0x0000, 0x1f38, 0x0000, 0x3eb2, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4073, 0x0000, 0x0000, 0x0000, +0x0000, 0x489b, 0x0000, 0x0000, 0x1ede, 0x5bb7, 0x0000, 0x0b08, +0x0000, 0x0000, 0x11c4, 0x0000, 0x0000, 0x62d2, 0x0000, 0x5deb, +0x275a, 0x0000, 0x0209, 0x0000, 0x267a, 0x036e, 0x0000, 0x0000, +0x26ed, 0x0000, 0x31d8, 0x0000, 0x0000, 0x0000, 0x2787, 0x1847, +0x1db4, 0x0000, 0x183d, 0x2054, 0x136f, 0x5c3d, 0x0000, 0x0000, +0x0000, 0x64d9, 0x3cba, 0x0000, 0x02ff, 0x0000, 0x12cc, 0x5f02, +0x1995, 0x4f01, 0x1223, 0x044c, 0x09fd, 0x2e49, 0x0ac1, 0x0000, +0x1b39, 0x27e7, 0x0000, 0x0052, 0x3cb3, 0x5c91, 0x28c6, 0x1288, +0x3ccf, 0x3f99, 0x30ad, 0x1e7c, 0x3b7b, 0x0000, 0x043d, 0x15be, +0x0000, 0x0000, 0x0000, 0x0d23, 0x24d0, 0x0000, 0x0000, 0x0d55, +0x0000, 0x0387, 0x0000, 0x0000, 0x1d6c, 0x0000, 0x1536, 0x17d3, +0x3cd6, 0x0000, 0x25b7, 0x087e, 0x269f, 0x0000, 0x0000, 0x31fe, +0x2e68, 0x0000, 0x651a, 0x0000, 0x294e, 0x6143, 0x217c, 0x44b8, +0x4e33, 0x4b8c, 0x38e0, 0x5dda, 0x2778, 0x0000, 0x5d94, 0x179e, +0x13bd, 0x4da0, 0x1fd1, 0x38a6, 0x3981, 0x12a9, 0x041c, 0x3d96, +0x5e1c, 0x0000, 0x0000, 0x32e2, 0x0000, 0x0000, 0x0000, 0x1d1b, +0x5be9, 0x0000, 0x15d3, 0x2816, 0x1dd7, 0x0000, 0x197a, 0x3341, +0x00a0, 0x5c5e, 0x5d83, 0x2c00, 0x0000, 0x0000, 0x0000, 0x0000, +0x5c80, 0x0000, 0x0000, 0x5cc4, 0x0000, 0x3ca2, 0x0000, 0x19e4, +0x36b5, 0x3a20, 0x0000, 0x2227, 0x5d3d, 0x0000, 0x0000, 0x2fe9, +0x1e87, 0x0000, 0x04f3, 0x04fb, 0x050a, 0x0519, 0x0528, 0x0537, +0x0546, 0x0555, 0x0564, 0x0573, 0x05fb, 0x060a, 0x0000, 0x306a, +0x0000, 0x0000, 0x32b2, 0x323e, 0x1fea, 0x2efd, 0x4d4c, 0x0000, +0x3311, 0x3321, 0x058a, 0x42fa, 0x40cd, 0x2e7a, 0x0000, 0x3b11, +0x0000, 0x32f1, 0x0000, 0x653c, 0x5c1b, 0x0000, 0x47bb, 0x0000, +0x122d, 0x3331, 0x0000, 0x1918, 0x0000, 0x3361, 0x163e, 0x3301, +0x62c8, 0x15b4, 0x0621, 0x0631, 0x0641, 0x0651, 0x0661, 0x0671, +0x0000, 0x655c, 0x0000, 0x01cc, 0x0000, 0x40fe, 0x4243, 0x0000, +0x5d19, 0x6472, 0x0000, 0x31ee, 0x45f3, 0x0000, 0x0000, 0x1b82, +0x0000, 0x64e8, 0x1b8d, 0x0000, 0x4483, 0x0000, 0x0000, 0x1e08, +0x0000, 0x429e, 0x0000, 0x1b6c, 0x2044, 0x39e9, 0x0000, 0x5405, +0x0000, 0x0000, 0x117c, 0x0000, 0x1729, 0x1242, 0x0000, 0x0000, +0x0000, 0x0000, 0x3c50, 0x0000, 0x4cc8, 0x2ff8, 0x0aa2, 0x0000, +0x0000, 0x3019, 0x1baf, 0x6442, 0x3039, 0x1bdc, 0x5fdc, 0x0000, +0x0000, 0x25cc, 0x309d, 0x1739, 0x30bd, 0x2d6d, 0x3eed, 0x609a, +0x30fc, 0x310c, 0x394e, 0x0000, 0x0401, 0x175a, 0x0f43, 0x0000, +0x0000, 0x30dc, 0x1106, 0x0000, 0x273a, 0x0000, 0x03d8, 0x1866, +0x4edf, 0x1496, 0x1ba4, 0x327f, 0x0000, 0x02f2, 0x5779, 0x30ec, +0x6468, 0x0000, 0x40ab, 0x17fd, 0x59f7, 0x1925, 0x24c0, 0x0000, +0x0000, 0x6218, 0x0000, 0x0000, 0x0000, 0x1579, 0x0000, 0x0000, +0x5b56, 0x1dbf, 0x0000, 0x2fd9, 0x0000, 0x296e, 0x3774, 0x4228, +0x120d, 0x0000, 0x545c, 0x3c06, 0x0250, 0x0000, 0x09cd, 0x0000, +0x17b4, 0x26ce, 0x0000, 0x0000, 0x5a9d, 0x0000, 0x6030, 0x0000, +0x5a37, 0x0000, 0x0000, 0x6450, 0x0dd0, 0x0de4, 0x0df8, 0x0e0c, +0x0e20, 0x2824, 0x1c09, 0x0829, 0x0000, 0x27d8, 0x5f27, 0x0000, +0x3049, 0x3cc1, 0x5f1c, 0x0000, 0x001e, 0x0000, 0x0000, 0x1f5c, +0x6532, 0x293f, 0x2026, 0x0000, 0x0000, 0x3cc8, 0x0000, 0x0000, +0x0000, 0x1e70, 0x0e34, 0x63a8, 0x56d5, 0x0000, 0x50dc, 0x1cd4, +0x0000, 0x0000, 0x42ad, 0x0000, 0x1ec5, 0x41c4, 0x58a7, 0x43cf, +0x0000, 0x0ed2, 0x0ee4, 0x0ef6, 0x0f08, 0x0f1a, 0x0000, 0x0000, +0x3758, 0x4042, 0x0000, 0x0000, 0x0000, 0x1292, 0x0000, 0x0000, +0x0000, 0x55c2, 0x24f0, 0x3fd6, 0x0000, 0x0000, 0x5973, 0x0000, +0x1c8e, 0x21a8, 0x0000, 0x0000, 0x266a, 0x21c9, 0x53a0, 0x189b, +0x155f, 0x21b3, 0x0000, 0x014d, 0x3fab, 0x39fb, 0x23da, 0x21d4, +0x3bbf, 0x2769, 0x0000, 0x185b, 0x147f, 0x21be, 0x0000, 0x4442, +0x5843, 0x5a57, 0x0000, 0x0f8a, 0x0000, 0x0000, 0x57b9, 0x2c9c, +0x0000, 0x2121, 0x5bfa, 0x0092, 0x0000, 0x18a6, 0x5abd, 0x1a41, +0x4a88, 0x212c, 0x5fa1, 0x0000, 0x0f72, 0x0000, 0x6130, 0x1c49, +0x0000, 0x0000, 0x3618, 0x0000, 0x414e, 0x2137, 0x431b, 0x26be, +0x0000, 0x0000, 0x0000, 0x0000, 0x18c5, 0x5f74, 0x06f4, 0x3bd9, +0x5f32, 0x0000, 0x0000, 0x0000, 0x0700, 0x0000, 0x441b, 0x2833, +0x0000, 0x1d64, 0x0000, 0x427d, 0x0000, 0x0000, 0x50ea, 0x27f6, +0x0000, 0x0d46, 0x11ad, 0x139e, 0x5a07, 0x0a70, 0x0000, 0x4606, +0x5b37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5dfb, +0x0000, 0x0000, 0x0000, 0x0000, 0x5fac, 0x0000, 0x0000, 0x1b77, +0x0000, 0x5c4d, 0x1a2b, 0x0000, 0x43f3, 0x4472, 0x0000, 0x0062, +0x0000, 0x65c9, 0x0000, 0x0000, 0x14e8, 0x4568, 0x0000, 0x3ea4, +0x0000, 0x5c6f, 0x156e, 0x0000, 0x0000, 0x26dd, 0x5854, 0x0000, +0x272a, 0x1ce2, 0x0000, 0x0000, 0x50f8, 0x0000, 0x0ab1, 0x0000, +0x1692, 0x485a, 0x26fc, 0x54ca, 0x2fc9, 0x0000, 0x26ae, 0x14b6, +0x138d, 0x0000, 0x3686, 0x1890, 0x2806, 0x1bed, 0x0000, 0x0770, +0x0000, 0x5ca1, 0x0000, 0x62fc, 0x4d8e, 0x4011, 0x59c6, 0x3e89, +0x0000, 0x4835, 0x0000, 0x6191, 0x2f4e, 0x0000, 0x2500, 0x1bc6, +0x3be8, 0x38ce, 0x1bd1, 0x0179, 0x0000, 0x0000, 0x3d70, 0x0000, +0x271a, 0x0582, 0x0000, 0x0592, 0x5ebb, 0x05a1, 0x55af, 0x05b0, +0x4d2f, 0x05bf, 0x0000, 0x05ce, 0x409c, 0x05dd, 0x1956, 0x05ec, +0x3993, 0x2689, 0x5832, 0x326f, 0x46ac, 0x5876, 0x3f40, 0x18e3, +0x466e, 0x0000, 0x5018, 0x0000, 0x0000, 0x5922, 0x42be, 0x32a2, +0x0137, 0x32d2, 0x0000, 0x4ab1, 0x507a, 0x469d, 0x464e, 0x0000, +0x0ebc, 0x3a33, 0x4515, 0x35b8, 0x287c, 0x0000, 0x0d34, 0x0000, +0x3445, 0x44c6, 0x58ff, 0x29af, 0x4ffb, 0x0000, 0x08dc, 0x0000, +0x4380, 0x601b, 0x0000, 0x3d13, 0x0893, 0x0000, 0x0000, 0x0000, +0x0000, 0x48ad, 0x3659, 0x15f2, 0x1610, 0x53d0, 0x4817, 0x0000, +0x1158, 0x5a68, 0x0394, 0x3a4c, 0x45bf, 0x18b6, 0x57ca, 0x0000, +0x0000, 0x33dc, 0x617c, 0x3e27, 0x5d07, 0x5f10, 0x5ace, 0x0000, +0x0000, 0x0c88, 0x0000, 0x0000, 0x0000, 0x5f48, 0x1066, 0x2af6, +0x0000, 0x325e, 0x0000, 0x0fcf, 0x0000, 0x0000, 0x0000, 0x49a2, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x16b2, 0x1677, +0x0000, 0x1a56, 0x46dc, 0x1dcc, 0x1c62, 0x0000, 0x0000, 0x1b61, +0x5d4e, 0x2f1c, 0x1bfe, 0x5e3e, 0x0000, 0x0000, 0x393b, 0x5119, +0x0000, 0x042d, 0x263a, 0x0000, 0x0a3a, 0x47cc, 0x3e68, 0x15a2, +0x4dde, 0x0000, 0x4f62, 0x0000, 0x48cc, 0x33a9, 0x0000, 0x0000, +0x2e8a, 0x0000, 0x0190, 0x0000, 0x27c9, 0x0000, 0x552b, 0x1a36, +0x0000, 0x3c10, 0x1a4b, 0x3802, 0x0000, 0x0000, 0x4d69, 0x0000, +0x0000, 0x0000, 0x14db, 0x03af, 0x5cb2, 0x486c, 0x0a8e, 0x0000, +0x634e, 0x0000, 0x0000, 0x107b, 0x0000, 0x3350, 0x0000, 0x0b3d, +0x0000, 0x4db7, 0x2f3d, 0x2624, 0x1237, 0x5f09, 0x0000, 0x0000, +0x0000, 0x0000, 0x14f0, 0x18ee, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x4c23, 0x0000, 0x2195, 0x0000, +0x0000, 0x0000, 0x48ef, 0x0d79, 0x1fb8, 0x20c6, 0x0000, 0x47dd, +0x0000, 0x477b, 0x0000, 0x305a, 0x0000, 0x0000, 0x1554, 0x193b, +0x0000, 0x0000, 0x0000, 0x0000, 0x41da, 0x3af8, 0x0000, 0x3029, +0x0000, 0x4579, 0x5d72, 0x63b7, 0x0000, 0x2bad, 0x0000, 0x44e5, +0x5475, 0x4808, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x1909, 0x0000, 0x3da0, 0x2cea, 0x25f6, 0x0000, 0x3b23, 0x0c5e, +0x0000, 0x0000, 0x3e4b, 0x0913, 0x0000, 0x63e4, 0x43c4, 0x0000, +0x4982, 0x47f4, 0x0000, 0x01dd, 0x649f, 0x15e6, 0x459c, 0x0000, +0x0000, 0x0000, 0x0000, 0x1970, 0x428e, 0x3e7c, 0x487a, 0x0000, +0x0000, 0x0000, 0x2859, 0x18cd, 0x2d4c, 0x0000, 0x0000, 0x1fc6, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b2c, 0x0000, 0x0000, +0x0000, 0x53ee, 0x60b2, 0x1d49, 0x0000, 0x63f2, 0x0000, 0x0000, +0x0000, 0x0000, 0x3647, 0x6570, 0x0000, 0x0000, 0x045a, 0x0463, +0x046c, 0x0475, 0x047e, 0x0487, 0x0490, 0x0499, 0x04a2, 0x04ab, +0x0000, 0x0000, 0x0000, 0x23e5, 0x4f2c, 0x0000, 0x0000, 0x0000, +0x10cb, 0x1058, 0x0000, 0x3d25, 0x0000, 0x0000, 0x0000, 0x4614, +0x5af1, 0x4f9a, 0x0000, 0x3c91, 0x0000, 0x5f52, 0x0000, 0x0000, +0x1e93, 0x28d7, 0x4b57, 0x4e9c, 0x0000, 0x62b0, 0x4dcd, 0x1965, +0x0000, 0x2d8c, 0x60e2, 0x27ba, 0x4c13, 0x0000, 0x0000, 0x0000, +0x41f2, 0x2dad, 0x3794, 0x0c9e, 0x0000, 0x0000, 0x0000, 0x0000, +0x1f91, 0x0000, 0x0000, 0x6082, 0x0000, 0x3194, 0x4769, 0x63d5, +0x0000, 0x1731, 0x0000, 0x0000, 0x2a72, 0x59b5, 0x51cd, 0x1a6e, +0x0000, 0x0000, 0x1650, 0x56b3, 0x658e, 0x137f, 0x10d9, 0x0000, +0x0000, 0x10a0, 0x55eb, 0x0000, 0x38c0, 0x3f4b, 0x6481, 0x0000, +0x0000, 0x0000, 0x0000, 0x3008, 0x1813, 0x313b, 0x4757, 0x0000, +0x0000, 0x0010, 0x4cda, 0x0798, 0x0000, 0x0000, 0x17f2, 0x4bb3, +0x0000, 0x0000, 0x4175, 0x3a7b, 0x0000, 0x0000, 0x65a2, 0x0000, +0x0000, 0x104a, 0x4202, 0x1fad, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x5546, 0x0000, 0x0000, 0x35f2, 0x6006, +0x0000, 0x320d, 0x0000, 0x0000, 0x0619, 0x1015, 0x5245, 0x0629, +0x33c9, 0x4e87, 0x0639, 0x0000, 0x02a9, 0x0649, 0x02d0, 0x54b3, +0x0659, 0x529a, 0x2c24, 0x0669, 0x02bd, 0x1f1c, 0x29d2, 0x0000, +0x421c, 0x4bc3, 0x2491, 0x0000, 0x0000, 0x57db, 0x0000, 0x0000, +0x1dfd, 0x0000, 0x2df1, 0x5911, 0x0000, 0x0000, 0x65fa, 0x0000, +0x0000, 0x0000, 0x0000, 0x32c2, 0x0200, 0x0000, 0x5db7, 0x440e, +0x021a, 0x28fa, 0x39bd, 0x01f7, 0x0000, 0x0000, 0x0000, 0x0000, +0x58c9, 0x0000, 0x6294, 0x0000, 0x5e7f, 0x65ec, 0x4736, 0x0000, +0x62a2, 0x0000, 0x49f8, 0x1ef7, 0x0000, 0x02a0, 0x4ac0, 0x0000, +0x0000, 0x3e35, 0x0000, 0x274b, 0x0000, 0x0000, 0x4a08, 0x640f, +0x64ca, 0x1946, 0x4927, 0x0297, 0x0000, 0x39d3, 0x0000, 0x0000, +0x425f, 0x438d, 0x4a27, 0x0855, 0x61f0, 0x0000, 0x0000, 0x0000, +0x0239, 0x0000, 0x08c2, 0x20ed, 0x0000, 0x650c, 0x0000, 0x2f81, +0x434b, 0x3e40, 0x2c89, 0x0000, 0x3e0a, 0x0000, 0x4a37, 0x1c9b, +0x2542, 0x0784, 0x255c, 0x2569, 0x2576, 0x2583, 0x2590, 0x259d, +0x25aa, 0x1a08, 0x458d, 0x0000, 0x0000, 0x0000, 0x4a67, 0x6430, +0x51e5, 0x0000, 0x0bd2, 0x0000, 0x1c13, 0x4122, 0x3ef8, 0x35d2, +0x55d7, 0x0000, 0x0000, 0x58ed, 0x0000, 0x0000, 0x3e5b, 0x028e, +0x19fa, 0x3399, 0x0000, 0x2142, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x22ea, 0x0000, 0x20de, 0x0000, 0x231a, 0x0000, 0x21df, +0x1de4, 0x22f6, 0x4c80, 0x2203, 0x0000, 0x22ae, 0x61c6, 0x1e10, +0x0000, 0x22d2, 0x2326, 0x233e, 0x0000, 0x1cfd, 0x0b5b, 0x221b, +0x0000, 0x2258, 0x44a6, 0x0a1a, 0x2080, 0x2296, 0x0000, 0x234a, +0x6044, 0x2271, 0x4cb3, 0x236e, 0x22ba, 0x224c, 0x1da7, 0x22a2, +0x0000, 0x23aa, 0x0000, 0x2234, 0x0000, 0x0358, 0x57fd, 0x0b71, +0x23b6, 0x037b, 0x0000, 0x2392, 0x034c, 0x2be4, 0x2240, 0x237a, +0x0000, 0x0000, 0x5214, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x2b5e, 0x0000, 0x28b5, 0x4d7c, 0x0000, 0x0000, 0x0000, 0x31a5, +0x0000, 0x0000, 0x36ed, 0x3e97, 0x2dbe, 0x5789, 0x0000, 0x3ba6, +0x2b92, 0x22de, 0x5b03, 0x0000, 0x0000, 0x43b3, 0x0000, 0x5ef7, +0x3403, 0x0000, 0x5175, 0x0000, 0x14c5, 0x3419, 0x0000, 0x5dc8, +0x392b, 0x03a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c74, 0x0000, +0x0a4c, 0x4e0a, 0x4e71, 0x0000, 0x1b1d, 0x0000, 0x5a79, 0x0000, +0x6490, 0x0000, 0x657a, 0x3f04, 0x4213, 0x0000, 0x0000, 0x0000, +0x2386, 0x25e5, 0x2f9f, 0x3608, 0x4adf, 0x1d0d, 0x5adf, 0x2510, +0x0000, 0x3627, 0x209c, 0x2158, 0x4543, 0x0000, 0x0000, 0x1592, +0x3dab, 0x5a27, 0x1d39, 0x0000, 0x0000, 0x2189, 0x315c, 0x3dfb, +0x0000, 0x2170, 0x295d, 0x563f, 0x433d, 0x0000, 0x0000, 0x2164, +0x0000, 0x4fe0, 0x0000, 0x01bc, 0x4847, 0x0000, 0x1623, 0x53b3, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x625a, +0x0b9d, 0x0000, 0x0000, 0x228a, 0x2425, 0x12a0, 0x0000, 0x0000, +0x0b4d, 0x0bab, 0x43a6, 0x2079, 0x0000, 0x0000, 0x641e, 0x0000, +0x0000, 0x5963, 0x0000, 0x0000, 0x0000, 0x0000, 0x1518, 0x36a5, +0x1989, 0x5ff1, 0x0f9d, 0x1a94, 0x3f8b, 0x0000, 0x0000, 0x2c76, +0x2eab, 0x4b23, 0x0731, 0x562b, 0x0000, 0x0000, 0x0000, 0x5821, +0x0000, 0x57a9, 0x2f6f, 0x3695, 0x4b0e, 0x4453, 0x0000, 0x3cdd, +0x0000, 0x0000, 0x0ce4, 0x0000, 0x0000, 0x0000, 0x575b, 0x07fd, +0x0000, 0x1b98, 0x43bb, 0x0000, 0x5865, 0x0000, 0x16d5, 0x0000, +0x0000, 0x5da5, 0x4e44, 0x0000, 0x3dbd, 0x121a, 0x63c6, 0x633a, +0x0000, 0x0000, 0x5b47, 0x56c4, 0x0000, 0x311c, 0x0000, 0x3de1, +0x0000, 0x2796, 0x2f5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x314c, 0x0000, 0x5cd5, 0x0000, 0x418b, 0x4963, 0x5f60, +0x1eb9, 0x0000, 0x075b, 0x0000, 0x0000, 0x4029, 0x37c3, 0x0000, +0x3db4, 0x4aa3, 0x24df, 0x33ed, 0x435a, 0x0000, 0x0000, 0x2cb2, +0x0000, 0x3184, 0x0000, 0x1186, 0x56f7, 0x0000, 0x0000, 0x1808, +0x2c4a, 0x4fed, 0x0000, 0x56a2, 0x0e4e, 0x0e64, 0x0e7a, 0x0e90, +0x0ea6, 0x56e6, 0x0000, 0x3dc9, 0x5933, 0x1ca6, 0x5b27, 0x1791, +0x0000, 0x0000, 0x5887, 0x324e, 0x0000, 0x08aa, 0x3a90, 0x1f83, +0x59d7, 0x6311, 0x0000, 0x0000, 0x4462, 0x58b8, 0x44f6, 0x559e, +0x0000, 0x0000, 0x0000, 0x0000, 0x5953, 0x57ec, 0x1584, 0x4943, +0x3821, 0x0000, 0x5799, 0x3dd5, 0x0000, 0x4401, 0x5995, 0x0000, +0x12b3, 0x0bb9, 0x0000, 0x2aa7, 0x39a8, 0x0000, 0x3637, 0x0000, +0x0f5a, 0x0f2c, 0x0cf8, 0x2034, 0x0000, 0x0000, 0x543d, 0x0000, +0x0000, 0x3b6e, 0x1881, 0x3ed1, 0x34bb, 0x0000, 0x0000, 0x0000, +0x0000, 0x371a, 0x5484, 0x3b95, 0x4558, 0x2b78, 0x0000, 0x0000, +0x0000, 0x505d, 0x3668, 0x5667, 0x45e3, 0x0000, 0x0000, 0x3676, +0x01ea, 0x50b2, 0x0000, 0x4304, 0x5707, 0x1f4e, 0x0000, 0x0000, +0x58db, 0x5042, 0x3ec2, 0x0000, 0x5b75, 0x0000, 0x2a58, 0x4b77, +0x0000, 0x1c39, 0x5366, 0x0000, 0x5943, 0x0000, 0x374a, 0x0000, +0x0000, 0x0000, 0x5897, 0x3c79, 0x1f0e, 0x4534, 0x0000, 0x0000, +0x0746, 0x6242, 0x0000, 0x0000, 0x370c, 0x0000, 0x5a47, 0x0000, +0x5026, 0x50ce, 0x2cd8, 0x0000, 0x3766, 0x13ae, 0x0000, 0x0000, +0x2d1b, 0x0000, 0x5050, 0x3961, 0x3f2a, 0x0000, 0x59a5, 0x5383, +0x0d66, 0x0000, 0x2ddf, 0x3d37, 0x0000, 0x3d4a, 0x0000, 0x1023, +0x1030, 0x103d, 0x467d, 0x3d83, 0x5bd8, 0x5009, 0x00ea, 0x0691, +0x468d, 0x0000, 0x479a, 0x0000, 0x28e9, 0x069f, 0x0000, 0x50a3, +0x1c20, 0x463e, 0x0000, 0x4fbd, 0x4524, 0x43e6, 0x3bcd, 0x5033, +0x0000, 0x0000, 0x0000, 0x097d, 0x465e, 0x0000, 0x0000, 0x0000, +0x10ae, 0x3971, 0x0000, 0x60c2, 0x44d5, 0x27a7, 0x0000, 0x0000, +0x2ebd, 0x1e9f, 0x0000, 0x0000, 0x0000, 0x5691, 0x4c71, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x62e7, 0x0000, 0x665f, 0x0000, +0x45d1, 0x34a1, 0x0000, 0x29e6, 0x3cf0, 0x0242, 0x5132, 0x5e8a, +0x0000, 0x0000, 0x3079, 0x0000, 0x5729, 0x0000, 0x2e9b, 0x1d2b, +0x2d2d, 0x0000, 0x0000, 0x0000, 0x4d14, 0x5617, 0x0000, 0x0084, +0x0000, 0x0cc9, 0x07ea, 0x1602, 0x2e39, 0x3bb3, 0x580f, 0x6286, +0x46ff, 0x4b48, 0x0000, 0x1bba, 0x4fac, 0x0000, 0x086d, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x16ca, 0x6101, 0x0000, 0x3aae, +0x1687, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c04, 0x1e63, 0x0000, +0x385c, 0x0000, 0x0000, 0x0000, 0x345a, 0x0000, 0x0000, 0x4bd4, +0x0000, 0x0000, 0x5b15, 0x171a, 0x1661, 0x0d8d, 0x0000, 0x4ceb, +0x0000, 0x2e0f, 0x38ee, 0x64fa, 0x0000, 0x667d, 0x4746, 0x3f59, +0x0000, 0x0000, 0x0000, 0x4bf5, 0x0000, 0x0c42, 0x0000, 0x0000, +0x2102, 0x0000, 0x0000, 0x0000, 0x0000, 0x2fb7, 0x5a8b, 0x0000, +0x0000, 0x4789, 0x37e4, 0x0000, 0x4374, 0x34fd, 0x6390, 0x18d8, +0x0000, 0x0000, 0x0000, 0x0000, 0x08f7, 0x4495, 0x2d0b, 0x46cd, +0x0000, 0x0000, 0x4ec9, 0x0000, 0x0000, 0x1e18, 0x0000, 0x321d, +0x0000, 0x0000, 0x3b60, 0x0000, 0x60f2, 0x0000, 0x07ac, 0x0000, +0x4ca1, 0x0000, 0x0000, 0x5e63, 0x2890, 0x6634, 0x3a66, 0x0000, +0x0000, 0x2654, 0x0000, 0x0000, 0x3888, 0x1eab, 0x3f6a, 0x0000, +0x2d5d, 0x0000, 0x0000, 0x49d5, 0x38fc, 0x1a63, 0x0000, 0x2994, +0x1ed2, 0x24a4, 0x0000, 0x0411, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x4ad0, 0x0000, 0x0000, 0x1cb6, 0x0000, 0x0000, 0x4a58, +0x0000, 0x51fd, 0x0000, 0x0000, 0x0000, 0x3b52, 0x23f5, 0x0000, +0x0000, 0x0000, 0x0000, 0x47aa, 0x0000, 0x3bf5, 0x1d8e, 0x14a5, +0x11b8, 0x4c91, 0x65b6, 0x0000, 0x52ac, 0x0000, 0x0000, 0x03c0, +0x2016, 0x65e0, 0x1f9f, 0x2b26, 0x0000, 0x46bb, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5bc7, 0x1632, 0x567d, +0x5c2c, 0x34ea, 0x0000, 0x1823, 0x0000, 0x3387, 0x0000, 0x2842, +0x0000, 0x184e, 0x0000, 0x0000, 0x49e4, 0x0000, 0x0000, 0x030c, +0x0000, 0x488c, 0x0000, 0x29f8, 0x5ce6, 0x2409, 0x1775, 0x0000, +0x0000, 0x322e, 0x0af5, 0x0000, 0x49b0, 0x0000, 0x0000, 0x0000, +0x0000, 0x4084, 0x3738, 0x199f, 0x2e58, 0x0000, 0x0000, 0x214d, +0x5d60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x019e, 0x0000, +0x0000, 0x2cfa, 0x0000, 0x0000, 0x1784, 0x02e0, 0x3ffd, 0x6120, +0x1b43, 0x260d, 0x37b3, 0x606d, 0x0000, 0x2a3d, 0x0000, 0x0000, +0x0000, 0x3f19, 0x0000, 0x0000, 0x2f2d, 0x0000, 0x5653, 0x0000, +0x0000, 0x0000, 0x0000, 0x490c, 0x14fe, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4953, 0x1c72, 0x0da2, 0x0000, 0x1d54, 0x0000, +0x0000, 0x4826, 0x0000, 0x29bd, 0x4fcf, 0x0000, 0x0000, 0x4973, +0x208f, 0x0000, 0x0000, 0x0000, 0x5581, 0x0000, 0x0000, 0x5ed0, +0x0000, 0x0000, 0x3dee, 0x0000, 0x2adc, 0x515d, 0x0000, 0x0000, +0x41af, 0x0000, 0x0000, 0x2419, 0x1c57, 0x2431, 0x243d, 0x2449, +0x2455, 0x2461, 0x246d, 0x2479, 0x2485, 0x4f51, 0x012a, 0x0000, +0x0000, 0x0000, 0x0000, 0x2edc, 0x00ca, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x1ff9, 0x099a, 0x0d0c, 0x0000, 0x0ff2, +0x31b4, 0x5b65, 0x0000, 0x0165, 0x1006, 0x0815, 0x54e0, 0x3c43, +0x1c7e, 0x0000, 0x2c37, 0x10f6, 0x0000, 0x0000, 0x011d, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d9b, 0x0000, 0x0000, +0x0000, 0x0000, 0x4137, 0x0000, 0x166c, 0x576a, 0x4eb2, 0x0000, +0x0159, 0x0fb0, 0x52e9, 0x31c7, 0x0000, 0x0000, 0x0000, 0x18fe, +0x0000, 0x17c4, 0x0000, 0x0000, 0x0000, 0x1f75, 0x4ba1, 0x0000, +0x0000, 0x4629, 0x36ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x48fd, +0x36c6, 0x0000, 0x36d3, 0x0000, 0x0000, 0x5a17, 0x619c, 0x0000, +0x0000, 0x0000, 0x36e0, 0x0a62, 0x1f2a, 0x297d, 0x4ef0, 0x0000, +0x0000, 0x11d2, 0x0000, 0x2bc8, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2a22, 0x02b2, 0x1e4a, 0x0000, +0x0000, 0x0000, 0x54f8, 0x0000, 0x1ac3, 0x0000, 0x64ae, 0x1ace, +0x0000, 0x4c45, 0x0000, 0x0000, 0x10e7, 0x0000, 0x5aad, 0x5f3e, +0x1aad, 0x0000, 0x2ecd, 0x0000, 0x0000, 0x573b, 0x0000, 0x5e2d, +0x49c2, 0x0000, 0x15c5, 0x556c, 0x2cc8, 0x0000, 0x0000, 0x0000, +0x0000, 0x0324, 0x032e, 0x0338, 0x0342, 0x0000, 0x0000, 0x1af0, +0x0fc0, 0x4b67, 0x0000, 0x3b45, 0x1142, 0x0000, 0x4f17, 0x1930, +0x0000, 0x424e, 0x2d3d, 0x0000, 0x0000, 0x0000, 0x3869, 0x0000, +0x3831, 0x5e4e, 0x387b, 0x0000, 0x2d9d, 0x6400, 0x092b, 0x1871, +0x3842, 0x46ed, 0x384f, 0x5b85, 0x150a, 0x4be5, 0x0000, 0x1ae5, +0x52fc, 0x0000, 0x0ad0, 0x48db, 0x0000, 0x0000, 0x0000, 0x0000, +0x00f7, 0x550f, 0x0000, 0x3b30, 0x0000, 0x0000, 0x661a, 0x0000, +0x0000, 0x2b42, 0x116d, 0x0000, 0x1548, 0x1a89, 0x0000, 0x5f82, +0x1f02, 0x518d, 0x40e5, 0x4e5b, 0x0000, 0x0001, 0x17de, 0x0000, +0x0000, 0x3b85, 0x0000, 0x1a1f, 0x0079, 0x00b4, 0x0000, 0x0000, +0x0000, 0x0000, 0x4c60, 0x3fc1, 0x0000, 0x0000, 0x0000, 0x0000, +0x3588, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0364, 0x0000, +0x0000, 0x0000, 0x0000, 0x09b3, 0x0000, 0x2e27, 0x6172, 0x5ea4, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2f0d, 0x0000, 0x11fe, +0x4c34, 0x660b, 0x0000, 0x12bf, 0x0000, 0x0000, 0x1ad9, 0x0000, +0x1130, 0x0000, 0x0000, 0x1cc4, 0x0000, 0x4398, 0x353f, 0x549a, +0x3acc, 0x0000, 0x4991, 0x0000, 0x0ae2, 0x0000, 0x5428, 0x0000, +0x0000, 0x0000, 0x0fe0, 0x0000, 0x6186, 0x4a18, 0x5b9d, 0x0000, +0x4506, 0x2c12, 0x0000, 0x3784, 0x2062, 0x0000, 0x52c3, 0x0000, +0x0000, 0x37a3, 0x2521, 0x0000, 0x0000, 0x1e3e, 0x0000, 0x06ad, +0x50c0, 0x0000, 0x4368, 0x3ae2, 0x16ff, 0x60d2, 0x3c1f, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c55, 0x352b, 0x0000, +0x16bf, 0x10bd, 0x111c, 0x0000, 0x0000, 0x06bb, 0x0000, 0x0cb4, +0x0c2f, 0x0000, 0x5d2b, 0x0000, 0x0258, 0x0000, 0x0000, 0x0000, +0x09e4, 0x2868, 0x11f0, 0x3471, 0x0000, 0x37f2, 0x0000, 0x0724, +0x0000, 0x0000, 0x108e, 0x0000, 0x1e30, 0x2d7d, 0x0000, 0x022d, +0x0000, 0x0000, 0x4711, 0x5fba, 0x0000, 0x11e1, 0x0000, 0x0107, +0x0000, 0x64bc, 0x14ce, 0x555b, 0x0000, 0x3172, 0x0000, 0x0000, +0x0000, 0x0000, 0x06e0, 0x0000, 0x0000, 0x59e7, 0x627c, 0x0000, +0x06ea, 0x0000, 0x0000, 0x3811, 0x006e, 0x5fc8, 0x0000, 0x0000, +0x0033, 0x372a, 0x61b1, 0x0000, 0x4cff, 0x13c7, 0x668a, 0x182e, +0x0000, 0x0000, 0x0000, 0x0000, 0x1a79, 0x0000, 0x0000, 0x5e98, +0x0000, 0x1df0, 0x119e, 0x0000, 0x1ab8, 0x34d1, 0x0000, 0x19ab, +0x61db, 0x02c6, 0x0000, 0x2911, 0x5f96, 0x0000, 0x42e2, 0x1fdf, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x574b, 0x0000, 0x5eaf, +0x0000, 0x1eeb, 0x0000, 0x1191, 0x0c02, 0x0000, 0x0000, 0x16a1, +0x514a, 0x3c5e, 0x3554, 0x308d, 0x5337, 0x0000, 0x45b0, 0x0000, +0x0000, 0x0000, 0x0b8b, 0x0000, 0x5984, 0x5096, 0x0000, 0x0000, +0x16f4, 0x0000, 0x5ee9, 0x35a0, 0x0000, 0x5c0a, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x42cc, 0x506b, 0x0000, 0x0000, 0x0000, +0x3513, 0x0000, 0x3d5d, 0x0000, 0x1b07, 0x00e0, 0x52d6, 0x1b12, +0x0000, 0x0000, 0x0277, 0x2928, 0x0000, 0x390a, 0x0000, 0x0026, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a0d, 0x4232, 0x0000, +0x2008, 0x06ca, 0x0000, 0x4198, 0x0000, 0x5416, 0x0000, 0x06d5, +0x0000, 0x0000, 0x0000, 0x0000, 0x174f, 0x0000, 0x0000, 0x5ede, +0x5088, 0x0000, 0x0000, 0x0000, 0x6651, 0x6272, 0x0000, 0x5e71, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4161, 0x1e24, 0x0000, +0x6363, 0x525d, 0x3fec, 0x0000, 0x0000, 0x4f89, 0x2b0e, 0x3431, +0x4332, 0x3896, 0x0000, 0x0944, 0x0000, 0x6627, 0x0000, 0x2535, +0x5105, 0x3e19, 0x0283, 0x254f, 0x0000, 0x37d5, 0x170a, 0x1471, +0x0000, 0x4722, 0x0000, 0x0000, 0x6204, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x6058, 0x3c2d, 0x51a1, 0x4429, 0x5270, 0x07bf, +0x0000, 0x0000, 0x0000, 0x5323, 0x6156, 0x0000, 0x0000, 0x0000, +0x1afb, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b35, 0x2a0d, 0x328e, +0x0185, 0x4df4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ac2, 0x0048, +0x1d83, 0x1526, 0x0000, 0x0000, 0x1aa2, 0x6110, 0x0000, 0x1b2e, +0x16e5, 0x2dce, 0x0000, 0x0000, 0x1f67, 0x62be, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x51b4, 0x0000, 0x0000, 0x6552, 0x20ae, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d76, 0x0000, +0x0210, 0x0000, 0x40b8, 0x0000, 0x19b6, 0x0000, 0x356b, 0x19c1, +0x0000, 0x4a47, 0x0000, 0x0000, 0x5310, 0x0000, 0x03cb, 0x2332, +0x1744, 0x0960, 0x0000, 0x4a77, 0x0000 +}; +#endif /* NEEDKTABLE */ + +#ifdef NEEDVTABLE +#define VTABLESIZE 2341 +#define VMAXHASH 9 + +static const unsigned short hashKeysym[VTABLESIZE] = { +0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x5f76, 0x0000, 0x5f84, 0x0000, 0x5fa3, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x4df6, 0x0000, 0x0000, 0x0000, 0x4939, 0x0000, +0x117e, 0x1188, 0x1193, 0x11a0, 0x11af, 0x11ba, 0x11c6, 0x11d4, +0x11f2, 0x1200, 0x120f, 0x121c, 0x1225, 0x122f, 0x1239, 0x1244, +0x124e, 0x1254, 0x125a, 0x1260, 0x1266, 0x126c, 0x1272, 0x1278, +0x127e, 0x1284, 0x128a, 0x1294, 0x12a2, 0x12ab, 0x12b5, 0x12c1, +0x12ce, 0x12d5, 0x12db, 0x12e1, 0x12e7, 0x12ed, 0x12f3, 0x12f9, +0x12ff, 0x1305, 0x130b, 0x1311, 0x1317, 0x131d, 0x1323, 0x1329, +0x132f, 0x1335, 0x133b, 0x1341, 0x1347, 0x134d, 0x1353, 0x1359, +0x135f, 0x1365, 0x136b, 0x1371, 0x1381, 0x138f, 0x13a0, 0x13b0, +0x13bf, 0x13d7, 0x13dd, 0x13e3, 0x13e9, 0x13ef, 0x13f5, 0x13fb, +0x1401, 0x1407, 0x140d, 0x1413, 0x1419, 0x141f, 0x1425, 0x142b, +0x1431, 0x1437, 0x143d, 0x1443, 0x1449, 0x144f, 0x1455, 0x145b, +0x1461, 0x1467, 0x146d, 0x1473, 0x1481, 0x1489, 0x1498, 0x0000, +0x4c25, 0x4a49, 0x4c36, 0x0000, 0x4c47, 0x0000, 0x2018, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2028, 0x56d7, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x2036, 0x0000, 0x56f9, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x14a7, 0x14b8, 0x14c7, 0x14d0, 0x14dd, 0x14ea, 0x14f2, 0x1500, +0x150c, 0x151a, 0x1528, 0x1538, 0x154a, 0x1556, 0x1561, 0x1570, +0x157b, 0x1586, 0x1594, 0x15a4, 0x15b6, 0x15c0, 0x15c7, 0x15d5, +0x15e8, 0x15f4, 0x1604, 0x1612, 0x1625, 0x1634, 0x1640, 0x1652, +0x1663, 0x166e, 0x1679, 0x1689, 0x1694, 0x16a3, 0x16ad, 0x16b4, +0x16c1, 0x16cc, 0x16d7, 0x16e7, 0x16f6, 0x1701, 0x170c, 0x171c, +0x172b, 0x173b, 0x1746, 0x1751, 0x175c, 0x176c, 0x1777, 0x1786, +0x1793, 0x17a0, 0x17ab, 0x17b6, 0x17c6, 0x17d5, 0x17e0, 0x17f4, +0x17ff, 0x180a, 0x1815, 0x1825, 0x1830, 0x183f, 0x1849, 0x1850, +0x185d, 0x1868, 0x1873, 0x1883, 0x1892, 0x189d, 0x18a8, 0x18b8, +0x18c7, 0x18cf, 0x18da, 0x18e5, 0x18f0, 0x1900, 0x190b, 0x191a, +0x1927, 0x1932, 0x193d, 0x1948, 0x1958, 0x1967, 0x1972, 0x197c, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62fe, 0x1f10, +0x6572, 0x0000, 0x1f1e, 0x0000, 0x6328, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f2c, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1f3a, 0x0000, 0x63aa, 0x0000, +0x0000, 0x0000, 0x1f45, 0x0000, 0x63c8, 0x1f50, 0x0000, 0x63d7, +0x1f5e, 0x0000, 0x63e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x1f69, 0x0000, 0x6420, 0x1f77, +0x0000, 0x0000, 0x0000, 0x0000, 0x6444, 0x0000, 0x0000, 0x0000, +0x1f85, 0x0000, 0x6460, 0x1f93, 0x0000, 0x0000, 0x661c, 0x0000, +0x6474, 0x1fa1, 0x6636, 0x0000, 0x1faf, 0x2046, 0x6492, 0x1fba, +0x0000, 0x0000, 0x1fc8, 0x0000, 0x64b0, 0x1fd3, 0x668c, 0x0000, +0x1fe1, 0x0000, 0x64cc, 0x1fec, 0x0000, 0x0000, 0x1ffb, 0x0000, +0x0000, 0x200a, 0x5a49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x2064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x2074, 0x207b, 0x2082, 0x3c89, 0x5a9f, 0x3c93, +0x0000, 0x3ca4, 0x0000, 0x3cb5, 0x3dcb, 0x3cbc, 0x3de3, 0x3cc3, +0x3dfd, 0x3cca, 0x3e1b, 0x3e29, 0x3e37, 0x3e42, 0x0000, 0x3cd1, +0x0000, 0x3cd8, 0x3e6a, 0x3cdf, 0x3e8b, 0x3cf2, 0x3ea6, 0x3d04, +0x3ec4, 0x3d15, 0x3ee0, 0x3d27, 0x0000, 0x3d39, 0x3efa, 0x3d4c, +0x3f1b, 0x3d5f, 0x3f42, 0x3d72, 0x0000, 0x3d85, 0x3f4d, 0x3d98, +0x3f6c, 0x198b, 0x1997, 0x19a1, 0x3f8d, 0x19ad, 0x19b8, 0x3dbf, +0x3fd8, 0x19c3, 0x19ce, 0x19db, 0x19e6, 0x4044, 0x19f1, 0x19fc, +0x0000, 0x1a0a, 0x1a16, 0x1a21, 0x409e, 0x1a2d, 0x1a38, 0x1a43, +0x40e7, 0x1a4d, 0x1a58, 0x1a65, 0x1a70, 0x1a7b, 0x1a8b, 0x1a96, +0x1aa4, 0x419a, 0x41b1, 0x1aaf, 0x41dc, 0x1aba, 0x1ac5, 0x4215, +0x1ad0, 0x422a, 0x1adb, 0x4234, 0x1ae7, 0x4250, 0x4261, 0x1af2, +0x1afd, 0x1b09, 0x1b14, 0x42af, 0x42c0, 0x1b1f, 0x42e4, 0x42fc, +0x1b30, 0x1b3b, 0x4334, 0x1b45, 0x0000, 0x0000, 0x1b56, 0x0000, +0x1b63, 0x0000, 0x0000, 0x1b6e, 0x0000, 0x1b79, 0x1b84, 0x0000, +0x1b8f, 0x0000, 0x1b9a, 0x0000, 0x1ba6, 0x0000, 0x0000, 0x1bb1, +0x1bbc, 0x1bc8, 0x1bd3, 0x0000, 0x0000, 0x1bde, 0x4ef2, 0x0000, +0x1c00, 0x1c0b, 0x0000, 0x1bef, 0x4f2e, 0x0000, 0x1c15, 0x1c22, +0x4f53, 0x0000, 0x4f64, 0x0000, 0x4f75, 0x0000, 0x4f8b, 0x0000, +0x4f9c, 0x2056, 0x4fae, 0x442b, 0x4fbf, 0x0000, 0x4444, 0x0000, +0x0000, 0x4455, 0x0000, 0x0000, 0x4474, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x505f, 0x0000, 0x0000, 0x0000, 0x507c, 0x0000, +0x508a, 0x0000, 0x5098, 0x0000, 0x50a5, 0x0000, 0x50b4, 0x0000, +0x50c2, 0x0000, 0x456a, 0x0000, 0x50de, 0x0000, 0x0000, 0x0000, +0x50fa, 0x0000, 0x0000, 0x0000, 0x511b, 0x0000, 0x5134, 0x0000, +0x514c, 0x0000, 0x515f, 0x0000, 0x5177, 0x0000, 0x518f, 0x0000, +0x51a3, 0x0000, 0x51b6, 0x0000, 0x51cf, 0x0000, 0x51e7, 0x0000, +0x4640, 0x0000, 0x5216, 0x4660, 0x522e, 0x0000, 0x467f, 0x5486, +0x549c, 0x54b5, 0x5272, 0x54fa, 0x5511, 0x552d, 0x529c, 0x555d, +0x52ae, 0x55b1, 0x52c5, 0x55d9, 0x52d8, 0x5619, 0x52eb, 0x5669, +0x52fe, 0x4f3e, 0x5312, 0x56c6, 0x5325, 0x56e8, 0x5339, 0x5709, +0x534c, 0x572b, 0x3da2, 0x574d, 0x5385, 0x3dad, 0x53a2, 0x578b, +0x3db6, 0x57ab, 0x53d2, 0x57cc, 0x53f0, 0x57ee, 0x433f, 0x5811, +0x5418, 0x434d, 0x542a, 0x435c, 0x436a, 0x5878, 0x545e, 0x5899, +0x58a9, 0x58ba, 0x58cb, 0x58dd, 0x58ef, 0x5901, 0x5913, 0x5924, +0x5477, 0x5945, 0x5955, 0x5965, 0x5975, 0x5986, 0x5997, 0x59a7, +0x59b7, 0x59c8, 0x59d9, 0x4376, 0x59f9, 0x4382, 0x438f, 0x439a, +0x5a39, 0x1c2f, 0x5a59, 0x5a6a, 0x5a7b, 0x43b5, 0x1c3b, 0x43bd, +0x5abf, 0x1c4b, 0x43d1, 0x1c59, 0x1c64, 0x5b17, 0x43dc, 0x5b39, +0x5b49, 0x1c74, 0x5b67, 0x43f5, 0x5b87, 0x4403, 0x1c80, 0x4410, +0x0000, 0x1c90, 0x0000, 0x1c9d, 0x1ca8, 0x0000, 0x0000, 0x5583, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cb8, 0x1cc6, 0x0000, +0x0000, 0x55c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cd6, 0x0000, 0x441d, +0x1ce4, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cf4, 0x1cff, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d0f, 0x1d1d, 0x5693, +0x0000, 0x0000, 0x0000, 0x0000, 0x56a4, 0x0000, 0x0000, 0x0000, +0x0000, 0x56b5, 0x0000, 0x0000, 0x0000, 0x1d2d, 0x0000, 0x0000, +0x1d3b, 0x0000, 0x0000, 0x3dd7, 0x0000, 0x1d4b, 0x1d56, 0x3df0, +0x0000, 0x0000, 0x0000, 0x3e0c, 0x0000, 0x5ad0, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x5548, 0x0000, 0x0000, 0x3e4d, +0x0000, 0x0000, 0x0000, 0x3e5d, 0x0000, 0x65b8, 0x0000, 0x3e7e, +0x0000, 0x573d, 0x0000, 0x3e99, 0x0000, 0x0000, 0x0000, 0x3eb4, +0x0000, 0x0000, 0x0000, 0x3ed3, 0x0000, 0x0000, 0x0000, 0x3eef, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x577b, 0x0000, 0x3f06, +0x657c, 0x5fae, 0x5fbc, 0x3f2c, 0x5fd4, 0x5fde, 0x5ff3, 0x579b, +0x601d, 0x6032, 0x6046, 0x605a, 0x606f, 0x6084, 0x609c, 0x3f5b, +0x60c4, 0x60d4, 0x60e4, 0x3f7c, 0x6103, 0x6112, 0x6122, 0x6132, +0x6145, 0x6158, 0x6166, 0x3f9b, 0x617e, 0x3fad, 0x6193, 0x3fc3, +0x61b3, 0x61c8, 0x61dd, 0x3fee, 0x6206, 0x3fff, 0x622f, 0x4013, +0x625c, 0x402b, 0x627e, 0x6288, 0x6296, 0x405c, 0x62b2, 0x4075, +0x62ca, 0x62d4, 0x62e9, 0x4086, 0x6313, 0x4092, 0x633c, 0x6350, +0x6365, 0x637a, 0x6392, 0x40ad, 0x63b9, 0x40ba, 0x5856, 0x40cf, +0x63f4, 0x6402, 0x6411, 0x4100, 0x6432, 0x4113, 0x6452, 0x4124, +0x646a, 0x4139, 0x6483, 0x4150, 0x64a1, 0x4163, 0x64be, 0x4177, +0x64db, 0x418d, 0x64fc, 0x6590, 0x65a4, 0x650e, 0x5bb9, 0x41c6, +0x5bda, 0x5beb, 0x5bfc, 0x41f4, 0x5c1d, 0x4204, 0x5c3f, 0x5c4f, +0x5c60, 0x421e, 0x5c82, 0x5c93, 0x5ca3, 0x5cb4, 0x5cc6, 0x5cd7, +0x5ce8, 0x4245, 0x5d09, 0x5d1b, 0x5d2d, 0x5d3f, 0x5d50, 0x426f, +0x5d74, 0x427f, 0x1d66, 0x1d78, 0x5db9, 0x1d85, 0x1d90, 0x5ded, +0x5dfd, 0x5e0e, 0x1d9d, 0x1da9, 0x1db6, 0x0000, 0x0000, 0x0000, +0x0000, 0x4306, 0x0000, 0x1dc1, 0x0000, 0x1dce, 0x1dd9, 0x0000, +0x0000, 0x0000, 0x1de6, 0x1df2, 0x1dff, 0x1e0a, 0x4497, 0x1e12, +0x1e1a, 0x44d7, 0x44f8, 0x4517, 0x4536, 0x4545, 0x455a, 0x1e26, +0x457b, 0x458f, 0x459e, 0x45b2, 0x1e32, 0x45e5, 0x45f5, 0x1e40, +0x4616, 0x1e4c, 0x1e59, 0x1e65, 0x468f, 0x469f, 0x0000, 0x0000, +0x0000, 0x1e72, 0x0000, 0x0000, 0x0000, 0x1e7e, 0x1e89, 0x0000, +0x1e95, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea1, +0x0000, 0x0000, 0x60f4, 0x0000, 0x1ead, 0x0000, 0x0000, 0x1ebb, +0x0000, 0x1ec7, 0x1ed4, 0x1ee0, 0x0000, 0x0000, 0x0000, 0x0000, +0x666d, 0x1eed, 0x0000, 0x0000, 0x0000, 0x1ef9, 0x1f04, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x6174, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x57dd, 0x0000, 0x0000, 0x4fd1, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x61f2, 0x0000, 0x57ff, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x621a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x6244, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x6274, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x5f40, 0x62a4, 0x0000, 0x5b58, 0x0000, 0x0000, 0x46ef, +0x5e50, 0x5e65, 0x62c0, 0x5e73, 0x5e81, 0x5e8c, 0x5e93, 0x5e9a, +0x5ea6, 0x0000, 0x0000, 0x0000, 0x0000, 0x5eb1, 0x0000, 0x0000, +0x5ebd, 0x5ed2, 0x5ee0, 0x5eeb, 0x5ef9, 0x5f04, 0x5f0b, 0x5f12, +0x5f1e, 0x0000, 0x0000, 0x5f29, 0x0000, 0x5f34, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x46cf, 0x46de, 0x2091, 0x4701, +0x4713, 0x4724, 0x4738, 0x4748, 0x4759, 0x476b, 0x477d, 0x478b, +0x479c, 0x47ac, 0x47bd, 0x47ce, 0x47df, 0x47f6, 0x480a, 0x4819, +0x4828, 0x4837, 0x4849, 0x485c, 0x486e, 0x487c, 0x488e, 0x489d, +0x48af, 0x48bd, 0x48ce, 0x48dd, 0x48f1, 0x48ff, 0x490e, 0x491d, +0x4929, 0x209e, 0x20b0, 0x20c8, 0x20e0, 0x20ef, 0x2117, 0x2123, +0x212e, 0x2139, 0x2144, 0x214f, 0x215a, 0x2166, 0x2172, 0x217e, +0x2197, 0x21aa, 0x21b5, 0x21c0, 0x21cb, 0x21d6, 0x21e1, 0x21ed, +0x21f9, 0x2205, 0x2211, 0x221d, 0x2229, 0x2236, 0x2242, 0x224e, +0x225a, 0x2266, 0x227f, 0x2298, 0x22a4, 0x22b0, 0x22bc, 0x22c8, +0x22d4, 0x22e0, 0x22ec, 0x22f8, 0x2304, 0x231c, 0x2328, 0x2334, +0x2340, 0x234c, 0x2358, 0x2364, 0x2370, 0x237c, 0x2388, 0x2394, +0x23a0, 0x23ac, 0x23b8, 0x23c4, 0x23d0, 0x23dc, 0x23e7, 0x23f7, +0x0000, 0x49e6, 0x0000, 0x0000, 0x4945, 0x5368, 0x0000, 0x4a0a, +0x0000, 0x4955, 0x4a1a, 0x576c, 0x0000, 0x4a29, 0x4965, 0x0000, +0x4a39, 0x53b5, 0x0000, 0x4975, 0x0000, 0x57bb, 0x4a5a, 0x0000, +0x4984, 0x4a69, 0x652a, 0x0000, 0x4a79, 0x4993, 0x0000, 0x0000, +0x0000, 0x5823, 0x49a4, 0x5834, 0x0000, 0x5845, 0x0000, 0x49b2, +0x4a8a, 0x5867, 0x6554, 0x4aa5, 0x49c4, 0x5889, 0x4ab3, 0x0000, +0x0000, 0x49d7, 0x5c2e, 0x0000, 0x4ad2, 0x0000, 0x5f4a, 0x4ae1, +0x0000, 0x0000, 0x4af8, 0x49fa, 0x0000, 0x4b10, 0x65cb, 0x0000, +0x4b25, 0x5935, 0x5c71, 0x4b37, 0x0000, 0x0000, 0x4b4a, 0x0000, +0x0000, 0x4b59, 0x0000, 0x0000, 0x4b69, 0x0000, 0x0000, 0x4b79, +0x0000, 0x65e2, 0x4b8e, 0x65fc, 0x660d, 0x4ba3, 0x6629, 0x59e9, +0x6644, 0x6653, 0x6661, 0x5a09, 0x667f, 0x5a19, 0x4bb5, 0x5a29, +0x0000, 0x4bc5, 0x0000, 0x43a8, 0x4bd6, 0x0000, 0x0000, 0x4be7, +0x0000, 0x0000, 0x4bf7, 0x5a8d, 0x0000, 0x4c06, 0x0000, 0x5aaf, +0x4c15, 0x0000, 0x0000, 0x43c6, 0x0000, 0x5ae1, 0x0000, 0x5af3, +0x0000, 0x5b05, 0x5d62, 0x0000, 0x0000, 0x5b29, 0x0000, 0x0000, +0x0000, 0x0000, 0x5d85, 0x43e8, 0x0000, 0x0000, 0x4ac2, 0x5b77, +0x0000, 0x0000, 0x5da7, 0x5b9f, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x5dca, 0x3804, 0x0000, 0x4290, 0x3813, 0x0000, +0x42a0, 0x3823, 0x0000, 0x0000, 0x4d90, 0x4da2, 0x4db9, 0x3851, +0x4de0, 0x42ce, 0x385e, 0x4e1e, 0x4e35, 0x4e46, 0x4e5d, 0x4e73, +0x4e89, 0x4e9e, 0x4eb4, 0x4ecb, 0x4ee1, 0x431d, 0x4f03, 0x4f19, +0x241b, 0x2427, 0x2433, 0x243f, 0x244b, 0x2457, 0x2463, 0x246f, +0x247b, 0x2487, 0x4fe2, 0x4fef, 0x4ffd, 0x500b, 0x501a, 0x5028, +0x5035, 0x5044, 0x5052, 0x390c, 0x506d, 0x2493, 0x24a6, 0x24c2, +0x24d2, 0x24e1, 0x24f2, 0x2502, 0x2512, 0x50ec, 0x2523, 0x5107, +0x2537, 0x2544, 0x2551, 0x255e, 0x256b, 0x2578, 0x2585, 0x2592, +0x259f, 0x25ac, 0x51ff, 0x25b9, 0x4c57, 0x5247, 0x525f, 0x25ce, +0x5285, 0x25e7, 0x25f8, 0x260f, 0x2626, 0x263c, 0x2656, 0x266c, +0x267c, 0x268b, 0x26a1, 0x26b0, 0x26c0, 0x26d0, 0x26df, 0x26ef, +0x26fe, 0x270e, 0x271c, 0x272c, 0x273c, 0x274d, 0x275c, 0x276b, +0x277a, 0x2789, 0x2798, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x27a9, 0x27bc, 0x27cb, 0x27da, 0x27e9, 0x27f8, 0x2808, 0x2818, +0x2835, 0x2844, 0x285b, 0x286a, 0x287e, 0x2892, 0x28a6, 0x28b7, +0x28c8, 0x28d9, 0x28eb, 0x28fc, 0x2913, 0x292a, 0x2941, 0x2950, +0x295f, 0x2970, 0x297f, 0x2996, 0x29b1, 0x29bf, 0x29d4, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0f8c, 0x0f9f, 0x0fb2, 0x0fc2, 0x0fd1, 0x0fe2, +0x0ff4, 0x1008, 0x1017, 0x1025, 0x1032, 0x103f, 0x104c, 0x105a, +0x1068, 0x107d, 0x1090, 0x10a2, 0x10b0, 0x10bf, 0x10cd, 0x10db, +0x10e9, 0x10f8, 0x1108, 0x111e, 0x1132, 0x1144, 0x115a, 0x116f, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fca, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6008, +0x0000, 0x0000, 0x0000, 0x65ee, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60b4, +0x29fa, 0x2a24, 0x2a5a, 0x2a8e, 0x2ac4, 0x2af8, 0x2b28, 0x2b60, +0x2b94, 0x2bca, 0x2c02, 0x0000, 0x2c26, 0x2c4c, 0x2c78, 0x2c9e, +0x2a0f, 0x2a3f, 0x2a74, 0x2aa9, 0x2ade, 0x2b10, 0x2b44, 0x2b7a, +0x2baf, 0x2be6, 0x2c14, 0x6188, 0x2c39, 0x2c62, 0x2c8b, 0x2cb4, +0x3b87, 0x2cca, 0x2cda, 0x2cec, 0x2cfc, 0x2d1d, 0x2d2f, 0x2d4e, +0x2d6f, 0x2d8e, 0x2daf, 0x2dd0, 0x2de1, 0x2df3, 0x2e11, 0x2e29, +0x2e4b, 0x2e5a, 0x2e6a, 0x2e7c, 0x2e8c, 0x2ead, 0x2ebf, 0x2ede, +0x2eff, 0x2f1e, 0x2f3f, 0x2f60, 0x2f71, 0x2f83, 0x2fa1, 0x2fb9, +0x2fdb, 0x2feb, 0x2ffa, 0x300a, 0x301b, 0x302b, 0x303b, 0x304b, +0x305c, 0x306c, 0x307b, 0x308f, 0x309f, 0x30af, 0x30bf, 0x30cf, +0x30de, 0x30ee, 0x30fe, 0x310e, 0x311e, 0x312e, 0x313d, 0x314e, +0x315e, 0x3174, 0x3186, 0x3196, 0x31a7, 0x31b6, 0x31c9, 0x31da, +0x31f0, 0x3200, 0x320f, 0x321f, 0x3230, 0x3240, 0x3250, 0x3260, +0x3271, 0x3281, 0x3290, 0x32a4, 0x32b4, 0x32c4, 0x32d4, 0x32e4, +0x32f3, 0x3303, 0x3313, 0x3323, 0x3333, 0x3343, 0x3352, 0x3363, +0x3373, 0x3389, 0x339b, 0x33ab, 0x33bc, 0x33cb, 0x33de, 0x33ef, +0x0000, 0x0000, 0x0000, 0x64ea, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x651c, 0x0000, 0x5bc9, +0x54e2, 0x6534, 0x0000, 0x653e, 0x0000, 0x6549, 0x0000, 0x5c0c, +0x0000, 0x655e, 0x0726, 0x0733, 0x0748, 0x075d, 0x0772, 0x079a, +0x07ae, 0x07c1, 0x07d4, 0x07ec, 0x07ff, 0x0817, 0x082b, 0x0844, +0x0857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5603, 0x0000, +0x0000, 0x0000, 0x0000, 0x5cf9, 0x5641, 0x0000, 0x0000, 0x0000, +0x0000, 0x086f, 0x0880, 0x0895, 0x08ac, 0x08c4, 0x08de, 0x08f9, +0x0915, 0x092d, 0x0946, 0x0962, 0x097f, 0x099c, 0x09b5, 0x09cf, +0x09e6, 0x09ff, 0x0a1c, 0x0a3c, 0x0a4e, 0x0a64, 0x0000, 0x0000, +0x3a35, 0x0000, 0x5719, 0x0000, 0x3a4e, 0x5e1e, 0x0000, 0x5e2f, +0x3a68, 0x5e40, 0x4dcf, 0x0000, 0x3a7d, 0x3b97, 0x575d, 0x0000, +0x3a92, 0x0000, 0x0000, 0x4e0c, 0x3ab0, 0x0000, 0x0000, 0x0000, +0x3ace, 0x0a72, 0x0a81, 0x0a90, 0x0aa4, 0x0ab3, 0x0ac3, 0x0ad2, +0x0ae4, 0x0af7, 0x0b0a, 0x0b1f, 0x0b2e, 0x0b3f, 0x0b4f, 0x0b5d, +0x0b73, 0x0b8d, 0x0b9f, 0x0bad, 0x5407, 0x0000, 0x0000, 0x44ba, +0x4cdc, 0x44c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c45, 0x0000, +0x0000, 0x0c31, 0x0c44, 0x0c60, 0x0c76, 0x0c8a, 0x0ca0, 0x0cb6, +0x0ccb, 0x0ce6, 0x0cfa, 0x0d0e, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x45c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4608, +0x0000, 0x3405, 0x341b, 0x3433, 0x3447, 0x345c, 0x0000, 0x3473, +0x348b, 0x34a3, 0x0000, 0x34bd, 0x0000, 0x0000, 0x34d3, 0x34ec, +0x0000, 0x34ff, 0x3515, 0x352d, 0x3541, 0x3556, 0x356d, 0x358a, +0x35a2, 0x35ba, 0x35d4, 0x35f4, 0x39fd, 0x0000, 0x0000, 0x0000, +0x0000, 0x360a, 0x361a, 0x3629, 0x3639, 0x3649, 0x365b, 0x366a, +0x3678, 0x3688, 0x3697, 0x36a7, 0x36c8, 0x36d5, 0x36e2, 0x36ef, +0x3701, 0x370e, 0x371c, 0x0000, 0x372c, 0x373a, 0x374c, 0x375a, +0x3768, 0x3776, 0x3ae4, 0x0000, 0x3c52, 0x0000, 0x50d0, 0x0000, +0x0000, 0x3786, 0x3796, 0x37a5, 0x37b5, 0x37c5, 0x37d7, 0x37e6, +0x37f4, 0x0bbb, 0x0bd4, 0x0bec, 0x3844, 0x0c04, 0x0c1c, 0x386b, +0x387d, 0x388a, 0x3898, 0x38a8, 0x38c2, 0x38d0, 0x38e2, 0x38f0, +0x38fe, 0x0d25, 0x0d36, 0x0d48, 0x0d57, 0x0d68, 0x0d7b, 0x0d8f, +0x0da4, 0x0dba, 0x0dd2, 0x0de6, 0x0dfa, 0x0e0e, 0x0e22, 0x0e36, +0x0e50, 0x0e66, 0x0e7c, 0x0e92, 0x0ea8, 0x0ebe, 0x0ed4, 0x0ee6, +0x0ef8, 0x0f0a, 0x0f2e, 0x0f45, 0x0f5c, 0x0f74, 0x0f1c, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x393d, 0x0012, 0x0020, 0x0028, 0x0035, 0x3bc1, 0x003f, 0x0000, +0x3983, 0x0000, 0x0000, 0x0000, 0x004a, 0x0054, 0x0064, 0x0000, +0x39d5, 0x0000, 0x39eb, 0x0000, 0x0070, 0x619e, 0x3a0f, 0x0000, +0x3a22, 0x0086, 0x00e2, 0x00ec, 0x00f9, 0x0114, 0x011f, 0x012c, +0x0139, 0x014f, 0x015b, 0x0167, 0x017b, 0x0187, 0x0192, 0x01a0, +0x01af, 0x01be, 0x3afa, 0x4c62, 0x4c73, 0x4c82, 0x4c93, 0x4ca3, +0x0094, 0x4cca, 0x3c12, 0x4ced, 0x4d01, 0x00a2, 0x00b6, 0x00cc, +0x4d6b, 0x543f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x3c6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b7d, 0x0000, +0x0000, 0x01f9, 0x0202, 0x020b, 0x0212, 0x021c, 0x0225, 0x023b, +0x0252, 0x025a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3ba8, 0x0000, +0x3bb5, 0x0264, 0x026f, 0x0279, 0x0285, 0x0000, 0x0290, 0x0299, +0x02a2, 0x02ab, 0x02b4, 0x02bf, 0x02c8, 0x0000, 0x0000, 0x0000, +0x3bcf, 0x0000, 0x0000, 0x0000, 0x3c7b, 0x0000, 0x0000, 0x0000, +0x3bdb, 0x0000, 0x3bea, 0x0000, 0x3bf7, 0x0000, 0x3c08, 0x02d2, +0x02f4, 0x0301, 0x3c21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x6568, 0x392d, 0x030e, 0x3950, 0x3963, 0x3973, 0x0319, 0x3995, +0x39aa, 0x39bf, 0x0326, 0x0330, 0x033a, 0x0344, 0x034e, 0x035a, +0x0366, 0x0370, 0x037d, 0x0389, 0x03a5, 0x03c2, 0x03cd, 0x03da, +0x03e8, 0x0000, 0x3c2f, 0x0000, 0x3b13, 0x3b25, 0x3b32, 0x3b47, +0x3b54, 0x3b62, 0x3b70, 0x0403, 0x0413, 0x041e, 0x042f, 0x043f, +0x044e, 0x045c, 0x0465, 0x046e, 0x0477, 0x0480, 0x0489, 0x0492, +0x049b, 0x04a4, 0x04ad, 0x0000, 0x3c60, 0x0000, 0x03f6, 0x04b6, +0x04bd, 0x04c4, 0x04cb, 0x04d2, 0x04d9, 0x04e0, 0x04e7, 0x04ee, +0x04f5, 0x04fd, 0x050c, 0x051b, 0x052a, 0x0539, 0x0548, 0x0557, +0x0566, 0x0575, 0x0584, 0x0594, 0x05a3, 0x05b2, 0x05c1, 0x05d0, +0x05df, 0x05ee, 0x05fd, 0x060c, 0x061b, 0x062b, 0x063b, 0x064b, +0x065b, 0x066b, 0x067b, 0x0687, 0x0693, 0x06a1, 0x06af, 0x06bd, +0x06cc, 0x06d7, 0x06e2, 0x06ec, 0x06f6, 0x0702, 0x070e, 0x071a, +0x0000, 0x5d96, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f54, +0x0000, 0x5f62, 0x0000, 0x5f98, 0x0000, 0x0000, 0x0000, 0x0000, +0x007b, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ddc, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; +#endif /* NEEDVTABLE */ diff --git a/console-client/xkb/kstoucs.c b/console-client/xkb/kstoucs.c new file mode 100644 index 00000000..03a3ce81 --- /dev/null +++ b/console-client/xkb/kstoucs.c @@ -0,0 +1,317 @@ +/* $XFree86: xc/lib/X11/imKStoUCS.c,v 1.2 2001/07/25 15:04:45 dawes Exp $ */ + +static unsigned short const keysym_to_unicode_1a1_1ff[] = { + 0x0104, 0x02d8, 0x0141, 0x0000, 0x013d, 0x015a, 0x0000, /* 0x01a0-0x01a7 */ + 0x0000, 0x0160, 0x015e, 0x0164, 0x0179, 0x0000, 0x017d, 0x017b, /* 0x01a8-0x01af */ + 0x0000, 0x0105, 0x02db, 0x0142, 0x0000, 0x013e, 0x015b, 0x02c7, /* 0x01b0-0x01b7 */ + 0x0000, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0x01b8-0x01bf */ + 0x0154, 0x0000, 0x0000, 0x0102, 0x0000, 0x0139, 0x0106, 0x0000, /* 0x01c0-0x01c7 */ + 0x010c, 0x0000, 0x0118, 0x0000, 0x011a, 0x0000, 0x0000, 0x010e, /* 0x01c8-0x01cf */ + 0x0110, 0x0143, 0x0147, 0x0000, 0x0000, 0x0150, 0x0000, 0x0000, /* 0x01d0-0x01d7 */ + 0x0158, 0x016e, 0x0000, 0x0170, 0x0000, 0x0000, 0x0162, 0x0000, /* 0x01d8-0x01df */ + 0x0155, 0x0000, 0x0000, 0x0103, 0x0000, 0x013a, 0x0107, 0x0000, /* 0x01e0-0x01e7 */ + 0x010d, 0x0000, 0x0119, 0x0000, 0x011b, 0x0000, 0x0000, 0x010f, /* 0x01e8-0x01ef */ + 0x0111, 0x0144, 0x0148, 0x0000, 0x0000, 0x0151, 0x0000, 0x0000, /* 0x01f0-0x01f7 */ + 0x0159, 0x016f, 0x0000, 0x0171, 0x0000, 0x0000, 0x0163, 0x02d9 /* 0x01f8-0x01ff */ +}; + +static unsigned short const keysym_to_unicode_2a1_2fe[] = { + 0x0126, 0x0000, 0x0000, 0x0000, 0x0000, 0x0124, 0x0000, /* 0x02a0-0x02a7 */ + 0x0000, 0x0130, 0x0000, 0x011e, 0x0134, 0x0000, 0x0000, 0x0000, /* 0x02a8-0x02af */ + 0x0000, 0x0127, 0x0000, 0x0000, 0x0000, 0x0000, 0x0125, 0x0000, /* 0x02b0-0x02b7 */ + 0x0000, 0x0131, 0x0000, 0x011f, 0x0135, 0x0000, 0x0000, 0x0000, /* 0x02b8-0x02bf */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010a, 0x0108, 0x0000, /* 0x02c0-0x02c7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02c8-0x02cf */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0120, 0x0000, 0x0000, /* 0x02d0-0x02d7 */ + 0x011c, 0x0000, 0x0000, 0x0000, 0x0000, 0x016c, 0x015c, 0x0000, /* 0x02d8-0x02df */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010b, 0x0109, 0x0000, /* 0x02e0-0x02e7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02e8-0x02ef */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0121, 0x0000, 0x0000, /* 0x02f0-0x02f7 */ + 0x011d, 0x0000, 0x0000, 0x0000, 0x0000, 0x016d, 0x015d /* 0x02f8-0x02ff */ +}; + +static unsigned short const keysym_to_unicode_3a2_3fe[] = { + 0x0138, 0x0156, 0x0000, 0x0128, 0x013b, 0x0000, /* 0x03a0-0x03a7 */ + 0x0000, 0x0000, 0x0112, 0x0122, 0x0166, 0x0000, 0x0000, 0x0000, /* 0x03a8-0x03af */ + 0x0000, 0x0000, 0x0000, 0x0157, 0x0000, 0x0129, 0x013c, 0x0000, /* 0x03b0-0x03b7 */ + 0x0000, 0x0000, 0x0113, 0x0123, 0x0167, 0x014a, 0x0000, 0x014b, /* 0x03b8-0x03bf */ + 0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012e, /* 0x03c0-0x03c7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0116, 0x0000, 0x0000, 0x012a, /* 0x03c8-0x03cf */ + 0x0000, 0x0145, 0x014c, 0x0136, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03d0-0x03d7 */ + 0x0000, 0x0172, 0x0000, 0x0000, 0x0000, 0x0168, 0x016a, 0x0000, /* 0x03d8-0x03df */ + 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012f, /* 0x03e0-0x03e7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0117, 0x0000, 0x0000, 0x012b, /* 0x03e8-0x03ef */ + 0x0000, 0x0146, 0x014d, 0x0137, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03f0-0x03f7 */ + 0x0000, 0x0173, 0x0000, 0x0000, 0x0000, 0x0169, 0x016b /* 0x03f8-0x03ff */ +}; + +static unsigned short const keysym_to_unicode_4a1_4df[] = { + 0x3002, 0x3008, 0x3009, 0x3001, 0x30fb, 0x30f2, 0x30a1, /* 0x04a0-0x04a7 */ + 0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30e3, 0x30e5, 0x30e7, 0x30c3, /* 0x04a8-0x04af */ + 0x30fc, 0x30a2, 0x30a4, 0x30a6, 0x30a8, 0x30aa, 0x30ab, 0x30ad, /* 0x04b0-0x04b7 */ + 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7, 0x30b9, 0x30bb, 0x30bd, /* 0x04b8-0x04bf */ + 0x30bf, 0x30c1, 0x30c4, 0x30c6, 0x30c8, 0x30ca, 0x30cb, 0x30cc, /* 0x04c0-0x04c7 */ + 0x30cd, 0x30ce, 0x30cf, 0x30d2, 0x30d5, 0x30d8, 0x30db, 0x30de, /* 0x04c8-0x04cf */ + 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e4, 0x30e6, 0x30e8, 0x30e9, /* 0x04d0-0x04d7 */ + 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ef, 0x30f3, 0x309b, 0x309c /* 0x04d8-0x04df */ +}; + +static unsigned short const keysym_to_unicode_590_5fe[] = { + 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, /* 0x0590-0x0597 */ + 0x06f8, 0x06f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0598-0x059f */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x066a, 0x0670, 0x0679, /* 0x05a0-0x05a7 */ + + 0x067e, 0x0686, 0x0688, 0x0691, 0x060c, 0x0000, 0x06d4, 0x0000, /* 0x05ac-0x05af */ + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, /* 0x05b0-0x05b7 */ + 0x0668, 0x0669, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, /* 0x05b8-0x05bf */ + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, /* 0x05c0-0x05c7 */ + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0x05c8-0x05cf */ + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, /* 0x05d0-0x05d7 */ + 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x05d8-0x05df */ + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, /* 0x05e0-0x05e7 */ + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0x05e8-0x05ef */ + 0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0698, 0x06a4, /* 0x05f0-0x05f7 */ + 0x06a9, 0x06af, 0x06ba, 0x06be, 0x06cc, 0x06d2, 0x06c1 /* 0x05f8-0x05fe */ +}; + +static unsigned short keysym_to_unicode_680_6ff[] = { + 0x0492, 0x0496, 0x049a, 0x049c, 0x04a2, 0x04ae, 0x04b0, 0x04b2, /* 0x0680-0x0687 */ + 0x04b6, 0x04b8, 0x04ba, 0x0000, 0x04d8, 0x04e2, 0x04e8, 0x04ee, /* 0x0688-0x068f */ + 0x0493, 0x0497, 0x049b, 0x049d, 0x04a3, 0x04af, 0x04b1, 0x04b3, /* 0x0690-0x0697 */ + 0x04b7, 0x04b9, 0x04bb, 0x0000, 0x04d9, 0x04e3, 0x04e9, 0x04ef, /* 0x0698-0x069f */ + 0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457, /* 0x06a0-0x06a7 */ + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0491, 0x045e, 0x045f, /* 0x06a8-0x06af */ + 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407, /* 0x06b0-0x06b7 */ + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0490, 0x040e, 0x040f, /* 0x06b8-0x06bf */ + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 0x06c0-0x06c7 */ + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0x06c8-0x06cf */ + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 0x06d0-0x06d7 */ + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0x06d8-0x06df */ + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 0x06e0-0x06e7 */ + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0x06e8-0x06ef */ + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 0x06f0-0x06f7 */ + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a /* 0x06f8-0x06ff */ +}; + +static unsigned short const keysym_to_unicode_7a1_7f9[] = { + 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, /* 0x07a0-0x07a7 */ + 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015, /* 0x07a8-0x07af */ + 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, /* 0x07b0-0x07b7 */ + 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07b8-0x07bf */ + 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0x07c0-0x07c7 */ + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0x07c8-0x07cf */ + 0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7, /* 0x07d0-0x07d7 */ + 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07d8-0x07df */ + 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, /* 0x07e0-0x07e7 */ + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0x07e8-0x07ef */ + 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, /* 0x07f0-0x07f7 */ + 0x03c8, 0x03c9 /* 0x07f8-0x07ff */ +}; + +static unsigned short const keysym_to_unicode_8a4_8fe[] = { + 0x2320, 0x2321, 0x0000, 0x231c, /* 0x08a0-0x08a7 */ + 0x231d, 0x231e, 0x231f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08a8-0x08af */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08b0-0x08b7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222b, /* 0x08b8-0x08bf */ + 0x2234, 0x0000, 0x221e, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000, /* 0x08c0-0x08c7 */ + 0x2245, 0x2246, 0x0000, 0x0000, 0x0000, 0x0000, 0x22a2, 0x0000, /* 0x08c8-0x08cf */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221a, 0x0000, /* 0x08d0-0x08d7 */ + 0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222a, 0x2227, 0x2228, /* 0x08d8-0x08df */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08e0-0x08e7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08e8-0x08ef */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000, /* 0x08f0-0x08f7 */ + 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193 /* 0x08f8-0x08ff */ +}; + +static unsigned short const keysym_to_unicode_9df_9f8[] = { + 0x2422, /* 0x09d8-0x09df */ + 0x2666, 0x25a6, 0x2409, 0x240c, 0x240d, 0x240a, 0x0000, 0x0000, /* 0x09e0-0x09e7 */ + 0x240a, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x2500, /* 0x09e8-0x09ef */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x251c, 0x2524, 0x2534, 0x252c, /* 0x09f0-0x09f7 */ + 0x2502 /* 0x09f8-0x09ff */ +}; + +static unsigned short const keysym_to_unicode_aa1_afe[] = { + 0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, /* 0x0aa0-0x0aa7 */ + 0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025, /* 0x0aa8-0x0aaf */ + 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, /* 0x0ab0-0x0ab7 */ + 0x2105, 0x0000, 0x0000, 0x2012, 0x2039, 0x2024, 0x203a, 0x0000, /* 0x0ab8-0x0abf */ + 0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000, /* 0x0ac0-0x0ac7 */ + 0x0000, 0x2122, 0x2120, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25ad, /* 0x0ac8-0x0acf */ + 0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x0000, 0x2032, 0x2033, /* 0x0ad0-0x0ad7 */ + 0x0000, 0x271d, 0x0000, 0x220e, 0x25c2, 0x2023, 0x25cf, 0x25ac, /* 0x0ad8-0x0adf */ + 0x25e6, 0x25ab, 0x25ae, 0x25b5, 0x25bf, 0x2606, 0x2022, 0x25aa, /* 0x0ae0-0x0ae7 */ + 0x25b4, 0x25be, 0x261a, 0x261b, 0x2663, 0x2666, 0x2665, 0x0000, /* 0x0ae8-0x0aef */ + 0x2720, 0x2020, 0x2021, 0x2713, 0x2612, 0x266f, 0x266d, 0x2642, /* 0x0af0-0x0af7 */ + 0x2640, 0x2121, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e /* 0x0af8-0x0aff */ +}; + +/* none of the APL keysyms match the Unicode characters */ + +static unsigned short const keysym_to_unicode_cdf_cfa[] = { + 0x2017, /* 0x0cd8-0x0cdf */ + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, /* 0x0ce0-0x0ce7 */ + 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0x0ce8-0x0cef */ + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, /* 0x0cf0-0x0cf7 */ + 0x05e8, 0x05e9, 0x05ea /* 0x0cf8-0x0cff */ +}; + +static unsigned short const keysym_to_unicode_da1_df9[] = { + 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, /* 0x0da0-0x0da7 */ + 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, /* 0x0da8-0x0daf */ + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, /* 0x0db0-0x0db7 */ + 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, /* 0x0db8-0x0dbf */ + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, /* 0x0dc0-0x0dc7 */ + 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, /* 0x0dc8-0x0dcf */ + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, /* 0x0dd0-0x0dd7 */ + 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0e3e, 0x0e3f, /* 0x0dd8-0x0ddf */ + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, /* 0x0de0-0x0de7 */ + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0000, 0x0000, /* 0x0de8-0x0def */ + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, /* 0x0df0-0x0df7 */ + 0x0e58, 0x0e59 /* 0x0df8-0x0dff */ +}; + +static unsigned short const keysym_to_unicode_ea0_eff[] = { + 0x0000, 0x1101, 0x1101, 0x11aa, 0x1102, 0x11ac, 0x11ad, 0x1103, /* 0x0ea0-0x0ea7 */ + 0x1104, 0x1105, 0x11b0, 0x11b1, 0x11b2, 0x11b3, 0x11b4, 0x11b5, /* 0x0ea8-0x0eaf */ + 0x11b6, 0x1106, 0x1107, 0x1108, 0x11b9, 0x1109, 0x110a, 0x110b, /* 0x0eb0-0x0eb7 */ + 0x110c, 0x110d, 0x110e, 0x110f, 0x1110, 0x1111, 0x1112, 0x1161, /* 0x0eb8-0x0ebf */ + 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, /* 0x0ec0-0x0ec7 */ + 0x116a, 0x116b, 0x116c, 0x116d, 0x116e, 0x116f, 0x1170, 0x1171, /* 0x0ec8-0x0ecf */ + 0x1172, 0x1173, 0x1174, 0x1175, 0x11a8, 0x11a9, 0x11aa, 0x11ab, /* 0x0ed0-0x0ed7 */ + 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3, /* 0x0ed8-0x0edf */ + 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb, /* 0x0ee0-0x0ee7 */ + 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x0000, /* 0x0ee8-0x0eef */ + 0x0000, 0x0000, 0x1140, 0x0000, 0x0000, 0x1159, 0x119e, 0x0000, /* 0x0ef0-0x0ef7 */ + 0x11eb, 0x0000, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9, /* 0x0ef8-0x0eff */ +}; + +static unsigned short keysym_to_unicode_12a1_12fe[] = { + 0x1e02, 0x1e03, 0x0000, 0x0000, 0x0000, 0x1e0a, 0x0000, /* 0x12a0-0x12a7 */ + 0x1e80, 0x0000, 0x1e82, 0x1e0b, 0x1ef2, 0x0000, 0x0000, 0x0000, /* 0x12a8-0x12af */ + 0x1e1e, 0x1e1f, 0x0000, 0x0000, 0x1e40, 0x1e41, 0x0000, 0x1e56, /* 0x12b0-0x12b7 */ + 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0x12b8-0x12bf */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c0-0x12c7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c8-0x12cf */ + 0x0174, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6a, /* 0x12d0-0x12d7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0176, 0x0000, /* 0x12d8-0x12df */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e0-0x12e7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e8-0x12ef */ + 0x0175, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6b, /* 0x12f0-0x12f7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0177 /* 0x12f0-0x12ff */ +}; + +static unsigned short const keysym_to_unicode_13bc_13be[] = { + 0x0152, 0x0153, 0x0178 /* 0x13b8-0x13bf */ +}; + +static unsigned short keysym_to_unicode_14a1_14ff[] = { + 0x2741, 0x00a7, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, /* 0x14a0-0x14a7 */ + 0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, /* 0x14a8-0x14af */ + 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, /* 0x14b0-0x14b7 */ + 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, /* 0x14b8-0x14bf */ + 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, /* 0x14c0-0x14c7 */ + 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, /* 0x14c8-0x14cf */ + 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, /* 0x14d0-0x14d7 */ + 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, /* 0x14d8-0x14df */ + 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, /* 0x14e0-0x14e7 */ + 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, /* 0x14e8-0x14ef */ + 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, /* 0x14f0-0x14f7 */ + 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x2019, 0x0027, /* 0x14f8-0x14ff */ +}; + +static unsigned short keysym_to_unicode_15d0_15f6[] = { + 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, /* 0x15d0-0x15d7 */ + 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, /* 0x15d8-0x15df */ + 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, /* 0x15e0-0x15e7 */ + 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, /* 0x15e8-0x15ef */ + 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6 /* 0x15f0-0x15f7 */ +}; + +static unsigned short keysym_to_unicode_16a0_16f6[] = { + 0x0000, 0x0000, 0xf0a2, 0x1e8a, 0x0000, 0xf0a5, 0x012c, 0xf0a7, /* 0x16a0-0x16a7 */ + 0xf0a8, 0x01b5, 0x01e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x019f, /* 0x16a8-0x16af */ + 0x0000, 0x017e, 0xf0b2, 0x1e8b, 0x01d1, 0xf0b5, 0x012d, 0xf0b7, /* 0x16b0-0x16b7 */ + 0xf0b8, 0x01b6, 0x01e7, 0x01d2, 0x0000, 0x0000, 0x0000, 0x0275, /* 0x16b8-0x16bf */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x018f, 0x0000, /* 0x16c0-0x16c7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16c8-0x16cf */ + 0x0000, 0x1e36, 0xf0d2, 0xf0d3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d0-0x16d7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d8-0x16df */ + 0x0000, 0x1e37, 0xf0e2, 0xf0e3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e0-0x16e7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e8-0x16ef */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0259 /* 0x16f0-0x16f6 */ +}; + +static unsigned short const keysym_to_unicode_1e9f_1eff[] = { + 0x0303, + 0x1ea0, 0x1ea1, 0x1ea2, 0x1ea3, 0x1ea4, 0x1ea5, 0x1ea6, 0x1ea7, /* 0x1ea0-0x1ea7 */ + 0x1ea8, 0x1ea9, 0x1eaa, 0x1eab, 0x1eac, 0x1ead, 0x1eae, 0x1eaf, /* 0x1ea8-0x1eaf */ + 0x1eb0, 0x1eb1, 0x1eb2, 0x1eb3, 0x1eb4, 0x1eb5, 0x1eb6, 0x1eb7, /* 0x1eb0-0x1eb7 */ + 0x1eb8, 0x1eb9, 0x1eba, 0x1ebb, 0x1ebc, 0x1ebd, 0x1ebe, 0x1ebf, /* 0x1eb8-0x1ebf */ + 0x1ec0, 0x1ec1, 0x1ec2, 0x1ec3, 0x1ec4, 0x1ec5, 0x1ec6, 0x1ec7, /* 0x1ec0-0x1ec7 */ + 0x1ec8, 0x1ec9, 0x1eca, 0x1ecb, 0x1ecc, 0x1ecd, 0x1ece, 0x1ecf, /* 0x1ec8-0x1ecf */ + 0x1ed0, 0x1ed1, 0x1ed2, 0x1ed3, 0x1ed4, 0x1ed5, 0x1ed6, 0x1ed7, /* 0x1ed0-0x1ed7 */ + 0x1ed8, 0x1ed9, 0x1eda, 0x1edb, 0x1edc, 0x1edd, 0x1ede, 0x1edf, /* 0x1ed8-0x1edf */ + 0x1ee0, 0x1ee1, 0x1ee2, 0x1ee3, 0x1ee4, 0x1ee5, 0x1ee6, 0x1ee7, /* 0x1ee0-0x1ee7 */ + 0x1ee8, 0x1ee9, 0x1eea, 0x1eeb, 0x1eec, 0x1eed, 0x1eee, 0x1eef, /* 0x1ee8-0x1eef */ + 0x1ef0, 0x1ef1, 0x0300, 0x0301, 0x1ef4, 0x1ef5, 0x1ef6, 0x1ef7, /* 0x1ef0-0x1ef7 */ + 0x1ef8, 0x1ef9, 0x01a0, 0x01a1, 0x01af, 0x01b0, 0x0309, 0x0323 /* 0x1ef8-0x1eff */ +}; + +static unsigned short const keysym_to_unicode_20a0_20ac[] = { + 0x20a0, 0x20a1, 0x20a2, 0x20a3, 0x20a4, 0x20a5, 0x20a6, 0x20a7, /* 0x20a0-0x20a7 */ + 0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac /* 0x20a8-0x20af */ +}; + +unsigned int +KeySymToUcs4(int keysym) +{ + /* 'Unicode keysym' */ + if ((keysym & 0xff000000) == 0x01000000) + return (keysym & 0x00ffffff); + + if (keysym > 0 && keysym < 0x100) + return keysym; + else if (keysym > 0x1a0 && keysym < 0x200) + return keysym_to_unicode_1a1_1ff[keysym - 0x1a1]; + else if (keysym > 0x2a0 && keysym < 0x2ff) + return keysym_to_unicode_2a1_2fe[keysym - 0x2a1]; + else if (keysym > 0x3a1 && keysym < 0x3ff) + return keysym_to_unicode_3a2_3fe[keysym - 0x3a2]; + else if (keysym > 0x4a0 && keysym < 0x4e0) + return keysym_to_unicode_4a1_4df[keysym - 0x4a1]; + else if (keysym > 0x589 && keysym < 0x5ff) + return keysym_to_unicode_590_5fe[keysym - 0x590]; + else if (keysym > 0x67f && keysym < 0x700) + return keysym_to_unicode_680_6ff[keysym - 0x680]; + else if (keysym > 0x7a0 && keysym < 0x7fa) + return keysym_to_unicode_7a1_7f9[keysym - 0x7a1]; + else if (keysym > 0x8a3 && keysym < 0x8ff) + return keysym_to_unicode_8a4_8fe[keysym - 0x8a4]; + else if (keysym > 0x9de && keysym < 0x9f9) + return keysym_to_unicode_9df_9f8[keysym - 0x9df]; + else if (keysym > 0xaa0 && keysym < 0xaff) + return keysym_to_unicode_aa1_afe[keysym - 0xaa1]; + else if (keysym > 0xcde && keysym < 0xcfb) + return keysym_to_unicode_cdf_cfa[keysym - 0xcdf]; + else if (keysym > 0xda0 && keysym < 0xdfa) + return keysym_to_unicode_da1_df9[keysym - 0xda1]; + else if (keysym > 0xe9f && keysym < 0xf00) + return keysym_to_unicode_ea0_eff[keysym - 0xea0]; + else if (keysym > 0x12a0 && keysym < 0x12ff) + return keysym_to_unicode_12a1_12fe[keysym - 0x12a1]; + else if (keysym > 0x13bb && keysym < 0x13bf) + return keysym_to_unicode_13bc_13be[keysym - 0x13bc]; + else if (keysym > 0x14a0 && keysym < 0x1500) + return keysym_to_unicode_14a1_14ff[keysym - 0x14a1]; + else if (keysym > 0x15cf && keysym < 0x15f7) + return keysym_to_unicode_15d0_15f6[keysym - 0x15d0]; + else if (keysym > 0x169f && keysym < 0x16f7) + return keysym_to_unicode_16a0_16f6[keysym - 0x16a0]; + else if (keysym > 0x1e9e && keysym < 0x1f00) + return keysym_to_unicode_1e9f_1eff[keysym - 0x1ea0]; + else if (keysym > 0x209f && keysym < 0x20ad) + return keysym_to_unicode_20a0_20ac[keysym - 0x20a0]; + else + return 0; +} diff --git a/console-client/xkb/lex.l b/console-client/xkb/lex.l new file mode 100644 index 00000000..37b88c3f --- /dev/null +++ b/console-client/xkb/lex.l @@ -0,0 +1,367 @@ +/* XKB scanner. + + Copyright (C) 2002, 03 Marco Gerards + + Written by Marco Gerards <marco@student.han.nl> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. */ + + + #include "xkb.h" + #include "parser.tab.h" + #include <string.h> + #include <unistd.h> + #include <stdlib.h> + #include <stdio.h> + #include <error.h> + + void close_include (void); + int lineno = 1; + char *filename = "foo"; + +%option nodebug + +%option UNPUT +KEYCODE "<"[A-Z][A-Z0-9]*">" +DIGIT [0-9] +NUM {DIGIT}{DIGIT}* +FLOAT {DIGIT}{DIGIT}*\.{DIGIT}{DIGIT}* +HEX 0x[A-Za-z0-9]* +IDENTIFIER [a-zA-Z][a-zA-Z0-9_]* +CPPCOMMENT "//".*"\n" +%% + /* When the end of a file is reached, close the + current one and pop the next file to process + of the stack. */ + + /* Filter out comment. */ +{CPPCOMMENT} { lineno++; } + "/*" { + int c; + + while((c = input()) != 0) + { + if(c == '\n') + lineno++; + + else if(c == '*') + { + if((c = input()) == '/') + break; + else + unput(c); + } + } + } + +\n { lineno++; } + + /* Beginning of sections. */ +xkb_keymap { return XKBKEYMAP; } +xkb_symbols { return XKBSYMBOLS; } +xkb_keycodes { return XKBKEYCODES; } +xkb_types { return XKBTYPES; } +xkb_compatibility { return XKBCOMPAT; } +xkb_geometry { return XKBGEOMETRY; } + + + /* Real modifiers. */ +shift { return SHIFT; } +lock { return LOCK; } +control { return CONTROL; } +ctrl { return CONTROL; } +mod1 { return MOD1; } +mod2 { return MOD2; } +mod3 { return MOD3; } +mod4 { return MOD4; } +mod5 { return MOD5; } + + /* Levels. */ +anylevel { yylval.val = 0; return LEVEL; } +levelone { yylval.val = 1; return LEVEL; } +level1 { yylval.val = 1; return LEVEL; } +level2 { yylval.val = 2; return LEVEL; } +level3 { yylval.val = 3; return LEVEL; } +level4 { yylval.val = 4; return LEVEL; } + + /* Groups. */ +group1 { yylval.val = 1; return GROUPNUM; } +group2 { yylval.val = 2; return GROUPNUM; } +group3 { yylval.val = 3; return GROUPNUM; } +group4 { yylval.val = 4; return GROUPNUM; } + + /* Booleans */ +true { yylval.val = 1; return BOOLEAN; } +false { yylval.val = 0; return BOOLEAN; } + + /* Interpretation */ +interpret { return INTERPRET; } +usemodmap { return USEMODMAP; } +usemodmapmods { return USEMODMAP; } +modmapmods { return USEMODMAP; } +repeat { return REPEAT; } +locking { return LOCKING; } +locks { return LOCKING; } +virtualmodifier { return VIRTUALMODIFIER; } +virtualmod { return VIRTUALMODIFIER; } + + /* Interpretation match. */ +noneof { yylval.val = 0; return INTERPMATCH ;} +anyofornone { yylval.val = 1; return INTERPMATCH ;} +anyof { yylval.val = 2; return INTERPMATCH ;} +allof { yylval.val = 3; return INTERPMATCH ;} +exactly { yylval.val = 4; return INTERPMATCH ;} + + /* SetMods action. */ +clearlocks { return CLEARLOCKS; } +mods { return MODS; } + +unlock { return UNLOCK; } +both { return BOTH; } +neither { return NEITHER; } + + /* Actions. */ +setmods { return SETMODS; } +latchmods { return LATCHMODS; } +lockmods { return LOCKMODS; } +setgroup { return SETGROUP; } +latchgroup { return LATCHGROUP; } +lockgroup { return LOCKGROUP; } +setptrdflt { return PTRDFLT; } +setpointerdefault { return PTRDFLT; } +lockptrbtn { return LOCKPTRBTN; } +lockpointerbutton { return LOCKPTRBTN; } +lockptrbutton { return LOCKPTRBTN; } +lockpointerbtn { return LOCKPTRBTN; } +setcontrols { return SETCONTROLS; } +lockcontrols { return LOCKCONTROLS; } +terminateserver { return TERMINATE; } +terminate { return TERMINATE; } +switchscreen { return SWITCHSCREEN; } +consscroll { return CONSSCROLL; } +consolescroll { return CONSSCROLL; } +moveptr { return MOVEPTR; } +private { return PRIVATE; } + /* Action parameters. */ +latchtolock { return LATCHTOLOCK; } +group { return GROUP; } +groups { return GROUPS; } +accel { return ACCEL; } +accelerate { return ACCEL; } +default { return DEFAULT; } +count { return COUNT; } +controls { return CONTROLS; } +same { return SAMESERVER; } +sameserver { return SAMESERVER; } +screen { return SCREEN; } +line { return LINE; } +percentage { return PERCENT; } +ptrbtn { return PTRBTN ; } +pointerbutton { return PTRBTN ; } + +action { return ACTION; } +actions { return ACTIONS; } + +whichmodstate { return WHICHMODSTATE; } +whichmodifierstate { return WHICHMODSTATE; } +whichgroupstate { return WHICHGROUPSTATE; } + + /* Match state for indicator. */ +base { yylval.val = 0; return WHICHSTATE; } +latched { yylval.val = 1; return WHICHSTATE; } +locked { yylval.val = 4; return WHICHSTATE; } +effective { yylval.val = 8; return WHICHSTATE; } + + /* Bits for binary controls. */ +repeatkeys { yylval.val = 0; return CONTROLFLAG; } +autorepeat { yylval.val = 0; return CONTROLFLAG; } +accessxkeys { yylval.val = 0; return CONTROLFLAG; } +slowkeys { yylval.val = 0; return CONTROLFLAG; } +bouncekeys { yylval.val = 0; return CONTROLFLAG; } +stickykeys { yylval.val = 0; return CONTROLFLAG; } +accessxtimeout { yylval.val = 0; return CONTROLFLAG; } +accessxfeedback { yylval.val = 0; return CONTROLFLAG; } +mousekeys { yylval.val = 0; return CONTROLFLAG; } +mousekeysaccel { yylval.val = 0; return CONTROLFLAG; } +audiblebell { yylval.val = 0; return CONTROLFLAG; } +ignoregrouplock { yylval.val = 0; return CONTROLFLAG; } + +index { return INDEX; } +name { return NAME; } +symbols { return SYMBOLS; } +key { return KEY; } + + /* Mouse buttons. */ +button1 { yylval.val = 1; return BUTTONNUM; } +button2 { yylval.val = 2; return BUTTONNUM; } +button3 { yylval.val = 3; return BUTTONNUM; } +button4 { yylval.val = 4; return BUTTONNUM; } +button5 { yylval.val = 5; return BUTTONNUM; } +button { return BUTTON; } + + /* Fuzzyness. */ +any { return ANY; } +all { return ALL; } +none { return NONE; } + +defaultbutton { return DEFAULTBTN; } +affect { return AFFECT; } + +allowexplicit { return ALLOWEXPLICIT; } + + /* Feedback to the keyboard. */ +driveskeyboard { return DRIVESKBD; } +driveskbd { return DRIVESKBD; } +ledsdrivekbd { return DRIVESKBD; } +ledsdrivekeyboard { return DRIVESKBD; } +indicatordriveskbd { return DRIVESKBD; } +indicatordriveskeyboard { return DRIVESKBD; } + + +modifier_map { return MODMAP; } +minimum { return MINIMUM; } +maximum { return MAXIMUM; } +virtual { return VIRTUAL; } +alias { return ALIAS; } +indicator { return INDICATOR; } +virtual_modifiers { return VMODS; } +virtualmods { return VMODS; } +type { return TYPE; } +data { return DATA; } +modifiers { return MODS; } +map { return MAP; } +level_name { return LEVEL_NAME; } +preserve { return PRESERVE; } + + /* Section flags. */ +partial { yylval.val = 1; return FLAGS; } +complete { yylval.val = 2; return FLAGS; } +fc { yylval.val = 4; return FLAGS; } +fd { yylval.val = 8; return FLAGS; } +cp { return XKBCOMPAT; } + + /* Section merge modes. */ +include { yylval.mergemode = defaultmm; return INCLUDE; } +augment { yylval.mergemode = augment; return AUGMENT; } +replace { yylval.mergemode = replace; return REPLACE; } +override { yylval.mergemode = override; return OVERRIDE; } + +isolock { return ISOLOCK; } +pointers { return POINTERS;} +ptr { return POINTERS;} +noaction { return NOACTION;} +groupswrap { return GROUPSWRAP; } +wrapgroups { return GROUPSWRAP; } +clampgroups { return GROUPSCLAMP; } +groupsredirect { return GROUPSREDIRECT; } +overlay1 { yylval.val = 1; return OVERLAY; } +overlay2 { yylval.val = 2; return OVERLAY; } + + /* String. */ +\"([^"]|\\\")*\" { + yytext[strlen (yytext) - 1] = '\0'; + yylval.str = strdup (yytext + 1); + return STR; + } + /* Ignore whitespace. */ +[ \t]* + /* A keycode. */ +{KEYCODE} { yylval.str = strdup (yytext) + 1; yylval.str[strlen (yylval.str) - 1] = 0; return KEYCODE; } + /* A float vlaue. */ +{FLOAT} { yylval.dbl = atof (yytext); return FLOAT; } + /* An integer. */ +{NUM} { yylval.val = atoi (yytext); return NUM; } + /* A hexadecimal value. */ +{HEX} { sscanf (yytext, "0x%X", &yylval.val); return HEX; } + /* An identifier. */ +{IDENTIFIER} { yylval.str = strdup (yytext); return IDENTIFIER; } + /* All unrecognized characters. */ +. { return yytext[0]; } +%% + /* Stupid hack, the current version of flex is fucked. */ + #define yytext_ptr yytext + + void + scanner_unput (int c) + { + unput (c); + } + + int + yywrap (void) + { + close_include (); + return 0; + } + + #define MAX_INCLUDE_DEPTH 50 + + /* An include file on the stack. */ + struct include_stack + { + YY_BUFFER_STATE buffer; + mergemode merge_mode; + int currline; + char *filename; + } include_stack[MAX_INCLUDE_DEPTH]; + int include_stack_ptr = 0; + + /* Add an file to the stack. */ + void + include_file (FILE *file, mergemode new_mm, char *fname) + { + YY_BUFFER_STATE buffer; + + if (include_stack_ptr >= MAX_INCLUDE_DEPTH) + { + fprintf (stderr, "Includes nested too deeply\n"); + exit (EXIT_FAILURE); + } + + include_stack[include_stack_ptr].filename = filename; + include_stack[include_stack_ptr].currline = lineno; + include_stack[include_stack_ptr].merge_mode = merge_mode; + include_stack[include_stack_ptr++].buffer = YY_CURRENT_BUFFER; + filename = fname; + lineno = 1; + merge_mode = new_mm; + + buffer = yy_create_buffer (file, YY_BUF_SIZE); + yy_switch_to_buffer (buffer); + } + + /* Close an includefile. */ + void + close_include (void) + { + if ( --include_stack_ptr < 0 ) + { + // yyterminate (); + fprintf (stderr, "Unexpected end of file.\n"); + exit (1); + } + else + { + fclose (yyin); + yy_delete_buffer (YY_CURRENT_BUFFER); + merge_mode = include_stack[include_stack_ptr].merge_mode; + lineno = include_stack[include_stack_ptr].currline; + filename = include_stack[include_stack_ptr].filename; + yy_switch_to_buffer (include_stack[include_stack_ptr].buffer); + } + } + + void + yyerror (char *s) + { + fprintf (stderr, "%s:%d: %s\n", filename, lineno, s); + // error_at_line (0, 1, filename, lineno, "foo %d\n", 2); + } diff --git a/console-client/xkb/makeconf.sh b/console-client/xkb/makeconf.sh new file mode 100644 index 00000000..15ce9bf1 --- /dev/null +++ b/console-client/xkb/makeconf.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# Update the default configuration with default.xkb + +# As input the file "default.xkb" is used. +# You can generate this file with "xkbcomp": +# "xkbcomp :0 -o default.xkb" +# This extract the configuration out of the ":0" X server. +# After that add the Hurd features to switch VCs, scroll, etc!!!! +# +# Hurd feature checklist: +# Alt + F1...F12: Switch VC. +# Alt + Left, Right: Switch to the console left or right of the current +# console. +# Alt + Up, Down: Scroll the console by one line up or down. +# Ctrl + PgUp, PgDown: Scroll the console up or down with 1/2 screen. +# Alt + Home: Scroll the console to the 0% of the scrollback buffer. +# Ctrl + Home: Scroll the console to the 25% of the scrollback buffer. +# Alt + End: Scroll the console to the 100% of the scrollback buffer. +# Alt + End: Scroll the console to the 75% of the scrollback buffer. + + +# Really ugly code, but it works :) +echo "char *default_xkb_keymap = \"\\" > xkbdefaults.c +# Escape " and \ +sed "s/\([\\\"]\)/\\\\\1/g" < default.xkb|awk ' { print $0 "\\n\\" } ' >> xkbdefaults.c +echo "\\0\";" >> xkbdefaults.c diff --git a/console-client/xkb/parser.y b/console-client/xkb/parser.y new file mode 100644 index 00000000..9fe2a394 --- /dev/null +++ b/console-client/xkb/parser.y @@ -0,0 +1,1529 @@ +/* parser.y -- XKB parser. + + Copyright (C) 2003, 2004 Marco Gerards + + Written by Marco Gerards <marco@student.han.nl> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. */ + +%{ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include "xkb.h" + +void yyerror(char *); +int yylex (void); +static error_t include_section (char *incl, int sectionsymbol, char *dirname, + mergemode); +static error_t include_sections (char *incl, int sectionsymbol, char *dirname, + mergemode); +void close_include (); +static void skipsection (void); +static error_t set_default_action (struct xkb_action *, struct xkb_action **); +static void key_set_keysym (struct key *key, group_t group, int level, + symbol ks); +static void key_new (char *keyname); +static void key_delete (char *keyname); +void scanner_unput (int c); +static void remove_symbols (struct key *key, group_t group); + +struct xkb_interpret *current_interpretation; +struct xkb_action *current_action; +struct xkb_indicator indi; +struct xkb_indicator *current_indicator = &indi; +struct key defkey; +struct key *default_key = &defkey; + +/* The default settings for actions. */ +struct xkb_action default_setmods = { SA_SetMods }; +struct xkb_action default_lockmods = { SA_LockMods }; +struct xkb_action default_latchmods = { SA_LatchMods }; +struct xkb_action default_setgroup = { SA_SetGroup }; +struct xkb_action default_latchgroup = { SA_LatchGroup }; +struct xkb_action default_lockgroup = { SA_LockGroup }; +struct xkb_action default_moveptr = { SA_MovePtr }; +struct xkb_action default_ptrbtn = { SA_PtrBtn }; +struct xkb_action default_lockptrbtn = { SA_LockPtrBtn }; +struct xkb_action default_ptrdflt = { SA_SetPtrDflt }; +struct xkb_action default_setcontrols = { SA_SetControls }; +struct xkb_action default_lockcontrols = { SA_LockControls }; +struct xkb_action default_isolock = { SA_ISOLock }; +struct xkb_action default_switchscrn = { SA_SwitchScreen }; +struct xkb_action default_consscroll = { SA_ConsScroll }; + +static struct key *current_key; + +/* The dummy gets used when the original may not be overwritten. */ +static struct key dummy_key; + +/* The current parsed group. */ +static int current_group; +static int current_rmod = 0; + +/* The current symbol in the currently parsed key. */ +static int symbolcnt; +static int actioncnt; + +mergemode merge_mode = override; + +//#define YYDEBUG 1 + +static struct keytype *current_keytype; +%} + +%union { + int val; + char *str; + modmap_t modmap; + struct xkb_action *action; + double dbl; + mergemode mergemode; +} + +%token XKBKEYMAP "xkb_keymap" +%token XKBKEYCODES "xkb_keycodes" +%token XKBCOMPAT "xkb_compatibility" +%token XKBGEOMETRY "xkb_geometry" +%token XKBTYPES "xkb_types" +%token XKBSYMBOLS "xkb_symbols" +%token STR +%token HEX +%token FLAGS +%token KEYCODE +%token NUM +%token MINIMUM "minimum" +%token MAXIMUM "maximum" +%token VIRTUAL "virtual" +%token INDICATOR "indicator" +%token ALIAS "alias" +%token IDENTIFIER +%token VMODS "virtualmods" +%token TYPE "type" +%token DATA "data" +%token MAP "map" +%token LEVEL_NAME "level_name" +%token PRESERVE "preserve" +%token LEVEL +%token USEMODMAP "usemodmap" +%token REPEAT "repeat" +%token LOCKING "locking" +%token VIRTUALMODIFIER "virtualmod" +%token BOOLEAN +%token INTERPRET "interpret" +%token INTERPMATCH +%token CLEARLOCKS "clearlocks" +%token MODS "mods" +%token SETMODS "setmods" +%token LATCHMODS "latchmods" +%token LOCKMODS "lockmods" +%token ACTION "action" +%token LATCHTOLOCK "latchtolock" +%token GROUP "group" +%token GROUPS "groups" +%token SETGROUP "setgroup" +%token LATCHGROUP "latchgroup" +%token LOCKGROUP "lockgroup" +%token ACCEL "accel" +%token MOVEPTR "moveptr" +%token PRIVATE "private" +%token BUTTON "button" +%token BUTTONNUM +%token DEFAULT "default" +%token COUNT "count" +%token PTRBTN "ptrbtn" +%token DEFAULTBTN "defaultbutton" +%token ALL "all" +%token NONE "none" +%token ANY "any" +%token CONTROLFLAG +%token AFFECT "affect" +%token PTRDFLT "setptrdflt" +%token LOCKPTRBTN "lockptrbtn" +%token SETCONTROLS "setcontrols" +%token LOCKCONTROLS "lockcontrols" +%token CONTROLS "controls" +%token TERMINATE "terminate" +%token WHICHMODSTATE "whichmodstate" +%token WHICHGROUPSTATE "whichgroupstate" +%token WHICHSTATE "whichstate" +%token INDEX "index" +%token ALLOWEXPLICIT "allowexplicit" +%token DRIVESKBD "driveskbd" +//%token AFFECTBTNLOCK +%token SYMBOLS "symbols" +%token NAME "name" +%token GROUPNUM +%token ACTIONS "actions" +%token KEY "key" +%token MODMAP "modifier_map" +%token SHIFT "shift" +%token LOCK "lock" +%token CONTROL "control" +%token MOD1 "mod1" +%token MOD2 "mod2" +%token MOD3 "mod3" +%token MOD4 "mod4" +%token MOD5 "mod5" +%token UNLOCK "unlock" +%token BOTH "both" +%token NEITHER "neither" + +%token INCLUDE "include" +%token AUGMENT "augment" +%token OVERRIDE "override" +%token REPLACE "replace" + + +%token ISOLOCK "isolock" +%token POINTERS "pointers" +%token NOACTION "noaction" +%token GROUPSWRAP "groupswrap" +%token GROUPSCLAMP "groupsclamp" +%token GROUPSREDIRECT "groupsredirect" +%token OVERLAY "overlay" +%token SWITCHSCREEN "switchscreen" +%token SAMESERVER "sameserver" +%token SCREEN "screen" +%token LINE "line" +%token PERCENT "percent" +%token CONSSCROLL "consscroll" +%token FLOAT "float" +%type <str> STR KEYCODE IDENTIFIER +%type <val> FLAGS NUM HEX vmod level LEVEL rmod BOOLEAN symbol INTERPMATCH +%type <val> clearlocks usemodmap latchtolock noaccel button BUTTONNUM +%type <val> ctrlflags allowexplicit driveskbd +%type <val> DRIVESKBD GROUPNUM group symbolname groups whichstate WHICHSTATE +/* Booleans */ +%type <val> locking repeat groupswrap groupsclamp sameserver +%type <modmap> mods +%type <action> action +%type <action> ctrlparams +%type <mergemode> include +%type <dbl> FLOAT +//%debug + +%% +/* A XKB keymap. */ +xkbkeymap: + "xkb_keymap" '{' keymap '}' ';' { YYACCEPT } +| "xkb_keymap" STR '{' keymap '}' ';' { YYACCEPT } +| '{' keymap '}' { YYACCEPT } ';' +; + +/* A XKB configuration has many sections. */ +keymap: + /* empty */ +| keymap types +| keymap keycodes +| keymap compat +| keymap symbols +| keymap geometry +; + +include: + "include" { $$ = defaultmm } +| "augment" { $$ = augment } +| "replace" { $$ = replace } +| "override" { $$= override } +; + +/* All flags assigned to a section. */ +flags: + /* empty */ +| flags FLAGS +; + +/* The header of a keycode section. */ +keycodes: + flags "xkb_keycodes" '{' keycodesect '}' ';' +| flags "xkb_keycodes" STR '{' keycodesect '}' ';' +; + +/* Process the includes on the stack. */ +keycodesinclude: + '{' keycodesect '}' { close_include () } +| keycodesinclude '{' keycodesect '}' { close_include () } +; + +/* The first lines of a keycode section. The amount of keycodes are + declared here. */ +keycodesect: +/* empty */ +| "minimum" '=' NUM ';' keycodesect + { + min_keys = $3; + current_key = &keys[$3]; + } +| MAXIMUM '=' NUM ';' keycodesect + { + max_keys = $3; + keys = calloc ($3, sizeof (struct key)); + } +| KEYCODE '=' NUM ';' + { keyname_add ($1, $3); } + keycodesect +| "replace" KEYCODE '=' NUM ';' + { keyname_add ($2, $4); } + keycodesect +| "indicator" NUM '=' STR ';' keycodesect { } +| "virtual" INDICATOR NUM '=' STR ';' keycodesect +| "alias" KEYCODE '=' KEYCODE ';' + { + keycode_t key = keyname_find ($4); + if (key) + keyname_add ($2, key); + else + { + key = keyname_find ($2); + if (key) + keyname_add ($4, key); + } + } + keycodesect +| include STR + { include_sections ($2, XKBKEYCODES, "keycodes", $1); } + keycodesinclude keycodesect +; + +/* The header of a keytypes section. */ +types: + flags "xkb_types" '{' typessect '}' ';' +| flags "xkb_types" STR '{' typessect '}' ';' +; + +/* A list of virtual modifier declarations (see vmods_def), seperated + by commas. */ +vmodslist: + IDENTIFIER { vmod_add ($1); } +| vmodslist ',' IDENTIFIER { vmod_add ($3) } +; + +/* Virtual modifiers must be declared before they can be used. */ +vmods_def: + "virtualmods" vmodslist ';' +; + +/* Return the number of the virtual modifier. */ +vmod: + IDENTIFIER { $$ = vmod_find ($1); } +; + +/* A single realmodifier. */ +rmod: + "shift" { $$ = RMOD_SHIFT } +| "lock" { $$ = RMOD_LOCK } +| "control" { $$ = RMOD_CTRL } +| "mod1" { $$ = RMOD_MOD1 } +| "mod2" { $$ = RMOD_MOD2 } +| "mod3" { $$ = RMOD_MOD3 } +| "mod4" { $$ = RMOD_MOD4 } +| "mod5" { $$ = RMOD_MOD5 } +; + +/* One of more modifiers, seperated by '+'. A modmap_t will return all real + and virtual modifiers specified. */ +mods: + mods '+' rmod { $$.rmods = $1.rmods | $3; } +| mods '+' vmod { $$.vmods = $1.vmods | $3; } + /* Use a mid-rule action to start with no modifiers. */ +| { $$.rmods = 0; $$.vmods = 0 } rmod { $$.rmods = $2; } +| { $$.rmods = 0; $$.vmods = 0 } vmod { $$.vmods = $2; } +| "all" { $$.rmods = 0xFF; $$.vmods = 0xFFFF} +| "none" { $$.rmods = 0; $$.vmods = 0 } +; + +/* The numeric level starts with 0. Level1-Level4 returns 0-3, also + numeric values can be used to describe a level. */ +level: + LEVEL { $$ = $1 - 1 } +| "any" { $$ = 0 } +| NUM { $$ = $1 - 1 } +; + +/* A single keytype. */ +type: + /* Empty */ +| type MODS '=' mods ';' + { current_keytype->modmask = $4 } +| type MAP '[' mods ']' '=' level ';' + { keytype_mapadd (current_keytype, $4, $7) } +| type "level_name" '[' level ']' '=' STR ';' +| type "preserve" '[' mods ']' '=' mods ';' + { keytype_preserve_add (current_keytype, $4, $7) } +; + +/* Process the includes on the stack. */ +typesinclude: + '{' typessect '}' { close_include () } +| typesinclude '{' typessect '}' { close_include () } +; + +/* A keytype section contains keytypes and virtual modifier declarations. */ +typessect: + /* Empty */ +| typessect vmods_def +| typessect TYPE STR { keytype_new ($3, ¤t_keytype) }'{' type '}' ';' { } +| typessect include STR + { include_sections ($3, XKBTYPES, "types", $2) } + typesinclude +; + +/* The header of a compatibility section. */ +compat: + flags "xkb_compatibility" '{' compatsect '}' ';' +| flags "xkb_compatibility" STR '{' compatsect '}' ';' +; + +/* XXX: A symbol can be more than just an identifier (hex). */ +symbol: + IDENTIFIER { $$ = (int) XStringToKeysym ( $1) ? : -1; } +| ANY { $$ = 0 } +| error { yyerror ("Invalid symbol.") } +; + +/* Which kinds of modifiers (like base, locked, etc.) can affect the + indicator. */ +whichstate: + WHICHSTATE { $$ = $1 } +| "none" { $$ = 0 } +| "any" { $$ = 0xff } /* XXX */ +; + +/* The groups that can affect a indicator. */ +groups: + groups '+' group +| groups '-' group +| group {} +| "all" { $$ = 0xff } /* XXX */ +; + +indicators: +/* empty */ +| indicators indicator +; + +/* An indicator desciption. */ +indicator: + "mods" '=' mods ';' { current_indicator->modmap = $3 } +| "groups" '=' groups ';' { current_indicator->groups = $3 } +| "controls" '=' ctrls ';' +| "whichmodstate" '=' whichstate ';' { current_indicator->which_mods = $3 } +| "whichgroupstate" '=' whichstate ';' { current_indicator->which_mods = $3 } +| allowexplicit ';' {} /* Ignored for now. */ +| driveskbd ';' {} +| "index" '=' NUM ';' {} +; + +/* Boolean for allowexplicit. */ +allowexplicit: + '~' "allowexplicit" { $$ = 0 } +| '!' "allowexplicit" { $$ = 0 } +| "allowexplicit" { $$ = 1 } +| "allowexplicit" '=' BOOLEAN { $$ = $3 } +; + +/* Boolean for driveskbd. */ +driveskbd: + '~' "driveskbd" { $$ = 0 } +| '!' "driveskbd" { $$ = 0 } +| "driveskbd" { $$ = 1 } +| "driveskbd" '=' BOOLEAN { $$ = $3 } +; + +interprets: + /* Empty */ +| interprets interpret +; + +/* A single interpretation. */ +interpret: + "usemodmap" '=' level ';' + { current_interpretation->match &= 0x7F | ($3 << 7) } /* XXX */ +| repeat ';' + { + current_interpretation->flags &= ~(KEYREPEAT | KEYNOREPEAT); + current_interpretation->flags |= $1; + } +| locking ';' {} +| "virtualmod" '=' vmod ';' { current_interpretation->vmod = $3 } +| "action" '=' action ';' + { + memcpy (¤t_interpretation->action, $3, sizeof (xkb_action_t)); + free ($3); + } +; + +/* Process the includes on the stack. */ +compatinclude: + '{' compatsect '}' { close_include () } +| compatinclude '{' compatsect '}' { close_include () } +; + +/* The body of a compatibility section. */ +compatsect: + /* Empty */ +| compatsect vmods_def +| compatsect "interpret" '.' + { current_interpretation = &default_interpretation } + interpret +| compatsect "interpret" symbol + { + if ($3 != -1) + { + interpret_new (¤t_interpretation, $3); + current_interpretation->match |= 1; + } + } + '{' interprets '}' ';' +| compatsect "interpret" symbol '+' rmod + { + if ($3 != -1) + { + interpret_new (¤t_interpretation, $3); + current_interpretation->rmods = $5; + current_interpretation->match |= 4; + } + } + '{' interprets '}' ';' +| compatsect "interpret" symbol '+' "any" + { + if ($3 != -1) + { + interpret_new (¤t_interpretation, $3); + current_interpretation->rmods = 255; + current_interpretation->match |= 2; + } + } + '{' interprets '}' ';' +| compatsect "interpret" symbol '+' INTERPMATCH '(' mods ')' + { + if ($3 != -1) + { + interpret_new (¤t_interpretation, $3); + current_interpretation->rmods = $7.rmods; + current_interpretation->match |= $5; + } + } + '{' interprets '}' ';' +| compatsect GROUP NUM '=' mods ';' +| compatsect "indicator" STR '{' indicators '}' ';' +| compatsect include STR + { include_sections ($3, XKBCOMPAT, "compat", $2) } + compatinclude +| compatsect actiondef +| compatsect "indicator" '.' indicator +; + + + /* Booleans */ +/* Boolean for clearlocks. */ +clearlocks: + '~' "clearlocks" { $$ = 0 } +| '!' "clearlocks" { $$ = 0 } +| "clearlocks" { $$ = 1 } +| "clearlocks" '=' BOOLEAN { $$ = $3 } +; + +/* Boolean for latchtolock. */ +latchtolock: + '~' "latchtolock" { $$ = 0 } +| '!' "latchtolock" { $$ = 0 } +| "latchtolock" { $$ = 1 } +| "latchtolock" '=' BOOLEAN { $$ = $3 } +; + +/* Boolean for useModMap. */ +usemodmap: + '~' "usemodmap" { $$ = 0 } +| '!' "usemodmap" { $$ = 0 } +| "usemodmap" { $$ = 1 } +| "usemodmap" '=' BOOLEAN { $$ = $3 } +; + +/* Boolean for locking. */ +locking: + '~' "locking" { $$ = 0 } +| '!' "locking" { $$ = 0 } +| "locking" { $$ = 1 } +| "locking" '=' BOOLEAN { $$ = $3 } +; + +/* Boolean for repeat. */ +repeat: + '~' "repeat" { $$ = KEYNOREPEAT } +| '!' "repeat" { $$ = KEYNOREPEAT } +| "repeat" { $$ = KEYREPEAT } +| "repeat" '=' BOOLEAN + { + if ($3) + $$ = KEYREPEAT; + else + $$ = KEYNOREPEAT; + } +; + +/* Boolean for groupswrap. */ +groupswrap: + '~' "groupswrap" { $$ = 0 } +| '!' "groupswrap" { $$ = 0 } +| "groupswrap" { $$ = 1 } +| "groupswrap" '=' BOOLEAN { $$ = $3 } +; + +/* Boolean for groupsclamp. */ +groupsclamp: + '~' "groupsclamp" { $$ = 0 } +| '!' "groupsclamp" { $$ = 0 } +| "groupsclamp" { $$ = 1 } +| "groupsclamp" '=' BOOLEAN { $$ = $3 } +; + +/* Boolean for noaccel. */ +noaccel: + '~' "accel" { $$ = 0 } +| '!' "accel" { $$ = 0 } +| "accel" { $$ = 1 } +| "accel" '=' BOOLEAN { $$ = $3 } +; + + +sameserver: + '~' "sameserver" { $$ = 0 } +| '!' "sameserver" { $$ = 0 } +| "sameserver" { $$ = 1 } +| "sameserver" '=' BOOLEAN { $$ = $3 } +; + +setmodsparams: + /* empty */ +| setmodsparam +| setmodsparams ',' setmodsparam +; + + +/* Parameter for the (Set|Lock|Latch)Mods action. */ +setmodsparam: + "mods" '=' mods + { + ((action_setmods_t *) current_action)->modmap = $3; + } +| "mods" '=' "usemodmap" + { ((action_setmods_t *) current_action)->flags |= useModMap; + } +| clearlocks + { + ((action_setmods_t *) current_action)->flags &= ~clearLocks; + ((action_setmods_t *) current_action)->flags |= $1; + } +| usemodmap + { + ((action_setmods_t *) current_action)->flags &= ~useModMap; + ((action_setmods_t *) current_action)->flags |= $1; + } +| latchtolock + { + ((action_setmods_t *) current_action)->flags &= ~latchToLock; + ((action_setmods_t *) current_action)->flags |= $1; + } +; + +setgroupparams: +/* empty */ +| setgroupparam +| setgroupparams ',' setgroupparam +; + +/* Parameter for the (Set|Lock|Latch)Group action. */ +setgroupparam: + "group" '=' NUM + { + ((action_setgroup_t *) current_action)->group = $3; + ((action_setgroup_t *) current_action)->flags |= groupAbsolute; + } +| "group" '=' '+' NUM + { + ((action_setgroup_t *) current_action)->group = $4; + } +| "group" '=' '-' NUM + { + ((action_setgroup_t *) current_action)->group = -$4; + } +| clearlocks + { + ((action_setgroup_t *) current_action)->flags |= $1; + } +| latchtolock + { + ((action_setgroup_t *) current_action)->flags |= $1; + } +; + +moveptrparams: +/* empty */ +| moveptrparam +| moveptrparams ',' moveptrparam +; + +/* Parameters for the MovePtr action. */ +moveptrparam: + IDENTIFIER '=' NUM + { + ((action_moveptr_t *) current_action)->x = $3; + ((action_setgroup_t *) current_action)->flags |= MoveAbsoluteX; + } +| IDENTIFIER '=' '+' NUM + { + ((action_moveptr_t *) current_action)->x = $4; + } +| IDENTIFIER '=' '-' NUM + { + ((action_moveptr_t *) current_action)->x = -$4; + } +| noaccel + { + ((action_moveptr_t *) current_action)->flags |= NoAcceleration; + } +; + +/* A mouse button. */ +button: + NUM { $$ = $1 } +| BUTTONNUM { $$ = $1 } +| "default" { $$ = 0 } +; + +affectbtnlock: + "lock" +| "unlock" +| "both" +| "neither" +; + +ptrbtnparams: + /* empty */ +| ptrbtnparam +| ptrbtnparams ',' ptrbtnparam +; + +/* Parameters for the (Set|Lock|Latch)PtrBtn action. */ +ptrbtnparam: + "button" '=' button + { ((action_ptrbtn_t *) current_action)->button = $3; } +| "count" '=' NUM + { ((action_ptrbtn_t *) current_action)->count = $3; } +| "affect" '=' affectbtnlock + { + // ((action_ptrbtn_t *) $$)->a = $3; + } +; + +/* XXX: This should be extended. */ +affectbtns: + "defaultbutton" +| "button" +| "all" +; + +ptrdfltparams: +/* empty */ +| ptrdfltparam +| ptrdfltparams ',' ptrdfltparam +; + +/* Parameters for the SetPtrDflt action. */ +ptrdfltparam: + "button" '=' button { } +| "button" '=' '+' button { } +| "button" '=' '-' button { } +| "affect" '=' affectbtns { } +; + +/* A list of controlflags. */ +ctrls: + ctrls '+' CONTROLFLAG// { $$ |= $3 } +| CONTROLFLAG// { $$ = $1 } +| OVERLAY +; + +/* Modified controlflags. */ +ctrlflags: + ctrls { /*$$ = $1*/ } +| "all" { $$ = 0xFFFF } +| "none" { $$ = 0 } +; + +/* The parameters of a (Set|Lock|Latch)Ctrls Action. */ +ctrlparams: + "controls" '=' ctrlflags + { /* ((action_setcontrols_t *) $$)->controls = $3; */ } +; + +isoaffect: + "mods" +| "groups" +| "controls" +| "pointers" +| "all" +| "none" +; + +isolockparams: +/* empty */ +| isolockparam +| isolockparams ',' isolockparam +; + +/* Parameters for the ISOLock action. */ +isolockparam: + "mods" '=' mods +| "mods" '=' USEMODMAP +| "group" '=' group +| "controls" '=' ctrlflags +| "affect" '=' isoaffect +; + +switchscrnparams: + switchscrnparam + | switchscrnparams ',' switchscrnparam +; + +/* Parameters for the SwitchScreen action. */ +switchscrnparam: + "screen" '=' NUM + { + ((action_switchscrn_t *) current_action)->screen = $3; + ((action_switchscrn_t *) current_action)->flags |= screenAbs; + } +| "screen" '+' '=' NUM + { + ((action_switchscrn_t *) current_action)->screen = $4; + } +| "screen" '-' '=' NUM + { + ((action_switchscrn_t *) current_action)->screen = -$4; + } +| sameserver + { + /* XXX: Implement this. */ +/* ((action_switchscrn_t *) current_action)->flags &= ~0; */ +/* ((action_switchscrn_t *) current_action)->flags |= $1; */ + } +; + +consscrollparams: + consscrollparam + | consscrollparams ',' consscrollparam +; + +/* Parameters for the ConsScroll action. */ +consscrollparam: + "screen" '+' '=' FLOAT + { + ((action_consscroll_t *) current_action)->screen = $4; + } +| "screen" '-' '=' FLOAT + { + ((action_consscroll_t *) current_action)->screen = -$4; + } +| "line" '=' NUM + { + ((action_consscroll_t *) current_action)->line = $3; + ((action_consscroll_t *) current_action)->flags |= lineAbs; + } +| "line" '+' '=' NUM + { + ((action_consscroll_t *) current_action)->line = $4; + } +| "line" '-' '=' NUM + { + ((action_consscroll_t *) current_action)->line = -$4; + } +| "percent" '=' NUM + { + ((action_consscroll_t *) current_action)->percent = $3; + ((action_consscroll_t *) current_action)->flags |= usePercentage; + } +; + +privateparams: + /* empty */ + | privateparam + | privateparams ',' privateparam +; + +privateparam: + "type" '=' HEX + { + } +| "data" '=' STR + { + } +; + +/* An action definition. */ +action: + "setmods" + { + if (set_default_action (&default_setmods, ¤t_action)) + YYABORT; + } + '(' setmodsparams ')' { $$ = current_action } +| "latchmods" + { + if (set_default_action (&default_latchmods, ¤t_action)) + YYABORT; + } + '(' setmodsparams ')' { $$ = current_action } +| "lockmods" + { + if (set_default_action (&default_lockmods, ¤t_action)) + YYABORT; + } + '(' setmodsparams ')' { $$ = current_action } +| "setgroup" + { + if (set_default_action (&default_setgroup, ¤t_action)) + YYABORT; + } + '(' setgroupparams ')' { $$ = current_action } +| "latchgroup" + { + if (set_default_action (&default_latchgroup, ¤t_action)) + YYABORT; + } + '(' setgroupparams ')' { $$ = current_action } +| "lockgroup" + { + if (set_default_action (&default_lockgroup, ¤t_action)) + YYABORT; + } + '(' setgroupparams ')' { $$ = current_action } +| "moveptr" + { + if (set_default_action (&default_moveptr, ¤t_action)) + YYABORT; + } + '(' moveptrparams ')' { $$ = current_action } +| "ptrbtn" + { + if (set_default_action (&default_ptrbtn, ¤t_action)) + YYABORT; + } + '(' ptrbtnparams ')' { $$ = current_action } +| "lockptrbtn" + { + if (set_default_action (&default_lockptrbtn, ¤t_action)) + YYABORT; + } + '(' ptrbtnparams ')' { $$ = current_action } +| "setptrdflt" + { + if (set_default_action (&default_ptrdflt, ¤t_action)) + YYABORT; + } + '(' ptrdfltparams ')' { $$ = current_action } +| "setcontrols" + { + if (set_default_action (&default_setcontrols, ¤t_action)) + YYABORT; + } + '(' ctrlparams ')' { $$ = current_action } +| "lockcontrols" + { + if (set_default_action (&default_lockcontrols, ¤t_action)) + YYABORT; + } + '(' ctrlparams ')' { $$ = current_action } +| "terminate" '(' ')' + { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_TerminateServer } +| "switchscreen" + { + if (set_default_action (&default_switchscrn, ¤t_action)) + YYABORT; + } +'(' switchscrnparams ')' { $$ = current_action } +| "consscroll" + { + if (set_default_action (&default_consscroll, ¤t_action)) + YYABORT; + } + '(' consscrollparams ')' { $$ = current_action } +| "isolock" + { + if (set_default_action (&default_isolock, ¤t_action)) + YYABORT; + } + '(' isolockparams ')' { $$ = current_action } +| "private" '(' privateparams ')' + { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_NoAction } +| "noaction" '(' ')' + { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_NoAction } +| error ')' { yyerror ("Invalid action\n") } +; + +/* Define values for default actions. */ +actiondef: + "setmods" '.' { current_action = &default_setmods } setmodsparam ';' +| "latchmods" '.' { current_action = &default_latchmods } setmodsparam ';' +| "lockmods" '.' { current_action = &default_lockmods } setmodsparam ';' +| "setgroup" '.' { current_action = &default_setgroup } setgroupparam ';' +| "latchgroup" '.' { current_action = &default_latchgroup } setgroupparam ';' +| "lockgroup" '.' { current_action = &default_lockgroup } setgroupparam ';' +| "moveptr" '.' { current_action = &default_moveptr } moveptrparam ';' +| "ptrbtn" '.' { current_action = &default_ptrbtn } ptrbtnparam ';' +| "lockptrbtn" '.' { current_action = &default_lockptrbtn } ptrbtnparam ';' +| "setptrdflt" '.' { current_action = &default_ptrdflt } ptrdfltparam ';' +| "setcontrols" '.' { current_action = &default_setcontrols } ctrlparams ';' +| "lockcontrols" '.' { current_action = &default_lockcontrols } ctrlparams ';' +| "isolock" '.' { current_action = &default_isolock } isolockparam ';' +| "switchscreen" '.' { current_action = &default_switchscrn } switchscrnparam ';' +; + +/* The header of a symbols section. */ +symbols: + flags "xkb_symbols" '{' symbolssect '}' ';' +| flags "xkb_symbols" STR '{' symbolssect '}' ';' +; + +/* A group. */ +group: + GROUPNUM { $$ = $1 - 1 } +| NUM { $$ = $1 - 1} +| HEX { $$ = $1 - 1} +; + +/* A list of keysyms and keycodes bound to a realmodifier. */ +key_list: + key_list ',' KEYCODE { set_rmod_keycode ($3, current_rmod) } +| key_list ',' symbolname { ksrm_add ($3, current_rmod) } +| KEYCODE { set_rmod_keycode ($1, current_rmod) } +| symbolname { ksrm_add ($1, current_rmod) } +; + +/* Process the includes on the stack. */ +symbolinclude: + '{' symbolssect '}' { close_include () } +| symbolinclude '{' symbolssect '}' { close_include () } +; + +/* A XKB symbol section. It is used to bind keysymbols, actions and + realmodifiers to keycodes. */ +symbolssect: + /* Empty */ +| symbolssect vmods_def +| symbolssect NAME '[' group ']' '=' STR ';' +| symbolssect "key" KEYCODE + { + key_new ($3); + current_group = 0; + } '{' keydescs '}' ';' +| symbolssect "replace" "key" KEYCODE + { + key_delete ($4); + key_new ($4); + current_group = 0; + } '{' keydescs '}' ';' +| symbolssect "override" "key" KEYCODE + { + key_delete ($4); + key_new ($4); + current_group = 0; + } '{' keydescs '}' ';' +| symbolssect "modifier_map" rmod { current_rmod = $3 } '{' key_list '}' ';' +| symbolssect include STR + { include_sections ($3, XKBSYMBOLS, "symbols", $2) } + symbolinclude +| symbolssect actiondef +| symbolssect "key" '.' {current_key = default_key } keydesc ';' +| symbolssect error ';' { yyerror ("Error in symbol section\n") } +; + +/* Returns a keysymbols, the numberic representation. */ +symbolname: + IDENTIFIER { $$ = XStringToKeysym ($1); } +| NUM { $$ = $1 + '0' } +; + +/* None or more keysyms, assigned to a single group of the current + key. */ +groupsyms: + /* empty */ +| groupsyms ',' symbolname + { key_set_keysym (current_key, current_group, symbolcnt++, $3) } +| { symbolcnt = 0 } symbolname + { + symbolcnt = 0; + key_set_keysym (current_key, current_group, symbolcnt++, $2); + } +; + +/* A list of actions. */ +actions: + actions ',' action + { key_set_action (current_key, current_group, actioncnt++, $3) } +| { actioncnt = 0 } action + { key_set_action ( current_key, current_group, actioncnt++, $2) } +; + +keydescs: + keydesc +| keydescs ',' keydesc +; + +/* A single key and everything assigned to it. */ +keydesc: + "type" '[' group ']' '=' STR + { + current_key->groups[$3].keytype = keytype_find ($6); + } +| "type" '[' error ']' { yyerror ("Invalid group.\n") } +| "type" '=' STR + { current_key->groups[current_group].keytype = keytype_find ($3) } +| { symbolcnt = 0 } "symbols" '[' group ']' { current_group = $4 } '=' '[' groupsyms ']' + { + current_key->numgroups = ($4 + 1) > current_key->numgroups ? + ($4 + 1) : current_key->numgroups; + } +| {actioncnt = 0 } "actions" '[' group ']' { current_group = $4 } '=' '[' actions ']' + { + current_key->numgroups = ($4 + 1) > current_key->numgroups ? + ($4 + 1) : current_key->numgroups; + } +| "virtualmods" '=' mods + { current_key->mods.vmods = $3.vmods } +| '[' groupsyms ']' + { + current_group++; + current_key->numgroups = current_group > current_key->numgroups ? + current_group : current_key->numgroups; + } +| '[' actions ']' + { + current_group++; + current_key->numgroups = current_group > current_key->numgroups ? + current_group : current_key->numgroups; + } +| locking {}/* This is not implemented - YET. */ +/* XXX: There 3 features are described in Ivan Pascals docs about XKB, + but aren't used in the standard keymaps and cannot be used because it + cannot be stored in the XKM dataformat. */ +| groupswrap {} +| groupsclamp {} +| "groupsredirect" '=' NUM +| "overlay" '=' KEYCODE /* If you _REALLY_ need overlays, mail me!!!! */ +| repeat + { + current_key->flags &= ~(KEYREPEAT | KEYNOREPEAT); + current_key->flags |= $1; + } +; + +/* The geometry map is ignored. */ + +/* The header of a geometry section. */ +geometry: + flags "xkb_geometry" '{' { skipsection () } '}' ';' +| flags "xkb_geometry" STR '{' { skipsection () } '}' ';' +; + +%% +/* Skip all tokens until a section of the type SECTIONSYMBOL with the + name SECTIONNAME is found. */ +static void +skip_to_sectionname (char *sectionname, int sectionsymbol) +{ + int symbol; + + do + { + do + { + symbol = yylex (); + } while (symbol != sectionsymbol); + symbol = yylex (); + + if (symbol != STR) + continue; + + } while (strcmp (yylval.str, sectionname)); +} + +/* Skip all tokens until the default section is found. */ +static void +skip_to_defaultsection (void) +{ + int symbol; + + /* Search the default section. */ + do + { + symbol = yylex (); + } while (symbol != DEFAULT); + + do + { + symbol = yylex (); + } while (symbol != '{'); + scanner_unput ('{'); +} + +/* Include a single file. INCL is the filename. SECTIONSYMBOL is the + token that marks the beginning of the section. DIRNAME is the name + of the directory from where the includefiles must be loaded. NEW_MM + is the mergemode that should be used. */ +static error_t +include_section (char *incl, int sectionsymbol, char *dirname, + mergemode new_mm) +{ + void include_file (FILE *, mergemode, char *); + char *filename; + char *sectionname = NULL; + FILE *includefile; + + sectionname = strchr (incl, '('); + if (sectionname) + { + int snlen; + + snlen = strlen (sectionname); + if (sectionname[snlen-1] != ')') + return 0; + sectionname[snlen-1] = '\0'; + sectionname[0] = '\0'; + sectionname++; + + if (asprintf (&filename, "%s/%s", dirname, incl) < 0) + return ENOMEM; + } + else + { + if (asprintf (&filename, "%s/%s", dirname, incl) < 0) + return ENOMEM; + } + + includefile = fopen (strdup (filename), "r"); + + if (includefile == NULL) + { + fprintf (stderr, "Couldn't open include file \"%s\"\n", filename); + exit (EXIT_FAILURE); + } + + include_file (includefile, new_mm, strdup (filename)); + + /* If there is a sectionname not the entire file should be included, + the scanner should be positioned at the required section. */ + if (sectionname) + skip_to_sectionname (sectionname, sectionsymbol); + else + skip_to_defaultsection (); + + return 0; +} + +/* Include multiple file sections, seperated by '+'. INCL is the + include string. SECTIONSYMBOL is the token that marks the beginning + of the section. DIRNAME is the name of the directory from where the + includefiles must be loaded. NEW_MM is the mergemode that should be + used. */ +static error_t +include_sections (char *incl, int sectionsymbol, char *dirname, + mergemode new_mm) +{ + char *curstr; + char *s; + + if (new_mm == defaultmm) + new_mm = merge_mode; + +/* printf ("dir: %s - include: %s: %d\n", dirname, incl, new_mm); */ + /* Cut of all includes, starting with the first. The includes are + pushed on the stack in reversed order. */ + do { + curstr = strrchr (incl, '+'); + if (curstr) + { + curstr[0] = '\0'; + curstr++; + + s = strdup (curstr); + if (s == NULL) + return ENOMEM; + + include_section (s, sectionsymbol, dirname, new_mm); + free (s); + } + } while (curstr); + + s = strdup (incl); + if (s == NULL) + return ENOMEM; + + include_section (s, sectionsymbol, dirname, new_mm); + free (s); + + return 0; +} + +/* Skip all tokens until the end of the section is reached. */ +static void +skipsection (void) +{ + /* Pathesensis counter. */ + int p = 0; + while (p >= 0) + { + int symbol = yylex (); + if (symbol == '{') + p++; + if (symbol == '}') + p--; + } + scanner_unput ('}'); +} + +/* Initialize the default action with the default DEF. */ +static error_t +set_default_action (struct xkb_action *def, + struct xkb_action **newact) +{ + struct xkb_action *newaction; + newaction = malloc (sizeof (struct xkb_action)); + if (newaction == NULL) + return ENOMEM; + memcpy (newaction, def, sizeof (struct xkb_action)); + + *newact = newaction; + + return 0; +} + +/* Remove all keysyms bound to the group GROUP or the key KEY. */ +static void +remove_symbols (struct key *key, group_t group) +{ + // printf ("rem: group: %d\n", group); + if (key->groups[group].symbols) + { + free (key->groups[group].symbols); + key->groups[group].symbols = NULL; + key->groups[group].width = 0; + } +} + +/* Set the keysym KS for key KEY on group GROUP and level LEVEL. */ +static void +key_set_keysym (struct key *key, group_t group, int level, symbol ks) +{ + symbol *keysyms = key->groups[group].symbols; + + if ((level + 1) > key->groups[group].width) + { + keysyms = realloc (keysyms, level + 1); + + if (!keys) + { + fprintf (stderr, "No mem\n"); + exit (EXIT_FAILURE); + } + + key->groups[group].symbols = keysyms; + key->groups[group].width++; + } + else + /* For NoSymbol leave the old symbol intact. */ + if (!ks) + return; + + + keysyms[level++] = ks; +} + +/* Set the action ACTION for key KEY on group GROUP and level LEVEL. */ +void +key_set_action (struct key *key, group_t group, int level, xkb_action_t *action) +{ + xkb_action_t **actions = key->groups[group].actions; + size_t width = key->groups[group].actionwidth; + + if ((size_t) (level + 1) > width) + { + actions = realloc (actions, level + 1); + /* Previous levels have no actions defined. */ + memset (&actions[level - 1], 0, level - width); + + if (!keys) + { + fprintf (stderr, "No mem\n"); + exit (EXIT_FAILURE); + } + + key->groups[group].actions = actions; + key->groups[group].actionwidth += level - width + 1; + } + + actions[level++] = action; +} + +/* Delete keycode to keysym mapping. */ +void +key_delete (char *keyname) +{ + group_t group; + keycode_t kc = keyname_find (keyname); + + current_key = &keys[kc]; + for (group = 0; group < current_key->numgroups; group++) + remove_symbols (current_key, group); + memset (current_key, 0, sizeof (struct key)); + +} + +/* Create a new keycode to keysym mapping, check if the old one should + be removed or preserved. */ +static void +key_new (char *keyname) +{ + group_t group; + + int isempty (char *mem, int size) + { + int i; + for (i = 0; i < size; i++) + if (mem[i]) + return 0; + return 1; + } + + keycode_t kc = keyname_find (keyname); + + if (merge_mode == augment) + { + if (!isempty ((char *) &keys[kc], sizeof (struct key))) + { + current_key = &dummy_key; + return; + } + else + current_key = &keys[kc]; + } + + if (merge_mode == override) + current_key = &keys[kc]; + + if (merge_mode == replace) + { + key_delete (keyname); + current_key = &keys[kc]; + } + + if (current_key->numgroups == 0 || merge_mode == replace) + { + /* Clone the default key. */ + memcpy (current_key, default_key, sizeof (struct key)); + for (group = 0; group < 3; group++) + { + current_key->groups[group].symbols = NULL; + current_key->groups[group].actions = NULL; + current_key->groups[group].actionwidth = 0; + current_key->groups[group].width = 0; + } + } +} + +/* Load the XKB configuration from the section XKBKEYMAP in the + keymapfile XKBKEYMAPFILE. Use XKBDIR as root directory for relative + pathnames. */ +error_t +parse_xkbconfig (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap) +{ + error_t err; + char *cwd = getcwd (NULL, 0); + extern FILE *yyin; + extern char *filename; + + // xkbkeymap = 0; + + // xkbkeymapfile = 0; + + // xkbdir = "/etc/X11/xkb"; + // xkbdir ="/home/marco/xkb"; + // xkbkeymapfile = "keymap/hurd"; + // xkbkeymap = "hack"; + + debug_printf ("Dir: %s, file: %s sect: %s\n", xkbdir, xkbkeymapfile, xkbkeymap); + + // xkbkeymapfile = "default.xkb"; + //xkbkeymap = "us"; + // yydebug = 1; + if (xkbkeymapfile) + { + filename = xkbkeymapfile; + + if (chdir (xkbdir) == -1) + { + fprintf (stderr, "Could not set \"%s\" as the active directory\n", + xkbdir); + return errno; + } + + yyin = fopen (xkbkeymapfile, "r"); + if (yyin == NULL) + { + fprintf (stderr, "Couldn't open keymap file\n"); + return errno; + } + + if (xkbkeymap) + skip_to_sectionname (xkbkeymap, XKBKEYMAP); + } + else /* Use defaults. */ + { + extern char *default_xkb_keymap; + filename = "<<INTERNAL>>"; + + yyin = tmpfile (); + //yyin = fopen ("TEST", "w+"); + + if (yyin == NULL) + { + fprintf (stderr, "Couldn't create tmp file.\n"); + return errno; + } + /* XXX: error handling. */ + fprintf (yyin, "%s\n", default_xkb_keymap); + + rewind (yyin); + } + err = yyparse (); + fclose (yyin); + + if (err || yynerrs > 0) + return EINVAL; + + if (xkbkeymapfile) + { + if (chdir (cwd) == -1) + { + fprintf (stderr, + "Could not set \"%s\" as the active directory\n", cwd); + return errno; + } + } + + /* Apply keysym to realmodifier mappings. */ + ksrm_apply (); + + free (cwd); + return 0; +} diff --git a/console-client/xkb/symname.c b/console-client/xkb/symname.c new file mode 100644 index 00000000..9f219513 --- /dev/null +++ b/console-client/xkb/symname.c @@ -0,0 +1,96 @@ +#include <string.h> +#define NEEDKTABLE +#include "ks_tables.h" +#include "keysymdef.h" + +#define NoSymbol 0 + +typedef unsigned long Signature; +typedef unsigned long KeySym; + +KeySym XStringToKeysym(char *s) +{ + register int i, n; + int h; + register Signature sig = 0; + register const char *p = s; + register int c; + register int idx; + const unsigned char *entry; + unsigned char sig1, sig2; + KeySym val; + + while ((c = *p++)) + sig = (sig << 1) + c; + i = sig % KTABLESIZE; + h = i + 1; + sig1 = (sig >> 8) & 0xff; + sig2 = sig & 0xff; + n = KMAXHASH; + while ((idx = hashString[i])) + { + entry = &_XkeyTable[idx]; + if ((entry[0] == sig1) && (entry[1] == sig2) && + !strcmp(s, (char *)entry + 4)) + { + val = (entry[2] << 8) | entry[3]; + if (!val) + val = XK_VoidSymbol; + return val; + } + if (!--n) + break; + i += h; + if (i >= KTABLESIZE) + + i -= KTABLESIZE; + } + + /* + + The KeysymDB is not yet supported. + + if (!initialized) + (void)_XInitKeysymDB(); + if (keysymdb) + { + XrmValue result; + XrmRepresentation from_type; + char c; + XrmQuark names[2]; + + names[0] = _XrmInternalStringToQuark(s, p - s - 1, sig, False); + names[1] = NULLQUARK; + (void)XrmQGetResource(keysymdb, names, Qkeysym, &from_type, &result); + if (result.addr && (result.size > 1)) + { + val = 0; + for (i = 0; i < result.size - 1; i++) + { + c = ((char *)result.addr)[i]; + if ('0' <= c && c <= '9') val = (val<<4)+c-'0'; + else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10; + else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10; + else return NoSymbol; + } + return val; + } + } + */ + + if (*s == 'U') { + val = 0; + for (p = &s[1]; *p; p++) { + c = *p; + if ('0' <= c && c <= '9') val = (val<<4)+c-'0'; + else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10; + else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10; + else return NoSymbol; + + } + if (val >= 0x01000000) + return NoSymbol; + return val | 0x01000000; + } + return (NoSymbol); +} diff --git a/console-client/xkb/xkb-data/keymap/hurd b/console-client/xkb/xkb-data/keymap/hurd new file mode 100644 index 00000000..c49bb382 --- /dev/null +++ b/console-client/xkb/xkb-data/keymap/hurd @@ -0,0 +1,347 @@ +// $Xorg: xfree86,v 1.3 2000/08/17 19:54:40 cpqbld Exp $ + + + + +// $XFree86: xc/programs/xkbcomp/keymap/xfree86,v 3.26 2002/01/16 18:20:11 dawes Exp $ + +xkb_keymap "Hurd" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default+hurd" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+hurd+pc104+group(win_switch)+compose(menu)" }; + xkb_geometry { include "pc" }; +}; +xkb_keymap "us" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default+hurd" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "us(pc105)+hurd" }; + xkb_geometry { include "pc" }; +}; +xkb_keymap "us_microsoft" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "us(pc105)" }; + xkb_geometry { include "microsoft" }; +}; +xkb_keymap "us_flexpro" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "us(pc105)" }; + xkb_geometry { include "keytronic(FlexPro)" }; +}; +xkb_keymap "en_US" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default+hurd" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+hurd" }; + xkb_geometry { include "pc" }; +}; +xkb_keymap "be" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+be" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "bg" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+bg" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "de" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+de" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "dk" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+dk" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "dvorak" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+dvorak" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "es" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+es" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "fr" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+fr" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "fr_CA" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+ca" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "gb" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+gb" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "hr" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+hr" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "it" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+it" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "lt" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+lt" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "lt_std" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+lt_std" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "lv" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+lv" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "mk" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+mk" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "mt" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+mt" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "mt_us" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+mt_us" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "no" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+no" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "pl" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+pl" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "pt" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+pt" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "ru" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+ru" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "se_FI" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+fi" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "se_SE" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+se" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "th" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+th" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "de_CH" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+de_CH" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "fr_CH" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+fr_CH" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "jp106" { + xkb_keycodes { include "xfree86(jp106)" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "jp(jp106)" }; + xkb_geometry { include "pc(jp106)" }; +}; + +// Additions by Eric Moreau, 1998-09-27 +// I am reachable at eric_moreau@compuserve.com + +xkb_keymap "fr_CA_sundeadkeys" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc102)+ca_enhanced(sundeadkeys)+us_group3(basic)+group(ctrl_shift_toggle)+ralt(mode_switch)" }; + xkb_geometry { include "pc(pc102)" }; +}; + +xkb_keymap "fr_CA" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc102)+ca_enhanced(basic)+us_group3(basic)+group(ctrl_shift_toggle)+ralt(mode_switch)" }; + xkb_geometry { include "pc(pc102)" }; +}; + +// us_intl and br by Ricardo Y. Igarashi (iga@that.com.br) +// us_intl means standard us keyboard plus dead_keys symbols +// these keyboards are very popular in Brazil + +xkb_keymap "us_intl" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "us(pc101)+us_intl" }; + xkb_geometry { include "pc" }; +}; +xkb_keymap "br" { + xkb_keycodes { include "xfree86(abnt2)" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "us(pc101)+br" }; + xkb_geometry { include "pc(abnt2)" }; +}; + +// cz and sk keymaps by Kamil Toman (ktoman@email.cz) +// are designed to replace old czechoslovakian and czsk keyboards +// and their prog variants. Those are now obsolete and should not be used anymore. +xkb_keymap "cz" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+cz" }; + xkb_geometry { include "pc" }; +}; +xkb_keymap "cz_qwerty" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+cz_qwerty" }; + xkb_geometry { include "pc" }; +}; +xkb_keymap "sk" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+sk" }; + xkb_geometry { include "pc" }; +}; +xkb_keymap "sk_qwerty" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+sk_qwerty" }; + xkb_geometry { include "pc" }; +}; + +xkb_keymap "sl" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+si" }; + xkb_geometry { include "pc(pc102)" }; +}; +xkb_keymap "sl_SI" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+si" }; + xkb_geometry { include "pc(pc102)" }; +}; + +// Additions by Cristian Gafton, <gafton@redhat.com> +xkb_keymap "ro" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc101)+ro(pc101)" }; + xkb_geometry { include "pc(pc101)" }; +}; +xkb_keymap "ro_microsoft" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+ro(pc105)" }; + xkb_geometry { include "pc(pc105)" }; +}; +xkb_keymap "tr" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+tr" }; + xkb_geometry { include "pc(pc102)" }; +}; +// Additions by Arabeyes Team, <support@arabeyes.org> +xkb_keymap "ar" { + xkb_keycodes { include "xfree86" }; + xkb_types { include "default" }; + xkb_compatibility { include "default" }; + xkb_symbols { include "en_US(pc105)+ar" }; + xkb_geometry { include "pc(pc102)" }; +}; diff --git a/console-client/xkb/xkb-data/symbols/hurd b/console-client/xkb/xkb-data/symbols/hurd new file mode 100644 index 00000000..39edf2ae --- /dev/null +++ b/console-client/xkb/xkb-data/symbols/hurd @@ -0,0 +1,125 @@ +// -*- Mode: C -*- +default +xkb_symbols "hurd" { + /* Switch to local consoles by default. */ + // SwitchScreen.SameServer; + + /* Make F1 - F10 switch virtual consoles when Alt is held down. */ + key <FK01> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 1), + NoAction () ] + }; + key <FK02> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 2), + NoAction () ] + }; + key <FK03> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 3), + NoAction () ] + }; + key <FK04> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 4), + NoAction () ] + }; + key <FK05> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 5), + NoAction () ] + }; + key <FK06> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 6), + NoAction () ] + }; + key <FK07> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 7), + NoAction () ] + }; + key <FK08> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 8), + NoAction () ] + }; + key <FK09> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 9), + NoAction () ] + }; + key <FK10> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction () , SwitchScreen (screen = 10), + NoAction () ] + }; + + // Make the left and right cursor keys switch virtual consoles when + // Alt is held down. + key <LEFT> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), SwitchScreen (screen -= 1), + NoAction () ] + }; + key <RGHT> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), SwitchScreen (screen += 1), + NoAction () ] + }; + + // Scroll the console up or down (one line). + key <UP> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), ConsScroll (line -= 1) ] + }; + key <DOWN> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), ConsScroll (line += 1) ] + }; + + // Scroll the console up or down (1/2 screen). + key <PGUP> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), NoAction (), + ConsScroll (screen -= 0.5) ] + }; + key <PGDN> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), NoAction (), + ConsScroll (screen += 0.5) ] + }; + + // Scroll the console to 0%, 25%, 75% or 100%. + key <HOME> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), + ConsScroll (percentage = 0), + ConsScroll (percentage = 25) ] + }; + key <END> + { + type[Group1] = "HURD", + actions[Group1] = [ NoAction (), + ConsScroll (percentage = 100), + ConsScroll (percentage = 75) ] + }; +}; diff --git a/console-client/xkb/xkb-data/types/hurd b/console-client/xkb/xkb-data/types/hurd new file mode 100644 index 00000000..e6c7aa0c --- /dev/null +++ b/console-client/xkb/xkb-data/types/hurd @@ -0,0 +1,18 @@ +// -*- Mode: C -*- + +default xkb_types "hurd" { + virtual_modifiers Alt; + + type "HURD" + { + modifiers = Shift + Alt + Control; + map[Alt] = Level2; + map[Shift] = Level3; + map[Control] = Level4; + level_name[Level1] = "Base"; + level_name[Level2] = "Hurd console"; + level_name[Level3] = "Hurd console2"; + level_name[Level4] = "Hurd console3"; + }; +}; + diff --git a/console-client/xkb/xkb.c b/console-client/xkb/xkb.c new file mode 100644 index 00000000..5844ac60 --- /dev/null +++ b/console-client/xkb/xkb.c @@ -0,0 +1,1859 @@ +/* xkb.c -- Main XKB routines. + + Copyright (C) 2002, 2003, 2004 Marco Gerards + + Written by Marco Gerards <metgerards@student.han.nl> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include <fcntl.h> +#include <string.h> +#include <stdio.h> +#include <errno.h> +#include <ctype.h> +#include <stdlib.h> +#include <iconv.h> +#include <locale.h> +#include <error.h> +#include <device/device.h> +#include <mach/mach_port.h> + +#include "xkb.h" +#include <hurd/console.h> +#define XK_XKB_KEYS +#define XK_MISCELLANY +#include "keysymdef.h" +#include "driver.h" +#include "inputdev.h" + + +/* The keyboard device in the kernel. */ +static device_t kbd_dev; + +/* True if we are in the GNU Mach v1 compatibility mode. */ +int gnumach_v1_compat; + + +#define NoSymbol 0 + + /* The converter. */ + static iconv_t cd; + +/* All interpretations for compatibility. (Translation from keysymbol + to actions). */ +xkb_interpret_t *interpretations; + +/* All keysymbols and how they are handled by XKB. */ +struct key *keys = NULL; +int min_keys; +int max_keys; + +/* The current set of modifiers. */ +static modmap_t bmods; +/* Temporary set of modifiers. This is a copy of mods, so mods won't + be consumed (Effective modifiers). */ +static modmap_t emods; + +/* Effective group. */ +static group_t egroup; +/* Base group. */ +static group_t bgroup; +/* Locked group. */ +static group_t lgroup; +/* Latched group. */ +static group_t latchedgroup; + +static boolctrls bboolctrls; + +/* A counter to count how often the modifier was set. This is used + when two seperate actions set the same modifier. (example: Left + Shift and Right Shift.). */ +modcount_t modsc; + +keystate_t keystate[255]; + +/* The locked modifiers. Lock simply works an an invertion. */ +static modmap_t lmods = {0, 0}; + +/* When the modifier is used the modifier will be consumed. */ +static modmap_t latchedmods = {0, 0}; + +/* Not setting GroupsWrap uses modulus to keep the value into the + range. */ +static int GroupsWrap = 0; + +/* MouseKeys, default: off. */ +static int MouseKeys = 0; +/* Default mousebutton. */ +static int default_button = 0; + +static xkb_indicator_t *indicators; +static int indicator_count; +static int indicator_map = 0; + +static int stickykeys_active = 1; + +/* The name of the repeater node. */ +static char *repeater_node; + +/* The repeater node. */ +static consnode_t cnode; + +int +debug_printf (const char *f, ...) +{ + va_list ap; + int ret; + + va_start (ap, f); +#ifdef XKB_DEBUG + ret = printf (f, ap); +#endif + va_end (ap); + + return ret; +} + +static scancode_t +gnumach_v1_input_next () +{ + kd_event data_buf; + scancode_t sc; + + do + { + /* io_buf_ptr_t is (char *), not (void *). So I have a few + casts to quiet warnings. */ + mach_msg_type_number_t data_cnt = sizeof (data_buf); + error_t err = device_read_inband (kbd_dev, 0, -1, sizeof (kd_event), + (void *) &data_buf, &data_cnt); + + if (kbd_repeater_opened && data_buf.type == KEYBD_EVENT) + { + kbd_repeat_key (&data_buf); + data_buf.type = 0; + continue; + } + + /* XXX The error occured likely because KBD_DEV was closed, so + terminate. */ + if (err) + return 0; + } + while (data_buf.type != KEYBD_EVENT); + + sc = data_buf.value.sc; + return sc; +} + + +scancode_t +read_scancode (void) +{ + scancode_t sc = 0; + unsigned char next; + kd_event data_buf; + + /* GNU Mach v1 does provide keyboard input in a different format. */ + if (gnumach_v1_compat) + { + int scan = gnumach_v1_input_next (); + return scan; + } + + /* XXX This should read several characters at once. */ + do + { + /* io_buf_ptr_t is (char *), not (void *). So I have a few + casts to quiet warnings. */ + mach_msg_type_number_t data_cnt = sizeof (data_buf); + + error_t err = device_read_inband (kbd_dev, 0, -1, sizeof (kd_event), + (void *) &data_buf, &data_cnt); + + if (kbd_repeater_opened && data_buf.type == KEYBD_EVENT) + { + kbd_repeat_key (&data_buf); + data_buf.type = 0; + continue; + } + + next = data_buf.value.sc; + /* XXX The error occured likely because KBD_DEV was closed, so + terminate. */ + if (err) + return 0; + + } + while (next == 0xF0); /* XXX Magic constant. */ + + sc |= next; + return sc; +} + +/* Read a keycode using the read_scancode routine. The translation from + scancodes is hardcoded. A configuration file should be used in the + near future because this is an UGLY HACK. */ +keycode_t +read_keycode (void) +{ + scancode_t sc = read_scancode (); + int release = 0; + + + /* The keypress generated two keycodes. */ + if (sc == 0xE0) + { + sc = read_scancode (); + + release = sc & 0x80; + sc &= ~0x80; + + switch (sc) + { + case 0x1D: /* RCTRL. */ + sc = 101; + break; + case 0x38: /* RALT. */ + sc = 105; + break; + /* LRGUI MENU. */ + case 0x5B: /* LGUI. */ + sc = 107; + break; + case 0x5C: /* RGUI. */ + sc = 108; + break; + case 0x5D: /* MENU. */ + sc = 109; + break; + case 0x52: /* Insert. */ + sc = 98; + break; + case 0x47: /* Home. */ + sc = 89; + break; + case 0x49: /* Pg Up. */ + sc = 91; + break; + case 0x53: /* Delete. */ + sc = 99; + break; + case 0x4F: /* End. */ + sc = 95; + break; + case 0x51: /* Pg Down. */ + sc = 97; + break; + case 0x48: /* Arrow up. */ + sc = 90; + break; + case 0x50: /* Arrow down. */ + sc = 96; + break; + case 0x4b: /* Arrow left. */ + sc = 92; + break; + case 0x4d: /* Arrow right. */ + sc = 94; + break; + case 0x35: /* '/' */ + sc = 104; + break; + case 0x1C: /* KP_Enter. */ + sc = 100; + break; + default: + sc += 0x78; + } + + sc |= release; + } + else + release = sc & 0x80; + + return sc; +} + + +static void +interpret_kc (keycode_t kc) +{ + int cursym; + int rmods = keys[kc].mods.rmods; + struct xkb_interpret *interp; + + for (interp = interpretations; interp; interp = interp->next) + { + group_t group; + + for (group = 0; group < keys[kc].numgroups; group++) + { + int width = keys[kc].groups[group].width; + + for (cursym = 0; cursym < width; cursym++) + { + int symbol = keys[kc].groups[group].symbols[cursym]; + + /* Check if a keysymbol requirement exists or if it + matches. */ + if (interp->symbol == 0 || + (symbol && (interp->symbol == symbol))) + { + int flags = interp->match & 0x7f; + + /* XXX: use enum. */ + if ((flags == 0 && (!(interp->rmods & rmods))) || + (flags == 1) || + (flags == 2 && (interp->rmods & rmods)) || + (flags == 3 && ((interp->rmods & rmods) == + interp->rmods)) || + (flags == 4 && interp->rmods == rmods)) + { + xkb_action_t *action; + + if (keys[kc].groups[group].actionwidth > cursym && + keys[kc].groups[group].actions[cursym] && + keys[kc].groups[group].actions[cursym]->type != + SA_NoAction) + continue; + +/* if (action->type == 13) */ +/* printf ("AA %d AAAAAAAAAAAAAAA %d: %d - %d\n", kc, flags, symbol, interp->symbol); */ + + action = malloc (sizeof (xkb_action_t)); + memcpy (action, &interp->action, sizeof (xkb_action_t)); + + key_set_action (&keys[kc], group, cursym, action); + + keys[kc].flags = interp->flags | KEYHASACTION; + if (!keys[kc].mods.vmods) + keys[kc].mods.vmods = interp->vmod; + } + } + } + } + } + +} + + +/* Test if c is an uppercase letter. */ +static int islatin_upper (int c) +{ + return (c >= 'A' && c <= 'Z'); +} + +/* Test if c is an lowercase letter. */ +static int islatin_lower (int c) +{ + return (c >= 'a' && c <= 'z'); +} + +/* A key is of the keytype KEYPAD when one of the symbols that can be produced + by this key is in the KEYPAD symbol range. */ +static int +iskeypad (int width, int *sym) +{ + int i; + + for (i = 0; i <= width; i++, sym++) + { + /* Numlock is in the keypad range but shouldn't be of the type + keypad because it will depend on itself in that case. */ + if (*sym == XK_Num_Lock) + return 0; + if (*sym >= KEYPAD_FIRST_KEY && *sym <= KEYPAD_LAST_KEY) + return 1; + } + return 0; +} + +/* Get the keytype (the keytype determines which modifiers are used + for shifting. + + These rules are used: + + * If the width is 1 the keytype is ONE_LEVEL. + * If the first symbol is lowercase and the second is uppercase + (latin alphabeth) the keytype is ALPHABETHIC. + * If one of the symbols is in the keypad range the keytype is KEYPAD. + * Else the keytype is TWO_LEVEL. */ +static struct keytype * +get_keytype (int width, symbol *sym) +{ + struct keytype *ktfound; + + if (!width || !sym) + ktfound = keytype_find ("TWO_LEVEL"); + else if (iskeypad (width, sym)) + ktfound = keytype_find ("KEYPAD"); + else if (width == 1) + ktfound = keytype_find ("ONE_LEVEL"); + else if (width >= 2 && islatin_lower (sym[0]) && islatin_upper (sym[1])) + ktfound = keytype_find ("ALPHABETIC"); + else + ktfound = keytype_find ("TWO_LEVEL"); + + if (!ktfound) + ktfound = keytype_find ("TWO_LEVEL"); + if (!ktfound) + { + console_error (L"Default keytypes have not been defined!\n"); + exit (1); + } + + return ktfound; +} + +/* Create XKB style actions for every action described by keysymbols. */ +static void +interpret_all (void) +{ + keycode_t curkc; + + /* Check every key. */ + for (curkc = 0; curkc < max_keys; curkc++) + interpret_kc (curkc); +} + +static void +determine_keytypes (void) +{ + keycode_t curkc; + + /* Check every key. */ + for (curkc = 0; curkc < max_keys; curkc++) + { + group_t group; + for (group = 0; group < 4; group++) + { + struct keygroup *kg = &keys[curkc].groups[group]; + + if (!kg->keytype) + kg->keytype = get_keytype (kg->width, kg->symbols); + } + } +} + +/* Wrap the group GROUP into a valid group range. The method to use is + defined by the GroupsWrap control. */ +static int +wrapgroup (group_t group, int maxgroup) +{ + /* If the group is in an invalid range, fix it. */ + if (group < 0 || group >= maxgroup) + { + /* If RedirectIntoRange should be used use the 4 LSbs of + the GroupsWrap control instead of the current group. */ + if (GroupsWrap & RedirectIntoRange) + group = GroupsWrap & 0x0F; + /* Select the closest valid group. */ + else if (GroupsWrap & ClampIntoRange) + { + if (group < 0) + group = 0; + else + group = maxgroup - 1; + } + else /* Default: use modulus to wrap the group. */ + group %= maxgroup; + } + + return group; +} + + + +/* This function must be called after a modifier, group or control has + been changed. The indicator map will be regenerated and the hardwre + representation of this map will be updated. */ +static void +set_indicator_mods (void) +{ + int i; + + /* Calculate the effective modmap. */ + emods = bmods; + emods.rmods |= lmods.rmods; + emods.vmods |= lmods.vmods; + emods.rmods |= latchedmods.rmods; + emods.vmods |= latchedmods.vmods; + + for (i = 0; i < indicator_count; i++) + { + if (!(indicators[i].flags & IM_NoAutomatic)) + { + if (indicators[i].which_mods & IM_UseBase) + { + if (((indicators[i].modmap.rmods & bmods.rmods) == + indicators[i].modmap.rmods) && + ((indicators[i].modmap.vmods & bmods.vmods) == + indicators[i].modmap.vmods)) + { + indicator_map |= (1 << i); + continue; + } + } + if (indicators[i].which_mods & IM_UseLatched) + { + if (((indicators[i].modmap.rmods & latchedmods.rmods) == + indicators[i].modmap.rmods) && + ((indicators[i].modmap.vmods & latchedmods.vmods) == + indicators[i].modmap.vmods)) + { + indicator_map |= (1 << i); + continue; + } + } + if (indicators[i].which_mods & IM_UseLocked) + { + if (((indicators[i].modmap.rmods & lmods.rmods) == + indicators[i].modmap.rmods) && + ((indicators[i].modmap.vmods & lmods.vmods) == + indicators[i].modmap.vmods)) + { + indicator_map |= (1 << i); + continue; + } + } + if (indicators[i].which_mods & IM_UseEffective) + { + if (((indicators[i].modmap.rmods & emods.rmods) == + indicators[i].modmap.rmods) && + ((indicators[i].modmap.vmods & emods.vmods) == + indicators[i].modmap.vmods)) + { + indicator_map |= (1 << i); + continue; + } + } + /* The indicator shouldn't be on anymore so turn it off. */ + indicator_map &= ~(1 << i); + } + } + debug_printf ("INDICATOR: %d\n", indicator_map); +} + +/* Set base modifiers. A counter exists for every modifier. When a + modifier is set this counter will be incremented with one. */ +static void +setmods (modmap_t smods, keypress_t key) +{ + /* Higher the modcount for every set modifier. */ + void set_xmods (int xmods, int modsc[]) + { + int i = 0; + + while (xmods) + { + if (xmods & 1) + modsc[i]++; + + xmods >>= 1; + i++; + } + } + + bmods.rmods |= smods.rmods; + bmods.vmods |= smods.vmods; + + set_xmods (smods.rmods, modsc.rmods); + set_xmods (smods.vmods, modsc.vmods); + + set_indicator_mods (); +} + +/* Clear base modifiers. A counter exists for every modifier. When a + key release wants to clear a modifier this counter will be + decreased with one. When the counter becomes 0 the modifier will be + cleared and unlocked if the clearLocks flag is set. */ +static void +clearmods (modmap_t cmods, keypress_t key, int flags) +{ +#define CLEAR_XMOD(MODTYPE) \ + { \ + int i = 0; \ + int mmods = cmods.MODTYPE; \ + \ + while (mmods) \ + { \ + if (mmods & 1) \ + if (!(--modsc.MODTYPE[i])) \ + { \ + bmods.MODTYPE &= ~(1 << i); \ + if (flags & clearLocks) \ + lmods.MODTYPE &= ~(1 << i); \ + } \ + mmods >>= 1; \ + i++; \ + } \ + } + + CLEAR_XMOD(rmods); + CLEAR_XMOD(vmods); + + set_indicator_mods (); +} + +/* Set modifiers in smods and also lock them if the flag noLock is + not set. */ +static void +setlocks (modmap_t smods, keypress_t key, int flags) +{ + if (!key.rel) + { + modmap_t cmods; + cmods.rmods = lmods.rmods & smods.rmods; + cmods.vmods = lmods.vmods & smods.vmods; + + /* Locking also sets the base modifiers. */ + setmods (smods, key); + + if (!(flags & noUnlock)) + { + lmods.rmods &= ~cmods.rmods; + lmods.vmods &= ~cmods.vmods; + } + + if (!(flags & noLock)) + { + lmods.rmods |= (~cmods.rmods & smods.rmods); + lmods.vmods |= (~cmods.vmods & smods.vmods); + } + } + else + clearmods (smods, key, flags); +} + +/* Latch the modifiers smods for key KEY. When another key is operated while + KEY is pressed the release of KEY will just clear the base + modifiers, otherwise latch the modifiers like is described in the + protocol specification. */ +static void +latchmods (modmap_t smods, keypress_t key, int flags) +{ + if (!key.rel) + setmods (smods, key); + else + { + modmap_t oldlmods; + oldlmods = lmods; + clearmods (smods, key, flags); + /* Modifier that have been unlocked don't have effect anymore. */ + smods.rmods &= ~(lmods.rmods & oldlmods.rmods); + smods.vmods &= ~(lmods.vmods & oldlmods.vmods); + + + /* If another key has been pressed while this modifier key was + pressed don't latch, just behave as SetMods. */ + if (key.keycode == key.prevkc) + { + if (flags & latchToLock) + { + /* When a modifier exists as a locked modifier, consume + and unlock. */ + lmods.rmods |= latchedmods.rmods & smods.rmods; + lmods.vmods |= latchedmods.vmods & smods.vmods; + + smods.rmods &= ~(latchedmods.rmods & smods.rmods); + smods.vmods &= ~(latchedmods.vmods & smods.vmods); + } + + /* Use the remaining modifiers for latching. */ + latchedmods.rmods |= smods.rmods; + latchedmods.vmods |= smods.vmods; + } + } +} + +static void +setgroup (keypress_t key, group_t group, int flags) +{ + debug_printf ("Setgroup ()\n"); + if (!key.rel) + { + if (flags & groupAbsolute) + { + bgroup = group; + keystate[key.keycode].oldgroup = bgroup; + } + else + bgroup += group; + } + else + { + if ((key.keycode == key.prevkc) && (flags & clearLocks)) + lgroup = 0; + if (flags & groupAbsolute) + bgroup = keystate[key.keycode].oldgroup; + else + /* XXX: Maybe oldgroup should be restored for !groupAbsolute + too, because wrapgroup might have affected the calculation + and substracting will not undo the set operation. However + this way of handeling relative groups is better because the + order of releasing keys when multiple relative setgroup keys + are pressed doesn't matter. */ + bgroup -= group; + } +} + +static void +latchgroup (keypress_t key, group_t sgroup, int flags) +{ + group_t oldlgroup = sgroup; + setgroup (key, sgroup, flags); + debug_printf ("Latchgroup ()\n"); + + if (key.keycode == key.prevkc && oldlgroup == lgroup) + { + if ((flags & latchToLock) && latchedgroup) + { + lgroup += sgroup; + latchedgroup -= sgroup; + } + else + latchedgroup += sgroup; + } +} + +static void +lockgroup (keypress_t key, group_t group, int flags) +{ + debug_printf (">L: %d, g: %d\n", lgroup, group); + + keystate[key.keycode].oldgroup = lgroup; + if (flags & groupAbsolute) + lgroup = group; + else + lgroup += group; + + lgroup = wrapgroup (lgroup, 4); + + debug_printf ("<L: %d, g: %d\n", lgroup, group); + +} + +static void +setcontrols (keypress_t key, boolctrls ctrls, int flags) +{ + keystate[key.keycode].bool = ctrls & ~bboolctrls; + bboolctrls |= ctrls; +} + +static void +clearcontrols (keypress_t key, boolctrls ctrls, int flags) +{ + bboolctrls &= ~keystate[key.keycode].bool; +} + +static void +lockcontrols (keypress_t key, boolctrls ctrls, int flags) +{ + if (!key.rel) + { + //setcontrols (key, boolctrls, flags); + if (!(flags & noLock)); + // lboolctrls |= boolctrls; + } + else + { + // clearcontrols (key, boolctrls, flags); + /* This unlock behaviour doesnt work and sucks, just like the protocol + specification where it was documented. */ + // if (!(flags & noUnlock)) + // lboolctrls &= ~keystate[key.keycode].bool; + } + +} + +/* Not properly implemented, not very high priority for me. */ +/* static void */ +/* isolock (keypress_t key, group group, modmap_t mods, int flags) */ +/* { */ +/* if (!key.rel) */ +/* { */ +/* struct isolock *newiso; */ + +/* if (flags & dfltIsGroup) */ +/* setgroup (key, group, flags & groupAbsolute); */ +/* else */ +/* setmods (key, mods, 0); */ + +/* newiso = malloc (sizeof struct isolock); */ +/* if (!newiso) */ +/* ;// return error */ +/* active_isolocks.anchor */ +/* } */ +/* else */ +/* { */ +/* if (flags & dfltIsGroup) */ +/* { */ +/* cleargroup (key, group, flags & groupAbsolute); */ +/* if (bla) */ +/* lockgroup (key, group, flags & groupAbsolute); */ +/* } */ +/* else */ +/* { */ +/* clearmods (key, mods, 0); */ +/* if (bla) */ +/* { */ +/* lmods.rmods |= mods.rmods; */ +/* lmods.vmods |= mods.vmods; */ +/* } */ +/* } */ +/* } */ +/* } */ + +/* Move the mousepointer relational to its current position. */ +static void +mouse_x_move (int xdelta) +{ + /* XXX: Ofcouse this function has to do *something* :). */ +} + +/* Change the horizontal position of the mousepointer. */ +static void +mouse_x_move_to (int x) +{ + /* XXX: Ofcouse this function has to do *something* :). */ +} + +/* Move the mousepointer relational to its current position. */ +static void +mouse_y_move (int ydelta) +{ + /* XXX: Ofcouse this function has to do *something* :). */ +} + +/* Change the vertical position of the mousepointer. */ +static void +mouse_y_move_to (int y) +{ + /* XXX: Ofcouse this function has to do *something* :). */ +} + +/* Simulate a mouse button press for button BUTTON. */ +static void +mouse_button_press (int button) +{ + /* XXX: Ofcouse this function has to do *something* :). */ +} + +/* Simulate a mouse button press for button BUTTON. */ +static void +mouse_button_release (int button) +{ + /* XXX: Ofcouse this function has to do *something* :). */ +} + + + +/* Forward declaration for redirected keys. */ +static symbol handle_key (keypress_t); + + +/* Execute an action bound to a key. When the action isn't supported + or when the action doesn't consume the key return true, otherwise + return false. */ +static int +action_exec (xkb_action_t *action, keypress_t key) +{ + if (!action) + return KEYNOTCONSUMED; + + debug_printf ("EXEC: %d\n", action->type); + + switch (action->type) + { + /* LockMods: Lock/Unlock modifiers when the key is pressed. */ + case SA_LockMods: + { + action_setmods_t *setmodmap = (action_setmods_t *) action; + modmap_t modm = setmodmap->modmap; + + /* UseModMap */ + if (setmodmap->flags & useModMap) + { + modm.rmods |= keys[key.keycode].mods.rmods; + modm.vmods |= keys[key.keycode].mods.vmods; + } + + setlocks (modm, key, setmodmap->flags); + } + break; + /* SetMods: Set/Unset modifiers. Those modifier will be set as + long the key is pressed. Keys like shift, alt and control are + used here often. */ + case SA_SetMods: + { + action_setmods_t *setmodmap = (action_setmods_t *) action; + modmap_t modm = setmodmap->modmap; + + /* UseModMapMods means: also use the real modifiers specified + in the key's modmap. */ + if (setmodmap->flags & useModMap) + { + debug_printf ("Apply modmaps\n"); + modm.rmods |= keys[key.keycode].mods.rmods; + modm.vmods |= keys[key.keycode].mods.vmods; + } + + /* When the key is pressed set the modifiers. */ + if (!key.rel) + setmods (modm, key); + else /* When the key is released clear the modifiers. */ + clearmods (modm, key, setmodmap->flags); + + break; + } + /* Set the basegroup. When groupAbsolute isn't used add it + to the basegroup. */ + case SA_LatchMods: + { + action_setmods_t *setmodmap = (action_setmods_t *) action; + + modmap_t modm = setmodmap->modmap; + + /* UseModMapMods means: also use the real modifiers specified + in the key's modmap. */ + if (setmodmap->flags & useModMap) + { + modm.rmods |= keys[key.keycode].mods.rmods; + modm.vmods |= keys[key.keycode].mods.vmods; + } + + latchmods (modm, key, setmodmap->flags); + + break; + } + case SA_SetGroup: + { + action_setgroup_t *setgroupac = (action_setgroup_t *) action; + + setgroup (key, setgroupac->group, setgroupac->flags); + break; + } + case SA_LockGroup: + { + action_setgroup_t *setgroupac = (action_setgroup_t *) action; + + if (!key.rel) + lockgroup (key, setgroupac->group, setgroupac->flags); + break; + } + case SA_LatchGroup: + { + action_setgroup_t *setgroupac = (action_setgroup_t *) action; + + latchgroup (key, setgroupac->group, setgroupac->flags); + break; + } + + case SA_PtrBtn: + { + action_ptrbtn_t *ptrbtnac = (action_ptrbtn_t *) action; + int i; + int button; + + if (!MouseKeys) + return KEYNOTCONSUMED; + + if (ptrbtnac->flags & useDfltBtn) + button = default_button; + else + button = ptrbtnac->button; + + if (ptrbtnac->count) + for (i = 0; i < ptrbtnac->count; i++) + { + /* XXX: Should there be a delay? */ + mouse_button_press (button); + mouse_button_release (button); + } + else if (!key.rel) + mouse_button_press (button); + else + mouse_button_release (button); + break; + } + case SA_LockPtrBtn: + { + action_ptrbtn_t *ptrbtnac = (action_ptrbtn_t *) action; + + int button; + + if (!MouseKeys) + return KEYNOTCONSUMED; + + if (ptrbtnac->flags & useDfltBtn) + button = default_button; + else + button = ptrbtnac->button; + + /* XXX: Do stuff. */ + + break; + } + case SA_SetPtrDflt: + { + action_ptr_dflt_t *ptrdfltac = (action_ptr_dflt_t *) action; + + if (!MouseKeys) + return KEYNOTCONSUMED; + + if (!key.rel) + { + if (ptrdfltac->flags & DfltBtnAbsolute) + default_button = ptrdfltac->value; + else + default_button += ptrdfltac->value; + } + + if (default_button < 0) + default_button = 0; + + if (default_button > 5) + default_button = 5; + + break; + } + case SA_TerminateServer: + /* Zap! */ + console_exit (); + break; + case SA_SwitchScreen: + { + action_switchscrn_t *switchscrnac = (action_switchscrn_t *) action; + + if (key.rel) + break; + + if (switchscrnac->flags & screenAbs) + /* Switch to screen. */ + console_switch ((char) switchscrnac->screen, 0); + else + /* Move to next/prev. screen. */ + console_switch (0, (char) switchscrnac->screen); + break; + } + case SA_RedirectKey: + { + action_redirkey_t *redirkeyac = (action_redirkey_t *) action; + keypress_t key; + + key.keycode = redirkeyac->newkey & (key.rel ? 0x80:0); + + /* For the redirected key other modifiers should be used. */ + emods.rmods = bmods.rmods | lmods.rmods | latchedmods.rmods; + emods.vmods = bmods.vmods | lmods.vmods | latchedmods.vmods; + + emods.rmods &= ~redirkeyac->rmodsmask; + emods.rmods |= redirkeyac->rmods; + emods.vmods &= ~redirkeyac->vmods; + emods.vmods |= redirkeyac->vmodsmask; + + /* XXX: calc group etc. */ + + handle_key (key); + break; + } + case SA_ConsScroll: + { + action_consscroll_t *scrollac = (action_consscroll_t *) action; + + if (key.rel) + break; + + if (scrollac->flags & usePercentage) + console_scrollback (CONS_SCROLL_ABSOLUTE_PERCENTAGE, + 100 - scrollac->percent); + + if (scrollac->screen) + console_scrollback (CONS_SCROLL_DELTA_SCREENS, -scrollac->screen); + + if (scrollac->line) + { + int type = (scrollac->flags & lineAbs) ? + CONS_SCROLL_ABSOLUTE_LINE : CONS_SCROLL_DELTA_LINES; + console_scrollback (type, -scrollac->line); + } + break; + } + case SA_ActionMessage: + case SA_DeviceBtn: + case SA_LockDeviceBtn: + case SA_DeviceValuator: + return KEYNOTCONSUMED; + case SA_MovePtr: + { + action_moveptr_t *moveptrac = (action_moveptr_t *) action; + + if (!MouseKeys) + return KEYNOTCONSUMED; + + if (moveptrac->flags & MoveAbsoluteX) + mouse_x_move_to (moveptrac->x); + else + mouse_x_move (moveptrac->x); + + if (moveptrac->flags & MoveAbsoluteY) + mouse_y_move_to (moveptrac->y); + else + mouse_y_move (moveptrac->y); + break; + } + case SA_SetControls: + { + action_setcontrols_t *controlsac = (action_setcontrols_t *) action; + if (key.rel) + clearcontrols (key, controlsac->controls, 0); + else + setcontrols (key, controlsac->controls, 0); + break; + } + case SA_LockControls: + { + action_setcontrols_t *controlsac = (action_setcontrols_t *) action; + lockcontrols (key, controlsac->controls, 0); + break; + } + default: + /* Preserve the keycode. */ + return KEYNOTCONSUMED; + break; + } + + /* Don't preserve the keycode because it was consumed. */ + return KEYCONSUMED; +} + + + +/* Calculate the shift level for a specific key. */ +static int +calc_shift (keycode_t key) +{ + /* The keytype for this key. */ + struct keytype *keytype = keys[key].groups[egroup].keytype; + struct typemap *map; + + /* XXX: Shouldn't happen, another way to fix this? */ + if (!keytype) + return 0; + + /* Scan though all modifier to level maps of this keytype to search + the level. */ + for (map = keytype->maps; map; map = map->next) + /* Does this map meet our requirements? */ + if (map->mods.rmods == (emods.rmods & keytype->modmask.rmods) && + map->mods.vmods == (emods.vmods & keytype->modmask.vmods)) + { + /* Preserve all modifiers specified in preserve for this map. */ + emods.rmods &= ~(map->mods.rmods & (~map->preserve.rmods)); + emods.vmods &= ~(map->mods.vmods & (~map->preserve.vmods)); + return map->level; + } + + /* When no map is found use the default shift level and consume all + modifiers. */ + emods.vmods &= ~keytype->modmask.vmods; + emods.rmods &= ~keytype->modmask.rmods; + + return 0; +} + +static symbol +symtoctrlsym (symbol c) +{ + c = toupper (c); + + switch (c) + { + case 'A' ... 'Z': + c = c - 'A' + 1; + break; + case '[': case '3': + c = '\e'; + break; + case '\\': case '4': + c = ''; + break; + case ']': case '5': + c = ''; + break; + case '^': case '6': + c = ''; + break; + case '/': + c = '/'; + break; + case ' ': + c = '\0'; + break; + case '_': case '7': + c= ''; + break; + case '8': + c = '\x7f'; + break; + } + + return c; +} + + +/* Handle all actions, etc. bound to the key KEYCODE and return a XKB + symbol if one is generated by this key. If redirected_key contains + 1 this is keypress generated by the action SA_RedirectKey, don't + change the effective modifiers because they exist and have been + changed by SA_RedirectKey. */ +static symbol +handle_key (keypress_t key) +{ + int actioncompl = 0; + + modmap_t oldmods; + group_t oldgroup = 0; + + /* The level for this key. */ + int level; + + /* The symbol this keypress generated. */ + symbol sym = 0; + + debug_printf ("groups\n"); + /* If the key does not have a group there is nothing to do. */ + if (keys[key.keycode].numgroups == 0) + return -1; + + /* The effective group is the current group, but it can't be + out of range. */ + egroup = wrapgroup (bgroup + lgroup, + keys[key.keycode].numgroups); + + if (keys[key.keycode].groups[egroup].actions) + { + if (key.rel) + { + debug_printf ("action\n"); + if (!keystate[key.keycode].prevstate) + /* Executing the inverse action of a never executed + action... Stop! */ + return -1; + + keystate[key.keycode].prevstate = 0; + emods = keystate[key.keycode].prevmods; + egroup = wrapgroup (keystate[key.keycode].prevgroup, + keys[key.keycode].numgroups); + } + else /* This is a keypress event. */ + { + /* Calculate the effective modmap. */ + emods = bmods; + emods.rmods |= lmods.rmods; + emods.vmods |= lmods.vmods; + emods.rmods |= latchedmods.rmods; + emods.vmods |= latchedmods.vmods; + } + + oldmods = emods; + oldgroup = egroup; + + level = calc_shift (key.keycode);// % + + if (keys[key.keycode].groups[egroup].actionwidth >= level + 1 + && keys[key.keycode].groups[egroup].actions[level]) + { + actioncompl = action_exec + (keys[key.keycode].groups[egroup].actions[level], key); + } + } + + if (actioncompl == KEYCONSUMED && !key.rel) + { + /* An action was executed. Store the effective modifier this key + so the reverse action can be called on key release. */ + keystate[key.keycode].prevstate = 1; + keystate[key.keycode].prevmods = oldmods; + keystate[key.keycode].prevgroup = oldgroup; + } + + debug_printf ("consumed: %d - %d -%d\n", actioncompl, key.rel, + !keys[key.keycode].groups[egroup].width); + /* If the action comsumed the keycode, this is a key release event + or if the key doesn't have any symbols bound to it there is no + symbol returned. */ + if (actioncompl == KEYCONSUMED || key.rel || + !keys[key.keycode].groups[egroup].width) + return -1; + + /* Calculate the effective modmap. */ + emods = bmods; + emods.rmods |= lmods.rmods; + emods.vmods |= lmods.vmods; + emods.rmods |= latchedmods.rmods; + emods.vmods |= latchedmods.vmods; + + level = calc_shift (key.keycode) % keys[key.keycode].groups[egroup].width; + + /* The latched modifier is used for a symbol, clear it. */ + latchedmods.rmods = latchedmods.vmods = 0; + + /* Search the symbol for this key in the keytable. Make sure the + group and shift level exists. */ + sym = keys[key.keycode].groups[egroup].symbols[level]; + + /* Convert keypad symbols to symbols. XXX: Is this the right place + to do this? */ + if ((sym >= XK_KP_Multiply && sym <= XK_KP_Equal) || sym == XK_KP_Enter) + sym &= ~0xFF80; + + /* Check if this keypress was a part of a compose sequence. */ + sym = compose_symbols (sym); + + return sym; +} + +/* CTRL + Alt + Backspace will terminate the console client by + default, this hardcoded behaviour can be disabled. */ +int ctrlaltbs; + +void +xkb_input (keypress_t key) +{ + char buf[100]; + size_t size = 0; + wchar_t input; + + debug_printf ("input: %d, rel: %d, rep: %d\n", key.keycode, key.rel, key.repeat); + + if (key.rel) + keystate[key.keycode].lmods = lmods; + input = handle_key (key); + //printf ("sym: %d\n", input); + + debug_printf ("handle: %d\n", input); + if (input == -1) + return; + + /* If the realmodifier MOD1 (AKA Alt) is set generate an ESC + symbol. */ + if (emods.rmods & RMOD_MOD1) + buf[size++] = '\e'; + + buf[size] = '\0'; + + debug_printf ("input: %d\n", input); + if (!input) + return; + + /* Special key, generate escape sequence. */ + char *escseq = NULL; + + switch (input) + { + case XK_Up: case XK_KP_Up: + escseq = CONS_KEY_UP; + break; + case XK_Down: case XK_KP_Down: + escseq = CONS_KEY_DOWN; + break; + case XK_Left: case XK_KP_Left: + escseq = CONS_KEY_LEFT; + break; + case XK_Right: case XK_KP_Right: + escseq = CONS_KEY_RIGHT; + break; + case XK_BackSpace: + escseq = CONS_KEY_BACKSPACE; + break; + case XK_F1: case XK_KP_F1: + escseq = CONS_KEY_F1; + break; + case XK_F2: case XK_KP_F2: + escseq = CONS_KEY_F2; + break; + case XK_F3: case XK_KP_F3: + escseq = CONS_KEY_F3; + break; + case XK_F4: case XK_KP_F4: + escseq = CONS_KEY_F4; + break; + case XK_F5: + escseq = CONS_KEY_F5; + break; + case XK_F6: + escseq = CONS_KEY_F6; + break; + case XK_F7: + escseq = CONS_KEY_F7; + break; + case XK_F8: + escseq = CONS_KEY_F8; + break; + case XK_F9: + escseq = CONS_KEY_F9; + break; + case XK_F10: + escseq = CONS_KEY_F10; + break; + case XK_F11: + escseq = CONS_KEY_F11; + break; + case XK_F12: + escseq = CONS_KEY_F12; + break; + case XK_F13: + escseq = CONS_KEY_F13; + break; + case XK_F14: + escseq = CONS_KEY_F14; + break; + case XK_F15: + escseq = CONS_KEY_F15; + break; + case XK_F16: + escseq = CONS_KEY_F16; + break; + case XK_F17: + escseq = CONS_KEY_F17; + break; + case XK_F18: + escseq = CONS_KEY_F18; + break; + case XK_F19: + escseq = CONS_KEY_F19; + break; + case XK_F20: + escseq = CONS_KEY_F20; + break; + case XK_Home: case XK_KP_Home: + escseq = CONS_KEY_HOME; + break; + case XK_Insert: case XK_KP_Insert: + escseq = CONS_KEY_IC; + break; + case XK_Delete: case XK_KP_Delete: + escseq = CONS_KEY_DC; + break; + case XK_End: case XK_KP_End: + escseq = CONS_KEY_END; + break; + case XK_Page_Up: case XK_KP_Page_Up: + escseq = CONS_KEY_PPAGE; + break; + case XK_Page_Down: case XK_KP_Page_Down: + escseq = CONS_KEY_NPAGE; + break; + case XK_KP_Begin: + escseq = CONS_KEY_B2; + break; + case XK_ISO_Left_Tab: + escseq = CONS_KEY_BTAB; + break; + case XK_Return: case XK_KP_Enter: + escseq = "\x0d"; + break; + case XK_Tab: case XK_KP_Tab: + escseq = "\t"; + break; + case XK_Escape: + escseq = "\e"; + break; + } + + debug_printf ("bla\n"); + if (escseq != NULL) + { + strcat (buf + size, escseq); + size += strlen (escseq); + } + else + { + char *buffer = &buf[size]; + size_t left = sizeof (buf) - size; + char *inbuf = (char *) &input; + size_t inbufsize = sizeof (wchar_t); + size_t nr; + + /* Control key behaviour. */ + if (bmods.rmods & RMOD_CTRL) + input = symtoctrlsym (input); + + /* Convert the Keysym to a UCS4 characted. */ + input = KeySymToUcs4 (input); + /* if (!input) */ + /* continue; */ + + debug_printf ("UCS4: %d -- %c\n", (int) input, input); + + /* If CAPSLOCK is active capitalize the symbol. */ + if (emods.rmods & 2) + input = towupper (input); + + nr = iconv (cd, &inbuf, &inbufsize, &buffer, &left); + if (nr == (size_t) -1) + { + if (errno == E2BIG) + console_error (L"Input buffer overflow"); + else if (errno == EILSEQ) + console_error + (L"Input contained invalid byte sequence"); + else if (errno == EINVAL) + console_error + (L"Input contained incomplete byte sequence"); + else + console_error + (L"Input caused unexpected error"); + } + size = sizeof (buf) - left; + } + + // printf ("SIZE: %d\n", size); + if (size) + console_input (buf, size); + size = 0; +} + +any_t +input_loop (any_t foo) +{ + keycode_t prevkey = 0; + + for (;;) + { + /* The previous keypress. */ + // static keypress_t prevkey = { 0 }; + keypress_t key; + + key.keycode = read_keycode () + min_keys; + key.rel = key.keycode & 0x80; + key.redir = 0; + +/* if (key.keycode == 9) */ +/* console_exit (); */ + + // printf ("read keycode: %d\n", key.keycode); + + if (!key.rel && key.keycode == prevkey) + key.repeat = 1; + else + key.repeat = 0; + + if (key.repeat) + continue; + + /* The keycombination CTRL+Alt+Backspace terminates the console + client. Keycodes instead of modifiers+symbols are used to + make it able to exit the client, even when the keymaps are + faulty. */ + if ((keystate[64].keypressed || keystate[113].keypressed) /* Alt */ + && (keystate[37].keypressed || keystate[109].keypressed) /* CTRL*/ + && keystate[22].keypressed && ctrlaltbs) /* Backspace. */ + console_exit (); + + debug_printf ("---%d %d %d---\n", keystate[64].keypressed, + keystate[37].keypressed, keystate[22].keypressed); + + if (!key.repeat) + xkb_input_key (key.keycode); + prevkey = key.keycode; + } +} + + +/* /\* Read a single symbol. *\/ */ +/* static symbol */ +/* read_symbol (void) */ +/* { */ +/* symbol sym; */ + +/* for (;;) */ +/* { */ +/* keypress_t key; */ + +/* /\* A keycode generated by a timer should be handled here. *Somehow* *\/ */ + + +/* /\* /\\* Check if this keypress event was the result of a typematic *\/ */ +/* /\* repeat. *\\/ *\/ */ +/* /\* if (!key.rel) *\/ */ +/* /\* { *\/ */ +/* /\* key.repeat = keystate[key.keycode].keypressed; *\/ */ +/* /\* keystate[key.keycode].lmods = lmods; *\/ */ +/* /\* } *\/ */ +/* /\* else *\/ */ +/* /\* { *\/ */ +/* /\* if (keystate[key.keycode].keypressed) *\/ */ +/* /\* key.repeat = 0; *\/ */ +/* /\* else /\\* Keyreleased that was never pressed. *\\/ *\/ */ +/* /\* return 0; *\/ */ +/* /\* } *\/ */ + + + +/* // sym = handle_key (key); */ +/* sym = 0; */ + +/* // printf ("Key: %d (%d)\n", (int) sym, key.keycode); */ + +/* // keystate[key.keycode].hwkeypressed = key.rel ? 0 : 1; */ + + +/* if (!key.repeat) */ +/* prevkey = key; */ + +/* /\* Not every keypress results in a symbol, see handle_key. *\/ */ +/* /\* XXX: returning 0 when there is no symbol is incorrect */ +/* behaviour because 0 is a valid symbol value. *\/ */ +/* if (sym != -1) */ +/* return sym; */ +/* } */ +/* } */ + +static struct arguments +{ + char *xkbdir; + char *keymapfile; + char *keymap; + char *composefile; + int ctrlaltbs; + int pos; +} arguments = { ctrlaltbs: 1 }; + +error_t parse_xkbconfig (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap); + +static error_t xkb_start (void *handle); +static error_t xkb_init (void **handle, int no_exit, int argc, char *argv[], + int *next); + +/* const char *argp_program_version = "XKB plugin 0.003"; */ +/* const char *argp_program_bug_address = "metgerards@student.han.nl"; */ +static struct argp_option options[] = { + {"xkbdir", 'x', "DIR", 0, + "directory containing the XKB configuration files" }, + {"keymapfile", 'f', "FILE", 0, + "file containing the keymap" }, + {"keymap", 'k', "SECTIONNAME" , 0, + "choose keymap"}, + {"compose", 'o', "COMPOSEFILE", 0, + "Compose file to load (default none)"}, + {"ctrlaltbs", 'c', 0 , 0, + "CTRL + Alt + Backspace will exit the console client (default)."}, + {"no-ctrlaltbs", 'n', 0 , 0, + "CTRL + Alt + Backspace will not exit the console client."}, + {"repeat", 'r', "NODE", 0, "Set a repeater translator on NODE"}, + {0} +}; + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + struct arguments *arguments = state->input; + + switch (key) + { + case 'x': + arguments->xkbdir = arg; + break; + + case 'f': + arguments->keymapfile = arg; + break; + + case 'k': + arguments->keymap = arg; + break; + + case 'o': + arguments->composefile = arg; + break; + + case 'c': + arguments->ctrlaltbs = 1; + break; + + case 'n': + arguments->ctrlaltbs = 0; + break; + + case 'r': + repeater_node = arg; + break; + + case ARGP_KEY_END: + break; + + default: + return ARGP_ERR_UNKNOWN; + } + + arguments->pos = state->next; + return 0; +} + +static struct argp argp = {options, parse_opt, 0, 0}; + +static error_t +xkb_init (void **handle, int no_exit, int argc, char **argv, int *next) +{ + error_t err; + int lastarg; + + setlocale(LC_ALL, ""); + + arguments.pos = 1; + err = argp_parse (&argp, argc, argv, ARGP_IN_ORDER | ARGP_NO_EXIT + | ARGP_SILENT, 0, &arguments); + *next += arguments.pos - 1; + if (err && err != EINVAL) + return err; + + /* Defaults. */ + if (!arguments.xkbdir) + arguments.xkbdir = "/home/marco/xkb"; + /* debug: */ +/* arguments.keymapfile = "keymap/hurd"; */ +/* arguments.keymap = "Hurd"; */ +/* arguments.xkbdir = "/home/marco/xkb"; */ +/* arguments.keymapfile = "keymap/xfree86"; */ +/* arguments.keymap = "us"; */ + + + ctrlaltbs = arguments.ctrlaltbs; + + if (arguments.composefile) + { + err = read_composefile (arguments.composefile); + if (err) + return err; + } + + xkb_data_init (); + err = parse_xkbconfig (arguments.xkbdir, arguments.keymapfile, + arguments.keymap); + + if (err) + return err; + + determine_keytypes (); + interpret_all (); + + return 0; +} + +/* static any_t */ +/* input_loop (any_t blaat) */ +/* { */ + +/* for (;;) */ +/* { */ +/* wchar_t input = read_symbol (); */ + + +/* } */ + + +static struct input_ops xkb_ops; + +static error_t +xkb_start (void *handle) +{ + error_t err; + device_t device_master; + + cd = iconv_open ("UTF-8", "WCHAR_T"); + if (cd == (iconv_t) -1) + return errno; + + xkb_init_repeat (100L, 10L); + + err = get_privileged_ports (0, &device_master); + if (err) + return err; + + err = device_open (device_master, D_READ | D_WRITE, "@>=kbd", &kbd_dev); + if (err == D_NO_SUCH_DEVICE) + { + /* GNU Mach v1 has a different device. */ + gnumach_v1_compat = 1; + err = device_open (device_master, D_READ, "kbd", &kbd_dev); + } + + mach_port_deallocate (mach_task_self (), device_master); + if (err) + return err; + + if (gnumach_v1_compat) + { + int data = KB_EVENT; + err = device_set_status (kbd_dev, KDSKBDMODE, &data, 1); + if (err) + { + device_close (kbd_dev); + mach_port_deallocate (mach_task_self (), kbd_dev); + return err; + } + } + + driver_add_input (&xkb_ops, NULL); + + if (repeater_node) + kbd_setrepeater (repeater_node, &cnode); + + cthread_detach (cthread_fork (input_loop, NULL)); + + return 0; +} + +static error_t +xkb_fini (void *handle, int force) +{ + driver_remove_input (&xkb_ops, NULL); + + if (gnumach_v1_compat) + { + int data = KB_ASCII; + device_set_status (kbd_dev, KDSKBDMODE, &data, 1); + } + device_close (kbd_dev); + mach_port_deallocate (mach_task_self (), kbd_dev); + + console_unregister_consnode (cnode); + console_destroy_consnode (cnode); + + return 0; +} + +static error_t +xkb_set_scroll_lock_status (void *handle, int onoff) +{ + return 0; +} + +struct driver_ops driver_xkb_ops = + { + xkb_init, + xkb_start, + xkb_fini + }; + +static struct input_ops xkb_ops = + { + xkb_set_scroll_lock_status, + NULL + }; diff --git a/console-client/xkb/xkb.h b/console-client/xkb/xkb.h new file mode 100644 index 00000000..9792431f --- /dev/null +++ b/console-client/xkb/xkb.h @@ -0,0 +1,435 @@ +/* Keyboard plugin for the Hurd console using XKB keymaps. + + Copyright (C) 2002,03 Marco Gerards + + Written by Marco Gerards <marco@student.han.nl> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. */ + +#include <errno.h> +#include <argp.h> +//#include "kbd_driver.h" + +typedef int keycode_t; +typedef unsigned int scancode_t; +typedef int symbol; +typedef int group_t; +typedef unsigned int boolctrls; +//typedef int error_t; + +#define KEYCONSUMED 1 +#define KEYNOTCONSUMED 0 + +#define RedirectIntoRange 1 +#define ClampIntoRange 2 +#define WrapIntoRange 0 + +typedef enum mergemode + { + augment, + override, + replace, + alternate, + defaultmm + } mergemode; + +extern mergemode merge_mode; + +typedef unsigned long KeySym; + +/* Real modifiers. */ +#define RMOD_SHIFT 1 << 0 +#define RMOD_LOCK 1 << 1 +#define RMOD_CTRL 1 << 2 +#define RMOD_MOD1 1 << 3 +#define RMOD_MOD2 1 << 4 +#define RMOD_MOD3 1 << 5 +#define RMOD_MOD4 1 << 6 +#define RMOD_MOD5 1 << 7 + +/* If set the key has action(s). */ +#define KEYHASACTION (1<<4) +/* Normally the keytype will be calculated, but some keys like SYSRQ + can't be calculated. For these keys the name for the keytypes will + be given for every group fro whch the bit is set. */ +#define KEYHASTYPES 0xf +#define KEYHASBEHAVIOUR (1<<5) +/* Will the key be repeated when held down, or not. */ +#define KEYREPEAT (1<<6) +#define KEYNOREPEAT (1<<7) + +/* The complete set of modifiers. */ +typedef struct modmap +{ + /* Real modifiers. */ + int rmods; + /* Virtual modifiers. */ + int vmods; +} modmap_t; + +/* Modifier counter. */ +typedef struct modcount +{ + int rmods[8]; + int vmods[16]; +} modcount_t; + +/* Map modifiers to a shift level. */ +typedef struct typemap +{ + /* Shift level used when required modifiers match the active modifiers. */ + int level; + modmap_t mods; + modmap_t preserve; + struct typemap *next; +} typemap_t; + +/* The keypad symbol range. */ +#define KEYPAD_FIRST_KEY 0xFF80 +#define KEYPAD_LAST_KEY 0xFFB9 +#define KEYPAD_MASK 0xFF80 + +/* Convert a keypad symbol to a ASCII symbol. */ +#define keypad_to_ascii(c) c = (c & (~KEYPAD_MASK)) + +/* The default keytypes. These can be calculated. */ +#define KT_ONE_LEVEL 0 +#define KT_TWO_LEVEL 1 +#define KT_ALPHA 2 +#define KT_KEYPAD 3 + +typedef struct keytype +{ + /* Mask that determines which modifiers should be checked. */ + modmap_t modmask; + /* Amount of levels. */ + int levels; + /* The required set of modifiers for one specific level. */ + struct typemap *maps; + + char *name; + struct keytype *hnext; + struct keytype **prevp; +} keytype_t; + +extern struct keytype *keytypes; +extern int keytype_count; + +/* All Actions as described in the protocol specification. */ +typedef enum actiontype + { + SA_NoAction, + SA_SetMods, + SA_LatchMods, + SA_LockMods, + SA_SetGroup, + SA_LatchGroup, + SA_LockGroup, + SA_MovePtr, + SA_PtrBtn, + SA_LockPtrBtn, + SA_SetPtrDflt, + SA_ISOLock, + SA_TerminateServer, + SA_SwitchScreen, + SA_SetControls, + SA_LockControls, + SA_ActionMessage, + SA_RedirectKey, + SA_DeviceBtn, + SA_LockDeviceBtn, + SA_DeviceValuator, + SA_ConsScroll + } actiontype_t; + +typedef struct xkb_action +{ + actiontype_t type; + int data[15]; +} xkb_action_t; + +#define useModMap 4 +#define clearLocks 1 +#define latchToLock 2 +#define noLock 1 +#define noUnlock 2 +#define groupAbsolute 4 +#define NoAcceleration 1 +#define MoveAbsoluteX 2 +#define MoveAbsoluteY 4 +/* XXX: This flag is documentated and I've implemented it. Weird + stuff. */ +#define useDfltBtn 0 +#define DfltBtnAbsolute 2 +#define AffectDfltBtn 1 +#define switchApp 1 +#define screenAbs 4 +#define lineAbs 2 +#define usePercentage 8 + +/* Defines how symbols and rmods are interpreted. This is used to + bound an action to a key that doesn't have an action bound to it, + only a modifier or action describing symbol. */ +typedef struct xkb_interpret +{ + symbol symbol; + int rmods; + int match; + int vmod; /* XXX: Why does this field have a size of only 8 bits? */ + int flags; + struct xkb_action action; + struct xkb_interpret *next; +} xkb_interpret_t; + +extern xkb_interpret_t *interpretations; +extern int interpret_count; + +/* These are the parameter names that are used by the actions that + control modifiers. (this is stored in the data field of + xkb_action)*/ +typedef struct action_setmods +{ + actiontype_t type; + /* The flags configure the behaviour of the action. */ + int flags; + /* XXX: The real modifiers that can be controlled by this action. */ + int modmask; + /* The modifiers that are will be set/unset by this action. */ + modmap_t modmap; +} action_setmods_t; + +typedef struct action_setgroup +{ + actiontype_t type; + int flags; + int group; +} action_setgroup_t; + +typedef struct action_moveptr +{ + actiontype_t type; + int flags; + int x; + int y; +} action_moveptr_t; + +typedef struct action_ptrbtn +{ + actiontype_t type; + int flags; + int count; /* Isn't used for LockPtrBtn. */ + int button; +} action_ptrbtn_t; + +typedef struct action_ptr_dflt +{ + actiontype_t type; + int flags; + int affect; + int value; +} action_ptr_dflt_t; + +typedef struct action_switchscrn +{ + actiontype_t type; + int flags; + int screen; +} action_switchscrn_t; + +typedef struct action_consscroll +{ + actiontype_t type; + int flags; + double screen; + int line; + int percent; +} action_consscroll_t; + +typedef struct action_redirkey +{ + actiontype_t type; + int newkey; + int rmodsmask; + int rmods; + int vmodsmask; + int vmods; +} action_redirkey_t; + +typedef struct action_setcontrols +{ + actiontype_t type; + int controls; +} action_setcontrols_t; + +/* Every key can have 4 groups, this is the information stored per + group. */ +struct keygroup +{ + /* All symbols for every available shift level and group. */ + symbol *symbols; + /* All actions for every available shift level and group. */ + struct xkb_action **actions; + /* The keytype of this key. The keytype determines the available + shift levels and which modiers are used to set the shift level. + */ + struct keytype *keytype; + /* Amount of symbols held in this group of this key. */ + int width; + int actionwidth; +}; + +/* A single key scancode stored in memory. */ +typedef struct key +{ + /* The flags that can be set for this key (To change the behaviour + of this key). */ + int flags; + /* Every key has a maximum of 4 groups. (XXX: According to Ivan + Pascal's documentation... I'm not really sure if that is true.) */ + struct keygroup groups[4]; + int numgroups; + struct modmap mods; +} keyinf_t; + +extern struct key *keys; +extern int min_keys; +extern int max_keys; + +/* The current state of every key. */ +typedef struct keystate +{ + /* Key is pressed. */ + unsigned short keypressed:1; + unsigned short prevstate:1; + /* The key was disabled for bouncekeys. */ + unsigned short disabled:1; + /* Information about locked modifiers at the time of the keypress, + this information is required for unlocking when the key is released. */ + modmap_t lmods; + /* The modifiers and group that were active at keypress, make them + active again on keyrelease so the action will be undone. */ + modmap_t prevmods; + boolctrls bool; + group_t prevgroup; + group_t oldgroup; +} keystate_t; + +extern struct keystate keystate[255]; + +typedef struct keypress +{ + keycode_t keycode; + keycode_t prevkc; + // struct keystate *state; + unsigned short repeat:1; /* It this a real keypress?. */ + unsigned short redir:1; /* This is not a real keypress. */ + unsigned short rel; /* Key release. */ +} keypress_t; + +/* Flags for indicators. */ +#define IM_NoExplicit 0x80 +#define IM_NoAutomatic 0x40 +#define IM_LEDDrivesKB 0x20 + +#define IM_UseCompat 0x10 +#define IM_UseEffective 0x08 +#define IM_UseLocked 0x04 +#define IM_UseLatched 0x02 +#define IM_UseBase 0x01 + + +typedef struct xkb_indicator +{ + int flags; + int which_mods; + modmap_t modmap; + int which_groups; + int groups; + unsigned int ctrls; +} xkb_indicator_t; + +extern xkb_indicator_t *indicators; +extern int indicator_count; + +unsigned int KeySymToUcs4(int keysym); +symbol compose_symbols (symbol symbol); +error_t read_composefile (char *); +KeySym XStringToKeysym(char *s); +struct keytype *keytype_find (char *name); + +void key_set_action (struct key *key, group_t group, int level, + xkb_action_t *action); + + +/* Interfaces for xkbdata.c: */ +extern struct xkb_interpret default_interpretation; + + +/* Assign the name KEYNAME to the keycode KEYCODE. */ +error_t keyname_add (char *keyname, int keycode); + +/* Find the numberic representation of the keycode with the name + KEYNAME. */ +int keyname_find (char *keyname); + +/* Search the keytype with the name NAME. */ +struct keytype *keytype_find (char *name); + +/* Remove the keytype KT. */ +void keytype_delete (struct keytype *kt); + +/* Create a new keytype with the name NAME. */ +error_t keytype_new (char *name, struct keytype **new_kt); + +/* Add a level (LEVEL) to modifiers (MODS) mapping to the current + keytype. */ +error_t keytype_mapadd (struct keytype *kt, modmap_t mods, int level); + +/* For the current keytype the modifiers PRESERVE should be preserved + when the modifiers MODS are pressed. */ +error_t keytype_preserve_add (struct keytype *kt, modmap_t mods, + modmap_t preserve); + +/* Add a new interpretation. */ +error_t interpret_new (xkb_interpret_t **new_interpret, symbol ks); + +/* Get the number assigned to the virtualmodifier with the name + VMODNAME. */ +int vmod_find (char *vmodname); + +/* Give the virtualmodifier VMODNAME a number and add it to the + hashtable. */ +error_t vmod_add (char *vmodname); + +/* Initialize the list for keysyms to realmodifiers mappings. */ +void ksrm_init (); + +/* Add keysym to realmodifier mapping. */ +error_t ksrm_add (symbol ks, int rmod); + +/* Apply the rkms (realmods to keysyms) table to all keysyms. */ +void ksrm_apply (void); + +/* Set the current rmod for the key with keyname KEYNAME. */ +/* XXX: It shouldn't be applied immediatly because the key can be + replaced. */ +void set_rmod_keycode (char *keyname, int rmod); + +/* Initialize XKB data structures. */ +error_t xkb_data_init (void); + +error_t xkb_input_key (int key); + +error_t xkb_init_repeat (int delay, int repeat); + +void xkb_input (keypress_t key); + +int debug_printf (const char *f, ...); diff --git a/console-client/xkb/xkbdata.c b/console-client/xkb/xkbdata.c new file mode 100644 index 00000000..97545e52 --- /dev/null +++ b/console-client/xkb/xkbdata.c @@ -0,0 +1,456 @@ +/* xkbdata.c -- Manage XKB datastructures. + + Copyright (C) 2003 Marco Gerards + + Written by Marco Gerards <marco@student.han.nl> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. */ + +/* Generate a key for the string S. XXX: The are many more effecient + algoritms, this one should be replaced by one of those. */ + +#include <stdlib.h> +#include <string.h> +#include <hurd/ihash.h> +#include "xkb.h" + +static int +name_hash (char *s) +{ + int i = 0; + while (*s) + i += *(s++); + return i; +} + + +/* A keyname with a keycode and realmodifier bound to it. */ +struct keyname +{ + int keycode; + int rmods; +}; + +static struct hurd_ihash kn_mapping; + +/* Initialize the keyname hashtable. */ +static void +keyname_init () +{ + hurd_ihash_init (&kn_mapping, HURD_IHASH_NO_LOCP); + debug_printf ("Kn_mapping init"); + /* XXX: error. */ +} + +/* Assign the name KEYNAME to the keycode KEYCODE. */ +error_t +keyname_add (char *keyname, int keycode) +{ + struct keyname *kn; + int kn_int; + + kn = malloc (sizeof (struct keyname)); + if (!kn) + return ENOMEM; + + /* XXX: 4 characters can be mapped into a int, it is safe to assume + this will not be changed. */ + if (strlen (keyname) > 4) + { + debug_printf ("The keyname `%s' consist of more than 4 characters;" + " 4 characters is the maximum.\n", keyname); + /* XXX: Abort? */ + return 0; + } + + kn->keycode = keycode; + kn->rmods = 0; + + kn_int = keyname[0] + (keyname[1] << 8) + (keyname[2] << 16) + (keyname[3] << 24); + debug_printf ("add : %d\n", kn_mapping.locp_offset); + hurd_ihash_add (&kn_mapping, kn_int, kn); + + return 0; +} + +/* Find the numberic representation of the keycode with the name + KEYNAME. */ +int +keyname_find (char *keyname) +{ + struct keyname *kn; + int kn_int; + + /* XXX: 4 characters can be mapped into a int, it is safe to assume + this will not be changed. */ + if (strlen (keyname) > 4) + { + debug_printf ("The keyname `%s' consist of more than 4 characters;" + " 4 characters is the maximum.\n", keyname); + /* XXX: Abort? */ + return 0; + } + kn_int = keyname[0] + (keyname[1] << 8) + (keyname[2] << 16) + (keyname[3] << 24); + + kn = hurd_ihash_find (&kn_mapping, kn_int); + if (kn) + return kn->keycode; +/* int h = name_hash (keyname); */ +/* struct keyname *kn; */ +/* for (kn = knhash[KNHASH(h)]; kn; kn = kn->hnext) */ +/* { */ +/* if (strcmp (kn->keyname, keyname)) */ +/* continue; */ + +/* return kn->keycode; */ +/* } */ + + /* XXX: Is 0 an invalid keycode? */ + return 0; +} + + +/* Keytypes and keytype maps. */ + +/* The dummy gets used when the original may not be overwritten. */ +static struct keytype dummy_keytype; + +#define KTHSZ 16 +#if ((KTHSZ&(KTHSZ-1)) == 0) +#define KTHASH(ktttl) ((ktttl)&(KTHSZ-1)) +#else +#define KTHASH(ktttl) (((unsigned)(kt))%KTHSZ) +#endif + +/* All keytypes. */ +struct keytype *kthash[KTHSZ]; + +/* Initialize the keytypes hashtable. */ +static void +keytype_init () +{ + int n; + for (n = 0; n < KTHSZ; n++) + kthash[n] = 0; +} + +/* Search the keytype with the name NAME. */ +struct keytype * +keytype_find (char *name) +{ + int nhash = name_hash (name); + struct keytype *kt; + + for (kt = kthash[KTHASH(nhash)]; kt; kt = kt->hnext) + if (!strcmp (name, kt->name)) + return kt; + return NULL; +} + +/* Remove the keytype KT. */ +void +keytype_delete (struct keytype *kt) +{ + struct typemap *map; + + + *kt->prevp = kt->hnext; + if (kt->hnext) + kt->hnext->prevp = kt->prevp; + + map = kt->maps; + while (map) + { + struct typemap *nextmap = map->next; + free (map); + map = nextmap; + } + +} + +/* Create a new keytype with the name NAME. */ +error_t +keytype_new (char *name, struct keytype **new_kt) +{ + struct keytype *kt; + struct keytype *ktlist; + int nhash; + + nhash = name_hash (name); + debug_printf ("New: %s\n", name); + + kt = keytype_find (name); + + if (kt) + { + /* If the merge mode is augement don't replace it. */ + if (merge_mode == augment) + { + *new_kt = &dummy_keytype; + return 0; + } + else /* This keytype should replace the old one, remove the old one. */ + keytype_delete (kt); + } + + ktlist = kthash[KTHASH(nhash)]; + kt = calloc (1, sizeof (struct keytype)); + if (kt == NULL) + return ENOMEM; + + kt->hnext = ktlist; + kt->name = strdup (name); + kt->prevp = &kthash[KTHASH(nhash)]; + kt->maps = NULL; + if (kthash[KTHASH(nhash)]) + kthash[KTHASH(nhash)]->prevp = &(kt->hnext); + kthash[KTHASH(nhash)] = kt; + + *new_kt = kt; + return 0; +} + +/* Add a level (LEVEL) to modifiers (MODS) mapping to the current + keytype. */ +error_t +keytype_mapadd (struct keytype *kt, modmap_t mods, int level) +{ + struct typemap *map; + modmap_t nulmap = {0, 0}; + + map = malloc (sizeof (struct typemap)); + if (!map) + return ENOMEM; + + map->level = level; + map->mods = mods; + map->preserve = nulmap; + /* By default modifiers shouldn't be preserved. */ + map->next = kt->maps; + + kt->maps = map; + + return 0; +} + +/* For the current keytype the modifiers PRESERVE should be preserved + when the modifiers MODS are pressed. */ +error_t +keytype_preserve_add (struct keytype *kt, modmap_t mods, modmap_t preserve) +{ + error_t err; + struct typemap *map; + + map = kt->maps; + while (map) + { + if (mods.rmods == map->mods.rmods && mods.vmods == map->mods.vmods) + { + map->preserve = preserve; + return 0; + } + map = map->next; + } + + /* No map has been found, add the default map. */ + err = keytype_mapadd (kt, mods, 0); + if (err) + return err; + + keytype_preserve_add (kt, mods, preserve); + + return 0; +} + + +/* Interpretations. */ + +struct xkb_interpret *last_interp; +struct xkb_interpret default_interpretation; + + +/* Add a new interpretation. */ +error_t +interpret_new (xkb_interpret_t **new_interpret, symbol ks) +{ + struct xkb_interpret *new_interp; + + new_interp = malloc (sizeof (struct xkb_interpret)); + if (!new_interp) + return ENOMEM; + + memcpy (new_interp, &default_interpretation, sizeof (struct xkb_interpret)); + new_interp->symbol = ks; + + if (ks) + { + new_interp->next = interpretations; + interpretations = new_interp; + + if (!last_interp) + last_interp = new_interp; + } + else + { + if (last_interp) + last_interp->next = new_interp; + + last_interp = new_interp; + + if (!interpretations) + interpretations = new_interp; + } + + *new_interpret = new_interp; + + return 0; +} + + +/* XXX: Dead code!? */ +/* Virtual modifiers name to number mapping. */ +/* Last number assigned to a virtual modifier. */ +static int lastvmod = 0; + +/* One virtual modifiername -> vmod number mapping. */ +struct vmodname +{ + char *name; + struct vmodname *next; +}; + +/* A list of virtualmodifier names and its numberic representation. */ +static struct vmodname *vmodnamel; + +/* Get the number assigned to the virtualmodifier with the name + VMODNAME. */ +int +vmod_find (char *vmodname) +{ + int i = 0; + struct vmodname *vmn = vmodnamel; + + while (vmn) + { + if (!strcmp (vmn->name, vmodname)) + return (lastvmod - i); + vmn = vmn->next; + i++; + } + + return 0; +} + +/* Give the virtualmodifier VMODNAME a number and add it to the + hashtable. */ +error_t +vmod_add (char *vmodname) +{ + struct vmodname *vmn; + + if (vmod_find (vmodname)) + return 0; + + vmn = malloc (sizeof (struct vmodname)); + if (vmn == NULL) + return ENOMEM; + + vmn->name = vmodname; + vmn->next = vmodnamel; + vmodnamel = vmn; + + lastvmod++; + + return 0; +} + + +/* XXX: Use this, no pointers. */ +struct ksrm +{ + symbol ks; + + int rmods; +}; +static struct hurd_ihash ksrm_mapping; + +/* Initialize the list for keysyms to realmodifiers mappings. */ +void +ksrm_init () +{ + hurd_ihash_init (&ksrm_mapping, HURD_IHASH_NO_LOCP); + debug_printf ("KSRM MAP IHASH CREATED \n"); +} + +/* Add keysym to realmodifier mapping. */ +error_t +ksrm_add (symbol ks, int rmod) +{ + hurd_ihash_add (&ksrm_mapping, ks, (void *) rmod); + + return 0; +} + +/* Apply the rkms (realmods to keysyms) table to all keysyms. */ +void +ksrm_apply (void) +{ + keycode_t kc; + for (kc = 0; kc < max_keys; kc++) + { + int group; + for (group = 0; group < 4; group++) + { + int cursym; + for (cursym = 0; cursym < keys[kc].groups[group].width; cursym++) + { + symbol ks = keys[kc].groups[group].symbols[cursym]; + int rmods = (int) hurd_ihash_find (&ksrm_mapping, ks); + struct ksrm *ksrm; + + if (rmods) + { + keys[kc].mods.rmods = rmods; + debug_printf ("kss %d = %d\n", kc, ksrm->rmods); + } + } + } + } +} + + +/* void */ +/* indicator_new (xkb_indicator_t **, */ + + +/* Keycode to realmodifier mapping. */ + +/* Set the current rmod for the key with keyname KEYNAME. */ +/* XXX: It shouldn't be applied immediatly because the key can be + replaced. */ +void +set_rmod_keycode (char *keyname, int rmod) +{ + keycode_t kc = keyname_find (keyname); + keys[kc].mods.rmods = rmod; + debug_printf ("kc %d = %d\n", kc, rmod); +} + +/* Initialize XKB data structures. */ +error_t +xkb_data_init (void) +{ + keyname_init (); + keytype_init (); + ksrm_init (); + + return 0; +} diff --git a/console-client/xkb/xkbdefaults.c b/console-client/xkb/xkbdefaults.c new file mode 100644 index 00000000..e64f471a --- /dev/null +++ b/console-client/xkb/xkbdefaults.c @@ -0,0 +1,1318 @@ +char *default_xkb_keymap = "\ +xkb_keymap {\n\ +xkb_keycodes \"xfree86\" {\n\ + minimum = 8;\n\ + maximum = 255;\n\ + <ESC> = 9;\n\ + <AE01> = 10;\n\ + <AE02> = 11;\n\ + <AE03> = 12;\n\ + <AE04> = 13;\n\ + <AE05> = 14;\n\ + <AE06> = 15;\n\ + <AE07> = 16;\n\ + <AE08> = 17;\n\ + <AE09> = 18;\n\ + <AE10> = 19;\n\ + <AE11> = 20;\n\ + <AE12> = 21;\n\ + <BKSP> = 22;\n\ + <TAB> = 23;\n\ + <AD01> = 24;\n\ + <AD02> = 25;\n\ + <AD03> = 26;\n\ + <AD04> = 27;\n\ + <AD05> = 28;\n\ + <AD06> = 29;\n\ + <AD07> = 30;\n\ + <AD08> = 31;\n\ + <AD09> = 32;\n\ + <AD10> = 33;\n\ + <AD11> = 34;\n\ + <AD12> = 35;\n\ + <RTRN> = 36;\n\ + <LCTL> = 37;\n\ + <AC01> = 38;\n\ + <AC02> = 39;\n\ + <AC03> = 40;\n\ + <AC04> = 41;\n\ + <AC05> = 42;\n\ + <AC06> = 43;\n\ + <AC07> = 44;\n\ + <AC08> = 45;\n\ + <AC09> = 46;\n\ + <AC10> = 47;\n\ + <AC11> = 48;\n\ + <TLDE> = 49;\n\ + <LFSH> = 50;\n\ + <BKSL> = 51;\n\ + <AB01> = 52;\n\ + <AB02> = 53;\n\ + <AB03> = 54;\n\ + <AB04> = 55;\n\ + <AB05> = 56;\n\ + <AB06> = 57;\n\ + <AB07> = 58;\n\ + <AB08> = 59;\n\ + <AB09> = 60;\n\ + <AB10> = 61;\n\ + <RTSH> = 62;\n\ + <KPMU> = 63;\n\ + <LALT> = 64;\n\ + <SPCE> = 65;\n\ + <CAPS> = 66;\n\ + <FK01> = 67;\n\ + <FK02> = 68;\n\ + <FK03> = 69;\n\ + <FK04> = 70;\n\ + <FK05> = 71;\n\ + <FK06> = 72;\n\ + <FK07> = 73;\n\ + <FK08> = 74;\n\ + <FK09> = 75;\n\ + <FK10> = 76;\n\ + <NMLK> = 77;\n\ + <SCLK> = 78;\n\ + <KP7> = 79;\n\ + <KP8> = 80;\n\ + <KP9> = 81;\n\ + <KPSU> = 82;\n\ + <KP4> = 83;\n\ + <KP5> = 84;\n\ + <KP6> = 85;\n\ + <KPAD> = 86;\n\ + <KP1> = 87;\n\ + <KP2> = 88;\n\ + <KP3> = 89;\n\ + <KP0> = 90;\n\ + <KPDL> = 91;\n\ + <SYRQ> = 92;\n\ + <LSGT> = 94;\n\ + <FK11> = 95;\n\ + <FK12> = 96;\n\ + <HOME> = 97;\n\ + <UP> = 98;\n\ + <PGUP> = 99;\n\ + <LEFT> = 100;\n\ + <RGHT> = 102;\n\ + <END> = 103;\n\ + <DOWN> = 104;\n\ + <PGDN> = 105;\n\ + <INS> = 106;\n\ + <DELE> = 107;\n\ + <KPEN> = 108;\n\ + <RCTL> = 109;\n\ + <PAUS> = 110;\n\ + <PRSC> = 111;\n\ + <KPDV> = 112;\n\ + <RALT> = 113;\n\ + <BRK> = 114;\n\ + <LWIN> = 115;\n\ + <RWIN> = 116;\n\ + <MENU> = 117;\n\ + <FK13> = 118;\n\ + <FK14> = 119;\n\ + <FK15> = 120;\n\ + <FK16> = 121;\n\ + <FK17> = 122;\n\ + <KPDC> = 123;\n\ + <XFER> = 129;\n\ + <I02> = 130;\n\ + <NFER> = 131;\n\ + <I04> = 132;\n\ + <AE13> = 133;\n\ + <I06> = 134;\n\ + <I07> = 135;\n\ + <I08> = 136;\n\ + <I09> = 137;\n\ + <I0A> = 138;\n\ + <I0B> = 139;\n\ + <I0C> = 140;\n\ + <I0D> = 141;\n\ + <I0E> = 142;\n\ + <I0F> = 143;\n\ + <I10> = 144;\n\ + <I11> = 145;\n\ + <I12> = 146;\n\ + <I13> = 147;\n\ + <I14> = 148;\n\ + <I15> = 149;\n\ + <I16> = 150;\n\ + <I17> = 151;\n\ + <I18> = 152;\n\ + <I19> = 153;\n\ + <I1A> = 154;\n\ + <I1B> = 155;\n\ + <I1E> = 158;\n\ + <I1F> = 159;\n\ + <I20> = 160;\n\ + <I21> = 161;\n\ + <I22> = 162;\n\ + <I23> = 163;\n\ + <I24> = 164;\n\ + <I25> = 165;\n\ + <I26> = 166;\n\ + <I27> = 167;\n\ + <I28> = 168;\n\ + <I29> = 169;\n\ + <I2B> = 171;\n\ + <I2C> = 172;\n\ + <I2D> = 173;\n\ + <I2E> = 174;\n\ + <I2F> = 175;\n\ + <I30> = 176;\n\ + <I31> = 177;\n\ + <I32> = 178;\n\ + <I33> = 179;\n\ + <I34> = 180;\n\ + <I39> = 185;\n\ + <I3A> = 186;\n\ + <I3B> = 187;\n\ + <I3C> = 188;\n\ + <I42> = 194;\n\ + <I43> = 195;\n\ + <I44> = 196;\n\ + <I45> = 197;\n\ + <I4A> = 202;\n\ + <I54> = 212;\n\ + <I55> = 213;\n\ + <I56> = 214;\n\ + <I57> = 215;\n\ + <I58> = 216;\n\ + <I59> = 217;\n\ + <I5A> = 218;\n\ + <I5E> = 222;\n\ + <I5F> = 223;\n\ + <I60> = 224;\n\ + <I61> = 225;\n\ + <I62> = 226;\n\ + <I63> = 227;\n\ + <I64> = 228;\n\ + <I65> = 229;\n\ + <I66> = 230;\n\ + <I67> = 231;\n\ + <I68> = 232;\n\ + <I69> = 233;\n\ + <I6A> = 234;\n\ + <I6B> = 235;\n\ + <I6C> = 236;\n\ + <I6D> = 237;\n\ + <I6E> = 238;\n\ + <I6F> = 239;\n\ + <I70> = 240;\n\ + <I71> = 241;\n\ + <I72> = 242;\n\ + <I73> = 243;\n\ + <I74> = 244;\n\ + <I75> = 245;\n\ + <I76> = 246;\n\ + <I77> = 247;\n\ + <I78> = 248;\n\ + <I79> = 249;\n\ + <I7A> = 250;\n\ + <I7B> = 251;\n\ + <I7C> = 252;\n\ + <I7D> = 253;\n\ + <I7E> = 254;\n\ + <I7F> = 255;\n\ + indicator 1 = \"Caps Lock\";\n\ + indicator 2 = \"Num Lock\";\n\ + indicator 3 = \"Scroll Lock\";\n\ + virtual indicator 4 = \"Shift Lock\";\n\ + virtual indicator 5 = \"Group 2\";\n\ + virtual indicator 6 = \"Mouse Keys\";\n\ + alias <HZTG> = <TLDE>;\n\ + alias <HKTG> = <FK15>;\n\ + alias <AB11> = <KPDC>;\n\ + alias <AC12> = <BKSL>;\n\ + alias <ALGR> = <RALT>;\n\ +};\n\ +\n\ +xkb_types \"complete\" {\n\ +\n\ + virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock;\n\ +\n\ + type \"ONE_LEVEL\" {\n\ + modifiers= none;\n\ + level_name[Level1]= \"Any\";\n\ + };\n\ + type \"TWO_LEVEL\" {\n\ + modifiers= Shift;\n\ + map[Shift]= Level2;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Shift\";\n\ + };\n\ + type \"ALPHABETIC\" {\n\ + modifiers= Shift+Lock;\n\ + map[Shift]= Level2;\n\ + map[Lock]= Level1;\n\ + preserve[Lock]= Lock;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Caps\";\n\ + };\n\ + type \"KEYPAD\" {\n\ + modifiers= Shift+NumLock;\n\ + map[Shift]= Level2;\n\ + map[NumLock]= Level2;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Number\";\n\ + };\n\ + type \"SHIFT+ALT\" {\n\ + modifiers= Shift+Alt;\n\ + map[Shift+Alt]= Level2;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Shift+Alt\";\n\ + };\n\ + type \"PC_BREAK\" {\n\ + modifiers= Control;\n\ + map[Control]= Level2;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Control\";\n\ + };\n\ + type \"PC_SYSRQ\" {\n\ + modifiers= Alt;\n\ + map[Alt]= Level2;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Alt\";\n\ + };\n\ + type \"CTRL+ALT\" {\n\ + modifiers= Control+Alt;\n\ + map[Control+Alt]= Level2;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Ctrl+Alt\";\n\ + };\n\ + type \"THREE_LEVEL\" {\n\ + modifiers= Shift+LevelThree;\n\ + map[Shift]= Level2;\n\ + map[LevelThree]= Level3;\n\ + map[Shift+LevelThree]= Level3;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Shift\";\n\ + level_name[Level3]= \"Level3\";\n\ + };\n\ + type \"FOUR_LEVEL\" {\n\ + modifiers= Shift+LevelThree;\n\ + map[Shift]= Level2;\n\ + map[LevelThree]= Level3;\n\ + map[Shift+LevelThree]= Level4;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Shift\";\n\ + level_name[Level3]= \"Alt Base\";\n\ + level_name[Level4]= \"Shift Alt\";\n\ + };\n\ + type \"FOUR_LEVEL_KEYPAD\" {\n\ + modifiers= Shift+NumLock+LevelThree;\n\ + map[Shift]= Level2;\n\ + map[NumLock]= Level2;\n\ + map[LevelThree]= Level3;\n\ + map[Shift+LevelThree]= Level4;\n\ + map[NumLock+LevelThree]= Level4;\n\ + map[Shift+NumLock+LevelThree]= Level3;\n\ + level_name[Level1]= \"Base\";\n\ + level_name[Level2]= \"Number\";\n\ + level_name[Level3]= \"Alt Base\";\n\ + level_name[Level4]= \"Alt Number\";\n\ + };\n\ +};\n\ +\n\ +xkb_compatibility \"complete\" {\n\ +\n\ + virtual_modifiers NumLock,Alt,LevelThree,AltGr,ScrollLock;\n\ +\n\ + interpret.useModMapMods= AnyLevel;\n\ + interpret.repeat= False;\n\ + interpret.locking= False;\n\ + interpret ISO_Level2_Latch+Exactly(Shift) {\n\ + useModMapMods=level1;\n\ + action= LatchMods(modifiers=Shift,clearLocks,latchToLock);\n\ + };\n\ + interpret Shift_Lock+AnyOf(Shift+Lock) {\n\ + action= LockMods(modifiers=Shift);\n\ + };\n\ + interpret Num_Lock+AnyOf(all) {\n\ + virtualModifier= NumLock;\n\ + action= LockMods(modifiers=NumLock);\n\ + };\n\ + interpret ISO_Lock+AnyOf(all) {\n\ + action= ISOLock(modifiers=modMapMods,affect=all);\n\ + };\n\ + interpret ISO_Level3_Shift+AnyOf(all) {\n\ + virtualModifier= LevelThree;\n\ + useModMapMods=level1;\n\ + action= SetMods(modifiers=LevelThree,clearLocks);\n\ + };\n\ + interpret ISO_Level3_Latch+AnyOf(all) {\n\ + virtualModifier= LevelThree;\n\ + useModMapMods=level1;\n\ + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);\n\ + };\n\ + interpret Alt_L+AnyOf(all) {\n\ + virtualModifier= Alt;\n\ + action= SetMods(modifiers=modMapMods,clearLocks);\n\ + };\n\ + interpret Alt_R+AnyOf(all) {\n\ + virtualModifier= Alt;\n\ + action= SetMods(modifiers=modMapMods,clearLocks);\n\ + };\n\ + interpret Scroll_Lock+AnyOf(all) {\n\ + virtualModifier= ScrollLock;\n\ + action= LockMods(modifiers=modMapMods);\n\ + };\n\ + interpret Mode_switch+AnyOfOrNone(all) {\n\ + virtualModifier= AltGr;\n\ + useModMapMods=level1;\n\ + action= SetGroup(group=+1);\n\ + };\n\ + interpret ISO_Group_Latch+AnyOfOrNone(all) {\n\ + virtualModifier= AltGr;\n\ + useModMapMods=level1;\n\ + action= LatchGroup(group=2);\n\ + };\n\ + interpret ISO_Next_Group+AnyOfOrNone(all) {\n\ + virtualModifier= AltGr;\n\ + useModMapMods=level1;\n\ + action= LockGroup(group=+1);\n\ + };\n\ + interpret ISO_Prev_Group+AnyOfOrNone(all) {\n\ + virtualModifier= AltGr;\n\ + useModMapMods=level1;\n\ + action= LockGroup(group=-1);\n\ + };\n\ + interpret ISO_First_Group+AnyOfOrNone(all) {\n\ + action= LockGroup(group=1);\n\ + };\n\ + interpret ISO_Last_Group+AnyOfOrNone(all) {\n\ + action= LockGroup(group=2);\n\ + };\n\ + interpret KP_1+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=-1,y=+1);\n\ + };\n\ + interpret KP_End+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=-1,y=+1);\n\ + };\n\ + interpret KP_2+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+0,y=+1);\n\ + };\n\ + interpret KP_Down+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+0,y=+1);\n\ + };\n\ + interpret KP_3+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+1,y=+1);\n\ + };\n\ + interpret KP_Next+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+1,y=+1);\n\ + };\n\ + interpret KP_4+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=-1,y=+0);\n\ + };\n\ + interpret KP_Left+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=-1,y=+0);\n\ + };\n\ + interpret KP_6+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+1,y=+0);\n\ + };\n\ + interpret KP_Right+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+1,y=+0);\n\ + };\n\ + interpret KP_7+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=-1,y=-1);\n\ + };\n\ + interpret KP_Home+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=-1,y=-1);\n\ + };\n\ + interpret KP_8+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+0,y=-1);\n\ + };\n\ + interpret KP_Up+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+0,y=-1);\n\ + };\n\ + interpret KP_9+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+1,y=-1);\n\ + };\n\ + interpret KP_Prior+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= MovePtr(x=+1,y=-1);\n\ + };\n\ + interpret KP_5+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= PtrBtn(button=default);\n\ + };\n\ + interpret KP_Begin+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= PtrBtn(button=default);\n\ + };\n\ + interpret KP_F2+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= SetPtrDflt(affect=button,button=1);\n\ + };\n\ + interpret KP_Divide+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= SetPtrDflt(affect=button,button=1);\n\ + };\n\ + interpret KP_F3+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= SetPtrDflt(affect=button,button=2);\n\ + };\n\ + interpret KP_Multiply+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= SetPtrDflt(affect=button,button=2);\n\ + };\n\ + interpret KP_F4+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= SetPtrDflt(affect=button,button=3);\n\ + };\n\ + interpret KP_Subtract+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= SetPtrDflt(affect=button,button=3);\n\ + };\n\ + interpret KP_Separator+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= PtrBtn(button=default,count=2);\n\ + };\n\ + interpret KP_Add+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= PtrBtn(button=default,count=2);\n\ + };\n\ + interpret KP_0+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= LockPtrBtn(button=default,affect=lock);\n\ + };\n\ + interpret KP_Insert+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= LockPtrBtn(button=default,affect=lock);\n\ + };\n\ + interpret KP_Decimal+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= LockPtrBtn(button=default,affect=unlock);\n\ + };\n\ + interpret KP_Delete+AnyOfOrNone(all) {\n\ + repeat= True;\n\ + action= LockPtrBtn(button=default,affect=unlock);\n\ + };\n\ + interpret Pointer_Button_Dflt+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=default);\n\ + };\n\ + interpret Pointer_Button1+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=1);\n\ + };\n\ + interpret Pointer_Button2+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=2);\n\ + };\n\ + interpret Pointer_Button3+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=3);\n\ + };\n\ + interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=default,count=2);\n\ + };\n\ + interpret Pointer_DblClick1+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=1,count=2);\n\ + };\n\ + interpret Pointer_DblClick2+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=2,count=2);\n\ + };\n\ + interpret Pointer_DblClick3+AnyOfOrNone(all) {\n\ + action= PtrBtn(button=3,count=2);\n\ + };\n\ + interpret Pointer_Drag_Dflt+AnyOfOrNone(all) {\n\ + action= LockPtrBtn(button=default,affect=both);\n\ + };\n\ + interpret Pointer_Drag1+AnyOfOrNone(all) {\n\ + action= LockPtrBtn(button=1,affect=both);\n\ + };\n\ + interpret Pointer_Drag2+AnyOfOrNone(all) {\n\ + action= LockPtrBtn(button=2,affect=both);\n\ + };\n\ + interpret Pointer_Drag3+AnyOfOrNone(all) {\n\ + action= LockPtrBtn(button=3,affect=both);\n\ + };\n\ + interpret Pointer_EnableKeys+AnyOfOrNone(all) {\n\ + action= LockControls(controls=MouseKeys);\n\ + };\n\ + interpret Pointer_Accelerate+AnyOfOrNone(all) {\n\ + action= LockControls(controls=MouseKeysAccel);\n\ + };\n\ + interpret Pointer_DfltBtnNext+AnyOfOrNone(all) {\n\ + action= SetPtrDflt(affect=button,button=+1);\n\ + };\n\ + interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) {\n\ + action= SetPtrDflt(affect=button,button=-1);\n\ + };\n\ + interpret AccessX_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=AccessXKeys);\n\ + };\n\ + interpret AccessX_Feedback_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=AccessXFeedback);\n\ + };\n\ + interpret RepeatKeys_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=RepeatKeys);\n\ + };\n\ + interpret SlowKeys_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=SlowKeys);\n\ + };\n\ + interpret BounceKeys_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=BounceKeys);\n\ + };\n\ + interpret StickyKeys_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=StickyKeys);\n\ + };\n\ + interpret MouseKeys_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=MouseKeys);\n\ + };\n\ + interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=MouseKeysAccel);\n\ + };\n\ + interpret Overlay1_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=Overlay1);\n\ + };\n\ + interpret Overlay2_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=Overlay2);\n\ + };\n\ + interpret AudibleBell_Enable+AnyOfOrNone(all) {\n\ + action= LockControls(controls=AudibleBell);\n\ + };\n\ + interpret Terminate_Server+AnyOfOrNone(all) {\n\ + action= Terminate();\n\ + };\n\ + interpret Any+Exactly(Lock) {\n\ + action= LockMods(modifiers=Lock);\n\ + };\n\ + interpret Any+AnyOf(all) {\n\ + action= SetMods(modifiers=modMapMods,clearLocks);\n\ + };\n\ + group 2 = AltGr;\n\ + group 3 = AltGr;\n\ + group 4 = AltGr;\n\ + indicator \"Caps Lock\" {\n\ + !allowExplicit;\n\ + whichModState= locked;\n\ + modifiers= Lock;\n\ + };\n\ + indicator \"Num Lock\" {\n\ + !allowExplicit;\n\ + whichModState= locked;\n\ + modifiers= NumLock;\n\ + };\n\ + indicator \"Scroll Lock\" {\n\ + whichModState= locked;\n\ + modifiers= ScrollLock;\n\ + };\n\ + indicator \"Shift Lock\" {\n\ + !allowExplicit;\n\ + whichModState= locked;\n\ + modifiers= Shift;\n\ + };\n\ + indicator \"Group 2\" {\n\ + !allowExplicit;\n\ + groups= 0xfe;\n\ + };\n\ + indicator \"Mouse Keys\" {\n\ + indicatorDrivesKeyboard;\n\ + controls= mouseKeys;\n\ + };\n\ +};\n\ +\n\ +xkb_symbols \"en_US(pc104)\" {\n\ +\n\ + name[group1]=\"US/ASCII\";\n\ + name[group2]=\"ISO9995-3\";\n\ +\n\ + key <ESC> { [ Escape ] };\n\ + key <AE01> {\n\ + symbols[Group1]= [ 1, exclam ],\n\ + symbols[Group2]= [ onesuperior, exclamdown ]\n\ + };\n\ + key <AE02> {\n\ + symbols[Group1]= [ 2, at ],\n\ + symbols[Group2]= [ twosuperior, oneeighth ]\n\ + };\n\ + key <AE03> {\n\ + symbols[Group1]= [ 3, numbersign ],\n\ + symbols[Group2]= [ threesuperior, sterling ]\n\ + };\n\ + key <AE04> {\n\ + symbols[Group1]= [ 4, dollar ],\n\ + symbols[Group2]= [ onequarter, dollar ]\n\ + };\n\ + key <AE05> {\n\ + symbols[Group1]= [ 5, percent ],\n\ + symbols[Group2]= [ onehalf, threeeighths ]\n\ + };\n\ + key <AE06> {\n\ + symbols[Group1]= [ 6, asciicircum ],\n\ + symbols[Group2]= [ threequarters, fiveeighths ]\n\ + };\n\ + key <AE07> {\n\ + symbols[Group1]= [ 7, ampersand ],\n\ + symbols[Group2]= [ braceleft, seveneighths ]\n\ + };\n\ + key <AE08> {\n\ + symbols[Group1]= [ 8, asterisk ],\n\ + symbols[Group2]= [ bracketleft, trademark ]\n\ + };\n\ + key <AE09> {\n\ + symbols[Group1]= [ 9, parenleft ],\n\ + symbols[Group2]= [ bracketright, plusminus ]\n\ + };\n\ + key <AE10> {\n\ + symbols[Group1]= [ 0, parenright ],\n\ + symbols[Group2]= [ braceright, degree ]\n\ + };\n\ + key <AE11> {\n\ + symbols[Group1]= [ minus, underscore ],\n\ + symbols[Group2]= [ backslash, questiondown ]\n\ + };\n\ + key <AE12> {\n\ + symbols[Group1]= [ equal, plus ],\n\ + symbols[Group2]= [ dead_cedilla, dead_ogonek ]\n\ + };\n\ + key <BKSP> { [ BackSpace ] };\n\ + key <TAB> { [ Tab, ISO_Left_Tab ] };\n\ + key <AD01> {\n\ + symbols[Group1]= [ q, Q ],\n\ + symbols[Group2]= [ at, Greek_OMEGA ]\n\ + };\n\ + key <AD02> {\n\ + symbols[Group1]= [ w, W ],\n\ + symbols[Group2]= [ lstroke, Lstroke ]\n\ + };\n\ + key <AD03> {\n\ + symbols[Group1]= [ e, E ],\n\ + symbols[Group2]= [ EuroSign ]\n\ + };\n\ + key <AD04> {\n\ + symbols[Group1]= [ r, R ],\n\ + symbols[Group2]= [ paragraph, registered ]\n\ + };\n\ + key <AD05> {\n\ + symbols[Group1]= [ t, T ],\n\ + symbols[Group2]= [ tslash, Tslash ]\n\ + };\n\ + key <AD06> {\n\ + symbols[Group1]= [ y, Y ],\n\ + symbols[Group2]= [ leftarrow, yen ]\n\ + };\n\ + key <AD07> {\n\ + symbols[Group1]= [ u, U ],\n\ + symbols[Group2]= [ downarrow, uparrow ]\n\ + };\n\ + key <AD08> {\n\ + symbols[Group1]= [ i, I ],\n\ + symbols[Group2]= [ rightarrow, idotless ]\n\ + };\n\ + key <AD09> {\n\ + symbols[Group1]= [ o, O ],\n\ + symbols[Group2]= [ oslash, Ooblique ]\n\ + };\n\ + key <AD10> {\n\ + symbols[Group1]= [ p, P ],\n\ + symbols[Group2]= [ thorn, THORN ]\n\ + };\n\ + key <AD11> {\n\ + symbols[Group1]= [ bracketleft, braceleft ],\n\ + symbols[Group2]= [ dead_diaeresis, dead_abovering ]\n\ + };\n\ + key <AD12> {\n\ + symbols[Group1]= [ bracketright, braceright ],\n\ + symbols[Group2]= [ dead_tilde, dead_macron ]\n\ + };\n\ + key <RTRN> { [ Return ] };\n\ + key <LCTL> {\n\ + symbols[Group1]= [ Control_L ],\n\ + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\ + };\n\ + key <AC01> {\n\ + symbols[Group1]= [ a, A ],\n\ + symbols[Group2]= [ ae, AE ]\n\ + };\n\ + key <AC02> {\n\ + symbols[Group1]= [ s, S ],\n\ + symbols[Group2]= [ ssharp, section ]\n\ + };\n\ + key <AC03> {\n\ + symbols[Group1]= [ d, D ],\n\ + symbols[Group2]= [ eth, ETH ]\n\ + };\n\ + key <AC04> {\n\ + symbols[Group1]= [ f, F ],\n\ + symbols[Group2]= [ dstroke, ordfeminine ]\n\ + };\n\ + key <AC05> {\n\ + symbols[Group1]= [ g, G ],\n\ + symbols[Group2]= [ eng, ENG ]\n\ + };\n\ + key <AC06> {\n\ + symbols[Group1]= [ h, H ],\n\ + symbols[Group2]= [ hstroke, Hstroke ]\n\ + };\n\ + key <AC07> { [ j, J ] };\n\ + key <AC08> {\n\ + symbols[Group1]= [ k, K ],\n\ + symbols[Group2]= [ kra, ampersand ]\n\ + };\n\ + key <AC09> {\n\ + symbols[Group1]= [ l, L ],\n\ + symbols[Group2]= [ lstroke, Lstroke ]\n\ + };\n\ + key <AC10> {\n\ + symbols[Group1]= [ semicolon, colon ],\n\ + symbols[Group2]= [ dead_acute, dead_doubleacute ]\n\ + };\n\ + key <AC11> {\n\ + symbols[Group1]= [ apostrophe, quotedbl ],\n\ + symbols[Group2]= [ dead_circumflex, dead_caron ]\n\ + };\n\ + key <TLDE> {\n\ + symbols[Group1]= [ grave, asciitilde ],\n\ + symbols[Group2]= [ notsign ]\n\ + };\n\ + key <LFSH> {\n\ + symbols[Group1]= [ Shift_L ],\n\ + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\ + };\n\ + key <BKSL> {\n\ + symbols[Group1]= [ backslash, bar ],\n\ + symbols[Group2]= [ dead_grave, dead_breve ]\n\ + };\n\ + key <AB01> {\n\ + symbols[Group1]= [ z, Z ],\n\ + symbols[Group2]= [ guillemotleft, less ]\n\ + };\n\ + key <AB02> {\n\ + symbols[Group1]= [ x, X ],\n\ + symbols[Group2]= [ guillemotright, greater ]\n\ + };\n\ + key <AB03> {\n\ + symbols[Group1]= [ c, C ],\n\ + symbols[Group2]= [ cent, copyright ]\n\ + };\n\ + key <AB04> {\n\ + symbols[Group1]= [ v, V ],\n\ + symbols[Group2]= [ leftdoublequotemark, grave ]\n\ + };\n\ + key <AB05> {\n\ + symbols[Group1]= [ b, B ],\n\ + symbols[Group2]= [ rightdoublequotemark, apostrophe ]\n\ + };\n\ + key <AB06> { [ n, N ] };\n\ + key <AB07> {\n\ + symbols[Group1]= [ m, M ],\n\ + symbols[Group2]= [ mu, masculine ]\n\ + };\n\ + key <AB08> {\n\ + symbols[Group1]= [ comma, less ],\n\ + symbols[Group2]= [ horizconnector, multiply ]\n\ + };\n\ + key <AB09> {\n\ + symbols[Group1]= [ period, greater ],\n\ + symbols[Group2]= [ periodcentered, division ]\n\ + };\n\ + key <AB10> {\n\ + symbols[Group1]= [ slash, question ],\n\ + symbols[Group2]= [ dead_belowdot, dead_abovedot ]\n\ + };\n\ + key <RTSH> {\n\ + symbols[Group1]= [ Shift_R ],\n\ + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\ + };\n\ + key <KPMU> {\n\ + symbols[Group1]= [ KP_Multiply ],\n\ + actions[Group1]= [ SetPtrDflt(affect=button,button=2) ]\n\ + };\n\ + key <LALT> {\n\ + symbols[Group1]= [ Alt_L, Meta_L ],\n\ + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks), SetMods(modifiers=modMapMods,clearLocks) ]\n\ + };\n\ + key <SPCE> { [ space ] };\n\ + key <CAPS> {\n\ + symbols[Group1]= [ Caps_Lock ],\n\ + actions[Group1]= [ LockMods(modifiers=Lock) ]\n\ + };\n\ + key <FK01> { [ F1 ] };\n\ + key <FK02> { [ F2 ] };\n\ + key <FK03> { [ F3 ] };\n\ + key <FK04> { [ F4 ] };\n\ + key <FK05> { [ F5 ] };\n\ + key <FK06> { [ F6 ] };\n\ + key <FK07> { [ F7 ] };\n\ + key <FK08> { [ F8 ] };\n\ + key <FK09> { [ F9 ] };\n\ + key <FK10> { [ F10 ] };\n\ + key <NMLK> {\n\ + symbols[Group1]= [ Num_Lock, Pointer_EnableKeys ],\n\ + actions[Group1]= [ LockMods(modifiers=NumLock), LockControls(controls=MouseKeys) ]\n\ + };\n\ + key <SCLK> {\n\ + symbols[Group1]= [ Scroll_Lock ],\n\ + actions[Group1]= [ LockMods(modifiers=modMapMods) ]\n\ + };\n\ + key <KP7> {\n\ + symbols[Group1]= [ KP_Home, KP_7 ],\n\ + actions[Group1]= [ MovePtr(x=-1,y=-1), MovePtr(x=-1,y=-1) ]\n\ + };\n\ + key <KP8> {\n\ + symbols[Group1]= [ KP_Up, KP_8 ],\n\ + actions[Group1]= [ MovePtr(x=+0,y=-1), MovePtr(x=+0,y=-1) ]\n\ + };\n\ + key <KP9> {\n\ + symbols[Group1]= [ KP_Prior, KP_9 ],\n\ + actions[Group1]= [ MovePtr(x=+1,y=-1), MovePtr(x=+1,y=-1) ]\n\ + };\n\ + key <KPSU> {\n\ + symbols[Group1]= [ KP_Subtract ],\n\ + actions[Group1]= [ SetPtrDflt(affect=button,button=3) ]\n\ + };\n\ + key <KP4> {\n\ + symbols[Group1]= [ KP_Left, KP_4 ],\n\ + actions[Group1]= [ MovePtr(x=-1,y=+0), MovePtr(x=-1,y=+0) ]\n\ + };\n\ + key <KP5> {\n\ + symbols[Group1]= [ KP_Begin, KP_5 ],\n\ + actions[Group1]= [ PtrBtn(button=default), PtrBtn(button=default) ]\n\ + };\n\ + key <KP6> {\n\ + symbols[Group1]= [ KP_Right, KP_6 ],\n\ + actions[Group1]= [ MovePtr(x=+1,y=+0), MovePtr(x=+1,y=+0) ]\n\ + };\n\ + key <KPAD> {\n\ + symbols[Group1]= [ KP_Add ],\n\ + actions[Group1]= [ PtrBtn(button=default,count=2) ]\n\ + };\n\ + key <KP1> {\n\ + symbols[Group1]= [ KP_End, KP_1 ],\n\ + actions[Group1]= [ MovePtr(x=-1,y=+1), MovePtr(x=-1,y=+1) ]\n\ + };\n\ + key <KP2> {\n\ + symbols[Group1]= [ KP_Down, KP_2 ],\n\ + actions[Group1]= [ MovePtr(x=+0,y=+1), MovePtr(x=+0,y=+1) ]\n\ + };\n\ + key <KP3> {\n\ + symbols[Group1]= [ KP_Next, KP_3 ],\n\ + actions[Group1]= [ MovePtr(x=+1,y=+1), MovePtr(x=+1,y=+1) ]\n\ + };\n\ + key <KP0> {\n\ + symbols[Group1]= [ KP_Insert, KP_0 ],\n\ + actions[Group1]= [ LockPtrBtn(button=default,affect=lock), LockPtrBtn(button=default,affect=lock) ]\n\ + };\n\ + key <KPDL> {\n\ + symbols[Group1]= [ KP_Delete, KP_Decimal ],\n\ + actions[Group1]= [ LockPtrBtn(button=default,affect=unlock), LockPtrBtn(button=default,affect=unlock) ]\n\ + };\n\ + key <SYRQ> {\n\ + type= \"PC_SYSRQ\",\n\ + symbols[Group1]= [ Print, Sys_Req ]\n\ + };\n\ + key <FK11> { [ F11 ] };\n\ + key <FK12> { [ F12 ] };\n\ + key <HOME> { [ Home ] };\n\ + key <UP> { [ Up ] };\n\ + key <PGUP> { [ Prior ] };\n\ + key <LEFT> { [ Left ] };\n\ + key <RGHT> { [ Right ] };\n\ + key <END> { [ End ] };\n\ + key <DOWN> { [ Down ] };\n\ + key <PGDN> { [ Next ] };\n\ + key <INS> { [ Insert ] };\n\ + key <DELE> { [ Delete ] };\n\ + key <KPEN> { [ KP_Enter ] };\n\ + key <RCTL> {\n\ + symbols[Group1]= [ Control_R ],\n\ + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\ + };\n\ + key <PAUS> {\n\ + type= \"PC_BREAK\",\n\ + symbols[Group1]= [ Pause, Break ]\n\ + };\n\ + key <PRSC> {\n\ + type= \"PC_SYSRQ\",\n\ + symbols[Group1]= [ Print, Sys_Req ]\n\ + };\n\ + key <KPDV> {\n\ + symbols[Group1]= [ KP_Divide ],\n\ + actions[Group1]= [ SetPtrDflt(affect=button,button=1) ]\n\ + };\n\ + key <RALT> {\n\ + symbols[Group1]= [ Mode_switch ],\n\ + actions[Group1]= [ SetGroup(group=+1) ]\n\ + };\n\ + key <BRK> {\n\ + type= \"PC_BREAK\",\n\ + symbols[Group1]= [ Pause, Break ]\n\ + };\n\ + key <LWIN> {\n\ + symbols[Group1]= [ Super_L ],\n\ + actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks) ]\n\ + };\n\ + key <RWIN> { [ Multi_key ] };\n\ + key <MENU> { [ Menu ] };\n\ + modifier_map Control { <LCTL> };\n\ + modifier_map Shift { <LFSH> };\n\ + modifier_map Shift { <RTSH> };\n\ + modifier_map Mod1 { <LALT> };\n\ + modifier_map Lock { <CAPS> };\n\ + modifier_map Mod2 { <NMLK> };\n\ + modifier_map Mod5 { <SCLK> };\n\ + modifier_map Control { <RCTL> };\n\ + modifier_map Mod3 { <RALT> };\n\ + modifier_map Mod4 { <LWIN> };\n\ +};\n\ +\n\ +xkb_geometry \"pc(pc104)\" {\n\ +\n\ + width= 470;\n\ + height= 210;\n\ +\n\ + alias <AC00> = <CAPS>;\n\ + alias <AA00> = <LCTL>;\n\ +\n\ + baseColor= \"white\";\n\ + labelColor= \"black\";\n\ + xfont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\ + description= \"Generic 104\";\n\ +\n\ + shape \"NORM\" {\n\ + corner= 1,\n\ + { [ 18, 18 ] },\n\ + { [ 2, 1 ], [ 16, 16 ] }\n\ + };\n\ + shape \"BKSP\" {\n\ + corner= 1,\n\ + { [ 38, 18 ] },\n\ + { [ 2, 1 ], [ 36, 16 ] }\n\ + };\n\ + shape \"TABK\" {\n\ + corner= 1,\n\ + { [ 28, 18 ] },\n\ + { [ 2, 1 ], [ 26, 16 ] }\n\ + };\n\ + shape \"BKSL\" {\n\ + corner= 1,\n\ + { [ 28, 18 ] },\n\ + { [ 2, 1 ], [ 26, 16 ] }\n\ + };\n\ + shape \"RTRN\" {\n\ + corner= 1,\n\ + { [ 42, 18 ] },\n\ + { [ 2, 1 ], [ 40, 16 ] }\n\ + };\n\ + shape \"CAPS\" {\n\ + corner= 1,\n\ + { [ 33, 18 ] },\n\ + { [ 2, 1 ], [ 31, 16 ] }\n\ + };\n\ + shape \"LFSH\" {\n\ + corner= 1,\n\ + { [ 42, 18 ] },\n\ + { [ 2, 1 ], [ 40, 16 ] }\n\ + };\n\ + shape \"RTSH\" {\n\ + corner= 1,\n\ + { [ 52, 18 ] },\n\ + { [ 2, 1 ], [ 50, 16 ] }\n\ + };\n\ + shape \"MODK\" {\n\ + corner= 1,\n\ + { [ 27, 18 ] },\n\ + { [ 2, 1 ], [ 25, 16 ] }\n\ + };\n\ + shape \"SMOD\" {\n\ + corner= 1,\n\ + { [ 23, 18 ] },\n\ + { [ 2, 1 ], [ 21, 16 ] }\n\ + };\n\ + shape \"SPCE\" {\n\ + corner= 1,\n\ + { [ 113, 18 ] },\n\ + { [ 2, 1 ], [ 111, 16 ] }\n\ + };\n\ + shape \"KP0\" {\n\ + corner= 1,\n\ + { [ 37, 18 ] },\n\ + { [ 2, 1 ], [ 35, 16 ] }\n\ + };\n\ + shape \"KPAD\" {\n\ + corner= 1,\n\ + { [ 18, 37 ] },\n\ + { [ 2, 1 ], [ 16, 35 ] }\n\ + };\n\ + shape \"LEDS\" { { [ 75, 20 ] } };\n\ + shape \"LED\" { { [ 5, 1 ] } };\n\ + section \"Function\" {\n\ + key.color= \"grey20\";\n\ + priority= 7;\n\ + top= 52;\n\ + left= 19;\n\ + width= 351;\n\ + height= 19;\n\ + row {\n\ + top= 1;\n\ + left= 1;\n\ + keys {\n\ + { <ESC>, \"NORM\", 1 },\n\ + { <FK01>, \"NORM\", 20, color=\"white\" },\n\ + { <FK02>, \"NORM\", 1, color=\"white\" },\n\ + { <FK03>, \"NORM\", 1, color=\"white\" },\n\ + { <FK04>, \"NORM\", 1, color=\"white\" },\n\ + { <FK05>, \"NORM\", 11, color=\"white\" },\n\ + { <FK06>, \"NORM\", 1, color=\"white\" },\n\ + { <FK07>, \"NORM\", 1, color=\"white\" },\n\ + { <FK08>, \"NORM\", 1, color=\"white\" },\n\ + { <FK09>, \"NORM\", 11, color=\"white\" },\n\ + { <FK10>, \"NORM\", 1, color=\"white\" },\n\ + { <FK11>, \"NORM\", 1, color=\"white\" },\n\ + { <FK12>, \"NORM\", 1, color=\"white\" },\n\ + { <PRSC>, \"NORM\", 8, color=\"white\" },\n\ + { <SCLK>, \"NORM\", 1, color=\"white\" },\n\ + { <PAUS>, \"NORM\", 1, color=\"white\" }\n\ + };\n\ + };\n\ + }; // End of \"Function\" section\n\ +\n\ + section \"Alpha\" {\n\ + key.color= \"white\";\n\ + priority= 8;\n\ + top= 91;\n\ + left= 19;\n\ + width= 287;\n\ + height= 95;\n\ + row {\n\ + top= 1;\n\ + left= 1;\n\ + keys {\n\ + { <TLDE>, \"NORM\", 1 }, { <AE01>, \"NORM\", 1 },\n\ + { <AE02>, \"NORM\", 1 }, { <AE03>, \"NORM\", 1 },\n\ + { <AE04>, \"NORM\", 1 }, { <AE05>, \"NORM\", 1 },\n\ + { <AE06>, \"NORM\", 1 }, { <AE07>, \"NORM\", 1 },\n\ + { <AE08>, \"NORM\", 1 }, { <AE09>, \"NORM\", 1 },\n\ + { <AE10>, \"NORM\", 1 }, { <AE11>, \"NORM\", 1 },\n\ + { <AE12>, \"NORM\", 1 },\n\ + { <BKSP>, \"BKSP\", 1, color=\"grey20\" }\n\ + };\n\ + };\n\ + row {\n\ + top= 20;\n\ + left= 1;\n\ + keys {\n\ + { <TAB>, \"TABK\", 1, color=\"grey20\" },\n\ + { <AD01>, \"NORM\", 1 }, { <AD02>, \"NORM\", 1 },\n\ + { <AD03>, \"NORM\", 1 }, { <AD04>, \"NORM\", 1 },\n\ + { <AD05>, \"NORM\", 1 }, { <AD06>, \"NORM\", 1 },\n\ + { <AD07>, \"NORM\", 1 }, { <AD08>, \"NORM\", 1 },\n\ + { <AD09>, \"NORM\", 1 }, { <AD10>, \"NORM\", 1 },\n\ + { <AD11>, \"NORM\", 1 }, { <AD12>, \"NORM\", 1 },\n\ + { <BKSL>, \"BKSL\", 1 }\n\ + };\n\ + };\n\ + row {\n\ + top= 39;\n\ + left= 1;\n\ + keys {\n\ + { <CAPS>, \"CAPS\", 1, color=\"grey20\" },\n\ + { <AC01>, \"NORM\", 1 }, { <AC02>, \"NORM\", 1 },\n\ + { <AC03>, \"NORM\", 1 }, { <AC04>, \"NORM\", 1 },\n\ + { <AC05>, \"NORM\", 1 }, { <AC06>, \"NORM\", 1 },\n\ + { <AC07>, \"NORM\", 1 }, { <AC08>, \"NORM\", 1 },\n\ + { <AC09>, \"NORM\", 1 }, { <AC10>, \"NORM\", 1 },\n\ + { <AC11>, \"NORM\", 1 },\n\ + { <RTRN>, \"RTRN\", 1, color=\"grey20\" }\n\ + };\n\ + };\n\ + row {\n\ + top= 58;\n\ + left= 1;\n\ + keys {\n\ + { <LFSH>, \"LFSH\", 1, color=\"grey20\" },\n\ + { <AB01>, \"NORM\", 1 }, { <AB02>, \"NORM\", 1 },\n\ + { <AB03>, \"NORM\", 1 }, { <AB04>, \"NORM\", 1 },\n\ + { <AB05>, \"NORM\", 1 }, { <AB06>, \"NORM\", 1 },\n\ + { <AB07>, \"NORM\", 1 }, { <AB08>, \"NORM\", 1 },\n\ + { <AB09>, \"NORM\", 1 }, { <AB10>, \"NORM\", 1 },\n\ + { <RTSH>, \"RTSH\", 1, color=\"grey20\" }\n\ + };\n\ + };\n\ + row {\n\ + top= 77;\n\ + left= 1;\n\ + keys {\n\ + { <LCTL>, \"MODK\", 1, color=\"grey20\" },\n\ + { <LWIN>, \"SMOD\", 1, color=\"grey20\" },\n\ + { <LALT>, \"SMOD\", 1, color=\"grey20\" },\n\ + { <SPCE>, \"SPCE\", 1 },\n\ + { <RALT>, \"SMOD\", 1, color=\"grey20\" },\n\ + { <RWIN>, \"SMOD\", 1, color=\"grey20\" },\n\ + { <MENU>, \"SMOD\", 1, color=\"grey20\" },\n\ + { <RCTL>, \"SMOD\", 1, color=\"grey20\" }\n\ + };\n\ + };\n\ + }; // End of \"Alpha\" section\n\ +\n\ + section \"Editing\" {\n\ + key.color= \"grey20\";\n\ + priority= 9;\n\ + top= 91;\n\ + left= 312;\n\ + width= 58;\n\ + height= 95;\n\ + row {\n\ + top= 1;\n\ + left= 1;\n\ + keys {\n\ + { <INS>, \"NORM\", 1 }, { <HOME>, \"NORM\", 1 },\n\ + { <PGUP>, \"NORM\", 1 }\n\ + };\n\ + };\n\ + row {\n\ + top= 20;\n\ + left= 1;\n\ + keys {\n\ + { <DELE>, \"NORM\", 1 }, { <END>, \"NORM\", 1 },\n\ + { <PGDN>, \"NORM\", 1 }\n\ + };\n\ + };\n\ + row {\n\ + top= 58;\n\ + left= 20;\n\ + keys {\n\ + { <UP>, \"NORM\", 1 }\n\ + };\n\ + };\n\ + row {\n\ + top= 77;\n\ + left= 1;\n\ + keys {\n\ + { <LEFT>, \"NORM\", 1 }, { <DOWN>, \"NORM\", 1 },\n\ + { <RGHT>, \"NORM\", 1 }\n\ + };\n\ + };\n\ + }; // End of \"Editing\" section\n\ +\n\ + section \"Keypad\" {\n\ + key.color= \"grey20\";\n\ + priority= 10;\n\ + top= 91;\n\ + left= 376;\n\ + width= 77;\n\ + height= 95;\n\ + row {\n\ + top= 1;\n\ + left= 1;\n\ + keys {\n\ + { <NMLK>, \"NORM\", 1 }, { <KPDV>, \"NORM\", 1 },\n\ + { <KPMU>, \"NORM\", 1 }, { <KPSU>, \"NORM\", 1 }\n\ + };\n\ + };\n\ + row {\n\ + top= 20;\n\ + left= 1;\n\ + keys {\n\ + { <KP7>, \"NORM\", 1, color=\"white\" },\n\ + { <KP8>, \"NORM\", 1, color=\"white\" },\n\ + { <KP9>, \"NORM\", 1, color=\"white\" },\n\ + { <KPAD>, \"KPAD\", 1 }\n\ + };\n\ + };\n\ + row {\n\ + top= 39;\n\ + left= 1;\n\ + keys {\n\ + { <KP4>, \"NORM\", 1, color=\"white\" },\n\ + { <KP5>, \"NORM\", 1, color=\"white\" },\n\ + { <KP6>, \"NORM\", 1, color=\"white\" }\n\ + };\n\ + };\n\ + row {\n\ + top= 58;\n\ + left= 1;\n\ + keys {\n\ + { <KP1>, \"NORM\", 1, color=\"white\" },\n\ + { <KP2>, \"NORM\", 1, color=\"white\" },\n\ + { <KP3>, \"NORM\", 1, color=\"white\" },\n\ + { <KPEN>, \"KPAD\", 1 }\n\ + };\n\ + };\n\ + row {\n\ + top= 77;\n\ + left= 1;\n\ + keys {\n\ + { <KP0>, \"KP0\", 1, color=\"white\" },\n\ + { <KPDL>, \"NORM\", 1, color=\"white\" }\n\ + };\n\ + };\n\ + }; // End of \"Keypad\" section\n\ +\n\ + solid \"LedPanel\" {\n\ + top= 52;\n\ + left= 377;\n\ + priority= 0;\n\ + color= \"grey10\";\n\ + shape= \"LEDS\";\n\ + };\n\ + indicator \"NumLock\" {\n\ + top= 67;\n\ + left= 382;\n\ + priority= 1;\n\ + onColor= \"green\";\n\ + offColor= \"green30\";\n\ + shape= \"LED\";\n\ + };\n\ + indicator \"CapsLock\" {\n\ + top= 67;\n\ + left= 407;\n\ + priority= 2;\n\ + onColor= \"green\";\n\ + offColor= \"green30\";\n\ + shape= \"LED\";\n\ + };\n\ + indicator \"ScrollLock\" {\n\ + top= 67;\n\ + left= 433;\n\ + priority= 3;\n\ + onColor= \"green\";\n\ + offColor= \"green30\";\n\ + shape= \"LED\";\n\ + };\n\ + text \"NumLockLabel\" {\n\ + top= 55;\n\ + left= 378;\n\ + priority= 4;\n\ + width= 19.8;\n\ + height= 10;\n\ + XFont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\ + text= \"Num\\nLock\";\n\ + };\n\ + text \"CapsLockLabel\" {\n\ + top= 55;\n\ + left= 403;\n\ + priority= 5;\n\ + width= 26.4;\n\ + height= 10;\n\ + XFont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\ + text= \"Caps\\nLock\";\n\ + };\n\ + text \"ScrollLockLabel\" {\n\ + top= 55;\n\ + left= 428;\n\ + priority= 6;\n\ + width= 39.6;\n\ + height= 10;\n\ + XFont= \"-*-helvetica-medium-r-normal--*-120-*-*-*-*-iso8859-1\";\n\ + text= \"Scroll\\nLock\";\n\ + };\n\ +};\n\ +\n\ +};\n\ +\0"; diff --git a/console-client/xkb/xkbtimer.c b/console-client/xkb/xkbtimer.c new file mode 100644 index 00000000..f50bb9ad --- /dev/null +++ b/console-client/xkb/xkbtimer.c @@ -0,0 +1,236 @@ +/* xkbtimer.c -- Manage XKB timers. + + Copyright (C) 2003, 2004 Marco Gerards + + Written by Marco Gerards <marco@student.han.nl> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. */ + +/* XKB requires a timer for key repeat and accessibility. Carefully + stack all compatibility features. */ + +#include <mach.h> +#include <errno.h> +#include <assert.h> + +#include "xkb.h" +#include "timer.h" + +/* Lock the access to handle_key. */ +static struct mutex *lock_key; + +/* Timer used to time key controls. */ +//static struct timer_list key_timer; + +/* For key repeat. */ +static int key_delay = 0; +static int key_repeat = 0; + +/* SlowKeys. */ +static int slowkeys_delay = 50; +static int slowkeys_active = 0; + +/* BounceKeys. */ +static int bouncekeys_delay = 100; +static int bouncekeys_active = 0; + +/* The current status of the timer. */ +enum timer_status + { + timer_stopped, + timer_slowkeys, + timer_repeat_delay, + timer_repeating + }; + +static struct per_key_timer +{ + /* Used for slowkeys and repeat. */ + struct timer_list enable_timer; + + /* Status of the enable timer. */ + enum timer_status enable_status; + + /* Used for bouncekeys. */ + struct timer_list disable_timer; +} per_key_timers[255]; + +/* The last pressed key. Only this key may generate keyrepeat events. */ +static int lastkey = 0; + +error_t +xkb_handle_key (keycode_t kc) +{ + static keycode_t prevkc = 0; + keypress_t key; + + key.keycode = kc & 127; + key.prevkc = prevkc; + key.repeat = (prevkc == kc); + key.redir = 0; + key.rel = kc & 128; + keystate[key.keycode & 127].keypressed = key.rel ? 0 : 1; + debug_printf ("PRESSED: %d\n", !(key.rel)); + xkb_input (key); + prevkc = key.keycode; + return 0; +} + +error_t +xkb_init_repeat (int delay, int repeat) +{ + error_t err; + err = timer_init (); + if (err) + return err; + + key_delay = delay; + key_repeat = repeat; + + return 0; +} + +static int +key_enable (void *handle) +{ + int key = (int) handle; + + /* Enable the key. */ + keystate[key].disabled = 0; + + return 0; +} + +/* Called by key timer. The global variable timer_status determines + the current control. */ +static int +key_timing (void *handle) +{ + int current_key = (int) handle; + + xkb_handle_key (current_key); + + /* Another key was pressed after this key, stop repeating. */ + if (lastkey != current_key) + { + per_key_timers[current_key].enable_status = timer_stopped; + return 0; + } + + switch (per_key_timers[current_key].enable_status) + { + case timer_stopped: + assert ("Stopped timer triggered timer event\n"); + break; + case timer_slowkeys: + per_key_timers[current_key].enable_timer.expires + = fetch_jiffies () + key_delay; + lastkey = current_key; + + if (keys[current_key].flags & KEYNOREPEAT) + { + per_key_timers[current_key].enable_status = timer_stopped; + /* Stop the timer. */ + return 0; + } + else + { + per_key_timers[current_key].enable_status = timer_repeat_delay; + } + break; + case timer_repeat_delay: + per_key_timers[current_key].enable_status = timer_repeating; + /* Fall through. */ + case timer_repeating: + per_key_timers[current_key].enable_timer.expires + = fetch_jiffies () + key_repeat; + break; + } + return 1; +} + +error_t +xkb_input_key (int key) +{ + int pressed = !(key & 128); + int keyc = key & 127; + + debug_printf ("KEYIN: %d\n", key); + + /* Filter out any double or disabled keys. */ + if (key == lastkey || keystate[keyc].disabled) + return 0; + + /* Always handle keyrelease events. */ + if (!pressed) + { + /* Stop the timer for this released key. */ + if (per_key_timers[keyc].enable_status != timer_stopped) + { + timer_remove (&per_key_timers[keyc].enable_timer); + per_key_timers[keyc].enable_status = timer_stopped; + } + + /* No more last key; it was released. */ + if (keyc == lastkey) + lastkey = 0; + + /* Make sure the key was pressed before releasing it, it might + not have been accepted. */ + if (keystate[key & 127].keypressed) + xkb_handle_key (key); + + /* If bouncekeys is active, disable the key. */ + if (bouncekeys_active) + { + keystate[keyc].disabled = 1; + + /* Setup a timer to enable the key. */ + timer_clear (&per_key_timers[keyc].disable_timer); + per_key_timers[keyc].disable_timer.fnc = key_enable; + per_key_timers[keyc].disable_timer.fnc_data = (void *) keyc; + per_key_timers[keyc].disable_timer.expires + = fetch_jiffies () + bouncekeys_delay; + timer_add (&per_key_timers[keyc].disable_timer); + } + + return 0; + } + + /* Setup the timer for slowkeys. */ + timer_clear (&per_key_timers[keyc].enable_timer); + lastkey = keyc; + per_key_timers[keyc].enable_timer.fnc = key_timing; + per_key_timers[keyc].enable_timer.fnc_data = (void *) keyc; + + if (slowkeys_active) + { + per_key_timers[keyc].enable_status = timer_slowkeys; + per_key_timers[keyc].enable_timer.expires + = fetch_jiffies () + slowkeys_delay; + } + else + { + /* Immediatly report the keypress. */ + xkb_handle_key (keyc); + + /* Check if this repeat is allowed for this keycode. */ + if (keys[keyc].flags & KEYNOREPEAT) + return 0; /* Nope. */ + + per_key_timers[keyc].enable_status = timer_repeat_delay; + per_key_timers[keyc].enable_timer.expires + = fetch_jiffies () + key_delay; + } + timer_add (&per_key_timers[keyc].enable_timer); + + return 0; +} |