summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--context/data/context.properties59
-rw-r--r--metapost/context/base/mp-base.mp5
-rw-r--r--scripts/context/lua/luatools.cmd5
-rw-r--r--scripts/context/lua/luatools.lua5155
-rw-r--r--scripts/context/lua/mtx-cache.lua92
-rw-r--r--scripts/context/lua/mtx-fonts.lua90
-rw-r--r--scripts/context/lua/mtxrun.cmd5
-rw-r--r--scripts/context/lua/mtxrun.lua4625
-rw-r--r--scripts/context/lua/x-ldx.lua310
-rw-r--r--scripts/context/ruby/base/merge.rb2
-rw-r--r--scripts/context/ruby/ctxtools.rb17
-rw-r--r--scripts/context/ruby/mtxtools.rb475
-rw-r--r--scripts/context/ruby/texmfstart.rb502
-rw-r--r--tex/context/base/attr-ini.lua669
-rw-r--r--tex/context/base/attr-ini.tex199
-rw-r--r--tex/context/base/char-cmp.lua260
-rw-r--r--tex/context/base/char-def.lua17736
-rw-r--r--tex/context/base/char-def.tex47
-rw-r--r--tex/context/base/char-ini.lua280
-rw-r--r--tex/context/base/char-ini.tex20
-rw-r--r--tex/context/base/char-utf.lua298
-rw-r--r--tex/context/base/char-utf.tex54
-rw-r--r--tex/context/base/colo-ini.tex20
-rw-r--r--tex/context/base/colo-run.tex29
-rw-r--r--tex/context/base/cont-mtx.tex25
-rw-r--r--tex/context/base/cont-new.mkiv93
-rw-r--r--tex/context/base/context-debug.lmx108
-rw-r--r--tex/context/base/context-error.lmx55
-rw-r--r--tex/context/base/context.css226
-rw-r--r--tex/context/base/context.tex11
-rw-r--r--tex/context/base/core-buf.lua377
-rw-r--r--tex/context/base/core-buf.mkiv107
-rw-r--r--tex/context/base/core-con.lua164
-rw-r--r--tex/context/base/core-con.mkiv90
-rw-r--r--tex/context/base/core-des.tex19
-rw-r--r--tex/context/base/core-itm.tex38
-rw-r--r--tex/context/base/core-lst.tex2
-rw-r--r--tex/context/base/core-ntb.tex8
-rw-r--r--tex/context/base/core-obj.lua36
-rw-r--r--tex/context/base/core-obj.mkiv55
-rw-r--r--tex/context/base/core-pos.lua95
-rw-r--r--tex/context/base/core-pos.mkiv65
-rw-r--r--tex/context/base/core-reg.lua237
-rw-r--r--tex/context/base/core-reg.mkiv57
-rw-r--r--tex/context/base/core-sec.tex3
-rw-r--r--tex/context/base/core-spa.lua526
-rw-r--r--tex/context/base/core-spa.mkiv126
-rw-r--r--tex/context/base/core-syn.lua116
-rw-r--r--tex/context/base/core-syn.mkiv51
-rw-r--r--tex/context/base/core-sys.mkiv23
-rw-r--r--tex/context/base/core-two.lua83
-rw-r--r--tex/context/base/core-two.mkiv74
-rw-r--r--tex/context/base/core-uti.lua29
-rw-r--r--tex/context/base/core-uti.mkiv103
-rw-r--r--tex/context/base/core-ver.mkiv207
-rw-r--r--tex/context/base/core-ver.tex4
-rw-r--r--tex/context/base/enco-def.tex16
-rw-r--r--tex/context/base/enco-ini.mkiv69
-rw-r--r--tex/context/base/enco-pfr.mkiv20
-rw-r--r--tex/context/base/font-afm.lua574
-rw-r--r--tex/context/base/font-def.lua477
-rw-r--r--tex/context/base/font-enc.lua98
-rw-r--r--tex/context/base/font-fbk.lua219
-rw-r--r--tex/context/base/font-ini.lua57
-rw-r--r--tex/context/base/font-ini.mkii57
-rw-r--r--tex/context/base/font-ini.mkiv72
-rw-r--r--tex/context/base/font-ini.tex818
-rw-r--r--tex/context/base/font-map.lua172
-rw-r--r--tex/context/base/font-otf.lua3416
-rw-r--r--tex/context/base/font-syn.lua285
-rw-r--r--tex/context/base/font-tfm.lua479
-rw-r--r--tex/context/base/font-vf.lua213
-rw-r--r--tex/context/base/l-aux.lua39
-rw-r--r--tex/context/base/l-boolean.lua41
-rw-r--r--tex/context/base/l-dir.lua94
-rw-r--r--tex/context/base/l-file.lua101
-rw-r--r--tex/context/base/l-io.lua173
-rw-r--r--tex/context/base/l-math.lua25
-rw-r--r--tex/context/base/l-md5.lua18
-rw-r--r--tex/context/base/l-number.lua10
-rw-r--r--tex/context/base/l-os.lua27
-rw-r--r--tex/context/base/l-string.lua307
-rw-r--r--tex/context/base/l-table.lua492
-rw-r--r--tex/context/base/l-tex.lua110
-rw-r--r--tex/context/base/l-unicode.lua148
-rw-r--r--tex/context/base/l-utils.lua121
-rw-r--r--tex/context/base/lang-ini.lua327
-rw-r--r--tex/context/base/lang-ini.mkiv23
-rw-r--r--tex/context/base/lang-ini.tex4
-rw-r--r--tex/context/base/lang-sla.mkiv17
-rw-r--r--tex/context/base/luat-cbk.lua150
-rw-r--r--tex/context/base/luat-crl.lua53
-rw-r--r--tex/context/base/luat-deb.lua154
-rw-r--r--tex/context/base/luat-deb.tex49
-rw-r--r--tex/context/base/luat-env.lua172
-rw-r--r--tex/context/base/luat-env.tex169
-rw-r--r--tex/context/base/luat-exe.lua68
-rw-r--r--tex/context/base/luat-ini.lua11
-rw-r--r--tex/context/base/luat-ini.tex104
-rw-r--r--tex/context/base/luat-inp.lua1865
-rw-r--r--tex/context/base/luat-iop.lua157
-rw-r--r--tex/context/base/luat-kps.lua102
-rw-r--r--tex/context/base/luat-lib.lua144
-rw-r--r--tex/context/base/luat-lib.tex86
-rw-r--r--tex/context/base/luat-lmx.lua139
-rw-r--r--tex/context/base/luat-lmx.tex16
-rw-r--r--tex/context/base/luat-log.lua123
-rw-r--r--tex/context/base/luat-tex.lua389
-rw-r--r--tex/context/base/luat-tmp.lua457
-rw-r--r--tex/context/base/luat-tra.lua82
-rw-r--r--tex/context/base/luat-uni.lua23
-rw-r--r--tex/context/base/luat-uni.tex33
-rw-r--r--tex/context/base/luat-zip.lua221
-rw-r--r--tex/context/base/meta-pdf.lua585
-rw-r--r--tex/context/base/meta-pdf.mkiv155
-rw-r--r--tex/context/base/mult-sys.tex1
-rw-r--r--tex/context/base/node-ini.lua905
-rw-r--r--tex/context/base/node-ini.tex46
-rw-r--r--tex/context/base/page-imp.tex4
-rw-r--r--tex/context/base/regi-8859-1.lua26
-rw-r--r--tex/context/base/regi-8859-10.lua26
-rw-r--r--tex/context/base/regi-8859-11.lua26
-rw-r--r--tex/context/base/regi-8859-13.lua26
-rw-r--r--tex/context/base/regi-8859-14.lua26
-rw-r--r--tex/context/base/regi-8859-15.lua26
-rw-r--r--tex/context/base/regi-8859-16.lua26
-rw-r--r--tex/context/base/regi-8859-2.lua26
-rw-r--r--tex/context/base/regi-8859-3.lua26
-rw-r--r--tex/context/base/regi-8859-4.lua26
-rw-r--r--tex/context/base/regi-8859-5.lua26
-rw-r--r--tex/context/base/regi-8859-6.lua26
-rw-r--r--tex/context/base/regi-8859-7.lua26
-rw-r--r--tex/context/base/regi-8859-8.lua26
-rw-r--r--tex/context/base/regi-8859-9.lua26
-rw-r--r--tex/context/base/regi-cp1250.lua26
-rw-r--r--tex/context/base/regi-cp1251.lua26
-rw-r--r--tex/context/base/regi-cp1252.lua26
-rw-r--r--tex/context/base/regi-cp1253.lua26
-rw-r--r--tex/context/base/regi-cp1254.lua26
-rw-r--r--tex/context/base/regi-cp1255.lua26
-rw-r--r--tex/context/base/regi-cp1256.lua26
-rw-r--r--tex/context/base/regi-cp1257.lua26
-rw-r--r--tex/context/base/regi-cp1258.lua26
-rw-r--r--tex/context/base/regi-ini.lua107
-rw-r--r--tex/context/base/regi-ini.mkiv39
-rw-r--r--tex/context/base/regi-utf.tex4
-rw-r--r--tex/context/base/s-abr-01.tex140
-rw-r--r--tex/context/base/s-mag-01.tex7
-rw-r--r--tex/context/base/sort-def.mkiv16
-rw-r--r--tex/context/base/sort-ini.lua176
-rw-r--r--tex/context/base/sort-ini.mkiv21
-rw-r--r--tex/context/base/sort-lan.lua193
-rw-r--r--tex/context/base/sort-lan.mkiv16
-rw-r--r--tex/context/base/spec-def.mkiv19
-rw-r--r--tex/context/base/spec-fdf.mkiv19
-rw-r--r--tex/context/base/spec-fdf.tex4
-rw-r--r--tex/context/base/spec-pdf.lua28
-rw-r--r--tex/context/base/supp-fil.lua78
-rw-r--r--tex/context/base/supp-fil.mkiv32
-rw-r--r--tex/context/base/syst-cat.mkiv116
-rw-r--r--tex/context/base/syst-con.lua30
-rw-r--r--tex/context/base/syst-con.mkiv27
-rw-r--r--tex/context/base/syst-new.tex15
-rw-r--r--tex/context/base/syst-prm.tex44
-rw-r--r--tex/context/base/syst-rtp.mkiv18
-rw-r--r--tex/context/base/syst-str.mkiv27
-rw-r--r--tex/context/base/toks-ini.lua232
-rw-r--r--tex/context/base/toks-ini.tex25
-rw-r--r--tex/context/base/type-buy.tex1082
-rw-r--r--tex/context/base/type-cbg.tex145
-rw-r--r--tex/context/base/type-def.tex122
-rw-r--r--tex/context/base/type-exa.tex241
-rw-r--r--tex/context/base/type-fsf.tex130
-rw-r--r--tex/context/base/type-ghz.tex50
-rw-r--r--tex/context/base/type-gyr.tex189
-rw-r--r--tex/context/base/type-ini.tex51
-rw-r--r--tex/context/base/type-map.tex146
-rw-r--r--tex/context/base/type-msw.tex50
-rw-r--r--tex/context/base/type-one.tex1154
-rw-r--r--tex/context/base/type-otf.tex720
-rw-r--r--tex/context/base/type-siz.tex21
-rw-r--r--tex/context/base/type-syn.tex38
-rw-r--r--tex/context/base/type-tmf.tex1073
-rw-r--r--tex/context/base/type-xtx.tex2
-rw-r--r--tex/context/base/verb-lua.lua212
-rw-r--r--tex/context/base/verb-mp.lua234
-rw-r--r--tex/context/base/verb-tex.lua122
-rw-r--r--tex/context/base/x-ldx.ctx23
-rw-r--r--tex/context/base/x-ldx.tex133
-rw-r--r--tex/context/interface/keys-cz.xml2
-rw-r--r--tex/context/interface/keys-de.xml2
-rw-r--r--tex/context/interface/keys-en.xml2
-rw-r--r--tex/context/interface/keys-fr.xml2
-rw-r--r--tex/context/interface/keys-it.xml2
-rw-r--r--tex/context/interface/keys-nl.xml2
-rw-r--r--tex/context/interface/keys-ro.xml2
196 files changed, 55421 insertions, 2337 deletions
diff --git a/context/data/context.properties b/context/data/context.properties
index 7668e1320..1f46de94a 100644
--- a/context/data/context.properties
+++ b/context/data/context.properties
@@ -306,40 +306,51 @@ command.10.subsystem.$(file.patterns.example)=1
# 11: make
-command.name.11.$(file.patterns.context)=Generate Formats
+command.name.11.$(file.patterns.context)=Generate Formats (pdfTeX)
command.name.11.$(file.patterns.metafun)=Generate Formats
command.name.11.$(file.patterns.example)=Generate Formats
-command.11.$(file.patterns.context)=$(name.context.texexec) --make --all
+command.11.$(file.patterns.context)=$(name.context.texexec) --make --all --pdftex
command.11.$(file.patterns.metafun)=$(name.context.texexec) --make --all
command.11.$(file.patterns.example)=$(name.context.texexec) --make --all
command.11.subsystem.$(file.patterns.context)=1
command.11.subsystem.$(file.patterns.metafun)=1
command.11.subsystem.$(file.patterns.example)=1
-# 12: update
+# 12: make
-command.name.12=Update ConTeXt
-command.name.12.$(file.patterns.context)=Update ConTeXt
-command.name.12.$(file.patterns.metafun)=Update ConTeXt
-command.name.12.$(file.patterns.example)=Update ConTeXt
+command.name.12.$(file.patterns.context)=Generate Formats (luaTeX)
+command.12.$(file.patterns.context)=$(name.context.texexec) --make --all --luatex
+command.12.subsystem.$(file.patterns.context)=1
-command.12=$(name.context.update)
-command.12.$(file.patterns.context)=$(name.context.update)
-command.12.$(file.patterns.metafun)=$(name.context.update)
-command.12.$(file.patterns.example)=$(name.context.update)
+# 13: make
+command.name.13.$(file.patterns.context)=Generate Formats (XeTeX)
+command.13.$(file.patterns.context)=$(name.context.texexec) --make --all --xetex
+command.13.subsystem.$(file.patterns.context)=1
-# 12: example
+# 14: update
-command.name.13=Example Service
-command.name.13.$(file.patterns.context)=Example Service
-command.name.13.$(file.patterns.metafun)=Example Service
-command.name.13.$(file.patterns.example)=Example Service
+command.name.14=Update ConTeXt
+command.name.14.$(file.patterns.context)=Update ConTeXt
+command.name.14.$(file.patterns.metafun)=Update ConTeXt
+command.name.14.$(file.patterns.example)=Update ConTeXt
-command.13=$(name.context.wwwserver)
-command.13.$(file.patterns.context)=$(name.context.wwwserver)
-command.13.$(file.patterns.metafun)=$(name.context.wwwserver)
-command.13.$(file.patterns.example)=$(name.context.wwwserver)
+command.14=$(name.context.update)
+command.14.$(file.patterns.context)=$(name.context.update)
+command.14.$(file.patterns.metafun)=$(name.context.update)
+command.14.$(file.patterns.example)=$(name.context.update)
+
+# 15: example
+
+command.name.15=Example Service
+command.name.15.$(file.patterns.context)=Example Service
+command.name.15.$(file.patterns.metafun)=Example Service
+command.name.15.$(file.patterns.example)=Example Service
+
+command.15=$(name.context.wwwserver)
+command.15.$(file.patterns.context)=$(name.context.wwwserver)
+command.15.$(file.patterns.metafun)=$(name.context.wwwserver)
+command.15.$(file.patterns.example)=$(name.context.wwwserver)
# Editor: syntax highlighting
@@ -359,12 +370,8 @@ Alt+F12|IDM_STOPEXECUTE|\
# install: fonts/truetype/hoekwater/lm/LMTypewriter10-Regular.ttf
if PLAT_WIN
- font.monospace=font:LMTypewriter10,size:16
- font.errorfont=font:LMTypewriter10,size:12
-
-if PLAT_WIN
- font.monospace=font:lmtypewriter10 regular,size:16
- font.errorfont=font:lmtypewriter10 regular,size:12
+ font.monospace=font:LMTypewriter10-Regular,size:16
+ font.errorfont=font:LMTypewriter10-Regular,size:12
if PLAT_GTK
font.monospace=font:!lmtypewriter10 regular,size:16
diff --git a/metapost/context/base/mp-base.mp b/metapost/context/base/mp-base.mp
index 87f3fd2f7..41eb7aa96 100644
--- a/metapost/context/base/mp-base.mp
+++ b/metapost/context/base/mp-base.mp
@@ -477,10 +477,11 @@ enddef;
def label = draw thelabel enddef;
newinternal dotlabeldiam; dotlabeldiam:=3bp;
-vardef dotlabel@#(expr s,z) =
+vardef dotlabel@#(expr s,z) text t_ =
+ label@#(s,z) t_;
label@#(s,z);
interim linecap:=rounded;
- draw z withpen pencircle scaled dotlabeldiam;
+ draw z withpen pencircle scaled dotlabeldiam t_;
enddef;
def makelabel = dotlabel enddef;
diff --git a/scripts/context/lua/luatools.cmd b/scripts/context/lua/luatools.cmd
new file mode 100644
index 000000000..4bc998d65
--- /dev/null
+++ b/scripts/context/lua/luatools.cmd
@@ -0,0 +1,5 @@
+@echo off
+setlocal
+set ownpath=%~dp0%
+texlua "%ownpath%luatools.lua" %*
+endlocal
diff --git a/scripts/context/lua/luatools.lua b/scripts/context/lua/luatools.lua
new file mode 100644
index 000000000..0eb63c873
--- /dev/null
+++ b/scripts/context/lua/luatools.lua
@@ -0,0 +1,5155 @@
+#!/usr/bin/env texlua
+
+-- one can make a stub:
+--
+-- #!/bin/sh
+-- env LUATEXDIR=/....../texmf/scripts/context/lua luatex --luaonly=luatools.lua "$@"
+-- filename : luatools.lua
+-- comment : companion to context.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+-- Although this script is part of the ConTeXt distribution it is
+-- relatively indepent of ConTeXt. The same is true for some of
+-- the luat files. We may may make them even less dependent in
+-- the future. As long as Luatex is under development the
+-- interfaces and names of functions may change.
+
+banner = "version 1.1.1 - 2006+ - PRAGMA ADE / CONTEXT"
+texlua = true
+
+-- For the sake of independence we optionally can merge the library
+-- code here. It's too much code, but that does not harm. Much of the
+-- library code is used elsewhere. We don't want dependencies on
+-- Lua library paths simply because these scripts are located in the
+-- texmf tree and not in some Lua path. Normally this merge is not
+-- needed when texmfstart is used, or when the proper stub is used or
+-- when (windows) suffix binding is active.
+
+-- begin library merge
+
+-- filename : l-string.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-string'] = 1.001
+
+--~ function string.split(str, pat) -- taken from the lua wiki
+--~ local t = {n = 0} -- so this table has a length field, traverse with ipairs then!
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = string.find(str, fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ table.insert(t,cap)
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = string.find(str, fpat, last_end)
+--~ end
+--~ if last_end<=string.len(str) then
+--~ table.insert(t,(string.sub(str,last_end)))
+--~ end
+--~ return t
+--~ end
+
+--~ function string:split(pat) -- taken from the lua wiki but adapted
+--~ local t = { } -- self and colon usage (faster)
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = self:find(fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ t[#t+1] = cap
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = self:find(fpat, last_end)
+--~ end
+--~ if last_end <= #self then
+--~ t[#t+1] = self:sub(last_end)
+--~ end
+--~ return t
+--~ end
+
+--~ a piece of brilliant code by Rici Lake (posted on lua list) -- only names changed
+--~
+--~ function string:splitter(pat)
+--~ local st, g = 1, self:gmatch("()"..pat.."()")
+--~ local function splitter(self)
+--~ if st then
+--~ local s, f = g()
+--~ local rv = self:sub(st, (s or 0)-1)
+--~ st = f
+--~ return rv
+--~ end
+--~ end
+--~ return splitter, self
+--~ end
+
+function string:splitter(pat)
+ -- by Rici Lake (posted on lua list) -- only names changed
+ -- p 79 ref man: () returns position of match
+ local st, g = 1, self:gmatch("()("..pat..")")
+ local function strgetter(self, segs, seps, sep, cap1, ...)
+ st = sep and seps + #sep
+ return self:sub(segs, (seps or 0) - 1), cap1 or sep, ...
+ end
+ local function strsplitter(self)
+ if st then return strgetter(self, st, g()) end
+ end
+ return strsplitter, self
+end
+
+function string:split(separator)
+ local t = {}
+ for k in self:splitter(separator) do t[#t+1] = k end
+ return t
+end
+
+-- faster than a string:split:
+
+function string:splitchr(chr)
+ if #self > 0 then
+ local t = { }
+ for s in string.gmatch(self..chr,"(.-)"..chr) do
+ t[#t+1] = s
+ end
+ return t
+ else
+ return { }
+ end
+end
+
+--~ function string.piecewise(str, pat, fnc) -- variant of split
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = string.find(str, fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ fnc(cap)
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = string.find(str, fpat, last_end)
+--~ end
+--~ if last_end <= #str then
+--~ fnc((string.sub(str,last_end)))
+--~ end
+--~ end
+
+function string.piecewise(str, pat, fnc) -- variant of split
+ for k in string.splitter(str,pat) do fnc(k) end
+end
+
+--~ do if lpeg then
+
+--~ -- this alternative is 30% faster esp when we cache them
+--~ -- problem: no expressions
+
+--~ splitters = { }
+
+--~ function string:split(separator)
+--~ if #self > 0 then
+--~ local split = splitters[separator]
+--~ if not split then
+--~ -- based on code by Roberto
+--~ local p = lpeg.P(separator)
+--~ local c = lpeg.C((1-p)^0)
+--~ split = lpeg.Ct(c*(p*c)^0)
+--~ splitters[separator] = split
+--~ end
+--~ return lpeg.match(split,self)
+--~ else
+--~ return { }
+--~ end
+--~ end
+
+--~ string.splitchr = string.split
+
+--~ function string:piecewise(separator,fnc)
+--~ for _,v in pairs(self:split(separator)) do
+--~ fnc(v)
+--~ end
+--~ end
+
+--~ end end
+
+string.chr_to_esc = {
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["^"] = "%^", ["$"] = "%$",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ ["{"] = "%{", ["}"] = "%}"
+}
+
+function string:esc() -- variant 2
+ return (self:gsub("(.)",string.chr_to_esc))
+end
+
+function string.unquote(str)
+ return (str:gsub("^([\"\'])(.*)%1$","%2"))
+end
+
+function string.quote(str)
+ return '"' .. str:unquote() .. '"'
+end
+
+function string:count(pattern) -- variant 3
+ local n = 0
+ for _ in self:gmatch(pattern) do
+ n = n + 1
+ end
+ return n
+end
+
+function string:limit(n,sentinel)
+ if #self > n then
+ sentinel = sentinel or " ..."
+ return self:sub(1,(n-#sentinel)) .. sentinel
+ else
+ return self
+ end
+end
+
+function string:strip()
+ return (self:gsub("^%s*(.-)%s*$", "%1"))
+end
+
+--~ function string.strip(str) -- slightly different
+--~ return (string.gsub(string.gsub(str,"^%s*(.-)%s*$","%1"),"%s+"," "))
+--~ end
+
+function string:is_empty()
+ return not self:find("%S")
+end
+
+function string:enhance(pattern,action)
+ local ok, n = true, 0
+ while ok do
+ ok = false
+ self = self:gsub(pattern, function(...)
+ ok, n = true, n + 1
+ return action(...)
+ end)
+ end
+ return self, n
+end
+
+--~ function string:enhance(pattern,action)
+--~ local ok, n = 0, 0
+--~ repeat
+--~ self, ok = self:gsub(pattern, function(...)
+--~ n = n + 1
+--~ return action(...)
+--~ end)
+--~ until ok == 0
+--~ return self, n
+--~ end
+
+--~ function string:to_hex()
+--~ if self then
+--~ return (self:gsub("(.)",function(c)
+--~ return string.format("%02X",c:byte())
+--~ end))
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+--~ function string:from_hex()
+--~ if self then
+--~ return (self:gsub("(..)",function(c)
+--~ return string.char(tonumber(c,16))
+--~ end))
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+string.chr_to_hex = { }
+string.hex_to_chr = { }
+
+for i=0,255 do
+ local c, h = string.char(i), string.format("%02X",i)
+ string.chr_to_hex[c], string.hex_to_chr[h] = h, c
+end
+
+--~ function string:to_hex()
+--~ if self then return (self:gsub("(.)",string.chr_to_hex)) else return "" end
+--~ end
+
+--~ function string:from_hex()
+--~ if self then return (self:gsub("(..)",string.hex_to_chr)) else return "" end
+--~ end
+
+function string:to_hex()
+ return ((self or ""):gsub("(.)",string.chr_to_hex))
+end
+
+function string:from_hex()
+ return ((self or ""):gsub("(..)",string.hex_to_chr))
+end
+
+if not string.characters then
+
+ local function nextchar(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, str:sub(index,index)
+ end
+ function string:characters()
+ return nextchar, self, 0
+ end
+ local function nextbyte(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, string.byte(str:sub(index,index))
+ end
+ function string:bytes()
+ return nextbyte, self, 0
+ end
+
+end
+
+--~ function string:padd(n,chr)
+--~ return self .. self.rep(chr or " ",n-#self)
+--~ end
+
+function string:padd(n,chr)
+ local m = n-#self
+ if m > 0 then
+ return self .. self.rep(chr or " ",m)
+ else
+ return self
+ end
+end
+
+function is_number(str)
+ return str:find("^[%-%+]?[%d]-%.?[%d+]$") == 1
+end
+
+--~ print(is_number("1"))
+--~ print(is_number("1.1"))
+--~ print(is_number(".1"))
+--~ print(is_number("-0.1"))
+--~ print(is_number("+0.1"))
+--~ print(is_number("-.1"))
+--~ print(is_number("+.1"))
+
+
+-- filename : l-table.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-table'] = 1.001
+
+table.join = table.concat
+
+function table.strip(tab)
+ local lst = { }
+ for k, v in ipairs(tab) do
+ -- s = string.gsub(v, "^%s*(.-)%s*$", "%1")
+ s = v:gsub("^%s*(.-)%s*$", "%1")
+ if s == "" then
+ -- skip this one
+ else
+ lst[#lst+1] = s
+ end
+ end
+ return lst
+end
+
+--~ function table.sortedkeys(tab)
+--~ local srt = { }
+--~ for key,_ in pairs(tab) do
+--~ srt[#srt+1] = key
+--~ end
+--~ table.sort(srt)
+--~ return srt
+--~ end
+
+function table.sortedkeys(tab)
+ local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ for key,_ in pairs(tab) do
+ srt[#srt+1] = key
+ if kind == 3 then
+ -- no further check
+ elseif type(key) == "string" then
+ if kind == 2 then kind = 3 else kind = 1 end
+ elseif type(key) == "number" then
+ if kind == 1 then kind = 3 else kind = 2 end
+ else
+ kind = 3
+ end
+ end
+ if kind == 0 or kind == 3 then
+ table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
+ else
+ table.sort(srt)
+ end
+ return srt
+end
+
+function table.append(t, list)
+ for _,v in pairs(list) do
+ table.insert(t,v)
+ end
+end
+
+function table.prepend(t, list)
+ for k,v in pairs(list) do
+ table.insert(t,k,v)
+ end
+end
+
+if not table.fastcopy then
+
+ function table.fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in pairs(old) do
+ if type(v) == "table" then
+ new[k] = table.copy(v)
+ else
+ new[k] = v
+ end
+ end
+ return new
+ else
+ return { }
+ end
+ end
+
+end
+
+if not table.copy then
+
+ function table.copy(t, _lookup_table) -- taken from lua wiki
+ _lookup_table = _lookup_table or { }
+ local tcopy = {}
+ if not _lookup_table[t] then
+ _lookup_table[t] = tcopy
+ end
+ for i,v in pairs(t) do
+ if type(i) == "table" then
+ if _lookup_table[i] then
+ i = _lookup_table[i]
+ else
+ i = table.copy(i, _lookup_table)
+ end
+ end
+ if type(v) ~= "table" then
+ tcopy[i] = v
+ else
+ if _lookup_table[v] then
+ tcopy[i] = _lookup_table[v]
+ else
+ tcopy[i] = table.copy(v, _lookup_table)
+ end
+ end
+ end
+ return tcopy
+ end
+
+end
+
+-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
+end
+
+function table.replace(a,b)
+ for k,v in pairs(b) do
+ a[k] = v
+ end
+end
+
+-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
+
+function table.is_empty(t)
+ return not t or not next(t)
+end
+
+function table.one_entry(t)
+ local n = next(t)
+ return n and not next(t,n)
+end
+
+function table.starts_at(t)
+ return ipairs(t,1)(t,0)
+end
+
+do
+
+ -- 34.055.092 32.403.326 arabtype.tma
+ -- 1.620.614 1.513.863 lmroman10-italic.tma
+ -- 1.325.585 1.233.044 lmroman10-regular.tma
+ -- 1.248.157 1.158.903 lmsans10-regular.tma
+ -- 194.646 153.120 lmtypewriter10-regular.tma
+ -- 1.771.678 1.658.461 palatinosanscom-bold.tma
+ -- 1.695.251 1.584.491 palatinosanscom-regular.tma
+ -- 13.736.534 13.409.446 zapfinoextraltpro.tma
+
+ -- 13.679.038 11.774.106 arabtype.tmc
+ -- 886.248 754.944 lmroman10-italic.tmc
+ -- 729.828 466.864 lmroman10-regular.tmc
+ -- 688.482 441.962 lmsans10-regular.tmc
+ -- 128.685 95.853 lmtypewriter10-regular.tmc
+ -- 715.929 582.985 palatinosanscom-bold.tmc
+ -- 669.942 540.126 palatinosanscom-regular.tmc
+ -- 1.560.588 1.317.000 zapfinoextraltpro.tmc
+
+ table.serialize_functions = true
+ table.serialize_compact = true
+ table.serialize_inline = true
+
+ local function key(k)
+ if type(k) == "number" then -- or k:find("^%d+$") then
+ return "["..k.."]"
+ elseif noquotes and k:find("^%a[%a%d%_]*$") then
+ return k
+ else
+ return '["'..k..'"]'
+ end
+ end
+
+ local function simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in pairs(t) do
+ n = n + 1
+ end
+ if n == #t then
+ local tt = { }
+ for _,v in ipairs(t) do
+ local tv = type(v)
+ if tv == "number" or tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = ("%q"):format(v)
+ else
+ tt = nil
+ break
+ end
+ end
+ return tt
+ end
+ end
+ return nil
+ end
+
+ local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed)
+ handle = handle or print
+ reduce = reduce or false
+ if depth then
+ depth = depth .. " "
+ if indexed then
+ handle(("%s{"):format(depth))
+ else
+ handle(("%s%s={"):format(depth,key(name)))
+ end
+ else
+ depth = ""
+ if type(name) == "string" then
+ if name == "return" then
+ handle("return {")
+ else
+ handle(name .. "={")
+ end
+ elseif type(name) == "number" then
+ handle("[" .. name .. "]={")
+ elseif type(name) == "boolean" then
+ if name then
+ handle("return {")
+ else
+ handle("{")
+ end
+ else
+ handle("t={")
+ end
+ end
+ if root and next(root) then
+ local compact = table.serialize_compact
+ local inline = compact and table.serialize_inline
+ local first, last = nil, 0 -- #root cannot be trusted here
+ if compact then
+ for k,v in ipairs(root) do
+ if not first then first = k end
+ last = last + 1
+ end
+ end
+ for _,k in pairs(table.sortedkeys(root)) do
+ local v = root[k]
+ local t = type(v)
+ if compact and first and type(k) == "number" and k >= first and k <= last then
+ if t == "number" then
+ handle(("%s %s,"):format(depth,v))
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s,"):format(depth,v))
+ else
+ handle(("%s %q,"):format(depth,v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s {},"):format(depth))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s { %s },"):format(depth,table.concat(st,", ")))
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
+ end
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s,"):format(depth,tostring(v)))
+ elseif t == "function" then
+ if table.serialize_functions then
+ handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
+ else
+ handle(('%s "function",'):format(depth))
+ end
+ else
+ handle(("%s %q,"):format(depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(("%s __p__=nil,"):format(depth))
+ end
+ elseif t == "number" then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s %s={},"):format(depth,key(k)))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s %s={ %s },"):format(depth,key(k),table.concat(st,", ")))
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes)
+ end
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ elseif t == "function" then
+ if table.serialize_functions then
+ handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v)))
+ else
+ handle(('%s %s="function",'):format(depth,key(k)))
+ end
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
+ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
+ end
+ end
+ if level > 0 then
+ handle(("%s},"):format(depth))
+ else
+ handle(("%s}"):format(depth))
+ end
+ else
+ handle(("%s}"):format(depth))
+ end
+ end
+
+ --~ name:
+ --~
+ --~ true : return { }
+ --~ false : { }
+ --~ nil : t = { }
+ --~ string : string = { }
+ --~ 'return' : return { }
+ --~ number : [number] = { }
+
+ function table.serialize(root,name,reduce,noquotes)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ return table.concat(t,"\n")
+ end
+
+ function table.tohandle(handle,root,name,reduce,noquotes)
+ serialize(root, name, handle, nil, 0, reduce, noquotes)
+ end
+
+ -- sometimes tables are real use (zapfino extra pro is some 85M) in which
+ -- case a stepwise serialization is nice; actually, we could consider:
+ --
+ -- for line in table.serializer(root,name,reduce,noquotes) do
+ -- ...(line)
+ -- end
+ --
+ -- so this is on the todo list
+
+ table.tofile_maxtab = 2*1024
+
+ function table.tofile(filename,root,name,reduce,noquotes)
+ local f = io.open(filename,'w')
+ if f then
+ local concat = table.concat
+ local maxtab = table.tofile_maxtab
+ if maxtab > 1 then
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ if #t > maxtab then
+ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
+ t = { }
+ end
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ f:write(concat(t,"\n"),"\n")
+ else
+ local function flush(s)
+ f:write(s,"\n")
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ end
+ f:close()
+ end
+ end
+
+end
+
+--~ t = {
+--~ b = "123",
+--~ a = "x",
+--~ c = 1.23,
+--~ d = "1.23",
+--~ e = true,
+--~ f = {
+--~ d = "1.23",
+--~ a = "x",
+--~ b = "123",
+--~ c = 1.23,
+--~ e = true,
+--~ f = {
+--~ e = true,
+--~ f = {
+--~ e = true
+--~ },
+--~ },
+--~ },
+--~ g = function() end
+--~ }
+
+--~ print(table.serialize(t), "\n")
+--~ print(table.serialize(t,"name"), "\n")
+--~ print(table.serialize(t,false), "\n")
+--~ print(table.serialize(t,true), "\n")
+--~ print(table.serialize(t,"name",true), "\n")
+--~ print(table.serialize(t,"name",true,true), "\n")
+
+do
+
+ local function flatten(t,f,complete)
+ for _,v in ipairs(t) do
+ if type(v) == "table" then
+ if complete or type(v[1]) == "table" then
+ flatten(v,f,complete)
+ else
+ f[#f+1] = v
+ end
+ else
+ f[#f+1] = v
+ end
+ end
+ end
+
+ function table.flatten(t)
+ local f = { }
+ flatten(t,f,true)
+ return f
+ end
+
+ function table.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+ end
+
+ table.flatten_one_level = table.unnest
+
+end
+
+function table.insert_before_value(t,value,str)
+ for i=1,#t do
+ if t[i] == value then
+ table.insert(t,i,str)
+ return
+ end
+ end
+ table.insert(t,1,str)
+end
+
+function table.insert_after_value(t,value,str)
+ for i=1,#t do
+ if t[i] == value then
+ table.insert(t,i+1,str)
+ return
+ end
+ end
+ t[#t+1] = str
+end
+
+function table.are_equal(a,b,n,m)
+ if #a == #b then
+ n = n or 1
+ m = m or #a
+ for i=n,m do
+ local ai, bi = a[i], b[i]
+ if (ai==bi) or (type(ai)=="table" and type(bi)=="table" and table.are_equal(ai,bi)) then
+ -- continue
+ else
+ return false
+ end
+ end
+ return true
+ else
+ return false
+ end
+end
+
+--~ function table.are_equal(a,b)
+--~ return table.serialize(a) == table.serialize(b)
+--~ end
+
+
+
+-- filename : l-io.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-io'] = 1.001
+
+if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator = "\\", ";"
+else
+ io.fileseparator, io.pathseparator = "/" , ":"
+end
+
+function io.loaddata(filename)
+ local f = io.open(filename)
+ if f then
+ local data = f:read('*all')
+ f:close()
+ return data
+ else
+ return nil
+ end
+end
+
+function io.savedata(filename,data,joiner)
+ local f = io.open(filename, "wb")
+ if f then
+ if type(data) == "table" then
+ f:write(table.join(data,joiner or ""))
+ elseif type(data) == "function" then
+ data(f)
+ else
+ f:write(data)
+ end
+ f:close()
+ end
+end
+
+function io.exists(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return false
+ else
+ assert(f:close())
+ return true
+ end
+end
+
+function io.size(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return 0
+ else
+ local s = f:seek("end")
+ assert(f:close())
+ return s
+ end
+end
+
+function io.noflines(f)
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
+end
+
+--~ t, f, n = os.clock(), io.open("testbed/sample-utf16-bigendian-big.txt",'rb'), 0
+--~ for a in io.characters(f) do n = n + 1 end
+--~ print(string.format("characters: %s, time: %s", n, os.clock()-t))
+
+do
+
+ local nextchar = {
+ [ 4] = function(f)
+ return f:read(1), f:read(1), f:read(1), f:read(1)
+ end,
+ [ 2] = function(f)
+ return f:read(1), f:read(1)
+ end,
+ [ 1] = function(f)
+ return f:read(1)
+ end,
+ [-2] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ return b, a
+ end,
+ [-4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local c = f:read(1)
+ return d, c, b, a
+ end
+ }
+
+ function io.characters(f,n)
+ local sb = string.byte
+ if f then
+ return nextchar[n or 1], f
+ else
+ return nil, nil
+ end
+ end
+
+end
+
+do
+
+ local nextbyte = {
+ [4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local d = f:read(1)
+ if d then
+ return sb(a), sb(b), sb(c), sb(d)
+ else
+ return nil, nil, nil, nil
+ end
+ end,
+ [2] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ if b then
+ return sb(a), sb(b)
+ else
+ return nil, nil
+ end
+ end,
+ [1] = function (f)
+ local a = f:read(1)
+ if a then
+ return sb(a)
+ else
+ return nil
+ end
+ end,
+ [-2] = function (f)
+ local a = f:read(1)
+ local b = f:read(1)
+ if b then
+ return sb(b), sb(a)
+ else
+ return nil, nil
+ end
+ end,
+ [-4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local d = f:read(1)
+ if d then
+ return sb(d), sb(c), sb(b), sb(a)
+ else
+ return nil, nil, nil, nil
+ end
+ end
+ }
+
+ function io.bytes(f,n)
+ local sb = string.byte
+ if f then
+ return nextbyte[n or 1], f
+ else
+ return nil, nil
+ end
+ end
+
+end
+
+
+-- filename : l-number.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-number'] = 1.001
+
+if not number then number = { } end
+
+
+
+-- filename : l-os.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-os'] = 1.001
+
+function os.resultof(command)
+ return io.popen(command,"r"):read("*all")
+end
+
+--~ if not os.exec then -- still not ok
+ os.exec = os.execute
+--~ end
+
+function os.launch(str)
+ if os.platform == "windows" then
+ os.execute("start " .. str)
+ else
+ os.execute(str .. " &")
+ end
+end
+
+if not os.setenv then
+ function os.setenv() return false end
+end
+
+
+-- filename : l-md5.lua
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-md5'] = 1.001
+
+if md5 then do
+
+ local function convert(str,fmt)
+ return (string.gsub(md5.sum(str),".",function(chr) return string.format(fmt,string.byte(chr)) end))
+ end
+
+ if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
+ if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
+ if not md5.dec then function md5.dec(str) return convert(stt,"%03i") end end
+
+end end
+
+
+-- filename : l-file.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-file'] = 1.001
+
+if not file then file = { } end
+
+function file.removesuffix(filename)
+ return filename:gsub("%.%a+$", "")
+end
+
+function file.addsuffix(filename, suffix)
+ if not filename:find("%.%a-$") then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+end
+
+function file.replacesuffix(filename, suffix)
+ return filename:gsub("%.%a+$", "." .. suffix)
+end
+
+function file.dirname(name)
+ return name:match("^(.+)[/\\].-$") or ""
+end
+
+function file.basename(name)
+ return name:match("^.+[/\\](.-)$") or name
+end
+
+function file.extname(name)
+ return name:match("^.+%.(.-)$") or ""
+end
+
+function file.join(...) -- args
+ return (string.gsub(table.concat({...},"/"),"\\","/"))
+end
+
+function file.is_writable(name)
+ local f = io.open(name, 'w')
+ if f then
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function file.is_readable(name)
+ local f = io.open(name,'r')
+ if f then
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function file.split_path(str)
+ if str:find(';') then
+ return str:splitchr(";")
+ else
+ return str:splitchr(io.pathseparator)
+ end
+end
+
+function file.join_path(tab)
+ return table.concat(tab,io.pathseparator)
+end
+
+--~ print('test' .. " == " .. file.collapse_path("test"))
+--~ print("test/test" .. " == " .. file.collapse_path("test/test"))
+--~ print("test/test/test" .. " == " .. file.collapse_path("test/test/test"))
+--~ print("test/test" .. " == " .. file.collapse_path("test/../test/test"))
+--~ print("test" .. " == " .. file.collapse_path("test/../test"))
+--~ print("../test" .. " == " .. file.collapse_path("../test"))
+--~ print("../test/" .. " == " .. file.collapse_path("../test/"))
+--~ print("a/a" .. " == " .. file.collapse_path("a/b/c/../../a"))
+
+function file.collapse_path(str)
+ local ok = false
+ while not ok do
+ ok = true
+ str, n = str:gsub("[^%./]+/%.%./", function(s)
+ ok = false
+ return ""
+ end)
+ end
+ return (str:gsub("/%./","/"))
+end
+
+function file.robustname(str)
+ return (str:gsub("[^%a%d%/%-%.\\]+","-"))
+end
+
+file.readdata = io.loaddata
+file.savedata = io.savedata
+
+
+-- filename : l-dir.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-dir'] = 1.001
+
+dir = { }
+
+-- optimizing for no string.find (*) does not save time
+
+if lfs then
+
+ function dir.glob_pattern(path,patt,recurse,action)
+ for name in lfs.dir(path) do
+ local full = path .. '/' .. name
+ local mode = lfs.attributes(full,'mode')
+ if mode == 'file' then
+ if name:find(patt) then
+ action(full)
+ end
+ elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
+ dir.glob_pattern(full,patt,recurse,action)
+ end
+ end
+ end
+
+ function dir.glob(pattern, action)
+ local t = { }
+ local action = action or function(name) table.insert(t,name) end
+ local path, patt = pattern:match("^(.*)/*%*%*/*(.-)$")
+ local recurse = path and patt
+ if not recurse then
+ path, patt = pattern:match("^(.*)/(.-)$")
+ if not (path and patt) then
+ path, patt = '.', pattern
+ end
+ end
+ patt = patt:gsub("([%.%-%+])", "%%%1")
+ patt = patt:gsub("%*", ".*")
+ patt = patt:gsub("%?", ".")
+ patt = "^" .. patt .. "$"
+ -- print('path: ' .. path .. ' | pattern: ' .. patt .. ' | recurse: ' .. tostring(recurse))
+ dir.glob_pattern(path,patt,recurse,action)
+ return t
+ end
+
+ -- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex")
+ -- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex")
+ -- t = dir.glob("c:/data/develop/context/texmf/**/*.tex")
+ -- t = dir.glob("f:/minimal/tex/**/*")
+ -- print(dir.ls("f:/minimal/tex/**/*"))
+ -- print(dir.ls("*.tex"))
+
+ function dir.ls(pattern)
+ return table.concat(dir.glob(pattern),"\n")
+ end
+
+ --~ mkdirs("temp")
+ --~ mkdirs("a/b/c")
+ --~ mkdirs(".","/a/b/c")
+ --~ mkdirs("a","b","c")
+
+ function dir.mkdirs(...) -- root,... or ... ; root is not split
+ local pth, err = "", false
+ for k,v in pairs({...}) do
+ if k == 1 then
+ if not lfs.isdir(v) then
+ -- print("no root path " .. v)
+ err = true
+ else
+ pth = v
+ end
+ elseif lfs.isdir(pth .. "/" .. v) then
+ pth = pth .. "/" .. v
+ else
+ for _,s in pairs(v:split("/")) do
+ pth = pth .. "/" .. s
+ if not lfs.isdir(pth) then
+ ok = lfs.mkdir(pth)
+ if not lfs.isdir(pth) then
+ err = true
+ end
+ end
+ if err then break end
+ end
+ end
+ if err then break end
+ end
+ return pth, not err
+ end
+
+end
+
+
+-- filename : l-boolean.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-boolean'] = 1.001
+if not boolean then boolean = { } end
+
+function boolean.tonumber(b)
+ if b then return 1 else return 0 end
+end
+
+function toboolean(str)
+ if type(str) == "string" then
+ return str == "true" or str == "yes" or str == "on" or str == "1"
+ elseif type(str) == "number" then
+ return tonumber(str) ~= 0
+ else
+ return str
+ end
+end
+
+function string.is_boolean(str)
+ if type(str) == "string" then
+ if str == "true" or str == "yes" or str == "on" then
+ return true
+ elseif str == "false" or str == "no" or str == "off" then
+ return false
+ end
+ end
+ return nil
+end
+
+function boolean.alwaystrue()
+ return true
+end
+
+function boolean.falsetrue()
+ return false
+end
+
+
+-- filename : l-unicode.lua
+-- comment : split off from luat-inp
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-unicode'] = 1.001
+if not unicode then unicode = { } end
+
+if not garbagecollector then
+ garbagecollector = {
+ push = function() collectgarbage("stop") end,
+ pop = function() collectgarbage("restart") end,
+ }
+end
+
+-- 0 EF BB BF UTF-8
+-- 1 FF FE UTF-16-little-endian
+-- 2 FE FF UTF-16-big-endian
+-- 3 FF FE 00 00 UTF-32-little-endian
+-- 4 00 00 FE FF UTF-32-big-endian
+
+unicode.utfname = {
+ [0] = 'utf-8',
+ [1] = 'utf-16-le',
+ [2] = 'utf-16-be',
+ [3] = 'utf-32-le',
+ [4] = 'utf-32-be'
+}
+
+function unicode.utftype(f) -- \000 fails !
+ local str = f:read(4)
+ if not str then
+ f:seek('set')
+ return 0
+ elseif str:find("^%z%z\254\255") then
+ return 4
+ elseif str:find("^\255\254%z%z") then
+ return 3
+ elseif str:find("^\254\255") then
+ f:seek('set',2)
+ return 2
+ elseif str:find("^\255\254") then
+ f:seek('set',2)
+ return 1
+ elseif str:find("^\239\187\191") then
+ f:seek('set',3)
+ return 0
+ else
+ f:seek('set')
+ return 0
+ end
+end
+
+function unicode.utf16_to_utf8(str, endian)
+ garbagecollector.push()
+ local result = { }
+ local tc, uc = table.concat, unicode.utf8.char
+ local tmp, n, m, p = { }, 0, 0, 0
+ -- lf | cr | crlf / (cr:13, lf:10)
+ local function doit()
+ if n == 10 then
+ if p ~= 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = 0
+ end
+ elseif n == 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = n
+ else
+ tmp[#tmp+1] = uc(n)
+ p = 0
+ end
+ end
+ for l,r in str:bytepairs() do
+ if endian then
+ n = l*256 + r
+ else
+ n = r*256 + l
+ end
+ if m > 0 then
+ n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000
+ m = 0
+ doit()
+ elseif n >= 0xD800 and n <= 0xDBFF then
+ m = n
+ else
+ doit()
+ end
+ end
+ if #tmp > 0 then
+ result[#result+1] = tc(tmp,"")
+ end
+ garbagecollector.pop()
+ return result
+end
+
+function unicode.utf32_to_utf8(str, endian)
+ garbagecollector.push()
+ local result = { }
+ local tc, uc = table.concat, unicode.utf8.char
+ local tmp, n, m, p = { }, 0, -1, 0
+ -- lf | cr | crlf / (cr:13, lf:10)
+ local function doit()
+ if n == 10 then
+ if p ~= 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = 0
+ end
+ elseif n == 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = n
+ else
+ tmp[#tmp+1] = uc(n)
+ p = 0
+ end
+ end
+ for a,b in str:bytepairs() do
+ if a and b then
+ if m < 0 then
+ if endian then
+ m = a*256*256*256 + b*256*256
+ else
+ m = b*256 + a
+ end
+ else
+ if endian then
+ n = m + a*256 + b
+ else
+ n = m + b*256*256*256 + a*256*256
+ end
+ m = -1
+ doit()
+ end
+ else
+ break
+ end
+ end
+ if #tmp > 0 then
+ result[#result+1] = tc(tmp,"")
+ end
+ garbagecollector.pop()
+ return result
+end
+
+
+-- filename : l-utils.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-utils'] = 1.001
+
+if not utils then utils = { } end
+if not utils.merger then utils.merger = { } end
+if not utils.lua then utils.lua = { } end
+
+utils.merger.m_begin = "begin library merge"
+utils.merger.m_end = "end library merge"
+utils.merger.pattern =
+ "%c+" ..
+ "%-%-%s+" .. utils.merger.m_begin ..
+ "%c+(.-)%c+" ..
+ "%-%-%s+" .. utils.merger.m_end ..
+ "%c+"
+
+function utils.merger._self_fake_()
+ return
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. utils.merger.m_begin .. "\n\n" ..
+ "-- " .. utils.merger.m_end .. "\n\n"
+end
+
+function utils.report(...)
+ print(...)
+end
+
+function utils.merger._self_load_(name)
+ local f, data = io.open(name), ""
+ if f then
+ data = f:read("*all")
+ f:close()
+ end
+ return data or ""
+end
+
+function utils.merger._self_save_(name, data)
+ if data ~= "" then
+ local f = io.open(name,'w')
+ if f then
+ f:write(data)
+ f:close()
+ end
+ end
+end
+
+function utils.merger._self_swap_(data,code)
+ if data ~= "" then
+ return (data:gsub(utils.merger.pattern, function(s)
+ return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
+ end, 1))
+ else
+ return ""
+ end
+end
+
+function utils.merger._self_libs_(libs,list)
+ local result, f = "", nil
+ if type(libs) == 'string' then libs = { libs } end
+ if type(list) == 'string' then list = { list } end
+ for _, lib in ipairs(libs) do
+ for _, pth in ipairs(list) do
+ local name = string.gsub(pth .. "/" .. lib,"\\","/")
+ f = io.open(name)
+ if f then
+ -- utils.report("merging library",name)
+ result = result .. "\n" .. f:read("*all") .. "\n"
+ f:close()
+ list = { pth } -- speed up the search
+ break
+ else
+ -- utils.report("no library",name)
+ end
+ end
+ end
+ return result or ""
+end
+
+function utils.merger.selfcreate(libs,list,target)
+ if target then
+ utils.merger._self_save_(
+ target,
+ utils.merger._self_swap_(
+ utils.merger._self_fake_(),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+ end
+end
+
+function utils.merger.selfmerge(name,libs,list,target)
+ utils.merger._self_save_(
+ target or name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+end
+
+function utils.merger.selfclean(name)
+ utils.merger._self_save_(
+ name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ ""
+ )
+ )
+end
+
+function utils.lua.compile(luafile, lucfile)
+ -- utils.report("compiling",luafile,"into",lucfile)
+ os.remove(lucfile)
+ return (os.execute("luac -s -o " .. string.quote(lucfile) .. " " .. string.quote(luafile)) == 0)
+end
+
+
+
+-- filename : luat-lib.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-lib'] = 1.001
+
+-- mostcode moved to the l-*.lua and other luat-*.lua files
+
+-- os / io
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+-- os.platform
+
+-- mswin|bccwin|mingw|cygwin windows
+-- darwin|rhapsody|nextstep macosx
+-- netbsd|unix unix
+-- linux linux
+
+if not io.fileseparator then
+ if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator, os.platform = "\\", ";", "windows"
+ else
+ io.fileseparator, io.pathseparator, os.platform = "/" , ":", "unix"
+ end
+end
+
+if not os.platform then
+ if io.pathseparator == ";" then
+ os.platform = "windows"
+ else
+ os.platform = "unix"
+ end
+end
+
+-- arg normalization
+--
+-- for k,v in pairs(arg) do print(k,v) end
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
+end
+
+-- environment
+
+if not environment then environment = { } end
+
+environment.arguments = { }
+environment.files = { }
+environment.sorted_argument_keys = nil
+
+environment.platform = os.platform
+
+function environment.initialize_arguments(arg)
+ environment.arguments = { }
+ environment.files = { }
+ environment.sorted_argument_keys = nil
+ for index, argument in pairs(arg) do
+ if index > 0 then
+ local flag, value = argument:match("^%-+(.+)=(.-)$")
+ if flag then
+ environment.arguments[flag] = string.unquote(value or "")
+ else
+ flag = argument:match("^%-+(.+)")
+ if flag then
+ environment.arguments[flag] = true
+ else
+ environment.files[#environment.files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.showarguments()
+ for k,v in pairs(environment.arguments) do
+ print(k .. " : " .. tostring(v))
+ end
+ if #environment.files > 0 then
+ print("files : " .. table.concat(environment.files, " "))
+ end
+end
+
+function environment.argument(name)
+ if environment.arguments[name] then
+ return environment.arguments[name]
+ else
+ if not environment.sorted_argument_keys then
+ environment.sorted_argument_keys = { }
+ for _,v in pairs(table.sortedkeys(environment.arguments)) do
+ table.insert(environment.sorted_argument_keys, "^" .. v)
+ end
+ end
+ for _,v in pairs(environment.sorted_argument_keys) do
+ if name:find(v) then
+ return environment.arguments[v:sub(2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+function environment.split_arguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ for _,v in ipairs(environment.original_arguments) do
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstruct_commandline(arg)
+ if not arg then arg = environment.original_arguments end
+ local result = { }
+ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+ local kk, vv = a:match("^(%-+.-)=(.+)$")
+ if kk and vv then
+ if vv:find(" ") then
+ result[#result+1] = kk .. "=" .. string.quote(vv)
+ else
+ result[#result+1] = a
+ end
+ elseif a:find(" ") then
+ result[#result+1] = string.quote(a)
+ else
+ result[#result+1] = a
+ end
+ end
+ return table.join(result," ")
+end
+
+if arg then
+ environment.initialize_arguments(arg)
+ environment.original_arguments = arg
+ arg = { } -- prevent duplicate handling
+end
+
+
+-- filename : luat-inp.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- This lib is multi-purpose and can be loaded again later on so that
+-- additional functionality becomes available. We will split this
+-- module in components when we're done with prototyping.
+
+-- This is the first code I wrote for LuaTeX, so it needs some cleanup.
+
+-- To be considered: hash key lowercase, first entry in table filename
+-- (any case), rest paths (so no need for optimization). Or maybe a
+-- separate table that matches lowercase names to mixed case when
+-- present. In that case the lower() cases can go away. I will do that
+-- only when we run into problems with names.
+
+if not versions then versions = { } end versions['luat-inp'] = 1.001
+if not environment then environment = { } end
+if not file then file = { } end
+
+if environment.aleph_mode == nil then environment.aleph_mode = true end -- temp hack
+
+if not input then input = { } end
+if not input.suffixes then input.suffixes = { } end
+if not input.formats then input.formats = { } end
+if not input.aux then input.aux = { } end
+
+if not input.suffixmap then input.suffixmap = { } end
+
+if not input.locators then input.locators = { } end -- locate databases
+if not input.hashers then input.hashers = { } end -- load databases
+if not input.generators then input.generators = { } end -- generate databases
+if not input.filters then input.filters = { } end -- conversion filters
+
+input.locators.notfound = { nil }
+input.hashers.notfound = { nil }
+input.generators.notfound = { nil }
+
+input.cacheversion = '1.0.1'
+input.banner = nil
+input.verbose = false
+input.debug = false
+input.cnfname = 'texmf.cnf'
+input.lsrname = 'ls-R'
+input.luasuffix = '.tma'
+input.lucsuffix = '.tmc'
+
+-- we use a cleaned up list / format=any is a wildcard, as is *name
+
+input.formats['afm'] = 'AFMFONTS' input.suffixes['afm'] = { 'afm' }
+input.formats['enc'] = 'ENCFONTS' input.suffixes['enc'] = { 'enc' }
+input.formats['fmt'] = 'TEXFORMATS' input.suffixes['fmt'] = { 'fmt' }
+input.formats['map'] = 'TEXFONTMAPS' input.suffixes['map'] = { 'map' }
+input.formats['mp'] = 'MPINPUTS' input.suffixes['mp'] = { 'mp' }
+input.formats['ocp'] = 'OCPINPUTS' input.suffixes['ocp'] = { 'ocp' }
+input.formats['ofm'] = 'OFMFONTS' input.suffixes['ofm'] = { 'ofm', 'tfm' }
+input.formats['otf'] = 'OPENTYPEFONTS' input.suffixes['otf'] = { 'otf' } -- 'ttf'
+input.formats['opl'] = 'OPLFONTS' input.suffixes['opl'] = { 'opl' }
+input.formats['otp'] = 'OTPINPUTS' input.suffixes['otp'] = { 'otp' }
+input.formats['ovf'] = 'OVFFONTS' input.suffixes['ovf'] = { 'ovf', 'vf' }
+input.formats['ovp'] = 'OVPFONTS' input.suffixes['ovp'] = { 'ovp' }
+input.formats['tex'] = 'TEXINPUTS' input.suffixes['tex'] = { 'tex' }
+input.formats['tfm'] = 'TFMFONTS' input.suffixes['tfm'] = { 'tfm' }
+input.formats['ttf'] = 'TTFONTS' input.suffixes['ttf'] = { 'ttf', 'ttc' }
+input.formats['pfb'] = 'T1FONTS' input.suffixes['pfb'] = { 'pfb', 'pfa' }
+input.formats['vf'] = 'VFFONTS' input.suffixes['vf'] = { 'vf' }
+
+input.formats['fea'] = 'FONTFEATURES' input.suffixes['fea'] = { 'fea' }
+
+input.formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
+input.suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
+
+input.formats ['lua'] = 'LUAINPUTS' -- new
+input.suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
+
+-- here we catch a few new thingies
+
+function input.checkconfigdata(instance)
+ if input.env(instance,"LUAINPUTS") == "" then
+ instance.environment["LUAINPUTS"] = ".;$TEXINPUTS;$TEXMFSCRIPTS"
+ end
+ if input.env(instance,"FONTFEATURES") == "" then
+ instance.environment["FONTFEATURES"] = ".;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS"
+ end
+end
+
+-- backward compatible ones
+
+input.alternatives = { }
+
+input.alternatives['map files'] = 'map'
+input.alternatives['enc files'] = 'enc'
+input.alternatives['opentype fonts'] = 'otf'
+input.alternatives['truetype fonts'] = 'ttf'
+input.alternatives['truetype collections'] = 'ttc'
+input.alternatives['type1 fonts'] = 'pfb'
+
+-- obscure ones
+
+input.formats ['misc fonts'] = ''
+input.suffixes['misc fonts'] = { }
+
+input.formats ['sfd'] = 'SFDFONTS'
+input.suffixes ['sfd'] = { 'sfd' }
+input.alternatives['subfont definition files'] = 'sfd'
+
+function input.reset()
+
+ local instance = { }
+
+ instance.rootpath = ''
+ instance.treepath = ''
+ instance.progname = environment.progname or 'context'
+ instance.engine = environment.engine or 'luatex'
+ instance.format = ''
+ instance.environment = { }
+ instance.variables = { }
+ instance.expansions = { }
+ instance.files = { }
+ instance.configuration = { }
+ instance.found = { }
+ instance.foundintrees = { }
+ instance.kpsevars = { }
+ instance.hashes = { }
+ instance.cnffiles = { }
+ instance.lists = { }
+ instance.remember = true
+ instance.diskcache = true
+ instance.renewcache = false
+ instance.scandisk = true
+ instance.cachepath = nil
+ instance.loaderror = false
+ instance.smallcache = false
+ instance.savelists = true
+ instance.cleanuppaths = true
+ instance.allresults = false
+ instance.pattern = nil -- lists
+ instance.kpseonly = false -- lists
+ instance.cachefile = 'tmftools'
+ instance.loadtime = 0
+ instance.starttime = 0
+ instance.stoptime = 0
+ instance.validfile = function(path,name) return true end
+ instance.data = { } -- only for loading
+ instance.sortdata = false
+ instance.force_suffixes = true
+ instance.dummy_path_expr = "^!*unset/*$"
+ instance.fakepaths = { }
+ instance.lsrmode = false
+
+ if os.env then
+ -- store once, freeze and faster
+ for k,v in pairs(os.env) do
+ instance.environment[k] = input.bare_variable(v)
+ end
+ else
+ -- we will access os.env frequently
+ for k,v in pairs({'HOME','TEXMF','TEXMFCNF','SELFAUTOPARENT'}) do
+ local e = os.getenv(v)
+ if e then
+ -- input.report("setting",v,"to",input.bare_variable(e))
+ instance.environment[v] = input.bare_variable(e)
+ end
+ end
+ end
+
+ -- cross referencing
+
+ for k, v in pairs(input.suffixes) do
+ for _, vv in pairs(v) do
+ if vv then
+ input.suffixmap[vv] = k
+ end
+ end
+ end
+
+ return instance
+
+end
+
+function input.bare_variable(str)
+ -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1")
+ return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2")
+end
+
+if texio then
+ input.log = texio.write_nl
+else
+ input.log = print
+end
+
+function input.simple_logger(kind, name)
+ if name and name ~= "" then
+ if input.banner then
+ input.log(input.banner..kind..": "..name)
+ else
+ input.log("<<"..kind..": "..name..">>")
+ end
+ else
+ if input.banner then
+ input.log(input.banner..kind..": no name")
+ else
+ input.log("<<"..kind..": no name>>")
+ end
+ end
+end
+
+function input.dummy_logger()
+end
+
+function input.settrace(n)
+ input.trace = tonumber(n or 0)
+ if input.trace > 0 then
+ input.logger = input.simple_logger
+ input.verbose = true
+ else
+ input.logger = function() end
+ end
+end
+
+function input.report(...) -- inefficient
+ if input.verbose then
+ if input.banner then
+ input.log(input.banner .. table.concat({...},' '))
+ elseif input.logmode() == 'xml' then
+ input.log("<t>"..table.concat({...},' ').."</t>")
+ else
+ input.log("<<"..table.concat({...},' ')..">>")
+ end
+ end
+end
+
+function input.reportlines(str)
+ if type(str) == "string" then
+ str = str:split("\n")
+ end
+ for _,v in pairs(str) do input.report(v) end
+end
+
+input.settrace(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRACE") or input.trace or 0)
+
+-- These functions can be used to test the performance, especially
+-- loading the database files.
+
+function input.start_timing(instance)
+ if instance then
+ instance.starttime = os.clock()
+ if not instance.loadtime then
+ instance.loadtime = 0
+ end
+ end
+end
+
+function input.stop_timing(instance, report)
+ if instance and instance.starttime then
+ instance.stoptime = os.clock()
+ local loadtime = instance.stoptime - instance.starttime
+ instance.loadtime = instance.loadtime + loadtime
+ if report then
+ input.report('load time', string.format("%0.3f",loadtime))
+ end
+ return loadtime
+ else
+ return 0
+ end
+end
+
+input.stoptiming = input.stop_timing
+input.starttiming = input.start_timing
+
+function input.elapsedtime(instance)
+ return string.format("%0.3f",instance.loadtime or 0)
+end
+
+function input.report_loadtime(instance)
+ if instance then
+ input.report('total load time', input.elapsedtime(instance))
+ end
+end
+
+function input.loadtime(instance)
+ tex.print(input.elapsedtime(instance))
+end
+
+function input.env(instance,key)
+ return instance.environment[key] or input.osenv(instance,key)
+end
+
+function input.osenv(instance,key)
+ if instance.environment[key] == nil then
+ local e = os.getenv(key)
+ if e == nil then
+ instance.environment[key] = "" -- false
+ else
+ instance.environment[key] = input.bare_variable(e)
+ end
+ end
+ return instance.environment[key] or ""
+end
+
+-- we follow a rather traditional approach:
+--
+-- (1) texmf.cnf given in TEXMFCNF
+-- (2) texmf.cnf searched in TEXMF/web2c
+--
+-- for the moment we don't expect a configuration file in a zip
+
+function input.identify_cnf(instance)
+ if #instance.cnffiles == 0 then
+ if instance.treepath ~= "" then
+ if instance.rootpath ~= "" then
+ local t = instance.treepath:splitchr(',')
+ for k,v in ipairs(t) do
+ t[k] = file.join(instance.rootpath,v)
+ end
+ instance.treepath = table.concat(t,',')
+ end
+ local t = instance.treepath:splitchr(',')
+ instance.environment['TEXMF'] = input.bare_variable(instance.treepath)
+ instance.environment['TEXMFCNF'] = file.join(t[1] or '.','texmf/web2c')
+ end
+ if instance.rootpath ~= "" then
+ instance.environment['TEXMFCNF'] = file.join(instance.rootpath,'texmf/web2c')
+ instance.environment['SELFAUTOPARENT'] = instance.rootpath
+ end
+ if input.env(instance,'TEXMFCNF') ~= "" then
+ local t = input.split_path(input.env(instance,'TEXMFCNF'))
+ t = input.aux.expanded_path(instance,t)
+ input.aux.expand_vars(instance,t)
+ for _,v in ipairs(t) do
+ table.insert(instance.cnffiles,file.join(v,input.cnfname))
+ end
+ elseif input.env(instance,'SELFAUTOPARENT') == '.' then
+ table.insert(instance.cnffiles,file.join('.',input.cnfname))
+ else
+ for _,v in ipairs({'texmf-local','texmf'}) do
+ table.insert(instance.cnffiles,file.join(input.env(instance,'SELFAUTOPARENT'),v,'web2c',input.cnfname))
+ end
+ end
+ end
+end
+
+function input.load_cnf(instance)
+ -- instance.cnffiles contain complete names now !
+ if #instance.cnffiles == 0 then
+ input.report("no cnf files found (TEXMFCNF may not be set/known)")
+ else
+ instance.rootpath = instance.cnffiles[1]
+ for k,fname in ipairs(instance.cnffiles) do
+ instance.cnffiles[k] = fname:gsub("\\",'/')
+ end
+ for i = 1, 3 do
+ instance.rootpath = file.dirname(instance.rootpath)
+ end
+ if instance.lsrmode then
+ input.loadconfigdata(instance,instance.cnffiles)
+ elseif instance.diskcache and not instance.renewcache then
+ input.loadconfig(instance,instance.cnffiles)
+ if instance.loaderror then
+ input.loadconfigdata(instance,instance.cnffiles)
+ input.saveconfig(instance)
+ end
+ else
+ input.loadconfigdata(instance,instance.cnffiles)
+ if instance.renewcache then
+ input.saveconfig(instance)
+ end
+ end
+ input.aux.collapse_cnf_data(instance)
+ end
+ input.checkconfigdata(instance)
+end
+
+function input.loadconfigdata(instance)
+ for _, fname in pairs(instance.cnffiles) do
+ input.aux.load_cnf(instance,fname)
+ end
+end
+
+if os.env then
+ function input.aux.collapse_cnf_data(instance)
+ for _,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if not instance.variables[k] then
+ if instance.environment[k] then
+ instance.variables[k] = instance.environment[k]
+ else
+ instance.kpsevars[k] = true
+ instance.variables[k] = input.bare_variable(v)
+ end
+ end
+ end
+ end
+ end
+else
+ function input.aux.collapse_cnf_data(instance)
+ for _,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if not instance.variables[k] then
+ local e = os.getenv(k)
+ if e then
+ instance.environment[k] = input.bare_variable(e)
+ instance.variables[k] = instance.environment[k]
+ else
+ instance.variables[k] = input.bare_variable(v)
+ instance.kpsevars[k] = true
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.aux.load_cnf(instance,fname)
+ fname = input.clean_path(fname)
+ local lname = fname:gsub("%.%a+$",input.luasuffix)
+ local f = io.open(lname)
+ if f then
+ f:close()
+ input.aux.load_data(instance,file.dirname(lname),'configuration',file.basename(lname))
+ else
+ f = io.open(fname)
+ if f then
+ input.report("loading", fname)
+ local line, data, n, k, v
+ local dname = file.dirname(fname)
+ if not instance.configuration[dname] then
+ instance.configuration[dname] = { }
+ end
+ local data = instance.configuration[dname]
+ while true do
+ line = f:read()
+ if line then
+ while true do -- join lines
+ line, n = line:gsub("\\%s*$", "")
+ if n > 0 then
+ line = line .. f:read()
+ else
+ break
+ end
+ end
+ if not line:find("^[%%#]") then
+ k, v = (line:gsub("%s*%%.*$","")):match("%s*(.-)%s*=%s*(.-)%s*$")
+ if k and v and not data[k] then
+ data[k] = (v:gsub("[%%#].*",'')):gsub("~", "$HOME")
+ instance.kpsevars[k] = true
+ end
+ end
+ else
+ break
+ end
+ end
+ f:close()
+ else
+ input.report("skipping", fname)
+ end
+ end
+end
+
+-- database loading
+
+function input.load_hash(instance)
+ input.locatelists(instance)
+ if instance.lsrmode then
+ input.loadlists(instance)
+ elseif instance.diskcache and not instance.renewcache then
+ input.loadfiles(instance)
+ if instance.loaderror then
+ input.loadlists(instance)
+ input.savefiles(instance)
+ end
+ else
+ input.loadlists(instance)
+ if instance.renewcache then
+ input.savefiles(instance)
+ end
+ end
+end
+
+function input.aux.append_hash(instance,type,tag,name)
+ input.logger("= hash append",tag)
+ table.insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function input.aux.prepend_hash(instance,type,tag,name)
+ input.logger("= hash prepend",tag)
+ table.insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function input.aux.extend_texmf_var(instance,specification) -- crap
+ if instance.environment['TEXMF'] then
+ input.report("extending environment variable TEXMF with", specification)
+ instance.environment['TEXMF'] = instance.environment['TEXMF']:gsub("^%{", function()
+ return "{" .. specification .. ","
+ end)
+ elseif instance.variables['TEXMF'] then
+ input.report("extending configuration variable TEXMF with", specification)
+ instance.variables['TEXMF'] = instance.variables['TEXMF']:gsub("^%{", function()
+ return "{" .. specification .. ","
+ end)
+ else
+ input.report("setting configuration variable TEXMF to", specification)
+ instance.variables['TEXMF'] = "{" .. specification .. "}"
+ end
+ if instance.variables['TEXMF']:find("%,") and not instance.variables['TEXMF']:find("^%{") then
+ input.report("adding {} to complex TEXMF variable, best do that yourself")
+ instance.variables['TEXMF'] = "{" .. instance.variables['TEXMF'] .. "}"
+ end
+ input.expand_variables(instance)
+end
+
+-- locators
+
+function input.locatelists(instance)
+ for _, path in pairs(input.simplified_list(input.expansion(instance,'TEXMF'))) do
+ input.report("locating list of",path)
+ input.locatedatabase(instance,input.normalize_name(path))
+ end
+end
+
+function input.locatedatabase(instance,specification)
+ return input.methodhandler('locators', instance, specification)
+end
+
+function input.locators.tex(instance,specification)
+ if specification and specification ~= '' then
+ local files = {
+ file.join(specification,'files'..input.lucsuffix),
+ file.join(specification,'files'..input.luasuffix),
+ file.join(specification,input.lsrname)
+ }
+ for _, filename in pairs(files) do
+ local f = io.open(filename)
+ if f then
+ input.logger('! tex locator', specification..' found')
+ input.aux.append_hash(instance,'file',specification,filename)
+ f:close()
+ return
+ end
+ end
+ input.logger('? tex locator', specification..' not found')
+ end
+end
+
+-- hashers
+
+function input.hashdatabase(instance,tag,name)
+ return input.methodhandler('hashers',instance,tag,name)
+end
+
+function input.loadfiles(instance)
+ instance.loaderror = false
+ instance.files = { }
+ if not instance.renewcache then
+ for _, hash in ipairs(instance.hashes) do
+ input.hashdatabase(instance,hash.tag,hash.name)
+ if instance.loaderror then break end
+ end
+ end
+end
+
+function input.hashers.tex(instance,tag,name)
+ input.aux.load_data(instance,tag,'files')
+end
+
+-- generators:
+
+function input.loadlists(instance)
+ for _, hash in ipairs(instance.hashes) do
+ input.generatedatabase(instance,hash.tag)
+ end
+end
+
+function input.generatedatabase(instance,specification)
+ return input.methodhandler('generators', instance, specification)
+end
+
+function input.generators.tex(instance,specification)
+ local tag = specification
+ if not instance.lsrmode and lfs and lfs.dir then
+ input.report("scanning path",specification)
+ instance.files[tag] = { }
+ local files = instance.files[tag]
+ local n, m = 0, 0
+ local spec = specification .. '/'
+ local attributes = lfs.attributes
+ local directory = lfs.dir
+ local small = instance.smallcache
+ local function action(path)
+ local mode, full
+ if path then
+ full = spec .. path .. '/'
+ else
+ full = spec
+ end
+ for name in directory(full) do
+ if name == '.' or name == ".." then
+ -- skip
+ else
+ mode = attributes(full..name,'mode')
+ if mode == "directory" then
+ m = m + 1
+ if path then
+ action(path..'/'..name)
+ else
+ action(name)
+ end
+ elseif path and mode == 'file' then
+ n = n + 1
+ local f = files[name]
+ if f then
+ if not small then
+ if type(f) == 'string' then
+ files[name] = { f, path }
+ else
+ f[#f+1] = path
+ end
+ end
+ else
+ files[name] = path
+ end
+ end
+ end
+ end
+ end
+ action()
+ input.report(n,"files found on",m,"directories")
+ else
+ local fullname = file.join(specification,input.lsrname)
+ local path = '.'
+ local f = io.open(fullname)
+ if f then
+ instance.files[tag] = { }
+ local files = instance.files[tag]
+ local small = instance.smallcache
+ input.report("loading lsr file",fullname)
+ -- for line in f:lines() do -- much slower then the next one
+ for line in (f:read("*a")):gmatch("(.-)\n") do
+ if line:find("^[%a%d]") then
+ local fl = files[line]
+ if fl then
+ if not small then
+ if type(fl) == 'string' then
+ files[line] = { fl, path } -- table
+ else
+ fl[#fl+1] = path
+ end
+ end
+ else
+ files[line] = path -- string
+ end
+ else
+ path = line:match("%.%/(.-)%:$") or path -- match could be nil due to empty line
+ end
+ end
+ f:close()
+ end
+ end
+end
+
+-- savers, todo
+
+function input.savefiles(instance)
+ input.aux.save_data(instance, 'files', function(k,v)
+ return instance.validfile(k,v) -- path, name
+ end)
+end
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+function input.splitconfig(instance)
+ for i,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if type(v) == 'string' then
+ local t = file.split_path(v)
+ if #t > 1 then
+ c[k] = t
+ end
+ end
+ end
+ end
+end
+function input.joinconfig(instance)
+ for i,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if type(v) == 'table' then
+ c[k] = file.join_path(v)
+ end
+ end
+ end
+end
+function input.split_path(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return file.split_path(str)
+ end
+end
+function input.join_path(str)
+ if type(str) == 'table' then
+ return file.join_path(str)
+ else
+ return str
+ end
+end
+function input.splitexpansions(instance)
+ for k,v in pairs(instance.expansions) do
+ local t = file.split_path(v)
+ if #t > 1 then
+ instance.expansions[k] = t
+ end
+ end
+end
+function input.splitexpansions(instance)
+ for k,v in pairs(instance.expansions) do
+ local t, h = { }, { }
+ for _,vv in pairs(file.split_path(v)) do
+ if vv ~= "" and not h[vv] then
+ t[#t+1] = vv
+ h[vv] = true
+ end
+ end
+ if #t > 1 then
+ instance.expansions[k] = t
+ else
+ instance.expansions[k] = t[1]
+ end
+ end
+end
+
+-- end of split/join code
+
+function input.saveconfig(instance)
+ input.splitconfig(instance)
+ input.aux.save_data(instance, 'configuration', nil)
+ input.joinconfig(instance)
+end
+
+input.configbanner = [[
+-- This is a Luatex configuration file created by 'luatools.lua' or
+-- 'luatex.exe' directly. For comment, suggestions and questions you can
+-- contact the ConTeXt Development Team. This configuration file is
+-- not copyrighted. [HH & TH]
+]]
+
+function input.aux.save_data(instance, dataname, check)
+ for cachename, files in pairs(instance[dataname]) do
+ local name = file.join(cachename,dataname)
+ local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix
+ local f = io.open(luaname,'w')
+ if f then
+ input.report("saving " .. dataname .. " in", luaname)
+ f:write(input.configbanner)
+ f:write("\n")
+ f:write("if not texmf then texmf = { } end\n")
+ f:write("if not texmf.data then texmf.data = { } end\n")
+ f:write("\n")
+ f:write("texmf.data.type = '" .. dataname .. "'\n")
+ f:write("texmf.data.version = '" .. input.cacheversion .. "'\n")
+ f:write("texmf.data.date = '" .. os.date("%Y-%m-%d") .. "'\n")
+ f:write("texmf.data.time = '" .. os.date("%H:%M:%S") .. "'\n")
+ f:write('texmf.data.content = {\n')
+ local function dump(k,v)
+ if not check or check(v,k) then -- path, name
+ if type(v) == 'string' then
+ f:write("\t['" .. k .. "'] = '" .. v .. "',\n")
+ elseif #v == 1 then
+ f:write("\t['" .. k .. "'] = '" .. v[1] .. "',\n")
+ else
+ f:write("\t['" .. k .. "'] = {'" .. table.concat(v,"','").. "'},\n")
+ end
+ end
+ end
+ if instance.sortdata then
+ for _, k in pairs(table.sortedkeys(files)) do
+ dump(k,files[k])
+ end
+ else
+ for k, v in pairs(files) do
+ dump(k,v)
+ end
+ end
+ f:write('}\n')
+ f:close()
+ input.report("compiling " .. dataname .. " to", lucname)
+ if not utils.lua.compile(luaname,lucname) then
+ input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname)
+ os.remove(lucname)
+ end
+ else
+ input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix)
+ end
+ end
+end
+
+function input.loadconfig(instance)
+ instance.configuration, instance.loaderror = { }, false
+ if not instance.renewcache then
+ for _, cnf in pairs(instance.cnffiles) do
+ input.aux.load_data(instance,file.dirname(cnf),'configuration')
+ if instance.loaderror then break end
+ end
+ end
+ input.joinconfig(instance)
+end
+
+if not texmf then texmf = {} end
+if not texmf.data then texmf.data = {} end
+
+function input.aux.load_data(instance,pathname,dataname,filename)
+ if not filename or (filename == "") then
+ filename = dataname .. input.lucsuffix
+ end
+ local blob = loadfile(file.join(pathname,filename))
+ if not blob then
+ filename = dataname .. input.luasuffix
+ blob = loadfile(file.join(pathname,filename))
+ end
+ if blob then
+ blob()
+ if (texmf.data.type == dataname) and (texmf.data.version == input.cacheversion) and texmf.data.content then
+ input.report("loading",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = texmf.data.content
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = { }
+ instance.loaderror = true
+ end
+ end
+ texmf.data.content = { }
+end
+
+function input.expand_variables(instance)
+ instance.expansions = { }
+ if instance.engine ~= "" then instance.environment['engine'] = instance.engine end
+ if instance.progname ~= "" then instance.environment['progname'] = instance.engine end
+ for k,v in pairs(instance.environment) do
+ local a, b = k:match("^(%a+)%_(.*)%s*$")
+ if a and b then
+ instance.expansions[a..'.'..b] = v
+ else
+ instance.expansions[k] = v
+ end
+ end
+ for k,v in pairs(instance.environment) do -- move environment to expansions
+ if not instance.expansions[k] then instance.expansions[k] = v end
+ end
+ for k,v in pairs(instance.variables) do -- move variables to expansions
+ if not instance.expansions[k] then instance.expansions[k] = v end
+ end
+ while true do
+ local busy = false
+ for k,v in pairs(instance.expansions) do
+ local s, n = v:gsub("%$([%a%d%_%-]+)", function(a)
+ busy = true
+ return instance.expansions[a] or input.env(instance,a)
+ end)
+ local s, m = s:gsub("%$%{([%a%d%_%-]+)%}", function(a)
+ busy = true
+ return instance.expansions[a] or input.env(instance,a)
+ end)
+ if n > 0 or m > 0 then
+ instance.expansions[k]= s
+ end
+ end
+ if not busy then break end
+ end
+ for k,v in pairs(instance.expansions) do
+ instance.expansions[k] = v:gsub("\\", '/')
+ end
+ input.splitexpansions(instance)
+end
+
+function input.aux.expand_vars(instance,lst) -- simple vars
+ for k,v in pairs(lst) do
+ lst[k] = v:gsub("%$([%a%d%_%-]+)", function(a)
+ return instance.variables[a] or input.env(instance,a)
+ end)
+ end
+end
+
+function input.aux.expanded_var(instance,var) -- simple vars
+ return var:gsub("%$([%a%d%_%-]+)", function(a)
+ return instance.variables[a] or input.env(instance,a)
+ end)
+end
+
+function input.aux.entry(instance,entries,name)
+ if name and (name ~= "") then
+ name = name:gsub('%$','')
+ local result = entries[name..'.'..instance.progname] or entries[name]
+ if result then
+ return result
+ else
+ result = input.env(instance,name)
+ if result then
+ instance.variables[name] = result
+ input.expand_variables(instance)
+ return instance.expansions[name] or ""
+ end
+ end
+ end
+ return ""
+end
+function input.variable(instance,name)
+ return input.aux.entry(instance,instance.variables,name)
+end
+function input.expansion(instance,name)
+ return input.aux.entry(instance,instance.expansions,name)
+end
+
+function input.aux.is_entry(instance,entries,name)
+ if name and name ~= "" then
+ name = name:gsub('%$','')
+ return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
+ else
+ return false
+ end
+end
+
+function input.is_variable(instance,name)
+ return input.aux.is_entry(instance,instance.variables,name)
+end
+function input.is_expansion(instance,name)
+ return input.aux.is_entry(instance,instance.expansions,name)
+end
+
+function input.aux.list(instance,list)
+ local pat = string.upper(instance.pattern or "","")
+ for _,key in pairs(table.sortedkeys(list)) do
+ if (instance.pattern=="") or string.find(key:upper(),pat) then
+ if instance.kpseonly then
+ if instance.kpsevars[key] then
+ print(key .. "=" .. input.aux.tabstr(list[key]))
+ end
+ elseif instance.kpsevars[key] then
+ print('K ' .. key .. "=" .. input.aux.tabstr(list[key]))
+ else
+ print('E ' .. key .. "=" .. input.aux.tabstr(list[key]))
+ end
+ end
+ end
+end
+
+function input.list_variables(instance)
+ input.aux.list(instance,instance.variables)
+end
+function input.list_expansions(instance)
+ input.aux.list(instance,instance.expansions)
+end
+
+function input.list_configurations(instance)
+ for _,key in pairs(table.sortedkeys(instance.kpsevars)) do
+ if not instance.pattern or (instance.pattern=="") or key:find(instance.pattern) then
+ print(key.."\n")
+ for i,c in pairs(instance.configuration) do
+ local str = c[key]
+ if str then
+ print("\t" .. i .. "\t\t" .. input.aux.tabstr(str))
+ end
+ end
+ print()
+ end
+ end
+end
+
+function input.aux.tabstr(str)
+ if type(str) == 'table' then
+ return table.concat(str," | ")
+ else
+ return str
+ end
+end
+
+function input.simplified_list(str)
+ if type(str) == 'table' then
+ return str -- troubles ; ipv , in texmf
+ elseif str == '' then
+ return { }
+ else
+ local t = { }
+ for _,v in ipairs(string.splitchr(str:gsub("^\{(.+)\}$","%1"),",")) do
+ t[#t+1] = (v:gsub("^[%!]*(.+)[%/\\]*$","%1"))
+ end
+ return t
+ end
+end
+
+function input.unexpanded_path_list(instance,str)
+ local pth = input.variable(instance,str)
+ local lst = input.split_path(pth)
+ return input.aux.expanded_path(instance,lst)
+end
+function input.unexpanded_path(instance,str)
+ return file.join_path(input.unexpanded_path_list(instance,str))
+end
+
+function input.expanded_path_list(instance,str)
+ if not str then
+ return { }
+ elseif instance.savelists then
+ -- engine+progname hash
+ str = str:gsub("%$","")
+ if not instance.lists[str] then -- cached
+ local lst = input.split_path(input.expansion(instance,str))
+ instance.lists[str] = input.aux.expanded_path(instance,lst)
+ end
+ return instance.lists[str]
+ else
+ local lst = input.split_path(input.expansion(instance,str))
+ return input.aux.expanded_path(instance,lst)
+ end
+end
+function input.expand_path(instance,str)
+ return file.join_path(input.expanded_path_list(instance,str))
+end
+
+--~ function input.first_writable_path(instance,name)
+--~ for _,v in pairs(input.expanded_path_list(instance,name)) do
+--~ if file.is_writable(file.join(v,'luatex-cache.tmp')) then
+--~ return v
+--~ end
+--~ end
+--~ return "."
+--~ end
+
+function input.expanded_path_list_from_var(instance,str) -- brrr
+ local tmp = input.var_of_format_or_suffix(str:gsub("%$",""))
+ if tmp ~= "" then
+ return input.expanded_path_list(instance,str)
+ else
+ return input.expanded_path_list(instance,tmp)
+ end
+end
+function input.expand_path_from_var(instance,str)
+ return file.join_path(input.expanded_path_list_from_var(instance,str))
+end
+
+function input.format_of_var(str)
+ return input.formats[str] or input.formats[input.alternatives[str]] or ''
+end
+function input.format_of_suffix(str)
+ return input.suffixmap[file.extname(str)] or 'tex'
+end
+
+function input.variable_of_format(str)
+ return input.formats[str] or input.formats[input.alternatives[str]] or ''
+end
+
+function input.var_of_format_or_suffix(str)
+ local v = input.formats[str]
+ if v then
+ return v
+ end
+ v = input.formats[input.alternatives[str]]
+ if v then
+ return v
+ end
+ v = input.suffixmap[file.extname(str)]
+ if v then
+ return input.formats[isf]
+ end
+ return ''
+end
+
+function input.expand_braces(instance,str) -- output variable and brace expansion of STRING
+ local ori = input.variable(instance,str)
+ local pth = input.aux.expanded_path(instance,input.split_path(ori))
+ return file.join_path(pth)
+end
+
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+
+function input.aux.expanded_path(instance,pathlist)
+ -- a previous version fed back into pathlist
+ local i, n, oldlist, newlist, ok = 0, 0, { }, { }, false
+ for _,v in ipairs(pathlist) do
+ if v:find("[{}]") then
+ ok = true
+ break
+ end
+ end
+ if ok then
+ for _,v in ipairs(pathlist) do
+ oldlist[#oldlist+1] = (v:gsub("([\{\}])", function(p)
+ if p == "{" then
+ i = i + 1
+ if i > n then n = i end
+ return "<" .. (i-1) .. ">"
+ else
+ i = i - 1
+ return "</" .. i .. ">"
+ end
+ end))
+ end
+ for i=1,n do
+ while true do
+ local more = false
+ local pattern = "^(.-)<"..(n-i)..">(.-)</"..(n-i)..">(.-)$"
+ local t = { }
+ for _,v in ipairs(oldlist) do
+ local pre, mid, post = v:match(pattern)
+ if pre and mid and post then
+ more = true
+ -- for _,vv in ipairs(mid:splitchr(',')) do
+ for vv in string.gmatch(mid..',',"(.-),") do
+ if vv == '.' then
+ t[#t+1] = pre..post
+ else
+ t[#t+1] = pre..vv..post
+ end
+ end
+ else
+ t[#t+1] = v
+ end
+ end
+ oldlist = t
+ if not more then break end
+ end
+ end
+ for _,v in pairs(oldlist) do
+ v = file.collapse_path(v)
+ if v ~= "" and not v:find(instance.dummy_path_expr) then newlist[#newlist+1] = v end
+ end
+ else
+ for _,v in pairs(pathlist) do
+ -- for _,vv in pairs(v:split(",")) do
+ for vv in string.gmatch(v..',',"(.-),") do
+ vv = file.collapse_path(v)
+ if vv ~= "" then newlist[#newlist+1] = vv end
+ end
+ end
+ end
+ return newlist
+end
+
+--~ function input.is_readable(name) -- brrr, get rid of this
+--~ return name:find("^zip##") or file.is_readable(name)
+--~ end
+
+input.is_readable = { }
+
+function input.aux.is_readable(readable, name)
+ if input.trace > 2 then
+ if readable then
+ input.logger("+ readable", name)
+ else
+ input.logger("- readable", name)
+ end
+ end
+ return readable
+end
+
+function input.is_readable.file(name)
+ -- return input.aux.is_readable(file.is_readable(name), name)
+ return input.aux.is_readable(input.aux.is_file(name), name)
+end
+
+input.is_readable.tex = input.is_readable.file
+
+-- name
+-- name/name
+
+function input.aux.collect_files(instance,names)
+ local filelist = nil
+ for _, fname in pairs(names) do
+ if fname then
+ if input.trace > 2 then
+ input.logger("? blobpath asked",fname)
+ end
+ local bname = file.basename(fname)
+ local dname = file.dirname(fname)
+ if dname == "" or dname:find("^%.") then
+ dname = false
+ else
+ dname = "/" .. dname .. "$"
+ end
+ for _, hash in pairs(instance.hashes) do
+ local blobpath = hash.tag
+ if blobpath and instance.files[blobpath] then
+ if input.trace > 2 then
+ input.logger('? blobpath do',blobpath .. " (" .. bname ..")")
+ end
+ local blobfile = instance.files[blobpath][bname]
+ if blobfile then
+ if type(blobfile) == 'string' then
+ if not dname or blobfile:find(dname) then
+ if not filelist then filelist = { } end
+ -- input.logger('= collected', blobpath.." | "..blobfile.." | "..bname)
+ filelist[#filelist+1] = file.join(blobpath,blobfile,bname)
+ end
+ else
+ for _, vv in pairs(blobfile) do
+ if not dname or vv:find(dname) then
+ if not filelist then filelist = { } end
+ filelist[#filelist+1] = file.join(blobpath,vv,bname)
+ end
+ end
+ end
+ end
+ elseif input.trace > 1 then
+ input.logger('! blobpath no',blobpath .. " (" .. bname ..")" )
+ end
+ end
+ end
+ end
+ return filelist
+end
+
+function input.suffix_of_format(str)
+ if input.suffixes[str] then
+ return input.suffixes[str][1]
+ else
+ return ""
+ end
+end
+
+function input.suffixes_of_format(str)
+ if input.suffixes[str] then
+ return input.suffixes[str]
+ else
+ return {}
+ end
+end
+
+function input.aux.qualified_path(filename) -- make platform dependent / not good yet
+ return
+ filename:find("^%.+/") or
+ filename:find("^/") or
+ filename:find("^%a+%:") or
+ filename:find("^%a+##")
+end
+
+function input.normalize_name(original)
+ -- internally we use type##spec##subspec ; this hackery slightly slows down searching
+ local str = original or ""
+ str = str:gsub("::", "##") -- :: -> ##
+ str = str:gsub("^(%a+)://" ,"%1##") -- zip:// -> zip##
+ str = str:gsub("(.+)##(.+)##/(.+)","%1##%2##%3") -- ##/spec -> ##spec
+ if (input.trace>1) and (original ~= str) then
+ input.logger('= normalizer',original.." -> "..str)
+ end
+ return str
+end
+
+-- split the next one up, better for jit
+
+function input.aux.register_in_trees(instance,name)
+ if not name:find("^%.") then
+ instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
+ end
+end
+
+function input.aux.find_file(instance,filename) -- todo : plugin (scanners, checkers etc)
+ local result = { }
+ local stamp = nil
+ filename = input.normalize_name(filename)
+ filename = file.collapse_path(filename:gsub("\\","/"))
+ -- speed up / beware: format problem
+ if instance.remember then
+ stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.found[stamp] then
+ input.logger('! remembered', filename)
+ return instance.found[stamp]
+ end
+ end
+ if filename:find('%*') then
+ input.logger('! wildcard', filename)
+ result = input.find_wildcard_files(instance,filename)
+ elseif input.aux.qualified_path(filename) then
+ if input.is_readable.file(filename) then
+ input.logger('! qualified', filename)
+ result = { filename }
+ else
+ local forcedname, ok = "", false
+ if file.extname(filename) == "" then
+ if instance.format == "" then
+ forcedname = filename .. ".tex"
+ if input.is_readable.file(forcedname) then
+ input.logger('! no suffix, forcing standard filetype tex')
+ result, ok = { forcedname }, true
+ end
+ else
+ for _, s in pairs(input.suffixes_of_format(instance.format)) do
+ forcedname = filename .. "." .. s
+ if input.is_readable.file(forcedname) then
+ input.logger('! no suffix, forcing format filetype', s)
+ result, ok = { forcedname }, true
+ break
+ end
+ end
+ end
+ end
+ if not ok then
+ input.logger('? qualified', filename)
+ end
+ end
+ else
+ -- search spec
+ local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
+ if ext == "" then
+ if not instance.force_suffixes then
+ table.insert(wantedfiles, filename)
+ end
+ else
+ table.insert(wantedfiles, filename)
+ end
+ if instance.format == "" then
+ if ext == "" then
+ local forcedname = filename .. '.tex'
+ table.insert(wantedfiles, forcedname)
+ filetype = input.format_of_suffix(forcedname)
+ input.logger('! forcing filetype',filetype)
+ else
+ filetype = input.format_of_suffix(filename)
+ input.logger('! using suffix based filetype',filetype)
+ end
+ else
+ if ext == "" then
+ for _, s in pairs(input.suffixes_of_format(instance.format)) do
+ table.insert(wantedfiles, filename .. "." .. s)
+ end
+ end
+ filetype = instance.format
+ input.logger('! using given filetype',filetype)
+ end
+ local typespec = input.variable_of_format(filetype)
+ local pathlist = input.expanded_path_list(instance,typespec)
+ if not pathlist or #pathlist == 0 then
+ -- no pathlist, access check only
+ if input.trace > 2 then
+ input.logger('? filename',filename)
+ input.logger('? filetype',filetype or '?')
+ input.logger('? wanted files',table.concat(wantedfiles," | "))
+ end
+ for _, fname in pairs(wantedfiles) do
+ if fname and input.is_readable.file(fname) then
+ filename, done = fname, true
+ table.insert(result, file.join('.',fname))
+ break
+ end
+ end
+ -- this is actually 'other text files' or 'any' or 'whatever'
+ local filelist = input.aux.collect_files(instance,wantedfiles)
+ filename = filelist and filelist[1]
+ if filename then
+ table.insert(result, filename)
+ done = true
+ end
+ else
+ -- list search
+ local filelist = input.aux.collect_files(instance,wantedfiles)
+ local doscan, recurse
+ if input.trace > 2 then
+ input.logger('? filename',filename)
+ if pathlist then input.logger('? path list',table.concat(pathlist," | ")) end
+ if filelist then input.logger('? file list',table.concat(filelist," | ")) end
+ end
+ -- a bit messy ... esp the doscan setting here
+ for _, path in pairs(pathlist) do
+ if path:find("^!!") then doscan = false else doscan = true end
+ if path:find("//$") then recurse = true else recurse = false end
+ local pathname = path:gsub("^!+", '')
+ done = false
+ -- using file list
+ if filelist and not (done and not instance.allresults) and recurse then
+ -- compare list entries with permitted pattern
+ pathname = pathname:gsub("([%-%.])","%%%1") -- this also influences
+ pathname = pathname:gsub("/+$", '/.*') -- later usage of pathname
+ pathname = pathname:gsub("//", '/.-/')
+ expr = "^" .. pathname
+ -- input.debug('?',expr)
+ for _, f in pairs(filelist) do
+ if f:find(expr) then
+ -- input.debug('T',' '..f)
+ if input.trace > 2 then
+ input.logger('= found in hash',f)
+ end
+ table.insert(result,f)
+ input.aux.register_in_trees(instance,f) -- for tracing used files
+ done = true
+ if not instance.allresults then break end
+ else
+ -- input.debug('F',' '..f)
+ end
+ end
+ end
+ if not done and doscan then
+ -- check if on disk / unchecked / does not work at all
+ if input.method_is_file(pathname) then -- ?
+ local pname = pathname:gsub("%.%*$",'')
+ if not pname:find("%*") then
+ local ppname = pname:gsub("/+$","")
+ if input.aux.can_be_dir(instance,ppname) then
+ for _, w in pairs(wantedfiles) do
+ local fname = file.join(ppname,w)
+ if input.is_readable.file(fname) then
+ if input.trace > 2 then
+ input.logger('= found by scanning',fname)
+ end
+ table.insert(result,fname)
+ done = true
+ if not instance.allresults then break end
+ end
+ end
+ else
+ -- no access needed for non existing path, speedup (esp in large tree with lots of fake)
+ end
+ end
+ end
+ end
+ if not done and doscan then
+ -- todo: slow path scanning
+ end
+ if done and not instance.allresults then break end
+ end
+ end
+ end
+ for k,v in pairs(result) do
+ result[k] = file.collapse_path(v)
+ end
+ if instance.remember then
+ instance.found[stamp] = result
+ end
+ return result
+end
+
+input.aux._find_file_ = input.aux.find_file
+
+function input.aux.find_file(instance,filename) -- maybe make a lowres cache too
+ local result = input.aux._find_file_(instance,filename)
+ if #result == 0 then
+ local lowered = filename:lower()
+ if filename ~= lowered then
+ return input.aux._find_file_(instance,lowered)
+ end
+ end
+ return result
+end
+
+if lfs and lfs.isfile then
+ input.aux.is_file = lfs.isfile -- to be done: use this
+else
+ input.aux.is_file = file.is_readable
+end
+
+if lfs and lfs.isdir then
+ function input.aux.can_be_dir(instance,name)
+ if not instance.fakepaths[name] then
+ if lfs.isdir(name) then
+ instance.fakepaths[name] = 1 -- directory
+ else
+ instance.fakepaths[name] = 2 -- no directory
+ end
+ end
+ return (instance.fakepaths[name] == 1)
+ end
+else
+ function input.aux.can_be_dir()
+ return true
+ end
+end
+
+if not input.concatinators then input.concatinators = { } end
+
+function input.concatinators.tex(tag,path,name)
+ return tag .. '/' .. path .. '/' .. name
+end
+
+input.concatinators.file = input.concatinators.tex
+
+function input.find_files(instance,filename,filetype,mustexist)
+ if type(mustexist) == boolean then
+ -- all set
+ elseif type(filetype) == 'boolean' then
+ filetype, mustexist = nil, false
+ elseif type(filetype) ~= 'string' then
+ filetype, mustexist = nil, false
+ end
+ instance.format = filetype or ''
+ local t = input.aux.find_file(instance,filename,true)
+ instance.format = ''
+ return t
+end
+
+function input.find_file(instance,filename,filetype,mustexist)
+ return (input.find_files(instance,filename,filetype,mustexist)[1] or "")
+end
+
+function input.find_given_files(instance,filename)
+ local bname, result = file.basename(filename), { }
+ for k, hash in pairs(instance.hashes) do
+ local blist = instance.files[hash.tag][bname]
+ if blist then
+ if type(blist) == 'string' then
+ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+ if not instance.allresults then break end
+ else
+ for kk,vv in pairs(blist) do
+ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+ if not instance.allresults then break end
+ end
+ end
+ end
+ end
+ return result
+end
+
+function input.find_given_file(instance,filename)
+ return (input.find_given_files(instance,filename)[1] or "")
+end
+
+--~ function input.find_wildcard_files(instance,filename)
+--~ local result = { }
+--~ local bname, dname = file.basename(filename), file.dirname(filename)
+--~ local expr = dname:gsub("^*/","")
+--~ expr = expr:gsub("*",".*")
+--~ expr = expr:gsub("-","%-")
+--~ for k, hash in pairs(instance.hashes) do
+--~ local blist = instance.files[hash.tag][bname]
+--~ if blist then
+--~ if type(blist) == 'string' then
+--~ -- make function and share code
+--~ if blist:find(expr) then
+--~ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+--~ if not instance.allresults then break end
+--~ end
+--~ else
+--~ for kk,vv in pairs(blist) do
+--~ if vv:find(expr) then
+--~ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+--~ if not instance.allresults then break end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ return result
+--~ end
+
+function input.find_wildcard_files(instance,filename)
+ local result = { }
+ local bname, dname = file.basename(filename), file.dirname(filename)
+ local path = dname:gsub("^*/","")
+ path = path:gsub("*",".*")
+ path = path:gsub("-","%%-")
+ if dname == "" then
+ path = ".*"
+ end
+ local name = bname
+ name = name:gsub("*",".*")
+ name = name:gsub("-","%%-")
+ path = path:lower()
+ name = name:lower()
+ local function doit(blist,bname,hash,allresults)
+ local done = false
+ if blist then
+ if type(blist) == 'string' then
+ -- make function and share code
+ if (blist:lower()):find(path) then
+ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+ done = true
+ end
+ else
+ for kk,vv in pairs(blist) do
+ if (vv:lower()):find(path) then
+ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+ done = true
+ if not allresults then break end
+ end
+ end
+ end
+ end
+ return done
+ end
+ local files, allresults, done = instance.files, instance.allresults, false
+ if name:find("%*") then
+ for k, hash in pairs(instance.hashes) do
+ for kk, hh in pairs(files[hash.tag]) do
+ if (kk:lower()):find(name) then
+ if doit(hh,kk,hash,allresults) then done = true end
+ if done and not allresults then break end
+ end
+ end
+ end
+ else
+ for k, hash in pairs(instance.hashes) do
+ if doit(files[hash.tag][bname],bname,hash,allresults) then done = true end
+ if done and not allresults then break end
+ end
+ end
+ return result
+end
+
+function input.find_wildcard_file(instance,filename)
+ return (input.find_wildcard_files(instance,filename)[1] or "")
+end
+
+-- main user functions
+
+function input.save_used_files_in_trees(instance, filename,jobname)
+ if not filename then filename = 'luatex.jlg' end
+ local f = io.open(filename,'w')
+ if f then
+ f:write("<?xml version='1.0' standalone='yes'?>\n")
+ f:write("<rl:job>\n")
+ if jobname then
+ f:write("\t<rl:name>" .. jobname .. "</rl:name>\n")
+ end
+ f:write("\t<rl:files>\n")
+ for _,v in pairs(table.sortedkeys(instance.foundintrees)) do
+ f:write("\t\t<rl:file n='" .. instance.foundintrees[v] .. "'>" .. v .. "</rl:file>\n")
+ end
+ f:write("\t</rl:files>\n")
+ f:write("</rl:usedfiles>\n")
+ f:close()
+ end
+end
+
+function input.automount(instance)
+ -- implemented later
+end
+
+function input.load(instance)
+ input.start_timing(instance)
+ input.identify_cnf(instance)
+ input.load_cnf(instance)
+ input.expand_variables(instance)
+ input.load_hash(instance)
+ input.automount(instance)
+ input.stop_timing(instance)
+end
+
+function input.for_files(instance, command, files, filetype, mustexist)
+ if files and #files > 0 then
+ local function report(str)
+ if input.verbose then
+ input.report(str) -- has already verbose
+ else
+ print(str)
+ end
+ end
+ if input.verbose then
+ report('')
+ end
+ for _, file in pairs(files) do
+ local result = command(instance,file,filetype,mustexist)
+ if type(result) == 'string' then
+ report(result)
+ else
+ for _,v in pairs(result) do
+ report(v)
+ end
+ end
+ end
+ end
+end
+
+-- strtab
+
+function input.var_value(instance,str) -- output the value of variable $STRING.
+ return input.variable(instance,str)
+end
+function input.expand_var(instance,str) -- output variable expansion of STRING.
+ return input.expansion(instance,str)
+end
+function input.show_path(instance,str) -- output search path for file type NAME
+ return file.join_path(input.expanded_path_list(instance,input.format_of_var(str)))
+end
+
+-- input.find_file(filename)
+-- input.find_file(filename, filetype, mustexist)
+-- input.find_file(filename, mustexist)
+-- input.find_file(filename, filetype)
+
+function input.aux.register_file(files, name, path)
+ if files[name] then
+ if type(files[name]) == 'string' then
+ files[name] = { files[name], path }
+ else
+ files[name] = path
+ end
+ else
+ files[name] = path
+ end
+end
+
+-- zip:: zip## zip://
+-- zip::pathtozipfile::pathinzipfile (also: pathtozipfile/pathinzipfile)
+-- file::name
+-- tex::name
+-- kpse::name
+-- kpse::format::name
+-- parent::n::name
+-- parent::name (default 2)
+
+if not input.finders then input.finders = { } end
+if not input.openers then input.openers = { } end
+if not input.loaders then input.loaders = { } end
+
+input.finders.notfound = { nil }
+input.openers.notfound = { nil }
+input.loaders.notfound = { false, nil, 0 }
+
+function input.splitmethod(filename)
+ local method, specification = filename:match("^(.-)##(.+)$")
+ if method and specification then
+ return method, specification
+ else
+ return 'tex', filename
+ end
+end
+
+function input.method_is_file(filename)
+ local method, specification = input.splitmethod(filename)
+ return method == 'tex' or method == 'file'
+end
+
+function input.methodhandler(what, instance, filename, filetype) -- ...
+ local method, specification = input.splitmethod(filename)
+ if method and specification then -- redundant
+ if input[what][method] then
+ input.logger('= handler',filename.." -> "..what.." | "..method.." | "..specification)
+ return input[what][method](instance,specification,filetype)
+ else
+ return nil
+ end
+ else
+ return input[what].tex(instance,filename,filetype)
+ end
+end
+
+-- also inside next test?
+
+function input.findtexfile(instance, filename, filetype)
+ return input.methodhandler('finders',instance, input.normalize_name(filename), filetype)
+end
+function input.opentexfile(instance,filename)
+ return input.methodhandler('openers',instance, input.normalize_name(filename))
+end
+
+function input.findbinfile(instance, filename, filetype)
+ return input.methodhandler('finders',instance, input.normalize_name(filename), filetype)
+end
+function input.openbinfile(instance,filename)
+ return input.methodhandler('loaders',instance, input.normalize_name(filename))
+end
+
+function input.loadbinfile(instance, filename, filetype)
+ local fname = input.findbinfile(instance, input.normalize_name(filename), filetype)
+ if fname and fname ~= "" then
+ return input.openbinfile(instance,fname)
+ else
+ return unpack(input.loaders.notfound)
+ end
+end
+
+function input.texdatablob(instance, filename, filetype)
+ local ok, data, size = input.loadbinfile(instance, filename, filetype)
+ return data or ""
+end
+
+function input.openfile(filename) -- brrr texmf.instance here / todo ! ! ! ! !
+ local fullname = input.findtexfile(texmf.instance, filename)
+ if fullname and (fullname ~= "") then
+ return input.opentexfile(texmf.instance, fullname)
+ else
+ return nil
+ end
+end
+
+function input.logmode()
+ return (os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"):lower()
+end
+
+-- this is a prelude to engine/progname specific configuration files
+-- in which case we can omit files meant for other programs and
+-- packages
+
+--- ctx
+
+-- maybe texinputs + font paths
+-- maybe positive selection tex/context fonts/tfm|afm|vf|opentype|type1|map|enc
+
+input.validators = { }
+input.validators.visibility = { }
+
+function input.validators.visibility.default(path, name)
+ return true
+end
+
+function input.validators.visibility.context(path, name)
+ path = path[1] or path -- some day a loop
+ return not (
+ path:find("latex") or
+ path:find("doc") or
+ path:find("tex4ht") or
+ path:find("source") or
+-- path:find("config") or
+-- path:find("metafont") or
+ path:find("lists$") or
+ name:find("%.tpm$") or
+ name:find("%.bak$")
+ )
+end
+
+-- todo: describe which functions are public (maybe input.private. ... )
+
+-- beware: i need to check where we still need a / on windows:
+
+function input.clean_path(str)
+ -- return string.gsub(string.gsub(string.gsub(str,"\\","/"),"^!+",""),"//$","/")
+ return (string.gsub(string.gsub(str,"\\","/"),"^!+",""))
+end
+function input.do_with_path(name,func)
+ for _, v in pairs(input.expanded_path_list(instance,name)) do
+ func("^"..input.clean_path(v))
+ end
+end
+function input.do_with_var(name,func)
+ func(input.aux.expanded_var(name))
+end
+
+function input.with_files(instance,pattern,handle)
+ for _, hash in pairs(instance.hashes) do
+ local blobpath = hash.tag
+ local blobtype = hash.type
+ if blobpath and instance.files[blobpath] then -- sort them?
+ for k,v in pairs(instance.files[blobpath]) do
+ if k:find(pattern) then
+ if type(v) == "string" then
+ handle(blobtype,blobpath,v,k)
+ else
+ for _,vv in pairs(v) do
+ handle(blobtype,blobpath,vv,k)
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+ newname = file.addsuffix(newname,"lua")
+ newscript = input.clean_path(input.find_file(instance, newname))
+ oldscript = input.clean_path(oldname)
+ input.report("old script", oldscript)
+ input.report("new script", newscript)
+ if oldscript ~= newscript and (oldscript:find(file.removesuffix(newname).."$") or oldscript:find(newname.."$")) then
+ newdata = io.loaddata(newscript)
+ if newdata then
+ input.report("old script content replaced by new content")
+ io.savedata(oldscript,newdata)
+ end
+ end
+end
+
+
+if not modules then modules = { } end modules ['luat-tmp'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+cache = cache or { }
+dir = dir or { }
+texmf = texmf or { }
+
+cache.path = nil
+cache.base = cache.base or "luatex-cache"
+cache.more = cache.more or "context"
+cache.direct = false -- true is faster but may need huge amounts of memory
+cache.trace = false
+cache.tree = false
+cache.temp = os.getenv("TEXMFCACHE") or os.getenv("HOME") or os.getenv("HOMEPATH") or os.getenv("VARTEXMF") or os.getenv("TEXMFVAR") or os.getenv("TMP") or os.getenv("TEMP") or os.getenv("TMPDIR") or nil
+cache.paths = { cache.temp }
+
+if not cache.temp then
+ print("\nFATAL ERROR: NO VALID TEMPORARY PATH\n")
+ os.exit()
+end
+
+function cache.configpath(instance)
+ return input.expand_var(instance,"TEXMFCNF")
+end
+
+function cache.treehash(instance)
+ local tree = cache.configpath(instance)
+ if not tree or tree == "" then
+ return false
+ else
+ return md5.hex(tree)
+ end
+end
+
+function cache.setpath(instance,...)
+ if not cache.path then
+ if lfs and instance then
+ for _,v in pairs(cache.paths) do
+ for _,vv in pairs(input.expanded_path_list(instance,v)) do
+ if lfs.isdir(vv) then
+ cache.path = vv
+ break
+ end
+ end
+ if cache.path then break end
+ end
+ end
+ if not cache.path then
+ cache.path = cache.temp
+ end
+ if lfs then
+ cache.tree = cache.tree or cache.treehash(instance)
+ if cache.tree then
+ cache.path = dir.mkdirs(cache.path,cache.base,cache.more,cache.tree)
+ else
+ cache.path = dir.mkdirs(cache.path,cache.base,cache.more)
+ end
+ end
+ end
+ if not cache.path then
+ cache.path = '.'
+ end
+ cache.path = input.clean_path(cache.path)
+ if lfs and not table.is_empty({...}) then
+ local pth = dir.mkdirs(cache.path,...)
+ return pth
+ end
+ return cache.path
+end
+
+function cache.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
+end
+
+function cache.loaddata(path,name)
+ local tmaname, tmcname = cache.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ return loader()
+ else
+ return false
+ end
+end
+
+function cache.is_writable(filepath,filename)
+ local tmaname, tmcname = cache.setluanames(filepath,filename)
+ return file.is_writable(tmaname)
+end
+
+function cache.savedata(filepath,filename,data,raw) -- raw needed for file cache
+ local tmaname, tmcname = cache.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ if cache.direct then
+ file.savedata(tmaname, table.serialize(data,'return',true,true))
+ else
+ table.tofile (tmaname, data,'return',true,true) -- maybe not the last true
+ end
+ utils.lua.compile(tmaname, tmcname)
+end
+
+-- here we use the cache for format loading (texconfig.[formatname|jobname])
+
+if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
+ if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end
+ texconfig.formatname = cache.setpath(instance,"format") .. "/" .. texconfig.luaname:gsub("%.lu.$",".fmt")
+end
+
+--[[ldx--
+<p>Once we found ourselves defining similar cache constructs
+several times, containers were introduced. Containers are used
+to collect tables in memory and reuse them when possible based
+on (unique) hashes (to be provided by the calling function).</p>
+
+<p>Caching to disk is disabled by default. Version numbers are
+stored in the saved table which makes it possible to change the
+table structures without bothering about the disk cache.</p>
+
+<p>Examples of usage can be found in the font related code.</p>
+--ldx]]--
+
+containers = { }
+containers.trace = false
+
+do -- local report
+
+ local function report(container,tag,name)
+ if cache.trace or containers.trace or container.trace then
+ logs.report(string.format("%s cache",container.subcategory),string.format("%s: %s",tag,name or 'invalid'))
+ end
+ end
+
+ function containers.define(category, subcategory, version, enabled)
+ if category and subcategory then
+ return {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or 1.000,
+ trace = false,
+ path = cache.setpath(texmf.instance,category,subcategory),
+ }
+ else
+ return nil
+ end
+ end
+
+ function containers.is_usable(container, name)
+ return container.enabled and cache.is_writable(container.path, name)
+ end
+
+ function containers.is_valid(container, name)
+ if name and name ~= "" then
+ local cs = container.storage[name]
+ return cs and not table.is_empty(cs) and cs.cache_version == container.version
+ else
+ return false
+ end
+ end
+
+ function containers.read(container,name)
+ if container.enabled and not container.storage[name] then
+ container.storage[name] = cache.loaddata(container.path,name)
+ if containers.is_valid(container,name) then
+ report(container,"loaded",name)
+ else
+ container.storage[name] = nil
+ end
+ end
+ if container.storage[name] then
+ report(container,"reusing",name)
+ end
+ return container.storage[name]
+ end
+
+ function containers.write(container, name, data)
+ if data then
+ data.cache_version = container.version
+ if container.enabled then
+ local unique, shared = data.unique, data.shared
+ data.unique, data.shared = nil, nil
+ cache.savedata(container.path, name, data)
+ report(container,"saved",name)
+ data.unique, data.shared = unique, shared
+ end
+ report(container,"stored",name)
+ container.storage[name] = data
+ end
+ return data
+ end
+
+ function containers.content(container,name)
+ return container.storage[name]
+ end
+
+end
+
+-- since we want to use the cache instead of the tree, we will now
+-- reimplement the saver.
+
+input.usecache = true
+
+function input.aux.save_data(instance, dataname, check)
+ for cachename, files in pairs(instance[dataname]) do
+ local name
+ if input.usecache then
+ name = file.join(cache.setpath(instance,"trees"),md5.hex(cachename))
+ else
+ name = file.join(cachename,dataname)
+ end
+ local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix
+ input.report("preparing " .. dataname .. " in", luaname)
+ for k, v in pairs(files) do
+ if not check or check(v,k) then -- path, name
+ if #v == 1 then
+ files[k] = v[1]
+ end
+ else
+ files[k] = nil -- false
+ end
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = input.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = files,
+ }
+ local f = io.open(luaname,'w')
+ if f then
+ input.report("saving " .. dataname .. " in", luaname)
+ -- f:write(table.serialize(data,'return'))
+ f:write(input.serialize(data))
+ f:close()
+ input.report("compiling " .. dataname .. " to", lucname)
+ if not utils.lua.compile(luaname,lucname) then
+ input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname)
+ os.remove(lucname)
+ end
+ else
+ input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix)
+ end
+ end
+end
+
+function input.serialize(files)
+ -- This version is somewhat optimized for the kind of
+ -- tables that we deal with, so it's much faster than
+ -- the generic serializer. This makes sense because
+ -- luatools and mtxtools are called frequently. Okay,
+ -- we pay a small price for properly tabbed tables.
+ local t = { }
+ local concat = table.concat
+ local sorted = table.sortedkeys
+ local function dump(k,v,m)
+ if type(v) == 'string' then
+ return m .. "['" .. k .. "']='" .. v .. "',"
+ elseif #v == 1 then
+ return m .. "['" .. k .. "']='" .. v[1] .. "',"
+ else
+ return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
+ end
+ end
+ t[#t+1] = "return {"
+ if instance.sortdata then
+ for _, k in pairs(sorted(files)) do
+ local fk = files[k]
+ if type(fk) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ for _, kk in pairs(sorted(fk)) do
+ t[#t+1] = dump(kk,fk[kk],"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,fk,"\t")
+ end
+ end
+ else
+ for k, v in pairs(files) do
+ if type(v) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ for kk,vv in pairs(v) do
+ t[#t+1] = dump(kk,vv,"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,v,"\t")
+ end
+ end
+ end
+ t[#t+1] = "}"
+ return concat(t,"\n")
+end
+
+function input.aux.load_data(instance,pathname,dataname,filename)
+ local luaname, lucname, pname, fname
+ if input.usecache then
+ pname, fname = cache.setpath(instance,"trees"), md5.hex(pathname)
+ filename = file.join(pname,fname)
+ else
+ if not filename or (filename == "") then
+ filename = dataname
+ end
+ pname, fname = pathname, filename
+ end
+ luaname = file.join(pname,fname) .. input.luasuffix
+ lucname = file.join(pname,fname) .. input.lucsuffix
+ local blob = loadfile(lucname)
+ if not blob then
+ blob = loadfile(luaname)
+ end
+ if blob then
+ local data = blob()
+ if data and data.content and data.type == dataname and data.version == input.cacheversion then
+ input.report("loading",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = data.content
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = { }
+ instance.loaderror = true
+ end
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ end
+end
+
+-- we will make a better format, maybe something xml or just text
+
+input.automounted = input.automounted or { }
+
+function input.automount(instance,usecache)
+ local mountpaths = input.simplified_list(input.expansion(instance,'TEXMFMOUNT'))
+ if table.is_empty(mountpaths) and usecache then
+ mountpaths = { cache.setpath(instance,"mount") }
+ end
+ if not table.is_empty(mountpaths) then
+ input.starttiming(instance)
+ for k, root in pairs(mountpaths) do
+ local f = io.open(root.."/url.tmi")
+ if f then
+ for line in f:lines() do
+ if line then
+ if line:find("^[%%#%-]") then -- or %W
+ -- skip
+ elseif line:find("^zip://") then
+ input.report("mounting",line)
+ table.insert(input.automounted,line)
+ input.usezipfile(instance,line)
+ end
+ end
+ end
+ f:close()
+ end
+ end
+ input.stoptiming(instance)
+ end
+end
+
+-- store info in format
+
+input.storage = { }
+input.storage.data = { }
+input.storage.min = 0 -- 500
+input.storage.max = input.storage.min - 1
+input.storage.trace = false -- true
+input.storage.done = 0
+input.storage.evaluators = { }
+-- (evaluate,message,names)
+
+function input.storage.register(...)
+ input.storage.data[#input.storage.data+1] = { ... }
+end
+
+function input.storage.evaluate(name)
+ input.storage.evaluators[#input.storage.evaluators+1] = name
+end
+
+function input.storage.finalize() -- we can prepend the string with "evaluate:"
+ for _, t in ipairs(input.storage.evaluators) do
+ for i, v in pairs(t) do
+ if type(v) == "string" then
+ t[i] = loadstring(v)()
+ elseif type(v) == "table" then
+ for _, vv in pairs(v) do
+ if type(vv) == "string" then
+ t[i] = loadstring(vv)()
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.storage.dump()
+ for name, data in ipairs(input.storage.data) do
+ local evaluate, message, original, target = data[1], data[2], data[3] ,data[4]
+ local name, initialize, finalize = nil, "", ""
+ for str in string.gmatch(target,"([^%.]+)") do
+ if name then
+ name = name .. "." .. str
+ else
+ name = str
+ end
+ initialize = string.format("%s %s = %s or {} ", initialize, name, name)
+ end
+ if evaluate then
+ finalize = "input.storage.evaluate(" .. name .. ")"
+ end
+ input.storage.max = input.storage.max + 1
+ if input.storage.trace then
+ logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max))
+ lua.bytecode[input.storage.max] = loadstring(
+ initialize ..
+ string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) ..
+ table.serialize(original,name) ..
+ finalize
+ )
+ else
+ lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize)
+ end
+ end
+end
+
+if lua.bytecode then -- from 0 upwards
+ local i = input.storage.min
+ while lua.bytecode[i] do
+ lua.bytecode[i]()
+ lua.bytecode[i] = nil
+ i = i + 1
+ end
+ input.storage.done = i
+end
+
+
+-- filename : luat-zip.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-zip'] = 1.001
+
+if zip and input then
+ zip.supported = true
+else
+ zip = { }
+ zip.supported = false
+end
+
+if not zip.supported then
+
+ if not input then input = { } end -- will go away
+
+ function zip.openarchive (...) return nil end -- needed ?
+ function zip.closenarchive (...) end -- needed ?
+ function input.registerzipfile (...) end -- needed ?
+ function input.usezipfile (...) end -- needed ?
+
+else
+
+ function input.locators.zip(instance,specification)
+ local name, spec = specification:match("^(.-)##(.-)$")
+ local f = io.open(name or specification)
+ if f then -- todo: reuse code
+ input.logger('! zip locator', specification..' found')
+ if name and spec then
+ input.aux.append_hash(instance,'zip',"zip##"..specification,name)
+ input.aux.extend_texmf_var(instance, "zip##"..specification)
+ else
+ input.aux.append_hash(instance,'zip',"zip##"..specification.."##",specification)
+ input.aux.extend_texmf_var(instance, "zip##"..specification.."##")
+ end
+ f:close()
+ else
+ input.logger('? zip locator', specification..' not found')
+ end
+ end
+
+ function input.hashers.zip(instance,tag,name)
+ input.report("loading zip file",name,"as",tag)
+ input.registerzipfile(instance,name,tag)
+ end
+
+ function input.concatinators.zip(tag,path,name)
+ return tag .. path .. '/' .. name
+ end
+
+ function input.is_readable.zip(name)
+ return true
+ end
+
+ function input.finders.zip(instance,filename,filetype)
+ local archive, dataname = filename:match("^(.+)##/*(.+)$")
+ if archive and dataname then
+ local zfile = zip.openarchive(archive)
+ if not zfile then
+ archive = input.find_file(instance,archive,filetype)
+ zfile = zip.openarchive(archive)
+ end
+ if zfile then
+ input.logger('! zip finder',archive)
+ local dfile = zfile:open(dataname)
+ if dfile then
+ dfile = zfile:close()
+ input.logger('+ zip finder',filename)
+ return 'zip##' .. filename
+ end
+ else
+ input.logger('? zip finder',archive)
+ end
+ end
+ input.logger('- zip finder',filename)
+ return unpack(input.finders.notfound)
+ end
+
+ function input.openers.zip(instance,filename)
+ if filename and filename ~= "" then
+ local archive, dataname = filename:match("^(.-)##/*(.+)$")
+ if archive and dataname then
+ local zfile= zip.openarchive(archive)
+ if zfile then
+ input.logger('+ zip starter',archive)
+ local dfile = zfile:open(dataname)
+ if dfile then
+ input.show_open(filename)
+ return input.openers.text_opener(filename,dfile,'zip')
+ end
+ else
+ input.logger('- zip starter',archive)
+ end
+ end
+ end
+ input.logger('- zip opener',filename)
+ return unpack(input.openers.notfound)
+ end
+
+ function input.loaders.zip(instance, filename) -- we could use input.openers.zip
+ if filename and filename ~= "" then
+ input.logger('= zip loader',filename)
+ local archive, dataname = filename:match("^(.+)##/*(.+)$")
+ if archive and dataname then
+ local zfile = zip.openarchive(archive)
+ if zfile then
+ input.logger('= zip starter',archive)
+ local dfile = zfile:open(dataname)
+ if dfile then
+ input.show_load(filename)
+ input.logger('+ zip loader',filename)
+ local s = dfile:read("*all")
+ dfile:close()
+ return true, s, #s
+ end
+ else
+ input.logger('- zip starter',archive)
+ end
+ end
+ end
+ input.logger('- zip loader',filename)
+ return unpack(input.loaders.notfound)
+ end
+
+ zip.archives = { }
+ zip.registeredfiles = { }
+
+ function zip.openarchive(name)
+ if name and name ~= "" and not zip.archives[name] then
+ zip.archives[name] = zip.open(name)
+ end
+ return zip.archives[name]
+ end
+
+ function zip.closearchive(name)
+ if zip.archives[name] then
+ zip.close(archives[name])
+ zip.archives[name] = nil
+ end
+ end
+
+ -- aparte register maken voor user (register tex / zip), runtime tree register
+ -- todo: alleen url syntax toestaan
+ -- user function: also handle zip::name::path
+
+ function input.usezipfile(instance,zipname) -- todo zip://
+ zipname = input.normalize_name(zipname)
+ if not zipname:find("^zip##") then
+ zipname = "zip##"..zipname
+ end
+ input.logger('! zip user','file '..zipname)
+ if not zipname:find("^zip##(.+)##(.-)$") then
+ zipname = zipname .. "##" -- dummy spec
+ end
+ local tag = zipname
+ local name = zipname:match("zip##(.+)##.-")
+ input.aux.prepend_hash(instance,'zip',tag,name)
+ input.aux.extend_texmf_var(instance, tag)
+ input.registerzipfile(instance,name,tag)
+ end
+
+ function input.registerzipfile(instance,zipname,tag)
+ if not zip.registeredfiles[zipname] then
+ input.start_timing(instance)
+ local z = zip.open(zipname)
+ if not z then
+ zipname = input.find_file(instance,zipname)
+ z = zip.open(zipname)
+ end
+ if z then
+ input.logger("= zipfile","registering "..zipname)
+ zip.registeredfiles[zipname] = z
+ input.aux.register_zip_file(instance,zipname,tag)
+ else
+ input.logger("? zipfile","unknown "..zipname)
+ end
+ input.stop_timing(instance)
+ end
+ end
+
+ function input.aux.register_zip_file(instance,zipname,tagname)
+ if zip.registeredfiles[zipname] then
+ if not tagname:find("^zip##") then
+ tagname = "zip##" .. tagname
+ end
+ local path, name, n = nil, nil, 0
+ if not instance.files[tagname] then
+ instance.files[tagname] = { }
+ end
+ local files, filter = instance.files[tagname], ""
+ local subtree = tagname:match("^zip##.+##(.+)$")
+ if subtree then
+ filter = "^"..subtree.."/(.+)/(.-)$"
+ else
+ filter = "^(.+)/(.-)$"
+ end
+ input.logger('= zip filter',filter)
+ -- we can consider putting a files.luc in the file
+ local register = input.aux.register_file
+ for i, _ in zip.registeredfiles[zipname]:files() do
+ path, name = i.filename:match(filter)
+ if path then
+ if name and name ~= '' then
+ register(files, name, path)
+ n = n + 1
+ else
+ -- directory
+ end
+ else
+ register(files, i.filename, '')
+ n = n + 1
+ end
+ end
+ input.report(n, 'entries in', zipname)
+ end
+ end
+
+end
+
+
+-- filename : luat-zip.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-tex'] = 1.001
+
+-- special functions that deal with io
+
+if texconfig and not texlua then
+
+ input.level = input.level or 0
+
+ if input.logmode() == 'xml' then
+ function input.show_open(name)
+ input.level = input.level + 1
+ texio.write_nl("<f l='"..input.level.."' n='"..name.."'>")
+ end
+ function input.show_close(name)
+ texio.write("</f> ")
+ input.level = input.level - 1
+ end
+ function input.show_load(name)
+ texio.write_nl("<f l='"..(input.level+1).."' n='"..name.."'/>") -- level?
+ end
+ else
+ function input.show_open () end
+ function input.show_close() end
+ function input.show_load () end
+ end
+
+ function input.finders.generic(instance,tag,filename,filetype)
+ local foundname = input.find_file(instance,filename,filetype)
+ if foundname and foundname ~= "" then
+ input.logger('+ ' .. tag .. ' finder',filename,'filetype')
+ return foundname
+ else
+ input.logger('- ' .. tag .. ' finder',filename,'filetype')
+ return unpack(input.finders.notfound)
+ end
+ end
+
+ input.filters.dynamic_translator = nil
+ input.filters.frozen_translator = nil
+ input.filters.utf_translator = nil
+
+ function input.openers.text_opener(filename,file_handle,tag)
+ local u = unicode.utftype(file_handle)
+ local t = { }
+ if u > 0 then
+ input.logger('+ ' .. tag .. ' opener (' .. unicode.utfname[u] .. ')',filename)
+ local l
+ if u > 2 then
+ l = unicode.utf32_to_utf8(file_handle:read("*a"),u==4)
+ else
+ l = unicode.utf16_to_utf8(file_handle:read("*a"),u==2)
+ end
+ file_handle:close()
+ t = {
+ utftype = u, -- may go away
+ lines = l,
+ current = 0,
+ handle = nil,
+ noflines = #l,
+ close = function()
+ input.logger('= ' .. tag .. ' closer (' .. unicode.utfname[u] .. ')',filename)
+ input.show_close(filename)
+ end,
+ reader = function(self)
+ if not self then self = t end
+ if self.current >= #self.lines then
+ return nil
+ else
+ self.current = self.current + 1
+ if input.filters.utf_translator then
+ return input.filters.utf_translator(self.lines[t.current])
+ else
+ return self.lines[self.current]
+ end
+ end
+ end
+ }
+ else
+ input.logger('+ ' .. tag .. ' opener',filename)
+ -- todo: file;name -> freeze / eerste regel scannen -> freeze
+ t = {
+ reader = function(self)
+ if not self then self = t end -- not used
+ if input.filters.dynamic_translator then
+ return input.filters.dynamic_translator(file_handle:read())
+ elseif input.filters.utf_translator then
+ return input.filters.utf_translator(file_handle:read())
+ else
+ return file_handle:read()
+ end
+ end,
+ close = function()
+ input.logger('= ' .. tag .. ' closer',filename)
+ input.show_close(filename)
+ file_handle:close()
+ end,
+ handle = function()
+ return file_handle
+ end,
+ noflines = function()
+ t.noflines = io.noflines(file_handle)
+ return t.noflines
+ end
+ }
+ end
+ return t
+ end
+
+ function input.openers.generic(instance,tag,filename)
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ input.show_open(filename)
+ return input.openers.text_opener(filename,f,tag)
+ end
+ end
+ input.logger('- ' .. tag .. ' opener',filename)
+ return unpack(input.openers.notfound)
+ end
+
+ function input.loaders.generic(instance,tag,filename)
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ input.show_load(filename)
+ input.logger('+ ' .. tag .. ' loader',filename)
+ local s = f:read("*a")
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ input.logger('- ' .. tag .. ' loader',filename)
+ return unpack(input.loaders.notfound)
+ end
+
+ function input.finders.tex(instance,filename,filetype)
+ return input.finders.generic(instance,'tex',filename,filetype)
+ end
+ function input.openers.tex(instance,filename)
+ return input.openers.generic(instance,'tex',filename)
+ end
+ function input.loaders.tex(instance,filename)
+ return input.loaders.generic(instance,'tex',filename)
+ end
+
+end
+
+-- callback into the file io and related things; disabling kpse
+
+if texconfig and not texlua then
+
+ texconfig.kpse_init = false
+ texconfig.trace_file_names = input.logmode() == 'tex'
+ texconfig.max_print_line = 100000
+
+ -- if still present, we overload kpse (put it off-line so to say)
+
+ if not texmf then texmf = { } end
+
+ if not texmf.instance then
+
+ if not texmf.instance then -- prevent a second loading
+
+ texmf.instance = input.reset()
+ texmf.instance.progname = environment.progname or 'context'
+ texmf.instance.engine = environment.engine or 'luatex'
+ texmf.instance.validfile = input.validctxfile
+
+ input.load(texmf.instance)
+
+ end
+
+ if callback then
+ callback.register('find_read_file' , function(id,name) return input.findtexfile(texmf.instance,name) end)
+ callback.register('open_read_file' , function( name) return input.opentexfile(texmf.instance,name) end)
+ end
+
+ if callback then
+ callback.register('find_data_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end)
+ callback.register('find_enc_file' , function(name) return input.findbinfile(texmf.instance,name,"enc") end)
+ callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"tfm") end)
+ callback.register('find_format_file' , function(name) return input.findbinfile(texmf.instance,name,"fmt") end)
+ callback.register('find_image_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end)
+ callback.register('find_map_file' , function(name) return input.findbinfile(texmf.instance,name,"map") end)
+ callback.register('find_ocp_file' , function(name) return input.findbinfile(texmf.instance,name,"ocp") end)
+ callback.register('find_opentype_file' , function(name) return input.findbinfile(texmf.instance,name,"otf") end)
+ callback.register('find_output_file' , function(name) return name end)
+ callback.register('find_pk_file' , function(name) return input.findbinfile(texmf.instance,name,"pk") end)
+ callback.register('find_sfd_file' , function(name) return input.findbinfile(texmf.instance,name,"sfd") end)
+ callback.register('find_truetype_file' , function(name) return input.findbinfile(texmf.instance,name,"ttf") end)
+ callback.register('find_type1_file' , function(name) return input.findbinfile(texmf.instance,name,"pfb") end)
+ callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"vf") end)
+
+ callback.register('read_data_file' , function(file) return input.loadbinfile(texmf.instance,file,"tex") end)
+ callback.register('read_enc_file' , function(file) return input.loadbinfile(texmf.instance,file,"enc") end)
+ callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"tfm") end)
+ -- format
+ -- image
+ callback.register('read_map_file' , function(file) return input.loadbinfile(texmf.instance,file,"map") end)
+ callback.register('read_ocp_file' , function(file) return input.loadbinfile(texmf.instance,file,"ocp") end)
+ callback.register('read_opentype_file' , function(file) return input.loadbinfile(texmf.instance,file,"otf") end)
+ -- output
+ callback.register('read_pk_file' , function(file) return input.loadbinfile(texmf.instance,file,"pk") end)
+ callback.register('read_sfd_file' , function(file) return input.loadbinfile(texmf.instance,file,"sfd") end)
+ callback.register('read_truetype_file' , function(file) return input.loadbinfile(texmf.instance,file,"ttf") end)
+ callback.register('read_type1_file' , function(file) return input.loadbinfile(texmf.instance,file,"pfb") end)
+ callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"vf" ) end)
+ end
+
+ if callback and environment.aleph_mode then
+ callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"ofm") end)
+ callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"ofm") end)
+ callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"ovf") end)
+ callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"ovf") end)
+ end
+
+ if callback then
+ callback.register('find_write_file' , function(id,name) return name end)
+ end
+
+ if callback and (not config or (#config == 0)) then
+ callback.register('find_format_file' , function(name) return name end)
+ end
+
+ if callback and false then
+ for k, v in pairs(callback.list()) do
+ if not v then texio.write_nl("<w>callback "..k.." is not set</w>") end
+ end
+ end
+
+ if callback then
+
+ input.start_actions = { }
+ input.stop_actions = { }
+
+ function input.register_start_actions(f) table.insert(input.start_actions, f) end
+ function input.register_stop_actions (f) table.insert(input.stop_actions, f) end
+
+--~ callback.register('start_run', function() for _, a in pairs(input.start_actions) do a() end end)
+--~ callback.register('stop_run' , function() for _, a in pairs(input.stop_actions ) do a() end end)
+
+ end
+
+ if callback and (input.logmode() == 'xml') then
+
+ function input.start_page_number()
+ texio.write_nl("<p real='" .. tex.count[0] .. "' page='"..tex.count[1].."' sub='"..tex.count[2].."'")
+ end
+ function input.stop_page_number()
+ texio.write("/>")
+ texio.write_nl("")
+ end
+
+ callback.register('start_page_number' , input.start_page_number)
+ callback.register('stop_page_number' , input.stop_page_number )
+
+ function input.report_output_pages(p,b)
+ texio.write_nl("<v k='pages'>"..p.."</v>")
+ texio.write_nl("<v k='bytes'>"..b.."</v>")
+ texio.write_nl("")
+ end
+ function input.report_output_log()
+ end
+
+ callback.register('report_output_pages', input.report_output_pages)
+ callback.register('report_output_log' , input.report_output_log )
+
+ function input.start_run()
+ texio.write_nl("<?xml version='1.0' standalone='yes'?>")
+ texio.write_nl("<job xmlns='www.tug.org/luatex/schemas/context-job.rng'>")
+ texio.write_nl("")
+ end
+ function input.stop_run()
+ texio.write_nl("</job>")
+ end
+ function input.show_statistics()
+ for k,v in pairs(status.list()) do
+ texio.write_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
+ end
+ end
+
+ table.insert(input.start_actions, input.start_run)
+
+ table.insert(input.stop_actions, input.show_statistics)
+ table.insert(input.stop_actions, input.stop_run)
+
+ function input.start_run() for _, a in pairs(input.start_actions) do a() end end
+ function input.stop_run () for _, a in pairs(input.stop_actions ) do a() end end
+
+ callback.register('start_run', input.start_run)
+ callback.register('stop_run' , input.stop_run )
+
+ end
+
+ end
+
+ if kpse then
+
+ function kpse.find_file(filename,filetype,mustexist)
+ return input.find_file(texmf.instance,filename,filetype,mustexist)
+ end
+ function kpse.expand_path(variable)
+ return input.expand_path(texmf.instance,variable)
+ end
+ function kpse.expand_var(variable)
+ return input.expand_var(texmf.instance,variable)
+ end
+ function kpse.expand_braces(variable)
+ return input.expand_braces(texmf.instance,variable)
+ end
+
+ end
+
+end
+
+-- program specific configuration (memory settings and alike)
+
+if texconfig and not texlua then
+
+ if not luatex then luatex = { } end
+
+ luatex.variablenames = {
+ 'main_memory', 'extra_mem_bot', 'extra_mem_top',
+ 'buf_size',
+ 'font_max', 'font_mem_size',
+ 'hash_extra', 'max_strings', 'pool_free', 'pool_size', 'string_vacancies',
+ 'obj_tab_size', 'pdf_mem_size', 'dest_names_size',
+ 'nest_size', 'param_size', 'save_size', 'stack_size',
+ 'trie_size', 'hyph_size',
+ 'ocp_stack_size', 'ocp_list_size', 'ocp_buf_size'
+ }
+
+ function luatex.variables()
+ local t, x = { }, nil
+ for _,v in pairs(luatex.variablenames) do
+ x = input.var_value(texmf.instance,v)
+ if x and x:find("^%d+$") then
+ t[v] = tonumber(x)
+ end
+ end
+ return t
+ end
+
+ function luatex.setvariables(tab)
+ for k,v in pairs(luatex.variables()) do
+ tab[k] = v
+ end
+ end
+
+ if not luatex.variables_set then
+ luatex.setvariables(texconfig)
+ luatex.variables_set = true
+ end
+
+ texconfig.max_print_line = 100000
+
+end
+
+-- some tex basics
+
+if not cs then cs = { } end
+
+function cs.def(k,v)
+ tex.sprint(tex.texcatcodes, "\\def\\" .. k .. "{" .. v .. "}")
+end
+
+function cs.chardef(k,v)
+ tex.sprint(tex.texcatcodes, "\\chardef\\" .. k .. "=" .. v .. "\\relax")
+end
+
+function cs.boolcase(b)
+ if b then tex.write(1) else tex.write(0) end
+end
+
+function cs.testcase(b)
+ if b then
+ tex.sprint(tex.texcatcodes, "\\firstoftwoarguments")
+ else
+ tex.sprint(tex.texcatcodes, "\\secondoftwoarguments")
+ end
+end
+
+
+if not modules then modules = { } end modules ['luat-kps'] = {
+ version = 1.001,
+ comment = "companion to luatools.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This file is used when we want the input handlers to behave like
+<type>kpsewhich</type>. What to do with the following:</p>
+
+<typing>
+{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
+$SELFAUTOLOC : /usr/tex/bin/platform
+$SELFAUTODIR : /usr/tex/bin
+$SELFAUTOPARENT : /usr/tex
+</typing>
+
+<p>How about just forgetting abou them?</p>
+--ldx]]--
+
+input = input or { }
+input.suffixes = input.suffixes or { }
+input.formats = input.formats or { }
+
+input.suffixes['gf'] = { '<resolution>gf' }
+input.suffixes['pk'] = { '<resolution>pk' }
+input.suffixes['base'] = { 'base' }
+input.suffixes['bib'] = { 'bib' }
+input.suffixes['bst'] = { 'bst' }
+input.suffixes['cnf'] = { 'cnf' }
+input.suffixes['mem'] = { 'mem' }
+input.suffixes['mf'] = { 'mf' }
+input.suffixes['mfpool'] = { 'pool' }
+input.suffixes['mft'] = { 'mft' }
+input.suffixes['mppool'] = { 'pool' }
+input.suffixes['graphic/figure'] = { 'eps', 'epsi' }
+input.suffixes['texpool'] = { 'pool' }
+input.suffixes['PostScript header'] = { 'pro' }
+input.suffixes['ist'] = { 'ist' }
+input.suffixes['web'] = { 'web', 'ch' }
+input.suffixes['cweb'] = { 'w', 'web', 'ch' }
+input.suffixes['cmap files'] = { 'cmap' }
+input.suffixes['lig files'] = { 'lig' }
+input.suffixes['bitmap font'] = { }
+input.suffixes['MetaPost support'] = { }
+input.suffixes['TeX system documentation'] = { }
+input.suffixes['TeX system sources'] = { }
+input.suffixes['dvips config'] = { }
+input.suffixes['type42 fonts'] = { }
+input.suffixes['web2c files'] = { }
+input.suffixes['other text files'] = { }
+input.suffixes['other binary files'] = { }
+input.suffixes['opentype fonts'] = { 'otf' }
+
+input.suffixes['fmt'] = { 'fmt' }
+input.suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
+
+input.suffixes['pdftex config'] = { }
+input.suffixes['Troff fonts'] = { }
+
+input.suffixes['ls-R'] = { }
+
+--[[ldx--
+<p>If you wondered abou tsome of the previous mappings, how about
+the next bunch:</p>
+--ldx]]--
+
+input.formats['bib'] = ''
+input.formats['bst'] = ''
+input.formats['mft'] = ''
+input.formats['ist'] = ''
+input.formats['web'] = ''
+input.formats['cweb'] = ''
+input.formats['MetaPost support'] = ''
+input.formats['TeX system documentation'] = ''
+input.formats['TeX system sources'] = ''
+input.formats['Troff fonts'] = ''
+input.formats['dvips config'] = ''
+input.formats['graphic/figure'] = ''
+input.formats['ls-R'] = ''
+input.formats['other text files'] = ''
+input.formats['other binary files'] = ''
+
+input.formats['gf'] = ''
+input.formats['pk'] = ''
+input.formats['base'] = 'MFBASES'
+input.formats['cnf'] = ''
+input.formats['mem'] = 'MPMEMS'
+input.formats['mf'] = 'MFINPUTS'
+input.formats['mfpool'] = 'MFPOOL'
+input.formats['mppool'] = 'MPPOOL'
+input.formats['texpool'] = 'TEXPOOL'
+input.formats['PostScript header'] = 'TEXPSHEADERS'
+input.formats['cmap files'] = 'CMAPFONTS'
+input.formats['type42 fonts'] = 'T42FONTS'
+input.formats['web2c files'] = 'WEB2C'
+input.formats['pdftex config'] = 'PDFTEXCONFIG'
+input.formats['texmfscripts'] = 'TEXMFSCRIPTS'
+input.formats['bitmap font'] = ''
+input.formats['lig files'] = 'LIGFONTS'
+
+
+-- end library merge
+
+-- We initialize some characteristics of this program. We need to
+-- do this before we load the libraries, else own.name will not be
+-- properly set (handy for selfcleaning the file). It's an ugly
+-- looking piece of code.
+
+own = { }
+
+own.libs = { -- todo: check which ones are really needed
+ 'l-string.lua',
+ 'l-table.lua',
+ 'l-io.lua',
+ 'l-number.lua',
+ 'l-os.lua',
+ 'l-md5.lua',
+ 'l-file.lua',
+ 'l-dir.lua',
+ 'l-boolean.lua',
+ 'l-unicode.lua',
+ 'l-utils.lua',
+ 'luat-lib.lua',
+ 'luat-inp.lua',
+ 'luat-tmp.lua',
+ 'luat-zip.lua',
+ 'luat-tex.lua',
+ 'luat-kps.lua',
+}
+
+-- We need this hack till luatex is fixed.
+
+if arg and arg[0] == 'luatex' and arg[1] == "--luaonly" then
+ arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
+end
+
+-- End of hack.
+
+own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua'
+own.path = string.match(own.name,"^(.+)[\\/].-$") or "."
+own.list = { '.' }
+
+if own.path ~= '.' then
+ table.insert(own.list,own.path)
+end
+
+table.insert(own.list,own.path.."/../../../tex/context/base")
+table.insert(own.list,own.path.."/mtx")
+table.insert(own.list,own.path.."/../sources")
+
+function locate_libs()
+ for _, lib in pairs(own.libs) do
+ for _, pth in pairs(own.list) do
+ local filename = string.gsub(pth .. "/" .. lib,"\\","/")
+ local codeblob = loadfile(filename)
+ if codeblob then
+ codeblob()
+ own.list = { pth } -- speed up te search
+ break
+ end
+ end
+ end
+end
+
+if not input then
+ locate_libs()
+end
+
+if not input then
+ print("")
+ print("Luatools is unable to start up due to lack of libraries. You may")
+ print("try to run 'lua luatools.lua --selfmerge' in the path where this")
+ print("script is located (normally under ..../scripts/context/lua) which")
+ print("will make luatools library independent.")
+ os.exit()
+end
+
+instance = input.reset()
+input.verbose = environment.arguments["verbose"] or false
+input.banner = 'LuaTools | '
+utils.report = input.report
+
+input.defaultlibs = { -- not all are needed
+ 'l-string.lua', 'l-table.lua', 'l-boolean.lua', 'l-number.lua', 'l-unicode.lua',
+ 'l-md5.lua', 'l-os.lua', 'l-io.lua', 'l-file.lua', 'l-dir.lua', 'l-utils.lua', 'l-tex.lua',
+ 'luat-lib.lua', 'luat-inp.lua', 'luat-tmp.lua', 'luat-zip.lua', 'luat-tex.lua'
+}
+
+-- todo: use environment.argument() instead of environment.arguments[]
+
+instance.engine = environment.arguments["engine"] or 'luatex'
+instance.progname = environment.arguments["progname"] or 'context'
+instance.luaname = environment.arguments["luafile"] or "" -- environment.ownname or ""
+instance.lualibs = environment.arguments["lualibs"] or table.concat(input.defaultlibs,",")
+instance.allresults = environment.arguments["all"] or false
+instance.pattern = environment.arguments["pattern"] or nil
+instance.sortdata = environment.arguments["sort"] or false
+instance.kpseonly = not environment.arguments["all"] or false
+instance.my_format = environment.arguments["format"] or instance.format
+instance.lsrmode = environment.arguments["lsr"] or false
+
+if environment.arguments["trace"] then input.settrace(environment.arguments["trace"]) end
+
+if environment.arguments["minimize"] then
+ if input.validators.visibility[instance.progname] then
+ instance.validfile = input.validators.visibility[instance.progname]
+ end
+end
+
+function input.my_prepare_a(instance)
+ input.identify_cnf(instance)
+ input.load_cnf(instance)
+ input.expand_variables(instance)
+end
+
+function input.my_prepare_b(instance)
+ input.my_prepare_a(instance)
+ input.load_hash(instance)
+ input.automount(instance)
+end
+
+-- barename
+
+if not messages then messages = { } end
+
+messages.no_ini_file = [[
+There is no lua initialization file found. This file can be forced by the
+"--progname" directive, or specified with "--luaname", or it is derived
+automatically from the formatname (aka jobname). It may be that you have
+to regenerate the file database using "luatools --generate".
+]]
+
+messages.help = [[
+--generate generate file database
+--variables show configuration variables
+--expansions show expanded variables
+--configurations show configuration order
+--expand-braces expand complex variable
+--expand-path expand variable (resolve paths)
+--expand-var expand variable (resolve references)
+--show-path show path expansion of ...
+--var-value report value of variable
+--find-file report file location
+--make or --ini make luatex format
+--run or --fmt= run luatex format
+--luafile=str lua inifile (default is <progname>.lua)
+--lualibs=list libraries to assemble (optional when --compile)
+--compile assemble and compile lua inifile
+--mkii force context mkii mode (only for testing, not usable!)
+--verbose give a bit more info
+--minimize optimize lists for format
+--all show all found files
+--sort sort cached data
+--engine=str target engine
+--progname=str format or backend
+--pattern=str filter variables
+--lsr use lsr and cnf directly
+]]
+
+function input.my_make_format(instance,texname)
+ if texname and texname ~= "" then
+ if input.usecache then
+ local path = file.join(cache.setpath(instance,"formats")) -- maybe platform
+ if path and lfs then
+ lfs.chdir(path)
+ end
+ end
+ local barename = texname:gsub("%.%a+$","")
+ if barename == texname then
+ texname = texname .. ".tex"
+ end
+ local fullname = input.find_files(instance,texname)[1] or ""
+ if fullname == "" then
+ input.report("no tex file with name",texname)
+ else
+ local luaname, lucname, luapath, lualibs = "", "", "", { }
+ -- the following is optional, since context.lua can also
+ -- handle this collect and compile business
+ if environment.arguments["compile"] then
+ if luaname == "" then luaname = barename end
+ input.report("creating initialization file " .. luaname)
+ luapath = file.dirname(luaname)
+ if luapath == "" then
+ luapath = file.dirname(texname)
+ end
+ if luapath == "" then
+ luapath = file.dirname(input.find_files(instance,texname)[1] or "")
+ end
+ lualibs = string.split(instance.lualibs,",")
+ luaname = file.basename(barename .. ".lua")
+ lucname = file.basename(barename .. ".luc")
+ -- todo: when this fails, we can just copy the merged libraries from
+ -- luatools since they are normally the same, at least for context
+ if lualibs[1] then
+ local firstlib = file.join(luapath,lualibs[1])
+ if not lfs.isfile(firstlib) then
+ local foundname = input.find_files(instance,lualibs[1])[1]
+ if foundname then
+ input.report("located library path : " .. luapath)
+ luapath = file.dirname(foundname)
+ end
+ end
+ end
+ input.report("using library path : " .. luapath)
+ input.report("using lua libraries: " .. table.join(lualibs," "))
+ utils.merger.selfcreate(lualibs,luapath,luaname)
+ if utils.lua.compile(luaname, lucname) and io.exists(lucname) then
+ luaname = lucname
+ input.report("using compiled initialization file " .. lucname)
+ else
+ input.report("using uncompiled initialization file " .. luaname)
+ end
+ else
+ for _, v in pairs({instance.luaname, instance.progname, barename}) do
+ v = string.gsub(v..".lua","%.lua%.lua$",".lua")
+ if v and (v ~= "") then
+ luaname = input.find_files(instance,v)[1] or ""
+ if luaname ~= "" then
+ break
+ end
+ end
+ end
+ end
+ if luaname == "" then
+ input.reportlines(messages.no_ini_file)
+ input.report("texname : " .. texname)
+ input.report("luaname : " .. instance.luaname)
+ input.report("progname : " .. instance.progname)
+ input.report("barename : " .. barename)
+ else
+ input.report("using lua initialization file " .. luaname)
+ local flags = { "--ini" }
+ if environment.arguments["mkii"] then
+ -- flags[#flags+1] = "--mkii" -- web2c error
+ flags[#flags+1] = "--progname=" .. instance.progname
+ else
+ flags[#flags+1] = "--lua=" .. string.quote(luaname)
+ -- flags[#flags+1] = "--progname=" .. instance.progname -- potential fallback
+ end
+ local command = "luatex ".. table.concat(flags," ") .. " " .. string.quote(fullname) .. " \\dump"
+ input.report("running command: " .. command .. "\n")
+ os.exec(command)
+ end
+ end
+ else
+ input.report("no tex file given")
+ end
+end
+
+function input.my_run_format(instance,name,data)
+ if name and (name ~= "") then
+ local barename = name:gsub("%.%a+$","")
+ local fmtname = ""
+ if input.usecache then
+ local path = file.join(cache.setpath(instance,"formats")) -- maybe platform
+ fmtname = file.join(path,barename..".fmt") or ""
+ end
+ if fmtname == "" then
+ fmtname = input.find_files(instance,barename..".fmt")[1] or ""
+ end
+ fmtname = input.clean_path(fmtname)
+ local barename = fmtname:gsub("%.%a+$","")
+ if fmtname == "" then
+ input.report("no format with name",name)
+ else
+ local luaname = barename .. ".luc"
+ local f = io.open(luaname)
+ if not f then
+ luaname = barename .. ".lua"
+ f = io.open(luaname)
+ end
+ if f then
+ f:close()
+ -- bug, no .fmt !
+ local command = "luatex --fmt=" .. string.quote(barename) .. " --lua=" .. string.quote(luaname) .. " " .. string.quote(data)
+ input.report("running command: " .. command)
+ os.exec(command)
+ else
+ input.report("using format name",fmtname)
+ input.report("no luc/lua with name",barename)
+ end
+ end
+ end
+end
+
+input.report(banner,"\n")
+
+local ok = true
+
+if environment.arguments["selfmerge"] then
+ utils.merger.selfmerge(own.name,own.libs,own.list)
+elseif environment.arguments["selfclean"] then
+ utils.merger.selfclean(own.name)
+elseif environment.arguments["selfupdate"] then
+ input.my_prepare_b(instance)
+ input.verbose = true
+ input.update_script(own.name,"luatools")
+elseif environment.arguments["generate"] then
+ instance.renewcache = true
+ input.verbose = true
+ input.my_prepare_b(instance)
+elseif environment.arguments["make"] or environment.arguments["ini"] or environment.arguments["compile"] then
+ input.my_prepare_b(instance)
+ input.verbose = true
+ input.my_make_format(instance,environment.files[1] or "")
+elseif environment.arguments["run"] then
+ input.my_prepare_a(instance) -- ! no need for loading databases
+ input.verbose = true
+ input.my_run_format(instance,environment.files[1] or "",environment.files[2] or "")
+elseif environment.arguments["fmt"] then
+ input.my_prepare_a(instance) -- ! no need for loading databases
+ input.verbose = true
+ input.my_run_format(instance,environment.arguments["fmt"], environment.files[1] or "")
+elseif environment.arguments["variables"] or environment.arguments["show-variables"] then
+ input.my_prepare_a(instance)
+ input.list_variables(instance)
+elseif environment.arguments["expansions"] or environment.arguments["show-expansions"] then
+ input.my_prepare_a(instance)
+ input.list_expansions(instance)
+elseif environment.arguments["configurations"] or environment.arguments["show-configurations"] then
+ input.my_prepare_a(instance)
+ input.list_configurations(instance)
+elseif environment.arguments["expand-braces"] then
+ input.my_prepare_a(instance)
+ input.for_files(instance, input.expand_braces, environment.files)
+elseif environment.arguments["expand-path"] then
+ input.my_prepare_a(instance)
+ input.for_files(instance, input.expand_path, environment.files)
+elseif environment.arguments["expand-var"] or environment.arguments["expand-variable"] then
+ input.my_prepare_a(instance)
+ input.for_files(instance, input.expand_var, environment.files)
+elseif environment.arguments["show-path"] or environment.arguments["path-value"] then
+ input.my_prepare_a(instance)
+ input.for_files(instance, input.show_path, environment.files)
+elseif environment.arguments["var-value"] or environment.arguments["show-value"] then
+ input.my_prepare_a(instance)
+ input.for_files(instance, input.var_value, environment.files)
+elseif environment.arguments["find-file"] then
+ input.my_prepare_b(instance)
+ instance.format = environment.arguments["format"] or instance.format
+ if environment.arguments["pattern"] then
+ instance.allresults = true
+ input.for_files(instance, input.find_files, { environment.arguments["pattern"] }, instance.my_format)
+ else
+ input.for_files(instance, input.find_files, environment.files, instance.my_format)
+ end
+--~ elseif environment.arguments["first-writable-path"] then
+--~ input.my_prepare_b(instance)
+--~ input.report(input.first_writable_path(instance,environment.files[1] or "."))
+elseif environment.arguments["format-path"] then
+ input.my_prepare_b(instance)
+ input.report(cache.setpath(instance,"format"))
+elseif environment.arguments["pattern"] then
+ input.my_prepare_b(instance)
+ instance.format = environment.arguments["format"] or instance.format
+ instance.allresults = true
+ input.for_files(instance, input.find_files, { environment.arguments["pattern"] }, instance.my_format)
+elseif environment.arguments["help"] or (environment.files[1]=='help') or (#environment.files==0) then
+ if not input.verbose then
+ input.verbose = true
+ input.report(banner,"\n")
+ end
+ input.reportlines(messages.help)
+else
+ input.my_prepare_b(instance)
+ input.for_files(instance, input.find_files, environment.files, instance.my_format)
+end
+
+if input.verbose then
+ input.report("")
+ input.report("runtime: " .. os.clock() .. " seconds")
+end
+
+--~ if ok then
+--~ input.report("exit code: 0") os.exit(0)
+--~ else
+--~ input.report("exit code: 1") os.exit(1)
+--~ end
+
+if environment.platform == "unix" then
+ io.write("\n")
+end
diff --git a/scripts/context/lua/mtx-cache.lua b/scripts/context/lua/mtx-cache.lua
new file mode 100644
index 000000000..0b0983d1b
--- /dev/null
+++ b/scripts/context/lua/mtx-cache.lua
@@ -0,0 +1,92 @@
+dofile(input.find_file(instance,"luat-log.lua"))
+
+texmf.instance = instance -- we need to get rid of this / maybe current instance in global table
+
+scripts = scripts or { }
+scripts.cache = scripts.cache or { }
+
+function scripts.cache.collect_one(...)
+ local path = cache.setpath(instance,...)
+ local tmas = dir.glob(path .. "/*tma")
+ local tmcs = dir.glob(path .. "/*tmc")
+ return path, tmas, tmcs
+end
+
+function scripts.cache.collect_two(...)
+ local path = cache.setpath(instance,...)
+ local rest = dir.glob(path .. "/**/*")
+ return path, rest
+end
+
+function scripts.cache.process_one(action)
+ action("fonts", "afm")
+ action("fonts", "tfm")
+ action("fonts", "def")
+ action("fonts", "enc")
+ action("fonts", "otf")
+ action("fonts", "data")
+end
+
+function scripts.cache.process_two(action)
+ action("curl")
+end
+
+-- todo: recursive delete of paths
+
+function scripts.cache.remove(list,keep)
+ local keepsuffixes = { }
+ for _, v in ipairs(keep or {}) do
+ keepsuffixes[v] = true
+ end
+ local n = 0
+ for _,filename in ipairs(list) do
+ if filename:find("luatex%-cache") then -- safeguard
+ if not keepsuffixes[file.extname(filename) or ""] then
+ os.remove(filename)
+ n = n + 1
+ end
+ end
+ end
+ return n
+end
+
+function scripts.cache.delete(all,keep)
+ local function action(...)
+ local path, rest = scripts.cache.collect_two(...)
+ local n = scripts.cache.remove(rest,keep)
+ logs.report("cache path",string.format("%4i files out of %4i deleted on %s",n,#rest,path))
+ end
+ scripts.cache.process_one(action)
+ scripts.cache.process_two(action)
+end
+
+function scripts.cache.list(all)
+ scripts.cache.process_one(function(...)
+ local path, tmas, tmcs = scripts.cache.collect_one(...)
+ logs.report("cache path",string.format("tma:%4i tmc:%4i %s",#tmas,#tmcs,path))
+ end)
+ scripts.cache.process_two(function(...)
+ local path, rest = scripts.cache.collect_two("curl")
+ logs.report("cache path",string.format("all:%4i %s",#rest,path))
+ end)
+end
+
+banner = banner .. " | cache tools "
+
+messages.help = [[
+--purge remove not used files
+--erase completely remove cache
+--list show cache
+
+--all all (not yet implemented)
+]]
+
+if environment.argument("purge") then
+ scripts.cache.delete(environment.argument("all"),{"tmc"})
+elseif environment.argument("erase") then
+ scripts.cache.delete(environment.argument("all"))
+elseif environment.argument("list") then
+ scripts.cache.list(environment.argument("all"))
+else
+ input.help(banner,messages.help)
+end
diff --git a/scripts/context/lua/mtx-fonts.lua b/scripts/context/lua/mtx-fonts.lua
new file mode 100644
index 000000000..10211fe22
--- /dev/null
+++ b/scripts/context/lua/mtx-fonts.lua
@@ -0,0 +1,90 @@
+dofile(input.find_file(instance,"luat-log.lua"))
+dofile(input.find_file(instance,"font-syn.lua"))
+
+texmf.instance = instance -- we need to get rid of this / maybe current instance in global table
+
+scripts = scripts or { }
+scripts.fonts = scripts.fonts or { }
+
+function scripts.fonts.list(pattern,reload,all)
+ if reload then
+ logs.report("fontnames","reloading font database")
+ end
+ local t = fonts.names.list(pattern,reload)
+ if reload then
+ logs.report("fontnames","done\n\n")
+ end
+ if t then
+ local s, w = table.sortedkeys(t), { 0, 0, 0 }
+ local function action(f)
+ for k,v in pairs(s) do
+ if all or v == t[v][2]:lower() then
+ local type, name, file, sub = unpack(t[v])
+ f(v,name,file,sub)
+ end
+ end
+ end
+ action(function(v,n,f,s)
+ if #v > w[1] then w[1] = #v end
+ if #n > w[2] then w[2] = #n end
+ if #f > w[3] then w[3] = #f end
+ end)
+ action(function(v,n,f,s)
+ if s then s = "(sub)" else s = "" end
+ print(string.format("%s %s %s %s",v:padd(w[1]," "),n:padd(w[2]," "),f:padd(w[3]," "), s))
+ end)
+ end
+end
+
+function scripts.fonts.save(name,sub)
+ local function save(savename,fontblob)
+ if fontblob then
+ savename = savename:lower() .. ".lua"
+ logs.report("fontsave","saving data in " .. savename)
+ table.tofile(savename,fontforge.to_table(fontblob),"return")
+ fontforge.close(fontblob)
+ end
+ end
+ if name and name ~= "" then
+ local filename = input.find_file(texmf.instance,name) -- maybe also search for opentype
+ if filename and filename ~= "" then
+ local suffix = file.extname(filename)
+ if suffix == 'ttf' or suffix == 'otf' or suffix == 'ttc' then
+ local fontinfo = fontforge.info(filename)
+ if fontinfo then
+ if fontinfo[1] then
+ for _, v in ipairs(fontinfo) do
+ save(v.fontname,fontforge.open(filename,v.fullname))
+ end
+ else
+ save(fontinfo.fullname,fontforge.open(filename))
+ end
+ end
+ end
+ end
+ end
+end
+
+banner = banner .. " | font tools "
+
+messages.help = [[
+--list list installed fonts
+--save save open type font in raw table
+
+--pattern=str filter files
+--reload generate new font database
+--all provide alternatives
+]]
+
+if environment.argument("list") then
+ local pattern = environment.argument("pattern") or environment.files[1] or ""
+ local all = environment.argument("all")
+ local reload = environment.argument("reload")
+ scripts.fonts.list(pattern,reload,all)
+elseif environment.argument("save") then
+ local name = environment.files[1] or ""
+ local sub = environment.files[2] or ""
+ scripts.fonts.save(name,sub)
+else
+ input.help(banner,messages.help)
+end
diff --git a/scripts/context/lua/mtxrun.cmd b/scripts/context/lua/mtxrun.cmd
new file mode 100644
index 000000000..f30148ddb
--- /dev/null
+++ b/scripts/context/lua/mtxrun.cmd
@@ -0,0 +1,5 @@
+@echo off
+setlocal
+set ownpath=%~dp0%
+texlua "%ownpath%mtxrun.lua" %*
+endlocal
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
new file mode 100644
index 000000000..d5a0701c9
--- /dev/null
+++ b/scripts/context/lua/mtxrun.lua
@@ -0,0 +1,4625 @@
+#!/usr/bin/env texlua
+
+-- one can make a stub:
+--
+-- #!/bin/sh
+-- env LUATEXDIR=/....../texmf/scripts/context/lua luatex --luaonly mtxrun.lua "$@"
+
+-- filename : mtxrun.lua
+-- comment : companion to context.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- This script is based on texmfstart.rb but does not use kpsewhich to
+-- locate files. Although kpse is a library it never came to opening up
+-- its interface to other programs (esp scripting languages) and so we
+-- do it ourselves. The lua variant evolved out of an experimental ruby
+-- one. Interesting is that using a scripting language instead of c does
+-- not have a speed penalty. Actually the lua variant is more efficient,
+-- especially when multiple calls to kpsewhich are involved. The lua
+-- library also gives way more ocntrol.
+
+-- to be done / considered
+--
+-- support for --exec or make it default
+-- support for jar files (or maybe not, never used, too messy)
+-- support for $RUBYINPUTS cum suis (if still needed)
+-- remember for subruns: _CTX_K_V_#{original}_
+-- remember for subruns: _CTX_K_S_#{original}_
+-- remember for subruns: TEXMFSTART.#{original} [tex.rb texmfstart.rb]
+
+banner = "version 1.0.1 - 2007+ - PRAGMA ADE / CONTEXT"
+texlua = true
+
+-- begin library merge
+
+-- filename : l-string.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-string'] = 1.001
+
+--~ function string.split(str, pat) -- taken from the lua wiki
+--~ local t = {n = 0} -- so this table has a length field, traverse with ipairs then!
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = string.find(str, fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ table.insert(t,cap)
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = string.find(str, fpat, last_end)
+--~ end
+--~ if last_end<=string.len(str) then
+--~ table.insert(t,(string.sub(str,last_end)))
+--~ end
+--~ return t
+--~ end
+
+--~ function string:split(pat) -- taken from the lua wiki but adapted
+--~ local t = { } -- self and colon usage (faster)
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = self:find(fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ t[#t+1] = cap
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = self:find(fpat, last_end)
+--~ end
+--~ if last_end <= #self then
+--~ t[#t+1] = self:sub(last_end)
+--~ end
+--~ return t
+--~ end
+
+--~ a piece of brilliant code by Rici Lake (posted on lua list) -- only names changed
+--~
+--~ function string:splitter(pat)
+--~ local st, g = 1, self:gmatch("()"..pat.."()")
+--~ local function splitter(self)
+--~ if st then
+--~ local s, f = g()
+--~ local rv = self:sub(st, (s or 0)-1)
+--~ st = f
+--~ return rv
+--~ end
+--~ end
+--~ return splitter, self
+--~ end
+
+function string:splitter(pat)
+ -- by Rici Lake (posted on lua list) -- only names changed
+ -- p 79 ref man: () returns position of match
+ local st, g = 1, self:gmatch("()("..pat..")")
+ local function strgetter(self, segs, seps, sep, cap1, ...)
+ st = sep and seps + #sep
+ return self:sub(segs, (seps or 0) - 1), cap1 or sep, ...
+ end
+ local function strsplitter(self)
+ if st then return strgetter(self, st, g()) end
+ end
+ return strsplitter, self
+end
+
+function string:split(separator)
+ local t = {}
+ for k in self:splitter(separator) do t[#t+1] = k end
+ return t
+end
+
+-- faster than a string:split:
+
+function string:splitchr(chr)
+ if #self > 0 then
+ local t = { }
+ for s in string.gmatch(self..chr,"(.-)"..chr) do
+ t[#t+1] = s
+ end
+ return t
+ else
+ return { }
+ end
+end
+
+--~ function string.piecewise(str, pat, fnc) -- variant of split
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = string.find(str, fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ fnc(cap)
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = string.find(str, fpat, last_end)
+--~ end
+--~ if last_end <= #str then
+--~ fnc((string.sub(str,last_end)))
+--~ end
+--~ end
+
+function string.piecewise(str, pat, fnc) -- variant of split
+ for k in string.splitter(str,pat) do fnc(k) end
+end
+
+--~ do if lpeg then
+
+--~ -- this alternative is 30% faster esp when we cache them
+--~ -- problem: no expressions
+
+--~ splitters = { }
+
+--~ function string:split(separator)
+--~ if #self > 0 then
+--~ local split = splitters[separator]
+--~ if not split then
+--~ -- based on code by Roberto
+--~ local p = lpeg.P(separator)
+--~ local c = lpeg.C((1-p)^0)
+--~ split = lpeg.Ct(c*(p*c)^0)
+--~ splitters[separator] = split
+--~ end
+--~ return lpeg.match(split,self)
+--~ else
+--~ return { }
+--~ end
+--~ end
+
+--~ string.splitchr = string.split
+
+--~ function string:piecewise(separator,fnc)
+--~ for _,v in pairs(self:split(separator)) do
+--~ fnc(v)
+--~ end
+--~ end
+
+--~ end end
+
+string.chr_to_esc = {
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["^"] = "%^", ["$"] = "%$",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ ["{"] = "%{", ["}"] = "%}"
+}
+
+function string:esc() -- variant 2
+ return (self:gsub("(.)",string.chr_to_esc))
+end
+
+function string.unquote(str)
+ return (str:gsub("^([\"\'])(.*)%1$","%2"))
+end
+
+function string.quote(str)
+ return '"' .. str:unquote() .. '"'
+end
+
+function string:count(pattern) -- variant 3
+ local n = 0
+ for _ in self:gmatch(pattern) do
+ n = n + 1
+ end
+ return n
+end
+
+function string:limit(n,sentinel)
+ if #self > n then
+ sentinel = sentinel or " ..."
+ return self:sub(1,(n-#sentinel)) .. sentinel
+ else
+ return self
+ end
+end
+
+function string:strip()
+ return (self:gsub("^%s*(.-)%s*$", "%1"))
+end
+
+--~ function string.strip(str) -- slightly different
+--~ return (string.gsub(string.gsub(str,"^%s*(.-)%s*$","%1"),"%s+"," "))
+--~ end
+
+function string:is_empty()
+ return not self:find("%S")
+end
+
+function string:enhance(pattern,action)
+ local ok, n = true, 0
+ while ok do
+ ok = false
+ self = self:gsub(pattern, function(...)
+ ok, n = true, n + 1
+ return action(...)
+ end)
+ end
+ return self, n
+end
+
+--~ function string:enhance(pattern,action)
+--~ local ok, n = 0, 0
+--~ repeat
+--~ self, ok = self:gsub(pattern, function(...)
+--~ n = n + 1
+--~ return action(...)
+--~ end)
+--~ until ok == 0
+--~ return self, n
+--~ end
+
+--~ function string:to_hex()
+--~ if self then
+--~ return (self:gsub("(.)",function(c)
+--~ return string.format("%02X",c:byte())
+--~ end))
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+--~ function string:from_hex()
+--~ if self then
+--~ return (self:gsub("(..)",function(c)
+--~ return string.char(tonumber(c,16))
+--~ end))
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+string.chr_to_hex = { }
+string.hex_to_chr = { }
+
+for i=0,255 do
+ local c, h = string.char(i), string.format("%02X",i)
+ string.chr_to_hex[c], string.hex_to_chr[h] = h, c
+end
+
+--~ function string:to_hex()
+--~ if self then return (self:gsub("(.)",string.chr_to_hex)) else return "" end
+--~ end
+
+--~ function string:from_hex()
+--~ if self then return (self:gsub("(..)",string.hex_to_chr)) else return "" end
+--~ end
+
+function string:to_hex()
+ return ((self or ""):gsub("(.)",string.chr_to_hex))
+end
+
+function string:from_hex()
+ return ((self or ""):gsub("(..)",string.hex_to_chr))
+end
+
+if not string.characters then
+
+ local function nextchar(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, str:sub(index,index)
+ end
+ function string:characters()
+ return nextchar, self, 0
+ end
+ local function nextbyte(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, string.byte(str:sub(index,index))
+ end
+ function string:bytes()
+ return nextbyte, self, 0
+ end
+
+end
+
+--~ function string:padd(n,chr)
+--~ return self .. self.rep(chr or " ",n-#self)
+--~ end
+
+function string:padd(n,chr)
+ local m = n-#self
+ if m > 0 then
+ return self .. self.rep(chr or " ",m)
+ else
+ return self
+ end
+end
+
+function is_number(str)
+ return str:find("^[%-%+]?[%d]-%.?[%d+]$") == 1
+end
+
+--~ print(is_number("1"))
+--~ print(is_number("1.1"))
+--~ print(is_number(".1"))
+--~ print(is_number("-0.1"))
+--~ print(is_number("+0.1"))
+--~ print(is_number("-.1"))
+--~ print(is_number("+.1"))
+
+
+-- filename : l-table.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-table'] = 1.001
+
+table.join = table.concat
+
+function table.strip(tab)
+ local lst = { }
+ for k, v in ipairs(tab) do
+ -- s = string.gsub(v, "^%s*(.-)%s*$", "%1")
+ s = v:gsub("^%s*(.-)%s*$", "%1")
+ if s == "" then
+ -- skip this one
+ else
+ lst[#lst+1] = s
+ end
+ end
+ return lst
+end
+
+--~ function table.sortedkeys(tab)
+--~ local srt = { }
+--~ for key,_ in pairs(tab) do
+--~ srt[#srt+1] = key
+--~ end
+--~ table.sort(srt)
+--~ return srt
+--~ end
+
+function table.sortedkeys(tab)
+ local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ for key,_ in pairs(tab) do
+ srt[#srt+1] = key
+ if kind == 3 then
+ -- no further check
+ elseif type(key) == "string" then
+ if kind == 2 then kind = 3 else kind = 1 end
+ elseif type(key) == "number" then
+ if kind == 1 then kind = 3 else kind = 2 end
+ else
+ kind = 3
+ end
+ end
+ if kind == 0 or kind == 3 then
+ table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
+ else
+ table.sort(srt)
+ end
+ return srt
+end
+
+function table.append(t, list)
+ for _,v in pairs(list) do
+ table.insert(t,v)
+ end
+end
+
+function table.prepend(t, list)
+ for k,v in pairs(list) do
+ table.insert(t,k,v)
+ end
+end
+
+if not table.fastcopy then
+
+ function table.fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in pairs(old) do
+ if type(v) == "table" then
+ new[k] = table.copy(v)
+ else
+ new[k] = v
+ end
+ end
+ return new
+ else
+ return { }
+ end
+ end
+
+end
+
+if not table.copy then
+
+ function table.copy(t, _lookup_table) -- taken from lua wiki
+ _lookup_table = _lookup_table or { }
+ local tcopy = {}
+ if not _lookup_table[t] then
+ _lookup_table[t] = tcopy
+ end
+ for i,v in pairs(t) do
+ if type(i) == "table" then
+ if _lookup_table[i] then
+ i = _lookup_table[i]
+ else
+ i = table.copy(i, _lookup_table)
+ end
+ end
+ if type(v) ~= "table" then
+ tcopy[i] = v
+ else
+ if _lookup_table[v] then
+ tcopy[i] = _lookup_table[v]
+ else
+ tcopy[i] = table.copy(v, _lookup_table)
+ end
+ end
+ end
+ return tcopy
+ end
+
+end
+
+-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
+end
+
+function table.replace(a,b)
+ for k,v in pairs(b) do
+ a[k] = v
+ end
+end
+
+-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
+
+function table.is_empty(t)
+ return not t or not next(t)
+end
+
+function table.one_entry(t)
+ local n = next(t)
+ return n and not next(t,n)
+end
+
+function table.starts_at(t)
+ return ipairs(t,1)(t,0)
+end
+
+do
+
+ -- 34.055.092 32.403.326 arabtype.tma
+ -- 1.620.614 1.513.863 lmroman10-italic.tma
+ -- 1.325.585 1.233.044 lmroman10-regular.tma
+ -- 1.248.157 1.158.903 lmsans10-regular.tma
+ -- 194.646 153.120 lmtypewriter10-regular.tma
+ -- 1.771.678 1.658.461 palatinosanscom-bold.tma
+ -- 1.695.251 1.584.491 palatinosanscom-regular.tma
+ -- 13.736.534 13.409.446 zapfinoextraltpro.tma
+
+ -- 13.679.038 11.774.106 arabtype.tmc
+ -- 886.248 754.944 lmroman10-italic.tmc
+ -- 729.828 466.864 lmroman10-regular.tmc
+ -- 688.482 441.962 lmsans10-regular.tmc
+ -- 128.685 95.853 lmtypewriter10-regular.tmc
+ -- 715.929 582.985 palatinosanscom-bold.tmc
+ -- 669.942 540.126 palatinosanscom-regular.tmc
+ -- 1.560.588 1.317.000 zapfinoextraltpro.tmc
+
+ table.serialize_functions = true
+ table.serialize_compact = true
+ table.serialize_inline = true
+
+ local function key(k)
+ if type(k) == "number" then -- or k:find("^%d+$") then
+ return "["..k.."]"
+ elseif noquotes and k:find("^%a[%a%d%_]*$") then
+ return k
+ else
+ return '["'..k..'"]'
+ end
+ end
+
+ local function simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in pairs(t) do
+ n = n + 1
+ end
+ if n == #t then
+ local tt = { }
+ for _,v in ipairs(t) do
+ local tv = type(v)
+ if tv == "number" or tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = ("%q"):format(v)
+ else
+ tt = nil
+ break
+ end
+ end
+ return tt
+ end
+ end
+ return nil
+ end
+
+ local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed)
+ handle = handle or print
+ reduce = reduce or false
+ if depth then
+ depth = depth .. " "
+ if indexed then
+ handle(("%s{"):format(depth))
+ else
+ handle(("%s%s={"):format(depth,key(name)))
+ end
+ else
+ depth = ""
+ if type(name) == "string" then
+ if name == "return" then
+ handle("return {")
+ else
+ handle(name .. "={")
+ end
+ elseif type(name) == "number" then
+ handle("[" .. name .. "]={")
+ elseif type(name) == "boolean" then
+ if name then
+ handle("return {")
+ else
+ handle("{")
+ end
+ else
+ handle("t={")
+ end
+ end
+ if root and next(root) then
+ local compact = table.serialize_compact
+ local inline = compact and table.serialize_inline
+ local first, last = nil, 0 -- #root cannot be trusted here
+ if compact then
+ for k,v in ipairs(root) do
+ if not first then first = k end
+ last = last + 1
+ end
+ end
+ for _,k in pairs(table.sortedkeys(root)) do
+ local v = root[k]
+ local t = type(v)
+ if compact and first and type(k) == "number" and k >= first and k <= last then
+ if t == "number" then
+ handle(("%s %s,"):format(depth,v))
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s,"):format(depth,v))
+ else
+ handle(("%s %q,"):format(depth,v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s {},"):format(depth))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s { %s },"):format(depth,table.concat(st,", ")))
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
+ end
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s,"):format(depth,tostring(v)))
+ elseif t == "function" then
+ if table.serialize_functions then
+ handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
+ else
+ handle(('%s "function",'):format(depth))
+ end
+ else
+ handle(("%s %q,"):format(depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(("%s __p__=nil,"):format(depth))
+ end
+ elseif t == "number" then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s %s={},"):format(depth,key(k)))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s %s={ %s },"):format(depth,key(k),table.concat(st,", ")))
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes)
+ end
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ elseif t == "function" then
+ if table.serialize_functions then
+ handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v)))
+ else
+ handle(('%s %s="function",'):format(depth,key(k)))
+ end
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
+ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
+ end
+ end
+ if level > 0 then
+ handle(("%s},"):format(depth))
+ else
+ handle(("%s}"):format(depth))
+ end
+ else
+ handle(("%s}"):format(depth))
+ end
+ end
+
+ --~ name:
+ --~
+ --~ true : return { }
+ --~ false : { }
+ --~ nil : t = { }
+ --~ string : string = { }
+ --~ 'return' : return { }
+ --~ number : [number] = { }
+
+ function table.serialize(root,name,reduce,noquotes)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ return table.concat(t,"\n")
+ end
+
+ function table.tohandle(handle,root,name,reduce,noquotes)
+ serialize(root, name, handle, nil, 0, reduce, noquotes)
+ end
+
+ -- sometimes tables are real use (zapfino extra pro is some 85M) in which
+ -- case a stepwise serialization is nice; actually, we could consider:
+ --
+ -- for line in table.serializer(root,name,reduce,noquotes) do
+ -- ...(line)
+ -- end
+ --
+ -- so this is on the todo list
+
+ table.tofile_maxtab = 2*1024
+
+ function table.tofile(filename,root,name,reduce,noquotes)
+ local f = io.open(filename,'w')
+ if f then
+ local concat = table.concat
+ local maxtab = table.tofile_maxtab
+ if maxtab > 1 then
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ if #t > maxtab then
+ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
+ t = { }
+ end
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ f:write(concat(t,"\n"),"\n")
+ else
+ local function flush(s)
+ f:write(s,"\n")
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ end
+ f:close()
+ end
+ end
+
+end
+
+--~ t = {
+--~ b = "123",
+--~ a = "x",
+--~ c = 1.23,
+--~ d = "1.23",
+--~ e = true,
+--~ f = {
+--~ d = "1.23",
+--~ a = "x",
+--~ b = "123",
+--~ c = 1.23,
+--~ e = true,
+--~ f = {
+--~ e = true,
+--~ f = {
+--~ e = true
+--~ },
+--~ },
+--~ },
+--~ g = function() end
+--~ }
+
+--~ print(table.serialize(t), "\n")
+--~ print(table.serialize(t,"name"), "\n")
+--~ print(table.serialize(t,false), "\n")
+--~ print(table.serialize(t,true), "\n")
+--~ print(table.serialize(t,"name",true), "\n")
+--~ print(table.serialize(t,"name",true,true), "\n")
+
+do
+
+ local function flatten(t,f,complete)
+ for _,v in ipairs(t) do
+ if type(v) == "table" then
+ if complete or type(v[1]) == "table" then
+ flatten(v,f,complete)
+ else
+ f[#f+1] = v
+ end
+ else
+ f[#f+1] = v
+ end
+ end
+ end
+
+ function table.flatten(t)
+ local f = { }
+ flatten(t,f,true)
+ return f
+ end
+
+ function table.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+ end
+
+ table.flatten_one_level = table.unnest
+
+end
+
+function table.insert_before_value(t,value,str)
+ for i=1,#t do
+ if t[i] == value then
+ table.insert(t,i,str)
+ return
+ end
+ end
+ table.insert(t,1,str)
+end
+
+function table.insert_after_value(t,value,str)
+ for i=1,#t do
+ if t[i] == value then
+ table.insert(t,i+1,str)
+ return
+ end
+ end
+ t[#t+1] = str
+end
+
+function table.are_equal(a,b,n,m)
+ if #a == #b then
+ n = n or 1
+ m = m or #a
+ for i=n,m do
+ local ai, bi = a[i], b[i]
+ if (ai==bi) or (type(ai)=="table" and type(bi)=="table" and table.are_equal(ai,bi)) then
+ -- continue
+ else
+ return false
+ end
+ end
+ return true
+ else
+ return false
+ end
+end
+
+--~ function table.are_equal(a,b)
+--~ return table.serialize(a) == table.serialize(b)
+--~ end
+
+
+
+-- filename : l-io.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-io'] = 1.001
+
+if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator = "\\", ";"
+else
+ io.fileseparator, io.pathseparator = "/" , ":"
+end
+
+function io.loaddata(filename)
+ local f = io.open(filename)
+ if f then
+ local data = f:read('*all')
+ f:close()
+ return data
+ else
+ return nil
+ end
+end
+
+function io.savedata(filename,data,joiner)
+ local f = io.open(filename, "wb")
+ if f then
+ if type(data) == "table" then
+ f:write(table.join(data,joiner or ""))
+ elseif type(data) == "function" then
+ data(f)
+ else
+ f:write(data)
+ end
+ f:close()
+ end
+end
+
+function io.exists(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return false
+ else
+ assert(f:close())
+ return true
+ end
+end
+
+function io.size(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return 0
+ else
+ local s = f:seek("end")
+ assert(f:close())
+ return s
+ end
+end
+
+function io.noflines(f)
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
+end
+
+--~ t, f, n = os.clock(), io.open("testbed/sample-utf16-bigendian-big.txt",'rb'), 0
+--~ for a in io.characters(f) do n = n + 1 end
+--~ print(string.format("characters: %s, time: %s", n, os.clock()-t))
+
+do
+
+ local nextchar = {
+ [ 4] = function(f)
+ return f:read(1), f:read(1), f:read(1), f:read(1)
+ end,
+ [ 2] = function(f)
+ return f:read(1), f:read(1)
+ end,
+ [ 1] = function(f)
+ return f:read(1)
+ end,
+ [-2] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ return b, a
+ end,
+ [-4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local c = f:read(1)
+ return d, c, b, a
+ end
+ }
+
+ function io.characters(f,n)
+ local sb = string.byte
+ if f then
+ return nextchar[n or 1], f
+ else
+ return nil, nil
+ end
+ end
+
+end
+
+do
+
+ local nextbyte = {
+ [4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local d = f:read(1)
+ if d then
+ return sb(a), sb(b), sb(c), sb(d)
+ else
+ return nil, nil, nil, nil
+ end
+ end,
+ [2] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ if b then
+ return sb(a), sb(b)
+ else
+ return nil, nil
+ end
+ end,
+ [1] = function (f)
+ local a = f:read(1)
+ if a then
+ return sb(a)
+ else
+ return nil
+ end
+ end,
+ [-2] = function (f)
+ local a = f:read(1)
+ local b = f:read(1)
+ if b then
+ return sb(b), sb(a)
+ else
+ return nil, nil
+ end
+ end,
+ [-4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local d = f:read(1)
+ if d then
+ return sb(d), sb(c), sb(b), sb(a)
+ else
+ return nil, nil, nil, nil
+ end
+ end
+ }
+
+ function io.bytes(f,n)
+ local sb = string.byte
+ if f then
+ return nextbyte[n or 1], f
+ else
+ return nil, nil
+ end
+ end
+
+end
+
+
+-- filename : l-md5.lua
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-md5'] = 1.001
+
+if md5 then do
+
+ local function convert(str,fmt)
+ return (string.gsub(md5.sum(str),".",function(chr) return string.format(fmt,string.byte(chr)) end))
+ end
+
+ if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
+ if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
+ if not md5.dec then function md5.dec(str) return convert(stt,"%03i") end end
+
+end end
+
+
+-- filename : l-number.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-number'] = 1.001
+
+if not number then number = { } end
+
+
+
+-- filename : l-os.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-os'] = 1.001
+
+function os.resultof(command)
+ return io.popen(command,"r"):read("*all")
+end
+
+--~ if not os.exec then -- still not ok
+ os.exec = os.execute
+--~ end
+
+function os.launch(str)
+ if os.platform == "windows" then
+ os.execute("start " .. str)
+ else
+ os.execute(str .. " &")
+ end
+end
+
+if not os.setenv then
+ function os.setenv() return false end
+end
+
+
+-- filename : l-file.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-file'] = 1.001
+
+if not file then file = { } end
+
+function file.removesuffix(filename)
+ return filename:gsub("%.%a+$", "")
+end
+
+function file.addsuffix(filename, suffix)
+ if not filename:find("%.%a-$") then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+end
+
+function file.replacesuffix(filename, suffix)
+ return filename:gsub("%.%a+$", "." .. suffix)
+end
+
+function file.dirname(name)
+ return name:match("^(.+)[/\\].-$") or ""
+end
+
+function file.basename(name)
+ return name:match("^.+[/\\](.-)$") or name
+end
+
+function file.extname(name)
+ return name:match("^.+%.(.-)$") or ""
+end
+
+function file.join(...) -- args
+ return (string.gsub(table.concat({...},"/"),"\\","/"))
+end
+
+function file.is_writable(name)
+ local f = io.open(name, 'w')
+ if f then
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function file.is_readable(name)
+ local f = io.open(name,'r')
+ if f then
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function file.split_path(str)
+ if str:find(';') then
+ return str:splitchr(";")
+ else
+ return str:splitchr(io.pathseparator)
+ end
+end
+
+function file.join_path(tab)
+ return table.concat(tab,io.pathseparator)
+end
+
+--~ print('test' .. " == " .. file.collapse_path("test"))
+--~ print("test/test" .. " == " .. file.collapse_path("test/test"))
+--~ print("test/test/test" .. " == " .. file.collapse_path("test/test/test"))
+--~ print("test/test" .. " == " .. file.collapse_path("test/../test/test"))
+--~ print("test" .. " == " .. file.collapse_path("test/../test"))
+--~ print("../test" .. " == " .. file.collapse_path("../test"))
+--~ print("../test/" .. " == " .. file.collapse_path("../test/"))
+--~ print("a/a" .. " == " .. file.collapse_path("a/b/c/../../a"))
+
+function file.collapse_path(str)
+ local ok = false
+ while not ok do
+ ok = true
+ str, n = str:gsub("[^%./]+/%.%./", function(s)
+ ok = false
+ return ""
+ end)
+ end
+ return (str:gsub("/%./","/"))
+end
+
+function file.robustname(str)
+ return (str:gsub("[^%a%d%/%-%.\\]+","-"))
+end
+
+file.readdata = io.loaddata
+file.savedata = io.savedata
+
+
+-- filename : l-dir.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-dir'] = 1.001
+
+dir = { }
+
+-- optimizing for no string.find (*) does not save time
+
+if lfs then
+
+ function dir.glob_pattern(path,patt,recurse,action)
+ for name in lfs.dir(path) do
+ local full = path .. '/' .. name
+ local mode = lfs.attributes(full,'mode')
+ if mode == 'file' then
+ if name:find(patt) then
+ action(full)
+ end
+ elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
+ dir.glob_pattern(full,patt,recurse,action)
+ end
+ end
+ end
+
+ function dir.glob(pattern, action)
+ local t = { }
+ local action = action or function(name) table.insert(t,name) end
+ local path, patt = pattern:match("^(.*)/*%*%*/*(.-)$")
+ local recurse = path and patt
+ if not recurse then
+ path, patt = pattern:match("^(.*)/(.-)$")
+ if not (path and patt) then
+ path, patt = '.', pattern
+ end
+ end
+ patt = patt:gsub("([%.%-%+])", "%%%1")
+ patt = patt:gsub("%*", ".*")
+ patt = patt:gsub("%?", ".")
+ patt = "^" .. patt .. "$"
+ -- print('path: ' .. path .. ' | pattern: ' .. patt .. ' | recurse: ' .. tostring(recurse))
+ dir.glob_pattern(path,patt,recurse,action)
+ return t
+ end
+
+ -- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex")
+ -- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex")
+ -- t = dir.glob("c:/data/develop/context/texmf/**/*.tex")
+ -- t = dir.glob("f:/minimal/tex/**/*")
+ -- print(dir.ls("f:/minimal/tex/**/*"))
+ -- print(dir.ls("*.tex"))
+
+ function dir.ls(pattern)
+ return table.concat(dir.glob(pattern),"\n")
+ end
+
+ --~ mkdirs("temp")
+ --~ mkdirs("a/b/c")
+ --~ mkdirs(".","/a/b/c")
+ --~ mkdirs("a","b","c")
+
+ function dir.mkdirs(...) -- root,... or ... ; root is not split
+ local pth, err = "", false
+ for k,v in pairs({...}) do
+ if k == 1 then
+ if not lfs.isdir(v) then
+ -- print("no root path " .. v)
+ err = true
+ else
+ pth = v
+ end
+ elseif lfs.isdir(pth .. "/" .. v) then
+ pth = pth .. "/" .. v
+ else
+ for _,s in pairs(v:split("/")) do
+ pth = pth .. "/" .. s
+ if not lfs.isdir(pth) then
+ ok = lfs.mkdir(pth)
+ if not lfs.isdir(pth) then
+ err = true
+ end
+ end
+ if err then break end
+ end
+ end
+ if err then break end
+ end
+ return pth, not err
+ end
+
+end
+
+
+-- filename : l-boolean.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-boolean'] = 1.001
+if not boolean then boolean = { } end
+
+function boolean.tonumber(b)
+ if b then return 1 else return 0 end
+end
+
+function toboolean(str)
+ if type(str) == "string" then
+ return str == "true" or str == "yes" or str == "on" or str == "1"
+ elseif type(str) == "number" then
+ return tonumber(str) ~= 0
+ else
+ return str
+ end
+end
+
+function string.is_boolean(str)
+ if type(str) == "string" then
+ if str == "true" or str == "yes" or str == "on" then
+ return true
+ elseif str == "false" or str == "no" or str == "off" then
+ return false
+ end
+ end
+ return nil
+end
+
+function boolean.alwaystrue()
+ return true
+end
+
+function boolean.falsetrue()
+ return false
+end
+
+
+-- filename : l-utils.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-utils'] = 1.001
+
+if not utils then utils = { } end
+if not utils.merger then utils.merger = { } end
+if not utils.lua then utils.lua = { } end
+
+utils.merger.m_begin = "begin library merge"
+utils.merger.m_end = "end library merge"
+utils.merger.pattern =
+ "%c+" ..
+ "%-%-%s+" .. utils.merger.m_begin ..
+ "%c+(.-)%c+" ..
+ "%-%-%s+" .. utils.merger.m_end ..
+ "%c+"
+
+function utils.merger._self_fake_()
+ return
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. utils.merger.m_begin .. "\n\n" ..
+ "-- " .. utils.merger.m_end .. "\n\n"
+end
+
+function utils.report(...)
+ print(...)
+end
+
+function utils.merger._self_load_(name)
+ local f, data = io.open(name), ""
+ if f then
+ data = f:read("*all")
+ f:close()
+ end
+ return data or ""
+end
+
+function utils.merger._self_save_(name, data)
+ if data ~= "" then
+ local f = io.open(name,'w')
+ if f then
+ f:write(data)
+ f:close()
+ end
+ end
+end
+
+function utils.merger._self_swap_(data,code)
+ if data ~= "" then
+ return (data:gsub(utils.merger.pattern, function(s)
+ return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
+ end, 1))
+ else
+ return ""
+ end
+end
+
+function utils.merger._self_libs_(libs,list)
+ local result, f = "", nil
+ if type(libs) == 'string' then libs = { libs } end
+ if type(list) == 'string' then list = { list } end
+ for _, lib in ipairs(libs) do
+ for _, pth in ipairs(list) do
+ local name = string.gsub(pth .. "/" .. lib,"\\","/")
+ f = io.open(name)
+ if f then
+ -- utils.report("merging library",name)
+ result = result .. "\n" .. f:read("*all") .. "\n"
+ f:close()
+ list = { pth } -- speed up the search
+ break
+ else
+ -- utils.report("no library",name)
+ end
+ end
+ end
+ return result or ""
+end
+
+function utils.merger.selfcreate(libs,list,target)
+ if target then
+ utils.merger._self_save_(
+ target,
+ utils.merger._self_swap_(
+ utils.merger._self_fake_(),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+ end
+end
+
+function utils.merger.selfmerge(name,libs,list,target)
+ utils.merger._self_save_(
+ target or name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+end
+
+function utils.merger.selfclean(name)
+ utils.merger._self_save_(
+ name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ ""
+ )
+ )
+end
+
+function utils.lua.compile(luafile, lucfile)
+ -- utils.report("compiling",luafile,"into",lucfile)
+ os.remove(lucfile)
+ return (os.execute("luac -s -o " .. string.quote(lucfile) .. " " .. string.quote(luafile)) == 0)
+end
+
+
+
+-- filename : luat-lib.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-lib'] = 1.001
+
+-- mostcode moved to the l-*.lua and other luat-*.lua files
+
+-- os / io
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+-- os.platform
+
+-- mswin|bccwin|mingw|cygwin windows
+-- darwin|rhapsody|nextstep macosx
+-- netbsd|unix unix
+-- linux linux
+
+if not io.fileseparator then
+ if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator, os.platform = "\\", ";", "windows"
+ else
+ io.fileseparator, io.pathseparator, os.platform = "/" , ":", "unix"
+ end
+end
+
+if not os.platform then
+ if io.pathseparator == ";" then
+ os.platform = "windows"
+ else
+ os.platform = "unix"
+ end
+end
+
+-- arg normalization
+--
+-- for k,v in pairs(arg) do print(k,v) end
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
+end
+
+-- environment
+
+if not environment then environment = { } end
+
+environment.arguments = { }
+environment.files = { }
+environment.sorted_argument_keys = nil
+
+environment.platform = os.platform
+
+function environment.initialize_arguments(arg)
+ environment.arguments = { }
+ environment.files = { }
+ environment.sorted_argument_keys = nil
+ for index, argument in pairs(arg) do
+ if index > 0 then
+ local flag, value = argument:match("^%-+(.+)=(.-)$")
+ if flag then
+ environment.arguments[flag] = string.unquote(value or "")
+ else
+ flag = argument:match("^%-+(.+)")
+ if flag then
+ environment.arguments[flag] = true
+ else
+ environment.files[#environment.files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.showarguments()
+ for k,v in pairs(environment.arguments) do
+ print(k .. " : " .. tostring(v))
+ end
+ if #environment.files > 0 then
+ print("files : " .. table.concat(environment.files, " "))
+ end
+end
+
+function environment.argument(name)
+ if environment.arguments[name] then
+ return environment.arguments[name]
+ else
+ if not environment.sorted_argument_keys then
+ environment.sorted_argument_keys = { }
+ for _,v in pairs(table.sortedkeys(environment.arguments)) do
+ table.insert(environment.sorted_argument_keys, "^" .. v)
+ end
+ end
+ for _,v in pairs(environment.sorted_argument_keys) do
+ if name:find(v) then
+ return environment.arguments[v:sub(2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+function environment.split_arguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ for _,v in ipairs(environment.original_arguments) do
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstruct_commandline(arg)
+ if not arg then arg = environment.original_arguments end
+ local result = { }
+ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+ local kk, vv = a:match("^(%-+.-)=(.+)$")
+ if kk and vv then
+ if vv:find(" ") then
+ result[#result+1] = kk .. "=" .. string.quote(vv)
+ else
+ result[#result+1] = a
+ end
+ elseif a:find(" ") then
+ result[#result+1] = string.quote(a)
+ else
+ result[#result+1] = a
+ end
+ end
+ return table.join(result," ")
+end
+
+if arg then
+ environment.initialize_arguments(arg)
+ environment.original_arguments = arg
+ arg = { } -- prevent duplicate handling
+end
+
+
+-- filename : luat-inp.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- This lib is multi-purpose and can be loaded again later on so that
+-- additional functionality becomes available. We will split this
+-- module in components when we're done with prototyping.
+
+-- This is the first code I wrote for LuaTeX, so it needs some cleanup.
+
+-- To be considered: hash key lowercase, first entry in table filename
+-- (any case), rest paths (so no need for optimization). Or maybe a
+-- separate table that matches lowercase names to mixed case when
+-- present. In that case the lower() cases can go away. I will do that
+-- only when we run into problems with names.
+
+if not versions then versions = { } end versions['luat-inp'] = 1.001
+if not environment then environment = { } end
+if not file then file = { } end
+
+if environment.aleph_mode == nil then environment.aleph_mode = true end -- temp hack
+
+if not input then input = { } end
+if not input.suffixes then input.suffixes = { } end
+if not input.formats then input.formats = { } end
+if not input.aux then input.aux = { } end
+
+if not input.suffixmap then input.suffixmap = { } end
+
+if not input.locators then input.locators = { } end -- locate databases
+if not input.hashers then input.hashers = { } end -- load databases
+if not input.generators then input.generators = { } end -- generate databases
+if not input.filters then input.filters = { } end -- conversion filters
+
+input.locators.notfound = { nil }
+input.hashers.notfound = { nil }
+input.generators.notfound = { nil }
+
+input.cacheversion = '1.0.1'
+input.banner = nil
+input.verbose = false
+input.debug = false
+input.cnfname = 'texmf.cnf'
+input.lsrname = 'ls-R'
+input.luasuffix = '.tma'
+input.lucsuffix = '.tmc'
+
+-- we use a cleaned up list / format=any is a wildcard, as is *name
+
+input.formats['afm'] = 'AFMFONTS' input.suffixes['afm'] = { 'afm' }
+input.formats['enc'] = 'ENCFONTS' input.suffixes['enc'] = { 'enc' }
+input.formats['fmt'] = 'TEXFORMATS' input.suffixes['fmt'] = { 'fmt' }
+input.formats['map'] = 'TEXFONTMAPS' input.suffixes['map'] = { 'map' }
+input.formats['mp'] = 'MPINPUTS' input.suffixes['mp'] = { 'mp' }
+input.formats['ocp'] = 'OCPINPUTS' input.suffixes['ocp'] = { 'ocp' }
+input.formats['ofm'] = 'OFMFONTS' input.suffixes['ofm'] = { 'ofm', 'tfm' }
+input.formats['otf'] = 'OPENTYPEFONTS' input.suffixes['otf'] = { 'otf' } -- 'ttf'
+input.formats['opl'] = 'OPLFONTS' input.suffixes['opl'] = { 'opl' }
+input.formats['otp'] = 'OTPINPUTS' input.suffixes['otp'] = { 'otp' }
+input.formats['ovf'] = 'OVFFONTS' input.suffixes['ovf'] = { 'ovf', 'vf' }
+input.formats['ovp'] = 'OVPFONTS' input.suffixes['ovp'] = { 'ovp' }
+input.formats['tex'] = 'TEXINPUTS' input.suffixes['tex'] = { 'tex' }
+input.formats['tfm'] = 'TFMFONTS' input.suffixes['tfm'] = { 'tfm' }
+input.formats['ttf'] = 'TTFONTS' input.suffixes['ttf'] = { 'ttf', 'ttc' }
+input.formats['pfb'] = 'T1FONTS' input.suffixes['pfb'] = { 'pfb', 'pfa' }
+input.formats['vf'] = 'VFFONTS' input.suffixes['vf'] = { 'vf' }
+
+input.formats['fea'] = 'FONTFEATURES' input.suffixes['fea'] = { 'fea' }
+
+input.formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
+input.suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
+
+input.formats ['lua'] = 'LUAINPUTS' -- new
+input.suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
+
+-- here we catch a few new thingies
+
+function input.checkconfigdata(instance)
+ if input.env(instance,"LUAINPUTS") == "" then
+ instance.environment["LUAINPUTS"] = ".;$TEXINPUTS;$TEXMFSCRIPTS"
+ end
+ if input.env(instance,"FONTFEATURES") == "" then
+ instance.environment["FONTFEATURES"] = ".;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS"
+ end
+end
+
+-- backward compatible ones
+
+input.alternatives = { }
+
+input.alternatives['map files'] = 'map'
+input.alternatives['enc files'] = 'enc'
+input.alternatives['opentype fonts'] = 'otf'
+input.alternatives['truetype fonts'] = 'ttf'
+input.alternatives['truetype collections'] = 'ttc'
+input.alternatives['type1 fonts'] = 'pfb'
+
+-- obscure ones
+
+input.formats ['misc fonts'] = ''
+input.suffixes['misc fonts'] = { }
+
+input.formats ['sfd'] = 'SFDFONTS'
+input.suffixes ['sfd'] = { 'sfd' }
+input.alternatives['subfont definition files'] = 'sfd'
+
+function input.reset()
+
+ local instance = { }
+
+ instance.rootpath = ''
+ instance.treepath = ''
+ instance.progname = environment.progname or 'context'
+ instance.engine = environment.engine or 'luatex'
+ instance.format = ''
+ instance.environment = { }
+ instance.variables = { }
+ instance.expansions = { }
+ instance.files = { }
+ instance.configuration = { }
+ instance.found = { }
+ instance.foundintrees = { }
+ instance.kpsevars = { }
+ instance.hashes = { }
+ instance.cnffiles = { }
+ instance.lists = { }
+ instance.remember = true
+ instance.diskcache = true
+ instance.renewcache = false
+ instance.scandisk = true
+ instance.cachepath = nil
+ instance.loaderror = false
+ instance.smallcache = false
+ instance.savelists = true
+ instance.cleanuppaths = true
+ instance.allresults = false
+ instance.pattern = nil -- lists
+ instance.kpseonly = false -- lists
+ instance.cachefile = 'tmftools'
+ instance.loadtime = 0
+ instance.starttime = 0
+ instance.stoptime = 0
+ instance.validfile = function(path,name) return true end
+ instance.data = { } -- only for loading
+ instance.sortdata = false
+ instance.force_suffixes = true
+ instance.dummy_path_expr = "^!*unset/*$"
+ instance.fakepaths = { }
+ instance.lsrmode = false
+
+ if os.env then
+ -- store once, freeze and faster
+ for k,v in pairs(os.env) do
+ instance.environment[k] = input.bare_variable(v)
+ end
+ else
+ -- we will access os.env frequently
+ for k,v in pairs({'HOME','TEXMF','TEXMFCNF','SELFAUTOPARENT'}) do
+ local e = os.getenv(v)
+ if e then
+ -- input.report("setting",v,"to",input.bare_variable(e))
+ instance.environment[v] = input.bare_variable(e)
+ end
+ end
+ end
+
+ -- cross referencing
+
+ for k, v in pairs(input.suffixes) do
+ for _, vv in pairs(v) do
+ if vv then
+ input.suffixmap[vv] = k
+ end
+ end
+ end
+
+ return instance
+
+end
+
+function input.bare_variable(str)
+ -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1")
+ return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2")
+end
+
+if texio then
+ input.log = texio.write_nl
+else
+ input.log = print
+end
+
+function input.simple_logger(kind, name)
+ if name and name ~= "" then
+ if input.banner then
+ input.log(input.banner..kind..": "..name)
+ else
+ input.log("<<"..kind..": "..name..">>")
+ end
+ else
+ if input.banner then
+ input.log(input.banner..kind..": no name")
+ else
+ input.log("<<"..kind..": no name>>")
+ end
+ end
+end
+
+function input.dummy_logger()
+end
+
+function input.settrace(n)
+ input.trace = tonumber(n or 0)
+ if input.trace > 0 then
+ input.logger = input.simple_logger
+ input.verbose = true
+ else
+ input.logger = function() end
+ end
+end
+
+function input.report(...) -- inefficient
+ if input.verbose then
+ if input.banner then
+ input.log(input.banner .. table.concat({...},' '))
+ elseif input.logmode() == 'xml' then
+ input.log("<t>"..table.concat({...},' ').."</t>")
+ else
+ input.log("<<"..table.concat({...},' ')..">>")
+ end
+ end
+end
+
+function input.reportlines(str)
+ if type(str) == "string" then
+ str = str:split("\n")
+ end
+ for _,v in pairs(str) do input.report(v) end
+end
+
+input.settrace(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRACE") or input.trace or 0)
+
+-- These functions can be used to test the performance, especially
+-- loading the database files.
+
+function input.start_timing(instance)
+ if instance then
+ instance.starttime = os.clock()
+ if not instance.loadtime then
+ instance.loadtime = 0
+ end
+ end
+end
+
+function input.stop_timing(instance, report)
+ if instance and instance.starttime then
+ instance.stoptime = os.clock()
+ local loadtime = instance.stoptime - instance.starttime
+ instance.loadtime = instance.loadtime + loadtime
+ if report then
+ input.report('load time', string.format("%0.3f",loadtime))
+ end
+ return loadtime
+ else
+ return 0
+ end
+end
+
+input.stoptiming = input.stop_timing
+input.starttiming = input.start_timing
+
+function input.elapsedtime(instance)
+ return string.format("%0.3f",instance.loadtime or 0)
+end
+
+function input.report_loadtime(instance)
+ if instance then
+ input.report('total load time', input.elapsedtime(instance))
+ end
+end
+
+function input.loadtime(instance)
+ tex.print(input.elapsedtime(instance))
+end
+
+function input.env(instance,key)
+ return instance.environment[key] or input.osenv(instance,key)
+end
+
+function input.osenv(instance,key)
+ if instance.environment[key] == nil then
+ local e = os.getenv(key)
+ if e == nil then
+ instance.environment[key] = "" -- false
+ else
+ instance.environment[key] = input.bare_variable(e)
+ end
+ end
+ return instance.environment[key] or ""
+end
+
+-- we follow a rather traditional approach:
+--
+-- (1) texmf.cnf given in TEXMFCNF
+-- (2) texmf.cnf searched in TEXMF/web2c
+--
+-- for the moment we don't expect a configuration file in a zip
+
+function input.identify_cnf(instance)
+ if #instance.cnffiles == 0 then
+ if instance.treepath ~= "" then
+ if instance.rootpath ~= "" then
+ local t = instance.treepath:splitchr(',')
+ for k,v in ipairs(t) do
+ t[k] = file.join(instance.rootpath,v)
+ end
+ instance.treepath = table.concat(t,',')
+ end
+ local t = instance.treepath:splitchr(',')
+ instance.environment['TEXMF'] = input.bare_variable(instance.treepath)
+ instance.environment['TEXMFCNF'] = file.join(t[1] or '.','texmf/web2c')
+ end
+ if instance.rootpath ~= "" then
+ instance.environment['TEXMFCNF'] = file.join(instance.rootpath,'texmf/web2c')
+ instance.environment['SELFAUTOPARENT'] = instance.rootpath
+ end
+ if input.env(instance,'TEXMFCNF') ~= "" then
+ local t = input.split_path(input.env(instance,'TEXMFCNF'))
+ t = input.aux.expanded_path(instance,t)
+ input.aux.expand_vars(instance,t)
+ for _,v in ipairs(t) do
+ table.insert(instance.cnffiles,file.join(v,input.cnfname))
+ end
+ elseif input.env(instance,'SELFAUTOPARENT') == '.' then
+ table.insert(instance.cnffiles,file.join('.',input.cnfname))
+ else
+ for _,v in ipairs({'texmf-local','texmf'}) do
+ table.insert(instance.cnffiles,file.join(input.env(instance,'SELFAUTOPARENT'),v,'web2c',input.cnfname))
+ end
+ end
+ end
+end
+
+function input.load_cnf(instance)
+ -- instance.cnffiles contain complete names now !
+ if #instance.cnffiles == 0 then
+ input.report("no cnf files found (TEXMFCNF may not be set/known)")
+ else
+ instance.rootpath = instance.cnffiles[1]
+ for k,fname in ipairs(instance.cnffiles) do
+ instance.cnffiles[k] = fname:gsub("\\",'/')
+ end
+ for i = 1, 3 do
+ instance.rootpath = file.dirname(instance.rootpath)
+ end
+ if instance.lsrmode then
+ input.loadconfigdata(instance,instance.cnffiles)
+ elseif instance.diskcache and not instance.renewcache then
+ input.loadconfig(instance,instance.cnffiles)
+ if instance.loaderror then
+ input.loadconfigdata(instance,instance.cnffiles)
+ input.saveconfig(instance)
+ end
+ else
+ input.loadconfigdata(instance,instance.cnffiles)
+ if instance.renewcache then
+ input.saveconfig(instance)
+ end
+ end
+ input.aux.collapse_cnf_data(instance)
+ end
+ input.checkconfigdata(instance)
+end
+
+function input.loadconfigdata(instance)
+ for _, fname in pairs(instance.cnffiles) do
+ input.aux.load_cnf(instance,fname)
+ end
+end
+
+if os.env then
+ function input.aux.collapse_cnf_data(instance)
+ for _,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if not instance.variables[k] then
+ if instance.environment[k] then
+ instance.variables[k] = instance.environment[k]
+ else
+ instance.kpsevars[k] = true
+ instance.variables[k] = input.bare_variable(v)
+ end
+ end
+ end
+ end
+ end
+else
+ function input.aux.collapse_cnf_data(instance)
+ for _,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if not instance.variables[k] then
+ local e = os.getenv(k)
+ if e then
+ instance.environment[k] = input.bare_variable(e)
+ instance.variables[k] = instance.environment[k]
+ else
+ instance.variables[k] = input.bare_variable(v)
+ instance.kpsevars[k] = true
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.aux.load_cnf(instance,fname)
+ fname = input.clean_path(fname)
+ local lname = fname:gsub("%.%a+$",input.luasuffix)
+ local f = io.open(lname)
+ if f then
+ f:close()
+ input.aux.load_data(instance,file.dirname(lname),'configuration',file.basename(lname))
+ else
+ f = io.open(fname)
+ if f then
+ input.report("loading", fname)
+ local line, data, n, k, v
+ local dname = file.dirname(fname)
+ if not instance.configuration[dname] then
+ instance.configuration[dname] = { }
+ end
+ local data = instance.configuration[dname]
+ while true do
+ line = f:read()
+ if line then
+ while true do -- join lines
+ line, n = line:gsub("\\%s*$", "")
+ if n > 0 then
+ line = line .. f:read()
+ else
+ break
+ end
+ end
+ if not line:find("^[%%#]") then
+ k, v = (line:gsub("%s*%%.*$","")):match("%s*(.-)%s*=%s*(.-)%s*$")
+ if k and v and not data[k] then
+ data[k] = (v:gsub("[%%#].*",'')):gsub("~", "$HOME")
+ instance.kpsevars[k] = true
+ end
+ end
+ else
+ break
+ end
+ end
+ f:close()
+ else
+ input.report("skipping", fname)
+ end
+ end
+end
+
+-- database loading
+
+function input.load_hash(instance)
+ input.locatelists(instance)
+ if instance.lsrmode then
+ input.loadlists(instance)
+ elseif instance.diskcache and not instance.renewcache then
+ input.loadfiles(instance)
+ if instance.loaderror then
+ input.loadlists(instance)
+ input.savefiles(instance)
+ end
+ else
+ input.loadlists(instance)
+ if instance.renewcache then
+ input.savefiles(instance)
+ end
+ end
+end
+
+function input.aux.append_hash(instance,type,tag,name)
+ input.logger("= hash append",tag)
+ table.insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function input.aux.prepend_hash(instance,type,tag,name)
+ input.logger("= hash prepend",tag)
+ table.insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function input.aux.extend_texmf_var(instance,specification) -- crap
+ if instance.environment['TEXMF'] then
+ input.report("extending environment variable TEXMF with", specification)
+ instance.environment['TEXMF'] = instance.environment['TEXMF']:gsub("^%{", function()
+ return "{" .. specification .. ","
+ end)
+ elseif instance.variables['TEXMF'] then
+ input.report("extending configuration variable TEXMF with", specification)
+ instance.variables['TEXMF'] = instance.variables['TEXMF']:gsub("^%{", function()
+ return "{" .. specification .. ","
+ end)
+ else
+ input.report("setting configuration variable TEXMF to", specification)
+ instance.variables['TEXMF'] = "{" .. specification .. "}"
+ end
+ if instance.variables['TEXMF']:find("%,") and not instance.variables['TEXMF']:find("^%{") then
+ input.report("adding {} to complex TEXMF variable, best do that yourself")
+ instance.variables['TEXMF'] = "{" .. instance.variables['TEXMF'] .. "}"
+ end
+ input.expand_variables(instance)
+end
+
+-- locators
+
+function input.locatelists(instance)
+ for _, path in pairs(input.simplified_list(input.expansion(instance,'TEXMF'))) do
+ input.report("locating list of",path)
+ input.locatedatabase(instance,input.normalize_name(path))
+ end
+end
+
+function input.locatedatabase(instance,specification)
+ return input.methodhandler('locators', instance, specification)
+end
+
+function input.locators.tex(instance,specification)
+ if specification and specification ~= '' then
+ local files = {
+ file.join(specification,'files'..input.lucsuffix),
+ file.join(specification,'files'..input.luasuffix),
+ file.join(specification,input.lsrname)
+ }
+ for _, filename in pairs(files) do
+ local f = io.open(filename)
+ if f then
+ input.logger('! tex locator', specification..' found')
+ input.aux.append_hash(instance,'file',specification,filename)
+ f:close()
+ return
+ end
+ end
+ input.logger('? tex locator', specification..' not found')
+ end
+end
+
+-- hashers
+
+function input.hashdatabase(instance,tag,name)
+ return input.methodhandler('hashers',instance,tag,name)
+end
+
+function input.loadfiles(instance)
+ instance.loaderror = false
+ instance.files = { }
+ if not instance.renewcache then
+ for _, hash in ipairs(instance.hashes) do
+ input.hashdatabase(instance,hash.tag,hash.name)
+ if instance.loaderror then break end
+ end
+ end
+end
+
+function input.hashers.tex(instance,tag,name)
+ input.aux.load_data(instance,tag,'files')
+end
+
+-- generators:
+
+function input.loadlists(instance)
+ for _, hash in ipairs(instance.hashes) do
+ input.generatedatabase(instance,hash.tag)
+ end
+end
+
+function input.generatedatabase(instance,specification)
+ return input.methodhandler('generators', instance, specification)
+end
+
+function input.generators.tex(instance,specification)
+ local tag = specification
+ if not instance.lsrmode and lfs and lfs.dir then
+ input.report("scanning path",specification)
+ instance.files[tag] = { }
+ local files = instance.files[tag]
+ local n, m = 0, 0
+ local spec = specification .. '/'
+ local attributes = lfs.attributes
+ local directory = lfs.dir
+ local small = instance.smallcache
+ local function action(path)
+ local mode, full
+ if path then
+ full = spec .. path .. '/'
+ else
+ full = spec
+ end
+ for name in directory(full) do
+ if name == '.' or name == ".." then
+ -- skip
+ else
+ mode = attributes(full..name,'mode')
+ if mode == "directory" then
+ m = m + 1
+ if path then
+ action(path..'/'..name)
+ else
+ action(name)
+ end
+ elseif path and mode == 'file' then
+ n = n + 1
+ local f = files[name]
+ if f then
+ if not small then
+ if type(f) == 'string' then
+ files[name] = { f, path }
+ else
+ f[#f+1] = path
+ end
+ end
+ else
+ files[name] = path
+ end
+ end
+ end
+ end
+ end
+ action()
+ input.report(n,"files found on",m,"directories")
+ else
+ local fullname = file.join(specification,input.lsrname)
+ local path = '.'
+ local f = io.open(fullname)
+ if f then
+ instance.files[tag] = { }
+ local files = instance.files[tag]
+ local small = instance.smallcache
+ input.report("loading lsr file",fullname)
+ -- for line in f:lines() do -- much slower then the next one
+ for line in (f:read("*a")):gmatch("(.-)\n") do
+ if line:find("^[%a%d]") then
+ local fl = files[line]
+ if fl then
+ if not small then
+ if type(fl) == 'string' then
+ files[line] = { fl, path } -- table
+ else
+ fl[#fl+1] = path
+ end
+ end
+ else
+ files[line] = path -- string
+ end
+ else
+ path = line:match("%.%/(.-)%:$") or path -- match could be nil due to empty line
+ end
+ end
+ f:close()
+ end
+ end
+end
+
+-- savers, todo
+
+function input.savefiles(instance)
+ input.aux.save_data(instance, 'files', function(k,v)
+ return instance.validfile(k,v) -- path, name
+ end)
+end
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+function input.splitconfig(instance)
+ for i,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if type(v) == 'string' then
+ local t = file.split_path(v)
+ if #t > 1 then
+ c[k] = t
+ end
+ end
+ end
+ end
+end
+function input.joinconfig(instance)
+ for i,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if type(v) == 'table' then
+ c[k] = file.join_path(v)
+ end
+ end
+ end
+end
+function input.split_path(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return file.split_path(str)
+ end
+end
+function input.join_path(str)
+ if type(str) == 'table' then
+ return file.join_path(str)
+ else
+ return str
+ end
+end
+function input.splitexpansions(instance)
+ for k,v in pairs(instance.expansions) do
+ local t = file.split_path(v)
+ if #t > 1 then
+ instance.expansions[k] = t
+ end
+ end
+end
+function input.splitexpansions(instance)
+ for k,v in pairs(instance.expansions) do
+ local t, h = { }, { }
+ for _,vv in pairs(file.split_path(v)) do
+ if vv ~= "" and not h[vv] then
+ t[#t+1] = vv
+ h[vv] = true
+ end
+ end
+ if #t > 1 then
+ instance.expansions[k] = t
+ else
+ instance.expansions[k] = t[1]
+ end
+ end
+end
+
+-- end of split/join code
+
+function input.saveconfig(instance)
+ input.splitconfig(instance)
+ input.aux.save_data(instance, 'configuration', nil)
+ input.joinconfig(instance)
+end
+
+input.configbanner = [[
+-- This is a Luatex configuration file created by 'luatools.lua' or
+-- 'luatex.exe' directly. For comment, suggestions and questions you can
+-- contact the ConTeXt Development Team. This configuration file is
+-- not copyrighted. [HH & TH]
+]]
+
+function input.aux.save_data(instance, dataname, check)
+ for cachename, files in pairs(instance[dataname]) do
+ local name = file.join(cachename,dataname)
+ local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix
+ local f = io.open(luaname,'w')
+ if f then
+ input.report("saving " .. dataname .. " in", luaname)
+ f:write(input.configbanner)
+ f:write("\n")
+ f:write("if not texmf then texmf = { } end\n")
+ f:write("if not texmf.data then texmf.data = { } end\n")
+ f:write("\n")
+ f:write("texmf.data.type = '" .. dataname .. "'\n")
+ f:write("texmf.data.version = '" .. input.cacheversion .. "'\n")
+ f:write("texmf.data.date = '" .. os.date("%Y-%m-%d") .. "'\n")
+ f:write("texmf.data.time = '" .. os.date("%H:%M:%S") .. "'\n")
+ f:write('texmf.data.content = {\n')
+ local function dump(k,v)
+ if not check or check(v,k) then -- path, name
+ if type(v) == 'string' then
+ f:write("\t['" .. k .. "'] = '" .. v .. "',\n")
+ elseif #v == 1 then
+ f:write("\t['" .. k .. "'] = '" .. v[1] .. "',\n")
+ else
+ f:write("\t['" .. k .. "'] = {'" .. table.concat(v,"','").. "'},\n")
+ end
+ end
+ end
+ if instance.sortdata then
+ for _, k in pairs(table.sortedkeys(files)) do
+ dump(k,files[k])
+ end
+ else
+ for k, v in pairs(files) do
+ dump(k,v)
+ end
+ end
+ f:write('}\n')
+ f:close()
+ input.report("compiling " .. dataname .. " to", lucname)
+ if not utils.lua.compile(luaname,lucname) then
+ input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname)
+ os.remove(lucname)
+ end
+ else
+ input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix)
+ end
+ end
+end
+
+function input.loadconfig(instance)
+ instance.configuration, instance.loaderror = { }, false
+ if not instance.renewcache then
+ for _, cnf in pairs(instance.cnffiles) do
+ input.aux.load_data(instance,file.dirname(cnf),'configuration')
+ if instance.loaderror then break end
+ end
+ end
+ input.joinconfig(instance)
+end
+
+if not texmf then texmf = {} end
+if not texmf.data then texmf.data = {} end
+
+function input.aux.load_data(instance,pathname,dataname,filename)
+ if not filename or (filename == "") then
+ filename = dataname .. input.lucsuffix
+ end
+ local blob = loadfile(file.join(pathname,filename))
+ if not blob then
+ filename = dataname .. input.luasuffix
+ blob = loadfile(file.join(pathname,filename))
+ end
+ if blob then
+ blob()
+ if (texmf.data.type == dataname) and (texmf.data.version == input.cacheversion) and texmf.data.content then
+ input.report("loading",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = texmf.data.content
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = { }
+ instance.loaderror = true
+ end
+ end
+ texmf.data.content = { }
+end
+
+function input.expand_variables(instance)
+ instance.expansions = { }
+ if instance.engine ~= "" then instance.environment['engine'] = instance.engine end
+ if instance.progname ~= "" then instance.environment['progname'] = instance.engine end
+ for k,v in pairs(instance.environment) do
+ local a, b = k:match("^(%a+)%_(.*)%s*$")
+ if a and b then
+ instance.expansions[a..'.'..b] = v
+ else
+ instance.expansions[k] = v
+ end
+ end
+ for k,v in pairs(instance.environment) do -- move environment to expansions
+ if not instance.expansions[k] then instance.expansions[k] = v end
+ end
+ for k,v in pairs(instance.variables) do -- move variables to expansions
+ if not instance.expansions[k] then instance.expansions[k] = v end
+ end
+ while true do
+ local busy = false
+ for k,v in pairs(instance.expansions) do
+ local s, n = v:gsub("%$([%a%d%_%-]+)", function(a)
+ busy = true
+ return instance.expansions[a] or input.env(instance,a)
+ end)
+ local s, m = s:gsub("%$%{([%a%d%_%-]+)%}", function(a)
+ busy = true
+ return instance.expansions[a] or input.env(instance,a)
+ end)
+ if n > 0 or m > 0 then
+ instance.expansions[k]= s
+ end
+ end
+ if not busy then break end
+ end
+ for k,v in pairs(instance.expansions) do
+ instance.expansions[k] = v:gsub("\\", '/')
+ end
+ input.splitexpansions(instance)
+end
+
+function input.aux.expand_vars(instance,lst) -- simple vars
+ for k,v in pairs(lst) do
+ lst[k] = v:gsub("%$([%a%d%_%-]+)", function(a)
+ return instance.variables[a] or input.env(instance,a)
+ end)
+ end
+end
+
+function input.aux.expanded_var(instance,var) -- simple vars
+ return var:gsub("%$([%a%d%_%-]+)", function(a)
+ return instance.variables[a] or input.env(instance,a)
+ end)
+end
+
+function input.aux.entry(instance,entries,name)
+ if name and (name ~= "") then
+ name = name:gsub('%$','')
+ local result = entries[name..'.'..instance.progname] or entries[name]
+ if result then
+ return result
+ else
+ result = input.env(instance,name)
+ if result then
+ instance.variables[name] = result
+ input.expand_variables(instance)
+ return instance.expansions[name] or ""
+ end
+ end
+ end
+ return ""
+end
+function input.variable(instance,name)
+ return input.aux.entry(instance,instance.variables,name)
+end
+function input.expansion(instance,name)
+ return input.aux.entry(instance,instance.expansions,name)
+end
+
+function input.aux.is_entry(instance,entries,name)
+ if name and name ~= "" then
+ name = name:gsub('%$','')
+ return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
+ else
+ return false
+ end
+end
+
+function input.is_variable(instance,name)
+ return input.aux.is_entry(instance,instance.variables,name)
+end
+function input.is_expansion(instance,name)
+ return input.aux.is_entry(instance,instance.expansions,name)
+end
+
+function input.aux.list(instance,list)
+ local pat = string.upper(instance.pattern or "","")
+ for _,key in pairs(table.sortedkeys(list)) do
+ if (instance.pattern=="") or string.find(key:upper(),pat) then
+ if instance.kpseonly then
+ if instance.kpsevars[key] then
+ print(key .. "=" .. input.aux.tabstr(list[key]))
+ end
+ elseif instance.kpsevars[key] then
+ print('K ' .. key .. "=" .. input.aux.tabstr(list[key]))
+ else
+ print('E ' .. key .. "=" .. input.aux.tabstr(list[key]))
+ end
+ end
+ end
+end
+
+function input.list_variables(instance)
+ input.aux.list(instance,instance.variables)
+end
+function input.list_expansions(instance)
+ input.aux.list(instance,instance.expansions)
+end
+
+function input.list_configurations(instance)
+ for _,key in pairs(table.sortedkeys(instance.kpsevars)) do
+ if not instance.pattern or (instance.pattern=="") or key:find(instance.pattern) then
+ print(key.."\n")
+ for i,c in pairs(instance.configuration) do
+ local str = c[key]
+ if str then
+ print("\t" .. i .. "\t\t" .. input.aux.tabstr(str))
+ end
+ end
+ print()
+ end
+ end
+end
+
+function input.aux.tabstr(str)
+ if type(str) == 'table' then
+ return table.concat(str," | ")
+ else
+ return str
+ end
+end
+
+function input.simplified_list(str)
+ if type(str) == 'table' then
+ return str -- troubles ; ipv , in texmf
+ elseif str == '' then
+ return { }
+ else
+ local t = { }
+ for _,v in ipairs(string.splitchr(str:gsub("^\{(.+)\}$","%1"),",")) do
+ t[#t+1] = (v:gsub("^[%!]*(.+)[%/\\]*$","%1"))
+ end
+ return t
+ end
+end
+
+function input.unexpanded_path_list(instance,str)
+ local pth = input.variable(instance,str)
+ local lst = input.split_path(pth)
+ return input.aux.expanded_path(instance,lst)
+end
+function input.unexpanded_path(instance,str)
+ return file.join_path(input.unexpanded_path_list(instance,str))
+end
+
+function input.expanded_path_list(instance,str)
+ if not str then
+ return { }
+ elseif instance.savelists then
+ -- engine+progname hash
+ str = str:gsub("%$","")
+ if not instance.lists[str] then -- cached
+ local lst = input.split_path(input.expansion(instance,str))
+ instance.lists[str] = input.aux.expanded_path(instance,lst)
+ end
+ return instance.lists[str]
+ else
+ local lst = input.split_path(input.expansion(instance,str))
+ return input.aux.expanded_path(instance,lst)
+ end
+end
+function input.expand_path(instance,str)
+ return file.join_path(input.expanded_path_list(instance,str))
+end
+
+--~ function input.first_writable_path(instance,name)
+--~ for _,v in pairs(input.expanded_path_list(instance,name)) do
+--~ if file.is_writable(file.join(v,'luatex-cache.tmp')) then
+--~ return v
+--~ end
+--~ end
+--~ return "."
+--~ end
+
+function input.expanded_path_list_from_var(instance,str) -- brrr
+ local tmp = input.var_of_format_or_suffix(str:gsub("%$",""))
+ if tmp ~= "" then
+ return input.expanded_path_list(instance,str)
+ else
+ return input.expanded_path_list(instance,tmp)
+ end
+end
+function input.expand_path_from_var(instance,str)
+ return file.join_path(input.expanded_path_list_from_var(instance,str))
+end
+
+function input.format_of_var(str)
+ return input.formats[str] or input.formats[input.alternatives[str]] or ''
+end
+function input.format_of_suffix(str)
+ return input.suffixmap[file.extname(str)] or 'tex'
+end
+
+function input.variable_of_format(str)
+ return input.formats[str] or input.formats[input.alternatives[str]] or ''
+end
+
+function input.var_of_format_or_suffix(str)
+ local v = input.formats[str]
+ if v then
+ return v
+ end
+ v = input.formats[input.alternatives[str]]
+ if v then
+ return v
+ end
+ v = input.suffixmap[file.extname(str)]
+ if v then
+ return input.formats[isf]
+ end
+ return ''
+end
+
+function input.expand_braces(instance,str) -- output variable and brace expansion of STRING
+ local ori = input.variable(instance,str)
+ local pth = input.aux.expanded_path(instance,input.split_path(ori))
+ return file.join_path(pth)
+end
+
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+
+function input.aux.expanded_path(instance,pathlist)
+ -- a previous version fed back into pathlist
+ local i, n, oldlist, newlist, ok = 0, 0, { }, { }, false
+ for _,v in ipairs(pathlist) do
+ if v:find("[{}]") then
+ ok = true
+ break
+ end
+ end
+ if ok then
+ for _,v in ipairs(pathlist) do
+ oldlist[#oldlist+1] = (v:gsub("([\{\}])", function(p)
+ if p == "{" then
+ i = i + 1
+ if i > n then n = i end
+ return "<" .. (i-1) .. ">"
+ else
+ i = i - 1
+ return "</" .. i .. ">"
+ end
+ end))
+ end
+ for i=1,n do
+ while true do
+ local more = false
+ local pattern = "^(.-)<"..(n-i)..">(.-)</"..(n-i)..">(.-)$"
+ local t = { }
+ for _,v in ipairs(oldlist) do
+ local pre, mid, post = v:match(pattern)
+ if pre and mid and post then
+ more = true
+ -- for _,vv in ipairs(mid:splitchr(',')) do
+ for vv in string.gmatch(mid..',',"(.-),") do
+ if vv == '.' then
+ t[#t+1] = pre..post
+ else
+ t[#t+1] = pre..vv..post
+ end
+ end
+ else
+ t[#t+1] = v
+ end
+ end
+ oldlist = t
+ if not more then break end
+ end
+ end
+ for _,v in pairs(oldlist) do
+ v = file.collapse_path(v)
+ if v ~= "" and not v:find(instance.dummy_path_expr) then newlist[#newlist+1] = v end
+ end
+ else
+ for _,v in pairs(pathlist) do
+ -- for _,vv in pairs(v:split(",")) do
+ for vv in string.gmatch(v..',',"(.-),") do
+ vv = file.collapse_path(v)
+ if vv ~= "" then newlist[#newlist+1] = vv end
+ end
+ end
+ end
+ return newlist
+end
+
+--~ function input.is_readable(name) -- brrr, get rid of this
+--~ return name:find("^zip##") or file.is_readable(name)
+--~ end
+
+input.is_readable = { }
+
+function input.aux.is_readable(readable, name)
+ if input.trace > 2 then
+ if readable then
+ input.logger("+ readable", name)
+ else
+ input.logger("- readable", name)
+ end
+ end
+ return readable
+end
+
+function input.is_readable.file(name)
+ -- return input.aux.is_readable(file.is_readable(name), name)
+ return input.aux.is_readable(input.aux.is_file(name), name)
+end
+
+input.is_readable.tex = input.is_readable.file
+
+-- name
+-- name/name
+
+function input.aux.collect_files(instance,names)
+ local filelist = nil
+ for _, fname in pairs(names) do
+ if fname then
+ if input.trace > 2 then
+ input.logger("? blobpath asked",fname)
+ end
+ local bname = file.basename(fname)
+ local dname = file.dirname(fname)
+ if dname == "" or dname:find("^%.") then
+ dname = false
+ else
+ dname = "/" .. dname .. "$"
+ end
+ for _, hash in pairs(instance.hashes) do
+ local blobpath = hash.tag
+ if blobpath and instance.files[blobpath] then
+ if input.trace > 2 then
+ input.logger('? blobpath do',blobpath .. " (" .. bname ..")")
+ end
+ local blobfile = instance.files[blobpath][bname]
+ if blobfile then
+ if type(blobfile) == 'string' then
+ if not dname or blobfile:find(dname) then
+ if not filelist then filelist = { } end
+ -- input.logger('= collected', blobpath.." | "..blobfile.." | "..bname)
+ filelist[#filelist+1] = file.join(blobpath,blobfile,bname)
+ end
+ else
+ for _, vv in pairs(blobfile) do
+ if not dname or vv:find(dname) then
+ if not filelist then filelist = { } end
+ filelist[#filelist+1] = file.join(blobpath,vv,bname)
+ end
+ end
+ end
+ end
+ elseif input.trace > 1 then
+ input.logger('! blobpath no',blobpath .. " (" .. bname ..")" )
+ end
+ end
+ end
+ end
+ return filelist
+end
+
+function input.suffix_of_format(str)
+ if input.suffixes[str] then
+ return input.suffixes[str][1]
+ else
+ return ""
+ end
+end
+
+function input.suffixes_of_format(str)
+ if input.suffixes[str] then
+ return input.suffixes[str]
+ else
+ return {}
+ end
+end
+
+function input.aux.qualified_path(filename) -- make platform dependent / not good yet
+ return
+ filename:find("^%.+/") or
+ filename:find("^/") or
+ filename:find("^%a+%:") or
+ filename:find("^%a+##")
+end
+
+function input.normalize_name(original)
+ -- internally we use type##spec##subspec ; this hackery slightly slows down searching
+ local str = original or ""
+ str = str:gsub("::", "##") -- :: -> ##
+ str = str:gsub("^(%a+)://" ,"%1##") -- zip:// -> zip##
+ str = str:gsub("(.+)##(.+)##/(.+)","%1##%2##%3") -- ##/spec -> ##spec
+ if (input.trace>1) and (original ~= str) then
+ input.logger('= normalizer',original.." -> "..str)
+ end
+ return str
+end
+
+-- split the next one up, better for jit
+
+function input.aux.register_in_trees(instance,name)
+ if not name:find("^%.") then
+ instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
+ end
+end
+
+function input.aux.find_file(instance,filename) -- todo : plugin (scanners, checkers etc)
+ local result = { }
+ local stamp = nil
+ filename = input.normalize_name(filename)
+ filename = file.collapse_path(filename:gsub("\\","/"))
+ -- speed up / beware: format problem
+ if instance.remember then
+ stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.found[stamp] then
+ input.logger('! remembered', filename)
+ return instance.found[stamp]
+ end
+ end
+ if filename:find('%*') then
+ input.logger('! wildcard', filename)
+ result = input.find_wildcard_files(instance,filename)
+ elseif input.aux.qualified_path(filename) then
+ if input.is_readable.file(filename) then
+ input.logger('! qualified', filename)
+ result = { filename }
+ else
+ local forcedname, ok = "", false
+ if file.extname(filename) == "" then
+ if instance.format == "" then
+ forcedname = filename .. ".tex"
+ if input.is_readable.file(forcedname) then
+ input.logger('! no suffix, forcing standard filetype tex')
+ result, ok = { forcedname }, true
+ end
+ else
+ for _, s in pairs(input.suffixes_of_format(instance.format)) do
+ forcedname = filename .. "." .. s
+ if input.is_readable.file(forcedname) then
+ input.logger('! no suffix, forcing format filetype', s)
+ result, ok = { forcedname }, true
+ break
+ end
+ end
+ end
+ end
+ if not ok then
+ input.logger('? qualified', filename)
+ end
+ end
+ else
+ -- search spec
+ local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
+ if ext == "" then
+ if not instance.force_suffixes then
+ table.insert(wantedfiles, filename)
+ end
+ else
+ table.insert(wantedfiles, filename)
+ end
+ if instance.format == "" then
+ if ext == "" then
+ local forcedname = filename .. '.tex'
+ table.insert(wantedfiles, forcedname)
+ filetype = input.format_of_suffix(forcedname)
+ input.logger('! forcing filetype',filetype)
+ else
+ filetype = input.format_of_suffix(filename)
+ input.logger('! using suffix based filetype',filetype)
+ end
+ else
+ if ext == "" then
+ for _, s in pairs(input.suffixes_of_format(instance.format)) do
+ table.insert(wantedfiles, filename .. "." .. s)
+ end
+ end
+ filetype = instance.format
+ input.logger('! using given filetype',filetype)
+ end
+ local typespec = input.variable_of_format(filetype)
+ local pathlist = input.expanded_path_list(instance,typespec)
+ if not pathlist or #pathlist == 0 then
+ -- no pathlist, access check only
+ if input.trace > 2 then
+ input.logger('? filename',filename)
+ input.logger('? filetype',filetype or '?')
+ input.logger('? wanted files',table.concat(wantedfiles," | "))
+ end
+ for _, fname in pairs(wantedfiles) do
+ if fname and input.is_readable.file(fname) then
+ filename, done = fname, true
+ table.insert(result, file.join('.',fname))
+ break
+ end
+ end
+ -- this is actually 'other text files' or 'any' or 'whatever'
+ local filelist = input.aux.collect_files(instance,wantedfiles)
+ filename = filelist and filelist[1]
+ if filename then
+ table.insert(result, filename)
+ done = true
+ end
+ else
+ -- list search
+ local filelist = input.aux.collect_files(instance,wantedfiles)
+ local doscan, recurse
+ if input.trace > 2 then
+ input.logger('? filename',filename)
+ if pathlist then input.logger('? path list',table.concat(pathlist," | ")) end
+ if filelist then input.logger('? file list',table.concat(filelist," | ")) end
+ end
+ -- a bit messy ... esp the doscan setting here
+ for _, path in pairs(pathlist) do
+ if path:find("^!!") then doscan = false else doscan = true end
+ if path:find("//$") then recurse = true else recurse = false end
+ local pathname = path:gsub("^!+", '')
+ done = false
+ -- using file list
+ if filelist and not (done and not instance.allresults) and recurse then
+ -- compare list entries with permitted pattern
+ pathname = pathname:gsub("([%-%.])","%%%1") -- this also influences
+ pathname = pathname:gsub("/+$", '/.*') -- later usage of pathname
+ pathname = pathname:gsub("//", '/.-/')
+ expr = "^" .. pathname
+ -- input.debug('?',expr)
+ for _, f in pairs(filelist) do
+ if f:find(expr) then
+ -- input.debug('T',' '..f)
+ if input.trace > 2 then
+ input.logger('= found in hash',f)
+ end
+ table.insert(result,f)
+ input.aux.register_in_trees(instance,f) -- for tracing used files
+ done = true
+ if not instance.allresults then break end
+ else
+ -- input.debug('F',' '..f)
+ end
+ end
+ end
+ if not done and doscan then
+ -- check if on disk / unchecked / does not work at all
+ if input.method_is_file(pathname) then -- ?
+ local pname = pathname:gsub("%.%*$",'')
+ if not pname:find("%*") then
+ local ppname = pname:gsub("/+$","")
+ if input.aux.can_be_dir(instance,ppname) then
+ for _, w in pairs(wantedfiles) do
+ local fname = file.join(ppname,w)
+ if input.is_readable.file(fname) then
+ if input.trace > 2 then
+ input.logger('= found by scanning',fname)
+ end
+ table.insert(result,fname)
+ done = true
+ if not instance.allresults then break end
+ end
+ end
+ else
+ -- no access needed for non existing path, speedup (esp in large tree with lots of fake)
+ end
+ end
+ end
+ end
+ if not done and doscan then
+ -- todo: slow path scanning
+ end
+ if done and not instance.allresults then break end
+ end
+ end
+ end
+ for k,v in pairs(result) do
+ result[k] = file.collapse_path(v)
+ end
+ if instance.remember then
+ instance.found[stamp] = result
+ end
+ return result
+end
+
+input.aux._find_file_ = input.aux.find_file
+
+function input.aux.find_file(instance,filename) -- maybe make a lowres cache too
+ local result = input.aux._find_file_(instance,filename)
+ if #result == 0 then
+ local lowered = filename:lower()
+ if filename ~= lowered then
+ return input.aux._find_file_(instance,lowered)
+ end
+ end
+ return result
+end
+
+if lfs and lfs.isfile then
+ input.aux.is_file = lfs.isfile -- to be done: use this
+else
+ input.aux.is_file = file.is_readable
+end
+
+if lfs and lfs.isdir then
+ function input.aux.can_be_dir(instance,name)
+ if not instance.fakepaths[name] then
+ if lfs.isdir(name) then
+ instance.fakepaths[name] = 1 -- directory
+ else
+ instance.fakepaths[name] = 2 -- no directory
+ end
+ end
+ return (instance.fakepaths[name] == 1)
+ end
+else
+ function input.aux.can_be_dir()
+ return true
+ end
+end
+
+if not input.concatinators then input.concatinators = { } end
+
+function input.concatinators.tex(tag,path,name)
+ return tag .. '/' .. path .. '/' .. name
+end
+
+input.concatinators.file = input.concatinators.tex
+
+function input.find_files(instance,filename,filetype,mustexist)
+ if type(mustexist) == boolean then
+ -- all set
+ elseif type(filetype) == 'boolean' then
+ filetype, mustexist = nil, false
+ elseif type(filetype) ~= 'string' then
+ filetype, mustexist = nil, false
+ end
+ instance.format = filetype or ''
+ local t = input.aux.find_file(instance,filename,true)
+ instance.format = ''
+ return t
+end
+
+function input.find_file(instance,filename,filetype,mustexist)
+ return (input.find_files(instance,filename,filetype,mustexist)[1] or "")
+end
+
+function input.find_given_files(instance,filename)
+ local bname, result = file.basename(filename), { }
+ for k, hash in pairs(instance.hashes) do
+ local blist = instance.files[hash.tag][bname]
+ if blist then
+ if type(blist) == 'string' then
+ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+ if not instance.allresults then break end
+ else
+ for kk,vv in pairs(blist) do
+ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+ if not instance.allresults then break end
+ end
+ end
+ end
+ end
+ return result
+end
+
+function input.find_given_file(instance,filename)
+ return (input.find_given_files(instance,filename)[1] or "")
+end
+
+--~ function input.find_wildcard_files(instance,filename)
+--~ local result = { }
+--~ local bname, dname = file.basename(filename), file.dirname(filename)
+--~ local expr = dname:gsub("^*/","")
+--~ expr = expr:gsub("*",".*")
+--~ expr = expr:gsub("-","%-")
+--~ for k, hash in pairs(instance.hashes) do
+--~ local blist = instance.files[hash.tag][bname]
+--~ if blist then
+--~ if type(blist) == 'string' then
+--~ -- make function and share code
+--~ if blist:find(expr) then
+--~ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+--~ if not instance.allresults then break end
+--~ end
+--~ else
+--~ for kk,vv in pairs(blist) do
+--~ if vv:find(expr) then
+--~ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+--~ if not instance.allresults then break end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ return result
+--~ end
+
+function input.find_wildcard_files(instance,filename)
+ local result = { }
+ local bname, dname = file.basename(filename), file.dirname(filename)
+ local path = dname:gsub("^*/","")
+ path = path:gsub("*",".*")
+ path = path:gsub("-","%%-")
+ if dname == "" then
+ path = ".*"
+ end
+ local name = bname
+ name = name:gsub("*",".*")
+ name = name:gsub("-","%%-")
+ path = path:lower()
+ name = name:lower()
+ local function doit(blist,bname,hash,allresults)
+ local done = false
+ if blist then
+ if type(blist) == 'string' then
+ -- make function and share code
+ if (blist:lower()):find(path) then
+ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+ done = true
+ end
+ else
+ for kk,vv in pairs(blist) do
+ if (vv:lower()):find(path) then
+ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+ done = true
+ if not allresults then break end
+ end
+ end
+ end
+ end
+ return done
+ end
+ local files, allresults, done = instance.files, instance.allresults, false
+ if name:find("%*") then
+ for k, hash in pairs(instance.hashes) do
+ for kk, hh in pairs(files[hash.tag]) do
+ if (kk:lower()):find(name) then
+ if doit(hh,kk,hash,allresults) then done = true end
+ if done and not allresults then break end
+ end
+ end
+ end
+ else
+ for k, hash in pairs(instance.hashes) do
+ if doit(files[hash.tag][bname],bname,hash,allresults) then done = true end
+ if done and not allresults then break end
+ end
+ end
+ return result
+end
+
+function input.find_wildcard_file(instance,filename)
+ return (input.find_wildcard_files(instance,filename)[1] or "")
+end
+
+-- main user functions
+
+function input.save_used_files_in_trees(instance, filename,jobname)
+ if not filename then filename = 'luatex.jlg' end
+ local f = io.open(filename,'w')
+ if f then
+ f:write("<?xml version='1.0' standalone='yes'?>\n")
+ f:write("<rl:job>\n")
+ if jobname then
+ f:write("\t<rl:name>" .. jobname .. "</rl:name>\n")
+ end
+ f:write("\t<rl:files>\n")
+ for _,v in pairs(table.sortedkeys(instance.foundintrees)) do
+ f:write("\t\t<rl:file n='" .. instance.foundintrees[v] .. "'>" .. v .. "</rl:file>\n")
+ end
+ f:write("\t</rl:files>\n")
+ f:write("</rl:usedfiles>\n")
+ f:close()
+ end
+end
+
+function input.automount(instance)
+ -- implemented later
+end
+
+function input.load(instance)
+ input.start_timing(instance)
+ input.identify_cnf(instance)
+ input.load_cnf(instance)
+ input.expand_variables(instance)
+ input.load_hash(instance)
+ input.automount(instance)
+ input.stop_timing(instance)
+end
+
+function input.for_files(instance, command, files, filetype, mustexist)
+ if files and #files > 0 then
+ local function report(str)
+ if input.verbose then
+ input.report(str) -- has already verbose
+ else
+ print(str)
+ end
+ end
+ if input.verbose then
+ report('')
+ end
+ for _, file in pairs(files) do
+ local result = command(instance,file,filetype,mustexist)
+ if type(result) == 'string' then
+ report(result)
+ else
+ for _,v in pairs(result) do
+ report(v)
+ end
+ end
+ end
+ end
+end
+
+-- strtab
+
+function input.var_value(instance,str) -- output the value of variable $STRING.
+ return input.variable(instance,str)
+end
+function input.expand_var(instance,str) -- output variable expansion of STRING.
+ return input.expansion(instance,str)
+end
+function input.show_path(instance,str) -- output search path for file type NAME
+ return file.join_path(input.expanded_path_list(instance,input.format_of_var(str)))
+end
+
+-- input.find_file(filename)
+-- input.find_file(filename, filetype, mustexist)
+-- input.find_file(filename, mustexist)
+-- input.find_file(filename, filetype)
+
+function input.aux.register_file(files, name, path)
+ if files[name] then
+ if type(files[name]) == 'string' then
+ files[name] = { files[name], path }
+ else
+ files[name] = path
+ end
+ else
+ files[name] = path
+ end
+end
+
+-- zip:: zip## zip://
+-- zip::pathtozipfile::pathinzipfile (also: pathtozipfile/pathinzipfile)
+-- file::name
+-- tex::name
+-- kpse::name
+-- kpse::format::name
+-- parent::n::name
+-- parent::name (default 2)
+
+if not input.finders then input.finders = { } end
+if not input.openers then input.openers = { } end
+if not input.loaders then input.loaders = { } end
+
+input.finders.notfound = { nil }
+input.openers.notfound = { nil }
+input.loaders.notfound = { false, nil, 0 }
+
+function input.splitmethod(filename)
+ local method, specification = filename:match("^(.-)##(.+)$")
+ if method and specification then
+ return method, specification
+ else
+ return 'tex', filename
+ end
+end
+
+function input.method_is_file(filename)
+ local method, specification = input.splitmethod(filename)
+ return method == 'tex' or method == 'file'
+end
+
+function input.methodhandler(what, instance, filename, filetype) -- ...
+ local method, specification = input.splitmethod(filename)
+ if method and specification then -- redundant
+ if input[what][method] then
+ input.logger('= handler',filename.." -> "..what.." | "..method.." | "..specification)
+ return input[what][method](instance,specification,filetype)
+ else
+ return nil
+ end
+ else
+ return input[what].tex(instance,filename,filetype)
+ end
+end
+
+-- also inside next test?
+
+function input.findtexfile(instance, filename, filetype)
+ return input.methodhandler('finders',instance, input.normalize_name(filename), filetype)
+end
+function input.opentexfile(instance,filename)
+ return input.methodhandler('openers',instance, input.normalize_name(filename))
+end
+
+function input.findbinfile(instance, filename, filetype)
+ return input.methodhandler('finders',instance, input.normalize_name(filename), filetype)
+end
+function input.openbinfile(instance,filename)
+ return input.methodhandler('loaders',instance, input.normalize_name(filename))
+end
+
+function input.loadbinfile(instance, filename, filetype)
+ local fname = input.findbinfile(instance, input.normalize_name(filename), filetype)
+ if fname and fname ~= "" then
+ return input.openbinfile(instance,fname)
+ else
+ return unpack(input.loaders.notfound)
+ end
+end
+
+function input.texdatablob(instance, filename, filetype)
+ local ok, data, size = input.loadbinfile(instance, filename, filetype)
+ return data or ""
+end
+
+function input.openfile(filename) -- brrr texmf.instance here / todo ! ! ! ! !
+ local fullname = input.findtexfile(texmf.instance, filename)
+ if fullname and (fullname ~= "") then
+ return input.opentexfile(texmf.instance, fullname)
+ else
+ return nil
+ end
+end
+
+function input.logmode()
+ return (os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"):lower()
+end
+
+-- this is a prelude to engine/progname specific configuration files
+-- in which case we can omit files meant for other programs and
+-- packages
+
+--- ctx
+
+-- maybe texinputs + font paths
+-- maybe positive selection tex/context fonts/tfm|afm|vf|opentype|type1|map|enc
+
+input.validators = { }
+input.validators.visibility = { }
+
+function input.validators.visibility.default(path, name)
+ return true
+end
+
+function input.validators.visibility.context(path, name)
+ path = path[1] or path -- some day a loop
+ return not (
+ path:find("latex") or
+ path:find("doc") or
+ path:find("tex4ht") or
+ path:find("source") or
+-- path:find("config") or
+-- path:find("metafont") or
+ path:find("lists$") or
+ name:find("%.tpm$") or
+ name:find("%.bak$")
+ )
+end
+
+-- todo: describe which functions are public (maybe input.private. ... )
+
+-- beware: i need to check where we still need a / on windows:
+
+function input.clean_path(str)
+ -- return string.gsub(string.gsub(string.gsub(str,"\\","/"),"^!+",""),"//$","/")
+ return (string.gsub(string.gsub(str,"\\","/"),"^!+",""))
+end
+function input.do_with_path(name,func)
+ for _, v in pairs(input.expanded_path_list(instance,name)) do
+ func("^"..input.clean_path(v))
+ end
+end
+function input.do_with_var(name,func)
+ func(input.aux.expanded_var(name))
+end
+
+function input.with_files(instance,pattern,handle)
+ for _, hash in pairs(instance.hashes) do
+ local blobpath = hash.tag
+ local blobtype = hash.type
+ if blobpath and instance.files[blobpath] then -- sort them?
+ for k,v in pairs(instance.files[blobpath]) do
+ if k:find(pattern) then
+ if type(v) == "string" then
+ handle(blobtype,blobpath,v,k)
+ else
+ for _,vv in pairs(v) do
+ handle(blobtype,blobpath,vv,k)
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+ newname = file.addsuffix(newname,"lua")
+ newscript = input.clean_path(input.find_file(instance, newname))
+ oldscript = input.clean_path(oldname)
+ input.report("old script", oldscript)
+ input.report("new script", newscript)
+ if oldscript ~= newscript and (oldscript:find(file.removesuffix(newname).."$") or oldscript:find(newname.."$")) then
+ newdata = io.loaddata(newscript)
+ if newdata then
+ input.report("old script content replaced by new content")
+ io.savedata(oldscript,newdata)
+ end
+ end
+end
+
+
+if not modules then modules = { } end modules ['luat-tmp'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+cache = cache or { }
+dir = dir or { }
+texmf = texmf or { }
+
+cache.path = nil
+cache.base = cache.base or "luatex-cache"
+cache.more = cache.more or "context"
+cache.direct = false -- true is faster but may need huge amounts of memory
+cache.trace = false
+cache.tree = false
+cache.temp = os.getenv("TEXMFCACHE") or os.getenv("HOME") or os.getenv("HOMEPATH") or os.getenv("VARTEXMF") or os.getenv("TEXMFVAR") or os.getenv("TMP") or os.getenv("TEMP") or os.getenv("TMPDIR") or nil
+cache.paths = { cache.temp }
+
+if not cache.temp then
+ print("\nFATAL ERROR: NO VALID TEMPORARY PATH\n")
+ os.exit()
+end
+
+function cache.configpath(instance)
+ return input.expand_var(instance,"TEXMFCNF")
+end
+
+function cache.treehash(instance)
+ local tree = cache.configpath(instance)
+ if not tree or tree == "" then
+ return false
+ else
+ return md5.hex(tree)
+ end
+end
+
+function cache.setpath(instance,...)
+ if not cache.path then
+ if lfs and instance then
+ for _,v in pairs(cache.paths) do
+ for _,vv in pairs(input.expanded_path_list(instance,v)) do
+ if lfs.isdir(vv) then
+ cache.path = vv
+ break
+ end
+ end
+ if cache.path then break end
+ end
+ end
+ if not cache.path then
+ cache.path = cache.temp
+ end
+ if lfs then
+ cache.tree = cache.tree or cache.treehash(instance)
+ if cache.tree then
+ cache.path = dir.mkdirs(cache.path,cache.base,cache.more,cache.tree)
+ else
+ cache.path = dir.mkdirs(cache.path,cache.base,cache.more)
+ end
+ end
+ end
+ if not cache.path then
+ cache.path = '.'
+ end
+ cache.path = input.clean_path(cache.path)
+ if lfs and not table.is_empty({...}) then
+ local pth = dir.mkdirs(cache.path,...)
+ return pth
+ end
+ return cache.path
+end
+
+function cache.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
+end
+
+function cache.loaddata(path,name)
+ local tmaname, tmcname = cache.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ return loader()
+ else
+ return false
+ end
+end
+
+function cache.is_writable(filepath,filename)
+ local tmaname, tmcname = cache.setluanames(filepath,filename)
+ return file.is_writable(tmaname)
+end
+
+function cache.savedata(filepath,filename,data,raw) -- raw needed for file cache
+ local tmaname, tmcname = cache.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ if cache.direct then
+ file.savedata(tmaname, table.serialize(data,'return',true,true))
+ else
+ table.tofile (tmaname, data,'return',true,true) -- maybe not the last true
+ end
+ utils.lua.compile(tmaname, tmcname)
+end
+
+-- here we use the cache for format loading (texconfig.[formatname|jobname])
+
+if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
+ if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end
+ texconfig.formatname = cache.setpath(instance,"format") .. "/" .. texconfig.luaname:gsub("%.lu.$",".fmt")
+end
+
+--[[ldx--
+<p>Once we found ourselves defining similar cache constructs
+several times, containers were introduced. Containers are used
+to collect tables in memory and reuse them when possible based
+on (unique) hashes (to be provided by the calling function).</p>
+
+<p>Caching to disk is disabled by default. Version numbers are
+stored in the saved table which makes it possible to change the
+table structures without bothering about the disk cache.</p>
+
+<p>Examples of usage can be found in the font related code.</p>
+--ldx]]--
+
+containers = { }
+containers.trace = false
+
+do -- local report
+
+ local function report(container,tag,name)
+ if cache.trace or containers.trace or container.trace then
+ logs.report(string.format("%s cache",container.subcategory),string.format("%s: %s",tag,name or 'invalid'))
+ end
+ end
+
+ function containers.define(category, subcategory, version, enabled)
+ if category and subcategory then
+ return {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or 1.000,
+ trace = false,
+ path = cache.setpath(texmf.instance,category,subcategory),
+ }
+ else
+ return nil
+ end
+ end
+
+ function containers.is_usable(container, name)
+ return container.enabled and cache.is_writable(container.path, name)
+ end
+
+ function containers.is_valid(container, name)
+ if name and name ~= "" then
+ local cs = container.storage[name]
+ return cs and not table.is_empty(cs) and cs.cache_version == container.version
+ else
+ return false
+ end
+ end
+
+ function containers.read(container,name)
+ if container.enabled and not container.storage[name] then
+ container.storage[name] = cache.loaddata(container.path,name)
+ if containers.is_valid(container,name) then
+ report(container,"loaded",name)
+ else
+ container.storage[name] = nil
+ end
+ end
+ if container.storage[name] then
+ report(container,"reusing",name)
+ end
+ return container.storage[name]
+ end
+
+ function containers.write(container, name, data)
+ if data then
+ data.cache_version = container.version
+ if container.enabled then
+ local unique, shared = data.unique, data.shared
+ data.unique, data.shared = nil, nil
+ cache.savedata(container.path, name, data)
+ report(container,"saved",name)
+ data.unique, data.shared = unique, shared
+ end
+ report(container,"stored",name)
+ container.storage[name] = data
+ end
+ return data
+ end
+
+ function containers.content(container,name)
+ return container.storage[name]
+ end
+
+end
+
+-- since we want to use the cache instead of the tree, we will now
+-- reimplement the saver.
+
+input.usecache = true
+
+function input.aux.save_data(instance, dataname, check)
+ for cachename, files in pairs(instance[dataname]) do
+ local name
+ if input.usecache then
+ name = file.join(cache.setpath(instance,"trees"),md5.hex(cachename))
+ else
+ name = file.join(cachename,dataname)
+ end
+ local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix
+ input.report("preparing " .. dataname .. " in", luaname)
+ for k, v in pairs(files) do
+ if not check or check(v,k) then -- path, name
+ if #v == 1 then
+ files[k] = v[1]
+ end
+ else
+ files[k] = nil -- false
+ end
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = input.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = files,
+ }
+ local f = io.open(luaname,'w')
+ if f then
+ input.report("saving " .. dataname .. " in", luaname)
+ -- f:write(table.serialize(data,'return'))
+ f:write(input.serialize(data))
+ f:close()
+ input.report("compiling " .. dataname .. " to", lucname)
+ if not utils.lua.compile(luaname,lucname) then
+ input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname)
+ os.remove(lucname)
+ end
+ else
+ input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix)
+ end
+ end
+end
+
+function input.serialize(files)
+ -- This version is somewhat optimized for the kind of
+ -- tables that we deal with, so it's much faster than
+ -- the generic serializer. This makes sense because
+ -- luatools and mtxtools are called frequently. Okay,
+ -- we pay a small price for properly tabbed tables.
+ local t = { }
+ local concat = table.concat
+ local sorted = table.sortedkeys
+ local function dump(k,v,m)
+ if type(v) == 'string' then
+ return m .. "['" .. k .. "']='" .. v .. "',"
+ elseif #v == 1 then
+ return m .. "['" .. k .. "']='" .. v[1] .. "',"
+ else
+ return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
+ end
+ end
+ t[#t+1] = "return {"
+ if instance.sortdata then
+ for _, k in pairs(sorted(files)) do
+ local fk = files[k]
+ if type(fk) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ for _, kk in pairs(sorted(fk)) do
+ t[#t+1] = dump(kk,fk[kk],"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,fk,"\t")
+ end
+ end
+ else
+ for k, v in pairs(files) do
+ if type(v) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ for kk,vv in pairs(v) do
+ t[#t+1] = dump(kk,vv,"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,v,"\t")
+ end
+ end
+ end
+ t[#t+1] = "}"
+ return concat(t,"\n")
+end
+
+function input.aux.load_data(instance,pathname,dataname,filename)
+ local luaname, lucname, pname, fname
+ if input.usecache then
+ pname, fname = cache.setpath(instance,"trees"), md5.hex(pathname)
+ filename = file.join(pname,fname)
+ else
+ if not filename or (filename == "") then
+ filename = dataname
+ end
+ pname, fname = pathname, filename
+ end
+ luaname = file.join(pname,fname) .. input.luasuffix
+ lucname = file.join(pname,fname) .. input.lucsuffix
+ local blob = loadfile(lucname)
+ if not blob then
+ blob = loadfile(luaname)
+ end
+ if blob then
+ local data = blob()
+ if data and data.content and data.type == dataname and data.version == input.cacheversion then
+ input.report("loading",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = data.content
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = { }
+ instance.loaderror = true
+ end
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ end
+end
+
+-- we will make a better format, maybe something xml or just text
+
+input.automounted = input.automounted or { }
+
+function input.automount(instance,usecache)
+ local mountpaths = input.simplified_list(input.expansion(instance,'TEXMFMOUNT'))
+ if table.is_empty(mountpaths) and usecache then
+ mountpaths = { cache.setpath(instance,"mount") }
+ end
+ if not table.is_empty(mountpaths) then
+ input.starttiming(instance)
+ for k, root in pairs(mountpaths) do
+ local f = io.open(root.."/url.tmi")
+ if f then
+ for line in f:lines() do
+ if line then
+ if line:find("^[%%#%-]") then -- or %W
+ -- skip
+ elseif line:find("^zip://") then
+ input.report("mounting",line)
+ table.insert(input.automounted,line)
+ input.usezipfile(instance,line)
+ end
+ end
+ end
+ f:close()
+ end
+ end
+ input.stoptiming(instance)
+ end
+end
+
+-- store info in format
+
+input.storage = { }
+input.storage.data = { }
+input.storage.min = 0 -- 500
+input.storage.max = input.storage.min - 1
+input.storage.trace = false -- true
+input.storage.done = 0
+input.storage.evaluators = { }
+-- (evaluate,message,names)
+
+function input.storage.register(...)
+ input.storage.data[#input.storage.data+1] = { ... }
+end
+
+function input.storage.evaluate(name)
+ input.storage.evaluators[#input.storage.evaluators+1] = name
+end
+
+function input.storage.finalize() -- we can prepend the string with "evaluate:"
+ for _, t in ipairs(input.storage.evaluators) do
+ for i, v in pairs(t) do
+ if type(v) == "string" then
+ t[i] = loadstring(v)()
+ elseif type(v) == "table" then
+ for _, vv in pairs(v) do
+ if type(vv) == "string" then
+ t[i] = loadstring(vv)()
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.storage.dump()
+ for name, data in ipairs(input.storage.data) do
+ local evaluate, message, original, target = data[1], data[2], data[3] ,data[4]
+ local name, initialize, finalize = nil, "", ""
+ for str in string.gmatch(target,"([^%.]+)") do
+ if name then
+ name = name .. "." .. str
+ else
+ name = str
+ end
+ initialize = string.format("%s %s = %s or {} ", initialize, name, name)
+ end
+ if evaluate then
+ finalize = "input.storage.evaluate(" .. name .. ")"
+ end
+ input.storage.max = input.storage.max + 1
+ if input.storage.trace then
+ logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max))
+ lua.bytecode[input.storage.max] = loadstring(
+ initialize ..
+ string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) ..
+ table.serialize(original,name) ..
+ finalize
+ )
+ else
+ lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize)
+ end
+ end
+end
+
+if lua.bytecode then -- from 0 upwards
+ local i = input.storage.min
+ while lua.bytecode[i] do
+ lua.bytecode[i]()
+ lua.bytecode[i] = nil
+ i = i + 1
+ end
+ input.storage.done = i
+end
+
+
+-- end library merge
+
+own = { }
+
+own.libs = { -- todo: check which ones are really needed
+ 'l-string.lua',
+ 'l-table.lua',
+ 'l-io.lua',
+ 'l-md5.lua',
+ 'l-number.lua',
+ 'l-os.lua',
+ 'l-file.lua',
+ 'l-dir.lua',
+ 'l-boolean.lua',
+-- 'l-unicode.lua',
+ 'l-utils.lua',
+-- 'l-tex.lua',
+ 'luat-lib.lua',
+ 'luat-inp.lua',
+-- 'luat-zip.lua',
+-- 'luat-tex.lua',
+-- 'luat-kps.lua',
+ 'luat-tmp.lua',
+}
+
+-- We need this hack till luatex is fixed.
+--
+-- for k,v in pairs(arg) do print(k,v) end
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
+end
+
+-- End of hack.
+
+own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua'
+
+own.path = string.match(own.name,"^(.+)[\\/].-$") or "."
+own.list = { '.' }
+if own.path ~= '.' then
+ table.insert(own.list,own.path)
+end
+table.insert(own.list,own.path.."/../../../tex/context/base")
+table.insert(own.list,own.path.."/mtx")
+table.insert(own.list,own.path.."/../sources")
+
+function locate_libs()
+ for _, lib in pairs(own.libs) do
+ for _, pth in pairs(own.list) do
+ local filename = string.gsub(pth .. "/" .. lib,"\\","/")
+ local codeblob = loadfile(filename)
+ if codeblob then
+ codeblob()
+ own.list = { pth } -- speed up te search
+ break
+ end
+ end
+ end
+end
+
+if not input then
+ locate_libs()
+end
+
+if not input then
+ print("")
+ print("Mtxrun is unable to start up due to lack of libraries. You may")
+ print("try to run 'lua mtxrun.lua --selfmerge' in the path where this")
+ print("script is located (normally under ..../scripts/context/lua) which")
+ print("will make this script library independent.")
+ os.exit()
+end
+
+instance = input.reset()
+input.verbose = environment.argument("verbose") or false
+input.banner = 'MtxRun | '
+utils.report = input.report
+
+instance.engine = environment.argument("engine") or 'luatex'
+instance.progname = environment.argument("progname") or 'context'
+instance.lsrmode = environment.argument("lsr") or false
+
+-- use os.env or environment when available
+
+function os.setenv(key,value)
+ -- todo
+end
+
+function input.check_environment(tree)
+ input.report('')
+ os.setenv('TMP', os.getenv('TMP') or os.getenv('TEMP') or os.getenv('TMPDIR') or os.getenv('HOME'))
+ if os.platform == 'linux' then
+ os.setenv('TEXOS', os.getenv('TEXOS') or 'texmf-linux')
+ elseif os.platform == 'windows' then
+ os.setenv('TEXOS', os.getenv('TEXOS') or 'texmf-windows')
+ elseif os.platform == 'macosx' then
+ os.setenv('TEXOS', os.getenv('TEXOS') or 'texmf-macosx')
+ end
+ os.setenv('TEXOS', string.gsub(string.gsub(os.getenv('TEXOS'),"^[\\\/]*", ''),"[\\\/]*$", ''))
+ os.setenv('TEXPATH', string.gsub(tree,"\/+$",''))
+ os.setenv('TEXMFOS', os.getenv('TEXPATH') .. "/" .. os.getenv('TEXOS'))
+ input.report('')
+ input.report("preset : TEXPATH => " .. os.getenv('TEXPATH'))
+ input.report("preset : TEXOS => " .. os.getenv('TEXOS'))
+ input.report("preset : TEXMFOS => " .. os.getenv('TEXMFOS'))
+ input.report("preset : TMP => " .. os.getenv('TMP'))
+ input.report('')
+end
+
+function input.load_environment(name) -- todo: key=value as well as lua
+ local f = io.open(name)
+ if f then
+ for line in f:lines() do
+ if line:find("^[%%%#]") then
+ -- skip comment
+ else
+ local key, how, value = line:match("^(.-)%s*([%<%=%>%?]+)%s*(.*)%s*$")
+ value = value:gsub("^%%(.+)%%$", function(v) return os.getenv(v) or "" end)
+ if how == "=" or how == "<<" then
+ os.setenv(key,value)
+ elseif how == "?" or how == "??" then
+ os.setenv(key,os.getenv(key) or value)
+ elseif how == "<" or how == "+=" then
+ if os.getenv(key) then
+ os.setenv(key,os.getenv(key) .. io.fileseparator .. value)
+ else
+ os.setenv(key,value)
+ end
+ elseif how == ">" or how == "=+" then
+ if os.getenv(key) then
+ os.setenv(key,value .. io.pathseparator .. os.getenv(key))
+ else
+ os.setenv(key,value)
+ end
+ end
+ end
+ end
+ f:close()
+ end
+end
+
+function input.load_tree(tree)
+ if tree and tree ~= "" then
+ local setuptex = 'setuptex.tmf'
+ if lfs.attributes(tree, mode) == "directory" then -- check if not nil
+ setuptex = tree .. "/" .. setuptex
+ else
+ setuptex = tree
+ end
+ if io.exists(setuptex) then
+ input.check_environment(tree)
+ input.load_environment(setuptex)
+ end
+ end
+end
+
+-- md5 extensions
+
+-- maybe md.md5 md.md5hex md.md5HEX
+
+if not md5 then md5 = { } end
+
+if not md5.sum then
+ function md5.sum(k)
+ return string.rep("x",16)
+ end
+end
+
+function md5.hexsum(k)
+ return (string.gsub(md5.sum(k), ".", function(c) return string.format("%02x", string.byte(c)) end))
+end
+
+function md5.HEXsum(k)
+ return (string.gsub(md5.sum(k), ".", function(c) return string.format("%02X", string.byte(c)) end))
+end
+
+-- file extensions
+
+file.needs_updating_threshold = 1
+
+function file.needs_updating(oldname,newname) -- size modification access change
+ local oldtime = lfs.attributes(oldname, modification)
+ local newtime = lfs.attributes(newname, modification)
+ if newtime >= oldtime then
+ return false
+ elseif oldtime - newtime < file.needs_updating_threshold then
+ return false
+ else
+ return true
+ end
+end
+
+function file.mdchecksum(name)
+ if md5 then
+ local data = io.loadall(name)
+ if data then
+ return md5.HEXsum(data)
+ end
+ end
+ return nil
+end
+
+function file.loadchecksum(name)
+ if md then
+ local data = io.loadall(name .. ".md5")
+ if data then
+ return string.gsub(md5.HEXsum(data),"%s$","")
+ end
+ end
+ return nil
+end
+
+function file.savechecksum(name, checksum)
+ if not checksum then checksum = file.mdchecksum(name) end
+ if checksum then
+ local f = io.open(name .. ".md5","w")
+ if f then
+ f:write(checksum)
+ f:close()
+ return checksum
+ end
+ end
+ return nil
+end
+
+-- it starts here
+
+input.runners = { }
+input.runners.applications = { }
+
+input.runners.applications.lua = "luatex --luaonly"
+input.runners.applications.pl = "perl"
+input.runners.applications.py = "python"
+input.runners.applications.rb = "ruby"
+
+input.runners.suffixes = {
+ 'rb', 'lua', 'py', 'pl'
+}
+
+input.runners.registered = {
+ texexec = { 'texexec.rb', true },
+ texutil = { 'texutil.rb', true },
+ texfont = { 'texfont.pl', true },
+ texshow = { 'texshow.pl', false },
+
+ makempy = { 'makempy.pl', true },
+ mptopdf = { 'mptopdf.pl', true },
+ pstopdf = { 'pstopdf.rb', true },
+
+ examplex = { 'examplex.rb', false },
+ concheck = { 'concheck.rb', false },
+
+ runtools = { 'runtools.rb', true },
+ textools = { 'textools.rb', true },
+ tmftools = { 'tmftools.rb', true },
+ ctxtools = { 'ctxtools.rb', true },
+ rlxtools = { 'rlxtools.rb', true },
+ pdftools = { 'pdftools.rb', true },
+ mpstools = { 'mpstools.rb', true },
+ exatools = { 'exatools.rb', true },
+ xmltools = { 'xmltools.rb', true },
+ luatools = { 'luatools.lua', true },
+ mtxtools = { 'mtxtools.rb', true },
+
+ pdftrimwhite = { 'pdftrimwhite.pl', false }
+}
+
+if not messages then messages = { } end
+
+messages.help = [[
+--execute run a script or program
+--resolve resolve prefixed arguments
+--ctxlua run internally (using preloaded libs)
+--locate locate given filename
+
+--autotree use texmf tree cf. env 'texmfstart_tree' or 'texmfstarttree'
+--tree=pathtotree use given texmf tree (default file: 'setuptex.tmf')
+--environment=name use given (tmf) environment file
+--path=runpath go to given path before execution
+--ifchanged=filename only execute when given file has changed (md checksum)
+--iftouched=old,new only execute when given file has changed (time stamp)
+
+--make create stubs for (context related) scripts
+--remove remove stubs (context related) scripts
+--stubpath=binpath paths where stubs wil be written
+--windows create windows (mswin) stubs
+--unix create unix (linux) stubs
+
+--verbose give a bit more info
+--engine=str target engine
+--progname=str format or backend
+
+--edit launch editor with found file
+--launch (--all) launch files (assume os support)
+
+--intern run script using built in libraries
+]]
+
+function input.runners.my_prepare_a(instance)
+ input.identify_cnf(instance)
+ input.load_cnf(instance)
+ input.expand_variables(instance)
+end
+
+function input.runners.my_prepare_b(instance)
+ input.runners.my_prepare_a(instance)
+ input.load_hash(instance)
+end
+
+function input.runners.prepare(instance)
+ local checkname = environment.argument("ifchanged")
+ if checkname and checkname ~= "" then
+ local oldchecksum = file.loadchecksum(checkname)
+ local newchecksum = file.checksum(checkname)
+ if oldchecksum == newchecksum then
+ report("file '" .. checkname .. "' is unchanged")
+ return "skip"
+ else
+ report("file '" .. checkname .. "' is changed, processing started")
+ end
+ file.savechecksum(checkname)
+ end
+ local oldname, newname = string.split(environment.argument("iftouched") or "", ",")
+ if oldname and newname and oldname ~= "" and newname ~= "" then
+ if not file.needs_updating(oldname,newname) then
+ report("file '" .. oldname .. "' and '" .. newname .. "'have same age")
+ return "skip"
+ else
+ report("file '" .. newname .. "' is older than '" .. oldname .. "'")
+ end
+ end
+ local tree = environment.argument('tree') or ""
+ if environment.argument('autotree') then
+ tree = os.getenv('TEXMFSTART_TREE') or os.getenv('TEXMFSTARTTREE') or tree
+ end
+ if tree and tree ~= "" then
+ input.load_tree(tree)
+ end
+ local env = environment.argument('environment') or ""
+ if env and env ~= "" then
+ for _,e in pairs(string.split(env)) do
+ -- maybe force suffix when not given
+ input.load_tree(e)
+ end
+ end
+ local runpath = environment.argument("path")
+ if runpath and not dir.chdir(runpath) then
+ input.report("unable to change to path '" .. runpath .. "'")
+ return "error"
+ end
+ return "run"
+end
+
+function input.runners.execute_script(instance,fullname,internal)
+ if fullname and fullname ~= "" then
+ local state = input.runners.prepare(instance)
+ if state == 'error' then
+ return false
+ elseif state == 'skip' then
+ return true
+ elseif state == "run" then
+ instance.progname = environment.argument("progname") or instance.progname
+ instance.format = environment.argument("format") or instance.format
+ local path, name, suffix, result = file.dirname(fullname), file.basename(fullname), file.extname(fullname), ""
+ if path ~= "" then
+ result = fullname
+ elseif name then
+ name = name:gsub("^int[%a]*:",function()
+ internal = true
+ return ""
+ end )
+ name = name:gsub("^script:","")
+ if suffix == "" and input.runners.registered[name] and input.runners.registered[name][1] then
+ name = input.runners.registered[name][1]
+ suffix = file.extname(name)
+ end
+ if suffix == "" then
+ -- loop over known suffixes
+ for _,s in pairs(input.runners.suffixes) do
+ result = input.find_file(instance, name .. "." .. s, 'texmfscripts')
+ if result ~= "" then
+ break
+ end
+ end
+ elseif input.runners.applications[suffix] then
+ result = input.find_file(instance, name, 'texmfscripts')
+ else
+ -- maybe look on path
+ result = input.find_file(instance, name, 'other text files')
+ end
+ end
+ if result and result ~= "" then
+ if internal then
+ local before, after = environment.split_arguments(fullname)
+ arg = { } for _,v in pairs(after) do arg[#arg+1] = v end
+ dofile(result)
+ else
+ local binary = input.runners.applications[file.extname(result)]
+ if binary and binary ~= "" then
+ result = binary .. " " .. result
+ end
+ local before, after = environment.split_arguments(fullname)
+ -- environment.initialize_arguments(after)
+ -- local command = result .. " " .. environment.reconstruct_commandline(environment.original_arguments) -- bugged
+ local command = result .. " " .. environment.reconstruct_commandline(after)
+ input.report("")
+ input.report("executing: " .. command)
+ input.report("\n \n")
+ local code = os.exec(command)
+ return code == 0
+ end
+ end
+ end
+ end
+ return false
+end
+
+function input.runners.execute_program(instance,fullname)
+ if fullname and fullname ~= "" then
+ local state = input.runners.prepare(instance)
+ if state == 'error' then
+ return false
+ elseif state == 'skip' then
+ return true
+ elseif state == "run" then
+ local before, after = environment.split_arguments(fullname)
+ environment.initialize_arguments(after)
+ fullname = fullname:gsub("^bin:","")
+ local command = fullname .. " " .. environment.reconstruct_commandline(environment.original_arguments)
+ input.report("")
+ input.report("executing: " .. command)
+ input.report("\n \n")
+ local code = os.exec(command)
+ return code == 0
+ end
+ end
+ return false
+end
+
+function input.runners.handle_stubs(instance,create)
+ local stubpath = environment.argument('stubpath') or '.' -- 'auto' no longer supported
+ local windows = environment.argument('windows') or environment.argument('mswin') or false
+ local unix = environment.argument('unix') or environment.argument('linux') or false
+ if not windows and not unix then
+ if environment.platform == "unix" then
+ unix = true
+ else
+ windows = true
+ end
+ end
+ for _,v in pairs(input.runners.registered) do
+ local name, doit = v[1], v[2]
+ if doit then
+ local base = string.gsub(file.basename(name), "%.(.-)$", "")
+ if create then
+ -- direct local command = input.runners.applications[file.extname(name)] .. " " .. name
+ local command = "luatex --luaonly mtxrun.lua " .. name
+ if windows then
+ io.savedata(base..".bat", {"@echo off", command.." %*"}, "\013\010")
+ input.report("windows stub for '" .. base .. "' created")
+ end
+ if unix then
+ io.savedata(base, {"#!/bin/sh", command..' "$@"'}, "\010")
+ input.report("unix stub for '" .. base .. "' created")
+ end
+ else
+ if windows and (os.remove(base..'.bat') or os.remove(base..'.cmd')) then
+ input.report("windows stub for '" .. base .. "' removed")
+ end
+ if unix and (os.remove(base) or os.remove(base..'.sh')) then
+ input.report("unix stub for '" .. base .. "' removed")
+ end
+ end
+ end
+ end
+end
+
+function input.resolve_prefixes(instance,str)
+ -- [env|environment|rel|relative|loc|locate|kpse|path|file]:
+ return (str:gsub("(%a+)%:(%S+)", function(k,v)
+ if k == "env" or k == "environment" then
+ v = os.getenv(k) or ""
+ elseif k == "rel" or k == "relative" then
+ for _,p in pairs({".","..","../.."}) do
+ local f = p .. "/" .. v
+ if file.exist(v) then break end
+ end
+ elseif k == "kpse" or k == "loc" or k == "locate" or k == "file" or k == "path" then
+instance.progname = environment.argument("progname") or instance.progname
+instance.format = environment.argument("format") or instance.format
+ v = input.find_given_file(instance, v)
+ if k == "path" then v = file.dirname(v) end
+ else
+ v = ""
+ end
+ return v
+ end))
+end
+
+function input.runners.resolve_string(instance)
+ instance.progname = environment.argument("progname") or environment.argument("program") or instance.progname
+ instance.format = environment.argument("format") or instance.format
+ input.runners.report_location(instance,input.resolve_prefixes(instance,table.join(environment.files, " ")))
+end
+
+function input.runners.locate_file(instance)
+ instance.progname = environment.argument("progname") or instance.progname
+ instance.format = environment.argument("format") or instance.format
+ input.runners.report_location(instance,input.find_given_file(instance, environment.files[1] or ""))
+end
+
+function input.runners.report_location(instance,result)
+ if input.verbose then
+ input.report("")
+ if result and result ~= "" then
+ input.report(result)
+ else
+ input.report("not found")
+ end
+ else
+ io.write(result)
+ end
+end
+
+function input.runners.edit_script(instance,filename)
+ local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'scite'
+ local rest = input.resolve_prefixes(instance,filename)
+ if rest ~= "" then
+ os.launch(editor .. " " .. rest)
+ end
+end
+
+input.runners.launchers = {
+ windows = { },
+ unix = { }
+}
+
+function input.launch(str)
+ -- maybe we also need to test on mtxrun.launcher.suffix environment
+ -- variable or on windows consult the assoc and ftype vars and such
+ local launchers = input.runners.launchers[os.platform] if launchers then
+ local suffix = file.extname(str) if suffix then
+ local runner = launchers[suffix] if runner then
+ str = runner .. " " .. str
+ end
+ end
+ end
+ os.launch(str)
+end
+
+function input.runners.launch_file(instance,filename)
+ instance.allresults = true
+ input.verbose = true
+ local pattern = environment.arguments["pattern"]
+ if not pattern or pattern == "" then
+ pattern = filename
+ end
+ if not pattern or pattern == "" then
+ input.report("provide name or --pattern=")
+ else
+ local t = input.find_files(instance,environment.arguments["pattern"])
+ -- local t = input.aux.find_file(instance,"*/" .. pattern,true)
+ if t and #t > 0 then
+ if environment.arguments["all"] then
+ for _, v in pairs(t) do
+ input.report("launching", v)
+ input.launch(v)
+ end
+ else
+ input.report("launching", t[1])
+ input.launch(t[1])
+ end
+ else
+ input.report("no match for", pattern)
+ end
+ end
+end
+
+function input.runners.execute_ctx_script(instance,filename)
+ local before, after = environment.split_arguments(filename)
+ local suffix = ""
+ if not filename:find("%.lua$") then suffix = ".lua" end
+ local fullname = filename
+ -- just <filename>
+ fullname = filename .. suffix
+ fullname = input.find_file(instance,fullname)
+ -- mtx-<filename>
+ if not fullname or fullname == "" then
+ fullname = "mtx-" .. filename .. suffix
+ fullname = input.find_file(instance,fullname)
+ end
+ -- mtx-<filename>s
+ if not fullname or fullname == "" then
+ fullname = "mtx-" .. filename .. "s" .. suffix
+ fullname = input.find_file(instance,fullname)
+ end
+ -- mtx-<filename minus trailing s>
+ if not fullname or fullname == "" then
+ fullname = "mtx-" .. filename:gsub("s$","") .. suffix
+ fullname = input.find_file(instance,fullname)
+ end
+ -- that should do it
+ if fullname and fullname ~= "" then
+ local state = input.runners.prepare(instance)
+ if state == 'error' then
+ return false
+ elseif state == 'skip' then
+ return true
+ elseif state == "run" then
+ arg = { } for _,v in pairs(after) do arg[#arg+1] = v end
+ environment.initialize_arguments(arg)
+ filename = environment.files[1]
+ dofile(fullname)
+ return true
+ end
+ else
+ return false
+ end
+end
+
+input.report(banner,"\n")
+
+function input.help(banner,message)
+ if not input.verbose then
+ input.verbose = true
+ input.report(banner,"\n")
+ end
+ input.reportlines(message)
+end
+
+-- this is a bit dirty ... first we store the first filename and next we
+-- split the arguments so that we only see the ones meant for this script
+-- ... later we will use the second half
+
+local filename = environment.files[1] or ""
+local ok = true
+
+local before, after = environment.split_arguments(filename)
+environment.initialize_arguments(before)
+
+if environment.argument("selfmerge") then
+ -- embed used libraries
+ utils.merger.selfmerge(own.name,own.libs,own.list)
+elseif environment.argument("selfclean") then
+ -- remove embedded libraries
+ utils.merger.selfclean(own.name)
+elseif environment.arguments["selfupdate"] then
+ input.my_prepare_b(instance)
+ input.verbose = true
+ input.update_script(own.name,"mtxrun")
+elseif environment.argument("ctxlua") or environment.argument("internal") then
+ -- run a script by loading it (using libs)
+ input.runners.my_prepare_b(instance)
+ ok = input.runners.execute_script(instance,filename,true)
+elseif environment.argument("script") then
+ -- run a script by loading it (using libs), pass args
+ input.runners.my_prepare_b(instance)
+ ok = input.runners.execute_ctx_script(instance,filename)
+elseif environment.argument("execute") then
+ -- execute script
+ input.runners.my_prepare_b(instance)
+ ok = input.runners.execute_script(instance,filename)
+elseif environment.argument("direct") then
+ -- equals bin:
+ input.runners.my_prepare_b(instance)
+ ok = input.runners.execute_program(instance,filename)
+elseif environment.argument("edit") then
+ -- edit file
+ input.runners.my_prepare_b(instance)
+ input.runners.edit_script(instance,filename)
+elseif environment.argument("launch") then
+ input.runners.my_prepare_b(instance)
+ input.runners.launch_file(instance,filename)
+elseif environment.argument("make") then
+ -- make stubs
+ input.runners.handle_stubs(instance,true)
+elseif environment.argument("remove") then
+ -- remove stub
+ input.runners.handle_stubs(instance,false)
+elseif environment.argument("resolve") then
+ -- resolve string
+ input.runners.my_prepare_b(instance)
+ input.runners.resolve_string(instance)
+elseif environment.argument("locate") then
+ -- locate file
+ input.runners.my_prepare_b(instance)
+ input.runners.locate_file(instance)
+elseif environment.argument("help") or filename=='help' or filename == "" then
+ input.help(banner,messages.help)
+else
+ -- execute script
+ input.runners.my_prepare_b(instance)
+ if filename:find("^bin:") then
+ ok = input.runners.execute_program(instance,filename)
+ else
+ ok = input.runners.execute_script(instance,filename)
+ end
+end
+
+--~ if input.verbose then
+--~ input.report("")
+--~ input.report("runtime: " .. os.clock() .. " seconds")
+--~ end
+
+--~ if ok then
+--~ input.report("exit code: 0") os.exit(0)
+--~ else
+--~ input.report("exit code: 1") os.exit(1)
+--~ end
+
+if environment.platform == "unix" then
+ io.write("\n")
+end
diff --git a/scripts/context/lua/x-ldx.lua b/scripts/context/lua/x-ldx.lua
new file mode 100644
index 000000000..3914b2907
--- /dev/null
+++ b/scripts/context/lua/x-ldx.lua
@@ -0,0 +1,310 @@
+--[[ldx--
+<source>Lua Documentation Module</source>
+
+This file is part of the <logo label='context'/> documentation suite and
+itself serves as an example of using <logo label='lua'/> in combination
+with <logo label='tex'/>.
+
+I will rewrite this using lpeg once I have the time to study that nice new
+subsystem.
+--ldx]]--
+
+banner = "version 1.0.1 - 2007+ - PRAGMA ADE / CONTEXT"
+
+--[[
+This script needs a few libraries. Instead of merging the code here
+we can use
+
+<typing>
+mtxrun --internal x-ldx.lua
+</typing>
+
+That way, the libraries included in the runner will be used.
+]]--
+
+-- libraries l-string.lua l-table.lua l-io.lua l-file.lua
+
+-- begin library merge
+-- end library merge
+
+--[[
+Just a demo comment line. We will handle such multiline comments but
+only when they start and end at the beginning of a line. More rich
+comments are tagged differently.
+]]--
+
+--[[ldx--
+First we define a proper namespace for this module. The <q>l</q> stands for
+<logo label='lua'/>, the <q>d</q> for documentation and the <q>x</q> for
+<logo label='xml'/>.
+--ldx]]--
+
+if not ldx then ldx = { } end
+
+--[[ldx--
+We load the lua file into a table. The entries in this table themselves are
+tables and have keys like <t>code</t> and <t>comment</t>.
+--ldx]]--
+
+function ldx.load(filename)
+ local data = file.readdata(filename)
+ local expr = "%s*%-%-%[%[ldx%-*%s*(.-)%s*%-%-ldx%]%]%-*%s*"
+ local i, j, t = 0, 0, { }
+ while true do
+ local comment, ni
+ ni, j, comment = data:find(expr, j)
+ if not ni then break end
+ t[#t+1] = { code = data:sub(i, ni-1) }
+ t[#t+1] = { comment = comment }
+ i = j + 1
+ end
+ local str = data:sub(i, #data)
+ str = str:gsub("^%s*(.-)%s*$", "%1")
+ if #str > 0 then
+ t[#t+1] = { code = str }
+ end
+ return t
+end
+
+--[[ldx--
+We will tag keywords so that we can higlight them using a special font
+or color. Users can extend this list when needed.
+--ldx]]--
+
+ldx.keywords = { }
+
+--[[ldx--
+Here come the reserved words:
+--ldx]]--
+
+ldx.keywords.reserved = {
+ ["and"] = 1,
+ ["break"] = 1,
+ ["do"] = 1,
+ ["else"] = 1,
+ ["elseif"] = 1,
+ ["end"] = 1,
+ ["false"] = 1,
+ ["for"] = 1,
+ ["function"] = 1,
+ ["if"] = 1,
+ ["in"] = 1,
+ ["local"] = 1,
+ ["nil"] = 1,
+ ["not"] = 1,
+ ["or"] = 1,
+ ["repeat"] = 1,
+ ["return"] = 1,
+ ["then"] = 1,
+ ["true"] = 1,
+ ["until"] = 1,
+ ["while"] = 1
+}
+
+--[[ldx--
+We need to escape a few tokens. We keep the hash local to the
+definition but set it up only once, hence the <key>do</key>
+construction.
+--ldx]]--
+
+do
+ local e = { [">"] = "&gt;", ["<"] = "&lt;", ["&"] = "&amp;" }
+ function ldx.escape(str)
+ return str:gsub("([><&])",e)
+ end
+end
+
+--[[ldx--
+Enhancing the code is a bit tricky due to the fact that we have to
+deal with strings and escaped quotes within these strings. Before we
+mess around with the code, we hide the strings, and after that we
+insert them again. Single and double quoted strings are tagged so
+that we can use a different font to highlight them.
+--ldx]]--
+
+ldx.make_index = true
+
+function ldx.enhance(data)
+ local e = ldx.escape
+ for _,v in pairs(data) do
+ if v.code then
+ local dqs, sqs, com, cmt, cod = { }, { }, { }, { }, e(v.code)
+ cod = cod:gsub("%-%-%[%[.-%]%]%-%-", function(s)
+ cmt[#cmt+1] = s
+ return "[[[[".. #cmt .."]]]]"
+ end)
+ cod = cod:gsub("%-%-([^\n]*)", function(s)
+ com[#com+1] = s
+ return "[[".. #com .."]]"
+ end)
+--~ cod = cod:gsub('\\"', "<<>>")
+--~ cod = cod:gsub("\\'", "<>")
+ cod = cod:gsub("(%b\"\")", function(s)
+ dqs[#dqs+1] = s:sub(2,-2)
+ return "<<<<".. #dqs ..">>>>"
+ end)
+ cod = cod:gsub("(%b\'\')", function(s)
+ sqs[#sqs+1] = s:sub(2,-2)
+ return "<<".. #sqs ..">>"
+ end)
+ cod = cod:gsub("(%a+)",function(key)
+ local class = ldx.keywords.reserved[key]
+ if class then
+ return "<ldx:key class='" .. class .. "'>" .. key .. "</ldx:key>"
+ else
+ return key
+ end
+ end)
+ cod = cod:gsub("%[%[%[%[(%d+)%]%]%]%]", function(s)
+ return cmt[tonumber(s)]
+ end)
+ cod = cod:gsub("%[%[(%d+)%]%]", function(s)
+ return "<ldx:com>" .. com[tonumber(s)] .. "</ldx:com>"
+ end)
+ cod = cod:gsub("<<<<(%d+)>>>>", function(s)
+ return "<ldx:dqs>" .. dqs[tonumber(s)] .. "</ldx:dqs>"
+ end)
+ cod = cod:gsub("<<(%d+)>>", function(s)
+ return "<ldx:sqs>" .. sqs[tonumber(s)] .. "</ldx:sqs>"
+ end)
+--~ cod = cod:gsub("<<>>", "\\\"")
+--~ cod = cod:gsub("<>" , "\\\'")
+ if ldx.make_index then
+ local lines = cod:split("\n")
+ local f = "(<ldx:key class='1'>function</ldx:key>)%s+([%w%.]+)%s*%("
+ for k,v in pairs(lines) do
+ -- functies
+ v = v:gsub(f,function(key, str)
+ return "<ldx:function>" .. str .. "</ldx:function>("
+ end)
+ -- variables
+ v = v:gsub("^([%w][%w%,%s]-)(=[^=])",function(str, rest)
+ local t = string.split(str, ",%s*")
+ for k,v in pairs(t) do
+ t[k] = "<ldx:variable>" .. v .. "</ldx:variable>"
+ end
+ return table.join(t,", ") .. rest
+ end)
+ -- so far
+ lines[k] = v
+ end
+ v.code = table.concat(lines,"\n")
+ else
+ v.code = cod
+ end
+ end
+ end
+end
+
+--[[ldx--
+We're now ready to save the file in <logo label='xml'/> format. This boils
+down to wrapping the code and comment as well as the whole document. We tag
+lines in the code as such so that we don't need messy <t>CDATA</t> constructs
+and by calculating the indentation we also avoid space troubles. It also makes
+it possible to change the indentation afterwards.
+--ldx]]--
+
+function ldx.as_xml(data)
+ local t, cmode = { }, false
+ t[#t+1] = "<?xml version='1.0' standalone='yes'?>\n"
+ t[#t+1] = "\n<ldx:document>\n"
+ for _,v in pairs(data) do
+ if v.code and not v.code:is_empty() then
+ t[#t+1] = "\n<ldx:code>\n"
+ for k,v in pairs(v.code:split("\n")) do -- make this faster
+ local a, b = v:find("^(%s+)")
+ if a and b then
+ if cmode then
+ t[#t+1] = "<ldx:line comment='yes' n='" .. b .. "'>" .. v:sub(b+1,#v) .. "</ldx:line>\n"
+ else
+ t[#t+1] = "<ldx:line n='" .. b .. "'>" .. v:sub(b+1,#v) .. "</ldx:line>\n"
+ end
+ elseif v:is_empty() then
+ if cmode then
+ t[#t+1] = "<ldx:line comment='yes'/>\n"
+ else
+ t[#t+1] = "<ldx:line/>\n"
+ end
+ elseif v:find("^%-%-%[%[") then
+ t[#t+1] = "<ldx:line comment='yes'>" .. v .. "</ldx:line>\n"
+ cmode= true
+ elseif v:find("^%]%]%-%-") then
+ t[#t+1] = "<ldx:line comment='yes'>" .. v .. "</ldx:line>\n"
+ cmode= false
+ elseif cmode then
+ t[#t+1] = "<ldx:line comment='yes'>" .. v .. "</ldx:line>\n"
+ else
+ t[#t+1] = "<ldx:line>" .. v .. "</ldx:line>\n"
+ end
+ end
+ t[#t+1] = "</ldx:code>\n"
+ elseif v.comment then
+ t[#t+1] = "\n<ldx:comment>\n" .. v.comment .. "\n</ldx:comment>\n"
+ else
+ -- cannot happen
+ end
+ end
+ t[#t+1] = "\n</ldx:document>\n"
+ return table.concat(t,"")
+end
+
+--[[ldx--
+Saving the result is a trivial effort.
+--ldx]]--
+
+function ldx.save(filename,data)
+ file.savedata(filename,ldx.as_xml(data))
+end
+
+--[[ldx--
+The next function wraps it all in one call:
+--ldx]]--
+
+function ldx.convert(luaname,ldxname)
+ if not file.is_readable(luaname) then
+ luaname = luaname .. ".lua"
+ end
+ if file.is_readable(luaname) then
+ if not ldxname then
+ ldxname = file.replacesuffix(luaname,"ldx")
+ end
+ local data = ldx.load(luaname)
+ if data then
+ ldx.enhance(data)
+ if ldxname ~= luaname then
+ ldx.save(ldxname,data)
+ end
+ end
+ end
+end
+
+--[[ldx--
+This module can be used directly:
+
+<typing>
+mtxrun --internal x-ldx somefile.lua
+</typing>
+
+will produce an ldx file that can be processed with <logo label='context'/>
+by running:
+
+<typing>
+texexec --use=x-ldx --forcexml somefile.ldx
+</typing>
+
+You can do this in one step by saying:
+
+<typing>
+texmfstart texexec --ctx=x-ldx somefile.lua
+</typing>
+
+This will trigger <logo label='texexec'/> into loading the mentioned
+<logo label='ctx'/> file. That file describes the conversion as well
+as the module to be used.
+
+The main conversion call is:
+--ldx]]--
+
+if arg and arg[1] then
+ ldx.convert(arg[1],arg[2])
+end
diff --git a/scripts/context/ruby/base/merge.rb b/scripts/context/ruby/base/merge.rb
index ad4b9c9e6..a66b97e91 100644
--- a/scripts/context/ruby/base/merge.rb
+++ b/scripts/context/ruby/base/merge.rb
@@ -38,7 +38,7 @@ module SelfMerge
@@modules = $".collect do |file| File.expand_path(file) end
@@modules.delete_if do |file|
- file !~ /^#{@@ownpath}\/#{@@modroot}.*$/
+ file !~ /^#{@@ownpath}\/#{@@modroot}.*$/i
end
def SelfMerge::ok?
diff --git a/scripts/context/ruby/ctxtools.rb b/scripts/context/ruby/ctxtools.rb
index 85b079ee1..724f5593f 100644
--- a/scripts/context/ruby/ctxtools.rb
+++ b/scripts/context/ruby/ctxtools.rb
@@ -334,7 +334,7 @@ class Commands
report("generating #{keyfile}")
begin
- one = "texexec --make --alone --all #{interface}"
+ one = "texexec --make --all #{interface}"
two = "texexec --batch --silent --interface=#{interface} x-set-01"
if @commandline.option("force") then
system(one)
@@ -1639,23 +1639,22 @@ class Commands
def dpxmapfiles
- force = @commandline.option("force")
+ force = @commandline.option("force")
texmfroot = @commandline.argument('first')
texmfroot = '.' if texmfroot.empty?
- if @commandline.option('maproot') then
+ if @commandline.option('maproot') != "" then
maproot = @commandline.option('maproot')
else
maproot = "#{texmfroot.gsub(/\\/,'/')}/fonts/map/pdftex/context"
end
-
if File.directory?(maproot) then
files = Dir.glob("#{maproot}/*.map")
if files.size > 0 then
files.each do |pdffile|
next if File.basename(pdffile) == 'pdftex.map'
pdffile = File.expand_path(pdffile)
- dpxfile = File.expand_path(pdffile.sub(/pdftex/i,'dvipdfm'))
+ dpxfile = File.expand_path(pdffile.sub(/(dvips|pdftex)/i,'dvipdfm'))
unless pdffile == dpxfile then
begin
if data = File.read(pdffile) then
@@ -2654,7 +2653,13 @@ class Commands
end
def remakeformats
- return system("texmfstart texexec --make --all")
+ return system("mktexlsr")
+ return system("luatools --selfupdate")
+ return system("mtxrun --selfupdate")
+ return system("luatools --generate")
+ return system("texmfstart texexec --make --all --fast --pdftex")
+ return system("texmfstart texexec --make --all --fast --luatex")
+ return system("texmfstart texexec --make --all --fast --xetex")
end
if localtree = locatedlocaltree then
diff --git a/scripts/context/ruby/mtxtools.rb b/scripts/context/ruby/mtxtools.rb
new file mode 100644
index 000000000..41d0f7085
--- /dev/null
+++ b/scripts/context/ruby/mtxtools.rb
@@ -0,0 +1,475 @@
+#!/usr/bin/env ruby
+
+# program : mtxtools
+# copyright : PRAGMA Advanced Document Engineering
+# version : 2004-2005
+# author : Hans Hagen
+#
+# info : j.hagen@xs4all.nl
+# www : www.pragma-ade.com
+
+# This script hosts MetaTeX related features.
+
+banner = ['MtxTools', 'version 1.0.0', '2006', 'PRAGMA ADE/POD']
+
+$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!
+
+require 'base/switch'
+require 'base/logger'
+require 'base/system'
+require 'base/kpse'
+
+class Reporter
+ def report(str)
+ puts(str)
+ end
+end
+
+module ConTeXt
+
+ def ConTeXt::banner(filename,companionname,compact=false)
+ "-- filename : #{File.basename(filename)}\n" +
+ "-- comment : companion to #{File.basename(companionname)} (in ConTeXt)\n" +
+ "-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL\n" +
+ "-- copyright: PRAGMA ADE / ConTeXt Development Team\n" +
+ "-- license : see context related readme files\n" +
+ if compact then "\n-- remark : compact version\n" else "" end
+ end
+
+end
+
+class UnicodeTables
+
+ @@version = "1.001"
+
+ @@shape_a = /^((GREEK|LATIN|HEBREW)\s*(SMALL|CAPITAL|)\s*LETTER\s*[A-Z]+)$/
+ @@shape_b = /^((GREEK|LATIN|HEBREW)\s*(SMALL|CAPITAL|)\s*LETTER\s*[A-Z]+)\s*(.+)$/
+
+ @@shape_a = /^(.*\s*LETTER\s*[A-Z]+)$/
+ @@shape_b = /^(.*\s*LETTER\s*[A-Z]+)\s+WITH\s+(.+)$/
+
+ attr_accessor :context, :comment
+
+ def initialize(logger=Reporter.new)
+ @data = Array.new
+ @logger = logger
+ @error = false
+ @context = true
+ @comment = true
+ @shapes = Hash.new
+ end
+
+ def load_unicode_data(filename='unicodedata.txt')
+ # beware, the unicodedata table is bugged, sometimes ending
+ @logger.report("reading base data from #{filename}") if @logger
+ begin
+ IO.readlines(filename).each do |line|
+ if line =~ /^[0-9A-F]{4,4}/ then
+ d = line.chomp.sub(/\;$/, '').split(';')
+ if d then
+ while d.size < 15 do d << '' end
+ n = d[0].hex
+ @data[n] = d
+ if d[1] =~ @@shape_a then
+ @shapes[$1] = d[0]
+ end
+ end
+ end
+ end
+ rescue
+ @error = true
+ @logger.report("error while reading base data from #{filename}") if @logger
+ end
+ end
+
+ def load_context_data(filename='contextnames.txt')
+ @logger.report("reading data from #{filename}") if @logger
+ begin
+ IO.readlines(filename).each do |line|
+ if line =~ /^[0-9A-F]{4,4}/ then
+ d = line.chomp.split(';')
+ if d then
+ n = d[0].hex
+ if @data[n] then
+ @data[d[0].hex] << d[1] # adobename == 15
+ @data[d[0].hex] << d[2] # contextname == 16
+ else
+ @logger.report("missing information about #{d} in #{filename}") if @logger
+ end
+ end
+ end
+ end
+ rescue
+ @error = true
+ @logger.report("error while reading context data from #{filename}") if @logger
+ end
+ end
+
+ def save_metatex_data(filename='char-def.lua',compact=false)
+ if not @error then
+ begin
+ File.open(filename,'w') do |f|
+ @logger.report("saving data in #{filename}") if @logger
+ f << ConTeXt::banner(filename,'char-def.tex',compact)
+ f << "\n"
+ f << "\nif not versions then versions = { } end versions['#{filename.gsub(/\..*?$/,'')}'] = #{@@version}\n"
+ f << "\n"
+ f << "if not characters then characters = { } end\n"
+ f << "if not characters.data then characters.data = { } end\n"
+ f << "\n"
+ f << "characters.data = {\n" if compact
+ @data.each do |d|
+ if d then
+ r = metatex_data(d)
+ if compact then
+ f << "\t" << "[0x#{d[0]}]".rjust(8,' ') << " = { #{r.join(", ").gsub(/\t/,'')} }, \n"
+ else
+ f << "characters.define { -- #{d[0].hex}" << "\n"
+ f << r.join(",\n") << "\n"
+ f << "}" << "\n"
+ end
+ end
+ end
+ f << "}\n" if compact
+ end
+ rescue
+ @logger.report("error while saving data in #{filename}") if @logger
+ else
+ @logger.report("#{@data.size} (#{sprintf('%X',@data.size)}) entries saved in #{filename}") if @logger
+ end
+ else
+ @logger.report("not saving data in #{filename} due to previous error") if @logger
+ end
+ end
+
+ def metatex_data(d)
+ r = Array.new
+ r << "\tunicodeslot=0x#{d[0]}"
+ if d[2] && ! d[2].empty? then
+ r << "\tcategory='#{d[2].downcase}'"
+ end
+ if @context then
+ if d[15] && ! d[15].empty? then
+ r << "\tadobename='#{d[15]}'"
+ end
+ if d[16] && ! d[16].empty? then
+ r << "\tcontextname='#{d[16]}'"
+ end
+ end
+ if @comment then
+ if d[1] == "<control>" then
+ r << "\tdescription='#{d[10]}'" unless d[10].empty?
+ else
+ r << "\tdescription='#{d[1]}'" unless d[1].empty?
+ end
+ end
+ if d[1] =~ @@shape_b then
+ r << "\tshcode=0x#{@shapes[$1]}" if @shapes[$1]
+ end
+ if d[12] && ! d[12].empty? then
+ r << "\tuccode=0x#{d[12]}"
+ elsif d[14] && ! d[14].empty? then
+ r << "\tuccode=0x#{d[14]}"
+ end
+ if d[13] && ! d[13].empty? then
+ r << "\tlccode=0x#{d[13]}"
+ end
+ if d[5] && ! d[5].empty? then
+ special, specials = '', Array.new
+ c = d[5].split(/\s+/).collect do |cc|
+ if cc =~ /^\<(.*)\>$/io then
+ special = $1.downcase
+ else
+ specials << "0x#{cc}"
+ end
+ end
+ if specials.size > 0 then
+ special = 'char' if special.empty?
+ r << "\tspecials={'#{special}',#{specials.join(',')}}"
+ end
+ end
+ return r
+ end
+
+ def save_xetex_data(filename='enco-utf.tex')
+ if not @error then
+ begin
+ minnumber, maxnumber, n = 0x001F, 0xFFFF, 0
+ File.open(filename,'w') do |f|
+ @logger.report("saving data in #{filename}") if @logger
+ f << "% filename : #{filename}\n"
+ f << "% comment : poor man's alternative for a proper enco file\n"
+ f << "% this file is generated by mtxtools and can be\n"
+ f << "% used in xetex and luatex mkii mode\n"
+ f << "% author : Hans Hagen, PRAGMA-ADE, Hasselt NL\n"
+ f << "% copyright: PRAGMA ADE / ConTeXt Development Team\n"
+ f << "% license : see context related readme files\n"
+ f << "\n"
+ f << "\\ifx\\setcclcucx\\undefined\n"
+ f << "\n"
+ f << " \\def\\setcclcucx #1 #2 #3 %\n"
+ f << " {\\global\\catcode\"#1=11 \n"
+ f << " \\global\\lccode \"#1=\"#2 \n"
+ f << " \\global\\uccode \"#1=\"#3 }\n"
+ f << "\n"
+ f << "\\fi\n"
+ f << "\n"
+ @data.each do |d|
+ if d then
+ number, type = d[0], d[2].downcase
+ if number.hex >= minnumber && number.hex <= maxnumber && type =~ /^l(l|u|t)$/o then
+ if d[13] && ! d[13].empty? then
+ lc = d[13]
+ else
+ lc = number
+ end
+ if d[12] && ! d[12].empty? then
+ uc = d[12]
+ elsif d[14] && ! d[14].empty? then
+ uc = d[14]
+ else
+ uc = number
+ end
+ if @comment then
+ f << "\\setcclcuc #{number} #{lc} #{uc} % #{d[1]}\n"
+ else
+ f << "\\setcclcuc #{number} #{lc} #{uc} \n"
+ end
+ n += 1
+ end
+ end
+ end
+ f << "\n"
+ f << "\\endinput\n"
+ end
+ rescue
+ @logger.report("error while saving data in #{filename}") if @logger
+ else
+ @logger.report("#{n} entries saved in #{filename}") if @logger
+ end
+ else
+ @logger.report("not saving data in #{filename} due to previous error") if @logger
+ end
+ end
+
+end
+
+class RegimeTables
+
+ @@version = "1.001"
+
+ def initialize(logger=Reporter.new)
+ @logger = logger
+ reset
+ end
+
+ def reset
+ @code, @regime, @filename, @loaded = Array.new(256), '', '', false
+ (32..127).each do |i|
+ @code[i] = [sprintf('%04X',i), i.chr]
+ end
+ end
+
+ def load(filename)
+ begin
+ reset
+ if filename =~ /regi\-(ini|run|uni|utf|syn)/ then
+ report("skipping #{filename}")
+ else
+ report("loading file #{filename}")
+ @regime, unicodeset = File.basename(filename).sub(/\..*?$/,''), false
+ IO.readlines(filename).each do |line|
+ case line
+ when /^\#/ then
+ # skip
+ when /^(0x[0-9A-F]+)\s+(0x[0-9A-F]+)\s+\#\s+(.*)$/ then
+ @code[$1.hex], unicodeset = [$2, $3], true
+ when /^(0x[0-9A-F]+)\s+(0x[0-9A-F]+)\s+/ then
+ @code[$1.hex], unicodeset = [$2, ''], true
+ end
+ end
+ reset if not unicodeset
+ end
+ rescue
+ report("problem in loading file #{filename}")
+ reset
+ else
+ if ! @regime.empty? then
+ @loaded = true
+ else
+ reset
+ end
+ end
+ end
+
+ def save(filename,compact=false)
+ begin
+ if @loaded && ! @regime.empty? then
+ if File.expand_path(filename) == File.expand_path(@filename) then
+ report("saving in #{filename} is blocked")
+ else
+ report("saving file #{filename}")
+ File.open(filename,'w') do |f|
+ f << ConTeXt::banner(filename,'regi-ini.tex',compact)
+ f << "\n"
+ f << "\nif not versions then versions = { } end versions['#{filename.gsub(/\..*?$/,'')}'] = #{@@version}\n"
+ f << "\n"
+ f << "if not regimes then regimes = { } end\n"
+ f << "if not regimes.data then regimes.data = { } end\n"
+ f << "\n"
+ if compact then
+ f << "regimes.data[\"#{@regime}\"] = { [0] = \n\t"
+ i = 17
+ @code.each_index do |c|
+ if (i-=1) == 0 then
+ i = 16
+ f << "\n\t"
+ end
+ if @code[c] then
+ f << @code[c][0].rjust(6,' ')
+ else
+ f << "0x0000".rjust(6,' ')
+ end
+ f << ', ' if c<@code.length-1
+ end
+ f << "\n}\n"
+ else
+ @code.each_index do |c|
+ if @code[c] then
+ f << someregimeslot(@regime,c,@code[c][0],@code[c][1])
+ else
+ f << someregimeslot(@regime,c,'','')
+ end
+ end
+ end
+ end
+ end
+ end
+ rescue
+ report("problem in saving file #{filename} #{$!}")
+ end
+ end
+
+ def report(str)
+ @logger.report(str)
+ end
+
+ private
+
+ def someregimeslot(regime,slot,unicodeslot,comment)
+ "regimes.define { #{if comment.empty? then '' else '-- ' end} #{comment}\n" +
+ "\tregime='#{regime}',\n" +
+ "\tslot='#{sprintf('0x%02X',slot)}',\n" +
+ "\tunicodeslot='#{if unicodeslot.empty? then '0x0000' else unicodeslot end}'\n" +
+ "}\n"
+ end
+
+ public
+
+ def RegimeTables::convert(filenames,compact=false)
+ filenames.each do |filename|
+ txtfile = File.expand_path(filename)
+ luafile = File.join(File.dirname(txtfile),'regi-'+File.basename(txtfile.sub(/\..*?$/, '.lua')))
+ unless txtfile == luafile then
+ regime = RegimeTables.new
+ regime.load(txtfile)
+ regime.save(luafile,compact)
+ end
+ end
+ end
+
+end
+
+class Commands
+
+ include CommandBase
+
+ def unicodetable
+ unicode = UnicodeTables.new(logger)
+ unicode.load_unicode_data
+ unicode.load_context_data
+ unicode.save_metatex_data('char-def.lua',@commandline.option('compact'))
+ end
+
+ def xetextable
+ unicode = UnicodeTables.new(logger)
+ unicode.load_unicode_data
+ unicode.load_context_data
+ # unicode.comment = false
+ unicode.save_xetex_data
+ end
+
+ def regimetable
+ if @commandline.arguments.length > 0 then
+ RegimeTables::convert(@commandline.arguments, @commandline.option('compact'))
+ else
+ RegimeTables::convert(Dir.glob("cp*.txt") , @commandline.option('compact'))
+ RegimeTables::convert(Dir.glob("8859*.txt") , @commandline.option('compact'))
+ end
+ end
+
+ def pdftextable
+ # instead of directly saving the data, we use luatex (kind of test)
+ pdfrdef = 'pdfr-def.tex'
+ tmpfile = 'mtxtools.tmp'
+ File.delete(pdfrdef) rescue false
+ if f = File.open(tmpfile,'w') then
+ f << "\\starttext\n"
+ f << "\\ctxlua{characters.pdftex.make_pdf_to_unicodetable('#{pdfrdef}')}\n"
+ f << "\\stoptext\n"
+ f.close()
+ system("texmfstart texexec --luatex --once --purge mtxtools.tmp")
+ report("vecor saved in #{pdfrdef}")
+ end
+ File.delete(tmpfile) rescue false
+ end
+
+ def xmlmapfile
+ # instead of directly saving the data, we use luatex (kind of test)
+ tmpfile = 'mtxtools.tmp'
+ xmlsuffix = 'frx'
+ @commandline.arguments.each do |mapname|
+ if f = File.open(tmpfile,'w') then
+ xmlname = mapname.gsub(/\.map$/,".#{xmlsuffix}")
+ File.delete(xmlname) rescue false
+ f << "\\starttext\n"
+ f << "\\ctxlua{\n"
+ f << " mapname = input.find_file(texmf.instance,'#{mapname}') or ''\n"
+ f << " xmlname = '#{xmlname}'\n"
+ f << " if mapname and not mapname:is_empty() then\n"
+ f << " ctx.fonts.map.convert_file(mapname,xmlname)\n"
+ f << " end\n"
+ f << "}\n"
+ f << "\\stoptext\n"
+ f.close()
+ system("texmfstart texexec --luatex --once --purge mtxtools.tmp")
+ if FileTest.file?(xmlname) then
+ report("map file #{mapname} converted to #{xmlname}")
+ else
+ report("no valid map file #{mapname}")
+ end
+ end
+ end
+ File.delete(tmpfile) rescue false
+ end
+
+end
+
+logger = Logger.new(banner.shift)
+commandline = CommandLine.new
+
+commandline.registeraction('unicodetable', 'create unicode table for metatex/luatex')
+commandline.registeraction('regimetable' , 'create regime table(s) for metatex/luatex [--compact]')
+commandline.registeraction('xetextable' , 'create unicode table for xetex')
+commandline.registeraction('pdftextable' , 'create unicode table for xetex')
+commandline.registeraction('xmlmapfile' , 'convert traditional mapfile to xml font resourse')
+
+# general
+
+commandline.registeraction('help')
+commandline.registeraction('version')
+commandline.registerflag('compact')
+
+commandline.expand
+
+Commands.new(commandline,logger,banner).send(commandline.action || 'help')
diff --git a/scripts/context/ruby/texmfstart.rb b/scripts/context/ruby/texmfstart.rb
index 4273de7bc..02d17d8f8 100644
--- a/scripts/context/ruby/texmfstart.rb
+++ b/scripts/context/ruby/texmfstart.rb
@@ -36,6 +36,8 @@ $: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.u
require "rbconfig"
require "md5"
+# funny, selfmergs was suddenly broken to case problems
+
# kpse_merge_done: require 'base/kpseremote'
# kpse_merge_done: require 'base/kpsedirect'
# kpse_merge_done: require 'base/kpsefast'
@@ -43,127 +45,7 @@ require "md5"
# kpse_merge_start
-# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpseremote.rb'
-
-# kpse_merge_done: require 'base/kpsefast'
-
-case ENV['KPSEMETHOD']
- when /soap/o then # kpse_merge_done: require 'base/kpse/soap'
- when /drb/o then # kpse_merge_done: require 'base/kpse/drb'
- else # kpse_merge_done: require 'base/kpse/drb'
-end
-
-class KpseRemote
-
- @@port = ENV['KPSEPORT'] || 7000
- @@method = ENV['KPSEMETHOD'] || 'drb'
-
- def KpseRemote::available?
- @@method && @@port
- end
-
- def KpseRemote::start_server(port=nil)
- kpse = KpseServer.new(port || @@port)
- kpse.start
- end
-
- def KpseRemote::start_client(port=nil) # keeps object in server
- kpseclient = KpseClient.new(port || @@port)
- kpseclient.start
- kpse = kpseclient.object
- tree = kpse.choose(KpseUtil::identify, KpseUtil::environment)
- [kpse, tree]
- end
-
- def KpseRemote::fetch(port=nil) # no need for defining methods but slower, send whole object
- kpseclient = KpseClient.new(port || @@port)
- kpseclient.start
- kpseclient.object.fetch(KpseUtil::identify, KpseUtil::environment) rescue nil
- end
-
- def initialize(port=nil)
- if KpseRemote::available? then
- begin
- @kpse, @tree = KpseRemote::start_client(port)
- rescue
- @kpse, @tree = nil, nil
- end
- else
- @kpse, @tree = nil, nil
- end
- end
-
- def progname=(value)
- @kpse.set(@tree,'progname',value)
- end
- def format=(value)
- @kpse.set(@tree,'format',value)
- end
- def engine=(value)
- @kpse.set(@tree,'engine',value)
- end
-
- def progname
- @kpse.get(@tree,'progname')
- end
- def format
- @kpse.get(@tree,'format')
- end
- def engine
- @kpse.get(@tree,'engine')
- end
-
- def load
- @kpse.load(KpseUtil::identify, KpseUtil::environment)
- end
- def okay?
- @kpse && @tree
- end
- def set(key,value)
- @kpse.set(@tree,key,value)
- end
- def load_cnf
- @kpse.load_cnf(@tree)
- end
- def load_lsr
- @kpse.load_lsr(@tree)
- end
- def expand_variables
- @kpse.expand_variables(@tree)
- end
- def expand_braces(str)
- clean_name(@kpse.expand_braces(@tree,str))
- end
- def expand_path(str)
- clean_name(@kpse.expand_path(@tree,str))
- end
- def expand_var(str)
- clean_name(@kpse.expand_var(@tree,str))
- end
- def show_path(str)
- clean_name(@kpse.show_path(@tree,str))
- end
- def var_value(str)
- clean_name(@kpse.var_value(@tree,str))
- end
- def find_file(filename)
- clean_name(@kpse.find_file(@tree,filename))
- end
- def find_files(filename,first=false)
- # dodo: each filename
- @kpse.find_files(@tree,filename,first)
- end
-
- private
-
- def clean_name(str)
- str.gsub(/\\/,'/')
- end
-
-end
-
-
-# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpsefast.rb'
+# kpse_merge_file: 't:/ruby/base/kpsefast.rb'
# module : base/kpsefast
# copyright : PRAGMA Advanced Document Engineering
@@ -1097,67 +979,7 @@ end
-# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpse/drb.rb'
-
-require 'drb'
-# kpse_merge_done: require 'base/kpse/trees'
-
-class KpseServer
-
- attr_accessor :port
-
- def initialize(port=7000)
- @port = port
- end
-
- def start
- puts "starting drb service at port #{@port}"
- DRb.start_service("druby://localhost:#{@port}", KpseTrees.new)
- trap(:INT) do
- DRb.stop_service
- end
- DRb.thread.join
- end
-
- def stop
- # todo
- end
-
-end
-
-class KpseClient
-
- attr_accessor :port
-
- def initialize(port=7000)
- @port = port
- @kpse = nil
- end
-
- def start
- # only needed when callbacks are used / slow, due to Socket::getaddrinfo
- # DRb.start_service
- end
-
- def object
- @kpse = DRbObject.new(nil,"druby://localhost:#{@port}")
- end
-
-end
-
-
-# SERVER_URI="druby://localhost:8787"
-#
-# # Start a local DRbServer to handle callbacks.
-# #
-# # Not necessary for this small example, but will be required
-# # as soon as we pass a non-marshallable object as an argument
-# # to a dRuby call.
-# DRb.start_service
-#
-
-
-# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpse/trees.rb'
+# kpse_merge_file: 't:/ruby/base/kpse/trees.rb'
require 'monitor'
# kpse_merge_done: require 'base/kpsefast'
@@ -1245,179 +1067,219 @@ class KpseTrees < Monitor
end
-# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpsedirect.rb'
+# kpse_merge_file: 't:/ruby/base/kpse/drb.rb'
-class KpseDirect
+require 'drb'
+# kpse_merge_done: require 'base/kpse/trees'
- attr_accessor :progname, :format, :engine
+class KpseServer
- def initialize
- @progname, @format, @engine = '', '', ''
- end
+ attr_accessor :port
- def expand_path(str)
- clean_name(`kpsewhich -expand-path=#{str}`.chomp)
+ def initialize(port=7000)
+ @port = port
end
- def expand_var(str)
- clean_name(`kpsewhich -expand-var=#{str}`.chomp)
+ def start
+ puts "starting drb service at port #{@port}"
+ DRb.start_service("druby://localhost:#{@port}", KpseTrees.new)
+ trap(:INT) do
+ DRb.stop_service
+ end
+ DRb.thread.join
end
- def find_file(str)
- clean_name(`kpsewhich #{_progname_} #{_format_} #{str}`.chomp)
+ def stop
+ # todo
end
- def _progname_
- if @progname.empty? then '' else "-progname=#{@progname}" end
- end
- def _format_
- if @format.empty? then '' else "-format=\"#{@format}\"" end
+end
+
+class KpseClient
+
+ attr_accessor :port
+
+ def initialize(port=7000)
+ @port = port
+ @kpse = nil
end
- private
+ def start
+ # only needed when callbacks are used / slow, due to Socket::getaddrinfo
+ # DRb.start_service
+ end
- def clean_name(str)
- str.gsub(/\\/,'/')
+ def object
+ @kpse = DRbObject.new(nil,"druby://localhost:#{@port}")
end
end
-# kpse_merge_file: 'c:/data/develop/context/ruby/base/merge.rb'
-
-# module : base/merge
-# copyright : PRAGMA Advanced Document Engineering
-# version : 2006
-# author : Hans Hagen
+# SERVER_URI="druby://localhost:8787"
+#
+# # Start a local DRbServer to handle callbacks.
+# #
+# # Not necessary for this small example, but will be required
+# # as soon as we pass a non-marshallable object as an argument
+# # to a dRuby call.
+# DRb.start_service
#
-# project : ConTeXt / eXaMpLe
-# concept : Hans Hagen
-# info : j.hagen@xs4all.nl
-# this module will package all the used modules in the file itself
-# so that we can relocate the file at wish, usage:
-#
-# merge:
-#
-# unless SelfMerge::ok? && SelfMerge::merge then
-# puts("merging should happen on the path were the base inserts reside")
-# end
-#
-# cleanup:
-#
-# unless SelfMerge::cleanup then
-# puts("merging should happen on the path were the base inserts reside")
+# kpse_merge_file: 't:/ruby/base/kpseremote.rb'
-module SelfMerge
+# kpse_merge_done: require 'base/kpsefast'
- @@kpsemergestart = "\# kpse_merge_start"
- @@kpsemergestop = "\# kpse_merge_stop"
- @@kpsemergefile = "\# kpse_merge_file: "
- @@kpsemergedone = "\# kpse_merge_done: "
+case ENV['KPSEMETHOD']
+ when /soap/o then # kpse_merge_done: require 'base/kpse/soap'
+ when /drb/o then # kpse_merge_done: require 'base/kpse/drb'
+ else # kpse_merge_done: require 'base/kpse/drb'
+end
- @@filename = File.basename($0)
- @@ownpath = File.expand_path(File.dirname($0))
- @@modroot = '(base|graphics|rslb|www)' # needed in regex in order not to mess up SelfMerge
- @@modules = $".collect do |file| File.expand_path(file) end
+class KpseRemote
- @@modules.delete_if do |file|
- file !~ /^#{@@ownpath}\/#{@@modroot}.*$/
+ @@port = ENV['KPSEPORT'] || 7000
+ @@method = ENV['KPSEMETHOD'] || 'drb'
+
+ def KpseRemote::available?
+ @@method && @@port
end
- def SelfMerge::ok?
- begin
- @@modules.each do |file|
- return false unless FileTest.file?(file)
- end
- rescue
- return false
- else
- return true
- end
+ def KpseRemote::start_server(port=nil)
+ kpse = KpseServer.new(port || @@port)
+ kpse.start
end
- def SelfMerge::merge
- begin
- if SelfMerge::ok? && rbfile = IO.read(@@filename) then
- begin
- inserts = "#{@@kpsemergestart}\n\n"
- @@modules.each do |file|
- inserts << "#{@@kpsemergefile}'#{file}'\n\n"
- inserts << IO.read(file).gsub(/^#.*?\n$/,'')
- inserts << "\n\n"
- end
- inserts << "#{@@kpsemergestop}\n\n"
- # no gsub! else we end up in SelfMerge
- rbfile.sub!(/#{@@kpsemergestart}\s*#{@@kpsemergestop}/moi) do
- inserts
- end
- rbfile.gsub!(/^(.*)(require [\"\'].*?#{@@modroot}.*)$/) do
- pre, post = $1, $2
- if pre =~ /#{@@kpsemergedone}/ then
- "#{pre}#{post}"
- else
- "#{pre}#{@@kpsemergedone}#{post}"
- end
- end
- rescue
- return false
- else
- begin
- File.open(@@filename,'w') do |f|
- f << rbfile
- end
- rescue
- return false
- end
- end
- end
- rescue
- return false
- else
- return true
- end
+ def KpseRemote::start_client(port=nil) # keeps object in server
+ kpseclient = KpseClient.new(port || @@port)
+ kpseclient.start
+ kpse = kpseclient.object
+ tree = kpse.choose(KpseUtil::identify, KpseUtil::environment)
+ [kpse, tree]
end
- def SelfMerge::cleanup
- begin
- if rbfile = IO.read(@@filename) then
- begin
- rbfile.sub!(/#{@@kpsemergestart}(.*)#{@@kpsemergestop}\s*/moi) do
- "#{@@kpsemergestart}\n\n#{@@kpsemergestop}\n\n"
- end
- rbfile.gsub!(/^(.*#{@@kpsemergedone}.*)$/) do
- str = $1
- if str =~ /require [\"\']/ then
- str.gsub(/#{@@kpsemergedone}/, '')
- else
- str
- end
- end
- rescue
- return false
- else
- begin
- File.open(@@filename,'w') do |f|
- f << rbfile
- end
- rescue
- return false
- end
- end
+ def KpseRemote::fetch(port=nil) # no need for defining methods but slower, send whole object
+ kpseclient = KpseClient.new(port || @@port)
+ kpseclient.start
+ kpseclient.object.fetch(KpseUtil::identify, KpseUtil::environment) rescue nil
+ end
+
+ def initialize(port=nil)
+ if KpseRemote::available? then
+ begin
+ @kpse, @tree = KpseRemote::start_client(port)
+ rescue
+ @kpse, @tree = nil, nil
end
- rescue
- return false
else
- return true
+ @kpse, @tree = nil, nil
end
end
- def SelfMerge::replace
- if SelfMerge::ok? then
- SelfMerge::cleanup
- SelfMerge::merge
- end
+ def progname=(value)
+ @kpse.set(@tree,'progname',value)
+ end
+ def format=(value)
+ @kpse.set(@tree,'format',value)
+ end
+ def engine=(value)
+ @kpse.set(@tree,'engine',value)
+ end
+
+ def progname
+ @kpse.get(@tree,'progname')
+ end
+ def format
+ @kpse.get(@tree,'format')
+ end
+ def engine
+ @kpse.get(@tree,'engine')
+ end
+
+ def load
+ @kpse.load(KpseUtil::identify, KpseUtil::environment)
+ end
+ def okay?
+ @kpse && @tree
+ end
+ def set(key,value)
+ @kpse.set(@tree,key,value)
+ end
+ def load_cnf
+ @kpse.load_cnf(@tree)
+ end
+ def load_lsr
+ @kpse.load_lsr(@tree)
+ end
+ def expand_variables
+ @kpse.expand_variables(@tree)
+ end
+ def expand_braces(str)
+ clean_name(@kpse.expand_braces(@tree,str))
+ end
+ def expand_path(str)
+ clean_name(@kpse.expand_path(@tree,str))
+ end
+ def expand_var(str)
+ clean_name(@kpse.expand_var(@tree,str))
+ end
+ def show_path(str)
+ clean_name(@kpse.show_path(@tree,str))
+ end
+ def var_value(str)
+ clean_name(@kpse.var_value(@tree,str))
+ end
+ def find_file(filename)
+ clean_name(@kpse.find_file(@tree,filename))
+ end
+ def find_files(filename,first=false)
+ # dodo: each filename
+ @kpse.find_files(@tree,filename,first)
+ end
+
+ private
+
+ def clean_name(str)
+ str.gsub(/\\/,'/')
+ end
+
+end
+
+
+# kpse_merge_file: 't:/ruby/base/kpsedirect.rb'
+
+class KpseDirect
+
+ attr_accessor :progname, :format, :engine
+
+ def initialize
+ @progname, @format, @engine = '', '', ''
+ end
+
+ def expand_path(str)
+ clean_name(`kpsewhich -expand-path=#{str}`.chomp)
+ end
+
+ def expand_var(str)
+ clean_name(`kpsewhich -expand-var=#{str}`.chomp)
+ end
+
+ def find_file(str)
+ clean_name(`kpsewhich #{_progname_} #{_format_} #{str}`.chomp)
+ end
+
+ def _progname_
+ if @progname.empty? then '' else "-progname=#{@progname}" end
+ end
+ def _format_
+ if @format.empty? then '' else "-format=\"#{@format}\"" end
+ end
+
+ private
+
+ def clean_name(str)
+ str.gsub(/\\/,'/')
end
end
@@ -2468,7 +2330,7 @@ def show_environment
end
end
-def execute(arguments)
+def execute(arguments) # br global
arguments = arguments.split(/\s+/) if arguments.class == String
$directives = hashed(arguments)
diff --git a/tex/context/base/attr-ini.lua b/tex/context/base/attr-ini.lua
new file mode 100644
index 000000000..4469608c4
--- /dev/null
+++ b/tex/context/base/attr-ini.lua
@@ -0,0 +1,669 @@
+if not modules then modules = { } end modules ['attr-ini'] = {
+ version = 1.001,
+ comment = "companion to attr-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--
+-- attributes
+--
+
+nodes = nodes or { }
+
+-- We can distinguish between rules and glyphs but it's not worth the trouble. A
+-- first implementation did that and while it saves a bit for glyphs and rules, it
+-- costs more resourses for transparencies. So why bother.
+
+-- namespace for all those features / plural becomes singular
+
+-- i will do the resource stuff later, when we have an interface to pdf (ok, i can
+-- fake it with tokens but it will take some coding
+
+function totokens(str)
+ local t = { }
+ for c in string.bytes(str) do
+ t[#t+1] = { 12, c }
+ end
+ return t
+end
+
+function pdfliteral(str)
+ local t = node.new('whatsit',8)
+ t.mode = 1 -- direct
+ t.data = str -- totokens(str)
+ return t
+end
+
+-- shipouts
+
+shipouts = shipouts or { }
+shipouts.plugins = shipouts.plugins or { }
+
+do
+
+ local hlist, vlist = node.id('hlist'), node.id('vlist')
+
+ local function do_process_page(attribute,processor,head) -- maybe work with ranges
+ local previous, stack = nil, head
+ while stack do
+ local id = stack.id
+ if id == hlist or id == vlist then
+ local content = stack.list
+ if content then
+ stack.list = do_process_page(attribute,processor,content)
+ end
+ else
+ stack, previous, head = processor(attribute,stack,previous,head)
+ end
+ previous = stack
+ stack = stack.next
+ end
+ return head
+ end
+
+ function nodes.process_page(head)
+ if head then
+ input.start_timing(nodes)
+ local done, used = false, { }
+ for name, plugin in pairs(shipouts.plugins) do
+ local attribute = attributes.numbers[name]
+ if attribute then
+ local initializer = plugin.initializer
+ local processor = plugin.processor
+ local finalizer = plugin.finalizer
+ if initializer then
+ initializer(attribute,head)
+ end
+ if processor then
+ head = do_process_page(attribute,processor,head)
+ end
+ if finalizer then
+ local ok
+ ok, head, used[attribute] = finalizer(attribute,head)
+ done = done or ok
+ end
+ else
+ texio.write_nl(string.format("undefined attribute %s",name))
+ end
+ end
+ if done then
+ for name, plugin in pairs(shipouts.plugins) do
+ local attribute = attributes.numbers[name]
+ if used[attribute] then
+ local flusher = plugin.flusher
+ if flusher then
+ head = flusher(attribute,head,used[attribute])
+ end
+ end
+ end
+ end
+ input.stop_timing(nodes)
+ end
+ return head
+ end
+
+end
+
+--
+-- attributes
+--
+
+attributes = attributes or { }
+
+attributes.names = attributes.names or { }
+attributes.numbers = attributes.numbers or { }
+attributes.list = attributes.list or { }
+
+input.storage.register(false,"attributes/names", attributes.names, "attributes.names")
+input.storage.register(false,"attributes/numbers", attributes.numbers, "attributes.numbers")
+input.storage.register(false,"attributes/list", attributes.list, "attributes.list")
+
+function attributes.define(name,number)
+ attributes.numbers[name], attributes.names[number], attributes.list[number] = number, name, { }
+end
+
+--
+-- generic handlers
+--
+
+states = { }
+
+do
+
+ local glyph, rule, whatsit = node.id('glyph'), node.id('rule'), node.id('whatsit')
+
+ local current, used, done = 0, { }, false
+
+ function states.initialize(what, attribute, stack)
+ current, used, done = 0, { }, false
+ end
+
+ local contains = node.has_attribute
+
+ function insert(n,stack,previous,head)
+ if n then
+ n = node.copy(n)
+ n.next = stack
+ if previous then
+ previous.next = n
+ else
+ head = n
+ end
+ previous = n
+ end
+ return stack, previous, head
+ end
+
+ function states.finalize(what,attribute,head)
+ if what.enabled and what.none and current > 0 and head.list then
+ local head = head.list
+ stack, previous, head = insert(what.none,list,nil,list)
+ end
+ return done, head, used
+ end
+
+--~ function states.process(what,attribute,stack,previous,head) -- one attribute
+--~ if what.enabled then
+--~ local c = contains(stack,attribute)
+--~ if c then
+--~ if current ~= c then
+--~ local id = stack.id
+--~ if id == glyph or id == rule or id == whatsit then
+--~ stack, previous, head = insert(what.data[c],stack,previous,head)
+--~ current, done, used[c] = c, true, true
+--~ end
+--~ end
+--~ elseif current > 0 then
+--~ stack, previous, head = insert(what.none,stack,previous,head)
+--~ current, done, used[0] = 0, true, true
+--~ end
+--~ end
+--~ return stack, previous, head
+--~ end
+
+ function states.process(what,attribute,stack,previous,head) -- one attribute
+ if what.enabled then
+ local id = stack.id
+ if id == glyph or id == rule then -- or id == whatsit then
+ local c = contains(stack,attribute)
+ if c then
+ if current ~= c then
+ stack, previous, head = insert(what.data[c],stack,previous,head)
+ current, done, used[c] = c, true, true
+ end
+ elseif current > 0 then
+ stack, previous, head = insert(what.none,stack,previous,head)
+ current, done, used[0] = 0, true, true
+ end
+ end
+ end
+ return stack, previous, head
+ end
+
+--~ function states.selective(what,attribute,stack,previous,head) -- two attributes
+--~ if what.enabled then
+--~ local c = contains(stack,attribute)
+--~ if c then
+--~ if current ~= c then
+--~ local id = stack.id
+--~ if id == glyph or id == rule then -- or id == whatsit then
+--~ stack, previous, head = insert(what.data[c][contains(stack,what.selector) or what.default],stack,previous,head)
+--~ current, done, used[c] = c, true, true
+--~ end
+--~ end
+--~ elseif current > 0 then
+--~ local id = stack.id
+--~ if id == glyph or id == rule then -- or id == whatsit then
+--~ stack, previous, head = insert(what.none,stack,previous,head)
+--~ current, done, used[0] = 0, true, true
+--~ end
+--~ end
+--~ end
+--~ return stack, previous, head
+--~ end
+
+ function states.selective(what,attribute,stack,previous,head) -- two attributes
+ if what.enabled then
+ local id = stack.id
+ if id == glyph or id == rule then -- or id == whatsit then
+ local c = contains(stack,attribute)
+ if c then
+ if current ~= c then
+ stack, previous, head = insert(what.data[c][contains(stack,what.selector) or what.default],stack,previous,head)
+ current, done, used[c] = c, true, true
+ end
+ elseif current > 0 then
+ stack, previous, head = insert(what.none,stack,previous,head)
+ current, done, used[0] = 0, true, true
+ end
+ end
+ end
+ return stack, previous, head
+ end
+
+ collected = { }
+
+ function states.collect(str)
+ collected[#collected+1] = str
+ end
+
+ function states.flush()
+ for _, c in ipairs(collected) do
+ tex.sprint(tex.ctxcatcodes,c)
+ end
+ collected = { }
+ end
+
+end
+
+--
+-- colors
+--
+
+-- we can also collapse the two attributes: n, n+1, n+2 and then
+-- at the tex end add 0, 1, 2, but this is not faster and less
+-- flexible (since sometimes we freeze color attribute values at
+-- the lua end of the game
+
+-- we also need to store the colorvalues because we need then in mp
+
+colors = colors or { }
+colors.enabled = true
+colors.data = colors.data or { }
+colors.strings = colors.strings or { }
+colors.registered = colors.registered or { }
+colors.weightgray = true
+colors.attribute = 0
+colors.selector = 0
+colors.default = 1
+
+input.storage.register(true,"colors/data", colors.strings, "colors.data")
+input.storage.register(false,"colors/registered", colors.registered, "colors.registered")
+
+colors.stamps = {
+ rgb = "r:%s:%s:%s",
+ cmyk = "c:%s:%s:%s:%s",
+ gray = "s:%s",
+ spot = "p:%s:%s"
+}
+
+colors.models = {
+ all = 1,
+ gray = 2,
+ rgb = 3,
+ cmyk = 4
+}
+
+do
+
+ local min = math.min
+ local max = math.max
+ local format = string.format
+ local concat = table.concat
+
+ local function rgbdata(r,g,b)
+ return pdfliteral(format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b))
+ end
+
+ local function cmykdata(c,m,y,k)
+ return pdfliteral(format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k))
+ end
+
+ local function graydata(s)
+ return pdfliteral(format("%s g %s G",s,s))
+ end
+
+ local function spotdata(n,p) -- name, parent, ratio
+ if type(p) == "string" then
+ p = p:gsub(","," ") -- brr misuse of spot
+ end
+ return pdfliteral(format("/%s cs /%s CS %s SCN %s scn",n,n,p,p))
+ end
+
+ local function rgbtocmyk(r,g,b)
+ return 1-r, 1-g, 1-b, 0
+ end
+
+ local function cmyktorgb(c,m,y,k)
+ return 1.0 - min(1.0,c+k), 1.0 - min(1.0,m+k), 1.0 - min(1.0,y+k)
+ end
+
+ local function rgbtogray(r,g,b)
+ if colors.weightgray then
+ return .30*r+.59*g+.11*b
+ else
+ return r/3+g/3+b/3
+ end
+ end
+
+ local function cmyktogray(c,m,y,k)
+ return rgbtogray(cmyktorgb(c,m,y,k))
+ end
+
+ -- we can share some *data by using s, rgb and cmyk hashes, but
+ -- normally the amount of colors is not that large; storing the
+ -- components costs a bit of extra runtime, but we expect to gain
+ -- some back because we have them at hand; the number indicates the
+ -- default color space
+
+ function colors.gray(s)
+ local gray = graydata(s)
+ return { gray, gray, gray, gray, 2, s, 0, 0, 0, 0, 0, 0, 1 }
+ end
+
+ function colors.rgb(r,g,b)
+ local s = rgbtogray(r,g,b)
+ local c, m, y, k = rgbtocmyk(r,g,b)
+ local gray, rgb, cmyk = graydata(s), rgbdata(r,g,b), cmykdata(c,m,y,k)
+ return { rgb, gray, rgb, cmyk, 3, s, r, g, b, c, m, y, k }
+ end
+
+ function colors.cmyk(c,m,y,k)
+ local s = cmyktogray(c,m,y,k)
+ local r, g, b = cmyktorgb(c,m,y,k)
+ local gray, rgb, cmyk = graydata(s), rgbdata(r,g,b), cmykdata(c,m,y,k)
+ return { cmyk, gray, rgb, cmyk, 4, s, r, g, b, c, m, y, k }
+ end
+
+ function colors.spot(parent,p) -- parent, ratio
+ local spot = spotdata(parent,p)
+ if type(p) == "string" and p:find(",") then
+ -- use converted replacement (combination color)
+ else
+ -- todo: map gray, rgb, cmyk onto fraction*parent
+ end
+ local gray, rgb, cmyk = graydata(.5), rgbdata(.5,.5,.5), cmykdata(0,0,0,.5)
+ return { spot, gray, rgb, cmyk, 5 }
+ end
+
+ function colors.filter(n)
+ return concat(colors.data[n],":",5)
+ end
+
+ colors.none = graydata(0)
+
+end
+
+-- conversion models
+
+function colors.setmodel(attribute,name)
+ colors.selector = attributes.numbers[attribute]
+ colors.default = colors.models[name] or 1
+ return colors.default
+end
+
+function colors.register(attribute, name, colorspace, ...)
+ local stamp = string.format(colors.stamps[colorspace], ...)
+ local color = colors.registered[stamp]
+ if not color then
+ local cd = colors.data
+ color = #cd+1
+ cd[color] = colors[colorspace](...)
+ if environment.initex then
+ colors.strings[color] = "return colors." .. colorspace .. "(" .. table.concat({...},",") .. ")"
+ end
+ colors.registered[stamp] = color
+ end
+ attributes.list[attributes.numbers[attribute]][name] = color
+ return colors.registered[stamp]
+end
+
+shipouts.plugins.color = {
+ initializer = function(...) return states.initialize(colors,...) end,
+ finalizer = function(...) return states.finalize (colors,...) end,
+ processor = function(...) return states.selective (colors,...) end,
+}
+
+--- overprint / knockout
+
+overprints = { enabled = true , data = { } }
+
+overprints.none = pdfliteral(string.format("/GSoverprint gs"))
+overprints.data[1] = pdfliteral(string.format("/GSknockout gs"))
+
+overprints.registered = {
+ overprint = 0,
+ knockout = 1,
+}
+
+function overprints.register(stamp)
+ return overprints.registered[stamp] or overprints.registered.overprint
+end
+
+shipouts.plugins.overprint = {
+ initializer = function(...) return states.initialize(overprints,...) end,
+ finalizer = function(...) return states.finalize (overprints,...) end,
+ processor = function(...) return states.process (overprints,...) end,
+}
+
+--- negative / positive
+
+negatives = { enabled = true, data = { } }
+
+negatives.none = pdfliteral(string.format("/GSpositive gs"))
+negatives.data[1] = pdfliteral(string.format("/GSnegative gs"))
+
+negatives.registered = {
+ positive = 0,
+ negative = 1,
+}
+
+function negatives.register(stamp)
+ return negatives.registered[stamp] or negatives.registered.positive
+end
+
+shipouts.plugins.negative = {
+ initializer = function(...) return states.initialize(negatives,...) end,
+ finalizer = function(...) return states.finalize (negatives,...) end,
+ processor = function(...) return states.process (negatives,...) end,
+}
+
+-- effects
+
+effects = { enabled = true, data = { } }
+
+effects.none = pdfliteral(string.format("0 Tr"))
+effects.data[1] = pdfliteral(string.format("1 Tr"))
+effects.data[2] = pdfliteral(string.format("2 Tr"))
+effects.data[3] = pdfliteral(string.format("3 Tr"))
+
+effects.registered = {
+ normal = 0,
+ inner = 0,
+ outer = 1,
+ both = 2,
+ hidden = 3,
+}
+
+function effects.register(stamp)
+ return effects.registered[stamp] or effects.registered.normal
+end
+
+shipouts.plugins.effect = {
+ initializer = function(...) return states.initialize(effects,...) end,
+ finalizer = function(...) return states.finalize (effects,...) end,
+ processor = function(...) return states.process (effects,...) end,
+}
+
+-- layers
+
+--~ /OC /somename BDC
+--~ EMC
+
+-- transparencies
+
+-- for the moment we manage transparencies in the pdf driver because
+-- first we need a nice interface to some pdf things
+
+transparencies = {
+ enabled = true,
+ data = { },
+ registered = { },
+ hack = { }
+}
+
+input.storage.register(false, "transparencies/registed", transparencies.registered, "transparencies.registered")
+input.storage.register(false, "transparencies/data", transparencies.data, "transparencies.data")
+input.storage.register(false, "transparencies/hack", transparencies.hack, "transparencies.hack")
+
+function transparencies.reference(n)
+ return pdfliteral(string.format("/Tr%s gs",n))
+end
+
+transparencies.none = transparencies.reference(0)
+
+transparencies.stamp = "%s:%s"
+
+function transparencies.register(...)
+ local stamp = string.format(transparencies.stamp, ...)
+ if not transparencies.registered[stamp] then
+ local n = #transparencies.data+1
+ transparencies.data[n] = transparencies.reference(n)
+ transparencies.registered[stamp] = n
+ states.collect(string.format("\\presetPDFtransparency{%s}{%s}",...)) -- too many, but experimental anyway
+ end
+ return transparencies.registered[stamp]
+end
+
+shipouts.plugins.transparency = {
+ initializer = function(...) return states.initialize(transparencies,...) end,
+ finalizer = function(...) return states.finalize (transparencies,...) end,
+ processor = function(...) return states.process (transparencies,...) end,
+}
+
+--~ shipouts.plugins.transparency.flusher = function(attribute,head,used)
+--~ local max = 0
+--~ for k,v in pairs(used) do
+--~ end
+--~ return head
+--~ end
+
+--~ from the time that node lists were tables and not userdata ...
+--~
+--~ local function do_collapse_page(stack,existing_t)
+--~ if stack then
+--~ local t = existing_t or { }
+--~ for _, node in ipairs(stack) do
+--~ if node then
+--~ local kind = node[1]
+--~ node[3] = nil
+--~ if kind == 'hlist' or kind == 'vlist' then
+--~ node[8] = do_collapse_page(node[8]) -- maybe here check for nil
+--~ t[#t+1] = node
+--~ elseif kind == 'inline' then -- appending literals cost too much time
+--~ local nodes = node[4]
+--~ if #nodes == 1 then
+--~ t[#t+1] = nodes[1]
+--~ else
+--~ do_collapse_page(nodes,t)
+--~ end
+--~ else
+--~ t[#t+1] = node
+--~ end
+--~ end
+--~ end
+--~ return t
+--~ else
+--~ return nil
+--~ end
+--~ end
+--~
+--~ local function do_process_page(attribute,processor,stack)
+--~ if stack then
+--~ for i, node in ipairs(stack) do
+--~ if node then
+--~ local kind = node[1]
+--~ if kind == 'hlist' or kind == "vlist" then
+--~ local content = node[8]
+--~ if not content then
+--~ -- nil node
+--~ elseif type(content) == "table" then
+--~ node[8] = do_process_page(attribute,processor,content)
+--~ else
+--~ node[8] = do_process_page(attribute,processor,tex.get_node_list(content))
+--~ end
+--~ elseif kind == 'inline' then
+--~ node[4] = do_process_page(attribute,processor,node[4])
+--~ else
+--~ processor(attribute,stack,i,node,kind)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ return stack
+--~ end
+--~
+--~ function nodes.process_page(stack,...)
+--~ if stack then
+--~ input.start_timing(nodes)
+--~ local done, used = false, { }
+--~ for name, plugin in pairs(shipouts.plugins) do
+--~ local attribute = attributes.numbers[name]
+--~ if attribute then
+--~ local initializer = plugin.initializer
+--~ local processor = plugin.processor
+--~ local finalizer = plugin.finalizer
+--~ if initializer then
+--~ initializer(attribute,stack)
+--~ end
+--~ if processor then
+--~ do_process_page(attribute,processor,stack)
+--~ end
+--~ if finalizer then
+--~ local ok
+--~ ok, used[attribute] = finalizer(attribute,stack)
+--~ done = done or ok
+--~ end
+--~ else
+--~ texio.write_nl(string.format("undefined attribute %s",name))
+--~ end
+--~ end
+--~ if done then
+--~ stack = do_collapse_page(stack)
+--~ for name, plugin in pairs(shipouts.plugins) do
+--~ local attribute = attributes.numbers[name]
+--~ if used[attribute] then
+--~ local flusher = plugin.flusher
+--~ if flusher then
+--~ flusher(attribute,stack,used[attribute])
+--~ end
+--~ end
+--~ end
+--~ else
+--~ stack = true
+--~ end
+--~ input.stop_timing(nodes)
+--~ end
+--~ return stack
+--~ end
+--~
+--~ function states.finalize(what,attribute,stack)
+--~ if what.enabled then
+--~ if current > 0 then
+--~ local list = stack
+--~ if #stack == 1 then
+--~ list = stack[#stack][8]
+--~ end
+--~ list[#list+1], current, done, used[0] = what.none, 0, true, true
+--~ end
+--~ end
+--~ return done, used
+--~ end
+--~
+--~ function states.process(what,attribute,stack,i,node,kind)
+--~ if what.enabled then
+--~ local a = node[3]
+--~ if a then
+--~ local c = a[attribute]
+--~ if c then
+--~ if current ~= c and (kind == 'glyph' or kind == 'rule') then
+--~ stack[i], current, done, used[c] = nodes.inline(what.data[c], node), c, true, true
+--~ end
+--~ elseif current > 0 then
+--~ stack[i], current, done, used[0] = nodes.inline(what.none, node), 0, true, true
+--~ end
+--~ end
+--~ end
+--~ end
diff --git a/tex/context/base/attr-ini.tex b/tex/context/base/attr-ini.tex
new file mode 100644
index 000000000..60746d560
--- /dev/null
+++ b/tex/context/base/attr-ini.tex
@@ -0,0 +1,199 @@
+%D \module
+%D [ file=attr-ini,
+%D version=2007.06.06,
+%D title=\CONTEXT\ Attribute Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Context Attribute Macros / initialization}
+
+%D Although it's still somewhat experimental, here we introduce code
+%D related to attributes.
+
+\unprotect
+
+\registerctxluafile{attr-ini}{1.001}
+
+\newcount\attdefcounter
+
+% \def\newattribute#1%
+% {\global\advance\attdefcounter\plusone
+% \global\attributedef#1\attdefcounter
+% \ctxlua{attributes.define("\strippedcsname#1",\number\attdefcounter)}}
+
+% \newattribute\statusattribute
+% \newattribute\colorattribute
+% \newattribute\skipattribute
+% \newattribute\penaltyattribute
+
+\newtoks \attributesresetlist
+
+\def\defineattribute[#1]% alternatively we can let lua do the housekeeping
+ {\global\advance\attdefcounter\plusone
+ \expandafter \xdef\csname :attr:#1\endcsname{\number\attdefcounter}%
+ \global\expandafter\attributedef\csname @attr@#1\endcsname \attdefcounter
+ \writestatus\m!systems{defining attribute #1 with number \the\attdefcounter}%
+ \appendetoks\csname @attr@#1\endcsname\minusone\to\attributesresetlist
+ \ctxlua{attributes.define("#1",\number\attdefcounter)}}
+
+\def\dosetattribute#1#2{\csname @attr@#1\endcsname#2\relax}
+\def\doresetattribute#1{\csname @attr@#1\endcsname\minusone}
+\def\dogetattribute #1{\number\csname @attr@#1\endcsname}
+\def\dogetattributeid#1{\csname :attr:#1\endcsname}
+
+\let\dompattribute\gobbletwoarguments
+
+\defineattribute[mark]
+\defineattribute[status]
+% \defineattribute[language]
+\defineattribute[skip]
+\defineattribute[penalty]
+
+% \dosetattribute{status}{1}
+
+% temp here / will be indirect ! just for testing
+
+\defineattribute[colormodel]
+\defineattribute[color]
+
+% todo: no need for 'color' argument, we can set that once at startup; currently
+% a bit inconsistent
+
+% 1=off 2=gray 3=spot 4=rgb 5=cmyk 6=cmy % only 1/2/4/5 are supported
+%
+% we could combine this in one attribute but this is not faster and also
+% less flexible because sometimes we want to freeze the attribute bit
+
+\newcount\currentcolormodel
+
+\def\setcolormodel#1%
+ {\currentcolormodel\ctxlua{tex.print(colors.setmodel('colormodel','#1'))}%
+ \dosetattribute{colormodel}{\the\currentcolormodel}}
+
+\setcolormodel{all} % when no color, reset ! !
+
+\def\registerrgbcolor#1#2#3#4% r g b -- print or sprint
+ {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','rgb',#2,#3,#4))}%
+ \setevalue{(ca:#1)}{\number\scratchcounter}%
+ \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}%
+ \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}}
+
+\def\registercmykcolor#1#2#3#4#5% c m y k
+ {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','cmyk',#2,#3,#4,#5))}%
+ \setevalue{(ca:#1)}{\number\scratchcounter}%
+ \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}%
+ \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}}
+
+\def\registergraycolor#1#2% s
+ {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','gray',#2))}%
+ \setevalue{(ca:#1)}{\number\scratchcounter}%
+ \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}%
+ \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}}
+
+\def\registerspotcolor#1#2#3% p name
+ {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','spot',#2,#3))}%
+ \setevalue{(ca:#1)}{\number\scratchcounter}%
+ \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}%
+ \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}}
+
+\def\somecolorvalue #1{\csname(cv:#1)\endcsname}
+\def\somecolorswitch #1{\csname(cs:#1)\endcsname}
+\def\somecolorattribute#1{\csname(ca:#1)\endcsname}
+
+\def\getMPcolorspec#1%
+ {\expandafter\expandafter\expandafter\dogetMPcolorspec\csname (cv:#1)\endcsname\relax}
+
+\def\dogetMPcolorspec#1:#2:#3:#4:#5:#6:#7:#8:#9\relax % some day we will just pass a attribute number in pre/post
+ {\ifcase\currentcolormodel\or
+ \ifcase#1\or#2\or(#3,#4,#5)\or(#6,#7,#8,#9)\fi\or#2\or(#3,#4,#5)\or(#6,#7,#8,#9)%
+ \fi}
+
+% \registerrgbcolor {red} {1}{0}{0}
+% \registerrgbcolor {green} {0}{1}{0}
+% \registerrgbcolor {blue} {0}{0}{1}
+% \registercmykcolor {cyan} {1}{0}{0}{0}
+% \registercmykcolor {magenta} {0}{1}{0}{0}
+% \registercmykcolor {yellow} {0}{0}{1}{0}
+% \registergraycolor {black} {0}
+
+% transparency
+
+\defineattribute[transparency]
+
+\def\registertransparency#1#2#3% we need to fake a name in the current setup, same as color
+ {\setevalue{(ts:#1)}{\dosetattribute{transparency}{\ctxlua{tex.print(transparencies.register(#2,#3))}}}}
+
+\def\sometransparencyswitch#1{\csname(ts:#1)\endcsname}
+
+% \registertransparency {one} {1} {.5}
+% \registertransparency {two} {1} {.6}
+
+% overprint
+
+\defineattribute[overprint]
+
+\def\registeroverprint#1#2%
+ {\initializePDFoverprint % temp here
+ \setvalue{(os:#1)}{\dosetattribute{overprint}{\ctxlua{tex.print(overprints.register('#2'))}}}}
+
+% \registeroverprint{knockout} {knockout}
+% \registeroverprint{overprint}{overprint}
+
+% negative
+
+\defineattribute[negative]
+
+\def\registernegative#1#2%
+ {\initializePDFnegative % temp here
+ \setvalue{(ns:#1)}{\dosetattribute{negative}{\ctxlua{tex.print(negatives.register('#2'))}}}}
+
+% \registernegative{positive}{positive}
+% \registernegative{negative}{negative}
+
+% effect
+
+\defineattribute[effect]
+
+\def\registereffect#1%
+ {\setevalue{(es:#1)}{\dosetattribute{effect}{\ctxlua{tex.print(effects.register('#1'))}}}}
+
+% \registereffect{normal}
+% \registereffect{inner}
+% \registereffect{outer}
+% \registereffect{both}
+% \registereffect{hidden}
+
+% ugly solution
+%
+% \def\shipout
+% {%\writestatus{SHIPOUT}{CALLED AT PAGE \realfolio}%
+% \dowithnextbox
+% {\ctxlua{callbacks.push('hpack_filter',nodes.process_page)}%
+% %\writestatus{SHIPOUT}{START PACKAGING}%
+% \setbox\nextbox\hbox{\box\nextbox}%
+% %\writestatus{SHIPOUT}{STOP PACKAGING}%
+% \ctxlua{callbacks.pop('hpack_filter')}%
+% \primitive\shipout\box\nextbox}}
+
+% \def\shipout
+% {\dowithnextbox
+% {\ctxlua{nodes.process_page(tex.box[\number\nextbox])}%
+% \primitive\shipout\box\nextbox}}
+
+\def\processshipoutbox#1% % hack till we have access to pdf backend
+ {\setbox\nextbox\hbox{#1}%
+ \ctxlua{nodes.process_page(tex.box[\number\nextbox])}%
+ \hbox{\ctxlua{states.flush()}\box\nextbox}}
+
+% \def\shipout
+% {\dowithnextbox{\ctxlua{tex.primitive('shipout', nodes.process_page(tex.nextbox)}}}
+
+\let\normalshipout\shipout
+
+\protect \endinput
diff --git a/tex/context/base/char-cmp.lua b/tex/context/base/char-cmp.lua
new file mode 100644
index 000000000..42f66143c
--- /dev/null
+++ b/tex/context/base/char-cmp.lua
@@ -0,0 +1,260 @@
+if not modules then modules = { } end modules ['char-cmp'] = {
+ version = 1.001,
+ comment = "companion to char-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+characters = characters or { }
+characters.uncomposed = characters.uncomposed or { }
+
+--[[ldx--
+<p>The code defined here may move to the big character table.</p>
+--ldx]]--
+
+characters.basedigits = {
+ ['zero'] = 48, ['one'] = 49,
+ ['two'] = 50, ['three'] = 51,
+ ['four'] = 52, ['five'] = 53,
+ ['six'] = 54, ['seven'] = 55,
+ ['eight'] = 56, ['nine'] = 57
+}
+
+--[[ldx--
+<p>The next three tables can for instance be be used to enhance
+kerning tables that lack kerning pairs for these special characters.
+Of course they may come in handy elsewhere too</p>
+--ldx]]--
+
+-- we can use shcodes, but then we also need slcode and srcode
+--
+-- AEligature
+-- => slcode == ub('A')
+-- => srcode == ub('E')
+-- or
+-- => shcode == { ub('A'), ub('E') }
+-- => reduction = "AE"
+--
+-- eacute
+-- => shcode == ub('A')
+-- or
+-- => shcode == { ub('a') }
+-- => reduction = "a"
+
+characters.uncomposed.left = {
+ AEligature = "A", aeligature = "a",
+ OEligature = "O", oeligature = "o",
+ IJligature = "I", ijligature = "i",
+ AE = "A", ae = "a",
+ OE = "O", oe = "o",
+ IJ = "I", ij = "i",
+ Ssharp = "S", ssharp = "s",
+}
+
+characters.uncomposed.right = {
+ AEligature = "E", aeligature = "e",
+ OEligature = "E", oeligature = "e",
+ IJligature = "J", ijligature = "j",
+ AE = "E", ae = "e",
+ OE = "E", oe = "e",
+ IJ = "J", ij = "j",
+ Ssharp = "S", ssharp = "s",
+}
+
+characters.uncomposed.both = {
+ Acircumflex = "A", acircumflex = "a",
+ Ccircumflex = "C", ccircumflex = "c",
+ Ecircumflex = "E", ecircumflex = "e",
+ Gcircumflex = "G", gcircumflex = "g",
+ Hcircumflex = "H", hcircumflex = "h",
+ Icircumflex = "I", icircumflex = "i",
+ Jcircumflex = "J", jcircumflex = "j",
+ Ocircumflex = "O", ocircumflex = "o",
+ Scircumflex = "S", scircumflex = "s",
+ Ucircumflex = "U", ucircumflex = "u",
+ Wcircumflex = "W", wcircumflex = "w",
+ Ycircumflex = "Y", ycircumflex = "y",
+
+ Agrave = "A", agrave = "a",
+ Egrave = "E", egrave = "e",
+ Igrave = "I", igrave = "i",
+ Ograve = "O", ograve = "o",
+ Ugrave = "U", ugrave = "u",
+ Ygrave = "Y", ygrave = "y",
+
+ Atilde = "A", atilde = "a",
+ Itilde = "I", itilde = "i",
+ Otilde = "O", otilde = "o",
+ Utilde = "U", utilde = "u",
+ Ntilde = "N", ntilde = "n",
+
+ Adiaeresis = "A", adiaeresis = "a", Adieresis = "A", adieresis = "a",
+ Ediaeresis = "E", ediaeresis = "e", Edieresis = "E", edieresis = "e",
+ Idiaeresis = "I", idiaeresis = "i", Idieresis = "I", idieresis = "i",
+ Odiaeresis = "O", odiaeresis = "o", Odieresis = "O", odieresis = "o",
+ Udiaeresis = "U", udiaeresis = "u", Udieresis = "U", udieresis = "u",
+ Ydiaeresis = "Y", ydiaeresis = "y", Ydieresis = "Y", ydieresis = "y",
+
+ Aacute = "A", aacute = "a",
+ Cacute = "C", cacute = "c",
+ Eacute = "E", eacute = "e",
+ Iacute = "I", iacute = "i",
+ Lacute = "L", lacute = "l",
+ Nacute = "N", nacute = "n",
+ Oacute = "O", oacute = "o",
+ Racute = "R", racute = "r",
+ Sacute = "S", sacute = "s",
+ Uacute = "U", uacute = "u",
+ Yacute = "Y", yacute = "y",
+ Zacute = "Z", zacute = "z",
+
+ Dstroke = "D", dstroke = "d",
+ Hstroke = "H", hstroke = "h",
+ Tstroke = "T", tstroke = "t",
+
+ Cdotaccent = "C", cdotaccent = "c",
+ Edotaccent = "E", edotaccent = "e",
+ Gdotaccent = "G", gdotaccent = "g",
+ Idotaccent = "I", idotaccent = "i",
+ Zdotaccent = "Z", zdotaccent = "z",
+
+ Amacron = "A", amacron = "a",
+ Emacron = "E", emacron = "e",
+ Imacron = "I", imacron = "i",
+ Omacron = "O", omacron = "o",
+ Umacron = "U", umacron = "u",
+
+ Ccedilla = "C", ccedilla = "c",
+ Kcedilla = "K", kcedilla = "k",
+ Lcedilla = "L", lcedilla = "l",
+ Ncedilla = "N", ncedilla = "n",
+ Rcedilla = "R", rcedilla = "r",
+ Scedilla = "S", scedilla = "s",
+ Tcedilla = "T", tcedilla = "t",
+
+ Ohungarumlaut = "O", ohungarumlaut = "o",
+ Uhungarumlaut = "U", uhungarumlaut = "u",
+
+ Aogonek = "A", aogonek = "a",
+ Eogonek = "E", eogonek = "e",
+ Iogonek = "I", iogonek = "i",
+ Uogonek = "U", uogonek = "u",
+
+ Aring = "A", aring = "a",
+ Uring = "U", uring = "u",
+
+ Abreve = "A", abreve = "a",
+ Ebreve = "E", ebreve = "e",
+ Gbreve = "G", gbreve = "g",
+ Ibreve = "I", ibreve = "i",
+ Obreve = "O", obreve = "o",
+ Ubreve = "U", ubreve = "u",
+
+ Ccaron = "C", ccaron = "c",
+ Dcaron = "D", dcaron = "d",
+ Ecaron = "E", ecaron = "e",
+ Lcaron = "L", lcaron = "l",
+ Ncaron = "N", ncaron = "n",
+ Rcaron = "R", rcaron = "r",
+ Scaron = "S", scaron = "s",
+ Tcaron = "T", tcaron = "t",
+ Zcaron = "Z", zcaron = "z",
+
+ dotlessI = "I", dotlessi = "i",
+ dotlessJ = "J", dotlessj = "j",
+
+ AEligature = "AE", aeligature = "ae", AE = "AE", ae = "ae",
+ OEligature = "OE", oeligature = "oe", OE = "OE", oe = "oe",
+ IJligature = "IJ", ijligature = "ij", IJ = "IJ", ij = "ij",
+
+ Lstroke = "L", lstroke = "l", Lslash = "L", lslash = "l",
+ Ostroke = "O", ostroke = "o", Oslash = "O", oslash = "o",
+
+ Ssharp = "SS", ssharp = "ss",
+
+ Aumlaut = "A", aumlaut = "a",
+ Eumlaut = "E", eumlaut = "e",
+ Iumlaut = "I", iumlaut = "i",
+ Oumlaut = "O", oumlaut = "o",
+ Uumlaut = "U", uumlaut = "u",
+
+}
+
+--[[ldx--
+<p>The following function is used in the indexing code, where
+we need some sort of default fallback mapping.</p>
+--ldx]]--
+
+function characters.uncompose(n) -- n == string|number, returns string
+ local cdn
+ if type(n) == "string" then
+ cdn = characters.data[utf.byte(n)]
+ else
+ cdn = characters.data[n]
+ end
+ -- return characters.shape(n)
+ if cdn then
+ if cdn.shcode then
+ return utf.char(cdn.shcode)
+ else
+ return characters.uncomposed.both[cdn.contextname] or n
+ end
+ end
+ return n
+end
+
+--[[ldx--
+<p>Only characters with a code smaller than 128 make sense,
+anything larger is encoding dependent. An interesting complication
+is that a character can be in an encoding twice but is hashed
+once.</p>
+--ldx]]--
+
+characters.ligatures = {
+ ['f'] = {
+ { 'f', 'ff' },
+ { 'i', 'fi' },
+ { 'l', 'fl' },
+ },
+ ['ff'] = {
+ { 'i', 'ffi' }
+ },
+ ['fi'] = {
+ { 'i', 'fii' }
+ },
+ ['fl'] = {
+ { 'i', 'fli' }
+ },
+ ['s'] = {
+ { 't', 'st' }
+ },
+ ['i'] = {
+ { 'j', 'ij' }
+ },
+}
+
+characters.texligatures = {
+ -- ['space'] = {
+ -- { 'L', 'Lslash' },
+ -- { 'l', 'lslash' }
+ -- },
+ -- ['question'] = {
+ -- { 'quoteleft', 'questiondown' }
+ -- },
+ -- ['exclam'] = {
+ -- { 'quoteleft', 'exclamdown' }
+ -- },
+ ['quoteleft'] = {
+ { 'quoteleft', 'quotedblleft' }
+ },
+ ['quoteright'] = {
+ { 'quoteright', 'quotedblright' }
+ },
+ ['hyphen'] = {
+ { 'hyphen', 'endash' }
+ },
+ ['endash'] = {
+ { 'hyphen', 'emdash' }
+ }
+}
diff --git a/tex/context/base/char-def.lua b/tex/context/base/char-def.lua
new file mode 100644
index 000000000..fe42f5622
--- /dev/null
+++ b/tex/context/base/char-def.lua
@@ -0,0 +1,17736 @@
+-- filename : char-def.lua
+-- comment : companion to char-def.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+
+if not versions then versions = { } end versions['char-def'] = 1.001
+
+if not characters then characters = { } end
+if not characters.data then characters.data = { } end
+
+characters.data = {
+ [0x0000] = { unicodeslot=0x0000, category='cc', description='NULL' },
+ [0x0001] = { unicodeslot=0x0001, category='cc', description='START OF HEADING' },
+ [0x0002] = { unicodeslot=0x0002, category='cc', description='START OF TEXT' },
+ [0x0003] = { unicodeslot=0x0003, category='cc', description='END OF TEXT' },
+ [0x0004] = { unicodeslot=0x0004, category='cc', description='END OF TRANSMISSION' },
+ [0x0005] = { unicodeslot=0x0005, category='cc', description='ENQUIRY' },
+ [0x0006] = { unicodeslot=0x0006, category='cc', description='ACKNOWLEDGE' },
+ [0x0007] = { unicodeslot=0x0007, category='cc', description='BELL' },
+ [0x0008] = { unicodeslot=0x0008, category='cc', description='BACKSPACE' },
+ [0x0009] = { unicodeslot=0x0009, category='cc', description='CHARACTER TABULATION' },
+ [0x000A] = { unicodeslot=0x000A, category='cc', description='LINE FEED (LF)' },
+ [0x000B] = { unicodeslot=0x000B, category='cc', description='LINE TABULATION' },
+ [0x000C] = { unicodeslot=0x000C, category='cc', description='FORM FEED (FF)' },
+ [0x000D] = { unicodeslot=0x000D, category='cc', description='CARRIAGE RETURN (CR)' },
+ [0x000E] = { unicodeslot=0x000E, category='cc', description='SHIFT OUT' },
+ [0x000F] = { unicodeslot=0x000F, category='cc', description='SHIFT IN' },
+ [0x0010] = { unicodeslot=0x0010, category='cc', description='DATA LINK ESCAPE' },
+ [0x0011] = { unicodeslot=0x0011, category='cc', description='DEVICE CONTROL ONE' },
+ [0x0012] = { unicodeslot=0x0012, category='cc', description='DEVICE CONTROL TWO' },
+ [0x0013] = { unicodeslot=0x0013, category='cc', description='DEVICE CONTROL THREE' },
+ [0x0014] = { unicodeslot=0x0014, category='cc', description='DEVICE CONTROL FOUR' },
+ [0x0015] = { unicodeslot=0x0015, category='cc', description='NEGATIVE ACKNOWLEDGE' },
+ [0x0016] = { unicodeslot=0x0016, category='cc', description='SYNCHRONOUS IDLE' },
+ [0x0017] = { unicodeslot=0x0017, category='cc', description='END OF TRANSMISSION BLOCK' },
+ [0x0018] = { unicodeslot=0x0018, category='cc', description='CANCEL' },
+ [0x0019] = { unicodeslot=0x0019, category='cc', description='END OF MEDIUM' },
+ [0x001A] = { unicodeslot=0x001A, category='cc', description='SUBSTITUTE' },
+ [0x001B] = { unicodeslot=0x001B, category='cc', description='ESCAPE' },
+ [0x001C] = { unicodeslot=0x001C, category='cc', description='INFORMATION SEPARATOR FOUR' },
+ [0x001D] = { unicodeslot=0x001D, category='cc', description='INFORMATION SEPARATOR THREE' },
+ [0x001E] = { unicodeslot=0x001E, category='cc', description='INFORMATION SEPARATOR TWO' },
+ [0x001F] = { unicodeslot=0x001F, category='cc', description='INFORMATION SEPARATOR ONE' },
+ [0x0020] = { unicodeslot=0x0020, category='zs', adobename='space', description='SPACE' },
+ [0x0021] = { unicodeslot=0x0021, category='po', adobename='exclam', description='EXCLAMATION MARK' },
+ [0x0022] = { unicodeslot=0x0022, category='po', adobename='quotedbl', description='QUOTATION MARK' },
+ [0x0023] = { unicodeslot=0x0023, category='po', adobename='numbersign', description='NUMBER SIGN' },
+ [0x0024] = { unicodeslot=0x0024, category='sc', adobename='dollar', description='DOLLAR SIGN' },
+ [0x0025] = { unicodeslot=0x0025, category='po', adobename='percent', contextname='percent', description='PERCENT SIGN' },
+ [0x0026] = { unicodeslot=0x0026, category='po', adobename='ampersand', description='AMPERSAND' },
+ [0x0027] = { unicodeslot=0x0027, category='po', adobename='quotesingle', description='APOSTROPHE' },
+ [0x0028] = { unicodeslot=0x0028, category='ps', adobename='parenleft', description='LEFT PARENTHESIS' },
+ [0x0029] = { unicodeslot=0x0029, category='pe', adobename='parenright', description='RIGHT PARENTHESIS' },
+ [0x002A] = { unicodeslot=0x002A, category='po', adobename='asterisk', description='ASTERISK' },
+ [0x002B] = { unicodeslot=0x002B, category='sm', adobename='plus', description='PLUS SIGN' },
+ [0x002C] = { unicodeslot=0x002C, category='po', adobename='comma', description='COMMA' },
+ [0x002D] = { unicodeslot=0x002D, category='pd', adobename='hyphen', description='HYPHEN-MINUS' },
+ [0x002E] = { unicodeslot=0x002E, category='po', adobename='period', description='FULL STOP' },
+ [0x002F] = { unicodeslot=0x002F, category='po', adobename='slash', description='SOLIDUS' },
+ [0x0030] = { unicodeslot=0x0030, category='nd', adobename='zero', description='DIGIT ZERO' },
+ [0x0031] = { unicodeslot=0x0031, category='nd', adobename='one', description='DIGIT ONE' },
+ [0x0032] = { unicodeslot=0x0032, category='nd', adobename='two', description='DIGIT TWO' },
+ [0x0033] = { unicodeslot=0x0033, category='nd', adobename='three', description='DIGIT THREE' },
+ [0x0034] = { unicodeslot=0x0034, category='nd', adobename='four', description='DIGIT FOUR' },
+ [0x0035] = { unicodeslot=0x0035, category='nd', adobename='five', description='DIGIT FIVE' },
+ [0x0036] = { unicodeslot=0x0036, category='nd', adobename='six', description='DIGIT SIX' },
+ [0x0037] = { unicodeslot=0x0037, category='nd', adobename='seven', description='DIGIT SEVEN' },
+ [0x0038] = { unicodeslot=0x0038, category='nd', adobename='eight', description='DIGIT EIGHT' },
+ [0x0039] = { unicodeslot=0x0039, category='nd', adobename='nine', description='DIGIT NINE' },
+ [0x003A] = { unicodeslot=0x003A, category='po', adobename='colon', description='COLON' },
+ [0x003B] = { unicodeslot=0x003B, category='po', adobename='semicolon', description='SEMICOLON' },
+ [0x003C] = { unicodeslot=0x003C, category='sm', adobename='less', description='LESS-THAN SIGN' },
+ [0x003D] = { unicodeslot=0x003D, category='sm', adobename='equal', description='EQUALS SIGN' },
+ [0x003E] = { unicodeslot=0x003E, category='sm', adobename='greater', description='GREATER-THAN SIGN' },
+ [0x003F] = { unicodeslot=0x003F, category='po', adobename='question', description='QUESTION MARK' },
+ [0x0040] = { unicodeslot=0x0040, category='po', adobename='at', description='COMMERCIAL AT' },
+ [0x0041] = { unicodeslot=0x0041, category='lu', adobename='A', description='LATIN CAPITAL LETTER A', lccode=0x0061 },
+ [0x0042] = { unicodeslot=0x0042, category='lu', adobename='B', description='LATIN CAPITAL LETTER B', lccode=0x0062 },
+ [0x0043] = { unicodeslot=0x0043, category='lu', adobename='C', description='LATIN CAPITAL LETTER C', lccode=0x0063 },
+ [0x0044] = { unicodeslot=0x0044, category='lu', adobename='D', description='LATIN CAPITAL LETTER D', lccode=0x0064 },
+ [0x0045] = { unicodeslot=0x0045, category='lu', adobename='E', description='LATIN CAPITAL LETTER E', lccode=0x0065 },
+ [0x0046] = { unicodeslot=0x0046, category='lu', adobename='F', description='LATIN CAPITAL LETTER F', lccode=0x0066 },
+ [0x0047] = { unicodeslot=0x0047, category='lu', adobename='G', description='LATIN CAPITAL LETTER G', lccode=0x0067 },
+ [0x0048] = { unicodeslot=0x0048, category='lu', adobename='H', description='LATIN CAPITAL LETTER H', lccode=0x0068 },
+ [0x0049] = { unicodeslot=0x0049, category='lu', adobename='I', description='LATIN CAPITAL LETTER I', lccode=0x0069 },
+ [0x004A] = { unicodeslot=0x004A, category='lu', adobename='J', description='LATIN CAPITAL LETTER J', lccode=0x006A },
+ [0x004B] = { unicodeslot=0x004B, category='lu', adobename='K', description='LATIN CAPITAL LETTER K', lccode=0x006B },
+ [0x004C] = { unicodeslot=0x004C, category='lu', adobename='L', description='LATIN CAPITAL LETTER L', lccode=0x006C },
+ [0x004D] = { unicodeslot=0x004D, category='lu', adobename='M', description='LATIN CAPITAL LETTER M', lccode=0x006D },
+ [0x004E] = { unicodeslot=0x004E, category='lu', adobename='N', description='LATIN CAPITAL LETTER N', lccode=0x006E },
+ [0x004F] = { unicodeslot=0x004F, category='lu', adobename='O', description='LATIN CAPITAL LETTER O', lccode=0x006F },
+ [0x0050] = { unicodeslot=0x0050, category='lu', adobename='P', description='LATIN CAPITAL LETTER P', lccode=0x0070 },
+ [0x0051] = { unicodeslot=0x0051, category='lu', adobename='Q', description='LATIN CAPITAL LETTER Q', lccode=0x0071 },
+ [0x0052] = { unicodeslot=0x0052, category='lu', adobename='R', description='LATIN CAPITAL LETTER R', lccode=0x0072 },
+ [0x0053] = { unicodeslot=0x0053, category='lu', adobename='S', description='LATIN CAPITAL LETTER S', lccode=0x0073 },
+ [0x0054] = { unicodeslot=0x0054, category='lu', adobename='T', description='LATIN CAPITAL LETTER T', lccode=0x0074 },
+ [0x0055] = { unicodeslot=0x0055, category='lu', adobename='U', description='LATIN CAPITAL LETTER U', lccode=0x0075 },
+ [0x0056] = { unicodeslot=0x0056, category='lu', adobename='V', description='LATIN CAPITAL LETTER V', lccode=0x0076 },
+ [0x0057] = { unicodeslot=0x0057, category='lu', adobename='W', description='LATIN CAPITAL LETTER W', lccode=0x0077 },
+ [0x0058] = { unicodeslot=0x0058, category='lu', adobename='X', description='LATIN CAPITAL LETTER X', lccode=0x0078 },
+ [0x0059] = { unicodeslot=0x0059, category='lu', adobename='Y', description='LATIN CAPITAL LETTER Y', lccode=0x0079 },
+ [0x005A] = { unicodeslot=0x005A, category='lu', adobename='Z', description='LATIN CAPITAL LETTER Z', lccode=0x007A },
+ [0x005B] = { unicodeslot=0x005B, category='ps', adobename='bracketleft', description='LEFT SQUARE BRACKET' },
+ [0x005C] = { unicodeslot=0x005C, category='po', adobename='backslash', contextname='textbackslash', description='REVERSE SOLIDUS' },
+ [0x005D] = { unicodeslot=0x005D, category='pe', adobename='bracketright', description='RIGHT SQUARE BRACKET' },
+ [0x005E] = { unicodeslot=0x005E, category='sk', adobename='asciicircum', contextname='textasciicircum', description='CIRCUMFLEX ACCENT' },
+ [0x005F] = { unicodeslot=0x005F, category='pc', adobename='underscore', contextname='textunderscore', description='LOW LINE' },
+ [0x0060] = { unicodeslot=0x0060, category='sk', adobename='grave', contextname='textgrave', description='GRAVE ACCENT' },
+ [0x0061] = { unicodeslot=0x0061, category='ll', adobename='a', description='LATIN SMALL LETTER A', uccode=0x0041 },
+ [0x0062] = { unicodeslot=0x0062, category='ll', adobename='b', description='LATIN SMALL LETTER B', uccode=0x0042 },
+ [0x0063] = { unicodeslot=0x0063, category='ll', adobename='c', description='LATIN SMALL LETTER C', uccode=0x0043 },
+ [0x0064] = { unicodeslot=0x0064, category='ll', adobename='d', description='LATIN SMALL LETTER D', uccode=0x0044 },
+ [0x0065] = { unicodeslot=0x0065, category='ll', adobename='e', description='LATIN SMALL LETTER E', uccode=0x0045 },
+ [0x0066] = { unicodeslot=0x0066, category='ll', adobename='f', description='LATIN SMALL LETTER F', uccode=0x0046 },
+ [0x0067] = { unicodeslot=0x0067, category='ll', adobename='g', description='LATIN SMALL LETTER G', uccode=0x0047 },
+ [0x0068] = { unicodeslot=0x0068, category='ll', adobename='h', description='LATIN SMALL LETTER H', uccode=0x0048 },
+ [0x0069] = { unicodeslot=0x0069, category='ll', adobename='i', description='LATIN SMALL LETTER I', uccode=0x0049 },
+ [0x006A] = { unicodeslot=0x006A, category='ll', adobename='j', description='LATIN SMALL LETTER J', uccode=0x004A },
+ [0x006B] = { unicodeslot=0x006B, category='ll', adobename='k', description='LATIN SMALL LETTER K', uccode=0x004B },
+ [0x006C] = { unicodeslot=0x006C, category='ll', adobename='l', description='LATIN SMALL LETTER L', uccode=0x004C },
+ [0x006D] = { unicodeslot=0x006D, category='ll', adobename='m', description='LATIN SMALL LETTER M', uccode=0x004D },
+ [0x006E] = { unicodeslot=0x006E, category='ll', adobename='n', description='LATIN SMALL LETTER N', uccode=0x004E },
+ [0x006F] = { unicodeslot=0x006F, category='ll', adobename='o', description='LATIN SMALL LETTER O', uccode=0x004F },
+ [0x0070] = { unicodeslot=0x0070, category='ll', adobename='p', description='LATIN SMALL LETTER P', uccode=0x0050 },
+ [0x0071] = { unicodeslot=0x0071, category='ll', adobename='q', description='LATIN SMALL LETTER Q', uccode=0x0051 },
+ [0x0072] = { unicodeslot=0x0072, category='ll', adobename='r', description='LATIN SMALL LETTER R', uccode=0x0052 },
+ [0x0073] = { unicodeslot=0x0073, category='ll', adobename='s', description='LATIN SMALL LETTER S', uccode=0x0053 },
+ [0x0074] = { unicodeslot=0x0074, category='ll', adobename='t', description='LATIN SMALL LETTER T', uccode=0x0054 },
+ [0x0075] = { unicodeslot=0x0075, category='ll', adobename='u', description='LATIN SMALL LETTER U', uccode=0x0055 },
+ [0x0076] = { unicodeslot=0x0076, category='ll', adobename='v', description='LATIN SMALL LETTER V', uccode=0x0056 },
+ [0x0077] = { unicodeslot=0x0077, category='ll', adobename='w', description='LATIN SMALL LETTER W', uccode=0x0057 },
+ [0x0078] = { unicodeslot=0x0078, category='ll', adobename='x', description='LATIN SMALL LETTER X', uccode=0x0058 },
+ [0x0079] = { unicodeslot=0x0079, category='ll', adobename='y', description='LATIN SMALL LETTER Y', uccode=0x0059 },
+ [0x007A] = { unicodeslot=0x007A, category='ll', adobename='z', description='LATIN SMALL LETTER Z', uccode=0x005A },
+ [0x007B] = { unicodeslot=0x007B, category='ps', adobename='braceleft', contextname='textbraceleft', description='LEFT CURLY BRACKET' },
+ [0x007C] = { unicodeslot=0x007C, category='sm', adobename='bar', description='VERTICAL LINE' },
+ [0x007D] = { unicodeslot=0x007D, category='pe', adobename='braceright', contextname='textbraceright', description='RIGHT CURLY BRACKET' },
+ [0x007E] = { unicodeslot=0x007E, category='sm', adobename='asciitilde', contextname='textasciitilde', description='TILDE' },
+ [0x007F] = { unicodeslot=0x007F, category='cc', description='DELETE' },
+ [0x0080] = { unicodeslot=0x0080, category='cc' },
+ [0x0081] = { unicodeslot=0x0081, category='cc' },
+ [0x0082] = { unicodeslot=0x0082, category='cc', description='BREAK PERMITTED HERE' },
+ [0x0083] = { unicodeslot=0x0083, category='cc', description='NO BREAK HERE' },
+ [0x0084] = { unicodeslot=0x0084, category='cc' },
+ [0x0085] = { unicodeslot=0x0085, category='cc', description='NEXT LINE (NEL)' },
+ [0x0086] = { unicodeslot=0x0086, category='cc', description='START OF SELECTED AREA' },
+ [0x0087] = { unicodeslot=0x0087, category='cc', description='END OF SELECTED AREA' },
+ [0x0088] = { unicodeslot=0x0088, category='cc', description='CHARACTER TABULATION SET' },
+ [0x0089] = { unicodeslot=0x0089, category='cc', description='CHARACTER TABULATION WITH JUSTIFICATION' },
+ [0x008A] = { unicodeslot=0x008A, category='cc', description='LINE TABULATION SET' },
+ [0x008B] = { unicodeslot=0x008B, category='cc', description='PARTIAL LINE FORWARD' },
+ [0x008C] = { unicodeslot=0x008C, category='cc', description='PARTIAL LINE BACKWARD' },
+ [0x008D] = { unicodeslot=0x008D, category='cc', description='REVERSE LINE FEED' },
+ [0x008E] = { unicodeslot=0x008E, category='cc', description='SINGLE SHIFT TWO' },
+ [0x008F] = { unicodeslot=0x008F, category='cc', description='SINGLE SHIFT THREE' },
+ [0x0090] = { unicodeslot=0x0090, category='cc', description='DEVICE CONTROL STRING' },
+ [0x0091] = { unicodeslot=0x0091, category='cc', description='PRIVATE USE ONE' },
+ [0x0092] = { unicodeslot=0x0092, category='cc', description='PRIVATE USE TWO' },
+ [0x0093] = { unicodeslot=0x0093, category='cc', description='SET TRANSMIT STATE' },
+ [0x0094] = { unicodeslot=0x0094, category='cc', description='CANCEL CHARACTER' },
+ [0x0095] = { unicodeslot=0x0095, category='cc', description='MESSAGE WAITING' },
+ [0x0096] = { unicodeslot=0x0096, category='cc', description='START OF GUARDED AREA' },
+ [0x0097] = { unicodeslot=0x0097, category='cc', description='END OF GUARDED AREA' },
+ [0x0098] = { unicodeslot=0x0098, category='cc', description='START OF STRING' },
+ [0x0099] = { unicodeslot=0x0099, category='cc' },
+ [0x009A] = { unicodeslot=0x009A, category='cc', description='SINGLE CHARACTER INTRODUCER' },
+ [0x009B] = { unicodeslot=0x009B, category='cc', description='CONTROL SEQUENCE INTRODUCER' },
+ [0x009C] = { unicodeslot=0x009C, category='cc', description='STRING TERMINATOR' },
+ [0x009D] = { unicodeslot=0x009D, category='cc', description='OPERATING SYSTEM COMMAND' },
+ [0x009E] = { unicodeslot=0x009E, category='cc', description='PRIVACY MESSAGE' },
+ [0x009F] = { unicodeslot=0x009F, category='cc', description='APPLICATION PROGRAM COMMAND' },
+ [0x00A0] = { unicodeslot=0x00A0, category='zs', contextname='nonbreakablespace', description='NO-BREAK SPACE', specials={'nobreak',0x0020} },
+ [0x00A1] = { unicodeslot=0x00A1, category='po', adobename='exclamdown', contextname='exclamdown', description='INVERTED EXCLAMATION MARK' },
+ [0x00A2] = { unicodeslot=0x00A2, category='sc', adobename='cent', contextname='textcent', description='CENT SIGN' },
+ [0x00A3] = { unicodeslot=0x00A3, category='sc', adobename='sterling', contextname='textsterling', description='POUND SIGN' },
+ [0x00A4] = { unicodeslot=0x00A4, category='sc', adobename='currency', contextname='textcurrency', description='CURRENCY SIGN' },
+ [0x00A5] = { unicodeslot=0x00A5, category='sc', adobename='yen', contextname='textyen', description='YEN SIGN' },
+ [0x00A6] = { unicodeslot=0x00A6, category='so', adobename='brokenbar', contextname='textbrokenbar', description='BROKEN BAR' },
+ [0x00A7] = { unicodeslot=0x00A7, category='so', adobename='section', contextname='sectionmark', description='SECTION SIGN' },
+ [0x00A8] = { unicodeslot=0x00A8, category='sk', adobename='dieresis', contextname='textdiaeresis', description='DIAERESIS', specials={'compat',0x0020,0x0308} },
+ [0x00A9] = { unicodeslot=0x00A9, category='so', adobename='copyright', contextname='copyright', description='COPYRIGHT SIGN' },
+ [0x00AA] = { unicodeslot=0x00AA, category='ll', adobename='ordfeminine', contextname='ordfeminine', description='FEMININE ORDINAL INDICATOR', specials={'super',0x0061} },
+ [0x00AB] = { unicodeslot=0x00AB, category='pi', adobename='guillemotleft', contextname='leftguillemot', description='LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' },
+ [0x00AC] = { unicodeslot=0x00AC, category='sm', adobename='logicalnot', contextname='textlognot', description='NOT SIGN' },
+ [0x00AD] = { unicodeslot=0x00AD, category='cf', contextname='softhyphen', description='SOFT HYPHEN' },
+ [0x00AE] = { unicodeslot=0x00AE, category='so', adobename='registered', contextname='registered', description='REGISTERED SIGN' },
+ [0x00AF] = { unicodeslot=0x00AF, category='sk', adobename='macron', contextname='textmacron', description='MACRON', specials={'compat',0x0020,0x0304} },
+ [0x00B0] = { unicodeslot=0x00B0, category='so', adobename='degree', contextname='textdegree', description='DEGREE SIGN' },
+ [0x00B1] = { unicodeslot=0x00B1, category='sm', adobename='plusminus', contextname='textpm', description='PLUS-MINUS SIGN' },
+ [0x00B2] = { unicodeslot=0x00B2, category='no', contextname='twosuperior', description='SUPERSCRIPT TWO', specials={'super',0x0032} },
+ [0x00B3] = { unicodeslot=0x00B3, category='no', contextname='threesuperior', description='SUPERSCRIPT THREE', specials={'super',0x0033} },
+ [0x00B4] = { unicodeslot=0x00B4, category='sk', adobename='acute', contextname='textacute', description='ACUTE ACCENT', specials={'compat',0x0020,0x0301} },
+ [0x00B5] = { unicodeslot=0x00B5, category='ll', adobename='mu', contextname='textmu', description='MICRO SIGN', uccode=0x039C, specials={'compat',0x03BC} },
+ [0x00B6] = { unicodeslot=0x00B6, category='so', adobename='paragraph', contextname='paragraphmark', description='PILCROW SIGN' },
+ [0x00B7] = { unicodeslot=0x00B7, category='po', adobename='periodcentered', contextname='periodcentered', description='MIDDLE DOT' },
+ [0x00B8] = { unicodeslot=0x00B8, category='sk', adobename='cedilla', contextname='textcedilla', description='CEDILLA', specials={'compat',0x0020,0x0327} },
+ [0x00B9] = { unicodeslot=0x00B9, category='no', contextname='onesuperior', description='SUPERSCRIPT ONE', specials={'super',0x0031} },
+ [0x00BA] = { unicodeslot=0x00BA, category='ll', adobename='ordmasculine', contextname='ordmasculine', description='MASCULINE ORDINAL INDICATOR', specials={'super',0x006F} },
+ [0x00BB] = { unicodeslot=0x00BB, category='pf', adobename='guillemotright', contextname='rightguillemot', description='RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' },
+ [0x00BC] = { unicodeslot=0x00BC, category='no', adobename='onequarter', contextname='onequarter', description='VULGAR FRACTION ONE QUARTER', specials={'fraction',0x0031,0x2044,0x0034} },
+ [0x00BD] = { unicodeslot=0x00BD, category='no', adobename='onehalf', contextname='onehalf', description='VULGAR FRACTION ONE HALF', specials={'fraction',0x0031,0x2044,0x0032} },
+ [0x00BE] = { unicodeslot=0x00BE, category='no', adobename='threequarters', contextname='threequarter', description='VULGAR FRACTION THREE QUARTERS', specials={'fraction',0x0033,0x2044,0x0034} },
+ [0x00BF] = { unicodeslot=0x00BF, category='po', adobename='questiondown', contextname='questiondown', description='INVERTED QUESTION MARK' },
+ [0x00C0] = { unicodeslot=0x00C0, category='lu', adobename='Agrave', contextname='Agrave', description='LATIN CAPITAL LETTER A WITH GRAVE', shcode=0x0041, lccode=0x00E0, specials={'char',0x0041,0x0300} },
+ [0x00C1] = { unicodeslot=0x00C1, category='lu', adobename='Aacute', contextname='Aacute', description='LATIN CAPITAL LETTER A WITH ACUTE', shcode=0x0041, lccode=0x00E1, specials={'char',0x0041,0x0301} },
+ [0x00C2] = { unicodeslot=0x00C2, category='lu', adobename='Acircumflex', contextname='Acircumflex', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX', shcode=0x0041, lccode=0x00E2, specials={'char',0x0041,0x0302} },
+ [0x00C3] = { unicodeslot=0x00C3, category='lu', adobename='Atilde', contextname='Atilde', description='LATIN CAPITAL LETTER A WITH TILDE', shcode=0x0041, lccode=0x00E3, specials={'char',0x0041,0x0303} },
+ [0x00C4] = { unicodeslot=0x00C4, category='lu', adobename='Adieresis', contextname='Adiaeresis', description='LATIN CAPITAL LETTER A WITH DIAERESIS', shcode=0x0041, lccode=0x00E4, specials={'char',0x0041,0x0308} },
+ [0x00C5] = { unicodeslot=0x00C5, category='lu', adobename='Aring', contextname='Aring', description='LATIN CAPITAL LETTER A WITH RING ABOVE', shcode=0x0041, lccode=0x00E5, specials={'char',0x0041,0x030A} },
+ [0x00C6] = { unicodeslot=0x00C6, category='lu', adobename='AE', contextname='AEligature', description='LATIN CAPITAL LETTER AE', lccode=0x00E6 },
+ [0x00C7] = { unicodeslot=0x00C7, category='lu', adobename='Ccedilla', contextname='Ccedilla', description='LATIN CAPITAL LETTER C WITH CEDILLA', shcode=0x0043, lccode=0x00E7, specials={'char',0x0043,0x0327} },
+ [0x00C8] = { unicodeslot=0x00C8, category='lu', adobename='Egrave', contextname='Egrave', description='LATIN CAPITAL LETTER E WITH GRAVE', shcode=0x0045, lccode=0x00E8, specials={'char',0x0045,0x0300} },
+ [0x00C9] = { unicodeslot=0x00C9, category='lu', adobename='Eacute', contextname='Eacute', description='LATIN CAPITAL LETTER E WITH ACUTE', shcode=0x0045, lccode=0x00E9, specials={'char',0x0045,0x0301} },
+ [0x00CA] = { unicodeslot=0x00CA, category='lu', adobename='Ecircumflex', contextname='Ecircumflex', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX', shcode=0x0045, lccode=0x00EA, specials={'char',0x0045,0x0302} },
+ [0x00CB] = { unicodeslot=0x00CB, category='lu', adobename='Edieresis', contextname='Ediaeresis', description='LATIN CAPITAL LETTER E WITH DIAERESIS', shcode=0x0045, lccode=0x00EB, specials={'char',0x0045,0x0308} },
+ [0x00CC] = { unicodeslot=0x00CC, category='lu', adobename='Igrave', contextname='Igrave', description='LATIN CAPITAL LETTER I WITH GRAVE', shcode=0x0049, lccode=0x00EC, specials={'char',0x0049,0x0300} },
+ [0x00CD] = { unicodeslot=0x00CD, category='lu', adobename='Iacute', contextname='Iacute', description='LATIN CAPITAL LETTER I WITH ACUTE', shcode=0x0049, lccode=0x00ED, specials={'char',0x0049,0x0301} },
+ [0x00CE] = { unicodeslot=0x00CE, category='lu', adobename='Icircumflex', contextname='Icircumflex', description='LATIN CAPITAL LETTER I WITH CIRCUMFLEX', shcode=0x0049, lccode=0x00EE, specials={'char',0x0049,0x0302} },
+ [0x00CF] = { unicodeslot=0x00CF, category='lu', adobename='Idieresis', contextname='Idiaeresis', description='LATIN CAPITAL LETTER I WITH DIAERESIS', shcode=0x0049, lccode=0x00EF, specials={'char',0x0049,0x0308} },
+ [0x00D0] = { unicodeslot=0x00D0, category='lu', adobename='Eth', contextname='Eth', description='LATIN CAPITAL LETTER ETH', lccode=0x00F0 },
+ [0x00D1] = { unicodeslot=0x00D1, category='lu', adobename='Ntilde', contextname='Ntilde', description='LATIN CAPITAL LETTER N WITH TILDE', shcode=0x004E, lccode=0x00F1, specials={'char',0x004E,0x0303} },
+ [0x00D2] = { unicodeslot=0x00D2, category='lu', adobename='Ograve', contextname='Ograve', description='LATIN CAPITAL LETTER O WITH GRAVE', shcode=0x004F, lccode=0x00F2, specials={'char',0x004F,0x0300} },
+ [0x00D3] = { unicodeslot=0x00D3, category='lu', adobename='Oacute', contextname='Oacute', description='LATIN CAPITAL LETTER O WITH ACUTE', shcode=0x004F, lccode=0x00F3, specials={'char',0x004F,0x0301} },
+ [0x00D4] = { unicodeslot=0x00D4, category='lu', adobename='Ocircumflex', contextname='Ocircumflex', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX', shcode=0x004F, lccode=0x00F4, specials={'char',0x004F,0x0302} },
+ [0x00D5] = { unicodeslot=0x00D5, category='lu', adobename='Otilde', contextname='Otilde', description='LATIN CAPITAL LETTER O WITH TILDE', shcode=0x004F, lccode=0x00F5, specials={'char',0x004F,0x0303} },
+ [0x00D6] = { unicodeslot=0x00D6, category='lu', adobename='Odieresis', contextname='Odiaeresis', description='LATIN CAPITAL LETTER O WITH DIAERESIS', shcode=0x004F, lccode=0x00F6, specials={'char',0x004F,0x0308} },
+ [0x00D7] = { unicodeslot=0x00D7, category='sm', adobename='multiply', contextname='textmultiply', description='MULTIPLICATION SIGN' },
+ [0x00D8] = { unicodeslot=0x00D8, category='lu', adobename='Oslash', contextname='Ostroke', description='LATIN CAPITAL LETTER O WITH STROKE', shcode=0x004F, lccode=0x00F8 },
+ [0x00D9] = { unicodeslot=0x00D9, category='lu', adobename='Ugrave', contextname='Ugrave', description='LATIN CAPITAL LETTER U WITH GRAVE', shcode=0x0055, lccode=0x00F9, specials={'char',0x0055,0x0300} },
+ [0x00DA] = { unicodeslot=0x00DA, category='lu', adobename='Uacute', contextname='Uacute', description='LATIN CAPITAL LETTER U WITH ACUTE', shcode=0x0055, lccode=0x00FA, specials={'char',0x0055,0x0301} },
+ [0x00DB] = { unicodeslot=0x00DB, category='lu', adobename='Ucircumflex', contextname='Ucircumflex', description='LATIN CAPITAL LETTER U WITH CIRCUMFLEX', shcode=0x0055, lccode=0x00FB, specials={'char',0x0055,0x0302} },
+ [0x00DC] = { unicodeslot=0x00DC, category='lu', adobename='Udieresis', contextname='Udiaeresis', description='LATIN CAPITAL LETTER U WITH DIAERESIS', shcode=0x0055, lccode=0x00FC, specials={'char',0x0055,0x0308} },
+ [0x00DD] = { unicodeslot=0x00DD, category='lu', adobename='Yacute', contextname='Yacute', description='LATIN CAPITAL LETTER Y WITH ACUTE', shcode=0x0059, lccode=0x00FD, specials={'char',0x0059,0x0301} },
+ [0x00DE] = { unicodeslot=0x00DE, category='lu', adobename='Thorn', contextname='Thorn', description='LATIN CAPITAL LETTER THORN', lccode=0x00FE },
+ [0x00DF] = { unicodeslot=0x00DF, category='ll', adobename='germandbls', contextname='ssharp', description='LATIN SMALL LETTER SHARP S' },
+ [0x00E0] = { unicodeslot=0x00E0, category='ll', adobename='agrave', contextname='agrave', description='LATIN SMALL LETTER A WITH GRAVE', shcode=0x0061, uccode=0x00C0, specials={'char',0x0061,0x0300} },
+ [0x00E1] = { unicodeslot=0x00E1, category='ll', adobename='aacute', contextname='aacute', description='LATIN SMALL LETTER A WITH ACUTE', shcode=0x0061, uccode=0x00C1, specials={'char',0x0061,0x0301} },
+ [0x00E2] = { unicodeslot=0x00E2, category='ll', adobename='acircumflex', contextname='acircumflex', description='LATIN SMALL LETTER A WITH CIRCUMFLEX', shcode=0x0061, uccode=0x00C2, specials={'char',0x0061,0x0302} },
+ [0x00E3] = { unicodeslot=0x00E3, category='ll', adobename='atilde', contextname='atilde', description='LATIN SMALL LETTER A WITH TILDE', shcode=0x0061, uccode=0x00C3, specials={'char',0x0061,0x0303} },
+ [0x00E4] = { unicodeslot=0x00E4, category='ll', adobename='adieresis', contextname='adiaeresis', description='LATIN SMALL LETTER A WITH DIAERESIS', shcode=0x0061, uccode=0x00C4, specials={'char',0x0061,0x0308} },
+ [0x00E5] = { unicodeslot=0x00E5, category='ll', adobename='aring', contextname='aring', description='LATIN SMALL LETTER A WITH RING ABOVE', shcode=0x0061, uccode=0x00C5, specials={'char',0x0061,0x030A} },
+ [0x00E6] = { unicodeslot=0x00E6, category='ll', adobename='ae', contextname='aeligature', description='LATIN SMALL LETTER AE', uccode=0x00C6 },
+ [0x00E7] = { unicodeslot=0x00E7, category='ll', adobename='ccedilla', contextname='ccedilla', description='LATIN SMALL LETTER C WITH CEDILLA', shcode=0x0063, uccode=0x00C7, specials={'char',0x0063,0x0327} },
+ [0x00E8] = { unicodeslot=0x00E8, category='ll', adobename='egrave', contextname='egrave', description='LATIN SMALL LETTER E WITH GRAVE', shcode=0x0065, uccode=0x00C8, specials={'char',0x0065,0x0300} },
+ [0x00E9] = { unicodeslot=0x00E9, category='ll', adobename='eacute', contextname='eacute', description='LATIN SMALL LETTER E WITH ACUTE', shcode=0x0065, uccode=0x00C9, specials={'char',0x0065,0x0301} },
+ [0x00EA] = { unicodeslot=0x00EA, category='ll', adobename='ecircumflex', contextname='ecircumflex', description='LATIN SMALL LETTER E WITH CIRCUMFLEX', shcode=0x0065, uccode=0x00CA, specials={'char',0x0065,0x0302} },
+ [0x00EB] = { unicodeslot=0x00EB, category='ll', adobename='edieresis', contextname='ediaeresis', description='LATIN SMALL LETTER E WITH DIAERESIS', shcode=0x0065, uccode=0x00CB, specials={'char',0x0065,0x0308} },
+ [0x00EC] = { unicodeslot=0x00EC, category='ll', adobename='igrave', contextname='igrave', description='LATIN SMALL LETTER I WITH GRAVE', shcode=0x0069, uccode=0x00CC, specials={'char',0x0069,0x0300} },
+ [0x00ED] = { unicodeslot=0x00ED, category='ll', adobename='iacute', contextname='iacute', description='LATIN SMALL LETTER I WITH ACUTE', shcode=0x0069, uccode=0x00CD, specials={'char',0x0069,0x0301} },
+ [0x00EE] = { unicodeslot=0x00EE, category='ll', adobename='icircumflex', contextname='icircumflex', description='LATIN SMALL LETTER I WITH CIRCUMFLEX', shcode=0x0069, uccode=0x00CE, specials={'char',0x0069,0x0302} },
+ [0x00EF] = { unicodeslot=0x00EF, category='ll', adobename='idieresis', contextname='idiaeresis', description='LATIN SMALL LETTER I WITH DIAERESIS', shcode=0x0069, uccode=0x00CF, specials={'char',0x0069,0x0308} },
+ [0x00F0] = { unicodeslot=0x00F0, category='ll', adobename='eth', contextname='eth', description='LATIN SMALL LETTER ETH', uccode=0x00D0 },
+ [0x00F1] = { unicodeslot=0x00F1, category='ll', adobename='ntilde', contextname='ntilde', description='LATIN SMALL LETTER N WITH TILDE', shcode=0x006E, uccode=0x00D1, specials={'char',0x006E,0x0303} },
+ [0x00F2] = { unicodeslot=0x00F2, category='ll', adobename='ograve', contextname='ograve', description='LATIN SMALL LETTER O WITH GRAVE', shcode=0x006F, uccode=0x00D2, specials={'char',0x006F,0x0300} },
+ [0x00F3] = { unicodeslot=0x00F3, category='ll', adobename='oacute', contextname='oacute', description='LATIN SMALL LETTER O WITH ACUTE', shcode=0x006F, uccode=0x00D3, specials={'char',0x006F,0x0301} },
+ [0x00F4] = { unicodeslot=0x00F4, category='ll', adobename='ocircumflex', contextname='ocircumflex', description='LATIN SMALL LETTER O WITH CIRCUMFLEX', shcode=0x006F, uccode=0x00D4, specials={'char',0x006F,0x0302} },
+ [0x00F5] = { unicodeslot=0x00F5, category='ll', adobename='otilde', contextname='otilde', description='LATIN SMALL LETTER O WITH TILDE', shcode=0x006F, uccode=0x00D5, specials={'char',0x006F,0x0303} },
+ [0x00F6] = { unicodeslot=0x00F6, category='ll', adobename='odieresis', contextname='odiaeresis', description='LATIN SMALL LETTER O WITH DIAERESIS', shcode=0x006F, uccode=0x00D6, specials={'char',0x006F,0x0308} },
+ [0x00F7] = { unicodeslot=0x00F7, category='sm', adobename='divide', contextname='textdiv', description='DIVISION SIGN' },
+ [0x00F8] = { unicodeslot=0x00F8, category='ll', adobename='oslash', contextname='ostroke', description='LATIN SMALL LETTER O WITH STROKE', shcode=0x006F, uccode=0x00D8 },
+ [0x00F9] = { unicodeslot=0x00F9, category='ll', adobename='ugrave', contextname='ugrave', description='LATIN SMALL LETTER U WITH GRAVE', shcode=0x0075, uccode=0x00D9, specials={'char',0x0075,0x0300} },
+ [0x00FA] = { unicodeslot=0x00FA, category='ll', adobename='uacute', contextname='uacute', description='LATIN SMALL LETTER U WITH ACUTE', shcode=0x0075, uccode=0x00DA, specials={'char',0x0075,0x0301} },
+ [0x00FB] = { unicodeslot=0x00FB, category='ll', adobename='ucircumflex', contextname='ucircumflex', description='LATIN SMALL LETTER U WITH CIRCUMFLEX', shcode=0x0075, uccode=0x00DB, specials={'char',0x0075,0x0302} },
+ [0x00FC] = { unicodeslot=0x00FC, category='ll', adobename='udieresis', contextname='udiaeresis', description='LATIN SMALL LETTER U WITH DIAERESIS', shcode=0x0075, uccode=0x00DC, specials={'char',0x0075,0x0308} },
+ [0x00FD] = { unicodeslot=0x00FD, category='ll', adobename='yacute', contextname='yacute', description='LATIN SMALL LETTER Y WITH ACUTE', shcode=0x0079, uccode=0x00DD, specials={'char',0x0079,0x0301} },
+ [0x00FE] = { unicodeslot=0x00FE, category='ll', adobename='thorn', contextname='thorn', description='LATIN SMALL LETTER THORN', uccode=0x00DE },
+ [0x00FF] = { unicodeslot=0x00FF, category='ll', adobename='ydieresis', contextname='ydiaeresis', description='LATIN SMALL LETTER Y WITH DIAERESIS', shcode=0x0079, uccode=0x0178, specials={'char',0x0079,0x0308} },
+ [0x0100] = { unicodeslot=0x0100, category='lu', adobename='Amacron', contextname='Amacron', description='LATIN CAPITAL LETTER A WITH MACRON', shcode=0x0041, lccode=0x0101, specials={'char',0x0041,0x0304} },
+ [0x0101] = { unicodeslot=0x0101, category='ll', adobename='amacron', contextname='amacron', description='LATIN SMALL LETTER A WITH MACRON', shcode=0x0061, uccode=0x0100, specials={'char',0x0061,0x0304} },
+ [0x0102] = { unicodeslot=0x0102, category='lu', adobename='Abreve', contextname='Abreve', description='LATIN CAPITAL LETTER A WITH BREVE', shcode=0x0041, lccode=0x0103, specials={'char',0x0041,0x0306} },
+ [0x0103] = { unicodeslot=0x0103, category='ll', adobename='abreve', contextname='abreve', description='LATIN SMALL LETTER A WITH BREVE', shcode=0x0061, uccode=0x0102, specials={'char',0x0061,0x0306} },
+ [0x0104] = { unicodeslot=0x0104, category='lu', adobename='Aogonek', contextname='Aogonek', description='LATIN CAPITAL LETTER A WITH OGONEK', shcode=0x0041, lccode=0x0105, specials={'char',0x0041,0x0328} },
+ [0x0105] = { unicodeslot=0x0105, category='ll', adobename='aogonek', contextname='aogonek', description='LATIN SMALL LETTER A WITH OGONEK', shcode=0x0061, uccode=0x0104, specials={'char',0x0061,0x0328} },
+ [0x0106] = { unicodeslot=0x0106, category='lu', adobename='Cacute', contextname='Cacute', description='LATIN CAPITAL LETTER C WITH ACUTE', shcode=0x0043, lccode=0x0107, specials={'char',0x0043,0x0301} },
+ [0x0107] = { unicodeslot=0x0107, category='ll', adobename='cacute', contextname='cacute', description='LATIN SMALL LETTER C WITH ACUTE', shcode=0x0063, uccode=0x0106, specials={'char',0x0063,0x0301} },
+ [0x0108] = { unicodeslot=0x0108, category='lu', adobename='Ccircumflex', contextname='Ccircumflex', description='LATIN CAPITAL LETTER C WITH CIRCUMFLEX', shcode=0x0043, lccode=0x0109, specials={'char',0x0043,0x0302} },
+ [0x0109] = { unicodeslot=0x0109, category='ll', adobename='ccircumflex', contextname='ccircumflex', description='LATIN SMALL LETTER C WITH CIRCUMFLEX', shcode=0x0063, uccode=0x0108, specials={'char',0x0063,0x0302} },
+ [0x010A] = { unicodeslot=0x010A, category='lu', adobename='Cdotaccent', contextname='Cdotaccent', description='LATIN CAPITAL LETTER C WITH DOT ABOVE', shcode=0x0043, lccode=0x010B, specials={'char',0x0043,0x0307} },
+ [0x010B] = { unicodeslot=0x010B, category='ll', adobename='cdotaccent', contextname='cdotaccent', description='LATIN SMALL LETTER C WITH DOT ABOVE', shcode=0x0063, uccode=0x010A, specials={'char',0x0063,0x0307} },
+ [0x010C] = { unicodeslot=0x010C, category='lu', adobename='Ccaron', contextname='Ccaron', description='LATIN CAPITAL LETTER C WITH CARON', shcode=0x0043, lccode=0x010D, specials={'char',0x0043,0x030C} },
+ [0x010D] = { unicodeslot=0x010D, category='ll', adobename='ccaron', contextname='ccaron', description='LATIN SMALL LETTER C WITH CARON', shcode=0x0063, uccode=0x010C, specials={'char',0x0063,0x030C} },
+ [0x010E] = { unicodeslot=0x010E, category='lu', adobename='Dcaron', contextname='Dcaron', description='LATIN CAPITAL LETTER D WITH CARON', shcode=0x0044, lccode=0x010F, specials={'char',0x0044,0x030C} },
+ [0x010F] = { unicodeslot=0x010F, category='ll', adobename='dcaron', contextname='dcaron', description='LATIN SMALL LETTER D WITH CARON', shcode=0x0064, uccode=0x010E, specials={'char',0x0064,0x030C} },
+ [0x0110] = { unicodeslot=0x0110, category='lu', adobename='Dcroat', contextname='Dstroke', description='LATIN CAPITAL LETTER D WITH STROKE', shcode=0x0044, lccode=0x0111 },
+ [0x0111] = { unicodeslot=0x0111, category='ll', adobename='dcroat', contextname='dstroke', description='LATIN SMALL LETTER D WITH STROKE', shcode=0x0064, uccode=0x0110 },
+ [0x0112] = { unicodeslot=0x0112, category='lu', adobename='Emacron', contextname='Emacron', description='LATIN CAPITAL LETTER E WITH MACRON', shcode=0x0045, lccode=0x0113, specials={'char',0x0045,0x0304} },
+ [0x0113] = { unicodeslot=0x0113, category='ll', adobename='emacron', contextname='emacron', description='LATIN SMALL LETTER E WITH MACRON', shcode=0x0065, uccode=0x0112, specials={'char',0x0065,0x0304} },
+ [0x0114] = { unicodeslot=0x0114, category='lu', adobename='Ebreve', contextname='Ebreve', description='LATIN CAPITAL LETTER E WITH BREVE', shcode=0x0045, lccode=0x0115, specials={'char',0x0045,0x0306} },
+ [0x0115] = { unicodeslot=0x0115, category='ll', adobename='ebreve', contextname='ebreve', description='LATIN SMALL LETTER E WITH BREVE', shcode=0x0065, uccode=0x0114, specials={'char',0x0065,0x0306} },
+ [0x0116] = { unicodeslot=0x0116, category='lu', adobename='Edotaccent', contextname='Edotaccent', description='LATIN CAPITAL LETTER E WITH DOT ABOVE', shcode=0x0045, lccode=0x0117, specials={'char',0x0045,0x0307} },
+ [0x0117] = { unicodeslot=0x0117, category='ll', adobename='edotaccent', contextname='edotaccent', description='LATIN SMALL LETTER E WITH DOT ABOVE', shcode=0x0065, uccode=0x0116, specials={'char',0x0065,0x0307} },
+ [0x0118] = { unicodeslot=0x0118, category='lu', adobename='Eogonek', contextname='Eogonek', description='LATIN CAPITAL LETTER E WITH OGONEK', shcode=0x0045, lccode=0x0119, specials={'char',0x0045,0x0328} },
+ [0x0119] = { unicodeslot=0x0119, category='ll', adobename='eogonek', contextname='eogonek', description='LATIN SMALL LETTER E WITH OGONEK', shcode=0x0065, uccode=0x0118, specials={'char',0x0065,0x0328} },
+ [0x011A] = { unicodeslot=0x011A, category='lu', adobename='Ecaron', contextname='Ecaron', description='LATIN CAPITAL LETTER E WITH CARON', shcode=0x0045, lccode=0x011B, specials={'char',0x0045,0x030C} },
+ [0x011B] = { unicodeslot=0x011B, category='ll', adobename='ecaron', contextname='ecaron', description='LATIN SMALL LETTER E WITH CARON', shcode=0x0065, uccode=0x011A, specials={'char',0x0065,0x030C} },
+ [0x011C] = { unicodeslot=0x011C, category='lu', adobename='Gcircumflex', contextname='Gcircumflex', description='LATIN CAPITAL LETTER G WITH CIRCUMFLEX', shcode=0x0047, lccode=0x011D, specials={'char',0x0047,0x0302} },
+ [0x011D] = { unicodeslot=0x011D, category='ll', adobename='gcircumflex', contextname='gcircumflex', description='LATIN SMALL LETTER G WITH CIRCUMFLEX', shcode=0x0067, uccode=0x011C, specials={'char',0x0067,0x0302} },
+ [0x011E] = { unicodeslot=0x011E, category='lu', adobename='Gbreve', contextname='Gbreve', description='LATIN CAPITAL LETTER G WITH BREVE', shcode=0x0047, lccode=0x011F, specials={'char',0x0047,0x0306} },
+ [0x011F] = { unicodeslot=0x011F, category='ll', adobename='gbreve', contextname='gbreve', description='LATIN SMALL LETTER G WITH BREVE', shcode=0x0067, uccode=0x011E, specials={'char',0x0067,0x0306} },
+ [0x0120] = { unicodeslot=0x0120, category='lu', adobename='Gdotaccent', contextname='Gdotaccent', description='LATIN CAPITAL LETTER G WITH DOT ABOVE', shcode=0x0047, lccode=0x0121, specials={'char',0x0047,0x0307} },
+ [0x0121] = { unicodeslot=0x0121, category='ll', adobename='gdotaccent', contextname='gdotaccent', description='LATIN SMALL LETTER G WITH DOT ABOVE', shcode=0x0067, uccode=0x0120, specials={'char',0x0067,0x0307} },
+ [0x0122] = { unicodeslot=0x0122, category='lu', adobename='Gcommaaccent', contextname='Gcommaaccent', description='LATIN CAPITAL LETTER G WITH CEDILLA', shcode=0x0047, lccode=0x0123, specials={'char',0x0047,0x0327} },
+ [0x0123] = { unicodeslot=0x0123, category='ll', adobename='gcommaaccent', contextname='gcommaaccent', description='LATIN SMALL LETTER G WITH CEDILLA', shcode=0x0067, uccode=0x0122, specials={'char',0x0067,0x0327} },
+ [0x0124] = { unicodeslot=0x0124, category='lu', adobename='Hcircumflex', contextname='Hcircumflex', description='LATIN CAPITAL LETTER H WITH CIRCUMFLEX', shcode=0x0048, lccode=0x0125, specials={'char',0x0048,0x0302} },
+ [0x0125] = { unicodeslot=0x0125, category='ll', adobename='hcircumflex', contextname='hcircumflex', description='LATIN SMALL LETTER H WITH CIRCUMFLEX', shcode=0x0068, uccode=0x0124, specials={'char',0x0068,0x0302} },
+ [0x0126] = { unicodeslot=0x0126, category='lu', adobename='Hbar', contextname='Hstroke', description='LATIN CAPITAL LETTER H WITH STROKE', shcode=0x0048, lccode=0x0127 },
+ [0x0127] = { unicodeslot=0x0127, category='ll', adobename='hbar', contextname='hstroke', description='LATIN SMALL LETTER H WITH STROKE', shcode=0x0068, uccode=0x0126 },
+ [0x0128] = { unicodeslot=0x0128, category='lu', adobename='Itilde', contextname='Itilde', description='LATIN CAPITAL LETTER I WITH TILDE', shcode=0x0049, lccode=0x0129, specials={'char',0x0049,0x0303} },
+ [0x0129] = { unicodeslot=0x0129, category='ll', adobename='itilde', contextname='itilde', description='LATIN SMALL LETTER I WITH TILDE', shcode=0x0069, uccode=0x0128, specials={'char',0x0069,0x0303} },
+ [0x012A] = { unicodeslot=0x012A, category='lu', adobename='Imacron', contextname='Imacron', description='LATIN CAPITAL LETTER I WITH MACRON', shcode=0x0049, lccode=0x012B, specials={'char',0x0049,0x0304} },
+ [0x012B] = { unicodeslot=0x012B, category='ll', adobename='imacron', contextname='imacron', description='LATIN SMALL LETTER I WITH MACRON', shcode=0x0069, uccode=0x012A, specials={'char',0x0069,0x0304} },
+ [0x012C] = { unicodeslot=0x012C, category='lu', adobename='Ibreve', contextname='Ibreve', description='LATIN CAPITAL LETTER I WITH BREVE', shcode=0x0049, lccode=0x012D, specials={'char',0x0049,0x0306} },
+ [0x012D] = { unicodeslot=0x012D, category='ll', adobename='ibreve', contextname='ibreve', description='LATIN SMALL LETTER I WITH BREVE', shcode=0x0069, uccode=0x012C, specials={'char',0x0069,0x0306} },
+ [0x012E] = { unicodeslot=0x012E, category='lu', adobename='Iogonek', contextname='Iogonek', description='LATIN CAPITAL LETTER I WITH OGONEK', shcode=0x0049, lccode=0x012F, specials={'char',0x0049,0x0328} },
+ [0x012F] = { unicodeslot=0x012F, category='ll', adobename='iogonek', contextname='iogonek', description='LATIN SMALL LETTER I WITH OGONEK', shcode=0x0069, uccode=0x012E, specials={'char',0x0069,0x0328} },
+ [0x0130] = { unicodeslot=0x0130, category='lu', adobename='Idotaccent', contextname='Idotaccent', description='LATIN CAPITAL LETTER I WITH DOT ABOVE', shcode=0x0049, lccode=0x0069, specials={'char',0x0049,0x0307} },
+ [0x0131] = { unicodeslot=0x0131, category='ll', adobename='dotlessi', contextname='dotlessi', description='LATIN SMALL LETTER DOTLESS I', uccode=0x0049 },
+ [0x0132] = { unicodeslot=0x0132, category='lu', adobename='IJ', contextname='IJligature', description='LATIN CAPITAL LIGATURE IJ', lccode=0x0133, specials={'compat',0x0049,0x004A} },
+ [0x0133] = { unicodeslot=0x0133, category='ll', adobename='ij', contextname='ijligature', description='LATIN SMALL LIGATURE IJ', uccode=0x0132, specials={'compat',0x0069,0x006A} },
+ [0x0134] = { unicodeslot=0x0134, category='lu', adobename='Jcircumflex', contextname='Jcircumflex', description='LATIN CAPITAL LETTER J WITH CIRCUMFLEX', shcode=0x004A, lccode=0x0135, specials={'char',0x004A,0x0302} },
+ [0x0135] = { unicodeslot=0x0135, category='ll', adobename='jcircumflex', contextname='jcircumflex', description='LATIN SMALL LETTER J WITH CIRCUMFLEX', shcode=0x006A, uccode=0x0134, specials={'char',0x006A,0x0302} },
+ [0x0136] = { unicodeslot=0x0136, category='lu', adobename='Kcommaaccent', contextname='Kcommaaccent', description='LATIN CAPITAL LETTER K WITH CEDILLA', shcode=0x004B, lccode=0x0137, specials={'char',0x004B,0x0327} },
+ [0x0137] = { unicodeslot=0x0137, category='ll', adobename='kcommaaccent', contextname='kcommaaccent', description='LATIN SMALL LETTER K WITH CEDILLA', shcode=0x006B, uccode=0x0136, specials={'char',0x006B,0x0327} },
+ [0x0138] = { unicodeslot=0x0138, category='ll', adobename='kgreenlandic', contextname='kkra', description='LATIN SMALL LETTER KRA' },
+ [0x0139] = { unicodeslot=0x0139, category='lu', adobename='Lacute', contextname='Lacute', description='LATIN CAPITAL LETTER L WITH ACUTE', shcode=0x004C, lccode=0x013A, specials={'char',0x004C,0x0301} },
+ [0x013A] = { unicodeslot=0x013A, category='ll', adobename='lacute', contextname='lacute', description='LATIN SMALL LETTER L WITH ACUTE', shcode=0x006C, uccode=0x0139, specials={'char',0x006C,0x0301} },
+ [0x013B] = { unicodeslot=0x013B, category='lu', adobename='Lcommaaccent', contextname='Lcommaaccent', description='LATIN CAPITAL LETTER L WITH CEDILLA', shcode=0x004C, lccode=0x013C, specials={'char',0x004C,0x0327} },
+ [0x013C] = { unicodeslot=0x013C, category='ll', adobename='lcommaaccent', contextname='lcommaaccent', description='LATIN SMALL LETTER L WITH CEDILLA', shcode=0x006C, uccode=0x013B, specials={'char',0x006C,0x0327} },
+ [0x013D] = { unicodeslot=0x013D, category='lu', adobename='Lcaron', contextname='Lcaron', description='LATIN CAPITAL LETTER L WITH CARON', shcode=0x004C, lccode=0x013E, specials={'char',0x004C,0x030C} },
+ [0x013E] = { unicodeslot=0x013E, category='ll', adobename='lcaron', contextname='lcaron', description='LATIN SMALL LETTER L WITH CARON', shcode=0x006C, uccode=0x013D, specials={'char',0x006C,0x030C} },
+ [0x013F] = { unicodeslot=0x013F, category='lu', adobename='Ldot', contextname='Ldotmiddle', description='LATIN CAPITAL LETTER L WITH MIDDLE DOT', shcode=0x004C, lccode=0x0140, specials={'compat',0x004C,0x00B7} },
+ [0x0140] = { unicodeslot=0x0140, category='ll', adobename='ldot', contextname='ldotmiddle', description='LATIN SMALL LETTER L WITH MIDDLE DOT', shcode=0x006C, uccode=0x013F, specials={'compat',0x006C,0x00B7} },
+ [0x0141] = { unicodeslot=0x0141, category='lu', adobename='Lslash', contextname='Lstroke', description='LATIN CAPITAL LETTER L WITH STROKE', shcode=0x004C, lccode=0x0142 },
+ [0x0142] = { unicodeslot=0x0142, category='ll', adobename='lslash', contextname='lstroke', description='LATIN SMALL LETTER L WITH STROKE', shcode=0x006C, uccode=0x0141 },
+ [0x0143] = { unicodeslot=0x0143, category='lu', adobename='Nacute', contextname='Nacute', description='LATIN CAPITAL LETTER N WITH ACUTE', shcode=0x004E, lccode=0x0144, specials={'char',0x004E,0x0301} },
+ [0x0144] = { unicodeslot=0x0144, category='ll', adobename='nacute', contextname='nacute', description='LATIN SMALL LETTER N WITH ACUTE', shcode=0x006E, uccode=0x0143, specials={'char',0x006E,0x0301} },
+ [0x0145] = { unicodeslot=0x0145, category='lu', adobename='Ncommaaccent', contextname='Ncommaaccent', description='LATIN CAPITAL LETTER N WITH CEDILLA', shcode=0x004E, lccode=0x0146, specials={'char',0x004E,0x0327} },
+ [0x0146] = { unicodeslot=0x0146, category='ll', adobename='ncommaaccent', contextname='ncommaaccent', description='LATIN SMALL LETTER N WITH CEDILLA', shcode=0x006E, uccode=0x0145, specials={'char',0x006E,0x0327} },
+ [0x0147] = { unicodeslot=0x0147, category='lu', adobename='Ncaron', contextname='Ncaron', description='LATIN CAPITAL LETTER N WITH CARON', shcode=0x004E, lccode=0x0148, specials={'char',0x004E,0x030C} },
+ [0x0148] = { unicodeslot=0x0148, category='ll', adobename='ncaron', contextname='ncaron', description='LATIN SMALL LETTER N WITH CARON', shcode=0x006E, uccode=0x0147, specials={'char',0x006E,0x030C} },
+ [0x0149] = { unicodeslot=0x0149, category='ll', adobename='napostrophe', contextname='napostrophe', description='LATIN SMALL LETTER N PRECEDED BY APOSTROPHE', specials={'compat',0x02BC,0x006E} },
+ [0x014A] = { unicodeslot=0x014A, category='lu', adobename='Eng', contextname='Neng', description='LATIN CAPITAL LETTER ENG', lccode=0x014B },
+ [0x014B] = { unicodeslot=0x014B, category='ll', adobename='eng', contextname='neng', description='LATIN SMALL LETTER ENG', uccode=0x014A },
+ [0x014C] = { unicodeslot=0x014C, category='lu', adobename='Omacron', contextname='Omacron', description='LATIN CAPITAL LETTER O WITH MACRON', shcode=0x004F, lccode=0x014D, specials={'char',0x004F,0x0304} },
+ [0x014D] = { unicodeslot=0x014D, category='ll', adobename='omacron', contextname='omacron', description='LATIN SMALL LETTER O WITH MACRON', shcode=0x006F, uccode=0x014C, specials={'char',0x006F,0x0304} },
+ [0x014E] = { unicodeslot=0x014E, category='lu', adobename='Obreve', contextname='Obreve', description='LATIN CAPITAL LETTER O WITH BREVE', shcode=0x004F, lccode=0x014F, specials={'char',0x004F,0x0306} },
+ [0x014F] = { unicodeslot=0x014F, category='ll', adobename='obreve', contextname='obreve', description='LATIN SMALL LETTER O WITH BREVE', shcode=0x006F, uccode=0x014E, specials={'char',0x006F,0x0306} },
+ [0x0150] = { unicodeslot=0x0150, category='lu', adobename='Ohungarumlaut', contextname='Ohungarumlaut', description='LATIN CAPITAL LETTER O WITH DOUBLE ACUTE', shcode=0x004F, lccode=0x0151, specials={'char',0x004F,0x030B} },
+ [0x0151] = { unicodeslot=0x0151, category='ll', adobename='ohungarumlaut', contextname='ohungarumlaut', description='LATIN SMALL LETTER O WITH DOUBLE ACUTE', shcode=0x006F, uccode=0x0150, specials={'char',0x006F,0x030B} },
+ [0x0152] = { unicodeslot=0x0152, category='lu', adobename='OE', contextname='OEligature', description='LATIN CAPITAL LIGATURE OE', lccode=0x0153 },
+ [0x0153] = { unicodeslot=0x0153, category='ll', adobename='oe', contextname='oeligature', description='LATIN SMALL LIGATURE OE', uccode=0x0152 },
+ [0x0154] = { unicodeslot=0x0154, category='lu', adobename='Racute', contextname='Racute', description='LATIN CAPITAL LETTER R WITH ACUTE', shcode=0x0052, lccode=0x0155, specials={'char',0x0052,0x0301} },
+ [0x0155] = { unicodeslot=0x0155, category='ll', adobename='racute', contextname='racute', description='LATIN SMALL LETTER R WITH ACUTE', shcode=0x0072, uccode=0x0154, specials={'char',0x0072,0x0301} },
+ [0x0156] = { unicodeslot=0x0156, category='lu', adobename='Rcommaaccent', contextname='Rcommaaccent', description='LATIN CAPITAL LETTER R WITH CEDILLA', shcode=0x0052, lccode=0x0157, specials={'char',0x0052,0x0327} },
+ [0x0157] = { unicodeslot=0x0157, category='ll', adobename='rcommaaccent', contextname='rcommaaccent', description='LATIN SMALL LETTER R WITH CEDILLA', shcode=0x0072, uccode=0x0156, specials={'char',0x0072,0x0327} },
+ [0x0158] = { unicodeslot=0x0158, category='lu', adobename='Rcaron', contextname='Rcaron', description='LATIN CAPITAL LETTER R WITH CARON', shcode=0x0052, lccode=0x0159, specials={'char',0x0052,0x030C} },
+ [0x0159] = { unicodeslot=0x0159, category='ll', adobename='rcaron', contextname='rcaron', description='LATIN SMALL LETTER R WITH CARON', shcode=0x0072, uccode=0x0158, specials={'char',0x0072,0x030C} },
+ [0x015A] = { unicodeslot=0x015A, category='lu', adobename='Sacute', contextname='Sacute', description='LATIN CAPITAL LETTER S WITH ACUTE', shcode=0x0053, lccode=0x015B, specials={'char',0x0053,0x0301} },
+ [0x015B] = { unicodeslot=0x015B, category='ll', adobename='sacute', contextname='sacute', description='LATIN SMALL LETTER S WITH ACUTE', shcode=0x0073, uccode=0x015A, specials={'char',0x0073,0x0301} },
+ [0x015C] = { unicodeslot=0x015C, category='lu', adobename='Scircumflex', contextname='Scircumflex', description='LATIN CAPITAL LETTER S WITH CIRCUMFLEX', shcode=0x0053, lccode=0x015D, specials={'char',0x0053,0x0302} },
+ [0x015D] = { unicodeslot=0x015D, category='ll', adobename='scircumflex', contextname='scircumflex', description='LATIN SMALL LETTER S WITH CIRCUMFLEX', shcode=0x0073, uccode=0x015C, specials={'char',0x0073,0x0302} },
+ [0x015E] = { unicodeslot=0x015E, category='lu', adobename='Scedilla', contextname='Scedilla', description='LATIN CAPITAL LETTER S WITH CEDILLA', shcode=0x0053, lccode=0x015F, specials={'char',0x0053,0x0327} },
+ [0x015F] = { unicodeslot=0x015F, category='ll', adobename='scedilla', contextname='scedilla', description='LATIN SMALL LETTER S WITH CEDILLA', shcode=0x0073, uccode=0x015E, specials={'char',0x0073,0x0327} },
+ [0x0160] = { unicodeslot=0x0160, category='lu', adobename='Scaron', contextname='Scaron', description='LATIN CAPITAL LETTER S WITH CARON', shcode=0x0053, lccode=0x0161, specials={'char',0x0053,0x030C} },
+ [0x0161] = { unicodeslot=0x0161, category='ll', adobename='scaron', contextname='scaron', description='LATIN SMALL LETTER S WITH CARON', shcode=0x0073, uccode=0x0160, specials={'char',0x0073,0x030C} },
+ [0x0162] = { unicodeslot=0x0162, category='lu', adobename='Tcommaaccent', contextname='Tcedilla', description='LATIN CAPITAL LETTER T WITH CEDILLA', shcode=0x0054, lccode=0x0163, specials={'char',0x0054,0x0327} },
+ [0x0163] = { unicodeslot=0x0163, category='ll', adobename='tcommaaccent', contextname='tcedilla', description='LATIN SMALL LETTER T WITH CEDILLA', shcode=0x0074, uccode=0x0162, specials={'char',0x0074,0x0327} },
+ [0x0164] = { unicodeslot=0x0164, category='lu', adobename='Tcaron', contextname='Tcaron', description='LATIN CAPITAL LETTER T WITH CARON', shcode=0x0054, lccode=0x0165, specials={'char',0x0054,0x030C} },
+ [0x0165] = { unicodeslot=0x0165, category='ll', adobename='tcaron', contextname='tcaron', description='LATIN SMALL LETTER T WITH CARON', shcode=0x0074, uccode=0x0164, specials={'char',0x0074,0x030C} },
+ [0x0166] = { unicodeslot=0x0166, category='lu', adobename='Tbar', contextname='Tstroke', description='LATIN CAPITAL LETTER T WITH STROKE', shcode=0x0054, lccode=0x0167 },
+ [0x0167] = { unicodeslot=0x0167, category='ll', adobename='tbar', contextname='tstroke', description='LATIN SMALL LETTER T WITH STROKE', shcode=0x0074, uccode=0x0166 },
+ [0x0168] = { unicodeslot=0x0168, category='lu', adobename='Utilde', contextname='Utilde', description='LATIN CAPITAL LETTER U WITH TILDE', shcode=0x0055, lccode=0x0169, specials={'char',0x0055,0x0303} },
+ [0x0169] = { unicodeslot=0x0169, category='ll', adobename='utilde', contextname='utilde', description='LATIN SMALL LETTER U WITH TILDE', shcode=0x0075, uccode=0x0168, specials={'char',0x0075,0x0303} },
+ [0x016A] = { unicodeslot=0x016A, category='lu', adobename='Umacron', contextname='Umacron', description='LATIN CAPITAL LETTER U WITH MACRON', shcode=0x0055, lccode=0x016B, specials={'char',0x0055,0x0304} },
+ [0x016B] = { unicodeslot=0x016B, category='ll', adobename='umacron', contextname='umacron', description='LATIN SMALL LETTER U WITH MACRON', shcode=0x0075, uccode=0x016A, specials={'char',0x0075,0x0304} },
+ [0x016C] = { unicodeslot=0x016C, category='lu', adobename='Ubreve', contextname='Ubreve', description='LATIN CAPITAL LETTER U WITH BREVE', shcode=0x0055, lccode=0x016D, specials={'char',0x0055,0x0306} },
+ [0x016D] = { unicodeslot=0x016D, category='ll', adobename='ubreve', contextname='ubreve', description='LATIN SMALL LETTER U WITH BREVE', shcode=0x0075, uccode=0x016C, specials={'char',0x0075,0x0306} },
+ [0x016E] = { unicodeslot=0x016E, category='lu', adobename='Uring', contextname='Uring', description='LATIN CAPITAL LETTER U WITH RING ABOVE', shcode=0x0055, lccode=0x016F, specials={'char',0x0055,0x030A} },
+ [0x016F] = { unicodeslot=0x016F, category='ll', adobename='uring', contextname='uring', description='LATIN SMALL LETTER U WITH RING ABOVE', shcode=0x0075, uccode=0x016E, specials={'char',0x0075,0x030A} },
+ [0x0170] = { unicodeslot=0x0170, category='lu', adobename='Uhungarumlaut', contextname='Uhungarumlaut', description='LATIN CAPITAL LETTER U WITH DOUBLE ACUTE', shcode=0x0055, lccode=0x0171, specials={'char',0x0055,0x030B} },
+ [0x0171] = { unicodeslot=0x0171, category='ll', adobename='uhungarumlaut', contextname='uhungarumlaut', description='LATIN SMALL LETTER U WITH DOUBLE ACUTE', shcode=0x0075, uccode=0x0170, specials={'char',0x0075,0x030B} },
+ [0x0172] = { unicodeslot=0x0172, category='lu', adobename='Uogonek', contextname='Uogonek', description='LATIN CAPITAL LETTER U WITH OGONEK', shcode=0x0055, lccode=0x0173, specials={'char',0x0055,0x0328} },
+ [0x0173] = { unicodeslot=0x0173, category='ll', adobename='uogonek', contextname='uogonek', description='LATIN SMALL LETTER U WITH OGONEK', shcode=0x0075, uccode=0x0172, specials={'char',0x0075,0x0328} },
+ [0x0174] = { unicodeslot=0x0174, category='lu', adobename='Wcircumflex', contextname='Wcircumflex', description='LATIN CAPITAL LETTER W WITH CIRCUMFLEX', shcode=0x0057, lccode=0x0175, specials={'char',0x0057,0x0302} },
+ [0x0175] = { unicodeslot=0x0175, category='ll', adobename='wcircumflex', contextname='wcircumflex', description='LATIN SMALL LETTER W WITH CIRCUMFLEX', shcode=0x0077, uccode=0x0174, specials={'char',0x0077,0x0302} },
+ [0x0176] = { unicodeslot=0x0176, category='lu', adobename='Ycircumflex', contextname='Ycircumflex', description='LATIN CAPITAL LETTER Y WITH CIRCUMFLEX', shcode=0x0059, lccode=0x0177, specials={'char',0x0059,0x0302} },
+ [0x0177] = { unicodeslot=0x0177, category='ll', adobename='ycircumflex', contextname='ycircumflex', description='LATIN SMALL LETTER Y WITH CIRCUMFLEX', shcode=0x0079, uccode=0x0176, specials={'char',0x0079,0x0302} },
+ [0x0178] = { unicodeslot=0x0178, category='lu', adobename='Ydieresis', contextname='Ydiaeresis', description='LATIN CAPITAL LETTER Y WITH DIAERESIS', shcode=0x0059, lccode=0x00FF, specials={'char',0x0059,0x0308} },
+ [0x0179] = { unicodeslot=0x0179, category='lu', adobename='Zacute', contextname='Zacute', description='LATIN CAPITAL LETTER Z WITH ACUTE', shcode=0x005A, lccode=0x017A, specials={'char',0x005A,0x0301} },
+ [0x017A] = { unicodeslot=0x017A, category='ll', adobename='zacute', contextname='zacute', description='LATIN SMALL LETTER Z WITH ACUTE', shcode=0x007A, uccode=0x0179, specials={'char',0x007A,0x0301} },
+ [0x017B] = { unicodeslot=0x017B, category='lu', adobename='Zdotaccent', contextname='Zdotaccent', description='LATIN CAPITAL LETTER Z WITH DOT ABOVE', shcode=0x005A, lccode=0x017C, specials={'char',0x005A,0x0307} },
+ [0x017C] = { unicodeslot=0x017C, category='ll', adobename='zdotaccent', contextname='zdotaccent', description='LATIN SMALL LETTER Z WITH DOT ABOVE', shcode=0x007A, uccode=0x017B, specials={'char',0x007A,0x0307} },
+ [0x017D] = { unicodeslot=0x017D, category='lu', adobename='Zcaron', contextname='Zcaron', description='LATIN CAPITAL LETTER Z WITH CARON', shcode=0x005A, lccode=0x017E, specials={'char',0x005A,0x030C} },
+ [0x017E] = { unicodeslot=0x017E, category='ll', adobename='zcaron', contextname='zcaron', description='LATIN SMALL LETTER Z WITH CARON', shcode=0x007A, uccode=0x017D, specials={'char',0x007A,0x030C} },
+ [0x017F] = { unicodeslot=0x017F, category='ll', adobename='longs', contextname='slong', description='LATIN SMALL LETTER LONG S', uccode=0x0053, specials={'compat',0x0073} },
+ [0x0180] = { unicodeslot=0x0180, category='ll', contextname='bstroke', description='LATIN SMALL LETTER B WITH STROKE', shcode=0x0062, uccode=0x0243 },
+ [0x0181] = { unicodeslot=0x0181, category='lu', contextname='Bhook', description='LATIN CAPITAL LETTER B WITH HOOK', shcode=0x0042, lccode=0x0253 },
+ [0x0182] = { unicodeslot=0x0182, category='lu', description='LATIN CAPITAL LETTER B WITH TOPBAR', shcode=0x0042, lccode=0x0183 },
+ [0x0183] = { unicodeslot=0x0183, category='ll', description='LATIN SMALL LETTER B WITH TOPBAR', shcode=0x0062, uccode=0x0182 },
+ [0x0184] = { unicodeslot=0x0184, category='lu', description='LATIN CAPITAL LETTER TONE SIX', lccode=0x0185 },
+ [0x0185] = { unicodeslot=0x0185, category='ll', description='LATIN SMALL LETTER TONE SIX', uccode=0x0184 },
+ [0x0186] = { unicodeslot=0x0186, category='lu', description='LATIN CAPITAL LETTER OPEN O', lccode=0x0254 },
+ [0x0187] = { unicodeslot=0x0187, category='lu', contextname='Chook', description='LATIN CAPITAL LETTER C WITH HOOK', shcode=0x0043, lccode=0x0188 },
+ [0x0188] = { unicodeslot=0x0188, category='ll', contextname='chook', description='LATIN SMALL LETTER C WITH HOOK', shcode=0x0063, uccode=0x0187 },
+ [0x0189] = { unicodeslot=0x0189, category='lu', contextname='Dafrican', description='LATIN CAPITAL LETTER AFRICAN D', lccode=0x0256 },
+ [0x018A] = { unicodeslot=0x018A, category='lu', contextname='Dhook', description='LATIN CAPITAL LETTER D WITH HOOK', shcode=0x0044, lccode=0x0257 },
+ [0x018B] = { unicodeslot=0x018B, category='lu', description='LATIN CAPITAL LETTER D WITH TOPBAR', shcode=0x0044, lccode=0x018C },
+ [0x018C] = { unicodeslot=0x018C, category='ll', description='LATIN SMALL LETTER D WITH TOPBAR', shcode=0x0064, uccode=0x018B },
+ [0x018D] = { unicodeslot=0x018D, category='ll', description='LATIN SMALL LETTER TURNED DELTA' },
+ [0x018E] = { unicodeslot=0x018E, category='lu', description='LATIN CAPITAL LETTER REVERSED E', lccode=0x01DD },
+ [0x018F] = { unicodeslot=0x018F, category='lu', contextname='Schwa', description='LATIN CAPITAL LETTER SCHWA', lccode=0x0259 },
+ [0x0190] = { unicodeslot=0x0190, category='lu', description='LATIN CAPITAL LETTER OPEN E', lccode=0x025B },
+ [0x0191] = { unicodeslot=0x0191, category='lu', contextname='Fhook', description='LATIN CAPITAL LETTER F WITH HOOK', shcode=0x0046, lccode=0x0192 },
+ [0x0192] = { unicodeslot=0x0192, category='ll', adobename='florin', contextname='fhook', description='LATIN SMALL LETTER F WITH HOOK', shcode=0x0066, uccode=0x0191 },
+ [0x0193] = { unicodeslot=0x0193, category='lu', contextname='Ghook', description='LATIN CAPITAL LETTER G WITH HOOK', shcode=0x0047, lccode=0x0260 },
+ [0x0194] = { unicodeslot=0x0194, category='lu', description='LATIN CAPITAL LETTER GAMMA', lccode=0x0263 },
+ [0x0195] = { unicodeslot=0x0195, category='ll', description='LATIN SMALL LETTER HV', uccode=0x01F6 },
+ [0x0196] = { unicodeslot=0x0196, category='lu', description='LATIN CAPITAL LETTER IOTA', lccode=0x0269 },
+ [0x0197] = { unicodeslot=0x0197, category='lu', contextname='Istroke', description='LATIN CAPITAL LETTER I WITH STROKE', shcode=0x0049, lccode=0x0268 },
+ [0x0198] = { unicodeslot=0x0198, category='lu', contextname='Khook', description='LATIN CAPITAL LETTER K WITH HOOK', shcode=0x004B, lccode=0x0199 },
+ [0x0199] = { unicodeslot=0x0199, category='ll', contextname='khook', description='LATIN SMALL LETTER K WITH HOOK', shcode=0x006B, uccode=0x0198 },
+ [0x019A] = { unicodeslot=0x019A, category='ll', contextname='lbar', description='LATIN SMALL LETTER L WITH BAR', shcode=0x006C, uccode=0x023D },
+ [0x019B] = { unicodeslot=0x019B, category='ll', description='LATIN SMALL LETTER LAMBDA WITH STROKE' },
+ [0x019C] = { unicodeslot=0x019C, category='lu', description='LATIN CAPITAL LETTER TURNED M', lccode=0x026F },
+ [0x019D] = { unicodeslot=0x019D, category='lu', description='LATIN CAPITAL LETTER N WITH LEFT HOOK', shcode=0x004E, lccode=0x0272 },
+ [0x019E] = { unicodeslot=0x019E, category='ll', description='LATIN SMALL LETTER N WITH LONG RIGHT LEG', shcode=0x006E, uccode=0x0220 },
+ [0x019F] = { unicodeslot=0x019F, category='lu', description='LATIN CAPITAL LETTER O WITH MIDDLE TILDE', shcode=0x004F, lccode=0x0275 },
+ [0x01A0] = { unicodeslot=0x01A0, category='lu', adobename='Ohorn', contextname='Ohorn', description='LATIN CAPITAL LETTER O WITH HORN', shcode=0x004F, lccode=0x01A1, specials={'char',0x004F,0x031B} },
+ [0x01A1] = { unicodeslot=0x01A1, category='ll', adobename='ohorn', contextname='ohorn', description='LATIN SMALL LETTER O WITH HORN', shcode=0x006F, uccode=0x01A0, specials={'char',0x006F,0x031B} },
+ [0x01A2] = { unicodeslot=0x01A2, category='lu', description='LATIN CAPITAL LETTER OI', lccode=0x01A3 },
+ [0x01A3] = { unicodeslot=0x01A3, category='ll', description='LATIN SMALL LETTER OI', uccode=0x01A2 },
+ [0x01A4] = { unicodeslot=0x01A4, category='lu', contextname='Phook', description='LATIN CAPITAL LETTER P WITH HOOK', shcode=0x0050, lccode=0x01A5 },
+ [0x01A5] = { unicodeslot=0x01A5, category='ll', contextname='phook', description='LATIN SMALL LETTER P WITH HOOK', shcode=0x0070, uccode=0x01A4 },
+ [0x01A6] = { unicodeslot=0x01A6, category='lu', description='LATIN LETTER YR', lccode=0x0280 },
+ [0x01A7] = { unicodeslot=0x01A7, category='lu', description='LATIN CAPITAL LETTER TONE TWO', lccode=0x01A8 },
+ [0x01A8] = { unicodeslot=0x01A8, category='ll', description='LATIN SMALL LETTER TONE TWO', uccode=0x01A7 },
+ [0x01A9] = { unicodeslot=0x01A9, category='lu', description='LATIN CAPITAL LETTER ESH', lccode=0x0283 },
+ [0x01AA] = { unicodeslot=0x01AA, category='ll', description='LATIN LETTER REVERSED ESH LOOP' },
+ [0x01AB] = { unicodeslot=0x01AB, category='ll', description='LATIN SMALL LETTER T WITH PALATAL HOOK', shcode=0x0074 },
+ [0x01AC] = { unicodeslot=0x01AC, category='lu', contextname='Thook', description='LATIN CAPITAL LETTER T WITH HOOK', shcode=0x0054, lccode=0x01AD },
+ [0x01AD] = { unicodeslot=0x01AD, category='ll', contextname='thook', description='LATIN SMALL LETTER T WITH HOOK', shcode=0x0074, uccode=0x01AC },
+ [0x01AE] = { unicodeslot=0x01AE, category='lu', description='LATIN CAPITAL LETTER T WITH RETROFLEX HOOK', shcode=0x0054, lccode=0x0288 },
+ [0x01AF] = { unicodeslot=0x01AF, category='lu', adobename='Uhorn', contextname='Uhorn', description='LATIN CAPITAL LETTER U WITH HORN', shcode=0x0055, lccode=0x01B0, specials={'char',0x0055,0x031B} },
+ [0x01B0] = { unicodeslot=0x01B0, category='ll', adobename='uhorn', contextname='uhorn', description='LATIN SMALL LETTER U WITH HORN', shcode=0x0075, uccode=0x01AF, specials={'char',0x0075,0x031B} },
+ [0x01B1] = { unicodeslot=0x01B1, category='lu', description='LATIN CAPITAL LETTER UPSILON', lccode=0x028A },
+ [0x01B2] = { unicodeslot=0x01B2, category='lu', contextname='Uhook', description='LATIN CAPITAL LETTER V WITH HOOK', shcode=0x0056, lccode=0x028B },
+ [0x01B3] = { unicodeslot=0x01B3, category='lu', contextname='Yhook', description='LATIN CAPITAL LETTER Y WITH HOOK', shcode=0x0059, lccode=0x01B4 },
+ [0x01B4] = { unicodeslot=0x01B4, category='ll', contextname='yhook', description='LATIN SMALL LETTER Y WITH HOOK', shcode=0x0079, uccode=0x01B3 },
+ [0x01B5] = { unicodeslot=0x01B5, category='lu', contextname='Zstroke', description='LATIN CAPITAL LETTER Z WITH STROKE', shcode=0x005A, lccode=0x01B6 },
+ [0x01B6] = { unicodeslot=0x01B6, category='ll', contextname='zstroke', description='LATIN SMALL LETTER Z WITH STROKE', shcode=0x007A, uccode=0x01B5 },
+ [0x01B7] = { unicodeslot=0x01B7, category='lu', description='LATIN CAPITAL LETTER EZH', lccode=0x0292 },
+ [0x01B8] = { unicodeslot=0x01B8, category='lu', description='LATIN CAPITAL LETTER EZH REVERSED', lccode=0x01B9 },
+ [0x01B9] = { unicodeslot=0x01B9, category='ll', description='LATIN SMALL LETTER EZH REVERSED', uccode=0x01B8 },
+ [0x01BA] = { unicodeslot=0x01BA, category='ll', description='LATIN SMALL LETTER EZH WITH TAIL', shcode=0x0292 },
+ [0x01BB] = { unicodeslot=0x01BB, category='lo', description='LATIN LETTER TWO WITH STROKE' },
+ [0x01BC] = { unicodeslot=0x01BC, category='lu', description='LATIN CAPITAL LETTER TONE FIVE', lccode=0x01BD },
+ [0x01BD] = { unicodeslot=0x01BD, category='ll', description='LATIN SMALL LETTER TONE FIVE', uccode=0x01BC },
+ [0x01BE] = { unicodeslot=0x01BE, category='ll', description='LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE' },
+ [0x01BF] = { unicodeslot=0x01BF, category='ll', description='LATIN LETTER WYNN', uccode=0x01F7 },
+ [0x01C0] = { unicodeslot=0x01C0, category='lo', description='LATIN LETTER DENTAL CLICK' },
+ [0x01C1] = { unicodeslot=0x01C1, category='lo', description='LATIN LETTER LATERAL CLICK' },
+ [0x01C2] = { unicodeslot=0x01C2, category='lo', description='LATIN LETTER ALVEOLAR CLICK' },
+ [0x01C3] = { unicodeslot=0x01C3, category='lo', description='LATIN LETTER RETROFLEX CLICK' },
+ [0x01C4] = { unicodeslot=0x01C4, category='lu', contextname='DZcaronligature', description='LATIN CAPITAL LETTER DZ WITH CARON', shcode=0x01F1, uccode=0x01C5, lccode=0x01C6, specials={'compat',0x0044,0x017D} },
+ [0x01C5] = { unicodeslot=0x01C5, category='lt', contextname='Dzcaronligature', description='LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON', shcode=0x01F2, uccode=0x01C4, lccode=0x01C6, specials={'compat',0x0044,0x017E} },
+ [0x01C6] = { unicodeslot=0x01C6, category='ll', contextname='dzcaronligature', description='LATIN SMALL LETTER DZ WITH CARON', shcode=0x01F3, uccode=0x01C4, specials={'compat',0x0064,0x017E} },
+ [0x01C7] = { unicodeslot=0x01C7, category='lu', contextname='LJligature', description='LATIN CAPITAL LETTER LJ', uccode=0x01C8, lccode=0x01C9, specials={'compat',0x004C,0x004A} },
+ [0x01C8] = { unicodeslot=0x01C8, category='lt', contextname='Ljligature', description='LATIN CAPITAL LETTER L WITH SMALL LETTER J', shcode=0x004C, uccode=0x01C7, lccode=0x01C9, specials={'compat',0x004C,0x006A} },
+ [0x01C9] = { unicodeslot=0x01C9, category='ll', contextname='ljligature', description='LATIN SMALL LETTER LJ', uccode=0x01C7, specials={'compat',0x006C,0x006A} },
+ [0x01CA] = { unicodeslot=0x01CA, category='lu', contextname='NJligature', description='LATIN CAPITAL LETTER NJ', uccode=0x01CB, lccode=0x01CC, specials={'compat',0x004E,0x004A} },
+ [0x01CB] = { unicodeslot=0x01CB, category='lt', contextname='Njligature', description='LATIN CAPITAL LETTER N WITH SMALL LETTER J', shcode=0x004E, uccode=0x01CA, lccode=0x01CC, specials={'compat',0x004E,0x006A} },
+ [0x01CC] = { unicodeslot=0x01CC, category='ll', contextname='njligature', description='LATIN SMALL LETTER NJ', uccode=0x01CA, specials={'compat',0x006E,0x006A} },
+ [0x01CD] = { unicodeslot=0x01CD, category='lu', contextname='Acaron', description='LATIN CAPITAL LETTER A WITH CARON', shcode=0x0041, lccode=0x01CE, specials={'char',0x0041,0x030C} },
+ [0x01CE] = { unicodeslot=0x01CE, category='ll', contextname='acaron', description='LATIN SMALL LETTER A WITH CARON', shcode=0x0061, uccode=0x01CD, specials={'char',0x0061,0x030C} },
+ [0x01CF] = { unicodeslot=0x01CF, category='lu', contextname='Icaron', description='LATIN CAPITAL LETTER I WITH CARON', shcode=0x0049, lccode=0x01D0, specials={'char',0x0049,0x030C} },
+ [0x01D0] = { unicodeslot=0x01D0, category='ll', contextname='icaron', description='LATIN SMALL LETTER I WITH CARON', shcode=0x0069, uccode=0x01CF, specials={'char',0x0069,0x030C} },
+ [0x01D1] = { unicodeslot=0x01D1, category='lu', contextname='Ocaron', description='LATIN CAPITAL LETTER O WITH CARON', shcode=0x004F, lccode=0x01D2, specials={'char',0x004F,0x030C} },
+ [0x01D2] = { unicodeslot=0x01D2, category='ll', contextname='ocaron', description='LATIN SMALL LETTER O WITH CARON', shcode=0x006F, uccode=0x01D1, specials={'char',0x006F,0x030C} },
+ [0x01D3] = { unicodeslot=0x01D3, category='lu', contextname='Ucaron', description='LATIN CAPITAL LETTER U WITH CARON', shcode=0x0055, lccode=0x01D4, specials={'char',0x0055,0x030C} },
+ [0x01D4] = { unicodeslot=0x01D4, category='ll', contextname='ucaron', description='LATIN SMALL LETTER U WITH CARON', shcode=0x0075, uccode=0x01D3, specials={'char',0x0075,0x030C} },
+ [0x01D5] = { unicodeslot=0x01D5, category='lu', contextname='Udiaeresismacron', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON', shcode=0x0055, lccode=0x01D6, specials={'char',0x00DC,0x0304} },
+ [0x01D6] = { unicodeslot=0x01D6, category='ll', contextname='udiaeresismacron', description='LATIN SMALL LETTER U WITH DIAERESIS AND MACRON', shcode=0x0075, uccode=0x01D5, specials={'char',0x00FC,0x0304} },
+ [0x01D7] = { unicodeslot=0x01D7, category='lu', contextname='Udiaeresisacute', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE', shcode=0x0055, lccode=0x01D8, specials={'char',0x00DC,0x0301} },
+ [0x01D8] = { unicodeslot=0x01D8, category='ll', contextname='udiaeresisacute', description='LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE', shcode=0x0075, uccode=0x01D7, specials={'char',0x00FC,0x0301} },
+ [0x01D9] = { unicodeslot=0x01D9, category='lu', contextname='Udiaeresiscaron', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON', shcode=0x0055, lccode=0x01DA, specials={'char',0x00DC,0x030C} },
+ [0x01DA] = { unicodeslot=0x01DA, category='ll', contextname='udiaeresiscaron', description='LATIN SMALL LETTER U WITH DIAERESIS AND CARON', shcode=0x0075, uccode=0x01D9, specials={'char',0x00FC,0x030C} },
+ [0x01DB] = { unicodeslot=0x01DB, category='lu', contextname='Udiaeresisgrave', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE', shcode=0x0055, lccode=0x01DC, specials={'char',0x00DC,0x0300} },
+ [0x01DC] = { unicodeslot=0x01DC, category='ll', contextname='udiaeresisgrave', description='LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE', shcode=0x0075, uccode=0x01DB, specials={'char',0x00FC,0x0300} },
+ [0x01DD] = { unicodeslot=0x01DD, category='ll', description='LATIN SMALL LETTER TURNED E', uccode=0x018E },
+ [0x01DE] = { unicodeslot=0x01DE, category='lu', contextname='Adiaeresismacron', description='LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON', shcode=0x0041, lccode=0x01DF, specials={'char',0x00C4,0x0304} },
+ [0x01DF] = { unicodeslot=0x01DF, category='ll', contextname='adiaeresismacron', description='LATIN SMALL LETTER A WITH DIAERESIS AND MACRON', shcode=0x0061, uccode=0x01DE, specials={'char',0x00E4,0x0304} },
+ [0x01E0] = { unicodeslot=0x01E0, category='lu', contextname='Adotaccentmacron', description='LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON', shcode=0x0041, lccode=0x01E1, specials={'char',0x0226,0x0304} },
+ [0x01E1] = { unicodeslot=0x01E1, category='ll', contextname='adotaccentmacron', description='LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON', shcode=0x0061, uccode=0x01E0, specials={'char',0x0227,0x0304} },
+ [0x01E2] = { unicodeslot=0x01E2, category='lu', contextname='AEmacron', description='LATIN CAPITAL LETTER AE WITH MACRON', shcode=0x00C6, lccode=0x01E3, specials={'char',0x00C6,0x0304} },
+ [0x01E3] = { unicodeslot=0x01E3, category='ll', contextname='aemacron', description='LATIN SMALL LETTER AE WITH MACRON', shcode=0x00E6, uccode=0x01E2, specials={'char',0x00E6,0x0304} },
+ [0x01E4] = { unicodeslot=0x01E4, category='lu', contextname='Gstroke', description='LATIN CAPITAL LETTER G WITH STROKE', shcode=0x0047, lccode=0x01E5 },
+ [0x01E5] = { unicodeslot=0x01E5, category='ll', contextname='gstroke', description='LATIN SMALL LETTER G WITH STROKE', shcode=0x0067, uccode=0x01E4 },
+ [0x01E6] = { unicodeslot=0x01E6, category='lu', adobename='Gcaron', contextname='Gcaron', description='LATIN CAPITAL LETTER G WITH CARON', shcode=0x0047, lccode=0x01E7, specials={'char',0x0047,0x030C} },
+ [0x01E7] = { unicodeslot=0x01E7, category='ll', adobename='gcaron', contextname='gcaron', description='LATIN SMALL LETTER G WITH CARON', shcode=0x0067, uccode=0x01E6, specials={'char',0x0067,0x030C} },
+ [0x01E8] = { unicodeslot=0x01E8, category='lu', contextname='Kcaron', description='LATIN CAPITAL LETTER K WITH CARON', shcode=0x004B, lccode=0x01E9, specials={'char',0x004B,0x030C} },
+ [0x01E9] = { unicodeslot=0x01E9, category='ll', contextname='kcaron', description='LATIN SMALL LETTER K WITH CARON', shcode=0x006B, uccode=0x01E8, specials={'char',0x006B,0x030C} },
+ [0x01EA] = { unicodeslot=0x01EA, category='lu', contextname='Oogonek', description='LATIN CAPITAL LETTER O WITH OGONEK', shcode=0x004F, lccode=0x01EB, specials={'char',0x004F,0x0328} },
+ [0x01EB] = { unicodeslot=0x01EB, category='ll', contextname='oogonek', description='LATIN SMALL LETTER O WITH OGONEK', shcode=0x006F, uccode=0x01EA, specials={'char',0x006F,0x0328} },
+ [0x01EC] = { unicodeslot=0x01EC, category='lu', contextname='Oogonekmacron', description='LATIN CAPITAL LETTER O WITH OGONEK AND MACRON', shcode=0x004F, lccode=0x01ED, specials={'char',0x01EA,0x0304} },
+ [0x01ED] = { unicodeslot=0x01ED, category='ll', contextname='oogonekmacron', description='LATIN SMALL LETTER O WITH OGONEK AND MACRON', shcode=0x006F, uccode=0x01EC, specials={'char',0x01EB,0x0304} },
+ [0x01EE] = { unicodeslot=0x01EE, category='lu', description='LATIN CAPITAL LETTER EZH WITH CARON', shcode=0x01B7, lccode=0x01EF, specials={'char',0x01B7,0x030C} },
+ [0x01EF] = { unicodeslot=0x01EF, category='ll', description='LATIN SMALL LETTER EZH WITH CARON', shcode=0x0292, uccode=0x01EE, specials={'char',0x0292,0x030C} },
+ [0x01F0] = { unicodeslot=0x01F0, category='ll', contextname='jcaron', description='LATIN SMALL LETTER J WITH CARON', shcode=0x006A, specials={'char',0x006A,0x030C} },
+ [0x01F1] = { unicodeslot=0x01F1, category='lu', contextname='DZligature', description='LATIN CAPITAL LETTER DZ', uccode=0x01F2, lccode=0x01F3, specials={'compat',0x0044,0x005A} },
+ [0x01F2] = { unicodeslot=0x01F2, category='lt', contextname='Dzligature', description='LATIN CAPITAL LETTER D WITH SMALL LETTER Z', shcode=0x0044, uccode=0x01F1, lccode=0x01F3, specials={'compat',0x0044,0x007A} },
+ [0x01F3] = { unicodeslot=0x01F3, category='ll', contextname='dzligature', description='LATIN SMALL LETTER DZ', uccode=0x01F1, specials={'compat',0x0064,0x007A} },
+ [0x01F4] = { unicodeslot=0x01F4, category='lu', contextname='Gacute', description='LATIN CAPITAL LETTER G WITH ACUTE', shcode=0x0047, lccode=0x01F5, specials={'char',0x0047,0x0301} },
+ [0x01F5] = { unicodeslot=0x01F5, category='ll', contextname='gacute', description='LATIN SMALL LETTER G WITH ACUTE', shcode=0x0067, uccode=0x01F4, specials={'char',0x0067,0x0301} },
+ [0x01F6] = { unicodeslot=0x01F6, category='lu', description='LATIN CAPITAL LETTER HWAIR', lccode=0x0195 },
+ [0x01F7] = { unicodeslot=0x01F7, category='lu', description='LATIN CAPITAL LETTER WYNN', lccode=0x01BF },
+ [0x01F8] = { unicodeslot=0x01F8, category='lu', contextname='Ngrave', description='LATIN CAPITAL LETTER N WITH GRAVE', shcode=0x004E, lccode=0x01F9, specials={'char',0x004E,0x0300} },
+ [0x01F9] = { unicodeslot=0x01F9, category='ll', contextname='ngrave', description='LATIN SMALL LETTER N WITH GRAVE', shcode=0x006E, uccode=0x01F8, specials={'char',0x006E,0x0300} },
+ [0x01FA] = { unicodeslot=0x01FA, category='lu', adobename='Aringacute', contextname='Aringacute', description='LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE', shcode=0x0041, lccode=0x01FB, specials={'char',0x00C5,0x0301} },
+ [0x01FB] = { unicodeslot=0x01FB, category='ll', adobename='aringacute', contextname='aringacute', description='LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE', shcode=0x0061, uccode=0x01FA, specials={'char',0x00E5,0x0301} },
+ [0x01FC] = { unicodeslot=0x01FC, category='lu', adobename='AEacute', contextname='AEacute', description='LATIN CAPITAL LETTER AE WITH ACUTE', shcode=0x00C6, lccode=0x01FD, specials={'char',0x00C6,0x0301} },
+ [0x01FD] = { unicodeslot=0x01FD, category='ll', adobename='aeacute', contextname='aeacute', description='LATIN SMALL LETTER AE WITH ACUTE', shcode=0x00E6, uccode=0x01FC, specials={'char',0x00E6,0x0301} },
+ [0x01FE] = { unicodeslot=0x01FE, category='lu', adobename='Oslashacute', contextname='Ostrokeacute', description='LATIN CAPITAL LETTER O WITH STROKE AND ACUTE', shcode=0x004F, lccode=0x01FF, specials={'char',0x00D8,0x0301} },
+ [0x01FF] = { unicodeslot=0x01FF, category='ll', adobename='oslashacute', contextname='ostrokeacute', description='LATIN SMALL LETTER O WITH STROKE AND ACUTE', shcode=0x006F, uccode=0x01FE, specials={'char',0x00F8,0x0301} },
+ [0x0200] = { unicodeslot=0x0200, category='lu', contextname='Adoublegrave', description='LATIN CAPITAL LETTER A WITH DOUBLE GRAVE', shcode=0x0041, lccode=0x0201, specials={'char',0x0041,0x030F} },
+ [0x0201] = { unicodeslot=0x0201, category='ll', contextname='adoublegrave', description='LATIN SMALL LETTER A WITH DOUBLE GRAVE', shcode=0x0061, uccode=0x0200, specials={'char',0x0061,0x030F} },
+ [0x0202] = { unicodeslot=0x0202, category='lu', contextname='Ainvertedbreve', description='LATIN CAPITAL LETTER A WITH INVERTED BREVE', shcode=0x0041, lccode=0x0203, specials={'char',0x0041,0x0311} },
+ [0x0203] = { unicodeslot=0x0203, category='ll', contextname='ainvertedbreve', description='LATIN SMALL LETTER A WITH INVERTED BREVE', shcode=0x0061, uccode=0x0202, specials={'char',0x0061,0x0311} },
+ [0x0204] = { unicodeslot=0x0204, category='lu', contextname='Edoublegrave', description='LATIN CAPITAL LETTER E WITH DOUBLE GRAVE', shcode=0x0045, lccode=0x0205, specials={'char',0x0045,0x030F} },
+ [0x0205] = { unicodeslot=0x0205, category='ll', contextname='edoublegrave', description='LATIN SMALL LETTER E WITH DOUBLE GRAVE', shcode=0x0065, uccode=0x0204, specials={'char',0x0065,0x030F} },
+ [0x0206] = { unicodeslot=0x0206, category='lu', contextname='Einvertedbreve', description='LATIN CAPITAL LETTER E WITH INVERTED BREVE', shcode=0x0045, lccode=0x0207, specials={'char',0x0045,0x0311} },
+ [0x0207] = { unicodeslot=0x0207, category='ll', contextname='einvertedbreve', description='LATIN SMALL LETTER E WITH INVERTED BREVE', shcode=0x0065, uccode=0x0206, specials={'char',0x0065,0x0311} },
+ [0x0208] = { unicodeslot=0x0208, category='lu', contextname='Idoublegrave', description='LATIN CAPITAL LETTER I WITH DOUBLE GRAVE', shcode=0x0049, lccode=0x0209, specials={'char',0x0049,0x030F} },
+ [0x0209] = { unicodeslot=0x0209, category='ll', contextname='idoublegrave', description='LATIN SMALL LETTER I WITH DOUBLE GRAVE', shcode=0x0069, uccode=0x0208, specials={'char',0x0069,0x030F} },
+ [0x020A] = { unicodeslot=0x020A, category='lu', contextname='Iinvertedbreve', description='LATIN CAPITAL LETTER I WITH INVERTED BREVE', shcode=0x0049, lccode=0x020B, specials={'char',0x0049,0x0311} },
+ [0x020B] = { unicodeslot=0x020B, category='ll', contextname='iinvertedbreve', description='LATIN SMALL LETTER I WITH INVERTED BREVE', shcode=0x0069, uccode=0x020A, specials={'char',0x0069,0x0311} },
+ [0x020C] = { unicodeslot=0x020C, category='lu', contextname='Odoublegrave', description='LATIN CAPITAL LETTER O WITH DOUBLE GRAVE', shcode=0x004F, lccode=0x020D, specials={'char',0x004F,0x030F} },
+ [0x020D] = { unicodeslot=0x020D, category='ll', contextname='odoublegrave', description='LATIN SMALL LETTER O WITH DOUBLE GRAVE', shcode=0x006F, uccode=0x020C, specials={'char',0x006F,0x030F} },
+ [0x020E] = { unicodeslot=0x020E, category='lu', contextname='Oinvertedbreve', description='LATIN CAPITAL LETTER O WITH INVERTED BREVE', shcode=0x004F, lccode=0x020F, specials={'char',0x004F,0x0311} },
+ [0x020F] = { unicodeslot=0x020F, category='ll', contextname='oinvertedbreve', description='LATIN SMALL LETTER O WITH INVERTED BREVE', shcode=0x006F, uccode=0x020E, specials={'char',0x006F,0x0311} },
+ [0x0210] = { unicodeslot=0x0210, category='lu', contextname='Rdoublegrave', description='LATIN CAPITAL LETTER R WITH DOUBLE GRAVE', shcode=0x0052, lccode=0x0211, specials={'char',0x0052,0x030F} },
+ [0x0211] = { unicodeslot=0x0211, category='ll', contextname='rdoublegrave', description='LATIN SMALL LETTER R WITH DOUBLE GRAVE', shcode=0x0072, uccode=0x0210, specials={'char',0x0072,0x030F} },
+ [0x0212] = { unicodeslot=0x0212, category='lu', contextname='Rinvertedbreve', description='LATIN CAPITAL LETTER R WITH INVERTED BREVE', shcode=0x0052, lccode=0x0213, specials={'char',0x0052,0x0311} },
+ [0x0213] = { unicodeslot=0x0213, category='ll', contextname='rinvertedbreve', description='LATIN SMALL LETTER R WITH INVERTED BREVE', shcode=0x0072, uccode=0x0212, specials={'char',0x0072,0x0311} },
+ [0x0214] = { unicodeslot=0x0214, category='lu', contextname='Udoublegrave', description='LATIN CAPITAL LETTER U WITH DOUBLE GRAVE', shcode=0x0055, lccode=0x0215, specials={'char',0x0055,0x030F} },
+ [0x0215] = { unicodeslot=0x0215, category='ll', contextname='udoublegrave', description='LATIN SMALL LETTER U WITH DOUBLE GRAVE', shcode=0x0075, uccode=0x0214, specials={'char',0x0075,0x030F} },
+ [0x0216] = { unicodeslot=0x0216, category='lu', contextname='Uinvertedbreve', description='LATIN CAPITAL LETTER U WITH INVERTED BREVE', shcode=0x0055, lccode=0x0217, specials={'char',0x0055,0x0311} },
+ [0x0217] = { unicodeslot=0x0217, category='ll', contextname='uinvertedbreve', description='LATIN SMALL LETTER U WITH INVERTED BREVE', shcode=0x0075, uccode=0x0216, specials={'char',0x0075,0x0311} },
+ [0x0218] = { unicodeslot=0x0218, category='lu', adobename='Scommaaccent', contextname='Scommaaccent', description='LATIN CAPITAL LETTER S WITH COMMA BELOW', shcode=0x0053, lccode=0x0219, specials={'char',0x0053,0x0326} },
+ [0x0219] = { unicodeslot=0x0219, category='ll', adobename='scommaaccent', contextname='scommaaccent', description='LATIN SMALL LETTER S WITH COMMA BELOW', shcode=0x0073, uccode=0x0218, specials={'char',0x0073,0x0326} },
+ [0x021A] = { unicodeslot=0x021A, category='lu', contextname='Tcommaaccent', description='LATIN CAPITAL LETTER T WITH COMMA BELOW', shcode=0x0054, lccode=0x021B, specials={'char',0x0054,0x0326} },
+ [0x021B] = { unicodeslot=0x021B, category='ll', contextname='tcommaaccent', description='LATIN SMALL LETTER T WITH COMMA BELOW', shcode=0x0074, uccode=0x021A, specials={'char',0x0074,0x0326} },
+ [0x021C] = { unicodeslot=0x021C, category='lu', description='LATIN CAPITAL LETTER YOGH', lccode=0x021D },
+ [0x021D] = { unicodeslot=0x021D, category='ll', description='LATIN SMALL LETTER YOGH', uccode=0x021C },
+ [0x021E] = { unicodeslot=0x021E, category='lu', contextname='Hcaron', description='LATIN CAPITAL LETTER H WITH CARON', shcode=0x0048, lccode=0x021F, specials={'char',0x0048,0x030C} },
+ [0x021F] = { unicodeslot=0x021F, category='ll', contextname='hcaron', description='LATIN SMALL LETTER H WITH CARON', shcode=0x0068, uccode=0x021E, specials={'char',0x0068,0x030C} },
+ [0x0220] = { unicodeslot=0x0220, category='lu', description='LATIN CAPITAL LETTER N WITH LONG RIGHT LEG', shcode=0x004E, lccode=0x019E },
+ [0x0221] = { unicodeslot=0x0221, category='ll', contextname='dcurl', description='LATIN SMALL LETTER D WITH CURL', shcode=0x0064 },
+ [0x0222] = { unicodeslot=0x0222, category='lu', description='LATIN CAPITAL LETTER OU', lccode=0x0223 },
+ [0x0223] = { unicodeslot=0x0223, category='ll', description='LATIN SMALL LETTER OU', uccode=0x0222 },
+ [0x0224] = { unicodeslot=0x0224, category='lu', contextname='Zhook', description='LATIN CAPITAL LETTER Z WITH HOOK', shcode=0x005A, lccode=0x0225 },
+ [0x0225] = { unicodeslot=0x0225, category='ll', contextname='zhook', description='LATIN SMALL LETTER Z WITH HOOK', shcode=0x007A, uccode=0x0224 },
+ [0x0226] = { unicodeslot=0x0226, category='lu', contextname='Adotaccent', description='LATIN CAPITAL LETTER A WITH DOT ABOVE', shcode=0x0041, lccode=0x0227, specials={'char',0x0041,0x0307} },
+ [0x0227] = { unicodeslot=0x0227, category='ll', contextname='adotaccent', description='LATIN SMALL LETTER A WITH DOT ABOVE', shcode=0x0061, uccode=0x0226, specials={'char',0x0061,0x0307} },
+ [0x0228] = { unicodeslot=0x0228, category='lu', contextname='Ecedilla', description='LATIN CAPITAL LETTER E WITH CEDILLA', shcode=0x0045, lccode=0x0229, specials={'char',0x0045,0x0327} },
+ [0x0229] = { unicodeslot=0x0229, category='ll', contextname='ecedilla', description='LATIN SMALL LETTER E WITH CEDILLA', shcode=0x0065, uccode=0x0228, specials={'char',0x0065,0x0327} },
+ [0x022A] = { unicodeslot=0x022A, category='lu', contextname='Odiaeresismacron', description='LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON', shcode=0x004F, lccode=0x022B, specials={'char',0x00D6,0x0304} },
+ [0x022B] = { unicodeslot=0x022B, category='ll', contextname='odiaeresismacron', description='LATIN SMALL LETTER O WITH DIAERESIS AND MACRON', shcode=0x006F, uccode=0x022A, specials={'char',0x00F6,0x0304} },
+ [0x022C] = { unicodeslot=0x022C, category='lu', contextname='Otildemacron', description='LATIN CAPITAL LETTER O WITH TILDE AND MACRON', shcode=0x004F, lccode=0x022D, specials={'char',0x00D5,0x0304} },
+ [0x022D] = { unicodeslot=0x022D, category='ll', contextname='otildemacron', description='LATIN SMALL LETTER O WITH TILDE AND MACRON', shcode=0x006F, uccode=0x022C, specials={'char',0x00F5,0x0304} },
+ [0x022E] = { unicodeslot=0x022E, category='lu', contextname='Odotaccent', description='LATIN CAPITAL LETTER O WITH DOT ABOVE', shcode=0x004F, lccode=0x022F, specials={'char',0x004F,0x0307} },
+ [0x022F] = { unicodeslot=0x022F, category='ll', contextname='odotaccent', description='LATIN SMALL LETTER O WITH DOT ABOVE', shcode=0x006F, uccode=0x022E, specials={'char',0x006F,0x0307} },
+ [0x0230] = { unicodeslot=0x0230, category='lu', contextname='Odotaccentmacron', description='LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON', shcode=0x004F, lccode=0x0231, specials={'char',0x022E,0x0304} },
+ [0x0231] = { unicodeslot=0x0231, category='ll', contextname='odotaccentmacron', description='LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON', shcode=0x006F, uccode=0x0230, specials={'char',0x022F,0x0304} },
+ [0x0232] = { unicodeslot=0x0232, category='lu', contextname='Ymacron', description='LATIN CAPITAL LETTER Y WITH MACRON', shcode=0x0059, lccode=0x0233, specials={'char',0x0059,0x0304} },
+ [0x0233] = { unicodeslot=0x0233, category='ll', contextname='ymacron', description='LATIN SMALL LETTER Y WITH MACRON', shcode=0x0079, uccode=0x0232, specials={'char',0x0079,0x0304} },
+ [0x0234] = { unicodeslot=0x0234, category='ll', contextname='lcurl', description='LATIN SMALL LETTER L WITH CURL', shcode=0x006C },
+ [0x0235] = { unicodeslot=0x0235, category='ll', contextname='ncurl', description='LATIN SMALL LETTER N WITH CURL', shcode=0x006E },
+ [0x0236] = { unicodeslot=0x0236, category='ll', contextname='tcurl', description='LATIN SMALL LETTER T WITH CURL', shcode=0x0074 },
+ [0x0237] = { unicodeslot=0x0237, category='ll', contextname='dotlessj', description='LATIN SMALL LETTER DOTLESS J' },
+ [0x0238] = { unicodeslot=0x0238, category='ll', description='LATIN SMALL LETTER DB DIGRAPH' },
+ [0x0239] = { unicodeslot=0x0239, category='ll', description='LATIN SMALL LETTER QP DIGRAPH' },
+ [0x023A] = { unicodeslot=0x023A, category='lu', contextname='Astroke', description='LATIN CAPITAL LETTER A WITH STROKE', shcode=0x0041, lccode=0x2C65 },
+ [0x023B] = { unicodeslot=0x023B, category='lu', contextname='Cstroke', description='LATIN CAPITAL LETTER C WITH STROKE', shcode=0x0043, lccode=0x023C },
+ [0x023C] = { unicodeslot=0x023C, category='ll', contextname='cstroke', description='LATIN SMALL LETTER C WITH STROKE', shcode=0x0063, uccode=0x023B },
+ [0x023D] = { unicodeslot=0x023D, category='lu', contextname='Lbar', description='LATIN CAPITAL LETTER L WITH BAR', shcode=0x004C, lccode=0x019A },
+ [0x023E] = { unicodeslot=0x023E, category='lu', description='LATIN CAPITAL LETTER T WITH DIAGONAL STROKE', shcode=0x0054, lccode=0x2C66 },
+ [0x023F] = { unicodeslot=0x023F, category='ll', description='LATIN SMALL LETTER S WITH SWASH TAIL', shcode=0x0073 },
+ [0x0240] = { unicodeslot=0x0240, category='ll', description='LATIN SMALL LETTER Z WITH SWASH TAIL', shcode=0x007A },
+ [0x0241] = { unicodeslot=0x0241, category='lu', description='LATIN CAPITAL LETTER GLOTTAL STOP', lccode=0x0242 },
+ [0x0242] = { unicodeslot=0x0242, category='ll', description='LATIN SMALL LETTER GLOTTAL STOP', uccode=0x0241 },
+ [0x0243] = { unicodeslot=0x0243, category='lu', description='LATIN CAPITAL LETTER B WITH STROKE', shcode=0x0042, lccode=0x0180 },
+ [0x0244] = { unicodeslot=0x0244, category='lu', description='LATIN CAPITAL LETTER U BAR', lccode=0x0289 },
+ [0x0245] = { unicodeslot=0x0245, category='lu', description='LATIN CAPITAL LETTER TURNED V', lccode=0x028C },
+ [0x0246] = { unicodeslot=0x0246, category='lu', description='LATIN CAPITAL LETTER E WITH STROKE', shcode=0x0045, lccode=0x0247 },
+ [0x0247] = { unicodeslot=0x0247, category='ll', description='LATIN SMALL LETTER E WITH STROKE', shcode=0x0065, uccode=0x0246 },
+ [0x0248] = { unicodeslot=0x0248, category='lu', description='LATIN CAPITAL LETTER J WITH STROKE', shcode=0x004A, lccode=0x0249 },
+ [0x0249] = { unicodeslot=0x0249, category='ll', description='LATIN SMALL LETTER J WITH STROKE', shcode=0x006A, uccode=0x0248 },
+ [0x024A] = { unicodeslot=0x024A, category='lu', description='LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL', lccode=0x024B },
+ [0x024B] = { unicodeslot=0x024B, category='ll', description='LATIN SMALL LETTER Q WITH HOOK TAIL', shcode=0x0071, uccode=0x024A },
+ [0x024C] = { unicodeslot=0x024C, category='lu', description='LATIN CAPITAL LETTER R WITH STROKE', shcode=0x0052, lccode=0x024D },
+ [0x024D] = { unicodeslot=0x024D, category='ll', description='LATIN SMALL LETTER R WITH STROKE', shcode=0x0072, uccode=0x024C },
+ [0x024E] = { unicodeslot=0x024E, category='lu', description='LATIN CAPITAL LETTER Y WITH STROKE', shcode=0x0059, lccode=0x024F },
+ [0x024F] = { unicodeslot=0x024F, category='ll', description='LATIN SMALL LETTER Y WITH STROKE', shcode=0x0079, uccode=0x024E },
+ [0x0250] = { unicodeslot=0x0250, category='ll', description='LATIN SMALL LETTER TURNED A' },
+ [0x0251] = { unicodeslot=0x0251, category='ll', description='LATIN SMALL LETTER ALPHA' },
+ [0x0252] = { unicodeslot=0x0252, category='ll', description='LATIN SMALL LETTER TURNED ALPHA' },
+ [0x0253] = { unicodeslot=0x0253, category='ll', contextname='bhook', description='LATIN SMALL LETTER B WITH HOOK', shcode=0x0062, uccode=0x0181 },
+ [0x0254] = { unicodeslot=0x0254, category='ll', description='LATIN SMALL LETTER OPEN O', uccode=0x0186 },
+ [0x0255] = { unicodeslot=0x0255, category='ll', contextname='ccurl', description='LATIN SMALL LETTER C WITH CURL', shcode=0x0063 },
+ [0x0256] = { unicodeslot=0x0256, category='ll', contextname='dtail', description='LATIN SMALL LETTER D WITH TAIL', shcode=0x0064, uccode=0x0189 },
+ [0x0257] = { unicodeslot=0x0257, category='ll', contextname='dhook', description='LATIN SMALL LETTER D WITH HOOK', shcode=0x0064, uccode=0x018A },
+ [0x0258] = { unicodeslot=0x0258, category='ll', description='LATIN SMALL LETTER REVERSED E' },
+ [0x0259] = { unicodeslot=0x0259, category='ll', contextname='schwa', description='LATIN SMALL LETTER SCHWA', uccode=0x018F },
+ [0x025A] = { unicodeslot=0x025A, category='ll', contextname='schwahook', description='LATIN SMALL LETTER SCHWA WITH HOOK', shcode=0x0259 },
+ [0x025B] = { unicodeslot=0x025B, category='ll', description='LATIN SMALL LETTER OPEN E', uccode=0x0190 },
+ [0x025C] = { unicodeslot=0x025C, category='ll', description='LATIN SMALL LETTER REVERSED OPEN E' },
+ [0x025D] = { unicodeslot=0x025D, category='ll', description='LATIN SMALL LETTER REVERSED OPEN E WITH HOOK' },
+ [0x025E] = { unicodeslot=0x025E, category='ll', description='LATIN SMALL LETTER CLOSED REVERSED OPEN E' },
+ [0x025F] = { unicodeslot=0x025F, category='ll', contextname='dotlessjstroke', description='LATIN SMALL LETTER DOTLESS J WITH STROKE' },
+ [0x0260] = { unicodeslot=0x0260, category='ll', description='LATIN SMALL LETTER G WITH HOOK', shcode=0x0067, uccode=0x0193 },
+ [0x0261] = { unicodeslot=0x0261, category='ll', description='LATIN SMALL LETTER SCRIPT G' },
+ [0x0262] = { unicodeslot=0x0262, category='ll', description='LATIN LETTER SMALL CAPITAL G' },
+ [0x0263] = { unicodeslot=0x0263, category='ll', description='LATIN SMALL LETTER GAMMA', uccode=0x0194 },
+ [0x0264] = { unicodeslot=0x0264, category='ll', description='LATIN SMALL LETTER RAMS HORN' },
+ [0x0265] = { unicodeslot=0x0265, category='ll', description='LATIN SMALL LETTER TURNED H' },
+ [0x0266] = { unicodeslot=0x0266, category='ll', description='LATIN SMALL LETTER H WITH HOOK', shcode=0x0068 },
+ [0x0267] = { unicodeslot=0x0267, category='ll', description='LATIN SMALL LETTER HENG WITH HOOK' },
+ [0x0268] = { unicodeslot=0x0268, category='ll', description='LATIN SMALL LETTER I WITH STROKE', shcode=0x0069, uccode=0x0197 },
+ [0x0269] = { unicodeslot=0x0269, category='ll', description='LATIN SMALL LETTER IOTA', uccode=0x0196 },
+ [0x026A] = { unicodeslot=0x026A, category='ll', description='LATIN LETTER SMALL CAPITAL I' },
+ [0x026B] = { unicodeslot=0x026B, category='ll', description='LATIN SMALL LETTER L WITH MIDDLE TILDE', shcode=0x006C, uccode=0x2C62 },
+ [0x026C] = { unicodeslot=0x026C, category='ll', description='LATIN SMALL LETTER L WITH BELT', shcode=0x006C },
+ [0x026D] = { unicodeslot=0x026D, category='ll', description='LATIN SMALL LETTER L WITH RETROFLEX HOOK', shcode=0x006C },
+ [0x026E] = { unicodeslot=0x026E, category='ll', description='LATIN SMALL LETTER LEZH' },
+ [0x026F] = { unicodeslot=0x026F, category='ll', description='LATIN SMALL LETTER TURNED M', uccode=0x019C },
+ [0x0270] = { unicodeslot=0x0270, category='ll', description='LATIN SMALL LETTER TURNED M WITH LONG LEG' },
+ [0x0271] = { unicodeslot=0x0271, category='ll', description='LATIN SMALL LETTER M WITH HOOK', shcode=0x006D },
+ [0x0272] = { unicodeslot=0x0272, category='ll', description='LATIN SMALL LETTER N WITH LEFT HOOK', shcode=0x006E, uccode=0x019D },
+ [0x0273] = { unicodeslot=0x0273, category='ll', description='LATIN SMALL LETTER N WITH RETROFLEX HOOK', shcode=0x006E },
+ [0x0274] = { unicodeslot=0x0274, category='ll', description='LATIN LETTER SMALL CAPITAL N' },
+ [0x0275] = { unicodeslot=0x0275, category='ll', description='LATIN SMALL LETTER BARRED O', uccode=0x019F },
+ [0x0276] = { unicodeslot=0x0276, category='ll', description='LATIN LETTER SMALL CAPITAL OE' },
+ [0x0277] = { unicodeslot=0x0277, category='ll', description='LATIN SMALL LETTER CLOSED OMEGA' },
+ [0x0278] = { unicodeslot=0x0278, category='ll', description='LATIN SMALL LETTER PHI' },
+ [0x0279] = { unicodeslot=0x0279, category='ll', description='LATIN SMALL LETTER TURNED R' },
+ [0x027A] = { unicodeslot=0x027A, category='ll', description='LATIN SMALL LETTER TURNED R WITH LONG LEG' },
+ [0x027B] = { unicodeslot=0x027B, category='ll', description='LATIN SMALL LETTER TURNED R WITH HOOK' },
+ [0x027C] = { unicodeslot=0x027C, category='ll', description='LATIN SMALL LETTER R WITH LONG LEG', shcode=0x0072 },
+ [0x027D] = { unicodeslot=0x027D, category='ll', description='LATIN SMALL LETTER R WITH TAIL', shcode=0x0072, uccode=0x2C64 },
+ [0x027E] = { unicodeslot=0x027E, category='ll', description='LATIN SMALL LETTER R WITH FISHHOOK', shcode=0x0072 },
+ [0x027F] = { unicodeslot=0x027F, category='ll', description='LATIN SMALL LETTER REVERSED R WITH FISHHOOK' },
+ [0x0280] = { unicodeslot=0x0280, category='ll', description='LATIN LETTER SMALL CAPITAL R', uccode=0x01A6 },
+ [0x0281] = { unicodeslot=0x0281, category='ll', description='LATIN LETTER SMALL CAPITAL INVERTED R' },
+ [0x0282] = { unicodeslot=0x0282, category='ll', description='LATIN SMALL LETTER S WITH HOOK', shcode=0x0073 },
+ [0x0283] = { unicodeslot=0x0283, category='ll', description='LATIN SMALL LETTER ESH', uccode=0x01A9 },
+ [0x0284] = { unicodeslot=0x0284, category='ll', description='LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK' },
+ [0x0285] = { unicodeslot=0x0285, category='ll', description='LATIN SMALL LETTER SQUAT REVERSED ESH' },
+ [0x0286] = { unicodeslot=0x0286, category='ll', description='LATIN SMALL LETTER ESH WITH CURL', shcode=0x0283 },
+ [0x0287] = { unicodeslot=0x0287, category='ll', description='LATIN SMALL LETTER TURNED T' },
+ [0x0288] = { unicodeslot=0x0288, category='ll', description='LATIN SMALL LETTER T WITH RETROFLEX HOOK', shcode=0x0074, uccode=0x01AE },
+ [0x0289] = { unicodeslot=0x0289, category='ll', description='LATIN SMALL LETTER U BAR', uccode=0x0244 },
+ [0x028A] = { unicodeslot=0x028A, category='ll', description='LATIN SMALL LETTER UPSILON', uccode=0x01B1 },
+ [0x028B] = { unicodeslot=0x028B, category='ll', description='LATIN SMALL LETTER V WITH HOOK', shcode=0x0076, uccode=0x01B2 },
+ [0x028C] = { unicodeslot=0x028C, category='ll', description='LATIN SMALL LETTER TURNED V', uccode=0x0245 },
+ [0x028D] = { unicodeslot=0x028D, category='ll', description='LATIN SMALL LETTER TURNED W' },
+ [0x028E] = { unicodeslot=0x028E, category='ll', description='LATIN SMALL LETTER TURNED Y' },
+ [0x028F] = { unicodeslot=0x028F, category='ll', description='LATIN LETTER SMALL CAPITAL Y' },
+ [0x0290] = { unicodeslot=0x0290, category='ll', description='LATIN SMALL LETTER Z WITH RETROFLEX HOOK', shcode=0x007A },
+ [0x0291] = { unicodeslot=0x0291, category='ll', description='LATIN SMALL LETTER Z WITH CURL', shcode=0x007A },
+ [0x0292] = { unicodeslot=0x0292, category='ll', description='LATIN SMALL LETTER EZH', uccode=0x01B7 },
+ [0x0293] = { unicodeslot=0x0293, category='ll', description='LATIN SMALL LETTER EZH WITH CURL', shcode=0x0292 },
+ [0x0294] = { unicodeslot=0x0294, category='lo', description='LATIN LETTER GLOTTAL STOP' },
+ [0x0295] = { unicodeslot=0x0295, category='ll', description='LATIN LETTER PHARYNGEAL VOICED FRICATIVE' },
+ [0x0296] = { unicodeslot=0x0296, category='ll', description='LATIN LETTER INVERTED GLOTTAL STOP' },
+ [0x0297] = { unicodeslot=0x0297, category='ll', description='LATIN LETTER STRETCHED C' },
+ [0x0298] = { unicodeslot=0x0298, category='ll', description='LATIN LETTER BILABIAL CLICK' },
+ [0x0299] = { unicodeslot=0x0299, category='ll', description='LATIN LETTER SMALL CAPITAL B' },
+ [0x029A] = { unicodeslot=0x029A, category='ll', description='LATIN SMALL LETTER CLOSED OPEN E' },
+ [0x029B] = { unicodeslot=0x029B, category='ll', description='LATIN LETTER SMALL CAPITAL G WITH HOOK' },
+ [0x029C] = { unicodeslot=0x029C, category='ll', description='LATIN LETTER SMALL CAPITAL H' },
+ [0x029D] = { unicodeslot=0x029D, category='ll', description='LATIN SMALL LETTER J WITH CROSSED-TAIL', shcode=0x006A },
+ [0x029E] = { unicodeslot=0x029E, category='ll', description='LATIN SMALL LETTER TURNED K' },
+ [0x029F] = { unicodeslot=0x029F, category='ll', description='LATIN LETTER SMALL CAPITAL L' },
+ [0x02A0] = { unicodeslot=0x02A0, category='ll', description='LATIN SMALL LETTER Q WITH HOOK', shcode=0x0071 },
+ [0x02A1] = { unicodeslot=0x02A1, category='ll', description='LATIN LETTER GLOTTAL STOP WITH STROKE' },
+ [0x02A2] = { unicodeslot=0x02A2, category='ll', description='LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE' },
+ [0x02A3] = { unicodeslot=0x02A3, category='ll', description='LATIN SMALL LETTER DZ DIGRAPH' },
+ [0x02A4] = { unicodeslot=0x02A4, category='ll', description='LATIN SMALL LETTER DEZH DIGRAPH' },
+ [0x02A5] = { unicodeslot=0x02A5, category='ll', description='LATIN SMALL LETTER DZ DIGRAPH WITH CURL' },
+ [0x02A6] = { unicodeslot=0x02A6, category='ll', description='LATIN SMALL LETTER TS DIGRAPH' },
+ [0x02A7] = { unicodeslot=0x02A7, category='ll', description='LATIN SMALL LETTER TESH DIGRAPH' },
+ [0x02A8] = { unicodeslot=0x02A8, category='ll', description='LATIN SMALL LETTER TC DIGRAPH WITH CURL' },
+ [0x02A9] = { unicodeslot=0x02A9, category='ll', description='LATIN SMALL LETTER FENG DIGRAPH' },
+ [0x02AA] = { unicodeslot=0x02AA, category='ll', description='LATIN SMALL LETTER LS DIGRAPH' },
+ [0x02AB] = { unicodeslot=0x02AB, category='ll', description='LATIN SMALL LETTER LZ DIGRAPH' },
+ [0x02AC] = { unicodeslot=0x02AC, category='ll', description='LATIN LETTER BILABIAL PERCUSSIVE' },
+ [0x02AD] = { unicodeslot=0x02AD, category='ll', description='LATIN LETTER BIDENTAL PERCUSSIVE' },
+ [0x02AE] = { unicodeslot=0x02AE, category='ll', description='LATIN SMALL LETTER TURNED H WITH FISHHOOK' },
+ [0x02AF] = { unicodeslot=0x02AF, category='ll', description='LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL' },
+ [0x02B0] = { unicodeslot=0x02B0, category='lm', description='MODIFIER LETTER SMALL H', specials={'super',0x0068} },
+ [0x02B1] = { unicodeslot=0x02B1, category='lm', description='MODIFIER LETTER SMALL H WITH HOOK', specials={'super',0x0266} },
+ [0x02B2] = { unicodeslot=0x02B2, category='lm', description='MODIFIER LETTER SMALL J', specials={'super',0x006A} },
+ [0x02B3] = { unicodeslot=0x02B3, category='lm', description='MODIFIER LETTER SMALL R', specials={'super',0x0072} },
+ [0x02B4] = { unicodeslot=0x02B4, category='lm', description='MODIFIER LETTER SMALL TURNED R', specials={'super',0x0279} },
+ [0x02B5] = { unicodeslot=0x02B5, category='lm', description='MODIFIER LETTER SMALL TURNED R WITH HOOK', specials={'super',0x027B} },
+ [0x02B6] = { unicodeslot=0x02B6, category='lm', description='MODIFIER LETTER SMALL CAPITAL INVERTED R', specials={'super',0x0281} },
+ [0x02B7] = { unicodeslot=0x02B7, category='lm', description='MODIFIER LETTER SMALL W', specials={'super',0x0077} },
+ [0x02B8] = { unicodeslot=0x02B8, category='lm', description='MODIFIER LETTER SMALL Y', specials={'super',0x0079} },
+ [0x02B9] = { unicodeslot=0x02B9, category='lm', description='MODIFIER LETTER PRIME' },
+ [0x02BA] = { unicodeslot=0x02BA, category='lm', description='MODIFIER LETTER DOUBLE PRIME' },
+ [0x02BB] = { unicodeslot=0x02BB, category='lm', description='MODIFIER LETTER TURNED COMMA' },
+ [0x02BC] = { unicodeslot=0x02BC, category='lm', adobename='afii57929', description='MODIFIER LETTER APOSTROPHE' },
+ [0x02BD] = { unicodeslot=0x02BD, category='lm', adobename='afii64937', description='MODIFIER LETTER REVERSED COMMA' },
+ [0x02BE] = { unicodeslot=0x02BE, category='lm', description='MODIFIER LETTER RIGHT HALF RING' },
+ [0x02BF] = { unicodeslot=0x02BF, category='lm', description='MODIFIER LETTER LEFT HALF RING' },
+ [0x02C0] = { unicodeslot=0x02C0, category='lm', description='MODIFIER LETTER GLOTTAL STOP' },
+ [0x02C1] = { unicodeslot=0x02C1, category='lm', description='MODIFIER LETTER REVERSED GLOTTAL STOP' },
+ [0x02C2] = { unicodeslot=0x02C2, category='sk', description='MODIFIER LETTER LEFT ARROWHEAD' },
+ [0x02C3] = { unicodeslot=0x02C3, category='sk', description='MODIFIER LETTER RIGHT ARROWHEAD' },
+ [0x02C4] = { unicodeslot=0x02C4, category='sk', description='MODIFIER LETTER UP ARROWHEAD' },
+ [0x02C5] = { unicodeslot=0x02C5, category='sk', description='MODIFIER LETTER DOWN ARROWHEAD' },
+ [0x02C6] = { unicodeslot=0x02C6, category='lm', adobename='circumflex', contextname='textcircumflex', description='MODIFIER LETTER CIRCUMFLEX ACCENT' },
+ [0x02C7] = { unicodeslot=0x02C7, category='lm', adobename='caron', contextname='textcaron', description='CARON' },
+ [0x02C8] = { unicodeslot=0x02C8, category='lm', description='MODIFIER LETTER VERTICAL LINE' },
+ [0x02C9] = { unicodeslot=0x02C9, category='lm', description='MODIFIER LETTER MACRON' },
+ [0x02CA] = { unicodeslot=0x02CA, category='lm', description='MODIFIER LETTER ACUTE ACCENT' },
+ [0x02CB] = { unicodeslot=0x02CB, category='lm', description='MODIFIER LETTER GRAVE ACCENT' },
+ [0x02CC] = { unicodeslot=0x02CC, category='lm', description='MODIFIER LETTER LOW VERTICAL LINE' },
+ [0x02CD] = { unicodeslot=0x02CD, category='lm', description='MODIFIER LETTER LOW MACRON' },
+ [0x02CE] = { unicodeslot=0x02CE, category='lm', description='MODIFIER LETTER LOW GRAVE ACCENT' },
+ [0x02CF] = { unicodeslot=0x02CF, category='lm', description='MODIFIER LETTER LOW ACUTE ACCENT' },
+ [0x02D0] = { unicodeslot=0x02D0, category='lm', description='MODIFIER LETTER TRIANGULAR COLON' },
+ [0x02D1] = { unicodeslot=0x02D1, category='lm', description='MODIFIER LETTER HALF TRIANGULAR COLON' },
+ [0x02D2] = { unicodeslot=0x02D2, category='sk', description='MODIFIER LETTER CENTRED RIGHT HALF RING' },
+ [0x02D3] = { unicodeslot=0x02D3, category='sk', description='MODIFIER LETTER CENTRED LEFT HALF RING' },
+ [0x02D4] = { unicodeslot=0x02D4, category='sk', description='MODIFIER LETTER UP TACK' },
+ [0x02D5] = { unicodeslot=0x02D5, category='sk', description='MODIFIER LETTER DOWN TACK' },
+ [0x02D6] = { unicodeslot=0x02D6, category='sk', description='MODIFIER LETTER PLUS SIGN' },
+ [0x02D7] = { unicodeslot=0x02D7, category='sk', description='MODIFIER LETTER MINUS SIGN' },
+ [0x02D8] = { unicodeslot=0x02D8, category='sk', adobename='breve', contextname='textbreve', description='BREVE', specials={'compat',0x0020,0x0306} },
+ [0x02D9] = { unicodeslot=0x02D9, category='sk', adobename='dotaccent', contextname='textdotaccent', description='DOT ABOVE', specials={'compat',0x0020,0x0307} },
+ [0x02DA] = { unicodeslot=0x02DA, category='sk', adobename='ring', contextname='textring', description='RING ABOVE', specials={'compat',0x0020,0x030A} },
+ [0x02DB] = { unicodeslot=0x02DB, category='sk', adobename='ogonek', contextname='textogonek', description='OGONEK', specials={'compat',0x0020,0x0328} },
+ [0x02DC] = { unicodeslot=0x02DC, category='sk', adobename='tilde', contextname='texttilde', description='SMALL TILDE', specials={'compat',0x0020,0x0303} },
+ [0x02DD] = { unicodeslot=0x02DD, category='sk', adobename='hungarumlaut', contextname='texthungarumlaut', description='DOUBLE ACUTE ACCENT', specials={'compat',0x0020,0x030B} },
+ [0x02DE] = { unicodeslot=0x02DE, category='sk', description='MODIFIER LETTER RHOTIC HOOK' },
+ [0x02DF] = { unicodeslot=0x02DF, category='sk', description='MODIFIER LETTER CROSS ACCENT' },
+ [0x02E0] = { unicodeslot=0x02E0, category='lm', description='MODIFIER LETTER SMALL GAMMA', specials={'super',0x0263} },
+ [0x02E1] = { unicodeslot=0x02E1, category='lm', description='MODIFIER LETTER SMALL L', specials={'super',0x006C} },
+ [0x02E2] = { unicodeslot=0x02E2, category='lm', description='MODIFIER LETTER SMALL S', specials={'super',0x0073} },
+ [0x02E3] = { unicodeslot=0x02E3, category='lm', description='MODIFIER LETTER SMALL X', specials={'super',0x0078} },
+ [0x02E4] = { unicodeslot=0x02E4, category='lm', description='MODIFIER LETTER SMALL REVERSED GLOTTAL STOP', specials={'super',0x0295} },
+ [0x02E5] = { unicodeslot=0x02E5, category='sk', description='MODIFIER LETTER EXTRA-HIGH TONE BAR' },
+ [0x02E6] = { unicodeslot=0x02E6, category='sk', description='MODIFIER LETTER HIGH TONE BAR' },
+ [0x02E7] = { unicodeslot=0x02E7, category='sk', description='MODIFIER LETTER MID TONE BAR' },
+ [0x02E8] = { unicodeslot=0x02E8, category='sk', description='MODIFIER LETTER LOW TONE BAR' },
+ [0x02E9] = { unicodeslot=0x02E9, category='sk', description='MODIFIER LETTER EXTRA-LOW TONE BAR' },
+ [0x02EA] = { unicodeslot=0x02EA, category='sk', description='MODIFIER LETTER YIN DEPARTING TONE MARK' },
+ [0x02EB] = { unicodeslot=0x02EB, category='sk', description='MODIFIER LETTER YANG DEPARTING TONE MARK' },
+ [0x02EC] = { unicodeslot=0x02EC, category='sk', description='MODIFIER LETTER VOICING' },
+ [0x02ED] = { unicodeslot=0x02ED, category='sk', description='MODIFIER LETTER UNASPIRATED' },
+ [0x02EE] = { unicodeslot=0x02EE, category='lm', description='MODIFIER LETTER DOUBLE APOSTROPHE' },
+ [0x02EF] = { unicodeslot=0x02EF, category='sk', description='MODIFIER LETTER LOW DOWN ARROWHEAD' },
+ [0x02F0] = { unicodeslot=0x02F0, category='sk', description='MODIFIER LETTER LOW UP ARROWHEAD' },
+ [0x02F1] = { unicodeslot=0x02F1, category='sk', description='MODIFIER LETTER LOW LEFT ARROWHEAD' },
+ [0x02F2] = { unicodeslot=0x02F2, category='sk', description='MODIFIER LETTER LOW RIGHT ARROWHEAD' },
+ [0x02F3] = { unicodeslot=0x02F3, category='sk', description='MODIFIER LETTER LOW RING' },
+ [0x02F4] = { unicodeslot=0x02F4, category='sk', description='MODIFIER LETTER MIDDLE GRAVE ACCENT' },
+ [0x02F5] = { unicodeslot=0x02F5, category='sk', description='MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT' },
+ [0x02F6] = { unicodeslot=0x02F6, category='sk', description='MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT' },
+ [0x02F7] = { unicodeslot=0x02F7, category='sk', description='MODIFIER LETTER LOW TILDE' },
+ [0x02F8] = { unicodeslot=0x02F8, category='sk', description='MODIFIER LETTER RAISED COLON' },
+ [0x02F9] = { unicodeslot=0x02F9, category='sk', description='MODIFIER LETTER BEGIN HIGH TONE' },
+ [0x02FA] = { unicodeslot=0x02FA, category='sk', description='MODIFIER LETTER END HIGH TONE' },
+ [0x02FB] = { unicodeslot=0x02FB, category='sk', description='MODIFIER LETTER BEGIN LOW TONE' },
+ [0x02FC] = { unicodeslot=0x02FC, category='sk', description='MODIFIER LETTER END LOW TONE' },
+ [0x02FD] = { unicodeslot=0x02FD, category='sk', description='MODIFIER LETTER SHELF' },
+ [0x02FE] = { unicodeslot=0x02FE, category='sk', description='MODIFIER LETTER OPEN SHELF' },
+ [0x02FF] = { unicodeslot=0x02FF, category='sk', description='MODIFIER LETTER LOW LEFT ARROW' },
+ [0x0300] = { unicodeslot=0x0300, category='mn', adobename='gravecomb', description='COMBINING GRAVE ACCENT' },
+ [0x0301] = { unicodeslot=0x0301, category='mn', adobename='acutecomb', description='COMBINING ACUTE ACCENT' },
+ [0x0302] = { unicodeslot=0x0302, category='mn', description='COMBINING CIRCUMFLEX ACCENT' },
+ [0x0303] = { unicodeslot=0x0303, category='mn', adobename='tildecomb', description='COMBINING TILDE' },
+ [0x0304] = { unicodeslot=0x0304, category='mn', description='COMBINING MACRON' },
+ [0x0305] = { unicodeslot=0x0305, category='mn', description='COMBINING OVERLINE' },
+ [0x0306] = { unicodeslot=0x0306, category='mn', description='COMBINING BREVE' },
+ [0x0307] = { unicodeslot=0x0307, category='mn', description='COMBINING DOT ABOVE' },
+ [0x0308] = { unicodeslot=0x0308, category='mn', description='COMBINING DIAERESIS' },
+ [0x0309] = { unicodeslot=0x0309, category='mn', adobename='hookabovecomb', description='COMBINING HOOK ABOVE' },
+ [0x030A] = { unicodeslot=0x030A, category='mn', description='COMBINING RING ABOVE' },
+ [0x030B] = { unicodeslot=0x030B, category='mn', description='COMBINING DOUBLE ACUTE ACCENT' },
+ [0x030C] = { unicodeslot=0x030C, category='mn', description='COMBINING CARON' },
+ [0x030D] = { unicodeslot=0x030D, category='mn', description='COMBINING VERTICAL LINE ABOVE' },
+ [0x030E] = { unicodeslot=0x030E, category='mn', description='COMBINING DOUBLE VERTICAL LINE ABOVE' },
+ [0x030F] = { unicodeslot=0x030F, category='mn', description='COMBINING DOUBLE GRAVE ACCENT' },
+ [0x0310] = { unicodeslot=0x0310, category='mn', description='COMBINING CANDRABINDU' },
+ [0x0311] = { unicodeslot=0x0311, category='mn', description='COMBINING INVERTED BREVE' },
+ [0x0312] = { unicodeslot=0x0312, category='mn', description='COMBINING TURNED COMMA ABOVE' },
+ [0x0313] = { unicodeslot=0x0313, category='mn', description='COMBINING COMMA ABOVE' },
+ [0x0314] = { unicodeslot=0x0314, category='mn', description='COMBINING REVERSED COMMA ABOVE' },
+ [0x0315] = { unicodeslot=0x0315, category='mn', description='COMBINING COMMA ABOVE RIGHT' },
+ [0x0316] = { unicodeslot=0x0316, category='mn', description='COMBINING GRAVE ACCENT BELOW' },
+ [0x0317] = { unicodeslot=0x0317, category='mn', description='COMBINING ACUTE ACCENT BELOW' },
+ [0x0318] = { unicodeslot=0x0318, category='mn', description='COMBINING LEFT TACK BELOW' },
+ [0x0319] = { unicodeslot=0x0319, category='mn', description='COMBINING RIGHT TACK BELOW' },
+ [0x031A] = { unicodeslot=0x031A, category='mn', description='COMBINING LEFT ANGLE ABOVE' },
+ [0x031B] = { unicodeslot=0x031B, category='mn', description='COMBINING HORN' },
+ [0x031C] = { unicodeslot=0x031C, category='mn', description='COMBINING LEFT HALF RING BELOW' },
+ [0x031D] = { unicodeslot=0x031D, category='mn', description='COMBINING UP TACK BELOW' },
+ [0x031E] = { unicodeslot=0x031E, category='mn', description='COMBINING DOWN TACK BELOW' },
+ [0x031F] = { unicodeslot=0x031F, category='mn', description='COMBINING PLUS SIGN BELOW' },
+ [0x0320] = { unicodeslot=0x0320, category='mn', description='COMBINING MINUS SIGN BELOW' },
+ [0x0321] = { unicodeslot=0x0321, category='mn', description='COMBINING PALATALIZED HOOK BELOW' },
+ [0x0322] = { unicodeslot=0x0322, category='mn', description='COMBINING RETROFLEX HOOK BELOW' },
+ [0x0323] = { unicodeslot=0x0323, category='mn', adobename='dotbelowcomb', description='COMBINING DOT BELOW' },
+ [0x0324] = { unicodeslot=0x0324, category='mn', description='COMBINING DIAERESIS BELOW' },
+ [0x0325] = { unicodeslot=0x0325, category='mn', description='COMBINING RING BELOW' },
+ [0x0326] = { unicodeslot=0x0326, category='mn', description='COMBINING COMMA BELOW' },
+ [0x0327] = { unicodeslot=0x0327, category='mn', description='COMBINING CEDILLA' },
+ [0x0328] = { unicodeslot=0x0328, category='mn', description='COMBINING OGONEK' },
+ [0x0329] = { unicodeslot=0x0329, category='mn', description='COMBINING VERTICAL LINE BELOW' },
+ [0x032A] = { unicodeslot=0x032A, category='mn', description='COMBINING BRIDGE BELOW' },
+ [0x032B] = { unicodeslot=0x032B, category='mn', description='COMBINING INVERTED DOUBLE ARCH BELOW' },
+ [0x032C] = { unicodeslot=0x032C, category='mn', description='COMBINING CARON BELOW' },
+ [0x032D] = { unicodeslot=0x032D, category='mn', description='COMBINING CIRCUMFLEX ACCENT BELOW' },
+ [0x032E] = { unicodeslot=0x032E, category='mn', description='COMBINING BREVE BELOW' },
+ [0x032F] = { unicodeslot=0x032F, category='mn', description='COMBINING INVERTED BREVE BELOW' },
+ [0x0330] = { unicodeslot=0x0330, category='mn', description='COMBINING TILDE BELOW' },
+ [0x0331] = { unicodeslot=0x0331, category='mn', description='COMBINING MACRON BELOW' },
+ [0x0332] = { unicodeslot=0x0332, category='mn', description='COMBINING LOW LINE' },
+ [0x0333] = { unicodeslot=0x0333, category='mn', description='COMBINING DOUBLE LOW LINE' },
+ [0x0334] = { unicodeslot=0x0334, category='mn', description='COMBINING TILDE OVERLAY' },
+ [0x0335] = { unicodeslot=0x0335, category='mn', description='COMBINING SHORT STROKE OVERLAY' },
+ [0x0336] = { unicodeslot=0x0336, category='mn', description='COMBINING LONG STROKE OVERLAY' },
+ [0x0337] = { unicodeslot=0x0337, category='mn', description='COMBINING SHORT SOLIDUS OVERLAY' },
+ [0x0338] = { unicodeslot=0x0338, category='mn', description='COMBINING LONG SOLIDUS OVERLAY' },
+ [0x0339] = { unicodeslot=0x0339, category='mn', description='COMBINING RIGHT HALF RING BELOW' },
+ [0x033A] = { unicodeslot=0x033A, category='mn', description='COMBINING INVERTED BRIDGE BELOW' },
+ [0x033B] = { unicodeslot=0x033B, category='mn', description='COMBINING SQUARE BELOW' },
+ [0x033C] = { unicodeslot=0x033C, category='mn', description='COMBINING SEAGULL BELOW' },
+ [0x033D] = { unicodeslot=0x033D, category='mn', description='COMBINING X ABOVE' },
+ [0x033E] = { unicodeslot=0x033E, category='mn', description='COMBINING VERTICAL TILDE' },
+ [0x033F] = { unicodeslot=0x033F, category='mn', description='COMBINING DOUBLE OVERLINE' },
+ [0x0340] = { unicodeslot=0x0340, category='mn', description='COMBINING GRAVE TONE MARK', specials={'char',0x0300} },
+ [0x0341] = { unicodeslot=0x0341, category='mn', description='COMBINING ACUTE TONE MARK', specials={'char',0x0301} },
+ [0x0342] = { unicodeslot=0x0342, category='mn', description='COMBINING GREEK PERISPOMENI' },
+ [0x0343] = { unicodeslot=0x0343, category='mn', description='COMBINING GREEK KORONIS', specials={'char',0x0313} },
+ [0x0344] = { unicodeslot=0x0344, category='mn', description='COMBINING GREEK DIALYTIKA TONOS', specials={'char',0x0308,0x0301} },
+ [0x0345] = { unicodeslot=0x0345, category='mn', description='COMBINING GREEK YPOGEGRAMMENI', uccode=0x0399 },
+ [0x0346] = { unicodeslot=0x0346, category='mn', description='COMBINING BRIDGE ABOVE' },
+ [0x0347] = { unicodeslot=0x0347, category='mn', description='COMBINING EQUALS SIGN BELOW' },
+ [0x0348] = { unicodeslot=0x0348, category='mn', description='COMBINING DOUBLE VERTICAL LINE BELOW' },
+ [0x0349] = { unicodeslot=0x0349, category='mn', description='COMBINING LEFT ANGLE BELOW' },
+ [0x034A] = { unicodeslot=0x034A, category='mn', description='COMBINING NOT TILDE ABOVE' },
+ [0x034B] = { unicodeslot=0x034B, category='mn', description='COMBINING HOMOTHETIC ABOVE' },
+ [0x034C] = { unicodeslot=0x034C, category='mn', description='COMBINING ALMOST EQUAL TO ABOVE' },
+ [0x034D] = { unicodeslot=0x034D, category='mn', description='COMBINING LEFT RIGHT ARROW BELOW' },
+ [0x034E] = { unicodeslot=0x034E, category='mn', description='COMBINING UPWARDS ARROW BELOW' },
+ [0x034F] = { unicodeslot=0x034F, category='mn', description='COMBINING GRAPHEME JOINER' },
+ [0x0350] = { unicodeslot=0x0350, category='mn', description='COMBINING RIGHT ARROWHEAD ABOVE' },
+ [0x0351] = { unicodeslot=0x0351, category='mn', description='COMBINING LEFT HALF RING ABOVE' },
+ [0x0352] = { unicodeslot=0x0352, category='mn', description='COMBINING FERMATA' },
+ [0x0353] = { unicodeslot=0x0353, category='mn', description='COMBINING X BELOW' },
+ [0x0354] = { unicodeslot=0x0354, category='mn', description='COMBINING LEFT ARROWHEAD BELOW' },
+ [0x0355] = { unicodeslot=0x0355, category='mn', description='COMBINING RIGHT ARROWHEAD BELOW' },
+ [0x0356] = { unicodeslot=0x0356, category='mn', description='COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW' },
+ [0x0357] = { unicodeslot=0x0357, category='mn', description='COMBINING RIGHT HALF RING ABOVE' },
+ [0x0358] = { unicodeslot=0x0358, category='mn', description='COMBINING DOT ABOVE RIGHT' },
+ [0x0359] = { unicodeslot=0x0359, category='mn', description='COMBINING ASTERISK BELOW' },
+ [0x035A] = { unicodeslot=0x035A, category='mn', description='COMBINING DOUBLE RING BELOW' },
+ [0x035B] = { unicodeslot=0x035B, category='mn', description='COMBINING ZIGZAG ABOVE' },
+ [0x035C] = { unicodeslot=0x035C, category='mn', description='COMBINING DOUBLE BREVE BELOW' },
+ [0x035D] = { unicodeslot=0x035D, category='mn', description='COMBINING DOUBLE BREVE' },
+ [0x035E] = { unicodeslot=0x035E, category='mn', description='COMBINING DOUBLE MACRON' },
+ [0x035F] = { unicodeslot=0x035F, category='mn', description='COMBINING DOUBLE MACRON BELOW' },
+ [0x0360] = { unicodeslot=0x0360, category='mn', description='COMBINING DOUBLE TILDE' },
+ [0x0361] = { unicodeslot=0x0361, category='mn', description='COMBINING DOUBLE INVERTED BREVE' },
+ [0x0362] = { unicodeslot=0x0362, category='mn', description='COMBINING DOUBLE RIGHTWARDS ARROW BELOW' },
+ [0x0363] = { unicodeslot=0x0363, category='mn', description='COMBINING LATIN SMALL LETTER A' },
+ [0x0364] = { unicodeslot=0x0364, category='mn', description='COMBINING LATIN SMALL LETTER E' },
+ [0x0365] = { unicodeslot=0x0365, category='mn', description='COMBINING LATIN SMALL LETTER I' },
+ [0x0366] = { unicodeslot=0x0366, category='mn', description='COMBINING LATIN SMALL LETTER O' },
+ [0x0367] = { unicodeslot=0x0367, category='mn', description='COMBINING LATIN SMALL LETTER U' },
+ [0x0368] = { unicodeslot=0x0368, category='mn', description='COMBINING LATIN SMALL LETTER C' },
+ [0x0369] = { unicodeslot=0x0369, category='mn', description='COMBINING LATIN SMALL LETTER D' },
+ [0x036A] = { unicodeslot=0x036A, category='mn', description='COMBINING LATIN SMALL LETTER H' },
+ [0x036B] = { unicodeslot=0x036B, category='mn', description='COMBINING LATIN SMALL LETTER M' },
+ [0x036C] = { unicodeslot=0x036C, category='mn', description='COMBINING LATIN SMALL LETTER R' },
+ [0x036D] = { unicodeslot=0x036D, category='mn', description='COMBINING LATIN SMALL LETTER T' },
+ [0x036E] = { unicodeslot=0x036E, category='mn', description='COMBINING LATIN SMALL LETTER V' },
+ [0x036F] = { unicodeslot=0x036F, category='mn', description='COMBINING LATIN SMALL LETTER X' },
+ [0x0374] = { unicodeslot=0x0374, category='sk', description='GREEK NUMERAL SIGN', specials={'char',0x02B9} },
+ [0x0375] = { unicodeslot=0x0375, category='sk', description='GREEK LOWER NUMERAL SIGN' },
+ [0x037A] = { unicodeslot=0x037A, category='lm', description='GREEK YPOGEGRAMMENI', specials={'compat',0x0020,0x0345} },
+ [0x037B] = { unicodeslot=0x037B, category='ll', description='GREEK SMALL REVERSED LUNATE SIGMA SYMBOL', uccode=0x03FD },
+ [0x037C] = { unicodeslot=0x037C, category='ll', description='GREEK SMALL DOTTED LUNATE SIGMA SYMBOL', uccode=0x03FE },
+ [0x037D] = { unicodeslot=0x037D, category='ll', description='GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL', uccode=0x03FF },
+ [0x037E] = { unicodeslot=0x037E, category='po', description='GREEK QUESTION MARK', specials={'char',0x003B} },
+ [0x0384] = { unicodeslot=0x0384, category='sk', adobename='tonos', contextname='greektonos', description='GREEK TONOS', specials={'compat',0x0020,0x0301} },
+ [0x0385] = { unicodeslot=0x0385, category='sk', adobename='dieresistonos', contextname='greekdialytikatonos', description='GREEK DIALYTIKA TONOS', specials={'char',0x00A8,0x0301} },
+ [0x0386] = { unicodeslot=0x0386, category='lu', adobename='Alphatonos', contextname='greekAlphatonos', description='GREEK CAPITAL LETTER ALPHA WITH TONOS', shcode=0x0391, lccode=0x03AC, specials={'char',0x0391,0x0301} },
+ [0x0387] = { unicodeslot=0x0387, category='po', adobename='anoteleia', description='GREEK ANO TELEIA', specials={'char',0x00B7} },
+ [0x0388] = { unicodeslot=0x0388, category='lu', adobename='Epsilontonos', contextname='greekEpsilontonos', description='GREEK CAPITAL LETTER EPSILON WITH TONOS', shcode=0x0395, lccode=0x03AD, specials={'char',0x0395,0x0301} },
+ [0x0389] = { unicodeslot=0x0389, category='lu', adobename='Etatonos', contextname='greekEtatonos', description='GREEK CAPITAL LETTER ETA WITH TONOS', shcode=0x0397, lccode=0x03AE, specials={'char',0x0397,0x0301} },
+ [0x038A] = { unicodeslot=0x038A, category='lu', adobename='Iotatonos', contextname='greekIotatonos', description='GREEK CAPITAL LETTER IOTA WITH TONOS', shcode=0x0399, lccode=0x03AF, specials={'char',0x0399,0x0301} },
+ [0x038C] = { unicodeslot=0x038C, category='lu', adobename='Omicrontonos', contextname='greekOmicrontonos', description='GREEK CAPITAL LETTER OMICRON WITH TONOS', shcode=0x039F, lccode=0x03CC, specials={'char',0x039F,0x0301} },
+ [0x038E] = { unicodeslot=0x038E, category='lu', adobename='Upsilontonos', contextname='greekUpsilontonos', description='GREEK CAPITAL LETTER UPSILON WITH TONOS', shcode=0x03A5, lccode=0x03CD, specials={'char',0x03A5,0x0301} },
+ [0x038F] = { unicodeslot=0x038F, category='lu', adobename='Omegatonos', contextname='greekOmegatonos', description='GREEK CAPITAL LETTER OMEGA WITH TONOS', shcode=0x03A9, lccode=0x03CE, specials={'char',0x03A9,0x0301} },
+ [0x0390] = { unicodeslot=0x0390, category='ll', adobename='iotadieresistonos', contextname='greekiotadialytikatonos', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS', shcode=0x03B9, specials={'char',0x03CA,0x0301} },
+ [0x0391] = { unicodeslot=0x0391, category='lu', adobename='Alpha', contextname='greekAlpha', description='GREEK CAPITAL LETTER ALPHA', lccode=0x03B1 },
+ [0x0392] = { unicodeslot=0x0392, category='lu', adobename='Beta', contextname='greekBeta', description='GREEK CAPITAL LETTER BETA', lccode=0x03B2 },
+ [0x0393] = { unicodeslot=0x0393, category='lu', adobename='Gamma', contextname='greekGamma', description='GREEK CAPITAL LETTER GAMMA', lccode=0x03B3 },
+ [0x0394] = { unicodeslot=0x0394, category='lu', contextname='greekDelta', description='GREEK CAPITAL LETTER DELTA', lccode=0x03B4 },
+ [0x0395] = { unicodeslot=0x0395, category='lu', adobename='Epsilon', contextname='greekEpsilon', description='GREEK CAPITAL LETTER EPSILON', lccode=0x03B5 },
+ [0x0396] = { unicodeslot=0x0396, category='lu', adobename='Zeta', contextname='greekZeta', description='GREEK CAPITAL LETTER ZETA', lccode=0x03B6 },
+ [0x0397] = { unicodeslot=0x0397, category='lu', adobename='Eta', contextname='greekEta', description='GREEK CAPITAL LETTER ETA', lccode=0x03B7 },
+ [0x0398] = { unicodeslot=0x0398, category='lu', adobename='Theta', contextname='greekTheta', description='GREEK CAPITAL LETTER THETA', lccode=0x03B8 },
+ [0x0399] = { unicodeslot=0x0399, category='lu', adobename='Iota', contextname='greekIota', description='GREEK CAPITAL LETTER IOTA', lccode=0x03B9 },
+ [0x039A] = { unicodeslot=0x039A, category='lu', adobename='Kappa', contextname='greekKappa', description='GREEK CAPITAL LETTER KAPPA', lccode=0x03BA },
+ [0x039B] = { unicodeslot=0x039B, category='lu', adobename='Lambda', contextname='greekLambda', description='GREEK CAPITAL LETTER LAMDA', lccode=0x03BB },
+ [0x039C] = { unicodeslot=0x039C, category='lu', adobename='Mu', contextname='greekMu', description='GREEK CAPITAL LETTER MU', lccode=0x03BC },
+ [0x039D] = { unicodeslot=0x039D, category='lu', adobename='Nu', contextname='greekNu', description='GREEK CAPITAL LETTER NU', lccode=0x03BD },
+ [0x039E] = { unicodeslot=0x039E, category='lu', adobename='Xi', contextname='greekXi', description='GREEK CAPITAL LETTER XI', lccode=0x03BE },
+ [0x039F] = { unicodeslot=0x039F, category='lu', adobename='Omicron', contextname='greekOmicron', description='GREEK CAPITAL LETTER OMICRON', lccode=0x03BF },
+ [0x03A0] = { unicodeslot=0x03A0, category='lu', adobename='Pi', contextname='greekPi', description='GREEK CAPITAL LETTER PI', lccode=0x03C0 },
+ [0x03A1] = { unicodeslot=0x03A1, category='lu', adobename='Rho', contextname='greekRho', description='GREEK CAPITAL LETTER RHO', lccode=0x03C1 },
+ [0x03A3] = { unicodeslot=0x03A3, category='lu', adobename='Sigma', contextname='greekSigma', description='GREEK CAPITAL LETTER SIGMA', lccode=0x03C3 },
+ [0x03A4] = { unicodeslot=0x03A4, category='lu', adobename='Tau', contextname='greekTau', description='GREEK CAPITAL LETTER TAU', lccode=0x03C4 },
+ [0x03A5] = { unicodeslot=0x03A5, category='lu', adobename='Upsilon', contextname='greekUpsilon', description='GREEK CAPITAL LETTER UPSILON', lccode=0x03C5 },
+ [0x03A6] = { unicodeslot=0x03A6, category='lu', adobename='Phi', contextname='greekPhi', description='GREEK CAPITAL LETTER PHI', lccode=0x03C6 },
+ [0x03A7] = { unicodeslot=0x03A7, category='lu', adobename='Chi', contextname='greekChi', description='GREEK CAPITAL LETTER CHI', lccode=0x03C7 },
+ [0x03A8] = { unicodeslot=0x03A8, category='lu', adobename='Psi', contextname='greekPsi', description='GREEK CAPITAL LETTER PSI', lccode=0x03C8 },
+ [0x03A9] = { unicodeslot=0x03A9, category='lu', contextname='greekOmega', description='GREEK CAPITAL LETTER OMEGA', lccode=0x03C9 },
+ [0x03AA] = { unicodeslot=0x03AA, category='lu', adobename='Iotadieresis', contextname='greekIotadialytika', description='GREEK CAPITAL LETTER IOTA WITH DIALYTIKA', shcode=0x0399, lccode=0x03CA, specials={'char',0x0399,0x0308} },
+ [0x03AB] = { unicodeslot=0x03AB, category='lu', adobename='Upsilondieresis', contextname='greekUpsilondialytika', description='GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA', shcode=0x03A5, lccode=0x03CB, specials={'char',0x03A5,0x0308} },
+ [0x03AC] = { unicodeslot=0x03AC, category='ll', adobename='alphatonos', contextname='greekalphatonos', description='GREEK SMALL LETTER ALPHA WITH TONOS', shcode=0x03B1, uccode=0x0386, specials={'char',0x03B1,0x0301} },
+ [0x03AD] = { unicodeslot=0x03AD, category='ll', adobename='epsilontonos', contextname='greekepsilontonos', description='GREEK SMALL LETTER EPSILON WITH TONOS', shcode=0x03B5, uccode=0x0388, specials={'char',0x03B5,0x0301} },
+ [0x03AE] = { unicodeslot=0x03AE, category='ll', adobename='etatonos', contextname='greeketatonos', description='GREEK SMALL LETTER ETA WITH TONOS', shcode=0x03B7, uccode=0x0389, specials={'char',0x03B7,0x0301} },
+ [0x03AF] = { unicodeslot=0x03AF, category='ll', adobename='iotatonos', contextname='greekiotatonos', description='GREEK SMALL LETTER IOTA WITH TONOS', shcode=0x03B9, uccode=0x038A, specials={'char',0x03B9,0x0301} },
+ [0x03B0] = { unicodeslot=0x03B0, category='ll', adobename='upsilondieresistonos', contextname='greekupsilondialytikatonos', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS', shcode=0x03C5, specials={'char',0x03CB,0x0301} },
+ [0x03B1] = { unicodeslot=0x03B1, category='ll', adobename='alpha', contextname='greekalpha', description='GREEK SMALL LETTER ALPHA', uccode=0x0391 },
+ [0x03B2] = { unicodeslot=0x03B2, category='ll', adobename='beta', contextname='greekbeta', description='GREEK SMALL LETTER BETA', uccode=0x0392 },
+ [0x03B3] = { unicodeslot=0x03B3, category='ll', adobename='gamma', contextname='greekgamma', description='GREEK SMALL LETTER GAMMA', uccode=0x0393 },
+ [0x03B4] = { unicodeslot=0x03B4, category='ll', adobename='delta', contextname='greekdelta', description='GREEK SMALL LETTER DELTA', uccode=0x0394 },
+ [0x03B5] = { unicodeslot=0x03B5, category='ll', adobename='epsilon', contextname='greekepsilon', description='GREEK SMALL LETTER EPSILON', uccode=0x0395 },
+ [0x03B6] = { unicodeslot=0x03B6, category='ll', adobename='zeta', contextname='greekzeta', description='GREEK SMALL LETTER ZETA', uccode=0x0396 },
+ [0x03B7] = { unicodeslot=0x03B7, category='ll', adobename='eta', contextname='greeketa', description='GREEK SMALL LETTER ETA', uccode=0x0397 },
+ [0x03B8] = { unicodeslot=0x03B8, category='ll', adobename='theta', contextname='greektheta', description='GREEK SMALL LETTER THETA', uccode=0x0398 },
+ [0x03B9] = { unicodeslot=0x03B9, category='ll', adobename='iota', contextname='greekiota', description='GREEK SMALL LETTER IOTA', uccode=0x0399 },
+ [0x03BA] = { unicodeslot=0x03BA, category='ll', adobename='kappa', contextname='greekkappa', description='GREEK SMALL LETTER KAPPA', uccode=0x039A },
+ [0x03BB] = { unicodeslot=0x03BB, category='ll', adobename='lambda', contextname='greeklambda', description='GREEK SMALL LETTER LAMDA', uccode=0x039B },
+ [0x03BC] = { unicodeslot=0x03BC, category='ll', contextname='greekmu', description='GREEK SMALL LETTER MU', uccode=0x039C },
+ [0x03BD] = { unicodeslot=0x03BD, category='ll', adobename='nu', contextname='greeknu', description='GREEK SMALL LETTER NU', uccode=0x039D },
+ [0x03BE] = { unicodeslot=0x03BE, category='ll', adobename='xi', contextname='greekxi', description='GREEK SMALL LETTER XI', uccode=0x039E },
+ [0x03BF] = { unicodeslot=0x03BF, category='ll', adobename='omicron', contextname='greekomicron', description='GREEK SMALL LETTER OMICRON', uccode=0x039F },
+ [0x03C0] = { unicodeslot=0x03C0, category='ll', adobename='pi', contextname='greekpi', description='GREEK SMALL LETTER PI', uccode=0x03A0 },
+ [0x03C1] = { unicodeslot=0x03C1, category='ll', adobename='rho', contextname='greekrho', description='GREEK SMALL LETTER RHO', uccode=0x03A1 },
+ [0x03C2] = { unicodeslot=0x03C2, category='ll', adobename='sigma1', contextname='greekfinalsigma', description='GREEK SMALL LETTER FINAL SIGMA', uccode=0x03A3 },
+ [0x03C3] = { unicodeslot=0x03C3, category='ll', adobename='sigma', contextname='greeksigma', description='GREEK SMALL LETTER SIGMA', uccode=0x03A3 },
+ [0x03C4] = { unicodeslot=0x03C4, category='ll', adobename='tau', contextname='greektau', description='GREEK SMALL LETTER TAU', uccode=0x03A4 },
+ [0x03C5] = { unicodeslot=0x03C5, category='ll', adobename='upsilon', contextname='greekupsilon', description='GREEK SMALL LETTER UPSILON', uccode=0x03A5 },
+ [0x03C6] = { unicodeslot=0x03C6, category='ll', adobename='phi', contextname='greekphi', description='GREEK SMALL LETTER PHI', uccode=0x03A6 },
+ [0x03C7] = { unicodeslot=0x03C7, category='ll', adobename='chi', contextname='greekchi', description='GREEK SMALL LETTER CHI', uccode=0x03A7 },
+ [0x03C8] = { unicodeslot=0x03C8, category='ll', adobename='psi', contextname='greekpsi', description='GREEK SMALL LETTER PSI', uccode=0x03A8 },
+ [0x03C9] = { unicodeslot=0x03C9, category='ll', adobename='omega', contextname='greekomega', description='GREEK SMALL LETTER OMEGA', uccode=0x03A9 },
+ [0x03CA] = { unicodeslot=0x03CA, category='ll', adobename='iotadieresis', contextname='greekiotadialytika', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA', shcode=0x03B9, uccode=0x03AA, specials={'char',0x03B9,0x0308} },
+ [0x03CB] = { unicodeslot=0x03CB, category='ll', adobename='upsilondieresis', contextname='greekupsilondiaeresis', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA', shcode=0x03C5, uccode=0x03AB, specials={'char',0x03C5,0x0308} },
+ [0x03CC] = { unicodeslot=0x03CC, category='ll', adobename='omicrontonos', contextname='greekomicrontonos', description='GREEK SMALL LETTER OMICRON WITH TONOS', shcode=0x03BF, uccode=0x038C, specials={'char',0x03BF,0x0301} },
+ [0x03CD] = { unicodeslot=0x03CD, category='ll', adobename='upsilontonos', contextname='greekupsilontonos', description='GREEK SMALL LETTER UPSILON WITH TONOS', shcode=0x03C5, uccode=0x038E, specials={'char',0x03C5,0x0301} },
+ [0x03CE] = { unicodeslot=0x03CE, category='ll', adobename='omegatonos', contextname='greekomegatonos', description='GREEK SMALL LETTER OMEGA WITH TONOS', shcode=0x03C9, uccode=0x038F, specials={'char',0x03C9,0x0301} },
+ [0x03D0] = { unicodeslot=0x03D0, category='ll', description='GREEK BETA SYMBOL', uccode=0x0392, specials={'compat',0x03B2} },
+ [0x03D1] = { unicodeslot=0x03D1, category='ll', adobename='theta1', contextname='greekthetaalt', description='GREEK THETA SYMBOL', uccode=0x0398, specials={'compat',0x03B8} },
+ [0x03D2] = { unicodeslot=0x03D2, category='lu', adobename='Upsilon1', description='GREEK UPSILON WITH HOOK SYMBOL', specials={'compat',0x03A5} },
+ [0x03D3] = { unicodeslot=0x03D3, category='lu', description='GREEK UPSILON WITH ACUTE AND HOOK SYMBOL', specials={'char',0x03D2,0x0301} },
+ [0x03D4] = { unicodeslot=0x03D4, category='lu', description='GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL', specials={'char',0x03D2,0x0308} },
+ [0x03D5] = { unicodeslot=0x03D5, category='ll', adobename='phi1', contextname='greekphialt', description='GREEK PHI SYMBOL', uccode=0x03A6, specials={'compat',0x03C6} },
+ [0x03D6] = { unicodeslot=0x03D6, category='ll', adobename='omega1', contextname='greekpialt', description='GREEK PI SYMBOL', uccode=0x03A0, specials={'compat',0x03C0} },
+ [0x03D7] = { unicodeslot=0x03D7, category='ll', description='GREEK KAI SYMBOL' },
+ [0x03D8] = { unicodeslot=0x03D8, category='lu', description='GREEK LETTER ARCHAIC KOPPA', lccode=0x03D9 },
+ [0x03D9] = { unicodeslot=0x03D9, category='ll', contextname='greekkoppa', description='GREEK SMALL LETTER ARCHAIC KOPPA', uccode=0x03D8 },
+ [0x03DA] = { unicodeslot=0x03DA, category='lu', description='GREEK LETTER STIGMA', lccode=0x03DB },
+ [0x03DB] = { unicodeslot=0x03DB, category='ll', contextname='greekstigma', description='GREEK SMALL LETTER STIGMA', uccode=0x03DA },
+ [0x03DC] = { unicodeslot=0x03DC, category='lu', description='GREEK LETTER DIGAMMA', lccode=0x03DD },
+ [0x03DD] = { unicodeslot=0x03DD, category='ll', contextname='greekdigamma', description='GREEK SMALL LETTER DIGAMMA', uccode=0x03DC },
+ [0x03DE] = { unicodeslot=0x03DE, category='lu', description='GREEK LETTER KOPPA', lccode=0x03DF },
+ [0x03DF] = { unicodeslot=0x03DF, category='ll', contextname='greeknumkoppa', description='GREEK SMALL LETTER KOPPA', uccode=0x03DE },
+ [0x03E0] = { unicodeslot=0x03E0, category='lu', description='GREEK LETTER SAMPI', lccode=0x03E1 },
+ [0x03E1] = { unicodeslot=0x03E1, category='ll', contextname='greeksampi', description='GREEK SMALL LETTER SAMPI', uccode=0x03E0 },
+ [0x03E2] = { unicodeslot=0x03E2, category='lu', description='COPTIC CAPITAL LETTER SHEI', lccode=0x03E3 },
+ [0x03E3] = { unicodeslot=0x03E3, category='ll', description='COPTIC SMALL LETTER SHEI', uccode=0x03E2 },
+ [0x03E4] = { unicodeslot=0x03E4, category='lu', description='COPTIC CAPITAL LETTER FEI', lccode=0x03E5 },
+ [0x03E5] = { unicodeslot=0x03E5, category='ll', description='COPTIC SMALL LETTER FEI', uccode=0x03E4 },
+ [0x03E6] = { unicodeslot=0x03E6, category='lu', description='COPTIC CAPITAL LETTER KHEI', lccode=0x03E7 },
+ [0x03E7] = { unicodeslot=0x03E7, category='ll', description='COPTIC SMALL LETTER KHEI', uccode=0x03E6 },
+ [0x03E8] = { unicodeslot=0x03E8, category='lu', description='COPTIC CAPITAL LETTER HORI', lccode=0x03E9 },
+ [0x03E9] = { unicodeslot=0x03E9, category='ll', description='COPTIC SMALL LETTER HORI', uccode=0x03E8 },
+ [0x03EA] = { unicodeslot=0x03EA, category='lu', description='COPTIC CAPITAL LETTER GANGIA', lccode=0x03EB },
+ [0x03EB] = { unicodeslot=0x03EB, category='ll', description='COPTIC SMALL LETTER GANGIA', uccode=0x03EA },
+ [0x03EC] = { unicodeslot=0x03EC, category='lu', description='COPTIC CAPITAL LETTER SHIMA', lccode=0x03ED },
+ [0x03ED] = { unicodeslot=0x03ED, category='ll', description='COPTIC SMALL LETTER SHIMA', uccode=0x03EC },
+ [0x03EE] = { unicodeslot=0x03EE, category='lu', description='COPTIC CAPITAL LETTER DEI', lccode=0x03EF },
+ [0x03EF] = { unicodeslot=0x03EF, category='ll', description='COPTIC SMALL LETTER DEI', uccode=0x03EE },
+ [0x03F0] = { unicodeslot=0x03F0, category='ll', description='GREEK KAPPA SYMBOL', uccode=0x039A, specials={'compat',0x03BA} },
+ [0x03F1] = { unicodeslot=0x03F1, category='ll', contextname='greekrhoalt', description='GREEK RHO SYMBOL', uccode=0x03A1, specials={'compat',0x03C1} },
+ [0x03F2] = { unicodeslot=0x03F2, category='ll', contextname='greeksigmalunate', description='GREEK LUNATE SIGMA SYMBOL', uccode=0x03F9, specials={'compat',0x03C2} },
+ [0x03F3] = { unicodeslot=0x03F3, category='ll', description='GREEK LETTER YOT' },
+ [0x03F4] = { unicodeslot=0x03F4, category='lu', description='GREEK CAPITAL THETA SYMBOL', lccode=0x03B8, specials={'compat',0x0398} },
+ [0x03F5] = { unicodeslot=0x03F5, category='ll', contextname='greekepsilonalt', description='GREEK LUNATE EPSILON SYMBOL', uccode=0x0395, specials={'compat',0x03B5} },
+ [0x03F6] = { unicodeslot=0x03F6, category='sm', description='GREEK REVERSED LUNATE EPSILON SYMBOL' },
+ [0x03F7] = { unicodeslot=0x03F7, category='lu', description='GREEK CAPITAL LETTER SHO', lccode=0x03F8 },
+ [0x03F8] = { unicodeslot=0x03F8, category='ll', description='GREEK SMALL LETTER SHO', uccode=0x03F7 },
+ [0x03F9] = { unicodeslot=0x03F9, category='lu', contextname='greekSigmalunate', description='GREEK CAPITAL LUNATE SIGMA SYMBOL', lccode=0x03F2, specials={'compat',0x03A3} },
+ [0x03FA] = { unicodeslot=0x03FA, category='lu', description='GREEK CAPITAL LETTER SAN', lccode=0x03FB },
+ [0x03FB] = { unicodeslot=0x03FB, category='ll', description='GREEK SMALL LETTER SAN', uccode=0x03FA },
+ [0x03FC] = { unicodeslot=0x03FC, category='ll', description='GREEK RHO WITH STROKE SYMBOL' },
+ [0x03FD] = { unicodeslot=0x03FD, category='lu', description='GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL', lccode=0x037B },
+ [0x03FE] = { unicodeslot=0x03FE, category='lu', description='GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL', lccode=0x037C },
+ [0x03FF] = { unicodeslot=0x03FF, category='lu', description='GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL', lccode=0x037D },
+ [0x0400] = { unicodeslot=0x0400, category='lu', contextname='cyrillicEgrave', description='CYRILLIC CAPITAL LETTER IE WITH GRAVE', shcode=0x0415, lccode=0x0450, specials={'char',0x0415,0x0300} },
+ [0x0401] = { unicodeslot=0x0401, category='lu', adobename='afii10023', contextname='cyrillicYO', description='CYRILLIC CAPITAL LETTER IO', lccode=0x0451, specials={'char',0x0415,0x0308} },
+ [0x0402] = { unicodeslot=0x0402, category='lu', adobename='afii10051', contextname='cyrillicDJE', description='CYRILLIC CAPITAL LETTER DJE', lccode=0x0452 },
+ [0x0403] = { unicodeslot=0x0403, category='lu', adobename='afii10052', contextname='cyrillicGJE', description='CYRILLIC CAPITAL LETTER GJE', lccode=0x0453, specials={'char',0x0413,0x0301} },
+ [0x0404] = { unicodeslot=0x0404, category='lu', adobename='afii10053', contextname='cyrillicIE', description='CYRILLIC CAPITAL LETTER UKRAINIAN IE', lccode=0x0454 },
+ [0x0405] = { unicodeslot=0x0405, category='lu', adobename='afii10054', contextname='cyrillicDZE', description='CYRILLIC CAPITAL LETTER DZE', lccode=0x0455 },
+ [0x0406] = { unicodeslot=0x0406, category='lu', adobename='afii10055', contextname='cyrillicII', description='CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I', lccode=0x0456 },
+ [0x0407] = { unicodeslot=0x0407, category='lu', adobename='afii10056', contextname='cyrillicYI', description='CYRILLIC CAPITAL LETTER YI', lccode=0x0457, specials={'char',0x0406,0x0308} },
+ [0x0408] = { unicodeslot=0x0408, category='lu', adobename='afii10057', contextname='cyrillicJE', description='CYRILLIC CAPITAL LETTER JE', lccode=0x0458 },
+ [0x0409] = { unicodeslot=0x0409, category='lu', adobename='afii10058', contextname='cyrillicLJE', description='CYRILLIC CAPITAL LETTER LJE', lccode=0x0459 },
+ [0x040A] = { unicodeslot=0x040A, category='lu', adobename='afii10059', contextname='cyrillicNJE', description='CYRILLIC CAPITAL LETTER NJE', lccode=0x045A },
+ [0x040B] = { unicodeslot=0x040B, category='lu', adobename='afii10060', contextname='cyrillicTSHE', description='CYRILLIC CAPITAL LETTER TSHE', lccode=0x045B },
+ [0x040C] = { unicodeslot=0x040C, category='lu', adobename='afii10061', contextname='cyrillicKJE', description='CYRILLIC CAPITAL LETTER KJE', lccode=0x045C, specials={'char',0x041A,0x0301} },
+ [0x040D] = { unicodeslot=0x040D, category='lu', contextname='cyrillicIgrave', description='CYRILLIC CAPITAL LETTER I WITH GRAVE', shcode=0x0418, lccode=0x045D, specials={'char',0x0418,0x0300} },
+ [0x040E] = { unicodeslot=0x040E, category='lu', adobename='afii10062', contextname='cyrillicUSHRT', description='CYRILLIC CAPITAL LETTER SHORT U', lccode=0x045E, specials={'char',0x0423,0x0306} },
+ [0x040F] = { unicodeslot=0x040F, category='lu', adobename='afii10145', contextname='cyrillicDZHE', description='CYRILLIC CAPITAL LETTER DZHE', lccode=0x045F },
+ [0x0410] = { unicodeslot=0x0410, category='lu', adobename='afii10017', contextname='cyrillicA', description='CYRILLIC CAPITAL LETTER A', lccode=0x0430 },
+ [0x0411] = { unicodeslot=0x0411, category='lu', adobename='afii10018', contextname='cyrillicB', description='CYRILLIC CAPITAL LETTER BE', lccode=0x0431 },
+ [0x0412] = { unicodeslot=0x0412, category='lu', adobename='afii10019', contextname='cyrillicV', description='CYRILLIC CAPITAL LETTER VE', lccode=0x0432 },
+ [0x0413] = { unicodeslot=0x0413, category='lu', adobename='afii10020', contextname='cyrillicG', description='CYRILLIC CAPITAL LETTER GHE', lccode=0x0433 },
+ [0x0414] = { unicodeslot=0x0414, category='lu', adobename='afii10021', contextname='cyrillicD', description='CYRILLIC CAPITAL LETTER DE', lccode=0x0434 },
+ [0x0415] = { unicodeslot=0x0415, category='lu', adobename='afii10022', contextname='cyrillicE', description='CYRILLIC CAPITAL LETTER IE', lccode=0x0435 },
+ [0x0416] = { unicodeslot=0x0416, category='lu', adobename='afii10024', contextname='cyrillicZH', description='CYRILLIC CAPITAL LETTER ZHE', lccode=0x0436 },
+ [0x0417] = { unicodeslot=0x0417, category='lu', adobename='afii10025', contextname='cyrillicZ', description='CYRILLIC CAPITAL LETTER ZE', lccode=0x0437 },
+ [0x0418] = { unicodeslot=0x0418, category='lu', adobename='afii10026', contextname='cyrillicI', description='CYRILLIC CAPITAL LETTER I', lccode=0x0438 },
+ [0x0419] = { unicodeslot=0x0419, category='lu', adobename='afii10027', contextname='cyrillicISHRT', description='CYRILLIC CAPITAL LETTER SHORT I', lccode=0x0439, specials={'char',0x0418,0x0306} },
+ [0x041A] = { unicodeslot=0x041A, category='lu', adobename='afii10028', contextname='cyrillicK', description='CYRILLIC CAPITAL LETTER KA', lccode=0x043A },
+ [0x041B] = { unicodeslot=0x041B, category='lu', adobename='afii10029', contextname='cyrillicL', description='CYRILLIC CAPITAL LETTER EL', lccode=0x043B },
+ [0x041C] = { unicodeslot=0x041C, category='lu', adobename='afii10030', contextname='cyrillicM', description='CYRILLIC CAPITAL LETTER EM', lccode=0x043C },
+ [0x041D] = { unicodeslot=0x041D, category='lu', adobename='afii10031', contextname='cyrillicN', description='CYRILLIC CAPITAL LETTER EN', lccode=0x043D },
+ [0x041E] = { unicodeslot=0x041E, category='lu', adobename='afii10032', contextname='cyrillicO', description='CYRILLIC CAPITAL LETTER O', lccode=0x043E },
+ [0x041F] = { unicodeslot=0x041F, category='lu', adobename='afii10033', contextname='cyrillicP', description='CYRILLIC CAPITAL LETTER PE', lccode=0x043F },
+ [0x0420] = { unicodeslot=0x0420, category='lu', adobename='afii10034', contextname='cyrillicR', description='CYRILLIC CAPITAL LETTER ER', lccode=0x0440 },
+ [0x0421] = { unicodeslot=0x0421, category='lu', adobename='afii10035', contextname='cyrillicS', description='CYRILLIC CAPITAL LETTER ES', lccode=0x0441 },
+ [0x0422] = { unicodeslot=0x0422, category='lu', adobename='afii10036', contextname='cyrillicT', description='CYRILLIC CAPITAL LETTER TE', lccode=0x0442 },
+ [0x0423] = { unicodeslot=0x0423, category='lu', adobename='afii10037', contextname='cyrillicU', description='CYRILLIC CAPITAL LETTER U', lccode=0x0443 },
+ [0x0424] = { unicodeslot=0x0424, category='lu', adobename='afii10038', contextname='cyrillicF', description='CYRILLIC CAPITAL LETTER EF', lccode=0x0444 },
+ [0x0425] = { unicodeslot=0x0425, category='lu', adobename='afii10039', contextname='cyrillicH', description='CYRILLIC CAPITAL LETTER HA', lccode=0x0445 },
+ [0x0426] = { unicodeslot=0x0426, category='lu', adobename='afii10040', contextname='cyrillicC', description='CYRILLIC CAPITAL LETTER TSE', lccode=0x0446 },
+ [0x0427] = { unicodeslot=0x0427, category='lu', adobename='afii10041', contextname='cyrillicCH', description='CYRILLIC CAPITAL LETTER CHE', lccode=0x0447 },
+ [0x0428] = { unicodeslot=0x0428, category='lu', adobename='afii10042', contextname='cyrillicSH', description='CYRILLIC CAPITAL LETTER SHA', lccode=0x0448 },
+ [0x0429] = { unicodeslot=0x0429, category='lu', adobename='afii10043', contextname='cyrillicSHCH', description='CYRILLIC CAPITAL LETTER SHCHA', lccode=0x0449 },
+ [0x042A] = { unicodeslot=0x042A, category='lu', adobename='afii10044', contextname='cyrillicHRDSN', description='CYRILLIC CAPITAL LETTER HARD SIGN', lccode=0x044A },
+ [0x042B] = { unicodeslot=0x042B, category='lu', adobename='afii10045', contextname='cyrillicERY', description='CYRILLIC CAPITAL LETTER YERU', lccode=0x044B },
+ [0x042C] = { unicodeslot=0x042C, category='lu', adobename='afii10046', contextname='cyrillicSFTSN', description='CYRILLIC CAPITAL LETTER SOFT SIGN', lccode=0x044C },
+ [0x042D] = { unicodeslot=0x042D, category='lu', adobename='afii10047', contextname='cyrillicEREV', description='CYRILLIC CAPITAL LETTER E', lccode=0x044D },
+ [0x042E] = { unicodeslot=0x042E, category='lu', adobename='afii10048', contextname='cyrillicYU', description='CYRILLIC CAPITAL LETTER YU', lccode=0x044E },
+ [0x042F] = { unicodeslot=0x042F, category='lu', adobename='afii10049', contextname='cyrillicYA', description='CYRILLIC CAPITAL LETTER YA', lccode=0x044F },
+ [0x0430] = { unicodeslot=0x0430, category='ll', adobename='afii10065', contextname='cyrillica', description='CYRILLIC SMALL LETTER A', uccode=0x0410 },
+ [0x0431] = { unicodeslot=0x0431, category='ll', adobename='afii10066', contextname='cyrillicb', description='CYRILLIC SMALL LETTER BE', uccode=0x0411 },
+ [0x0432] = { unicodeslot=0x0432, category='ll', adobename='afii10067', contextname='cyrillicv', description='CYRILLIC SMALL LETTER VE', uccode=0x0412 },
+ [0x0433] = { unicodeslot=0x0433, category='ll', adobename='afii10068', contextname='cyrillicg', description='CYRILLIC SMALL LETTER GHE', uccode=0x0413 },
+ [0x0434] = { unicodeslot=0x0434, category='ll', adobename='afii10069', contextname='cyrillicd', description='CYRILLIC SMALL LETTER DE', uccode=0x0414 },
+ [0x0435] = { unicodeslot=0x0435, category='ll', adobename='afii10070', contextname='cyrillice', description='CYRILLIC SMALL LETTER IE', uccode=0x0415 },
+ [0x0436] = { unicodeslot=0x0436, category='ll', adobename='afii10072', contextname='cyrilliczh', description='CYRILLIC SMALL LETTER ZHE', uccode=0x0416 },
+ [0x0437] = { unicodeslot=0x0437, category='ll', adobename='afii10073', contextname='cyrillicz', description='CYRILLIC SMALL LETTER ZE', uccode=0x0417 },
+ [0x0438] = { unicodeslot=0x0438, category='ll', adobename='afii10074', contextname='cyrillici', description='CYRILLIC SMALL LETTER I', uccode=0x0418 },
+ [0x0439] = { unicodeslot=0x0439, category='ll', adobename='afii10075', contextname='cyrillicishrt', description='CYRILLIC SMALL LETTER SHORT I', uccode=0x0419, specials={'char',0x0438,0x0306} },
+ [0x043A] = { unicodeslot=0x043A, category='ll', adobename='afii10076', contextname='cyrillick', description='CYRILLIC SMALL LETTER KA', uccode=0x041A },
+ [0x043B] = { unicodeslot=0x043B, category='ll', adobename='afii10077', contextname='cyrillicl', description='CYRILLIC SMALL LETTER EL', uccode=0x041B },
+ [0x043C] = { unicodeslot=0x043C, category='ll', adobename='afii10078', contextname='cyrillicm', description='CYRILLIC SMALL LETTER EM', uccode=0x041C },
+ [0x043D] = { unicodeslot=0x043D, category='ll', adobename='afii10079', contextname='cyrillicn', description='CYRILLIC SMALL LETTER EN', uccode=0x041D },
+ [0x043E] = { unicodeslot=0x043E, category='ll', adobename='afii10080', contextname='cyrillico', description='CYRILLIC SMALL LETTER O', uccode=0x041E },
+ [0x043F] = { unicodeslot=0x043F, category='ll', adobename='afii10081', contextname='cyrillicp', description='CYRILLIC SMALL LETTER PE', uccode=0x041F },
+ [0x0440] = { unicodeslot=0x0440, category='ll', adobename='afii10082', contextname='cyrillicr', description='CYRILLIC SMALL LETTER ER', uccode=0x0420 },
+ [0x0441] = { unicodeslot=0x0441, category='ll', adobename='afii10083', contextname='cyrillics', description='CYRILLIC SMALL LETTER ES', uccode=0x0421 },
+ [0x0442] = { unicodeslot=0x0442, category='ll', adobename='afii10084', contextname='cyrillict', description='CYRILLIC SMALL LETTER TE', uccode=0x0422 },
+ [0x0443] = { unicodeslot=0x0443, category='ll', adobename='afii10085', contextname='cyrillicu', description='CYRILLIC SMALL LETTER U', uccode=0x0423 },
+ [0x0444] = { unicodeslot=0x0444, category='ll', adobename='afii10086', contextname='cyrillicf', description='CYRILLIC SMALL LETTER EF', uccode=0x0424 },
+ [0x0445] = { unicodeslot=0x0445, category='ll', adobename='afii10087', contextname='cyrillich', description='CYRILLIC SMALL LETTER HA', uccode=0x0425 },
+ [0x0446] = { unicodeslot=0x0446, category='ll', adobename='afii10088', contextname='cyrillicc', description='CYRILLIC SMALL LETTER TSE', uccode=0x0426 },
+ [0x0447] = { unicodeslot=0x0447, category='ll', adobename='afii10089', contextname='cyrillicch', description='CYRILLIC SMALL LETTER CHE', uccode=0x0427 },
+ [0x0448] = { unicodeslot=0x0448, category='ll', adobename='afii10090', contextname='cyrillicsh', description='CYRILLIC SMALL LETTER SHA', uccode=0x0428 },
+ [0x0449] = { unicodeslot=0x0449, category='ll', adobename='afii10091', contextname='cyrillicshch', description='CYRILLIC SMALL LETTER SHCHA', uccode=0x0429 },
+ [0x044A] = { unicodeslot=0x044A, category='ll', adobename='afii10092', contextname='cyrillichrdsn', description='CYRILLIC SMALL LETTER HARD SIGN', uccode=0x042A },
+ [0x044B] = { unicodeslot=0x044B, category='ll', adobename='afii10093', contextname='cyrillicery', description='CYRILLIC SMALL LETTER YERU', uccode=0x042B },
+ [0x044C] = { unicodeslot=0x044C, category='ll', adobename='afii10094', contextname='cyrillicsftsn', description='CYRILLIC SMALL LETTER SOFT SIGN', uccode=0x042C },
+ [0x044D] = { unicodeslot=0x044D, category='ll', adobename='afii10095', contextname='cyrillicerev', description='CYRILLIC SMALL LETTER E', uccode=0x042D },
+ [0x044E] = { unicodeslot=0x044E, category='ll', adobename='afii10096', contextname='cyrillicyu', description='CYRILLIC SMALL LETTER YU', uccode=0x042E },
+ [0x044F] = { unicodeslot=0x044F, category='ll', adobename='afii10097', contextname='cyrillicya', description='CYRILLIC SMALL LETTER YA', uccode=0x042F },
+ [0x0450] = { unicodeslot=0x0450, category='ll', contextname='cyrillicegrave', description='CYRILLIC SMALL LETTER IE WITH GRAVE', shcode=0x0435, uccode=0x0400, specials={'char',0x0435,0x0300} },
+ [0x0451] = { unicodeslot=0x0451, category='ll', adobename='afii10071', contextname='cyrillicyo', description='CYRILLIC SMALL LETTER IO', uccode=0x0401, specials={'char',0x0435,0x0308} },
+ [0x0452] = { unicodeslot=0x0452, category='ll', adobename='afii10099', contextname='cyrillicdje', description='CYRILLIC SMALL LETTER DJE', uccode=0x0402 },
+ [0x0453] = { unicodeslot=0x0453, category='ll', adobename='afii10100', contextname='cyrillicgje', description='CYRILLIC SMALL LETTER GJE', uccode=0x0403, specials={'char',0x0433,0x0301} },
+ [0x0454] = { unicodeslot=0x0454, category='ll', adobename='afii10101', contextname='cyrillicie', description='CYRILLIC SMALL LETTER UKRAINIAN IE', uccode=0x0404 },
+ [0x0455] = { unicodeslot=0x0455, category='ll', adobename='afii10102', contextname='cyrillicdze', description='CYRILLIC SMALL LETTER DZE', uccode=0x0405 },
+ [0x0456] = { unicodeslot=0x0456, category='ll', adobename='afii10103', contextname='cyrillicii', description='CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I', uccode=0x0406 },
+ [0x0457] = { unicodeslot=0x0457, category='ll', adobename='afii10104', contextname='cyrillicyi', description='CYRILLIC SMALL LETTER YI', uccode=0x0407, specials={'char',0x0456,0x0308} },
+ [0x0458] = { unicodeslot=0x0458, category='ll', adobename='afii10105', contextname='cyrillicje', description='CYRILLIC SMALL LETTER JE', uccode=0x0408 },
+ [0x0459] = { unicodeslot=0x0459, category='ll', adobename='afii10106', contextname='cyrilliclje', description='CYRILLIC SMALL LETTER LJE', uccode=0x0409 },
+ [0x045A] = { unicodeslot=0x045A, category='ll', adobename='afii10107', contextname='cyrillicnje', description='CYRILLIC SMALL LETTER NJE', uccode=0x040A },
+ [0x045B] = { unicodeslot=0x045B, category='ll', adobename='afii10108', contextname='cyrillictshe', description='CYRILLIC SMALL LETTER TSHE', uccode=0x040B },
+ [0x045C] = { unicodeslot=0x045C, category='ll', adobename='afii10109', contextname='cyrillickje', description='CYRILLIC SMALL LETTER KJE', uccode=0x040C, specials={'char',0x043A,0x0301} },
+ [0x045D] = { unicodeslot=0x045D, category='ll', contextname='cyrillicigrave', description='CYRILLIC SMALL LETTER I WITH GRAVE', shcode=0x0438, uccode=0x040D, specials={'char',0x0438,0x0300} },
+ [0x045E] = { unicodeslot=0x045E, category='ll', adobename='afii10110', contextname='cyrillicushrt', description='CYRILLIC SMALL LETTER SHORT U', uccode=0x040E, specials={'char',0x0443,0x0306} },
+ [0x045F] = { unicodeslot=0x045F, category='ll', adobename='afii10193', contextname='cyrillicdzhe', description='CYRILLIC SMALL LETTER DZHE', uccode=0x040F },
+ [0x0460] = { unicodeslot=0x0460, category='lu', contextname='cyrillicOMEGA', description='CYRILLIC CAPITAL LETTER OMEGA', lccode=0x0461 },
+ [0x0461] = { unicodeslot=0x0461, category='ll', contextname='cyrillicomega', description='CYRILLIC SMALL LETTER OMEGA', uccode=0x0460 },
+ [0x0462] = { unicodeslot=0x0462, category='lu', adobename='afii10146', contextname='cyrillicYAT', description='CYRILLIC CAPITAL LETTER YAT', lccode=0x0463 },
+ [0x0463] = { unicodeslot=0x0463, category='ll', adobename='afii10194', contextname='cyrillicyat', description='CYRILLIC SMALL LETTER YAT', uccode=0x0462 },
+ [0x0464] = { unicodeslot=0x0464, category='lu', contextname='cyrillicEiotified', description='CYRILLIC CAPITAL LETTER IOTIFIED E', lccode=0x0465 },
+ [0x0465] = { unicodeslot=0x0465, category='ll', contextname='cyrilliceiotified', description='CYRILLIC SMALL LETTER IOTIFIED E', uccode=0x0464 },
+ [0x0466] = { unicodeslot=0x0466, category='lu', contextname='cyrillicLITTLEYUS', description='CYRILLIC CAPITAL LETTER LITTLE YUS', lccode=0x0467 },
+ [0x0467] = { unicodeslot=0x0467, category='ll', contextname='cyrilliclittleyus', description='CYRILLIC SMALL LETTER LITTLE YUS', uccode=0x0466 },
+ [0x0468] = { unicodeslot=0x0468, category='lu', contextname='cyrillicLITTLEYUSiotified', description='CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS', lccode=0x0469 },
+ [0x0469] = { unicodeslot=0x0469, category='ll', contextname='cyrilliclittleyusiotified', description='CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS', uccode=0x0468 },
+ [0x046A] = { unicodeslot=0x046A, category='lu', contextname='cyrillicBIGYUS', description='CYRILLIC CAPITAL LETTER BIG YUS', lccode=0x046B },
+ [0x046B] = { unicodeslot=0x046B, category='ll', contextname='cyrillicbigyus', description='CYRILLIC SMALL LETTER BIG YUS', uccode=0x046A },
+ [0x046C] = { unicodeslot=0x046C, category='lu', contextname='cyrillicBIGYUSiotified', description='CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS', lccode=0x046D },
+ [0x046D] = { unicodeslot=0x046D, category='ll', contextname='cyrillicbigyusiotified', description='CYRILLIC SMALL LETTER IOTIFIED BIG YUS', uccode=0x046C },
+ [0x046E] = { unicodeslot=0x046E, category='lu', contextname='cyrillicKSI', description='CYRILLIC CAPITAL LETTER KSI', lccode=0x046F },
+ [0x046F] = { unicodeslot=0x046F, category='ll', contextname='cyrillicksi', description='CYRILLIC SMALL LETTER KSI', uccode=0x046E },
+ [0x0470] = { unicodeslot=0x0470, category='lu', contextname='cyrillicPSI', description='CYRILLIC CAPITAL LETTER PSI', lccode=0x0471 },
+ [0x0471] = { unicodeslot=0x0471, category='ll', contextname='cyrillicpsi', description='CYRILLIC SMALL LETTER PSI', uccode=0x0470 },
+ [0x0472] = { unicodeslot=0x0472, category='lu', adobename='afii10147', contextname='cyrillicFITA', description='CYRILLIC CAPITAL LETTER FITA', lccode=0x0473 },
+ [0x0473] = { unicodeslot=0x0473, category='ll', adobename='afii10195', contextname='cyrillicfita', description='CYRILLIC SMALL LETTER FITA', uccode=0x0472 },
+ [0x0474] = { unicodeslot=0x0474, category='lu', adobename='afii10148', contextname='cyrillicIZHITSA', description='CYRILLIC CAPITAL LETTER IZHITSA', lccode=0x0475 },
+ [0x0475] = { unicodeslot=0x0475, category='ll', adobename='afii10196', contextname='cyrillicizhitsa', description='CYRILLIC SMALL LETTER IZHITSA', uccode=0x0474 },
+ [0x0476] = { unicodeslot=0x0476, category='lu', contextname='cyrillicIZHITSAdoublegrave', description='CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT', shcode=0x0474, lccode=0x0477, specials={'char',0x0474,0x030F} },
+ [0x0477] = { unicodeslot=0x0477, category='ll', contextname='cyrillicizhitsadoublegrave', description='CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT', shcode=0x0475, uccode=0x0476, specials={'char',0x0475,0x030F} },
+ [0x0478] = { unicodeslot=0x0478, category='lu', contextname='cyrillicUK', description='CYRILLIC CAPITAL LETTER UK', lccode=0x0479 },
+ [0x0479] = { unicodeslot=0x0479, category='ll', contextname='cyrillicuk', description='CYRILLIC SMALL LETTER UK', uccode=0x0478 },
+ [0x047A] = { unicodeslot=0x047A, category='lu', contextname='cyrillicOMEGAround', description='CYRILLIC CAPITAL LETTER ROUND OMEGA', lccode=0x047B },
+ [0x047B] = { unicodeslot=0x047B, category='ll', contextname='cyrillicomegaround', description='CYRILLIC SMALL LETTER ROUND OMEGA', uccode=0x047A },
+ [0x047C] = { unicodeslot=0x047C, category='lu', contextname='cyrillicOMEGAtitlo', description='CYRILLIC CAPITAL LETTER OMEGA WITH TITLO', shcode=0x0460, lccode=0x047D },
+ [0x047D] = { unicodeslot=0x047D, category='ll', contextname='cyrillicomegatitlo', description='CYRILLIC SMALL LETTER OMEGA WITH TITLO', shcode=0x0461, uccode=0x047C },
+ [0x047E] = { unicodeslot=0x047E, category='lu', contextname='cyrillicOT', description='CYRILLIC CAPITAL LETTER OT', lccode=0x047F },
+ [0x047F] = { unicodeslot=0x047F, category='ll', contextname='cyrillicot', description='CYRILLIC SMALL LETTER OT', uccode=0x047E },
+ [0x0480] = { unicodeslot=0x0480, category='lu', contextname='cyrillicKOPPA', description='CYRILLIC CAPITAL LETTER KOPPA', lccode=0x0481 },
+ [0x0481] = { unicodeslot=0x0481, category='ll', contextname='cyrillickoppa', description='CYRILLIC SMALL LETTER KOPPA', uccode=0x0480 },
+ [0x0482] = { unicodeslot=0x0482, category='so', description='CYRILLIC THOUSANDS SIGN' },
+ [0x0483] = { unicodeslot=0x0483, category='mn', contextname='cyrillicTITLO', description='COMBINING CYRILLIC TITLO' },
+ [0x0484] = { unicodeslot=0x0484, category='mn', contextname='cyrillicPALATALIZATION', description='COMBINING CYRILLIC PALATALIZATION' },
+ [0x0485] = { unicodeslot=0x0485, category='mn', contextname='cyrillicDASIAPNEUMATA', description='COMBINING CYRILLIC DASIA PNEUMATA' },
+ [0x0486] = { unicodeslot=0x0486, category='mn', contextname='cyrillicPSILIPNEUMATA', description='COMBINING CYRILLIC PSILI PNEUMATA' },
+ [0x0488] = { unicodeslot=0x0488, category='me', description='COMBINING CYRILLIC HUNDRED THOUSANDS SIGN' },
+ [0x0489] = { unicodeslot=0x0489, category='me', description='COMBINING CYRILLIC MILLIONS SIGN' },
+ [0x048A] = { unicodeslot=0x048A, category='lu', contextname='cyrillicISHRTtail', description='CYRILLIC CAPITAL LETTER SHORT I WITH TAIL', lccode=0x048B },
+ [0x048B] = { unicodeslot=0x048B, category='ll', contextname='cyrillicishrttail', description='CYRILLIC SMALL LETTER SHORT I WITH TAIL', uccode=0x048A },
+ [0x048C] = { unicodeslot=0x048C, category='lu', contextname='cyrillicSEMISOFT', description='CYRILLIC CAPITAL LETTER SEMISOFT SIGN', lccode=0x048D },
+ [0x048D] = { unicodeslot=0x048D, category='ll', contextname='cyrillicsemisoft', description='CYRILLIC SMALL LETTER SEMISOFT SIGN', uccode=0x048C },
+ [0x048E] = { unicodeslot=0x048E, category='lu', contextname='cyrillicERtick', description='CYRILLIC CAPITAL LETTER ER WITH TICK', shcode=0x0420, lccode=0x048F },
+ [0x048F] = { unicodeslot=0x048F, category='ll', contextname='cyrillicertick', description='CYRILLIC SMALL LETTER ER WITH TICK', shcode=0x0440, uccode=0x048E },
+ [0x0490] = { unicodeslot=0x0490, category='lu', adobename='afii10050', contextname='cyrillicGHEupturn', description='CYRILLIC CAPITAL LETTER GHE WITH UPTURN', shcode=0x0413, lccode=0x0491 },
+ [0x0491] = { unicodeslot=0x0491, category='ll', adobename='afii10098', contextname='cyrillicgheupturn', description='CYRILLIC SMALL LETTER GHE WITH UPTURN', shcode=0x0433, uccode=0x0490 },
+ [0x0492] = { unicodeslot=0x0492, category='lu', contextname='cyrillicGHEstroke', description='CYRILLIC CAPITAL LETTER GHE WITH STROKE', shcode=0x0413, lccode=0x0493 },
+ [0x0493] = { unicodeslot=0x0493, category='ll', contextname='cyrillicghestroke', description='CYRILLIC SMALL LETTER GHE WITH STROKE', shcode=0x0433, uccode=0x0492 },
+ [0x0494] = { unicodeslot=0x0494, category='lu', contextname='cyrillicGHEmidhook', description='CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK', shcode=0x0413, lccode=0x0495 },
+ [0x0495] = { unicodeslot=0x0495, category='ll', contextname='cyrillicghemidhook', description='CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK', shcode=0x0433, uccode=0x0494 },
+ [0x0496] = { unicodeslot=0x0496, category='lu', contextname='cyrillicZHEdescender', description='CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER', shcode=0x0416, lccode=0x0497 },
+ [0x0497] = { unicodeslot=0x0497, category='ll', contextname='cyrilliczhedescender', description='CYRILLIC SMALL LETTER ZHE WITH DESCENDER', shcode=0x0436, uccode=0x0496 },
+ [0x0498] = { unicodeslot=0x0498, category='lu', contextname='cyrillicZDSC', description='CYRILLIC CAPITAL LETTER ZE WITH DESCENDER', shcode=0x0417, lccode=0x0499 },
+ [0x0499] = { unicodeslot=0x0499, category='ll', contextname='cyrilliczdsc', description='CYRILLIC SMALL LETTER ZE WITH DESCENDER', shcode=0x0437, uccode=0x0498 },
+ [0x049A] = { unicodeslot=0x049A, category='lu', contextname='cyrillicKADC', description='CYRILLIC CAPITAL LETTER KA WITH DESCENDER', shcode=0x041A, lccode=0x049B },
+ [0x049B] = { unicodeslot=0x049B, category='ll', contextname='cyrillickadc', description='CYRILLIC SMALL LETTER KA WITH DESCENDER', shcode=0x043A, uccode=0x049A },
+ [0x049C] = { unicodeslot=0x049C, category='lu', contextname='cyrillicKAvertstroke', description='CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE', shcode=0x041A, lccode=0x049D },
+ [0x049D] = { unicodeslot=0x049D, category='ll', contextname='cyrillickavertstroke', description='CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE', shcode=0x043A, uccode=0x049C },
+ [0x049E] = { unicodeslot=0x049E, category='lu', contextname='cyrillicKAstroke', description='CYRILLIC CAPITAL LETTER KA WITH STROKE', shcode=0x041A, lccode=0x049F },
+ [0x049F] = { unicodeslot=0x049F, category='ll', contextname='cyrillickastroke', description='CYRILLIC SMALL LETTER KA WITH STROKE', shcode=0x043A, uccode=0x049E },
+ [0x04A0] = { unicodeslot=0x04A0, category='lu', contextname='cyrillicKAbashkir', description='CYRILLIC CAPITAL LETTER BASHKIR KA', lccode=0x04A1 },
+ [0x04A1] = { unicodeslot=0x04A1, category='ll', contextname='cyrillickabashkir', description='CYRILLIC SMALL LETTER BASHKIR KA', uccode=0x04A0 },
+ [0x04A2] = { unicodeslot=0x04A2, category='lu', contextname='cyrillicENDC', description='CYRILLIC CAPITAL LETTER EN WITH DESCENDER', shcode=0x041D, lccode=0x04A3 },
+ [0x04A3] = { unicodeslot=0x04A3, category='ll', contextname='cyrillicendc', description='CYRILLIC SMALL LETTER EN WITH DESCENDER', shcode=0x043D, uccode=0x04A2 },
+ [0x04A4] = { unicodeslot=0x04A4, category='lu', contextname='cyrillicENGHE', description='CYRILLIC CAPITAL LIGATURE EN GHE', lccode=0x04A5 },
+ [0x04A5] = { unicodeslot=0x04A5, category='ll', contextname='cyrillicenghe', description='CYRILLIC SMALL LIGATURE EN GHE', uccode=0x04A4 },
+ [0x04A6] = { unicodeslot=0x04A6, category='lu', contextname='cyrillicPEmidhook', description='CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK', shcode=0x041F, lccode=0x04A7 },
+ [0x04A7] = { unicodeslot=0x04A7, category='ll', contextname='cyrillicpemidhook', description='CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK', shcode=0x043F, uccode=0x04A6 },
+ [0x04A8] = { unicodeslot=0x04A8, category='lu', contextname='cyrillicHA', description='CYRILLIC CAPITAL LETTER ABKHASIAN HA', lccode=0x04A9 },
+ [0x04A9] = { unicodeslot=0x04A9, category='ll', contextname='cyrillicha', description='CYRILLIC SMALL LETTER ABKHASIAN HA', uccode=0x04A8 },
+ [0x04AA] = { unicodeslot=0x04AA, category='lu', contextname='cyrillicSDSC', description='CYRILLIC CAPITAL LETTER ES WITH DESCENDER', shcode=0x0421, lccode=0x04AB },
+ [0x04AB] = { unicodeslot=0x04AB, category='ll', contextname='cyrillicsdsc', description='CYRILLIC SMALL LETTER ES WITH DESCENDER', shcode=0x0441, uccode=0x04AA },
+ [0x04AC] = { unicodeslot=0x04AC, category='lu', contextname='cyrillicTEDC', description='CYRILLIC CAPITAL LETTER TE WITH DESCENDER', shcode=0x0422, lccode=0x04AD },
+ [0x04AD] = { unicodeslot=0x04AD, category='ll', contextname='cyrillictedc', description='CYRILLIC SMALL LETTER TE WITH DESCENDER', shcode=0x0442, uccode=0x04AC },
+ [0x04AE] = { unicodeslot=0x04AE, category='lu', contextname='cyrillicYstr', description='CYRILLIC CAPITAL LETTER STRAIGHT U', lccode=0x04AF },
+ [0x04AF] = { unicodeslot=0x04AF, category='ll', contextname='cyrillicystr', description='CYRILLIC SMALL LETTER STRAIGHT U', uccode=0x04AE },
+ [0x04B0] = { unicodeslot=0x04B0, category='lu', contextname='cyrillicYstrstroke', description='CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE', lccode=0x04B1 },
+ [0x04B1] = { unicodeslot=0x04B1, category='ll', contextname='cyrillicystrstroke', description='CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE', uccode=0x04B0 },
+ [0x04B2] = { unicodeslot=0x04B2, category='lu', contextname='cyrillicHADC', description='CYRILLIC CAPITAL LETTER HA WITH DESCENDER', shcode=0x0425, lccode=0x04B3 },
+ [0x04B3] = { unicodeslot=0x04B3, category='ll', contextname='cyrillichadc', description='CYRILLIC SMALL LETTER HA WITH DESCENDER', shcode=0x0445, uccode=0x04B2 },
+ [0x04B4] = { unicodeslot=0x04B4, category='lu', contextname='cyrillicTETSE', description='CYRILLIC CAPITAL LIGATURE TE TSE', lccode=0x04B5 },
+ [0x04B5] = { unicodeslot=0x04B5, category='ll', contextname='cyrillictetse', description='CYRILLIC SMALL LIGATURE TE TSE', uccode=0x04B4 },
+ [0x04B6] = { unicodeslot=0x04B6, category='lu', contextname='cyrillicCHEDC', description='CYRILLIC CAPITAL LETTER CHE WITH DESCENDER', shcode=0x0427, lccode=0x04B7 },
+ [0x04B7] = { unicodeslot=0x04B7, category='ll', contextname='cyrillicchedc', description='CYRILLIC SMALL LETTER CHE WITH DESCENDER', shcode=0x0447, uccode=0x04B6 },
+ [0x04B8] = { unicodeslot=0x04B8, category='lu', contextname='cyrillicCHEvertstroke', description='CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE', shcode=0x0427, lccode=0x04B9 },
+ [0x04B9] = { unicodeslot=0x04B9, category='ll', contextname='cyrillicchevertstroke', description='CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE', shcode=0x0447, uccode=0x04B8 },
+ [0x04BA] = { unicodeslot=0x04BA, category='lu', contextname='cyrillicSHHA', description='CYRILLIC CAPITAL LETTER SHHA', lccode=0x04BB },
+ [0x04BB] = { unicodeslot=0x04BB, category='ll', contextname='cyrillicshha', description='CYRILLIC SMALL LETTER SHHA', uccode=0x04BA },
+ [0x04BC] = { unicodeslot=0x04BC, category='lu', contextname='cyrillicCHEabkhasian', description='CYRILLIC CAPITAL LETTER ABKHASIAN CHE', lccode=0x04BD },
+ [0x04BD] = { unicodeslot=0x04BD, category='ll', contextname='cyrilliccheabkhasian', description='CYRILLIC SMALL LETTER ABKHASIAN CHE', uccode=0x04BC },
+ [0x04BE] = { unicodeslot=0x04BE, category='lu', contextname='cyrillicCHEDCabkhasian', description='CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER', lccode=0x04BF },
+ [0x04BF] = { unicodeslot=0x04BF, category='ll', contextname='cyrillicchedcabkhasian', description='CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER', uccode=0x04BE },
+ [0x04C0] = { unicodeslot=0x04C0, category='lu', contextname='cyrillicPALOCHKA', description='CYRILLIC LETTER PALOCHKA', lccode=0x04CF },
+ [0x04C1] = { unicodeslot=0x04C1, category='lu', contextname='cyrillicZHEbreve', description='CYRILLIC CAPITAL LETTER ZHE WITH BREVE', shcode=0x0416, lccode=0x04C2, specials={'char',0x0416,0x0306} },
+ [0x04C2] = { unicodeslot=0x04C2, category='ll', contextname='cyrilliczhebreve', description='CYRILLIC SMALL LETTER ZHE WITH BREVE', shcode=0x0436, uccode=0x04C1, specials={'char',0x0436,0x0306} },
+ [0x04C3] = { unicodeslot=0x04C3, category='lu', contextname='cyrillicKAhook', description='CYRILLIC CAPITAL LETTER KA WITH HOOK', shcode=0x041A, lccode=0x04C4 },
+ [0x04C4] = { unicodeslot=0x04C4, category='ll', contextname='cyrillickahook', description='CYRILLIC SMALL LETTER KA WITH HOOK', shcode=0x043A, uccode=0x04C3 },
+ [0x04C5] = { unicodeslot=0x04C5, category='lu', contextname='cyrillicELtail', description='CYRILLIC CAPITAL LETTER EL WITH TAIL', shcode=0x041B, lccode=0x04C6 },
+ [0x04C6] = { unicodeslot=0x04C6, category='ll', contextname='cyrilliceltail', description='CYRILLIC SMALL LETTER EL WITH TAIL', shcode=0x043B, uccode=0x04C5 },
+ [0x04C7] = { unicodeslot=0x04C7, category='lu', contextname='cyrillicENhook', description='CYRILLIC CAPITAL LETTER EN WITH HOOK', shcode=0x041D, lccode=0x04C8 },
+ [0x04C8] = { unicodeslot=0x04C8, category='ll', contextname='cyrillicenhook', description='CYRILLIC SMALL LETTER EN WITH HOOK', shcode=0x043D, uccode=0x04C7 },
+ [0x04C9] = { unicodeslot=0x04C9, category='lu', contextname='cyrillicENtail', description='CYRILLIC CAPITAL LETTER EN WITH TAIL', shcode=0x041D, lccode=0x04CA },
+ [0x04CA] = { unicodeslot=0x04CA, category='ll', contextname='cyrillicentail', description='CYRILLIC SMALL LETTER EN WITH TAIL', shcode=0x043D, uccode=0x04C9 },
+ [0x04CB] = { unicodeslot=0x04CB, category='lu', contextname='cyrillicCHEkhakassian', description='CYRILLIC CAPITAL LETTER KHAKASSIAN CHE', lccode=0x04CC },
+ [0x04CC] = { unicodeslot=0x04CC, category='ll', contextname='cyrillicchekhakassian', description='CYRILLIC SMALL LETTER KHAKASSIAN CHE', uccode=0x04CB },
+ [0x04CD] = { unicodeslot=0x04CD, category='lu', contextname='cyrillicEMtail', description='CYRILLIC CAPITAL LETTER EM WITH TAIL', shcode=0x041C, lccode=0x04CE },
+ [0x04CE] = { unicodeslot=0x04CE, category='ll', contextname='cyrillicemtail', description='CYRILLIC SMALL LETTER EM WITH TAIL', shcode=0x043C, uccode=0x04CD },
+ [0x04CF] = { unicodeslot=0x04CF, category='ll', description='CYRILLIC SMALL LETTER PALOCHKA', uccode=0x04C0 },
+ [0x04D0] = { unicodeslot=0x04D0, category='lu', contextname='cyrillicAbreve', description='CYRILLIC CAPITAL LETTER A WITH BREVE', shcode=0x0410, lccode=0x04D1, specials={'char',0x0410,0x0306} },
+ [0x04D1] = { unicodeslot=0x04D1, category='ll', contextname='cyrillicabreve', description='CYRILLIC SMALL LETTER A WITH BREVE', shcode=0x0430, uccode=0x04D0, specials={'char',0x0430,0x0306} },
+ [0x04D2] = { unicodeslot=0x04D2, category='lu', contextname='cyrillicAdiaeresis', description='CYRILLIC CAPITAL LETTER A WITH DIAERESIS', shcode=0x0410, lccode=0x04D3, specials={'char',0x0410,0x0308} },
+ [0x04D3] = { unicodeslot=0x04D3, category='ll', contextname='cyrillicadiaeresis', description='CYRILLIC SMALL LETTER A WITH DIAERESIS', shcode=0x0430, uccode=0x04D2, specials={'char',0x0430,0x0308} },
+ [0x04D4] = { unicodeslot=0x04D4, category='lu', contextname='cyrillicAE', description='CYRILLIC CAPITAL LIGATURE A IE', lccode=0x04D5 },
+ [0x04D5] = { unicodeslot=0x04D5, category='ll', contextname='cyrillicae', description='CYRILLIC SMALL LIGATURE A IE', uccode=0x04D4 },
+ [0x04D6] = { unicodeslot=0x04D6, category='lu', contextname='cyrillicEbreve', description='CYRILLIC CAPITAL LETTER IE WITH BREVE', shcode=0x0415, lccode=0x04D7, specials={'char',0x0415,0x0306} },
+ [0x04D7] = { unicodeslot=0x04D7, category='ll', contextname='cyrillicebreve', description='CYRILLIC SMALL LETTER IE WITH BREVE', shcode=0x0435, uccode=0x04D6, specials={'char',0x0435,0x0306} },
+ [0x04D8] = { unicodeslot=0x04D8, category='lu', contextname='cyrillicSCHWA', description='CYRILLIC CAPITAL LETTER SCHWA', lccode=0x04D9 },
+ [0x04D9] = { unicodeslot=0x04D9, category='ll', adobename='afii10846', contextname='cyrillicschwa', description='CYRILLIC SMALL LETTER SCHWA', uccode=0x04D8 },
+ [0x04DA] = { unicodeslot=0x04DA, category='lu', contextname='cyrillicSCHWAdiaeresis', description='CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS', shcode=0x04D8, lccode=0x04DB, specials={'char',0x04D8,0x0308} },
+ [0x04DB] = { unicodeslot=0x04DB, category='ll', contextname='cyrillicschwadiaeresis', description='CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS', shcode=0x04D9, uccode=0x04DA, specials={'char',0x04D9,0x0308} },
+ [0x04DC] = { unicodeslot=0x04DC, category='lu', contextname='cyrillicZHEdiaeresis', description='CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS', shcode=0x0416, lccode=0x04DD, specials={'char',0x0416,0x0308} },
+ [0x04DD] = { unicodeslot=0x04DD, category='ll', contextname='cyrilliczhediaeresis', description='CYRILLIC SMALL LETTER ZHE WITH DIAERESIS', shcode=0x0436, uccode=0x04DC, specials={'char',0x0436,0x0308} },
+ [0x04DE] = { unicodeslot=0x04DE, category='lu', contextname='cyrillicZEdiaeresis', description='CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS', shcode=0x0417, lccode=0x04DF, specials={'char',0x0417,0x0308} },
+ [0x04DF] = { unicodeslot=0x04DF, category='ll', contextname='cyrilliczediaeresis', description='CYRILLIC SMALL LETTER ZE WITH DIAERESIS', shcode=0x0437, uccode=0x04DE, specials={'char',0x0437,0x0308} },
+ [0x04E0] = { unicodeslot=0x04E0, category='lu', contextname='cyrillicDZEabkhasian', description='CYRILLIC CAPITAL LETTER ABKHASIAN DZE', lccode=0x04E1 },
+ [0x04E1] = { unicodeslot=0x04E1, category='ll', contextname='cyrillicdzeabkhasian', description='CYRILLIC SMALL LETTER ABKHASIAN DZE', uccode=0x04E0 },
+ [0x04E2] = { unicodeslot=0x04E2, category='lu', contextname='cyrillicImacron', description='CYRILLIC CAPITAL LETTER I WITH MACRON', shcode=0x0418, lccode=0x04E3, specials={'char',0x0418,0x0304} },
+ [0x04E3] = { unicodeslot=0x04E3, category='ll', contextname='cyrillicimacron', description='CYRILLIC SMALL LETTER I WITH MACRON', shcode=0x0438, uccode=0x04E2, specials={'char',0x0438,0x0304} },
+ [0x04E4] = { unicodeslot=0x04E4, category='lu', contextname='cyrillicIdiaeresis', description='CYRILLIC CAPITAL LETTER I WITH DIAERESIS', shcode=0x0418, lccode=0x04E5, specials={'char',0x0418,0x0308} },
+ [0x04E5] = { unicodeslot=0x04E5, category='ll', contextname='cyrillicidiaeresis', description='CYRILLIC SMALL LETTER I WITH DIAERESIS', shcode=0x0438, uccode=0x04E4, specials={'char',0x0438,0x0308} },
+ [0x04E6] = { unicodeslot=0x04E6, category='lu', contextname='cyrillicOdiaeresis', description='CYRILLIC CAPITAL LETTER O WITH DIAERESIS', shcode=0x041E, lccode=0x04E7, specials={'char',0x041E,0x0308} },
+ [0x04E7] = { unicodeslot=0x04E7, category='ll', contextname='cyrillicodiaeresis', description='CYRILLIC SMALL LETTER O WITH DIAERESIS', shcode=0x043E, uccode=0x04E6, specials={'char',0x043E,0x0308} },
+ [0x04E8] = { unicodeslot=0x04E8, category='lu', contextname='cyrillicObarred', description='CYRILLIC CAPITAL LETTER BARRED O', lccode=0x04E9 },
+ [0x04E9] = { unicodeslot=0x04E9, category='ll', contextname='cyrillicobarred', description='CYRILLIC SMALL LETTER BARRED O', uccode=0x04E8 },
+ [0x04EA] = { unicodeslot=0x04EA, category='lu', contextname='cyrillicObarreddiaeresis', description='CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS', lccode=0x04EB, specials={'char',0x04E8,0x0308} },
+ [0x04EB] = { unicodeslot=0x04EB, category='ll', contextname='cyrillicobarreddiaeresis', description='CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS', uccode=0x04EA, specials={'char',0x04E9,0x0308} },
+ [0x04EC] = { unicodeslot=0x04EC, category='lu', contextname='cyrillicEdiaeresis', description='CYRILLIC CAPITAL LETTER E WITH DIAERESIS', shcode=0x042D, lccode=0x04ED, specials={'char',0x042D,0x0308} },
+ [0x04ED] = { unicodeslot=0x04ED, category='ll', contextname='cyrillicediaeresis', description='CYRILLIC SMALL LETTER E WITH DIAERESIS', shcode=0x044D, uccode=0x04EC, specials={'char',0x044D,0x0308} },
+ [0x04EE] = { unicodeslot=0x04EE, category='lu', contextname='cyrillicUmacron', description='CYRILLIC CAPITAL LETTER U WITH MACRON', shcode=0x0423, lccode=0x04EF, specials={'char',0x0423,0x0304} },
+ [0x04EF] = { unicodeslot=0x04EF, category='ll', contextname='cyrillicumacron', description='CYRILLIC SMALL LETTER U WITH MACRON', shcode=0x0443, uccode=0x04EE, specials={'char',0x0443,0x0304} },
+ [0x04F0] = { unicodeslot=0x04F0, category='lu', contextname='cyrillicUdiaeresis', description='CYRILLIC CAPITAL LETTER U WITH DIAERESIS', shcode=0x0423, lccode=0x04F1, specials={'char',0x0423,0x0308} },
+ [0x04F1] = { unicodeslot=0x04F1, category='ll', contextname='cyrillicudiaeresis', description='CYRILLIC SMALL LETTER U WITH DIAERESIS', shcode=0x0443, uccode=0x04F0, specials={'char',0x0443,0x0308} },
+ [0x04F2] = { unicodeslot=0x04F2, category='lu', contextname='cyrillicUdoubleacute', description='CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE', shcode=0x0423, lccode=0x04F3, specials={'char',0x0423,0x030B} },
+ [0x04F3] = { unicodeslot=0x04F3, category='ll', contextname='cyrillicudoubleacute', description='CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE', shcode=0x0443, uccode=0x04F2, specials={'char',0x0443,0x030B} },
+ [0x04F4] = { unicodeslot=0x04F4, category='lu', contextname='cyrillicCHEdiaeresis', description='CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS', shcode=0x0427, lccode=0x04F5, specials={'char',0x0427,0x0308} },
+ [0x04F5] = { unicodeslot=0x04F5, category='ll', contextname='cyrillicchediaeresis', description='CYRILLIC SMALL LETTER CHE WITH DIAERESIS', shcode=0x0447, uccode=0x04F4, specials={'char',0x0447,0x0308} },
+ [0x04F6] = { unicodeslot=0x04F6, category='lu', description='CYRILLIC CAPITAL LETTER GHE WITH DESCENDER', shcode=0x0413, lccode=0x04F7 },
+ [0x04F7] = { unicodeslot=0x04F7, category='ll', description='CYRILLIC SMALL LETTER GHE WITH DESCENDER', shcode=0x0433, uccode=0x04F6 },
+ [0x04F8] = { unicodeslot=0x04F8, category='lu', contextname='cyrillicYERUdiaeresis', description='CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS', shcode=0x042B, lccode=0x04F9, specials={'char',0x042B,0x0308} },
+ [0x04F9] = { unicodeslot=0x04F9, category='ll', contextname='cyrillicyerudiaeresis', description='CYRILLIC SMALL LETTER YERU WITH DIAERESIS', shcode=0x044B, uccode=0x04F8, specials={'char',0x044B,0x0308} },
+ [0x04FA] = { unicodeslot=0x04FA, category='lu', description='CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK', shcode=0x0413, lccode=0x04FB },
+ [0x04FB] = { unicodeslot=0x04FB, category='ll', description='CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK', shcode=0x0433, uccode=0x04FA },
+ [0x04FC] = { unicodeslot=0x04FC, category='lu', description='CYRILLIC CAPITAL LETTER HA WITH HOOK', shcode=0x0425, lccode=0x04FD },
+ [0x04FD] = { unicodeslot=0x04FD, category='ll', description='CYRILLIC SMALL LETTER HA WITH HOOK', shcode=0x0445, uccode=0x04FC },
+ [0x04FE] = { unicodeslot=0x04FE, category='lu', description='CYRILLIC CAPITAL LETTER HA WITH STROKE', shcode=0x0425, lccode=0x04FF },
+ [0x04FF] = { unicodeslot=0x04FF, category='ll', description='CYRILLIC SMALL LETTER HA WITH STROKE', shcode=0x0445, uccode=0x04FE },
+ [0x0500] = { unicodeslot=0x0500, category='lu', description='CYRILLIC CAPITAL LETTER KOMI DE', lccode=0x0501 },
+ [0x0501] = { unicodeslot=0x0501, category='ll', description='CYRILLIC SMALL LETTER KOMI DE', uccode=0x0500 },
+ [0x0502] = { unicodeslot=0x0502, category='lu', description='CYRILLIC CAPITAL LETTER KOMI DJE', lccode=0x0503 },
+ [0x0503] = { unicodeslot=0x0503, category='ll', description='CYRILLIC SMALL LETTER KOMI DJE', uccode=0x0502 },
+ [0x0504] = { unicodeslot=0x0504, category='lu', description='CYRILLIC CAPITAL LETTER KOMI ZJE', lccode=0x0505 },
+ [0x0505] = { unicodeslot=0x0505, category='ll', description='CYRILLIC SMALL LETTER KOMI ZJE', uccode=0x0504 },
+ [0x0506] = { unicodeslot=0x0506, category='lu', description='CYRILLIC CAPITAL LETTER KOMI DZJE', lccode=0x0507 },
+ [0x0507] = { unicodeslot=0x0507, category='ll', description='CYRILLIC SMALL LETTER KOMI DZJE', uccode=0x0506 },
+ [0x0508] = { unicodeslot=0x0508, category='lu', description='CYRILLIC CAPITAL LETTER KOMI LJE', lccode=0x0509 },
+ [0x0509] = { unicodeslot=0x0509, category='ll', description='CYRILLIC SMALL LETTER KOMI LJE', uccode=0x0508 },
+ [0x050A] = { unicodeslot=0x050A, category='lu', description='CYRILLIC CAPITAL LETTER KOMI NJE', lccode=0x050B },
+ [0x050B] = { unicodeslot=0x050B, category='ll', description='CYRILLIC SMALL LETTER KOMI NJE', uccode=0x050A },
+ [0x050C] = { unicodeslot=0x050C, category='lu', description='CYRILLIC CAPITAL LETTER KOMI SJE', lccode=0x050D },
+ [0x050D] = { unicodeslot=0x050D, category='ll', description='CYRILLIC SMALL LETTER KOMI SJE', uccode=0x050C },
+ [0x050E] = { unicodeslot=0x050E, category='lu', description='CYRILLIC CAPITAL LETTER KOMI TJE', lccode=0x050F },
+ [0x050F] = { unicodeslot=0x050F, category='ll', description='CYRILLIC SMALL LETTER KOMI TJE', uccode=0x050E },
+ [0x0510] = { unicodeslot=0x0510, category='lu', description='CYRILLIC CAPITAL LETTER REVERSED ZE', lccode=0x0511 },
+ [0x0511] = { unicodeslot=0x0511, category='ll', description='CYRILLIC SMALL LETTER REVERSED ZE', uccode=0x0510 },
+ [0x0512] = { unicodeslot=0x0512, category='lu', description='CYRILLIC CAPITAL LETTER EL WITH HOOK', shcode=0x041B, lccode=0x0513 },
+ [0x0513] = { unicodeslot=0x0513, category='ll', description='CYRILLIC SMALL LETTER EL WITH HOOK', shcode=0x043B, uccode=0x0512 },
+ [0x0531] = { unicodeslot=0x0531, category='lu', description='ARMENIAN CAPITAL LETTER AYB', lccode=0x0561 },
+ [0x0532] = { unicodeslot=0x0532, category='lu', description='ARMENIAN CAPITAL LETTER BEN', lccode=0x0562 },
+ [0x0533] = { unicodeslot=0x0533, category='lu', description='ARMENIAN CAPITAL LETTER GIM', lccode=0x0563 },
+ [0x0534] = { unicodeslot=0x0534, category='lu', description='ARMENIAN CAPITAL LETTER DA', lccode=0x0564 },
+ [0x0535] = { unicodeslot=0x0535, category='lu', description='ARMENIAN CAPITAL LETTER ECH', lccode=0x0565 },
+ [0x0536] = { unicodeslot=0x0536, category='lu', description='ARMENIAN CAPITAL LETTER ZA', lccode=0x0566 },
+ [0x0537] = { unicodeslot=0x0537, category='lu', description='ARMENIAN CAPITAL LETTER EH', lccode=0x0567 },
+ [0x0538] = { unicodeslot=0x0538, category='lu', description='ARMENIAN CAPITAL LETTER ET', lccode=0x0568 },
+ [0x0539] = { unicodeslot=0x0539, category='lu', description='ARMENIAN CAPITAL LETTER TO', lccode=0x0569 },
+ [0x053A] = { unicodeslot=0x053A, category='lu', description='ARMENIAN CAPITAL LETTER ZHE', lccode=0x056A },
+ [0x053B] = { unicodeslot=0x053B, category='lu', description='ARMENIAN CAPITAL LETTER INI', lccode=0x056B },
+ [0x053C] = { unicodeslot=0x053C, category='lu', description='ARMENIAN CAPITAL LETTER LIWN', lccode=0x056C },
+ [0x053D] = { unicodeslot=0x053D, category='lu', description='ARMENIAN CAPITAL LETTER XEH', lccode=0x056D },
+ [0x053E] = { unicodeslot=0x053E, category='lu', description='ARMENIAN CAPITAL LETTER CA', lccode=0x056E },
+ [0x053F] = { unicodeslot=0x053F, category='lu', description='ARMENIAN CAPITAL LETTER KEN', lccode=0x056F },
+ [0x0540] = { unicodeslot=0x0540, category='lu', description='ARMENIAN CAPITAL LETTER HO', lccode=0x0570 },
+ [0x0541] = { unicodeslot=0x0541, category='lu', description='ARMENIAN CAPITAL LETTER JA', lccode=0x0571 },
+ [0x0542] = { unicodeslot=0x0542, category='lu', description='ARMENIAN CAPITAL LETTER GHAD', lccode=0x0572 },
+ [0x0543] = { unicodeslot=0x0543, category='lu', description='ARMENIAN CAPITAL LETTER CHEH', lccode=0x0573 },
+ [0x0544] = { unicodeslot=0x0544, category='lu', description='ARMENIAN CAPITAL LETTER MEN', lccode=0x0574 },
+ [0x0545] = { unicodeslot=0x0545, category='lu', description='ARMENIAN CAPITAL LETTER YI', lccode=0x0575 },
+ [0x0546] = { unicodeslot=0x0546, category='lu', description='ARMENIAN CAPITAL LETTER NOW', lccode=0x0576 },
+ [0x0547] = { unicodeslot=0x0547, category='lu', description='ARMENIAN CAPITAL LETTER SHA', lccode=0x0577 },
+ [0x0548] = { unicodeslot=0x0548, category='lu', description='ARMENIAN CAPITAL LETTER VO', lccode=0x0578 },
+ [0x0549] = { unicodeslot=0x0549, category='lu', description='ARMENIAN CAPITAL LETTER CHA', lccode=0x0579 },
+ [0x054A] = { unicodeslot=0x054A, category='lu', description='ARMENIAN CAPITAL LETTER PEH', lccode=0x057A },
+ [0x054B] = { unicodeslot=0x054B, category='lu', description='ARMENIAN CAPITAL LETTER JHEH', lccode=0x057B },
+ [0x054C] = { unicodeslot=0x054C, category='lu', description='ARMENIAN CAPITAL LETTER RA', lccode=0x057C },
+ [0x054D] = { unicodeslot=0x054D, category='lu', description='ARMENIAN CAPITAL LETTER SEH', lccode=0x057D },
+ [0x054E] = { unicodeslot=0x054E, category='lu', description='ARMENIAN CAPITAL LETTER VEW', lccode=0x057E },
+ [0x054F] = { unicodeslot=0x054F, category='lu', description='ARMENIAN CAPITAL LETTER TIWN', lccode=0x057F },
+ [0x0550] = { unicodeslot=0x0550, category='lu', description='ARMENIAN CAPITAL LETTER REH', lccode=0x0580 },
+ [0x0551] = { unicodeslot=0x0551, category='lu', description='ARMENIAN CAPITAL LETTER CO', lccode=0x0581 },
+ [0x0552] = { unicodeslot=0x0552, category='lu', description='ARMENIAN CAPITAL LETTER YIWN', lccode=0x0582 },
+ [0x0553] = { unicodeslot=0x0553, category='lu', description='ARMENIAN CAPITAL LETTER PIWR', lccode=0x0583 },
+ [0x0554] = { unicodeslot=0x0554, category='lu', description='ARMENIAN CAPITAL LETTER KEH', lccode=0x0584 },
+ [0x0555] = { unicodeslot=0x0555, category='lu', description='ARMENIAN CAPITAL LETTER OH', lccode=0x0585 },
+ [0x0556] = { unicodeslot=0x0556, category='lu', description='ARMENIAN CAPITAL LETTER FEH', lccode=0x0586 },
+ [0x0559] = { unicodeslot=0x0559, category='lm', description='ARMENIAN MODIFIER LETTER LEFT HALF RING' },
+ [0x055A] = { unicodeslot=0x055A, category='po', description='ARMENIAN APOSTROPHE' },
+ [0x055B] = { unicodeslot=0x055B, category='po', description='ARMENIAN EMPHASIS MARK' },
+ [0x055C] = { unicodeslot=0x055C, category='po', description='ARMENIAN EXCLAMATION MARK' },
+ [0x055D] = { unicodeslot=0x055D, category='po', description='ARMENIAN COMMA' },
+ [0x055E] = { unicodeslot=0x055E, category='po', description='ARMENIAN QUESTION MARK' },
+ [0x055F] = { unicodeslot=0x055F, category='po', description='ARMENIAN ABBREVIATION MARK' },
+ [0x0561] = { unicodeslot=0x0561, category='ll', description='ARMENIAN SMALL LETTER AYB', uccode=0x0531 },
+ [0x0562] = { unicodeslot=0x0562, category='ll', description='ARMENIAN SMALL LETTER BEN', uccode=0x0532 },
+ [0x0563] = { unicodeslot=0x0563, category='ll', description='ARMENIAN SMALL LETTER GIM', uccode=0x0533 },
+ [0x0564] = { unicodeslot=0x0564, category='ll', description='ARMENIAN SMALL LETTER DA', uccode=0x0534 },
+ [0x0565] = { unicodeslot=0x0565, category='ll', description='ARMENIAN SMALL LETTER ECH', uccode=0x0535 },
+ [0x0566] = { unicodeslot=0x0566, category='ll', description='ARMENIAN SMALL LETTER ZA', uccode=0x0536 },
+ [0x0567] = { unicodeslot=0x0567, category='ll', description='ARMENIAN SMALL LETTER EH', uccode=0x0537 },
+ [0x0568] = { unicodeslot=0x0568, category='ll', description='ARMENIAN SMALL LETTER ET', uccode=0x0538 },
+ [0x0569] = { unicodeslot=0x0569, category='ll', description='ARMENIAN SMALL LETTER TO', uccode=0x0539 },
+ [0x056A] = { unicodeslot=0x056A, category='ll', description='ARMENIAN SMALL LETTER ZHE', uccode=0x053A },
+ [0x056B] = { unicodeslot=0x056B, category='ll', description='ARMENIAN SMALL LETTER INI', uccode=0x053B },
+ [0x056C] = { unicodeslot=0x056C, category='ll', description='ARMENIAN SMALL LETTER LIWN', uccode=0x053C },
+ [0x056D] = { unicodeslot=0x056D, category='ll', description='ARMENIAN SMALL LETTER XEH', uccode=0x053D },
+ [0x056E] = { unicodeslot=0x056E, category='ll', description='ARMENIAN SMALL LETTER CA', uccode=0x053E },
+ [0x056F] = { unicodeslot=0x056F, category='ll', description='ARMENIAN SMALL LETTER KEN', uccode=0x053F },
+ [0x0570] = { unicodeslot=0x0570, category='ll', description='ARMENIAN SMALL LETTER HO', uccode=0x0540 },
+ [0x0571] = { unicodeslot=0x0571, category='ll', description='ARMENIAN SMALL LETTER JA', uccode=0x0541 },
+ [0x0572] = { unicodeslot=0x0572, category='ll', description='ARMENIAN SMALL LETTER GHAD', uccode=0x0542 },
+ [0x0573] = { unicodeslot=0x0573, category='ll', description='ARMENIAN SMALL LETTER CHEH', uccode=0x0543 },
+ [0x0574] = { unicodeslot=0x0574, category='ll', description='ARMENIAN SMALL LETTER MEN', uccode=0x0544 },
+ [0x0575] = { unicodeslot=0x0575, category='ll', description='ARMENIAN SMALL LETTER YI', uccode=0x0545 },
+ [0x0576] = { unicodeslot=0x0576, category='ll', description='ARMENIAN SMALL LETTER NOW', uccode=0x0546 },
+ [0x0577] = { unicodeslot=0x0577, category='ll', description='ARMENIAN SMALL LETTER SHA', uccode=0x0547 },
+ [0x0578] = { unicodeslot=0x0578, category='ll', description='ARMENIAN SMALL LETTER VO', uccode=0x0548 },
+ [0x0579] = { unicodeslot=0x0579, category='ll', description='ARMENIAN SMALL LETTER CHA', uccode=0x0549 },
+ [0x057A] = { unicodeslot=0x057A, category='ll', description='ARMENIAN SMALL LETTER PEH', uccode=0x054A },
+ [0x057B] = { unicodeslot=0x057B, category='ll', description='ARMENIAN SMALL LETTER JHEH', uccode=0x054B },
+ [0x057C] = { unicodeslot=0x057C, category='ll', description='ARMENIAN SMALL LETTER RA', uccode=0x054C },
+ [0x057D] = { unicodeslot=0x057D, category='ll', description='ARMENIAN SMALL LETTER SEH', uccode=0x054D },
+ [0x057E] = { unicodeslot=0x057E, category='ll', description='ARMENIAN SMALL LETTER VEW', uccode=0x054E },
+ [0x057F] = { unicodeslot=0x057F, category='ll', description='ARMENIAN SMALL LETTER TIWN', uccode=0x054F },
+ [0x0580] = { unicodeslot=0x0580, category='ll', description='ARMENIAN SMALL LETTER REH', uccode=0x0550 },
+ [0x0581] = { unicodeslot=0x0581, category='ll', description='ARMENIAN SMALL LETTER CO', uccode=0x0551 },
+ [0x0582] = { unicodeslot=0x0582, category='ll', description='ARMENIAN SMALL LETTER YIWN', uccode=0x0552 },
+ [0x0583] = { unicodeslot=0x0583, category='ll', description='ARMENIAN SMALL LETTER PIWR', uccode=0x0553 },
+ [0x0584] = { unicodeslot=0x0584, category='ll', description='ARMENIAN SMALL LETTER KEH', uccode=0x0554 },
+ [0x0585] = { unicodeslot=0x0585, category='ll', description='ARMENIAN SMALL LETTER OH', uccode=0x0555 },
+ [0x0586] = { unicodeslot=0x0586, category='ll', description='ARMENIAN SMALL LETTER FEH', uccode=0x0556 },
+ [0x0587] = { unicodeslot=0x0587, category='ll', description='ARMENIAN SMALL LIGATURE ECH YIWN', specials={'compat',0x0565,0x0582} },
+ [0x0589] = { unicodeslot=0x0589, category='po', description='ARMENIAN FULL STOP' },
+ [0x058A] = { unicodeslot=0x058A, category='pd', description='ARMENIAN HYPHEN' },
+ [0x0591] = { unicodeslot=0x0591, category='mn', description='HEBREW ACCENT ETNAHTA' },
+ [0x0592] = { unicodeslot=0x0592, category='mn', description='HEBREW ACCENT SEGOL' },
+ [0x0593] = { unicodeslot=0x0593, category='mn', description='HEBREW ACCENT SHALSHELET' },
+ [0x0594] = { unicodeslot=0x0594, category='mn', description='HEBREW ACCENT ZAQEF QATAN' },
+ [0x0595] = { unicodeslot=0x0595, category='mn', description='HEBREW ACCENT ZAQEF GADOL' },
+ [0x0596] = { unicodeslot=0x0596, category='mn', description='HEBREW ACCENT TIPEHA' },
+ [0x0597] = { unicodeslot=0x0597, category='mn', description='HEBREW ACCENT REVIA' },
+ [0x0598] = { unicodeslot=0x0598, category='mn', description='HEBREW ACCENT ZARQA' },
+ [0x0599] = { unicodeslot=0x0599, category='mn', description='HEBREW ACCENT PASHTA' },
+ [0x059A] = { unicodeslot=0x059A, category='mn', description='HEBREW ACCENT YETIV' },
+ [0x059B] = { unicodeslot=0x059B, category='mn', description='HEBREW ACCENT TEVIR' },
+ [0x059C] = { unicodeslot=0x059C, category='mn', description='HEBREW ACCENT GERESH' },
+ [0x059D] = { unicodeslot=0x059D, category='mn', description='HEBREW ACCENT GERESH MUQDAM' },
+ [0x059E] = { unicodeslot=0x059E, category='mn', description='HEBREW ACCENT GERSHAYIM' },
+ [0x059F] = { unicodeslot=0x059F, category='mn', description='HEBREW ACCENT QARNEY PARA' },
+ [0x05A0] = { unicodeslot=0x05A0, category='mn', description='HEBREW ACCENT TELISHA GEDOLA' },
+ [0x05A1] = { unicodeslot=0x05A1, category='mn', description='HEBREW ACCENT PAZER' },
+ [0x05A2] = { unicodeslot=0x05A2, category='mn', description='HEBREW ACCENT ATNAH HAFUKH' },
+ [0x05A3] = { unicodeslot=0x05A3, category='mn', description='HEBREW ACCENT MUNAH' },
+ [0x05A4] = { unicodeslot=0x05A4, category='mn', description='HEBREW ACCENT MAHAPAKH' },
+ [0x05A5] = { unicodeslot=0x05A5, category='mn', description='HEBREW ACCENT MERKHA' },
+ [0x05A6] = { unicodeslot=0x05A6, category='mn', description='HEBREW ACCENT MERKHA KEFULA' },
+ [0x05A7] = { unicodeslot=0x05A7, category='mn', description='HEBREW ACCENT DARGA' },
+ [0x05A8] = { unicodeslot=0x05A8, category='mn', description='HEBREW ACCENT QADMA' },
+ [0x05A9] = { unicodeslot=0x05A9, category='mn', description='HEBREW ACCENT TELISHA QETANA' },
+ [0x05AA] = { unicodeslot=0x05AA, category='mn', description='HEBREW ACCENT YERAH BEN YOMO' },
+ [0x05AB] = { unicodeslot=0x05AB, category='mn', description='HEBREW ACCENT OLE' },
+ [0x05AC] = { unicodeslot=0x05AC, category='mn', description='HEBREW ACCENT ILUY' },
+ [0x05AD] = { unicodeslot=0x05AD, category='mn', description='HEBREW ACCENT DEHI' },
+ [0x05AE] = { unicodeslot=0x05AE, category='mn', description='HEBREW ACCENT ZINOR' },
+ [0x05AF] = { unicodeslot=0x05AF, category='mn', description='HEBREW MARK MASORA CIRCLE' },
+ [0x05B0] = { unicodeslot=0x05B0, category='mn', adobename='afii57799', description='HEBREW POINT SHEVA' },
+ [0x05B1] = { unicodeslot=0x05B1, category='mn', adobename='afii57801', description='HEBREW POINT HATAF SEGOL' },
+ [0x05B2] = { unicodeslot=0x05B2, category='mn', adobename='afii57800', description='HEBREW POINT HATAF PATAH' },
+ [0x05B3] = { unicodeslot=0x05B3, category='mn', adobename='afii57802', description='HEBREW POINT HATAF QAMATS' },
+ [0x05B4] = { unicodeslot=0x05B4, category='mn', adobename='afii57793', description='HEBREW POINT HIRIQ' },
+ [0x05B5] = { unicodeslot=0x05B5, category='mn', adobename='afii57794', description='HEBREW POINT TSERE' },
+ [0x05B6] = { unicodeslot=0x05B6, category='mn', adobename='afii57795', description='HEBREW POINT SEGOL' },
+ [0x05B7] = { unicodeslot=0x05B7, category='mn', adobename='afii57798', description='HEBREW POINT PATAH' },
+ [0x05B8] = { unicodeslot=0x05B8, category='mn', adobename='afii57797', description='HEBREW POINT QAMATS' },
+ [0x05B9] = { unicodeslot=0x05B9, category='mn', adobename='afii57806', description='HEBREW POINT HOLAM' },
+ [0x05BA] = { unicodeslot=0x05BA, category='mn', description='HEBREW POINT HOLAM HASER FOR VAV' },
+ [0x05BB] = { unicodeslot=0x05BB, category='mn', adobename='afii57796', description='HEBREW POINT QUBUTS' },
+ [0x05BC] = { unicodeslot=0x05BC, category='mn', adobename='afii57807', description='HEBREW POINT DAGESH OR MAPIQ' },
+ [0x05BD] = { unicodeslot=0x05BD, category='mn', adobename='afii57839', description='HEBREW POINT METEG' },
+ [0x05BE] = { unicodeslot=0x05BE, category='po', adobename='afii57645', description='HEBREW PUNCTUATION MAQAF' },
+ [0x05BF] = { unicodeslot=0x05BF, category='mn', adobename='afii57841', description='HEBREW POINT RAFE' },
+ [0x05C0] = { unicodeslot=0x05C0, category='po', adobename='afii57842', description='HEBREW PUNCTUATION PASEQ' },
+ [0x05C1] = { unicodeslot=0x05C1, category='mn', adobename='afii57804', description='HEBREW POINT SHIN DOT' },
+ [0x05C2] = { unicodeslot=0x05C2, category='mn', adobename='afii57803', description='HEBREW POINT SIN DOT' },
+ [0x05C3] = { unicodeslot=0x05C3, category='po', adobename='afii57658', description='HEBREW PUNCTUATION SOF PASUQ' },
+ [0x05C4] = { unicodeslot=0x05C4, category='mn', description='HEBREW MARK UPPER DOT' },
+ [0x05C5] = { unicodeslot=0x05C5, category='mn', description='HEBREW MARK LOWER DOT' },
+ [0x05C6] = { unicodeslot=0x05C6, category='po', description='HEBREW PUNCTUATION NUN HAFUKHA' },
+ [0x05C7] = { unicodeslot=0x05C7, category='mn', description='HEBREW POINT QAMATS QATAN' },
+ [0x05D0] = { unicodeslot=0x05D0, category='lo', adobename='afii57664', contextname='hebrewAlef', description='HEBREW LETTER ALEF' },
+ [0x05D1] = { unicodeslot=0x05D1, category='lo', adobename='afii57665', contextname='hebrewBet', description='HEBREW LETTER BET' },
+ [0x05D2] = { unicodeslot=0x05D2, category='lo', adobename='afii57666', contextname='hebrewGimel', description='HEBREW LETTER GIMEL' },
+ [0x05D3] = { unicodeslot=0x05D3, category='lo', adobename='afii57667', contextname='hebrewDalet', description='HEBREW LETTER DALET' },
+ [0x05D4] = { unicodeslot=0x05D4, category='lo', adobename='afii57668', contextname='hebrewHe', description='HEBREW LETTER HE' },
+ [0x05D5] = { unicodeslot=0x05D5, category='lo', adobename='afii57669', contextname='hebrewVav', description='HEBREW LETTER VAV' },
+ [0x05D6] = { unicodeslot=0x05D6, category='lo', adobename='afii57670', contextname='hebrewZayin', description='HEBREW LETTER ZAYIN' },
+ [0x05D7] = { unicodeslot=0x05D7, category='lo', adobename='afii57671', contextname='hebrewHet', description='HEBREW LETTER HET' },
+ [0x05D8] = { unicodeslot=0x05D8, category='lo', adobename='afii57672', contextname='hebrewTet', description='HEBREW LETTER TET' },
+ [0x05D9] = { unicodeslot=0x05D9, category='lo', adobename='afii57673', contextname='hebrewYod', description='HEBREW LETTER YOD' },
+ [0x05DA] = { unicodeslot=0x05DA, category='lo', adobename='afii57674', contextname='hebrewKaffinal', description='HEBREW LETTER FINAL KAF' },
+ [0x05DB] = { unicodeslot=0x05DB, category='lo', adobename='afii57675', contextname='hebrewKaf', description='HEBREW LETTER KAF' },
+ [0x05DC] = { unicodeslot=0x05DC, category='lo', adobename='afii57676', contextname='hebrewLamed', description='HEBREW LETTER LAMED' },
+ [0x05DD] = { unicodeslot=0x05DD, category='lo', adobename='afii57677', contextname='hebrewMemfinal', description='HEBREW LETTER FINAL MEM' },
+ [0x05DE] = { unicodeslot=0x05DE, category='lo', adobename='afii57678', contextname='hebrewMem', description='HEBREW LETTER MEM' },
+ [0x05DF] = { unicodeslot=0x05DF, category='lo', adobename='afii57679', contextname='hebrewNunfinal', description='HEBREW LETTER FINAL NUN' },
+ [0x05E0] = { unicodeslot=0x05E0, category='lo', adobename='afii57680', contextname='hebrewNun', description='HEBREW LETTER NUN' },
+ [0x05E1] = { unicodeslot=0x05E1, category='lo', adobename='afii57681', contextname='hebrewSamekh', description='HEBREW LETTER SAMEKH' },
+ [0x05E2] = { unicodeslot=0x05E2, category='lo', adobename='afii57682', contextname='hebrewAyin', description='HEBREW LETTER AYIN' },
+ [0x05E3] = { unicodeslot=0x05E3, category='lo', adobename='afii57683', contextname='hebrewPefinal', description='HEBREW LETTER FINAL PE' },
+ [0x05E4] = { unicodeslot=0x05E4, category='lo', adobename='afii57684', contextname='hebrewPe', description='HEBREW LETTER PE' },
+ [0x05E5] = { unicodeslot=0x05E5, category='lo', adobename='afii57685', contextname='hebrewTsadifinal', description='HEBREW LETTER FINAL TSADI' },
+ [0x05E6] = { unicodeslot=0x05E6, category='lo', adobename='afii57686', contextname='hebrewTsadi', description='HEBREW LETTER TSADI' },
+ [0x05E7] = { unicodeslot=0x05E7, category='lo', adobename='afii57687', contextname='hebrewQof', description='HEBREW LETTER QOF' },
+ [0x05E8] = { unicodeslot=0x05E8, category='lo', adobename='afii57688', contextname='hebrewResh', description='HEBREW LETTER RESH' },
+ [0x05E9] = { unicodeslot=0x05E9, category='lo', adobename='afii57689', contextname='hebrewShin', description='HEBREW LETTER SHIN' },
+ [0x05EA] = { unicodeslot=0x05EA, category='lo', adobename='afii57690', contextname='hebrewTav', description='HEBREW LETTER TAV' },
+ [0x05F0] = { unicodeslot=0x05F0, category='lo', adobename='afii57716', description='HEBREW LIGATURE YIDDISH DOUBLE VAV' },
+ [0x05F1] = { unicodeslot=0x05F1, category='lo', adobename='afii57717', description='HEBREW LIGATURE YIDDISH VAV YOD' },
+ [0x05F2] = { unicodeslot=0x05F2, category='lo', adobename='afii57718', description='HEBREW LIGATURE YIDDISH DOUBLE YOD' },
+ [0x05F3] = { unicodeslot=0x05F3, category='po', description='HEBREW PUNCTUATION GERESH' },
+ [0x05F4] = { unicodeslot=0x05F4, category='po', description='HEBREW PUNCTUATION GERSHAYIM' },
+ [0x0600] = { unicodeslot=0x0600, category='cf', description='ARABIC NUMBER SIGN' },
+ [0x0601] = { unicodeslot=0x0601, category='cf', description='ARABIC SIGN SANAH' },
+ [0x0602] = { unicodeslot=0x0602, category='cf', description='ARABIC FOOTNOTE MARKER' },
+ [0x0603] = { unicodeslot=0x0603, category='cf', description='ARABIC SIGN SAFHA' },
+ [0x060B] = { unicodeslot=0x060B, category='sc', description='AFGHANI SIGN' },
+ [0x060C] = { unicodeslot=0x060C, category='po', adobename='afii57388', description='ARABIC COMMA' },
+ [0x060D] = { unicodeslot=0x060D, category='po', description='ARABIC DATE SEPARATOR' },
+ [0x060E] = { unicodeslot=0x060E, category='so', description='ARABIC POETIC VERSE SIGN' },
+ [0x060F] = { unicodeslot=0x060F, category='so', description='ARABIC SIGN MISRA' },
+ [0x0610] = { unicodeslot=0x0610, category='mn', description='ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM' },
+ [0x0611] = { unicodeslot=0x0611, category='mn', description='ARABIC SIGN ALAYHE ASSALLAM' },
+ [0x0612] = { unicodeslot=0x0612, category='mn', description='ARABIC SIGN RAHMATULLAH ALAYHE' },
+ [0x0613] = { unicodeslot=0x0613, category='mn', description='ARABIC SIGN RADI ALLAHOU ANHU' },
+ [0x0614] = { unicodeslot=0x0614, category='mn', description='ARABIC SIGN TAKHALLUS' },
+ [0x0615] = { unicodeslot=0x0615, category='mn', description='ARABIC SMALL HIGH TAH' },
+ [0x061B] = { unicodeslot=0x061B, category='po', adobename='afii57403', description='ARABIC SEMICOLON' },
+ [0x061E] = { unicodeslot=0x061E, category='po', description='ARABIC TRIPLE DOT PUNCTUATION MARK' },
+ [0x061F] = { unicodeslot=0x061F, category='po', adobename='afii57407', description='ARABIC QUESTION MARK' },
+ [0x0621] = { unicodeslot=0x0621, category='lo', adobename='afii57409', description='ARABIC LETTER HAMZA' },
+ [0x0622] = { unicodeslot=0x0622, category='lo', adobename='afii57410', description='ARABIC LETTER ALEF WITH MADDA ABOVE', shcode=0x0627, specials={'char',0x0627,0x0653} },
+ [0x0623] = { unicodeslot=0x0623, category='lo', adobename='afii57411', description='ARABIC LETTER ALEF WITH HAMZA ABOVE', shcode=0x0627, specials={'char',0x0627,0x0654} },
+ [0x0624] = { unicodeslot=0x0624, category='lo', adobename='afii57412', description='ARABIC LETTER WAW WITH HAMZA ABOVE', shcode=0x0648, specials={'char',0x0648,0x0654} },
+ [0x0625] = { unicodeslot=0x0625, category='lo', adobename='afii57413', description='ARABIC LETTER ALEF WITH HAMZA BELOW', shcode=0x0627, specials={'char',0x0627,0x0655} },
+ [0x0626] = { unicodeslot=0x0626, category='lo', adobename='afii57414', description='ARABIC LETTER YEH WITH HAMZA ABOVE', shcode=0x064A, specials={'char',0x064A,0x0654} },
+ [0x0627] = { unicodeslot=0x0627, category='lo', adobename='afii57415', description='ARABIC LETTER ALEF' },
+ [0x0628] = { unicodeslot=0x0628, category='lo', adobename='afii57416', description='ARABIC LETTER BEH' },
+ [0x0629] = { unicodeslot=0x0629, category='lo', adobename='afii57417', description='ARABIC LETTER TEH MARBUTA' },
+ [0x062A] = { unicodeslot=0x062A, category='lo', adobename='afii57418', description='ARABIC LETTER TEH' },
+ [0x062B] = { unicodeslot=0x062B, category='lo', adobename='afii57419', description='ARABIC LETTER THEH' },
+ [0x062C] = { unicodeslot=0x062C, category='lo', adobename='afii57420', description='ARABIC LETTER JEEM' },
+ [0x062D] = { unicodeslot=0x062D, category='lo', adobename='afii57421', description='ARABIC LETTER HAH' },
+ [0x062E] = { unicodeslot=0x062E, category='lo', adobename='afii57422', description='ARABIC LETTER KHAH' },
+ [0x062F] = { unicodeslot=0x062F, category='lo', adobename='afii57423', description='ARABIC LETTER DAL' },
+ [0x0630] = { unicodeslot=0x0630, category='lo', adobename='afii57424', description='ARABIC LETTER THAL' },
+ [0x0631] = { unicodeslot=0x0631, category='lo', adobename='afii57425', description='ARABIC LETTER REH' },
+ [0x0632] = { unicodeslot=0x0632, category='lo', adobename='afii57426', description='ARABIC LETTER ZAIN' },
+ [0x0633] = { unicodeslot=0x0633, category='lo', adobename='afii57427', description='ARABIC LETTER SEEN' },
+ [0x0634] = { unicodeslot=0x0634, category='lo', adobename='afii57428', description='ARABIC LETTER SHEEN' },
+ [0x0635] = { unicodeslot=0x0635, category='lo', adobename='afii57429', description='ARABIC LETTER SAD' },
+ [0x0636] = { unicodeslot=0x0636, category='lo', adobename='afii57430', description='ARABIC LETTER DAD' },
+ [0x0637] = { unicodeslot=0x0637, category='lo', adobename='afii57431', description='ARABIC LETTER TAH' },
+ [0x0638] = { unicodeslot=0x0638, category='lo', adobename='afii57432', description='ARABIC LETTER ZAH' },
+ [0x0639] = { unicodeslot=0x0639, category='lo', adobename='afii57433', description='ARABIC LETTER AIN' },
+ [0x063A] = { unicodeslot=0x063A, category='lo', adobename='afii57434', description='ARABIC LETTER GHAIN' },
+ [0x0640] = { unicodeslot=0x0640, category='lm', adobename='afii57440', description='ARABIC TATWEEL' },
+ [0x0641] = { unicodeslot=0x0641, category='lo', adobename='afii57441', description='ARABIC LETTER FEH' },
+ [0x0642] = { unicodeslot=0x0642, category='lo', adobename='afii57442', description='ARABIC LETTER QAF' },
+ [0x0643] = { unicodeslot=0x0643, category='lo', adobename='afii57443', description='ARABIC LETTER KAF' },
+ [0x0644] = { unicodeslot=0x0644, category='lo', adobename='afii57444', description='ARABIC LETTER LAM' },
+ [0x0645] = { unicodeslot=0x0645, category='lo', adobename='afii57445', description='ARABIC LETTER MEEM' },
+ [0x0646] = { unicodeslot=0x0646, category='lo', adobename='afii57446', description='ARABIC LETTER NOON' },
+ [0x0647] = { unicodeslot=0x0647, category='lo', adobename='afii57470', description='ARABIC LETTER HEH' },
+ [0x0648] = { unicodeslot=0x0648, category='lo', adobename='afii57448', description='ARABIC LETTER WAW' },
+ [0x0649] = { unicodeslot=0x0649, category='lo', adobename='afii57449', description='ARABIC LETTER ALEF MAKSURA' },
+ [0x064A] = { unicodeslot=0x064A, category='lo', adobename='afii57450', description='ARABIC LETTER YEH' },
+ [0x064B] = { unicodeslot=0x064B, category='mn', adobename='afii57451', description='ARABIC FATHATAN' },
+ [0x064C] = { unicodeslot=0x064C, category='mn', adobename='afii57452', description='ARABIC DAMMATAN' },
+ [0x064D] = { unicodeslot=0x064D, category='mn', adobename='afii57453', description='ARABIC KASRATAN' },
+ [0x064E] = { unicodeslot=0x064E, category='mn', adobename='afii57454', description='ARABIC FATHA' },
+ [0x064F] = { unicodeslot=0x064F, category='mn', adobename='afii57455', description='ARABIC DAMMA' },
+ [0x0650] = { unicodeslot=0x0650, category='mn', adobename='afii57456', description='ARABIC KASRA' },
+ [0x0651] = { unicodeslot=0x0651, category='mn', adobename='afii57457', description='ARABIC SHADDA' },
+ [0x0652] = { unicodeslot=0x0652, category='mn', adobename='afii57458', description='ARABIC SUKUN' },
+ [0x0653] = { unicodeslot=0x0653, category='mn', description='ARABIC MADDAH ABOVE' },
+ [0x0654] = { unicodeslot=0x0654, category='mn', description='ARABIC HAMZA ABOVE' },
+ [0x0655] = { unicodeslot=0x0655, category='mn', description='ARABIC HAMZA BELOW' },
+ [0x0656] = { unicodeslot=0x0656, category='mn', description='ARABIC SUBSCRIPT ALEF' },
+ [0x0657] = { unicodeslot=0x0657, category='mn', description='ARABIC INVERTED DAMMA' },
+ [0x0658] = { unicodeslot=0x0658, category='mn', description='ARABIC MARK NOON GHUNNA' },
+ [0x0659] = { unicodeslot=0x0659, category='mn', description='ARABIC ZWARAKAY' },
+ [0x065A] = { unicodeslot=0x065A, category='mn', description='ARABIC VOWEL SIGN SMALL V ABOVE' },
+ [0x065B] = { unicodeslot=0x065B, category='mn', description='ARABIC VOWEL SIGN INVERTED SMALL V ABOVE' },
+ [0x065C] = { unicodeslot=0x065C, category='mn', description='ARABIC VOWEL SIGN DOT BELOW' },
+ [0x065D] = { unicodeslot=0x065D, category='mn', description='ARABIC REVERSED DAMMA' },
+ [0x065E] = { unicodeslot=0x065E, category='mn', description='ARABIC FATHA WITH TWO DOTS' },
+ [0x0660] = { unicodeslot=0x0660, category='nd', adobename='afii57392', description='ARABIC-INDIC DIGIT ZERO' },
+ [0x0661] = { unicodeslot=0x0661, category='nd', adobename='afii57393', description='ARABIC-INDIC DIGIT ONE' },
+ [0x0662] = { unicodeslot=0x0662, category='nd', adobename='afii57394', description='ARABIC-INDIC DIGIT TWO' },
+ [0x0663] = { unicodeslot=0x0663, category='nd', adobename='afii57395', description='ARABIC-INDIC DIGIT THREE' },
+ [0x0664] = { unicodeslot=0x0664, category='nd', adobename='afii57396', description='ARABIC-INDIC DIGIT FOUR' },
+ [0x0665] = { unicodeslot=0x0665, category='nd', adobename='afii57397', description='ARABIC-INDIC DIGIT FIVE' },
+ [0x0666] = { unicodeslot=0x0666, category='nd', adobename='afii57398', description='ARABIC-INDIC DIGIT SIX' },
+ [0x0667] = { unicodeslot=0x0667, category='nd', adobename='afii57399', description='ARABIC-INDIC DIGIT SEVEN' },
+ [0x0668] = { unicodeslot=0x0668, category='nd', adobename='afii57400', description='ARABIC-INDIC DIGIT EIGHT' },
+ [0x0669] = { unicodeslot=0x0669, category='nd', adobename='afii57401', description='ARABIC-INDIC DIGIT NINE' },
+ [0x066A] = { unicodeslot=0x066A, category='po', adobename='afii57381', description='ARABIC PERCENT SIGN' },
+ [0x066B] = { unicodeslot=0x066B, category='po', description='ARABIC DECIMAL SEPARATOR' },
+ [0x066C] = { unicodeslot=0x066C, category='po', description='ARABIC THOUSANDS SEPARATOR' },
+ [0x066D] = { unicodeslot=0x066D, category='po', adobename='afii63167', description='ARABIC FIVE POINTED STAR' },
+ [0x066E] = { unicodeslot=0x066E, category='lo', description='ARABIC LETTER DOTLESS BEH' },
+ [0x066F] = { unicodeslot=0x066F, category='lo', description='ARABIC LETTER DOTLESS QAF' },
+ [0x0670] = { unicodeslot=0x0670, category='mn', description='ARABIC LETTER SUPERSCRIPT ALEF' },
+ [0x0671] = { unicodeslot=0x0671, category='lo', description='ARABIC LETTER ALEF WASLA' },
+ [0x0672] = { unicodeslot=0x0672, category='lo', description='ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE', shcode=0x0627 },
+ [0x0673] = { unicodeslot=0x0673, category='lo', description='ARABIC LETTER ALEF WITH WAVY HAMZA BELOW', shcode=0x0627 },
+ [0x0674] = { unicodeslot=0x0674, category='lo', description='ARABIC LETTER HIGH HAMZA' },
+ [0x0675] = { unicodeslot=0x0675, category='lo', description='ARABIC LETTER HIGH HAMZA ALEF', specials={'compat',0x0627,0x0674} },
+ [0x0676] = { unicodeslot=0x0676, category='lo', description='ARABIC LETTER HIGH HAMZA WAW', specials={'compat',0x0648,0x0674} },
+ [0x0677] = { unicodeslot=0x0677, category='lo', description='ARABIC LETTER U WITH HAMZA ABOVE', shcode=0x06C7, specials={'compat',0x06C7,0x0674} },
+ [0x0678] = { unicodeslot=0x0678, category='lo', description='ARABIC LETTER HIGH HAMZA YEH', specials={'compat',0x064A,0x0674} },
+ [0x0679] = { unicodeslot=0x0679, category='lo', adobename='afii57511', description='ARABIC LETTER TTEH' },
+ [0x067A] = { unicodeslot=0x067A, category='lo', description='ARABIC LETTER TTEHEH' },
+ [0x067B] = { unicodeslot=0x067B, category='lo', description='ARABIC LETTER BEEH' },
+ [0x067C] = { unicodeslot=0x067C, category='lo', description='ARABIC LETTER TEH WITH RING', shcode=0x062A },
+ [0x067D] = { unicodeslot=0x067D, category='lo', description='ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS', shcode=0x062A },
+ [0x067E] = { unicodeslot=0x067E, category='lo', adobename='afii57506', description='ARABIC LETTER PEH' },
+ [0x067F] = { unicodeslot=0x067F, category='lo', description='ARABIC LETTER TEHEH' },
+ [0x0680] = { unicodeslot=0x0680, category='lo', description='ARABIC LETTER BEHEH' },
+ [0x0681] = { unicodeslot=0x0681, category='lo', description='ARABIC LETTER HAH WITH HAMZA ABOVE', shcode=0x062D },
+ [0x0682] = { unicodeslot=0x0682, category='lo', description='ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE', shcode=0x062D },
+ [0x0683] = { unicodeslot=0x0683, category='lo', description='ARABIC LETTER NYEH' },
+ [0x0684] = { unicodeslot=0x0684, category='lo', description='ARABIC LETTER DYEH' },
+ [0x0685] = { unicodeslot=0x0685, category='lo', description='ARABIC LETTER HAH WITH THREE DOTS ABOVE', shcode=0x062D },
+ [0x0686] = { unicodeslot=0x0686, category='lo', adobename='afii57507', description='ARABIC LETTER TCHEH' },
+ [0x0687] = { unicodeslot=0x0687, category='lo', description='ARABIC LETTER TCHEHEH' },
+ [0x0688] = { unicodeslot=0x0688, category='lo', adobename='afii57512', description='ARABIC LETTER DDAL' },
+ [0x0689] = { unicodeslot=0x0689, category='lo', description='ARABIC LETTER DAL WITH RING', shcode=0x062F },
+ [0x068A] = { unicodeslot=0x068A, category='lo', description='ARABIC LETTER DAL WITH DOT BELOW', shcode=0x062F },
+ [0x068B] = { unicodeslot=0x068B, category='lo', description='ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH', shcode=0x062F },
+ [0x068C] = { unicodeslot=0x068C, category='lo', description='ARABIC LETTER DAHAL' },
+ [0x068D] = { unicodeslot=0x068D, category='lo', description='ARABIC LETTER DDAHAL' },
+ [0x068E] = { unicodeslot=0x068E, category='lo', description='ARABIC LETTER DUL' },
+ [0x068F] = { unicodeslot=0x068F, category='lo', description='ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS', shcode=0x062F },
+ [0x0690] = { unicodeslot=0x0690, category='lo', description='ARABIC LETTER DAL WITH FOUR DOTS ABOVE', shcode=0x062F },
+ [0x0691] = { unicodeslot=0x0691, category='lo', adobename='afii57513', description='ARABIC LETTER RREH' },
+ [0x0692] = { unicodeslot=0x0692, category='lo', description='ARABIC LETTER REH WITH SMALL V', shcode=0x0631 },
+ [0x0693] = { unicodeslot=0x0693, category='lo', description='ARABIC LETTER REH WITH RING', shcode=0x0631 },
+ [0x0694] = { unicodeslot=0x0694, category='lo', description='ARABIC LETTER REH WITH DOT BELOW', shcode=0x0631 },
+ [0x0695] = { unicodeslot=0x0695, category='lo', description='ARABIC LETTER REH WITH SMALL V BELOW', shcode=0x0631 },
+ [0x0696] = { unicodeslot=0x0696, category='lo', description='ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE', shcode=0x0631 },
+ [0x0697] = { unicodeslot=0x0697, category='lo', description='ARABIC LETTER REH WITH TWO DOTS ABOVE', shcode=0x0631 },
+ [0x0698] = { unicodeslot=0x0698, category='lo', adobename='afii57508', description='ARABIC LETTER JEH' },
+ [0x0699] = { unicodeslot=0x0699, category='lo', description='ARABIC LETTER REH WITH FOUR DOTS ABOVE', shcode=0x0631 },
+ [0x069A] = { unicodeslot=0x069A, category='lo', description='ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE', shcode=0x0633 },
+ [0x069B] = { unicodeslot=0x069B, category='lo', description='ARABIC LETTER SEEN WITH THREE DOTS BELOW', shcode=0x0633 },
+ [0x069C] = { unicodeslot=0x069C, category='lo', description='ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE', shcode=0x0633 },
+ [0x069D] = { unicodeslot=0x069D, category='lo', description='ARABIC LETTER SAD WITH TWO DOTS BELOW', shcode=0x0635 },
+ [0x069E] = { unicodeslot=0x069E, category='lo', description='ARABIC LETTER SAD WITH THREE DOTS ABOVE', shcode=0x0635 },
+ [0x069F] = { unicodeslot=0x069F, category='lo', description='ARABIC LETTER TAH WITH THREE DOTS ABOVE', shcode=0x0637 },
+ [0x06A0] = { unicodeslot=0x06A0, category='lo', description='ARABIC LETTER AIN WITH THREE DOTS ABOVE', shcode=0x0639 },
+ [0x06A1] = { unicodeslot=0x06A1, category='lo', description='ARABIC LETTER DOTLESS FEH' },
+ [0x06A2] = { unicodeslot=0x06A2, category='lo', description='ARABIC LETTER FEH WITH DOT MOVED BELOW', shcode=0x0641 },
+ [0x06A3] = { unicodeslot=0x06A3, category='lo', description='ARABIC LETTER FEH WITH DOT BELOW', shcode=0x0641 },
+ [0x06A4] = { unicodeslot=0x06A4, category='lo', adobename='afii57505', description='ARABIC LETTER VEH' },
+ [0x06A5] = { unicodeslot=0x06A5, category='lo', description='ARABIC LETTER FEH WITH THREE DOTS BELOW', shcode=0x0641 },
+ [0x06A6] = { unicodeslot=0x06A6, category='lo', description='ARABIC LETTER PEHEH' },
+ [0x06A7] = { unicodeslot=0x06A7, category='lo', description='ARABIC LETTER QAF WITH DOT ABOVE', shcode=0x0642 },
+ [0x06A8] = { unicodeslot=0x06A8, category='lo', description='ARABIC LETTER QAF WITH THREE DOTS ABOVE', shcode=0x0642 },
+ [0x06A9] = { unicodeslot=0x06A9, category='lo', description='ARABIC LETTER KEHEH' },
+ [0x06AA] = { unicodeslot=0x06AA, category='lo', description='ARABIC LETTER SWASH KAF' },
+ [0x06AB] = { unicodeslot=0x06AB, category='lo', description='ARABIC LETTER KAF WITH RING', shcode=0x0643 },
+ [0x06AC] = { unicodeslot=0x06AC, category='lo', description='ARABIC LETTER KAF WITH DOT ABOVE', shcode=0x0643 },
+ [0x06AD] = { unicodeslot=0x06AD, category='lo', description='ARABIC LETTER NG' },
+ [0x06AE] = { unicodeslot=0x06AE, category='lo', description='ARABIC LETTER KAF WITH THREE DOTS BELOW', shcode=0x0643 },
+ [0x06AF] = { unicodeslot=0x06AF, category='lo', adobename='afii57509', description='ARABIC LETTER GAF' },
+ [0x06B0] = { unicodeslot=0x06B0, category='lo', description='ARABIC LETTER GAF WITH RING', shcode=0x06AF },
+ [0x06B1] = { unicodeslot=0x06B1, category='lo', description='ARABIC LETTER NGOEH' },
+ [0x06B2] = { unicodeslot=0x06B2, category='lo', description='ARABIC LETTER GAF WITH TWO DOTS BELOW', shcode=0x06AF },
+ [0x06B3] = { unicodeslot=0x06B3, category='lo', description='ARABIC LETTER GUEH' },
+ [0x06B4] = { unicodeslot=0x06B4, category='lo', description='ARABIC LETTER GAF WITH THREE DOTS ABOVE', shcode=0x06AF },
+ [0x06B5] = { unicodeslot=0x06B5, category='lo', description='ARABIC LETTER LAM WITH SMALL V', shcode=0x0644 },
+ [0x06B6] = { unicodeslot=0x06B6, category='lo', description='ARABIC LETTER LAM WITH DOT ABOVE', shcode=0x0644 },
+ [0x06B7] = { unicodeslot=0x06B7, category='lo', description='ARABIC LETTER LAM WITH THREE DOTS ABOVE', shcode=0x0644 },
+ [0x06B8] = { unicodeslot=0x06B8, category='lo', description='ARABIC LETTER LAM WITH THREE DOTS BELOW', shcode=0x0644 },
+ [0x06B9] = { unicodeslot=0x06B9, category='lo', description='ARABIC LETTER NOON WITH DOT BELOW', shcode=0x0646 },
+ [0x06BA] = { unicodeslot=0x06BA, category='lo', adobename='afii57514', description='ARABIC LETTER NOON GHUNNA' },
+ [0x06BB] = { unicodeslot=0x06BB, category='lo', description='ARABIC LETTER RNOON' },
+ [0x06BC] = { unicodeslot=0x06BC, category='lo', description='ARABIC LETTER NOON WITH RING', shcode=0x0646 },
+ [0x06BD] = { unicodeslot=0x06BD, category='lo', description='ARABIC LETTER NOON WITH THREE DOTS ABOVE', shcode=0x0646 },
+ [0x06BE] = { unicodeslot=0x06BE, category='lo', description='ARABIC LETTER HEH DOACHASHMEE' },
+ [0x06BF] = { unicodeslot=0x06BF, category='lo', description='ARABIC LETTER TCHEH WITH DOT ABOVE', shcode=0x0686 },
+ [0x06C0] = { unicodeslot=0x06C0, category='lo', description='ARABIC LETTER HEH WITH YEH ABOVE', shcode=0x0647, specials={'char',0x06D5,0x0654} },
+ [0x06C1] = { unicodeslot=0x06C1, category='lo', description='ARABIC LETTER HEH GOAL' },
+ [0x06C2] = { unicodeslot=0x06C2, category='lo', description='ARABIC LETTER HEH GOAL WITH HAMZA ABOVE', specials={'char',0x06C1,0x0654} },
+ [0x06C3] = { unicodeslot=0x06C3, category='lo', description='ARABIC LETTER TEH MARBUTA GOAL' },
+ [0x06C4] = { unicodeslot=0x06C4, category='lo', description='ARABIC LETTER WAW WITH RING', shcode=0x0648 },
+ [0x06C5] = { unicodeslot=0x06C5, category='lo', description='ARABIC LETTER KIRGHIZ OE' },
+ [0x06C6] = { unicodeslot=0x06C6, category='lo', description='ARABIC LETTER OE' },
+ [0x06C7] = { unicodeslot=0x06C7, category='lo', description='ARABIC LETTER U' },
+ [0x06C8] = { unicodeslot=0x06C8, category='lo', description='ARABIC LETTER YU' },
+ [0x06C9] = { unicodeslot=0x06C9, category='lo', description='ARABIC LETTER KIRGHIZ YU' },
+ [0x06CA] = { unicodeslot=0x06CA, category='lo', description='ARABIC LETTER WAW WITH TWO DOTS ABOVE', shcode=0x0648 },
+ [0x06CB] = { unicodeslot=0x06CB, category='lo', description='ARABIC LETTER VE' },
+ [0x06CC] = { unicodeslot=0x06CC, category='lo', description='ARABIC LETTER FARSI YEH' },
+ [0x06CD] = { unicodeslot=0x06CD, category='lo', description='ARABIC LETTER YEH WITH TAIL', shcode=0x064A },
+ [0x06CE] = { unicodeslot=0x06CE, category='lo', description='ARABIC LETTER YEH WITH SMALL V', shcode=0x064A },
+ [0x06CF] = { unicodeslot=0x06CF, category='lo', description='ARABIC LETTER WAW WITH DOT ABOVE', shcode=0x0648 },
+ [0x06D0] = { unicodeslot=0x06D0, category='lo', description='ARABIC LETTER E' },
+ [0x06D1] = { unicodeslot=0x06D1, category='lo', description='ARABIC LETTER YEH WITH THREE DOTS BELOW', shcode=0x064A },
+ [0x06D2] = { unicodeslot=0x06D2, category='lo', adobename='afii57519', description='ARABIC LETTER YEH BARREE' },
+ [0x06D3] = { unicodeslot=0x06D3, category='lo', description='ARABIC LETTER YEH BARREE WITH HAMZA ABOVE', specials={'char',0x06D2,0x0654} },
+ [0x06D4] = { unicodeslot=0x06D4, category='po', description='ARABIC FULL STOP' },
+ [0x06D5] = { unicodeslot=0x06D5, category='lo', adobename='afii57534', description='ARABIC LETTER AE' },
+ [0x06D6] = { unicodeslot=0x06D6, category='mn', description='ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA' },
+ [0x06D7] = { unicodeslot=0x06D7, category='mn', description='ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA' },
+ [0x06D8] = { unicodeslot=0x06D8, category='mn', description='ARABIC SMALL HIGH MEEM INITIAL FORM' },
+ [0x06D9] = { unicodeslot=0x06D9, category='mn', description='ARABIC SMALL HIGH LAM ALEF' },
+ [0x06DA] = { unicodeslot=0x06DA, category='mn', description='ARABIC SMALL HIGH JEEM' },
+ [0x06DB] = { unicodeslot=0x06DB, category='mn', description='ARABIC SMALL HIGH THREE DOTS' },
+ [0x06DC] = { unicodeslot=0x06DC, category='mn', description='ARABIC SMALL HIGH SEEN' },
+ [0x06DD] = { unicodeslot=0x06DD, category='cf', description='ARABIC END OF AYAH' },
+ [0x06DE] = { unicodeslot=0x06DE, category='me', description='ARABIC START OF RUB EL HIZB' },
+ [0x06DF] = { unicodeslot=0x06DF, category='mn', description='ARABIC SMALL HIGH ROUNDED ZERO' },
+ [0x06E0] = { unicodeslot=0x06E0, category='mn', description='ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO' },
+ [0x06E1] = { unicodeslot=0x06E1, category='mn', description='ARABIC SMALL HIGH DOTLESS HEAD OF KHAH' },
+ [0x06E2] = { unicodeslot=0x06E2, category='mn', description='ARABIC SMALL HIGH MEEM ISOLATED FORM' },
+ [0x06E3] = { unicodeslot=0x06E3, category='mn', description='ARABIC SMALL LOW SEEN' },
+ [0x06E4] = { unicodeslot=0x06E4, category='mn', description='ARABIC SMALL HIGH MADDA' },
+ [0x06E5] = { unicodeslot=0x06E5, category='lm', description='ARABIC SMALL WAW' },
+ [0x06E6] = { unicodeslot=0x06E6, category='lm', description='ARABIC SMALL YEH' },
+ [0x06E7] = { unicodeslot=0x06E7, category='mn', description='ARABIC SMALL HIGH YEH' },
+ [0x06E8] = { unicodeslot=0x06E8, category='mn', description='ARABIC SMALL HIGH NOON' },
+ [0x06E9] = { unicodeslot=0x06E9, category='so', description='ARABIC PLACE OF SAJDAH' },
+ [0x06EA] = { unicodeslot=0x06EA, category='mn', description='ARABIC EMPTY CENTRE LOW STOP' },
+ [0x06EB] = { unicodeslot=0x06EB, category='mn', description='ARABIC EMPTY CENTRE HIGH STOP' },
+ [0x06EC] = { unicodeslot=0x06EC, category='mn', description='ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE' },
+ [0x06ED] = { unicodeslot=0x06ED, category='mn', description='ARABIC SMALL LOW MEEM' },
+ [0x06EE] = { unicodeslot=0x06EE, category='lo', description='ARABIC LETTER DAL WITH INVERTED V', shcode=0x062F },
+ [0x06EF] = { unicodeslot=0x06EF, category='lo', description='ARABIC LETTER REH WITH INVERTED V', shcode=0x0631 },
+ [0x06F0] = { unicodeslot=0x06F0, category='nd', description='EXTENDED ARABIC-INDIC DIGIT ZERO' },
+ [0x06F1] = { unicodeslot=0x06F1, category='nd', description='EXTENDED ARABIC-INDIC DIGIT ONE' },
+ [0x06F2] = { unicodeslot=0x06F2, category='nd', description='EXTENDED ARABIC-INDIC DIGIT TWO' },
+ [0x06F3] = { unicodeslot=0x06F3, category='nd', description='EXTENDED ARABIC-INDIC DIGIT THREE' },
+ [0x06F4] = { unicodeslot=0x06F4, category='nd', description='EXTENDED ARABIC-INDIC DIGIT FOUR' },
+ [0x06F5] = { unicodeslot=0x06F5, category='nd', description='EXTENDED ARABIC-INDIC DIGIT FIVE' },
+ [0x06F6] = { unicodeslot=0x06F6, category='nd', description='EXTENDED ARABIC-INDIC DIGIT SIX' },
+ [0x06F7] = { unicodeslot=0x06F7, category='nd', description='EXTENDED ARABIC-INDIC DIGIT SEVEN' },
+ [0x06F8] = { unicodeslot=0x06F8, category='nd', description='EXTENDED ARABIC-INDIC DIGIT EIGHT' },
+ [0x06F9] = { unicodeslot=0x06F9, category='nd', description='EXTENDED ARABIC-INDIC DIGIT NINE' },
+ [0x06FA] = { unicodeslot=0x06FA, category='lo', description='ARABIC LETTER SHEEN WITH DOT BELOW', shcode=0x0634 },
+ [0x06FB] = { unicodeslot=0x06FB, category='lo', description='ARABIC LETTER DAD WITH DOT BELOW', shcode=0x0636 },
+ [0x06FC] = { unicodeslot=0x06FC, category='lo', description='ARABIC LETTER GHAIN WITH DOT BELOW', shcode=0x063A },
+ [0x06FD] = { unicodeslot=0x06FD, category='so', description='ARABIC SIGN SINDHI AMPERSAND' },
+ [0x06FE] = { unicodeslot=0x06FE, category='so', description='ARABIC SIGN SINDHI POSTPOSITION MEN' },
+ [0x06FF] = { unicodeslot=0x06FF, category='lo', description='ARABIC LETTER HEH WITH INVERTED V', shcode=0x0647 },
+ [0x0700] = { unicodeslot=0x0700, category='po', description='SYRIAC END OF PARAGRAPH' },
+ [0x0701] = { unicodeslot=0x0701, category='po', description='SYRIAC SUPRALINEAR FULL STOP' },
+ [0x0702] = { unicodeslot=0x0702, category='po', description='SYRIAC SUBLINEAR FULL STOP' },
+ [0x0703] = { unicodeslot=0x0703, category='po', description='SYRIAC SUPRALINEAR COLON' },
+ [0x0704] = { unicodeslot=0x0704, category='po', description='SYRIAC SUBLINEAR COLON' },
+ [0x0705] = { unicodeslot=0x0705, category='po', description='SYRIAC HORIZONTAL COLON' },
+ [0x0706] = { unicodeslot=0x0706, category='po', description='SYRIAC COLON SKEWED LEFT' },
+ [0x0707] = { unicodeslot=0x0707, category='po', description='SYRIAC COLON SKEWED RIGHT' },
+ [0x0708] = { unicodeslot=0x0708, category='po', description='SYRIAC SUPRALINEAR COLON SKEWED LEFT' },
+ [0x0709] = { unicodeslot=0x0709, category='po', description='SYRIAC SUBLINEAR COLON SKEWED RIGHT' },
+ [0x070A] = { unicodeslot=0x070A, category='po', description='SYRIAC CONTRACTION' },
+ [0x070B] = { unicodeslot=0x070B, category='po', description='SYRIAC HARKLEAN OBELUS' },
+ [0x070C] = { unicodeslot=0x070C, category='po', description='SYRIAC HARKLEAN METOBELUS' },
+ [0x070D] = { unicodeslot=0x070D, category='po', description='SYRIAC HARKLEAN ASTERISCUS' },
+ [0x070F] = { unicodeslot=0x070F, category='cf', description='SYRIAC ABBREVIATION MARK' },
+ [0x0710] = { unicodeslot=0x0710, category='lo', description='SYRIAC LETTER ALAPH' },
+ [0x0711] = { unicodeslot=0x0711, category='mn', description='SYRIAC LETTER SUPERSCRIPT ALAPH' },
+ [0x0712] = { unicodeslot=0x0712, category='lo', description='SYRIAC LETTER BETH' },
+ [0x0713] = { unicodeslot=0x0713, category='lo', description='SYRIAC LETTER GAMAL' },
+ [0x0714] = { unicodeslot=0x0714, category='lo', description='SYRIAC LETTER GAMAL GARSHUNI' },
+ [0x0715] = { unicodeslot=0x0715, category='lo', description='SYRIAC LETTER DALATH' },
+ [0x0716] = { unicodeslot=0x0716, category='lo', description='SYRIAC LETTER DOTLESS DALATH RISH' },
+ [0x0717] = { unicodeslot=0x0717, category='lo', description='SYRIAC LETTER HE' },
+ [0x0718] = { unicodeslot=0x0718, category='lo', description='SYRIAC LETTER WAW' },
+ [0x0719] = { unicodeslot=0x0719, category='lo', description='SYRIAC LETTER ZAIN' },
+ [0x071A] = { unicodeslot=0x071A, category='lo', description='SYRIAC LETTER HETH' },
+ [0x071B] = { unicodeslot=0x071B, category='lo', description='SYRIAC LETTER TETH' },
+ [0x071C] = { unicodeslot=0x071C, category='lo', description='SYRIAC LETTER TETH GARSHUNI' },
+ [0x071D] = { unicodeslot=0x071D, category='lo', description='SYRIAC LETTER YUDH' },
+ [0x071E] = { unicodeslot=0x071E, category='lo', description='SYRIAC LETTER YUDH HE' },
+ [0x071F] = { unicodeslot=0x071F, category='lo', description='SYRIAC LETTER KAPH' },
+ [0x0720] = { unicodeslot=0x0720, category='lo', description='SYRIAC LETTER LAMADH' },
+ [0x0721] = { unicodeslot=0x0721, category='lo', description='SYRIAC LETTER MIM' },
+ [0x0722] = { unicodeslot=0x0722, category='lo', description='SYRIAC LETTER NUN' },
+ [0x0723] = { unicodeslot=0x0723, category='lo', description='SYRIAC LETTER SEMKATH' },
+ [0x0724] = { unicodeslot=0x0724, category='lo', description='SYRIAC LETTER FINAL SEMKATH' },
+ [0x0725] = { unicodeslot=0x0725, category='lo', description='SYRIAC LETTER E' },
+ [0x0726] = { unicodeslot=0x0726, category='lo', description='SYRIAC LETTER PE' },
+ [0x0727] = { unicodeslot=0x0727, category='lo', description='SYRIAC LETTER REVERSED PE' },
+ [0x0728] = { unicodeslot=0x0728, category='lo', description='SYRIAC LETTER SADHE' },
+ [0x0729] = { unicodeslot=0x0729, category='lo', description='SYRIAC LETTER QAPH' },
+ [0x072A] = { unicodeslot=0x072A, category='lo', description='SYRIAC LETTER RISH' },
+ [0x072B] = { unicodeslot=0x072B, category='lo', description='SYRIAC LETTER SHIN' },
+ [0x072C] = { unicodeslot=0x072C, category='lo', description='SYRIAC LETTER TAW' },
+ [0x072D] = { unicodeslot=0x072D, category='lo', description='SYRIAC LETTER PERSIAN BHETH' },
+ [0x072E] = { unicodeslot=0x072E, category='lo', description='SYRIAC LETTER PERSIAN GHAMAL' },
+ [0x072F] = { unicodeslot=0x072F, category='lo', description='SYRIAC LETTER PERSIAN DHALATH' },
+ [0x0730] = { unicodeslot=0x0730, category='mn', description='SYRIAC PTHAHA ABOVE' },
+ [0x0731] = { unicodeslot=0x0731, category='mn', description='SYRIAC PTHAHA BELOW' },
+ [0x0732] = { unicodeslot=0x0732, category='mn', description='SYRIAC PTHAHA DOTTED' },
+ [0x0733] = { unicodeslot=0x0733, category='mn', description='SYRIAC ZQAPHA ABOVE' },
+ [0x0734] = { unicodeslot=0x0734, category='mn', description='SYRIAC ZQAPHA BELOW' },
+ [0x0735] = { unicodeslot=0x0735, category='mn', description='SYRIAC ZQAPHA DOTTED' },
+ [0x0736] = { unicodeslot=0x0736, category='mn', description='SYRIAC RBASA ABOVE' },
+ [0x0737] = { unicodeslot=0x0737, category='mn', description='SYRIAC RBASA BELOW' },
+ [0x0738] = { unicodeslot=0x0738, category='mn', description='SYRIAC DOTTED ZLAMA HORIZONTAL' },
+ [0x0739] = { unicodeslot=0x0739, category='mn', description='SYRIAC DOTTED ZLAMA ANGULAR' },
+ [0x073A] = { unicodeslot=0x073A, category='mn', description='SYRIAC HBASA ABOVE' },
+ [0x073B] = { unicodeslot=0x073B, category='mn', description='SYRIAC HBASA BELOW' },
+ [0x073C] = { unicodeslot=0x073C, category='mn', description='SYRIAC HBASA-ESASA DOTTED' },
+ [0x073D] = { unicodeslot=0x073D, category='mn', description='SYRIAC ESASA ABOVE' },
+ [0x073E] = { unicodeslot=0x073E, category='mn', description='SYRIAC ESASA BELOW' },
+ [0x073F] = { unicodeslot=0x073F, category='mn', description='SYRIAC RWAHA' },
+ [0x0740] = { unicodeslot=0x0740, category='mn', description='SYRIAC FEMININE DOT' },
+ [0x0741] = { unicodeslot=0x0741, category='mn', description='SYRIAC QUSHSHAYA' },
+ [0x0742] = { unicodeslot=0x0742, category='mn', description='SYRIAC RUKKAKHA' },
+ [0x0743] = { unicodeslot=0x0743, category='mn', description='SYRIAC TWO VERTICAL DOTS ABOVE' },
+ [0x0744] = { unicodeslot=0x0744, category='mn', description='SYRIAC TWO VERTICAL DOTS BELOW' },
+ [0x0745] = { unicodeslot=0x0745, category='mn', description='SYRIAC THREE DOTS ABOVE' },
+ [0x0746] = { unicodeslot=0x0746, category='mn', description='SYRIAC THREE DOTS BELOW' },
+ [0x0747] = { unicodeslot=0x0747, category='mn', description='SYRIAC OBLIQUE LINE ABOVE' },
+ [0x0748] = { unicodeslot=0x0748, category='mn', description='SYRIAC OBLIQUE LINE BELOW' },
+ [0x0749] = { unicodeslot=0x0749, category='mn', description='SYRIAC MUSIC' },
+ [0x074A] = { unicodeslot=0x074A, category='mn', description='SYRIAC BARREKH' },
+ [0x074D] = { unicodeslot=0x074D, category='lo', description='SYRIAC LETTER SOGDIAN ZHAIN' },
+ [0x074E] = { unicodeslot=0x074E, category='lo', description='SYRIAC LETTER SOGDIAN KHAPH' },
+ [0x074F] = { unicodeslot=0x074F, category='lo', description='SYRIAC LETTER SOGDIAN FE' },
+ [0x0750] = { unicodeslot=0x0750, category='lo', description='ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW', shcode=0x0628 },
+ [0x0751] = { unicodeslot=0x0751, category='lo', description='ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE', shcode=0x0628 },
+ [0x0752] = { unicodeslot=0x0752, category='lo', description='ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x0628 },
+ [0x0753] = { unicodeslot=0x0753, category='lo', description='ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE', shcode=0x0628 },
+ [0x0754] = { unicodeslot=0x0754, category='lo', description='ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE', shcode=0x0628 },
+ [0x0755] = { unicodeslot=0x0755, category='lo', description='ARABIC LETTER BEH WITH INVERTED SMALL V BELOW', shcode=0x0628 },
+ [0x0756] = { unicodeslot=0x0756, category='lo', description='ARABIC LETTER BEH WITH SMALL V', shcode=0x0628 },
+ [0x0757] = { unicodeslot=0x0757, category='lo', description='ARABIC LETTER HAH WITH TWO DOTS ABOVE', shcode=0x062D },
+ [0x0758] = { unicodeslot=0x0758, category='lo', description='ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x062D },
+ [0x0759] = { unicodeslot=0x0759, category='lo', description='ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH', shcode=0x062F },
+ [0x075A] = { unicodeslot=0x075A, category='lo', description='ARABIC LETTER DAL WITH INVERTED SMALL V BELOW', shcode=0x062F },
+ [0x075B] = { unicodeslot=0x075B, category='lo', description='ARABIC LETTER REH WITH STROKE', shcode=0x0631 },
+ [0x075C] = { unicodeslot=0x075C, category='lo', description='ARABIC LETTER SEEN WITH FOUR DOTS ABOVE', shcode=0x0633 },
+ [0x075D] = { unicodeslot=0x075D, category='lo', description='ARABIC LETTER AIN WITH TWO DOTS ABOVE', shcode=0x0639 },
+ [0x075E] = { unicodeslot=0x075E, category='lo', description='ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE', shcode=0x0639 },
+ [0x075F] = { unicodeslot=0x075F, category='lo', description='ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE', shcode=0x0639 },
+ [0x0760] = { unicodeslot=0x0760, category='lo', description='ARABIC LETTER FEH WITH TWO DOTS BELOW', shcode=0x0641 },
+ [0x0761] = { unicodeslot=0x0761, category='lo', description='ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x0641 },
+ [0x0762] = { unicodeslot=0x0762, category='lo', description='ARABIC LETTER KEHEH WITH DOT ABOVE', shcode=0x06A9 },
+ [0x0763] = { unicodeslot=0x0763, category='lo', description='ARABIC LETTER KEHEH WITH THREE DOTS ABOVE', shcode=0x06A9 },
+ [0x0764] = { unicodeslot=0x0764, category='lo', description='ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x06A9 },
+ [0x0765] = { unicodeslot=0x0765, category='lo', description='ARABIC LETTER MEEM WITH DOT ABOVE', shcode=0x0645 },
+ [0x0766] = { unicodeslot=0x0766, category='lo', description='ARABIC LETTER MEEM WITH DOT BELOW', shcode=0x0645 },
+ [0x0767] = { unicodeslot=0x0767, category='lo', description='ARABIC LETTER NOON WITH TWO DOTS BELOW', shcode=0x0646 },
+ [0x0768] = { unicodeslot=0x0768, category='lo', description='ARABIC LETTER NOON WITH SMALL TAH', shcode=0x0646 },
+ [0x0769] = { unicodeslot=0x0769, category='lo', description='ARABIC LETTER NOON WITH SMALL V', shcode=0x0646 },
+ [0x076A] = { unicodeslot=0x076A, category='lo', description='ARABIC LETTER LAM WITH BAR', shcode=0x0644 },
+ [0x076B] = { unicodeslot=0x076B, category='lo', description='ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE', shcode=0x0631 },
+ [0x076C] = { unicodeslot=0x076C, category='lo', description='ARABIC LETTER REH WITH HAMZA ABOVE', shcode=0x0631 },
+ [0x076D] = { unicodeslot=0x076D, category='lo', description='ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE', shcode=0x0633 },
+ [0x0780] = { unicodeslot=0x0780, category='lo', description='THAANA LETTER HAA' },
+ [0x0781] = { unicodeslot=0x0781, category='lo', description='THAANA LETTER SHAVIYANI' },
+ [0x0782] = { unicodeslot=0x0782, category='lo', description='THAANA LETTER NOONU' },
+ [0x0783] = { unicodeslot=0x0783, category='lo', description='THAANA LETTER RAA' },
+ [0x0784] = { unicodeslot=0x0784, category='lo', description='THAANA LETTER BAA' },
+ [0x0785] = { unicodeslot=0x0785, category='lo', description='THAANA LETTER LHAVIYANI' },
+ [0x0786] = { unicodeslot=0x0786, category='lo', description='THAANA LETTER KAAFU' },
+ [0x0787] = { unicodeslot=0x0787, category='lo', description='THAANA LETTER ALIFU' },
+ [0x0788] = { unicodeslot=0x0788, category='lo', description='THAANA LETTER VAAVU' },
+ [0x0789] = { unicodeslot=0x0789, category='lo', description='THAANA LETTER MEEMU' },
+ [0x078A] = { unicodeslot=0x078A, category='lo', description='THAANA LETTER FAAFU' },
+ [0x078B] = { unicodeslot=0x078B, category='lo', description='THAANA LETTER DHAALU' },
+ [0x078C] = { unicodeslot=0x078C, category='lo', description='THAANA LETTER THAA' },
+ [0x078D] = { unicodeslot=0x078D, category='lo', description='THAANA LETTER LAAMU' },
+ [0x078E] = { unicodeslot=0x078E, category='lo', description='THAANA LETTER GAAFU' },
+ [0x078F] = { unicodeslot=0x078F, category='lo', description='THAANA LETTER GNAVIYANI' },
+ [0x0790] = { unicodeslot=0x0790, category='lo', description='THAANA LETTER SEENU' },
+ [0x0791] = { unicodeslot=0x0791, category='lo', description='THAANA LETTER DAVIYANI' },
+ [0x0792] = { unicodeslot=0x0792, category='lo', description='THAANA LETTER ZAVIYANI' },
+ [0x0793] = { unicodeslot=0x0793, category='lo', description='THAANA LETTER TAVIYANI' },
+ [0x0794] = { unicodeslot=0x0794, category='lo', description='THAANA LETTER YAA' },
+ [0x0795] = { unicodeslot=0x0795, category='lo', description='THAANA LETTER PAVIYANI' },
+ [0x0796] = { unicodeslot=0x0796, category='lo', description='THAANA LETTER JAVIYANI' },
+ [0x0797] = { unicodeslot=0x0797, category='lo', description='THAANA LETTER CHAVIYANI' },
+ [0x0798] = { unicodeslot=0x0798, category='lo', description='THAANA LETTER TTAA' },
+ [0x0799] = { unicodeslot=0x0799, category='lo', description='THAANA LETTER HHAA' },
+ [0x079A] = { unicodeslot=0x079A, category='lo', description='THAANA LETTER KHAA' },
+ [0x079B] = { unicodeslot=0x079B, category='lo', description='THAANA LETTER THAALU' },
+ [0x079C] = { unicodeslot=0x079C, category='lo', description='THAANA LETTER ZAA' },
+ [0x079D] = { unicodeslot=0x079D, category='lo', description='THAANA LETTER SHEENU' },
+ [0x079E] = { unicodeslot=0x079E, category='lo', description='THAANA LETTER SAADHU' },
+ [0x079F] = { unicodeslot=0x079F, category='lo', description='THAANA LETTER DAADHU' },
+ [0x07A0] = { unicodeslot=0x07A0, category='lo', description='THAANA LETTER TO' },
+ [0x07A1] = { unicodeslot=0x07A1, category='lo', description='THAANA LETTER ZO' },
+ [0x07A2] = { unicodeslot=0x07A2, category='lo', description='THAANA LETTER AINU' },
+ [0x07A3] = { unicodeslot=0x07A3, category='lo', description='THAANA LETTER GHAINU' },
+ [0x07A4] = { unicodeslot=0x07A4, category='lo', description='THAANA LETTER QAAFU' },
+ [0x07A5] = { unicodeslot=0x07A5, category='lo', description='THAANA LETTER WAAVU' },
+ [0x07A6] = { unicodeslot=0x07A6, category='mn', description='THAANA ABAFILI' },
+ [0x07A7] = { unicodeslot=0x07A7, category='mn', description='THAANA AABAAFILI' },
+ [0x07A8] = { unicodeslot=0x07A8, category='mn', description='THAANA IBIFILI' },
+ [0x07A9] = { unicodeslot=0x07A9, category='mn', description='THAANA EEBEEFILI' },
+ [0x07AA] = { unicodeslot=0x07AA, category='mn', description='THAANA UBUFILI' },
+ [0x07AB] = { unicodeslot=0x07AB, category='mn', description='THAANA OOBOOFILI' },
+ [0x07AC] = { unicodeslot=0x07AC, category='mn', description='THAANA EBEFILI' },
+ [0x07AD] = { unicodeslot=0x07AD, category='mn', description='THAANA EYBEYFILI' },
+ [0x07AE] = { unicodeslot=0x07AE, category='mn', description='THAANA OBOFILI' },
+ [0x07AF] = { unicodeslot=0x07AF, category='mn', description='THAANA OABOAFILI' },
+ [0x07B0] = { unicodeslot=0x07B0, category='mn', description='THAANA SUKUN' },
+ [0x07B1] = { unicodeslot=0x07B1, category='lo', description='THAANA LETTER NAA' },
+ [0x07C0] = { unicodeslot=0x07C0, category='nd', description='NKO DIGIT ZERO' },
+ [0x07C1] = { unicodeslot=0x07C1, category='nd', description='NKO DIGIT ONE' },
+ [0x07C2] = { unicodeslot=0x07C2, category='nd', description='NKO DIGIT TWO' },
+ [0x07C3] = { unicodeslot=0x07C3, category='nd', description='NKO DIGIT THREE' },
+ [0x07C4] = { unicodeslot=0x07C4, category='nd', description='NKO DIGIT FOUR' },
+ [0x07C5] = { unicodeslot=0x07C5, category='nd', description='NKO DIGIT FIVE' },
+ [0x07C6] = { unicodeslot=0x07C6, category='nd', description='NKO DIGIT SIX' },
+ [0x07C7] = { unicodeslot=0x07C7, category='nd', description='NKO DIGIT SEVEN' },
+ [0x07C8] = { unicodeslot=0x07C8, category='nd', description='NKO DIGIT EIGHT' },
+ [0x07C9] = { unicodeslot=0x07C9, category='nd', description='NKO DIGIT NINE' },
+ [0x07CA] = { unicodeslot=0x07CA, category='lo', description='NKO LETTER A' },
+ [0x07CB] = { unicodeslot=0x07CB, category='lo', description='NKO LETTER EE' },
+ [0x07CC] = { unicodeslot=0x07CC, category='lo', description='NKO LETTER I' },
+ [0x07CD] = { unicodeslot=0x07CD, category='lo', description='NKO LETTER E' },
+ [0x07CE] = { unicodeslot=0x07CE, category='lo', description='NKO LETTER U' },
+ [0x07CF] = { unicodeslot=0x07CF, category='lo', description='NKO LETTER OO' },
+ [0x07D0] = { unicodeslot=0x07D0, category='lo', description='NKO LETTER O' },
+ [0x07D1] = { unicodeslot=0x07D1, category='lo', description='NKO LETTER DAGBASINNA' },
+ [0x07D2] = { unicodeslot=0x07D2, category='lo', description='NKO LETTER N' },
+ [0x07D3] = { unicodeslot=0x07D3, category='lo', description='NKO LETTER BA' },
+ [0x07D4] = { unicodeslot=0x07D4, category='lo', description='NKO LETTER PA' },
+ [0x07D5] = { unicodeslot=0x07D5, category='lo', description='NKO LETTER TA' },
+ [0x07D6] = { unicodeslot=0x07D6, category='lo', description='NKO LETTER JA' },
+ [0x07D7] = { unicodeslot=0x07D7, category='lo', description='NKO LETTER CHA' },
+ [0x07D8] = { unicodeslot=0x07D8, category='lo', description='NKO LETTER DA' },
+ [0x07D9] = { unicodeslot=0x07D9, category='lo', description='NKO LETTER RA' },
+ [0x07DA] = { unicodeslot=0x07DA, category='lo', description='NKO LETTER RRA' },
+ [0x07DB] = { unicodeslot=0x07DB, category='lo', description='NKO LETTER SA' },
+ [0x07DC] = { unicodeslot=0x07DC, category='lo', description='NKO LETTER GBA' },
+ [0x07DD] = { unicodeslot=0x07DD, category='lo', description='NKO LETTER FA' },
+ [0x07DE] = { unicodeslot=0x07DE, category='lo', description='NKO LETTER KA' },
+ [0x07DF] = { unicodeslot=0x07DF, category='lo', description='NKO LETTER LA' },
+ [0x07E0] = { unicodeslot=0x07E0, category='lo', description='NKO LETTER NA WOLOSO' },
+ [0x07E1] = { unicodeslot=0x07E1, category='lo', description='NKO LETTER MA' },
+ [0x07E2] = { unicodeslot=0x07E2, category='lo', description='NKO LETTER NYA' },
+ [0x07E3] = { unicodeslot=0x07E3, category='lo', description='NKO LETTER NA' },
+ [0x07E4] = { unicodeslot=0x07E4, category='lo', description='NKO LETTER HA' },
+ [0x07E5] = { unicodeslot=0x07E5, category='lo', description='NKO LETTER WA' },
+ [0x07E6] = { unicodeslot=0x07E6, category='lo', description='NKO LETTER YA' },
+ [0x07E7] = { unicodeslot=0x07E7, category='lo', description='NKO LETTER NYA WOLOSO' },
+ [0x07E8] = { unicodeslot=0x07E8, category='lo', description='NKO LETTER JONA JA' },
+ [0x07E9] = { unicodeslot=0x07E9, category='lo', description='NKO LETTER JONA CHA' },
+ [0x07EA] = { unicodeslot=0x07EA, category='lo', description='NKO LETTER JONA RA' },
+ [0x07EB] = { unicodeslot=0x07EB, category='mn', description='NKO COMBINING SHORT HIGH TONE' },
+ [0x07EC] = { unicodeslot=0x07EC, category='mn', description='NKO COMBINING SHORT LOW TONE' },
+ [0x07ED] = { unicodeslot=0x07ED, category='mn', description='NKO COMBINING SHORT RISING TONE' },
+ [0x07EE] = { unicodeslot=0x07EE, category='mn', description='NKO COMBINING LONG DESCENDING TONE' },
+ [0x07EF] = { unicodeslot=0x07EF, category='mn', description='NKO COMBINING LONG HIGH TONE' },
+ [0x07F0] = { unicodeslot=0x07F0, category='mn', description='NKO COMBINING LONG LOW TONE' },
+ [0x07F1] = { unicodeslot=0x07F1, category='mn', description='NKO COMBINING LONG RISING TONE' },
+ [0x07F2] = { unicodeslot=0x07F2, category='mn', description='NKO COMBINING NASALIZATION MARK' },
+ [0x07F3] = { unicodeslot=0x07F3, category='mn', description='NKO COMBINING DOUBLE DOT ABOVE' },
+ [0x07F4] = { unicodeslot=0x07F4, category='lm', description='NKO HIGH TONE APOSTROPHE' },
+ [0x07F5] = { unicodeslot=0x07F5, category='lm', description='NKO LOW TONE APOSTROPHE' },
+ [0x07F6] = { unicodeslot=0x07F6, category='so', description='NKO SYMBOL OO DENNEN' },
+ [0x07F7] = { unicodeslot=0x07F7, category='po', description='NKO SYMBOL GBAKURUNEN' },
+ [0x07F8] = { unicodeslot=0x07F8, category='po', description='NKO COMMA' },
+ [0x07F9] = { unicodeslot=0x07F9, category='po', description='NKO EXCLAMATION MARK' },
+ [0x07FA] = { unicodeslot=0x07FA, category='lm', description='NKO LAJANYALAN' },
+ [0x0901] = { unicodeslot=0x0901, category='mn', description='DEVANAGARI SIGN CANDRABINDU' },
+ [0x0902] = { unicodeslot=0x0902, category='mn', description='DEVANAGARI SIGN ANUSVARA' },
+ [0x0903] = { unicodeslot=0x0903, category='mc', description='DEVANAGARI SIGN VISARGA' },
+ [0x0904] = { unicodeslot=0x0904, category='lo', description='DEVANAGARI LETTER SHORT A' },
+ [0x0905] = { unicodeslot=0x0905, category='lo', description='DEVANAGARI LETTER A' },
+ [0x0906] = { unicodeslot=0x0906, category='lo', description='DEVANAGARI LETTER AA' },
+ [0x0907] = { unicodeslot=0x0907, category='lo', description='DEVANAGARI LETTER I' },
+ [0x0908] = { unicodeslot=0x0908, category='lo', description='DEVANAGARI LETTER II' },
+ [0x0909] = { unicodeslot=0x0909, category='lo', description='DEVANAGARI LETTER U' },
+ [0x090A] = { unicodeslot=0x090A, category='lo', description='DEVANAGARI LETTER UU' },
+ [0x090B] = { unicodeslot=0x090B, category='lo', description='DEVANAGARI LETTER VOCALIC R' },
+ [0x090C] = { unicodeslot=0x090C, category='lo', description='DEVANAGARI LETTER VOCALIC L' },
+ [0x090D] = { unicodeslot=0x090D, category='lo', description='DEVANAGARI LETTER CANDRA E' },
+ [0x090E] = { unicodeslot=0x090E, category='lo', description='DEVANAGARI LETTER SHORT E' },
+ [0x090F] = { unicodeslot=0x090F, category='lo', description='DEVANAGARI LETTER E' },
+ [0x0910] = { unicodeslot=0x0910, category='lo', description='DEVANAGARI LETTER AI' },
+ [0x0911] = { unicodeslot=0x0911, category='lo', description='DEVANAGARI LETTER CANDRA O' },
+ [0x0912] = { unicodeslot=0x0912, category='lo', description='DEVANAGARI LETTER SHORT O' },
+ [0x0913] = { unicodeslot=0x0913, category='lo', description='DEVANAGARI LETTER O' },
+ [0x0914] = { unicodeslot=0x0914, category='lo', description='DEVANAGARI LETTER AU' },
+ [0x0915] = { unicodeslot=0x0915, category='lo', description='DEVANAGARI LETTER KA' },
+ [0x0916] = { unicodeslot=0x0916, category='lo', description='DEVANAGARI LETTER KHA' },
+ [0x0917] = { unicodeslot=0x0917, category='lo', description='DEVANAGARI LETTER GA' },
+ [0x0918] = { unicodeslot=0x0918, category='lo', description='DEVANAGARI LETTER GHA' },
+ [0x0919] = { unicodeslot=0x0919, category='lo', description='DEVANAGARI LETTER NGA' },
+ [0x091A] = { unicodeslot=0x091A, category='lo', description='DEVANAGARI LETTER CA' },
+ [0x091B] = { unicodeslot=0x091B, category='lo', description='DEVANAGARI LETTER CHA' },
+ [0x091C] = { unicodeslot=0x091C, category='lo', description='DEVANAGARI LETTER JA' },
+ [0x091D] = { unicodeslot=0x091D, category='lo', description='DEVANAGARI LETTER JHA' },
+ [0x091E] = { unicodeslot=0x091E, category='lo', description='DEVANAGARI LETTER NYA' },
+ [0x091F] = { unicodeslot=0x091F, category='lo', description='DEVANAGARI LETTER TTA' },
+ [0x0920] = { unicodeslot=0x0920, category='lo', description='DEVANAGARI LETTER TTHA' },
+ [0x0921] = { unicodeslot=0x0921, category='lo', description='DEVANAGARI LETTER DDA' },
+ [0x0922] = { unicodeslot=0x0922, category='lo', description='DEVANAGARI LETTER DDHA' },
+ [0x0923] = { unicodeslot=0x0923, category='lo', description='DEVANAGARI LETTER NNA' },
+ [0x0924] = { unicodeslot=0x0924, category='lo', description='DEVANAGARI LETTER TA' },
+ [0x0925] = { unicodeslot=0x0925, category='lo', description='DEVANAGARI LETTER THA' },
+ [0x0926] = { unicodeslot=0x0926, category='lo', description='DEVANAGARI LETTER DA' },
+ [0x0927] = { unicodeslot=0x0927, category='lo', description='DEVANAGARI LETTER DHA' },
+ [0x0928] = { unicodeslot=0x0928, category='lo', description='DEVANAGARI LETTER NA' },
+ [0x0929] = { unicodeslot=0x0929, category='lo', description='DEVANAGARI LETTER NNNA', specials={'char',0x0928,0x093C} },
+ [0x092A] = { unicodeslot=0x092A, category='lo', description='DEVANAGARI LETTER PA' },
+ [0x092B] = { unicodeslot=0x092B, category='lo', description='DEVANAGARI LETTER PHA' },
+ [0x092C] = { unicodeslot=0x092C, category='lo', description='DEVANAGARI LETTER BA' },
+ [0x092D] = { unicodeslot=0x092D, category='lo', description='DEVANAGARI LETTER BHA' },
+ [0x092E] = { unicodeslot=0x092E, category='lo', description='DEVANAGARI LETTER MA' },
+ [0x092F] = { unicodeslot=0x092F, category='lo', description='DEVANAGARI LETTER YA' },
+ [0x0930] = { unicodeslot=0x0930, category='lo', description='DEVANAGARI LETTER RA' },
+ [0x0931] = { unicodeslot=0x0931, category='lo', description='DEVANAGARI LETTER RRA', specials={'char',0x0930,0x093C} },
+ [0x0932] = { unicodeslot=0x0932, category='lo', description='DEVANAGARI LETTER LA' },
+ [0x0933] = { unicodeslot=0x0933, category='lo', description='DEVANAGARI LETTER LLA' },
+ [0x0934] = { unicodeslot=0x0934, category='lo', description='DEVANAGARI LETTER LLLA', specials={'char',0x0933,0x093C} },
+ [0x0935] = { unicodeslot=0x0935, category='lo', description='DEVANAGARI LETTER VA' },
+ [0x0936] = { unicodeslot=0x0936, category='lo', description='DEVANAGARI LETTER SHA' },
+ [0x0937] = { unicodeslot=0x0937, category='lo', description='DEVANAGARI LETTER SSA' },
+ [0x0938] = { unicodeslot=0x0938, category='lo', description='DEVANAGARI LETTER SA' },
+ [0x0939] = { unicodeslot=0x0939, category='lo', description='DEVANAGARI LETTER HA' },
+ [0x093C] = { unicodeslot=0x093C, category='mn', description='DEVANAGARI SIGN NUKTA' },
+ [0x093D] = { unicodeslot=0x093D, category='lo', description='DEVANAGARI SIGN AVAGRAHA' },
+ [0x093E] = { unicodeslot=0x093E, category='mc', description='DEVANAGARI VOWEL SIGN AA' },
+ [0x093F] = { unicodeslot=0x093F, category='mc', description='DEVANAGARI VOWEL SIGN I' },
+ [0x0940] = { unicodeslot=0x0940, category='mc', description='DEVANAGARI VOWEL SIGN II' },
+ [0x0941] = { unicodeslot=0x0941, category='mn', description='DEVANAGARI VOWEL SIGN U' },
+ [0x0942] = { unicodeslot=0x0942, category='mn', description='DEVANAGARI VOWEL SIGN UU' },
+ [0x0943] = { unicodeslot=0x0943, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC R' },
+ [0x0944] = { unicodeslot=0x0944, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC RR' },
+ [0x0945] = { unicodeslot=0x0945, category='mn', description='DEVANAGARI VOWEL SIGN CANDRA E' },
+ [0x0946] = { unicodeslot=0x0946, category='mn', description='DEVANAGARI VOWEL SIGN SHORT E' },
+ [0x0947] = { unicodeslot=0x0947, category='mn', description='DEVANAGARI VOWEL SIGN E' },
+ [0x0948] = { unicodeslot=0x0948, category='mn', description='DEVANAGARI VOWEL SIGN AI' },
+ [0x0949] = { unicodeslot=0x0949, category='mc', description='DEVANAGARI VOWEL SIGN CANDRA O' },
+ [0x094A] = { unicodeslot=0x094A, category='mc', description='DEVANAGARI VOWEL SIGN SHORT O' },
+ [0x094B] = { unicodeslot=0x094B, category='mc', description='DEVANAGARI VOWEL SIGN O' },
+ [0x094C] = { unicodeslot=0x094C, category='mc', description='DEVANAGARI VOWEL SIGN AU' },
+ [0x094D] = { unicodeslot=0x094D, category='mn', description='DEVANAGARI SIGN VIRAMA' },
+ [0x0950] = { unicodeslot=0x0950, category='lo', description='DEVANAGARI OM' },
+ [0x0951] = { unicodeslot=0x0951, category='mn', description='DEVANAGARI STRESS SIGN UDATTA' },
+ [0x0952] = { unicodeslot=0x0952, category='mn', description='DEVANAGARI STRESS SIGN ANUDATTA' },
+ [0x0953] = { unicodeslot=0x0953, category='mn', description='DEVANAGARI GRAVE ACCENT' },
+ [0x0954] = { unicodeslot=0x0954, category='mn', description='DEVANAGARI ACUTE ACCENT' },
+ [0x0958] = { unicodeslot=0x0958, category='lo', description='DEVANAGARI LETTER QA', specials={'char',0x0915,0x093C} },
+ [0x0959] = { unicodeslot=0x0959, category='lo', description='DEVANAGARI LETTER KHHA', specials={'char',0x0916,0x093C} },
+ [0x095A] = { unicodeslot=0x095A, category='lo', description='DEVANAGARI LETTER GHHA', specials={'char',0x0917,0x093C} },
+ [0x095B] = { unicodeslot=0x095B, category='lo', description='DEVANAGARI LETTER ZA', specials={'char',0x091C,0x093C} },
+ [0x095C] = { unicodeslot=0x095C, category='lo', description='DEVANAGARI LETTER DDDHA', specials={'char',0x0921,0x093C} },
+ [0x095D] = { unicodeslot=0x095D, category='lo', description='DEVANAGARI LETTER RHA', specials={'char',0x0922,0x093C} },
+ [0x095E] = { unicodeslot=0x095E, category='lo', description='DEVANAGARI LETTER FA', specials={'char',0x092B,0x093C} },
+ [0x095F] = { unicodeslot=0x095F, category='lo', description='DEVANAGARI LETTER YYA', specials={'char',0x092F,0x093C} },
+ [0x0960] = { unicodeslot=0x0960, category='lo', description='DEVANAGARI LETTER VOCALIC RR' },
+ [0x0961] = { unicodeslot=0x0961, category='lo', description='DEVANAGARI LETTER VOCALIC LL' },
+ [0x0962] = { unicodeslot=0x0962, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC L' },
+ [0x0963] = { unicodeslot=0x0963, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC LL' },
+ [0x0964] = { unicodeslot=0x0964, category='po', description='DEVANAGARI DANDA' },
+ [0x0965] = { unicodeslot=0x0965, category='po', description='DEVANAGARI DOUBLE DANDA' },
+ [0x0966] = { unicodeslot=0x0966, category='nd', description='DEVANAGARI DIGIT ZERO' },
+ [0x0967] = { unicodeslot=0x0967, category='nd', description='DEVANAGARI DIGIT ONE' },
+ [0x0968] = { unicodeslot=0x0968, category='nd', description='DEVANAGARI DIGIT TWO' },
+ [0x0969] = { unicodeslot=0x0969, category='nd', description='DEVANAGARI DIGIT THREE' },
+ [0x096A] = { unicodeslot=0x096A, category='nd', description='DEVANAGARI DIGIT FOUR' },
+ [0x096B] = { unicodeslot=0x096B, category='nd', description='DEVANAGARI DIGIT FIVE' },
+ [0x096C] = { unicodeslot=0x096C, category='nd', description='DEVANAGARI DIGIT SIX' },
+ [0x096D] = { unicodeslot=0x096D, category='nd', description='DEVANAGARI DIGIT SEVEN' },
+ [0x096E] = { unicodeslot=0x096E, category='nd', description='DEVANAGARI DIGIT EIGHT' },
+ [0x096F] = { unicodeslot=0x096F, category='nd', description='DEVANAGARI DIGIT NINE' },
+ [0x0970] = { unicodeslot=0x0970, category='po', description='DEVANAGARI ABBREVIATION SIGN' },
+ [0x097B] = { unicodeslot=0x097B, category='lo', description='DEVANAGARI LETTER GGA' },
+ [0x097C] = { unicodeslot=0x097C, category='lo', description='DEVANAGARI LETTER JJA' },
+ [0x097D] = { unicodeslot=0x097D, category='lo', description='DEVANAGARI LETTER GLOTTAL STOP' },
+ [0x097E] = { unicodeslot=0x097E, category='lo', description='DEVANAGARI LETTER DDDA' },
+ [0x097F] = { unicodeslot=0x097F, category='lo', description='DEVANAGARI LETTER BBA' },
+ [0x0981] = { unicodeslot=0x0981, category='mn', description='BENGALI SIGN CANDRABINDU' },
+ [0x0982] = { unicodeslot=0x0982, category='mc', description='BENGALI SIGN ANUSVARA' },
+ [0x0983] = { unicodeslot=0x0983, category='mc', description='BENGALI SIGN VISARGA' },
+ [0x0985] = { unicodeslot=0x0985, category='lo', description='BENGALI LETTER A' },
+ [0x0986] = { unicodeslot=0x0986, category='lo', description='BENGALI LETTER AA' },
+ [0x0987] = { unicodeslot=0x0987, category='lo', description='BENGALI LETTER I' },
+ [0x0988] = { unicodeslot=0x0988, category='lo', description='BENGALI LETTER II' },
+ [0x0989] = { unicodeslot=0x0989, category='lo', description='BENGALI LETTER U' },
+ [0x098A] = { unicodeslot=0x098A, category='lo', description='BENGALI LETTER UU' },
+ [0x098B] = { unicodeslot=0x098B, category='lo', description='BENGALI LETTER VOCALIC R' },
+ [0x098C] = { unicodeslot=0x098C, category='lo', description='BENGALI LETTER VOCALIC L' },
+ [0x098F] = { unicodeslot=0x098F, category='lo', description='BENGALI LETTER E' },
+ [0x0990] = { unicodeslot=0x0990, category='lo', description='BENGALI LETTER AI' },
+ [0x0993] = { unicodeslot=0x0993, category='lo', description='BENGALI LETTER O' },
+ [0x0994] = { unicodeslot=0x0994, category='lo', description='BENGALI LETTER AU' },
+ [0x0995] = { unicodeslot=0x0995, category='lo', description='BENGALI LETTER KA' },
+ [0x0996] = { unicodeslot=0x0996, category='lo', description='BENGALI LETTER KHA' },
+ [0x0997] = { unicodeslot=0x0997, category='lo', description='BENGALI LETTER GA' },
+ [0x0998] = { unicodeslot=0x0998, category='lo', description='BENGALI LETTER GHA' },
+ [0x0999] = { unicodeslot=0x0999, category='lo', description='BENGALI LETTER NGA' },
+ [0x099A] = { unicodeslot=0x099A, category='lo', description='BENGALI LETTER CA' },
+ [0x099B] = { unicodeslot=0x099B, category='lo', description='BENGALI LETTER CHA' },
+ [0x099C] = { unicodeslot=0x099C, category='lo', description='BENGALI LETTER JA' },
+ [0x099D] = { unicodeslot=0x099D, category='lo', description='BENGALI LETTER JHA' },
+ [0x099E] = { unicodeslot=0x099E, category='lo', description='BENGALI LETTER NYA' },
+ [0x099F] = { unicodeslot=0x099F, category='lo', description='BENGALI LETTER TTA' },
+ [0x09A0] = { unicodeslot=0x09A0, category='lo', description='BENGALI LETTER TTHA' },
+ [0x09A1] = { unicodeslot=0x09A1, category='lo', description='BENGALI LETTER DDA' },
+ [0x09A2] = { unicodeslot=0x09A2, category='lo', description='BENGALI LETTER DDHA' },
+ [0x09A3] = { unicodeslot=0x09A3, category='lo', description='BENGALI LETTER NNA' },
+ [0x09A4] = { unicodeslot=0x09A4, category='lo', description='BENGALI LETTER TA' },
+ [0x09A5] = { unicodeslot=0x09A5, category='lo', description='BENGALI LETTER THA' },
+ [0x09A6] = { unicodeslot=0x09A6, category='lo', description='BENGALI LETTER DA' },
+ [0x09A7] = { unicodeslot=0x09A7, category='lo', description='BENGALI LETTER DHA' },
+ [0x09A8] = { unicodeslot=0x09A8, category='lo', description='BENGALI LETTER NA' },
+ [0x09AA] = { unicodeslot=0x09AA, category='lo', description='BENGALI LETTER PA' },
+ [0x09AB] = { unicodeslot=0x09AB, category='lo', description='BENGALI LETTER PHA' },
+ [0x09AC] = { unicodeslot=0x09AC, category='lo', description='BENGALI LETTER BA' },
+ [0x09AD] = { unicodeslot=0x09AD, category='lo', description='BENGALI LETTER BHA' },
+ [0x09AE] = { unicodeslot=0x09AE, category='lo', description='BENGALI LETTER MA' },
+ [0x09AF] = { unicodeslot=0x09AF, category='lo', description='BENGALI LETTER YA' },
+ [0x09B0] = { unicodeslot=0x09B0, category='lo', description='BENGALI LETTER RA' },
+ [0x09B2] = { unicodeslot=0x09B2, category='lo', description='BENGALI LETTER LA' },
+ [0x09B6] = { unicodeslot=0x09B6, category='lo', description='BENGALI LETTER SHA' },
+ [0x09B7] = { unicodeslot=0x09B7, category='lo', description='BENGALI LETTER SSA' },
+ [0x09B8] = { unicodeslot=0x09B8, category='lo', description='BENGALI LETTER SA' },
+ [0x09B9] = { unicodeslot=0x09B9, category='lo', description='BENGALI LETTER HA' },
+ [0x09BC] = { unicodeslot=0x09BC, category='mn', description='BENGALI SIGN NUKTA' },
+ [0x09BD] = { unicodeslot=0x09BD, category='lo', description='BENGALI SIGN AVAGRAHA' },
+ [0x09BE] = { unicodeslot=0x09BE, category='mc', description='BENGALI VOWEL SIGN AA' },
+ [0x09BF] = { unicodeslot=0x09BF, category='mc', description='BENGALI VOWEL SIGN I' },
+ [0x09C0] = { unicodeslot=0x09C0, category='mc', description='BENGALI VOWEL SIGN II' },
+ [0x09C1] = { unicodeslot=0x09C1, category='mn', description='BENGALI VOWEL SIGN U' },
+ [0x09C2] = { unicodeslot=0x09C2, category='mn', description='BENGALI VOWEL SIGN UU' },
+ [0x09C3] = { unicodeslot=0x09C3, category='mn', description='BENGALI VOWEL SIGN VOCALIC R' },
+ [0x09C4] = { unicodeslot=0x09C4, category='mn', description='BENGALI VOWEL SIGN VOCALIC RR' },
+ [0x09C7] = { unicodeslot=0x09C7, category='mc', description='BENGALI VOWEL SIGN E' },
+ [0x09C8] = { unicodeslot=0x09C8, category='mc', description='BENGALI VOWEL SIGN AI' },
+ [0x09CB] = { unicodeslot=0x09CB, category='mc', description='BENGALI VOWEL SIGN O', specials={'char',0x09C7,0x09BE} },
+ [0x09CC] = { unicodeslot=0x09CC, category='mc', description='BENGALI VOWEL SIGN AU', specials={'char',0x09C7,0x09D7} },
+ [0x09CD] = { unicodeslot=0x09CD, category='mn', description='BENGALI SIGN VIRAMA' },
+ [0x09CE] = { unicodeslot=0x09CE, category='lo', description='BENGALI LETTER KHANDA TA' },
+ [0x09D7] = { unicodeslot=0x09D7, category='mc', description='BENGALI AU LENGTH MARK' },
+ [0x09DC] = { unicodeslot=0x09DC, category='lo', description='BENGALI LETTER RRA', specials={'char',0x09A1,0x09BC} },
+ [0x09DD] = { unicodeslot=0x09DD, category='lo', description='BENGALI LETTER RHA', specials={'char',0x09A2,0x09BC} },
+ [0x09DF] = { unicodeslot=0x09DF, category='lo', description='BENGALI LETTER YYA', specials={'char',0x09AF,0x09BC} },
+ [0x09E0] = { unicodeslot=0x09E0, category='lo', description='BENGALI LETTER VOCALIC RR' },
+ [0x09E1] = { unicodeslot=0x09E1, category='lo', description='BENGALI LETTER VOCALIC LL' },
+ [0x09E2] = { unicodeslot=0x09E2, category='mn', description='BENGALI VOWEL SIGN VOCALIC L' },
+ [0x09E3] = { unicodeslot=0x09E3, category='mn', description='BENGALI VOWEL SIGN VOCALIC LL' },
+ [0x09E6] = { unicodeslot=0x09E6, category='nd', description='BENGALI DIGIT ZERO' },
+ [0x09E7] = { unicodeslot=0x09E7, category='nd', description='BENGALI DIGIT ONE' },
+ [0x09E8] = { unicodeslot=0x09E8, category='nd', description='BENGALI DIGIT TWO' },
+ [0x09E9] = { unicodeslot=0x09E9, category='nd', description='BENGALI DIGIT THREE' },
+ [0x09EA] = { unicodeslot=0x09EA, category='nd', description='BENGALI DIGIT FOUR' },
+ [0x09EB] = { unicodeslot=0x09EB, category='nd', description='BENGALI DIGIT FIVE' },
+ [0x09EC] = { unicodeslot=0x09EC, category='nd', description='BENGALI DIGIT SIX' },
+ [0x09ED] = { unicodeslot=0x09ED, category='nd', description='BENGALI DIGIT SEVEN' },
+ [0x09EE] = { unicodeslot=0x09EE, category='nd', description='BENGALI DIGIT EIGHT' },
+ [0x09EF] = { unicodeslot=0x09EF, category='nd', description='BENGALI DIGIT NINE' },
+ [0x09F0] = { unicodeslot=0x09F0, category='lo', description='BENGALI LETTER RA WITH MIDDLE DIAGONAL', shcode=0x09B0 },
+ [0x09F1] = { unicodeslot=0x09F1, category='lo', description='BENGALI LETTER RA WITH LOWER DIAGONAL', shcode=0x09B0 },
+ [0x09F2] = { unicodeslot=0x09F2, category='sc', description='BENGALI RUPEE MARK' },
+ [0x09F3] = { unicodeslot=0x09F3, category='sc', description='BENGALI RUPEE SIGN' },
+ [0x09F4] = { unicodeslot=0x09F4, category='no', description='BENGALI CURRENCY NUMERATOR ONE' },
+ [0x09F5] = { unicodeslot=0x09F5, category='no', description='BENGALI CURRENCY NUMERATOR TWO' },
+ [0x09F6] = { unicodeslot=0x09F6, category='no', description='BENGALI CURRENCY NUMERATOR THREE' },
+ [0x09F7] = { unicodeslot=0x09F7, category='no', description='BENGALI CURRENCY NUMERATOR FOUR' },
+ [0x09F8] = { unicodeslot=0x09F8, category='no', description='BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR' },
+ [0x09F9] = { unicodeslot=0x09F9, category='no', description='BENGALI CURRENCY DENOMINATOR SIXTEEN' },
+ [0x09FA] = { unicodeslot=0x09FA, category='so', description='BENGALI ISSHAR' },
+ [0x0A01] = { unicodeslot=0x0A01, category='mn', description='GURMUKHI SIGN ADAK BINDI' },
+ [0x0A02] = { unicodeslot=0x0A02, category='mn', description='GURMUKHI SIGN BINDI' },
+ [0x0A03] = { unicodeslot=0x0A03, category='mc', description='GURMUKHI SIGN VISARGA' },
+ [0x0A05] = { unicodeslot=0x0A05, category='lo', description='GURMUKHI LETTER A' },
+ [0x0A06] = { unicodeslot=0x0A06, category='lo', description='GURMUKHI LETTER AA' },
+ [0x0A07] = { unicodeslot=0x0A07, category='lo', description='GURMUKHI LETTER I' },
+ [0x0A08] = { unicodeslot=0x0A08, category='lo', description='GURMUKHI LETTER II' },
+ [0x0A09] = { unicodeslot=0x0A09, category='lo', description='GURMUKHI LETTER U' },
+ [0x0A0A] = { unicodeslot=0x0A0A, category='lo', description='GURMUKHI LETTER UU' },
+ [0x0A0F] = { unicodeslot=0x0A0F, category='lo', description='GURMUKHI LETTER EE' },
+ [0x0A10] = { unicodeslot=0x0A10, category='lo', description='GURMUKHI LETTER AI' },
+ [0x0A13] = { unicodeslot=0x0A13, category='lo', description='GURMUKHI LETTER OO' },
+ [0x0A14] = { unicodeslot=0x0A14, category='lo', description='GURMUKHI LETTER AU' },
+ [0x0A15] = { unicodeslot=0x0A15, category='lo', description='GURMUKHI LETTER KA' },
+ [0x0A16] = { unicodeslot=0x0A16, category='lo', description='GURMUKHI LETTER KHA' },
+ [0x0A17] = { unicodeslot=0x0A17, category='lo', description='GURMUKHI LETTER GA' },
+ [0x0A18] = { unicodeslot=0x0A18, category='lo', description='GURMUKHI LETTER GHA' },
+ [0x0A19] = { unicodeslot=0x0A19, category='lo', description='GURMUKHI LETTER NGA' },
+ [0x0A1A] = { unicodeslot=0x0A1A, category='lo', description='GURMUKHI LETTER CA' },
+ [0x0A1B] = { unicodeslot=0x0A1B, category='lo', description='GURMUKHI LETTER CHA' },
+ [0x0A1C] = { unicodeslot=0x0A1C, category='lo', description='GURMUKHI LETTER JA' },
+ [0x0A1D] = { unicodeslot=0x0A1D, category='lo', description='GURMUKHI LETTER JHA' },
+ [0x0A1E] = { unicodeslot=0x0A1E, category='lo', description='GURMUKHI LETTER NYA' },
+ [0x0A1F] = { unicodeslot=0x0A1F, category='lo', description='GURMUKHI LETTER TTA' },
+ [0x0A20] = { unicodeslot=0x0A20, category='lo', description='GURMUKHI LETTER TTHA' },
+ [0x0A21] = { unicodeslot=0x0A21, category='lo', description='GURMUKHI LETTER DDA' },
+ [0x0A22] = { unicodeslot=0x0A22, category='lo', description='GURMUKHI LETTER DDHA' },
+ [0x0A23] = { unicodeslot=0x0A23, category='lo', description='GURMUKHI LETTER NNA' },
+ [0x0A24] = { unicodeslot=0x0A24, category='lo', description='GURMUKHI LETTER TA' },
+ [0x0A25] = { unicodeslot=0x0A25, category='lo', description='GURMUKHI LETTER THA' },
+ [0x0A26] = { unicodeslot=0x0A26, category='lo', description='GURMUKHI LETTER DA' },
+ [0x0A27] = { unicodeslot=0x0A27, category='lo', description='GURMUKHI LETTER DHA' },
+ [0x0A28] = { unicodeslot=0x0A28, category='lo', description='GURMUKHI LETTER NA' },
+ [0x0A2A] = { unicodeslot=0x0A2A, category='lo', description='GURMUKHI LETTER PA' },
+ [0x0A2B] = { unicodeslot=0x0A2B, category='lo', description='GURMUKHI LETTER PHA' },
+ [0x0A2C] = { unicodeslot=0x0A2C, category='lo', description='GURMUKHI LETTER BA' },
+ [0x0A2D] = { unicodeslot=0x0A2D, category='lo', description='GURMUKHI LETTER BHA' },
+ [0x0A2E] = { unicodeslot=0x0A2E, category='lo', description='GURMUKHI LETTER MA' },
+ [0x0A2F] = { unicodeslot=0x0A2F, category='lo', description='GURMUKHI LETTER YA' },
+ [0x0A30] = { unicodeslot=0x0A30, category='lo', description='GURMUKHI LETTER RA' },
+ [0x0A32] = { unicodeslot=0x0A32, category='lo', description='GURMUKHI LETTER LA' },
+ [0x0A33] = { unicodeslot=0x0A33, category='lo', description='GURMUKHI LETTER LLA', specials={'char',0x0A32,0x0A3C} },
+ [0x0A35] = { unicodeslot=0x0A35, category='lo', description='GURMUKHI LETTER VA' },
+ [0x0A36] = { unicodeslot=0x0A36, category='lo', description='GURMUKHI LETTER SHA', specials={'char',0x0A38,0x0A3C} },
+ [0x0A38] = { unicodeslot=0x0A38, category='lo', description='GURMUKHI LETTER SA' },
+ [0x0A39] = { unicodeslot=0x0A39, category='lo', description='GURMUKHI LETTER HA' },
+ [0x0A3C] = { unicodeslot=0x0A3C, category='mn', description='GURMUKHI SIGN NUKTA' },
+ [0x0A3E] = { unicodeslot=0x0A3E, category='mc', description='GURMUKHI VOWEL SIGN AA' },
+ [0x0A3F] = { unicodeslot=0x0A3F, category='mc', description='GURMUKHI VOWEL SIGN I' },
+ [0x0A40] = { unicodeslot=0x0A40, category='mc', description='GURMUKHI VOWEL SIGN II' },
+ [0x0A41] = { unicodeslot=0x0A41, category='mn', description='GURMUKHI VOWEL SIGN U' },
+ [0x0A42] = { unicodeslot=0x0A42, category='mn', description='GURMUKHI VOWEL SIGN UU' },
+ [0x0A47] = { unicodeslot=0x0A47, category='mn', description='GURMUKHI VOWEL SIGN EE' },
+ [0x0A48] = { unicodeslot=0x0A48, category='mn', description='GURMUKHI VOWEL SIGN AI' },
+ [0x0A4B] = { unicodeslot=0x0A4B, category='mn', description='GURMUKHI VOWEL SIGN OO' },
+ [0x0A4C] = { unicodeslot=0x0A4C, category='mn', description='GURMUKHI VOWEL SIGN AU' },
+ [0x0A4D] = { unicodeslot=0x0A4D, category='mn', description='GURMUKHI SIGN VIRAMA' },
+ [0x0A59] = { unicodeslot=0x0A59, category='lo', description='GURMUKHI LETTER KHHA', specials={'char',0x0A16,0x0A3C} },
+ [0x0A5A] = { unicodeslot=0x0A5A, category='lo', description='GURMUKHI LETTER GHHA', specials={'char',0x0A17,0x0A3C} },
+ [0x0A5B] = { unicodeslot=0x0A5B, category='lo', description='GURMUKHI LETTER ZA', specials={'char',0x0A1C,0x0A3C} },
+ [0x0A5C] = { unicodeslot=0x0A5C, category='lo', description='GURMUKHI LETTER RRA' },
+ [0x0A5E] = { unicodeslot=0x0A5E, category='lo', description='GURMUKHI LETTER FA', specials={'char',0x0A2B,0x0A3C} },
+ [0x0A66] = { unicodeslot=0x0A66, category='nd', description='GURMUKHI DIGIT ZERO' },
+ [0x0A67] = { unicodeslot=0x0A67, category='nd', description='GURMUKHI DIGIT ONE' },
+ [0x0A68] = { unicodeslot=0x0A68, category='nd', description='GURMUKHI DIGIT TWO' },
+ [0x0A69] = { unicodeslot=0x0A69, category='nd', description='GURMUKHI DIGIT THREE' },
+ [0x0A6A] = { unicodeslot=0x0A6A, category='nd', description='GURMUKHI DIGIT FOUR' },
+ [0x0A6B] = { unicodeslot=0x0A6B, category='nd', description='GURMUKHI DIGIT FIVE' },
+ [0x0A6C] = { unicodeslot=0x0A6C, category='nd', description='GURMUKHI DIGIT SIX' },
+ [0x0A6D] = { unicodeslot=0x0A6D, category='nd', description='GURMUKHI DIGIT SEVEN' },
+ [0x0A6E] = { unicodeslot=0x0A6E, category='nd', description='GURMUKHI DIGIT EIGHT' },
+ [0x0A6F] = { unicodeslot=0x0A6F, category='nd', description='GURMUKHI DIGIT NINE' },
+ [0x0A70] = { unicodeslot=0x0A70, category='mn', description='GURMUKHI TIPPI' },
+ [0x0A71] = { unicodeslot=0x0A71, category='mn', description='GURMUKHI ADDAK' },
+ [0x0A72] = { unicodeslot=0x0A72, category='lo', description='GURMUKHI IRI' },
+ [0x0A73] = { unicodeslot=0x0A73, category='lo', description='GURMUKHI URA' },
+ [0x0A74] = { unicodeslot=0x0A74, category='lo', description='GURMUKHI EK ONKAR' },
+ [0x0A81] = { unicodeslot=0x0A81, category='mn', description='GUJARATI SIGN CANDRABINDU' },
+ [0x0A82] = { unicodeslot=0x0A82, category='mn', description='GUJARATI SIGN ANUSVARA' },
+ [0x0A83] = { unicodeslot=0x0A83, category='mc', description='GUJARATI SIGN VISARGA' },
+ [0x0A85] = { unicodeslot=0x0A85, category='lo', description='GUJARATI LETTER A' },
+ [0x0A86] = { unicodeslot=0x0A86, category='lo', description='GUJARATI LETTER AA' },
+ [0x0A87] = { unicodeslot=0x0A87, category='lo', description='GUJARATI LETTER I' },
+ [0x0A88] = { unicodeslot=0x0A88, category='lo', description='GUJARATI LETTER II' },
+ [0x0A89] = { unicodeslot=0x0A89, category='lo', description='GUJARATI LETTER U' },
+ [0x0A8A] = { unicodeslot=0x0A8A, category='lo', description='GUJARATI LETTER UU' },
+ [0x0A8B] = { unicodeslot=0x0A8B, category='lo', description='GUJARATI LETTER VOCALIC R' },
+ [0x0A8C] = { unicodeslot=0x0A8C, category='lo', description='GUJARATI LETTER VOCALIC L' },
+ [0x0A8D] = { unicodeslot=0x0A8D, category='lo', description='GUJARATI VOWEL CANDRA E' },
+ [0x0A8F] = { unicodeslot=0x0A8F, category='lo', description='GUJARATI LETTER E' },
+ [0x0A90] = { unicodeslot=0x0A90, category='lo', description='GUJARATI LETTER AI' },
+ [0x0A91] = { unicodeslot=0x0A91, category='lo', description='GUJARATI VOWEL CANDRA O' },
+ [0x0A93] = { unicodeslot=0x0A93, category='lo', description='GUJARATI LETTER O' },
+ [0x0A94] = { unicodeslot=0x0A94, category='lo', description='GUJARATI LETTER AU' },
+ [0x0A95] = { unicodeslot=0x0A95, category='lo', description='GUJARATI LETTER KA' },
+ [0x0A96] = { unicodeslot=0x0A96, category='lo', description='GUJARATI LETTER KHA' },
+ [0x0A97] = { unicodeslot=0x0A97, category='lo', description='GUJARATI LETTER GA' },
+ [0x0A98] = { unicodeslot=0x0A98, category='lo', description='GUJARATI LETTER GHA' },
+ [0x0A99] = { unicodeslot=0x0A99, category='lo', description='GUJARATI LETTER NGA' },
+ [0x0A9A] = { unicodeslot=0x0A9A, category='lo', description='GUJARATI LETTER CA' },
+ [0x0A9B] = { unicodeslot=0x0A9B, category='lo', description='GUJARATI LETTER CHA' },
+ [0x0A9C] = { unicodeslot=0x0A9C, category='lo', description='GUJARATI LETTER JA' },
+ [0x0A9D] = { unicodeslot=0x0A9D, category='lo', description='GUJARATI LETTER JHA' },
+ [0x0A9E] = { unicodeslot=0x0A9E, category='lo', description='GUJARATI LETTER NYA' },
+ [0x0A9F] = { unicodeslot=0x0A9F, category='lo', description='GUJARATI LETTER TTA' },
+ [0x0AA0] = { unicodeslot=0x0AA0, category='lo', description='GUJARATI LETTER TTHA' },
+ [0x0AA1] = { unicodeslot=0x0AA1, category='lo', description='GUJARATI LETTER DDA' },
+ [0x0AA2] = { unicodeslot=0x0AA2, category='lo', description='GUJARATI LETTER DDHA' },
+ [0x0AA3] = { unicodeslot=0x0AA3, category='lo', description='GUJARATI LETTER NNA' },
+ [0x0AA4] = { unicodeslot=0x0AA4, category='lo', description='GUJARATI LETTER TA' },
+ [0x0AA5] = { unicodeslot=0x0AA5, category='lo', description='GUJARATI LETTER THA' },
+ [0x0AA6] = { unicodeslot=0x0AA6, category='lo', description='GUJARATI LETTER DA' },
+ [0x0AA7] = { unicodeslot=0x0AA7, category='lo', description='GUJARATI LETTER DHA' },
+ [0x0AA8] = { unicodeslot=0x0AA8, category='lo', description='GUJARATI LETTER NA' },
+ [0x0AAA] = { unicodeslot=0x0AAA, category='lo', description='GUJARATI LETTER PA' },
+ [0x0AAB] = { unicodeslot=0x0AAB, category='lo', description='GUJARATI LETTER PHA' },
+ [0x0AAC] = { unicodeslot=0x0AAC, category='lo', description='GUJARATI LETTER BA' },
+ [0x0AAD] = { unicodeslot=0x0AAD, category='lo', description='GUJARATI LETTER BHA' },
+ [0x0AAE] = { unicodeslot=0x0AAE, category='lo', description='GUJARATI LETTER MA' },
+ [0x0AAF] = { unicodeslot=0x0AAF, category='lo', description='GUJARATI LETTER YA' },
+ [0x0AB0] = { unicodeslot=0x0AB0, category='lo', description='GUJARATI LETTER RA' },
+ [0x0AB2] = { unicodeslot=0x0AB2, category='lo', description='GUJARATI LETTER LA' },
+ [0x0AB3] = { unicodeslot=0x0AB3, category='lo', description='GUJARATI LETTER LLA' },
+ [0x0AB5] = { unicodeslot=0x0AB5, category='lo', description='GUJARATI LETTER VA' },
+ [0x0AB6] = { unicodeslot=0x0AB6, category='lo', description='GUJARATI LETTER SHA' },
+ [0x0AB7] = { unicodeslot=0x0AB7, category='lo', description='GUJARATI LETTER SSA' },
+ [0x0AB8] = { unicodeslot=0x0AB8, category='lo', description='GUJARATI LETTER SA' },
+ [0x0AB9] = { unicodeslot=0x0AB9, category='lo', description='GUJARATI LETTER HA' },
+ [0x0ABC] = { unicodeslot=0x0ABC, category='mn', description='GUJARATI SIGN NUKTA' },
+ [0x0ABD] = { unicodeslot=0x0ABD, category='lo', description='GUJARATI SIGN AVAGRAHA' },
+ [0x0ABE] = { unicodeslot=0x0ABE, category='mc', description='GUJARATI VOWEL SIGN AA' },
+ [0x0ABF] = { unicodeslot=0x0ABF, category='mc', description='GUJARATI VOWEL SIGN I' },
+ [0x0AC0] = { unicodeslot=0x0AC0, category='mc', description='GUJARATI VOWEL SIGN II' },
+ [0x0AC1] = { unicodeslot=0x0AC1, category='mn', description='GUJARATI VOWEL SIGN U' },
+ [0x0AC2] = { unicodeslot=0x0AC2, category='mn', description='GUJARATI VOWEL SIGN UU' },
+ [0x0AC3] = { unicodeslot=0x0AC3, category='mn', description='GUJARATI VOWEL SIGN VOCALIC R' },
+ [0x0AC4] = { unicodeslot=0x0AC4, category='mn', description='GUJARATI VOWEL SIGN VOCALIC RR' },
+ [0x0AC5] = { unicodeslot=0x0AC5, category='mn', description='GUJARATI VOWEL SIGN CANDRA E' },
+ [0x0AC7] = { unicodeslot=0x0AC7, category='mn', description='GUJARATI VOWEL SIGN E' },
+ [0x0AC8] = { unicodeslot=0x0AC8, category='mn', description='GUJARATI VOWEL SIGN AI' },
+ [0x0AC9] = { unicodeslot=0x0AC9, category='mc', description='GUJARATI VOWEL SIGN CANDRA O' },
+ [0x0ACB] = { unicodeslot=0x0ACB, category='mc', description='GUJARATI VOWEL SIGN O' },
+ [0x0ACC] = { unicodeslot=0x0ACC, category='mc', description='GUJARATI VOWEL SIGN AU' },
+ [0x0ACD] = { unicodeslot=0x0ACD, category='mn', description='GUJARATI SIGN VIRAMA' },
+ [0x0AD0] = { unicodeslot=0x0AD0, category='lo', description='GUJARATI OM' },
+ [0x0AE0] = { unicodeslot=0x0AE0, category='lo', description='GUJARATI LETTER VOCALIC RR' },
+ [0x0AE1] = { unicodeslot=0x0AE1, category='lo', description='GUJARATI LETTER VOCALIC LL' },
+ [0x0AE2] = { unicodeslot=0x0AE2, category='mn', description='GUJARATI VOWEL SIGN VOCALIC L' },
+ [0x0AE3] = { unicodeslot=0x0AE3, category='mn', description='GUJARATI VOWEL SIGN VOCALIC LL' },
+ [0x0AE6] = { unicodeslot=0x0AE6, category='nd', description='GUJARATI DIGIT ZERO' },
+ [0x0AE7] = { unicodeslot=0x0AE7, category='nd', description='GUJARATI DIGIT ONE' },
+ [0x0AE8] = { unicodeslot=0x0AE8, category='nd', description='GUJARATI DIGIT TWO' },
+ [0x0AE9] = { unicodeslot=0x0AE9, category='nd', description='GUJARATI DIGIT THREE' },
+ [0x0AEA] = { unicodeslot=0x0AEA, category='nd', description='GUJARATI DIGIT FOUR' },
+ [0x0AEB] = { unicodeslot=0x0AEB, category='nd', description='GUJARATI DIGIT FIVE' },
+ [0x0AEC] = { unicodeslot=0x0AEC, category='nd', description='GUJARATI DIGIT SIX' },
+ [0x0AED] = { unicodeslot=0x0AED, category='nd', description='GUJARATI DIGIT SEVEN' },
+ [0x0AEE] = { unicodeslot=0x0AEE, category='nd', description='GUJARATI DIGIT EIGHT' },
+ [0x0AEF] = { unicodeslot=0x0AEF, category='nd', description='GUJARATI DIGIT NINE' },
+ [0x0AF1] = { unicodeslot=0x0AF1, category='sc', description='GUJARATI RUPEE SIGN' },
+ [0x0B01] = { unicodeslot=0x0B01, category='mn', description='ORIYA SIGN CANDRABINDU' },
+ [0x0B02] = { unicodeslot=0x0B02, category='mc', description='ORIYA SIGN ANUSVARA' },
+ [0x0B03] = { unicodeslot=0x0B03, category='mc', description='ORIYA SIGN VISARGA' },
+ [0x0B05] = { unicodeslot=0x0B05, category='lo', description='ORIYA LETTER A' },
+ [0x0B06] = { unicodeslot=0x0B06, category='lo', description='ORIYA LETTER AA' },
+ [0x0B07] = { unicodeslot=0x0B07, category='lo', description='ORIYA LETTER I' },
+ [0x0B08] = { unicodeslot=0x0B08, category='lo', description='ORIYA LETTER II' },
+ [0x0B09] = { unicodeslot=0x0B09, category='lo', description='ORIYA LETTER U' },
+ [0x0B0A] = { unicodeslot=0x0B0A, category='lo', description='ORIYA LETTER UU' },
+ [0x0B0B] = { unicodeslot=0x0B0B, category='lo', description='ORIYA LETTER VOCALIC R' },
+ [0x0B0C] = { unicodeslot=0x0B0C, category='lo', description='ORIYA LETTER VOCALIC L' },
+ [0x0B0F] = { unicodeslot=0x0B0F, category='lo', description='ORIYA LETTER E' },
+ [0x0B10] = { unicodeslot=0x0B10, category='lo', description='ORIYA LETTER AI' },
+ [0x0B13] = { unicodeslot=0x0B13, category='lo', description='ORIYA LETTER O' },
+ [0x0B14] = { unicodeslot=0x0B14, category='lo', description='ORIYA LETTER AU' },
+ [0x0B15] = { unicodeslot=0x0B15, category='lo', description='ORIYA LETTER KA' },
+ [0x0B16] = { unicodeslot=0x0B16, category='lo', description='ORIYA LETTER KHA' },
+ [0x0B17] = { unicodeslot=0x0B17, category='lo', description='ORIYA LETTER GA' },
+ [0x0B18] = { unicodeslot=0x0B18, category='lo', description='ORIYA LETTER GHA' },
+ [0x0B19] = { unicodeslot=0x0B19, category='lo', description='ORIYA LETTER NGA' },
+ [0x0B1A] = { unicodeslot=0x0B1A, category='lo', description='ORIYA LETTER CA' },
+ [0x0B1B] = { unicodeslot=0x0B1B, category='lo', description='ORIYA LETTER CHA' },
+ [0x0B1C] = { unicodeslot=0x0B1C, category='lo', description='ORIYA LETTER JA' },
+ [0x0B1D] = { unicodeslot=0x0B1D, category='lo', description='ORIYA LETTER JHA' },
+ [0x0B1E] = { unicodeslot=0x0B1E, category='lo', description='ORIYA LETTER NYA' },
+ [0x0B1F] = { unicodeslot=0x0B1F, category='lo', description='ORIYA LETTER TTA' },
+ [0x0B20] = { unicodeslot=0x0B20, category='lo', description='ORIYA LETTER TTHA' },
+ [0x0B21] = { unicodeslot=0x0B21, category='lo', description='ORIYA LETTER DDA' },
+ [0x0B22] = { unicodeslot=0x0B22, category='lo', description='ORIYA LETTER DDHA' },
+ [0x0B23] = { unicodeslot=0x0B23, category='lo', description='ORIYA LETTER NNA' },
+ [0x0B24] = { unicodeslot=0x0B24, category='lo', description='ORIYA LETTER TA' },
+ [0x0B25] = { unicodeslot=0x0B25, category='lo', description='ORIYA LETTER THA' },
+ [0x0B26] = { unicodeslot=0x0B26, category='lo', description='ORIYA LETTER DA' },
+ [0x0B27] = { unicodeslot=0x0B27, category='lo', description='ORIYA LETTER DHA' },
+ [0x0B28] = { unicodeslot=0x0B28, category='lo', description='ORIYA LETTER NA' },
+ [0x0B2A] = { unicodeslot=0x0B2A, category='lo', description='ORIYA LETTER PA' },
+ [0x0B2B] = { unicodeslot=0x0B2B, category='lo', description='ORIYA LETTER PHA' },
+ [0x0B2C] = { unicodeslot=0x0B2C, category='lo', description='ORIYA LETTER BA' },
+ [0x0B2D] = { unicodeslot=0x0B2D, category='lo', description='ORIYA LETTER BHA' },
+ [0x0B2E] = { unicodeslot=0x0B2E, category='lo', description='ORIYA LETTER MA' },
+ [0x0B2F] = { unicodeslot=0x0B2F, category='lo', description='ORIYA LETTER YA' },
+ [0x0B30] = { unicodeslot=0x0B30, category='lo', description='ORIYA LETTER RA' },
+ [0x0B32] = { unicodeslot=0x0B32, category='lo', description='ORIYA LETTER LA' },
+ [0x0B33] = { unicodeslot=0x0B33, category='lo', description='ORIYA LETTER LLA' },
+ [0x0B35] = { unicodeslot=0x0B35, category='lo', description='ORIYA LETTER VA' },
+ [0x0B36] = { unicodeslot=0x0B36, category='lo', description='ORIYA LETTER SHA' },
+ [0x0B37] = { unicodeslot=0x0B37, category='lo', description='ORIYA LETTER SSA' },
+ [0x0B38] = { unicodeslot=0x0B38, category='lo', description='ORIYA LETTER SA' },
+ [0x0B39] = { unicodeslot=0x0B39, category='lo', description='ORIYA LETTER HA' },
+ [0x0B3C] = { unicodeslot=0x0B3C, category='mn', description='ORIYA SIGN NUKTA' },
+ [0x0B3D] = { unicodeslot=0x0B3D, category='lo', description='ORIYA SIGN AVAGRAHA' },
+ [0x0B3E] = { unicodeslot=0x0B3E, category='mc', description='ORIYA VOWEL SIGN AA' },
+ [0x0B3F] = { unicodeslot=0x0B3F, category='mn', description='ORIYA VOWEL SIGN I' },
+ [0x0B40] = { unicodeslot=0x0B40, category='mc', description='ORIYA VOWEL SIGN II' },
+ [0x0B41] = { unicodeslot=0x0B41, category='mn', description='ORIYA VOWEL SIGN U' },
+ [0x0B42] = { unicodeslot=0x0B42, category='mn', description='ORIYA VOWEL SIGN UU' },
+ [0x0B43] = { unicodeslot=0x0B43, category='mn', description='ORIYA VOWEL SIGN VOCALIC R' },
+ [0x0B47] = { unicodeslot=0x0B47, category='mc', description='ORIYA VOWEL SIGN E' },
+ [0x0B48] = { unicodeslot=0x0B48, category='mc', description='ORIYA VOWEL SIGN AI', specials={'char',0x0B47,0x0B56} },
+ [0x0B4B] = { unicodeslot=0x0B4B, category='mc', description='ORIYA VOWEL SIGN O', specials={'char',0x0B47,0x0B3E} },
+ [0x0B4C] = { unicodeslot=0x0B4C, category='mc', description='ORIYA VOWEL SIGN AU', specials={'char',0x0B47,0x0B57} },
+ [0x0B4D] = { unicodeslot=0x0B4D, category='mn', description='ORIYA SIGN VIRAMA' },
+ [0x0B56] = { unicodeslot=0x0B56, category='mn', description='ORIYA AI LENGTH MARK' },
+ [0x0B57] = { unicodeslot=0x0B57, category='mc', description='ORIYA AU LENGTH MARK' },
+ [0x0B5C] = { unicodeslot=0x0B5C, category='lo', description='ORIYA LETTER RRA', specials={'char',0x0B21,0x0B3C} },
+ [0x0B5D] = { unicodeslot=0x0B5D, category='lo', description='ORIYA LETTER RHA', specials={'char',0x0B22,0x0B3C} },
+ [0x0B5F] = { unicodeslot=0x0B5F, category='lo', description='ORIYA LETTER YYA' },
+ [0x0B60] = { unicodeslot=0x0B60, category='lo', description='ORIYA LETTER VOCALIC RR' },
+ [0x0B61] = { unicodeslot=0x0B61, category='lo', description='ORIYA LETTER VOCALIC LL' },
+ [0x0B66] = { unicodeslot=0x0B66, category='nd', description='ORIYA DIGIT ZERO' },
+ [0x0B67] = { unicodeslot=0x0B67, category='nd', description='ORIYA DIGIT ONE' },
+ [0x0B68] = { unicodeslot=0x0B68, category='nd', description='ORIYA DIGIT TWO' },
+ [0x0B69] = { unicodeslot=0x0B69, category='nd', description='ORIYA DIGIT THREE' },
+ [0x0B6A] = { unicodeslot=0x0B6A, category='nd', description='ORIYA DIGIT FOUR' },
+ [0x0B6B] = { unicodeslot=0x0B6B, category='nd', description='ORIYA DIGIT FIVE' },
+ [0x0B6C] = { unicodeslot=0x0B6C, category='nd', description='ORIYA DIGIT SIX' },
+ [0x0B6D] = { unicodeslot=0x0B6D, category='nd', description='ORIYA DIGIT SEVEN' },
+ [0x0B6E] = { unicodeslot=0x0B6E, category='nd', description='ORIYA DIGIT EIGHT' },
+ [0x0B6F] = { unicodeslot=0x0B6F, category='nd', description='ORIYA DIGIT NINE' },
+ [0x0B70] = { unicodeslot=0x0B70, category='so', description='ORIYA ISSHAR' },
+ [0x0B71] = { unicodeslot=0x0B71, category='lo', description='ORIYA LETTER WA' },
+ [0x0B82] = { unicodeslot=0x0B82, category='mn', description='TAMIL SIGN ANUSVARA' },
+ [0x0B83] = { unicodeslot=0x0B83, category='lo', description='TAMIL SIGN VISARGA' },
+ [0x0B85] = { unicodeslot=0x0B85, category='lo', description='TAMIL LETTER A' },
+ [0x0B86] = { unicodeslot=0x0B86, category='lo', description='TAMIL LETTER AA' },
+ [0x0B87] = { unicodeslot=0x0B87, category='lo', description='TAMIL LETTER I' },
+ [0x0B88] = { unicodeslot=0x0B88, category='lo', description='TAMIL LETTER II' },
+ [0x0B89] = { unicodeslot=0x0B89, category='lo', description='TAMIL LETTER U' },
+ [0x0B8A] = { unicodeslot=0x0B8A, category='lo', description='TAMIL LETTER UU' },
+ [0x0B8E] = { unicodeslot=0x0B8E, category='lo', description='TAMIL LETTER E' },
+ [0x0B8F] = { unicodeslot=0x0B8F, category='lo', description='TAMIL LETTER EE' },
+ [0x0B90] = { unicodeslot=0x0B90, category='lo', description='TAMIL LETTER AI' },
+ [0x0B92] = { unicodeslot=0x0B92, category='lo', description='TAMIL LETTER O' },
+ [0x0B93] = { unicodeslot=0x0B93, category='lo', description='TAMIL LETTER OO' },
+ [0x0B94] = { unicodeslot=0x0B94, category='lo', description='TAMIL LETTER AU', specials={'char',0x0B92,0x0BD7} },
+ [0x0B95] = { unicodeslot=0x0B95, category='lo', description='TAMIL LETTER KA' },
+ [0x0B99] = { unicodeslot=0x0B99, category='lo', description='TAMIL LETTER NGA' },
+ [0x0B9A] = { unicodeslot=0x0B9A, category='lo', description='TAMIL LETTER CA' },
+ [0x0B9C] = { unicodeslot=0x0B9C, category='lo', description='TAMIL LETTER JA' },
+ [0x0B9E] = { unicodeslot=0x0B9E, category='lo', description='TAMIL LETTER NYA' },
+ [0x0B9F] = { unicodeslot=0x0B9F, category='lo', description='TAMIL LETTER TTA' },
+ [0x0BA3] = { unicodeslot=0x0BA3, category='lo', description='TAMIL LETTER NNA' },
+ [0x0BA4] = { unicodeslot=0x0BA4, category='lo', description='TAMIL LETTER TA' },
+ [0x0BA8] = { unicodeslot=0x0BA8, category='lo', description='TAMIL LETTER NA' },
+ [0x0BA9] = { unicodeslot=0x0BA9, category='lo', description='TAMIL LETTER NNNA' },
+ [0x0BAA] = { unicodeslot=0x0BAA, category='lo', description='TAMIL LETTER PA' },
+ [0x0BAE] = { unicodeslot=0x0BAE, category='lo', description='TAMIL LETTER MA' },
+ [0x0BAF] = { unicodeslot=0x0BAF, category='lo', description='TAMIL LETTER YA' },
+ [0x0BB0] = { unicodeslot=0x0BB0, category='lo', description='TAMIL LETTER RA' },
+ [0x0BB1] = { unicodeslot=0x0BB1, category='lo', description='TAMIL LETTER RRA' },
+ [0x0BB2] = { unicodeslot=0x0BB2, category='lo', description='TAMIL LETTER LA' },
+ [0x0BB3] = { unicodeslot=0x0BB3, category='lo', description='TAMIL LETTER LLA' },
+ [0x0BB4] = { unicodeslot=0x0BB4, category='lo', description='TAMIL LETTER LLLA' },
+ [0x0BB5] = { unicodeslot=0x0BB5, category='lo', description='TAMIL LETTER VA' },
+ [0x0BB6] = { unicodeslot=0x0BB6, category='lo', description='TAMIL LETTER SHA' },
+ [0x0BB7] = { unicodeslot=0x0BB7, category='lo', description='TAMIL LETTER SSA' },
+ [0x0BB8] = { unicodeslot=0x0BB8, category='lo', description='TAMIL LETTER SA' },
+ [0x0BB9] = { unicodeslot=0x0BB9, category='lo', description='TAMIL LETTER HA' },
+ [0x0BBE] = { unicodeslot=0x0BBE, category='mc', description='TAMIL VOWEL SIGN AA' },
+ [0x0BBF] = { unicodeslot=0x0BBF, category='mc', description='TAMIL VOWEL SIGN I' },
+ [0x0BC0] = { unicodeslot=0x0BC0, category='mn', description='TAMIL VOWEL SIGN II' },
+ [0x0BC1] = { unicodeslot=0x0BC1, category='mc', description='TAMIL VOWEL SIGN U' },
+ [0x0BC2] = { unicodeslot=0x0BC2, category='mc', description='TAMIL VOWEL SIGN UU' },
+ [0x0BC6] = { unicodeslot=0x0BC6, category='mc', description='TAMIL VOWEL SIGN E' },
+ [0x0BC7] = { unicodeslot=0x0BC7, category='mc', description='TAMIL VOWEL SIGN EE' },
+ [0x0BC8] = { unicodeslot=0x0BC8, category='mc', description='TAMIL VOWEL SIGN AI' },
+ [0x0BCA] = { unicodeslot=0x0BCA, category='mc', description='TAMIL VOWEL SIGN O', specials={'char',0x0BC6,0x0BBE} },
+ [0x0BCB] = { unicodeslot=0x0BCB, category='mc', description='TAMIL VOWEL SIGN OO', specials={'char',0x0BC7,0x0BBE} },
+ [0x0BCC] = { unicodeslot=0x0BCC, category='mc', description='TAMIL VOWEL SIGN AU', specials={'char',0x0BC6,0x0BD7} },
+ [0x0BCD] = { unicodeslot=0x0BCD, category='mn', description='TAMIL SIGN VIRAMA' },
+ [0x0BD7] = { unicodeslot=0x0BD7, category='mc', description='TAMIL AU LENGTH MARK' },
+ [0x0BE6] = { unicodeslot=0x0BE6, category='nd', description='TAMIL DIGIT ZERO' },
+ [0x0BE7] = { unicodeslot=0x0BE7, category='nd', description='TAMIL DIGIT ONE' },
+ [0x0BE8] = { unicodeslot=0x0BE8, category='nd', description='TAMIL DIGIT TWO' },
+ [0x0BE9] = { unicodeslot=0x0BE9, category='nd', description='TAMIL DIGIT THREE' },
+ [0x0BEA] = { unicodeslot=0x0BEA, category='nd', description='TAMIL DIGIT FOUR' },
+ [0x0BEB] = { unicodeslot=0x0BEB, category='nd', description='TAMIL DIGIT FIVE' },
+ [0x0BEC] = { unicodeslot=0x0BEC, category='nd', description='TAMIL DIGIT SIX' },
+ [0x0BED] = { unicodeslot=0x0BED, category='nd', description='TAMIL DIGIT SEVEN' },
+ [0x0BEE] = { unicodeslot=0x0BEE, category='nd', description='TAMIL DIGIT EIGHT' },
+ [0x0BEF] = { unicodeslot=0x0BEF, category='nd', description='TAMIL DIGIT NINE' },
+ [0x0BF0] = { unicodeslot=0x0BF0, category='no', description='TAMIL NUMBER TEN' },
+ [0x0BF1] = { unicodeslot=0x0BF1, category='no', description='TAMIL NUMBER ONE HUNDRED' },
+ [0x0BF2] = { unicodeslot=0x0BF2, category='no', description='TAMIL NUMBER ONE THOUSAND' },
+ [0x0BF3] = { unicodeslot=0x0BF3, category='so', description='TAMIL DAY SIGN' },
+ [0x0BF4] = { unicodeslot=0x0BF4, category='so', description='TAMIL MONTH SIGN' },
+ [0x0BF5] = { unicodeslot=0x0BF5, category='so', description='TAMIL YEAR SIGN' },
+ [0x0BF6] = { unicodeslot=0x0BF6, category='so', description='TAMIL DEBIT SIGN' },
+ [0x0BF7] = { unicodeslot=0x0BF7, category='so', description='TAMIL CREDIT SIGN' },
+ [0x0BF8] = { unicodeslot=0x0BF8, category='so', description='TAMIL AS ABOVE SIGN' },
+ [0x0BF9] = { unicodeslot=0x0BF9, category='sc', description='TAMIL RUPEE SIGN' },
+ [0x0BFA] = { unicodeslot=0x0BFA, category='so', description='TAMIL NUMBER SIGN' },
+ [0x0C01] = { unicodeslot=0x0C01, category='mc', description='TELUGU SIGN CANDRABINDU' },
+ [0x0C02] = { unicodeslot=0x0C02, category='mc', description='TELUGU SIGN ANUSVARA' },
+ [0x0C03] = { unicodeslot=0x0C03, category='mc', description='TELUGU SIGN VISARGA' },
+ [0x0C05] = { unicodeslot=0x0C05, category='lo', description='TELUGU LETTER A' },
+ [0x0C06] = { unicodeslot=0x0C06, category='lo', description='TELUGU LETTER AA' },
+ [0x0C07] = { unicodeslot=0x0C07, category='lo', description='TELUGU LETTER I' },
+ [0x0C08] = { unicodeslot=0x0C08, category='lo', description='TELUGU LETTER II' },
+ [0x0C09] = { unicodeslot=0x0C09, category='lo', description='TELUGU LETTER U' },
+ [0x0C0A] = { unicodeslot=0x0C0A, category='lo', description='TELUGU LETTER UU' },
+ [0x0C0B] = { unicodeslot=0x0C0B, category='lo', description='TELUGU LETTER VOCALIC R' },
+ [0x0C0C] = { unicodeslot=0x0C0C, category='lo', description='TELUGU LETTER VOCALIC L' },
+ [0x0C0E] = { unicodeslot=0x0C0E, category='lo', description='TELUGU LETTER E' },
+ [0x0C0F] = { unicodeslot=0x0C0F, category='lo', description='TELUGU LETTER EE' },
+ [0x0C10] = { unicodeslot=0x0C10, category='lo', description='TELUGU LETTER AI' },
+ [0x0C12] = { unicodeslot=0x0C12, category='lo', description='TELUGU LETTER O' },
+ [0x0C13] = { unicodeslot=0x0C13, category='lo', description='TELUGU LETTER OO' },
+ [0x0C14] = { unicodeslot=0x0C14, category='lo', description='TELUGU LETTER AU' },
+ [0x0C15] = { unicodeslot=0x0C15, category='lo', description='TELUGU LETTER KA' },
+ [0x0C16] = { unicodeslot=0x0C16, category='lo', description='TELUGU LETTER KHA' },
+ [0x0C17] = { unicodeslot=0x0C17, category='lo', description='TELUGU LETTER GA' },
+ [0x0C18] = { unicodeslot=0x0C18, category='lo', description='TELUGU LETTER GHA' },
+ [0x0C19] = { unicodeslot=0x0C19, category='lo', description='TELUGU LETTER NGA' },
+ [0x0C1A] = { unicodeslot=0x0C1A, category='lo', description='TELUGU LETTER CA' },
+ [0x0C1B] = { unicodeslot=0x0C1B, category='lo', description='TELUGU LETTER CHA' },
+ [0x0C1C] = { unicodeslot=0x0C1C, category='lo', description='TELUGU LETTER JA' },
+ [0x0C1D] = { unicodeslot=0x0C1D, category='lo', description='TELUGU LETTER JHA' },
+ [0x0C1E] = { unicodeslot=0x0C1E, category='lo', description='TELUGU LETTER NYA' },
+ [0x0C1F] = { unicodeslot=0x0C1F, category='lo', description='TELUGU LETTER TTA' },
+ [0x0C20] = { unicodeslot=0x0C20, category='lo', description='TELUGU LETTER TTHA' },
+ [0x0C21] = { unicodeslot=0x0C21, category='lo', description='TELUGU LETTER DDA' },
+ [0x0C22] = { unicodeslot=0x0C22, category='lo', description='TELUGU LETTER DDHA' },
+ [0x0C23] = { unicodeslot=0x0C23, category='lo', description='TELUGU LETTER NNA' },
+ [0x0C24] = { unicodeslot=0x0C24, category='lo', description='TELUGU LETTER TA' },
+ [0x0C25] = { unicodeslot=0x0C25, category='lo', description='TELUGU LETTER THA' },
+ [0x0C26] = { unicodeslot=0x0C26, category='lo', description='TELUGU LETTER DA' },
+ [0x0C27] = { unicodeslot=0x0C27, category='lo', description='TELUGU LETTER DHA' },
+ [0x0C28] = { unicodeslot=0x0C28, category='lo', description='TELUGU LETTER NA' },
+ [0x0C2A] = { unicodeslot=0x0C2A, category='lo', description='TELUGU LETTER PA' },
+ [0x0C2B] = { unicodeslot=0x0C2B, category='lo', description='TELUGU LETTER PHA' },
+ [0x0C2C] = { unicodeslot=0x0C2C, category='lo', description='TELUGU LETTER BA' },
+ [0x0C2D] = { unicodeslot=0x0C2D, category='lo', description='TELUGU LETTER BHA' },
+ [0x0C2E] = { unicodeslot=0x0C2E, category='lo', description='TELUGU LETTER MA' },
+ [0x0C2F] = { unicodeslot=0x0C2F, category='lo', description='TELUGU LETTER YA' },
+ [0x0C30] = { unicodeslot=0x0C30, category='lo', description='TELUGU LETTER RA' },
+ [0x0C31] = { unicodeslot=0x0C31, category='lo', description='TELUGU LETTER RRA' },
+ [0x0C32] = { unicodeslot=0x0C32, category='lo', description='TELUGU LETTER LA' },
+ [0x0C33] = { unicodeslot=0x0C33, category='lo', description='TELUGU LETTER LLA' },
+ [0x0C35] = { unicodeslot=0x0C35, category='lo', description='TELUGU LETTER VA' },
+ [0x0C36] = { unicodeslot=0x0C36, category='lo', description='TELUGU LETTER SHA' },
+ [0x0C37] = { unicodeslot=0x0C37, category='lo', description='TELUGU LETTER SSA' },
+ [0x0C38] = { unicodeslot=0x0C38, category='lo', description='TELUGU LETTER SA' },
+ [0x0C39] = { unicodeslot=0x0C39, category='lo', description='TELUGU LETTER HA' },
+ [0x0C3E] = { unicodeslot=0x0C3E, category='mn', description='TELUGU VOWEL SIGN AA' },
+ [0x0C3F] = { unicodeslot=0x0C3F, category='mn', description='TELUGU VOWEL SIGN I' },
+ [0x0C40] = { unicodeslot=0x0C40, category='mn', description='TELUGU VOWEL SIGN II' },
+ [0x0C41] = { unicodeslot=0x0C41, category='mc', description='TELUGU VOWEL SIGN U' },
+ [0x0C42] = { unicodeslot=0x0C42, category='mc', description='TELUGU VOWEL SIGN UU' },
+ [0x0C43] = { unicodeslot=0x0C43, category='mc', description='TELUGU VOWEL SIGN VOCALIC R' },
+ [0x0C44] = { unicodeslot=0x0C44, category='mc', description='TELUGU VOWEL SIGN VOCALIC RR' },
+ [0x0C46] = { unicodeslot=0x0C46, category='mn', description='TELUGU VOWEL SIGN E' },
+ [0x0C47] = { unicodeslot=0x0C47, category='mn', description='TELUGU VOWEL SIGN EE' },
+ [0x0C48] = { unicodeslot=0x0C48, category='mn', description='TELUGU VOWEL SIGN AI', specials={'char',0x0C46,0x0C56} },
+ [0x0C4A] = { unicodeslot=0x0C4A, category='mn', description='TELUGU VOWEL SIGN O' },
+ [0x0C4B] = { unicodeslot=0x0C4B, category='mn', description='TELUGU VOWEL SIGN OO' },
+ [0x0C4C] = { unicodeslot=0x0C4C, category='mn', description='TELUGU VOWEL SIGN AU' },
+ [0x0C4D] = { unicodeslot=0x0C4D, category='mn', description='TELUGU SIGN VIRAMA' },
+ [0x0C55] = { unicodeslot=0x0C55, category='mn', description='TELUGU LENGTH MARK' },
+ [0x0C56] = { unicodeslot=0x0C56, category='mn', description='TELUGU AI LENGTH MARK' },
+ [0x0C60] = { unicodeslot=0x0C60, category='lo', description='TELUGU LETTER VOCALIC RR' },
+ [0x0C61] = { unicodeslot=0x0C61, category='lo', description='TELUGU LETTER VOCALIC LL' },
+ [0x0C66] = { unicodeslot=0x0C66, category='nd', description='TELUGU DIGIT ZERO' },
+ [0x0C67] = { unicodeslot=0x0C67, category='nd', description='TELUGU DIGIT ONE' },
+ [0x0C68] = { unicodeslot=0x0C68, category='nd', description='TELUGU DIGIT TWO' },
+ [0x0C69] = { unicodeslot=0x0C69, category='nd', description='TELUGU DIGIT THREE' },
+ [0x0C6A] = { unicodeslot=0x0C6A, category='nd', description='TELUGU DIGIT FOUR' },
+ [0x0C6B] = { unicodeslot=0x0C6B, category='nd', description='TELUGU DIGIT FIVE' },
+ [0x0C6C] = { unicodeslot=0x0C6C, category='nd', description='TELUGU DIGIT SIX' },
+ [0x0C6D] = { unicodeslot=0x0C6D, category='nd', description='TELUGU DIGIT SEVEN' },
+ [0x0C6E] = { unicodeslot=0x0C6E, category='nd', description='TELUGU DIGIT EIGHT' },
+ [0x0C6F] = { unicodeslot=0x0C6F, category='nd', description='TELUGU DIGIT NINE' },
+ [0x0C82] = { unicodeslot=0x0C82, category='mc', description='KANNADA SIGN ANUSVARA' },
+ [0x0C83] = { unicodeslot=0x0C83, category='mc', description='KANNADA SIGN VISARGA' },
+ [0x0C85] = { unicodeslot=0x0C85, category='lo', description='KANNADA LETTER A' },
+ [0x0C86] = { unicodeslot=0x0C86, category='lo', description='KANNADA LETTER AA' },
+ [0x0C87] = { unicodeslot=0x0C87, category='lo', description='KANNADA LETTER I' },
+ [0x0C88] = { unicodeslot=0x0C88, category='lo', description='KANNADA LETTER II' },
+ [0x0C89] = { unicodeslot=0x0C89, category='lo', description='KANNADA LETTER U' },
+ [0x0C8A] = { unicodeslot=0x0C8A, category='lo', description='KANNADA LETTER UU' },
+ [0x0C8B] = { unicodeslot=0x0C8B, category='lo', description='KANNADA LETTER VOCALIC R' },
+ [0x0C8C] = { unicodeslot=0x0C8C, category='lo', description='KANNADA LETTER VOCALIC L' },
+ [0x0C8E] = { unicodeslot=0x0C8E, category='lo', description='KANNADA LETTER E' },
+ [0x0C8F] = { unicodeslot=0x0C8F, category='lo', description='KANNADA LETTER EE' },
+ [0x0C90] = { unicodeslot=0x0C90, category='lo', description='KANNADA LETTER AI' },
+ [0x0C92] = { unicodeslot=0x0C92, category='lo', description='KANNADA LETTER O' },
+ [0x0C93] = { unicodeslot=0x0C93, category='lo', description='KANNADA LETTER OO' },
+ [0x0C94] = { unicodeslot=0x0C94, category='lo', description='KANNADA LETTER AU' },
+ [0x0C95] = { unicodeslot=0x0C95, category='lo', description='KANNADA LETTER KA' },
+ [0x0C96] = { unicodeslot=0x0C96, category='lo', description='KANNADA LETTER KHA' },
+ [0x0C97] = { unicodeslot=0x0C97, category='lo', description='KANNADA LETTER GA' },
+ [0x0C98] = { unicodeslot=0x0C98, category='lo', description='KANNADA LETTER GHA' },
+ [0x0C99] = { unicodeslot=0x0C99, category='lo', description='KANNADA LETTER NGA' },
+ [0x0C9A] = { unicodeslot=0x0C9A, category='lo', description='KANNADA LETTER CA' },
+ [0x0C9B] = { unicodeslot=0x0C9B, category='lo', description='KANNADA LETTER CHA' },
+ [0x0C9C] = { unicodeslot=0x0C9C, category='lo', description='KANNADA LETTER JA' },
+ [0x0C9D] = { unicodeslot=0x0C9D, category='lo', description='KANNADA LETTER JHA' },
+ [0x0C9E] = { unicodeslot=0x0C9E, category='lo', description='KANNADA LETTER NYA' },
+ [0x0C9F] = { unicodeslot=0x0C9F, category='lo', description='KANNADA LETTER TTA' },
+ [0x0CA0] = { unicodeslot=0x0CA0, category='lo', description='KANNADA LETTER TTHA' },
+ [0x0CA1] = { unicodeslot=0x0CA1, category='lo', description='KANNADA LETTER DDA' },
+ [0x0CA2] = { unicodeslot=0x0CA2, category='lo', description='KANNADA LETTER DDHA' },
+ [0x0CA3] = { unicodeslot=0x0CA3, category='lo', description='KANNADA LETTER NNA' },
+ [0x0CA4] = { unicodeslot=0x0CA4, category='lo', description='KANNADA LETTER TA' },
+ [0x0CA5] = { unicodeslot=0x0CA5, category='lo', description='KANNADA LETTER THA' },
+ [0x0CA6] = { unicodeslot=0x0CA6, category='lo', description='KANNADA LETTER DA' },
+ [0x0CA7] = { unicodeslot=0x0CA7, category='lo', description='KANNADA LETTER DHA' },
+ [0x0CA8] = { unicodeslot=0x0CA8, category='lo', description='KANNADA LETTER NA' },
+ [0x0CAA] = { unicodeslot=0x0CAA, category='lo', description='KANNADA LETTER PA' },
+ [0x0CAB] = { unicodeslot=0x0CAB, category='lo', description='KANNADA LETTER PHA' },
+ [0x0CAC] = { unicodeslot=0x0CAC, category='lo', description='KANNADA LETTER BA' },
+ [0x0CAD] = { unicodeslot=0x0CAD, category='lo', description='KANNADA LETTER BHA' },
+ [0x0CAE] = { unicodeslot=0x0CAE, category='lo', description='KANNADA LETTER MA' },
+ [0x0CAF] = { unicodeslot=0x0CAF, category='lo', description='KANNADA LETTER YA' },
+ [0x0CB0] = { unicodeslot=0x0CB0, category='lo', description='KANNADA LETTER RA' },
+ [0x0CB1] = { unicodeslot=0x0CB1, category='lo', description='KANNADA LETTER RRA' },
+ [0x0CB2] = { unicodeslot=0x0CB2, category='lo', description='KANNADA LETTER LA' },
+ [0x0CB3] = { unicodeslot=0x0CB3, category='lo', description='KANNADA LETTER LLA' },
+ [0x0CB5] = { unicodeslot=0x0CB5, category='lo', description='KANNADA LETTER VA' },
+ [0x0CB6] = { unicodeslot=0x0CB6, category='lo', description='KANNADA LETTER SHA' },
+ [0x0CB7] = { unicodeslot=0x0CB7, category='lo', description='KANNADA LETTER SSA' },
+ [0x0CB8] = { unicodeslot=0x0CB8, category='lo', description='KANNADA LETTER SA' },
+ [0x0CB9] = { unicodeslot=0x0CB9, category='lo', description='KANNADA LETTER HA' },
+ [0x0CBC] = { unicodeslot=0x0CBC, category='mn', description='KANNADA SIGN NUKTA' },
+ [0x0CBD] = { unicodeslot=0x0CBD, category='lo', description='KANNADA SIGN AVAGRAHA' },
+ [0x0CBE] = { unicodeslot=0x0CBE, category='mc', description='KANNADA VOWEL SIGN AA' },
+ [0x0CBF] = { unicodeslot=0x0CBF, category='mn', description='KANNADA VOWEL SIGN I' },
+ [0x0CC0] = { unicodeslot=0x0CC0, category='mc', description='KANNADA VOWEL SIGN II', specials={'char',0x0CBF,0x0CD5} },
+ [0x0CC1] = { unicodeslot=0x0CC1, category='mc', description='KANNADA VOWEL SIGN U' },
+ [0x0CC2] = { unicodeslot=0x0CC2, category='mc', description='KANNADA VOWEL SIGN UU' },
+ [0x0CC3] = { unicodeslot=0x0CC3, category='mc', description='KANNADA VOWEL SIGN VOCALIC R' },
+ [0x0CC4] = { unicodeslot=0x0CC4, category='mc', description='KANNADA VOWEL SIGN VOCALIC RR' },
+ [0x0CC6] = { unicodeslot=0x0CC6, category='mn', description='KANNADA VOWEL SIGN E' },
+ [0x0CC7] = { unicodeslot=0x0CC7, category='mc', description='KANNADA VOWEL SIGN EE', specials={'char',0x0CC6,0x0CD5} },
+ [0x0CC8] = { unicodeslot=0x0CC8, category='mc', description='KANNADA VOWEL SIGN AI', specials={'char',0x0CC6,0x0CD6} },
+ [0x0CCA] = { unicodeslot=0x0CCA, category='mc', description='KANNADA VOWEL SIGN O', specials={'char',0x0CC6,0x0CC2} },
+ [0x0CCB] = { unicodeslot=0x0CCB, category='mc', description='KANNADA VOWEL SIGN OO', specials={'char',0x0CCA,0x0CD5} },
+ [0x0CCC] = { unicodeslot=0x0CCC, category='mn', description='KANNADA VOWEL SIGN AU' },
+ [0x0CCD] = { unicodeslot=0x0CCD, category='mn', description='KANNADA SIGN VIRAMA' },
+ [0x0CD5] = { unicodeslot=0x0CD5, category='mc', description='KANNADA LENGTH MARK' },
+ [0x0CD6] = { unicodeslot=0x0CD6, category='mc', description='KANNADA AI LENGTH MARK' },
+ [0x0CDE] = { unicodeslot=0x0CDE, category='lo', description='KANNADA LETTER FA' },
+ [0x0CE0] = { unicodeslot=0x0CE0, category='lo', description='KANNADA LETTER VOCALIC RR' },
+ [0x0CE1] = { unicodeslot=0x0CE1, category='lo', description='KANNADA LETTER VOCALIC LL' },
+ [0x0CE2] = { unicodeslot=0x0CE2, category='mn', description='KANNADA VOWEL SIGN VOCALIC L' },
+ [0x0CE3] = { unicodeslot=0x0CE3, category='mn', description='KANNADA VOWEL SIGN VOCALIC LL' },
+ [0x0CE6] = { unicodeslot=0x0CE6, category='nd', description='KANNADA DIGIT ZERO' },
+ [0x0CE7] = { unicodeslot=0x0CE7, category='nd', description='KANNADA DIGIT ONE' },
+ [0x0CE8] = { unicodeslot=0x0CE8, category='nd', description='KANNADA DIGIT TWO' },
+ [0x0CE9] = { unicodeslot=0x0CE9, category='nd', description='KANNADA DIGIT THREE' },
+ [0x0CEA] = { unicodeslot=0x0CEA, category='nd', description='KANNADA DIGIT FOUR' },
+ [0x0CEB] = { unicodeslot=0x0CEB, category='nd', description='KANNADA DIGIT FIVE' },
+ [0x0CEC] = { unicodeslot=0x0CEC, category='nd', description='KANNADA DIGIT SIX' },
+ [0x0CED] = { unicodeslot=0x0CED, category='nd', description='KANNADA DIGIT SEVEN' },
+ [0x0CEE] = { unicodeslot=0x0CEE, category='nd', description='KANNADA DIGIT EIGHT' },
+ [0x0CEF] = { unicodeslot=0x0CEF, category='nd', description='KANNADA DIGIT NINE' },
+ [0x0CF1] = { unicodeslot=0x0CF1, category='so', description='KANNADA SIGN JIHVAMULIYA' },
+ [0x0CF2] = { unicodeslot=0x0CF2, category='so', description='KANNADA SIGN UPADHMANIYA' },
+ [0x0D02] = { unicodeslot=0x0D02, category='mc', description='MALAYALAM SIGN ANUSVARA' },
+ [0x0D03] = { unicodeslot=0x0D03, category='mc', description='MALAYALAM SIGN VISARGA' },
+ [0x0D05] = { unicodeslot=0x0D05, category='lo', description='MALAYALAM LETTER A' },
+ [0x0D06] = { unicodeslot=0x0D06, category='lo', description='MALAYALAM LETTER AA' },
+ [0x0D07] = { unicodeslot=0x0D07, category='lo', description='MALAYALAM LETTER I' },
+ [0x0D08] = { unicodeslot=0x0D08, category='lo', description='MALAYALAM LETTER II' },
+ [0x0D09] = { unicodeslot=0x0D09, category='lo', description='MALAYALAM LETTER U' },
+ [0x0D0A] = { unicodeslot=0x0D0A, category='lo', description='MALAYALAM LETTER UU' },
+ [0x0D0B] = { unicodeslot=0x0D0B, category='lo', description='MALAYALAM LETTER VOCALIC R' },
+ [0x0D0C] = { unicodeslot=0x0D0C, category='lo', description='MALAYALAM LETTER VOCALIC L' },
+ [0x0D0E] = { unicodeslot=0x0D0E, category='lo', description='MALAYALAM LETTER E' },
+ [0x0D0F] = { unicodeslot=0x0D0F, category='lo', description='MALAYALAM LETTER EE' },
+ [0x0D10] = { unicodeslot=0x0D10, category='lo', description='MALAYALAM LETTER AI' },
+ [0x0D12] = { unicodeslot=0x0D12, category='lo', description='MALAYALAM LETTER O' },
+ [0x0D13] = { unicodeslot=0x0D13, category='lo', description='MALAYALAM LETTER OO' },
+ [0x0D14] = { unicodeslot=0x0D14, category='lo', description='MALAYALAM LETTER AU' },
+ [0x0D15] = { unicodeslot=0x0D15, category='lo', description='MALAYALAM LETTER KA' },
+ [0x0D16] = { unicodeslot=0x0D16, category='lo', description='MALAYALAM LETTER KHA' },
+ [0x0D17] = { unicodeslot=0x0D17, category='lo', description='MALAYALAM LETTER GA' },
+ [0x0D18] = { unicodeslot=0x0D18, category='lo', description='MALAYALAM LETTER GHA' },
+ [0x0D19] = { unicodeslot=0x0D19, category='lo', description='MALAYALAM LETTER NGA' },
+ [0x0D1A] = { unicodeslot=0x0D1A, category='lo', description='MALAYALAM LETTER CA' },
+ [0x0D1B] = { unicodeslot=0x0D1B, category='lo', description='MALAYALAM LETTER CHA' },
+ [0x0D1C] = { unicodeslot=0x0D1C, category='lo', description='MALAYALAM LETTER JA' },
+ [0x0D1D] = { unicodeslot=0x0D1D, category='lo', description='MALAYALAM LETTER JHA' },
+ [0x0D1E] = { unicodeslot=0x0D1E, category='lo', description='MALAYALAM LETTER NYA' },
+ [0x0D1F] = { unicodeslot=0x0D1F, category='lo', description='MALAYALAM LETTER TTA' },
+ [0x0D20] = { unicodeslot=0x0D20, category='lo', description='MALAYALAM LETTER TTHA' },
+ [0x0D21] = { unicodeslot=0x0D21, category='lo', description='MALAYALAM LETTER DDA' },
+ [0x0D22] = { unicodeslot=0x0D22, category='lo', description='MALAYALAM LETTER DDHA' },
+ [0x0D23] = { unicodeslot=0x0D23, category='lo', description='MALAYALAM LETTER NNA' },
+ [0x0D24] = { unicodeslot=0x0D24, category='lo', description='MALAYALAM LETTER TA' },
+ [0x0D25] = { unicodeslot=0x0D25, category='lo', description='MALAYALAM LETTER THA' },
+ [0x0D26] = { unicodeslot=0x0D26, category='lo', description='MALAYALAM LETTER DA' },
+ [0x0D27] = { unicodeslot=0x0D27, category='lo', description='MALAYALAM LETTER DHA' },
+ [0x0D28] = { unicodeslot=0x0D28, category='lo', description='MALAYALAM LETTER NA' },
+ [0x0D2A] = { unicodeslot=0x0D2A, category='lo', description='MALAYALAM LETTER PA' },
+ [0x0D2B] = { unicodeslot=0x0D2B, category='lo', description='MALAYALAM LETTER PHA' },
+ [0x0D2C] = { unicodeslot=0x0D2C, category='lo', description='MALAYALAM LETTER BA' },
+ [0x0D2D] = { unicodeslot=0x0D2D, category='lo', description='MALAYALAM LETTER BHA' },
+ [0x0D2E] = { unicodeslot=0x0D2E, category='lo', description='MALAYALAM LETTER MA' },
+ [0x0D2F] = { unicodeslot=0x0D2F, category='lo', description='MALAYALAM LETTER YA' },
+ [0x0D30] = { unicodeslot=0x0D30, category='lo', description='MALAYALAM LETTER RA' },
+ [0x0D31] = { unicodeslot=0x0D31, category='lo', description='MALAYALAM LETTER RRA' },
+ [0x0D32] = { unicodeslot=0x0D32, category='lo', description='MALAYALAM LETTER LA' },
+ [0x0D33] = { unicodeslot=0x0D33, category='lo', description='MALAYALAM LETTER LLA' },
+ [0x0D34] = { unicodeslot=0x0D34, category='lo', description='MALAYALAM LETTER LLLA' },
+ [0x0D35] = { unicodeslot=0x0D35, category='lo', description='MALAYALAM LETTER VA' },
+ [0x0D36] = { unicodeslot=0x0D36, category='lo', description='MALAYALAM LETTER SHA' },
+ [0x0D37] = { unicodeslot=0x0D37, category='lo', description='MALAYALAM LETTER SSA' },
+ [0x0D38] = { unicodeslot=0x0D38, category='lo', description='MALAYALAM LETTER SA' },
+ [0x0D39] = { unicodeslot=0x0D39, category='lo', description='MALAYALAM LETTER HA' },
+ [0x0D3E] = { unicodeslot=0x0D3E, category='mc', description='MALAYALAM VOWEL SIGN AA' },
+ [0x0D3F] = { unicodeslot=0x0D3F, category='mc', description='MALAYALAM VOWEL SIGN I' },
+ [0x0D40] = { unicodeslot=0x0D40, category='mc', description='MALAYALAM VOWEL SIGN II' },
+ [0x0D41] = { unicodeslot=0x0D41, category='mn', description='MALAYALAM VOWEL SIGN U' },
+ [0x0D42] = { unicodeslot=0x0D42, category='mn', description='MALAYALAM VOWEL SIGN UU' },
+ [0x0D43] = { unicodeslot=0x0D43, category='mn', description='MALAYALAM VOWEL SIGN VOCALIC R' },
+ [0x0D46] = { unicodeslot=0x0D46, category='mc', description='MALAYALAM VOWEL SIGN E' },
+ [0x0D47] = { unicodeslot=0x0D47, category='mc', description='MALAYALAM VOWEL SIGN EE' },
+ [0x0D48] = { unicodeslot=0x0D48, category='mc', description='MALAYALAM VOWEL SIGN AI' },
+ [0x0D4A] = { unicodeslot=0x0D4A, category='mc', description='MALAYALAM VOWEL SIGN O', specials={'char',0x0D46,0x0D3E} },
+ [0x0D4B] = { unicodeslot=0x0D4B, category='mc', description='MALAYALAM VOWEL SIGN OO', specials={'char',0x0D47,0x0D3E} },
+ [0x0D4C] = { unicodeslot=0x0D4C, category='mc', description='MALAYALAM VOWEL SIGN AU', specials={'char',0x0D46,0x0D57} },
+ [0x0D4D] = { unicodeslot=0x0D4D, category='mn', description='MALAYALAM SIGN VIRAMA' },
+ [0x0D57] = { unicodeslot=0x0D57, category='mc', description='MALAYALAM AU LENGTH MARK' },
+ [0x0D60] = { unicodeslot=0x0D60, category='lo', description='MALAYALAM LETTER VOCALIC RR' },
+ [0x0D61] = { unicodeslot=0x0D61, category='lo', description='MALAYALAM LETTER VOCALIC LL' },
+ [0x0D66] = { unicodeslot=0x0D66, category='nd', description='MALAYALAM DIGIT ZERO' },
+ [0x0D67] = { unicodeslot=0x0D67, category='nd', description='MALAYALAM DIGIT ONE' },
+ [0x0D68] = { unicodeslot=0x0D68, category='nd', description='MALAYALAM DIGIT TWO' },
+ [0x0D69] = { unicodeslot=0x0D69, category='nd', description='MALAYALAM DIGIT THREE' },
+ [0x0D6A] = { unicodeslot=0x0D6A, category='nd', description='MALAYALAM DIGIT FOUR' },
+ [0x0D6B] = { unicodeslot=0x0D6B, category='nd', description='MALAYALAM DIGIT FIVE' },
+ [0x0D6C] = { unicodeslot=0x0D6C, category='nd', description='MALAYALAM DIGIT SIX' },
+ [0x0D6D] = { unicodeslot=0x0D6D, category='nd', description='MALAYALAM DIGIT SEVEN' },
+ [0x0D6E] = { unicodeslot=0x0D6E, category='nd', description='MALAYALAM DIGIT EIGHT' },
+ [0x0D6F] = { unicodeslot=0x0D6F, category='nd', description='MALAYALAM DIGIT NINE' },
+ [0x0D82] = { unicodeslot=0x0D82, category='mc', description='SINHALA SIGN ANUSVARAYA' },
+ [0x0D83] = { unicodeslot=0x0D83, category='mc', description='SINHALA SIGN VISARGAYA' },
+ [0x0D85] = { unicodeslot=0x0D85, category='lo', description='SINHALA LETTER AYANNA' },
+ [0x0D86] = { unicodeslot=0x0D86, category='lo', description='SINHALA LETTER AAYANNA' },
+ [0x0D87] = { unicodeslot=0x0D87, category='lo', description='SINHALA LETTER AEYANNA' },
+ [0x0D88] = { unicodeslot=0x0D88, category='lo', description='SINHALA LETTER AEEYANNA' },
+ [0x0D89] = { unicodeslot=0x0D89, category='lo', description='SINHALA LETTER IYANNA' },
+ [0x0D8A] = { unicodeslot=0x0D8A, category='lo', description='SINHALA LETTER IIYANNA' },
+ [0x0D8B] = { unicodeslot=0x0D8B, category='lo', description='SINHALA LETTER UYANNA' },
+ [0x0D8C] = { unicodeslot=0x0D8C, category='lo', description='SINHALA LETTER UUYANNA' },
+ [0x0D8D] = { unicodeslot=0x0D8D, category='lo', description='SINHALA LETTER IRUYANNA' },
+ [0x0D8E] = { unicodeslot=0x0D8E, category='lo', description='SINHALA LETTER IRUUYANNA' },
+ [0x0D8F] = { unicodeslot=0x0D8F, category='lo', description='SINHALA LETTER ILUYANNA' },
+ [0x0D90] = { unicodeslot=0x0D90, category='lo', description='SINHALA LETTER ILUUYANNA' },
+ [0x0D91] = { unicodeslot=0x0D91, category='lo', description='SINHALA LETTER EYANNA' },
+ [0x0D92] = { unicodeslot=0x0D92, category='lo', description='SINHALA LETTER EEYANNA' },
+ [0x0D93] = { unicodeslot=0x0D93, category='lo', description='SINHALA LETTER AIYANNA' },
+ [0x0D94] = { unicodeslot=0x0D94, category='lo', description='SINHALA LETTER OYANNA' },
+ [0x0D95] = { unicodeslot=0x0D95, category='lo', description='SINHALA LETTER OOYANNA' },
+ [0x0D96] = { unicodeslot=0x0D96, category='lo', description='SINHALA LETTER AUYANNA' },
+ [0x0D9A] = { unicodeslot=0x0D9A, category='lo', description='SINHALA LETTER ALPAPRAANA KAYANNA' },
+ [0x0D9B] = { unicodeslot=0x0D9B, category='lo', description='SINHALA LETTER MAHAAPRAANA KAYANNA' },
+ [0x0D9C] = { unicodeslot=0x0D9C, category='lo', description='SINHALA LETTER ALPAPRAANA GAYANNA' },
+ [0x0D9D] = { unicodeslot=0x0D9D, category='lo', description='SINHALA LETTER MAHAAPRAANA GAYANNA' },
+ [0x0D9E] = { unicodeslot=0x0D9E, category='lo', description='SINHALA LETTER KANTAJA NAASIKYAYA' },
+ [0x0D9F] = { unicodeslot=0x0D9F, category='lo', description='SINHALA LETTER SANYAKA GAYANNA' },
+ [0x0DA0] = { unicodeslot=0x0DA0, category='lo', description='SINHALA LETTER ALPAPRAANA CAYANNA' },
+ [0x0DA1] = { unicodeslot=0x0DA1, category='lo', description='SINHALA LETTER MAHAAPRAANA CAYANNA' },
+ [0x0DA2] = { unicodeslot=0x0DA2, category='lo', description='SINHALA LETTER ALPAPRAANA JAYANNA' },
+ [0x0DA3] = { unicodeslot=0x0DA3, category='lo', description='SINHALA LETTER MAHAAPRAANA JAYANNA' },
+ [0x0DA4] = { unicodeslot=0x0DA4, category='lo', description='SINHALA LETTER TAALUJA NAASIKYAYA' },
+ [0x0DA5] = { unicodeslot=0x0DA5, category='lo', description='SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA' },
+ [0x0DA6] = { unicodeslot=0x0DA6, category='lo', description='SINHALA LETTER SANYAKA JAYANNA' },
+ [0x0DA7] = { unicodeslot=0x0DA7, category='lo', description='SINHALA LETTER ALPAPRAANA TTAYANNA' },
+ [0x0DA8] = { unicodeslot=0x0DA8, category='lo', description='SINHALA LETTER MAHAAPRAANA TTAYANNA' },
+ [0x0DA9] = { unicodeslot=0x0DA9, category='lo', description='SINHALA LETTER ALPAPRAANA DDAYANNA' },
+ [0x0DAA] = { unicodeslot=0x0DAA, category='lo', description='SINHALA LETTER MAHAAPRAANA DDAYANNA' },
+ [0x0DAB] = { unicodeslot=0x0DAB, category='lo', description='SINHALA LETTER MUURDHAJA NAYANNA' },
+ [0x0DAC] = { unicodeslot=0x0DAC, category='lo', description='SINHALA LETTER SANYAKA DDAYANNA' },
+ [0x0DAD] = { unicodeslot=0x0DAD, category='lo', description='SINHALA LETTER ALPAPRAANA TAYANNA' },
+ [0x0DAE] = { unicodeslot=0x0DAE, category='lo', description='SINHALA LETTER MAHAAPRAANA TAYANNA' },
+ [0x0DAF] = { unicodeslot=0x0DAF, category='lo', description='SINHALA LETTER ALPAPRAANA DAYANNA' },
+ [0x0DB0] = { unicodeslot=0x0DB0, category='lo', description='SINHALA LETTER MAHAAPRAANA DAYANNA' },
+ [0x0DB1] = { unicodeslot=0x0DB1, category='lo', description='SINHALA LETTER DANTAJA NAYANNA' },
+ [0x0DB3] = { unicodeslot=0x0DB3, category='lo', description='SINHALA LETTER SANYAKA DAYANNA' },
+ [0x0DB4] = { unicodeslot=0x0DB4, category='lo', description='SINHALA LETTER ALPAPRAANA PAYANNA' },
+ [0x0DB5] = { unicodeslot=0x0DB5, category='lo', description='SINHALA LETTER MAHAAPRAANA PAYANNA' },
+ [0x0DB6] = { unicodeslot=0x0DB6, category='lo', description='SINHALA LETTER ALPAPRAANA BAYANNA' },
+ [0x0DB7] = { unicodeslot=0x0DB7, category='lo', description='SINHALA LETTER MAHAAPRAANA BAYANNA' },
+ [0x0DB8] = { unicodeslot=0x0DB8, category='lo', description='SINHALA LETTER MAYANNA' },
+ [0x0DB9] = { unicodeslot=0x0DB9, category='lo', description='SINHALA LETTER AMBA BAYANNA' },
+ [0x0DBA] = { unicodeslot=0x0DBA, category='lo', description='SINHALA LETTER YAYANNA' },
+ [0x0DBB] = { unicodeslot=0x0DBB, category='lo', description='SINHALA LETTER RAYANNA' },
+ [0x0DBD] = { unicodeslot=0x0DBD, category='lo', description='SINHALA LETTER DANTAJA LAYANNA' },
+ [0x0DC0] = { unicodeslot=0x0DC0, category='lo', description='SINHALA LETTER VAYANNA' },
+ [0x0DC1] = { unicodeslot=0x0DC1, category='lo', description='SINHALA LETTER TAALUJA SAYANNA' },
+ [0x0DC2] = { unicodeslot=0x0DC2, category='lo', description='SINHALA LETTER MUURDHAJA SAYANNA' },
+ [0x0DC3] = { unicodeslot=0x0DC3, category='lo', description='SINHALA LETTER DANTAJA SAYANNA' },
+ [0x0DC4] = { unicodeslot=0x0DC4, category='lo', description='SINHALA LETTER HAYANNA' },
+ [0x0DC5] = { unicodeslot=0x0DC5, category='lo', description='SINHALA LETTER MUURDHAJA LAYANNA' },
+ [0x0DC6] = { unicodeslot=0x0DC6, category='lo', description='SINHALA LETTER FAYANNA' },
+ [0x0DCA] = { unicodeslot=0x0DCA, category='mn', description='SINHALA SIGN AL-LAKUNA' },
+ [0x0DCF] = { unicodeslot=0x0DCF, category='mc', description='SINHALA VOWEL SIGN AELA-PILLA' },
+ [0x0DD0] = { unicodeslot=0x0DD0, category='mc', description='SINHALA VOWEL SIGN KETTI AEDA-PILLA' },
+ [0x0DD1] = { unicodeslot=0x0DD1, category='mc', description='SINHALA VOWEL SIGN DIGA AEDA-PILLA' },
+ [0x0DD2] = { unicodeslot=0x0DD2, category='mn', description='SINHALA VOWEL SIGN KETTI IS-PILLA' },
+ [0x0DD3] = { unicodeslot=0x0DD3, category='mn', description='SINHALA VOWEL SIGN DIGA IS-PILLA' },
+ [0x0DD4] = { unicodeslot=0x0DD4, category='mn', description='SINHALA VOWEL SIGN KETTI PAA-PILLA' },
+ [0x0DD6] = { unicodeslot=0x0DD6, category='mn', description='SINHALA VOWEL SIGN DIGA PAA-PILLA' },
+ [0x0DD8] = { unicodeslot=0x0DD8, category='mc', description='SINHALA VOWEL SIGN GAETTA-PILLA' },
+ [0x0DD9] = { unicodeslot=0x0DD9, category='mc', description='SINHALA VOWEL SIGN KOMBUVA' },
+ [0x0DDA] = { unicodeslot=0x0DDA, category='mc', description='SINHALA VOWEL SIGN DIGA KOMBUVA', specials={'char',0x0DD9,0x0DCA} },
+ [0x0DDB] = { unicodeslot=0x0DDB, category='mc', description='SINHALA VOWEL SIGN KOMBU DEKA' },
+ [0x0DDC] = { unicodeslot=0x0DDC, category='mc', description='SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA', specials={'char',0x0DD9,0x0DCF} },
+ [0x0DDD] = { unicodeslot=0x0DDD, category='mc', description='SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA', specials={'char',0x0DDC,0x0DCA} },
+ [0x0DDE] = { unicodeslot=0x0DDE, category='mc', description='SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA', specials={'char',0x0DD9,0x0DDF} },
+ [0x0DDF] = { unicodeslot=0x0DDF, category='mc', description='SINHALA VOWEL SIGN GAYANUKITTA' },
+ [0x0DF2] = { unicodeslot=0x0DF2, category='mc', description='SINHALA VOWEL SIGN DIGA GAETTA-PILLA' },
+ [0x0DF3] = { unicodeslot=0x0DF3, category='mc', description='SINHALA VOWEL SIGN DIGA GAYANUKITTA' },
+ [0x0DF4] = { unicodeslot=0x0DF4, category='po', description='SINHALA PUNCTUATION KUNDDALIYA' },
+ [0x0E01] = { unicodeslot=0x0E01, category='lo', description='THAI CHARACTER KO KAI' },
+ [0x0E02] = { unicodeslot=0x0E02, category='lo', description='THAI CHARACTER KHO KHAI' },
+ [0x0E03] = { unicodeslot=0x0E03, category='lo', description='THAI CHARACTER KHO KHUAT' },
+ [0x0E04] = { unicodeslot=0x0E04, category='lo', description='THAI CHARACTER KHO KHWAI' },
+ [0x0E05] = { unicodeslot=0x0E05, category='lo', description='THAI CHARACTER KHO KHON' },
+ [0x0E06] = { unicodeslot=0x0E06, category='lo', description='THAI CHARACTER KHO RAKHANG' },
+ [0x0E07] = { unicodeslot=0x0E07, category='lo', description='THAI CHARACTER NGO NGU' },
+ [0x0E08] = { unicodeslot=0x0E08, category='lo', description='THAI CHARACTER CHO CHAN' },
+ [0x0E09] = { unicodeslot=0x0E09, category='lo', description='THAI CHARACTER CHO CHING' },
+ [0x0E0A] = { unicodeslot=0x0E0A, category='lo', description='THAI CHARACTER CHO CHANG' },
+ [0x0E0B] = { unicodeslot=0x0E0B, category='lo', description='THAI CHARACTER SO SO' },
+ [0x0E0C] = { unicodeslot=0x0E0C, category='lo', description='THAI CHARACTER CHO CHOE' },
+ [0x0E0D] = { unicodeslot=0x0E0D, category='lo', description='THAI CHARACTER YO YING' },
+ [0x0E0E] = { unicodeslot=0x0E0E, category='lo', description='THAI CHARACTER DO CHADA' },
+ [0x0E0F] = { unicodeslot=0x0E0F, category='lo', description='THAI CHARACTER TO PATAK' },
+ [0x0E10] = { unicodeslot=0x0E10, category='lo', description='THAI CHARACTER THO THAN' },
+ [0x0E11] = { unicodeslot=0x0E11, category='lo', description='THAI CHARACTER THO NANGMONTHO' },
+ [0x0E12] = { unicodeslot=0x0E12, category='lo', description='THAI CHARACTER THO PHUTHAO' },
+ [0x0E13] = { unicodeslot=0x0E13, category='lo', description='THAI CHARACTER NO NEN' },
+ [0x0E14] = { unicodeslot=0x0E14, category='lo', description='THAI CHARACTER DO DEK' },
+ [0x0E15] = { unicodeslot=0x0E15, category='lo', description='THAI CHARACTER TO TAO' },
+ [0x0E16] = { unicodeslot=0x0E16, category='lo', description='THAI CHARACTER THO THUNG' },
+ [0x0E17] = { unicodeslot=0x0E17, category='lo', description='THAI CHARACTER THO THAHAN' },
+ [0x0E18] = { unicodeslot=0x0E18, category='lo', description='THAI CHARACTER THO THONG' },
+ [0x0E19] = { unicodeslot=0x0E19, category='lo', description='THAI CHARACTER NO NU' },
+ [0x0E1A] = { unicodeslot=0x0E1A, category='lo', description='THAI CHARACTER BO BAIMAI' },
+ [0x0E1B] = { unicodeslot=0x0E1B, category='lo', description='THAI CHARACTER PO PLA' },
+ [0x0E1C] = { unicodeslot=0x0E1C, category='lo', description='THAI CHARACTER PHO PHUNG' },
+ [0x0E1D] = { unicodeslot=0x0E1D, category='lo', description='THAI CHARACTER FO FA' },
+ [0x0E1E] = { unicodeslot=0x0E1E, category='lo', description='THAI CHARACTER PHO PHAN' },
+ [0x0E1F] = { unicodeslot=0x0E1F, category='lo', description='THAI CHARACTER FO FAN' },
+ [0x0E20] = { unicodeslot=0x0E20, category='lo', description='THAI CHARACTER PHO SAMPHAO' },
+ [0x0E21] = { unicodeslot=0x0E21, category='lo', description='THAI CHARACTER MO MA' },
+ [0x0E22] = { unicodeslot=0x0E22, category='lo', description='THAI CHARACTER YO YAK' },
+ [0x0E23] = { unicodeslot=0x0E23, category='lo', description='THAI CHARACTER RO RUA' },
+ [0x0E24] = { unicodeslot=0x0E24, category='lo', description='THAI CHARACTER RU' },
+ [0x0E25] = { unicodeslot=0x0E25, category='lo', description='THAI CHARACTER LO LING' },
+ [0x0E26] = { unicodeslot=0x0E26, category='lo', description='THAI CHARACTER LU' },
+ [0x0E27] = { unicodeslot=0x0E27, category='lo', description='THAI CHARACTER WO WAEN' },
+ [0x0E28] = { unicodeslot=0x0E28, category='lo', description='THAI CHARACTER SO SALA' },
+ [0x0E29] = { unicodeslot=0x0E29, category='lo', description='THAI CHARACTER SO RUSI' },
+ [0x0E2A] = { unicodeslot=0x0E2A, category='lo', description='THAI CHARACTER SO SUA' },
+ [0x0E2B] = { unicodeslot=0x0E2B, category='lo', description='THAI CHARACTER HO HIP' },
+ [0x0E2C] = { unicodeslot=0x0E2C, category='lo', description='THAI CHARACTER LO CHULA' },
+ [0x0E2D] = { unicodeslot=0x0E2D, category='lo', description='THAI CHARACTER O ANG' },
+ [0x0E2E] = { unicodeslot=0x0E2E, category='lo', description='THAI CHARACTER HO NOKHUK' },
+ [0x0E2F] = { unicodeslot=0x0E2F, category='lo', description='THAI CHARACTER PAIYANNOI' },
+ [0x0E30] = { unicodeslot=0x0E30, category='lo', description='THAI CHARACTER SARA A' },
+ [0x0E31] = { unicodeslot=0x0E31, category='mn', description='THAI CHARACTER MAI HAN-AKAT' },
+ [0x0E32] = { unicodeslot=0x0E32, category='lo', description='THAI CHARACTER SARA AA' },
+ [0x0E33] = { unicodeslot=0x0E33, category='lo', description='THAI CHARACTER SARA AM', specials={'compat',0x0E4D,0x0E32} },
+ [0x0E34] = { unicodeslot=0x0E34, category='mn', description='THAI CHARACTER SARA I' },
+ [0x0E35] = { unicodeslot=0x0E35, category='mn', description='THAI CHARACTER SARA II' },
+ [0x0E36] = { unicodeslot=0x0E36, category='mn', description='THAI CHARACTER SARA UE' },
+ [0x0E37] = { unicodeslot=0x0E37, category='mn', description='THAI CHARACTER SARA UEE' },
+ [0x0E38] = { unicodeslot=0x0E38, category='mn', description='THAI CHARACTER SARA U' },
+ [0x0E39] = { unicodeslot=0x0E39, category='mn', description='THAI CHARACTER SARA UU' },
+ [0x0E3A] = { unicodeslot=0x0E3A, category='mn', description='THAI CHARACTER PHINTHU' },
+ [0x0E3F] = { unicodeslot=0x0E3F, category='sc', description='THAI CURRENCY SYMBOL BAHT' },
+ [0x0E40] = { unicodeslot=0x0E40, category='lo', description='THAI CHARACTER SARA E' },
+ [0x0E41] = { unicodeslot=0x0E41, category='lo', description='THAI CHARACTER SARA AE' },
+ [0x0E42] = { unicodeslot=0x0E42, category='lo', description='THAI CHARACTER SARA O' },
+ [0x0E43] = { unicodeslot=0x0E43, category='lo', description='THAI CHARACTER SARA AI MAIMUAN' },
+ [0x0E44] = { unicodeslot=0x0E44, category='lo', description='THAI CHARACTER SARA AI MAIMALAI' },
+ [0x0E45] = { unicodeslot=0x0E45, category='lo', description='THAI CHARACTER LAKKHANGYAO' },
+ [0x0E46] = { unicodeslot=0x0E46, category='lm', description='THAI CHARACTER MAIYAMOK' },
+ [0x0E47] = { unicodeslot=0x0E47, category='mn', description='THAI CHARACTER MAITAIKHU' },
+ [0x0E48] = { unicodeslot=0x0E48, category='mn', description='THAI CHARACTER MAI EK' },
+ [0x0E49] = { unicodeslot=0x0E49, category='mn', description='THAI CHARACTER MAI THO' },
+ [0x0E4A] = { unicodeslot=0x0E4A, category='mn', description='THAI CHARACTER MAI TRI' },
+ [0x0E4B] = { unicodeslot=0x0E4B, category='mn', description='THAI CHARACTER MAI CHATTAWA' },
+ [0x0E4C] = { unicodeslot=0x0E4C, category='mn', description='THAI CHARACTER THANTHAKHAT' },
+ [0x0E4D] = { unicodeslot=0x0E4D, category='mn', description='THAI CHARACTER NIKHAHIT' },
+ [0x0E4E] = { unicodeslot=0x0E4E, category='mn', description='THAI CHARACTER YAMAKKAN' },
+ [0x0E4F] = { unicodeslot=0x0E4F, category='po', description='THAI CHARACTER FONGMAN' },
+ [0x0E50] = { unicodeslot=0x0E50, category='nd', description='THAI DIGIT ZERO' },
+ [0x0E51] = { unicodeslot=0x0E51, category='nd', description='THAI DIGIT ONE' },
+ [0x0E52] = { unicodeslot=0x0E52, category='nd', description='THAI DIGIT TWO' },
+ [0x0E53] = { unicodeslot=0x0E53, category='nd', description='THAI DIGIT THREE' },
+ [0x0E54] = { unicodeslot=0x0E54, category='nd', description='THAI DIGIT FOUR' },
+ [0x0E55] = { unicodeslot=0x0E55, category='nd', description='THAI DIGIT FIVE' },
+ [0x0E56] = { unicodeslot=0x0E56, category='nd', description='THAI DIGIT SIX' },
+ [0x0E57] = { unicodeslot=0x0E57, category='nd', description='THAI DIGIT SEVEN' },
+ [0x0E58] = { unicodeslot=0x0E58, category='nd', description='THAI DIGIT EIGHT' },
+ [0x0E59] = { unicodeslot=0x0E59, category='nd', description='THAI DIGIT NINE' },
+ [0x0E5A] = { unicodeslot=0x0E5A, category='po', description='THAI CHARACTER ANGKHANKHU' },
+ [0x0E5B] = { unicodeslot=0x0E5B, category='po', description='THAI CHARACTER KHOMUT' },
+ [0x0E81] = { unicodeslot=0x0E81, category='lo', description='LAO LETTER KO' },
+ [0x0E82] = { unicodeslot=0x0E82, category='lo', description='LAO LETTER KHO SUNG' },
+ [0x0E84] = { unicodeslot=0x0E84, category='lo', description='LAO LETTER KHO TAM' },
+ [0x0E87] = { unicodeslot=0x0E87, category='lo', description='LAO LETTER NGO' },
+ [0x0E88] = { unicodeslot=0x0E88, category='lo', description='LAO LETTER CO' },
+ [0x0E8A] = { unicodeslot=0x0E8A, category='lo', description='LAO LETTER SO TAM' },
+ [0x0E8D] = { unicodeslot=0x0E8D, category='lo', description='LAO LETTER NYO' },
+ [0x0E94] = { unicodeslot=0x0E94, category='lo', description='LAO LETTER DO' },
+ [0x0E95] = { unicodeslot=0x0E95, category='lo', description='LAO LETTER TO' },
+ [0x0E96] = { unicodeslot=0x0E96, category='lo', description='LAO LETTER THO SUNG' },
+ [0x0E97] = { unicodeslot=0x0E97, category='lo', description='LAO LETTER THO TAM' },
+ [0x0E99] = { unicodeslot=0x0E99, category='lo', description='LAO LETTER NO' },
+ [0x0E9A] = { unicodeslot=0x0E9A, category='lo', description='LAO LETTER BO' },
+ [0x0E9B] = { unicodeslot=0x0E9B, category='lo', description='LAO LETTER PO' },
+ [0x0E9C] = { unicodeslot=0x0E9C, category='lo', description='LAO LETTER PHO SUNG' },
+ [0x0E9D] = { unicodeslot=0x0E9D, category='lo', description='LAO LETTER FO TAM' },
+ [0x0E9E] = { unicodeslot=0x0E9E, category='lo', description='LAO LETTER PHO TAM' },
+ [0x0E9F] = { unicodeslot=0x0E9F, category='lo', description='LAO LETTER FO SUNG' },
+ [0x0EA1] = { unicodeslot=0x0EA1, category='lo', description='LAO LETTER MO' },
+ [0x0EA2] = { unicodeslot=0x0EA2, category='lo', description='LAO LETTER YO' },
+ [0x0EA3] = { unicodeslot=0x0EA3, category='lo', description='LAO LETTER LO LING' },
+ [0x0EA5] = { unicodeslot=0x0EA5, category='lo', description='LAO LETTER LO LOOT' },
+ [0x0EA7] = { unicodeslot=0x0EA7, category='lo', description='LAO LETTER WO' },
+ [0x0EAA] = { unicodeslot=0x0EAA, category='lo', description='LAO LETTER SO SUNG' },
+ [0x0EAB] = { unicodeslot=0x0EAB, category='lo', description='LAO LETTER HO SUNG' },
+ [0x0EAD] = { unicodeslot=0x0EAD, category='lo', description='LAO LETTER O' },
+ [0x0EAE] = { unicodeslot=0x0EAE, category='lo', description='LAO LETTER HO TAM' },
+ [0x0EAF] = { unicodeslot=0x0EAF, category='lo', description='LAO ELLIPSIS' },
+ [0x0EB0] = { unicodeslot=0x0EB0, category='lo', description='LAO VOWEL SIGN A' },
+ [0x0EB1] = { unicodeslot=0x0EB1, category='mn', description='LAO VOWEL SIGN MAI KAN' },
+ [0x0EB2] = { unicodeslot=0x0EB2, category='lo', description='LAO VOWEL SIGN AA' },
+ [0x0EB3] = { unicodeslot=0x0EB3, category='lo', description='LAO VOWEL SIGN AM', specials={'compat',0x0ECD,0x0EB2} },
+ [0x0EB4] = { unicodeslot=0x0EB4, category='mn', description='LAO VOWEL SIGN I' },
+ [0x0EB5] = { unicodeslot=0x0EB5, category='mn', description='LAO VOWEL SIGN II' },
+ [0x0EB6] = { unicodeslot=0x0EB6, category='mn', description='LAO VOWEL SIGN Y' },
+ [0x0EB7] = { unicodeslot=0x0EB7, category='mn', description='LAO VOWEL SIGN YY' },
+ [0x0EB8] = { unicodeslot=0x0EB8, category='mn', description='LAO VOWEL SIGN U' },
+ [0x0EB9] = { unicodeslot=0x0EB9, category='mn', description='LAO VOWEL SIGN UU' },
+ [0x0EBB] = { unicodeslot=0x0EBB, category='mn', description='LAO VOWEL SIGN MAI KON' },
+ [0x0EBC] = { unicodeslot=0x0EBC, category='mn', description='LAO SEMIVOWEL SIGN LO' },
+ [0x0EBD] = { unicodeslot=0x0EBD, category='lo', description='LAO SEMIVOWEL SIGN NYO' },
+ [0x0EC0] = { unicodeslot=0x0EC0, category='lo', description='LAO VOWEL SIGN E' },
+ [0x0EC1] = { unicodeslot=0x0EC1, category='lo', description='LAO VOWEL SIGN EI' },
+ [0x0EC2] = { unicodeslot=0x0EC2, category='lo', description='LAO VOWEL SIGN O' },
+ [0x0EC3] = { unicodeslot=0x0EC3, category='lo', description='LAO VOWEL SIGN AY' },
+ [0x0EC4] = { unicodeslot=0x0EC4, category='lo', description='LAO VOWEL SIGN AI' },
+ [0x0EC6] = { unicodeslot=0x0EC6, category='lm', description='LAO KO LA' },
+ [0x0EC8] = { unicodeslot=0x0EC8, category='mn', description='LAO TONE MAI EK' },
+ [0x0EC9] = { unicodeslot=0x0EC9, category='mn', description='LAO TONE MAI THO' },
+ [0x0ECA] = { unicodeslot=0x0ECA, category='mn', description='LAO TONE MAI TI' },
+ [0x0ECB] = { unicodeslot=0x0ECB, category='mn', description='LAO TONE MAI CATAWA' },
+ [0x0ECC] = { unicodeslot=0x0ECC, category='mn', description='LAO CANCELLATION MARK' },
+ [0x0ECD] = { unicodeslot=0x0ECD, category='mn', description='LAO NIGGAHITA' },
+ [0x0ED0] = { unicodeslot=0x0ED0, category='nd', description='LAO DIGIT ZERO' },
+ [0x0ED1] = { unicodeslot=0x0ED1, category='nd', description='LAO DIGIT ONE' },
+ [0x0ED2] = { unicodeslot=0x0ED2, category='nd', description='LAO DIGIT TWO' },
+ [0x0ED3] = { unicodeslot=0x0ED3, category='nd', description='LAO DIGIT THREE' },
+ [0x0ED4] = { unicodeslot=0x0ED4, category='nd', description='LAO DIGIT FOUR' },
+ [0x0ED5] = { unicodeslot=0x0ED5, category='nd', description='LAO DIGIT FIVE' },
+ [0x0ED6] = { unicodeslot=0x0ED6, category='nd', description='LAO DIGIT SIX' },
+ [0x0ED7] = { unicodeslot=0x0ED7, category='nd', description='LAO DIGIT SEVEN' },
+ [0x0ED8] = { unicodeslot=0x0ED8, category='nd', description='LAO DIGIT EIGHT' },
+ [0x0ED9] = { unicodeslot=0x0ED9, category='nd', description='LAO DIGIT NINE' },
+ [0x0EDC] = { unicodeslot=0x0EDC, category='lo', description='LAO HO NO', specials={'compat',0x0EAB,0x0E99} },
+ [0x0EDD] = { unicodeslot=0x0EDD, category='lo', description='LAO HO MO', specials={'compat',0x0EAB,0x0EA1} },
+ [0x0F00] = { unicodeslot=0x0F00, category='lo', description='TIBETAN SYLLABLE OM' },
+ [0x0F01] = { unicodeslot=0x0F01, category='so', description='TIBETAN MARK GTER YIG MGO TRUNCATED A' },
+ [0x0F02] = { unicodeslot=0x0F02, category='so', description='TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA' },
+ [0x0F03] = { unicodeslot=0x0F03, category='so', description='TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA' },
+ [0x0F04] = { unicodeslot=0x0F04, category='po', description='TIBETAN MARK INITIAL YIG MGO MDUN MA' },
+ [0x0F05] = { unicodeslot=0x0F05, category='po', description='TIBETAN MARK CLOSING YIG MGO SGAB MA' },
+ [0x0F06] = { unicodeslot=0x0F06, category='po', description='TIBETAN MARK CARET YIG MGO PHUR SHAD MA' },
+ [0x0F07] = { unicodeslot=0x0F07, category='po', description='TIBETAN MARK YIG MGO TSHEG SHAD MA' },
+ [0x0F08] = { unicodeslot=0x0F08, category='po', description='TIBETAN MARK SBRUL SHAD' },
+ [0x0F09] = { unicodeslot=0x0F09, category='po', description='TIBETAN MARK BSKUR YIG MGO' },
+ [0x0F0A] = { unicodeslot=0x0F0A, category='po', description='TIBETAN MARK BKA- SHOG YIG MGO' },
+ [0x0F0B] = { unicodeslot=0x0F0B, category='po', description='TIBETAN MARK INTERSYLLABIC TSHEG' },
+ [0x0F0C] = { unicodeslot=0x0F0C, category='po', description='TIBETAN MARK DELIMITER TSHEG BSTAR', specials={'nobreak',0x0F0B} },
+ [0x0F0D] = { unicodeslot=0x0F0D, category='po', description='TIBETAN MARK SHAD' },
+ [0x0F0E] = { unicodeslot=0x0F0E, category='po', description='TIBETAN MARK NYIS SHAD' },
+ [0x0F0F] = { unicodeslot=0x0F0F, category='po', description='TIBETAN MARK TSHEG SHAD' },
+ [0x0F10] = { unicodeslot=0x0F10, category='po', description='TIBETAN MARK NYIS TSHEG SHAD' },
+ [0x0F11] = { unicodeslot=0x0F11, category='po', description='TIBETAN MARK RIN CHEN SPUNGS SHAD' },
+ [0x0F12] = { unicodeslot=0x0F12, category='po', description='TIBETAN MARK RGYA GRAM SHAD' },
+ [0x0F13] = { unicodeslot=0x0F13, category='so', description='TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN' },
+ [0x0F14] = { unicodeslot=0x0F14, category='so', description='TIBETAN MARK GTER TSHEG' },
+ [0x0F15] = { unicodeslot=0x0F15, category='so', description='TIBETAN LOGOTYPE SIGN CHAD RTAGS' },
+ [0x0F16] = { unicodeslot=0x0F16, category='so', description='TIBETAN LOGOTYPE SIGN LHAG RTAGS' },
+ [0x0F17] = { unicodeslot=0x0F17, category='so', description='TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS' },
+ [0x0F18] = { unicodeslot=0x0F18, category='mn', description='TIBETAN ASTROLOGICAL SIGN -KHYUD PA' },
+ [0x0F19] = { unicodeslot=0x0F19, category='mn', description='TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS' },
+ [0x0F1A] = { unicodeslot=0x0F1A, category='so', description='TIBETAN SIGN RDEL DKAR GCIG' },
+ [0x0F1B] = { unicodeslot=0x0F1B, category='so', description='TIBETAN SIGN RDEL DKAR GNYIS' },
+ [0x0F1C] = { unicodeslot=0x0F1C, category='so', description='TIBETAN SIGN RDEL DKAR GSUM' },
+ [0x0F1D] = { unicodeslot=0x0F1D, category='so', description='TIBETAN SIGN RDEL NAG GCIG' },
+ [0x0F1E] = { unicodeslot=0x0F1E, category='so', description='TIBETAN SIGN RDEL NAG GNYIS' },
+ [0x0F1F] = { unicodeslot=0x0F1F, category='so', description='TIBETAN SIGN RDEL DKAR RDEL NAG' },
+ [0x0F20] = { unicodeslot=0x0F20, category='nd', description='TIBETAN DIGIT ZERO' },
+ [0x0F21] = { unicodeslot=0x0F21, category='nd', description='TIBETAN DIGIT ONE' },
+ [0x0F22] = { unicodeslot=0x0F22, category='nd', description='TIBETAN DIGIT TWO' },
+ [0x0F23] = { unicodeslot=0x0F23, category='nd', description='TIBETAN DIGIT THREE' },
+ [0x0F24] = { unicodeslot=0x0F24, category='nd', description='TIBETAN DIGIT FOUR' },
+ [0x0F25] = { unicodeslot=0x0F25, category='nd', description='TIBETAN DIGIT FIVE' },
+ [0x0F26] = { unicodeslot=0x0F26, category='nd', description='TIBETAN DIGIT SIX' },
+ [0x0F27] = { unicodeslot=0x0F27, category='nd', description='TIBETAN DIGIT SEVEN' },
+ [0x0F28] = { unicodeslot=0x0F28, category='nd', description='TIBETAN DIGIT EIGHT' },
+ [0x0F29] = { unicodeslot=0x0F29, category='nd', description='TIBETAN DIGIT NINE' },
+ [0x0F2A] = { unicodeslot=0x0F2A, category='no', description='TIBETAN DIGIT HALF ONE' },
+ [0x0F2B] = { unicodeslot=0x0F2B, category='no', description='TIBETAN DIGIT HALF TWO' },
+ [0x0F2C] = { unicodeslot=0x0F2C, category='no', description='TIBETAN DIGIT HALF THREE' },
+ [0x0F2D] = { unicodeslot=0x0F2D, category='no', description='TIBETAN DIGIT HALF FOUR' },
+ [0x0F2E] = { unicodeslot=0x0F2E, category='no', description='TIBETAN DIGIT HALF FIVE' },
+ [0x0F2F] = { unicodeslot=0x0F2F, category='no', description='TIBETAN DIGIT HALF SIX' },
+ [0x0F30] = { unicodeslot=0x0F30, category='no', description='TIBETAN DIGIT HALF SEVEN' },
+ [0x0F31] = { unicodeslot=0x0F31, category='no', description='TIBETAN DIGIT HALF EIGHT' },
+ [0x0F32] = { unicodeslot=0x0F32, category='no', description='TIBETAN DIGIT HALF NINE' },
+ [0x0F33] = { unicodeslot=0x0F33, category='no', description='TIBETAN DIGIT HALF ZERO' },
+ [0x0F34] = { unicodeslot=0x0F34, category='so', description='TIBETAN MARK BSDUS RTAGS' },
+ [0x0F35] = { unicodeslot=0x0F35, category='mn', description='TIBETAN MARK NGAS BZUNG NYI ZLA' },
+ [0x0F36] = { unicodeslot=0x0F36, category='so', description='TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN' },
+ [0x0F37] = { unicodeslot=0x0F37, category='mn', description='TIBETAN MARK NGAS BZUNG SGOR RTAGS' },
+ [0x0F38] = { unicodeslot=0x0F38, category='so', description='TIBETAN MARK CHE MGO' },
+ [0x0F39] = { unicodeslot=0x0F39, category='mn', description='TIBETAN MARK TSA -PHRU' },
+ [0x0F3A] = { unicodeslot=0x0F3A, category='ps', description='TIBETAN MARK GUG RTAGS GYON' },
+ [0x0F3B] = { unicodeslot=0x0F3B, category='pe', description='TIBETAN MARK GUG RTAGS GYAS' },
+ [0x0F3C] = { unicodeslot=0x0F3C, category='ps', description='TIBETAN MARK ANG KHANG GYON' },
+ [0x0F3D] = { unicodeslot=0x0F3D, category='pe', description='TIBETAN MARK ANG KHANG GYAS' },
+ [0x0F3E] = { unicodeslot=0x0F3E, category='mc', description='TIBETAN SIGN YAR TSHES' },
+ [0x0F3F] = { unicodeslot=0x0F3F, category='mc', description='TIBETAN SIGN MAR TSHES' },
+ [0x0F40] = { unicodeslot=0x0F40, category='lo', description='TIBETAN LETTER KA' },
+ [0x0F41] = { unicodeslot=0x0F41, category='lo', description='TIBETAN LETTER KHA' },
+ [0x0F42] = { unicodeslot=0x0F42, category='lo', description='TIBETAN LETTER GA' },
+ [0x0F43] = { unicodeslot=0x0F43, category='lo', description='TIBETAN LETTER GHA', specials={'char',0x0F42,0x0FB7} },
+ [0x0F44] = { unicodeslot=0x0F44, category='lo', description='TIBETAN LETTER NGA' },
+ [0x0F45] = { unicodeslot=0x0F45, category='lo', description='TIBETAN LETTER CA' },
+ [0x0F46] = { unicodeslot=0x0F46, category='lo', description='TIBETAN LETTER CHA' },
+ [0x0F47] = { unicodeslot=0x0F47, category='lo', description='TIBETAN LETTER JA' },
+ [0x0F49] = { unicodeslot=0x0F49, category='lo', description='TIBETAN LETTER NYA' },
+ [0x0F4A] = { unicodeslot=0x0F4A, category='lo', description='TIBETAN LETTER TTA' },
+ [0x0F4B] = { unicodeslot=0x0F4B, category='lo', description='TIBETAN LETTER TTHA' },
+ [0x0F4C] = { unicodeslot=0x0F4C, category='lo', description='TIBETAN LETTER DDA' },
+ [0x0F4D] = { unicodeslot=0x0F4D, category='lo', description='TIBETAN LETTER DDHA', specials={'char',0x0F4C,0x0FB7} },
+ [0x0F4E] = { unicodeslot=0x0F4E, category='lo', description='TIBETAN LETTER NNA' },
+ [0x0F4F] = { unicodeslot=0x0F4F, category='lo', description='TIBETAN LETTER TA' },
+ [0x0F50] = { unicodeslot=0x0F50, category='lo', description='TIBETAN LETTER THA' },
+ [0x0F51] = { unicodeslot=0x0F51, category='lo', description='TIBETAN LETTER DA' },
+ [0x0F52] = { unicodeslot=0x0F52, category='lo', description='TIBETAN LETTER DHA', specials={'char',0x0F51,0x0FB7} },
+ [0x0F53] = { unicodeslot=0x0F53, category='lo', description='TIBETAN LETTER NA' },
+ [0x0F54] = { unicodeslot=0x0F54, category='lo', description='TIBETAN LETTER PA' },
+ [0x0F55] = { unicodeslot=0x0F55, category='lo', description='TIBETAN LETTER PHA' },
+ [0x0F56] = { unicodeslot=0x0F56, category='lo', description='TIBETAN LETTER BA' },
+ [0x0F57] = { unicodeslot=0x0F57, category='lo', description='TIBETAN LETTER BHA', specials={'char',0x0F56,0x0FB7} },
+ [0x0F58] = { unicodeslot=0x0F58, category='lo', description='TIBETAN LETTER MA' },
+ [0x0F59] = { unicodeslot=0x0F59, category='lo', description='TIBETAN LETTER TSA' },
+ [0x0F5A] = { unicodeslot=0x0F5A, category='lo', description='TIBETAN LETTER TSHA' },
+ [0x0F5B] = { unicodeslot=0x0F5B, category='lo', description='TIBETAN LETTER DZA' },
+ [0x0F5C] = { unicodeslot=0x0F5C, category='lo', description='TIBETAN LETTER DZHA', specials={'char',0x0F5B,0x0FB7} },
+ [0x0F5D] = { unicodeslot=0x0F5D, category='lo', description='TIBETAN LETTER WA' },
+ [0x0F5E] = { unicodeslot=0x0F5E, category='lo', description='TIBETAN LETTER ZHA' },
+ [0x0F5F] = { unicodeslot=0x0F5F, category='lo', description='TIBETAN LETTER ZA' },
+ [0x0F60] = { unicodeslot=0x0F60, category='lo', description='TIBETAN LETTER -A' },
+ [0x0F61] = { unicodeslot=0x0F61, category='lo', description='TIBETAN LETTER YA' },
+ [0x0F62] = { unicodeslot=0x0F62, category='lo', description='TIBETAN LETTER RA' },
+ [0x0F63] = { unicodeslot=0x0F63, category='lo', description='TIBETAN LETTER LA' },
+ [0x0F64] = { unicodeslot=0x0F64, category='lo', description='TIBETAN LETTER SHA' },
+ [0x0F65] = { unicodeslot=0x0F65, category='lo', description='TIBETAN LETTER SSA' },
+ [0x0F66] = { unicodeslot=0x0F66, category='lo', description='TIBETAN LETTER SA' },
+ [0x0F67] = { unicodeslot=0x0F67, category='lo', description='TIBETAN LETTER HA' },
+ [0x0F68] = { unicodeslot=0x0F68, category='lo', description='TIBETAN LETTER A' },
+ [0x0F69] = { unicodeslot=0x0F69, category='lo', description='TIBETAN LETTER KSSA', specials={'char',0x0F40,0x0FB5} },
+ [0x0F6A] = { unicodeslot=0x0F6A, category='lo', description='TIBETAN LETTER FIXED-FORM RA' },
+ [0x0F71] = { unicodeslot=0x0F71, category='mn', description='TIBETAN VOWEL SIGN AA' },
+ [0x0F72] = { unicodeslot=0x0F72, category='mn', description='TIBETAN VOWEL SIGN I' },
+ [0x0F73] = { unicodeslot=0x0F73, category='mn', description='TIBETAN VOWEL SIGN II', specials={'char',0x0F71,0x0F72} },
+ [0x0F74] = { unicodeslot=0x0F74, category='mn', description='TIBETAN VOWEL SIGN U' },
+ [0x0F75] = { unicodeslot=0x0F75, category='mn', description='TIBETAN VOWEL SIGN UU', specials={'char',0x0F71,0x0F74} },
+ [0x0F76] = { unicodeslot=0x0F76, category='mn', description='TIBETAN VOWEL SIGN VOCALIC R', specials={'char',0x0FB2,0x0F80} },
+ [0x0F77] = { unicodeslot=0x0F77, category='mn', description='TIBETAN VOWEL SIGN VOCALIC RR', specials={'compat',0x0FB2,0x0F81} },
+ [0x0F78] = { unicodeslot=0x0F78, category='mn', description='TIBETAN VOWEL SIGN VOCALIC L', specials={'char',0x0FB3,0x0F80} },
+ [0x0F79] = { unicodeslot=0x0F79, category='mn', description='TIBETAN VOWEL SIGN VOCALIC LL', specials={'compat',0x0FB3,0x0F81} },
+ [0x0F7A] = { unicodeslot=0x0F7A, category='mn', description='TIBETAN VOWEL SIGN E' },
+ [0x0F7B] = { unicodeslot=0x0F7B, category='mn', description='TIBETAN VOWEL SIGN EE' },
+ [0x0F7C] = { unicodeslot=0x0F7C, category='mn', description='TIBETAN VOWEL SIGN O' },
+ [0x0F7D] = { unicodeslot=0x0F7D, category='mn', description='TIBETAN VOWEL SIGN OO' },
+ [0x0F7E] = { unicodeslot=0x0F7E, category='mn', description='TIBETAN SIGN RJES SU NGA RO' },
+ [0x0F7F] = { unicodeslot=0x0F7F, category='mc', description='TIBETAN SIGN RNAM BCAD' },
+ [0x0F80] = { unicodeslot=0x0F80, category='mn', description='TIBETAN VOWEL SIGN REVERSED I' },
+ [0x0F81] = { unicodeslot=0x0F81, category='mn', description='TIBETAN VOWEL SIGN REVERSED II', specials={'char',0x0F71,0x0F80} },
+ [0x0F82] = { unicodeslot=0x0F82, category='mn', description='TIBETAN SIGN NYI ZLA NAA DA' },
+ [0x0F83] = { unicodeslot=0x0F83, category='mn', description='TIBETAN SIGN SNA LDAN' },
+ [0x0F84] = { unicodeslot=0x0F84, category='mn', description='TIBETAN MARK HALANTA' },
+ [0x0F85] = { unicodeslot=0x0F85, category='po', description='TIBETAN MARK PALUTA' },
+ [0x0F86] = { unicodeslot=0x0F86, category='mn', description='TIBETAN SIGN LCI RTAGS' },
+ [0x0F87] = { unicodeslot=0x0F87, category='mn', description='TIBETAN SIGN YANG RTAGS' },
+ [0x0F88] = { unicodeslot=0x0F88, category='lo', description='TIBETAN SIGN LCE TSA CAN' },
+ [0x0F89] = { unicodeslot=0x0F89, category='lo', description='TIBETAN SIGN MCHU CAN' },
+ [0x0F8A] = { unicodeslot=0x0F8A, category='lo', description='TIBETAN SIGN GRU CAN RGYINGS' },
+ [0x0F8B] = { unicodeslot=0x0F8B, category='lo', description='TIBETAN SIGN GRU MED RGYINGS' },
+ [0x0F90] = { unicodeslot=0x0F90, category='mn', description='TIBETAN SUBJOINED LETTER KA' },
+ [0x0F91] = { unicodeslot=0x0F91, category='mn', description='TIBETAN SUBJOINED LETTER KHA' },
+ [0x0F92] = { unicodeslot=0x0F92, category='mn', description='TIBETAN SUBJOINED LETTER GA' },
+ [0x0F93] = { unicodeslot=0x0F93, category='mn', description='TIBETAN SUBJOINED LETTER GHA', specials={'char',0x0F92,0x0FB7} },
+ [0x0F94] = { unicodeslot=0x0F94, category='mn', description='TIBETAN SUBJOINED LETTER NGA' },
+ [0x0F95] = { unicodeslot=0x0F95, category='mn', description='TIBETAN SUBJOINED LETTER CA' },
+ [0x0F96] = { unicodeslot=0x0F96, category='mn', description='TIBETAN SUBJOINED LETTER CHA' },
+ [0x0F97] = { unicodeslot=0x0F97, category='mn', description='TIBETAN SUBJOINED LETTER JA' },
+ [0x0F99] = { unicodeslot=0x0F99, category='mn', description='TIBETAN SUBJOINED LETTER NYA' },
+ [0x0F9A] = { unicodeslot=0x0F9A, category='mn', description='TIBETAN SUBJOINED LETTER TTA' },
+ [0x0F9B] = { unicodeslot=0x0F9B, category='mn', description='TIBETAN SUBJOINED LETTER TTHA' },
+ [0x0F9C] = { unicodeslot=0x0F9C, category='mn', description='TIBETAN SUBJOINED LETTER DDA' },
+ [0x0F9D] = { unicodeslot=0x0F9D, category='mn', description='TIBETAN SUBJOINED LETTER DDHA', specials={'char',0x0F9C,0x0FB7} },
+ [0x0F9E] = { unicodeslot=0x0F9E, category='mn', description='TIBETAN SUBJOINED LETTER NNA' },
+ [0x0F9F] = { unicodeslot=0x0F9F, category='mn', description='TIBETAN SUBJOINED LETTER TA' },
+ [0x0FA0] = { unicodeslot=0x0FA0, category='mn', description='TIBETAN SUBJOINED LETTER THA' },
+ [0x0FA1] = { unicodeslot=0x0FA1, category='mn', description='TIBETAN SUBJOINED LETTER DA' },
+ [0x0FA2] = { unicodeslot=0x0FA2, category='mn', description='TIBETAN SUBJOINED LETTER DHA', specials={'char',0x0FA1,0x0FB7} },
+ [0x0FA3] = { unicodeslot=0x0FA3, category='mn', description='TIBETAN SUBJOINED LETTER NA' },
+ [0x0FA4] = { unicodeslot=0x0FA4, category='mn', description='TIBETAN SUBJOINED LETTER PA' },
+ [0x0FA5] = { unicodeslot=0x0FA5, category='mn', description='TIBETAN SUBJOINED LETTER PHA' },
+ [0x0FA6] = { unicodeslot=0x0FA6, category='mn', description='TIBETAN SUBJOINED LETTER BA' },
+ [0x0FA7] = { unicodeslot=0x0FA7, category='mn', description='TIBETAN SUBJOINED LETTER BHA', specials={'char',0x0FA6,0x0FB7} },
+ [0x0FA8] = { unicodeslot=0x0FA8, category='mn', description='TIBETAN SUBJOINED LETTER MA' },
+ [0x0FA9] = { unicodeslot=0x0FA9, category='mn', description='TIBETAN SUBJOINED LETTER TSA' },
+ [0x0FAA] = { unicodeslot=0x0FAA, category='mn', description='TIBETAN SUBJOINED LETTER TSHA' },
+ [0x0FAB] = { unicodeslot=0x0FAB, category='mn', description='TIBETAN SUBJOINED LETTER DZA' },
+ [0x0FAC] = { unicodeslot=0x0FAC, category='mn', description='TIBETAN SUBJOINED LETTER DZHA', specials={'char',0x0FAB,0x0FB7} },
+ [0x0FAD] = { unicodeslot=0x0FAD, category='mn', description='TIBETAN SUBJOINED LETTER WA' },
+ [0x0FAE] = { unicodeslot=0x0FAE, category='mn', description='TIBETAN SUBJOINED LETTER ZHA' },
+ [0x0FAF] = { unicodeslot=0x0FAF, category='mn', description='TIBETAN SUBJOINED LETTER ZA' },
+ [0x0FB0] = { unicodeslot=0x0FB0, category='mn', description='TIBETAN SUBJOINED LETTER -A' },
+ [0x0FB1] = { unicodeslot=0x0FB1, category='mn', description='TIBETAN SUBJOINED LETTER YA' },
+ [0x0FB2] = { unicodeslot=0x0FB2, category='mn', description='TIBETAN SUBJOINED LETTER RA' },
+ [0x0FB3] = { unicodeslot=0x0FB3, category='mn', description='TIBETAN SUBJOINED LETTER LA' },
+ [0x0FB4] = { unicodeslot=0x0FB4, category='mn', description='TIBETAN SUBJOINED LETTER SHA' },
+ [0x0FB5] = { unicodeslot=0x0FB5, category='mn', description='TIBETAN SUBJOINED LETTER SSA' },
+ [0x0FB6] = { unicodeslot=0x0FB6, category='mn', description='TIBETAN SUBJOINED LETTER SA' },
+ [0x0FB7] = { unicodeslot=0x0FB7, category='mn', description='TIBETAN SUBJOINED LETTER HA' },
+ [0x0FB8] = { unicodeslot=0x0FB8, category='mn', description='TIBETAN SUBJOINED LETTER A' },
+ [0x0FB9] = { unicodeslot=0x0FB9, category='mn', description='TIBETAN SUBJOINED LETTER KSSA', specials={'char',0x0F90,0x0FB5} },
+ [0x0FBA] = { unicodeslot=0x0FBA, category='mn', description='TIBETAN SUBJOINED LETTER FIXED-FORM WA' },
+ [0x0FBB] = { unicodeslot=0x0FBB, category='mn', description='TIBETAN SUBJOINED LETTER FIXED-FORM YA' },
+ [0x0FBC] = { unicodeslot=0x0FBC, category='mn', description='TIBETAN SUBJOINED LETTER FIXED-FORM RA' },
+ [0x0FBE] = { unicodeslot=0x0FBE, category='so', description='TIBETAN KU RU KHA' },
+ [0x0FBF] = { unicodeslot=0x0FBF, category='so', description='TIBETAN KU RU KHA BZHI MIG CAN' },
+ [0x0FC0] = { unicodeslot=0x0FC0, category='so', description='TIBETAN CANTILLATION SIGN HEAVY BEAT' },
+ [0x0FC1] = { unicodeslot=0x0FC1, category='so', description='TIBETAN CANTILLATION SIGN LIGHT BEAT' },
+ [0x0FC2] = { unicodeslot=0x0FC2, category='so', description='TIBETAN CANTILLATION SIGN CANG TE-U' },
+ [0x0FC3] = { unicodeslot=0x0FC3, category='so', description='TIBETAN CANTILLATION SIGN SBUB -CHAL' },
+ [0x0FC4] = { unicodeslot=0x0FC4, category='so', description='TIBETAN SYMBOL DRIL BU' },
+ [0x0FC5] = { unicodeslot=0x0FC5, category='so', description='TIBETAN SYMBOL RDO RJE' },
+ [0x0FC6] = { unicodeslot=0x0FC6, category='mn', description='TIBETAN SYMBOL PADMA GDAN' },
+ [0x0FC7] = { unicodeslot=0x0FC7, category='so', description='TIBETAN SYMBOL RDO RJE RGYA GRAM' },
+ [0x0FC8] = { unicodeslot=0x0FC8, category='so', description='TIBETAN SYMBOL PHUR PA' },
+ [0x0FC9] = { unicodeslot=0x0FC9, category='so', description='TIBETAN SYMBOL NOR BU' },
+ [0x0FCA] = { unicodeslot=0x0FCA, category='so', description='TIBETAN SYMBOL NOR BU NYIS -KHYIL' },
+ [0x0FCB] = { unicodeslot=0x0FCB, category='so', description='TIBETAN SYMBOL NOR BU GSUM -KHYIL' },
+ [0x0FCC] = { unicodeslot=0x0FCC, category='so', description='TIBETAN SYMBOL NOR BU BZHI -KHYIL' },
+ [0x0FCF] = { unicodeslot=0x0FCF, category='so', description='TIBETAN SIGN RDEL NAG GSUM' },
+ [0x0FD0] = { unicodeslot=0x0FD0, category='po', description='TIBETAN MARK BSKA- SHOG GI MGO RGYAN' },
+ [0x0FD1] = { unicodeslot=0x0FD1, category='po', description='TIBETAN MARK MNYAM YIG GI MGO RGYAN' },
+ [0x1000] = { unicodeslot=0x1000, category='lo', description='MYANMAR LETTER KA' },
+ [0x1001] = { unicodeslot=0x1001, category='lo', description='MYANMAR LETTER KHA' },
+ [0x1002] = { unicodeslot=0x1002, category='lo', description='MYANMAR LETTER GA' },
+ [0x1003] = { unicodeslot=0x1003, category='lo', description='MYANMAR LETTER GHA' },
+ [0x1004] = { unicodeslot=0x1004, category='lo', description='MYANMAR LETTER NGA' },
+ [0x1005] = { unicodeslot=0x1005, category='lo', description='MYANMAR LETTER CA' },
+ [0x1006] = { unicodeslot=0x1006, category='lo', description='MYANMAR LETTER CHA' },
+ [0x1007] = { unicodeslot=0x1007, category='lo', description='MYANMAR LETTER JA' },
+ [0x1008] = { unicodeslot=0x1008, category='lo', description='MYANMAR LETTER JHA' },
+ [0x1009] = { unicodeslot=0x1009, category='lo', description='MYANMAR LETTER NYA' },
+ [0x100A] = { unicodeslot=0x100A, category='lo', description='MYANMAR LETTER NNYA' },
+ [0x100B] = { unicodeslot=0x100B, category='lo', description='MYANMAR LETTER TTA' },
+ [0x100C] = { unicodeslot=0x100C, category='lo', description='MYANMAR LETTER TTHA' },
+ [0x100D] = { unicodeslot=0x100D, category='lo', description='MYANMAR LETTER DDA' },
+ [0x100E] = { unicodeslot=0x100E, category='lo', description='MYANMAR LETTER DDHA' },
+ [0x100F] = { unicodeslot=0x100F, category='lo', description='MYANMAR LETTER NNA' },
+ [0x1010] = { unicodeslot=0x1010, category='lo', description='MYANMAR LETTER TA' },
+ [0x1011] = { unicodeslot=0x1011, category='lo', description='MYANMAR LETTER THA' },
+ [0x1012] = { unicodeslot=0x1012, category='lo', description='MYANMAR LETTER DA' },
+ [0x1013] = { unicodeslot=0x1013, category='lo', description='MYANMAR LETTER DHA' },
+ [0x1014] = { unicodeslot=0x1014, category='lo', description='MYANMAR LETTER NA' },
+ [0x1015] = { unicodeslot=0x1015, category='lo', description='MYANMAR LETTER PA' },
+ [0x1016] = { unicodeslot=0x1016, category='lo', description='MYANMAR LETTER PHA' },
+ [0x1017] = { unicodeslot=0x1017, category='lo', description='MYANMAR LETTER BA' },
+ [0x1018] = { unicodeslot=0x1018, category='lo', description='MYANMAR LETTER BHA' },
+ [0x1019] = { unicodeslot=0x1019, category='lo', description='MYANMAR LETTER MA' },
+ [0x101A] = { unicodeslot=0x101A, category='lo', description='MYANMAR LETTER YA' },
+ [0x101B] = { unicodeslot=0x101B, category='lo', description='MYANMAR LETTER RA' },
+ [0x101C] = { unicodeslot=0x101C, category='lo', description='MYANMAR LETTER LA' },
+ [0x101D] = { unicodeslot=0x101D, category='lo', description='MYANMAR LETTER WA' },
+ [0x101E] = { unicodeslot=0x101E, category='lo', description='MYANMAR LETTER SA' },
+ [0x101F] = { unicodeslot=0x101F, category='lo', description='MYANMAR LETTER HA' },
+ [0x1020] = { unicodeslot=0x1020, category='lo', description='MYANMAR LETTER LLA' },
+ [0x1021] = { unicodeslot=0x1021, category='lo', description='MYANMAR LETTER A' },
+ [0x1023] = { unicodeslot=0x1023, category='lo', description='MYANMAR LETTER I' },
+ [0x1024] = { unicodeslot=0x1024, category='lo', description='MYANMAR LETTER II' },
+ [0x1025] = { unicodeslot=0x1025, category='lo', description='MYANMAR LETTER U' },
+ [0x1026] = { unicodeslot=0x1026, category='lo', description='MYANMAR LETTER UU', specials={'char',0x1025,0x102E} },
+ [0x1027] = { unicodeslot=0x1027, category='lo', description='MYANMAR LETTER E' },
+ [0x1029] = { unicodeslot=0x1029, category='lo', description='MYANMAR LETTER O' },
+ [0x102A] = { unicodeslot=0x102A, category='lo', description='MYANMAR LETTER AU' },
+ [0x102C] = { unicodeslot=0x102C, category='mc', description='MYANMAR VOWEL SIGN AA' },
+ [0x102D] = { unicodeslot=0x102D, category='mn', description='MYANMAR VOWEL SIGN I' },
+ [0x102E] = { unicodeslot=0x102E, category='mn', description='MYANMAR VOWEL SIGN II' },
+ [0x102F] = { unicodeslot=0x102F, category='mn', description='MYANMAR VOWEL SIGN U' },
+ [0x1030] = { unicodeslot=0x1030, category='mn', description='MYANMAR VOWEL SIGN UU' },
+ [0x1031] = { unicodeslot=0x1031, category='mc', description='MYANMAR VOWEL SIGN E' },
+ [0x1032] = { unicodeslot=0x1032, category='mn', description='MYANMAR VOWEL SIGN AI' },
+ [0x1036] = { unicodeslot=0x1036, category='mn', description='MYANMAR SIGN ANUSVARA' },
+ [0x1037] = { unicodeslot=0x1037, category='mn', description='MYANMAR SIGN DOT BELOW' },
+ [0x1038] = { unicodeslot=0x1038, category='mc', description='MYANMAR SIGN VISARGA' },
+ [0x1039] = { unicodeslot=0x1039, category='mn', description='MYANMAR SIGN VIRAMA' },
+ [0x1040] = { unicodeslot=0x1040, category='nd', description='MYANMAR DIGIT ZERO' },
+ [0x1041] = { unicodeslot=0x1041, category='nd', description='MYANMAR DIGIT ONE' },
+ [0x1042] = { unicodeslot=0x1042, category='nd', description='MYANMAR DIGIT TWO' },
+ [0x1043] = { unicodeslot=0x1043, category='nd', description='MYANMAR DIGIT THREE' },
+ [0x1044] = { unicodeslot=0x1044, category='nd', description='MYANMAR DIGIT FOUR' },
+ [0x1045] = { unicodeslot=0x1045, category='nd', description='MYANMAR DIGIT FIVE' },
+ [0x1046] = { unicodeslot=0x1046, category='nd', description='MYANMAR DIGIT SIX' },
+ [0x1047] = { unicodeslot=0x1047, category='nd', description='MYANMAR DIGIT SEVEN' },
+ [0x1048] = { unicodeslot=0x1048, category='nd', description='MYANMAR DIGIT EIGHT' },
+ [0x1049] = { unicodeslot=0x1049, category='nd', description='MYANMAR DIGIT NINE' },
+ [0x104A] = { unicodeslot=0x104A, category='po', description='MYANMAR SIGN LITTLE SECTION' },
+ [0x104B] = { unicodeslot=0x104B, category='po', description='MYANMAR SIGN SECTION' },
+ [0x104C] = { unicodeslot=0x104C, category='po', description='MYANMAR SYMBOL LOCATIVE' },
+ [0x104D] = { unicodeslot=0x104D, category='po', description='MYANMAR SYMBOL COMPLETED' },
+ [0x104E] = { unicodeslot=0x104E, category='po', description='MYANMAR SYMBOL AFOREMENTIONED' },
+ [0x104F] = { unicodeslot=0x104F, category='po', description='MYANMAR SYMBOL GENITIVE' },
+ [0x1050] = { unicodeslot=0x1050, category='lo', description='MYANMAR LETTER SHA' },
+ [0x1051] = { unicodeslot=0x1051, category='lo', description='MYANMAR LETTER SSA' },
+ [0x1052] = { unicodeslot=0x1052, category='lo', description='MYANMAR LETTER VOCALIC R' },
+ [0x1053] = { unicodeslot=0x1053, category='lo', description='MYANMAR LETTER VOCALIC RR' },
+ [0x1054] = { unicodeslot=0x1054, category='lo', description='MYANMAR LETTER VOCALIC L' },
+ [0x1055] = { unicodeslot=0x1055, category='lo', description='MYANMAR LETTER VOCALIC LL' },
+ [0x1056] = { unicodeslot=0x1056, category='mc', description='MYANMAR VOWEL SIGN VOCALIC R' },
+ [0x1057] = { unicodeslot=0x1057, category='mc', description='MYANMAR VOWEL SIGN VOCALIC RR' },
+ [0x1058] = { unicodeslot=0x1058, category='mn', description='MYANMAR VOWEL SIGN VOCALIC L' },
+ [0x1059] = { unicodeslot=0x1059, category='mn', description='MYANMAR VOWEL SIGN VOCALIC LL' },
+ [0x10A0] = { unicodeslot=0x10A0, category='lu', description='GEORGIAN CAPITAL LETTER AN', lccode=0x2D00 },
+ [0x10A1] = { unicodeslot=0x10A1, category='lu', description='GEORGIAN CAPITAL LETTER BAN', lccode=0x2D01 },
+ [0x10A2] = { unicodeslot=0x10A2, category='lu', description='GEORGIAN CAPITAL LETTER GAN', lccode=0x2D02 },
+ [0x10A3] = { unicodeslot=0x10A3, category='lu', description='GEORGIAN CAPITAL LETTER DON', lccode=0x2D03 },
+ [0x10A4] = { unicodeslot=0x10A4, category='lu', description='GEORGIAN CAPITAL LETTER EN', lccode=0x2D04 },
+ [0x10A5] = { unicodeslot=0x10A5, category='lu', description='GEORGIAN CAPITAL LETTER VIN', lccode=0x2D05 },
+ [0x10A6] = { unicodeslot=0x10A6, category='lu', description='GEORGIAN CAPITAL LETTER ZEN', lccode=0x2D06 },
+ [0x10A7] = { unicodeslot=0x10A7, category='lu', description='GEORGIAN CAPITAL LETTER TAN', lccode=0x2D07 },
+ [0x10A8] = { unicodeslot=0x10A8, category='lu', description='GEORGIAN CAPITAL LETTER IN', lccode=0x2D08 },
+ [0x10A9] = { unicodeslot=0x10A9, category='lu', description='GEORGIAN CAPITAL LETTER KAN', lccode=0x2D09 },
+ [0x10AA] = { unicodeslot=0x10AA, category='lu', description='GEORGIAN CAPITAL LETTER LAS', lccode=0x2D0A },
+ [0x10AB] = { unicodeslot=0x10AB, category='lu', description='GEORGIAN CAPITAL LETTER MAN', lccode=0x2D0B },
+ [0x10AC] = { unicodeslot=0x10AC, category='lu', description='GEORGIAN CAPITAL LETTER NAR', lccode=0x2D0C },
+ [0x10AD] = { unicodeslot=0x10AD, category='lu', description='GEORGIAN CAPITAL LETTER ON', lccode=0x2D0D },
+ [0x10AE] = { unicodeslot=0x10AE, category='lu', description='GEORGIAN CAPITAL LETTER PAR', lccode=0x2D0E },
+ [0x10AF] = { unicodeslot=0x10AF, category='lu', description='GEORGIAN CAPITAL LETTER ZHAR', lccode=0x2D0F },
+ [0x10B0] = { unicodeslot=0x10B0, category='lu', description='GEORGIAN CAPITAL LETTER RAE', lccode=0x2D10 },
+ [0x10B1] = { unicodeslot=0x10B1, category='lu', description='GEORGIAN CAPITAL LETTER SAN', lccode=0x2D11 },
+ [0x10B2] = { unicodeslot=0x10B2, category='lu', description='GEORGIAN CAPITAL LETTER TAR', lccode=0x2D12 },
+ [0x10B3] = { unicodeslot=0x10B3, category='lu', description='GEORGIAN CAPITAL LETTER UN', lccode=0x2D13 },
+ [0x10B4] = { unicodeslot=0x10B4, category='lu', description='GEORGIAN CAPITAL LETTER PHAR', lccode=0x2D14 },
+ [0x10B5] = { unicodeslot=0x10B5, category='lu', description='GEORGIAN CAPITAL LETTER KHAR', lccode=0x2D15 },
+ [0x10B6] = { unicodeslot=0x10B6, category='lu', description='GEORGIAN CAPITAL LETTER GHAN', lccode=0x2D16 },
+ [0x10B7] = { unicodeslot=0x10B7, category='lu', description='GEORGIAN CAPITAL LETTER QAR', lccode=0x2D17 },
+ [0x10B8] = { unicodeslot=0x10B8, category='lu', description='GEORGIAN CAPITAL LETTER SHIN', lccode=0x2D18 },
+ [0x10B9] = { unicodeslot=0x10B9, category='lu', description='GEORGIAN CAPITAL LETTER CHIN', lccode=0x2D19 },
+ [0x10BA] = { unicodeslot=0x10BA, category='lu', description='GEORGIAN CAPITAL LETTER CAN', lccode=0x2D1A },
+ [0x10BB] = { unicodeslot=0x10BB, category='lu', description='GEORGIAN CAPITAL LETTER JIL', lccode=0x2D1B },
+ [0x10BC] = { unicodeslot=0x10BC, category='lu', description='GEORGIAN CAPITAL LETTER CIL', lccode=0x2D1C },
+ [0x10BD] = { unicodeslot=0x10BD, category='lu', description='GEORGIAN CAPITAL LETTER CHAR', lccode=0x2D1D },
+ [0x10BE] = { unicodeslot=0x10BE, category='lu', description='GEORGIAN CAPITAL LETTER XAN', lccode=0x2D1E },
+ [0x10BF] = { unicodeslot=0x10BF, category='lu', description='GEORGIAN CAPITAL LETTER JHAN', lccode=0x2D1F },
+ [0x10C0] = { unicodeslot=0x10C0, category='lu', description='GEORGIAN CAPITAL LETTER HAE', lccode=0x2D20 },
+ [0x10C1] = { unicodeslot=0x10C1, category='lu', description='GEORGIAN CAPITAL LETTER HE', lccode=0x2D21 },
+ [0x10C2] = { unicodeslot=0x10C2, category='lu', description='GEORGIAN CAPITAL LETTER HIE', lccode=0x2D22 },
+ [0x10C3] = { unicodeslot=0x10C3, category='lu', description='GEORGIAN CAPITAL LETTER WE', lccode=0x2D23 },
+ [0x10C4] = { unicodeslot=0x10C4, category='lu', description='GEORGIAN CAPITAL LETTER HAR', lccode=0x2D24 },
+ [0x10C5] = { unicodeslot=0x10C5, category='lu', description='GEORGIAN CAPITAL LETTER HOE', lccode=0x2D25 },
+ [0x10D0] = { unicodeslot=0x10D0, category='lo', description='GEORGIAN LETTER AN' },
+ [0x10D1] = { unicodeslot=0x10D1, category='lo', description='GEORGIAN LETTER BAN' },
+ [0x10D2] = { unicodeslot=0x10D2, category='lo', description='GEORGIAN LETTER GAN' },
+ [0x10D3] = { unicodeslot=0x10D3, category='lo', description='GEORGIAN LETTER DON' },
+ [0x10D4] = { unicodeslot=0x10D4, category='lo', description='GEORGIAN LETTER EN' },
+ [0x10D5] = { unicodeslot=0x10D5, category='lo', description='GEORGIAN LETTER VIN' },
+ [0x10D6] = { unicodeslot=0x10D6, category='lo', description='GEORGIAN LETTER ZEN' },
+ [0x10D7] = { unicodeslot=0x10D7, category='lo', description='GEORGIAN LETTER TAN' },
+ [0x10D8] = { unicodeslot=0x10D8, category='lo', description='GEORGIAN LETTER IN' },
+ [0x10D9] = { unicodeslot=0x10D9, category='lo', description='GEORGIAN LETTER KAN' },
+ [0x10DA] = { unicodeslot=0x10DA, category='lo', description='GEORGIAN LETTER LAS' },
+ [0x10DB] = { unicodeslot=0x10DB, category='lo', description='GEORGIAN LETTER MAN' },
+ [0x10DC] = { unicodeslot=0x10DC, category='lo', description='GEORGIAN LETTER NAR' },
+ [0x10DD] = { unicodeslot=0x10DD, category='lo', description='GEORGIAN LETTER ON' },
+ [0x10DE] = { unicodeslot=0x10DE, category='lo', description='GEORGIAN LETTER PAR' },
+ [0x10DF] = { unicodeslot=0x10DF, category='lo', description='GEORGIAN LETTER ZHAR' },
+ [0x10E0] = { unicodeslot=0x10E0, category='lo', description='GEORGIAN LETTER RAE' },
+ [0x10E1] = { unicodeslot=0x10E1, category='lo', description='GEORGIAN LETTER SAN' },
+ [0x10E2] = { unicodeslot=0x10E2, category='lo', description='GEORGIAN LETTER TAR' },
+ [0x10E3] = { unicodeslot=0x10E3, category='lo', description='GEORGIAN LETTER UN' },
+ [0x10E4] = { unicodeslot=0x10E4, category='lo', description='GEORGIAN LETTER PHAR' },
+ [0x10E5] = { unicodeslot=0x10E5, category='lo', description='GEORGIAN LETTER KHAR' },
+ [0x10E6] = { unicodeslot=0x10E6, category='lo', description='GEORGIAN LETTER GHAN' },
+ [0x10E7] = { unicodeslot=0x10E7, category='lo', description='GEORGIAN LETTER QAR' },
+ [0x10E8] = { unicodeslot=0x10E8, category='lo', description='GEORGIAN LETTER SHIN' },
+ [0x10E9] = { unicodeslot=0x10E9, category='lo', description='GEORGIAN LETTER CHIN' },
+ [0x10EA] = { unicodeslot=0x10EA, category='lo', description='GEORGIAN LETTER CAN' },
+ [0x10EB] = { unicodeslot=0x10EB, category='lo', description='GEORGIAN LETTER JIL' },
+ [0x10EC] = { unicodeslot=0x10EC, category='lo', description='GEORGIAN LETTER CIL' },
+ [0x10ED] = { unicodeslot=0x10ED, category='lo', description='GEORGIAN LETTER CHAR' },
+ [0x10EE] = { unicodeslot=0x10EE, category='lo', description='GEORGIAN LETTER XAN' },
+ [0x10EF] = { unicodeslot=0x10EF, category='lo', description='GEORGIAN LETTER JHAN' },
+ [0x10F0] = { unicodeslot=0x10F0, category='lo', description='GEORGIAN LETTER HAE' },
+ [0x10F1] = { unicodeslot=0x10F1, category='lo', description='GEORGIAN LETTER HE' },
+ [0x10F2] = { unicodeslot=0x10F2, category='lo', description='GEORGIAN LETTER HIE' },
+ [0x10F3] = { unicodeslot=0x10F3, category='lo', description='GEORGIAN LETTER WE' },
+ [0x10F4] = { unicodeslot=0x10F4, category='lo', description='GEORGIAN LETTER HAR' },
+ [0x10F5] = { unicodeslot=0x10F5, category='lo', description='GEORGIAN LETTER HOE' },
+ [0x10F6] = { unicodeslot=0x10F6, category='lo', description='GEORGIAN LETTER FI' },
+ [0x10F7] = { unicodeslot=0x10F7, category='lo', description='GEORGIAN LETTER YN' },
+ [0x10F8] = { unicodeslot=0x10F8, category='lo', description='GEORGIAN LETTER ELIFI' },
+ [0x10F9] = { unicodeslot=0x10F9, category='lo', description='GEORGIAN LETTER TURNED GAN' },
+ [0x10FA] = { unicodeslot=0x10FA, category='lo', description='GEORGIAN LETTER AIN' },
+ [0x10FB] = { unicodeslot=0x10FB, category='po', description='GEORGIAN PARAGRAPH SEPARATOR' },
+ [0x10FC] = { unicodeslot=0x10FC, category='lm', description='MODIFIER LETTER GEORGIAN NAR', specials={'super',0x10DC} },
+ [0x1100] = { unicodeslot=0x1100, category='lo', description='HANGUL CHOSEONG KIYEOK' },
+ [0x1101] = { unicodeslot=0x1101, category='lo', description='HANGUL CHOSEONG SSANGKIYEOK' },
+ [0x1102] = { unicodeslot=0x1102, category='lo', description='HANGUL CHOSEONG NIEUN' },
+ [0x1103] = { unicodeslot=0x1103, category='lo', description='HANGUL CHOSEONG TIKEUT' },
+ [0x1104] = { unicodeslot=0x1104, category='lo', description='HANGUL CHOSEONG SSANGTIKEUT' },
+ [0x1105] = { unicodeslot=0x1105, category='lo', description='HANGUL CHOSEONG RIEUL' },
+ [0x1106] = { unicodeslot=0x1106, category='lo', description='HANGUL CHOSEONG MIEUM' },
+ [0x1107] = { unicodeslot=0x1107, category='lo', description='HANGUL CHOSEONG PIEUP' },
+ [0x1108] = { unicodeslot=0x1108, category='lo', description='HANGUL CHOSEONG SSANGPIEUP' },
+ [0x1109] = { unicodeslot=0x1109, category='lo', description='HANGUL CHOSEONG SIOS' },
+ [0x110A] = { unicodeslot=0x110A, category='lo', description='HANGUL CHOSEONG SSANGSIOS' },
+ [0x110B] = { unicodeslot=0x110B, category='lo', description='HANGUL CHOSEONG IEUNG' },
+ [0x110C] = { unicodeslot=0x110C, category='lo', description='HANGUL CHOSEONG CIEUC' },
+ [0x110D] = { unicodeslot=0x110D, category='lo', description='HANGUL CHOSEONG SSANGCIEUC' },
+ [0x110E] = { unicodeslot=0x110E, category='lo', description='HANGUL CHOSEONG CHIEUCH' },
+ [0x110F] = { unicodeslot=0x110F, category='lo', description='HANGUL CHOSEONG KHIEUKH' },
+ [0x1110] = { unicodeslot=0x1110, category='lo', description='HANGUL CHOSEONG THIEUTH' },
+ [0x1111] = { unicodeslot=0x1111, category='lo', description='HANGUL CHOSEONG PHIEUPH' },
+ [0x1112] = { unicodeslot=0x1112, category='lo', description='HANGUL CHOSEONG HIEUH' },
+ [0x1113] = { unicodeslot=0x1113, category='lo', description='HANGUL CHOSEONG NIEUN-KIYEOK' },
+ [0x1114] = { unicodeslot=0x1114, category='lo', description='HANGUL CHOSEONG SSANGNIEUN' },
+ [0x1115] = { unicodeslot=0x1115, category='lo', description='HANGUL CHOSEONG NIEUN-TIKEUT' },
+ [0x1116] = { unicodeslot=0x1116, category='lo', description='HANGUL CHOSEONG NIEUN-PIEUP' },
+ [0x1117] = { unicodeslot=0x1117, category='lo', description='HANGUL CHOSEONG TIKEUT-KIYEOK' },
+ [0x1118] = { unicodeslot=0x1118, category='lo', description='HANGUL CHOSEONG RIEUL-NIEUN' },
+ [0x1119] = { unicodeslot=0x1119, category='lo', description='HANGUL CHOSEONG SSANGRIEUL' },
+ [0x111A] = { unicodeslot=0x111A, category='lo', description='HANGUL CHOSEONG RIEUL-HIEUH' },
+ [0x111B] = { unicodeslot=0x111B, category='lo', description='HANGUL CHOSEONG KAPYEOUNRIEUL' },
+ [0x111C] = { unicodeslot=0x111C, category='lo', description='HANGUL CHOSEONG MIEUM-PIEUP' },
+ [0x111D] = { unicodeslot=0x111D, category='lo', description='HANGUL CHOSEONG KAPYEOUNMIEUM' },
+ [0x111E] = { unicodeslot=0x111E, category='lo', description='HANGUL CHOSEONG PIEUP-KIYEOK' },
+ [0x111F] = { unicodeslot=0x111F, category='lo', description='HANGUL CHOSEONG PIEUP-NIEUN' },
+ [0x1120] = { unicodeslot=0x1120, category='lo', description='HANGUL CHOSEONG PIEUP-TIKEUT' },
+ [0x1121] = { unicodeslot=0x1121, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS' },
+ [0x1122] = { unicodeslot=0x1122, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-KIYEOK' },
+ [0x1123] = { unicodeslot=0x1123, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-TIKEUT' },
+ [0x1124] = { unicodeslot=0x1124, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-PIEUP' },
+ [0x1125] = { unicodeslot=0x1125, category='lo', description='HANGUL CHOSEONG PIEUP-SSANGSIOS' },
+ [0x1126] = { unicodeslot=0x1126, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-CIEUC' },
+ [0x1127] = { unicodeslot=0x1127, category='lo', description='HANGUL CHOSEONG PIEUP-CIEUC' },
+ [0x1128] = { unicodeslot=0x1128, category='lo', description='HANGUL CHOSEONG PIEUP-CHIEUCH' },
+ [0x1129] = { unicodeslot=0x1129, category='lo', description='HANGUL CHOSEONG PIEUP-THIEUTH' },
+ [0x112A] = { unicodeslot=0x112A, category='lo', description='HANGUL CHOSEONG PIEUP-PHIEUPH' },
+ [0x112B] = { unicodeslot=0x112B, category='lo', description='HANGUL CHOSEONG KAPYEOUNPIEUP' },
+ [0x112C] = { unicodeslot=0x112C, category='lo', description='HANGUL CHOSEONG KAPYEOUNSSANGPIEUP' },
+ [0x112D] = { unicodeslot=0x112D, category='lo', description='HANGUL CHOSEONG SIOS-KIYEOK' },
+ [0x112E] = { unicodeslot=0x112E, category='lo', description='HANGUL CHOSEONG SIOS-NIEUN' },
+ [0x112F] = { unicodeslot=0x112F, category='lo', description='HANGUL CHOSEONG SIOS-TIKEUT' },
+ [0x1130] = { unicodeslot=0x1130, category='lo', description='HANGUL CHOSEONG SIOS-RIEUL' },
+ [0x1131] = { unicodeslot=0x1131, category='lo', description='HANGUL CHOSEONG SIOS-MIEUM' },
+ [0x1132] = { unicodeslot=0x1132, category='lo', description='HANGUL CHOSEONG SIOS-PIEUP' },
+ [0x1133] = { unicodeslot=0x1133, category='lo', description='HANGUL CHOSEONG SIOS-PIEUP-KIYEOK' },
+ [0x1134] = { unicodeslot=0x1134, category='lo', description='HANGUL CHOSEONG SIOS-SSANGSIOS' },
+ [0x1135] = { unicodeslot=0x1135, category='lo', description='HANGUL CHOSEONG SIOS-IEUNG' },
+ [0x1136] = { unicodeslot=0x1136, category='lo', description='HANGUL CHOSEONG SIOS-CIEUC' },
+ [0x1137] = { unicodeslot=0x1137, category='lo', description='HANGUL CHOSEONG SIOS-CHIEUCH' },
+ [0x1138] = { unicodeslot=0x1138, category='lo', description='HANGUL CHOSEONG SIOS-KHIEUKH' },
+ [0x1139] = { unicodeslot=0x1139, category='lo', description='HANGUL CHOSEONG SIOS-THIEUTH' },
+ [0x113A] = { unicodeslot=0x113A, category='lo', description='HANGUL CHOSEONG SIOS-PHIEUPH' },
+ [0x113B] = { unicodeslot=0x113B, category='lo', description='HANGUL CHOSEONG SIOS-HIEUH' },
+ [0x113C] = { unicodeslot=0x113C, category='lo', description='HANGUL CHOSEONG CHITUEUMSIOS' },
+ [0x113D] = { unicodeslot=0x113D, category='lo', description='HANGUL CHOSEONG CHITUEUMSSANGSIOS' },
+ [0x113E] = { unicodeslot=0x113E, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMSIOS' },
+ [0x113F] = { unicodeslot=0x113F, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS' },
+ [0x1140] = { unicodeslot=0x1140, category='lo', description='HANGUL CHOSEONG PANSIOS' },
+ [0x1141] = { unicodeslot=0x1141, category='lo', description='HANGUL CHOSEONG IEUNG-KIYEOK' },
+ [0x1142] = { unicodeslot=0x1142, category='lo', description='HANGUL CHOSEONG IEUNG-TIKEUT' },
+ [0x1143] = { unicodeslot=0x1143, category='lo', description='HANGUL CHOSEONG IEUNG-MIEUM' },
+ [0x1144] = { unicodeslot=0x1144, category='lo', description='HANGUL CHOSEONG IEUNG-PIEUP' },
+ [0x1145] = { unicodeslot=0x1145, category='lo', description='HANGUL CHOSEONG IEUNG-SIOS' },
+ [0x1146] = { unicodeslot=0x1146, category='lo', description='HANGUL CHOSEONG IEUNG-PANSIOS' },
+ [0x1147] = { unicodeslot=0x1147, category='lo', description='HANGUL CHOSEONG SSANGIEUNG' },
+ [0x1148] = { unicodeslot=0x1148, category='lo', description='HANGUL CHOSEONG IEUNG-CIEUC' },
+ [0x1149] = { unicodeslot=0x1149, category='lo', description='HANGUL CHOSEONG IEUNG-CHIEUCH' },
+ [0x114A] = { unicodeslot=0x114A, category='lo', description='HANGUL CHOSEONG IEUNG-THIEUTH' },
+ [0x114B] = { unicodeslot=0x114B, category='lo', description='HANGUL CHOSEONG IEUNG-PHIEUPH' },
+ [0x114C] = { unicodeslot=0x114C, category='lo', description='HANGUL CHOSEONG YESIEUNG' },
+ [0x114D] = { unicodeslot=0x114D, category='lo', description='HANGUL CHOSEONG CIEUC-IEUNG' },
+ [0x114E] = { unicodeslot=0x114E, category='lo', description='HANGUL CHOSEONG CHITUEUMCIEUC' },
+ [0x114F] = { unicodeslot=0x114F, category='lo', description='HANGUL CHOSEONG CHITUEUMSSANGCIEUC' },
+ [0x1150] = { unicodeslot=0x1150, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMCIEUC' },
+ [0x1151] = { unicodeslot=0x1151, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC' },
+ [0x1152] = { unicodeslot=0x1152, category='lo', description='HANGUL CHOSEONG CHIEUCH-KHIEUKH' },
+ [0x1153] = { unicodeslot=0x1153, category='lo', description='HANGUL CHOSEONG CHIEUCH-HIEUH' },
+ [0x1154] = { unicodeslot=0x1154, category='lo', description='HANGUL CHOSEONG CHITUEUMCHIEUCH' },
+ [0x1155] = { unicodeslot=0x1155, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMCHIEUCH' },
+ [0x1156] = { unicodeslot=0x1156, category='lo', description='HANGUL CHOSEONG PHIEUPH-PIEUP' },
+ [0x1157] = { unicodeslot=0x1157, category='lo', description='HANGUL CHOSEONG KAPYEOUNPHIEUPH' },
+ [0x1158] = { unicodeslot=0x1158, category='lo', description='HANGUL CHOSEONG SSANGHIEUH' },
+ [0x1159] = { unicodeslot=0x1159, category='lo', description='HANGUL CHOSEONG YEORINHIEUH' },
+ [0x115F] = { unicodeslot=0x115F, category='lo', description='HANGUL CHOSEONG FILLER' },
+ [0x1160] = { unicodeslot=0x1160, category='lo', description='HANGUL JUNGSEONG FILLER' },
+ [0x1161] = { unicodeslot=0x1161, category='lo', description='HANGUL JUNGSEONG A' },
+ [0x1162] = { unicodeslot=0x1162, category='lo', description='HANGUL JUNGSEONG AE' },
+ [0x1163] = { unicodeslot=0x1163, category='lo', description='HANGUL JUNGSEONG YA' },
+ [0x1164] = { unicodeslot=0x1164, category='lo', description='HANGUL JUNGSEONG YAE' },
+ [0x1165] = { unicodeslot=0x1165, category='lo', description='HANGUL JUNGSEONG EO' },
+ [0x1166] = { unicodeslot=0x1166, category='lo', description='HANGUL JUNGSEONG E' },
+ [0x1167] = { unicodeslot=0x1167, category='lo', description='HANGUL JUNGSEONG YEO' },
+ [0x1168] = { unicodeslot=0x1168, category='lo', description='HANGUL JUNGSEONG YE' },
+ [0x1169] = { unicodeslot=0x1169, category='lo', description='HANGUL JUNGSEONG O' },
+ [0x116A] = { unicodeslot=0x116A, category='lo', description='HANGUL JUNGSEONG WA' },
+ [0x116B] = { unicodeslot=0x116B, category='lo', description='HANGUL JUNGSEONG WAE' },
+ [0x116C] = { unicodeslot=0x116C, category='lo', description='HANGUL JUNGSEONG OE' },
+ [0x116D] = { unicodeslot=0x116D, category='lo', description='HANGUL JUNGSEONG YO' },
+ [0x116E] = { unicodeslot=0x116E, category='lo', description='HANGUL JUNGSEONG U' },
+ [0x116F] = { unicodeslot=0x116F, category='lo', description='HANGUL JUNGSEONG WEO' },
+ [0x1170] = { unicodeslot=0x1170, category='lo', description='HANGUL JUNGSEONG WE' },
+ [0x1171] = { unicodeslot=0x1171, category='lo', description='HANGUL JUNGSEONG WI' },
+ [0x1172] = { unicodeslot=0x1172, category='lo', description='HANGUL JUNGSEONG YU' },
+ [0x1173] = { unicodeslot=0x1173, category='lo', description='HANGUL JUNGSEONG EU' },
+ [0x1174] = { unicodeslot=0x1174, category='lo', description='HANGUL JUNGSEONG YI' },
+ [0x1175] = { unicodeslot=0x1175, category='lo', description='HANGUL JUNGSEONG I' },
+ [0x1176] = { unicodeslot=0x1176, category='lo', description='HANGUL JUNGSEONG A-O' },
+ [0x1177] = { unicodeslot=0x1177, category='lo', description='HANGUL JUNGSEONG A-U' },
+ [0x1178] = { unicodeslot=0x1178, category='lo', description='HANGUL JUNGSEONG YA-O' },
+ [0x1179] = { unicodeslot=0x1179, category='lo', description='HANGUL JUNGSEONG YA-YO' },
+ [0x117A] = { unicodeslot=0x117A, category='lo', description='HANGUL JUNGSEONG EO-O' },
+ [0x117B] = { unicodeslot=0x117B, category='lo', description='HANGUL JUNGSEONG EO-U' },
+ [0x117C] = { unicodeslot=0x117C, category='lo', description='HANGUL JUNGSEONG EO-EU' },
+ [0x117D] = { unicodeslot=0x117D, category='lo', description='HANGUL JUNGSEONG YEO-O' },
+ [0x117E] = { unicodeslot=0x117E, category='lo', description='HANGUL JUNGSEONG YEO-U' },
+ [0x117F] = { unicodeslot=0x117F, category='lo', description='HANGUL JUNGSEONG O-EO' },
+ [0x1180] = { unicodeslot=0x1180, category='lo', description='HANGUL JUNGSEONG O-E' },
+ [0x1181] = { unicodeslot=0x1181, category='lo', description='HANGUL JUNGSEONG O-YE' },
+ [0x1182] = { unicodeslot=0x1182, category='lo', description='HANGUL JUNGSEONG O-O' },
+ [0x1183] = { unicodeslot=0x1183, category='lo', description='HANGUL JUNGSEONG O-U' },
+ [0x1184] = { unicodeslot=0x1184, category='lo', description='HANGUL JUNGSEONG YO-YA' },
+ [0x1185] = { unicodeslot=0x1185, category='lo', description='HANGUL JUNGSEONG YO-YAE' },
+ [0x1186] = { unicodeslot=0x1186, category='lo', description='HANGUL JUNGSEONG YO-YEO' },
+ [0x1187] = { unicodeslot=0x1187, category='lo', description='HANGUL JUNGSEONG YO-O' },
+ [0x1188] = { unicodeslot=0x1188, category='lo', description='HANGUL JUNGSEONG YO-I' },
+ [0x1189] = { unicodeslot=0x1189, category='lo', description='HANGUL JUNGSEONG U-A' },
+ [0x118A] = { unicodeslot=0x118A, category='lo', description='HANGUL JUNGSEONG U-AE' },
+ [0x118B] = { unicodeslot=0x118B, category='lo', description='HANGUL JUNGSEONG U-EO-EU' },
+ [0x118C] = { unicodeslot=0x118C, category='lo', description='HANGUL JUNGSEONG U-YE' },
+ [0x118D] = { unicodeslot=0x118D, category='lo', description='HANGUL JUNGSEONG U-U' },
+ [0x118E] = { unicodeslot=0x118E, category='lo', description='HANGUL JUNGSEONG YU-A' },
+ [0x118F] = { unicodeslot=0x118F, category='lo', description='HANGUL JUNGSEONG YU-EO' },
+ [0x1190] = { unicodeslot=0x1190, category='lo', description='HANGUL JUNGSEONG YU-E' },
+ [0x1191] = { unicodeslot=0x1191, category='lo', description='HANGUL JUNGSEONG YU-YEO' },
+ [0x1192] = { unicodeslot=0x1192, category='lo', description='HANGUL JUNGSEONG YU-YE' },
+ [0x1193] = { unicodeslot=0x1193, category='lo', description='HANGUL JUNGSEONG YU-U' },
+ [0x1194] = { unicodeslot=0x1194, category='lo', description='HANGUL JUNGSEONG YU-I' },
+ [0x1195] = { unicodeslot=0x1195, category='lo', description='HANGUL JUNGSEONG EU-U' },
+ [0x1196] = { unicodeslot=0x1196, category='lo', description='HANGUL JUNGSEONG EU-EU' },
+ [0x1197] = { unicodeslot=0x1197, category='lo', description='HANGUL JUNGSEONG YI-U' },
+ [0x1198] = { unicodeslot=0x1198, category='lo', description='HANGUL JUNGSEONG I-A' },
+ [0x1199] = { unicodeslot=0x1199, category='lo', description='HANGUL JUNGSEONG I-YA' },
+ [0x119A] = { unicodeslot=0x119A, category='lo', description='HANGUL JUNGSEONG I-O' },
+ [0x119B] = { unicodeslot=0x119B, category='lo', description='HANGUL JUNGSEONG I-U' },
+ [0x119C] = { unicodeslot=0x119C, category='lo', description='HANGUL JUNGSEONG I-EU' },
+ [0x119D] = { unicodeslot=0x119D, category='lo', description='HANGUL JUNGSEONG I-ARAEA' },
+ [0x119E] = { unicodeslot=0x119E, category='lo', description='HANGUL JUNGSEONG ARAEA' },
+ [0x119F] = { unicodeslot=0x119F, category='lo', description='HANGUL JUNGSEONG ARAEA-EO' },
+ [0x11A0] = { unicodeslot=0x11A0, category='lo', description='HANGUL JUNGSEONG ARAEA-U' },
+ [0x11A1] = { unicodeslot=0x11A1, category='lo', description='HANGUL JUNGSEONG ARAEA-I' },
+ [0x11A2] = { unicodeslot=0x11A2, category='lo', description='HANGUL JUNGSEONG SSANGARAEA' },
+ [0x11A8] = { unicodeslot=0x11A8, category='lo', description='HANGUL JONGSEONG KIYEOK' },
+ [0x11A9] = { unicodeslot=0x11A9, category='lo', description='HANGUL JONGSEONG SSANGKIYEOK' },
+ [0x11AA] = { unicodeslot=0x11AA, category='lo', description='HANGUL JONGSEONG KIYEOK-SIOS' },
+ [0x11AB] = { unicodeslot=0x11AB, category='lo', description='HANGUL JONGSEONG NIEUN' },
+ [0x11AC] = { unicodeslot=0x11AC, category='lo', description='HANGUL JONGSEONG NIEUN-CIEUC' },
+ [0x11AD] = { unicodeslot=0x11AD, category='lo', description='HANGUL JONGSEONG NIEUN-HIEUH' },
+ [0x11AE] = { unicodeslot=0x11AE, category='lo', description='HANGUL JONGSEONG TIKEUT' },
+ [0x11AF] = { unicodeslot=0x11AF, category='lo', description='HANGUL JONGSEONG RIEUL' },
+ [0x11B0] = { unicodeslot=0x11B0, category='lo', description='HANGUL JONGSEONG RIEUL-KIYEOK' },
+ [0x11B1] = { unicodeslot=0x11B1, category='lo', description='HANGUL JONGSEONG RIEUL-MIEUM' },
+ [0x11B2] = { unicodeslot=0x11B2, category='lo', description='HANGUL JONGSEONG RIEUL-PIEUP' },
+ [0x11B3] = { unicodeslot=0x11B3, category='lo', description='HANGUL JONGSEONG RIEUL-SIOS' },
+ [0x11B4] = { unicodeslot=0x11B4, category='lo', description='HANGUL JONGSEONG RIEUL-THIEUTH' },
+ [0x11B5] = { unicodeslot=0x11B5, category='lo', description='HANGUL JONGSEONG RIEUL-PHIEUPH' },
+ [0x11B6] = { unicodeslot=0x11B6, category='lo', description='HANGUL JONGSEONG RIEUL-HIEUH' },
+ [0x11B7] = { unicodeslot=0x11B7, category='lo', description='HANGUL JONGSEONG MIEUM' },
+ [0x11B8] = { unicodeslot=0x11B8, category='lo', description='HANGUL JONGSEONG PIEUP' },
+ [0x11B9] = { unicodeslot=0x11B9, category='lo', description='HANGUL JONGSEONG PIEUP-SIOS' },
+ [0x11BA] = { unicodeslot=0x11BA, category='lo', description='HANGUL JONGSEONG SIOS' },
+ [0x11BB] = { unicodeslot=0x11BB, category='lo', description='HANGUL JONGSEONG SSANGSIOS' },
+ [0x11BC] = { unicodeslot=0x11BC, category='lo', description='HANGUL JONGSEONG IEUNG' },
+ [0x11BD] = { unicodeslot=0x11BD, category='lo', description='HANGUL JONGSEONG CIEUC' },
+ [0x11BE] = { unicodeslot=0x11BE, category='lo', description='HANGUL JONGSEONG CHIEUCH' },
+ [0x11BF] = { unicodeslot=0x11BF, category='lo', description='HANGUL JONGSEONG KHIEUKH' },
+ [0x11C0] = { unicodeslot=0x11C0, category='lo', description='HANGUL JONGSEONG THIEUTH' },
+ [0x11C1] = { unicodeslot=0x11C1, category='lo', description='HANGUL JONGSEONG PHIEUPH' },
+ [0x11C2] = { unicodeslot=0x11C2, category='lo', description='HANGUL JONGSEONG HIEUH' },
+ [0x11C3] = { unicodeslot=0x11C3, category='lo', description='HANGUL JONGSEONG KIYEOK-RIEUL' },
+ [0x11C4] = { unicodeslot=0x11C4, category='lo', description='HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK' },
+ [0x11C5] = { unicodeslot=0x11C5, category='lo', description='HANGUL JONGSEONG NIEUN-KIYEOK' },
+ [0x11C6] = { unicodeslot=0x11C6, category='lo', description='HANGUL JONGSEONG NIEUN-TIKEUT' },
+ [0x11C7] = { unicodeslot=0x11C7, category='lo', description='HANGUL JONGSEONG NIEUN-SIOS' },
+ [0x11C8] = { unicodeslot=0x11C8, category='lo', description='HANGUL JONGSEONG NIEUN-PANSIOS' },
+ [0x11C9] = { unicodeslot=0x11C9, category='lo', description='HANGUL JONGSEONG NIEUN-THIEUTH' },
+ [0x11CA] = { unicodeslot=0x11CA, category='lo', description='HANGUL JONGSEONG TIKEUT-KIYEOK' },
+ [0x11CB] = { unicodeslot=0x11CB, category='lo', description='HANGUL JONGSEONG TIKEUT-RIEUL' },
+ [0x11CC] = { unicodeslot=0x11CC, category='lo', description='HANGUL JONGSEONG RIEUL-KIYEOK-SIOS' },
+ [0x11CD] = { unicodeslot=0x11CD, category='lo', description='HANGUL JONGSEONG RIEUL-NIEUN' },
+ [0x11CE] = { unicodeslot=0x11CE, category='lo', description='HANGUL JONGSEONG RIEUL-TIKEUT' },
+ [0x11CF] = { unicodeslot=0x11CF, category='lo', description='HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH' },
+ [0x11D0] = { unicodeslot=0x11D0, category='lo', description='HANGUL JONGSEONG SSANGRIEUL' },
+ [0x11D1] = { unicodeslot=0x11D1, category='lo', description='HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK' },
+ [0x11D2] = { unicodeslot=0x11D2, category='lo', description='HANGUL JONGSEONG RIEUL-MIEUM-SIOS' },
+ [0x11D3] = { unicodeslot=0x11D3, category='lo', description='HANGUL JONGSEONG RIEUL-PIEUP-SIOS' },
+ [0x11D4] = { unicodeslot=0x11D4, category='lo', description='HANGUL JONGSEONG RIEUL-PIEUP-HIEUH' },
+ [0x11D5] = { unicodeslot=0x11D5, category='lo', description='HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP' },
+ [0x11D6] = { unicodeslot=0x11D6, category='lo', description='HANGUL JONGSEONG RIEUL-SSANGSIOS' },
+ [0x11D7] = { unicodeslot=0x11D7, category='lo', description='HANGUL JONGSEONG RIEUL-PANSIOS' },
+ [0x11D8] = { unicodeslot=0x11D8, category='lo', description='HANGUL JONGSEONG RIEUL-KHIEUKH' },
+ [0x11D9] = { unicodeslot=0x11D9, category='lo', description='HANGUL JONGSEONG RIEUL-YEORINHIEUH' },
+ [0x11DA] = { unicodeslot=0x11DA, category='lo', description='HANGUL JONGSEONG MIEUM-KIYEOK' },
+ [0x11DB] = { unicodeslot=0x11DB, category='lo', description='HANGUL JONGSEONG MIEUM-RIEUL' },
+ [0x11DC] = { unicodeslot=0x11DC, category='lo', description='HANGUL JONGSEONG MIEUM-PIEUP' },
+ [0x11DD] = { unicodeslot=0x11DD, category='lo', description='HANGUL JONGSEONG MIEUM-SIOS' },
+ [0x11DE] = { unicodeslot=0x11DE, category='lo', description='HANGUL JONGSEONG MIEUM-SSANGSIOS' },
+ [0x11DF] = { unicodeslot=0x11DF, category='lo', description='HANGUL JONGSEONG MIEUM-PANSIOS' },
+ [0x11E0] = { unicodeslot=0x11E0, category='lo', description='HANGUL JONGSEONG MIEUM-CHIEUCH' },
+ [0x11E1] = { unicodeslot=0x11E1, category='lo', description='HANGUL JONGSEONG MIEUM-HIEUH' },
+ [0x11E2] = { unicodeslot=0x11E2, category='lo', description='HANGUL JONGSEONG KAPYEOUNMIEUM' },
+ [0x11E3] = { unicodeslot=0x11E3, category='lo', description='HANGUL JONGSEONG PIEUP-RIEUL' },
+ [0x11E4] = { unicodeslot=0x11E4, category='lo', description='HANGUL JONGSEONG PIEUP-PHIEUPH' },
+ [0x11E5] = { unicodeslot=0x11E5, category='lo', description='HANGUL JONGSEONG PIEUP-HIEUH' },
+ [0x11E6] = { unicodeslot=0x11E6, category='lo', description='HANGUL JONGSEONG KAPYEOUNPIEUP' },
+ [0x11E7] = { unicodeslot=0x11E7, category='lo', description='HANGUL JONGSEONG SIOS-KIYEOK' },
+ [0x11E8] = { unicodeslot=0x11E8, category='lo', description='HANGUL JONGSEONG SIOS-TIKEUT' },
+ [0x11E9] = { unicodeslot=0x11E9, category='lo', description='HANGUL JONGSEONG SIOS-RIEUL' },
+ [0x11EA] = { unicodeslot=0x11EA, category='lo', description='HANGUL JONGSEONG SIOS-PIEUP' },
+ [0x11EB] = { unicodeslot=0x11EB, category='lo', description='HANGUL JONGSEONG PANSIOS' },
+ [0x11EC] = { unicodeslot=0x11EC, category='lo', description='HANGUL JONGSEONG IEUNG-KIYEOK' },
+ [0x11ED] = { unicodeslot=0x11ED, category='lo', description='HANGUL JONGSEONG IEUNG-SSANGKIYEOK' },
+ [0x11EE] = { unicodeslot=0x11EE, category='lo', description='HANGUL JONGSEONG SSANGIEUNG' },
+ [0x11EF] = { unicodeslot=0x11EF, category='lo', description='HANGUL JONGSEONG IEUNG-KHIEUKH' },
+ [0x11F0] = { unicodeslot=0x11F0, category='lo', description='HANGUL JONGSEONG YESIEUNG' },
+ [0x11F1] = { unicodeslot=0x11F1, category='lo', description='HANGUL JONGSEONG YESIEUNG-SIOS' },
+ [0x11F2] = { unicodeslot=0x11F2, category='lo', description='HANGUL JONGSEONG YESIEUNG-PANSIOS' },
+ [0x11F3] = { unicodeslot=0x11F3, category='lo', description='HANGUL JONGSEONG PHIEUPH-PIEUP' },
+ [0x11F4] = { unicodeslot=0x11F4, category='lo', description='HANGUL JONGSEONG KAPYEOUNPHIEUPH' },
+ [0x11F5] = { unicodeslot=0x11F5, category='lo', description='HANGUL JONGSEONG HIEUH-NIEUN' },
+ [0x11F6] = { unicodeslot=0x11F6, category='lo', description='HANGUL JONGSEONG HIEUH-RIEUL' },
+ [0x11F7] = { unicodeslot=0x11F7, category='lo', description='HANGUL JONGSEONG HIEUH-MIEUM' },
+ [0x11F8] = { unicodeslot=0x11F8, category='lo', description='HANGUL JONGSEONG HIEUH-PIEUP' },
+ [0x11F9] = { unicodeslot=0x11F9, category='lo', description='HANGUL JONGSEONG YEORINHIEUH' },
+ [0x1200] = { unicodeslot=0x1200, category='lo', description='ETHIOPIC SYLLABLE HA' },
+ [0x1201] = { unicodeslot=0x1201, category='lo', description='ETHIOPIC SYLLABLE HU' },
+ [0x1202] = { unicodeslot=0x1202, category='lo', description='ETHIOPIC SYLLABLE HI' },
+ [0x1203] = { unicodeslot=0x1203, category='lo', description='ETHIOPIC SYLLABLE HAA' },
+ [0x1204] = { unicodeslot=0x1204, category='lo', description='ETHIOPIC SYLLABLE HEE' },
+ [0x1205] = { unicodeslot=0x1205, category='lo', description='ETHIOPIC SYLLABLE HE' },
+ [0x1206] = { unicodeslot=0x1206, category='lo', description='ETHIOPIC SYLLABLE HO' },
+ [0x1207] = { unicodeslot=0x1207, category='lo', description='ETHIOPIC SYLLABLE HOA' },
+ [0x1208] = { unicodeslot=0x1208, category='lo', description='ETHIOPIC SYLLABLE LA' },
+ [0x1209] = { unicodeslot=0x1209, category='lo', description='ETHIOPIC SYLLABLE LU' },
+ [0x120A] = { unicodeslot=0x120A, category='lo', description='ETHIOPIC SYLLABLE LI' },
+ [0x120B] = { unicodeslot=0x120B, category='lo', description='ETHIOPIC SYLLABLE LAA' },
+ [0x120C] = { unicodeslot=0x120C, category='lo', description='ETHIOPIC SYLLABLE LEE' },
+ [0x120D] = { unicodeslot=0x120D, category='lo', description='ETHIOPIC SYLLABLE LE' },
+ [0x120E] = { unicodeslot=0x120E, category='lo', description='ETHIOPIC SYLLABLE LO' },
+ [0x120F] = { unicodeslot=0x120F, category='lo', description='ETHIOPIC SYLLABLE LWA' },
+ [0x1210] = { unicodeslot=0x1210, category='lo', description='ETHIOPIC SYLLABLE HHA' },
+ [0x1211] = { unicodeslot=0x1211, category='lo', description='ETHIOPIC SYLLABLE HHU' },
+ [0x1212] = { unicodeslot=0x1212, category='lo', description='ETHIOPIC SYLLABLE HHI' },
+ [0x1213] = { unicodeslot=0x1213, category='lo', description='ETHIOPIC SYLLABLE HHAA' },
+ [0x1214] = { unicodeslot=0x1214, category='lo', description='ETHIOPIC SYLLABLE HHEE' },
+ [0x1215] = { unicodeslot=0x1215, category='lo', description='ETHIOPIC SYLLABLE HHE' },
+ [0x1216] = { unicodeslot=0x1216, category='lo', description='ETHIOPIC SYLLABLE HHO' },
+ [0x1217] = { unicodeslot=0x1217, category='lo', description='ETHIOPIC SYLLABLE HHWA' },
+ [0x1218] = { unicodeslot=0x1218, category='lo', description='ETHIOPIC SYLLABLE MA' },
+ [0x1219] = { unicodeslot=0x1219, category='lo', description='ETHIOPIC SYLLABLE MU' },
+ [0x121A] = { unicodeslot=0x121A, category='lo', description='ETHIOPIC SYLLABLE MI' },
+ [0x121B] = { unicodeslot=0x121B, category='lo', description='ETHIOPIC SYLLABLE MAA' },
+ [0x121C] = { unicodeslot=0x121C, category='lo', description='ETHIOPIC SYLLABLE MEE' },
+ [0x121D] = { unicodeslot=0x121D, category='lo', description='ETHIOPIC SYLLABLE ME' },
+ [0x121E] = { unicodeslot=0x121E, category='lo', description='ETHIOPIC SYLLABLE MO' },
+ [0x121F] = { unicodeslot=0x121F, category='lo', description='ETHIOPIC SYLLABLE MWA' },
+ [0x1220] = { unicodeslot=0x1220, category='lo', description='ETHIOPIC SYLLABLE SZA' },
+ [0x1221] = { unicodeslot=0x1221, category='lo', description='ETHIOPIC SYLLABLE SZU' },
+ [0x1222] = { unicodeslot=0x1222, category='lo', description='ETHIOPIC SYLLABLE SZI' },
+ [0x1223] = { unicodeslot=0x1223, category='lo', description='ETHIOPIC SYLLABLE SZAA' },
+ [0x1224] = { unicodeslot=0x1224, category='lo', description='ETHIOPIC SYLLABLE SZEE' },
+ [0x1225] = { unicodeslot=0x1225, category='lo', description='ETHIOPIC SYLLABLE SZE' },
+ [0x1226] = { unicodeslot=0x1226, category='lo', description='ETHIOPIC SYLLABLE SZO' },
+ [0x1227] = { unicodeslot=0x1227, category='lo', description='ETHIOPIC SYLLABLE SZWA' },
+ [0x1228] = { unicodeslot=0x1228, category='lo', description='ETHIOPIC SYLLABLE RA' },
+ [0x1229] = { unicodeslot=0x1229, category='lo', description='ETHIOPIC SYLLABLE RU' },
+ [0x122A] = { unicodeslot=0x122A, category='lo', description='ETHIOPIC SYLLABLE RI' },
+ [0x122B] = { unicodeslot=0x122B, category='lo', description='ETHIOPIC SYLLABLE RAA' },
+ [0x122C] = { unicodeslot=0x122C, category='lo', description='ETHIOPIC SYLLABLE REE' },
+ [0x122D] = { unicodeslot=0x122D, category='lo', description='ETHIOPIC SYLLABLE RE' },
+ [0x122E] = { unicodeslot=0x122E, category='lo', description='ETHIOPIC SYLLABLE RO' },
+ [0x122F] = { unicodeslot=0x122F, category='lo', description='ETHIOPIC SYLLABLE RWA' },
+ [0x1230] = { unicodeslot=0x1230, category='lo', description='ETHIOPIC SYLLABLE SA' },
+ [0x1231] = { unicodeslot=0x1231, category='lo', description='ETHIOPIC SYLLABLE SU' },
+ [0x1232] = { unicodeslot=0x1232, category='lo', description='ETHIOPIC SYLLABLE SI' },
+ [0x1233] = { unicodeslot=0x1233, category='lo', description='ETHIOPIC SYLLABLE SAA' },
+ [0x1234] = { unicodeslot=0x1234, category='lo', description='ETHIOPIC SYLLABLE SEE' },
+ [0x1235] = { unicodeslot=0x1235, category='lo', description='ETHIOPIC SYLLABLE SE' },
+ [0x1236] = { unicodeslot=0x1236, category='lo', description='ETHIOPIC SYLLABLE SO' },
+ [0x1237] = { unicodeslot=0x1237, category='lo', description='ETHIOPIC SYLLABLE SWA' },
+ [0x1238] = { unicodeslot=0x1238, category='lo', description='ETHIOPIC SYLLABLE SHA' },
+ [0x1239] = { unicodeslot=0x1239, category='lo', description='ETHIOPIC SYLLABLE SHU' },
+ [0x123A] = { unicodeslot=0x123A, category='lo', description='ETHIOPIC SYLLABLE SHI' },
+ [0x123B] = { unicodeslot=0x123B, category='lo', description='ETHIOPIC SYLLABLE SHAA' },
+ [0x123C] = { unicodeslot=0x123C, category='lo', description='ETHIOPIC SYLLABLE SHEE' },
+ [0x123D] = { unicodeslot=0x123D, category='lo', description='ETHIOPIC SYLLABLE SHE' },
+ [0x123E] = { unicodeslot=0x123E, category='lo', description='ETHIOPIC SYLLABLE SHO' },
+ [0x123F] = { unicodeslot=0x123F, category='lo', description='ETHIOPIC SYLLABLE SHWA' },
+ [0x1240] = { unicodeslot=0x1240, category='lo', description='ETHIOPIC SYLLABLE QA' },
+ [0x1241] = { unicodeslot=0x1241, category='lo', description='ETHIOPIC SYLLABLE QU' },
+ [0x1242] = { unicodeslot=0x1242, category='lo', description='ETHIOPIC SYLLABLE QI' },
+ [0x1243] = { unicodeslot=0x1243, category='lo', description='ETHIOPIC SYLLABLE QAA' },
+ [0x1244] = { unicodeslot=0x1244, category='lo', description='ETHIOPIC SYLLABLE QEE' },
+ [0x1245] = { unicodeslot=0x1245, category='lo', description='ETHIOPIC SYLLABLE QE' },
+ [0x1246] = { unicodeslot=0x1246, category='lo', description='ETHIOPIC SYLLABLE QO' },
+ [0x1247] = { unicodeslot=0x1247, category='lo', description='ETHIOPIC SYLLABLE QOA' },
+ [0x1248] = { unicodeslot=0x1248, category='lo', description='ETHIOPIC SYLLABLE QWA' },
+ [0x124A] = { unicodeslot=0x124A, category='lo', description='ETHIOPIC SYLLABLE QWI' },
+ [0x124B] = { unicodeslot=0x124B, category='lo', description='ETHIOPIC SYLLABLE QWAA' },
+ [0x124C] = { unicodeslot=0x124C, category='lo', description='ETHIOPIC SYLLABLE QWEE' },
+ [0x124D] = { unicodeslot=0x124D, category='lo', description='ETHIOPIC SYLLABLE QWE' },
+ [0x1250] = { unicodeslot=0x1250, category='lo', description='ETHIOPIC SYLLABLE QHA' },
+ [0x1251] = { unicodeslot=0x1251, category='lo', description='ETHIOPIC SYLLABLE QHU' },
+ [0x1252] = { unicodeslot=0x1252, category='lo', description='ETHIOPIC SYLLABLE QHI' },
+ [0x1253] = { unicodeslot=0x1253, category='lo', description='ETHIOPIC SYLLABLE QHAA' },
+ [0x1254] = { unicodeslot=0x1254, category='lo', description='ETHIOPIC SYLLABLE QHEE' },
+ [0x1255] = { unicodeslot=0x1255, category='lo', description='ETHIOPIC SYLLABLE QHE' },
+ [0x1256] = { unicodeslot=0x1256, category='lo', description='ETHIOPIC SYLLABLE QHO' },
+ [0x1258] = { unicodeslot=0x1258, category='lo', description='ETHIOPIC SYLLABLE QHWA' },
+ [0x125A] = { unicodeslot=0x125A, category='lo', description='ETHIOPIC SYLLABLE QHWI' },
+ [0x125B] = { unicodeslot=0x125B, category='lo', description='ETHIOPIC SYLLABLE QHWAA' },
+ [0x125C] = { unicodeslot=0x125C, category='lo', description='ETHIOPIC SYLLABLE QHWEE' },
+ [0x125D] = { unicodeslot=0x125D, category='lo', description='ETHIOPIC SYLLABLE QHWE' },
+ [0x1260] = { unicodeslot=0x1260, category='lo', description='ETHIOPIC SYLLABLE BA' },
+ [0x1261] = { unicodeslot=0x1261, category='lo', description='ETHIOPIC SYLLABLE BU' },
+ [0x1262] = { unicodeslot=0x1262, category='lo', description='ETHIOPIC SYLLABLE BI' },
+ [0x1263] = { unicodeslot=0x1263, category='lo', description='ETHIOPIC SYLLABLE BAA' },
+ [0x1264] = { unicodeslot=0x1264, category='lo', description='ETHIOPIC SYLLABLE BEE' },
+ [0x1265] = { unicodeslot=0x1265, category='lo', description='ETHIOPIC SYLLABLE BE' },
+ [0x1266] = { unicodeslot=0x1266, category='lo', description='ETHIOPIC SYLLABLE BO' },
+ [0x1267] = { unicodeslot=0x1267, category='lo', description='ETHIOPIC SYLLABLE BWA' },
+ [0x1268] = { unicodeslot=0x1268, category='lo', description='ETHIOPIC SYLLABLE VA' },
+ [0x1269] = { unicodeslot=0x1269, category='lo', description='ETHIOPIC SYLLABLE VU' },
+ [0x126A] = { unicodeslot=0x126A, category='lo', description='ETHIOPIC SYLLABLE VI' },
+ [0x126B] = { unicodeslot=0x126B, category='lo', description='ETHIOPIC SYLLABLE VAA' },
+ [0x126C] = { unicodeslot=0x126C, category='lo', description='ETHIOPIC SYLLABLE VEE' },
+ [0x126D] = { unicodeslot=0x126D, category='lo', description='ETHIOPIC SYLLABLE VE' },
+ [0x126E] = { unicodeslot=0x126E, category='lo', description='ETHIOPIC SYLLABLE VO' },
+ [0x126F] = { unicodeslot=0x126F, category='lo', description='ETHIOPIC SYLLABLE VWA' },
+ [0x1270] = { unicodeslot=0x1270, category='lo', description='ETHIOPIC SYLLABLE TA' },
+ [0x1271] = { unicodeslot=0x1271, category='lo', description='ETHIOPIC SYLLABLE TU' },
+ [0x1272] = { unicodeslot=0x1272, category='lo', description='ETHIOPIC SYLLABLE TI' },
+ [0x1273] = { unicodeslot=0x1273, category='lo', description='ETHIOPIC SYLLABLE TAA' },
+ [0x1274] = { unicodeslot=0x1274, category='lo', description='ETHIOPIC SYLLABLE TEE' },
+ [0x1275] = { unicodeslot=0x1275, category='lo', description='ETHIOPIC SYLLABLE TE' },
+ [0x1276] = { unicodeslot=0x1276, category='lo', description='ETHIOPIC SYLLABLE TO' },
+ [0x1277] = { unicodeslot=0x1277, category='lo', description='ETHIOPIC SYLLABLE TWA' },
+ [0x1278] = { unicodeslot=0x1278, category='lo', description='ETHIOPIC SYLLABLE CA' },
+ [0x1279] = { unicodeslot=0x1279, category='lo', description='ETHIOPIC SYLLABLE CU' },
+ [0x127A] = { unicodeslot=0x127A, category='lo', description='ETHIOPIC SYLLABLE CI' },
+ [0x127B] = { unicodeslot=0x127B, category='lo', description='ETHIOPIC SYLLABLE CAA' },
+ [0x127C] = { unicodeslot=0x127C, category='lo', description='ETHIOPIC SYLLABLE CEE' },
+ [0x127D] = { unicodeslot=0x127D, category='lo', description='ETHIOPIC SYLLABLE CE' },
+ [0x127E] = { unicodeslot=0x127E, category='lo', description='ETHIOPIC SYLLABLE CO' },
+ [0x127F] = { unicodeslot=0x127F, category='lo', description='ETHIOPIC SYLLABLE CWA' },
+ [0x1280] = { unicodeslot=0x1280, category='lo', description='ETHIOPIC SYLLABLE XA' },
+ [0x1281] = { unicodeslot=0x1281, category='lo', description='ETHIOPIC SYLLABLE XU' },
+ [0x1282] = { unicodeslot=0x1282, category='lo', description='ETHIOPIC SYLLABLE XI' },
+ [0x1283] = { unicodeslot=0x1283, category='lo', description='ETHIOPIC SYLLABLE XAA' },
+ [0x1284] = { unicodeslot=0x1284, category='lo', description='ETHIOPIC SYLLABLE XEE' },
+ [0x1285] = { unicodeslot=0x1285, category='lo', description='ETHIOPIC SYLLABLE XE' },
+ [0x1286] = { unicodeslot=0x1286, category='lo', description='ETHIOPIC SYLLABLE XO' },
+ [0x1287] = { unicodeslot=0x1287, category='lo', description='ETHIOPIC SYLLABLE XOA' },
+ [0x1288] = { unicodeslot=0x1288, category='lo', description='ETHIOPIC SYLLABLE XWA' },
+ [0x128A] = { unicodeslot=0x128A, category='lo', description='ETHIOPIC SYLLABLE XWI' },
+ [0x128B] = { unicodeslot=0x128B, category='lo', description='ETHIOPIC SYLLABLE XWAA' },
+ [0x128C] = { unicodeslot=0x128C, category='lo', description='ETHIOPIC SYLLABLE XWEE' },
+ [0x128D] = { unicodeslot=0x128D, category='lo', description='ETHIOPIC SYLLABLE XWE' },
+ [0x1290] = { unicodeslot=0x1290, category='lo', description='ETHIOPIC SYLLABLE NA' },
+ [0x1291] = { unicodeslot=0x1291, category='lo', description='ETHIOPIC SYLLABLE NU' },
+ [0x1292] = { unicodeslot=0x1292, category='lo', description='ETHIOPIC SYLLABLE NI' },
+ [0x1293] = { unicodeslot=0x1293, category='lo', description='ETHIOPIC SYLLABLE NAA' },
+ [0x1294] = { unicodeslot=0x1294, category='lo', description='ETHIOPIC SYLLABLE NEE' },
+ [0x1295] = { unicodeslot=0x1295, category='lo', description='ETHIOPIC SYLLABLE NE' },
+ [0x1296] = { unicodeslot=0x1296, category='lo', description='ETHIOPIC SYLLABLE NO' },
+ [0x1297] = { unicodeslot=0x1297, category='lo', description='ETHIOPIC SYLLABLE NWA' },
+ [0x1298] = { unicodeslot=0x1298, category='lo', description='ETHIOPIC SYLLABLE NYA' },
+ [0x1299] = { unicodeslot=0x1299, category='lo', description='ETHIOPIC SYLLABLE NYU' },
+ [0x129A] = { unicodeslot=0x129A, category='lo', description='ETHIOPIC SYLLABLE NYI' },
+ [0x129B] = { unicodeslot=0x129B, category='lo', description='ETHIOPIC SYLLABLE NYAA' },
+ [0x129C] = { unicodeslot=0x129C, category='lo', description='ETHIOPIC SYLLABLE NYEE' },
+ [0x129D] = { unicodeslot=0x129D, category='lo', description='ETHIOPIC SYLLABLE NYE' },
+ [0x129E] = { unicodeslot=0x129E, category='lo', description='ETHIOPIC SYLLABLE NYO' },
+ [0x129F] = { unicodeslot=0x129F, category='lo', description='ETHIOPIC SYLLABLE NYWA' },
+ [0x12A0] = { unicodeslot=0x12A0, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL A' },
+ [0x12A1] = { unicodeslot=0x12A1, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL U' },
+ [0x12A2] = { unicodeslot=0x12A2, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL I' },
+ [0x12A3] = { unicodeslot=0x12A3, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL AA' },
+ [0x12A4] = { unicodeslot=0x12A4, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL EE' },
+ [0x12A5] = { unicodeslot=0x12A5, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL E' },
+ [0x12A6] = { unicodeslot=0x12A6, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL O' },
+ [0x12A7] = { unicodeslot=0x12A7, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL WA' },
+ [0x12A8] = { unicodeslot=0x12A8, category='lo', description='ETHIOPIC SYLLABLE KA' },
+ [0x12A9] = { unicodeslot=0x12A9, category='lo', description='ETHIOPIC SYLLABLE KU' },
+ [0x12AA] = { unicodeslot=0x12AA, category='lo', description='ETHIOPIC SYLLABLE KI' },
+ [0x12AB] = { unicodeslot=0x12AB, category='lo', description='ETHIOPIC SYLLABLE KAA' },
+ [0x12AC] = { unicodeslot=0x12AC, category='lo', description='ETHIOPIC SYLLABLE KEE' },
+ [0x12AD] = { unicodeslot=0x12AD, category='lo', description='ETHIOPIC SYLLABLE KE' },
+ [0x12AE] = { unicodeslot=0x12AE, category='lo', description='ETHIOPIC SYLLABLE KO' },
+ [0x12AF] = { unicodeslot=0x12AF, category='lo', description='ETHIOPIC SYLLABLE KOA' },
+ [0x12B0] = { unicodeslot=0x12B0, category='lo', description='ETHIOPIC SYLLABLE KWA' },
+ [0x12B2] = { unicodeslot=0x12B2, category='lo', description='ETHIOPIC SYLLABLE KWI' },
+ [0x12B3] = { unicodeslot=0x12B3, category='lo', description='ETHIOPIC SYLLABLE KWAA' },
+ [0x12B4] = { unicodeslot=0x12B4, category='lo', description='ETHIOPIC SYLLABLE KWEE' },
+ [0x12B5] = { unicodeslot=0x12B5, category='lo', description='ETHIOPIC SYLLABLE KWE' },
+ [0x12B8] = { unicodeslot=0x12B8, category='lo', description='ETHIOPIC SYLLABLE KXA' },
+ [0x12B9] = { unicodeslot=0x12B9, category='lo', description='ETHIOPIC SYLLABLE KXU' },
+ [0x12BA] = { unicodeslot=0x12BA, category='lo', description='ETHIOPIC SYLLABLE KXI' },
+ [0x12BB] = { unicodeslot=0x12BB, category='lo', description='ETHIOPIC SYLLABLE KXAA' },
+ [0x12BC] = { unicodeslot=0x12BC, category='lo', description='ETHIOPIC SYLLABLE KXEE' },
+ [0x12BD] = { unicodeslot=0x12BD, category='lo', description='ETHIOPIC SYLLABLE KXE' },
+ [0x12BE] = { unicodeslot=0x12BE, category='lo', description='ETHIOPIC SYLLABLE KXO' },
+ [0x12C0] = { unicodeslot=0x12C0, category='lo', description='ETHIOPIC SYLLABLE KXWA' },
+ [0x12C2] = { unicodeslot=0x12C2, category='lo', description='ETHIOPIC SYLLABLE KXWI' },
+ [0x12C3] = { unicodeslot=0x12C3, category='lo', description='ETHIOPIC SYLLABLE KXWAA' },
+ [0x12C4] = { unicodeslot=0x12C4, category='lo', description='ETHIOPIC SYLLABLE KXWEE' },
+ [0x12C5] = { unicodeslot=0x12C5, category='lo', description='ETHIOPIC SYLLABLE KXWE' },
+ [0x12C8] = { unicodeslot=0x12C8, category='lo', description='ETHIOPIC SYLLABLE WA' },
+ [0x12C9] = { unicodeslot=0x12C9, category='lo', description='ETHIOPIC SYLLABLE WU' },
+ [0x12CA] = { unicodeslot=0x12CA, category='lo', description='ETHIOPIC SYLLABLE WI' },
+ [0x12CB] = { unicodeslot=0x12CB, category='lo', description='ETHIOPIC SYLLABLE WAA' },
+ [0x12CC] = { unicodeslot=0x12CC, category='lo', description='ETHIOPIC SYLLABLE WEE' },
+ [0x12CD] = { unicodeslot=0x12CD, category='lo', description='ETHIOPIC SYLLABLE WE' },
+ [0x12CE] = { unicodeslot=0x12CE, category='lo', description='ETHIOPIC SYLLABLE WO' },
+ [0x12CF] = { unicodeslot=0x12CF, category='lo', description='ETHIOPIC SYLLABLE WOA' },
+ [0x12D0] = { unicodeslot=0x12D0, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL A' },
+ [0x12D1] = { unicodeslot=0x12D1, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL U' },
+ [0x12D2] = { unicodeslot=0x12D2, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL I' },
+ [0x12D3] = { unicodeslot=0x12D3, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL AA' },
+ [0x12D4] = { unicodeslot=0x12D4, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL EE' },
+ [0x12D5] = { unicodeslot=0x12D5, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL E' },
+ [0x12D6] = { unicodeslot=0x12D6, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL O' },
+ [0x12D8] = { unicodeslot=0x12D8, category='lo', description='ETHIOPIC SYLLABLE ZA' },
+ [0x12D9] = { unicodeslot=0x12D9, category='lo', description='ETHIOPIC SYLLABLE ZU' },
+ [0x12DA] = { unicodeslot=0x12DA, category='lo', description='ETHIOPIC SYLLABLE ZI' },
+ [0x12DB] = { unicodeslot=0x12DB, category='lo', description='ETHIOPIC SYLLABLE ZAA' },
+ [0x12DC] = { unicodeslot=0x12DC, category='lo', description='ETHIOPIC SYLLABLE ZEE' },
+ [0x12DD] = { unicodeslot=0x12DD, category='lo', description='ETHIOPIC SYLLABLE ZE' },
+ [0x12DE] = { unicodeslot=0x12DE, category='lo', description='ETHIOPIC SYLLABLE ZO' },
+ [0x12DF] = { unicodeslot=0x12DF, category='lo', description='ETHIOPIC SYLLABLE ZWA' },
+ [0x12E0] = { unicodeslot=0x12E0, category='lo', description='ETHIOPIC SYLLABLE ZHA' },
+ [0x12E1] = { unicodeslot=0x12E1, category='lo', description='ETHIOPIC SYLLABLE ZHU' },
+ [0x12E2] = { unicodeslot=0x12E2, category='lo', description='ETHIOPIC SYLLABLE ZHI' },
+ [0x12E3] = { unicodeslot=0x12E3, category='lo', description='ETHIOPIC SYLLABLE ZHAA' },
+ [0x12E4] = { unicodeslot=0x12E4, category='lo', description='ETHIOPIC SYLLABLE ZHEE' },
+ [0x12E5] = { unicodeslot=0x12E5, category='lo', description='ETHIOPIC SYLLABLE ZHE' },
+ [0x12E6] = { unicodeslot=0x12E6, category='lo', description='ETHIOPIC SYLLABLE ZHO' },
+ [0x12E7] = { unicodeslot=0x12E7, category='lo', description='ETHIOPIC SYLLABLE ZHWA' },
+ [0x12E8] = { unicodeslot=0x12E8, category='lo', description='ETHIOPIC SYLLABLE YA' },
+ [0x12E9] = { unicodeslot=0x12E9, category='lo', description='ETHIOPIC SYLLABLE YU' },
+ [0x12EA] = { unicodeslot=0x12EA, category='lo', description='ETHIOPIC SYLLABLE YI' },
+ [0x12EB] = { unicodeslot=0x12EB, category='lo', description='ETHIOPIC SYLLABLE YAA' },
+ [0x12EC] = { unicodeslot=0x12EC, category='lo', description='ETHIOPIC SYLLABLE YEE' },
+ [0x12ED] = { unicodeslot=0x12ED, category='lo', description='ETHIOPIC SYLLABLE YE' },
+ [0x12EE] = { unicodeslot=0x12EE, category='lo', description='ETHIOPIC SYLLABLE YO' },
+ [0x12EF] = { unicodeslot=0x12EF, category='lo', description='ETHIOPIC SYLLABLE YOA' },
+ [0x12F0] = { unicodeslot=0x12F0, category='lo', description='ETHIOPIC SYLLABLE DA' },
+ [0x12F1] = { unicodeslot=0x12F1, category='lo', description='ETHIOPIC SYLLABLE DU' },
+ [0x12F2] = { unicodeslot=0x12F2, category='lo', description='ETHIOPIC SYLLABLE DI' },
+ [0x12F3] = { unicodeslot=0x12F3, category='lo', description='ETHIOPIC SYLLABLE DAA' },
+ [0x12F4] = { unicodeslot=0x12F4, category='lo', description='ETHIOPIC SYLLABLE DEE' },
+ [0x12F5] = { unicodeslot=0x12F5, category='lo', description='ETHIOPIC SYLLABLE DE' },
+ [0x12F6] = { unicodeslot=0x12F6, category='lo', description='ETHIOPIC SYLLABLE DO' },
+ [0x12F7] = { unicodeslot=0x12F7, category='lo', description='ETHIOPIC SYLLABLE DWA' },
+ [0x12F8] = { unicodeslot=0x12F8, category='lo', description='ETHIOPIC SYLLABLE DDA' },
+ [0x12F9] = { unicodeslot=0x12F9, category='lo', description='ETHIOPIC SYLLABLE DDU' },
+ [0x12FA] = { unicodeslot=0x12FA, category='lo', description='ETHIOPIC SYLLABLE DDI' },
+ [0x12FB] = { unicodeslot=0x12FB, category='lo', description='ETHIOPIC SYLLABLE DDAA' },
+ [0x12FC] = { unicodeslot=0x12FC, category='lo', description='ETHIOPIC SYLLABLE DDEE' },
+ [0x12FD] = { unicodeslot=0x12FD, category='lo', description='ETHIOPIC SYLLABLE DDE' },
+ [0x12FE] = { unicodeslot=0x12FE, category='lo', description='ETHIOPIC SYLLABLE DDO' },
+ [0x12FF] = { unicodeslot=0x12FF, category='lo', description='ETHIOPIC SYLLABLE DDWA' },
+ [0x1300] = { unicodeslot=0x1300, category='lo', description='ETHIOPIC SYLLABLE JA' },
+ [0x1301] = { unicodeslot=0x1301, category='lo', description='ETHIOPIC SYLLABLE JU' },
+ [0x1302] = { unicodeslot=0x1302, category='lo', description='ETHIOPIC SYLLABLE JI' },
+ [0x1303] = { unicodeslot=0x1303, category='lo', description='ETHIOPIC SYLLABLE JAA' },
+ [0x1304] = { unicodeslot=0x1304, category='lo', description='ETHIOPIC SYLLABLE JEE' },
+ [0x1305] = { unicodeslot=0x1305, category='lo', description='ETHIOPIC SYLLABLE JE' },
+ [0x1306] = { unicodeslot=0x1306, category='lo', description='ETHIOPIC SYLLABLE JO' },
+ [0x1307] = { unicodeslot=0x1307, category='lo', description='ETHIOPIC SYLLABLE JWA' },
+ [0x1308] = { unicodeslot=0x1308, category='lo', description='ETHIOPIC SYLLABLE GA' },
+ [0x1309] = { unicodeslot=0x1309, category='lo', description='ETHIOPIC SYLLABLE GU' },
+ [0x130A] = { unicodeslot=0x130A, category='lo', description='ETHIOPIC SYLLABLE GI' },
+ [0x130B] = { unicodeslot=0x130B, category='lo', description='ETHIOPIC SYLLABLE GAA' },
+ [0x130C] = { unicodeslot=0x130C, category='lo', description='ETHIOPIC SYLLABLE GEE' },
+ [0x130D] = { unicodeslot=0x130D, category='lo', description='ETHIOPIC SYLLABLE GE' },
+ [0x130E] = { unicodeslot=0x130E, category='lo', description='ETHIOPIC SYLLABLE GO' },
+ [0x130F] = { unicodeslot=0x130F, category='lo', description='ETHIOPIC SYLLABLE GOA' },
+ [0x1310] = { unicodeslot=0x1310, category='lo', description='ETHIOPIC SYLLABLE GWA' },
+ [0x1312] = { unicodeslot=0x1312, category='lo', description='ETHIOPIC SYLLABLE GWI' },
+ [0x1313] = { unicodeslot=0x1313, category='lo', description='ETHIOPIC SYLLABLE GWAA' },
+ [0x1314] = { unicodeslot=0x1314, category='lo', description='ETHIOPIC SYLLABLE GWEE' },
+ [0x1315] = { unicodeslot=0x1315, category='lo', description='ETHIOPIC SYLLABLE GWE' },
+ [0x1318] = { unicodeslot=0x1318, category='lo', description='ETHIOPIC SYLLABLE GGA' },
+ [0x1319] = { unicodeslot=0x1319, category='lo', description='ETHIOPIC SYLLABLE GGU' },
+ [0x131A] = { unicodeslot=0x131A, category='lo', description='ETHIOPIC SYLLABLE GGI' },
+ [0x131B] = { unicodeslot=0x131B, category='lo', description='ETHIOPIC SYLLABLE GGAA' },
+ [0x131C] = { unicodeslot=0x131C, category='lo', description='ETHIOPIC SYLLABLE GGEE' },
+ [0x131D] = { unicodeslot=0x131D, category='lo', description='ETHIOPIC SYLLABLE GGE' },
+ [0x131E] = { unicodeslot=0x131E, category='lo', description='ETHIOPIC SYLLABLE GGO' },
+ [0x131F] = { unicodeslot=0x131F, category='lo', description='ETHIOPIC SYLLABLE GGWAA' },
+ [0x1320] = { unicodeslot=0x1320, category='lo', description='ETHIOPIC SYLLABLE THA' },
+ [0x1321] = { unicodeslot=0x1321, category='lo', description='ETHIOPIC SYLLABLE THU' },
+ [0x1322] = { unicodeslot=0x1322, category='lo', description='ETHIOPIC SYLLABLE THI' },
+ [0x1323] = { unicodeslot=0x1323, category='lo', description='ETHIOPIC SYLLABLE THAA' },
+ [0x1324] = { unicodeslot=0x1324, category='lo', description='ETHIOPIC SYLLABLE THEE' },
+ [0x1325] = { unicodeslot=0x1325, category='lo', description='ETHIOPIC SYLLABLE THE' },
+ [0x1326] = { unicodeslot=0x1326, category='lo', description='ETHIOPIC SYLLABLE THO' },
+ [0x1327] = { unicodeslot=0x1327, category='lo', description='ETHIOPIC SYLLABLE THWA' },
+ [0x1328] = { unicodeslot=0x1328, category='lo', description='ETHIOPIC SYLLABLE CHA' },
+ [0x1329] = { unicodeslot=0x1329, category='lo', description='ETHIOPIC SYLLABLE CHU' },
+ [0x132A] = { unicodeslot=0x132A, category='lo', description='ETHIOPIC SYLLABLE CHI' },
+ [0x132B] = { unicodeslot=0x132B, category='lo', description='ETHIOPIC SYLLABLE CHAA' },
+ [0x132C] = { unicodeslot=0x132C, category='lo', description='ETHIOPIC SYLLABLE CHEE' },
+ [0x132D] = { unicodeslot=0x132D, category='lo', description='ETHIOPIC SYLLABLE CHE' },
+ [0x132E] = { unicodeslot=0x132E, category='lo', description='ETHIOPIC SYLLABLE CHO' },
+ [0x132F] = { unicodeslot=0x132F, category='lo', description='ETHIOPIC SYLLABLE CHWA' },
+ [0x1330] = { unicodeslot=0x1330, category='lo', description='ETHIOPIC SYLLABLE PHA' },
+ [0x1331] = { unicodeslot=0x1331, category='lo', description='ETHIOPIC SYLLABLE PHU' },
+ [0x1332] = { unicodeslot=0x1332, category='lo', description='ETHIOPIC SYLLABLE PHI' },
+ [0x1333] = { unicodeslot=0x1333, category='lo', description='ETHIOPIC SYLLABLE PHAA' },
+ [0x1334] = { unicodeslot=0x1334, category='lo', description='ETHIOPIC SYLLABLE PHEE' },
+ [0x1335] = { unicodeslot=0x1335, category='lo', description='ETHIOPIC SYLLABLE PHE' },
+ [0x1336] = { unicodeslot=0x1336, category='lo', description='ETHIOPIC SYLLABLE PHO' },
+ [0x1337] = { unicodeslot=0x1337, category='lo', description='ETHIOPIC SYLLABLE PHWA' },
+ [0x1338] = { unicodeslot=0x1338, category='lo', description='ETHIOPIC SYLLABLE TSA' },
+ [0x1339] = { unicodeslot=0x1339, category='lo', description='ETHIOPIC SYLLABLE TSU' },
+ [0x133A] = { unicodeslot=0x133A, category='lo', description='ETHIOPIC SYLLABLE TSI' },
+ [0x133B] = { unicodeslot=0x133B, category='lo', description='ETHIOPIC SYLLABLE TSAA' },
+ [0x133C] = { unicodeslot=0x133C, category='lo', description='ETHIOPIC SYLLABLE TSEE' },
+ [0x133D] = { unicodeslot=0x133D, category='lo', description='ETHIOPIC SYLLABLE TSE' },
+ [0x133E] = { unicodeslot=0x133E, category='lo', description='ETHIOPIC SYLLABLE TSO' },
+ [0x133F] = { unicodeslot=0x133F, category='lo', description='ETHIOPIC SYLLABLE TSWA' },
+ [0x1340] = { unicodeslot=0x1340, category='lo', description='ETHIOPIC SYLLABLE TZA' },
+ [0x1341] = { unicodeslot=0x1341, category='lo', description='ETHIOPIC SYLLABLE TZU' },
+ [0x1342] = { unicodeslot=0x1342, category='lo', description='ETHIOPIC SYLLABLE TZI' },
+ [0x1343] = { unicodeslot=0x1343, category='lo', description='ETHIOPIC SYLLABLE TZAA' },
+ [0x1344] = { unicodeslot=0x1344, category='lo', description='ETHIOPIC SYLLABLE TZEE' },
+ [0x1345] = { unicodeslot=0x1345, category='lo', description='ETHIOPIC SYLLABLE TZE' },
+ [0x1346] = { unicodeslot=0x1346, category='lo', description='ETHIOPIC SYLLABLE TZO' },
+ [0x1347] = { unicodeslot=0x1347, category='lo', description='ETHIOPIC SYLLABLE TZOA' },
+ [0x1348] = { unicodeslot=0x1348, category='lo', description='ETHIOPIC SYLLABLE FA' },
+ [0x1349] = { unicodeslot=0x1349, category='lo', description='ETHIOPIC SYLLABLE FU' },
+ [0x134A] = { unicodeslot=0x134A, category='lo', description='ETHIOPIC SYLLABLE FI' },
+ [0x134B] = { unicodeslot=0x134B, category='lo', description='ETHIOPIC SYLLABLE FAA' },
+ [0x134C] = { unicodeslot=0x134C, category='lo', description='ETHIOPIC SYLLABLE FEE' },
+ [0x134D] = { unicodeslot=0x134D, category='lo', description='ETHIOPIC SYLLABLE FE' },
+ [0x134E] = { unicodeslot=0x134E, category='lo', description='ETHIOPIC SYLLABLE FO' },
+ [0x134F] = { unicodeslot=0x134F, category='lo', description='ETHIOPIC SYLLABLE FWA' },
+ [0x1350] = { unicodeslot=0x1350, category='lo', description='ETHIOPIC SYLLABLE PA' },
+ [0x1351] = { unicodeslot=0x1351, category='lo', description='ETHIOPIC SYLLABLE PU' },
+ [0x1352] = { unicodeslot=0x1352, category='lo', description='ETHIOPIC SYLLABLE PI' },
+ [0x1353] = { unicodeslot=0x1353, category='lo', description='ETHIOPIC SYLLABLE PAA' },
+ [0x1354] = { unicodeslot=0x1354, category='lo', description='ETHIOPIC SYLLABLE PEE' },
+ [0x1355] = { unicodeslot=0x1355, category='lo', description='ETHIOPIC SYLLABLE PE' },
+ [0x1356] = { unicodeslot=0x1356, category='lo', description='ETHIOPIC SYLLABLE PO' },
+ [0x1357] = { unicodeslot=0x1357, category='lo', description='ETHIOPIC SYLLABLE PWA' },
+ [0x1358] = { unicodeslot=0x1358, category='lo', description='ETHIOPIC SYLLABLE RYA' },
+ [0x1359] = { unicodeslot=0x1359, category='lo', description='ETHIOPIC SYLLABLE MYA' },
+ [0x135A] = { unicodeslot=0x135A, category='lo', description='ETHIOPIC SYLLABLE FYA' },
+ [0x135F] = { unicodeslot=0x135F, category='mn', description='ETHIOPIC COMBINING GEMINATION MARK' },
+ [0x1360] = { unicodeslot=0x1360, category='so', description='ETHIOPIC SECTION MARK' },
+ [0x1361] = { unicodeslot=0x1361, category='po', description='ETHIOPIC WORDSPACE' },
+ [0x1362] = { unicodeslot=0x1362, category='po', description='ETHIOPIC FULL STOP' },
+ [0x1363] = { unicodeslot=0x1363, category='po', description='ETHIOPIC COMMA' },
+ [0x1364] = { unicodeslot=0x1364, category='po', description='ETHIOPIC SEMICOLON' },
+ [0x1365] = { unicodeslot=0x1365, category='po', description='ETHIOPIC COLON' },
+ [0x1366] = { unicodeslot=0x1366, category='po', description='ETHIOPIC PREFACE COLON' },
+ [0x1367] = { unicodeslot=0x1367, category='po', description='ETHIOPIC QUESTION MARK' },
+ [0x1368] = { unicodeslot=0x1368, category='po', description='ETHIOPIC PARAGRAPH SEPARATOR' },
+ [0x1369] = { unicodeslot=0x1369, category='no', description='ETHIOPIC DIGIT ONE' },
+ [0x136A] = { unicodeslot=0x136A, category='no', description='ETHIOPIC DIGIT TWO' },
+ [0x136B] = { unicodeslot=0x136B, category='no', description='ETHIOPIC DIGIT THREE' },
+ [0x136C] = { unicodeslot=0x136C, category='no', description='ETHIOPIC DIGIT FOUR' },
+ [0x136D] = { unicodeslot=0x136D, category='no', description='ETHIOPIC DIGIT FIVE' },
+ [0x136E] = { unicodeslot=0x136E, category='no', description='ETHIOPIC DIGIT SIX' },
+ [0x136F] = { unicodeslot=0x136F, category='no', description='ETHIOPIC DIGIT SEVEN' },
+ [0x1370] = { unicodeslot=0x1370, category='no', description='ETHIOPIC DIGIT EIGHT' },
+ [0x1371] = { unicodeslot=0x1371, category='no', description='ETHIOPIC DIGIT NINE' },
+ [0x1372] = { unicodeslot=0x1372, category='no', description='ETHIOPIC NUMBER TEN' },
+ [0x1373] = { unicodeslot=0x1373, category='no', description='ETHIOPIC NUMBER TWENTY' },
+ [0x1374] = { unicodeslot=0x1374, category='no', description='ETHIOPIC NUMBER THIRTY' },
+ [0x1375] = { unicodeslot=0x1375, category='no', description='ETHIOPIC NUMBER FORTY' },
+ [0x1376] = { unicodeslot=0x1376, category='no', description='ETHIOPIC NUMBER FIFTY' },
+ [0x1377] = { unicodeslot=0x1377, category='no', description='ETHIOPIC NUMBER SIXTY' },
+ [0x1378] = { unicodeslot=0x1378, category='no', description='ETHIOPIC NUMBER SEVENTY' },
+ [0x1379] = { unicodeslot=0x1379, category='no', description='ETHIOPIC NUMBER EIGHTY' },
+ [0x137A] = { unicodeslot=0x137A, category='no', description='ETHIOPIC NUMBER NINETY' },
+ [0x137B] = { unicodeslot=0x137B, category='no', description='ETHIOPIC NUMBER HUNDRED' },
+ [0x137C] = { unicodeslot=0x137C, category='no', description='ETHIOPIC NUMBER TEN THOUSAND' },
+ [0x1380] = { unicodeslot=0x1380, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT MWA' },
+ [0x1381] = { unicodeslot=0x1381, category='lo', description='ETHIOPIC SYLLABLE MWI' },
+ [0x1382] = { unicodeslot=0x1382, category='lo', description='ETHIOPIC SYLLABLE MWEE' },
+ [0x1383] = { unicodeslot=0x1383, category='lo', description='ETHIOPIC SYLLABLE MWE' },
+ [0x1384] = { unicodeslot=0x1384, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT BWA' },
+ [0x1385] = { unicodeslot=0x1385, category='lo', description='ETHIOPIC SYLLABLE BWI' },
+ [0x1386] = { unicodeslot=0x1386, category='lo', description='ETHIOPIC SYLLABLE BWEE' },
+ [0x1387] = { unicodeslot=0x1387, category='lo', description='ETHIOPIC SYLLABLE BWE' },
+ [0x1388] = { unicodeslot=0x1388, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT FWA' },
+ [0x1389] = { unicodeslot=0x1389, category='lo', description='ETHIOPIC SYLLABLE FWI' },
+ [0x138A] = { unicodeslot=0x138A, category='lo', description='ETHIOPIC SYLLABLE FWEE' },
+ [0x138B] = { unicodeslot=0x138B, category='lo', description='ETHIOPIC SYLLABLE FWE' },
+ [0x138C] = { unicodeslot=0x138C, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT PWA' },
+ [0x138D] = { unicodeslot=0x138D, category='lo', description='ETHIOPIC SYLLABLE PWI' },
+ [0x138E] = { unicodeslot=0x138E, category='lo', description='ETHIOPIC SYLLABLE PWEE' },
+ [0x138F] = { unicodeslot=0x138F, category='lo', description='ETHIOPIC SYLLABLE PWE' },
+ [0x1390] = { unicodeslot=0x1390, category='so', description='ETHIOPIC TONAL MARK YIZET' },
+ [0x1391] = { unicodeslot=0x1391, category='so', description='ETHIOPIC TONAL MARK DERET' },
+ [0x1392] = { unicodeslot=0x1392, category='so', description='ETHIOPIC TONAL MARK RIKRIK' },
+ [0x1393] = { unicodeslot=0x1393, category='so', description='ETHIOPIC TONAL MARK SHORT RIKRIK' },
+ [0x1394] = { unicodeslot=0x1394, category='so', description='ETHIOPIC TONAL MARK DIFAT' },
+ [0x1395] = { unicodeslot=0x1395, category='so', description='ETHIOPIC TONAL MARK KENAT' },
+ [0x1396] = { unicodeslot=0x1396, category='so', description='ETHIOPIC TONAL MARK CHIRET' },
+ [0x1397] = { unicodeslot=0x1397, category='so', description='ETHIOPIC TONAL MARK HIDET' },
+ [0x1398] = { unicodeslot=0x1398, category='so', description='ETHIOPIC TONAL MARK DERET-HIDET' },
+ [0x1399] = { unicodeslot=0x1399, category='so', description='ETHIOPIC TONAL MARK KURT' },
+ [0x13A0] = { unicodeslot=0x13A0, category='lo', description='CHEROKEE LETTER A' },
+ [0x13A1] = { unicodeslot=0x13A1, category='lo', description='CHEROKEE LETTER E' },
+ [0x13A2] = { unicodeslot=0x13A2, category='lo', description='CHEROKEE LETTER I' },
+ [0x13A3] = { unicodeslot=0x13A3, category='lo', description='CHEROKEE LETTER O' },
+ [0x13A4] = { unicodeslot=0x13A4, category='lo', description='CHEROKEE LETTER U' },
+ [0x13A5] = { unicodeslot=0x13A5, category='lo', description='CHEROKEE LETTER V' },
+ [0x13A6] = { unicodeslot=0x13A6, category='lo', description='CHEROKEE LETTER GA' },
+ [0x13A7] = { unicodeslot=0x13A7, category='lo', description='CHEROKEE LETTER KA' },
+ [0x13A8] = { unicodeslot=0x13A8, category='lo', description='CHEROKEE LETTER GE' },
+ [0x13A9] = { unicodeslot=0x13A9, category='lo', description='CHEROKEE LETTER GI' },
+ [0x13AA] = { unicodeslot=0x13AA, category='lo', description='CHEROKEE LETTER GO' },
+ [0x13AB] = { unicodeslot=0x13AB, category='lo', description='CHEROKEE LETTER GU' },
+ [0x13AC] = { unicodeslot=0x13AC, category='lo', description='CHEROKEE LETTER GV' },
+ [0x13AD] = { unicodeslot=0x13AD, category='lo', description='CHEROKEE LETTER HA' },
+ [0x13AE] = { unicodeslot=0x13AE, category='lo', description='CHEROKEE LETTER HE' },
+ [0x13AF] = { unicodeslot=0x13AF, category='lo', description='CHEROKEE LETTER HI' },
+ [0x13B0] = { unicodeslot=0x13B0, category='lo', description='CHEROKEE LETTER HO' },
+ [0x13B1] = { unicodeslot=0x13B1, category='lo', description='CHEROKEE LETTER HU' },
+ [0x13B2] = { unicodeslot=0x13B2, category='lo', description='CHEROKEE LETTER HV' },
+ [0x13B3] = { unicodeslot=0x13B3, category='lo', description='CHEROKEE LETTER LA' },
+ [0x13B4] = { unicodeslot=0x13B4, category='lo', description='CHEROKEE LETTER LE' },
+ [0x13B5] = { unicodeslot=0x13B5, category='lo', description='CHEROKEE LETTER LI' },
+ [0x13B6] = { unicodeslot=0x13B6, category='lo', description='CHEROKEE LETTER LO' },
+ [0x13B7] = { unicodeslot=0x13B7, category='lo', description='CHEROKEE LETTER LU' },
+ [0x13B8] = { unicodeslot=0x13B8, category='lo', description='CHEROKEE LETTER LV' },
+ [0x13B9] = { unicodeslot=0x13B9, category='lo', description='CHEROKEE LETTER MA' },
+ [0x13BA] = { unicodeslot=0x13BA, category='lo', description='CHEROKEE LETTER ME' },
+ [0x13BB] = { unicodeslot=0x13BB, category='lo', description='CHEROKEE LETTER MI' },
+ [0x13BC] = { unicodeslot=0x13BC, category='lo', description='CHEROKEE LETTER MO' },
+ [0x13BD] = { unicodeslot=0x13BD, category='lo', description='CHEROKEE LETTER MU' },
+ [0x13BE] = { unicodeslot=0x13BE, category='lo', description='CHEROKEE LETTER NA' },
+ [0x13BF] = { unicodeslot=0x13BF, category='lo', description='CHEROKEE LETTER HNA' },
+ [0x13C0] = { unicodeslot=0x13C0, category='lo', description='CHEROKEE LETTER NAH' },
+ [0x13C1] = { unicodeslot=0x13C1, category='lo', description='CHEROKEE LETTER NE' },
+ [0x13C2] = { unicodeslot=0x13C2, category='lo', description='CHEROKEE LETTER NI' },
+ [0x13C3] = { unicodeslot=0x13C3, category='lo', description='CHEROKEE LETTER NO' },
+ [0x13C4] = { unicodeslot=0x13C4, category='lo', description='CHEROKEE LETTER NU' },
+ [0x13C5] = { unicodeslot=0x13C5, category='lo', description='CHEROKEE LETTER NV' },
+ [0x13C6] = { unicodeslot=0x13C6, category='lo', description='CHEROKEE LETTER QUA' },
+ [0x13C7] = { unicodeslot=0x13C7, category='lo', description='CHEROKEE LETTER QUE' },
+ [0x13C8] = { unicodeslot=0x13C8, category='lo', description='CHEROKEE LETTER QUI' },
+ [0x13C9] = { unicodeslot=0x13C9, category='lo', description='CHEROKEE LETTER QUO' },
+ [0x13CA] = { unicodeslot=0x13CA, category='lo', description='CHEROKEE LETTER QUU' },
+ [0x13CB] = { unicodeslot=0x13CB, category='lo', description='CHEROKEE LETTER QUV' },
+ [0x13CC] = { unicodeslot=0x13CC, category='lo', description='CHEROKEE LETTER SA' },
+ [0x13CD] = { unicodeslot=0x13CD, category='lo', description='CHEROKEE LETTER S' },
+ [0x13CE] = { unicodeslot=0x13CE, category='lo', description='CHEROKEE LETTER SE' },
+ [0x13CF] = { unicodeslot=0x13CF, category='lo', description='CHEROKEE LETTER SI' },
+ [0x13D0] = { unicodeslot=0x13D0, category='lo', description='CHEROKEE LETTER SO' },
+ [0x13D1] = { unicodeslot=0x13D1, category='lo', description='CHEROKEE LETTER SU' },
+ [0x13D2] = { unicodeslot=0x13D2, category='lo', description='CHEROKEE LETTER SV' },
+ [0x13D3] = { unicodeslot=0x13D3, category='lo', description='CHEROKEE LETTER DA' },
+ [0x13D4] = { unicodeslot=0x13D4, category='lo', description='CHEROKEE LETTER TA' },
+ [0x13D5] = { unicodeslot=0x13D5, category='lo', description='CHEROKEE LETTER DE' },
+ [0x13D6] = { unicodeslot=0x13D6, category='lo', description='CHEROKEE LETTER TE' },
+ [0x13D7] = { unicodeslot=0x13D7, category='lo', description='CHEROKEE LETTER DI' },
+ [0x13D8] = { unicodeslot=0x13D8, category='lo', description='CHEROKEE LETTER TI' },
+ [0x13D9] = { unicodeslot=0x13D9, category='lo', description='CHEROKEE LETTER DO' },
+ [0x13DA] = { unicodeslot=0x13DA, category='lo', description='CHEROKEE LETTER DU' },
+ [0x13DB] = { unicodeslot=0x13DB, category='lo', description='CHEROKEE LETTER DV' },
+ [0x13DC] = { unicodeslot=0x13DC, category='lo', description='CHEROKEE LETTER DLA' },
+ [0x13DD] = { unicodeslot=0x13DD, category='lo', description='CHEROKEE LETTER TLA' },
+ [0x13DE] = { unicodeslot=0x13DE, category='lo', description='CHEROKEE LETTER TLE' },
+ [0x13DF] = { unicodeslot=0x13DF, category='lo', description='CHEROKEE LETTER TLI' },
+ [0x13E0] = { unicodeslot=0x13E0, category='lo', description='CHEROKEE LETTER TLO' },
+ [0x13E1] = { unicodeslot=0x13E1, category='lo', description='CHEROKEE LETTER TLU' },
+ [0x13E2] = { unicodeslot=0x13E2, category='lo', description='CHEROKEE LETTER TLV' },
+ [0x13E3] = { unicodeslot=0x13E3, category='lo', description='CHEROKEE LETTER TSA' },
+ [0x13E4] = { unicodeslot=0x13E4, category='lo', description='CHEROKEE LETTER TSE' },
+ [0x13E5] = { unicodeslot=0x13E5, category='lo', description='CHEROKEE LETTER TSI' },
+ [0x13E6] = { unicodeslot=0x13E6, category='lo', description='CHEROKEE LETTER TSO' },
+ [0x13E7] = { unicodeslot=0x13E7, category='lo', description='CHEROKEE LETTER TSU' },
+ [0x13E8] = { unicodeslot=0x13E8, category='lo', description='CHEROKEE LETTER TSV' },
+ [0x13E9] = { unicodeslot=0x13E9, category='lo', description='CHEROKEE LETTER WA' },
+ [0x13EA] = { unicodeslot=0x13EA, category='lo', description='CHEROKEE LETTER WE' },
+ [0x13EB] = { unicodeslot=0x13EB, category='lo', description='CHEROKEE LETTER WI' },
+ [0x13EC] = { unicodeslot=0x13EC, category='lo', description='CHEROKEE LETTER WO' },
+ [0x13ED] = { unicodeslot=0x13ED, category='lo', description='CHEROKEE LETTER WU' },
+ [0x13EE] = { unicodeslot=0x13EE, category='lo', description='CHEROKEE LETTER WV' },
+ [0x13EF] = { unicodeslot=0x13EF, category='lo', description='CHEROKEE LETTER YA' },
+ [0x13F0] = { unicodeslot=0x13F0, category='lo', description='CHEROKEE LETTER YE' },
+ [0x13F1] = { unicodeslot=0x13F1, category='lo', description='CHEROKEE LETTER YI' },
+ [0x13F2] = { unicodeslot=0x13F2, category='lo', description='CHEROKEE LETTER YO' },
+ [0x13F3] = { unicodeslot=0x13F3, category='lo', description='CHEROKEE LETTER YU' },
+ [0x13F4] = { unicodeslot=0x13F4, category='lo', description='CHEROKEE LETTER YV' },
+ [0x1401] = { unicodeslot=0x1401, category='lo', description='CANADIAN SYLLABICS E' },
+ [0x1402] = { unicodeslot=0x1402, category='lo', description='CANADIAN SYLLABICS AAI' },
+ [0x1403] = { unicodeslot=0x1403, category='lo', description='CANADIAN SYLLABICS I' },
+ [0x1404] = { unicodeslot=0x1404, category='lo', description='CANADIAN SYLLABICS II' },
+ [0x1405] = { unicodeslot=0x1405, category='lo', description='CANADIAN SYLLABICS O' },
+ [0x1406] = { unicodeslot=0x1406, category='lo', description='CANADIAN SYLLABICS OO' },
+ [0x1407] = { unicodeslot=0x1407, category='lo', description='CANADIAN SYLLABICS Y-CREE OO' },
+ [0x1408] = { unicodeslot=0x1408, category='lo', description='CANADIAN SYLLABICS CARRIER EE' },
+ [0x1409] = { unicodeslot=0x1409, category='lo', description='CANADIAN SYLLABICS CARRIER I' },
+ [0x140A] = { unicodeslot=0x140A, category='lo', description='CANADIAN SYLLABICS A' },
+ [0x140B] = { unicodeslot=0x140B, category='lo', description='CANADIAN SYLLABICS AA' },
+ [0x140C] = { unicodeslot=0x140C, category='lo', description='CANADIAN SYLLABICS WE' },
+ [0x140D] = { unicodeslot=0x140D, category='lo', description='CANADIAN SYLLABICS WEST-CREE WE' },
+ [0x140E] = { unicodeslot=0x140E, category='lo', description='CANADIAN SYLLABICS WI' },
+ [0x140F] = { unicodeslot=0x140F, category='lo', description='CANADIAN SYLLABICS WEST-CREE WI' },
+ [0x1410] = { unicodeslot=0x1410, category='lo', description='CANADIAN SYLLABICS WII' },
+ [0x1411] = { unicodeslot=0x1411, category='lo', description='CANADIAN SYLLABICS WEST-CREE WII' },
+ [0x1412] = { unicodeslot=0x1412, category='lo', description='CANADIAN SYLLABICS WO' },
+ [0x1413] = { unicodeslot=0x1413, category='lo', description='CANADIAN SYLLABICS WEST-CREE WO' },
+ [0x1414] = { unicodeslot=0x1414, category='lo', description='CANADIAN SYLLABICS WOO' },
+ [0x1415] = { unicodeslot=0x1415, category='lo', description='CANADIAN SYLLABICS WEST-CREE WOO' },
+ [0x1416] = { unicodeslot=0x1416, category='lo', description='CANADIAN SYLLABICS NASKAPI WOO' },
+ [0x1417] = { unicodeslot=0x1417, category='lo', description='CANADIAN SYLLABICS WA' },
+ [0x1418] = { unicodeslot=0x1418, category='lo', description='CANADIAN SYLLABICS WEST-CREE WA' },
+ [0x1419] = { unicodeslot=0x1419, category='lo', description='CANADIAN SYLLABICS WAA' },
+ [0x141A] = { unicodeslot=0x141A, category='lo', description='CANADIAN SYLLABICS WEST-CREE WAA' },
+ [0x141B] = { unicodeslot=0x141B, category='lo', description='CANADIAN SYLLABICS NASKAPI WAA' },
+ [0x141C] = { unicodeslot=0x141C, category='lo', description='CANADIAN SYLLABICS AI' },
+ [0x141D] = { unicodeslot=0x141D, category='lo', description='CANADIAN SYLLABICS Y-CREE W' },
+ [0x141E] = { unicodeslot=0x141E, category='lo', description='CANADIAN SYLLABICS GLOTTAL STOP' },
+ [0x141F] = { unicodeslot=0x141F, category='lo', description='CANADIAN SYLLABICS FINAL ACUTE' },
+ [0x1420] = { unicodeslot=0x1420, category='lo', description='CANADIAN SYLLABICS FINAL GRAVE' },
+ [0x1421] = { unicodeslot=0x1421, category='lo', description='CANADIAN SYLLABICS FINAL BOTTOM HALF RING' },
+ [0x1422] = { unicodeslot=0x1422, category='lo', description='CANADIAN SYLLABICS FINAL TOP HALF RING' },
+ [0x1423] = { unicodeslot=0x1423, category='lo', description='CANADIAN SYLLABICS FINAL RIGHT HALF RING' },
+ [0x1424] = { unicodeslot=0x1424, category='lo', description='CANADIAN SYLLABICS FINAL RING' },
+ [0x1425] = { unicodeslot=0x1425, category='lo', description='CANADIAN SYLLABICS FINAL DOUBLE ACUTE' },
+ [0x1426] = { unicodeslot=0x1426, category='lo', description='CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES' },
+ [0x1427] = { unicodeslot=0x1427, category='lo', description='CANADIAN SYLLABICS FINAL MIDDLE DOT' },
+ [0x1428] = { unicodeslot=0x1428, category='lo', description='CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE' },
+ [0x1429] = { unicodeslot=0x1429, category='lo', description='CANADIAN SYLLABICS FINAL PLUS' },
+ [0x142A] = { unicodeslot=0x142A, category='lo', description='CANADIAN SYLLABICS FINAL DOWN TACK' },
+ [0x142B] = { unicodeslot=0x142B, category='lo', description='CANADIAN SYLLABICS EN' },
+ [0x142C] = { unicodeslot=0x142C, category='lo', description='CANADIAN SYLLABICS IN' },
+ [0x142D] = { unicodeslot=0x142D, category='lo', description='CANADIAN SYLLABICS ON' },
+ [0x142E] = { unicodeslot=0x142E, category='lo', description='CANADIAN SYLLABICS AN' },
+ [0x142F] = { unicodeslot=0x142F, category='lo', description='CANADIAN SYLLABICS PE' },
+ [0x1430] = { unicodeslot=0x1430, category='lo', description='CANADIAN SYLLABICS PAAI' },
+ [0x1431] = { unicodeslot=0x1431, category='lo', description='CANADIAN SYLLABICS PI' },
+ [0x1432] = { unicodeslot=0x1432, category='lo', description='CANADIAN SYLLABICS PII' },
+ [0x1433] = { unicodeslot=0x1433, category='lo', description='CANADIAN SYLLABICS PO' },
+ [0x1434] = { unicodeslot=0x1434, category='lo', description='CANADIAN SYLLABICS POO' },
+ [0x1435] = { unicodeslot=0x1435, category='lo', description='CANADIAN SYLLABICS Y-CREE POO' },
+ [0x1436] = { unicodeslot=0x1436, category='lo', description='CANADIAN SYLLABICS CARRIER HEE' },
+ [0x1437] = { unicodeslot=0x1437, category='lo', description='CANADIAN SYLLABICS CARRIER HI' },
+ [0x1438] = { unicodeslot=0x1438, category='lo', description='CANADIAN SYLLABICS PA' },
+ [0x1439] = { unicodeslot=0x1439, category='lo', description='CANADIAN SYLLABICS PAA' },
+ [0x143A] = { unicodeslot=0x143A, category='lo', description='CANADIAN SYLLABICS PWE' },
+ [0x143B] = { unicodeslot=0x143B, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWE' },
+ [0x143C] = { unicodeslot=0x143C, category='lo', description='CANADIAN SYLLABICS PWI' },
+ [0x143D] = { unicodeslot=0x143D, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWI' },
+ [0x143E] = { unicodeslot=0x143E, category='lo', description='CANADIAN SYLLABICS PWII' },
+ [0x143F] = { unicodeslot=0x143F, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWII' },
+ [0x1440] = { unicodeslot=0x1440, category='lo', description='CANADIAN SYLLABICS PWO' },
+ [0x1441] = { unicodeslot=0x1441, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWO' },
+ [0x1442] = { unicodeslot=0x1442, category='lo', description='CANADIAN SYLLABICS PWOO' },
+ [0x1443] = { unicodeslot=0x1443, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWOO' },
+ [0x1444] = { unicodeslot=0x1444, category='lo', description='CANADIAN SYLLABICS PWA' },
+ [0x1445] = { unicodeslot=0x1445, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWA' },
+ [0x1446] = { unicodeslot=0x1446, category='lo', description='CANADIAN SYLLABICS PWAA' },
+ [0x1447] = { unicodeslot=0x1447, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWAA' },
+ [0x1448] = { unicodeslot=0x1448, category='lo', description='CANADIAN SYLLABICS Y-CREE PWAA' },
+ [0x1449] = { unicodeslot=0x1449, category='lo', description='CANADIAN SYLLABICS P' },
+ [0x144A] = { unicodeslot=0x144A, category='lo', description='CANADIAN SYLLABICS WEST-CREE P' },
+ [0x144B] = { unicodeslot=0x144B, category='lo', description='CANADIAN SYLLABICS CARRIER H' },
+ [0x144C] = { unicodeslot=0x144C, category='lo', description='CANADIAN SYLLABICS TE' },
+ [0x144D] = { unicodeslot=0x144D, category='lo', description='CANADIAN SYLLABICS TAAI' },
+ [0x144E] = { unicodeslot=0x144E, category='lo', description='CANADIAN SYLLABICS TI' },
+ [0x144F] = { unicodeslot=0x144F, category='lo', description='CANADIAN SYLLABICS TII' },
+ [0x1450] = { unicodeslot=0x1450, category='lo', description='CANADIAN SYLLABICS TO' },
+ [0x1451] = { unicodeslot=0x1451, category='lo', description='CANADIAN SYLLABICS TOO' },
+ [0x1452] = { unicodeslot=0x1452, category='lo', description='CANADIAN SYLLABICS Y-CREE TOO' },
+ [0x1453] = { unicodeslot=0x1453, category='lo', description='CANADIAN SYLLABICS CARRIER DEE' },
+ [0x1454] = { unicodeslot=0x1454, category='lo', description='CANADIAN SYLLABICS CARRIER DI' },
+ [0x1455] = { unicodeslot=0x1455, category='lo', description='CANADIAN SYLLABICS TA' },
+ [0x1456] = { unicodeslot=0x1456, category='lo', description='CANADIAN SYLLABICS TAA' },
+ [0x1457] = { unicodeslot=0x1457, category='lo', description='CANADIAN SYLLABICS TWE' },
+ [0x1458] = { unicodeslot=0x1458, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWE' },
+ [0x1459] = { unicodeslot=0x1459, category='lo', description='CANADIAN SYLLABICS TWI' },
+ [0x145A] = { unicodeslot=0x145A, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWI' },
+ [0x145B] = { unicodeslot=0x145B, category='lo', description='CANADIAN SYLLABICS TWII' },
+ [0x145C] = { unicodeslot=0x145C, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWII' },
+ [0x145D] = { unicodeslot=0x145D, category='lo', description='CANADIAN SYLLABICS TWO' },
+ [0x145E] = { unicodeslot=0x145E, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWO' },
+ [0x145F] = { unicodeslot=0x145F, category='lo', description='CANADIAN SYLLABICS TWOO' },
+ [0x1460] = { unicodeslot=0x1460, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWOO' },
+ [0x1461] = { unicodeslot=0x1461, category='lo', description='CANADIAN SYLLABICS TWA' },
+ [0x1462] = { unicodeslot=0x1462, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWA' },
+ [0x1463] = { unicodeslot=0x1463, category='lo', description='CANADIAN SYLLABICS TWAA' },
+ [0x1464] = { unicodeslot=0x1464, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWAA' },
+ [0x1465] = { unicodeslot=0x1465, category='lo', description='CANADIAN SYLLABICS NASKAPI TWAA' },
+ [0x1466] = { unicodeslot=0x1466, category='lo', description='CANADIAN SYLLABICS T' },
+ [0x1467] = { unicodeslot=0x1467, category='lo', description='CANADIAN SYLLABICS TTE' },
+ [0x1468] = { unicodeslot=0x1468, category='lo', description='CANADIAN SYLLABICS TTI' },
+ [0x1469] = { unicodeslot=0x1469, category='lo', description='CANADIAN SYLLABICS TTO' },
+ [0x146A] = { unicodeslot=0x146A, category='lo', description='CANADIAN SYLLABICS TTA' },
+ [0x146B] = { unicodeslot=0x146B, category='lo', description='CANADIAN SYLLABICS KE' },
+ [0x146C] = { unicodeslot=0x146C, category='lo', description='CANADIAN SYLLABICS KAAI' },
+ [0x146D] = { unicodeslot=0x146D, category='lo', description='CANADIAN SYLLABICS KI' },
+ [0x146E] = { unicodeslot=0x146E, category='lo', description='CANADIAN SYLLABICS KII' },
+ [0x146F] = { unicodeslot=0x146F, category='lo', description='CANADIAN SYLLABICS KO' },
+ [0x1470] = { unicodeslot=0x1470, category='lo', description='CANADIAN SYLLABICS KOO' },
+ [0x1471] = { unicodeslot=0x1471, category='lo', description='CANADIAN SYLLABICS Y-CREE KOO' },
+ [0x1472] = { unicodeslot=0x1472, category='lo', description='CANADIAN SYLLABICS KA' },
+ [0x1473] = { unicodeslot=0x1473, category='lo', description='CANADIAN SYLLABICS KAA' },
+ [0x1474] = { unicodeslot=0x1474, category='lo', description='CANADIAN SYLLABICS KWE' },
+ [0x1475] = { unicodeslot=0x1475, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWE' },
+ [0x1476] = { unicodeslot=0x1476, category='lo', description='CANADIAN SYLLABICS KWI' },
+ [0x1477] = { unicodeslot=0x1477, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWI' },
+ [0x1478] = { unicodeslot=0x1478, category='lo', description='CANADIAN SYLLABICS KWII' },
+ [0x1479] = { unicodeslot=0x1479, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWII' },
+ [0x147A] = { unicodeslot=0x147A, category='lo', description='CANADIAN SYLLABICS KWO' },
+ [0x147B] = { unicodeslot=0x147B, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWO' },
+ [0x147C] = { unicodeslot=0x147C, category='lo', description='CANADIAN SYLLABICS KWOO' },
+ [0x147D] = { unicodeslot=0x147D, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWOO' },
+ [0x147E] = { unicodeslot=0x147E, category='lo', description='CANADIAN SYLLABICS KWA' },
+ [0x147F] = { unicodeslot=0x147F, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWA' },
+ [0x1480] = { unicodeslot=0x1480, category='lo', description='CANADIAN SYLLABICS KWAA' },
+ [0x1481] = { unicodeslot=0x1481, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWAA' },
+ [0x1482] = { unicodeslot=0x1482, category='lo', description='CANADIAN SYLLABICS NASKAPI KWAA' },
+ [0x1483] = { unicodeslot=0x1483, category='lo', description='CANADIAN SYLLABICS K' },
+ [0x1484] = { unicodeslot=0x1484, category='lo', description='CANADIAN SYLLABICS KW' },
+ [0x1485] = { unicodeslot=0x1485, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KEH' },
+ [0x1486] = { unicodeslot=0x1486, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KIH' },
+ [0x1487] = { unicodeslot=0x1487, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KOH' },
+ [0x1488] = { unicodeslot=0x1488, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KAH' },
+ [0x1489] = { unicodeslot=0x1489, category='lo', description='CANADIAN SYLLABICS CE' },
+ [0x148A] = { unicodeslot=0x148A, category='lo', description='CANADIAN SYLLABICS CAAI' },
+ [0x148B] = { unicodeslot=0x148B, category='lo', description='CANADIAN SYLLABICS CI' },
+ [0x148C] = { unicodeslot=0x148C, category='lo', description='CANADIAN SYLLABICS CII' },
+ [0x148D] = { unicodeslot=0x148D, category='lo', description='CANADIAN SYLLABICS CO' },
+ [0x148E] = { unicodeslot=0x148E, category='lo', description='CANADIAN SYLLABICS COO' },
+ [0x148F] = { unicodeslot=0x148F, category='lo', description='CANADIAN SYLLABICS Y-CREE COO' },
+ [0x1490] = { unicodeslot=0x1490, category='lo', description='CANADIAN SYLLABICS CA' },
+ [0x1491] = { unicodeslot=0x1491, category='lo', description='CANADIAN SYLLABICS CAA' },
+ [0x1492] = { unicodeslot=0x1492, category='lo', description='CANADIAN SYLLABICS CWE' },
+ [0x1493] = { unicodeslot=0x1493, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWE' },
+ [0x1494] = { unicodeslot=0x1494, category='lo', description='CANADIAN SYLLABICS CWI' },
+ [0x1495] = { unicodeslot=0x1495, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWI' },
+ [0x1496] = { unicodeslot=0x1496, category='lo', description='CANADIAN SYLLABICS CWII' },
+ [0x1497] = { unicodeslot=0x1497, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWII' },
+ [0x1498] = { unicodeslot=0x1498, category='lo', description='CANADIAN SYLLABICS CWO' },
+ [0x1499] = { unicodeslot=0x1499, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWO' },
+ [0x149A] = { unicodeslot=0x149A, category='lo', description='CANADIAN SYLLABICS CWOO' },
+ [0x149B] = { unicodeslot=0x149B, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWOO' },
+ [0x149C] = { unicodeslot=0x149C, category='lo', description='CANADIAN SYLLABICS CWA' },
+ [0x149D] = { unicodeslot=0x149D, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWA' },
+ [0x149E] = { unicodeslot=0x149E, category='lo', description='CANADIAN SYLLABICS CWAA' },
+ [0x149F] = { unicodeslot=0x149F, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWAA' },
+ [0x14A0] = { unicodeslot=0x14A0, category='lo', description='CANADIAN SYLLABICS NASKAPI CWAA' },
+ [0x14A1] = { unicodeslot=0x14A1, category='lo', description='CANADIAN SYLLABICS C' },
+ [0x14A2] = { unicodeslot=0x14A2, category='lo', description='CANADIAN SYLLABICS SAYISI TH' },
+ [0x14A3] = { unicodeslot=0x14A3, category='lo', description='CANADIAN SYLLABICS ME' },
+ [0x14A4] = { unicodeslot=0x14A4, category='lo', description='CANADIAN SYLLABICS MAAI' },
+ [0x14A5] = { unicodeslot=0x14A5, category='lo', description='CANADIAN SYLLABICS MI' },
+ [0x14A6] = { unicodeslot=0x14A6, category='lo', description='CANADIAN SYLLABICS MII' },
+ [0x14A7] = { unicodeslot=0x14A7, category='lo', description='CANADIAN SYLLABICS MO' },
+ [0x14A8] = { unicodeslot=0x14A8, category='lo', description='CANADIAN SYLLABICS MOO' },
+ [0x14A9] = { unicodeslot=0x14A9, category='lo', description='CANADIAN SYLLABICS Y-CREE MOO' },
+ [0x14AA] = { unicodeslot=0x14AA, category='lo', description='CANADIAN SYLLABICS MA' },
+ [0x14AB] = { unicodeslot=0x14AB, category='lo', description='CANADIAN SYLLABICS MAA' },
+ [0x14AC] = { unicodeslot=0x14AC, category='lo', description='CANADIAN SYLLABICS MWE' },
+ [0x14AD] = { unicodeslot=0x14AD, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWE' },
+ [0x14AE] = { unicodeslot=0x14AE, category='lo', description='CANADIAN SYLLABICS MWI' },
+ [0x14AF] = { unicodeslot=0x14AF, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWI' },
+ [0x14B0] = { unicodeslot=0x14B0, category='lo', description='CANADIAN SYLLABICS MWII' },
+ [0x14B1] = { unicodeslot=0x14B1, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWII' },
+ [0x14B2] = { unicodeslot=0x14B2, category='lo', description='CANADIAN SYLLABICS MWO' },
+ [0x14B3] = { unicodeslot=0x14B3, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWO' },
+ [0x14B4] = { unicodeslot=0x14B4, category='lo', description='CANADIAN SYLLABICS MWOO' },
+ [0x14B5] = { unicodeslot=0x14B5, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWOO' },
+ [0x14B6] = { unicodeslot=0x14B6, category='lo', description='CANADIAN SYLLABICS MWA' },
+ [0x14B7] = { unicodeslot=0x14B7, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWA' },
+ [0x14B8] = { unicodeslot=0x14B8, category='lo', description='CANADIAN SYLLABICS MWAA' },
+ [0x14B9] = { unicodeslot=0x14B9, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWAA' },
+ [0x14BA] = { unicodeslot=0x14BA, category='lo', description='CANADIAN SYLLABICS NASKAPI MWAA' },
+ [0x14BB] = { unicodeslot=0x14BB, category='lo', description='CANADIAN SYLLABICS M' },
+ [0x14BC] = { unicodeslot=0x14BC, category='lo', description='CANADIAN SYLLABICS WEST-CREE M' },
+ [0x14BD] = { unicodeslot=0x14BD, category='lo', description='CANADIAN SYLLABICS MH' },
+ [0x14BE] = { unicodeslot=0x14BE, category='lo', description='CANADIAN SYLLABICS ATHAPASCAN M' },
+ [0x14BF] = { unicodeslot=0x14BF, category='lo', description='CANADIAN SYLLABICS SAYISI M' },
+ [0x14C0] = { unicodeslot=0x14C0, category='lo', description='CANADIAN SYLLABICS NE' },
+ [0x14C1] = { unicodeslot=0x14C1, category='lo', description='CANADIAN SYLLABICS NAAI' },
+ [0x14C2] = { unicodeslot=0x14C2, category='lo', description='CANADIAN SYLLABICS NI' },
+ [0x14C3] = { unicodeslot=0x14C3, category='lo', description='CANADIAN SYLLABICS NII' },
+ [0x14C4] = { unicodeslot=0x14C4, category='lo', description='CANADIAN SYLLABICS NO' },
+ [0x14C5] = { unicodeslot=0x14C5, category='lo', description='CANADIAN SYLLABICS NOO' },
+ [0x14C6] = { unicodeslot=0x14C6, category='lo', description='CANADIAN SYLLABICS Y-CREE NOO' },
+ [0x14C7] = { unicodeslot=0x14C7, category='lo', description='CANADIAN SYLLABICS NA' },
+ [0x14C8] = { unicodeslot=0x14C8, category='lo', description='CANADIAN SYLLABICS NAA' },
+ [0x14C9] = { unicodeslot=0x14C9, category='lo', description='CANADIAN SYLLABICS NWE' },
+ [0x14CA] = { unicodeslot=0x14CA, category='lo', description='CANADIAN SYLLABICS WEST-CREE NWE' },
+ [0x14CB] = { unicodeslot=0x14CB, category='lo', description='CANADIAN SYLLABICS NWA' },
+ [0x14CC] = { unicodeslot=0x14CC, category='lo', description='CANADIAN SYLLABICS WEST-CREE NWA' },
+ [0x14CD] = { unicodeslot=0x14CD, category='lo', description='CANADIAN SYLLABICS NWAA' },
+ [0x14CE] = { unicodeslot=0x14CE, category='lo', description='CANADIAN SYLLABICS WEST-CREE NWAA' },
+ [0x14CF] = { unicodeslot=0x14CF, category='lo', description='CANADIAN SYLLABICS NASKAPI NWAA' },
+ [0x14D0] = { unicodeslot=0x14D0, category='lo', description='CANADIAN SYLLABICS N' },
+ [0x14D1] = { unicodeslot=0x14D1, category='lo', description='CANADIAN SYLLABICS CARRIER NG' },
+ [0x14D2] = { unicodeslot=0x14D2, category='lo', description='CANADIAN SYLLABICS NH' },
+ [0x14D3] = { unicodeslot=0x14D3, category='lo', description='CANADIAN SYLLABICS LE' },
+ [0x14D4] = { unicodeslot=0x14D4, category='lo', description='CANADIAN SYLLABICS LAAI' },
+ [0x14D5] = { unicodeslot=0x14D5, category='lo', description='CANADIAN SYLLABICS LI' },
+ [0x14D6] = { unicodeslot=0x14D6, category='lo', description='CANADIAN SYLLABICS LII' },
+ [0x14D7] = { unicodeslot=0x14D7, category='lo', description='CANADIAN SYLLABICS LO' },
+ [0x14D8] = { unicodeslot=0x14D8, category='lo', description='CANADIAN SYLLABICS LOO' },
+ [0x14D9] = { unicodeslot=0x14D9, category='lo', description='CANADIAN SYLLABICS Y-CREE LOO' },
+ [0x14DA] = { unicodeslot=0x14DA, category='lo', description='CANADIAN SYLLABICS LA' },
+ [0x14DB] = { unicodeslot=0x14DB, category='lo', description='CANADIAN SYLLABICS LAA' },
+ [0x14DC] = { unicodeslot=0x14DC, category='lo', description='CANADIAN SYLLABICS LWE' },
+ [0x14DD] = { unicodeslot=0x14DD, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWE' },
+ [0x14DE] = { unicodeslot=0x14DE, category='lo', description='CANADIAN SYLLABICS LWI' },
+ [0x14DF] = { unicodeslot=0x14DF, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWI' },
+ [0x14E0] = { unicodeslot=0x14E0, category='lo', description='CANADIAN SYLLABICS LWII' },
+ [0x14E1] = { unicodeslot=0x14E1, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWII' },
+ [0x14E2] = { unicodeslot=0x14E2, category='lo', description='CANADIAN SYLLABICS LWO' },
+ [0x14E3] = { unicodeslot=0x14E3, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWO' },
+ [0x14E4] = { unicodeslot=0x14E4, category='lo', description='CANADIAN SYLLABICS LWOO' },
+ [0x14E5] = { unicodeslot=0x14E5, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWOO' },
+ [0x14E6] = { unicodeslot=0x14E6, category='lo', description='CANADIAN SYLLABICS LWA' },
+ [0x14E7] = { unicodeslot=0x14E7, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWA' },
+ [0x14E8] = { unicodeslot=0x14E8, category='lo', description='CANADIAN SYLLABICS LWAA' },
+ [0x14E9] = { unicodeslot=0x14E9, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWAA' },
+ [0x14EA] = { unicodeslot=0x14EA, category='lo', description='CANADIAN SYLLABICS L' },
+ [0x14EB] = { unicodeslot=0x14EB, category='lo', description='CANADIAN SYLLABICS WEST-CREE L' },
+ [0x14EC] = { unicodeslot=0x14EC, category='lo', description='CANADIAN SYLLABICS MEDIAL L' },
+ [0x14ED] = { unicodeslot=0x14ED, category='lo', description='CANADIAN SYLLABICS SE' },
+ [0x14EE] = { unicodeslot=0x14EE, category='lo', description='CANADIAN SYLLABICS SAAI' },
+ [0x14EF] = { unicodeslot=0x14EF, category='lo', description='CANADIAN SYLLABICS SI' },
+ [0x14F0] = { unicodeslot=0x14F0, category='lo', description='CANADIAN SYLLABICS SII' },
+ [0x14F1] = { unicodeslot=0x14F1, category='lo', description='CANADIAN SYLLABICS SO' },
+ [0x14F2] = { unicodeslot=0x14F2, category='lo', description='CANADIAN SYLLABICS SOO' },
+ [0x14F3] = { unicodeslot=0x14F3, category='lo', description='CANADIAN SYLLABICS Y-CREE SOO' },
+ [0x14F4] = { unicodeslot=0x14F4, category='lo', description='CANADIAN SYLLABICS SA' },
+ [0x14F5] = { unicodeslot=0x14F5, category='lo', description='CANADIAN SYLLABICS SAA' },
+ [0x14F6] = { unicodeslot=0x14F6, category='lo', description='CANADIAN SYLLABICS SWE' },
+ [0x14F7] = { unicodeslot=0x14F7, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWE' },
+ [0x14F8] = { unicodeslot=0x14F8, category='lo', description='CANADIAN SYLLABICS SWI' },
+ [0x14F9] = { unicodeslot=0x14F9, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWI' },
+ [0x14FA] = { unicodeslot=0x14FA, category='lo', description='CANADIAN SYLLABICS SWII' },
+ [0x14FB] = { unicodeslot=0x14FB, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWII' },
+ [0x14FC] = { unicodeslot=0x14FC, category='lo', description='CANADIAN SYLLABICS SWO' },
+ [0x14FD] = { unicodeslot=0x14FD, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWO' },
+ [0x14FE] = { unicodeslot=0x14FE, category='lo', description='CANADIAN SYLLABICS SWOO' },
+ [0x14FF] = { unicodeslot=0x14FF, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWOO' },
+ [0x1500] = { unicodeslot=0x1500, category='lo', description='CANADIAN SYLLABICS SWA' },
+ [0x1501] = { unicodeslot=0x1501, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWA' },
+ [0x1502] = { unicodeslot=0x1502, category='lo', description='CANADIAN SYLLABICS SWAA' },
+ [0x1503] = { unicodeslot=0x1503, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWAA' },
+ [0x1504] = { unicodeslot=0x1504, category='lo', description='CANADIAN SYLLABICS NASKAPI SWAA' },
+ [0x1505] = { unicodeslot=0x1505, category='lo', description='CANADIAN SYLLABICS S' },
+ [0x1506] = { unicodeslot=0x1506, category='lo', description='CANADIAN SYLLABICS ATHAPASCAN S' },
+ [0x1507] = { unicodeslot=0x1507, category='lo', description='CANADIAN SYLLABICS SW' },
+ [0x1508] = { unicodeslot=0x1508, category='lo', description='CANADIAN SYLLABICS BLACKFOOT S' },
+ [0x1509] = { unicodeslot=0x1509, category='lo', description='CANADIAN SYLLABICS MOOSE-CREE SK' },
+ [0x150A] = { unicodeslot=0x150A, category='lo', description='CANADIAN SYLLABICS NASKAPI SKW' },
+ [0x150B] = { unicodeslot=0x150B, category='lo', description='CANADIAN SYLLABICS NASKAPI S-W' },
+ [0x150C] = { unicodeslot=0x150C, category='lo', description='CANADIAN SYLLABICS NASKAPI SPWA' },
+ [0x150D] = { unicodeslot=0x150D, category='lo', description='CANADIAN SYLLABICS NASKAPI STWA' },
+ [0x150E] = { unicodeslot=0x150E, category='lo', description='CANADIAN SYLLABICS NASKAPI SKWA' },
+ [0x150F] = { unicodeslot=0x150F, category='lo', description='CANADIAN SYLLABICS NASKAPI SCWA' },
+ [0x1510] = { unicodeslot=0x1510, category='lo', description='CANADIAN SYLLABICS SHE' },
+ [0x1511] = { unicodeslot=0x1511, category='lo', description='CANADIAN SYLLABICS SHI' },
+ [0x1512] = { unicodeslot=0x1512, category='lo', description='CANADIAN SYLLABICS SHII' },
+ [0x1513] = { unicodeslot=0x1513, category='lo', description='CANADIAN SYLLABICS SHO' },
+ [0x1514] = { unicodeslot=0x1514, category='lo', description='CANADIAN SYLLABICS SHOO' },
+ [0x1515] = { unicodeslot=0x1515, category='lo', description='CANADIAN SYLLABICS SHA' },
+ [0x1516] = { unicodeslot=0x1516, category='lo', description='CANADIAN SYLLABICS SHAA' },
+ [0x1517] = { unicodeslot=0x1517, category='lo', description='CANADIAN SYLLABICS SHWE' },
+ [0x1518] = { unicodeslot=0x1518, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWE' },
+ [0x1519] = { unicodeslot=0x1519, category='lo', description='CANADIAN SYLLABICS SHWI' },
+ [0x151A] = { unicodeslot=0x151A, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWI' },
+ [0x151B] = { unicodeslot=0x151B, category='lo', description='CANADIAN SYLLABICS SHWII' },
+ [0x151C] = { unicodeslot=0x151C, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWII' },
+ [0x151D] = { unicodeslot=0x151D, category='lo', description='CANADIAN SYLLABICS SHWO' },
+ [0x151E] = { unicodeslot=0x151E, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWO' },
+ [0x151F] = { unicodeslot=0x151F, category='lo', description='CANADIAN SYLLABICS SHWOO' },
+ [0x1520] = { unicodeslot=0x1520, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWOO' },
+ [0x1521] = { unicodeslot=0x1521, category='lo', description='CANADIAN SYLLABICS SHWA' },
+ [0x1522] = { unicodeslot=0x1522, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWA' },
+ [0x1523] = { unicodeslot=0x1523, category='lo', description='CANADIAN SYLLABICS SHWAA' },
+ [0x1524] = { unicodeslot=0x1524, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWAA' },
+ [0x1525] = { unicodeslot=0x1525, category='lo', description='CANADIAN SYLLABICS SH' },
+ [0x1526] = { unicodeslot=0x1526, category='lo', description='CANADIAN SYLLABICS YE' },
+ [0x1527] = { unicodeslot=0x1527, category='lo', description='CANADIAN SYLLABICS YAAI' },
+ [0x1528] = { unicodeslot=0x1528, category='lo', description='CANADIAN SYLLABICS YI' },
+ [0x1529] = { unicodeslot=0x1529, category='lo', description='CANADIAN SYLLABICS YII' },
+ [0x152A] = { unicodeslot=0x152A, category='lo', description='CANADIAN SYLLABICS YO' },
+ [0x152B] = { unicodeslot=0x152B, category='lo', description='CANADIAN SYLLABICS YOO' },
+ [0x152C] = { unicodeslot=0x152C, category='lo', description='CANADIAN SYLLABICS Y-CREE YOO' },
+ [0x152D] = { unicodeslot=0x152D, category='lo', description='CANADIAN SYLLABICS YA' },
+ [0x152E] = { unicodeslot=0x152E, category='lo', description='CANADIAN SYLLABICS YAA' },
+ [0x152F] = { unicodeslot=0x152F, category='lo', description='CANADIAN SYLLABICS YWE' },
+ [0x1530] = { unicodeslot=0x1530, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWE' },
+ [0x1531] = { unicodeslot=0x1531, category='lo', description='CANADIAN SYLLABICS YWI' },
+ [0x1532] = { unicodeslot=0x1532, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWI' },
+ [0x1533] = { unicodeslot=0x1533, category='lo', description='CANADIAN SYLLABICS YWII' },
+ [0x1534] = { unicodeslot=0x1534, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWII' },
+ [0x1535] = { unicodeslot=0x1535, category='lo', description='CANADIAN SYLLABICS YWO' },
+ [0x1536] = { unicodeslot=0x1536, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWO' },
+ [0x1537] = { unicodeslot=0x1537, category='lo', description='CANADIAN SYLLABICS YWOO' },
+ [0x1538] = { unicodeslot=0x1538, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWOO' },
+ [0x1539] = { unicodeslot=0x1539, category='lo', description='CANADIAN SYLLABICS YWA' },
+ [0x153A] = { unicodeslot=0x153A, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWA' },
+ [0x153B] = { unicodeslot=0x153B, category='lo', description='CANADIAN SYLLABICS YWAA' },
+ [0x153C] = { unicodeslot=0x153C, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWAA' },
+ [0x153D] = { unicodeslot=0x153D, category='lo', description='CANADIAN SYLLABICS NASKAPI YWAA' },
+ [0x153E] = { unicodeslot=0x153E, category='lo', description='CANADIAN SYLLABICS Y' },
+ [0x153F] = { unicodeslot=0x153F, category='lo', description='CANADIAN SYLLABICS BIBLE-CREE Y' },
+ [0x1540] = { unicodeslot=0x1540, category='lo', description='CANADIAN SYLLABICS WEST-CREE Y' },
+ [0x1541] = { unicodeslot=0x1541, category='lo', description='CANADIAN SYLLABICS SAYISI YI' },
+ [0x1542] = { unicodeslot=0x1542, category='lo', description='CANADIAN SYLLABICS RE' },
+ [0x1543] = { unicodeslot=0x1543, category='lo', description='CANADIAN SYLLABICS R-CREE RE' },
+ [0x1544] = { unicodeslot=0x1544, category='lo', description='CANADIAN SYLLABICS WEST-CREE LE' },
+ [0x1545] = { unicodeslot=0x1545, category='lo', description='CANADIAN SYLLABICS RAAI' },
+ [0x1546] = { unicodeslot=0x1546, category='lo', description='CANADIAN SYLLABICS RI' },
+ [0x1547] = { unicodeslot=0x1547, category='lo', description='CANADIAN SYLLABICS RII' },
+ [0x1548] = { unicodeslot=0x1548, category='lo', description='CANADIAN SYLLABICS RO' },
+ [0x1549] = { unicodeslot=0x1549, category='lo', description='CANADIAN SYLLABICS ROO' },
+ [0x154A] = { unicodeslot=0x154A, category='lo', description='CANADIAN SYLLABICS WEST-CREE LO' },
+ [0x154B] = { unicodeslot=0x154B, category='lo', description='CANADIAN SYLLABICS RA' },
+ [0x154C] = { unicodeslot=0x154C, category='lo', description='CANADIAN SYLLABICS RAA' },
+ [0x154D] = { unicodeslot=0x154D, category='lo', description='CANADIAN SYLLABICS WEST-CREE LA' },
+ [0x154E] = { unicodeslot=0x154E, category='lo', description='CANADIAN SYLLABICS RWAA' },
+ [0x154F] = { unicodeslot=0x154F, category='lo', description='CANADIAN SYLLABICS WEST-CREE RWAA' },
+ [0x1550] = { unicodeslot=0x1550, category='lo', description='CANADIAN SYLLABICS R' },
+ [0x1551] = { unicodeslot=0x1551, category='lo', description='CANADIAN SYLLABICS WEST-CREE R' },
+ [0x1552] = { unicodeslot=0x1552, category='lo', description='CANADIAN SYLLABICS MEDIAL R' },
+ [0x1553] = { unicodeslot=0x1553, category='lo', description='CANADIAN SYLLABICS FE' },
+ [0x1554] = { unicodeslot=0x1554, category='lo', description='CANADIAN SYLLABICS FAAI' },
+ [0x1555] = { unicodeslot=0x1555, category='lo', description='CANADIAN SYLLABICS FI' },
+ [0x1556] = { unicodeslot=0x1556, category='lo', description='CANADIAN SYLLABICS FII' },
+ [0x1557] = { unicodeslot=0x1557, category='lo', description='CANADIAN SYLLABICS FO' },
+ [0x1558] = { unicodeslot=0x1558, category='lo', description='CANADIAN SYLLABICS FOO' },
+ [0x1559] = { unicodeslot=0x1559, category='lo', description='CANADIAN SYLLABICS FA' },
+ [0x155A] = { unicodeslot=0x155A, category='lo', description='CANADIAN SYLLABICS FAA' },
+ [0x155B] = { unicodeslot=0x155B, category='lo', description='CANADIAN SYLLABICS FWAA' },
+ [0x155C] = { unicodeslot=0x155C, category='lo', description='CANADIAN SYLLABICS WEST-CREE FWAA' },
+ [0x155D] = { unicodeslot=0x155D, category='lo', description='CANADIAN SYLLABICS F' },
+ [0x155E] = { unicodeslot=0x155E, category='lo', description='CANADIAN SYLLABICS THE' },
+ [0x155F] = { unicodeslot=0x155F, category='lo', description='CANADIAN SYLLABICS N-CREE THE' },
+ [0x1560] = { unicodeslot=0x1560, category='lo', description='CANADIAN SYLLABICS THI' },
+ [0x1561] = { unicodeslot=0x1561, category='lo', description='CANADIAN SYLLABICS N-CREE THI' },
+ [0x1562] = { unicodeslot=0x1562, category='lo', description='CANADIAN SYLLABICS THII' },
+ [0x1563] = { unicodeslot=0x1563, category='lo', description='CANADIAN SYLLABICS N-CREE THII' },
+ [0x1564] = { unicodeslot=0x1564, category='lo', description='CANADIAN SYLLABICS THO' },
+ [0x1565] = { unicodeslot=0x1565, category='lo', description='CANADIAN SYLLABICS THOO' },
+ [0x1566] = { unicodeslot=0x1566, category='lo', description='CANADIAN SYLLABICS THA' },
+ [0x1567] = { unicodeslot=0x1567, category='lo', description='CANADIAN SYLLABICS THAA' },
+ [0x1568] = { unicodeslot=0x1568, category='lo', description='CANADIAN SYLLABICS THWAA' },
+ [0x1569] = { unicodeslot=0x1569, category='lo', description='CANADIAN SYLLABICS WEST-CREE THWAA' },
+ [0x156A] = { unicodeslot=0x156A, category='lo', description='CANADIAN SYLLABICS TH' },
+ [0x156B] = { unicodeslot=0x156B, category='lo', description='CANADIAN SYLLABICS TTHE' },
+ [0x156C] = { unicodeslot=0x156C, category='lo', description='CANADIAN SYLLABICS TTHI' },
+ [0x156D] = { unicodeslot=0x156D, category='lo', description='CANADIAN SYLLABICS TTHO' },
+ [0x156E] = { unicodeslot=0x156E, category='lo', description='CANADIAN SYLLABICS TTHA' },
+ [0x156F] = { unicodeslot=0x156F, category='lo', description='CANADIAN SYLLABICS TTH' },
+ [0x1570] = { unicodeslot=0x1570, category='lo', description='CANADIAN SYLLABICS TYE' },
+ [0x1571] = { unicodeslot=0x1571, category='lo', description='CANADIAN SYLLABICS TYI' },
+ [0x1572] = { unicodeslot=0x1572, category='lo', description='CANADIAN SYLLABICS TYO' },
+ [0x1573] = { unicodeslot=0x1573, category='lo', description='CANADIAN SYLLABICS TYA' },
+ [0x1574] = { unicodeslot=0x1574, category='lo', description='CANADIAN SYLLABICS NUNAVIK HE' },
+ [0x1575] = { unicodeslot=0x1575, category='lo', description='CANADIAN SYLLABICS NUNAVIK HI' },
+ [0x1576] = { unicodeslot=0x1576, category='lo', description='CANADIAN SYLLABICS NUNAVIK HII' },
+ [0x1577] = { unicodeslot=0x1577, category='lo', description='CANADIAN SYLLABICS NUNAVIK HO' },
+ [0x1578] = { unicodeslot=0x1578, category='lo', description='CANADIAN SYLLABICS NUNAVIK HOO' },
+ [0x1579] = { unicodeslot=0x1579, category='lo', description='CANADIAN SYLLABICS NUNAVIK HA' },
+ [0x157A] = { unicodeslot=0x157A, category='lo', description='CANADIAN SYLLABICS NUNAVIK HAA' },
+ [0x157B] = { unicodeslot=0x157B, category='lo', description='CANADIAN SYLLABICS NUNAVIK H' },
+ [0x157C] = { unicodeslot=0x157C, category='lo', description='CANADIAN SYLLABICS NUNAVUT H' },
+ [0x157D] = { unicodeslot=0x157D, category='lo', description='CANADIAN SYLLABICS HK' },
+ [0x157E] = { unicodeslot=0x157E, category='lo', description='CANADIAN SYLLABICS QAAI' },
+ [0x157F] = { unicodeslot=0x157F, category='lo', description='CANADIAN SYLLABICS QI' },
+ [0x1580] = { unicodeslot=0x1580, category='lo', description='CANADIAN SYLLABICS QII' },
+ [0x1581] = { unicodeslot=0x1581, category='lo', description='CANADIAN SYLLABICS QO' },
+ [0x1582] = { unicodeslot=0x1582, category='lo', description='CANADIAN SYLLABICS QOO' },
+ [0x1583] = { unicodeslot=0x1583, category='lo', description='CANADIAN SYLLABICS QA' },
+ [0x1584] = { unicodeslot=0x1584, category='lo', description='CANADIAN SYLLABICS QAA' },
+ [0x1585] = { unicodeslot=0x1585, category='lo', description='CANADIAN SYLLABICS Q' },
+ [0x1586] = { unicodeslot=0x1586, category='lo', description='CANADIAN SYLLABICS TLHE' },
+ [0x1587] = { unicodeslot=0x1587, category='lo', description='CANADIAN SYLLABICS TLHI' },
+ [0x1588] = { unicodeslot=0x1588, category='lo', description='CANADIAN SYLLABICS TLHO' },
+ [0x1589] = { unicodeslot=0x1589, category='lo', description='CANADIAN SYLLABICS TLHA' },
+ [0x158A] = { unicodeslot=0x158A, category='lo', description='CANADIAN SYLLABICS WEST-CREE RE' },
+ [0x158B] = { unicodeslot=0x158B, category='lo', description='CANADIAN SYLLABICS WEST-CREE RI' },
+ [0x158C] = { unicodeslot=0x158C, category='lo', description='CANADIAN SYLLABICS WEST-CREE RO' },
+ [0x158D] = { unicodeslot=0x158D, category='lo', description='CANADIAN SYLLABICS WEST-CREE RA' },
+ [0x158E] = { unicodeslot=0x158E, category='lo', description='CANADIAN SYLLABICS NGAAI' },
+ [0x158F] = { unicodeslot=0x158F, category='lo', description='CANADIAN SYLLABICS NGI' },
+ [0x1590] = { unicodeslot=0x1590, category='lo', description='CANADIAN SYLLABICS NGII' },
+ [0x1591] = { unicodeslot=0x1591, category='lo', description='CANADIAN SYLLABICS NGO' },
+ [0x1592] = { unicodeslot=0x1592, category='lo', description='CANADIAN SYLLABICS NGOO' },
+ [0x1593] = { unicodeslot=0x1593, category='lo', description='CANADIAN SYLLABICS NGA' },
+ [0x1594] = { unicodeslot=0x1594, category='lo', description='CANADIAN SYLLABICS NGAA' },
+ [0x1595] = { unicodeslot=0x1595, category='lo', description='CANADIAN SYLLABICS NG' },
+ [0x1596] = { unicodeslot=0x1596, category='lo', description='CANADIAN SYLLABICS NNG' },
+ [0x1597] = { unicodeslot=0x1597, category='lo', description='CANADIAN SYLLABICS SAYISI SHE' },
+ [0x1598] = { unicodeslot=0x1598, category='lo', description='CANADIAN SYLLABICS SAYISI SHI' },
+ [0x1599] = { unicodeslot=0x1599, category='lo', description='CANADIAN SYLLABICS SAYISI SHO' },
+ [0x159A] = { unicodeslot=0x159A, category='lo', description='CANADIAN SYLLABICS SAYISI SHA' },
+ [0x159B] = { unicodeslot=0x159B, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THE' },
+ [0x159C] = { unicodeslot=0x159C, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THI' },
+ [0x159D] = { unicodeslot=0x159D, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THO' },
+ [0x159E] = { unicodeslot=0x159E, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THA' },
+ [0x159F] = { unicodeslot=0x159F, category='lo', description='CANADIAN SYLLABICS WOODS-CREE TH' },
+ [0x15A0] = { unicodeslot=0x15A0, category='lo', description='CANADIAN SYLLABICS LHI' },
+ [0x15A1] = { unicodeslot=0x15A1, category='lo', description='CANADIAN SYLLABICS LHII' },
+ [0x15A2] = { unicodeslot=0x15A2, category='lo', description='CANADIAN SYLLABICS LHO' },
+ [0x15A3] = { unicodeslot=0x15A3, category='lo', description='CANADIAN SYLLABICS LHOO' },
+ [0x15A4] = { unicodeslot=0x15A4, category='lo', description='CANADIAN SYLLABICS LHA' },
+ [0x15A5] = { unicodeslot=0x15A5, category='lo', description='CANADIAN SYLLABICS LHAA' },
+ [0x15A6] = { unicodeslot=0x15A6, category='lo', description='CANADIAN SYLLABICS LH' },
+ [0x15A7] = { unicodeslot=0x15A7, category='lo', description='CANADIAN SYLLABICS TH-CREE THE' },
+ [0x15A8] = { unicodeslot=0x15A8, category='lo', description='CANADIAN SYLLABICS TH-CREE THI' },
+ [0x15A9] = { unicodeslot=0x15A9, category='lo', description='CANADIAN SYLLABICS TH-CREE THII' },
+ [0x15AA] = { unicodeslot=0x15AA, category='lo', description='CANADIAN SYLLABICS TH-CREE THO' },
+ [0x15AB] = { unicodeslot=0x15AB, category='lo', description='CANADIAN SYLLABICS TH-CREE THOO' },
+ [0x15AC] = { unicodeslot=0x15AC, category='lo', description='CANADIAN SYLLABICS TH-CREE THA' },
+ [0x15AD] = { unicodeslot=0x15AD, category='lo', description='CANADIAN SYLLABICS TH-CREE THAA' },
+ [0x15AE] = { unicodeslot=0x15AE, category='lo', description='CANADIAN SYLLABICS TH-CREE TH' },
+ [0x15AF] = { unicodeslot=0x15AF, category='lo', description='CANADIAN SYLLABICS AIVILIK B' },
+ [0x15B0] = { unicodeslot=0x15B0, category='lo', description='CANADIAN SYLLABICS BLACKFOOT E' },
+ [0x15B1] = { unicodeslot=0x15B1, category='lo', description='CANADIAN SYLLABICS BLACKFOOT I' },
+ [0x15B2] = { unicodeslot=0x15B2, category='lo', description='CANADIAN SYLLABICS BLACKFOOT O' },
+ [0x15B3] = { unicodeslot=0x15B3, category='lo', description='CANADIAN SYLLABICS BLACKFOOT A' },
+ [0x15B4] = { unicodeslot=0x15B4, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WE' },
+ [0x15B5] = { unicodeslot=0x15B5, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WI' },
+ [0x15B6] = { unicodeslot=0x15B6, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WO' },
+ [0x15B7] = { unicodeslot=0x15B7, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WA' },
+ [0x15B8] = { unicodeslot=0x15B8, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NE' },
+ [0x15B9] = { unicodeslot=0x15B9, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NI' },
+ [0x15BA] = { unicodeslot=0x15BA, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NO' },
+ [0x15BB] = { unicodeslot=0x15BB, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NA' },
+ [0x15BC] = { unicodeslot=0x15BC, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KE' },
+ [0x15BD] = { unicodeslot=0x15BD, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KI' },
+ [0x15BE] = { unicodeslot=0x15BE, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KO' },
+ [0x15BF] = { unicodeslot=0x15BF, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KA' },
+ [0x15C0] = { unicodeslot=0x15C0, category='lo', description='CANADIAN SYLLABICS SAYISI HE' },
+ [0x15C1] = { unicodeslot=0x15C1, category='lo', description='CANADIAN SYLLABICS SAYISI HI' },
+ [0x15C2] = { unicodeslot=0x15C2, category='lo', description='CANADIAN SYLLABICS SAYISI HO' },
+ [0x15C3] = { unicodeslot=0x15C3, category='lo', description='CANADIAN SYLLABICS SAYISI HA' },
+ [0x15C4] = { unicodeslot=0x15C4, category='lo', description='CANADIAN SYLLABICS CARRIER GHU' },
+ [0x15C5] = { unicodeslot=0x15C5, category='lo', description='CANADIAN SYLLABICS CARRIER GHO' },
+ [0x15C6] = { unicodeslot=0x15C6, category='lo', description='CANADIAN SYLLABICS CARRIER GHE' },
+ [0x15C7] = { unicodeslot=0x15C7, category='lo', description='CANADIAN SYLLABICS CARRIER GHEE' },
+ [0x15C8] = { unicodeslot=0x15C8, category='lo', description='CANADIAN SYLLABICS CARRIER GHI' },
+ [0x15C9] = { unicodeslot=0x15C9, category='lo', description='CANADIAN SYLLABICS CARRIER GHA' },
+ [0x15CA] = { unicodeslot=0x15CA, category='lo', description='CANADIAN SYLLABICS CARRIER RU' },
+ [0x15CB] = { unicodeslot=0x15CB, category='lo', description='CANADIAN SYLLABICS CARRIER RO' },
+ [0x15CC] = { unicodeslot=0x15CC, category='lo', description='CANADIAN SYLLABICS CARRIER RE' },
+ [0x15CD] = { unicodeslot=0x15CD, category='lo', description='CANADIAN SYLLABICS CARRIER REE' },
+ [0x15CE] = { unicodeslot=0x15CE, category='lo', description='CANADIAN SYLLABICS CARRIER RI' },
+ [0x15CF] = { unicodeslot=0x15CF, category='lo', description='CANADIAN SYLLABICS CARRIER RA' },
+ [0x15D0] = { unicodeslot=0x15D0, category='lo', description='CANADIAN SYLLABICS CARRIER WU' },
+ [0x15D1] = { unicodeslot=0x15D1, category='lo', description='CANADIAN SYLLABICS CARRIER WO' },
+ [0x15D2] = { unicodeslot=0x15D2, category='lo', description='CANADIAN SYLLABICS CARRIER WE' },
+ [0x15D3] = { unicodeslot=0x15D3, category='lo', description='CANADIAN SYLLABICS CARRIER WEE' },
+ [0x15D4] = { unicodeslot=0x15D4, category='lo', description='CANADIAN SYLLABICS CARRIER WI' },
+ [0x15D5] = { unicodeslot=0x15D5, category='lo', description='CANADIAN SYLLABICS CARRIER WA' },
+ [0x15D6] = { unicodeslot=0x15D6, category='lo', description='CANADIAN SYLLABICS CARRIER HWU' },
+ [0x15D7] = { unicodeslot=0x15D7, category='lo', description='CANADIAN SYLLABICS CARRIER HWO' },
+ [0x15D8] = { unicodeslot=0x15D8, category='lo', description='CANADIAN SYLLABICS CARRIER HWE' },
+ [0x15D9] = { unicodeslot=0x15D9, category='lo', description='CANADIAN SYLLABICS CARRIER HWEE' },
+ [0x15DA] = { unicodeslot=0x15DA, category='lo', description='CANADIAN SYLLABICS CARRIER HWI' },
+ [0x15DB] = { unicodeslot=0x15DB, category='lo', description='CANADIAN SYLLABICS CARRIER HWA' },
+ [0x15DC] = { unicodeslot=0x15DC, category='lo', description='CANADIAN SYLLABICS CARRIER THU' },
+ [0x15DD] = { unicodeslot=0x15DD, category='lo', description='CANADIAN SYLLABICS CARRIER THO' },
+ [0x15DE] = { unicodeslot=0x15DE, category='lo', description='CANADIAN SYLLABICS CARRIER THE' },
+ [0x15DF] = { unicodeslot=0x15DF, category='lo', description='CANADIAN SYLLABICS CARRIER THEE' },
+ [0x15E0] = { unicodeslot=0x15E0, category='lo', description='CANADIAN SYLLABICS CARRIER THI' },
+ [0x15E1] = { unicodeslot=0x15E1, category='lo', description='CANADIAN SYLLABICS CARRIER THA' },
+ [0x15E2] = { unicodeslot=0x15E2, category='lo', description='CANADIAN SYLLABICS CARRIER TTU' },
+ [0x15E3] = { unicodeslot=0x15E3, category='lo', description='CANADIAN SYLLABICS CARRIER TTO' },
+ [0x15E4] = { unicodeslot=0x15E4, category='lo', description='CANADIAN SYLLABICS CARRIER TTE' },
+ [0x15E5] = { unicodeslot=0x15E5, category='lo', description='CANADIAN SYLLABICS CARRIER TTEE' },
+ [0x15E6] = { unicodeslot=0x15E6, category='lo', description='CANADIAN SYLLABICS CARRIER TTI' },
+ [0x15E7] = { unicodeslot=0x15E7, category='lo', description='CANADIAN SYLLABICS CARRIER TTA' },
+ [0x15E8] = { unicodeslot=0x15E8, category='lo', description='CANADIAN SYLLABICS CARRIER PU' },
+ [0x15E9] = { unicodeslot=0x15E9, category='lo', description='CANADIAN SYLLABICS CARRIER PO' },
+ [0x15EA] = { unicodeslot=0x15EA, category='lo', description='CANADIAN SYLLABICS CARRIER PE' },
+ [0x15EB] = { unicodeslot=0x15EB, category='lo', description='CANADIAN SYLLABICS CARRIER PEE' },
+ [0x15EC] = { unicodeslot=0x15EC, category='lo', description='CANADIAN SYLLABICS CARRIER PI' },
+ [0x15ED] = { unicodeslot=0x15ED, category='lo', description='CANADIAN SYLLABICS CARRIER PA' },
+ [0x15EE] = { unicodeslot=0x15EE, category='lo', description='CANADIAN SYLLABICS CARRIER P' },
+ [0x15EF] = { unicodeslot=0x15EF, category='lo', description='CANADIAN SYLLABICS CARRIER GU' },
+ [0x15F0] = { unicodeslot=0x15F0, category='lo', description='CANADIAN SYLLABICS CARRIER GO' },
+ [0x15F1] = { unicodeslot=0x15F1, category='lo', description='CANADIAN SYLLABICS CARRIER GE' },
+ [0x15F2] = { unicodeslot=0x15F2, category='lo', description='CANADIAN SYLLABICS CARRIER GEE' },
+ [0x15F3] = { unicodeslot=0x15F3, category='lo', description='CANADIAN SYLLABICS CARRIER GI' },
+ [0x15F4] = { unicodeslot=0x15F4, category='lo', description='CANADIAN SYLLABICS CARRIER GA' },
+ [0x15F5] = { unicodeslot=0x15F5, category='lo', description='CANADIAN SYLLABICS CARRIER KHU' },
+ [0x15F6] = { unicodeslot=0x15F6, category='lo', description='CANADIAN SYLLABICS CARRIER KHO' },
+ [0x15F7] = { unicodeslot=0x15F7, category='lo', description='CANADIAN SYLLABICS CARRIER KHE' },
+ [0x15F8] = { unicodeslot=0x15F8, category='lo', description='CANADIAN SYLLABICS CARRIER KHEE' },
+ [0x15F9] = { unicodeslot=0x15F9, category='lo', description='CANADIAN SYLLABICS CARRIER KHI' },
+ [0x15FA] = { unicodeslot=0x15FA, category='lo', description='CANADIAN SYLLABICS CARRIER KHA' },
+ [0x15FB] = { unicodeslot=0x15FB, category='lo', description='CANADIAN SYLLABICS CARRIER KKU' },
+ [0x15FC] = { unicodeslot=0x15FC, category='lo', description='CANADIAN SYLLABICS CARRIER KKO' },
+ [0x15FD] = { unicodeslot=0x15FD, category='lo', description='CANADIAN SYLLABICS CARRIER KKE' },
+ [0x15FE] = { unicodeslot=0x15FE, category='lo', description='CANADIAN SYLLABICS CARRIER KKEE' },
+ [0x15FF] = { unicodeslot=0x15FF, category='lo', description='CANADIAN SYLLABICS CARRIER KKI' },
+ [0x1600] = { unicodeslot=0x1600, category='lo', description='CANADIAN SYLLABICS CARRIER KKA' },
+ [0x1601] = { unicodeslot=0x1601, category='lo', description='CANADIAN SYLLABICS CARRIER KK' },
+ [0x1602] = { unicodeslot=0x1602, category='lo', description='CANADIAN SYLLABICS CARRIER NU' },
+ [0x1603] = { unicodeslot=0x1603, category='lo', description='CANADIAN SYLLABICS CARRIER NO' },
+ [0x1604] = { unicodeslot=0x1604, category='lo', description='CANADIAN SYLLABICS CARRIER NE' },
+ [0x1605] = { unicodeslot=0x1605, category='lo', description='CANADIAN SYLLABICS CARRIER NEE' },
+ [0x1606] = { unicodeslot=0x1606, category='lo', description='CANADIAN SYLLABICS CARRIER NI' },
+ [0x1607] = { unicodeslot=0x1607, category='lo', description='CANADIAN SYLLABICS CARRIER NA' },
+ [0x1608] = { unicodeslot=0x1608, category='lo', description='CANADIAN SYLLABICS CARRIER MU' },
+ [0x1609] = { unicodeslot=0x1609, category='lo', description='CANADIAN SYLLABICS CARRIER MO' },
+ [0x160A] = { unicodeslot=0x160A, category='lo', description='CANADIAN SYLLABICS CARRIER ME' },
+ [0x160B] = { unicodeslot=0x160B, category='lo', description='CANADIAN SYLLABICS CARRIER MEE' },
+ [0x160C] = { unicodeslot=0x160C, category='lo', description='CANADIAN SYLLABICS CARRIER MI' },
+ [0x160D] = { unicodeslot=0x160D, category='lo', description='CANADIAN SYLLABICS CARRIER MA' },
+ [0x160E] = { unicodeslot=0x160E, category='lo', description='CANADIAN SYLLABICS CARRIER YU' },
+ [0x160F] = { unicodeslot=0x160F, category='lo', description='CANADIAN SYLLABICS CARRIER YO' },
+ [0x1610] = { unicodeslot=0x1610, category='lo', description='CANADIAN SYLLABICS CARRIER YE' },
+ [0x1611] = { unicodeslot=0x1611, category='lo', description='CANADIAN SYLLABICS CARRIER YEE' },
+ [0x1612] = { unicodeslot=0x1612, category='lo', description='CANADIAN SYLLABICS CARRIER YI' },
+ [0x1613] = { unicodeslot=0x1613, category='lo', description='CANADIAN SYLLABICS CARRIER YA' },
+ [0x1614] = { unicodeslot=0x1614, category='lo', description='CANADIAN SYLLABICS CARRIER JU' },
+ [0x1615] = { unicodeslot=0x1615, category='lo', description='CANADIAN SYLLABICS SAYISI JU' },
+ [0x1616] = { unicodeslot=0x1616, category='lo', description='CANADIAN SYLLABICS CARRIER JO' },
+ [0x1617] = { unicodeslot=0x1617, category='lo', description='CANADIAN SYLLABICS CARRIER JE' },
+ [0x1618] = { unicodeslot=0x1618, category='lo', description='CANADIAN SYLLABICS CARRIER JEE' },
+ [0x1619] = { unicodeslot=0x1619, category='lo', description='CANADIAN SYLLABICS CARRIER JI' },
+ [0x161A] = { unicodeslot=0x161A, category='lo', description='CANADIAN SYLLABICS SAYISI JI' },
+ [0x161B] = { unicodeslot=0x161B, category='lo', description='CANADIAN SYLLABICS CARRIER JA' },
+ [0x161C] = { unicodeslot=0x161C, category='lo', description='CANADIAN SYLLABICS CARRIER JJU' },
+ [0x161D] = { unicodeslot=0x161D, category='lo', description='CANADIAN SYLLABICS CARRIER JJO' },
+ [0x161E] = { unicodeslot=0x161E, category='lo', description='CANADIAN SYLLABICS CARRIER JJE' },
+ [0x161F] = { unicodeslot=0x161F, category='lo', description='CANADIAN SYLLABICS CARRIER JJEE' },
+ [0x1620] = { unicodeslot=0x1620, category='lo', description='CANADIAN SYLLABICS CARRIER JJI' },
+ [0x1621] = { unicodeslot=0x1621, category='lo', description='CANADIAN SYLLABICS CARRIER JJA' },
+ [0x1622] = { unicodeslot=0x1622, category='lo', description='CANADIAN SYLLABICS CARRIER LU' },
+ [0x1623] = { unicodeslot=0x1623, category='lo', description='CANADIAN SYLLABICS CARRIER LO' },
+ [0x1624] = { unicodeslot=0x1624, category='lo', description='CANADIAN SYLLABICS CARRIER LE' },
+ [0x1625] = { unicodeslot=0x1625, category='lo', description='CANADIAN SYLLABICS CARRIER LEE' },
+ [0x1626] = { unicodeslot=0x1626, category='lo', description='CANADIAN SYLLABICS CARRIER LI' },
+ [0x1627] = { unicodeslot=0x1627, category='lo', description='CANADIAN SYLLABICS CARRIER LA' },
+ [0x1628] = { unicodeslot=0x1628, category='lo', description='CANADIAN SYLLABICS CARRIER DLU' },
+ [0x1629] = { unicodeslot=0x1629, category='lo', description='CANADIAN SYLLABICS CARRIER DLO' },
+ [0x162A] = { unicodeslot=0x162A, category='lo', description='CANADIAN SYLLABICS CARRIER DLE' },
+ [0x162B] = { unicodeslot=0x162B, category='lo', description='CANADIAN SYLLABICS CARRIER DLEE' },
+ [0x162C] = { unicodeslot=0x162C, category='lo', description='CANADIAN SYLLABICS CARRIER DLI' },
+ [0x162D] = { unicodeslot=0x162D, category='lo', description='CANADIAN SYLLABICS CARRIER DLA' },
+ [0x162E] = { unicodeslot=0x162E, category='lo', description='CANADIAN SYLLABICS CARRIER LHU' },
+ [0x162F] = { unicodeslot=0x162F, category='lo', description='CANADIAN SYLLABICS CARRIER LHO' },
+ [0x1630] = { unicodeslot=0x1630, category='lo', description='CANADIAN SYLLABICS CARRIER LHE' },
+ [0x1631] = { unicodeslot=0x1631, category='lo', description='CANADIAN SYLLABICS CARRIER LHEE' },
+ [0x1632] = { unicodeslot=0x1632, category='lo', description='CANADIAN SYLLABICS CARRIER LHI' },
+ [0x1633] = { unicodeslot=0x1633, category='lo', description='CANADIAN SYLLABICS CARRIER LHA' },
+ [0x1634] = { unicodeslot=0x1634, category='lo', description='CANADIAN SYLLABICS CARRIER TLHU' },
+ [0x1635] = { unicodeslot=0x1635, category='lo', description='CANADIAN SYLLABICS CARRIER TLHO' },
+ [0x1636] = { unicodeslot=0x1636, category='lo', description='CANADIAN SYLLABICS CARRIER TLHE' },
+ [0x1637] = { unicodeslot=0x1637, category='lo', description='CANADIAN SYLLABICS CARRIER TLHEE' },
+ [0x1638] = { unicodeslot=0x1638, category='lo', description='CANADIAN SYLLABICS CARRIER TLHI' },
+ [0x1639] = { unicodeslot=0x1639, category='lo', description='CANADIAN SYLLABICS CARRIER TLHA' },
+ [0x163A] = { unicodeslot=0x163A, category='lo', description='CANADIAN SYLLABICS CARRIER TLU' },
+ [0x163B] = { unicodeslot=0x163B, category='lo', description='CANADIAN SYLLABICS CARRIER TLO' },
+ [0x163C] = { unicodeslot=0x163C, category='lo', description='CANADIAN SYLLABICS CARRIER TLE' },
+ [0x163D] = { unicodeslot=0x163D, category='lo', description='CANADIAN SYLLABICS CARRIER TLEE' },
+ [0x163E] = { unicodeslot=0x163E, category='lo', description='CANADIAN SYLLABICS CARRIER TLI' },
+ [0x163F] = { unicodeslot=0x163F, category='lo', description='CANADIAN SYLLABICS CARRIER TLA' },
+ [0x1640] = { unicodeslot=0x1640, category='lo', description='CANADIAN SYLLABICS CARRIER ZU' },
+ [0x1641] = { unicodeslot=0x1641, category='lo', description='CANADIAN SYLLABICS CARRIER ZO' },
+ [0x1642] = { unicodeslot=0x1642, category='lo', description='CANADIAN SYLLABICS CARRIER ZE' },
+ [0x1643] = { unicodeslot=0x1643, category='lo', description='CANADIAN SYLLABICS CARRIER ZEE' },
+ [0x1644] = { unicodeslot=0x1644, category='lo', description='CANADIAN SYLLABICS CARRIER ZI' },
+ [0x1645] = { unicodeslot=0x1645, category='lo', description='CANADIAN SYLLABICS CARRIER ZA' },
+ [0x1646] = { unicodeslot=0x1646, category='lo', description='CANADIAN SYLLABICS CARRIER Z' },
+ [0x1647] = { unicodeslot=0x1647, category='lo', description='CANADIAN SYLLABICS CARRIER INITIAL Z' },
+ [0x1648] = { unicodeslot=0x1648, category='lo', description='CANADIAN SYLLABICS CARRIER DZU' },
+ [0x1649] = { unicodeslot=0x1649, category='lo', description='CANADIAN SYLLABICS CARRIER DZO' },
+ [0x164A] = { unicodeslot=0x164A, category='lo', description='CANADIAN SYLLABICS CARRIER DZE' },
+ [0x164B] = { unicodeslot=0x164B, category='lo', description='CANADIAN SYLLABICS CARRIER DZEE' },
+ [0x164C] = { unicodeslot=0x164C, category='lo', description='CANADIAN SYLLABICS CARRIER DZI' },
+ [0x164D] = { unicodeslot=0x164D, category='lo', description='CANADIAN SYLLABICS CARRIER DZA' },
+ [0x164E] = { unicodeslot=0x164E, category='lo', description='CANADIAN SYLLABICS CARRIER SU' },
+ [0x164F] = { unicodeslot=0x164F, category='lo', description='CANADIAN SYLLABICS CARRIER SO' },
+ [0x1650] = { unicodeslot=0x1650, category='lo', description='CANADIAN SYLLABICS CARRIER SE' },
+ [0x1651] = { unicodeslot=0x1651, category='lo', description='CANADIAN SYLLABICS CARRIER SEE' },
+ [0x1652] = { unicodeslot=0x1652, category='lo', description='CANADIAN SYLLABICS CARRIER SI' },
+ [0x1653] = { unicodeslot=0x1653, category='lo', description='CANADIAN SYLLABICS CARRIER SA' },
+ [0x1654] = { unicodeslot=0x1654, category='lo', description='CANADIAN SYLLABICS CARRIER SHU' },
+ [0x1655] = { unicodeslot=0x1655, category='lo', description='CANADIAN SYLLABICS CARRIER SHO' },
+ [0x1656] = { unicodeslot=0x1656, category='lo', description='CANADIAN SYLLABICS CARRIER SHE' },
+ [0x1657] = { unicodeslot=0x1657, category='lo', description='CANADIAN SYLLABICS CARRIER SHEE' },
+ [0x1658] = { unicodeslot=0x1658, category='lo', description='CANADIAN SYLLABICS CARRIER SHI' },
+ [0x1659] = { unicodeslot=0x1659, category='lo', description='CANADIAN SYLLABICS CARRIER SHA' },
+ [0x165A] = { unicodeslot=0x165A, category='lo', description='CANADIAN SYLLABICS CARRIER SH' },
+ [0x165B] = { unicodeslot=0x165B, category='lo', description='CANADIAN SYLLABICS CARRIER TSU' },
+ [0x165C] = { unicodeslot=0x165C, category='lo', description='CANADIAN SYLLABICS CARRIER TSO' },
+ [0x165D] = { unicodeslot=0x165D, category='lo', description='CANADIAN SYLLABICS CARRIER TSE' },
+ [0x165E] = { unicodeslot=0x165E, category='lo', description='CANADIAN SYLLABICS CARRIER TSEE' },
+ [0x165F] = { unicodeslot=0x165F, category='lo', description='CANADIAN SYLLABICS CARRIER TSI' },
+ [0x1660] = { unicodeslot=0x1660, category='lo', description='CANADIAN SYLLABICS CARRIER TSA' },
+ [0x1661] = { unicodeslot=0x1661, category='lo', description='CANADIAN SYLLABICS CARRIER CHU' },
+ [0x1662] = { unicodeslot=0x1662, category='lo', description='CANADIAN SYLLABICS CARRIER CHO' },
+ [0x1663] = { unicodeslot=0x1663, category='lo', description='CANADIAN SYLLABICS CARRIER CHE' },
+ [0x1664] = { unicodeslot=0x1664, category='lo', description='CANADIAN SYLLABICS CARRIER CHEE' },
+ [0x1665] = { unicodeslot=0x1665, category='lo', description='CANADIAN SYLLABICS CARRIER CHI' },
+ [0x1666] = { unicodeslot=0x1666, category='lo', description='CANADIAN SYLLABICS CARRIER CHA' },
+ [0x1667] = { unicodeslot=0x1667, category='lo', description='CANADIAN SYLLABICS CARRIER TTSU' },
+ [0x1668] = { unicodeslot=0x1668, category='lo', description='CANADIAN SYLLABICS CARRIER TTSO' },
+ [0x1669] = { unicodeslot=0x1669, category='lo', description='CANADIAN SYLLABICS CARRIER TTSE' },
+ [0x166A] = { unicodeslot=0x166A, category='lo', description='CANADIAN SYLLABICS CARRIER TTSEE' },
+ [0x166B] = { unicodeslot=0x166B, category='lo', description='CANADIAN SYLLABICS CARRIER TTSI' },
+ [0x166C] = { unicodeslot=0x166C, category='lo', description='CANADIAN SYLLABICS CARRIER TTSA' },
+ [0x166D] = { unicodeslot=0x166D, category='po', description='CANADIAN SYLLABICS CHI SIGN' },
+ [0x166E] = { unicodeslot=0x166E, category='po', description='CANADIAN SYLLABICS FULL STOP' },
+ [0x166F] = { unicodeslot=0x166F, category='lo', description='CANADIAN SYLLABICS QAI' },
+ [0x1670] = { unicodeslot=0x1670, category='lo', description='CANADIAN SYLLABICS NGAI' },
+ [0x1671] = { unicodeslot=0x1671, category='lo', description='CANADIAN SYLLABICS NNGI' },
+ [0x1672] = { unicodeslot=0x1672, category='lo', description='CANADIAN SYLLABICS NNGII' },
+ [0x1673] = { unicodeslot=0x1673, category='lo', description='CANADIAN SYLLABICS NNGO' },
+ [0x1674] = { unicodeslot=0x1674, category='lo', description='CANADIAN SYLLABICS NNGOO' },
+ [0x1675] = { unicodeslot=0x1675, category='lo', description='CANADIAN SYLLABICS NNGA' },
+ [0x1676] = { unicodeslot=0x1676, category='lo', description='CANADIAN SYLLABICS NNGAA' },
+ [0x1680] = { unicodeslot=0x1680, category='zs', description='OGHAM SPACE MARK' },
+ [0x1681] = { unicodeslot=0x1681, category='lo', description='OGHAM LETTER BEITH' },
+ [0x1682] = { unicodeslot=0x1682, category='lo', description='OGHAM LETTER LUIS' },
+ [0x1683] = { unicodeslot=0x1683, category='lo', description='OGHAM LETTER FEARN' },
+ [0x1684] = { unicodeslot=0x1684, category='lo', description='OGHAM LETTER SAIL' },
+ [0x1685] = { unicodeslot=0x1685, category='lo', description='OGHAM LETTER NION' },
+ [0x1686] = { unicodeslot=0x1686, category='lo', description='OGHAM LETTER UATH' },
+ [0x1687] = { unicodeslot=0x1687, category='lo', description='OGHAM LETTER DAIR' },
+ [0x1688] = { unicodeslot=0x1688, category='lo', description='OGHAM LETTER TINNE' },
+ [0x1689] = { unicodeslot=0x1689, category='lo', description='OGHAM LETTER COLL' },
+ [0x168A] = { unicodeslot=0x168A, category='lo', description='OGHAM LETTER CEIRT' },
+ [0x168B] = { unicodeslot=0x168B, category='lo', description='OGHAM LETTER MUIN' },
+ [0x168C] = { unicodeslot=0x168C, category='lo', description='OGHAM LETTER GORT' },
+ [0x168D] = { unicodeslot=0x168D, category='lo', description='OGHAM LETTER NGEADAL' },
+ [0x168E] = { unicodeslot=0x168E, category='lo', description='OGHAM LETTER STRAIF' },
+ [0x168F] = { unicodeslot=0x168F, category='lo', description='OGHAM LETTER RUIS' },
+ [0x1690] = { unicodeslot=0x1690, category='lo', description='OGHAM LETTER AILM' },
+ [0x1691] = { unicodeslot=0x1691, category='lo', description='OGHAM LETTER ONN' },
+ [0x1692] = { unicodeslot=0x1692, category='lo', description='OGHAM LETTER UR' },
+ [0x1693] = { unicodeslot=0x1693, category='lo', description='OGHAM LETTER EADHADH' },
+ [0x1694] = { unicodeslot=0x1694, category='lo', description='OGHAM LETTER IODHADH' },
+ [0x1695] = { unicodeslot=0x1695, category='lo', description='OGHAM LETTER EABHADH' },
+ [0x1696] = { unicodeslot=0x1696, category='lo', description='OGHAM LETTER OR' },
+ [0x1697] = { unicodeslot=0x1697, category='lo', description='OGHAM LETTER UILLEANN' },
+ [0x1698] = { unicodeslot=0x1698, category='lo', description='OGHAM LETTER IFIN' },
+ [0x1699] = { unicodeslot=0x1699, category='lo', description='OGHAM LETTER EAMHANCHOLL' },
+ [0x169A] = { unicodeslot=0x169A, category='lo', description='OGHAM LETTER PEITH' },
+ [0x169B] = { unicodeslot=0x169B, category='ps', description='OGHAM FEATHER MARK' },
+ [0x169C] = { unicodeslot=0x169C, category='pe', description='OGHAM REVERSED FEATHER MARK' },
+ [0x16A0] = { unicodeslot=0x16A0, category='lo', description='RUNIC LETTER FEHU FEOH FE F' },
+ [0x16A1] = { unicodeslot=0x16A1, category='lo', description='RUNIC LETTER V' },
+ [0x16A2] = { unicodeslot=0x16A2, category='lo', description='RUNIC LETTER URUZ UR U' },
+ [0x16A3] = { unicodeslot=0x16A3, category='lo', description='RUNIC LETTER YR' },
+ [0x16A4] = { unicodeslot=0x16A4, category='lo', description='RUNIC LETTER Y' },
+ [0x16A5] = { unicodeslot=0x16A5, category='lo', description='RUNIC LETTER W' },
+ [0x16A6] = { unicodeslot=0x16A6, category='lo', description='RUNIC LETTER THURISAZ THURS THORN' },
+ [0x16A7] = { unicodeslot=0x16A7, category='lo', description='RUNIC LETTER ETH' },
+ [0x16A8] = { unicodeslot=0x16A8, category='lo', description='RUNIC LETTER ANSUZ A' },
+ [0x16A9] = { unicodeslot=0x16A9, category='lo', description='RUNIC LETTER OS O' },
+ [0x16AA] = { unicodeslot=0x16AA, category='lo', description='RUNIC LETTER AC A' },
+ [0x16AB] = { unicodeslot=0x16AB, category='lo', description='RUNIC LETTER AESC' },
+ [0x16AC] = { unicodeslot=0x16AC, category='lo', description='RUNIC LETTER LONG-BRANCH-OSS O' },
+ [0x16AD] = { unicodeslot=0x16AD, category='lo', description='RUNIC LETTER SHORT-TWIG-OSS O' },
+ [0x16AE] = { unicodeslot=0x16AE, category='lo', description='RUNIC LETTER O' },
+ [0x16AF] = { unicodeslot=0x16AF, category='lo', description='RUNIC LETTER OE' },
+ [0x16B0] = { unicodeslot=0x16B0, category='lo', description='RUNIC LETTER ON' },
+ [0x16B1] = { unicodeslot=0x16B1, category='lo', description='RUNIC LETTER RAIDO RAD REID R' },
+ [0x16B2] = { unicodeslot=0x16B2, category='lo', description='RUNIC LETTER KAUNA' },
+ [0x16B3] = { unicodeslot=0x16B3, category='lo', description='RUNIC LETTER CEN' },
+ [0x16B4] = { unicodeslot=0x16B4, category='lo', description='RUNIC LETTER KAUN K' },
+ [0x16B5] = { unicodeslot=0x16B5, category='lo', description='RUNIC LETTER G' },
+ [0x16B6] = { unicodeslot=0x16B6, category='lo', description='RUNIC LETTER ENG' },
+ [0x16B7] = { unicodeslot=0x16B7, category='lo', description='RUNIC LETTER GEBO GYFU G' },
+ [0x16B8] = { unicodeslot=0x16B8, category='lo', description='RUNIC LETTER GAR' },
+ [0x16B9] = { unicodeslot=0x16B9, category='lo', description='RUNIC LETTER WUNJO WYNN W' },
+ [0x16BA] = { unicodeslot=0x16BA, category='lo', description='RUNIC LETTER HAGLAZ H' },
+ [0x16BB] = { unicodeslot=0x16BB, category='lo', description='RUNIC LETTER HAEGL H' },
+ [0x16BC] = { unicodeslot=0x16BC, category='lo', description='RUNIC LETTER LONG-BRANCH-HAGALL H' },
+ [0x16BD] = { unicodeslot=0x16BD, category='lo', description='RUNIC LETTER SHORT-TWIG-HAGALL H' },
+ [0x16BE] = { unicodeslot=0x16BE, category='lo', description='RUNIC LETTER NAUDIZ NYD NAUD N' },
+ [0x16BF] = { unicodeslot=0x16BF, category='lo', description='RUNIC LETTER SHORT-TWIG-NAUD N' },
+ [0x16C0] = { unicodeslot=0x16C0, category='lo', description='RUNIC LETTER DOTTED-N' },
+ [0x16C1] = { unicodeslot=0x16C1, category='lo', description='RUNIC LETTER ISAZ IS ISS I' },
+ [0x16C2] = { unicodeslot=0x16C2, category='lo', description='RUNIC LETTER E' },
+ [0x16C3] = { unicodeslot=0x16C3, category='lo', description='RUNIC LETTER JERAN J' },
+ [0x16C4] = { unicodeslot=0x16C4, category='lo', description='RUNIC LETTER GER' },
+ [0x16C5] = { unicodeslot=0x16C5, category='lo', description='RUNIC LETTER LONG-BRANCH-AR AE' },
+ [0x16C6] = { unicodeslot=0x16C6, category='lo', description='RUNIC LETTER SHORT-TWIG-AR A' },
+ [0x16C7] = { unicodeslot=0x16C7, category='lo', description='RUNIC LETTER IWAZ EOH' },
+ [0x16C8] = { unicodeslot=0x16C8, category='lo', description='RUNIC LETTER PERTHO PEORTH P' },
+ [0x16C9] = { unicodeslot=0x16C9, category='lo', description='RUNIC LETTER ALGIZ EOLHX' },
+ [0x16CA] = { unicodeslot=0x16CA, category='lo', description='RUNIC LETTER SOWILO S' },
+ [0x16CB] = { unicodeslot=0x16CB, category='lo', description='RUNIC LETTER SIGEL LONG-BRANCH-SOL S' },
+ [0x16CC] = { unicodeslot=0x16CC, category='lo', description='RUNIC LETTER SHORT-TWIG-SOL S' },
+ [0x16CD] = { unicodeslot=0x16CD, category='lo', description='RUNIC LETTER C' },
+ [0x16CE] = { unicodeslot=0x16CE, category='lo', description='RUNIC LETTER Z' },
+ [0x16CF] = { unicodeslot=0x16CF, category='lo', description='RUNIC LETTER TIWAZ TIR TYR T' },
+ [0x16D0] = { unicodeslot=0x16D0, category='lo', description='RUNIC LETTER SHORT-TWIG-TYR T' },
+ [0x16D1] = { unicodeslot=0x16D1, category='lo', description='RUNIC LETTER D' },
+ [0x16D2] = { unicodeslot=0x16D2, category='lo', description='RUNIC LETTER BERKANAN BEORC BJARKAN B' },
+ [0x16D3] = { unicodeslot=0x16D3, category='lo', description='RUNIC LETTER SHORT-TWIG-BJARKAN B' },
+ [0x16D4] = { unicodeslot=0x16D4, category='lo', description='RUNIC LETTER DOTTED-P' },
+ [0x16D5] = { unicodeslot=0x16D5, category='lo', description='RUNIC LETTER OPEN-P' },
+ [0x16D6] = { unicodeslot=0x16D6, category='lo', description='RUNIC LETTER EHWAZ EH E' },
+ [0x16D7] = { unicodeslot=0x16D7, category='lo', description='RUNIC LETTER MANNAZ MAN M' },
+ [0x16D8] = { unicodeslot=0x16D8, category='lo', description='RUNIC LETTER LONG-BRANCH-MADR M' },
+ [0x16D9] = { unicodeslot=0x16D9, category='lo', description='RUNIC LETTER SHORT-TWIG-MADR M' },
+ [0x16DA] = { unicodeslot=0x16DA, category='lo', description='RUNIC LETTER LAUKAZ LAGU LOGR L' },
+ [0x16DB] = { unicodeslot=0x16DB, category='lo', description='RUNIC LETTER DOTTED-L' },
+ [0x16DC] = { unicodeslot=0x16DC, category='lo', description='RUNIC LETTER INGWAZ' },
+ [0x16DD] = { unicodeslot=0x16DD, category='lo', description='RUNIC LETTER ING' },
+ [0x16DE] = { unicodeslot=0x16DE, category='lo', description='RUNIC LETTER DAGAZ DAEG D' },
+ [0x16DF] = { unicodeslot=0x16DF, category='lo', description='RUNIC LETTER OTHALAN ETHEL O' },
+ [0x16E0] = { unicodeslot=0x16E0, category='lo', description='RUNIC LETTER EAR' },
+ [0x16E1] = { unicodeslot=0x16E1, category='lo', description='RUNIC LETTER IOR' },
+ [0x16E2] = { unicodeslot=0x16E2, category='lo', description='RUNIC LETTER CWEORTH' },
+ [0x16E3] = { unicodeslot=0x16E3, category='lo', description='RUNIC LETTER CALC' },
+ [0x16E4] = { unicodeslot=0x16E4, category='lo', description='RUNIC LETTER CEALC' },
+ [0x16E5] = { unicodeslot=0x16E5, category='lo', description='RUNIC LETTER STAN' },
+ [0x16E6] = { unicodeslot=0x16E6, category='lo', description='RUNIC LETTER LONG-BRANCH-YR' },
+ [0x16E7] = { unicodeslot=0x16E7, category='lo', description='RUNIC LETTER SHORT-TWIG-YR' },
+ [0x16E8] = { unicodeslot=0x16E8, category='lo', description='RUNIC LETTER ICELANDIC-YR' },
+ [0x16E9] = { unicodeslot=0x16E9, category='lo', description='RUNIC LETTER Q' },
+ [0x16EA] = { unicodeslot=0x16EA, category='lo', description='RUNIC LETTER X' },
+ [0x16EB] = { unicodeslot=0x16EB, category='po', description='RUNIC SINGLE PUNCTUATION' },
+ [0x16EC] = { unicodeslot=0x16EC, category='po', description='RUNIC MULTIPLE PUNCTUATION' },
+ [0x16ED] = { unicodeslot=0x16ED, category='po', description='RUNIC CROSS PUNCTUATION' },
+ [0x16EE] = { unicodeslot=0x16EE, category='nl', description='RUNIC ARLAUG SYMBOL' },
+ [0x16EF] = { unicodeslot=0x16EF, category='nl', description='RUNIC TVIMADUR SYMBOL' },
+ [0x16F0] = { unicodeslot=0x16F0, category='nl', description='RUNIC BELGTHOR SYMBOL' },
+ [0x1700] = { unicodeslot=0x1700, category='lo', description='TAGALOG LETTER A' },
+ [0x1701] = { unicodeslot=0x1701, category='lo', description='TAGALOG LETTER I' },
+ [0x1702] = { unicodeslot=0x1702, category='lo', description='TAGALOG LETTER U' },
+ [0x1703] = { unicodeslot=0x1703, category='lo', description='TAGALOG LETTER KA' },
+ [0x1704] = { unicodeslot=0x1704, category='lo', description='TAGALOG LETTER GA' },
+ [0x1705] = { unicodeslot=0x1705, category='lo', description='TAGALOG LETTER NGA' },
+ [0x1706] = { unicodeslot=0x1706, category='lo', description='TAGALOG LETTER TA' },
+ [0x1707] = { unicodeslot=0x1707, category='lo', description='TAGALOG LETTER DA' },
+ [0x1708] = { unicodeslot=0x1708, category='lo', description='TAGALOG LETTER NA' },
+ [0x1709] = { unicodeslot=0x1709, category='lo', description='TAGALOG LETTER PA' },
+ [0x170A] = { unicodeslot=0x170A, category='lo', description='TAGALOG LETTER BA' },
+ [0x170B] = { unicodeslot=0x170B, category='lo', description='TAGALOG LETTER MA' },
+ [0x170C] = { unicodeslot=0x170C, category='lo', description='TAGALOG LETTER YA' },
+ [0x170E] = { unicodeslot=0x170E, category='lo', description='TAGALOG LETTER LA' },
+ [0x170F] = { unicodeslot=0x170F, category='lo', description='TAGALOG LETTER WA' },
+ [0x1710] = { unicodeslot=0x1710, category='lo', description='TAGALOG LETTER SA' },
+ [0x1711] = { unicodeslot=0x1711, category='lo', description='TAGALOG LETTER HA' },
+ [0x1712] = { unicodeslot=0x1712, category='mn', description='TAGALOG VOWEL SIGN I' },
+ [0x1713] = { unicodeslot=0x1713, category='mn', description='TAGALOG VOWEL SIGN U' },
+ [0x1714] = { unicodeslot=0x1714, category='mn', description='TAGALOG SIGN VIRAMA' },
+ [0x1720] = { unicodeslot=0x1720, category='lo', description='HANUNOO LETTER A' },
+ [0x1721] = { unicodeslot=0x1721, category='lo', description='HANUNOO LETTER I' },
+ [0x1722] = { unicodeslot=0x1722, category='lo', description='HANUNOO LETTER U' },
+ [0x1723] = { unicodeslot=0x1723, category='lo', description='HANUNOO LETTER KA' },
+ [0x1724] = { unicodeslot=0x1724, category='lo', description='HANUNOO LETTER GA' },
+ [0x1725] = { unicodeslot=0x1725, category='lo', description='HANUNOO LETTER NGA' },
+ [0x1726] = { unicodeslot=0x1726, category='lo', description='HANUNOO LETTER TA' },
+ [0x1727] = { unicodeslot=0x1727, category='lo', description='HANUNOO LETTER DA' },
+ [0x1728] = { unicodeslot=0x1728, category='lo', description='HANUNOO LETTER NA' },
+ [0x1729] = { unicodeslot=0x1729, category='lo', description='HANUNOO LETTER PA' },
+ [0x172A] = { unicodeslot=0x172A, category='lo', description='HANUNOO LETTER BA' },
+ [0x172B] = { unicodeslot=0x172B, category='lo', description='HANUNOO LETTER MA' },
+ [0x172C] = { unicodeslot=0x172C, category='lo', description='HANUNOO LETTER YA' },
+ [0x172D] = { unicodeslot=0x172D, category='lo', description='HANUNOO LETTER RA' },
+ [0x172E] = { unicodeslot=0x172E, category='lo', description='HANUNOO LETTER LA' },
+ [0x172F] = { unicodeslot=0x172F, category='lo', description='HANUNOO LETTER WA' },
+ [0x1730] = { unicodeslot=0x1730, category='lo', description='HANUNOO LETTER SA' },
+ [0x1731] = { unicodeslot=0x1731, category='lo', description='HANUNOO LETTER HA' },
+ [0x1732] = { unicodeslot=0x1732, category='mn', description='HANUNOO VOWEL SIGN I' },
+ [0x1733] = { unicodeslot=0x1733, category='mn', description='HANUNOO VOWEL SIGN U' },
+ [0x1734] = { unicodeslot=0x1734, category='mn', description='HANUNOO SIGN PAMUDPOD' },
+ [0x1735] = { unicodeslot=0x1735, category='po', description='PHILIPPINE SINGLE PUNCTUATION' },
+ [0x1736] = { unicodeslot=0x1736, category='po', description='PHILIPPINE DOUBLE PUNCTUATION' },
+ [0x1740] = { unicodeslot=0x1740, category='lo', description='BUHID LETTER A' },
+ [0x1741] = { unicodeslot=0x1741, category='lo', description='BUHID LETTER I' },
+ [0x1742] = { unicodeslot=0x1742, category='lo', description='BUHID LETTER U' },
+ [0x1743] = { unicodeslot=0x1743, category='lo', description='BUHID LETTER KA' },
+ [0x1744] = { unicodeslot=0x1744, category='lo', description='BUHID LETTER GA' },
+ [0x1745] = { unicodeslot=0x1745, category='lo', description='BUHID LETTER NGA' },
+ [0x1746] = { unicodeslot=0x1746, category='lo', description='BUHID LETTER TA' },
+ [0x1747] = { unicodeslot=0x1747, category='lo', description='BUHID LETTER DA' },
+ [0x1748] = { unicodeslot=0x1748, category='lo', description='BUHID LETTER NA' },
+ [0x1749] = { unicodeslot=0x1749, category='lo', description='BUHID LETTER PA' },
+ [0x174A] = { unicodeslot=0x174A, category='lo', description='BUHID LETTER BA' },
+ [0x174B] = { unicodeslot=0x174B, category='lo', description='BUHID LETTER MA' },
+ [0x174C] = { unicodeslot=0x174C, category='lo', description='BUHID LETTER YA' },
+ [0x174D] = { unicodeslot=0x174D, category='lo', description='BUHID LETTER RA' },
+ [0x174E] = { unicodeslot=0x174E, category='lo', description='BUHID LETTER LA' },
+ [0x174F] = { unicodeslot=0x174F, category='lo', description='BUHID LETTER WA' },
+ [0x1750] = { unicodeslot=0x1750, category='lo', description='BUHID LETTER SA' },
+ [0x1751] = { unicodeslot=0x1751, category='lo', description='BUHID LETTER HA' },
+ [0x1752] = { unicodeslot=0x1752, category='mn', description='BUHID VOWEL SIGN I' },
+ [0x1753] = { unicodeslot=0x1753, category='mn', description='BUHID VOWEL SIGN U' },
+ [0x1760] = { unicodeslot=0x1760, category='lo', description='TAGBANWA LETTER A' },
+ [0x1761] = { unicodeslot=0x1761, category='lo', description='TAGBANWA LETTER I' },
+ [0x1762] = { unicodeslot=0x1762, category='lo', description='TAGBANWA LETTER U' },
+ [0x1763] = { unicodeslot=0x1763, category='lo', description='TAGBANWA LETTER KA' },
+ [0x1764] = { unicodeslot=0x1764, category='lo', description='TAGBANWA LETTER GA' },
+ [0x1765] = { unicodeslot=0x1765, category='lo', description='TAGBANWA LETTER NGA' },
+ [0x1766] = { unicodeslot=0x1766, category='lo', description='TAGBANWA LETTER TA' },
+ [0x1767] = { unicodeslot=0x1767, category='lo', description='TAGBANWA LETTER DA' },
+ [0x1768] = { unicodeslot=0x1768, category='lo', description='TAGBANWA LETTER NA' },
+ [0x1769] = { unicodeslot=0x1769, category='lo', description='TAGBANWA LETTER PA' },
+ [0x176A] = { unicodeslot=0x176A, category='lo', description='TAGBANWA LETTER BA' },
+ [0x176B] = { unicodeslot=0x176B, category='lo', description='TAGBANWA LETTER MA' },
+ [0x176C] = { unicodeslot=0x176C, category='lo', description='TAGBANWA LETTER YA' },
+ [0x176E] = { unicodeslot=0x176E, category='lo', description='TAGBANWA LETTER LA' },
+ [0x176F] = { unicodeslot=0x176F, category='lo', description='TAGBANWA LETTER WA' },
+ [0x1770] = { unicodeslot=0x1770, category='lo', description='TAGBANWA LETTER SA' },
+ [0x1772] = { unicodeslot=0x1772, category='mn', description='TAGBANWA VOWEL SIGN I' },
+ [0x1773] = { unicodeslot=0x1773, category='mn', description='TAGBANWA VOWEL SIGN U' },
+ [0x1780] = { unicodeslot=0x1780, category='lo', description='KHMER LETTER KA' },
+ [0x1781] = { unicodeslot=0x1781, category='lo', description='KHMER LETTER KHA' },
+ [0x1782] = { unicodeslot=0x1782, category='lo', description='KHMER LETTER KO' },
+ [0x1783] = { unicodeslot=0x1783, category='lo', description='KHMER LETTER KHO' },
+ [0x1784] = { unicodeslot=0x1784, category='lo', description='KHMER LETTER NGO' },
+ [0x1785] = { unicodeslot=0x1785, category='lo', description='KHMER LETTER CA' },
+ [0x1786] = { unicodeslot=0x1786, category='lo', description='KHMER LETTER CHA' },
+ [0x1787] = { unicodeslot=0x1787, category='lo', description='KHMER LETTER CO' },
+ [0x1788] = { unicodeslot=0x1788, category='lo', description='KHMER LETTER CHO' },
+ [0x1789] = { unicodeslot=0x1789, category='lo', description='KHMER LETTER NYO' },
+ [0x178A] = { unicodeslot=0x178A, category='lo', description='KHMER LETTER DA' },
+ [0x178B] = { unicodeslot=0x178B, category='lo', description='KHMER LETTER TTHA' },
+ [0x178C] = { unicodeslot=0x178C, category='lo', description='KHMER LETTER DO' },
+ [0x178D] = { unicodeslot=0x178D, category='lo', description='KHMER LETTER TTHO' },
+ [0x178E] = { unicodeslot=0x178E, category='lo', description='KHMER LETTER NNO' },
+ [0x178F] = { unicodeslot=0x178F, category='lo', description='KHMER LETTER TA' },
+ [0x1790] = { unicodeslot=0x1790, category='lo', description='KHMER LETTER THA' },
+ [0x1791] = { unicodeslot=0x1791, category='lo', description='KHMER LETTER TO' },
+ [0x1792] = { unicodeslot=0x1792, category='lo', description='KHMER LETTER THO' },
+ [0x1793] = { unicodeslot=0x1793, category='lo', description='KHMER LETTER NO' },
+ [0x1794] = { unicodeslot=0x1794, category='lo', description='KHMER LETTER BA' },
+ [0x1795] = { unicodeslot=0x1795, category='lo', description='KHMER LETTER PHA' },
+ [0x1796] = { unicodeslot=0x1796, category='lo', description='KHMER LETTER PO' },
+ [0x1797] = { unicodeslot=0x1797, category='lo', description='KHMER LETTER PHO' },
+ [0x1798] = { unicodeslot=0x1798, category='lo', description='KHMER LETTER MO' },
+ [0x1799] = { unicodeslot=0x1799, category='lo', description='KHMER LETTER YO' },
+ [0x179A] = { unicodeslot=0x179A, category='lo', description='KHMER LETTER RO' },
+ [0x179B] = { unicodeslot=0x179B, category='lo', description='KHMER LETTER LO' },
+ [0x179C] = { unicodeslot=0x179C, category='lo', description='KHMER LETTER VO' },
+ [0x179D] = { unicodeslot=0x179D, category='lo', description='KHMER LETTER SHA' },
+ [0x179E] = { unicodeslot=0x179E, category='lo', description='KHMER LETTER SSO' },
+ [0x179F] = { unicodeslot=0x179F, category='lo', description='KHMER LETTER SA' },
+ [0x17A0] = { unicodeslot=0x17A0, category='lo', description='KHMER LETTER HA' },
+ [0x17A1] = { unicodeslot=0x17A1, category='lo', description='KHMER LETTER LA' },
+ [0x17A2] = { unicodeslot=0x17A2, category='lo', description='KHMER LETTER QA' },
+ [0x17A3] = { unicodeslot=0x17A3, category='lo', description='KHMER INDEPENDENT VOWEL QAQ' },
+ [0x17A4] = { unicodeslot=0x17A4, category='lo', description='KHMER INDEPENDENT VOWEL QAA' },
+ [0x17A5] = { unicodeslot=0x17A5, category='lo', description='KHMER INDEPENDENT VOWEL QI' },
+ [0x17A6] = { unicodeslot=0x17A6, category='lo', description='KHMER INDEPENDENT VOWEL QII' },
+ [0x17A7] = { unicodeslot=0x17A7, category='lo', description='KHMER INDEPENDENT VOWEL QU' },
+ [0x17A8] = { unicodeslot=0x17A8, category='lo', description='KHMER INDEPENDENT VOWEL QUK' },
+ [0x17A9] = { unicodeslot=0x17A9, category='lo', description='KHMER INDEPENDENT VOWEL QUU' },
+ [0x17AA] = { unicodeslot=0x17AA, category='lo', description='KHMER INDEPENDENT VOWEL QUUV' },
+ [0x17AB] = { unicodeslot=0x17AB, category='lo', description='KHMER INDEPENDENT VOWEL RY' },
+ [0x17AC] = { unicodeslot=0x17AC, category='lo', description='KHMER INDEPENDENT VOWEL RYY' },
+ [0x17AD] = { unicodeslot=0x17AD, category='lo', description='KHMER INDEPENDENT VOWEL LY' },
+ [0x17AE] = { unicodeslot=0x17AE, category='lo', description='KHMER INDEPENDENT VOWEL LYY' },
+ [0x17AF] = { unicodeslot=0x17AF, category='lo', description='KHMER INDEPENDENT VOWEL QE' },
+ [0x17B0] = { unicodeslot=0x17B0, category='lo', description='KHMER INDEPENDENT VOWEL QAI' },
+ [0x17B1] = { unicodeslot=0x17B1, category='lo', description='KHMER INDEPENDENT VOWEL QOO TYPE ONE' },
+ [0x17B2] = { unicodeslot=0x17B2, category='lo', description='KHMER INDEPENDENT VOWEL QOO TYPE TWO' },
+ [0x17B3] = { unicodeslot=0x17B3, category='lo', description='KHMER INDEPENDENT VOWEL QAU' },
+ [0x17B4] = { unicodeslot=0x17B4, category='cf', description='KHMER VOWEL INHERENT AQ' },
+ [0x17B5] = { unicodeslot=0x17B5, category='cf', description='KHMER VOWEL INHERENT AA' },
+ [0x17B6] = { unicodeslot=0x17B6, category='mc', description='KHMER VOWEL SIGN AA' },
+ [0x17B7] = { unicodeslot=0x17B7, category='mn', description='KHMER VOWEL SIGN I' },
+ [0x17B8] = { unicodeslot=0x17B8, category='mn', description='KHMER VOWEL SIGN II' },
+ [0x17B9] = { unicodeslot=0x17B9, category='mn', description='KHMER VOWEL SIGN Y' },
+ [0x17BA] = { unicodeslot=0x17BA, category='mn', description='KHMER VOWEL SIGN YY' },
+ [0x17BB] = { unicodeslot=0x17BB, category='mn', description='KHMER VOWEL SIGN U' },
+ [0x17BC] = { unicodeslot=0x17BC, category='mn', description='KHMER VOWEL SIGN UU' },
+ [0x17BD] = { unicodeslot=0x17BD, category='mn', description='KHMER VOWEL SIGN UA' },
+ [0x17BE] = { unicodeslot=0x17BE, category='mc', description='KHMER VOWEL SIGN OE' },
+ [0x17BF] = { unicodeslot=0x17BF, category='mc', description='KHMER VOWEL SIGN YA' },
+ [0x17C0] = { unicodeslot=0x17C0, category='mc', description='KHMER VOWEL SIGN IE' },
+ [0x17C1] = { unicodeslot=0x17C1, category='mc', description='KHMER VOWEL SIGN E' },
+ [0x17C2] = { unicodeslot=0x17C2, category='mc', description='KHMER VOWEL SIGN AE' },
+ [0x17C3] = { unicodeslot=0x17C3, category='mc', description='KHMER VOWEL SIGN AI' },
+ [0x17C4] = { unicodeslot=0x17C4, category='mc', description='KHMER VOWEL SIGN OO' },
+ [0x17C5] = { unicodeslot=0x17C5, category='mc', description='KHMER VOWEL SIGN AU' },
+ [0x17C6] = { unicodeslot=0x17C6, category='mn', description='KHMER SIGN NIKAHIT' },
+ [0x17C7] = { unicodeslot=0x17C7, category='mc', description='KHMER SIGN REAHMUK' },
+ [0x17C8] = { unicodeslot=0x17C8, category='mc', description='KHMER SIGN YUUKALEAPINTU' },
+ [0x17C9] = { unicodeslot=0x17C9, category='mn', description='KHMER SIGN MUUSIKATOAN' },
+ [0x17CA] = { unicodeslot=0x17CA, category='mn', description='KHMER SIGN TRIISAP' },
+ [0x17CB] = { unicodeslot=0x17CB, category='mn', description='KHMER SIGN BANTOC' },
+ [0x17CC] = { unicodeslot=0x17CC, category='mn', description='KHMER SIGN ROBAT' },
+ [0x17CD] = { unicodeslot=0x17CD, category='mn', description='KHMER SIGN TOANDAKHIAT' },
+ [0x17CE] = { unicodeslot=0x17CE, category='mn', description='KHMER SIGN KAKABAT' },
+ [0x17CF] = { unicodeslot=0x17CF, category='mn', description='KHMER SIGN AHSDA' },
+ [0x17D0] = { unicodeslot=0x17D0, category='mn', description='KHMER SIGN SAMYOK SANNYA' },
+ [0x17D1] = { unicodeslot=0x17D1, category='mn', description='KHMER SIGN VIRIAM' },
+ [0x17D2] = { unicodeslot=0x17D2, category='mn', description='KHMER SIGN COENG' },
+ [0x17D3] = { unicodeslot=0x17D3, category='mn', description='KHMER SIGN BATHAMASAT' },
+ [0x17D4] = { unicodeslot=0x17D4, category='po', description='KHMER SIGN KHAN' },
+ [0x17D5] = { unicodeslot=0x17D5, category='po', description='KHMER SIGN BARIYOOSAN' },
+ [0x17D6] = { unicodeslot=0x17D6, category='po', description='KHMER SIGN CAMNUC PII KUUH' },
+ [0x17D7] = { unicodeslot=0x17D7, category='lm', description='KHMER SIGN LEK TOO' },
+ [0x17D8] = { unicodeslot=0x17D8, category='po', description='KHMER SIGN BEYYAL' },
+ [0x17D9] = { unicodeslot=0x17D9, category='po', description='KHMER SIGN PHNAEK MUAN' },
+ [0x17DA] = { unicodeslot=0x17DA, category='po', description='KHMER SIGN KOOMUUT' },
+ [0x17DB] = { unicodeslot=0x17DB, category='sc', description='KHMER CURRENCY SYMBOL RIEL' },
+ [0x17DC] = { unicodeslot=0x17DC, category='lo', description='KHMER SIGN AVAKRAHASANYA' },
+ [0x17DD] = { unicodeslot=0x17DD, category='mn', description='KHMER SIGN ATTHACAN' },
+ [0x17E0] = { unicodeslot=0x17E0, category='nd', description='KHMER DIGIT ZERO' },
+ [0x17E1] = { unicodeslot=0x17E1, category='nd', description='KHMER DIGIT ONE' },
+ [0x17E2] = { unicodeslot=0x17E2, category='nd', description='KHMER DIGIT TWO' },
+ [0x17E3] = { unicodeslot=0x17E3, category='nd', description='KHMER DIGIT THREE' },
+ [0x17E4] = { unicodeslot=0x17E4, category='nd', description='KHMER DIGIT FOUR' },
+ [0x17E5] = { unicodeslot=0x17E5, category='nd', description='KHMER DIGIT FIVE' },
+ [0x17E6] = { unicodeslot=0x17E6, category='nd', description='KHMER DIGIT SIX' },
+ [0x17E7] = { unicodeslot=0x17E7, category='nd', description='KHMER DIGIT SEVEN' },
+ [0x17E8] = { unicodeslot=0x17E8, category='nd', description='KHMER DIGIT EIGHT' },
+ [0x17E9] = { unicodeslot=0x17E9, category='nd', description='KHMER DIGIT NINE' },
+ [0x17F0] = { unicodeslot=0x17F0, category='no', description='KHMER SYMBOL LEK ATTAK SON' },
+ [0x17F1] = { unicodeslot=0x17F1, category='no', description='KHMER SYMBOL LEK ATTAK MUOY' },
+ [0x17F2] = { unicodeslot=0x17F2, category='no', description='KHMER SYMBOL LEK ATTAK PII' },
+ [0x17F3] = { unicodeslot=0x17F3, category='no', description='KHMER SYMBOL LEK ATTAK BEI' },
+ [0x17F4] = { unicodeslot=0x17F4, category='no', description='KHMER SYMBOL LEK ATTAK BUON' },
+ [0x17F5] = { unicodeslot=0x17F5, category='no', description='KHMER SYMBOL LEK ATTAK PRAM' },
+ [0x17F6] = { unicodeslot=0x17F6, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-MUOY' },
+ [0x17F7] = { unicodeslot=0x17F7, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-PII' },
+ [0x17F8] = { unicodeslot=0x17F8, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-BEI' },
+ [0x17F9] = { unicodeslot=0x17F9, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-BUON' },
+ [0x1800] = { unicodeslot=0x1800, category='po', description='MONGOLIAN BIRGA' },
+ [0x1801] = { unicodeslot=0x1801, category='po', description='MONGOLIAN ELLIPSIS' },
+ [0x1802] = { unicodeslot=0x1802, category='po', description='MONGOLIAN COMMA' },
+ [0x1803] = { unicodeslot=0x1803, category='po', description='MONGOLIAN FULL STOP' },
+ [0x1804] = { unicodeslot=0x1804, category='po', description='MONGOLIAN COLON' },
+ [0x1805] = { unicodeslot=0x1805, category='po', description='MONGOLIAN FOUR DOTS' },
+ [0x1806] = { unicodeslot=0x1806, category='pd', description='MONGOLIAN TODO SOFT HYPHEN' },
+ [0x1807] = { unicodeslot=0x1807, category='po', description='MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER' },
+ [0x1808] = { unicodeslot=0x1808, category='po', description='MONGOLIAN MANCHU COMMA' },
+ [0x1809] = { unicodeslot=0x1809, category='po', description='MONGOLIAN MANCHU FULL STOP' },
+ [0x180A] = { unicodeslot=0x180A, category='po', description='MONGOLIAN NIRUGU' },
+ [0x180B] = { unicodeslot=0x180B, category='mn', description='MONGOLIAN FREE VARIATION SELECTOR ONE' },
+ [0x180C] = { unicodeslot=0x180C, category='mn', description='MONGOLIAN FREE VARIATION SELECTOR TWO' },
+ [0x180D] = { unicodeslot=0x180D, category='mn', description='MONGOLIAN FREE VARIATION SELECTOR THREE' },
+ [0x180E] = { unicodeslot=0x180E, category='zs', description='MONGOLIAN VOWEL SEPARATOR' },
+ [0x1810] = { unicodeslot=0x1810, category='nd', description='MONGOLIAN DIGIT ZERO' },
+ [0x1811] = { unicodeslot=0x1811, category='nd', description='MONGOLIAN DIGIT ONE' },
+ [0x1812] = { unicodeslot=0x1812, category='nd', description='MONGOLIAN DIGIT TWO' },
+ [0x1813] = { unicodeslot=0x1813, category='nd', description='MONGOLIAN DIGIT THREE' },
+ [0x1814] = { unicodeslot=0x1814, category='nd', description='MONGOLIAN DIGIT FOUR' },
+ [0x1815] = { unicodeslot=0x1815, category='nd', description='MONGOLIAN DIGIT FIVE' },
+ [0x1816] = { unicodeslot=0x1816, category='nd', description='MONGOLIAN DIGIT SIX' },
+ [0x1817] = { unicodeslot=0x1817, category='nd', description='MONGOLIAN DIGIT SEVEN' },
+ [0x1818] = { unicodeslot=0x1818, category='nd', description='MONGOLIAN DIGIT EIGHT' },
+ [0x1819] = { unicodeslot=0x1819, category='nd', description='MONGOLIAN DIGIT NINE' },
+ [0x1820] = { unicodeslot=0x1820, category='lo', description='MONGOLIAN LETTER A' },
+ [0x1821] = { unicodeslot=0x1821, category='lo', description='MONGOLIAN LETTER E' },
+ [0x1822] = { unicodeslot=0x1822, category='lo', description='MONGOLIAN LETTER I' },
+ [0x1823] = { unicodeslot=0x1823, category='lo', description='MONGOLIAN LETTER O' },
+ [0x1824] = { unicodeslot=0x1824, category='lo', description='MONGOLIAN LETTER U' },
+ [0x1825] = { unicodeslot=0x1825, category='lo', description='MONGOLIAN LETTER OE' },
+ [0x1826] = { unicodeslot=0x1826, category='lo', description='MONGOLIAN LETTER UE' },
+ [0x1827] = { unicodeslot=0x1827, category='lo', description='MONGOLIAN LETTER EE' },
+ [0x1828] = { unicodeslot=0x1828, category='lo', description='MONGOLIAN LETTER NA' },
+ [0x1829] = { unicodeslot=0x1829, category='lo', description='MONGOLIAN LETTER ANG' },
+ [0x182A] = { unicodeslot=0x182A, category='lo', description='MONGOLIAN LETTER BA' },
+ [0x182B] = { unicodeslot=0x182B, category='lo', description='MONGOLIAN LETTER PA' },
+ [0x182C] = { unicodeslot=0x182C, category='lo', description='MONGOLIAN LETTER QA' },
+ [0x182D] = { unicodeslot=0x182D, category='lo', description='MONGOLIAN LETTER GA' },
+ [0x182E] = { unicodeslot=0x182E, category='lo', description='MONGOLIAN LETTER MA' },
+ [0x182F] = { unicodeslot=0x182F, category='lo', description='MONGOLIAN LETTER LA' },
+ [0x1830] = { unicodeslot=0x1830, category='lo', description='MONGOLIAN LETTER SA' },
+ [0x1831] = { unicodeslot=0x1831, category='lo', description='MONGOLIAN LETTER SHA' },
+ [0x1832] = { unicodeslot=0x1832, category='lo', description='MONGOLIAN LETTER TA' },
+ [0x1833] = { unicodeslot=0x1833, category='lo', description='MONGOLIAN LETTER DA' },
+ [0x1834] = { unicodeslot=0x1834, category='lo', description='MONGOLIAN LETTER CHA' },
+ [0x1835] = { unicodeslot=0x1835, category='lo', description='MONGOLIAN LETTER JA' },
+ [0x1836] = { unicodeslot=0x1836, category='lo', description='MONGOLIAN LETTER YA' },
+ [0x1837] = { unicodeslot=0x1837, category='lo', description='MONGOLIAN LETTER RA' },
+ [0x1838] = { unicodeslot=0x1838, category='lo', description='MONGOLIAN LETTER WA' },
+ [0x1839] = { unicodeslot=0x1839, category='lo', description='MONGOLIAN LETTER FA' },
+ [0x183A] = { unicodeslot=0x183A, category='lo', description='MONGOLIAN LETTER KA' },
+ [0x183B] = { unicodeslot=0x183B, category='lo', description='MONGOLIAN LETTER KHA' },
+ [0x183C] = { unicodeslot=0x183C, category='lo', description='MONGOLIAN LETTER TSA' },
+ [0x183D] = { unicodeslot=0x183D, category='lo', description='MONGOLIAN LETTER ZA' },
+ [0x183E] = { unicodeslot=0x183E, category='lo', description='MONGOLIAN LETTER HAA' },
+ [0x183F] = { unicodeslot=0x183F, category='lo', description='MONGOLIAN LETTER ZRA' },
+ [0x1840] = { unicodeslot=0x1840, category='lo', description='MONGOLIAN LETTER LHA' },
+ [0x1841] = { unicodeslot=0x1841, category='lo', description='MONGOLIAN LETTER ZHI' },
+ [0x1842] = { unicodeslot=0x1842, category='lo', description='MONGOLIAN LETTER CHI' },
+ [0x1843] = { unicodeslot=0x1843, category='lm', description='MONGOLIAN LETTER TODO LONG VOWEL SIGN' },
+ [0x1844] = { unicodeslot=0x1844, category='lo', description='MONGOLIAN LETTER TODO E' },
+ [0x1845] = { unicodeslot=0x1845, category='lo', description='MONGOLIAN LETTER TODO I' },
+ [0x1846] = { unicodeslot=0x1846, category='lo', description='MONGOLIAN LETTER TODO O' },
+ [0x1847] = { unicodeslot=0x1847, category='lo', description='MONGOLIAN LETTER TODO U' },
+ [0x1848] = { unicodeslot=0x1848, category='lo', description='MONGOLIAN LETTER TODO OE' },
+ [0x1849] = { unicodeslot=0x1849, category='lo', description='MONGOLIAN LETTER TODO UE' },
+ [0x184A] = { unicodeslot=0x184A, category='lo', description='MONGOLIAN LETTER TODO ANG' },
+ [0x184B] = { unicodeslot=0x184B, category='lo', description='MONGOLIAN LETTER TODO BA' },
+ [0x184C] = { unicodeslot=0x184C, category='lo', description='MONGOLIAN LETTER TODO PA' },
+ [0x184D] = { unicodeslot=0x184D, category='lo', description='MONGOLIAN LETTER TODO QA' },
+ [0x184E] = { unicodeslot=0x184E, category='lo', description='MONGOLIAN LETTER TODO GA' },
+ [0x184F] = { unicodeslot=0x184F, category='lo', description='MONGOLIAN LETTER TODO MA' },
+ [0x1850] = { unicodeslot=0x1850, category='lo', description='MONGOLIAN LETTER TODO TA' },
+ [0x1851] = { unicodeslot=0x1851, category='lo', description='MONGOLIAN LETTER TODO DA' },
+ [0x1852] = { unicodeslot=0x1852, category='lo', description='MONGOLIAN LETTER TODO CHA' },
+ [0x1853] = { unicodeslot=0x1853, category='lo', description='MONGOLIAN LETTER TODO JA' },
+ [0x1854] = { unicodeslot=0x1854, category='lo', description='MONGOLIAN LETTER TODO TSA' },
+ [0x1855] = { unicodeslot=0x1855, category='lo', description='MONGOLIAN LETTER TODO YA' },
+ [0x1856] = { unicodeslot=0x1856, category='lo', description='MONGOLIAN LETTER TODO WA' },
+ [0x1857] = { unicodeslot=0x1857, category='lo', description='MONGOLIAN LETTER TODO KA' },
+ [0x1858] = { unicodeslot=0x1858, category='lo', description='MONGOLIAN LETTER TODO GAA' },
+ [0x1859] = { unicodeslot=0x1859, category='lo', description='MONGOLIAN LETTER TODO HAA' },
+ [0x185A] = { unicodeslot=0x185A, category='lo', description='MONGOLIAN LETTER TODO JIA' },
+ [0x185B] = { unicodeslot=0x185B, category='lo', description='MONGOLIAN LETTER TODO NIA' },
+ [0x185C] = { unicodeslot=0x185C, category='lo', description='MONGOLIAN LETTER TODO DZA' },
+ [0x185D] = { unicodeslot=0x185D, category='lo', description='MONGOLIAN LETTER SIBE E' },
+ [0x185E] = { unicodeslot=0x185E, category='lo', description='MONGOLIAN LETTER SIBE I' },
+ [0x185F] = { unicodeslot=0x185F, category='lo', description='MONGOLIAN LETTER SIBE IY' },
+ [0x1860] = { unicodeslot=0x1860, category='lo', description='MONGOLIAN LETTER SIBE UE' },
+ [0x1861] = { unicodeslot=0x1861, category='lo', description='MONGOLIAN LETTER SIBE U' },
+ [0x1862] = { unicodeslot=0x1862, category='lo', description='MONGOLIAN LETTER SIBE ANG' },
+ [0x1863] = { unicodeslot=0x1863, category='lo', description='MONGOLIAN LETTER SIBE KA' },
+ [0x1864] = { unicodeslot=0x1864, category='lo', description='MONGOLIAN LETTER SIBE GA' },
+ [0x1865] = { unicodeslot=0x1865, category='lo', description='MONGOLIAN LETTER SIBE HA' },
+ [0x1866] = { unicodeslot=0x1866, category='lo', description='MONGOLIAN LETTER SIBE PA' },
+ [0x1867] = { unicodeslot=0x1867, category='lo', description='MONGOLIAN LETTER SIBE SHA' },
+ [0x1868] = { unicodeslot=0x1868, category='lo', description='MONGOLIAN LETTER SIBE TA' },
+ [0x1869] = { unicodeslot=0x1869, category='lo', description='MONGOLIAN LETTER SIBE DA' },
+ [0x186A] = { unicodeslot=0x186A, category='lo', description='MONGOLIAN LETTER SIBE JA' },
+ [0x186B] = { unicodeslot=0x186B, category='lo', description='MONGOLIAN LETTER SIBE FA' },
+ [0x186C] = { unicodeslot=0x186C, category='lo', description='MONGOLIAN LETTER SIBE GAA' },
+ [0x186D] = { unicodeslot=0x186D, category='lo', description='MONGOLIAN LETTER SIBE HAA' },
+ [0x186E] = { unicodeslot=0x186E, category='lo', description='MONGOLIAN LETTER SIBE TSA' },
+ [0x186F] = { unicodeslot=0x186F, category='lo', description='MONGOLIAN LETTER SIBE ZA' },
+ [0x1870] = { unicodeslot=0x1870, category='lo', description='MONGOLIAN LETTER SIBE RAA' },
+ [0x1871] = { unicodeslot=0x1871, category='lo', description='MONGOLIAN LETTER SIBE CHA' },
+ [0x1872] = { unicodeslot=0x1872, category='lo', description='MONGOLIAN LETTER SIBE ZHA' },
+ [0x1873] = { unicodeslot=0x1873, category='lo', description='MONGOLIAN LETTER MANCHU I' },
+ [0x1874] = { unicodeslot=0x1874, category='lo', description='MONGOLIAN LETTER MANCHU KA' },
+ [0x1875] = { unicodeslot=0x1875, category='lo', description='MONGOLIAN LETTER MANCHU RA' },
+ [0x1876] = { unicodeslot=0x1876, category='lo', description='MONGOLIAN LETTER MANCHU FA' },
+ [0x1877] = { unicodeslot=0x1877, category='lo', description='MONGOLIAN LETTER MANCHU ZHA' },
+ [0x1880] = { unicodeslot=0x1880, category='lo', description='MONGOLIAN LETTER ALI GALI ANUSVARA ONE' },
+ [0x1881] = { unicodeslot=0x1881, category='lo', description='MONGOLIAN LETTER ALI GALI VISARGA ONE' },
+ [0x1882] = { unicodeslot=0x1882, category='lo', description='MONGOLIAN LETTER ALI GALI DAMARU' },
+ [0x1883] = { unicodeslot=0x1883, category='lo', description='MONGOLIAN LETTER ALI GALI UBADAMA' },
+ [0x1884] = { unicodeslot=0x1884, category='lo', description='MONGOLIAN LETTER ALI GALI INVERTED UBADAMA' },
+ [0x1885] = { unicodeslot=0x1885, category='lo', description='MONGOLIAN LETTER ALI GALI BALUDA' },
+ [0x1886] = { unicodeslot=0x1886, category='lo', description='MONGOLIAN LETTER ALI GALI THREE BALUDA' },
+ [0x1887] = { unicodeslot=0x1887, category='lo', description='MONGOLIAN LETTER ALI GALI A' },
+ [0x1888] = { unicodeslot=0x1888, category='lo', description='MONGOLIAN LETTER ALI GALI I' },
+ [0x1889] = { unicodeslot=0x1889, category='lo', description='MONGOLIAN LETTER ALI GALI KA' },
+ [0x188A] = { unicodeslot=0x188A, category='lo', description='MONGOLIAN LETTER ALI GALI NGA' },
+ [0x188B] = { unicodeslot=0x188B, category='lo', description='MONGOLIAN LETTER ALI GALI CA' },
+ [0x188C] = { unicodeslot=0x188C, category='lo', description='MONGOLIAN LETTER ALI GALI TTA' },
+ [0x188D] = { unicodeslot=0x188D, category='lo', description='MONGOLIAN LETTER ALI GALI TTHA' },
+ [0x188E] = { unicodeslot=0x188E, category='lo', description='MONGOLIAN LETTER ALI GALI DDA' },
+ [0x188F] = { unicodeslot=0x188F, category='lo', description='MONGOLIAN LETTER ALI GALI NNA' },
+ [0x1890] = { unicodeslot=0x1890, category='lo', description='MONGOLIAN LETTER ALI GALI TA' },
+ [0x1891] = { unicodeslot=0x1891, category='lo', description='MONGOLIAN LETTER ALI GALI DA' },
+ [0x1892] = { unicodeslot=0x1892, category='lo', description='MONGOLIAN LETTER ALI GALI PA' },
+ [0x1893] = { unicodeslot=0x1893, category='lo', description='MONGOLIAN LETTER ALI GALI PHA' },
+ [0x1894] = { unicodeslot=0x1894, category='lo', description='MONGOLIAN LETTER ALI GALI SSA' },
+ [0x1895] = { unicodeslot=0x1895, category='lo', description='MONGOLIAN LETTER ALI GALI ZHA' },
+ [0x1896] = { unicodeslot=0x1896, category='lo', description='MONGOLIAN LETTER ALI GALI ZA' },
+ [0x1897] = { unicodeslot=0x1897, category='lo', description='MONGOLIAN LETTER ALI GALI AH' },
+ [0x1898] = { unicodeslot=0x1898, category='lo', description='MONGOLIAN LETTER TODO ALI GALI TA' },
+ [0x1899] = { unicodeslot=0x1899, category='lo', description='MONGOLIAN LETTER TODO ALI GALI ZHA' },
+ [0x189A] = { unicodeslot=0x189A, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI GHA' },
+ [0x189B] = { unicodeslot=0x189B, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI NGA' },
+ [0x189C] = { unicodeslot=0x189C, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI CA' },
+ [0x189D] = { unicodeslot=0x189D, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI JHA' },
+ [0x189E] = { unicodeslot=0x189E, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI TTA' },
+ [0x189F] = { unicodeslot=0x189F, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI DDHA' },
+ [0x18A0] = { unicodeslot=0x18A0, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI TA' },
+ [0x18A1] = { unicodeslot=0x18A1, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI DHA' },
+ [0x18A2] = { unicodeslot=0x18A2, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI SSA' },
+ [0x18A3] = { unicodeslot=0x18A3, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI CYA' },
+ [0x18A4] = { unicodeslot=0x18A4, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI ZHA' },
+ [0x18A5] = { unicodeslot=0x18A5, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI ZA' },
+ [0x18A6] = { unicodeslot=0x18A6, category='lo', description='MONGOLIAN LETTER ALI GALI HALF U' },
+ [0x18A7] = { unicodeslot=0x18A7, category='lo', description='MONGOLIAN LETTER ALI GALI HALF YA' },
+ [0x18A8] = { unicodeslot=0x18A8, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI BHA' },
+ [0x18A9] = { unicodeslot=0x18A9, category='mn', description='MONGOLIAN LETTER ALI GALI DAGALGA' },
+ [0x1900] = { unicodeslot=0x1900, category='lo', description='LIMBU VOWEL-CARRIER LETTER' },
+ [0x1901] = { unicodeslot=0x1901, category='lo', description='LIMBU LETTER KA' },
+ [0x1902] = { unicodeslot=0x1902, category='lo', description='LIMBU LETTER KHA' },
+ [0x1903] = { unicodeslot=0x1903, category='lo', description='LIMBU LETTER GA' },
+ [0x1904] = { unicodeslot=0x1904, category='lo', description='LIMBU LETTER GHA' },
+ [0x1905] = { unicodeslot=0x1905, category='lo', description='LIMBU LETTER NGA' },
+ [0x1906] = { unicodeslot=0x1906, category='lo', description='LIMBU LETTER CA' },
+ [0x1907] = { unicodeslot=0x1907, category='lo', description='LIMBU LETTER CHA' },
+ [0x1908] = { unicodeslot=0x1908, category='lo', description='LIMBU LETTER JA' },
+ [0x1909] = { unicodeslot=0x1909, category='lo', description='LIMBU LETTER JHA' },
+ [0x190A] = { unicodeslot=0x190A, category='lo', description='LIMBU LETTER YAN' },
+ [0x190B] = { unicodeslot=0x190B, category='lo', description='LIMBU LETTER TA' },
+ [0x190C] = { unicodeslot=0x190C, category='lo', description='LIMBU LETTER THA' },
+ [0x190D] = { unicodeslot=0x190D, category='lo', description='LIMBU LETTER DA' },
+ [0x190E] = { unicodeslot=0x190E, category='lo', description='LIMBU LETTER DHA' },
+ [0x190F] = { unicodeslot=0x190F, category='lo', description='LIMBU LETTER NA' },
+ [0x1910] = { unicodeslot=0x1910, category='lo', description='LIMBU LETTER PA' },
+ [0x1911] = { unicodeslot=0x1911, category='lo', description='LIMBU LETTER PHA' },
+ [0x1912] = { unicodeslot=0x1912, category='lo', description='LIMBU LETTER BA' },
+ [0x1913] = { unicodeslot=0x1913, category='lo', description='LIMBU LETTER BHA' },
+ [0x1914] = { unicodeslot=0x1914, category='lo', description='LIMBU LETTER MA' },
+ [0x1915] = { unicodeslot=0x1915, category='lo', description='LIMBU LETTER YA' },
+ [0x1916] = { unicodeslot=0x1916, category='lo', description='LIMBU LETTER RA' },
+ [0x1917] = { unicodeslot=0x1917, category='lo', description='LIMBU LETTER LA' },
+ [0x1918] = { unicodeslot=0x1918, category='lo', description='LIMBU LETTER WA' },
+ [0x1919] = { unicodeslot=0x1919, category='lo', description='LIMBU LETTER SHA' },
+ [0x191A] = { unicodeslot=0x191A, category='lo', description='LIMBU LETTER SSA' },
+ [0x191B] = { unicodeslot=0x191B, category='lo', description='LIMBU LETTER SA' },
+ [0x191C] = { unicodeslot=0x191C, category='lo', description='LIMBU LETTER HA' },
+ [0x1920] = { unicodeslot=0x1920, category='mn', description='LIMBU VOWEL SIGN A' },
+ [0x1921] = { unicodeslot=0x1921, category='mn', description='LIMBU VOWEL SIGN I' },
+ [0x1922] = { unicodeslot=0x1922, category='mn', description='LIMBU VOWEL SIGN U' },
+ [0x1923] = { unicodeslot=0x1923, category='mc', description='LIMBU VOWEL SIGN EE' },
+ [0x1924] = { unicodeslot=0x1924, category='mc', description='LIMBU VOWEL SIGN AI' },
+ [0x1925] = { unicodeslot=0x1925, category='mc', description='LIMBU VOWEL SIGN OO' },
+ [0x1926] = { unicodeslot=0x1926, category='mc', description='LIMBU VOWEL SIGN AU' },
+ [0x1927] = { unicodeslot=0x1927, category='mn', description='LIMBU VOWEL SIGN E' },
+ [0x1928] = { unicodeslot=0x1928, category='mn', description='LIMBU VOWEL SIGN O' },
+ [0x1929] = { unicodeslot=0x1929, category='mc', description='LIMBU SUBJOINED LETTER YA' },
+ [0x192A] = { unicodeslot=0x192A, category='mc', description='LIMBU SUBJOINED LETTER RA' },
+ [0x192B] = { unicodeslot=0x192B, category='mc', description='LIMBU SUBJOINED LETTER WA' },
+ [0x1930] = { unicodeslot=0x1930, category='mc', description='LIMBU SMALL LETTER KA' },
+ [0x1931] = { unicodeslot=0x1931, category='mc', description='LIMBU SMALL LETTER NGA' },
+ [0x1932] = { unicodeslot=0x1932, category='mn', description='LIMBU SMALL LETTER ANUSVARA' },
+ [0x1933] = { unicodeslot=0x1933, category='mc', description='LIMBU SMALL LETTER TA' },
+ [0x1934] = { unicodeslot=0x1934, category='mc', description='LIMBU SMALL LETTER NA' },
+ [0x1935] = { unicodeslot=0x1935, category='mc', description='LIMBU SMALL LETTER PA' },
+ [0x1936] = { unicodeslot=0x1936, category='mc', description='LIMBU SMALL LETTER MA' },
+ [0x1937] = { unicodeslot=0x1937, category='mc', description='LIMBU SMALL LETTER RA' },
+ [0x1938] = { unicodeslot=0x1938, category='mc', description='LIMBU SMALL LETTER LA' },
+ [0x1939] = { unicodeslot=0x1939, category='mn', description='LIMBU SIGN MUKPHRENG' },
+ [0x193A] = { unicodeslot=0x193A, category='mn', description='LIMBU SIGN KEMPHRENG' },
+ [0x193B] = { unicodeslot=0x193B, category='mn', description='LIMBU SIGN SA-I' },
+ [0x1940] = { unicodeslot=0x1940, category='so', description='LIMBU SIGN LOO' },
+ [0x1944] = { unicodeslot=0x1944, category='po', description='LIMBU EXCLAMATION MARK' },
+ [0x1945] = { unicodeslot=0x1945, category='po', description='LIMBU QUESTION MARK' },
+ [0x1946] = { unicodeslot=0x1946, category='nd', description='LIMBU DIGIT ZERO' },
+ [0x1947] = { unicodeslot=0x1947, category='nd', description='LIMBU DIGIT ONE' },
+ [0x1948] = { unicodeslot=0x1948, category='nd', description='LIMBU DIGIT TWO' },
+ [0x1949] = { unicodeslot=0x1949, category='nd', description='LIMBU DIGIT THREE' },
+ [0x194A] = { unicodeslot=0x194A, category='nd', description='LIMBU DIGIT FOUR' },
+ [0x194B] = { unicodeslot=0x194B, category='nd', description='LIMBU DIGIT FIVE' },
+ [0x194C] = { unicodeslot=0x194C, category='nd', description='LIMBU DIGIT SIX' },
+ [0x194D] = { unicodeslot=0x194D, category='nd', description='LIMBU DIGIT SEVEN' },
+ [0x194E] = { unicodeslot=0x194E, category='nd', description='LIMBU DIGIT EIGHT' },
+ [0x194F] = { unicodeslot=0x194F, category='nd', description='LIMBU DIGIT NINE' },
+ [0x1950] = { unicodeslot=0x1950, category='lo', description='TAI LE LETTER KA' },
+ [0x1951] = { unicodeslot=0x1951, category='lo', description='TAI LE LETTER XA' },
+ [0x1952] = { unicodeslot=0x1952, category='lo', description='TAI LE LETTER NGA' },
+ [0x1953] = { unicodeslot=0x1953, category='lo', description='TAI LE LETTER TSA' },
+ [0x1954] = { unicodeslot=0x1954, category='lo', description='TAI LE LETTER SA' },
+ [0x1955] = { unicodeslot=0x1955, category='lo', description='TAI LE LETTER YA' },
+ [0x1956] = { unicodeslot=0x1956, category='lo', description='TAI LE LETTER TA' },
+ [0x1957] = { unicodeslot=0x1957, category='lo', description='TAI LE LETTER THA' },
+ [0x1958] = { unicodeslot=0x1958, category='lo', description='TAI LE LETTER LA' },
+ [0x1959] = { unicodeslot=0x1959, category='lo', description='TAI LE LETTER PA' },
+ [0x195A] = { unicodeslot=0x195A, category='lo', description='TAI LE LETTER PHA' },
+ [0x195B] = { unicodeslot=0x195B, category='lo', description='TAI LE LETTER MA' },
+ [0x195C] = { unicodeslot=0x195C, category='lo', description='TAI LE LETTER FA' },
+ [0x195D] = { unicodeslot=0x195D, category='lo', description='TAI LE LETTER VA' },
+ [0x195E] = { unicodeslot=0x195E, category='lo', description='TAI LE LETTER HA' },
+ [0x195F] = { unicodeslot=0x195F, category='lo', description='TAI LE LETTER QA' },
+ [0x1960] = { unicodeslot=0x1960, category='lo', description='TAI LE LETTER KHA' },
+ [0x1961] = { unicodeslot=0x1961, category='lo', description='TAI LE LETTER TSHA' },
+ [0x1962] = { unicodeslot=0x1962, category='lo', description='TAI LE LETTER NA' },
+ [0x1963] = { unicodeslot=0x1963, category='lo', description='TAI LE LETTER A' },
+ [0x1964] = { unicodeslot=0x1964, category='lo', description='TAI LE LETTER I' },
+ [0x1965] = { unicodeslot=0x1965, category='lo', description='TAI LE LETTER EE' },
+ [0x1966] = { unicodeslot=0x1966, category='lo', description='TAI LE LETTER EH' },
+ [0x1967] = { unicodeslot=0x1967, category='lo', description='TAI LE LETTER U' },
+ [0x1968] = { unicodeslot=0x1968, category='lo', description='TAI LE LETTER OO' },
+ [0x1969] = { unicodeslot=0x1969, category='lo', description='TAI LE LETTER O' },
+ [0x196A] = { unicodeslot=0x196A, category='lo', description='TAI LE LETTER UE' },
+ [0x196B] = { unicodeslot=0x196B, category='lo', description='TAI LE LETTER E' },
+ [0x196C] = { unicodeslot=0x196C, category='lo', description='TAI LE LETTER AUE' },
+ [0x196D] = { unicodeslot=0x196D, category='lo', description='TAI LE LETTER AI' },
+ [0x1970] = { unicodeslot=0x1970, category='lo', description='TAI LE LETTER TONE-2' },
+ [0x1971] = { unicodeslot=0x1971, category='lo', description='TAI LE LETTER TONE-3' },
+ [0x1972] = { unicodeslot=0x1972, category='lo', description='TAI LE LETTER TONE-4' },
+ [0x1973] = { unicodeslot=0x1973, category='lo', description='TAI LE LETTER TONE-5' },
+ [0x1974] = { unicodeslot=0x1974, category='lo', description='TAI LE LETTER TONE-6' },
+ [0x1980] = { unicodeslot=0x1980, category='lo', description='NEW TAI LUE LETTER HIGH QA' },
+ [0x1981] = { unicodeslot=0x1981, category='lo', description='NEW TAI LUE LETTER LOW QA' },
+ [0x1982] = { unicodeslot=0x1982, category='lo', description='NEW TAI LUE LETTER HIGH KA' },
+ [0x1983] = { unicodeslot=0x1983, category='lo', description='NEW TAI LUE LETTER HIGH XA' },
+ [0x1984] = { unicodeslot=0x1984, category='lo', description='NEW TAI LUE LETTER HIGH NGA' },
+ [0x1985] = { unicodeslot=0x1985, category='lo', description='NEW TAI LUE LETTER LOW KA' },
+ [0x1986] = { unicodeslot=0x1986, category='lo', description='NEW TAI LUE LETTER LOW XA' },
+ [0x1987] = { unicodeslot=0x1987, category='lo', description='NEW TAI LUE LETTER LOW NGA' },
+ [0x1988] = { unicodeslot=0x1988, category='lo', description='NEW TAI LUE LETTER HIGH TSA' },
+ [0x1989] = { unicodeslot=0x1989, category='lo', description='NEW TAI LUE LETTER HIGH SA' },
+ [0x198A] = { unicodeslot=0x198A, category='lo', description='NEW TAI LUE LETTER HIGH YA' },
+ [0x198B] = { unicodeslot=0x198B, category='lo', description='NEW TAI LUE LETTER LOW TSA' },
+ [0x198C] = { unicodeslot=0x198C, category='lo', description='NEW TAI LUE LETTER LOW SA' },
+ [0x198D] = { unicodeslot=0x198D, category='lo', description='NEW TAI LUE LETTER LOW YA' },
+ [0x198E] = { unicodeslot=0x198E, category='lo', description='NEW TAI LUE LETTER HIGH TA' },
+ [0x198F] = { unicodeslot=0x198F, category='lo', description='NEW TAI LUE LETTER HIGH THA' },
+ [0x1990] = { unicodeslot=0x1990, category='lo', description='NEW TAI LUE LETTER HIGH NA' },
+ [0x1991] = { unicodeslot=0x1991, category='lo', description='NEW TAI LUE LETTER LOW TA' },
+ [0x1992] = { unicodeslot=0x1992, category='lo', description='NEW TAI LUE LETTER LOW THA' },
+ [0x1993] = { unicodeslot=0x1993, category='lo', description='NEW TAI LUE LETTER LOW NA' },
+ [0x1994] = { unicodeslot=0x1994, category='lo', description='NEW TAI LUE LETTER HIGH PA' },
+ [0x1995] = { unicodeslot=0x1995, category='lo', description='NEW TAI LUE LETTER HIGH PHA' },
+ [0x1996] = { unicodeslot=0x1996, category='lo', description='NEW TAI LUE LETTER HIGH MA' },
+ [0x1997] = { unicodeslot=0x1997, category='lo', description='NEW TAI LUE LETTER LOW PA' },
+ [0x1998] = { unicodeslot=0x1998, category='lo', description='NEW TAI LUE LETTER LOW PHA' },
+ [0x1999] = { unicodeslot=0x1999, category='lo', description='NEW TAI LUE LETTER LOW MA' },
+ [0x199A] = { unicodeslot=0x199A, category='lo', description='NEW TAI LUE LETTER HIGH FA' },
+ [0x199B] = { unicodeslot=0x199B, category='lo', description='NEW TAI LUE LETTER HIGH VA' },
+ [0x199C] = { unicodeslot=0x199C, category='lo', description='NEW TAI LUE LETTER HIGH LA' },
+ [0x199D] = { unicodeslot=0x199D, category='lo', description='NEW TAI LUE LETTER LOW FA' },
+ [0x199E] = { unicodeslot=0x199E, category='lo', description='NEW TAI LUE LETTER LOW VA' },
+ [0x199F] = { unicodeslot=0x199F, category='lo', description='NEW TAI LUE LETTER LOW LA' },
+ [0x19A0] = { unicodeslot=0x19A0, category='lo', description='NEW TAI LUE LETTER HIGH HA' },
+ [0x19A1] = { unicodeslot=0x19A1, category='lo', description='NEW TAI LUE LETTER HIGH DA' },
+ [0x19A2] = { unicodeslot=0x19A2, category='lo', description='NEW TAI LUE LETTER HIGH BA' },
+ [0x19A3] = { unicodeslot=0x19A3, category='lo', description='NEW TAI LUE LETTER LOW HA' },
+ [0x19A4] = { unicodeslot=0x19A4, category='lo', description='NEW TAI LUE LETTER LOW DA' },
+ [0x19A5] = { unicodeslot=0x19A5, category='lo', description='NEW TAI LUE LETTER LOW BA' },
+ [0x19A6] = { unicodeslot=0x19A6, category='lo', description='NEW TAI LUE LETTER HIGH KVA' },
+ [0x19A7] = { unicodeslot=0x19A7, category='lo', description='NEW TAI LUE LETTER HIGH XVA' },
+ [0x19A8] = { unicodeslot=0x19A8, category='lo', description='NEW TAI LUE LETTER LOW KVA' },
+ [0x19A9] = { unicodeslot=0x19A9, category='lo', description='NEW TAI LUE LETTER LOW XVA' },
+ [0x19B0] = { unicodeslot=0x19B0, category='mc', description='NEW TAI LUE VOWEL SIGN VOWEL SHORTENER' },
+ [0x19B1] = { unicodeslot=0x19B1, category='mc', description='NEW TAI LUE VOWEL SIGN AA' },
+ [0x19B2] = { unicodeslot=0x19B2, category='mc', description='NEW TAI LUE VOWEL SIGN II' },
+ [0x19B3] = { unicodeslot=0x19B3, category='mc', description='NEW TAI LUE VOWEL SIGN U' },
+ [0x19B4] = { unicodeslot=0x19B4, category='mc', description='NEW TAI LUE VOWEL SIGN UU' },
+ [0x19B5] = { unicodeslot=0x19B5, category='mc', description='NEW TAI LUE VOWEL SIGN E' },
+ [0x19B6] = { unicodeslot=0x19B6, category='mc', description='NEW TAI LUE VOWEL SIGN AE' },
+ [0x19B7] = { unicodeslot=0x19B7, category='mc', description='NEW TAI LUE VOWEL SIGN O' },
+ [0x19B8] = { unicodeslot=0x19B8, category='mc', description='NEW TAI LUE VOWEL SIGN OA' },
+ [0x19B9] = { unicodeslot=0x19B9, category='mc', description='NEW TAI LUE VOWEL SIGN UE' },
+ [0x19BA] = { unicodeslot=0x19BA, category='mc', description='NEW TAI LUE VOWEL SIGN AY' },
+ [0x19BB] = { unicodeslot=0x19BB, category='mc', description='NEW TAI LUE VOWEL SIGN AAY' },
+ [0x19BC] = { unicodeslot=0x19BC, category='mc', description='NEW TAI LUE VOWEL SIGN UY' },
+ [0x19BD] = { unicodeslot=0x19BD, category='mc', description='NEW TAI LUE VOWEL SIGN OY' },
+ [0x19BE] = { unicodeslot=0x19BE, category='mc', description='NEW TAI LUE VOWEL SIGN OAY' },
+ [0x19BF] = { unicodeslot=0x19BF, category='mc', description='NEW TAI LUE VOWEL SIGN UEY' },
+ [0x19C0] = { unicodeslot=0x19C0, category='mc', description='NEW TAI LUE VOWEL SIGN IY' },
+ [0x19C1] = { unicodeslot=0x19C1, category='lo', description='NEW TAI LUE LETTER FINAL V' },
+ [0x19C2] = { unicodeslot=0x19C2, category='lo', description='NEW TAI LUE LETTER FINAL NG' },
+ [0x19C3] = { unicodeslot=0x19C3, category='lo', description='NEW TAI LUE LETTER FINAL N' },
+ [0x19C4] = { unicodeslot=0x19C4, category='lo', description='NEW TAI LUE LETTER FINAL M' },
+ [0x19C5] = { unicodeslot=0x19C5, category='lo', description='NEW TAI LUE LETTER FINAL K' },
+ [0x19C6] = { unicodeslot=0x19C6, category='lo', description='NEW TAI LUE LETTER FINAL D' },
+ [0x19C7] = { unicodeslot=0x19C7, category='lo', description='NEW TAI LUE LETTER FINAL B' },
+ [0x19C8] = { unicodeslot=0x19C8, category='mc', description='NEW TAI LUE TONE MARK-1' },
+ [0x19C9] = { unicodeslot=0x19C9, category='mc', description='NEW TAI LUE TONE MARK-2' },
+ [0x19D0] = { unicodeslot=0x19D0, category='nd', description='NEW TAI LUE DIGIT ZERO' },
+ [0x19D1] = { unicodeslot=0x19D1, category='nd', description='NEW TAI LUE DIGIT ONE' },
+ [0x19D2] = { unicodeslot=0x19D2, category='nd', description='NEW TAI LUE DIGIT TWO' },
+ [0x19D3] = { unicodeslot=0x19D3, category='nd', description='NEW TAI LUE DIGIT THREE' },
+ [0x19D4] = { unicodeslot=0x19D4, category='nd', description='NEW TAI LUE DIGIT FOUR' },
+ [0x19D5] = { unicodeslot=0x19D5, category='nd', description='NEW TAI LUE DIGIT FIVE' },
+ [0x19D6] = { unicodeslot=0x19D6, category='nd', description='NEW TAI LUE DIGIT SIX' },
+ [0x19D7] = { unicodeslot=0x19D7, category='nd', description='NEW TAI LUE DIGIT SEVEN' },
+ [0x19D8] = { unicodeslot=0x19D8, category='nd', description='NEW TAI LUE DIGIT EIGHT' },
+ [0x19D9] = { unicodeslot=0x19D9, category='nd', description='NEW TAI LUE DIGIT NINE' },
+ [0x19DE] = { unicodeslot=0x19DE, category='po', description='NEW TAI LUE SIGN LAE' },
+ [0x19DF] = { unicodeslot=0x19DF, category='po', description='NEW TAI LUE SIGN LAEV' },
+ [0x19E0] = { unicodeslot=0x19E0, category='so', description='KHMER SYMBOL PATHAMASAT' },
+ [0x19E1] = { unicodeslot=0x19E1, category='so', description='KHMER SYMBOL MUOY KOET' },
+ [0x19E2] = { unicodeslot=0x19E2, category='so', description='KHMER SYMBOL PII KOET' },
+ [0x19E3] = { unicodeslot=0x19E3, category='so', description='KHMER SYMBOL BEI KOET' },
+ [0x19E4] = { unicodeslot=0x19E4, category='so', description='KHMER SYMBOL BUON KOET' },
+ [0x19E5] = { unicodeslot=0x19E5, category='so', description='KHMER SYMBOL PRAM KOET' },
+ [0x19E6] = { unicodeslot=0x19E6, category='so', description='KHMER SYMBOL PRAM-MUOY KOET' },
+ [0x19E7] = { unicodeslot=0x19E7, category='so', description='KHMER SYMBOL PRAM-PII KOET' },
+ [0x19E8] = { unicodeslot=0x19E8, category='so', description='KHMER SYMBOL PRAM-BEI KOET' },
+ [0x19E9] = { unicodeslot=0x19E9, category='so', description='KHMER SYMBOL PRAM-BUON KOET' },
+ [0x19EA] = { unicodeslot=0x19EA, category='so', description='KHMER SYMBOL DAP KOET' },
+ [0x19EB] = { unicodeslot=0x19EB, category='so', description='KHMER SYMBOL DAP-MUOY KOET' },
+ [0x19EC] = { unicodeslot=0x19EC, category='so', description='KHMER SYMBOL DAP-PII KOET' },
+ [0x19ED] = { unicodeslot=0x19ED, category='so', description='KHMER SYMBOL DAP-BEI KOET' },
+ [0x19EE] = { unicodeslot=0x19EE, category='so', description='KHMER SYMBOL DAP-BUON KOET' },
+ [0x19EF] = { unicodeslot=0x19EF, category='so', description='KHMER SYMBOL DAP-PRAM KOET' },
+ [0x19F0] = { unicodeslot=0x19F0, category='so', description='KHMER SYMBOL TUTEYASAT' },
+ [0x19F1] = { unicodeslot=0x19F1, category='so', description='KHMER SYMBOL MUOY ROC' },
+ [0x19F2] = { unicodeslot=0x19F2, category='so', description='KHMER SYMBOL PII ROC' },
+ [0x19F3] = { unicodeslot=0x19F3, category='so', description='KHMER SYMBOL BEI ROC' },
+ [0x19F4] = { unicodeslot=0x19F4, category='so', description='KHMER SYMBOL BUON ROC' },
+ [0x19F5] = { unicodeslot=0x19F5, category='so', description='KHMER SYMBOL PRAM ROC' },
+ [0x19F6] = { unicodeslot=0x19F6, category='so', description='KHMER SYMBOL PRAM-MUOY ROC' },
+ [0x19F7] = { unicodeslot=0x19F7, category='so', description='KHMER SYMBOL PRAM-PII ROC' },
+ [0x19F8] = { unicodeslot=0x19F8, category='so', description='KHMER SYMBOL PRAM-BEI ROC' },
+ [0x19F9] = { unicodeslot=0x19F9, category='so', description='KHMER SYMBOL PRAM-BUON ROC' },
+ [0x19FA] = { unicodeslot=0x19FA, category='so', description='KHMER SYMBOL DAP ROC' },
+ [0x19FB] = { unicodeslot=0x19FB, category='so', description='KHMER SYMBOL DAP-MUOY ROC' },
+ [0x19FC] = { unicodeslot=0x19FC, category='so', description='KHMER SYMBOL DAP-PII ROC' },
+ [0x19FD] = { unicodeslot=0x19FD, category='so', description='KHMER SYMBOL DAP-BEI ROC' },
+ [0x19FE] = { unicodeslot=0x19FE, category='so', description='KHMER SYMBOL DAP-BUON ROC' },
+ [0x19FF] = { unicodeslot=0x19FF, category='so', description='KHMER SYMBOL DAP-PRAM ROC' },
+ [0x1A00] = { unicodeslot=0x1A00, category='lo', description='BUGINESE LETTER KA' },
+ [0x1A01] = { unicodeslot=0x1A01, category='lo', description='BUGINESE LETTER GA' },
+ [0x1A02] = { unicodeslot=0x1A02, category='lo', description='BUGINESE LETTER NGA' },
+ [0x1A03] = { unicodeslot=0x1A03, category='lo', description='BUGINESE LETTER NGKA' },
+ [0x1A04] = { unicodeslot=0x1A04, category='lo', description='BUGINESE LETTER PA' },
+ [0x1A05] = { unicodeslot=0x1A05, category='lo', description='BUGINESE LETTER BA' },
+ [0x1A06] = { unicodeslot=0x1A06, category='lo', description='BUGINESE LETTER MA' },
+ [0x1A07] = { unicodeslot=0x1A07, category='lo', description='BUGINESE LETTER MPA' },
+ [0x1A08] = { unicodeslot=0x1A08, category='lo', description='BUGINESE LETTER TA' },
+ [0x1A09] = { unicodeslot=0x1A09, category='lo', description='BUGINESE LETTER DA' },
+ [0x1A0A] = { unicodeslot=0x1A0A, category='lo', description='BUGINESE LETTER NA' },
+ [0x1A0B] = { unicodeslot=0x1A0B, category='lo', description='BUGINESE LETTER NRA' },
+ [0x1A0C] = { unicodeslot=0x1A0C, category='lo', description='BUGINESE LETTER CA' },
+ [0x1A0D] = { unicodeslot=0x1A0D, category='lo', description='BUGINESE LETTER JA' },
+ [0x1A0E] = { unicodeslot=0x1A0E, category='lo', description='BUGINESE LETTER NYA' },
+ [0x1A0F] = { unicodeslot=0x1A0F, category='lo', description='BUGINESE LETTER NYCA' },
+ [0x1A10] = { unicodeslot=0x1A10, category='lo', description='BUGINESE LETTER YA' },
+ [0x1A11] = { unicodeslot=0x1A11, category='lo', description='BUGINESE LETTER RA' },
+ [0x1A12] = { unicodeslot=0x1A12, category='lo', description='BUGINESE LETTER LA' },
+ [0x1A13] = { unicodeslot=0x1A13, category='lo', description='BUGINESE LETTER VA' },
+ [0x1A14] = { unicodeslot=0x1A14, category='lo', description='BUGINESE LETTER SA' },
+ [0x1A15] = { unicodeslot=0x1A15, category='lo', description='BUGINESE LETTER A' },
+ [0x1A16] = { unicodeslot=0x1A16, category='lo', description='BUGINESE LETTER HA' },
+ [0x1A17] = { unicodeslot=0x1A17, category='mn', description='BUGINESE VOWEL SIGN I' },
+ [0x1A18] = { unicodeslot=0x1A18, category='mn', description='BUGINESE VOWEL SIGN U' },
+ [0x1A19] = { unicodeslot=0x1A19, category='mc', description='BUGINESE VOWEL SIGN E' },
+ [0x1A1A] = { unicodeslot=0x1A1A, category='mc', description='BUGINESE VOWEL SIGN O' },
+ [0x1A1B] = { unicodeslot=0x1A1B, category='mc', description='BUGINESE VOWEL SIGN AE' },
+ [0x1A1E] = { unicodeslot=0x1A1E, category='po', description='BUGINESE PALLAWA' },
+ [0x1A1F] = { unicodeslot=0x1A1F, category='po', description='BUGINESE END OF SECTION' },
+ [0x1B00] = { unicodeslot=0x1B00, category='mn', description='BALINESE SIGN ULU RICEM' },
+ [0x1B01] = { unicodeslot=0x1B01, category='mn', description='BALINESE SIGN ULU CANDRA' },
+ [0x1B02] = { unicodeslot=0x1B02, category='mn', description='BALINESE SIGN CECEK' },
+ [0x1B03] = { unicodeslot=0x1B03, category='mn', description='BALINESE SIGN SURANG' },
+ [0x1B04] = { unicodeslot=0x1B04, category='mc', description='BALINESE SIGN BISAH' },
+ [0x1B05] = { unicodeslot=0x1B05, category='lo', description='BALINESE LETTER AKARA' },
+ [0x1B06] = { unicodeslot=0x1B06, category='lo', description='BALINESE LETTER AKARA TEDUNG', specials={'char',0x1B05,0x1B35} },
+ [0x1B07] = { unicodeslot=0x1B07, category='lo', description='BALINESE LETTER IKARA' },
+ [0x1B08] = { unicodeslot=0x1B08, category='lo', description='BALINESE LETTER IKARA TEDUNG', specials={'char',0x1B07,0x1B35} },
+ [0x1B09] = { unicodeslot=0x1B09, category='lo', description='BALINESE LETTER UKARA' },
+ [0x1B0A] = { unicodeslot=0x1B0A, category='lo', description='BALINESE LETTER UKARA TEDUNG', specials={'char',0x1B09,0x1B35} },
+ [0x1B0B] = { unicodeslot=0x1B0B, category='lo', description='BALINESE LETTER RA REPA' },
+ [0x1B0C] = { unicodeslot=0x1B0C, category='lo', description='BALINESE LETTER RA REPA TEDUNG', specials={'char',0x1B0B,0x1B35} },
+ [0x1B0D] = { unicodeslot=0x1B0D, category='lo', description='BALINESE LETTER LA LENGA' },
+ [0x1B0E] = { unicodeslot=0x1B0E, category='lo', description='BALINESE LETTER LA LENGA TEDUNG', specials={'char',0x1B0D,0x1B35} },
+ [0x1B0F] = { unicodeslot=0x1B0F, category='lo', description='BALINESE LETTER EKARA' },
+ [0x1B10] = { unicodeslot=0x1B10, category='lo', description='BALINESE LETTER AIKARA' },
+ [0x1B11] = { unicodeslot=0x1B11, category='lo', description='BALINESE LETTER OKARA' },
+ [0x1B12] = { unicodeslot=0x1B12, category='lo', description='BALINESE LETTER OKARA TEDUNG', specials={'char',0x1B11,0x1B35} },
+ [0x1B13] = { unicodeslot=0x1B13, category='lo', description='BALINESE LETTER KA' },
+ [0x1B14] = { unicodeslot=0x1B14, category='lo', description='BALINESE LETTER KA MAHAPRANA' },
+ [0x1B15] = { unicodeslot=0x1B15, category='lo', description='BALINESE LETTER GA' },
+ [0x1B16] = { unicodeslot=0x1B16, category='lo', description='BALINESE LETTER GA GORA' },
+ [0x1B17] = { unicodeslot=0x1B17, category='lo', description='BALINESE LETTER NGA' },
+ [0x1B18] = { unicodeslot=0x1B18, category='lo', description='BALINESE LETTER CA' },
+ [0x1B19] = { unicodeslot=0x1B19, category='lo', description='BALINESE LETTER CA LACA' },
+ [0x1B1A] = { unicodeslot=0x1B1A, category='lo', description='BALINESE LETTER JA' },
+ [0x1B1B] = { unicodeslot=0x1B1B, category='lo', description='BALINESE LETTER JA JERA' },
+ [0x1B1C] = { unicodeslot=0x1B1C, category='lo', description='BALINESE LETTER NYA' },
+ [0x1B1D] = { unicodeslot=0x1B1D, category='lo', description='BALINESE LETTER TA LATIK' },
+ [0x1B1E] = { unicodeslot=0x1B1E, category='lo', description='BALINESE LETTER TA MURDA MAHAPRANA' },
+ [0x1B1F] = { unicodeslot=0x1B1F, category='lo', description='BALINESE LETTER DA MURDA ALPAPRANA' },
+ [0x1B20] = { unicodeslot=0x1B20, category='lo', description='BALINESE LETTER DA MURDA MAHAPRANA' },
+ [0x1B21] = { unicodeslot=0x1B21, category='lo', description='BALINESE LETTER NA RAMBAT' },
+ [0x1B22] = { unicodeslot=0x1B22, category='lo', description='BALINESE LETTER TA' },
+ [0x1B23] = { unicodeslot=0x1B23, category='lo', description='BALINESE LETTER TA TAWA' },
+ [0x1B24] = { unicodeslot=0x1B24, category='lo', description='BALINESE LETTER DA' },
+ [0x1B25] = { unicodeslot=0x1B25, category='lo', description='BALINESE LETTER DA MADU' },
+ [0x1B26] = { unicodeslot=0x1B26, category='lo', description='BALINESE LETTER NA' },
+ [0x1B27] = { unicodeslot=0x1B27, category='lo', description='BALINESE LETTER PA' },
+ [0x1B28] = { unicodeslot=0x1B28, category='lo', description='BALINESE LETTER PA KAPAL' },
+ [0x1B29] = { unicodeslot=0x1B29, category='lo', description='BALINESE LETTER BA' },
+ [0x1B2A] = { unicodeslot=0x1B2A, category='lo', description='BALINESE LETTER BA KEMBANG' },
+ [0x1B2B] = { unicodeslot=0x1B2B, category='lo', description='BALINESE LETTER MA' },
+ [0x1B2C] = { unicodeslot=0x1B2C, category='lo', description='BALINESE LETTER YA' },
+ [0x1B2D] = { unicodeslot=0x1B2D, category='lo', description='BALINESE LETTER RA' },
+ [0x1B2E] = { unicodeslot=0x1B2E, category='lo', description='BALINESE LETTER LA' },
+ [0x1B2F] = { unicodeslot=0x1B2F, category='lo', description='BALINESE LETTER WA' },
+ [0x1B30] = { unicodeslot=0x1B30, category='lo', description='BALINESE LETTER SA SAGA' },
+ [0x1B31] = { unicodeslot=0x1B31, category='lo', description='BALINESE LETTER SA SAPA' },
+ [0x1B32] = { unicodeslot=0x1B32, category='lo', description='BALINESE LETTER SA' },
+ [0x1B33] = { unicodeslot=0x1B33, category='lo', description='BALINESE LETTER HA' },
+ [0x1B34] = { unicodeslot=0x1B34, category='mn', description='BALINESE SIGN REREKAN' },
+ [0x1B35] = { unicodeslot=0x1B35, category='mc', description='BALINESE VOWEL SIGN TEDUNG' },
+ [0x1B36] = { unicodeslot=0x1B36, category='mn', description='BALINESE VOWEL SIGN ULU' },
+ [0x1B37] = { unicodeslot=0x1B37, category='mn', description='BALINESE VOWEL SIGN ULU SARI' },
+ [0x1B38] = { unicodeslot=0x1B38, category='mn', description='BALINESE VOWEL SIGN SUKU' },
+ [0x1B39] = { unicodeslot=0x1B39, category='mn', description='BALINESE VOWEL SIGN SUKU ILUT' },
+ [0x1B3A] = { unicodeslot=0x1B3A, category='mn', description='BALINESE VOWEL SIGN RA REPA' },
+ [0x1B3B] = { unicodeslot=0x1B3B, category='mc', description='BALINESE VOWEL SIGN RA REPA TEDUNG', specials={'char',0x1B3A,0x1B35} },
+ [0x1B3C] = { unicodeslot=0x1B3C, category='mn', description='BALINESE VOWEL SIGN LA LENGA' },
+ [0x1B3D] = { unicodeslot=0x1B3D, category='mc', description='BALINESE VOWEL SIGN LA LENGA TEDUNG', specials={'char',0x1B3C,0x1B35} },
+ [0x1B3E] = { unicodeslot=0x1B3E, category='mc', description='BALINESE VOWEL SIGN TALING' },
+ [0x1B3F] = { unicodeslot=0x1B3F, category='mc', description='BALINESE VOWEL SIGN TALING REPA' },
+ [0x1B40] = { unicodeslot=0x1B40, category='mc', description='BALINESE VOWEL SIGN TALING TEDUNG', specials={'char',0x1B3E,0x1B35} },
+ [0x1B41] = { unicodeslot=0x1B41, category='mc', description='BALINESE VOWEL SIGN TALING REPA TEDUNG', specials={'char',0x1B3F,0x1B35} },
+ [0x1B42] = { unicodeslot=0x1B42, category='mn', description='BALINESE VOWEL SIGN PEPET' },
+ [0x1B43] = { unicodeslot=0x1B43, category='mc', description='BALINESE VOWEL SIGN PEPET TEDUNG', specials={'char',0x1B42,0x1B35} },
+ [0x1B44] = { unicodeslot=0x1B44, category='mc', description='BALINESE ADEG ADEG' },
+ [0x1B45] = { unicodeslot=0x1B45, category='lo', description='BALINESE LETTER KAF SASAK' },
+ [0x1B46] = { unicodeslot=0x1B46, category='lo', description='BALINESE LETTER KHOT SASAK' },
+ [0x1B47] = { unicodeslot=0x1B47, category='lo', description='BALINESE LETTER TZIR SASAK' },
+ [0x1B48] = { unicodeslot=0x1B48, category='lo', description='BALINESE LETTER EF SASAK' },
+ [0x1B49] = { unicodeslot=0x1B49, category='lo', description='BALINESE LETTER VE SASAK' },
+ [0x1B4A] = { unicodeslot=0x1B4A, category='lo', description='BALINESE LETTER ZAL SASAK' },
+ [0x1B4B] = { unicodeslot=0x1B4B, category='lo', description='BALINESE LETTER ASYURA SASAK' },
+ [0x1B50] = { unicodeslot=0x1B50, category='nd', description='BALINESE DIGIT ZERO' },
+ [0x1B51] = { unicodeslot=0x1B51, category='nd', description='BALINESE DIGIT ONE' },
+ [0x1B52] = { unicodeslot=0x1B52, category='nd', description='BALINESE DIGIT TWO' },
+ [0x1B53] = { unicodeslot=0x1B53, category='nd', description='BALINESE DIGIT THREE' },
+ [0x1B54] = { unicodeslot=0x1B54, category='nd', description='BALINESE DIGIT FOUR' },
+ [0x1B55] = { unicodeslot=0x1B55, category='nd', description='BALINESE DIGIT FIVE' },
+ [0x1B56] = { unicodeslot=0x1B56, category='nd', description='BALINESE DIGIT SIX' },
+ [0x1B57] = { unicodeslot=0x1B57, category='nd', description='BALINESE DIGIT SEVEN' },
+ [0x1B58] = { unicodeslot=0x1B58, category='nd', description='BALINESE DIGIT EIGHT' },
+ [0x1B59] = { unicodeslot=0x1B59, category='nd', description='BALINESE DIGIT NINE' },
+ [0x1B5A] = { unicodeslot=0x1B5A, category='po', description='BALINESE PANTI' },
+ [0x1B5B] = { unicodeslot=0x1B5B, category='po', description='BALINESE PAMADA' },
+ [0x1B5C] = { unicodeslot=0x1B5C, category='po', description='BALINESE WINDU' },
+ [0x1B5D] = { unicodeslot=0x1B5D, category='po', description='BALINESE CARIK PAMUNGKAH' },
+ [0x1B5E] = { unicodeslot=0x1B5E, category='po', description='BALINESE CARIK SIKI' },
+ [0x1B5F] = { unicodeslot=0x1B5F, category='po', description='BALINESE CARIK PAREREN' },
+ [0x1B60] = { unicodeslot=0x1B60, category='po', description='BALINESE PAMENENG' },
+ [0x1B61] = { unicodeslot=0x1B61, category='so', description='BALINESE MUSICAL SYMBOL DONG' },
+ [0x1B62] = { unicodeslot=0x1B62, category='so', description='BALINESE MUSICAL SYMBOL DENG' },
+ [0x1B63] = { unicodeslot=0x1B63, category='so', description='BALINESE MUSICAL SYMBOL DUNG' },
+ [0x1B64] = { unicodeslot=0x1B64, category='so', description='BALINESE MUSICAL SYMBOL DANG' },
+ [0x1B65] = { unicodeslot=0x1B65, category='so', description='BALINESE MUSICAL SYMBOL DANG SURANG' },
+ [0x1B66] = { unicodeslot=0x1B66, category='so', description='BALINESE MUSICAL SYMBOL DING' },
+ [0x1B67] = { unicodeslot=0x1B67, category='so', description='BALINESE MUSICAL SYMBOL DAENG' },
+ [0x1B68] = { unicodeslot=0x1B68, category='so', description='BALINESE MUSICAL SYMBOL DEUNG' },
+ [0x1B69] = { unicodeslot=0x1B69, category='so', description='BALINESE MUSICAL SYMBOL DAING' },
+ [0x1B6A] = { unicodeslot=0x1B6A, category='so', description='BALINESE MUSICAL SYMBOL DANG GEDE' },
+ [0x1B6B] = { unicodeslot=0x1B6B, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING TEGEH' },
+ [0x1B6C] = { unicodeslot=0x1B6C, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING ENDEP' },
+ [0x1B6D] = { unicodeslot=0x1B6D, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPUL' },
+ [0x1B6E] = { unicodeslot=0x1B6E, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPLI' },
+ [0x1B6F] = { unicodeslot=0x1B6F, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING JEGOGAN' },
+ [0x1B70] = { unicodeslot=0x1B70, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN' },
+ [0x1B71] = { unicodeslot=0x1B71, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN' },
+ [0x1B72] = { unicodeslot=0x1B72, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING BENDE' },
+ [0x1B73] = { unicodeslot=0x1B73, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING GONG' },
+ [0x1B74] = { unicodeslot=0x1B74, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG' },
+ [0x1B75] = { unicodeslot=0x1B75, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG' },
+ [0x1B76] = { unicodeslot=0x1B76, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK' },
+ [0x1B77] = { unicodeslot=0x1B77, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK' },
+ [0x1B78] = { unicodeslot=0x1B78, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG' },
+ [0x1B79] = { unicodeslot=0x1B79, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG' },
+ [0x1B7A] = { unicodeslot=0x1B7A, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK' },
+ [0x1B7B] = { unicodeslot=0x1B7B, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK' },
+ [0x1B7C] = { unicodeslot=0x1B7C, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING' },
+ [0x1D00] = { unicodeslot=0x1D00, category='ll', description='LATIN LETTER SMALL CAPITAL A' },
+ [0x1D01] = { unicodeslot=0x1D01, category='ll', description='LATIN LETTER SMALL CAPITAL AE' },
+ [0x1D02] = { unicodeslot=0x1D02, category='ll', description='LATIN SMALL LETTER TURNED AE' },
+ [0x1D03] = { unicodeslot=0x1D03, category='ll', description='LATIN LETTER SMALL CAPITAL BARRED B' },
+ [0x1D04] = { unicodeslot=0x1D04, category='ll', description='LATIN LETTER SMALL CAPITAL C' },
+ [0x1D05] = { unicodeslot=0x1D05, category='ll', description='LATIN LETTER SMALL CAPITAL D' },
+ [0x1D06] = { unicodeslot=0x1D06, category='ll', description='LATIN LETTER SMALL CAPITAL ETH' },
+ [0x1D07] = { unicodeslot=0x1D07, category='ll', description='LATIN LETTER SMALL CAPITAL E' },
+ [0x1D08] = { unicodeslot=0x1D08, category='ll', description='LATIN SMALL LETTER TURNED OPEN E' },
+ [0x1D09] = { unicodeslot=0x1D09, category='ll', description='LATIN SMALL LETTER TURNED I' },
+ [0x1D0A] = { unicodeslot=0x1D0A, category='ll', description='LATIN LETTER SMALL CAPITAL J' },
+ [0x1D0B] = { unicodeslot=0x1D0B, category='ll', description='LATIN LETTER SMALL CAPITAL K' },
+ [0x1D0C] = { unicodeslot=0x1D0C, category='ll', description='LATIN LETTER SMALL CAPITAL L WITH STROKE' },
+ [0x1D0D] = { unicodeslot=0x1D0D, category='ll', description='LATIN LETTER SMALL CAPITAL M' },
+ [0x1D0E] = { unicodeslot=0x1D0E, category='ll', description='LATIN LETTER SMALL CAPITAL REVERSED N' },
+ [0x1D0F] = { unicodeslot=0x1D0F, category='ll', description='LATIN LETTER SMALL CAPITAL O' },
+ [0x1D10] = { unicodeslot=0x1D10, category='ll', description='LATIN LETTER SMALL CAPITAL OPEN O' },
+ [0x1D11] = { unicodeslot=0x1D11, category='ll', description='LATIN SMALL LETTER SIDEWAYS O' },
+ [0x1D12] = { unicodeslot=0x1D12, category='ll', description='LATIN SMALL LETTER SIDEWAYS OPEN O' },
+ [0x1D13] = { unicodeslot=0x1D13, category='ll', description='LATIN SMALL LETTER SIDEWAYS O WITH STROKE' },
+ [0x1D14] = { unicodeslot=0x1D14, category='ll', description='LATIN SMALL LETTER TURNED OE' },
+ [0x1D15] = { unicodeslot=0x1D15, category='ll', description='LATIN LETTER SMALL CAPITAL OU' },
+ [0x1D16] = { unicodeslot=0x1D16, category='ll', description='LATIN SMALL LETTER TOP HALF O' },
+ [0x1D17] = { unicodeslot=0x1D17, category='ll', description='LATIN SMALL LETTER BOTTOM HALF O' },
+ [0x1D18] = { unicodeslot=0x1D18, category='ll', description='LATIN LETTER SMALL CAPITAL P' },
+ [0x1D19] = { unicodeslot=0x1D19, category='ll', description='LATIN LETTER SMALL CAPITAL REVERSED R' },
+ [0x1D1A] = { unicodeslot=0x1D1A, category='ll', description='LATIN LETTER SMALL CAPITAL TURNED R' },
+ [0x1D1B] = { unicodeslot=0x1D1B, category='ll', description='LATIN LETTER SMALL CAPITAL T' },
+ [0x1D1C] = { unicodeslot=0x1D1C, category='ll', description='LATIN LETTER SMALL CAPITAL U' },
+ [0x1D1D] = { unicodeslot=0x1D1D, category='ll', description='LATIN SMALL LETTER SIDEWAYS U' },
+ [0x1D1E] = { unicodeslot=0x1D1E, category='ll', description='LATIN SMALL LETTER SIDEWAYS DIAERESIZED U' },
+ [0x1D1F] = { unicodeslot=0x1D1F, category='ll', description='LATIN SMALL LETTER SIDEWAYS TURNED M' },
+ [0x1D20] = { unicodeslot=0x1D20, category='ll', description='LATIN LETTER SMALL CAPITAL V' },
+ [0x1D21] = { unicodeslot=0x1D21, category='ll', description='LATIN LETTER SMALL CAPITAL W' },
+ [0x1D22] = { unicodeslot=0x1D22, category='ll', description='LATIN LETTER SMALL CAPITAL Z' },
+ [0x1D23] = { unicodeslot=0x1D23, category='ll', description='LATIN LETTER SMALL CAPITAL EZH' },
+ [0x1D24] = { unicodeslot=0x1D24, category='ll', description='LATIN LETTER VOICED LARYNGEAL SPIRANT' },
+ [0x1D25] = { unicodeslot=0x1D25, category='ll', description='LATIN LETTER AIN' },
+ [0x1D26] = { unicodeslot=0x1D26, category='ll', description='GREEK LETTER SMALL CAPITAL GAMMA' },
+ [0x1D27] = { unicodeslot=0x1D27, category='ll', description='GREEK LETTER SMALL CAPITAL LAMDA' },
+ [0x1D28] = { unicodeslot=0x1D28, category='ll', description='GREEK LETTER SMALL CAPITAL PI' },
+ [0x1D29] = { unicodeslot=0x1D29, category='ll', description='GREEK LETTER SMALL CAPITAL RHO' },
+ [0x1D2A] = { unicodeslot=0x1D2A, category='ll', description='GREEK LETTER SMALL CAPITAL PSI' },
+ [0x1D2B] = { unicodeslot=0x1D2B, category='ll', description='CYRILLIC LETTER SMALL CAPITAL EL' },
+ [0x1D2C] = { unicodeslot=0x1D2C, category='lm', description='MODIFIER LETTER CAPITAL A', specials={'super',0x0041} },
+ [0x1D2D] = { unicodeslot=0x1D2D, category='lm', description='MODIFIER LETTER CAPITAL AE', specials={'super',0x00C6} },
+ [0x1D2E] = { unicodeslot=0x1D2E, category='lm', description='MODIFIER LETTER CAPITAL B', specials={'super',0x0042} },
+ [0x1D2F] = { unicodeslot=0x1D2F, category='lm', description='MODIFIER LETTER CAPITAL BARRED B' },
+ [0x1D30] = { unicodeslot=0x1D30, category='lm', description='MODIFIER LETTER CAPITAL D', specials={'super',0x0044} },
+ [0x1D31] = { unicodeslot=0x1D31, category='lm', description='MODIFIER LETTER CAPITAL E', specials={'super',0x0045} },
+ [0x1D32] = { unicodeslot=0x1D32, category='lm', description='MODIFIER LETTER CAPITAL REVERSED E', specials={'super',0x018E} },
+ [0x1D33] = { unicodeslot=0x1D33, category='lm', description='MODIFIER LETTER CAPITAL G', specials={'super',0x0047} },
+ [0x1D34] = { unicodeslot=0x1D34, category='lm', description='MODIFIER LETTER CAPITAL H', specials={'super',0x0048} },
+ [0x1D35] = { unicodeslot=0x1D35, category='lm', description='MODIFIER LETTER CAPITAL I', specials={'super',0x0049} },
+ [0x1D36] = { unicodeslot=0x1D36, category='lm', description='MODIFIER LETTER CAPITAL J', specials={'super',0x004A} },
+ [0x1D37] = { unicodeslot=0x1D37, category='lm', description='MODIFIER LETTER CAPITAL K', specials={'super',0x004B} },
+ [0x1D38] = { unicodeslot=0x1D38, category='lm', description='MODIFIER LETTER CAPITAL L', specials={'super',0x004C} },
+ [0x1D39] = { unicodeslot=0x1D39, category='lm', description='MODIFIER LETTER CAPITAL M', specials={'super',0x004D} },
+ [0x1D3A] = { unicodeslot=0x1D3A, category='lm', description='MODIFIER LETTER CAPITAL N', specials={'super',0x004E} },
+ [0x1D3B] = { unicodeslot=0x1D3B, category='lm', description='MODIFIER LETTER CAPITAL REVERSED N' },
+ [0x1D3C] = { unicodeslot=0x1D3C, category='lm', description='MODIFIER LETTER CAPITAL O', specials={'super',0x004F} },
+ [0x1D3D] = { unicodeslot=0x1D3D, category='lm', description='MODIFIER LETTER CAPITAL OU', specials={'super',0x0222} },
+ [0x1D3E] = { unicodeslot=0x1D3E, category='lm', description='MODIFIER LETTER CAPITAL P', specials={'super',0x0050} },
+ [0x1D3F] = { unicodeslot=0x1D3F, category='lm', description='MODIFIER LETTER CAPITAL R', specials={'super',0x0052} },
+ [0x1D40] = { unicodeslot=0x1D40, category='lm', description='MODIFIER LETTER CAPITAL T', specials={'super',0x0054} },
+ [0x1D41] = { unicodeslot=0x1D41, category='lm', description='MODIFIER LETTER CAPITAL U', specials={'super',0x0055} },
+ [0x1D42] = { unicodeslot=0x1D42, category='lm', description='MODIFIER LETTER CAPITAL W', specials={'super',0x0057} },
+ [0x1D43] = { unicodeslot=0x1D43, category='lm', description='MODIFIER LETTER SMALL A', specials={'super',0x0061} },
+ [0x1D44] = { unicodeslot=0x1D44, category='lm', description='MODIFIER LETTER SMALL TURNED A', specials={'super',0x0250} },
+ [0x1D45] = { unicodeslot=0x1D45, category='lm', description='MODIFIER LETTER SMALL ALPHA', specials={'super',0x0251} },
+ [0x1D46] = { unicodeslot=0x1D46, category='lm', description='MODIFIER LETTER SMALL TURNED AE', specials={'super',0x1D02} },
+ [0x1D47] = { unicodeslot=0x1D47, category='lm', description='MODIFIER LETTER SMALL B', specials={'super',0x0062} },
+ [0x1D48] = { unicodeslot=0x1D48, category='lm', description='MODIFIER LETTER SMALL D', specials={'super',0x0064} },
+ [0x1D49] = { unicodeslot=0x1D49, category='lm', description='MODIFIER LETTER SMALL E', specials={'super',0x0065} },
+ [0x1D4A] = { unicodeslot=0x1D4A, category='lm', description='MODIFIER LETTER SMALL SCHWA', specials={'super',0x0259} },
+ [0x1D4B] = { unicodeslot=0x1D4B, category='lm', description='MODIFIER LETTER SMALL OPEN E', specials={'super',0x025B} },
+ [0x1D4C] = { unicodeslot=0x1D4C, category='lm', description='MODIFIER LETTER SMALL TURNED OPEN E', specials={'super',0x025C} },
+ [0x1D4D] = { unicodeslot=0x1D4D, category='lm', description='MODIFIER LETTER SMALL G', specials={'super',0x0067} },
+ [0x1D4E] = { unicodeslot=0x1D4E, category='lm', description='MODIFIER LETTER SMALL TURNED I' },
+ [0x1D4F] = { unicodeslot=0x1D4F, category='lm', description='MODIFIER LETTER SMALL K', specials={'super',0x006B} },
+ [0x1D50] = { unicodeslot=0x1D50, category='lm', description='MODIFIER LETTER SMALL M', specials={'super',0x006D} },
+ [0x1D51] = { unicodeslot=0x1D51, category='lm', description='MODIFIER LETTER SMALL ENG', specials={'super',0x014B} },
+ [0x1D52] = { unicodeslot=0x1D52, category='lm', description='MODIFIER LETTER SMALL O', specials={'super',0x006F} },
+ [0x1D53] = { unicodeslot=0x1D53, category='lm', description='MODIFIER LETTER SMALL OPEN O', specials={'super',0x0254} },
+ [0x1D54] = { unicodeslot=0x1D54, category='lm', description='MODIFIER LETTER SMALL TOP HALF O', specials={'super',0x1D16} },
+ [0x1D55] = { unicodeslot=0x1D55, category='lm', description='MODIFIER LETTER SMALL BOTTOM HALF O', specials={'super',0x1D17} },
+ [0x1D56] = { unicodeslot=0x1D56, category='lm', description='MODIFIER LETTER SMALL P', specials={'super',0x0070} },
+ [0x1D57] = { unicodeslot=0x1D57, category='lm', description='MODIFIER LETTER SMALL T', specials={'super',0x0074} },
+ [0x1D58] = { unicodeslot=0x1D58, category='lm', description='MODIFIER LETTER SMALL U', specials={'super',0x0075} },
+ [0x1D59] = { unicodeslot=0x1D59, category='lm', description='MODIFIER LETTER SMALL SIDEWAYS U', specials={'super',0x1D1D} },
+ [0x1D5A] = { unicodeslot=0x1D5A, category='lm', description='MODIFIER LETTER SMALL TURNED M', specials={'super',0x026F} },
+ [0x1D5B] = { unicodeslot=0x1D5B, category='lm', description='MODIFIER LETTER SMALL V', specials={'super',0x0076} },
+ [0x1D5C] = { unicodeslot=0x1D5C, category='lm', description='MODIFIER LETTER SMALL AIN', specials={'super',0x1D25} },
+ [0x1D5D] = { unicodeslot=0x1D5D, category='lm', description='MODIFIER LETTER SMALL BETA', specials={'super',0x03B2} },
+ [0x1D5E] = { unicodeslot=0x1D5E, category='lm', description='MODIFIER LETTER SMALL GREEK GAMMA', specials={'super',0x03B3} },
+ [0x1D5F] = { unicodeslot=0x1D5F, category='lm', description='MODIFIER LETTER SMALL DELTA', specials={'super',0x03B4} },
+ [0x1D60] = { unicodeslot=0x1D60, category='lm', description='MODIFIER LETTER SMALL GREEK PHI', specials={'super',0x03C6} },
+ [0x1D61] = { unicodeslot=0x1D61, category='lm', description='MODIFIER LETTER SMALL CHI', specials={'super',0x03C7} },
+ [0x1D62] = { unicodeslot=0x1D62, category='ll', description='LATIN SUBSCRIPT SMALL LETTER I', specials={'sub',0x0069} },
+ [0x1D63] = { unicodeslot=0x1D63, category='ll', description='LATIN SUBSCRIPT SMALL LETTER R', specials={'sub',0x0072} },
+ [0x1D64] = { unicodeslot=0x1D64, category='ll', description='LATIN SUBSCRIPT SMALL LETTER U', specials={'sub',0x0075} },
+ [0x1D65] = { unicodeslot=0x1D65, category='ll', description='LATIN SUBSCRIPT SMALL LETTER V', specials={'sub',0x0076} },
+ [0x1D66] = { unicodeslot=0x1D66, category='ll', description='GREEK SUBSCRIPT SMALL LETTER BETA', specials={'sub',0x03B2} },
+ [0x1D67] = { unicodeslot=0x1D67, category='ll', description='GREEK SUBSCRIPT SMALL LETTER GAMMA', specials={'sub',0x03B3} },
+ [0x1D68] = { unicodeslot=0x1D68, category='ll', description='GREEK SUBSCRIPT SMALL LETTER RHO', specials={'sub',0x03C1} },
+ [0x1D69] = { unicodeslot=0x1D69, category='ll', description='GREEK SUBSCRIPT SMALL LETTER PHI', specials={'sub',0x03C6} },
+ [0x1D6A] = { unicodeslot=0x1D6A, category='ll', description='GREEK SUBSCRIPT SMALL LETTER CHI', specials={'sub',0x03C7} },
+ [0x1D6B] = { unicodeslot=0x1D6B, category='ll', description='LATIN SMALL LETTER UE' },
+ [0x1D6C] = { unicodeslot=0x1D6C, category='ll', description='LATIN SMALL LETTER B WITH MIDDLE TILDE', shcode=0x0062 },
+ [0x1D6D] = { unicodeslot=0x1D6D, category='ll', description='LATIN SMALL LETTER D WITH MIDDLE TILDE', shcode=0x0064 },
+ [0x1D6E] = { unicodeslot=0x1D6E, category='ll', description='LATIN SMALL LETTER F WITH MIDDLE TILDE', shcode=0x0066 },
+ [0x1D6F] = { unicodeslot=0x1D6F, category='ll', description='LATIN SMALL LETTER M WITH MIDDLE TILDE', shcode=0x006D },
+ [0x1D70] = { unicodeslot=0x1D70, category='ll', description='LATIN SMALL LETTER N WITH MIDDLE TILDE', shcode=0x006E },
+ [0x1D71] = { unicodeslot=0x1D71, category='ll', description='LATIN SMALL LETTER P WITH MIDDLE TILDE', shcode=0x0070 },
+ [0x1D72] = { unicodeslot=0x1D72, category='ll', description='LATIN SMALL LETTER R WITH MIDDLE TILDE', shcode=0x0072 },
+ [0x1D73] = { unicodeslot=0x1D73, category='ll', description='LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE', shcode=0x0072 },
+ [0x1D74] = { unicodeslot=0x1D74, category='ll', description='LATIN SMALL LETTER S WITH MIDDLE TILDE', shcode=0x0073 },
+ [0x1D75] = { unicodeslot=0x1D75, category='ll', description='LATIN SMALL LETTER T WITH MIDDLE TILDE', shcode=0x0074 },
+ [0x1D76] = { unicodeslot=0x1D76, category='ll', description='LATIN SMALL LETTER Z WITH MIDDLE TILDE', shcode=0x007A },
+ [0x1D77] = { unicodeslot=0x1D77, category='ll', description='LATIN SMALL LETTER TURNED G' },
+ [0x1D78] = { unicodeslot=0x1D78, category='lm', description='MODIFIER LETTER CYRILLIC EN', specials={'super',0x043D} },
+ [0x1D79] = { unicodeslot=0x1D79, category='ll', description='LATIN SMALL LETTER INSULAR G' },
+ [0x1D7A] = { unicodeslot=0x1D7A, category='ll', description='LATIN SMALL LETTER TH WITH STRIKETHROUGH' },
+ [0x1D7B] = { unicodeslot=0x1D7B, category='ll', description='LATIN SMALL CAPITAL LETTER I WITH STROKE' },
+ [0x1D7C] = { unicodeslot=0x1D7C, category='ll', description='LATIN SMALL LETTER IOTA WITH STROKE', shcode=0x0269 },
+ [0x1D7D] = { unicodeslot=0x1D7D, category='ll', description='LATIN SMALL LETTER P WITH STROKE', shcode=0x0070, uccode=0x2C63 },
+ [0x1D7E] = { unicodeslot=0x1D7E, category='ll', description='LATIN SMALL CAPITAL LETTER U WITH STROKE' },
+ [0x1D7F] = { unicodeslot=0x1D7F, category='ll', description='LATIN SMALL LETTER UPSILON WITH STROKE', shcode=0x028A },
+ [0x1D80] = { unicodeslot=0x1D80, category='ll', description='LATIN SMALL LETTER B WITH PALATAL HOOK', shcode=0x0062 },
+ [0x1D81] = { unicodeslot=0x1D81, category='ll', description='LATIN SMALL LETTER D WITH PALATAL HOOK', shcode=0x0064 },
+ [0x1D82] = { unicodeslot=0x1D82, category='ll', description='LATIN SMALL LETTER F WITH PALATAL HOOK', shcode=0x0066 },
+ [0x1D83] = { unicodeslot=0x1D83, category='ll', description='LATIN SMALL LETTER G WITH PALATAL HOOK', shcode=0x0067 },
+ [0x1D84] = { unicodeslot=0x1D84, category='ll', description='LATIN SMALL LETTER K WITH PALATAL HOOK', shcode=0x006B },
+ [0x1D85] = { unicodeslot=0x1D85, category='ll', description='LATIN SMALL LETTER L WITH PALATAL HOOK', shcode=0x006C },
+ [0x1D86] = { unicodeslot=0x1D86, category='ll', description='LATIN SMALL LETTER M WITH PALATAL HOOK', shcode=0x006D },
+ [0x1D87] = { unicodeslot=0x1D87, category='ll', description='LATIN SMALL LETTER N WITH PALATAL HOOK', shcode=0x006E },
+ [0x1D88] = { unicodeslot=0x1D88, category='ll', description='LATIN SMALL LETTER P WITH PALATAL HOOK', shcode=0x0070 },
+ [0x1D89] = { unicodeslot=0x1D89, category='ll', description='LATIN SMALL LETTER R WITH PALATAL HOOK', shcode=0x0072 },
+ [0x1D8A] = { unicodeslot=0x1D8A, category='ll', description='LATIN SMALL LETTER S WITH PALATAL HOOK', shcode=0x0073 },
+ [0x1D8B] = { unicodeslot=0x1D8B, category='ll', description='LATIN SMALL LETTER ESH WITH PALATAL HOOK', shcode=0x0283 },
+ [0x1D8C] = { unicodeslot=0x1D8C, category='ll', description='LATIN SMALL LETTER V WITH PALATAL HOOK', shcode=0x0076 },
+ [0x1D8D] = { unicodeslot=0x1D8D, category='ll', description='LATIN SMALL LETTER X WITH PALATAL HOOK', shcode=0x0078 },
+ [0x1D8E] = { unicodeslot=0x1D8E, category='ll', description='LATIN SMALL LETTER Z WITH PALATAL HOOK', shcode=0x007A },
+ [0x1D8F] = { unicodeslot=0x1D8F, category='ll', description='LATIN SMALL LETTER A WITH RETROFLEX HOOK', shcode=0x0061 },
+ [0x1D90] = { unicodeslot=0x1D90, category='ll', description='LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK', shcode=0x0251 },
+ [0x1D91] = { unicodeslot=0x1D91, category='ll', description='LATIN SMALL LETTER D WITH HOOK AND TAIL', shcode=0x0064 },
+ [0x1D92] = { unicodeslot=0x1D92, category='ll', description='LATIN SMALL LETTER E WITH RETROFLEX HOOK', shcode=0x0065 },
+ [0x1D93] = { unicodeslot=0x1D93, category='ll', description='LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK' },
+ [0x1D94] = { unicodeslot=0x1D94, category='ll', description='LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK' },
+ [0x1D95] = { unicodeslot=0x1D95, category='ll', description='LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK', shcode=0x0259 },
+ [0x1D96] = { unicodeslot=0x1D96, category='ll', description='LATIN SMALL LETTER I WITH RETROFLEX HOOK', shcode=0x0069 },
+ [0x1D97] = { unicodeslot=0x1D97, category='ll', description='LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK' },
+ [0x1D98] = { unicodeslot=0x1D98, category='ll', description='LATIN SMALL LETTER ESH WITH RETROFLEX HOOK', shcode=0x0283 },
+ [0x1D99] = { unicodeslot=0x1D99, category='ll', description='LATIN SMALL LETTER U WITH RETROFLEX HOOK', shcode=0x0075 },
+ [0x1D9A] = { unicodeslot=0x1D9A, category='ll', description='LATIN SMALL LETTER EZH WITH RETROFLEX HOOK', shcode=0x0292 },
+ [0x1D9B] = { unicodeslot=0x1D9B, category='lm', description='MODIFIER LETTER SMALL TURNED ALPHA', specials={'super',0x0252} },
+ [0x1D9C] = { unicodeslot=0x1D9C, category='lm', description='MODIFIER LETTER SMALL C', specials={'super',0x0063} },
+ [0x1D9D] = { unicodeslot=0x1D9D, category='lm', description='MODIFIER LETTER SMALL C WITH CURL', specials={'super',0x0255} },
+ [0x1D9E] = { unicodeslot=0x1D9E, category='lm', description='MODIFIER LETTER SMALL ETH', specials={'super',0x00F0} },
+ [0x1D9F] = { unicodeslot=0x1D9F, category='lm', description='MODIFIER LETTER SMALL REVERSED OPEN E', specials={'super',0x025C} },
+ [0x1DA0] = { unicodeslot=0x1DA0, category='lm', description='MODIFIER LETTER SMALL F', specials={'super',0x0066} },
+ [0x1DA1] = { unicodeslot=0x1DA1, category='lm', description='MODIFIER LETTER SMALL DOTLESS J WITH STROKE', specials={'super',0x025F} },
+ [0x1DA2] = { unicodeslot=0x1DA2, category='lm', description='MODIFIER LETTER SMALL SCRIPT G', specials={'super',0x0261} },
+ [0x1DA3] = { unicodeslot=0x1DA3, category='lm', description='MODIFIER LETTER SMALL TURNED H', specials={'super',0x0265} },
+ [0x1DA4] = { unicodeslot=0x1DA4, category='lm', description='MODIFIER LETTER SMALL I WITH STROKE', specials={'super',0x0268} },
+ [0x1DA5] = { unicodeslot=0x1DA5, category='lm', description='MODIFIER LETTER SMALL IOTA', specials={'super',0x0269} },
+ [0x1DA6] = { unicodeslot=0x1DA6, category='lm', description='MODIFIER LETTER SMALL CAPITAL I', specials={'super',0x026A} },
+ [0x1DA7] = { unicodeslot=0x1DA7, category='lm', description='MODIFIER LETTER SMALL CAPITAL I WITH STROKE', specials={'super',0x1D7B} },
+ [0x1DA8] = { unicodeslot=0x1DA8, category='lm', description='MODIFIER LETTER SMALL J WITH CROSSED-TAIL', specials={'super',0x029D} },
+ [0x1DA9] = { unicodeslot=0x1DA9, category='lm', description='MODIFIER LETTER SMALL L WITH RETROFLEX HOOK', specials={'super',0x026D} },
+ [0x1DAA] = { unicodeslot=0x1DAA, category='lm', description='MODIFIER LETTER SMALL L WITH PALATAL HOOK', specials={'super',0x1D85} },
+ [0x1DAB] = { unicodeslot=0x1DAB, category='lm', description='MODIFIER LETTER SMALL CAPITAL L', specials={'super',0x029F} },
+ [0x1DAC] = { unicodeslot=0x1DAC, category='lm', description='MODIFIER LETTER SMALL M WITH HOOK', specials={'super',0x0271} },
+ [0x1DAD] = { unicodeslot=0x1DAD, category='lm', description='MODIFIER LETTER SMALL TURNED M WITH LONG LEG', specials={'super',0x0270} },
+ [0x1DAE] = { unicodeslot=0x1DAE, category='lm', description='MODIFIER LETTER SMALL N WITH LEFT HOOK', specials={'super',0x0272} },
+ [0x1DAF] = { unicodeslot=0x1DAF, category='lm', description='MODIFIER LETTER SMALL N WITH RETROFLEX HOOK', specials={'super',0x0273} },
+ [0x1DB0] = { unicodeslot=0x1DB0, category='lm', description='MODIFIER LETTER SMALL CAPITAL N', specials={'super',0x0274} },
+ [0x1DB1] = { unicodeslot=0x1DB1, category='lm', description='MODIFIER LETTER SMALL BARRED O', specials={'super',0x0275} },
+ [0x1DB2] = { unicodeslot=0x1DB2, category='lm', description='MODIFIER LETTER SMALL PHI', specials={'super',0x0278} },
+ [0x1DB3] = { unicodeslot=0x1DB3, category='lm', description='MODIFIER LETTER SMALL S WITH HOOK', specials={'super',0x0282} },
+ [0x1DB4] = { unicodeslot=0x1DB4, category='lm', description='MODIFIER LETTER SMALL ESH', specials={'super',0x0283} },
+ [0x1DB5] = { unicodeslot=0x1DB5, category='lm', description='MODIFIER LETTER SMALL T WITH PALATAL HOOK', specials={'super',0x01AB} },
+ [0x1DB6] = { unicodeslot=0x1DB6, category='lm', description='MODIFIER LETTER SMALL U BAR', specials={'super',0x0289} },
+ [0x1DB7] = { unicodeslot=0x1DB7, category='lm', description='MODIFIER LETTER SMALL UPSILON', specials={'super',0x028A} },
+ [0x1DB8] = { unicodeslot=0x1DB8, category='lm', description='MODIFIER LETTER SMALL CAPITAL U', specials={'super',0x1D1C} },
+ [0x1DB9] = { unicodeslot=0x1DB9, category='lm', description='MODIFIER LETTER SMALL V WITH HOOK', specials={'super',0x028B} },
+ [0x1DBA] = { unicodeslot=0x1DBA, category='lm', description='MODIFIER LETTER SMALL TURNED V', specials={'super',0x028C} },
+ [0x1DBB] = { unicodeslot=0x1DBB, category='lm', description='MODIFIER LETTER SMALL Z', specials={'super',0x007A} },
+ [0x1DBC] = { unicodeslot=0x1DBC, category='lm', description='MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK', specials={'super',0x0290} },
+ [0x1DBD] = { unicodeslot=0x1DBD, category='lm', description='MODIFIER LETTER SMALL Z WITH CURL', specials={'super',0x0291} },
+ [0x1DBE] = { unicodeslot=0x1DBE, category='lm', description='MODIFIER LETTER SMALL EZH', specials={'super',0x0292} },
+ [0x1DBF] = { unicodeslot=0x1DBF, category='lm', description='MODIFIER LETTER SMALL THETA', specials={'super',0x03B8} },
+ [0x1DC0] = { unicodeslot=0x1DC0, category='mn', description='COMBINING DOTTED GRAVE ACCENT' },
+ [0x1DC1] = { unicodeslot=0x1DC1, category='mn', description='COMBINING DOTTED ACUTE ACCENT' },
+ [0x1DC2] = { unicodeslot=0x1DC2, category='mn', description='COMBINING SNAKE BELOW' },
+ [0x1DC3] = { unicodeslot=0x1DC3, category='mn', description='COMBINING SUSPENSION MARK' },
+ [0x1DC4] = { unicodeslot=0x1DC4, category='mn', description='COMBINING MACRON-ACUTE' },
+ [0x1DC5] = { unicodeslot=0x1DC5, category='mn', description='COMBINING GRAVE-MACRON' },
+ [0x1DC6] = { unicodeslot=0x1DC6, category='mn', description='COMBINING MACRON-GRAVE' },
+ [0x1DC7] = { unicodeslot=0x1DC7, category='mn', description='COMBINING ACUTE-MACRON' },
+ [0x1DC8] = { unicodeslot=0x1DC8, category='mn', description='COMBINING GRAVE-ACUTE-GRAVE' },
+ [0x1DC9] = { unicodeslot=0x1DC9, category='mn', description='COMBINING ACUTE-GRAVE-ACUTE' },
+ [0x1DCA] = { unicodeslot=0x1DCA, category='mn', description='COMBINING LATIN SMALL LETTER R BELOW' },
+ [0x1DFE] = { unicodeslot=0x1DFE, category='mn', description='COMBINING LEFT ARROWHEAD ABOVE' },
+ [0x1DFF] = { unicodeslot=0x1DFF, category='mn', description='COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW' },
+ [0x1E00] = { unicodeslot=0x1E00, category='lu', description='LATIN CAPITAL LETTER A WITH RING BELOW', shcode=0x0041, lccode=0x1E01, specials={'char',0x0041,0x0325} },
+ [0x1E01] = { unicodeslot=0x1E01, category='ll', description='LATIN SMALL LETTER A WITH RING BELOW', shcode=0x0061, uccode=0x1E00, specials={'char',0x0061,0x0325} },
+ [0x1E02] = { unicodeslot=0x1E02, category='lu', description='LATIN CAPITAL LETTER B WITH DOT ABOVE', shcode=0x0042, lccode=0x1E03, specials={'char',0x0042,0x0307} },
+ [0x1E03] = { unicodeslot=0x1E03, category='ll', description='LATIN SMALL LETTER B WITH DOT ABOVE', shcode=0x0062, uccode=0x1E02, specials={'char',0x0062,0x0307} },
+ [0x1E04] = { unicodeslot=0x1E04, category='lu', description='LATIN CAPITAL LETTER B WITH DOT BELOW', shcode=0x0042, lccode=0x1E05, specials={'char',0x0042,0x0323} },
+ [0x1E05] = { unicodeslot=0x1E05, category='ll', description='LATIN SMALL LETTER B WITH DOT BELOW', shcode=0x0062, uccode=0x1E04, specials={'char',0x0062,0x0323} },
+ [0x1E06] = { unicodeslot=0x1E06, category='lu', description='LATIN CAPITAL LETTER B WITH LINE BELOW', shcode=0x0042, lccode=0x1E07, specials={'char',0x0042,0x0331} },
+ [0x1E07] = { unicodeslot=0x1E07, category='ll', description='LATIN SMALL LETTER B WITH LINE BELOW', shcode=0x0062, uccode=0x1E06, specials={'char',0x0062,0x0331} },
+ [0x1E08] = { unicodeslot=0x1E08, category='lu', description='LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE', shcode=0x0043, lccode=0x1E09, specials={'char',0x00C7,0x0301} },
+ [0x1E09] = { unicodeslot=0x1E09, category='ll', description='LATIN SMALL LETTER C WITH CEDILLA AND ACUTE', shcode=0x0063, uccode=0x1E08, specials={'char',0x00E7,0x0301} },
+ [0x1E0A] = { unicodeslot=0x1E0A, category='lu', description='LATIN CAPITAL LETTER D WITH DOT ABOVE', shcode=0x0044, lccode=0x1E0B, specials={'char',0x0044,0x0307} },
+ [0x1E0B] = { unicodeslot=0x1E0B, category='ll', description='LATIN SMALL LETTER D WITH DOT ABOVE', shcode=0x0064, uccode=0x1E0A, specials={'char',0x0064,0x0307} },
+ [0x1E0C] = { unicodeslot=0x1E0C, category='lu', description='LATIN CAPITAL LETTER D WITH DOT BELOW', shcode=0x0044, lccode=0x1E0D, specials={'char',0x0044,0x0323} },
+ [0x1E0D] = { unicodeslot=0x1E0D, category='ll', description='LATIN SMALL LETTER D WITH DOT BELOW', shcode=0x0064, uccode=0x1E0C, specials={'char',0x0064,0x0323} },
+ [0x1E0E] = { unicodeslot=0x1E0E, category='lu', description='LATIN CAPITAL LETTER D WITH LINE BELOW', shcode=0x0044, lccode=0x1E0F, specials={'char',0x0044,0x0331} },
+ [0x1E0F] = { unicodeslot=0x1E0F, category='ll', description='LATIN SMALL LETTER D WITH LINE BELOW', shcode=0x0064, uccode=0x1E0E, specials={'char',0x0064,0x0331} },
+ [0x1E10] = { unicodeslot=0x1E10, category='lu', description='LATIN CAPITAL LETTER D WITH CEDILLA', shcode=0x0044, lccode=0x1E11, specials={'char',0x0044,0x0327} },
+ [0x1E11] = { unicodeslot=0x1E11, category='ll', description='LATIN SMALL LETTER D WITH CEDILLA', shcode=0x0064, uccode=0x1E10, specials={'char',0x0064,0x0327} },
+ [0x1E12] = { unicodeslot=0x1E12, category='lu', description='LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW', shcode=0x0044, lccode=0x1E13, specials={'char',0x0044,0x032D} },
+ [0x1E13] = { unicodeslot=0x1E13, category='ll', description='LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW', shcode=0x0064, uccode=0x1E12, specials={'char',0x0064,0x032D} },
+ [0x1E14] = { unicodeslot=0x1E14, category='lu', description='LATIN CAPITAL LETTER E WITH MACRON AND GRAVE', shcode=0x0045, lccode=0x1E15, specials={'char',0x0112,0x0300} },
+ [0x1E15] = { unicodeslot=0x1E15, category='ll', description='LATIN SMALL LETTER E WITH MACRON AND GRAVE', shcode=0x0065, uccode=0x1E14, specials={'char',0x0113,0x0300} },
+ [0x1E16] = { unicodeslot=0x1E16, category='lu', description='LATIN CAPITAL LETTER E WITH MACRON AND ACUTE', shcode=0x0045, lccode=0x1E17, specials={'char',0x0112,0x0301} },
+ [0x1E17] = { unicodeslot=0x1E17, category='ll', description='LATIN SMALL LETTER E WITH MACRON AND ACUTE', shcode=0x0065, uccode=0x1E16, specials={'char',0x0113,0x0301} },
+ [0x1E18] = { unicodeslot=0x1E18, category='lu', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW', shcode=0x0045, lccode=0x1E19, specials={'char',0x0045,0x032D} },
+ [0x1E19] = { unicodeslot=0x1E19, category='ll', description='LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW', shcode=0x0065, uccode=0x1E18, specials={'char',0x0065,0x032D} },
+ [0x1E1A] = { unicodeslot=0x1E1A, category='lu', description='LATIN CAPITAL LETTER E WITH TILDE BELOW', shcode=0x0045, lccode=0x1E1B, specials={'char',0x0045,0x0330} },
+ [0x1E1B] = { unicodeslot=0x1E1B, category='ll', description='LATIN SMALL LETTER E WITH TILDE BELOW', shcode=0x0065, uccode=0x1E1A, specials={'char',0x0065,0x0330} },
+ [0x1E1C] = { unicodeslot=0x1E1C, category='lu', description='LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE', shcode=0x0045, lccode=0x1E1D, specials={'char',0x0228,0x0306} },
+ [0x1E1D] = { unicodeslot=0x1E1D, category='ll', description='LATIN SMALL LETTER E WITH CEDILLA AND BREVE', shcode=0x0065, uccode=0x1E1C, specials={'char',0x0229,0x0306} },
+ [0x1E1E] = { unicodeslot=0x1E1E, category='lu', description='LATIN CAPITAL LETTER F WITH DOT ABOVE', shcode=0x0046, lccode=0x1E1F, specials={'char',0x0046,0x0307} },
+ [0x1E1F] = { unicodeslot=0x1E1F, category='ll', description='LATIN SMALL LETTER F WITH DOT ABOVE', shcode=0x0066, uccode=0x1E1E, specials={'char',0x0066,0x0307} },
+ [0x1E20] = { unicodeslot=0x1E20, category='lu', description='LATIN CAPITAL LETTER G WITH MACRON', shcode=0x0047, lccode=0x1E21, specials={'char',0x0047,0x0304} },
+ [0x1E21] = { unicodeslot=0x1E21, category='ll', description='LATIN SMALL LETTER G WITH MACRON', shcode=0x0067, uccode=0x1E20, specials={'char',0x0067,0x0304} },
+ [0x1E22] = { unicodeslot=0x1E22, category='lu', description='LATIN CAPITAL LETTER H WITH DOT ABOVE', shcode=0x0048, lccode=0x1E23, specials={'char',0x0048,0x0307} },
+ [0x1E23] = { unicodeslot=0x1E23, category='ll', description='LATIN SMALL LETTER H WITH DOT ABOVE', shcode=0x0068, uccode=0x1E22, specials={'char',0x0068,0x0307} },
+ [0x1E24] = { unicodeslot=0x1E24, category='lu', description='LATIN CAPITAL LETTER H WITH DOT BELOW', shcode=0x0048, lccode=0x1E25, specials={'char',0x0048,0x0323} },
+ [0x1E25] = { unicodeslot=0x1E25, category='ll', description='LATIN SMALL LETTER H WITH DOT BELOW', shcode=0x0068, uccode=0x1E24, specials={'char',0x0068,0x0323} },
+ [0x1E26] = { unicodeslot=0x1E26, category='lu', description='LATIN CAPITAL LETTER H WITH DIAERESIS', shcode=0x0048, lccode=0x1E27, specials={'char',0x0048,0x0308} },
+ [0x1E27] = { unicodeslot=0x1E27, category='ll', description='LATIN SMALL LETTER H WITH DIAERESIS', shcode=0x0068, uccode=0x1E26, specials={'char',0x0068,0x0308} },
+ [0x1E28] = { unicodeslot=0x1E28, category='lu', description='LATIN CAPITAL LETTER H WITH CEDILLA', shcode=0x0048, lccode=0x1E29, specials={'char',0x0048,0x0327} },
+ [0x1E29] = { unicodeslot=0x1E29, category='ll', description='LATIN SMALL LETTER H WITH CEDILLA', shcode=0x0068, uccode=0x1E28, specials={'char',0x0068,0x0327} },
+ [0x1E2A] = { unicodeslot=0x1E2A, category='lu', description='LATIN CAPITAL LETTER H WITH BREVE BELOW', shcode=0x0048, lccode=0x1E2B, specials={'char',0x0048,0x032E} },
+ [0x1E2B] = { unicodeslot=0x1E2B, category='ll', description='LATIN SMALL LETTER H WITH BREVE BELOW', shcode=0x0068, uccode=0x1E2A, specials={'char',0x0068,0x032E} },
+ [0x1E2C] = { unicodeslot=0x1E2C, category='lu', description='LATIN CAPITAL LETTER I WITH TILDE BELOW', shcode=0x0049, lccode=0x1E2D, specials={'char',0x0049,0x0330} },
+ [0x1E2D] = { unicodeslot=0x1E2D, category='ll', description='LATIN SMALL LETTER I WITH TILDE BELOW', shcode=0x0069, uccode=0x1E2C, specials={'char',0x0069,0x0330} },
+ [0x1E2E] = { unicodeslot=0x1E2E, category='lu', description='LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE', shcode=0x0049, lccode=0x1E2F, specials={'char',0x00CF,0x0301} },
+ [0x1E2F] = { unicodeslot=0x1E2F, category='ll', description='LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE', shcode=0x0069, uccode=0x1E2E, specials={'char',0x00EF,0x0301} },
+ [0x1E30] = { unicodeslot=0x1E30, category='lu', description='LATIN CAPITAL LETTER K WITH ACUTE', shcode=0x004B, lccode=0x1E31, specials={'char',0x004B,0x0301} },
+ [0x1E31] = { unicodeslot=0x1E31, category='ll', description='LATIN SMALL LETTER K WITH ACUTE', shcode=0x006B, uccode=0x1E30, specials={'char',0x006B,0x0301} },
+ [0x1E32] = { unicodeslot=0x1E32, category='lu', description='LATIN CAPITAL LETTER K WITH DOT BELOW', shcode=0x004B, lccode=0x1E33, specials={'char',0x004B,0x0323} },
+ [0x1E33] = { unicodeslot=0x1E33, category='ll', description='LATIN SMALL LETTER K WITH DOT BELOW', shcode=0x006B, uccode=0x1E32, specials={'char',0x006B,0x0323} },
+ [0x1E34] = { unicodeslot=0x1E34, category='lu', description='LATIN CAPITAL LETTER K WITH LINE BELOW', shcode=0x004B, lccode=0x1E35, specials={'char',0x004B,0x0331} },
+ [0x1E35] = { unicodeslot=0x1E35, category='ll', description='LATIN SMALL LETTER K WITH LINE BELOW', shcode=0x006B, uccode=0x1E34, specials={'char',0x006B,0x0331} },
+ [0x1E36] = { unicodeslot=0x1E36, category='lu', description='LATIN CAPITAL LETTER L WITH DOT BELOW', shcode=0x004C, lccode=0x1E37, specials={'char',0x004C,0x0323} },
+ [0x1E37] = { unicodeslot=0x1E37, category='ll', description='LATIN SMALL LETTER L WITH DOT BELOW', shcode=0x006C, uccode=0x1E36, specials={'char',0x006C,0x0323} },
+ [0x1E38] = { unicodeslot=0x1E38, category='lu', description='LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON', shcode=0x004C, lccode=0x1E39, specials={'char',0x1E36,0x0304} },
+ [0x1E39] = { unicodeslot=0x1E39, category='ll', description='LATIN SMALL LETTER L WITH DOT BELOW AND MACRON', shcode=0x006C, uccode=0x1E38, specials={'char',0x1E37,0x0304} },
+ [0x1E3A] = { unicodeslot=0x1E3A, category='lu', description='LATIN CAPITAL LETTER L WITH LINE BELOW', shcode=0x004C, lccode=0x1E3B, specials={'char',0x004C,0x0331} },
+ [0x1E3B] = { unicodeslot=0x1E3B, category='ll', description='LATIN SMALL LETTER L WITH LINE BELOW', shcode=0x006C, uccode=0x1E3A, specials={'char',0x006C,0x0331} },
+ [0x1E3C] = { unicodeslot=0x1E3C, category='lu', description='LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW', shcode=0x004C, lccode=0x1E3D, specials={'char',0x004C,0x032D} },
+ [0x1E3D] = { unicodeslot=0x1E3D, category='ll', description='LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW', shcode=0x006C, uccode=0x1E3C, specials={'char',0x006C,0x032D} },
+ [0x1E3E] = { unicodeslot=0x1E3E, category='lu', description='LATIN CAPITAL LETTER M WITH ACUTE', shcode=0x004D, lccode=0x1E3F, specials={'char',0x004D,0x0301} },
+ [0x1E3F] = { unicodeslot=0x1E3F, category='ll', description='LATIN SMALL LETTER M WITH ACUTE', shcode=0x006D, uccode=0x1E3E, specials={'char',0x006D,0x0301} },
+ [0x1E40] = { unicodeslot=0x1E40, category='lu', description='LATIN CAPITAL LETTER M WITH DOT ABOVE', shcode=0x004D, lccode=0x1E41, specials={'char',0x004D,0x0307} },
+ [0x1E41] = { unicodeslot=0x1E41, category='ll', description='LATIN SMALL LETTER M WITH DOT ABOVE', shcode=0x006D, uccode=0x1E40, specials={'char',0x006D,0x0307} },
+ [0x1E42] = { unicodeslot=0x1E42, category='lu', description='LATIN CAPITAL LETTER M WITH DOT BELOW', shcode=0x004D, lccode=0x1E43, specials={'char',0x004D,0x0323} },
+ [0x1E43] = { unicodeslot=0x1E43, category='ll', description='LATIN SMALL LETTER M WITH DOT BELOW', shcode=0x006D, uccode=0x1E42, specials={'char',0x006D,0x0323} },
+ [0x1E44] = { unicodeslot=0x1E44, category='lu', description='LATIN CAPITAL LETTER N WITH DOT ABOVE', shcode=0x004E, lccode=0x1E45, specials={'char',0x004E,0x0307} },
+ [0x1E45] = { unicodeslot=0x1E45, category='ll', description='LATIN SMALL LETTER N WITH DOT ABOVE', shcode=0x006E, uccode=0x1E44, specials={'char',0x006E,0x0307} },
+ [0x1E46] = { unicodeslot=0x1E46, category='lu', description='LATIN CAPITAL LETTER N WITH DOT BELOW', shcode=0x004E, lccode=0x1E47, specials={'char',0x004E,0x0323} },
+ [0x1E47] = { unicodeslot=0x1E47, category='ll', description='LATIN SMALL LETTER N WITH DOT BELOW', shcode=0x006E, uccode=0x1E46, specials={'char',0x006E,0x0323} },
+ [0x1E48] = { unicodeslot=0x1E48, category='lu', description='LATIN CAPITAL LETTER N WITH LINE BELOW', shcode=0x004E, lccode=0x1E49, specials={'char',0x004E,0x0331} },
+ [0x1E49] = { unicodeslot=0x1E49, category='ll', description='LATIN SMALL LETTER N WITH LINE BELOW', shcode=0x006E, uccode=0x1E48, specials={'char',0x006E,0x0331} },
+ [0x1E4A] = { unicodeslot=0x1E4A, category='lu', description='LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW', shcode=0x004E, lccode=0x1E4B, specials={'char',0x004E,0x032D} },
+ [0x1E4B] = { unicodeslot=0x1E4B, category='ll', description='LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW', shcode=0x006E, uccode=0x1E4A, specials={'char',0x006E,0x032D} },
+ [0x1E4C] = { unicodeslot=0x1E4C, category='lu', description='LATIN CAPITAL LETTER O WITH TILDE AND ACUTE', shcode=0x004F, lccode=0x1E4D, specials={'char',0x00D5,0x0301} },
+ [0x1E4D] = { unicodeslot=0x1E4D, category='ll', description='LATIN SMALL LETTER O WITH TILDE AND ACUTE', shcode=0x006F, uccode=0x1E4C, specials={'char',0x00F5,0x0301} },
+ [0x1E4E] = { unicodeslot=0x1E4E, category='lu', description='LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS', shcode=0x004F, lccode=0x1E4F, specials={'char',0x00D5,0x0308} },
+ [0x1E4F] = { unicodeslot=0x1E4F, category='ll', description='LATIN SMALL LETTER O WITH TILDE AND DIAERESIS', shcode=0x006F, uccode=0x1E4E, specials={'char',0x00F5,0x0308} },
+ [0x1E50] = { unicodeslot=0x1E50, category='lu', description='LATIN CAPITAL LETTER O WITH MACRON AND GRAVE', shcode=0x004F, lccode=0x1E51, specials={'char',0x014C,0x0300} },
+ [0x1E51] = { unicodeslot=0x1E51, category='ll', description='LATIN SMALL LETTER O WITH MACRON AND GRAVE', shcode=0x006F, uccode=0x1E50, specials={'char',0x014D,0x0300} },
+ [0x1E52] = { unicodeslot=0x1E52, category='lu', description='LATIN CAPITAL LETTER O WITH MACRON AND ACUTE', shcode=0x004F, lccode=0x1E53, specials={'char',0x014C,0x0301} },
+ [0x1E53] = { unicodeslot=0x1E53, category='ll', description='LATIN SMALL LETTER O WITH MACRON AND ACUTE', shcode=0x006F, uccode=0x1E52, specials={'char',0x014D,0x0301} },
+ [0x1E54] = { unicodeslot=0x1E54, category='lu', description='LATIN CAPITAL LETTER P WITH ACUTE', shcode=0x0050, lccode=0x1E55, specials={'char',0x0050,0x0301} },
+ [0x1E55] = { unicodeslot=0x1E55, category='ll', description='LATIN SMALL LETTER P WITH ACUTE', shcode=0x0070, uccode=0x1E54, specials={'char',0x0070,0x0301} },
+ [0x1E56] = { unicodeslot=0x1E56, category='lu', description='LATIN CAPITAL LETTER P WITH DOT ABOVE', shcode=0x0050, lccode=0x1E57, specials={'char',0x0050,0x0307} },
+ [0x1E57] = { unicodeslot=0x1E57, category='ll', description='LATIN SMALL LETTER P WITH DOT ABOVE', shcode=0x0070, uccode=0x1E56, specials={'char',0x0070,0x0307} },
+ [0x1E58] = { unicodeslot=0x1E58, category='lu', description='LATIN CAPITAL LETTER R WITH DOT ABOVE', shcode=0x0052, lccode=0x1E59, specials={'char',0x0052,0x0307} },
+ [0x1E59] = { unicodeslot=0x1E59, category='ll', description='LATIN SMALL LETTER R WITH DOT ABOVE', shcode=0x0072, uccode=0x1E58, specials={'char',0x0072,0x0307} },
+ [0x1E5A] = { unicodeslot=0x1E5A, category='lu', description='LATIN CAPITAL LETTER R WITH DOT BELOW', shcode=0x0052, lccode=0x1E5B, specials={'char',0x0052,0x0323} },
+ [0x1E5B] = { unicodeslot=0x1E5B, category='ll', description='LATIN SMALL LETTER R WITH DOT BELOW', shcode=0x0072, uccode=0x1E5A, specials={'char',0x0072,0x0323} },
+ [0x1E5C] = { unicodeslot=0x1E5C, category='lu', description='LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON', shcode=0x0052, lccode=0x1E5D, specials={'char',0x1E5A,0x0304} },
+ [0x1E5D] = { unicodeslot=0x1E5D, category='ll', description='LATIN SMALL LETTER R WITH DOT BELOW AND MACRON', shcode=0x0072, uccode=0x1E5C, specials={'char',0x1E5B,0x0304} },
+ [0x1E5E] = { unicodeslot=0x1E5E, category='lu', description='LATIN CAPITAL LETTER R WITH LINE BELOW', shcode=0x0052, lccode=0x1E5F, specials={'char',0x0052,0x0331} },
+ [0x1E5F] = { unicodeslot=0x1E5F, category='ll', description='LATIN SMALL LETTER R WITH LINE BELOW', shcode=0x0072, uccode=0x1E5E, specials={'char',0x0072,0x0331} },
+ [0x1E60] = { unicodeslot=0x1E60, category='lu', description='LATIN CAPITAL LETTER S WITH DOT ABOVE', shcode=0x0053, lccode=0x1E61, specials={'char',0x0053,0x0307} },
+ [0x1E61] = { unicodeslot=0x1E61, category='ll', description='LATIN SMALL LETTER S WITH DOT ABOVE', shcode=0x0073, uccode=0x1E60, specials={'char',0x0073,0x0307} },
+ [0x1E62] = { unicodeslot=0x1E62, category='lu', description='LATIN CAPITAL LETTER S WITH DOT BELOW', shcode=0x0053, lccode=0x1E63, specials={'char',0x0053,0x0323} },
+ [0x1E63] = { unicodeslot=0x1E63, category='ll', description='LATIN SMALL LETTER S WITH DOT BELOW', shcode=0x0073, uccode=0x1E62, specials={'char',0x0073,0x0323} },
+ [0x1E64] = { unicodeslot=0x1E64, category='lu', description='LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE', shcode=0x0053, lccode=0x1E65, specials={'char',0x015A,0x0307} },
+ [0x1E65] = { unicodeslot=0x1E65, category='ll', description='LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE', shcode=0x0073, uccode=0x1E64, specials={'char',0x015B,0x0307} },
+ [0x1E66] = { unicodeslot=0x1E66, category='lu', description='LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE', shcode=0x0053, lccode=0x1E67, specials={'char',0x0160,0x0307} },
+ [0x1E67] = { unicodeslot=0x1E67, category='ll', description='LATIN SMALL LETTER S WITH CARON AND DOT ABOVE', shcode=0x0073, uccode=0x1E66, specials={'char',0x0161,0x0307} },
+ [0x1E68] = { unicodeslot=0x1E68, category='lu', description='LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE', shcode=0x0053, lccode=0x1E69, specials={'char',0x1E62,0x0307} },
+ [0x1E69] = { unicodeslot=0x1E69, category='ll', description='LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE', shcode=0x0073, uccode=0x1E68, specials={'char',0x1E63,0x0307} },
+ [0x1E6A] = { unicodeslot=0x1E6A, category='lu', description='LATIN CAPITAL LETTER T WITH DOT ABOVE', shcode=0x0054, lccode=0x1E6B, specials={'char',0x0054,0x0307} },
+ [0x1E6B] = { unicodeslot=0x1E6B, category='ll', description='LATIN SMALL LETTER T WITH DOT ABOVE', shcode=0x0074, uccode=0x1E6A, specials={'char',0x0074,0x0307} },
+ [0x1E6C] = { unicodeslot=0x1E6C, category='lu', description='LATIN CAPITAL LETTER T WITH DOT BELOW', shcode=0x0054, lccode=0x1E6D, specials={'char',0x0054,0x0323} },
+ [0x1E6D] = { unicodeslot=0x1E6D, category='ll', description='LATIN SMALL LETTER T WITH DOT BELOW', shcode=0x0074, uccode=0x1E6C, specials={'char',0x0074,0x0323} },
+ [0x1E6E] = { unicodeslot=0x1E6E, category='lu', description='LATIN CAPITAL LETTER T WITH LINE BELOW', shcode=0x0054, lccode=0x1E6F, specials={'char',0x0054,0x0331} },
+ [0x1E6F] = { unicodeslot=0x1E6F, category='ll', description='LATIN SMALL LETTER T WITH LINE BELOW', shcode=0x0074, uccode=0x1E6E, specials={'char',0x0074,0x0331} },
+ [0x1E70] = { unicodeslot=0x1E70, category='lu', description='LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW', shcode=0x0054, lccode=0x1E71, specials={'char',0x0054,0x032D} },
+ [0x1E71] = { unicodeslot=0x1E71, category='ll', description='LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW', shcode=0x0074, uccode=0x1E70, specials={'char',0x0074,0x032D} },
+ [0x1E72] = { unicodeslot=0x1E72, category='lu', description='LATIN CAPITAL LETTER U WITH DIAERESIS BELOW', shcode=0x0055, lccode=0x1E73, specials={'char',0x0055,0x0324} },
+ [0x1E73] = { unicodeslot=0x1E73, category='ll', description='LATIN SMALL LETTER U WITH DIAERESIS BELOW', shcode=0x0075, uccode=0x1E72, specials={'char',0x0075,0x0324} },
+ [0x1E74] = { unicodeslot=0x1E74, category='lu', description='LATIN CAPITAL LETTER U WITH TILDE BELOW', shcode=0x0055, lccode=0x1E75, specials={'char',0x0055,0x0330} },
+ [0x1E75] = { unicodeslot=0x1E75, category='ll', description='LATIN SMALL LETTER U WITH TILDE BELOW', shcode=0x0075, uccode=0x1E74, specials={'char',0x0075,0x0330} },
+ [0x1E76] = { unicodeslot=0x1E76, category='lu', description='LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW', shcode=0x0055, lccode=0x1E77, specials={'char',0x0055,0x032D} },
+ [0x1E77] = { unicodeslot=0x1E77, category='ll', description='LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW', shcode=0x0075, uccode=0x1E76, specials={'char',0x0075,0x032D} },
+ [0x1E78] = { unicodeslot=0x1E78, category='lu', description='LATIN CAPITAL LETTER U WITH TILDE AND ACUTE', shcode=0x0055, lccode=0x1E79, specials={'char',0x0168,0x0301} },
+ [0x1E79] = { unicodeslot=0x1E79, category='ll', description='LATIN SMALL LETTER U WITH TILDE AND ACUTE', shcode=0x0075, uccode=0x1E78, specials={'char',0x0169,0x0301} },
+ [0x1E7A] = { unicodeslot=0x1E7A, category='lu', description='LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS', shcode=0x0055, lccode=0x1E7B, specials={'char',0x016A,0x0308} },
+ [0x1E7B] = { unicodeslot=0x1E7B, category='ll', description='LATIN SMALL LETTER U WITH MACRON AND DIAERESIS', shcode=0x0075, uccode=0x1E7A, specials={'char',0x016B,0x0308} },
+ [0x1E7C] = { unicodeslot=0x1E7C, category='lu', description='LATIN CAPITAL LETTER V WITH TILDE', shcode=0x0056, lccode=0x1E7D, specials={'char',0x0056,0x0303} },
+ [0x1E7D] = { unicodeslot=0x1E7D, category='ll', description='LATIN SMALL LETTER V WITH TILDE', shcode=0x0076, uccode=0x1E7C, specials={'char',0x0076,0x0303} },
+ [0x1E7E] = { unicodeslot=0x1E7E, category='lu', description='LATIN CAPITAL LETTER V WITH DOT BELOW', shcode=0x0056, lccode=0x1E7F, specials={'char',0x0056,0x0323} },
+ [0x1E7F] = { unicodeslot=0x1E7F, category='ll', description='LATIN SMALL LETTER V WITH DOT BELOW', shcode=0x0076, uccode=0x1E7E, specials={'char',0x0076,0x0323} },
+ [0x1E80] = { unicodeslot=0x1E80, category='lu', adobename='Wgrave', description='LATIN CAPITAL LETTER W WITH GRAVE', shcode=0x0057, lccode=0x1E81, specials={'char',0x0057,0x0300} },
+ [0x1E81] = { unicodeslot=0x1E81, category='ll', adobename='wgrave', description='LATIN SMALL LETTER W WITH GRAVE', shcode=0x0077, uccode=0x1E80, specials={'char',0x0077,0x0300} },
+ [0x1E82] = { unicodeslot=0x1E82, category='lu', adobename='Wacute', description='LATIN CAPITAL LETTER W WITH ACUTE', shcode=0x0057, lccode=0x1E83, specials={'char',0x0057,0x0301} },
+ [0x1E83] = { unicodeslot=0x1E83, category='ll', adobename='wacute', description='LATIN SMALL LETTER W WITH ACUTE', shcode=0x0077, uccode=0x1E82, specials={'char',0x0077,0x0301} },
+ [0x1E84] = { unicodeslot=0x1E84, category='lu', adobename='Wdieresis', description='LATIN CAPITAL LETTER W WITH DIAERESIS', shcode=0x0057, lccode=0x1E85, specials={'char',0x0057,0x0308} },
+ [0x1E85] = { unicodeslot=0x1E85, category='ll', adobename='wdieresis', description='LATIN SMALL LETTER W WITH DIAERESIS', shcode=0x0077, uccode=0x1E84, specials={'char',0x0077,0x0308} },
+ [0x1E86] = { unicodeslot=0x1E86, category='lu', description='LATIN CAPITAL LETTER W WITH DOT ABOVE', shcode=0x0057, lccode=0x1E87, specials={'char',0x0057,0x0307} },
+ [0x1E87] = { unicodeslot=0x1E87, category='ll', description='LATIN SMALL LETTER W WITH DOT ABOVE', shcode=0x0077, uccode=0x1E86, specials={'char',0x0077,0x0307} },
+ [0x1E88] = { unicodeslot=0x1E88, category='lu', description='LATIN CAPITAL LETTER W WITH DOT BELOW', shcode=0x0057, lccode=0x1E89, specials={'char',0x0057,0x0323} },
+ [0x1E89] = { unicodeslot=0x1E89, category='ll', description='LATIN SMALL LETTER W WITH DOT BELOW', shcode=0x0077, uccode=0x1E88, specials={'char',0x0077,0x0323} },
+ [0x1E8A] = { unicodeslot=0x1E8A, category='lu', description='LATIN CAPITAL LETTER X WITH DOT ABOVE', shcode=0x0058, lccode=0x1E8B, specials={'char',0x0058,0x0307} },
+ [0x1E8B] = { unicodeslot=0x1E8B, category='ll', description='LATIN SMALL LETTER X WITH DOT ABOVE', shcode=0x0078, uccode=0x1E8A, specials={'char',0x0078,0x0307} },
+ [0x1E8C] = { unicodeslot=0x1E8C, category='lu', description='LATIN CAPITAL LETTER X WITH DIAERESIS', shcode=0x0058, lccode=0x1E8D, specials={'char',0x0058,0x0308} },
+ [0x1E8D] = { unicodeslot=0x1E8D, category='ll', description='LATIN SMALL LETTER X WITH DIAERESIS', shcode=0x0078, uccode=0x1E8C, specials={'char',0x0078,0x0308} },
+ [0x1E8E] = { unicodeslot=0x1E8E, category='lu', description='LATIN CAPITAL LETTER Y WITH DOT ABOVE', shcode=0x0059, lccode=0x1E8F, specials={'char',0x0059,0x0307} },
+ [0x1E8F] = { unicodeslot=0x1E8F, category='ll', description='LATIN SMALL LETTER Y WITH DOT ABOVE', shcode=0x0079, uccode=0x1E8E, specials={'char',0x0079,0x0307} },
+ [0x1E90] = { unicodeslot=0x1E90, category='lu', description='LATIN CAPITAL LETTER Z WITH CIRCUMFLEX', shcode=0x005A, lccode=0x1E91, specials={'char',0x005A,0x0302} },
+ [0x1E91] = { unicodeslot=0x1E91, category='ll', description='LATIN SMALL LETTER Z WITH CIRCUMFLEX', shcode=0x007A, uccode=0x1E90, specials={'char',0x007A,0x0302} },
+ [0x1E92] = { unicodeslot=0x1E92, category='lu', description='LATIN CAPITAL LETTER Z WITH DOT BELOW', shcode=0x005A, lccode=0x1E93, specials={'char',0x005A,0x0323} },
+ [0x1E93] = { unicodeslot=0x1E93, category='ll', description='LATIN SMALL LETTER Z WITH DOT BELOW', shcode=0x007A, uccode=0x1E92, specials={'char',0x007A,0x0323} },
+ [0x1E94] = { unicodeslot=0x1E94, category='lu', description='LATIN CAPITAL LETTER Z WITH LINE BELOW', shcode=0x005A, lccode=0x1E95, specials={'char',0x005A,0x0331} },
+ [0x1E95] = { unicodeslot=0x1E95, category='ll', description='LATIN SMALL LETTER Z WITH LINE BELOW', shcode=0x007A, uccode=0x1E94, specials={'char',0x007A,0x0331} },
+ [0x1E96] = { unicodeslot=0x1E96, category='ll', description='LATIN SMALL LETTER H WITH LINE BELOW', shcode=0x0068, specials={'char',0x0068,0x0331} },
+ [0x1E97] = { unicodeslot=0x1E97, category='ll', description='LATIN SMALL LETTER T WITH DIAERESIS', shcode=0x0074, specials={'char',0x0074,0x0308} },
+ [0x1E98] = { unicodeslot=0x1E98, category='ll', description='LATIN SMALL LETTER W WITH RING ABOVE', shcode=0x0077, specials={'char',0x0077,0x030A} },
+ [0x1E99] = { unicodeslot=0x1E99, category='ll', description='LATIN SMALL LETTER Y WITH RING ABOVE', shcode=0x0079, specials={'char',0x0079,0x030A} },
+ [0x1E9A] = { unicodeslot=0x1E9A, category='ll', description='LATIN SMALL LETTER A WITH RIGHT HALF RING', shcode=0x0061, specials={'compat',0x0061,0x02BE} },
+ [0x1E9B] = { unicodeslot=0x1E9B, category='ll', description='LATIN SMALL LETTER LONG S WITH DOT ABOVE', uccode=0x1E60, specials={'char',0x017F,0x0307} },
+ [0x1EA0] = { unicodeslot=0x1EA0, category='lu', contextname='Adotbelow', description='LATIN CAPITAL LETTER A WITH DOT BELOW', shcode=0x0041, lccode=0x1EA1, specials={'char',0x0041,0x0323} },
+ [0x1EA1] = { unicodeslot=0x1EA1, category='ll', contextname='adotbelow', description='LATIN SMALL LETTER A WITH DOT BELOW', shcode=0x0061, uccode=0x1EA0, specials={'char',0x0061,0x0323} },
+ [0x1EA2] = { unicodeslot=0x1EA2, category='lu', contextname='Ahook', description='LATIN CAPITAL LETTER A WITH HOOK ABOVE', shcode=0x0041, lccode=0x1EA3, specials={'char',0x0041,0x0309} },
+ [0x1EA3] = { unicodeslot=0x1EA3, category='ll', contextname='ahook', description='LATIN SMALL LETTER A WITH HOOK ABOVE', shcode=0x0061, uccode=0x1EA2, specials={'char',0x0061,0x0309} },
+ [0x1EA4] = { unicodeslot=0x1EA4, category='lu', contextname='Acircumflexacute', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE', shcode=0x0041, lccode=0x1EA5, specials={'char',0x00C2,0x0301} },
+ [0x1EA5] = { unicodeslot=0x1EA5, category='ll', contextname='acircumflexacute', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE', shcode=0x0061, uccode=0x1EA4, specials={'char',0x00E2,0x0301} },
+ [0x1EA6] = { unicodeslot=0x1EA6, category='lu', contextname='Acircumflexgrave', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE', shcode=0x0041, lccode=0x1EA7, specials={'char',0x00C2,0x0300} },
+ [0x1EA7] = { unicodeslot=0x1EA7, category='ll', contextname='acircumflexgrave', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE', shcode=0x0061, uccode=0x1EA6, specials={'char',0x00E2,0x0300} },
+ [0x1EA8] = { unicodeslot=0x1EA8, category='lu', contextname='Acircumflexhook', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0041, lccode=0x1EA9, specials={'char',0x00C2,0x0309} },
+ [0x1EA9] = { unicodeslot=0x1EA9, category='ll', contextname='acircumflexhook', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0061, uccode=0x1EA8, specials={'char',0x00E2,0x0309} },
+ [0x1EAA] = { unicodeslot=0x1EAA, category='lu', contextname='Acircumflextilde', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE', shcode=0x0041, lccode=0x1EAB, specials={'char',0x00C2,0x0303} },
+ [0x1EAB] = { unicodeslot=0x1EAB, category='ll', contextname='acircumflextilde', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE', shcode=0x0061, uccode=0x1EAA, specials={'char',0x00E2,0x0303} },
+ [0x1EAC] = { unicodeslot=0x1EAC, category='lu', contextname='Acircumflexdotbelow', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0041, lccode=0x1EAD, specials={'char',0x1EA0,0x0302} },
+ [0x1EAD] = { unicodeslot=0x1EAD, category='ll', contextname='acircumflexdotbelow', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0061, uccode=0x1EAC, specials={'char',0x1EA1,0x0302} },
+ [0x1EAE] = { unicodeslot=0x1EAE, category='lu', contextname='Abreveacute', description='LATIN CAPITAL LETTER A WITH BREVE AND ACUTE', shcode=0x0041, lccode=0x1EAF, specials={'char',0x0102,0x0301} },
+ [0x1EAF] = { unicodeslot=0x1EAF, category='ll', contextname='abreveacute', description='LATIN SMALL LETTER A WITH BREVE AND ACUTE', shcode=0x0061, uccode=0x1EAE, specials={'char',0x0103,0x0301} },
+ [0x1EB0] = { unicodeslot=0x1EB0, category='lu', contextname='Abrevegrave', description='LATIN CAPITAL LETTER A WITH BREVE AND GRAVE', shcode=0x0041, lccode=0x1EB1, specials={'char',0x0102,0x0300} },
+ [0x1EB1] = { unicodeslot=0x1EB1, category='ll', contextname='abrevegrave', description='LATIN SMALL LETTER A WITH BREVE AND GRAVE', shcode=0x0061, uccode=0x1EB0, specials={'char',0x0103,0x0300} },
+ [0x1EB2] = { unicodeslot=0x1EB2, category='lu', contextname='Abrevehook', description='LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE', shcode=0x0041, lccode=0x1EB3, specials={'char',0x0102,0x0309} },
+ [0x1EB3] = { unicodeslot=0x1EB3, category='ll', contextname='abrevehook', description='LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE', shcode=0x0061, uccode=0x1EB2, specials={'char',0x0103,0x0309} },
+ [0x1EB4] = { unicodeslot=0x1EB4, category='lu', contextname='Abrevetilde', description='LATIN CAPITAL LETTER A WITH BREVE AND TILDE', shcode=0x0041, lccode=0x1EB5, specials={'char',0x0102,0x0303} },
+ [0x1EB5] = { unicodeslot=0x1EB5, category='ll', contextname='abrevetilde', description='LATIN SMALL LETTER A WITH BREVE AND TILDE', shcode=0x0061, uccode=0x1EB4, specials={'char',0x0103,0x0303} },
+ [0x1EB6] = { unicodeslot=0x1EB6, category='lu', contextname='Abrevedotbelow', description='LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW', shcode=0x0041, lccode=0x1EB7, specials={'char',0x1EA0,0x0306} },
+ [0x1EB7] = { unicodeslot=0x1EB7, category='ll', contextname='abrevedotbelow', description='LATIN SMALL LETTER A WITH BREVE AND DOT BELOW', shcode=0x0061, uccode=0x1EB6, specials={'char',0x1EA1,0x0306} },
+ [0x1EB8] = { unicodeslot=0x1EB8, category='lu', contextname='Edotbelow', description='LATIN CAPITAL LETTER E WITH DOT BELOW', shcode=0x0045, lccode=0x1EB9, specials={'char',0x0045,0x0323} },
+ [0x1EB9] = { unicodeslot=0x1EB9, category='ll', contextname='edotbelow', description='LATIN SMALL LETTER E WITH DOT BELOW', shcode=0x0065, uccode=0x1EB8, specials={'char',0x0065,0x0323} },
+ [0x1EBA] = { unicodeslot=0x1EBA, category='lu', contextname='Ehook', description='LATIN CAPITAL LETTER E WITH HOOK ABOVE', shcode=0x0045, lccode=0x1EBB, specials={'char',0x0045,0x0309} },
+ [0x1EBB] = { unicodeslot=0x1EBB, category='ll', contextname='ehook', description='LATIN SMALL LETTER E WITH HOOK ABOVE', shcode=0x0065, uccode=0x1EBA, specials={'char',0x0065,0x0309} },
+ [0x1EBC] = { unicodeslot=0x1EBC, category='lu', contextname='Etilde', description='LATIN CAPITAL LETTER E WITH TILDE', shcode=0x0045, lccode=0x1EBD, specials={'char',0x0045,0x0303} },
+ [0x1EBD] = { unicodeslot=0x1EBD, category='ll', contextname='etilde', description='LATIN SMALL LETTER E WITH TILDE', shcode=0x0065, uccode=0x1EBC, specials={'char',0x0065,0x0303} },
+ [0x1EBE] = { unicodeslot=0x1EBE, category='lu', contextname='Ecircumflexacute', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE', shcode=0x0045, lccode=0x1EBF, specials={'char',0x00CA,0x0301} },
+ [0x1EBF] = { unicodeslot=0x1EBF, category='ll', contextname='ecircumflexacute', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE', shcode=0x0065, uccode=0x1EBE, specials={'char',0x00EA,0x0301} },
+ [0x1EC0] = { unicodeslot=0x1EC0, category='lu', contextname='Ecircumflexgrave', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE', shcode=0x0045, lccode=0x1EC1, specials={'char',0x00CA,0x0300} },
+ [0x1EC1] = { unicodeslot=0x1EC1, category='ll', contextname='ecircumflexgrave', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE', shcode=0x0065, uccode=0x1EC0, specials={'char',0x00EA,0x0300} },
+ [0x1EC2] = { unicodeslot=0x1EC2, category='lu', contextname='Ecircumflexhook', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0045, lccode=0x1EC3, specials={'char',0x00CA,0x0309} },
+ [0x1EC3] = { unicodeslot=0x1EC3, category='ll', contextname='ecircumflexhook', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0065, uccode=0x1EC2, specials={'char',0x00EA,0x0309} },
+ [0x1EC4] = { unicodeslot=0x1EC4, category='lu', contextname='Ecircumflextilde', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE', shcode=0x0045, lccode=0x1EC5, specials={'char',0x00CA,0x0303} },
+ [0x1EC5] = { unicodeslot=0x1EC5, category='ll', contextname='ecircumflextilde', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE', shcode=0x0065, uccode=0x1EC4, specials={'char',0x00EA,0x0303} },
+ [0x1EC6] = { unicodeslot=0x1EC6, category='lu', contextname='Ecircumflexdotbelow', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0045, lccode=0x1EC7, specials={'char',0x1EB8,0x0302} },
+ [0x1EC7] = { unicodeslot=0x1EC7, category='ll', contextname='ecircumflexdotbelow', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0065, uccode=0x1EC6, specials={'char',0x1EB9,0x0302} },
+ [0x1EC8] = { unicodeslot=0x1EC8, category='lu', contextname='Ihook', description='LATIN CAPITAL LETTER I WITH HOOK ABOVE', shcode=0x0049, lccode=0x1EC9, specials={'char',0x0049,0x0309} },
+ [0x1EC9] = { unicodeslot=0x1EC9, category='ll', contextname='ihook', description='LATIN SMALL LETTER I WITH HOOK ABOVE', shcode=0x0069, uccode=0x1EC8, specials={'char',0x0069,0x0309} },
+ [0x1ECA] = { unicodeslot=0x1ECA, category='lu', contextname='Idotbelow', description='LATIN CAPITAL LETTER I WITH DOT BELOW', shcode=0x0049, lccode=0x1ECB, specials={'char',0x0049,0x0323} },
+ [0x1ECB] = { unicodeslot=0x1ECB, category='ll', contextname='idotbelow', description='LATIN SMALL LETTER I WITH DOT BELOW', shcode=0x0069, uccode=0x1ECA, specials={'char',0x0069,0x0323} },
+ [0x1ECC] = { unicodeslot=0x1ECC, category='lu', contextname='Odotbelow', description='LATIN CAPITAL LETTER O WITH DOT BELOW', shcode=0x004F, lccode=0x1ECD, specials={'char',0x004F,0x0323} },
+ [0x1ECD] = { unicodeslot=0x1ECD, category='ll', contextname='odotbelow', description='LATIN SMALL LETTER O WITH DOT BELOW', shcode=0x006F, uccode=0x1ECC, specials={'char',0x006F,0x0323} },
+ [0x1ECE] = { unicodeslot=0x1ECE, category='lu', contextname='Ohook', description='LATIN CAPITAL LETTER O WITH HOOK ABOVE', shcode=0x004F, lccode=0x1ECF, specials={'char',0x004F,0x0309} },
+ [0x1ECF] = { unicodeslot=0x1ECF, category='ll', contextname='ohook', description='LATIN SMALL LETTER O WITH HOOK ABOVE', shcode=0x006F, uccode=0x1ECE, specials={'char',0x006F,0x0309} },
+ [0x1ED0] = { unicodeslot=0x1ED0, category='lu', contextname='Ocircumflexacute', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE', shcode=0x004F, lccode=0x1ED1, specials={'char',0x00D4,0x0301} },
+ [0x1ED1] = { unicodeslot=0x1ED1, category='ll', contextname='ocircumflexacute', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE', shcode=0x006F, uccode=0x1ED0, specials={'char',0x00F4,0x0301} },
+ [0x1ED2] = { unicodeslot=0x1ED2, category='lu', contextname='Ocircumflexgrave', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE', shcode=0x004F, lccode=0x1ED3, specials={'char',0x00D4,0x0300} },
+ [0x1ED3] = { unicodeslot=0x1ED3, category='ll', contextname='ocircumflexgrave', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE', shcode=0x006F, uccode=0x1ED2, specials={'char',0x00F4,0x0300} },
+ [0x1ED4] = { unicodeslot=0x1ED4, category='lu', contextname='Ocircumflexhook', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x004F, lccode=0x1ED5, specials={'char',0x00D4,0x0309} },
+ [0x1ED5] = { unicodeslot=0x1ED5, category='ll', contextname='ocircumflexhook', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x006F, uccode=0x1ED4, specials={'char',0x00F4,0x0309} },
+ [0x1ED6] = { unicodeslot=0x1ED6, category='lu', contextname='Ocircumflextilde', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE', shcode=0x004F, lccode=0x1ED7, specials={'char',0x00D4,0x0303} },
+ [0x1ED7] = { unicodeslot=0x1ED7, category='ll', contextname='ocircumflextilde', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE', shcode=0x006F, uccode=0x1ED6, specials={'char',0x00F4,0x0303} },
+ [0x1ED8] = { unicodeslot=0x1ED8, category='lu', contextname='Ocircumflexdotbelow', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW', shcode=0x004F, lccode=0x1ED9, specials={'char',0x1ECC,0x0302} },
+ [0x1ED9] = { unicodeslot=0x1ED9, category='ll', contextname='ocircumflexdotbelow', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW', shcode=0x006F, uccode=0x1ED8, specials={'char',0x1ECD,0x0302} },
+ [0x1EDA] = { unicodeslot=0x1EDA, category='lu', contextname='Ohornacute', description='LATIN CAPITAL LETTER O WITH HORN AND ACUTE', shcode=0x004F, lccode=0x1EDB, specials={'char',0x01A0,0x0301} },
+ [0x1EDB] = { unicodeslot=0x1EDB, category='ll', contextname='ohornacute', description='LATIN SMALL LETTER O WITH HORN AND ACUTE', shcode=0x006F, uccode=0x1EDA, specials={'char',0x01A1,0x0301} },
+ [0x1EDC] = { unicodeslot=0x1EDC, category='lu', contextname='Ohorngrave', description='LATIN CAPITAL LETTER O WITH HORN AND GRAVE', shcode=0x004F, lccode=0x1EDD, specials={'char',0x01A0,0x0300} },
+ [0x1EDD] = { unicodeslot=0x1EDD, category='ll', contextname='ohorngrave', description='LATIN SMALL LETTER O WITH HORN AND GRAVE', shcode=0x006F, uccode=0x1EDC, specials={'char',0x01A1,0x0300} },
+ [0x1EDE] = { unicodeslot=0x1EDE, category='lu', contextname='Ohornhook', description='LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE', shcode=0x004F, lccode=0x1EDF, specials={'char',0x01A0,0x0309} },
+ [0x1EDF] = { unicodeslot=0x1EDF, category='ll', contextname='ohornhook', description='LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE', shcode=0x006F, uccode=0x1EDE, specials={'char',0x01A1,0x0309} },
+ [0x1EE0] = { unicodeslot=0x1EE0, category='lu', contextname='Ohorntilde', description='LATIN CAPITAL LETTER O WITH HORN AND TILDE', shcode=0x004F, lccode=0x1EE1, specials={'char',0x01A0,0x0303} },
+ [0x1EE1] = { unicodeslot=0x1EE1, category='ll', contextname='ohorntilde', description='LATIN SMALL LETTER O WITH HORN AND TILDE', shcode=0x006F, uccode=0x1EE0, specials={'char',0x01A1,0x0303} },
+ [0x1EE2] = { unicodeslot=0x1EE2, category='lu', contextname='Ohorndotbelow', description='LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW', shcode=0x004F, lccode=0x1EE3, specials={'char',0x01A0,0x0323} },
+ [0x1EE3] = { unicodeslot=0x1EE3, category='ll', contextname='ohorndotbelow', description='LATIN SMALL LETTER O WITH HORN AND DOT BELOW', shcode=0x006F, uccode=0x1EE2, specials={'char',0x01A1,0x0323} },
+ [0x1EE4] = { unicodeslot=0x1EE4, category='lu', contextname='Udotbelow', description='LATIN CAPITAL LETTER U WITH DOT BELOW', shcode=0x0055, lccode=0x1EE5, specials={'char',0x0055,0x0323} },
+ [0x1EE5] = { unicodeslot=0x1EE5, category='ll', contextname='udotbelow', description='LATIN SMALL LETTER U WITH DOT BELOW', shcode=0x0075, uccode=0x1EE4, specials={'char',0x0075,0x0323} },
+ [0x1EE6] = { unicodeslot=0x1EE6, category='lu', contextname='Uhook', description='LATIN CAPITAL LETTER U WITH HOOK ABOVE', shcode=0x0055, lccode=0x1EE7, specials={'char',0x0055,0x0309} },
+ [0x1EE7] = { unicodeslot=0x1EE7, category='ll', contextname='uhook', description='LATIN SMALL LETTER U WITH HOOK ABOVE', shcode=0x0075, uccode=0x1EE6, specials={'char',0x0075,0x0309} },
+ [0x1EE8] = { unicodeslot=0x1EE8, category='lu', contextname='Uhornacute', description='LATIN CAPITAL LETTER U WITH HORN AND ACUTE', shcode=0x0055, lccode=0x1EE9, specials={'char',0x01AF,0x0301} },
+ [0x1EE9] = { unicodeslot=0x1EE9, category='ll', contextname='uhornacute', description='LATIN SMALL LETTER U WITH HORN AND ACUTE', shcode=0x0075, uccode=0x1EE8, specials={'char',0x01B0,0x0301} },
+ [0x1EEA] = { unicodeslot=0x1EEA, category='lu', contextname='Uhorngrave', description='LATIN CAPITAL LETTER U WITH HORN AND GRAVE', shcode=0x0055, lccode=0x1EEB, specials={'char',0x01AF,0x0300} },
+ [0x1EEB] = { unicodeslot=0x1EEB, category='ll', contextname='uhorngrave', description='LATIN SMALL LETTER U WITH HORN AND GRAVE', shcode=0x0075, uccode=0x1EEA, specials={'char',0x01B0,0x0300} },
+ [0x1EEC] = { unicodeslot=0x1EEC, category='lu', contextname='Uhornhook', description='LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE', shcode=0x0055, lccode=0x1EED, specials={'char',0x01AF,0x0309} },
+ [0x1EED] = { unicodeslot=0x1EED, category='ll', contextname='uhornhook', description='LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE', shcode=0x0075, uccode=0x1EEC, specials={'char',0x01B0,0x0309} },
+ [0x1EEE] = { unicodeslot=0x1EEE, category='lu', contextname='Uhorntilde', description='LATIN CAPITAL LETTER U WITH HORN AND TILDE', shcode=0x0055, lccode=0x1EEF, specials={'char',0x01AF,0x0303} },
+ [0x1EEF] = { unicodeslot=0x1EEF, category='ll', contextname='uhorntilde', description='LATIN SMALL LETTER U WITH HORN AND TILDE', shcode=0x0075, uccode=0x1EEE, specials={'char',0x01B0,0x0303} },
+ [0x1EF0] = { unicodeslot=0x1EF0, category='lu', contextname='Uhorndotbelow', description='LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW', shcode=0x0055, lccode=0x1EF1, specials={'char',0x01AF,0x0323} },
+ [0x1EF1] = { unicodeslot=0x1EF1, category='ll', contextname='uhorndotbelow', description='LATIN SMALL LETTER U WITH HORN AND DOT BELOW', shcode=0x0075, uccode=0x1EF0, specials={'char',0x01B0,0x0323} },
+ [0x1EF2] = { unicodeslot=0x1EF2, category='lu', adobename='Ygrave', contextname='Ygrave', description='LATIN CAPITAL LETTER Y WITH GRAVE', shcode=0x0059, lccode=0x1EF3, specials={'char',0x0059,0x0300} },
+ [0x1EF3] = { unicodeslot=0x1EF3, category='ll', adobename='ygrave', contextname='ygrave', description='LATIN SMALL LETTER Y WITH GRAVE', shcode=0x0079, uccode=0x1EF2, specials={'char',0x0079,0x0300} },
+ [0x1EF4] = { unicodeslot=0x1EF4, category='lu', contextname='Ydotbelow', description='LATIN CAPITAL LETTER Y WITH DOT BELOW', shcode=0x0059, lccode=0x1EF5, specials={'char',0x0059,0x0323} },
+ [0x1EF5] = { unicodeslot=0x1EF5, category='ll', contextname='ydotbelow', description='LATIN SMALL LETTER Y WITH DOT BELOW', shcode=0x0079, uccode=0x1EF4, specials={'char',0x0079,0x0323} },
+ [0x1EF6] = { unicodeslot=0x1EF6, category='lu', contextname='Yhook', description='LATIN CAPITAL LETTER Y WITH HOOK ABOVE', shcode=0x0059, lccode=0x1EF7, specials={'char',0x0059,0x0309} },
+ [0x1EF7] = { unicodeslot=0x1EF7, category='ll', contextname='yhook', description='LATIN SMALL LETTER Y WITH HOOK ABOVE', shcode=0x0079, uccode=0x1EF6, specials={'char',0x0079,0x0309} },
+ [0x1EF8] = { unicodeslot=0x1EF8, category='lu', contextname='Ytilde', description='LATIN CAPITAL LETTER Y WITH TILDE', shcode=0x0059, lccode=0x1EF9, specials={'char',0x0059,0x0303} },
+ [0x1EF9] = { unicodeslot=0x1EF9, category='ll', contextname='ytilde', description='LATIN SMALL LETTER Y WITH TILDE', shcode=0x0079, uccode=0x1EF8, specials={'char',0x0079,0x0303} },
+ [0x1F00] = { unicodeslot=0x1F00, category='ll', contextname='greekalphapsili', description='GREEK SMALL LETTER ALPHA WITH PSILI', shcode=0x03B1, uccode=0x1F08, specials={'char',0x03B1,0x0313} },
+ [0x1F01] = { unicodeslot=0x1F01, category='ll', contextname='greekalphadasia', description='GREEK SMALL LETTER ALPHA WITH DASIA', shcode=0x03B1, uccode=0x1F09, specials={'char',0x03B1,0x0314} },
+ [0x1F02] = { unicodeslot=0x1F02, category='ll', contextname='greekalphapsilivaria', description='GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA', shcode=0x03B1, uccode=0x1F0A, specials={'char',0x1F00,0x0300} },
+ [0x1F03] = { unicodeslot=0x1F03, category='ll', contextname='greekalphadasiavaria', description='GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA', shcode=0x03B1, uccode=0x1F0B, specials={'char',0x1F01,0x0300} },
+ [0x1F04] = { unicodeslot=0x1F04, category='ll', contextname='greekalphapsilitonos', description='GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA', shcode=0x03B1, uccode=0x1F0C, specials={'char',0x1F00,0x0301} },
+ [0x1F05] = { unicodeslot=0x1F05, category='ll', contextname='greekalphadasiatonos', description='GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA', shcode=0x03B1, uccode=0x1F0D, specials={'char',0x1F01,0x0301} },
+ [0x1F06] = { unicodeslot=0x1F06, category='ll', contextname='greekalphapsiliperispomeni', description='GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI', shcode=0x03B1, uccode=0x1F0E, specials={'char',0x1F00,0x0342} },
+ [0x1F07] = { unicodeslot=0x1F07, category='ll', contextname='greekalphadasiaperispomeni', description='GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI', shcode=0x03B1, uccode=0x1F0F, specials={'char',0x1F01,0x0342} },
+ [0x1F08] = { unicodeslot=0x1F08, category='lu', contextname='greekAlphapsili', description='GREEK CAPITAL LETTER ALPHA WITH PSILI', shcode=0x0391, lccode=0x1F00, specials={'char',0x0391,0x0313} },
+ [0x1F09] = { unicodeslot=0x1F09, category='lu', contextname='greekAlphadasia', description='GREEK CAPITAL LETTER ALPHA WITH DASIA', shcode=0x0391, lccode=0x1F01, specials={'char',0x0391,0x0314} },
+ [0x1F0A] = { unicodeslot=0x1F0A, category='lu', contextname='greekAlphapsilivaria', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA', shcode=0x0391, lccode=0x1F02, specials={'char',0x1F08,0x0300} },
+ [0x1F0B] = { unicodeslot=0x1F0B, category='lu', contextname='greekAlphadasiavaria', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA', shcode=0x0391, lccode=0x1F03, specials={'char',0x1F09,0x0300} },
+ [0x1F0C] = { unicodeslot=0x1F0C, category='lu', contextname='greekAlphapsilitonos', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA', shcode=0x0391, lccode=0x1F04, specials={'char',0x1F08,0x0301} },
+ [0x1F0D] = { unicodeslot=0x1F0D, category='lu', contextname='greekAlphadasiatonos', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA', shcode=0x0391, lccode=0x1F05, specials={'char',0x1F09,0x0301} },
+ [0x1F0E] = { unicodeslot=0x1F0E, category='lu', contextname='greekAlphapsiliperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI', shcode=0x0391, lccode=0x1F06, specials={'char',0x1F08,0x0342} },
+ [0x1F0F] = { unicodeslot=0x1F0F, category='lu', contextname='greekAlphadasiaperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI', shcode=0x0391, lccode=0x1F07, specials={'char',0x1F09,0x0342} },
+ [0x1F10] = { unicodeslot=0x1F10, category='ll', contextname='greekepsilonpsili', description='GREEK SMALL LETTER EPSILON WITH PSILI', shcode=0x03B5, uccode=0x1F18, specials={'char',0x03B5,0x0313} },
+ [0x1F11] = { unicodeslot=0x1F11, category='ll', contextname='greekepsilondasia', description='GREEK SMALL LETTER EPSILON WITH DASIA', shcode=0x03B5, uccode=0x1F19, specials={'char',0x03B5,0x0314} },
+ [0x1F12] = { unicodeslot=0x1F12, category='ll', contextname='greekepsilonpsilivaria', description='GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA', shcode=0x03B5, uccode=0x1F1A, specials={'char',0x1F10,0x0300} },
+ [0x1F13] = { unicodeslot=0x1F13, category='ll', contextname='greekepsilondasiavaria', description='GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA', shcode=0x03B5, uccode=0x1F1B, specials={'char',0x1F11,0x0300} },
+ [0x1F14] = { unicodeslot=0x1F14, category='ll', contextname='greekepsilonpsilitonos', description='GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA', shcode=0x03B5, uccode=0x1F1C, specials={'char',0x1F10,0x0301} },
+ [0x1F15] = { unicodeslot=0x1F15, category='ll', contextname='greekepsilondasiatonos', description='GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA', shcode=0x03B5, uccode=0x1F1D, specials={'char',0x1F11,0x0301} },
+ [0x1F18] = { unicodeslot=0x1F18, category='lu', contextname='greekEpsilonpsili', description='GREEK CAPITAL LETTER EPSILON WITH PSILI', shcode=0x0395, lccode=0x1F10, specials={'char',0x0395,0x0313} },
+ [0x1F19] = { unicodeslot=0x1F19, category='lu', contextname='greekEpsilondasia', description='GREEK CAPITAL LETTER EPSILON WITH DASIA', shcode=0x0395, lccode=0x1F11, specials={'char',0x0395,0x0314} },
+ [0x1F1A] = { unicodeslot=0x1F1A, category='lu', contextname='greekEpsilonpsilivaria', description='GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA', shcode=0x0395, lccode=0x1F12, specials={'char',0x1F18,0x0300} },
+ [0x1F1B] = { unicodeslot=0x1F1B, category='lu', contextname='greekEpsilondasiavaria', description='GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA', shcode=0x0395, lccode=0x1F13, specials={'char',0x1F19,0x0300} },
+ [0x1F1C] = { unicodeslot=0x1F1C, category='lu', contextname='greekEpsilonpsilitonos', description='GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA', shcode=0x0395, lccode=0x1F14, specials={'char',0x1F18,0x0301} },
+ [0x1F1D] = { unicodeslot=0x1F1D, category='lu', contextname='greekEpsilondasiatonos', description='GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA', shcode=0x0395, lccode=0x1F15, specials={'char',0x1F19,0x0301} },
+ [0x1F20] = { unicodeslot=0x1F20, category='ll', contextname='greeketapsili', description='GREEK SMALL LETTER ETA WITH PSILI', shcode=0x03B7, uccode=0x1F28, specials={'char',0x03B7,0x0313} },
+ [0x1F21] = { unicodeslot=0x1F21, category='ll', contextname='greeketadasia', description='GREEK SMALL LETTER ETA WITH DASIA', shcode=0x03B7, uccode=0x1F29, specials={'char',0x03B7,0x0314} },
+ [0x1F22] = { unicodeslot=0x1F22, category='ll', contextname='greeketapsilivaria', description='GREEK SMALL LETTER ETA WITH PSILI AND VARIA', shcode=0x03B7, uccode=0x1F2A, specials={'char',0x1F20,0x0300} },
+ [0x1F23] = { unicodeslot=0x1F23, category='ll', contextname='greeketadasiavaria', description='GREEK SMALL LETTER ETA WITH DASIA AND VARIA', shcode=0x03B7, uccode=0x1F2B, specials={'char',0x1F21,0x0300} },
+ [0x1F24] = { unicodeslot=0x1F24, category='ll', contextname='greeketapsilitonos', description='GREEK SMALL LETTER ETA WITH PSILI AND OXIA', shcode=0x03B7, uccode=0x1F2C, specials={'char',0x1F20,0x0301} },
+ [0x1F25] = { unicodeslot=0x1F25, category='ll', contextname='greeketadasiatonos', description='GREEK SMALL LETTER ETA WITH DASIA AND OXIA', shcode=0x03B7, uccode=0x1F2D, specials={'char',0x1F21,0x0301} },
+ [0x1F26] = { unicodeslot=0x1F26, category='ll', contextname='greeketapsiliperispomeni', description='GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI', shcode=0x03B7, uccode=0x1F2E, specials={'char',0x1F20,0x0342} },
+ [0x1F27] = { unicodeslot=0x1F27, category='ll', contextname='greeketadasiaperispomeni', description='GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI', shcode=0x03B7, uccode=0x1F2F, specials={'char',0x1F21,0x0342} },
+ [0x1F28] = { unicodeslot=0x1F28, category='lu', contextname='greekEtapsili', description='GREEK CAPITAL LETTER ETA WITH PSILI', shcode=0x0397, lccode=0x1F20, specials={'char',0x0397,0x0313} },
+ [0x1F29] = { unicodeslot=0x1F29, category='lu', contextname='greekEtadasia', description='GREEK CAPITAL LETTER ETA WITH DASIA', shcode=0x0397, lccode=0x1F21, specials={'char',0x0397,0x0314} },
+ [0x1F2A] = { unicodeslot=0x1F2A, category='lu', contextname='greekEtapsilivaria', description='GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA', shcode=0x0397, lccode=0x1F22, specials={'char',0x1F28,0x0300} },
+ [0x1F2B] = { unicodeslot=0x1F2B, category='lu', contextname='greekEtadasiavaria', description='GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA', shcode=0x0397, lccode=0x1F23, specials={'char',0x1F29,0x0300} },
+ [0x1F2C] = { unicodeslot=0x1F2C, category='lu', contextname='greekEtapsilitonos', description='GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA', shcode=0x0397, lccode=0x1F24, specials={'char',0x1F28,0x0301} },
+ [0x1F2D] = { unicodeslot=0x1F2D, category='lu', contextname='greekEtadasiatonos', description='GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA', shcode=0x0397, lccode=0x1F25, specials={'char',0x1F29,0x0301} },
+ [0x1F2E] = { unicodeslot=0x1F2E, category='lu', contextname='greekEtapsiliperispomeni', description='GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI', shcode=0x0397, lccode=0x1F26, specials={'char',0x1F28,0x0342} },
+ [0x1F2F] = { unicodeslot=0x1F2F, category='lu', contextname='greekEtadasiaperispomeni', description='GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI', shcode=0x0397, lccode=0x1F27, specials={'char',0x1F29,0x0342} },
+ [0x1F30] = { unicodeslot=0x1F30, category='ll', contextname='greekiotapsili', description='GREEK SMALL LETTER IOTA WITH PSILI', shcode=0x03B9, uccode=0x1F38, specials={'char',0x03B9,0x0313} },
+ [0x1F31] = { unicodeslot=0x1F31, category='ll', contextname='greekiotadasia', description='GREEK SMALL LETTER IOTA WITH DASIA', shcode=0x03B9, uccode=0x1F39, specials={'char',0x03B9,0x0314} },
+ [0x1F32] = { unicodeslot=0x1F32, category='ll', contextname='greekiotapsilivaria', description='GREEK SMALL LETTER IOTA WITH PSILI AND VARIA', shcode=0x03B9, uccode=0x1F3A, specials={'char',0x1F30,0x0300} },
+ [0x1F33] = { unicodeslot=0x1F33, category='ll', contextname='greekiotadasiavaria', description='GREEK SMALL LETTER IOTA WITH DASIA AND VARIA', shcode=0x03B9, uccode=0x1F3B, specials={'char',0x1F31,0x0300} },
+ [0x1F34] = { unicodeslot=0x1F34, category='ll', contextname='greekiotapsilitonos', description='GREEK SMALL LETTER IOTA WITH PSILI AND OXIA', shcode=0x03B9, uccode=0x1F3C, specials={'char',0x1F30,0x0301} },
+ [0x1F35] = { unicodeslot=0x1F35, category='ll', contextname='greekiotadasiatonos', description='GREEK SMALL LETTER IOTA WITH DASIA AND OXIA', shcode=0x03B9, uccode=0x1F3D, specials={'char',0x1F31,0x0301} },
+ [0x1F36] = { unicodeslot=0x1F36, category='ll', contextname='greekiotapsiliperispomeni', description='GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI', shcode=0x03B9, uccode=0x1F3E, specials={'char',0x1F30,0x0342} },
+ [0x1F37] = { unicodeslot=0x1F37, category='ll', contextname='greekiotadasiaperispomeni', description='GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI', shcode=0x03B9, uccode=0x1F3F, specials={'char',0x1F31,0x0342} },
+ [0x1F38] = { unicodeslot=0x1F38, category='lu', contextname='greekIotapsili', description='GREEK CAPITAL LETTER IOTA WITH PSILI', shcode=0x0399, lccode=0x1F30, specials={'char',0x0399,0x0313} },
+ [0x1F39] = { unicodeslot=0x1F39, category='lu', contextname='greekIotadasia', description='GREEK CAPITAL LETTER IOTA WITH DASIA', shcode=0x0399, lccode=0x1F31, specials={'char',0x0399,0x0314} },
+ [0x1F3A] = { unicodeslot=0x1F3A, category='lu', contextname='greekIotapsilivaria', description='GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA', shcode=0x0399, lccode=0x1F32, specials={'char',0x1F38,0x0300} },
+ [0x1F3B] = { unicodeslot=0x1F3B, category='lu', contextname='greekIotadasiavaria', description='GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA', shcode=0x0399, lccode=0x1F33, specials={'char',0x1F39,0x0300} },
+ [0x1F3C] = { unicodeslot=0x1F3C, category='lu', contextname='greekIotapsilitonos', description='GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA', shcode=0x0399, lccode=0x1F34, specials={'char',0x1F38,0x0301} },
+ [0x1F3D] = { unicodeslot=0x1F3D, category='lu', contextname='greekIotadasiatonos', description='GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA', shcode=0x0399, lccode=0x1F35, specials={'char',0x1F39,0x0301} },
+ [0x1F3E] = { unicodeslot=0x1F3E, category='lu', contextname='greekIotapsiliperispomeni', description='GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI', shcode=0x0399, lccode=0x1F36, specials={'char',0x1F38,0x0342} },
+ [0x1F3F] = { unicodeslot=0x1F3F, category='lu', contextname='greekIotadasiaperispomeni', description='GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI', shcode=0x0399, lccode=0x1F37, specials={'char',0x1F39,0x0342} },
+ [0x1F40] = { unicodeslot=0x1F40, category='ll', contextname='greekomicronpsili', description='GREEK SMALL LETTER OMICRON WITH PSILI', shcode=0x03BF, uccode=0x1F48, specials={'char',0x03BF,0x0313} },
+ [0x1F41] = { unicodeslot=0x1F41, category='ll', contextname='greekomicrondasia', description='GREEK SMALL LETTER OMICRON WITH DASIA', shcode=0x03BF, uccode=0x1F49, specials={'char',0x03BF,0x0314} },
+ [0x1F42] = { unicodeslot=0x1F42, category='ll', contextname='greekomicronpsilivaria', description='GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA', shcode=0x03BF, uccode=0x1F4A, specials={'char',0x1F40,0x0300} },
+ [0x1F43] = { unicodeslot=0x1F43, category='ll', contextname='greekomicrondasiavaria', description='GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA', shcode=0x03BF, uccode=0x1F4B, specials={'char',0x1F41,0x0300} },
+ [0x1F44] = { unicodeslot=0x1F44, category='ll', contextname='greekomicronpsilitonos', description='GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA', shcode=0x03BF, uccode=0x1F4C, specials={'char',0x1F40,0x0301} },
+ [0x1F45] = { unicodeslot=0x1F45, category='ll', contextname='greekomicrondasiatonos', description='GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA', shcode=0x03BF, uccode=0x1F4D, specials={'char',0x1F41,0x0301} },
+ [0x1F48] = { unicodeslot=0x1F48, category='lu', contextname='greekOmicronpsili', description='GREEK CAPITAL LETTER OMICRON WITH PSILI', shcode=0x039F, lccode=0x1F40, specials={'char',0x039F,0x0313} },
+ [0x1F49] = { unicodeslot=0x1F49, category='lu', contextname='greekOmicrondasia', description='GREEK CAPITAL LETTER OMICRON WITH DASIA', shcode=0x039F, lccode=0x1F41, specials={'char',0x039F,0x0314} },
+ [0x1F4A] = { unicodeslot=0x1F4A, category='lu', contextname='greekOmicronpsilivaria', description='GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA', shcode=0x039F, lccode=0x1F42, specials={'char',0x1F48,0x0300} },
+ [0x1F4B] = { unicodeslot=0x1F4B, category='lu', contextname='greekOmicrondasiavaria', description='GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA', shcode=0x039F, lccode=0x1F43, specials={'char',0x1F49,0x0300} },
+ [0x1F4C] = { unicodeslot=0x1F4C, category='lu', contextname='greekOmicronpsilitonos', description='GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA', shcode=0x039F, lccode=0x1F44, specials={'char',0x1F48,0x0301} },
+ [0x1F4D] = { unicodeslot=0x1F4D, category='lu', contextname='greekOmicrondasiatonos', description='GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA', shcode=0x039F, lccode=0x1F45, specials={'char',0x1F49,0x0301} },
+ [0x1F50] = { unicodeslot=0x1F50, category='ll', contextname='greekupsilonpsili', description='GREEK SMALL LETTER UPSILON WITH PSILI', shcode=0x03C5, specials={'char',0x03C5,0x0313} },
+ [0x1F51] = { unicodeslot=0x1F51, category='ll', contextname='greekupsilondasia', description='GREEK SMALL LETTER UPSILON WITH DASIA', shcode=0x03C5, uccode=0x1F59, specials={'char',0x03C5,0x0314} },
+ [0x1F52] = { unicodeslot=0x1F52, category='ll', contextname='greekupsilonpsilivaria', description='GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA', shcode=0x03C5, specials={'char',0x1F50,0x0300} },
+ [0x1F53] = { unicodeslot=0x1F53, category='ll', contextname='greekupsilondasiavaria', description='GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA', shcode=0x03C5, uccode=0x1F5B, specials={'char',0x1F51,0x0300} },
+ [0x1F54] = { unicodeslot=0x1F54, category='ll', contextname='greekupsilonpsilitonos', description='GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA', shcode=0x03C5, specials={'char',0x1F50,0x0301} },
+ [0x1F55] = { unicodeslot=0x1F55, category='ll', contextname='greekupsilondasiatonos', description='GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA', shcode=0x03C5, uccode=0x1F5D, specials={'char',0x1F51,0x0301} },
+ [0x1F56] = { unicodeslot=0x1F56, category='ll', contextname='greekupsilonpsiliperispomeni', description='GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI', shcode=0x03C5, specials={'char',0x1F50,0x0342} },
+ [0x1F57] = { unicodeslot=0x1F57, category='ll', contextname='greekupsilondasiaperispomeni', description='GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI', shcode=0x03C5, uccode=0x1F5F, specials={'char',0x1F51,0x0342} },
+ [0x1F59] = { unicodeslot=0x1F59, category='lu', contextname='greekUpsilondasia', description='GREEK CAPITAL LETTER UPSILON WITH DASIA', shcode=0x03A5, lccode=0x1F51, specials={'char',0x03A5,0x0314} },
+ [0x1F5B] = { unicodeslot=0x1F5B, category='lu', contextname='greekUpsilondasiavaria', description='GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA', shcode=0x03A5, lccode=0x1F53, specials={'char',0x1F59,0x0300} },
+ [0x1F5D] = { unicodeslot=0x1F5D, category='lu', contextname='greekUpsilondasiatonos', description='GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA', shcode=0x03A5, lccode=0x1F55, specials={'char',0x1F59,0x0301} },
+ [0x1F5F] = { unicodeslot=0x1F5F, category='lu', contextname='greekUpsilondasiaperispomeni', description='GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI', shcode=0x03A5, lccode=0x1F57, specials={'char',0x1F59,0x0342} },
+ [0x1F60] = { unicodeslot=0x1F60, category='ll', contextname='greekomegapsili', description='GREEK SMALL LETTER OMEGA WITH PSILI', shcode=0x03C9, uccode=0x1F68, specials={'char',0x03C9,0x0313} },
+ [0x1F61] = { unicodeslot=0x1F61, category='ll', contextname='greekomegadasia', description='GREEK SMALL LETTER OMEGA WITH DASIA', shcode=0x03C9, uccode=0x1F69, specials={'char',0x03C9,0x0314} },
+ [0x1F62] = { unicodeslot=0x1F62, category='ll', contextname='greekomegapsilivaria', description='GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA', shcode=0x03C9, uccode=0x1F6A, specials={'char',0x1F60,0x0300} },
+ [0x1F63] = { unicodeslot=0x1F63, category='ll', contextname='greekomegadasiavaria', description='GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA', shcode=0x03C9, uccode=0x1F6B, specials={'char',0x1F61,0x0300} },
+ [0x1F64] = { unicodeslot=0x1F64, category='ll', contextname='greekomegapsilitonos', description='GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA', shcode=0x03C9, uccode=0x1F6C, specials={'char',0x1F60,0x0301} },
+ [0x1F65] = { unicodeslot=0x1F65, category='ll', contextname='greekomegadasiatonos', description='GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA', shcode=0x03C9, uccode=0x1F6D, specials={'char',0x1F61,0x0301} },
+ [0x1F66] = { unicodeslot=0x1F66, category='ll', contextname='greekomegapsiliperispomeni', description='GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI', shcode=0x03C9, uccode=0x1F6E, specials={'char',0x1F60,0x0342} },
+ [0x1F67] = { unicodeslot=0x1F67, category='ll', contextname='greekomegadasiaperispomeni', description='GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI', shcode=0x03C9, uccode=0x1F6F, specials={'char',0x1F61,0x0342} },
+ [0x1F68] = { unicodeslot=0x1F68, category='lu', contextname='greekOmegapsili', description='GREEK CAPITAL LETTER OMEGA WITH PSILI', shcode=0x03A9, lccode=0x1F60, specials={'char',0x03A9,0x0313} },
+ [0x1F69] = { unicodeslot=0x1F69, category='lu', contextname='greekOmegadasia', description='GREEK CAPITAL LETTER OMEGA WITH DASIA', shcode=0x03A9, lccode=0x1F61, specials={'char',0x03A9,0x0314} },
+ [0x1F6A] = { unicodeslot=0x1F6A, category='lu', contextname='greekOmegapsilivaria', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA', shcode=0x03A9, lccode=0x1F62, specials={'char',0x1F68,0x0300} },
+ [0x1F6B] = { unicodeslot=0x1F6B, category='lu', contextname='greekOmegadasiavaria', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA', shcode=0x03A9, lccode=0x1F63, specials={'char',0x1F69,0x0300} },
+ [0x1F6C] = { unicodeslot=0x1F6C, category='lu', contextname='greekOmegapsilitonos', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA', shcode=0x03A9, lccode=0x1F64, specials={'char',0x1F68,0x0301} },
+ [0x1F6D] = { unicodeslot=0x1F6D, category='lu', contextname='greekOmegadasiatonos', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA', shcode=0x03A9, lccode=0x1F65, specials={'char',0x1F69,0x0301} },
+ [0x1F6E] = { unicodeslot=0x1F6E, category='lu', contextname='greekOmegapsiliperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI', shcode=0x03A9, lccode=0x1F66, specials={'char',0x1F68,0x0342} },
+ [0x1F6F] = { unicodeslot=0x1F6F, category='lu', contextname='greekOmegadasiaperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI', shcode=0x03A9, lccode=0x1F67, specials={'char',0x1F69,0x0342} },
+ [0x1F70] = { unicodeslot=0x1F70, category='ll', contextname='greekalphavaria', description='GREEK SMALL LETTER ALPHA WITH VARIA', shcode=0x03B1, uccode=0x1FBA, specials={'char',0x03B1,0x0300} },
+ [0x1F71] = { unicodeslot=0x1F71, category='ll', contextname='greekalphaoxia', description='GREEK SMALL LETTER ALPHA WITH OXIA', shcode=0x03B1, uccode=0x1FBB, specials={'char',0x03AC} },
+ [0x1F72] = { unicodeslot=0x1F72, category='ll', contextname='greekepsilonvaria', description='GREEK SMALL LETTER EPSILON WITH VARIA', shcode=0x03B5, uccode=0x1FC8, specials={'char',0x03B5,0x0300} },
+ [0x1F73] = { unicodeslot=0x1F73, category='ll', contextname='greekepsilonoxia', description='GREEK SMALL LETTER EPSILON WITH OXIA', shcode=0x03B5, uccode=0x1FC9, specials={'char',0x03AD} },
+ [0x1F74] = { unicodeslot=0x1F74, category='ll', contextname='greeketavaria', description='GREEK SMALL LETTER ETA WITH VARIA', shcode=0x03B7, uccode=0x1FCA, specials={'char',0x03B7,0x0300} },
+ [0x1F75] = { unicodeslot=0x1F75, category='ll', contextname='greeketaoxia', description='GREEK SMALL LETTER ETA WITH OXIA', shcode=0x03B7, uccode=0x1FCB, specials={'char',0x03AE} },
+ [0x1F76] = { unicodeslot=0x1F76, category='ll', contextname='greekiotavaria', description='GREEK SMALL LETTER IOTA WITH VARIA', shcode=0x03B9, uccode=0x1FDA, specials={'char',0x03B9,0x0300} },
+ [0x1F77] = { unicodeslot=0x1F77, category='ll', contextname='greekiotaoxia', description='GREEK SMALL LETTER IOTA WITH OXIA', shcode=0x03B9, uccode=0x1FDB, specials={'char',0x03AF} },
+ [0x1F78] = { unicodeslot=0x1F78, category='ll', contextname='greekomicronvaria', description='GREEK SMALL LETTER OMICRON WITH VARIA', shcode=0x03BF, uccode=0x1FF8, specials={'char',0x03BF,0x0300} },
+ [0x1F79] = { unicodeslot=0x1F79, category='ll', contextname='greekomicronoxia', description='GREEK SMALL LETTER OMICRON WITH OXIA', shcode=0x03BF, uccode=0x1FF9, specials={'char',0x03CC} },
+ [0x1F7A] = { unicodeslot=0x1F7A, category='ll', contextname='greekupsilonvaria', description='GREEK SMALL LETTER UPSILON WITH VARIA', shcode=0x03C5, uccode=0x1FEA, specials={'char',0x03C5,0x0300} },
+ [0x1F7B] = { unicodeslot=0x1F7B, category='ll', contextname='greekupsilonoxia', description='GREEK SMALL LETTER UPSILON WITH OXIA', shcode=0x03C5, uccode=0x1FEB, specials={'char',0x03CD} },
+ [0x1F7C] = { unicodeslot=0x1F7C, category='ll', contextname='greekomegavaria', description='GREEK SMALL LETTER OMEGA WITH VARIA', shcode=0x03C9, uccode=0x1FFA, specials={'char',0x03C9,0x0300} },
+ [0x1F7D] = { unicodeslot=0x1F7D, category='ll', contextname='greekomegaoxia', description='GREEK SMALL LETTER OMEGA WITH OXIA', shcode=0x03C9, uccode=0x1FFB, specials={'char',0x03CE} },
+ [0x1F80] = { unicodeslot=0x1F80, category='ll', contextname='greekalphaiotasubpsili', description='GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F88, specials={'char',0x1F00,0x0345} },
+ [0x1F81] = { unicodeslot=0x1F81, category='ll', contextname='greekalphaiotasubdasia', description='GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F89, specials={'char',0x1F01,0x0345} },
+ [0x1F82] = { unicodeslot=0x1F82, category='ll', contextname='greekalphaiotasubpsilivaria', description='GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8A, specials={'char',0x1F02,0x0345} },
+ [0x1F83] = { unicodeslot=0x1F83, category='ll', contextname='greekalphaiotasubdasiavaria', description='GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8B, specials={'char',0x1F03,0x0345} },
+ [0x1F84] = { unicodeslot=0x1F84, category='ll', contextname='greekalphaiotasubpsilitonos', description='GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8C, specials={'char',0x1F04,0x0345} },
+ [0x1F85] = { unicodeslot=0x1F85, category='ll', contextname='greekalphaiotasubdasiatonos', description='GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8D, specials={'char',0x1F05,0x0345} },
+ [0x1F86] = { unicodeslot=0x1F86, category='ll', contextname='greekalphaiotasubpsiliperispomeni', description='GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8E, specials={'char',0x1F06,0x0345} },
+ [0x1F87] = { unicodeslot=0x1F87, category='ll', contextname='greekalphaiotasubdasiaperispomeni', description='GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8F, specials={'char',0x1F07,0x0345} },
+ [0x1F88] = { unicodeslot=0x1F88, category='lt', contextname='greekAlphaiotasubpsili', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F80, specials={'char',0x1F08,0x0345} },
+ [0x1F89] = { unicodeslot=0x1F89, category='lt', contextname='greekAlphaiotasubdasia', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F81, specials={'char',0x1F09,0x0345} },
+ [0x1F8A] = { unicodeslot=0x1F8A, category='lt', contextname='greekAlphaiotasubpsilivaria', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F82, specials={'char',0x1F0A,0x0345} },
+ [0x1F8B] = { unicodeslot=0x1F8B, category='lt', contextname='greekAlphaiotasubdasiavaria', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F83, specials={'char',0x1F0B,0x0345} },
+ [0x1F8C] = { unicodeslot=0x1F8C, category='lt', contextname='greekAlphaiotasubpsilitonos', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F84, specials={'char',0x1F0C,0x0345} },
+ [0x1F8D] = { unicodeslot=0x1F8D, category='lt', contextname='greekAlphaiotasubdasiatonos', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F85, specials={'char',0x1F0D,0x0345} },
+ [0x1F8E] = { unicodeslot=0x1F8E, category='lt', contextname='greekAlphaiotasubpsiliperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F86, specials={'char',0x1F0E,0x0345} },
+ [0x1F8F] = { unicodeslot=0x1F8F, category='lt', contextname='greekAlphaiotasubdasiaperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F87, specials={'char',0x1F0F,0x0345} },
+ [0x1F90] = { unicodeslot=0x1F90, category='ll', contextname='greeketaiotasubpsili', description='GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F98, specials={'char',0x1F20,0x0345} },
+ [0x1F91] = { unicodeslot=0x1F91, category='ll', contextname='greeketaiotasubdasia', description='GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F99, specials={'char',0x1F21,0x0345} },
+ [0x1F92] = { unicodeslot=0x1F92, category='ll', contextname='greeketaiotasubpsilivaria', description='GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9A, specials={'char',0x1F22,0x0345} },
+ [0x1F93] = { unicodeslot=0x1F93, category='ll', contextname='greeketaiotasubdasiavaria', description='GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9B, specials={'char',0x1F23,0x0345} },
+ [0x1F94] = { unicodeslot=0x1F94, category='ll', contextname='greeketaiotasubpsilitonos', description='GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9C, specials={'char',0x1F24,0x0345} },
+ [0x1F95] = { unicodeslot=0x1F95, category='ll', contextname='greeketaiotasubdasiatonos', description='GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9D, specials={'char',0x1F25,0x0345} },
+ [0x1F96] = { unicodeslot=0x1F96, category='ll', contextname='greeketaiotasubpsiliperispomeni', description='GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9E, specials={'char',0x1F26,0x0345} },
+ [0x1F97] = { unicodeslot=0x1F97, category='ll', contextname='greeketaiotasubdasiaperispomeni', description='GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9F, specials={'char',0x1F27,0x0345} },
+ [0x1F98] = { unicodeslot=0x1F98, category='lt', contextname='greekEtaiotasubpsili', description='GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F90, specials={'char',0x1F28,0x0345} },
+ [0x1F99] = { unicodeslot=0x1F99, category='lt', contextname='greekEtaiotasubdasia', description='GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F91, specials={'char',0x1F29,0x0345} },
+ [0x1F9A] = { unicodeslot=0x1F9A, category='lt', contextname='greekEtaiotasubpsilivaria', description='GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F92, specials={'char',0x1F2A,0x0345} },
+ [0x1F9B] = { unicodeslot=0x1F9B, category='lt', contextname='greekEtaiotasubdasiavaria', description='GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F93, specials={'char',0x1F2B,0x0345} },
+ [0x1F9C] = { unicodeslot=0x1F9C, category='lt', contextname='greekEtaiotasubpsilitonos', description='GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F94, specials={'char',0x1F2C,0x0345} },
+ [0x1F9D] = { unicodeslot=0x1F9D, category='lt', contextname='greekEtaiotasubdasiatonos', description='GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F95, specials={'char',0x1F2D,0x0345} },
+ [0x1F9E] = { unicodeslot=0x1F9E, category='lt', contextname='greekEtaiotasubpsiliperispomeni', description='GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F96, specials={'char',0x1F2E,0x0345} },
+ [0x1F9F] = { unicodeslot=0x1F9F, category='lt', contextname='greekEtaiotasubdasiaperispomeni', description='GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F97, specials={'char',0x1F2F,0x0345} },
+ [0x1FA0] = { unicodeslot=0x1FA0, category='ll', contextname='greekomegaiotasubpsili', description='GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FA8, specials={'char',0x1F60,0x0345} },
+ [0x1FA1] = { unicodeslot=0x1FA1, category='ll', contextname='greekomegaiotasubdasia', description='GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FA9, specials={'char',0x1F61,0x0345} },
+ [0x1FA2] = { unicodeslot=0x1FA2, category='ll', contextname='greekomegaiotasubpsilivaria', description='GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAA, specials={'char',0x1F62,0x0345} },
+ [0x1FA3] = { unicodeslot=0x1FA3, category='ll', contextname='greekomegaiotasubdasiavaria', description='GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAB, specials={'char',0x1F63,0x0345} },
+ [0x1FA4] = { unicodeslot=0x1FA4, category='ll', contextname='greekomegaiotasubpsilitonos', description='GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAC, specials={'char',0x1F64,0x0345} },
+ [0x1FA5] = { unicodeslot=0x1FA5, category='ll', contextname='greekomegaiotasubdasiatonos', description='GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAD, specials={'char',0x1F65,0x0345} },
+ [0x1FA6] = { unicodeslot=0x1FA6, category='ll', contextname='greekomegaiotasubpsiliperispomeni', description='GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAE, specials={'char',0x1F66,0x0345} },
+ [0x1FA7] = { unicodeslot=0x1FA7, category='ll', contextname='greekomegaiotasubdasiaperispomeni', description='GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAF, specials={'char',0x1F67,0x0345} },
+ [0x1FA8] = { unicodeslot=0x1FA8, category='lt', contextname='greekOmegaiotasubpsili', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA0, specials={'char',0x1F68,0x0345} },
+ [0x1FA9] = { unicodeslot=0x1FA9, category='lt', contextname='greekOmegaiotasubdasia', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA1, specials={'char',0x1F69,0x0345} },
+ [0x1FAA] = { unicodeslot=0x1FAA, category='lt', contextname='greekOmegaiotasubpsilivaria', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA2, specials={'char',0x1F6A,0x0345} },
+ [0x1FAB] = { unicodeslot=0x1FAB, category='lt', contextname='greekOmegaiotasubdasiavaria', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA3, specials={'char',0x1F6B,0x0345} },
+ [0x1FAC] = { unicodeslot=0x1FAC, category='lt', contextname='greekOmegaiotasubpsilitonos', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA4, specials={'char',0x1F6C,0x0345} },
+ [0x1FAD] = { unicodeslot=0x1FAD, category='lt', contextname='greekOmegaiotasubdasiatonos', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA5, specials={'char',0x1F6D,0x0345} },
+ [0x1FAE] = { unicodeslot=0x1FAE, category='lt', contextname='greekOmegaiotasubpsiliperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA6, specials={'char',0x1F6E,0x0345} },
+ [0x1FAF] = { unicodeslot=0x1FAF, category='lt', contextname='greekOmegaiotasubdasiaperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA7, specials={'char',0x1F6F,0x0345} },
+ [0x1FB0] = { unicodeslot=0x1FB0, category='ll', contextname='greekalphavrachy', description='GREEK SMALL LETTER ALPHA WITH VRACHY', shcode=0x03B1, uccode=0x1FB8, specials={'char',0x03B1,0x0306} },
+ [0x1FB1] = { unicodeslot=0x1FB1, category='ll', contextname='greekalphamacron', description='GREEK SMALL LETTER ALPHA WITH MACRON', shcode=0x03B1, uccode=0x1FB9, specials={'char',0x03B1,0x0304} },
+ [0x1FB2] = { unicodeslot=0x1FB2, category='ll', contextname='greekalphaiotasubvaria', description='GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI', shcode=0x03B1, specials={'char',0x1F70,0x0345} },
+ [0x1FB3] = { unicodeslot=0x1FB3, category='ll', contextname='greekalphaiotasub', description='GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1FBC, specials={'char',0x03B1,0x0345} },
+ [0x1FB4] = { unicodeslot=0x1FB4, category='ll', contextname='greekalphaiotasubtonos', description='GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI', shcode=0x03B1, specials={'char',0x03AC,0x0345} },
+ [0x1FB6] = { unicodeslot=0x1FB6, category='ll', contextname='greekalphaperispomeni', description='GREEK SMALL LETTER ALPHA WITH PERISPOMENI', shcode=0x03B1, specials={'char',0x03B1,0x0342} },
+ [0x1FB7] = { unicodeslot=0x1FB7, category='ll', contextname='greekalphaiotasubperispomeni', description='GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B1, specials={'char',0x1FB6,0x0345} },
+ [0x1FB8] = { unicodeslot=0x1FB8, category='lu', contextname='greekAlphavrachy', description='GREEK CAPITAL LETTER ALPHA WITH VRACHY', shcode=0x0391, lccode=0x1FB0, specials={'char',0x0391,0x0306} },
+ [0x1FB9] = { unicodeslot=0x1FB9, category='lu', contextname='greekAlphamacron', description='GREEK CAPITAL LETTER ALPHA WITH MACRON', shcode=0x0391, lccode=0x1FB1, specials={'char',0x0391,0x0304} },
+ [0x1FBA] = { unicodeslot=0x1FBA, category='lu', contextname='greekAlphavaria', description='GREEK CAPITAL LETTER ALPHA WITH VARIA', shcode=0x0391, lccode=0x1F70, specials={'char',0x0391,0x0300} },
+ [0x1FBB] = { unicodeslot=0x1FBB, category='lu', contextname='greekAlphatonos', description='GREEK CAPITAL LETTER ALPHA WITH OXIA', shcode=0x0391, lccode=0x1F71, specials={'char',0x0386} },
+ [0x1FBC] = { unicodeslot=0x1FBC, category='lt', contextname='greekAlphaiotasub', description='GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI', shcode=0x0391, lccode=0x1FB3, specials={'char',0x0391,0x0345} },
+ [0x1FBD] = { unicodeslot=0x1FBD, category='sk', contextname='greekCoronis', description='GREEK KORONIS', specials={'compat',0x0020,0x0313} },
+ [0x1FBE] = { unicodeslot=0x1FBE, category='ll', contextname='greekprosgegrammeni', description='GREEK PROSGEGRAMMENI', uccode=0x0399, specials={'char',0x03B9} },
+ [0x1FBF] = { unicodeslot=0x1FBF, category='sk', contextname='greekpsili', description='GREEK PSILI', specials={'compat',0x0020,0x0313} },
+ [0x1FC0] = { unicodeslot=0x1FC0, category='sk', contextname='greekperispomeni', description='GREEK PERISPOMENI', specials={'compat',0x0020,0x0342} },
+ [0x1FC1] = { unicodeslot=0x1FC1, category='sk', contextname='greekdialytikaperispomeni', description='GREEK DIALYTIKA AND PERISPOMENI', specials={'char',0x00A8,0x0342} },
+ [0x1FC2] = { unicodeslot=0x1FC2, category='ll', contextname='greeketaiotasubvaria', description='GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI', shcode=0x03B7, specials={'char',0x1F74,0x0345} },
+ [0x1FC3] = { unicodeslot=0x1FC3, category='ll', contextname='greeketaiotasub', description='GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1FCC, specials={'char',0x03B7,0x0345} },
+ [0x1FC4] = { unicodeslot=0x1FC4, category='ll', contextname='greeketaiotasubtonos', description='GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI', shcode=0x03B7, specials={'char',0x03AE,0x0345} },
+ [0x1FC6] = { unicodeslot=0x1FC6, category='ll', contextname='greeketaperispomeni', description='GREEK SMALL LETTER ETA WITH PERISPOMENI', shcode=0x03B7, specials={'char',0x03B7,0x0342} },
+ [0x1FC7] = { unicodeslot=0x1FC7, category='ll', contextname='greeketaiotasubperispomeni', description='GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B7, specials={'char',0x1FC6,0x0345} },
+ [0x1FC8] = { unicodeslot=0x1FC8, category='lu', contextname='greekEpsilonvaria', description='GREEK CAPITAL LETTER EPSILON WITH VARIA', shcode=0x0395, lccode=0x1F72, specials={'char',0x0395,0x0300} },
+ [0x1FC9] = { unicodeslot=0x1FC9, category='lu', contextname='greekEpsilontonos', description='GREEK CAPITAL LETTER EPSILON WITH OXIA', shcode=0x0395, lccode=0x1F73, specials={'char',0x0388} },
+ [0x1FCA] = { unicodeslot=0x1FCA, category='lu', contextname='greekEtavaria', description='GREEK CAPITAL LETTER ETA WITH VARIA', shcode=0x0397, lccode=0x1F74, specials={'char',0x0397,0x0300} },
+ [0x1FCB] = { unicodeslot=0x1FCB, category='lu', contextname='greekEtatonos', description='GREEK CAPITAL LETTER ETA WITH OXIA', shcode=0x0397, lccode=0x1F75, specials={'char',0x0389} },
+ [0x1FCC] = { unicodeslot=0x1FCC, category='lt', contextname='greekEtaiotasub', description='GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI', shcode=0x0397, lccode=0x1FC3, specials={'char',0x0397,0x0345} },
+ [0x1FCD] = { unicodeslot=0x1FCD, category='sk', contextname='greekpsilivaria', description='GREEK PSILI AND VARIA', specials={'char',0x1FBF,0x0300} },
+ [0x1FCE] = { unicodeslot=0x1FCE, category='sk', contextname='greekpsilitonos', description='GREEK PSILI AND OXIA', specials={'char',0x1FBF,0x0301} },
+ [0x1FCF] = { unicodeslot=0x1FCF, category='sk', contextname='greekpsiliperispomeni', description='GREEK PSILI AND PERISPOMENI', specials={'char',0x1FBF,0x0342} },
+ [0x1FD0] = { unicodeslot=0x1FD0, category='ll', contextname='greekiotavrachy', description='GREEK SMALL LETTER IOTA WITH VRACHY', shcode=0x03B9, uccode=0x1FD8, specials={'char',0x03B9,0x0306} },
+ [0x1FD1] = { unicodeslot=0x1FD1, category='ll', contextname='greekiotamacron', description='GREEK SMALL LETTER IOTA WITH MACRON', shcode=0x03B9, uccode=0x1FD9, specials={'char',0x03B9,0x0304} },
+ [0x1FD2] = { unicodeslot=0x1FD2, category='ll', contextname='greekiotadialytikavaria', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA', shcode=0x03B9, specials={'char',0x03CA,0x0300} },
+ [0x1FD3] = { unicodeslot=0x1FD3, category='ll', contextname='greekiotadialytikatonos', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA', shcode=0x03B9, specials={'char',0x0390} },
+ [0x1FD6] = { unicodeslot=0x1FD6, category='ll', contextname='greekiotaperispomeni', description='GREEK SMALL LETTER IOTA WITH PERISPOMENI', shcode=0x03B9, specials={'char',0x03B9,0x0342} },
+ [0x1FD7] = { unicodeslot=0x1FD7, category='ll', contextname='greekiotadialytikaperispomeni', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI', shcode=0x03B9, specials={'char',0x03CA,0x0342} },
+ [0x1FD8] = { unicodeslot=0x1FD8, category='lu', contextname='greekIotavrachy', description='GREEK CAPITAL LETTER IOTA WITH VRACHY', shcode=0x0399, lccode=0x1FD0, specials={'char',0x0399,0x0306} },
+ [0x1FD9] = { unicodeslot=0x1FD9, category='lu', contextname='greekIotamacron', description='GREEK CAPITAL LETTER IOTA WITH MACRON', shcode=0x0399, lccode=0x1FD1, specials={'char',0x0399,0x0304} },
+ [0x1FDA] = { unicodeslot=0x1FDA, category='lu', contextname='greekIotavaria', description='GREEK CAPITAL LETTER IOTA WITH VARIA', shcode=0x0399, lccode=0x1F76, specials={'char',0x0399,0x0300} },
+ [0x1FDB] = { unicodeslot=0x1FDB, category='lu', contextname='greekIotatonos', description='GREEK CAPITAL LETTER IOTA WITH OXIA', shcode=0x0399, lccode=0x1F77, specials={'char',0x038A} },
+ [0x1FDD] = { unicodeslot=0x1FDD, category='sk', contextname='greekdasiavaria', description='GREEK DASIA AND VARIA', specials={'char',0x1FFE,0x0300} },
+ [0x1FDE] = { unicodeslot=0x1FDE, category='sk', contextname='greekdasiatonos', description='GREEK DASIA AND OXIA', specials={'char',0x1FFE,0x0301} },
+ [0x1FDF] = { unicodeslot=0x1FDF, category='sk', contextname='greekdasiaperispomeni', description='GREEK DASIA AND PERISPOMENI', specials={'char',0x1FFE,0x0342} },
+ [0x1FE0] = { unicodeslot=0x1FE0, category='ll', contextname='greekupsilonvrachy', description='GREEK SMALL LETTER UPSILON WITH VRACHY', shcode=0x03C5, uccode=0x1FE8, specials={'char',0x03C5,0x0306} },
+ [0x1FE1] = { unicodeslot=0x1FE1, category='ll', contextname='greekupsilonmacron', description='GREEK SMALL LETTER UPSILON WITH MACRON', shcode=0x03C5, uccode=0x1FE9, specials={'char',0x03C5,0x0304} },
+ [0x1FE2] = { unicodeslot=0x1FE2, category='ll', contextname='greekupsilondialytikavaria', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA', shcode=0x03C5, specials={'char',0x03CB,0x0300} },
+ [0x1FE3] = { unicodeslot=0x1FE3, category='ll', contextname='greekupsilondialytikatonos', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA', shcode=0x03C5, specials={'char',0x03B0} },
+ [0x1FE4] = { unicodeslot=0x1FE4, category='ll', contextname='greekrhopsili', description='GREEK SMALL LETTER RHO WITH PSILI', shcode=0x03C1, specials={'char',0x03C1,0x0313} },
+ [0x1FE5] = { unicodeslot=0x1FE5, category='ll', contextname='greekrhodasia', description='GREEK SMALL LETTER RHO WITH DASIA', shcode=0x03C1, uccode=0x1FEC, specials={'char',0x03C1,0x0314} },
+ [0x1FE6] = { unicodeslot=0x1FE6, category='ll', contextname='greekupsilonperispomeni', description='GREEK SMALL LETTER UPSILON WITH PERISPOMENI', shcode=0x03C5, specials={'char',0x03C5,0x0342} },
+ [0x1FE7] = { unicodeslot=0x1FE7, category='ll', contextname='greekupsilondialytikaperispomeni', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI', shcode=0x03C5, specials={'char',0x03CB,0x0342} },
+ [0x1FE8] = { unicodeslot=0x1FE8, category='lu', contextname='greekUpsilonvrachy', description='GREEK CAPITAL LETTER UPSILON WITH VRACHY', shcode=0x03A5, lccode=0x1FE0, specials={'char',0x03A5,0x0306} },
+ [0x1FE9] = { unicodeslot=0x1FE9, category='lu', contextname='greekUpsilonmacron', description='GREEK CAPITAL LETTER UPSILON WITH MACRON', shcode=0x03A5, lccode=0x1FE1, specials={'char',0x03A5,0x0304} },
+ [0x1FEA] = { unicodeslot=0x1FEA, category='lu', contextname='greekUpsilonvaria', description='GREEK CAPITAL LETTER UPSILON WITH VARIA', shcode=0x03A5, lccode=0x1F7A, specials={'char',0x03A5,0x0300} },
+ [0x1FEB] = { unicodeslot=0x1FEB, category='lu', contextname='greekUpsilontonos', description='GREEK CAPITAL LETTER UPSILON WITH OXIA', shcode=0x03A5, lccode=0x1F7B, specials={'char',0x038E} },
+ [0x1FEC] = { unicodeslot=0x1FEC, category='lu', contextname='greekRhodasia', description='GREEK CAPITAL LETTER RHO WITH DASIA', shcode=0x03A1, lccode=0x1FE5, specials={'char',0x03A1,0x0314} },
+ [0x1FED] = { unicodeslot=0x1FED, category='sk', contextname='greekdialytikavaria', description='GREEK DIALYTIKA AND VARIA', specials={'char',0x00A8,0x0300} },
+ [0x1FEE] = { unicodeslot=0x1FEE, category='sk', contextname='greekdialytikatonos', description='GREEK DIALYTIKA AND OXIA', specials={'char',0x0385} },
+ [0x1FEF] = { unicodeslot=0x1FEF, category='sk', contextname='greekvaria', description='GREEK VARIA', specials={'char',0x0060} },
+ [0x1FF2] = { unicodeslot=0x1FF2, category='ll', contextname='greekomegaiotasubvaria', description='GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI', shcode=0x03C9, specials={'char',0x1F7C,0x0345} },
+ [0x1FF3] = { unicodeslot=0x1FF3, category='ll', contextname='greekomegaiotasub', description='GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FFC, specials={'char',0x03C9,0x0345} },
+ [0x1FF4] = { unicodeslot=0x1FF4, category='ll', contextname='greekomegaiotasubtonos', description='GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI', shcode=0x03C9, specials={'char',0x03CE,0x0345} },
+ [0x1FF6] = { unicodeslot=0x1FF6, category='ll', contextname='greekomegaperispomeni', description='GREEK SMALL LETTER OMEGA WITH PERISPOMENI', shcode=0x03C9, specials={'char',0x03C9,0x0342} },
+ [0x1FF7] = { unicodeslot=0x1FF7, category='ll', contextname='greekomegaiotasubperispomeni', description='GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03C9, specials={'char',0x1FF6,0x0345} },
+ [0x1FF8] = { unicodeslot=0x1FF8, category='lu', contextname='greekOmicronvaria', description='GREEK CAPITAL LETTER OMICRON WITH VARIA', shcode=0x039F, lccode=0x1F78, specials={'char',0x039F,0x0300} },
+ [0x1FF9] = { unicodeslot=0x1FF9, category='lu', contextname='greekOmicrontonos', description='GREEK CAPITAL LETTER OMICRON WITH OXIA', shcode=0x039F, lccode=0x1F79, specials={'char',0x038C} },
+ [0x1FFA] = { unicodeslot=0x1FFA, category='lu', contextname='greekOmegavaria', description='GREEK CAPITAL LETTER OMEGA WITH VARIA', shcode=0x03A9, lccode=0x1F7C, specials={'char',0x03A9,0x0300} },
+ [0x1FFB] = { unicodeslot=0x1FFB, category='lu', contextname='greekOmegatonos', description='GREEK CAPITAL LETTER OMEGA WITH OXIA', shcode=0x03A9, lccode=0x1F7D, specials={'char',0x038F} },
+ [0x1FFC] = { unicodeslot=0x1FFC, category='lt', contextname='greekOmegaiotasub', description='GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FF3, specials={'char',0x03A9,0x0345} },
+ [0x1FFD] = { unicodeslot=0x1FFD, category='sk', contextname='greekoxia', description='GREEK OXIA', specials={'char',0x00B4} },
+ [0x1FFE] = { unicodeslot=0x1FFE, category='sk', contextname='greekdasia', description='GREEK DASIA', specials={'compat',0x0020,0x0314} },
+ [0x2000] = { unicodeslot=0x2000, category='zs', description='EN QUAD', specials={'char',0x2002} },
+ [0x2001] = { unicodeslot=0x2001, category='zs', description='EM QUAD', specials={'char',0x2003} },
+ [0x2002] = { unicodeslot=0x2002, category='zs', description='EN SPACE', specials={'compat',0x0020} },
+ [0x2003] = { unicodeslot=0x2003, category='zs', description='EM SPACE', specials={'compat',0x0020} },
+ [0x2004] = { unicodeslot=0x2004, category='zs', description='THREE-PER-EM SPACE', specials={'compat',0x0020} },
+ [0x2005] = { unicodeslot=0x2005, category='zs', description='FOUR-PER-EM SPACE', specials={'compat',0x0020} },
+ [0x2006] = { unicodeslot=0x2006, category='zs', description='SIX-PER-EM SPACE', specials={'compat',0x0020} },
+ [0x2007] = { unicodeslot=0x2007, category='zs', description='FIGURE SPACE', specials={'nobreak',0x0020} },
+ [0x2008] = { unicodeslot=0x2008, category='zs', description='PUNCTUATION SPACE', specials={'compat',0x0020} },
+ [0x2009] = { unicodeslot=0x2009, category='zs', description='THIN SPACE', specials={'compat',0x0020} },
+ [0x200A] = { unicodeslot=0x200A, category='zs', description='HAIR SPACE', specials={'compat',0x0020} },
+ [0x200B] = { unicodeslot=0x200B, category='cf', description='ZERO WIDTH SPACE' },
+ [0x200C] = { unicodeslot=0x200C, category='cf', adobename='afii61664', description='ZERO WIDTH NON-JOINER' },
+ [0x200D] = { unicodeslot=0x200D, category='cf', adobename='afii301', description='ZERO WIDTH JOINER' },
+ [0x200E] = { unicodeslot=0x200E, category='cf', adobename='afii299', description='LEFT-TO-RIGHT MARK' },
+ [0x200F] = { unicodeslot=0x200F, category='cf', adobename='afii300', description='RIGHT-TO-LEFT MARK' },
+ [0x2010] = { unicodeslot=0x2010, category='pd', description='HYPHEN' },
+ [0x2011] = { unicodeslot=0x2011, category='pd', description='NON-BREAKING HYPHEN', specials={'nobreak',0x2010} },
+ [0x2012] = { unicodeslot=0x2012, category='pd', adobename='figuredash', contextname='textminus', description='FIGURE DASH' },
+ [0x2013] = { unicodeslot=0x2013, category='pd', adobename='endash', contextname='endash', description='EN DASH' },
+ [0x2014] = { unicodeslot=0x2014, category='pd', adobename='emdash', contextname='emdash', description='EM DASH' },
+ [0x2015] = { unicodeslot=0x2015, category='pd', adobename='afii00208', contextname='texthorizontalbar', description='HORIZONTAL BAR' },
+ [0x2016] = { unicodeslot=0x2016, category='po', description='DOUBLE VERTICAL LINE' },
+ [0x2017] = { unicodeslot=0x2017, category='po', adobename='underscoredbl', description='DOUBLE LOW LINE', specials={'compat',0x0020,0x0333} },
+ [0x2018] = { unicodeslot=0x2018, category='pi', adobename='quoteleft', contextname='quoteleft', description='LEFT SINGLE QUOTATION MARK' },
+ [0x2019] = { unicodeslot=0x2019, category='pf', adobename='quoteright', contextname='quoteright', description='RIGHT SINGLE QUOTATION MARK' },
+ [0x201A] = { unicodeslot=0x201A, category='ps', adobename='quotesinglbase', contextname='quotesinglebase', description='SINGLE LOW-9 QUOTATION MARK' },
+ [0x201B] = { unicodeslot=0x201B, category='pi', adobename='quotereversed', description='SINGLE HIGH-REVERSED-9 QUOTATION MARK' },
+ [0x201C] = { unicodeslot=0x201C, category='pi', adobename='quotedblleft', contextname='quotedblleft', description='LEFT DOUBLE QUOTATION MARK' },
+ [0x201D] = { unicodeslot=0x201D, category='pf', adobename='quotedblright', contextname='quotedblright', description='RIGHT DOUBLE QUOTATION MARK' },
+ [0x201E] = { unicodeslot=0x201E, category='ps', adobename='quotedblbase', contextname='quotedblbase', description='DOUBLE LOW-9 QUOTATION MARK' },
+ [0x201F] = { unicodeslot=0x201F, category='pi', description='DOUBLE HIGH-REVERSED-9 QUOTATION MARK' },
+ [0x2020] = { unicodeslot=0x2020, category='po', adobename='dagger', contextname='textdag', description='DAGGER' },
+ [0x2021] = { unicodeslot=0x2021, category='po', adobename='daggerdbl', contextname='textddag', description='DOUBLE DAGGER' },
+ [0x2022] = { unicodeslot=0x2022, category='po', adobename='bullet', contextname='textbullet', description='BULLET' },
+ [0x2023] = { unicodeslot=0x2023, category='po', description='TRIANGULAR BULLET' },
+ [0x2024] = { unicodeslot=0x2024, category='po', adobename='onedotenleader', description='ONE DOT LEADER', specials={'compat',0x002E} },
+ [0x2025] = { unicodeslot=0x2025, category='po', adobename='twodotenleader', description='TWO DOT LEADER', specials={'compat',0x002E,0x002E} },
+ [0x2026] = { unicodeslot=0x2026, category='po', adobename='ellipsis', contextname='textellipsis', description='HORIZONTAL ELLIPSIS', specials={'compat',0x002E,0x002E,0x002E} },
+ [0x2027] = { unicodeslot=0x2027, category='po', description='HYPHENATION POINT' },
+ [0x2028] = { unicodeslot=0x2028, category='zl', description='LINE SEPARATOR' },
+ [0x2029] = { unicodeslot=0x2029, category='zp', description='PARAGRAPH SEPARATOR' },
+ [0x202A] = { unicodeslot=0x202A, category='cf', description='LEFT-TO-RIGHT EMBEDDING' },
+ [0x202B] = { unicodeslot=0x202B, category='cf', description='RIGHT-TO-LEFT EMBEDDING' },
+ [0x202C] = { unicodeslot=0x202C, category='cf', adobename='afii61573', description='POP DIRECTIONAL FORMATTING' },
+ [0x202D] = { unicodeslot=0x202D, category='cf', adobename='afii61574', description='LEFT-TO-RIGHT OVERRIDE' },
+ [0x202E] = { unicodeslot=0x202E, category='cf', adobename='afii61575', description='RIGHT-TO-LEFT OVERRIDE' },
+ [0x202F] = { unicodeslot=0x202F, category='zs', description='NARROW NO-BREAK SPACE', specials={'nobreak',0x0020} },
+ [0x2030] = { unicodeslot=0x2030, category='po', adobename='perthousand', contextname='perthousand', description='PER MILLE SIGN' },
+ [0x2031] = { unicodeslot=0x2031, category='po', description='PER TEN THOUSAND SIGN' },
+ [0x2032] = { unicodeslot=0x2032, category='po', adobename='minute', description='PRIME' },
+ [0x2033] = { unicodeslot=0x2033, category='po', adobename='second', description='DOUBLE PRIME', specials={'compat',0x2032,0x2032} },
+ [0x2034] = { unicodeslot=0x2034, category='po', description='TRIPLE PRIME', specials={'compat',0x2032,0x2032,0x2032} },
+ [0x2035] = { unicodeslot=0x2035, category='po', description='REVERSED PRIME' },
+ [0x2036] = { unicodeslot=0x2036, category='po', description='REVERSED DOUBLE PRIME', specials={'compat',0x2035,0x2035} },
+ [0x2037] = { unicodeslot=0x2037, category='po', description='REVERSED TRIPLE PRIME', specials={'compat',0x2035,0x2035,0x2035} },
+ [0x2038] = { unicodeslot=0x2038, category='po', description='CARET' },
+ [0x2039] = { unicodeslot=0x2039, category='pi', adobename='guilsinglleft', contextname='guilsingleleft', description='SINGLE LEFT-POINTING ANGLE QUOTATION MARK' },
+ [0x203A] = { unicodeslot=0x203A, category='pf', adobename='guilsinglright', contextname='guilsingleright', description='SINGLE RIGHT-POINTING ANGLE QUOTATION MARK' },
+ [0x203B] = { unicodeslot=0x203B, category='po', description='REFERENCE MARK' },
+ [0x203C] = { unicodeslot=0x203C, category='po', adobename='exclamdbl', description='DOUBLE EXCLAMATION MARK', specials={'compat',0x0021,0x0021} },
+ [0x203D] = { unicodeslot=0x203D, category='po', description='INTERROBANG' },
+ [0x203E] = { unicodeslot=0x203E, category='po', description='OVERLINE', specials={'compat',0x0020,0x0305} },
+ [0x203F] = { unicodeslot=0x203F, category='pc', description='UNDERTIE' },
+ [0x2040] = { unicodeslot=0x2040, category='pc', description='CHARACTER TIE' },
+ [0x2041] = { unicodeslot=0x2041, category='po', description='CARET INSERTION POINT' },
+ [0x2042] = { unicodeslot=0x2042, category='po', description='ASTERISM' },
+ [0x2043] = { unicodeslot=0x2043, category='po', description='HYPHEN BULLET' },
+ [0x2044] = { unicodeslot=0x2044, category='sm', adobename='fraction', description='FRACTION SLASH' },
+ [0x2045] = { unicodeslot=0x2045, category='ps', description='LEFT SQUARE BRACKET WITH QUILL' },
+ [0x2046] = { unicodeslot=0x2046, category='pe', description='RIGHT SQUARE BRACKET WITH QUILL' },
+ [0x2047] = { unicodeslot=0x2047, category='po', description='DOUBLE QUESTION MARK', specials={'compat',0x003F,0x003F} },
+ [0x2048] = { unicodeslot=0x2048, category='po', description='QUESTION EXCLAMATION MARK', specials={'compat',0x003F,0x0021} },
+ [0x2049] = { unicodeslot=0x2049, category='po', description='EXCLAMATION QUESTION MARK', specials={'compat',0x0021,0x003F} },
+ [0x204A] = { unicodeslot=0x204A, category='po', description='TIRONIAN SIGN ET' },
+ [0x204B] = { unicodeslot=0x204B, category='po', description='REVERSED PILCROW SIGN' },
+ [0x204C] = { unicodeslot=0x204C, category='po', description='BLACK LEFTWARDS BULLET' },
+ [0x204D] = { unicodeslot=0x204D, category='po', description='BLACK RIGHTWARDS BULLET' },
+ [0x204E] = { unicodeslot=0x204E, category='po', description='LOW ASTERISK' },
+ [0x204F] = { unicodeslot=0x204F, category='po', description='REVERSED SEMICOLON' },
+ [0x2050] = { unicodeslot=0x2050, category='po', description='CLOSE UP' },
+ [0x2051] = { unicodeslot=0x2051, category='po', description='TWO ASTERISKS ALIGNED VERTICALLY' },
+ [0x2052] = { unicodeslot=0x2052, category='sm', description='COMMERCIAL MINUS SIGN' },
+ [0x2053] = { unicodeslot=0x2053, category='po', description='SWUNG DASH' },
+ [0x2054] = { unicodeslot=0x2054, category='pc', description='INVERTED UNDERTIE' },
+ [0x2055] = { unicodeslot=0x2055, category='po', description='FLOWER PUNCTUATION MARK' },
+ [0x2056] = { unicodeslot=0x2056, category='po', description='THREE DOT PUNCTUATION' },
+ [0x2057] = { unicodeslot=0x2057, category='po', description='QUADRUPLE PRIME', specials={'compat',0x2032,0x2032,0x2032,0x2032} },
+ [0x2058] = { unicodeslot=0x2058, category='po', description='FOUR DOT PUNCTUATION' },
+ [0x2059] = { unicodeslot=0x2059, category='po', description='FIVE DOT PUNCTUATION' },
+ [0x205A] = { unicodeslot=0x205A, category='po', description='TWO DOT PUNCTUATION' },
+ [0x205B] = { unicodeslot=0x205B, category='po', description='FOUR DOT MARK' },
+ [0x205C] = { unicodeslot=0x205C, category='po', description='DOTTED CROSS' },
+ [0x205D] = { unicodeslot=0x205D, category='po', description='TRICOLON' },
+ [0x205E] = { unicodeslot=0x205E, category='po', description='VERTICAL FOUR DOTS' },
+ [0x205F] = { unicodeslot=0x205F, category='zs', description='MEDIUM MATHEMATICAL SPACE', specials={'compat',0x0020} },
+ [0x2060] = { unicodeslot=0x2060, category='cf', description='WORD JOINER' },
+ [0x2061] = { unicodeslot=0x2061, category='cf', description='FUNCTION APPLICATION' },
+ [0x2062] = { unicodeslot=0x2062, category='cf', description='INVISIBLE TIMES' },
+ [0x2063] = { unicodeslot=0x2063, category='cf', description='INVISIBLE SEPARATOR' },
+ [0x206A] = { unicodeslot=0x206A, category='cf', description='INHIBIT SYMMETRIC SWAPPING' },
+ [0x206B] = { unicodeslot=0x206B, category='cf', description='ACTIVATE SYMMETRIC SWAPPING' },
+ [0x206C] = { unicodeslot=0x206C, category='cf', description='INHIBIT ARABIC FORM SHAPING' },
+ [0x206D] = { unicodeslot=0x206D, category='cf', description='ACTIVATE ARABIC FORM SHAPING' },
+ [0x206E] = { unicodeslot=0x206E, category='cf', description='NATIONAL DIGIT SHAPES' },
+ [0x206F] = { unicodeslot=0x206F, category='cf', description='NOMINAL DIGIT SHAPES' },
+ [0x2070] = { unicodeslot=0x2070, category='no', description='SUPERSCRIPT ZERO', specials={'super',0x0030} },
+ [0x2071] = { unicodeslot=0x2071, category='ll', description='SUPERSCRIPT LATIN SMALL LETTER I', specials={'super',0x0069} },
+ [0x2074] = { unicodeslot=0x2074, category='no', description='SUPERSCRIPT FOUR', specials={'super',0x0034} },
+ [0x2075] = { unicodeslot=0x2075, category='no', description='SUPERSCRIPT FIVE', specials={'super',0x0035} },
+ [0x2076] = { unicodeslot=0x2076, category='no', description='SUPERSCRIPT SIX', specials={'super',0x0036} },
+ [0x2077] = { unicodeslot=0x2077, category='no', description='SUPERSCRIPT SEVEN', specials={'super',0x0037} },
+ [0x2078] = { unicodeslot=0x2078, category='no', description='SUPERSCRIPT EIGHT', specials={'super',0x0038} },
+ [0x2079] = { unicodeslot=0x2079, category='no', description='SUPERSCRIPT NINE', specials={'super',0x0039} },
+ [0x207A] = { unicodeslot=0x207A, category='sm', description='SUPERSCRIPT PLUS SIGN', specials={'super',0x002B} },
+ [0x207B] = { unicodeslot=0x207B, category='sm', description='SUPERSCRIPT MINUS', specials={'super',0x2212} },
+ [0x207C] = { unicodeslot=0x207C, category='sm', description='SUPERSCRIPT EQUALS SIGN', specials={'super',0x003D} },
+ [0x207D] = { unicodeslot=0x207D, category='ps', description='SUPERSCRIPT LEFT PARENTHESIS', specials={'super',0x0028} },
+ [0x207E] = { unicodeslot=0x207E, category='pe', description='SUPERSCRIPT RIGHT PARENTHESIS', specials={'super',0x0029} },
+ [0x207F] = { unicodeslot=0x207F, category='ll', description='SUPERSCRIPT LATIN SMALL LETTER N', specials={'super',0x006E} },
+ [0x2080] = { unicodeslot=0x2080, category='no', description='SUBSCRIPT ZERO', specials={'sub',0x0030} },
+ [0x2081] = { unicodeslot=0x2081, category='no', description='SUBSCRIPT ONE', specials={'sub',0x0031} },
+ [0x2082] = { unicodeslot=0x2082, category='no', description='SUBSCRIPT TWO', specials={'sub',0x0032} },
+ [0x2083] = { unicodeslot=0x2083, category='no', description='SUBSCRIPT THREE', specials={'sub',0x0033} },
+ [0x2084] = { unicodeslot=0x2084, category='no', description='SUBSCRIPT FOUR', specials={'sub',0x0034} },
+ [0x2085] = { unicodeslot=0x2085, category='no', description='SUBSCRIPT FIVE', specials={'sub',0x0035} },
+ [0x2086] = { unicodeslot=0x2086, category='no', description='SUBSCRIPT SIX', specials={'sub',0x0036} },
+ [0x2087] = { unicodeslot=0x2087, category='no', description='SUBSCRIPT SEVEN', specials={'sub',0x0037} },
+ [0x2088] = { unicodeslot=0x2088, category='no', description='SUBSCRIPT EIGHT', specials={'sub',0x0038} },
+ [0x2089] = { unicodeslot=0x2089, category='no', description='SUBSCRIPT NINE', specials={'sub',0x0039} },
+ [0x208A] = { unicodeslot=0x208A, category='sm', description='SUBSCRIPT PLUS SIGN', specials={'sub',0x002B} },
+ [0x208B] = { unicodeslot=0x208B, category='sm', description='SUBSCRIPT MINUS', specials={'sub',0x2212} },
+ [0x208C] = { unicodeslot=0x208C, category='sm', description='SUBSCRIPT EQUALS SIGN', specials={'sub',0x003D} },
+ [0x208D] = { unicodeslot=0x208D, category='ps', description='SUBSCRIPT LEFT PARENTHESIS', specials={'sub',0x0028} },
+ [0x208E] = { unicodeslot=0x208E, category='pe', description='SUBSCRIPT RIGHT PARENTHESIS', specials={'sub',0x0029} },
+ [0x2090] = { unicodeslot=0x2090, category='lm', description='LATIN SUBSCRIPT SMALL LETTER A', specials={'sub',0x0061} },
+ [0x2091] = { unicodeslot=0x2091, category='lm', description='LATIN SUBSCRIPT SMALL LETTER E', specials={'sub',0x0065} },
+ [0x2092] = { unicodeslot=0x2092, category='lm', description='LATIN SUBSCRIPT SMALL LETTER O', specials={'sub',0x006F} },
+ [0x2093] = { unicodeslot=0x2093, category='lm', description='LATIN SUBSCRIPT SMALL LETTER X', specials={'sub',0x0078} },
+ [0x2094] = { unicodeslot=0x2094, category='lm', description='LATIN SUBSCRIPT SMALL LETTER SCHWA', specials={'sub',0x0259} },
+ [0x20A0] = { unicodeslot=0x20A0, category='sc', description='EURO-CURRENCY SIGN' },
+ [0x20A1] = { unicodeslot=0x20A1, category='sc', adobename='colonmonetary', description='COLON SIGN' },
+ [0x20A2] = { unicodeslot=0x20A2, category='sc', description='CRUZEIRO SIGN' },
+ [0x20A3] = { unicodeslot=0x20A3, category='sc', adobename='franc', description='FRENCH FRANC SIGN' },
+ [0x20A4] = { unicodeslot=0x20A4, category='sc', adobename='lira', description='LIRA SIGN' },
+ [0x20A5] = { unicodeslot=0x20A5, category='sc', description='MILL SIGN' },
+ [0x20A6] = { unicodeslot=0x20A6, category='sc', description='NAIRA SIGN' },
+ [0x20A7] = { unicodeslot=0x20A7, category='sc', adobename='peseta', description='PESETA SIGN' },
+ [0x20A8] = { unicodeslot=0x20A8, category='sc', description='RUPEE SIGN', specials={'compat',0x0052,0x0073} },
+ [0x20A9] = { unicodeslot=0x20A9, category='sc', description='WON SIGN' },
+ [0x20AA] = { unicodeslot=0x20AA, category='sc', adobename='afii57636', description='NEW SHEQEL SIGN' },
+ [0x20AB] = { unicodeslot=0x20AB, category='sc', adobename='dong', contextname='textdong', description='DONG SIGN' },
+ [0x20AC] = { unicodeslot=0x20AC, category='sc', adobename='Euro', contextname='texteuro', description='EURO SIGN' },
+ [0x20AD] = { unicodeslot=0x20AD, category='sc', description='KIP SIGN' },
+ [0x20AE] = { unicodeslot=0x20AE, category='sc', description='TUGRIK SIGN' },
+ [0x20AF] = { unicodeslot=0x20AF, category='sc', description='DRACHMA SIGN' },
+ [0x20B0] = { unicodeslot=0x20B0, category='sc', description='GERMAN PENNY SIGN' },
+ [0x20B1] = { unicodeslot=0x20B1, category='sc', description='PESO SIGN' },
+ [0x20B2] = { unicodeslot=0x20B2, category='sc', description='GUARANI SIGN' },
+ [0x20B3] = { unicodeslot=0x20B3, category='sc', description='AUSTRAL SIGN' },
+ [0x20B4] = { unicodeslot=0x20B4, category='sc', description='HRYVNIA SIGN' },
+ [0x20B5] = { unicodeslot=0x20B5, category='sc', description='CEDI SIGN' },
+ [0x20D0] = { unicodeslot=0x20D0, category='mn', description='COMBINING LEFT HARPOON ABOVE' },
+ [0x20D1] = { unicodeslot=0x20D1, category='mn', description='COMBINING RIGHT HARPOON ABOVE' },
+ [0x20D2] = { unicodeslot=0x20D2, category='mn', description='COMBINING LONG VERTICAL LINE OVERLAY' },
+ [0x20D3] = { unicodeslot=0x20D3, category='mn', description='COMBINING SHORT VERTICAL LINE OVERLAY' },
+ [0x20D4] = { unicodeslot=0x20D4, category='mn', description='COMBINING ANTICLOCKWISE ARROW ABOVE' },
+ [0x20D5] = { unicodeslot=0x20D5, category='mn', description='COMBINING CLOCKWISE ARROW ABOVE' },
+ [0x20D6] = { unicodeslot=0x20D6, category='mn', description='COMBINING LEFT ARROW ABOVE' },
+ [0x20D7] = { unicodeslot=0x20D7, category='mn', description='COMBINING RIGHT ARROW ABOVE' },
+ [0x20D8] = { unicodeslot=0x20D8, category='mn', description='COMBINING RING OVERLAY' },
+ [0x20D9] = { unicodeslot=0x20D9, category='mn', description='COMBINING CLOCKWISE RING OVERLAY' },
+ [0x20DA] = { unicodeslot=0x20DA, category='mn', description='COMBINING ANTICLOCKWISE RING OVERLAY' },
+ [0x20DB] = { unicodeslot=0x20DB, category='mn', description='COMBINING THREE DOTS ABOVE' },
+ [0x20DC] = { unicodeslot=0x20DC, category='mn', description='COMBINING FOUR DOTS ABOVE' },
+ [0x20DD] = { unicodeslot=0x20DD, category='me', description='COMBINING ENCLOSING CIRCLE' },
+ [0x20DE] = { unicodeslot=0x20DE, category='me', description='COMBINING ENCLOSING SQUARE' },
+ [0x20DF] = { unicodeslot=0x20DF, category='me', description='COMBINING ENCLOSING DIAMOND' },
+ [0x20E0] = { unicodeslot=0x20E0, category='me', description='COMBINING ENCLOSING CIRCLE BACKSLASH' },
+ [0x20E1] = { unicodeslot=0x20E1, category='mn', description='COMBINING LEFT RIGHT ARROW ABOVE' },
+ [0x20E2] = { unicodeslot=0x20E2, category='me', description='COMBINING ENCLOSING SCREEN' },
+ [0x20E3] = { unicodeslot=0x20E3, category='me', description='COMBINING ENCLOSING KEYCAP' },
+ [0x20E4] = { unicodeslot=0x20E4, category='me', description='COMBINING ENCLOSING UPWARD POINTING TRIANGLE' },
+ [0x20E5] = { unicodeslot=0x20E5, category='mn', description='COMBINING REVERSE SOLIDUS OVERLAY' },
+ [0x20E6] = { unicodeslot=0x20E6, category='mn', description='COMBINING DOUBLE VERTICAL STROKE OVERLAY' },
+ [0x20E7] = { unicodeslot=0x20E7, category='mn', description='COMBINING ANNUITY SYMBOL' },
+ [0x20E8] = { unicodeslot=0x20E8, category='mn', description='COMBINING TRIPLE UNDERDOT' },
+ [0x20E9] = { unicodeslot=0x20E9, category='mn', description='COMBINING WIDE BRIDGE ABOVE' },
+ [0x20EA] = { unicodeslot=0x20EA, category='mn', description='COMBINING LEFTWARDS ARROW OVERLAY' },
+ [0x20EB] = { unicodeslot=0x20EB, category='mn', description='COMBINING LONG DOUBLE SOLIDUS OVERLAY' },
+ [0x20EC] = { unicodeslot=0x20EC, category='mn', description='COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS' },
+ [0x20ED] = { unicodeslot=0x20ED, category='mn', description='COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS' },
+ [0x20EE] = { unicodeslot=0x20EE, category='mn', description='COMBINING LEFT ARROW BELOW' },
+ [0x20EF] = { unicodeslot=0x20EF, category='mn', description='COMBINING RIGHT ARROW BELOW' },
+ [0x2100] = { unicodeslot=0x2100, category='so', description='ACCOUNT OF', specials={'compat',0x0061,0x002F,0x0063} },
+ [0x2101] = { unicodeslot=0x2101, category='so', description='ADDRESSED TO THE SUBJECT', specials={'compat',0x0061,0x002F,0x0073} },
+ [0x2102] = { unicodeslot=0x2102, category='lu', description='DOUBLE-STRUCK CAPITAL C', specials={'font',0x0043} },
+ [0x2103] = { unicodeslot=0x2103, category='so', description='DEGREE CELSIUS', specials={'compat',0x00B0,0x0043} },
+ [0x2104] = { unicodeslot=0x2104, category='so', description='CENTRE LINE SYMBOL' },
+ [0x2105] = { unicodeslot=0x2105, category='so', adobename='afii61248', description='CARE OF', specials={'compat',0x0063,0x002F,0x006F} },
+ [0x2106] = { unicodeslot=0x2106, category='so', description='CADA UNA', specials={'compat',0x0063,0x002F,0x0075} },
+ [0x2107] = { unicodeslot=0x2107, category='lu', description='EULER CONSTANT', specials={'compat',0x0190} },
+ [0x2108] = { unicodeslot=0x2108, category='so', description='SCRUPLE' },
+ [0x2109] = { unicodeslot=0x2109, category='so', description='DEGREE FAHRENHEIT', specials={'compat',0x00B0,0x0046} },
+ [0x210A] = { unicodeslot=0x210A, category='ll', description='SCRIPT SMALL G', specials={'font',0x0067} },
+ [0x210B] = { unicodeslot=0x210B, category='lu', description='SCRIPT CAPITAL H', specials={'font',0x0048} },
+ [0x210C] = { unicodeslot=0x210C, category='lu', description='BLACK-LETTER CAPITAL H', specials={'font',0x0048} },
+ [0x210D] = { unicodeslot=0x210D, category='lu', description='DOUBLE-STRUCK CAPITAL H', specials={'font',0x0048} },
+ [0x210E] = { unicodeslot=0x210E, category='ll', description='PLANCK CONSTANT', specials={'font',0x0068} },
+ [0x210F] = { unicodeslot=0x210F, category='ll', description='PLANCK CONSTANT OVER TWO PI', specials={'font',0x0127} },
+ [0x2110] = { unicodeslot=0x2110, category='lu', description='SCRIPT CAPITAL I', specials={'font',0x0049} },
+ [0x2111] = { unicodeslot=0x2111, category='lu', adobename='Ifraktur', description='BLACK-LETTER CAPITAL I', specials={'font',0x0049} },
+ [0x2112] = { unicodeslot=0x2112, category='lu', description='SCRIPT CAPITAL L', specials={'font',0x004C} },
+ [0x2113] = { unicodeslot=0x2113, category='ll', adobename='afii61289', description='SCRIPT SMALL L', specials={'font',0x006C} },
+ [0x2114] = { unicodeslot=0x2114, category='so', description='L B BAR SYMBOL' },
+ [0x2115] = { unicodeslot=0x2115, category='lu', description='DOUBLE-STRUCK CAPITAL N', specials={'font',0x004E} },
+ [0x2116] = { unicodeslot=0x2116, category='so', adobename='afii61352', contextname='textnumero', description='NUMERO SIGN', specials={'compat',0x004E,0x006F} },
+ [0x2117] = { unicodeslot=0x2117, category='so', description='SOUND RECORDING COPYRIGHT' },
+ [0x2118] = { unicodeslot=0x2118, category='so', adobename='weierstrass', description='SCRIPT CAPITAL P' },
+ [0x2119] = { unicodeslot=0x2119, category='lu', description='DOUBLE-STRUCK CAPITAL P', specials={'font',0x0050} },
+ [0x211A] = { unicodeslot=0x211A, category='lu', description='DOUBLE-STRUCK CAPITAL Q', specials={'font',0x0051} },
+ [0x211B] = { unicodeslot=0x211B, category='lu', description='SCRIPT CAPITAL R', specials={'font',0x0052} },
+ [0x211C] = { unicodeslot=0x211C, category='lu', adobename='Rfraktur', description='BLACK-LETTER CAPITAL R', specials={'font',0x0052} },
+ [0x211D] = { unicodeslot=0x211D, category='lu', description='DOUBLE-STRUCK CAPITAL R', specials={'font',0x0052} },
+ [0x211E] = { unicodeslot=0x211E, category='so', adobename='prescription', description='PRESCRIPTION TAKE' },
+ [0x211F] = { unicodeslot=0x211F, category='so', description='RESPONSE' },
+ [0x2120] = { unicodeslot=0x2120, category='so', description='SERVICE MARK', specials={'super',0x0053,0x004D} },
+ [0x2121] = { unicodeslot=0x2121, category='so', description='TELEPHONE SIGN', specials={'compat',0x0054,0x0045,0x004C} },
+ [0x2122] = { unicodeslot=0x2122, category='so', adobename='trademark', contextname='trademark', description='TRADE MARK SIGN', specials={'super',0x0054,0x004D} },
+ [0x2123] = { unicodeslot=0x2123, category='so', description='VERSICLE' },
+ [0x2124] = { unicodeslot=0x2124, category='lu', description='DOUBLE-STRUCK CAPITAL Z', specials={'font',0x005A} },
+ [0x2125] = { unicodeslot=0x2125, category='so', description='OUNCE SIGN' },
+ [0x2126] = { unicodeslot=0x2126, category='lu', adobename='Omega', description='OHM SIGN', lccode=0x03C9, specials={'char',0x03A9} },
+ [0x2127] = { unicodeslot=0x2127, category='so', description='INVERTED OHM SIGN' },
+ [0x2128] = { unicodeslot=0x2128, category='lu', description='BLACK-LETTER CAPITAL Z', specials={'font',0x005A} },
+ [0x2129] = { unicodeslot=0x2129, category='so', description='TURNED GREEK SMALL LETTER IOTA' },
+ [0x212A] = { unicodeslot=0x212A, category='lu', description='KELVIN SIGN', lccode=0x006B, specials={'char',0x004B} },
+ [0x212B] = { unicodeslot=0x212B, category='lu', description='ANGSTROM SIGN', lccode=0x00E5, specials={'char',0x00C5} },
+ [0x212C] = { unicodeslot=0x212C, category='lu', description='SCRIPT CAPITAL B', specials={'font',0x0042} },
+ [0x212D] = { unicodeslot=0x212D, category='lu', description='BLACK-LETTER CAPITAL C', specials={'font',0x0043} },
+ [0x212E] = { unicodeslot=0x212E, category='so', adobename='estimated', description='ESTIMATED SYMBOL' },
+ [0x212F] = { unicodeslot=0x212F, category='ll', description='SCRIPT SMALL E', specials={'font',0x0065} },
+ [0x2130] = { unicodeslot=0x2130, category='lu', description='SCRIPT CAPITAL E', specials={'font',0x0045} },
+ [0x2131] = { unicodeslot=0x2131, category='lu', description='SCRIPT CAPITAL F', specials={'font',0x0046} },
+ [0x2132] = { unicodeslot=0x2132, category='lu', description='TURNED CAPITAL F', lccode=0x214E },
+ [0x2133] = { unicodeslot=0x2133, category='lu', description='SCRIPT CAPITAL M', specials={'font',0x004D} },
+ [0x2134] = { unicodeslot=0x2134, category='ll', description='SCRIPT SMALL O', specials={'font',0x006F} },
+ [0x2135] = { unicodeslot=0x2135, category='lo', adobename='aleph', description='ALEF SYMBOL', specials={'compat',0x05D0} },
+ [0x2136] = { unicodeslot=0x2136, category='lo', description='BET SYMBOL', specials={'compat',0x05D1} },
+ [0x2137] = { unicodeslot=0x2137, category='lo', description='GIMEL SYMBOL', specials={'compat',0x05D2} },
+ [0x2138] = { unicodeslot=0x2138, category='lo', description='DALET SYMBOL', specials={'compat',0x05D3} },
+ [0x2139] = { unicodeslot=0x2139, category='ll', description='INFORMATION SOURCE', specials={'font',0x0069} },
+ [0x213A] = { unicodeslot=0x213A, category='so', description='ROTATED CAPITAL Q' },
+ [0x213B] = { unicodeslot=0x213B, category='so', description='FACSIMILE SIGN', specials={'compat',0x0046,0x0041,0x0058} },
+ [0x213C] = { unicodeslot=0x213C, category='ll', description='DOUBLE-STRUCK SMALL PI', specials={'font',0x03C0} },
+ [0x213D] = { unicodeslot=0x213D, category='ll', description='DOUBLE-STRUCK SMALL GAMMA', specials={'font',0x03B3} },
+ [0x213E] = { unicodeslot=0x213E, category='lu', description='DOUBLE-STRUCK CAPITAL GAMMA', specials={'font',0x0393} },
+ [0x213F] = { unicodeslot=0x213F, category='lu', description='DOUBLE-STRUCK CAPITAL PI', specials={'font',0x03A0} },
+ [0x2140] = { unicodeslot=0x2140, category='sm', description='DOUBLE-STRUCK N-ARY SUMMATION', specials={'font',0x2211} },
+ [0x2141] = { unicodeslot=0x2141, category='sm', description='TURNED SANS-SERIF CAPITAL G' },
+ [0x2142] = { unicodeslot=0x2142, category='sm', description='TURNED SANS-SERIF CAPITAL L' },
+ [0x2143] = { unicodeslot=0x2143, category='sm', description='REVERSED SANS-SERIF CAPITAL L' },
+ [0x2144] = { unicodeslot=0x2144, category='sm', description='TURNED SANS-SERIF CAPITAL Y' },
+ [0x2145] = { unicodeslot=0x2145, category='lu', description='DOUBLE-STRUCK ITALIC CAPITAL D', specials={'font',0x0044} },
+ [0x2146] = { unicodeslot=0x2146, category='ll', description='DOUBLE-STRUCK ITALIC SMALL D', specials={'font',0x0064} },
+ [0x2147] = { unicodeslot=0x2147, category='ll', description='DOUBLE-STRUCK ITALIC SMALL E', specials={'font',0x0065} },
+ [0x2148] = { unicodeslot=0x2148, category='ll', description='DOUBLE-STRUCK ITALIC SMALL I', specials={'font',0x0069} },
+ [0x2149] = { unicodeslot=0x2149, category='ll', description='DOUBLE-STRUCK ITALIC SMALL J', specials={'font',0x006A} },
+ [0x214A] = { unicodeslot=0x214A, category='so', description='PROPERTY LINE' },
+ [0x214B] = { unicodeslot=0x214B, category='sm', description='TURNED AMPERSAND' },
+ [0x214C] = { unicodeslot=0x214C, category='so', description='PER SIGN' },
+ [0x214D] = { unicodeslot=0x214D, category='so', description='AKTIESELSKAB' },
+ [0x214E] = { unicodeslot=0x214E, category='ll', description='TURNED SMALL F', uccode=0x2132 },
+ [0x2153] = { unicodeslot=0x2153, category='no', adobename='onethird', contextname='onethird', description='VULGAR FRACTION ONE THIRD', specials={'fraction',0x0031,0x2044,0x0033} },
+ [0x2154] = { unicodeslot=0x2154, category='no', adobename='twothirds', contextname='twothirds', description='VULGAR FRACTION TWO THIRDS', specials={'fraction',0x0032,0x2044,0x0033} },
+ [0x2155] = { unicodeslot=0x2155, category='no', contextname='onefifth', description='VULGAR FRACTION ONE FIFTH', specials={'fraction',0x0031,0x2044,0x0035} },
+ [0x2156] = { unicodeslot=0x2156, category='no', contextname='twofifths', description='VULGAR FRACTION TWO FIFTHS', specials={'fraction',0x0032,0x2044,0x0035} },
+ [0x2157] = { unicodeslot=0x2157, category='no', contextname='threefifths', description='VULGAR FRACTION THREE FIFTHS', specials={'fraction',0x0033,0x2044,0x0035} },
+ [0x2158] = { unicodeslot=0x2158, category='no', contextname='fourfifths', description='VULGAR FRACTION FOUR FIFTHS', specials={'fraction',0x0034,0x2044,0x0035} },
+ [0x2159] = { unicodeslot=0x2159, category='no', contextname='onesixth', description='VULGAR FRACTION ONE SIXTH', specials={'fraction',0x0031,0x2044,0x0036} },
+ [0x215A] = { unicodeslot=0x215A, category='no', contextname='fivesixths', description='VULGAR FRACTION FIVE SIXTHS', specials={'fraction',0x0035,0x2044,0x0036} },
+ [0x215B] = { unicodeslot=0x215B, category='no', adobename='oneeighth', contextname='oneeighth', description='VULGAR FRACTION ONE EIGHTH', specials={'fraction',0x0031,0x2044,0x0038} },
+ [0x215C] = { unicodeslot=0x215C, category='no', adobename='threeeighths', contextname='threeeighths', description='VULGAR FRACTION THREE EIGHTHS', specials={'fraction',0x0033,0x2044,0x0038} },
+ [0x215D] = { unicodeslot=0x215D, category='no', adobename='fiveeighths', contextname='fiveeighths', description='VULGAR FRACTION FIVE EIGHTHS', specials={'fraction',0x0035,0x2044,0x0038} },
+ [0x215E] = { unicodeslot=0x215E, category='no', adobename='seveneighths', contextname='seveneighths', description='VULGAR FRACTION SEVEN EIGHTHS', specials={'fraction',0x0037,0x2044,0x0038} },
+ [0x215F] = { unicodeslot=0x215F, category='no', description='FRACTION NUMERATOR ONE', specials={'fraction',0x0031,0x2044} },
+ [0x2160] = { unicodeslot=0x2160, category='nl', contextname='romanI', description='ROMAN NUMERAL ONE', lccode=0x2170, specials={'compat',0x0049} },
+ [0x2161] = { unicodeslot=0x2161, category='nl', contextname='romanII', description='ROMAN NUMERAL TWO', lccode=0x2171, specials={'compat',0x0049,0x0049} },
+ [0x2162] = { unicodeslot=0x2162, category='nl', contextname='romanIII', description='ROMAN NUMERAL THREE', lccode=0x2172, specials={'compat',0x0049,0x0049,0x0049} },
+ [0x2163] = { unicodeslot=0x2163, category='nl', contextname='romanIV', description='ROMAN NUMERAL FOUR', lccode=0x2173, specials={'compat',0x0049,0x0056} },
+ [0x2164] = { unicodeslot=0x2164, category='nl', contextname='romanV', description='ROMAN NUMERAL FIVE', lccode=0x2174, specials={'compat',0x0056} },
+ [0x2165] = { unicodeslot=0x2165, category='nl', contextname='romanVI', description='ROMAN NUMERAL SIX', lccode=0x2175, specials={'compat',0x0056,0x0049} },
+ [0x2166] = { unicodeslot=0x2166, category='nl', contextname='romanVII', description='ROMAN NUMERAL SEVEN', lccode=0x2176, specials={'compat',0x0056,0x0049,0x0049} },
+ [0x2167] = { unicodeslot=0x2167, category='nl', contextname='romanVIII', description='ROMAN NUMERAL EIGHT', lccode=0x2177, specials={'compat',0x0056,0x0049,0x0049,0x0049} },
+ [0x2168] = { unicodeslot=0x2168, category='nl', contextname='romanIX', description='ROMAN NUMERAL NINE', lccode=0x2178, specials={'compat',0x0049,0x0058} },
+ [0x2169] = { unicodeslot=0x2169, category='nl', contextname='romanX', description='ROMAN NUMERAL TEN', lccode=0x2179, specials={'compat',0x0058} },
+ [0x216A] = { unicodeslot=0x216A, category='nl', contextname='romanXI', description='ROMAN NUMERAL ELEVEN', lccode=0x217A, specials={'compat',0x0058,0x0049} },
+ [0x216B] = { unicodeslot=0x216B, category='nl', contextname='romanXII', description='ROMAN NUMERAL TWELVE', lccode=0x217B, specials={'compat',0x0058,0x0049,0x0049} },
+ [0x216C] = { unicodeslot=0x216C, category='nl', contextname='romanL', description='ROMAN NUMERAL FIFTY', lccode=0x217C, specials={'compat',0x004C} },
+ [0x216D] = { unicodeslot=0x216D, category='nl', contextname='romanC', description='ROMAN NUMERAL ONE HUNDRED', lccode=0x217D, specials={'compat',0x0043} },
+ [0x216E] = { unicodeslot=0x216E, category='nl', contextname='romanD', description='ROMAN NUMERAL FIVE HUNDRED', lccode=0x217E, specials={'compat',0x0044} },
+ [0x216F] = { unicodeslot=0x216F, category='nl', contextname='romanM', description='ROMAN NUMERAL ONE THOUSAND', lccode=0x217F, specials={'compat',0x004D} },
+ [0x2170] = { unicodeslot=0x2170, category='nl', contextname='romani', description='SMALL ROMAN NUMERAL ONE', uccode=0x2160, specials={'compat',0x0069} },
+ [0x2171] = { unicodeslot=0x2171, category='nl', contextname='romanii', description='SMALL ROMAN NUMERAL TWO', uccode=0x2161, specials={'compat',0x0069,0x0069} },
+ [0x2172] = { unicodeslot=0x2172, category='nl', contextname='romaniii', description='SMALL ROMAN NUMERAL THREE', uccode=0x2162, specials={'compat',0x0069,0x0069,0x0069} },
+ [0x2173] = { unicodeslot=0x2173, category='nl', contextname='romaniv', description='SMALL ROMAN NUMERAL FOUR', uccode=0x2163, specials={'compat',0x0069,0x0076} },
+ [0x2174] = { unicodeslot=0x2174, category='nl', contextname='romanv', description='SMALL ROMAN NUMERAL FIVE', uccode=0x2164, specials={'compat',0x0076} },
+ [0x2175] = { unicodeslot=0x2175, category='nl', contextname='romanvi', description='SMALL ROMAN NUMERAL SIX', uccode=0x2165, specials={'compat',0x0076,0x0069} },
+ [0x2176] = { unicodeslot=0x2176, category='nl', contextname='romanvii', description='SMALL ROMAN NUMERAL SEVEN', uccode=0x2166, specials={'compat',0x0076,0x0069,0x0069} },
+ [0x2177] = { unicodeslot=0x2177, category='nl', contextname='romanviii', description='SMALL ROMAN NUMERAL EIGHT', uccode=0x2167, specials={'compat',0x0076,0x0069,0x0069,0x0069} },
+ [0x2178] = { unicodeslot=0x2178, category='nl', contextname='romanix', description='SMALL ROMAN NUMERAL NINE', uccode=0x2168, specials={'compat',0x0069,0x0078} },
+ [0x2179] = { unicodeslot=0x2179, category='nl', contextname='romanx', description='SMALL ROMAN NUMERAL TEN', uccode=0x2169, specials={'compat',0x0078} },
+ [0x217A] = { unicodeslot=0x217A, category='nl', contextname='romanxi', description='SMALL ROMAN NUMERAL ELEVEN', uccode=0x216A, specials={'compat',0x0078,0x0069} },
+ [0x217B] = { unicodeslot=0x217B, category='nl', contextname='romanxii', description='SMALL ROMAN NUMERAL TWELVE', uccode=0x216B, specials={'compat',0x0078,0x0069,0x0069} },
+ [0x217C] = { unicodeslot=0x217C, category='nl', contextname='romanl', description='SMALL ROMAN NUMERAL FIFTY', uccode=0x216C, specials={'compat',0x006C} },
+ [0x217D] = { unicodeslot=0x217D, category='nl', contextname='romanc', description='SMALL ROMAN NUMERAL ONE HUNDRED', uccode=0x216D, specials={'compat',0x0063} },
+ [0x217E] = { unicodeslot=0x217E, category='nl', contextname='romand', description='SMALL ROMAN NUMERAL FIVE HUNDRED', uccode=0x216E, specials={'compat',0x0064} },
+ [0x217F] = { unicodeslot=0x217F, category='nl', contextname='romanm', description='SMALL ROMAN NUMERAL ONE THOUSAND', uccode=0x216F, specials={'compat',0x006D} },
+ [0x2180] = { unicodeslot=0x2180, category='nl', description='ROMAN NUMERAL ONE THOUSAND C D' },
+ [0x2181] = { unicodeslot=0x2181, category='nl', description='ROMAN NUMERAL FIVE THOUSAND' },
+ [0x2182] = { unicodeslot=0x2182, category='nl', description='ROMAN NUMERAL TEN THOUSAND' },
+ [0x2183] = { unicodeslot=0x2183, category='lu', description='ROMAN NUMERAL REVERSED ONE HUNDRED', lccode=0x2184 },
+ [0x2184] = { unicodeslot=0x2184, category='ll', description='LATIN SMALL LETTER REVERSED C', uccode=0x2183 },
+ [0x2190] = { unicodeslot=0x2190, category='sm', adobename='arrowleft', description='LEFTWARDS ARROW' },
+ [0x2191] = { unicodeslot=0x2191, category='sm', adobename='arrowup', description='UPWARDS ARROW' },
+ [0x2192] = { unicodeslot=0x2192, category='sm', adobename='arrowright', description='RIGHTWARDS ARROW' },
+ [0x2193] = { unicodeslot=0x2193, category='sm', adobename='arrowdown', description='DOWNWARDS ARROW' },
+ [0x2194] = { unicodeslot=0x2194, category='sm', adobename='arrowboth', description='LEFT RIGHT ARROW' },
+ [0x2195] = { unicodeslot=0x2195, category='so', adobename='arrowupdn', description='UP DOWN ARROW' },
+ [0x2196] = { unicodeslot=0x2196, category='so', description='NORTH WEST ARROW' },
+ [0x2197] = { unicodeslot=0x2197, category='so', description='NORTH EAST ARROW' },
+ [0x2198] = { unicodeslot=0x2198, category='so', description='SOUTH EAST ARROW' },
+ [0x2199] = { unicodeslot=0x2199, category='so', description='SOUTH WEST ARROW' },
+ [0x219A] = { unicodeslot=0x219A, category='sm', description='LEFTWARDS ARROW WITH STROKE', specials={'char',0x2190,0x0338} },
+ [0x219B] = { unicodeslot=0x219B, category='sm', description='RIGHTWARDS ARROW WITH STROKE', specials={'char',0x2192,0x0338} },
+ [0x219C] = { unicodeslot=0x219C, category='so', description='LEFTWARDS WAVE ARROW' },
+ [0x219D] = { unicodeslot=0x219D, category='so', description='RIGHTWARDS WAVE ARROW' },
+ [0x219E] = { unicodeslot=0x219E, category='so', description='LEFTWARDS TWO HEADED ARROW' },
+ [0x219F] = { unicodeslot=0x219F, category='so', description='UPWARDS TWO HEADED ARROW' },
+ [0x21A0] = { unicodeslot=0x21A0, category='sm', description='RIGHTWARDS TWO HEADED ARROW' },
+ [0x21A1] = { unicodeslot=0x21A1, category='so', description='DOWNWARDS TWO HEADED ARROW' },
+ [0x21A2] = { unicodeslot=0x21A2, category='so', description='LEFTWARDS ARROW WITH TAIL' },
+ [0x21A3] = { unicodeslot=0x21A3, category='sm', description='RIGHTWARDS ARROW WITH TAIL' },
+ [0x21A4] = { unicodeslot=0x21A4, category='so', description='LEFTWARDS ARROW FROM BAR' },
+ [0x21A5] = { unicodeslot=0x21A5, category='so', description='UPWARDS ARROW FROM BAR' },
+ [0x21A6] = { unicodeslot=0x21A6, category='sm', description='RIGHTWARDS ARROW FROM BAR' },
+ [0x21A7] = { unicodeslot=0x21A7, category='so', description='DOWNWARDS ARROW FROM BAR' },
+ [0x21A8] = { unicodeslot=0x21A8, category='so', adobename='arrowupdnbse', description='UP DOWN ARROW WITH BASE' },
+ [0x21A9] = { unicodeslot=0x21A9, category='so', description='LEFTWARDS ARROW WITH HOOK' },
+ [0x21AA] = { unicodeslot=0x21AA, category='so', description='RIGHTWARDS ARROW WITH HOOK' },
+ [0x21AB] = { unicodeslot=0x21AB, category='so', description='LEFTWARDS ARROW WITH LOOP' },
+ [0x21AC] = { unicodeslot=0x21AC, category='so', description='RIGHTWARDS ARROW WITH LOOP' },
+ [0x21AD] = { unicodeslot=0x21AD, category='so', description='LEFT RIGHT WAVE ARROW' },
+ [0x21AE] = { unicodeslot=0x21AE, category='sm', description='LEFT RIGHT ARROW WITH STROKE', specials={'char',0x2194,0x0338} },
+ [0x21AF] = { unicodeslot=0x21AF, category='so', description='DOWNWARDS ZIGZAG ARROW' },
+ [0x21B0] = { unicodeslot=0x21B0, category='so', description='UPWARDS ARROW WITH TIP LEFTWARDS' },
+ [0x21B1] = { unicodeslot=0x21B1, category='so', description='UPWARDS ARROW WITH TIP RIGHTWARDS' },
+ [0x21B2] = { unicodeslot=0x21B2, category='so', description='DOWNWARDS ARROW WITH TIP LEFTWARDS' },
+ [0x21B3] = { unicodeslot=0x21B3, category='so', description='DOWNWARDS ARROW WITH TIP RIGHTWARDS' },
+ [0x21B4] = { unicodeslot=0x21B4, category='so', description='RIGHTWARDS ARROW WITH CORNER DOWNWARDS' },
+ [0x21B5] = { unicodeslot=0x21B5, category='so', adobename='carriagereturn', description='DOWNWARDS ARROW WITH CORNER LEFTWARDS' },
+ [0x21B6] = { unicodeslot=0x21B6, category='so', description='ANTICLOCKWISE TOP SEMICIRCLE ARROW' },
+ [0x21B7] = { unicodeslot=0x21B7, category='so', description='CLOCKWISE TOP SEMICIRCLE ARROW' },
+ [0x21B8] = { unicodeslot=0x21B8, category='so', description='NORTH WEST ARROW TO LONG BAR' },
+ [0x21B9] = { unicodeslot=0x21B9, category='so', description='LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR' },
+ [0x21BA] = { unicodeslot=0x21BA, category='so', description='ANTICLOCKWISE OPEN CIRCLE ARROW' },
+ [0x21BB] = { unicodeslot=0x21BB, category='so', description='CLOCKWISE OPEN CIRCLE ARROW' },
+ [0x21BC] = { unicodeslot=0x21BC, category='so', description='LEFTWARDS HARPOON WITH BARB UPWARDS' },
+ [0x21BD] = { unicodeslot=0x21BD, category='so', description='LEFTWARDS HARPOON WITH BARB DOWNWARDS' },
+ [0x21BE] = { unicodeslot=0x21BE, category='so', description='UPWARDS HARPOON WITH BARB RIGHTWARDS' },
+ [0x21BF] = { unicodeslot=0x21BF, category='so', description='UPWARDS HARPOON WITH BARB LEFTWARDS' },
+ [0x21C0] = { unicodeslot=0x21C0, category='so', description='RIGHTWARDS HARPOON WITH BARB UPWARDS' },
+ [0x21C1] = { unicodeslot=0x21C1, category='so', description='RIGHTWARDS HARPOON WITH BARB DOWNWARDS' },
+ [0x21C2] = { unicodeslot=0x21C2, category='so', description='DOWNWARDS HARPOON WITH BARB RIGHTWARDS' },
+ [0x21C3] = { unicodeslot=0x21C3, category='so', description='DOWNWARDS HARPOON WITH BARB LEFTWARDS' },
+ [0x21C4] = { unicodeslot=0x21C4, category='so', description='RIGHTWARDS ARROW OVER LEFTWARDS ARROW' },
+ [0x21C5] = { unicodeslot=0x21C5, category='so', description='UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW' },
+ [0x21C6] = { unicodeslot=0x21C6, category='so', description='LEFTWARDS ARROW OVER RIGHTWARDS ARROW' },
+ [0x21C7] = { unicodeslot=0x21C7, category='so', description='LEFTWARDS PAIRED ARROWS' },
+ [0x21C8] = { unicodeslot=0x21C8, category='so', description='UPWARDS PAIRED ARROWS' },
+ [0x21C9] = { unicodeslot=0x21C9, category='so', description='RIGHTWARDS PAIRED ARROWS' },
+ [0x21CA] = { unicodeslot=0x21CA, category='so', description='DOWNWARDS PAIRED ARROWS' },
+ [0x21CB] = { unicodeslot=0x21CB, category='so', description='LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON' },
+ [0x21CC] = { unicodeslot=0x21CC, category='so', description='RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON' },
+ [0x21CD] = { unicodeslot=0x21CD, category='so', description='LEFTWARDS DOUBLE ARROW WITH STROKE', specials={'char',0x21D0,0x0338} },
+ [0x21CE] = { unicodeslot=0x21CE, category='sm', description='LEFT RIGHT DOUBLE ARROW WITH STROKE', specials={'char',0x21D4,0x0338} },
+ [0x21CF] = { unicodeslot=0x21CF, category='sm', description='RIGHTWARDS DOUBLE ARROW WITH STROKE', specials={'char',0x21D2,0x0338} },
+ [0x21D0] = { unicodeslot=0x21D0, category='so', adobename='arrowdblleft', description='LEFTWARDS DOUBLE ARROW' },
+ [0x21D1] = { unicodeslot=0x21D1, category='so', adobename='arrowdblup', description='UPWARDS DOUBLE ARROW' },
+ [0x21D2] = { unicodeslot=0x21D2, category='sm', adobename='arrowdblright', description='RIGHTWARDS DOUBLE ARROW' },
+ [0x21D3] = { unicodeslot=0x21D3, category='so', adobename='arrowdbldown', description='DOWNWARDS DOUBLE ARROW' },
+ [0x21D4] = { unicodeslot=0x21D4, category='sm', adobename='arrowdblboth', description='LEFT RIGHT DOUBLE ARROW' },
+ [0x21D5] = { unicodeslot=0x21D5, category='so', description='UP DOWN DOUBLE ARROW' },
+ [0x21D6] = { unicodeslot=0x21D6, category='so', description='NORTH WEST DOUBLE ARROW' },
+ [0x21D7] = { unicodeslot=0x21D7, category='so', description='NORTH EAST DOUBLE ARROW' },
+ [0x21D8] = { unicodeslot=0x21D8, category='so', description='SOUTH EAST DOUBLE ARROW' },
+ [0x21D9] = { unicodeslot=0x21D9, category='so', description='SOUTH WEST DOUBLE ARROW' },
+ [0x21DA] = { unicodeslot=0x21DA, category='so', description='LEFTWARDS TRIPLE ARROW' },
+ [0x21DB] = { unicodeslot=0x21DB, category='so', description='RIGHTWARDS TRIPLE ARROW' },
+ [0x21DC] = { unicodeslot=0x21DC, category='so', description='LEFTWARDS SQUIGGLE ARROW' },
+ [0x21DD] = { unicodeslot=0x21DD, category='so', description='RIGHTWARDS SQUIGGLE ARROW' },
+ [0x21DE] = { unicodeslot=0x21DE, category='so', description='UPWARDS ARROW WITH DOUBLE STROKE' },
+ [0x21DF] = { unicodeslot=0x21DF, category='so', description='DOWNWARDS ARROW WITH DOUBLE STROKE' },
+ [0x21E0] = { unicodeslot=0x21E0, category='so', description='LEFTWARDS DASHED ARROW' },
+ [0x21E1] = { unicodeslot=0x21E1, category='so', description='UPWARDS DASHED ARROW' },
+ [0x21E2] = { unicodeslot=0x21E2, category='so', description='RIGHTWARDS DASHED ARROW' },
+ [0x21E3] = { unicodeslot=0x21E3, category='so', description='DOWNWARDS DASHED ARROW' },
+ [0x21E4] = { unicodeslot=0x21E4, category='so', description='LEFTWARDS ARROW TO BAR' },
+ [0x21E5] = { unicodeslot=0x21E5, category='so', description='RIGHTWARDS ARROW TO BAR' },
+ [0x21E6] = { unicodeslot=0x21E6, category='so', description='LEFTWARDS WHITE ARROW' },
+ [0x21E7] = { unicodeslot=0x21E7, category='so', description='UPWARDS WHITE ARROW' },
+ [0x21E8] = { unicodeslot=0x21E8, category='so', description='RIGHTWARDS WHITE ARROW' },
+ [0x21E9] = { unicodeslot=0x21E9, category='so', description='DOWNWARDS WHITE ARROW' },
+ [0x21EA] = { unicodeslot=0x21EA, category='so', description='UPWARDS WHITE ARROW FROM BAR' },
+ [0x21EB] = { unicodeslot=0x21EB, category='so', description='UPWARDS WHITE ARROW ON PEDESTAL' },
+ [0x21EC] = { unicodeslot=0x21EC, category='so', description='UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR' },
+ [0x21ED] = { unicodeslot=0x21ED, category='so', description='UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR' },
+ [0x21EE] = { unicodeslot=0x21EE, category='so', description='UPWARDS WHITE DOUBLE ARROW' },
+ [0x21EF] = { unicodeslot=0x21EF, category='so', description='UPWARDS WHITE DOUBLE ARROW ON PEDESTAL' },
+ [0x21F0] = { unicodeslot=0x21F0, category='so', description='RIGHTWARDS WHITE ARROW FROM WALL' },
+ [0x21F1] = { unicodeslot=0x21F1, category='so', description='NORTH WEST ARROW TO CORNER' },
+ [0x21F2] = { unicodeslot=0x21F2, category='so', description='SOUTH EAST ARROW TO CORNER' },
+ [0x21F3] = { unicodeslot=0x21F3, category='so', description='UP DOWN WHITE ARROW' },
+ [0x21F4] = { unicodeslot=0x21F4, category='sm', description='RIGHT ARROW WITH SMALL CIRCLE' },
+ [0x21F5] = { unicodeslot=0x21F5, category='sm', description='DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW' },
+ [0x21F6] = { unicodeslot=0x21F6, category='sm', description='THREE RIGHTWARDS ARROWS' },
+ [0x21F7] = { unicodeslot=0x21F7, category='sm', description='LEFTWARDS ARROW WITH VERTICAL STROKE' },
+ [0x21F8] = { unicodeslot=0x21F8, category='sm', description='RIGHTWARDS ARROW WITH VERTICAL STROKE' },
+ [0x21F9] = { unicodeslot=0x21F9, category='sm', description='LEFT RIGHT ARROW WITH VERTICAL STROKE' },
+ [0x21FA] = { unicodeslot=0x21FA, category='sm', description='LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE' },
+ [0x21FB] = { unicodeslot=0x21FB, category='sm', description='RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE' },
+ [0x21FC] = { unicodeslot=0x21FC, category='sm', description='LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE' },
+ [0x21FD] = { unicodeslot=0x21FD, category='sm', description='LEFTWARDS OPEN-HEADED ARROW' },
+ [0x21FE] = { unicodeslot=0x21FE, category='sm', description='RIGHTWARDS OPEN-HEADED ARROW' },
+ [0x21FF] = { unicodeslot=0x21FF, category='sm', description='LEFT RIGHT OPEN-HEADED ARROW' },
+ [0x2200] = { unicodeslot=0x2200, category='sm', adobename='universal', description='FOR ALL' },
+ [0x2201] = { unicodeslot=0x2201, category='sm', description='COMPLEMENT' },
+ [0x2202] = { unicodeslot=0x2202, category='sm', adobename='partialdiff', description='PARTIAL DIFFERENTIAL' },
+ [0x2203] = { unicodeslot=0x2203, category='sm', adobename='existential', description='THERE EXISTS' },
+ [0x2204] = { unicodeslot=0x2204, category='sm', description='THERE DOES NOT EXIST', specials={'char',0x2203,0x0338} },
+ [0x2205] = { unicodeslot=0x2205, category='sm', adobename='emptyset', description='EMPTY SET' },
+ [0x2206] = { unicodeslot=0x2206, category='sm', adobename='Delta', description='INCREMENT' },
+ [0x2207] = { unicodeslot=0x2207, category='sm', adobename='gradient', description='NABLA' },
+ [0x2208] = { unicodeslot=0x2208, category='sm', adobename='element', description='ELEMENT OF' },
+ [0x2209] = { unicodeslot=0x2209, category='sm', adobename='notelement', description='NOT AN ELEMENT OF', specials={'char',0x2208,0x0338} },
+ [0x220A] = { unicodeslot=0x220A, category='sm', description='SMALL ELEMENT OF' },
+ [0x220B] = { unicodeslot=0x220B, category='sm', adobename='suchthat', description='CONTAINS AS MEMBER' },
+ [0x220C] = { unicodeslot=0x220C, category='sm', description='DOES NOT CONTAIN AS MEMBER', specials={'char',0x220B,0x0338} },
+ [0x220D] = { unicodeslot=0x220D, category='sm', description='SMALL CONTAINS AS MEMBER' },
+ [0x220E] = { unicodeslot=0x220E, category='sm', description='END OF PROOF' },
+ [0x220F] = { unicodeslot=0x220F, category='sm', adobename='product', description='N-ARY PRODUCT' },
+ [0x2210] = { unicodeslot=0x2210, category='sm', description='N-ARY COPRODUCT' },
+ [0x2211] = { unicodeslot=0x2211, category='sm', adobename='summation', description='N-ARY SUMMATION' },
+ [0x2212] = { unicodeslot=0x2212, category='sm', adobename='minus', description='MINUS SIGN' },
+ [0x2213] = { unicodeslot=0x2213, category='sm', description='MINUS-OR-PLUS SIGN' },
+ [0x2214] = { unicodeslot=0x2214, category='sm', description='DOT PLUS' },
+ [0x2215] = { unicodeslot=0x2215, category='sm', description='DIVISION SLASH' },
+ [0x2216] = { unicodeslot=0x2216, category='sm', description='SET MINUS' },
+ [0x2217] = { unicodeslot=0x2217, category='sm', adobename='asteriskmath', description='ASTERISK OPERATOR' },
+ [0x2218] = { unicodeslot=0x2218, category='sm', description='RING OPERATOR' },
+ [0x2219] = { unicodeslot=0x2219, category='sm', description='BULLET OPERATOR' },
+ [0x221A] = { unicodeslot=0x221A, category='sm', adobename='radical', description='SQUARE ROOT' },
+ [0x221B] = { unicodeslot=0x221B, category='sm', description='CUBE ROOT' },
+ [0x221C] = { unicodeslot=0x221C, category='sm', description='FOURTH ROOT' },
+ [0x221D] = { unicodeslot=0x221D, category='sm', adobename='proportional', description='PROPORTIONAL TO' },
+ [0x221E] = { unicodeslot=0x221E, category='sm', adobename='infinity', description='INFINITY' },
+ [0x221F] = { unicodeslot=0x221F, category='sm', adobename='orthogonal', description='RIGHT ANGLE' },
+ [0x2220] = { unicodeslot=0x2220, category='sm', adobename='angle', description='ANGLE' },
+ [0x2221] = { unicodeslot=0x2221, category='sm', description='MEASURED ANGLE' },
+ [0x2222] = { unicodeslot=0x2222, category='sm', description='SPHERICAL ANGLE' },
+ [0x2223] = { unicodeslot=0x2223, category='sm', description='DIVIDES' },
+ [0x2224] = { unicodeslot=0x2224, category='sm', description='DOES NOT DIVIDE', specials={'char',0x2223,0x0338} },
+ [0x2225] = { unicodeslot=0x2225, category='sm', description='PARALLEL TO' },
+ [0x2226] = { unicodeslot=0x2226, category='sm', description='NOT PARALLEL TO', specials={'char',0x2225,0x0338} },
+ [0x2227] = { unicodeslot=0x2227, category='sm', adobename='logicaland', description='LOGICAL AND' },
+ [0x2228] = { unicodeslot=0x2228, category='sm', adobename='logicalor', description='LOGICAL OR' },
+ [0x2229] = { unicodeslot=0x2229, category='sm', adobename='intersection', description='INTERSECTION' },
+ [0x222A] = { unicodeslot=0x222A, category='sm', adobename='union', description='UNION' },
+ [0x222B] = { unicodeslot=0x222B, category='sm', adobename='integral', description='INTEGRAL' },
+ [0x222C] = { unicodeslot=0x222C, category='sm', description='DOUBLE INTEGRAL', specials={'compat',0x222B,0x222B} },
+ [0x222D] = { unicodeslot=0x222D, category='sm', description='TRIPLE INTEGRAL', specials={'compat',0x222B,0x222B,0x222B} },
+ [0x222E] = { unicodeslot=0x222E, category='sm', description='CONTOUR INTEGRAL' },
+ [0x222F] = { unicodeslot=0x222F, category='sm', description='SURFACE INTEGRAL', specials={'compat',0x222E,0x222E} },
+ [0x2230] = { unicodeslot=0x2230, category='sm', description='VOLUME INTEGRAL', specials={'compat',0x222E,0x222E,0x222E} },
+ [0x2231] = { unicodeslot=0x2231, category='sm', description='CLOCKWISE INTEGRAL' },
+ [0x2232] = { unicodeslot=0x2232, category='sm', description='CLOCKWISE CONTOUR INTEGRAL' },
+ [0x2233] = { unicodeslot=0x2233, category='sm', description='ANTICLOCKWISE CONTOUR INTEGRAL' },
+ [0x2234] = { unicodeslot=0x2234, category='sm', adobename='therefore', description='THEREFORE' },
+ [0x2235] = { unicodeslot=0x2235, category='sm', description='BECAUSE' },
+ [0x2236] = { unicodeslot=0x2236, category='sm', description='RATIO' },
+ [0x2237] = { unicodeslot=0x2237, category='sm', description='PROPORTION' },
+ [0x2238] = { unicodeslot=0x2238, category='sm', description='DOT MINUS' },
+ [0x2239] = { unicodeslot=0x2239, category='sm', description='EXCESS' },
+ [0x223A] = { unicodeslot=0x223A, category='sm', description='GEOMETRIC PROPORTION' },
+ [0x223B] = { unicodeslot=0x223B, category='sm', description='HOMOTHETIC' },
+ [0x223C] = { unicodeslot=0x223C, category='sm', adobename='similar', description='TILDE OPERATOR' },
+ [0x223D] = { unicodeslot=0x223D, category='sm', description='REVERSED TILDE' },
+ [0x223E] = { unicodeslot=0x223E, category='sm', description='INVERTED LAZY S' },
+ [0x223F] = { unicodeslot=0x223F, category='sm', description='SINE WAVE' },
+ [0x2240] = { unicodeslot=0x2240, category='sm', description='WREATH PRODUCT' },
+ [0x2241] = { unicodeslot=0x2241, category='sm', description='NOT TILDE', specials={'char',0x223C,0x0338} },
+ [0x2242] = { unicodeslot=0x2242, category='sm', description='MINUS TILDE' },
+ [0x2243] = { unicodeslot=0x2243, category='sm', description='ASYMPTOTICALLY EQUAL TO' },
+ [0x2244] = { unicodeslot=0x2244, category='sm', description='NOT ASYMPTOTICALLY EQUAL TO', specials={'char',0x2243,0x0338} },
+ [0x2245] = { unicodeslot=0x2245, category='sm', adobename='congruent', description='APPROXIMATELY EQUAL TO' },
+ [0x2246] = { unicodeslot=0x2246, category='sm', description='APPROXIMATELY BUT NOT ACTUALLY EQUAL TO' },
+ [0x2247] = { unicodeslot=0x2247, category='sm', description='NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO', specials={'char',0x2245,0x0338} },
+ [0x2248] = { unicodeslot=0x2248, category='sm', adobename='approxequal', description='ALMOST EQUAL TO' },
+ [0x2249] = { unicodeslot=0x2249, category='sm', description='NOT ALMOST EQUAL TO', specials={'char',0x2248,0x0338} },
+ [0x224A] = { unicodeslot=0x224A, category='sm', description='ALMOST EQUAL OR EQUAL TO' },
+ [0x224B] = { unicodeslot=0x224B, category='sm', description='TRIPLE TILDE' },
+ [0x224C] = { unicodeslot=0x224C, category='sm', description='ALL EQUAL TO' },
+ [0x224D] = { unicodeslot=0x224D, category='sm', description='EQUIVALENT TO' },
+ [0x224E] = { unicodeslot=0x224E, category='sm', description='GEOMETRICALLY EQUIVALENT TO' },
+ [0x224F] = { unicodeslot=0x224F, category='sm', description='DIFFERENCE BETWEEN' },
+ [0x2250] = { unicodeslot=0x2250, category='sm', description='APPROACHES THE LIMIT' },
+ [0x2251] = { unicodeslot=0x2251, category='sm', description='GEOMETRICALLY EQUAL TO' },
+ [0x2252] = { unicodeslot=0x2252, category='sm', description='APPROXIMATELY EQUAL TO OR THE IMAGE OF' },
+ [0x2253] = { unicodeslot=0x2253, category='sm', description='IMAGE OF OR APPROXIMATELY EQUAL TO' },
+ [0x2254] = { unicodeslot=0x2254, category='sm', description='COLON EQUALS' },
+ [0x2255] = { unicodeslot=0x2255, category='sm', description='EQUALS COLON' },
+ [0x2256] = { unicodeslot=0x2256, category='sm', description='RING IN EQUAL TO' },
+ [0x2257] = { unicodeslot=0x2257, category='sm', description='RING EQUAL TO' },
+ [0x2258] = { unicodeslot=0x2258, category='sm', description='CORRESPONDS TO' },
+ [0x2259] = { unicodeslot=0x2259, category='sm', description='ESTIMATES' },
+ [0x225A] = { unicodeslot=0x225A, category='sm', description='EQUIANGULAR TO' },
+ [0x225B] = { unicodeslot=0x225B, category='sm', description='STAR EQUALS' },
+ [0x225C] = { unicodeslot=0x225C, category='sm', description='DELTA EQUAL TO' },
+ [0x225D] = { unicodeslot=0x225D, category='sm', description='EQUAL TO BY DEFINITION' },
+ [0x225E] = { unicodeslot=0x225E, category='sm', description='MEASURED BY' },
+ [0x225F] = { unicodeslot=0x225F, category='sm', description='QUESTIONED EQUAL TO' },
+ [0x2260] = { unicodeslot=0x2260, category='sm', adobename='notequal', description='NOT EQUAL TO', specials={'char',0x003D,0x0338} },
+ [0x2261] = { unicodeslot=0x2261, category='sm', adobename='equivalence', description='IDENTICAL TO' },
+ [0x2262] = { unicodeslot=0x2262, category='sm', description='NOT IDENTICAL TO', specials={'char',0x2261,0x0338} },
+ [0x2263] = { unicodeslot=0x2263, category='sm', description='STRICTLY EQUIVALENT TO' },
+ [0x2264] = { unicodeslot=0x2264, category='sm', adobename='lessequal', description='LESS-THAN OR EQUAL TO' },
+ [0x2265] = { unicodeslot=0x2265, category='sm', adobename='greaterequal', description='GREATER-THAN OR EQUAL TO' },
+ [0x2266] = { unicodeslot=0x2266, category='sm', description='LESS-THAN OVER EQUAL TO' },
+ [0x2267] = { unicodeslot=0x2267, category='sm', description='GREATER-THAN OVER EQUAL TO' },
+ [0x2268] = { unicodeslot=0x2268, category='sm', description='LESS-THAN BUT NOT EQUAL TO' },
+ [0x2269] = { unicodeslot=0x2269, category='sm', description='GREATER-THAN BUT NOT EQUAL TO' },
+ [0x226A] = { unicodeslot=0x226A, category='sm', description='MUCH LESS-THAN' },
+ [0x226B] = { unicodeslot=0x226B, category='sm', description='MUCH GREATER-THAN' },
+ [0x226C] = { unicodeslot=0x226C, category='sm', description='BETWEEN' },
+ [0x226D] = { unicodeslot=0x226D, category='sm', description='NOT EQUIVALENT TO', specials={'char',0x224D,0x0338} },
+ [0x226E] = { unicodeslot=0x226E, category='sm', description='NOT LESS-THAN', specials={'char',0x003C,0x0338} },
+ [0x226F] = { unicodeslot=0x226F, category='sm', description='NOT GREATER-THAN', specials={'char',0x003E,0x0338} },
+ [0x2270] = { unicodeslot=0x2270, category='sm', description='NEITHER LESS-THAN NOR EQUAL TO', specials={'char',0x2264,0x0338} },
+ [0x2271] = { unicodeslot=0x2271, category='sm', description='NEITHER GREATER-THAN NOR EQUAL TO', specials={'char',0x2265,0x0338} },
+ [0x2272] = { unicodeslot=0x2272, category='sm', description='LESS-THAN OR EQUIVALENT TO' },
+ [0x2273] = { unicodeslot=0x2273, category='sm', description='GREATER-THAN OR EQUIVALENT TO' },
+ [0x2274] = { unicodeslot=0x2274, category='sm', description='NEITHER LESS-THAN NOR EQUIVALENT TO', specials={'char',0x2272,0x0338} },
+ [0x2275] = { unicodeslot=0x2275, category='sm', description='NEITHER GREATER-THAN NOR EQUIVALENT TO', specials={'char',0x2273,0x0338} },
+ [0x2276] = { unicodeslot=0x2276, category='sm', description='LESS-THAN OR GREATER-THAN' },
+ [0x2277] = { unicodeslot=0x2277, category='sm', description='GREATER-THAN OR LESS-THAN' },
+ [0x2278] = { unicodeslot=0x2278, category='sm', description='NEITHER LESS-THAN NOR GREATER-THAN', specials={'char',0x2276,0x0338} },
+ [0x2279] = { unicodeslot=0x2279, category='sm', description='NEITHER GREATER-THAN NOR LESS-THAN', specials={'char',0x2277,0x0338} },
+ [0x227A] = { unicodeslot=0x227A, category='sm', description='PRECEDES' },
+ [0x227B] = { unicodeslot=0x227B, category='sm', description='SUCCEEDS' },
+ [0x227C] = { unicodeslot=0x227C, category='sm', description='PRECEDES OR EQUAL TO' },
+ [0x227D] = { unicodeslot=0x227D, category='sm', description='SUCCEEDS OR EQUAL TO' },
+ [0x227E] = { unicodeslot=0x227E, category='sm', description='PRECEDES OR EQUIVALENT TO' },
+ [0x227F] = { unicodeslot=0x227F, category='sm', description='SUCCEEDS OR EQUIVALENT TO' },
+ [0x2280] = { unicodeslot=0x2280, category='sm', description='DOES NOT PRECEDE', specials={'char',0x227A,0x0338} },
+ [0x2281] = { unicodeslot=0x2281, category='sm', description='DOES NOT SUCCEED', specials={'char',0x227B,0x0338} },
+ [0x2282] = { unicodeslot=0x2282, category='sm', adobename='propersubset', description='SUBSET OF' },
+ [0x2283] = { unicodeslot=0x2283, category='sm', adobename='propersuperset', description='SUPERSET OF' },
+ [0x2284] = { unicodeslot=0x2284, category='sm', adobename='notsubset', description='NOT A SUBSET OF', specials={'char',0x2282,0x0338} },
+ [0x2285] = { unicodeslot=0x2285, category='sm', description='NOT A SUPERSET OF', specials={'char',0x2283,0x0338} },
+ [0x2286] = { unicodeslot=0x2286, category='sm', adobename='reflexsubset', description='SUBSET OF OR EQUAL TO' },
+ [0x2287] = { unicodeslot=0x2287, category='sm', adobename='reflexsuperset', description='SUPERSET OF OR EQUAL TO' },
+ [0x2288] = { unicodeslot=0x2288, category='sm', description='NEITHER A SUBSET OF NOR EQUAL TO', specials={'char',0x2286,0x0338} },
+ [0x2289] = { unicodeslot=0x2289, category='sm', description='NEITHER A SUPERSET OF NOR EQUAL TO', specials={'char',0x2287,0x0338} },
+ [0x228A] = { unicodeslot=0x228A, category='sm', description='SUBSET OF WITH NOT EQUAL TO' },
+ [0x228B] = { unicodeslot=0x228B, category='sm', description='SUPERSET OF WITH NOT EQUAL TO' },
+ [0x228C] = { unicodeslot=0x228C, category='sm', description='MULTISET' },
+ [0x228D] = { unicodeslot=0x228D, category='sm', description='MULTISET MULTIPLICATION' },
+ [0x228E] = { unicodeslot=0x228E, category='sm', description='MULTISET UNION' },
+ [0x228F] = { unicodeslot=0x228F, category='sm', description='SQUARE IMAGE OF' },
+ [0x2290] = { unicodeslot=0x2290, category='sm', description='SQUARE ORIGINAL OF' },
+ [0x2291] = { unicodeslot=0x2291, category='sm', description='SQUARE IMAGE OF OR EQUAL TO' },
+ [0x2292] = { unicodeslot=0x2292, category='sm', description='SQUARE ORIGINAL OF OR EQUAL TO' },
+ [0x2293] = { unicodeslot=0x2293, category='sm', description='SQUARE CAP' },
+ [0x2294] = { unicodeslot=0x2294, category='sm', description='SQUARE CUP' },
+ [0x2295] = { unicodeslot=0x2295, category='sm', adobename='circleplus', description='CIRCLED PLUS' },
+ [0x2296] = { unicodeslot=0x2296, category='sm', description='CIRCLED MINUS' },
+ [0x2297] = { unicodeslot=0x2297, category='sm', adobename='circlemultiply', description='CIRCLED TIMES' },
+ [0x2298] = { unicodeslot=0x2298, category='sm', description='CIRCLED DIVISION SLASH' },
+ [0x2299] = { unicodeslot=0x2299, category='sm', description='CIRCLED DOT OPERATOR' },
+ [0x229A] = { unicodeslot=0x229A, category='sm', description='CIRCLED RING OPERATOR' },
+ [0x229B] = { unicodeslot=0x229B, category='sm', description='CIRCLED ASTERISK OPERATOR' },
+ [0x229C] = { unicodeslot=0x229C, category='sm', description='CIRCLED EQUALS' },
+ [0x229D] = { unicodeslot=0x229D, category='sm', description='CIRCLED DASH' },
+ [0x229E] = { unicodeslot=0x229E, category='sm', description='SQUARED PLUS' },
+ [0x229F] = { unicodeslot=0x229F, category='sm', description='SQUARED MINUS' },
+ [0x22A0] = { unicodeslot=0x22A0, category='sm', description='SQUARED TIMES' },
+ [0x22A1] = { unicodeslot=0x22A1, category='sm', description='SQUARED DOT OPERATOR' },
+ [0x22A2] = { unicodeslot=0x22A2, category='sm', description='RIGHT TACK' },
+ [0x22A3] = { unicodeslot=0x22A3, category='sm', description='LEFT TACK' },
+ [0x22A4] = { unicodeslot=0x22A4, category='sm', description='DOWN TACK' },
+ [0x22A5] = { unicodeslot=0x22A5, category='sm', adobename='perpendicular', description='UP TACK' },
+ [0x22A6] = { unicodeslot=0x22A6, category='sm', description='ASSERTION' },
+ [0x22A7] = { unicodeslot=0x22A7, category='sm', description='MODELS' },
+ [0x22A8] = { unicodeslot=0x22A8, category='sm', description='TRUE' },
+ [0x22A9] = { unicodeslot=0x22A9, category='sm', description='FORCES' },
+ [0x22AA] = { unicodeslot=0x22AA, category='sm', description='TRIPLE VERTICAL BAR RIGHT TURNSTILE' },
+ [0x22AB] = { unicodeslot=0x22AB, category='sm', description='DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE' },
+ [0x22AC] = { unicodeslot=0x22AC, category='sm', description='DOES NOT PROVE', specials={'char',0x22A2,0x0338} },
+ [0x22AD] = { unicodeslot=0x22AD, category='sm', description='NOT TRUE', specials={'char',0x22A8,0x0338} },
+ [0x22AE] = { unicodeslot=0x22AE, category='sm', description='DOES NOT FORCE', specials={'char',0x22A9,0x0338} },
+ [0x22AF] = { unicodeslot=0x22AF, category='sm', description='NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE', specials={'char',0x22AB,0x0338} },
+ [0x22B0] = { unicodeslot=0x22B0, category='sm', description='PRECEDES UNDER RELATION' },
+ [0x22B1] = { unicodeslot=0x22B1, category='sm', description='SUCCEEDS UNDER RELATION' },
+ [0x22B2] = { unicodeslot=0x22B2, category='sm', description='NORMAL SUBGROUP OF' },
+ [0x22B3] = { unicodeslot=0x22B3, category='sm', description='CONTAINS AS NORMAL SUBGROUP' },
+ [0x22B4] = { unicodeslot=0x22B4, category='sm', description='NORMAL SUBGROUP OF OR EQUAL TO' },
+ [0x22B5] = { unicodeslot=0x22B5, category='sm', description='CONTAINS AS NORMAL SUBGROUP OR EQUAL TO' },
+ [0x22B6] = { unicodeslot=0x22B6, category='sm', description='ORIGINAL OF' },
+ [0x22B7] = { unicodeslot=0x22B7, category='sm', description='IMAGE OF' },
+ [0x22B8] = { unicodeslot=0x22B8, category='sm', description='MULTIMAP' },
+ [0x22B9] = { unicodeslot=0x22B9, category='sm', description='HERMITIAN CONJUGATE MATRIX' },
+ [0x22BA] = { unicodeslot=0x22BA, category='sm', description='INTERCALATE' },
+ [0x22BB] = { unicodeslot=0x22BB, category='sm', description='XOR' },
+ [0x22BC] = { unicodeslot=0x22BC, category='sm', description='NAND' },
+ [0x22BD] = { unicodeslot=0x22BD, category='sm', description='NOR' },
+ [0x22BE] = { unicodeslot=0x22BE, category='sm', description='RIGHT ANGLE WITH ARC' },
+ [0x22BF] = { unicodeslot=0x22BF, category='sm', description='RIGHT TRIANGLE' },
+ [0x22C0] = { unicodeslot=0x22C0, category='sm', description='N-ARY LOGICAL AND' },
+ [0x22C1] = { unicodeslot=0x22C1, category='sm', description='N-ARY LOGICAL OR' },
+ [0x22C2] = { unicodeslot=0x22C2, category='sm', description='N-ARY INTERSECTION' },
+ [0x22C3] = { unicodeslot=0x22C3, category='sm', description='N-ARY UNION' },
+ [0x22C4] = { unicodeslot=0x22C4, category='sm', description='DIAMOND OPERATOR' },
+ [0x22C5] = { unicodeslot=0x22C5, category='sm', adobename='dotmath', description='DOT OPERATOR' },
+ [0x22C6] = { unicodeslot=0x22C6, category='sm', description='STAR OPERATOR' },
+ [0x22C7] = { unicodeslot=0x22C7, category='sm', description='DIVISION TIMES' },
+ [0x22C8] = { unicodeslot=0x22C8, category='sm', description='BOWTIE' },
+ [0x22C9] = { unicodeslot=0x22C9, category='sm', description='LEFT NORMAL FACTOR SEMIDIRECT PRODUCT' },
+ [0x22CA] = { unicodeslot=0x22CA, category='sm', description='RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT' },
+ [0x22CB] = { unicodeslot=0x22CB, category='sm', description='LEFT SEMIDIRECT PRODUCT' },
+ [0x22CC] = { unicodeslot=0x22CC, category='sm', description='RIGHT SEMIDIRECT PRODUCT' },
+ [0x22CD] = { unicodeslot=0x22CD, category='sm', description='REVERSED TILDE EQUALS' },
+ [0x22CE] = { unicodeslot=0x22CE, category='sm', description='CURLY LOGICAL OR' },
+ [0x22CF] = { unicodeslot=0x22CF, category='sm', description='CURLY LOGICAL AND' },
+ [0x22D0] = { unicodeslot=0x22D0, category='sm', description='DOUBLE SUBSET' },
+ [0x22D1] = { unicodeslot=0x22D1, category='sm', description='DOUBLE SUPERSET' },
+ [0x22D2] = { unicodeslot=0x22D2, category='sm', description='DOUBLE INTERSECTION' },
+ [0x22D3] = { unicodeslot=0x22D3, category='sm', description='DOUBLE UNION' },
+ [0x22D4] = { unicodeslot=0x22D4, category='sm', description='PITCHFORK' },
+ [0x22D5] = { unicodeslot=0x22D5, category='sm', description='EQUAL AND PARALLEL TO' },
+ [0x22D6] = { unicodeslot=0x22D6, category='sm', description='LESS-THAN WITH DOT' },
+ [0x22D7] = { unicodeslot=0x22D7, category='sm', description='GREATER-THAN WITH DOT' },
+ [0x22D8] = { unicodeslot=0x22D8, category='sm', description='VERY MUCH LESS-THAN' },
+ [0x22D9] = { unicodeslot=0x22D9, category='sm', description='VERY MUCH GREATER-THAN' },
+ [0x22DA] = { unicodeslot=0x22DA, category='sm', description='LESS-THAN EQUAL TO OR GREATER-THAN' },
+ [0x22DB] = { unicodeslot=0x22DB, category='sm', description='GREATER-THAN EQUAL TO OR LESS-THAN' },
+ [0x22DC] = { unicodeslot=0x22DC, category='sm', description='EQUAL TO OR LESS-THAN' },
+ [0x22DD] = { unicodeslot=0x22DD, category='sm', description='EQUAL TO OR GREATER-THAN' },
+ [0x22DE] = { unicodeslot=0x22DE, category='sm', description='EQUAL TO OR PRECEDES' },
+ [0x22DF] = { unicodeslot=0x22DF, category='sm', description='EQUAL TO OR SUCCEEDS' },
+ [0x22E0] = { unicodeslot=0x22E0, category='sm', description='DOES NOT PRECEDE OR EQUAL', specials={'char',0x227C,0x0338} },
+ [0x22E1] = { unicodeslot=0x22E1, category='sm', description='DOES NOT SUCCEED OR EQUAL', specials={'char',0x227D,0x0338} },
+ [0x22E2] = { unicodeslot=0x22E2, category='sm', description='NOT SQUARE IMAGE OF OR EQUAL TO', specials={'char',0x2291,0x0338} },
+ [0x22E3] = { unicodeslot=0x22E3, category='sm', description='NOT SQUARE ORIGINAL OF OR EQUAL TO', specials={'char',0x2292,0x0338} },
+ [0x22E4] = { unicodeslot=0x22E4, category='sm', description='SQUARE IMAGE OF OR NOT EQUAL TO' },
+ [0x22E5] = { unicodeslot=0x22E5, category='sm', description='SQUARE ORIGINAL OF OR NOT EQUAL TO' },
+ [0x22E6] = { unicodeslot=0x22E6, category='sm', description='LESS-THAN BUT NOT EQUIVALENT TO' },
+ [0x22E7] = { unicodeslot=0x22E7, category='sm', description='GREATER-THAN BUT NOT EQUIVALENT TO' },
+ [0x22E8] = { unicodeslot=0x22E8, category='sm', description='PRECEDES BUT NOT EQUIVALENT TO' },
+ [0x22E9] = { unicodeslot=0x22E9, category='sm', description='SUCCEEDS BUT NOT EQUIVALENT TO' },
+ [0x22EA] = { unicodeslot=0x22EA, category='sm', description='NOT NORMAL SUBGROUP OF', specials={'char',0x22B2,0x0338} },
+ [0x22EB] = { unicodeslot=0x22EB, category='sm', description='DOES NOT CONTAIN AS NORMAL SUBGROUP', specials={'char',0x22B3,0x0338} },
+ [0x22EC] = { unicodeslot=0x22EC, category='sm', description='NOT NORMAL SUBGROUP OF OR EQUAL TO', specials={'char',0x22B4,0x0338} },
+ [0x22ED] = { unicodeslot=0x22ED, category='sm', description='DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL', specials={'char',0x22B5,0x0338} },
+ [0x22EE] = { unicodeslot=0x22EE, category='sm', description='VERTICAL ELLIPSIS' },
+ [0x22EF] = { unicodeslot=0x22EF, category='sm', description='MIDLINE HORIZONTAL ELLIPSIS' },
+ [0x22F0] = { unicodeslot=0x22F0, category='sm', description='UP RIGHT DIAGONAL ELLIPSIS' },
+ [0x22F1] = { unicodeslot=0x22F1, category='sm', description='DOWN RIGHT DIAGONAL ELLIPSIS' },
+ [0x22F2] = { unicodeslot=0x22F2, category='sm', description='ELEMENT OF WITH LONG HORIZONTAL STROKE' },
+ [0x22F3] = { unicodeslot=0x22F3, category='sm', description='ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' },
+ [0x22F4] = { unicodeslot=0x22F4, category='sm', description='SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' },
+ [0x22F5] = { unicodeslot=0x22F5, category='sm', description='ELEMENT OF WITH DOT ABOVE' },
+ [0x22F6] = { unicodeslot=0x22F6, category='sm', description='ELEMENT OF WITH OVERBAR' },
+ [0x22F7] = { unicodeslot=0x22F7, category='sm', description='SMALL ELEMENT OF WITH OVERBAR' },
+ [0x22F8] = { unicodeslot=0x22F8, category='sm', description='ELEMENT OF WITH UNDERBAR' },
+ [0x22F9] = { unicodeslot=0x22F9, category='sm', description='ELEMENT OF WITH TWO HORIZONTAL STROKES' },
+ [0x22FA] = { unicodeslot=0x22FA, category='sm', description='CONTAINS WITH LONG HORIZONTAL STROKE' },
+ [0x22FB] = { unicodeslot=0x22FB, category='sm', description='CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' },
+ [0x22FC] = { unicodeslot=0x22FC, category='sm', description='SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' },
+ [0x22FD] = { unicodeslot=0x22FD, category='sm', description='CONTAINS WITH OVERBAR' },
+ [0x22FE] = { unicodeslot=0x22FE, category='sm', description='SMALL CONTAINS WITH OVERBAR' },
+ [0x22FF] = { unicodeslot=0x22FF, category='sm', description='Z NOTATION BAG MEMBERSHIP' },
+ [0x2300] = { unicodeslot=0x2300, category='so', description='DIAMETER SIGN' },
+ [0x2301] = { unicodeslot=0x2301, category='so', description='ELECTRIC ARROW' },
+ [0x2302] = { unicodeslot=0x2302, category='so', adobename='house', description='HOUSE' },
+ [0x2303] = { unicodeslot=0x2303, category='so', description='UP ARROWHEAD' },
+ [0x2304] = { unicodeslot=0x2304, category='so', description='DOWN ARROWHEAD' },
+ [0x2305] = { unicodeslot=0x2305, category='so', description='PROJECTIVE' },
+ [0x2306] = { unicodeslot=0x2306, category='so', description='PERSPECTIVE' },
+ [0x2307] = { unicodeslot=0x2307, category='so', description='WAVY LINE' },
+ [0x2308] = { unicodeslot=0x2308, category='sm', description='LEFT CEILING' },
+ [0x2309] = { unicodeslot=0x2309, category='sm', description='RIGHT CEILING' },
+ [0x230A] = { unicodeslot=0x230A, category='sm', description='LEFT FLOOR' },
+ [0x230B] = { unicodeslot=0x230B, category='sm', description='RIGHT FLOOR' },
+ [0x230C] = { unicodeslot=0x230C, category='so', description='BOTTOM RIGHT CROP' },
+ [0x230D] = { unicodeslot=0x230D, category='so', description='BOTTOM LEFT CROP' },
+ [0x230E] = { unicodeslot=0x230E, category='so', description='TOP RIGHT CROP' },
+ [0x230F] = { unicodeslot=0x230F, category='so', description='TOP LEFT CROP' },
+ [0x2310] = { unicodeslot=0x2310, category='so', adobename='revlogicalnot', description='REVERSED NOT SIGN' },
+ [0x2311] = { unicodeslot=0x2311, category='so', description='SQUARE LOZENGE' },
+ [0x2312] = { unicodeslot=0x2312, category='so', description='ARC' },
+ [0x2313] = { unicodeslot=0x2313, category='so', description='SEGMENT' },
+ [0x2314] = { unicodeslot=0x2314, category='so', description='SECTOR' },
+ [0x2315] = { unicodeslot=0x2315, category='so', description='TELEPHONE RECORDER' },
+ [0x2316] = { unicodeslot=0x2316, category='so', description='POSITION INDICATOR' },
+ [0x2317] = { unicodeslot=0x2317, category='so', description='VIEWDATA SQUARE' },
+ [0x2318] = { unicodeslot=0x2318, category='so', description='PLACE OF INTEREST SIGN' },
+ [0x2319] = { unicodeslot=0x2319, category='so', description='TURNED NOT SIGN' },
+ [0x231A] = { unicodeslot=0x231A, category='so', description='WATCH' },
+ [0x231B] = { unicodeslot=0x231B, category='so', description='HOURGLASS' },
+ [0x231C] = { unicodeslot=0x231C, category='so', description='TOP LEFT CORNER' },
+ [0x231D] = { unicodeslot=0x231D, category='so', description='TOP RIGHT CORNER' },
+ [0x231E] = { unicodeslot=0x231E, category='so', description='BOTTOM LEFT CORNER' },
+ [0x231F] = { unicodeslot=0x231F, category='so', description='BOTTOM RIGHT CORNER' },
+ [0x2320] = { unicodeslot=0x2320, category='sm', adobename='integraltp', description='TOP HALF INTEGRAL' },
+ [0x2321] = { unicodeslot=0x2321, category='sm', adobename='integralbt', description='BOTTOM HALF INTEGRAL' },
+ [0x2322] = { unicodeslot=0x2322, category='so', description='FROWN' },
+ [0x2323] = { unicodeslot=0x2323, category='so', description='SMILE' },
+ [0x2324] = { unicodeslot=0x2324, category='so', description='UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS' },
+ [0x2325] = { unicodeslot=0x2325, category='so', description='OPTION KEY' },
+ [0x2326] = { unicodeslot=0x2326, category='so', description='ERASE TO THE RIGHT' },
+ [0x2327] = { unicodeslot=0x2327, category='so', description='X IN A RECTANGLE BOX' },
+ [0x2328] = { unicodeslot=0x2328, category='so', description='KEYBOARD' },
+ [0x2329] = { unicodeslot=0x2329, category='ps', adobename='angleleft', description='LEFT-POINTING ANGLE BRACKET', specials={'char',0x3008} },
+ [0x232A] = { unicodeslot=0x232A, category='pe', adobename='angleright', description='RIGHT-POINTING ANGLE BRACKET', specials={'char',0x3009} },
+ [0x232B] = { unicodeslot=0x232B, category='so', description='ERASE TO THE LEFT' },
+ [0x232C] = { unicodeslot=0x232C, category='so', description='BENZENE RING' },
+ [0x232D] = { unicodeslot=0x232D, category='so', description='CYLINDRICITY' },
+ [0x232E] = { unicodeslot=0x232E, category='so', description='ALL AROUND-PROFILE' },
+ [0x232F] = { unicodeslot=0x232F, category='so', description='SYMMETRY' },
+ [0x2330] = { unicodeslot=0x2330, category='so', description='TOTAL RUNOUT' },
+ [0x2331] = { unicodeslot=0x2331, category='so', description='DIMENSION ORIGIN' },
+ [0x2332] = { unicodeslot=0x2332, category='so', description='CONICAL TAPER' },
+ [0x2333] = { unicodeslot=0x2333, category='so', description='SLOPE' },
+ [0x2334] = { unicodeslot=0x2334, category='so', description='COUNTERBORE' },
+ [0x2335] = { unicodeslot=0x2335, category='so', description='COUNTERSINK' },
+ [0x2336] = { unicodeslot=0x2336, category='so', description='APL FUNCTIONAL SYMBOL I-BEAM' },
+ [0x2337] = { unicodeslot=0x2337, category='so', description='APL FUNCTIONAL SYMBOL SQUISH QUAD' },
+ [0x2338] = { unicodeslot=0x2338, category='so', description='APL FUNCTIONAL SYMBOL QUAD EQUAL' },
+ [0x2339] = { unicodeslot=0x2339, category='so', description='APL FUNCTIONAL SYMBOL QUAD DIVIDE' },
+ [0x233A] = { unicodeslot=0x233A, category='so', description='APL FUNCTIONAL SYMBOL QUAD DIAMOND' },
+ [0x233B] = { unicodeslot=0x233B, category='so', description='APL FUNCTIONAL SYMBOL QUAD JOT' },
+ [0x233C] = { unicodeslot=0x233C, category='so', description='APL FUNCTIONAL SYMBOL QUAD CIRCLE' },
+ [0x233D] = { unicodeslot=0x233D, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE STILE' },
+ [0x233E] = { unicodeslot=0x233E, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE JOT' },
+ [0x233F] = { unicodeslot=0x233F, category='so', description='APL FUNCTIONAL SYMBOL SLASH BAR' },
+ [0x2340] = { unicodeslot=0x2340, category='so', description='APL FUNCTIONAL SYMBOL BACKSLASH BAR' },
+ [0x2341] = { unicodeslot=0x2341, category='so', description='APL FUNCTIONAL SYMBOL QUAD SLASH' },
+ [0x2342] = { unicodeslot=0x2342, category='so', description='APL FUNCTIONAL SYMBOL QUAD BACKSLASH' },
+ [0x2343] = { unicodeslot=0x2343, category='so', description='APL FUNCTIONAL SYMBOL QUAD LESS-THAN' },
+ [0x2344] = { unicodeslot=0x2344, category='so', description='APL FUNCTIONAL SYMBOL QUAD GREATER-THAN' },
+ [0x2345] = { unicodeslot=0x2345, category='so', description='APL FUNCTIONAL SYMBOL LEFTWARDS VANE' },
+ [0x2346] = { unicodeslot=0x2346, category='so', description='APL FUNCTIONAL SYMBOL RIGHTWARDS VANE' },
+ [0x2347] = { unicodeslot=0x2347, category='so', description='APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW' },
+ [0x2348] = { unicodeslot=0x2348, category='so', description='APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW' },
+ [0x2349] = { unicodeslot=0x2349, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH' },
+ [0x234A] = { unicodeslot=0x234A, category='so', description='APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR' },
+ [0x234B] = { unicodeslot=0x234B, category='so', description='APL FUNCTIONAL SYMBOL DELTA STILE' },
+ [0x234C] = { unicodeslot=0x234C, category='so', description='APL FUNCTIONAL SYMBOL QUAD DOWN CARET' },
+ [0x234D] = { unicodeslot=0x234D, category='so', description='APL FUNCTIONAL SYMBOL QUAD DELTA' },
+ [0x234E] = { unicodeslot=0x234E, category='so', description='APL FUNCTIONAL SYMBOL DOWN TACK JOT' },
+ [0x234F] = { unicodeslot=0x234F, category='so', description='APL FUNCTIONAL SYMBOL UPWARDS VANE' },
+ [0x2350] = { unicodeslot=0x2350, category='so', description='APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW' },
+ [0x2351] = { unicodeslot=0x2351, category='so', description='APL FUNCTIONAL SYMBOL UP TACK OVERBAR' },
+ [0x2352] = { unicodeslot=0x2352, category='so', description='APL FUNCTIONAL SYMBOL DEL STILE' },
+ [0x2353] = { unicodeslot=0x2353, category='so', description='APL FUNCTIONAL SYMBOL QUAD UP CARET' },
+ [0x2354] = { unicodeslot=0x2354, category='so', description='APL FUNCTIONAL SYMBOL QUAD DEL' },
+ [0x2355] = { unicodeslot=0x2355, category='so', description='APL FUNCTIONAL SYMBOL UP TACK JOT' },
+ [0x2356] = { unicodeslot=0x2356, category='so', description='APL FUNCTIONAL SYMBOL DOWNWARDS VANE' },
+ [0x2357] = { unicodeslot=0x2357, category='so', description='APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW' },
+ [0x2358] = { unicodeslot=0x2358, category='so', description='APL FUNCTIONAL SYMBOL QUOTE UNDERBAR' },
+ [0x2359] = { unicodeslot=0x2359, category='so', description='APL FUNCTIONAL SYMBOL DELTA UNDERBAR' },
+ [0x235A] = { unicodeslot=0x235A, category='so', description='APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR' },
+ [0x235B] = { unicodeslot=0x235B, category='so', description='APL FUNCTIONAL SYMBOL JOT UNDERBAR' },
+ [0x235C] = { unicodeslot=0x235C, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR' },
+ [0x235D] = { unicodeslot=0x235D, category='so', description='APL FUNCTIONAL SYMBOL UP SHOE JOT' },
+ [0x235E] = { unicodeslot=0x235E, category='so', description='APL FUNCTIONAL SYMBOL QUOTE QUAD' },
+ [0x235F] = { unicodeslot=0x235F, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE STAR' },
+ [0x2360] = { unicodeslot=0x2360, category='so', description='APL FUNCTIONAL SYMBOL QUAD COLON' },
+ [0x2361] = { unicodeslot=0x2361, category='so', description='APL FUNCTIONAL SYMBOL UP TACK DIAERESIS' },
+ [0x2362] = { unicodeslot=0x2362, category='so', description='APL FUNCTIONAL SYMBOL DEL DIAERESIS' },
+ [0x2363] = { unicodeslot=0x2363, category='so', description='APL FUNCTIONAL SYMBOL STAR DIAERESIS' },
+ [0x2364] = { unicodeslot=0x2364, category='so', description='APL FUNCTIONAL SYMBOL JOT DIAERESIS' },
+ [0x2365] = { unicodeslot=0x2365, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS' },
+ [0x2366] = { unicodeslot=0x2366, category='so', description='APL FUNCTIONAL SYMBOL DOWN SHOE STILE' },
+ [0x2367] = { unicodeslot=0x2367, category='so', description='APL FUNCTIONAL SYMBOL LEFT SHOE STILE' },
+ [0x2368] = { unicodeslot=0x2368, category='so', description='APL FUNCTIONAL SYMBOL TILDE DIAERESIS' },
+ [0x2369] = { unicodeslot=0x2369, category='so', description='APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS' },
+ [0x236A] = { unicodeslot=0x236A, category='so', description='APL FUNCTIONAL SYMBOL COMMA BAR' },
+ [0x236B] = { unicodeslot=0x236B, category='so', description='APL FUNCTIONAL SYMBOL DEL TILDE' },
+ [0x236C] = { unicodeslot=0x236C, category='so', description='APL FUNCTIONAL SYMBOL ZILDE' },
+ [0x236D] = { unicodeslot=0x236D, category='so', description='APL FUNCTIONAL SYMBOL STILE TILDE' },
+ [0x236E] = { unicodeslot=0x236E, category='so', description='APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR' },
+ [0x236F] = { unicodeslot=0x236F, category='so', description='APL FUNCTIONAL SYMBOL QUAD NOT EQUAL' },
+ [0x2370] = { unicodeslot=0x2370, category='so', description='APL FUNCTIONAL SYMBOL QUAD QUESTION' },
+ [0x2371] = { unicodeslot=0x2371, category='so', description='APL FUNCTIONAL SYMBOL DOWN CARET TILDE' },
+ [0x2372] = { unicodeslot=0x2372, category='so', description='APL FUNCTIONAL SYMBOL UP CARET TILDE' },
+ [0x2373] = { unicodeslot=0x2373, category='so', description='APL FUNCTIONAL SYMBOL IOTA' },
+ [0x2374] = { unicodeslot=0x2374, category='so', description='APL FUNCTIONAL SYMBOL RHO' },
+ [0x2375] = { unicodeslot=0x2375, category='so', description='APL FUNCTIONAL SYMBOL OMEGA' },
+ [0x2376] = { unicodeslot=0x2376, category='so', description='APL FUNCTIONAL SYMBOL ALPHA UNDERBAR' },
+ [0x2377] = { unicodeslot=0x2377, category='so', description='APL FUNCTIONAL SYMBOL EPSILON UNDERBAR' },
+ [0x2378] = { unicodeslot=0x2378, category='so', description='APL FUNCTIONAL SYMBOL IOTA UNDERBAR' },
+ [0x2379] = { unicodeslot=0x2379, category='so', description='APL FUNCTIONAL SYMBOL OMEGA UNDERBAR' },
+ [0x237A] = { unicodeslot=0x237A, category='so', description='APL FUNCTIONAL SYMBOL ALPHA' },
+ [0x237B] = { unicodeslot=0x237B, category='so', description='NOT CHECK MARK' },
+ [0x237C] = { unicodeslot=0x237C, category='sm', description='RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW' },
+ [0x237D] = { unicodeslot=0x237D, category='so', description='SHOULDERED OPEN BOX' },
+ [0x237E] = { unicodeslot=0x237E, category='so', description='BELL SYMBOL' },
+ [0x237F] = { unicodeslot=0x237F, category='so', description='VERTICAL LINE WITH MIDDLE DOT' },
+ [0x2380] = { unicodeslot=0x2380, category='so', description='INSERTION SYMBOL' },
+ [0x2381] = { unicodeslot=0x2381, category='so', description='CONTINUOUS UNDERLINE SYMBOL' },
+ [0x2382] = { unicodeslot=0x2382, category='so', description='DISCONTINUOUS UNDERLINE SYMBOL' },
+ [0x2383] = { unicodeslot=0x2383, category='so', description='EMPHASIS SYMBOL' },
+ [0x2384] = { unicodeslot=0x2384, category='so', description='COMPOSITION SYMBOL' },
+ [0x2385] = { unicodeslot=0x2385, category='so', description='WHITE SQUARE WITH CENTRE VERTICAL LINE' },
+ [0x2386] = { unicodeslot=0x2386, category='so', description='ENTER SYMBOL' },
+ [0x2387] = { unicodeslot=0x2387, category='so', description='ALTERNATIVE KEY SYMBOL' },
+ [0x2388] = { unicodeslot=0x2388, category='so', description='HELM SYMBOL' },
+ [0x2389] = { unicodeslot=0x2389, category='so', description='CIRCLED HORIZONTAL BAR WITH NOTCH' },
+ [0x238A] = { unicodeslot=0x238A, category='so', description='CIRCLED TRIANGLE DOWN' },
+ [0x238B] = { unicodeslot=0x238B, category='so', description='BROKEN CIRCLE WITH NORTHWEST ARROW' },
+ [0x238C] = { unicodeslot=0x238C, category='so', description='UNDO SYMBOL' },
+ [0x238D] = { unicodeslot=0x238D, category='so', description='MONOSTABLE SYMBOL' },
+ [0x238E] = { unicodeslot=0x238E, category='so', description='HYSTERESIS SYMBOL' },
+ [0x238F] = { unicodeslot=0x238F, category='so', description='OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL' },
+ [0x2390] = { unicodeslot=0x2390, category='so', description='OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL' },
+ [0x2391] = { unicodeslot=0x2391, category='so', description='PASSIVE-PULL-DOWN-OUTPUT SYMBOL' },
+ [0x2392] = { unicodeslot=0x2392, category='so', description='PASSIVE-PULL-UP-OUTPUT SYMBOL' },
+ [0x2393] = { unicodeslot=0x2393, category='so', description='DIRECT CURRENT SYMBOL FORM TWO' },
+ [0x2394] = { unicodeslot=0x2394, category='so', description='SOFTWARE-FUNCTION SYMBOL' },
+ [0x2395] = { unicodeslot=0x2395, category='so', description='APL FUNCTIONAL SYMBOL QUAD' },
+ [0x2396] = { unicodeslot=0x2396, category='so', description='DECIMAL SEPARATOR KEY SYMBOL' },
+ [0x2397] = { unicodeslot=0x2397, category='so', description='PREVIOUS PAGE' },
+ [0x2398] = { unicodeslot=0x2398, category='so', description='NEXT PAGE' },
+ [0x2399] = { unicodeslot=0x2399, category='so', description='PRINT SCREEN SYMBOL' },
+ [0x239A] = { unicodeslot=0x239A, category='so', description='CLEAR SCREEN SYMBOL' },
+ [0x239B] = { unicodeslot=0x239B, category='sm', description='LEFT PARENTHESIS UPPER HOOK' },
+ [0x239C] = { unicodeslot=0x239C, category='sm', description='LEFT PARENTHESIS EXTENSION' },
+ [0x239D] = { unicodeslot=0x239D, category='sm', description='LEFT PARENTHESIS LOWER HOOK' },
+ [0x239E] = { unicodeslot=0x239E, category='sm', description='RIGHT PARENTHESIS UPPER HOOK' },
+ [0x239F] = { unicodeslot=0x239F, category='sm', description='RIGHT PARENTHESIS EXTENSION' },
+ [0x23A0] = { unicodeslot=0x23A0, category='sm', description='RIGHT PARENTHESIS LOWER HOOK' },
+ [0x23A1] = { unicodeslot=0x23A1, category='sm', description='LEFT SQUARE BRACKET UPPER CORNER' },
+ [0x23A2] = { unicodeslot=0x23A2, category='sm', description='LEFT SQUARE BRACKET EXTENSION' },
+ [0x23A3] = { unicodeslot=0x23A3, category='sm', description='LEFT SQUARE BRACKET LOWER CORNER' },
+ [0x23A4] = { unicodeslot=0x23A4, category='sm', description='RIGHT SQUARE BRACKET UPPER CORNER' },
+ [0x23A5] = { unicodeslot=0x23A5, category='sm', description='RIGHT SQUARE BRACKET EXTENSION' },
+ [0x23A6] = { unicodeslot=0x23A6, category='sm', description='RIGHT SQUARE BRACKET LOWER CORNER' },
+ [0x23A7] = { unicodeslot=0x23A7, category='sm', description='LEFT CURLY BRACKET UPPER HOOK' },
+ [0x23A8] = { unicodeslot=0x23A8, category='sm', description='LEFT CURLY BRACKET MIDDLE PIECE' },
+ [0x23A9] = { unicodeslot=0x23A9, category='sm', description='LEFT CURLY BRACKET LOWER HOOK' },
+ [0x23AA] = { unicodeslot=0x23AA, category='sm', description='CURLY BRACKET EXTENSION' },
+ [0x23AB] = { unicodeslot=0x23AB, category='sm', description='RIGHT CURLY BRACKET UPPER HOOK' },
+ [0x23AC] = { unicodeslot=0x23AC, category='sm', description='RIGHT CURLY BRACKET MIDDLE PIECE' },
+ [0x23AD] = { unicodeslot=0x23AD, category='sm', description='RIGHT CURLY BRACKET LOWER HOOK' },
+ [0x23AE] = { unicodeslot=0x23AE, category='sm', description='INTEGRAL EXTENSION' },
+ [0x23AF] = { unicodeslot=0x23AF, category='sm', description='HORIZONTAL LINE EXTENSION' },
+ [0x23B0] = { unicodeslot=0x23B0, category='sm', description='UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION' },
+ [0x23B1] = { unicodeslot=0x23B1, category='sm', description='UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION' },
+ [0x23B2] = { unicodeslot=0x23B2, category='sm', description='SUMMATION TOP' },
+ [0x23B3] = { unicodeslot=0x23B3, category='sm', description='SUMMATION BOTTOM' },
+ [0x23B4] = { unicodeslot=0x23B4, category='so', description='TOP SQUARE BRACKET' },
+ [0x23B5] = { unicodeslot=0x23B5, category='so', description='BOTTOM SQUARE BRACKET' },
+ [0x23B6] = { unicodeslot=0x23B6, category='so', description='BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET' },
+ [0x23B7] = { unicodeslot=0x23B7, category='so', description='RADICAL SYMBOL BOTTOM' },
+ [0x23B8] = { unicodeslot=0x23B8, category='so', description='LEFT VERTICAL BOX LINE' },
+ [0x23B9] = { unicodeslot=0x23B9, category='so', description='RIGHT VERTICAL BOX LINE' },
+ [0x23BA] = { unicodeslot=0x23BA, category='so', description='HORIZONTAL SCAN LINE-1' },
+ [0x23BB] = { unicodeslot=0x23BB, category='so', description='HORIZONTAL SCAN LINE-3' },
+ [0x23BC] = { unicodeslot=0x23BC, category='so', description='HORIZONTAL SCAN LINE-7' },
+ [0x23BD] = { unicodeslot=0x23BD, category='so', description='HORIZONTAL SCAN LINE-9' },
+ [0x23BE] = { unicodeslot=0x23BE, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT' },
+ [0x23BF] = { unicodeslot=0x23BF, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT' },
+ [0x23C0] = { unicodeslot=0x23C0, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE' },
+ [0x23C1] = { unicodeslot=0x23C1, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE' },
+ [0x23C2] = { unicodeslot=0x23C2, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE' },
+ [0x23C3] = { unicodeslot=0x23C3, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE' },
+ [0x23C4] = { unicodeslot=0x23C4, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE' },
+ [0x23C5] = { unicodeslot=0x23C5, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE' },
+ [0x23C6] = { unicodeslot=0x23C6, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE' },
+ [0x23C7] = { unicodeslot=0x23C7, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE' },
+ [0x23C8] = { unicodeslot=0x23C8, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE' },
+ [0x23C9] = { unicodeslot=0x23C9, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL' },
+ [0x23CA] = { unicodeslot=0x23CA, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL' },
+ [0x23CB] = { unicodeslot=0x23CB, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT' },
+ [0x23CC] = { unicodeslot=0x23CC, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT' },
+ [0x23CD] = { unicodeslot=0x23CD, category='so', description='SQUARE FOOT' },
+ [0x23CE] = { unicodeslot=0x23CE, category='so', description='RETURN SYMBOL' },
+ [0x23CF] = { unicodeslot=0x23CF, category='so', description='EJECT SYMBOL' },
+ [0x23D0] = { unicodeslot=0x23D0, category='so', description='VERTICAL LINE EXTENSION' },
+ [0x23D1] = { unicodeslot=0x23D1, category='so', description='METRICAL BREVE' },
+ [0x23D2] = { unicodeslot=0x23D2, category='so', description='METRICAL LONG OVER SHORT' },
+ [0x23D3] = { unicodeslot=0x23D3, category='so', description='METRICAL SHORT OVER LONG' },
+ [0x23D4] = { unicodeslot=0x23D4, category='so', description='METRICAL LONG OVER TWO SHORTS' },
+ [0x23D5] = { unicodeslot=0x23D5, category='so', description='METRICAL TWO SHORTS OVER LONG' },
+ [0x23D6] = { unicodeslot=0x23D6, category='so', description='METRICAL TWO SHORTS JOINED' },
+ [0x23D7] = { unicodeslot=0x23D7, category='so', description='METRICAL TRISEME' },
+ [0x23D8] = { unicodeslot=0x23D8, category='so', description='METRICAL TETRASEME' },
+ [0x23D9] = { unicodeslot=0x23D9, category='so', description='METRICAL PENTASEME' },
+ [0x23DA] = { unicodeslot=0x23DA, category='so', description='EARTH GROUND' },
+ [0x23DB] = { unicodeslot=0x23DB, category='so', description='FUSE' },
+ [0x23DC] = { unicodeslot=0x23DC, category='sm', description='TOP PARENTHESIS' },
+ [0x23DD] = { unicodeslot=0x23DD, category='sm', description='BOTTOM PARENTHESIS' },
+ [0x23DE] = { unicodeslot=0x23DE, category='sm', description='TOP CURLY BRACKET' },
+ [0x23DF] = { unicodeslot=0x23DF, category='sm', description='BOTTOM CURLY BRACKET' },
+ [0x23E0] = { unicodeslot=0x23E0, category='sm', description='TOP TORTOISE SHELL BRACKET' },
+ [0x23E1] = { unicodeslot=0x23E1, category='sm', description='BOTTOM TORTOISE SHELL BRACKET' },
+ [0x23E2] = { unicodeslot=0x23E2, category='so', description='WHITE TRAPEZIUM' },
+ [0x23E3] = { unicodeslot=0x23E3, category='so', description='BENZENE RING WITH CIRCLE' },
+ [0x23E4] = { unicodeslot=0x23E4, category='so', description='STRAIGHTNESS' },
+ [0x23E5] = { unicodeslot=0x23E5, category='so', description='FLATNESS' },
+ [0x23E6] = { unicodeslot=0x23E6, category='so', description='AC CURRENT' },
+ [0x23E7] = { unicodeslot=0x23E7, category='so', description='ELECTRICAL INTERSECTION' },
+ [0x2400] = { unicodeslot=0x2400, category='so', description='SYMBOL FOR NULL' },
+ [0x2401] = { unicodeslot=0x2401, category='so', description='SYMBOL FOR START OF HEADING' },
+ [0x2402] = { unicodeslot=0x2402, category='so', description='SYMBOL FOR START OF TEXT' },
+ [0x2403] = { unicodeslot=0x2403, category='so', description='SYMBOL FOR END OF TEXT' },
+ [0x2404] = { unicodeslot=0x2404, category='so', description='SYMBOL FOR END OF TRANSMISSION' },
+ [0x2405] = { unicodeslot=0x2405, category='so', description='SYMBOL FOR ENQUIRY' },
+ [0x2406] = { unicodeslot=0x2406, category='so', description='SYMBOL FOR ACKNOWLEDGE' },
+ [0x2407] = { unicodeslot=0x2407, category='so', description='SYMBOL FOR BELL' },
+ [0x2408] = { unicodeslot=0x2408, category='so', description='SYMBOL FOR BACKSPACE' },
+ [0x2409] = { unicodeslot=0x2409, category='so', description='SYMBOL FOR HORIZONTAL TABULATION' },
+ [0x240A] = { unicodeslot=0x240A, category='so', description='SYMBOL FOR LINE FEED' },
+ [0x240B] = { unicodeslot=0x240B, category='so', description='SYMBOL FOR VERTICAL TABULATION' },
+ [0x240C] = { unicodeslot=0x240C, category='so', description='SYMBOL FOR FORM FEED' },
+ [0x240D] = { unicodeslot=0x240D, category='so', description='SYMBOL FOR CARRIAGE RETURN' },
+ [0x240E] = { unicodeslot=0x240E, category='so', description='SYMBOL FOR SHIFT OUT' },
+ [0x240F] = { unicodeslot=0x240F, category='so', description='SYMBOL FOR SHIFT IN' },
+ [0x2410] = { unicodeslot=0x2410, category='so', description='SYMBOL FOR DATA LINK ESCAPE' },
+ [0x2411] = { unicodeslot=0x2411, category='so', description='SYMBOL FOR DEVICE CONTROL ONE' },
+ [0x2412] = { unicodeslot=0x2412, category='so', description='SYMBOL FOR DEVICE CONTROL TWO' },
+ [0x2413] = { unicodeslot=0x2413, category='so', description='SYMBOL FOR DEVICE CONTROL THREE' },
+ [0x2414] = { unicodeslot=0x2414, category='so', description='SYMBOL FOR DEVICE CONTROL FOUR' },
+ [0x2415] = { unicodeslot=0x2415, category='so', description='SYMBOL FOR NEGATIVE ACKNOWLEDGE' },
+ [0x2416] = { unicodeslot=0x2416, category='so', description='SYMBOL FOR SYNCHRONOUS IDLE' },
+ [0x2417] = { unicodeslot=0x2417, category='so', description='SYMBOL FOR END OF TRANSMISSION BLOCK' },
+ [0x2418] = { unicodeslot=0x2418, category='so', description='SYMBOL FOR CANCEL' },
+ [0x2419] = { unicodeslot=0x2419, category='so', description='SYMBOL FOR END OF MEDIUM' },
+ [0x241A] = { unicodeslot=0x241A, category='so', description='SYMBOL FOR SUBSTITUTE' },
+ [0x241B] = { unicodeslot=0x241B, category='so', description='SYMBOL FOR ESCAPE' },
+ [0x241C] = { unicodeslot=0x241C, category='so', description='SYMBOL FOR FILE SEPARATOR' },
+ [0x241D] = { unicodeslot=0x241D, category='so', description='SYMBOL FOR GROUP SEPARATOR' },
+ [0x241E] = { unicodeslot=0x241E, category='so', description='SYMBOL FOR RECORD SEPARATOR' },
+ [0x241F] = { unicodeslot=0x241F, category='so', description='SYMBOL FOR UNIT SEPARATOR' },
+ [0x2420] = { unicodeslot=0x2420, category='so', description='SYMBOL FOR SPACE' },
+ [0x2421] = { unicodeslot=0x2421, category='so', description='SYMBOL FOR DELETE' },
+ [0x2422] = { unicodeslot=0x2422, category='so', description='BLANK SYMBOL' },
+ [0x2423] = { unicodeslot=0x2423, category='so', description='OPEN BOX' },
+ [0x2424] = { unicodeslot=0x2424, category='so', description='SYMBOL FOR NEWLINE' },
+ [0x2425] = { unicodeslot=0x2425, category='so', description='SYMBOL FOR DELETE FORM TWO' },
+ [0x2426] = { unicodeslot=0x2426, category='so', description='SYMBOL FOR SUBSTITUTE FORM TWO' },
+ [0x2440] = { unicodeslot=0x2440, category='so', description='OCR HOOK' },
+ [0x2441] = { unicodeslot=0x2441, category='so', description='OCR CHAIR' },
+ [0x2442] = { unicodeslot=0x2442, category='so', description='OCR FORK' },
+ [0x2443] = { unicodeslot=0x2443, category='so', description='OCR INVERTED FORK' },
+ [0x2444] = { unicodeslot=0x2444, category='so', description='OCR BELT BUCKLE' },
+ [0x2445] = { unicodeslot=0x2445, category='so', description='OCR BOW TIE' },
+ [0x2446] = { unicodeslot=0x2446, category='so', description='OCR BRANCH BANK IDENTIFICATION' },
+ [0x2447] = { unicodeslot=0x2447, category='so', description='OCR AMOUNT OF CHECK' },
+ [0x2448] = { unicodeslot=0x2448, category='so', description='OCR DASH' },
+ [0x2449] = { unicodeslot=0x2449, category='so', description='OCR CUSTOMER ACCOUNT NUMBER' },
+ [0x244A] = { unicodeslot=0x244A, category='so', description='OCR DOUBLE BACKSLASH' },
+ [0x2460] = { unicodeslot=0x2460, category='no', description='CIRCLED DIGIT ONE', specials={'circle',0x0031} },
+ [0x2461] = { unicodeslot=0x2461, category='no', description='CIRCLED DIGIT TWO', specials={'circle',0x0032} },
+ [0x2462] = { unicodeslot=0x2462, category='no', description='CIRCLED DIGIT THREE', specials={'circle',0x0033} },
+ [0x2463] = { unicodeslot=0x2463, category='no', description='CIRCLED DIGIT FOUR', specials={'circle',0x0034} },
+ [0x2464] = { unicodeslot=0x2464, category='no', description='CIRCLED DIGIT FIVE', specials={'circle',0x0035} },
+ [0x2465] = { unicodeslot=0x2465, category='no', description='CIRCLED DIGIT SIX', specials={'circle',0x0036} },
+ [0x2466] = { unicodeslot=0x2466, category='no', description='CIRCLED DIGIT SEVEN', specials={'circle',0x0037} },
+ [0x2467] = { unicodeslot=0x2467, category='no', description='CIRCLED DIGIT EIGHT', specials={'circle',0x0038} },
+ [0x2468] = { unicodeslot=0x2468, category='no', description='CIRCLED DIGIT NINE', specials={'circle',0x0039} },
+ [0x2469] = { unicodeslot=0x2469, category='no', description='CIRCLED NUMBER TEN', specials={'circle',0x0031,0x0030} },
+ [0x246A] = { unicodeslot=0x246A, category='no', description='CIRCLED NUMBER ELEVEN', specials={'circle',0x0031,0x0031} },
+ [0x246B] = { unicodeslot=0x246B, category='no', description='CIRCLED NUMBER TWELVE', specials={'circle',0x0031,0x0032} },
+ [0x246C] = { unicodeslot=0x246C, category='no', description='CIRCLED NUMBER THIRTEEN', specials={'circle',0x0031,0x0033} },
+ [0x246D] = { unicodeslot=0x246D, category='no', description='CIRCLED NUMBER FOURTEEN', specials={'circle',0x0031,0x0034} },
+ [0x246E] = { unicodeslot=0x246E, category='no', description='CIRCLED NUMBER FIFTEEN', specials={'circle',0x0031,0x0035} },
+ [0x246F] = { unicodeslot=0x246F, category='no', description='CIRCLED NUMBER SIXTEEN', specials={'circle',0x0031,0x0036} },
+ [0x2470] = { unicodeslot=0x2470, category='no', description='CIRCLED NUMBER SEVENTEEN', specials={'circle',0x0031,0x0037} },
+ [0x2471] = { unicodeslot=0x2471, category='no', description='CIRCLED NUMBER EIGHTEEN', specials={'circle',0x0031,0x0038} },
+ [0x2472] = { unicodeslot=0x2472, category='no', description='CIRCLED NUMBER NINETEEN', specials={'circle',0x0031,0x0039} },
+ [0x2473] = { unicodeslot=0x2473, category='no', description='CIRCLED NUMBER TWENTY', specials={'circle',0x0032,0x0030} },
+ [0x2474] = { unicodeslot=0x2474, category='no', description='PARENTHESIZED DIGIT ONE', specials={'compat',0x0028,0x0031,0x0029} },
+ [0x2475] = { unicodeslot=0x2475, category='no', description='PARENTHESIZED DIGIT TWO', specials={'compat',0x0028,0x0032,0x0029} },
+ [0x2476] = { unicodeslot=0x2476, category='no', description='PARENTHESIZED DIGIT THREE', specials={'compat',0x0028,0x0033,0x0029} },
+ [0x2477] = { unicodeslot=0x2477, category='no', description='PARENTHESIZED DIGIT FOUR', specials={'compat',0x0028,0x0034,0x0029} },
+ [0x2478] = { unicodeslot=0x2478, category='no', description='PARENTHESIZED DIGIT FIVE', specials={'compat',0x0028,0x0035,0x0029} },
+ [0x2479] = { unicodeslot=0x2479, category='no', description='PARENTHESIZED DIGIT SIX', specials={'compat',0x0028,0x0036,0x0029} },
+ [0x247A] = { unicodeslot=0x247A, category='no', description='PARENTHESIZED DIGIT SEVEN', specials={'compat',0x0028,0x0037,0x0029} },
+ [0x247B] = { unicodeslot=0x247B, category='no', description='PARENTHESIZED DIGIT EIGHT', specials={'compat',0x0028,0x0038,0x0029} },
+ [0x247C] = { unicodeslot=0x247C, category='no', description='PARENTHESIZED DIGIT NINE', specials={'compat',0x0028,0x0039,0x0029} },
+ [0x247D] = { unicodeslot=0x247D, category='no', description='PARENTHESIZED NUMBER TEN', specials={'compat',0x0028,0x0031,0x0030,0x0029} },
+ [0x247E] = { unicodeslot=0x247E, category='no', description='PARENTHESIZED NUMBER ELEVEN', specials={'compat',0x0028,0x0031,0x0031,0x0029} },
+ [0x247F] = { unicodeslot=0x247F, category='no', description='PARENTHESIZED NUMBER TWELVE', specials={'compat',0x0028,0x0031,0x0032,0x0029} },
+ [0x2480] = { unicodeslot=0x2480, category='no', description='PARENTHESIZED NUMBER THIRTEEN', specials={'compat',0x0028,0x0031,0x0033,0x0029} },
+ [0x2481] = { unicodeslot=0x2481, category='no', description='PARENTHESIZED NUMBER FOURTEEN', specials={'compat',0x0028,0x0031,0x0034,0x0029} },
+ [0x2482] = { unicodeslot=0x2482, category='no', description='PARENTHESIZED NUMBER FIFTEEN', specials={'compat',0x0028,0x0031,0x0035,0x0029} },
+ [0x2483] = { unicodeslot=0x2483, category='no', description='PARENTHESIZED NUMBER SIXTEEN', specials={'compat',0x0028,0x0031,0x0036,0x0029} },
+ [0x2484] = { unicodeslot=0x2484, category='no', description='PARENTHESIZED NUMBER SEVENTEEN', specials={'compat',0x0028,0x0031,0x0037,0x0029} },
+ [0x2485] = { unicodeslot=0x2485, category='no', description='PARENTHESIZED NUMBER EIGHTEEN', specials={'compat',0x0028,0x0031,0x0038,0x0029} },
+ [0x2486] = { unicodeslot=0x2486, category='no', description='PARENTHESIZED NUMBER NINETEEN', specials={'compat',0x0028,0x0031,0x0039,0x0029} },
+ [0x2487] = { unicodeslot=0x2487, category='no', description='PARENTHESIZED NUMBER TWENTY', specials={'compat',0x0028,0x0032,0x0030,0x0029} },
+ [0x2488] = { unicodeslot=0x2488, category='no', description='DIGIT ONE FULL STOP', specials={'compat',0x0031,0x002E} },
+ [0x2489] = { unicodeslot=0x2489, category='no', description='DIGIT TWO FULL STOP', specials={'compat',0x0032,0x002E} },
+ [0x248A] = { unicodeslot=0x248A, category='no', description='DIGIT THREE FULL STOP', specials={'compat',0x0033,0x002E} },
+ [0x248B] = { unicodeslot=0x248B, category='no', description='DIGIT FOUR FULL STOP', specials={'compat',0x0034,0x002E} },
+ [0x248C] = { unicodeslot=0x248C, category='no', description='DIGIT FIVE FULL STOP', specials={'compat',0x0035,0x002E} },
+ [0x248D] = { unicodeslot=0x248D, category='no', description='DIGIT SIX FULL STOP', specials={'compat',0x0036,0x002E} },
+ [0x248E] = { unicodeslot=0x248E, category='no', description='DIGIT SEVEN FULL STOP', specials={'compat',0x0037,0x002E} },
+ [0x248F] = { unicodeslot=0x248F, category='no', description='DIGIT EIGHT FULL STOP', specials={'compat',0x0038,0x002E} },
+ [0x2490] = { unicodeslot=0x2490, category='no', description='DIGIT NINE FULL STOP', specials={'compat',0x0039,0x002E} },
+ [0x2491] = { unicodeslot=0x2491, category='no', description='NUMBER TEN FULL STOP', specials={'compat',0x0031,0x0030,0x002E} },
+ [0x2492] = { unicodeslot=0x2492, category='no', description='NUMBER ELEVEN FULL STOP', specials={'compat',0x0031,0x0031,0x002E} },
+ [0x2493] = { unicodeslot=0x2493, category='no', description='NUMBER TWELVE FULL STOP', specials={'compat',0x0031,0x0032,0x002E} },
+ [0x2494] = { unicodeslot=0x2494, category='no', description='NUMBER THIRTEEN FULL STOP', specials={'compat',0x0031,0x0033,0x002E} },
+ [0x2495] = { unicodeslot=0x2495, category='no', description='NUMBER FOURTEEN FULL STOP', specials={'compat',0x0031,0x0034,0x002E} },
+ [0x2496] = { unicodeslot=0x2496, category='no', description='NUMBER FIFTEEN FULL STOP', specials={'compat',0x0031,0x0035,0x002E} },
+ [0x2497] = { unicodeslot=0x2497, category='no', description='NUMBER SIXTEEN FULL STOP', specials={'compat',0x0031,0x0036,0x002E} },
+ [0x2498] = { unicodeslot=0x2498, category='no', description='NUMBER SEVENTEEN FULL STOP', specials={'compat',0x0031,0x0037,0x002E} },
+ [0x2499] = { unicodeslot=0x2499, category='no', description='NUMBER EIGHTEEN FULL STOP', specials={'compat',0x0031,0x0038,0x002E} },
+ [0x249A] = { unicodeslot=0x249A, category='no', description='NUMBER NINETEEN FULL STOP', specials={'compat',0x0031,0x0039,0x002E} },
+ [0x249B] = { unicodeslot=0x249B, category='no', description='NUMBER TWENTY FULL STOP', specials={'compat',0x0032,0x0030,0x002E} },
+ [0x249C] = { unicodeslot=0x249C, category='so', description='PARENTHESIZED LATIN SMALL LETTER A', specials={'compat',0x0028,0x0061,0x0029} },
+ [0x249D] = { unicodeslot=0x249D, category='so', description='PARENTHESIZED LATIN SMALL LETTER B', specials={'compat',0x0028,0x0062,0x0029} },
+ [0x249E] = { unicodeslot=0x249E, category='so', description='PARENTHESIZED LATIN SMALL LETTER C', specials={'compat',0x0028,0x0063,0x0029} },
+ [0x249F] = { unicodeslot=0x249F, category='so', description='PARENTHESIZED LATIN SMALL LETTER D', specials={'compat',0x0028,0x0064,0x0029} },
+ [0x24A0] = { unicodeslot=0x24A0, category='so', description='PARENTHESIZED LATIN SMALL LETTER E', specials={'compat',0x0028,0x0065,0x0029} },
+ [0x24A1] = { unicodeslot=0x24A1, category='so', description='PARENTHESIZED LATIN SMALL LETTER F', specials={'compat',0x0028,0x0066,0x0029} },
+ [0x24A2] = { unicodeslot=0x24A2, category='so', description='PARENTHESIZED LATIN SMALL LETTER G', specials={'compat',0x0028,0x0067,0x0029} },
+ [0x24A3] = { unicodeslot=0x24A3, category='so', description='PARENTHESIZED LATIN SMALL LETTER H', specials={'compat',0x0028,0x0068,0x0029} },
+ [0x24A4] = { unicodeslot=0x24A4, category='so', description='PARENTHESIZED LATIN SMALL LETTER I', specials={'compat',0x0028,0x0069,0x0029} },
+ [0x24A5] = { unicodeslot=0x24A5, category='so', description='PARENTHESIZED LATIN SMALL LETTER J', specials={'compat',0x0028,0x006A,0x0029} },
+ [0x24A6] = { unicodeslot=0x24A6, category='so', description='PARENTHESIZED LATIN SMALL LETTER K', specials={'compat',0x0028,0x006B,0x0029} },
+ [0x24A7] = { unicodeslot=0x24A7, category='so', description='PARENTHESIZED LATIN SMALL LETTER L', specials={'compat',0x0028,0x006C,0x0029} },
+ [0x24A8] = { unicodeslot=0x24A8, category='so', description='PARENTHESIZED LATIN SMALL LETTER M', specials={'compat',0x0028,0x006D,0x0029} },
+ [0x24A9] = { unicodeslot=0x24A9, category='so', description='PARENTHESIZED LATIN SMALL LETTER N', specials={'compat',0x0028,0x006E,0x0029} },
+ [0x24AA] = { unicodeslot=0x24AA, category='so', description='PARENTHESIZED LATIN SMALL LETTER O', specials={'compat',0x0028,0x006F,0x0029} },
+ [0x24AB] = { unicodeslot=0x24AB, category='so', description='PARENTHESIZED LATIN SMALL LETTER P', specials={'compat',0x0028,0x0070,0x0029} },
+ [0x24AC] = { unicodeslot=0x24AC, category='so', description='PARENTHESIZED LATIN SMALL LETTER Q', specials={'compat',0x0028,0x0071,0x0029} },
+ [0x24AD] = { unicodeslot=0x24AD, category='so', description='PARENTHESIZED LATIN SMALL LETTER R', specials={'compat',0x0028,0x0072,0x0029} },
+ [0x24AE] = { unicodeslot=0x24AE, category='so', description='PARENTHESIZED LATIN SMALL LETTER S', specials={'compat',0x0028,0x0073,0x0029} },
+ [0x24AF] = { unicodeslot=0x24AF, category='so', description='PARENTHESIZED LATIN SMALL LETTER T', specials={'compat',0x0028,0x0074,0x0029} },
+ [0x24B0] = { unicodeslot=0x24B0, category='so', description='PARENTHESIZED LATIN SMALL LETTER U', specials={'compat',0x0028,0x0075,0x0029} },
+ [0x24B1] = { unicodeslot=0x24B1, category='so', description='PARENTHESIZED LATIN SMALL LETTER V', specials={'compat',0x0028,0x0076,0x0029} },
+ [0x24B2] = { unicodeslot=0x24B2, category='so', description='PARENTHESIZED LATIN SMALL LETTER W', specials={'compat',0x0028,0x0077,0x0029} },
+ [0x24B3] = { unicodeslot=0x24B3, category='so', description='PARENTHESIZED LATIN SMALL LETTER X', specials={'compat',0x0028,0x0078,0x0029} },
+ [0x24B4] = { unicodeslot=0x24B4, category='so', description='PARENTHESIZED LATIN SMALL LETTER Y', specials={'compat',0x0028,0x0079,0x0029} },
+ [0x24B5] = { unicodeslot=0x24B5, category='so', description='PARENTHESIZED LATIN SMALL LETTER Z', specials={'compat',0x0028,0x007A,0x0029} },
+ [0x24B6] = { unicodeslot=0x24B6, category='so', description='CIRCLED LATIN CAPITAL LETTER A', lccode=0x24D0, specials={'circle',0x0041} },
+ [0x24B7] = { unicodeslot=0x24B7, category='so', description='CIRCLED LATIN CAPITAL LETTER B', lccode=0x24D1, specials={'circle',0x0042} },
+ [0x24B8] = { unicodeslot=0x24B8, category='so', description='CIRCLED LATIN CAPITAL LETTER C', lccode=0x24D2, specials={'circle',0x0043} },
+ [0x24B9] = { unicodeslot=0x24B9, category='so', description='CIRCLED LATIN CAPITAL LETTER D', lccode=0x24D3, specials={'circle',0x0044} },
+ [0x24BA] = { unicodeslot=0x24BA, category='so', description='CIRCLED LATIN CAPITAL LETTER E', lccode=0x24D4, specials={'circle',0x0045} },
+ [0x24BB] = { unicodeslot=0x24BB, category='so', description='CIRCLED LATIN CAPITAL LETTER F', lccode=0x24D5, specials={'circle',0x0046} },
+ [0x24BC] = { unicodeslot=0x24BC, category='so', description='CIRCLED LATIN CAPITAL LETTER G', lccode=0x24D6, specials={'circle',0x0047} },
+ [0x24BD] = { unicodeslot=0x24BD, category='so', description='CIRCLED LATIN CAPITAL LETTER H', lccode=0x24D7, specials={'circle',0x0048} },
+ [0x24BE] = { unicodeslot=0x24BE, category='so', description='CIRCLED LATIN CAPITAL LETTER I', lccode=0x24D8, specials={'circle',0x0049} },
+ [0x24BF] = { unicodeslot=0x24BF, category='so', description='CIRCLED LATIN CAPITAL LETTER J', lccode=0x24D9, specials={'circle',0x004A} },
+ [0x24C0] = { unicodeslot=0x24C0, category='so', description='CIRCLED LATIN CAPITAL LETTER K', lccode=0x24DA, specials={'circle',0x004B} },
+ [0x24C1] = { unicodeslot=0x24C1, category='so', description='CIRCLED LATIN CAPITAL LETTER L', lccode=0x24DB, specials={'circle',0x004C} },
+ [0x24C2] = { unicodeslot=0x24C2, category='so', description='CIRCLED LATIN CAPITAL LETTER M', lccode=0x24DC, specials={'circle',0x004D} },
+ [0x24C3] = { unicodeslot=0x24C3, category='so', description='CIRCLED LATIN CAPITAL LETTER N', lccode=0x24DD, specials={'circle',0x004E} },
+ [0x24C4] = { unicodeslot=0x24C4, category='so', description='CIRCLED LATIN CAPITAL LETTER O', lccode=0x24DE, specials={'circle',0x004F} },
+ [0x24C5] = { unicodeslot=0x24C5, category='so', description='CIRCLED LATIN CAPITAL LETTER P', lccode=0x24DF, specials={'circle',0x0050} },
+ [0x24C6] = { unicodeslot=0x24C6, category='so', description='CIRCLED LATIN CAPITAL LETTER Q', lccode=0x24E0, specials={'circle',0x0051} },
+ [0x24C7] = { unicodeslot=0x24C7, category='so', description='CIRCLED LATIN CAPITAL LETTER R', lccode=0x24E1, specials={'circle',0x0052} },
+ [0x24C8] = { unicodeslot=0x24C8, category='so', description='CIRCLED LATIN CAPITAL LETTER S', lccode=0x24E2, specials={'circle',0x0053} },
+ [0x24C9] = { unicodeslot=0x24C9, category='so', description='CIRCLED LATIN CAPITAL LETTER T', lccode=0x24E3, specials={'circle',0x0054} },
+ [0x24CA] = { unicodeslot=0x24CA, category='so', description='CIRCLED LATIN CAPITAL LETTER U', lccode=0x24E4, specials={'circle',0x0055} },
+ [0x24CB] = { unicodeslot=0x24CB, category='so', description='CIRCLED LATIN CAPITAL LETTER V', lccode=0x24E5, specials={'circle',0x0056} },
+ [0x24CC] = { unicodeslot=0x24CC, category='so', description='CIRCLED LATIN CAPITAL LETTER W', lccode=0x24E6, specials={'circle',0x0057} },
+ [0x24CD] = { unicodeslot=0x24CD, category='so', description='CIRCLED LATIN CAPITAL LETTER X', lccode=0x24E7, specials={'circle',0x0058} },
+ [0x24CE] = { unicodeslot=0x24CE, category='so', description='CIRCLED LATIN CAPITAL LETTER Y', lccode=0x24E8, specials={'circle',0x0059} },
+ [0x24CF] = { unicodeslot=0x24CF, category='so', description='CIRCLED LATIN CAPITAL LETTER Z', lccode=0x24E9, specials={'circle',0x005A} },
+ [0x24D0] = { unicodeslot=0x24D0, category='so', description='CIRCLED LATIN SMALL LETTER A', uccode=0x24B6, specials={'circle',0x0061} },
+ [0x24D1] = { unicodeslot=0x24D1, category='so', description='CIRCLED LATIN SMALL LETTER B', uccode=0x24B7, specials={'circle',0x0062} },
+ [0x24D2] = { unicodeslot=0x24D2, category='so', description='CIRCLED LATIN SMALL LETTER C', uccode=0x24B8, specials={'circle',0x0063} },
+ [0x24D3] = { unicodeslot=0x24D3, category='so', description='CIRCLED LATIN SMALL LETTER D', uccode=0x24B9, specials={'circle',0x0064} },
+ [0x24D4] = { unicodeslot=0x24D4, category='so', description='CIRCLED LATIN SMALL LETTER E', uccode=0x24BA, specials={'circle',0x0065} },
+ [0x24D5] = { unicodeslot=0x24D5, category='so', description='CIRCLED LATIN SMALL LETTER F', uccode=0x24BB, specials={'circle',0x0066} },
+ [0x24D6] = { unicodeslot=0x24D6, category='so', description='CIRCLED LATIN SMALL LETTER G', uccode=0x24BC, specials={'circle',0x0067} },
+ [0x24D7] = { unicodeslot=0x24D7, category='so', description='CIRCLED LATIN SMALL LETTER H', uccode=0x24BD, specials={'circle',0x0068} },
+ [0x24D8] = { unicodeslot=0x24D8, category='so', description='CIRCLED LATIN SMALL LETTER I', uccode=0x24BE, specials={'circle',0x0069} },
+ [0x24D9] = { unicodeslot=0x24D9, category='so', description='CIRCLED LATIN SMALL LETTER J', uccode=0x24BF, specials={'circle',0x006A} },
+ [0x24DA] = { unicodeslot=0x24DA, category='so', description='CIRCLED LATIN SMALL LETTER K', uccode=0x24C0, specials={'circle',0x006B} },
+ [0x24DB] = { unicodeslot=0x24DB, category='so', description='CIRCLED LATIN SMALL LETTER L', uccode=0x24C1, specials={'circle',0x006C} },
+ [0x24DC] = { unicodeslot=0x24DC, category='so', description='CIRCLED LATIN SMALL LETTER M', uccode=0x24C2, specials={'circle',0x006D} },
+ [0x24DD] = { unicodeslot=0x24DD, category='so', description='CIRCLED LATIN SMALL LETTER N', uccode=0x24C3, specials={'circle',0x006E} },
+ [0x24DE] = { unicodeslot=0x24DE, category='so', description='CIRCLED LATIN SMALL LETTER O', uccode=0x24C4, specials={'circle',0x006F} },
+ [0x24DF] = { unicodeslot=0x24DF, category='so', description='CIRCLED LATIN SMALL LETTER P', uccode=0x24C5, specials={'circle',0x0070} },
+ [0x24E0] = { unicodeslot=0x24E0, category='so', description='CIRCLED LATIN SMALL LETTER Q', uccode=0x24C6, specials={'circle',0x0071} },
+ [0x24E1] = { unicodeslot=0x24E1, category='so', description='CIRCLED LATIN SMALL LETTER R', uccode=0x24C7, specials={'circle',0x0072} },
+ [0x24E2] = { unicodeslot=0x24E2, category='so', description='CIRCLED LATIN SMALL LETTER S', uccode=0x24C8, specials={'circle',0x0073} },
+ [0x24E3] = { unicodeslot=0x24E3, category='so', description='CIRCLED LATIN SMALL LETTER T', uccode=0x24C9, specials={'circle',0x0074} },
+ [0x24E4] = { unicodeslot=0x24E4, category='so', description='CIRCLED LATIN SMALL LETTER U', uccode=0x24CA, specials={'circle',0x0075} },
+ [0x24E5] = { unicodeslot=0x24E5, category='so', description='CIRCLED LATIN SMALL LETTER V', uccode=0x24CB, specials={'circle',0x0076} },
+ [0x24E6] = { unicodeslot=0x24E6, category='so', description='CIRCLED LATIN SMALL LETTER W', uccode=0x24CC, specials={'circle',0x0077} },
+ [0x24E7] = { unicodeslot=0x24E7, category='so', description='CIRCLED LATIN SMALL LETTER X', uccode=0x24CD, specials={'circle',0x0078} },
+ [0x24E8] = { unicodeslot=0x24E8, category='so', description='CIRCLED LATIN SMALL LETTER Y', uccode=0x24CE, specials={'circle',0x0079} },
+ [0x24E9] = { unicodeslot=0x24E9, category='so', description='CIRCLED LATIN SMALL LETTER Z', uccode=0x24CF, specials={'circle',0x007A} },
+ [0x24EA] = { unicodeslot=0x24EA, category='no', description='CIRCLED DIGIT ZERO', specials={'circle',0x0030} },
+ [0x24EB] = { unicodeslot=0x24EB, category='no', description='NEGATIVE CIRCLED NUMBER ELEVEN' },
+ [0x24EC] = { unicodeslot=0x24EC, category='no', description='NEGATIVE CIRCLED NUMBER TWELVE' },
+ [0x24ED] = { unicodeslot=0x24ED, category='no', description='NEGATIVE CIRCLED NUMBER THIRTEEN' },
+ [0x24EE] = { unicodeslot=0x24EE, category='no', description='NEGATIVE CIRCLED NUMBER FOURTEEN' },
+ [0x24EF] = { unicodeslot=0x24EF, category='no', description='NEGATIVE CIRCLED NUMBER FIFTEEN' },
+ [0x24F0] = { unicodeslot=0x24F0, category='no', description='NEGATIVE CIRCLED NUMBER SIXTEEN' },
+ [0x24F1] = { unicodeslot=0x24F1, category='no', description='NEGATIVE CIRCLED NUMBER SEVENTEEN' },
+ [0x24F2] = { unicodeslot=0x24F2, category='no', description='NEGATIVE CIRCLED NUMBER EIGHTEEN' },
+ [0x24F3] = { unicodeslot=0x24F3, category='no', description='NEGATIVE CIRCLED NUMBER NINETEEN' },
+ [0x24F4] = { unicodeslot=0x24F4, category='no', description='NEGATIVE CIRCLED NUMBER TWENTY' },
+ [0x24F5] = { unicodeslot=0x24F5, category='no', description='DOUBLE CIRCLED DIGIT ONE' },
+ [0x24F6] = { unicodeslot=0x24F6, category='no', description='DOUBLE CIRCLED DIGIT TWO' },
+ [0x24F7] = { unicodeslot=0x24F7, category='no', description='DOUBLE CIRCLED DIGIT THREE' },
+ [0x24F8] = { unicodeslot=0x24F8, category='no', description='DOUBLE CIRCLED DIGIT FOUR' },
+ [0x24F9] = { unicodeslot=0x24F9, category='no', description='DOUBLE CIRCLED DIGIT FIVE' },
+ [0x24FA] = { unicodeslot=0x24FA, category='no', description='DOUBLE CIRCLED DIGIT SIX' },
+ [0x24FB] = { unicodeslot=0x24FB, category='no', description='DOUBLE CIRCLED DIGIT SEVEN' },
+ [0x24FC] = { unicodeslot=0x24FC, category='no', description='DOUBLE CIRCLED DIGIT EIGHT' },
+ [0x24FD] = { unicodeslot=0x24FD, category='no', description='DOUBLE CIRCLED DIGIT NINE' },
+ [0x24FE] = { unicodeslot=0x24FE, category='no', description='DOUBLE CIRCLED NUMBER TEN' },
+ [0x24FF] = { unicodeslot=0x24FF, category='no', description='NEGATIVE CIRCLED DIGIT ZERO' },
+ [0x2500] = { unicodeslot=0x2500, category='so', adobename='SF100000', description='BOX DRAWINGS LIGHT HORIZONTAL' },
+ [0x2501] = { unicodeslot=0x2501, category='so', description='BOX DRAWINGS HEAVY HORIZONTAL' },
+ [0x2502] = { unicodeslot=0x2502, category='so', adobename='SF110000', description='BOX DRAWINGS LIGHT VERTICAL' },
+ [0x2503] = { unicodeslot=0x2503, category='so', description='BOX DRAWINGS HEAVY VERTICAL' },
+ [0x2504] = { unicodeslot=0x2504, category='so', description='BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL' },
+ [0x2505] = { unicodeslot=0x2505, category='so', description='BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL' },
+ [0x2506] = { unicodeslot=0x2506, category='so', description='BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL' },
+ [0x2507] = { unicodeslot=0x2507, category='so', description='BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL' },
+ [0x2508] = { unicodeslot=0x2508, category='so', description='BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL' },
+ [0x2509] = { unicodeslot=0x2509, category='so', description='BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL' },
+ [0x250A] = { unicodeslot=0x250A, category='so', description='BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL' },
+ [0x250B] = { unicodeslot=0x250B, category='so', description='BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL' },
+ [0x250C] = { unicodeslot=0x250C, category='so', adobename='SF010000', description='BOX DRAWINGS LIGHT DOWN AND RIGHT' },
+ [0x250D] = { unicodeslot=0x250D, category='so', description='BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY' },
+ [0x250E] = { unicodeslot=0x250E, category='so', description='BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT' },
+ [0x250F] = { unicodeslot=0x250F, category='so', description='BOX DRAWINGS HEAVY DOWN AND RIGHT' },
+ [0x2510] = { unicodeslot=0x2510, category='so', adobename='SF030000', description='BOX DRAWINGS LIGHT DOWN AND LEFT' },
+ [0x2511] = { unicodeslot=0x2511, category='so', description='BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY' },
+ [0x2512] = { unicodeslot=0x2512, category='so', description='BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT' },
+ [0x2513] = { unicodeslot=0x2513, category='so', description='BOX DRAWINGS HEAVY DOWN AND LEFT' },
+ [0x2514] = { unicodeslot=0x2514, category='so', adobename='SF020000', description='BOX DRAWINGS LIGHT UP AND RIGHT' },
+ [0x2515] = { unicodeslot=0x2515, category='so', description='BOX DRAWINGS UP LIGHT AND RIGHT HEAVY' },
+ [0x2516] = { unicodeslot=0x2516, category='so', description='BOX DRAWINGS UP HEAVY AND RIGHT LIGHT' },
+ [0x2517] = { unicodeslot=0x2517, category='so', description='BOX DRAWINGS HEAVY UP AND RIGHT' },
+ [0x2518] = { unicodeslot=0x2518, category='so', adobename='SF040000', description='BOX DRAWINGS LIGHT UP AND LEFT' },
+ [0x2519] = { unicodeslot=0x2519, category='so', description='BOX DRAWINGS UP LIGHT AND LEFT HEAVY' },
+ [0x251A] = { unicodeslot=0x251A, category='so', description='BOX DRAWINGS UP HEAVY AND LEFT LIGHT' },
+ [0x251B] = { unicodeslot=0x251B, category='so', description='BOX DRAWINGS HEAVY UP AND LEFT' },
+ [0x251C] = { unicodeslot=0x251C, category='so', adobename='SF080000', description='BOX DRAWINGS LIGHT VERTICAL AND RIGHT' },
+ [0x251D] = { unicodeslot=0x251D, category='so', description='BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY' },
+ [0x251E] = { unicodeslot=0x251E, category='so', description='BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT' },
+ [0x251F] = { unicodeslot=0x251F, category='so', description='BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT' },
+ [0x2520] = { unicodeslot=0x2520, category='so', description='BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT' },
+ [0x2521] = { unicodeslot=0x2521, category='so', description='BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY' },
+ [0x2522] = { unicodeslot=0x2522, category='so', description='BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY' },
+ [0x2523] = { unicodeslot=0x2523, category='so', description='BOX DRAWINGS HEAVY VERTICAL AND RIGHT' },
+ [0x2524] = { unicodeslot=0x2524, category='so', adobename='SF090000', description='BOX DRAWINGS LIGHT VERTICAL AND LEFT' },
+ [0x2525] = { unicodeslot=0x2525, category='so', description='BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY' },
+ [0x2526] = { unicodeslot=0x2526, category='so', description='BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT' },
+ [0x2527] = { unicodeslot=0x2527, category='so', description='BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT' },
+ [0x2528] = { unicodeslot=0x2528, category='so', description='BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT' },
+ [0x2529] = { unicodeslot=0x2529, category='so', description='BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY' },
+ [0x252A] = { unicodeslot=0x252A, category='so', description='BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY' },
+ [0x252B] = { unicodeslot=0x252B, category='so', description='BOX DRAWINGS HEAVY VERTICAL AND LEFT' },
+ [0x252C] = { unicodeslot=0x252C, category='so', adobename='SF060000', description='BOX DRAWINGS LIGHT DOWN AND HORIZONTAL' },
+ [0x252D] = { unicodeslot=0x252D, category='so', description='BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT' },
+ [0x252E] = { unicodeslot=0x252E, category='so', description='BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT' },
+ [0x252F] = { unicodeslot=0x252F, category='so', description='BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY' },
+ [0x2530] = { unicodeslot=0x2530, category='so', description='BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT' },
+ [0x2531] = { unicodeslot=0x2531, category='so', description='BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY' },
+ [0x2532] = { unicodeslot=0x2532, category='so', description='BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY' },
+ [0x2533] = { unicodeslot=0x2533, category='so', description='BOX DRAWINGS HEAVY DOWN AND HORIZONTAL' },
+ [0x2534] = { unicodeslot=0x2534, category='so', adobename='SF070000', description='BOX DRAWINGS LIGHT UP AND HORIZONTAL' },
+ [0x2535] = { unicodeslot=0x2535, category='so', description='BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT' },
+ [0x2536] = { unicodeslot=0x2536, category='so', description='BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT' },
+ [0x2537] = { unicodeslot=0x2537, category='so', description='BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY' },
+ [0x2538] = { unicodeslot=0x2538, category='so', description='BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT' },
+ [0x2539] = { unicodeslot=0x2539, category='so', description='BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY' },
+ [0x253A] = { unicodeslot=0x253A, category='so', description='BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY' },
+ [0x253B] = { unicodeslot=0x253B, category='so', description='BOX DRAWINGS HEAVY UP AND HORIZONTAL' },
+ [0x253C] = { unicodeslot=0x253C, category='so', adobename='SF050000', description='BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL' },
+ [0x253D] = { unicodeslot=0x253D, category='so', description='BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT' },
+ [0x253E] = { unicodeslot=0x253E, category='so', description='BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT' },
+ [0x253F] = { unicodeslot=0x253F, category='so', description='BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY' },
+ [0x2540] = { unicodeslot=0x2540, category='so', description='BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT' },
+ [0x2541] = { unicodeslot=0x2541, category='so', description='BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT' },
+ [0x2542] = { unicodeslot=0x2542, category='so', description='BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT' },
+ [0x2543] = { unicodeslot=0x2543, category='so', description='BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT' },
+ [0x2544] = { unicodeslot=0x2544, category='so', description='BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT' },
+ [0x2545] = { unicodeslot=0x2545, category='so', description='BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT' },
+ [0x2546] = { unicodeslot=0x2546, category='so', description='BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT' },
+ [0x2547] = { unicodeslot=0x2547, category='so', description='BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY' },
+ [0x2548] = { unicodeslot=0x2548, category='so', description='BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY' },
+ [0x2549] = { unicodeslot=0x2549, category='so', description='BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY' },
+ [0x254A] = { unicodeslot=0x254A, category='so', description='BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY' },
+ [0x254B] = { unicodeslot=0x254B, category='so', description='BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL' },
+ [0x254C] = { unicodeslot=0x254C, category='so', description='BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL' },
+ [0x254D] = { unicodeslot=0x254D, category='so', description='BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL' },
+ [0x254E] = { unicodeslot=0x254E, category='so', description='BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL' },
+ [0x254F] = { unicodeslot=0x254F, category='so', description='BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL' },
+ [0x2550] = { unicodeslot=0x2550, category='so', adobename='SF430000', description='BOX DRAWINGS DOUBLE HORIZONTAL' },
+ [0x2551] = { unicodeslot=0x2551, category='so', adobename='SF240000', description='BOX DRAWINGS DOUBLE VERTICAL' },
+ [0x2552] = { unicodeslot=0x2552, category='so', adobename='SF510000', description='BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE' },
+ [0x2553] = { unicodeslot=0x2553, category='so', adobename='SF520000', description='BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE' },
+ [0x2554] = { unicodeslot=0x2554, category='so', adobename='SF390000', description='BOX DRAWINGS DOUBLE DOWN AND RIGHT' },
+ [0x2555] = { unicodeslot=0x2555, category='so', adobename='SF220000', description='BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE' },
+ [0x2556] = { unicodeslot=0x2556, category='so', adobename='SF210000', description='BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE' },
+ [0x2557] = { unicodeslot=0x2557, category='so', adobename='SF250000', description='BOX DRAWINGS DOUBLE DOWN AND LEFT' },
+ [0x2558] = { unicodeslot=0x2558, category='so', adobename='SF500000', description='BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE' },
+ [0x2559] = { unicodeslot=0x2559, category='so', adobename='SF490000', description='BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE' },
+ [0x255A] = { unicodeslot=0x255A, category='so', adobename='SF380000', description='BOX DRAWINGS DOUBLE UP AND RIGHT' },
+ [0x255B] = { unicodeslot=0x255B, category='so', adobename='SF280000', description='BOX DRAWINGS UP SINGLE AND LEFT DOUBLE' },
+ [0x255C] = { unicodeslot=0x255C, category='so', adobename='SF270000', description='BOX DRAWINGS UP DOUBLE AND LEFT SINGLE' },
+ [0x255D] = { unicodeslot=0x255D, category='so', adobename='SF260000', description='BOX DRAWINGS DOUBLE UP AND LEFT' },
+ [0x255E] = { unicodeslot=0x255E, category='so', adobename='SF360000', description='BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE' },
+ [0x255F] = { unicodeslot=0x255F, category='so', adobename='SF370000', description='BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE' },
+ [0x2560] = { unicodeslot=0x2560, category='so', adobename='SF420000', description='BOX DRAWINGS DOUBLE VERTICAL AND RIGHT' },
+ [0x2561] = { unicodeslot=0x2561, category='so', adobename='SF190000', description='BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE' },
+ [0x2562] = { unicodeslot=0x2562, category='so', adobename='SF200000', description='BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE' },
+ [0x2563] = { unicodeslot=0x2563, category='so', adobename='SF230000', description='BOX DRAWINGS DOUBLE VERTICAL AND LEFT' },
+ [0x2564] = { unicodeslot=0x2564, category='so', adobename='SF470000', description='BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE' },
+ [0x2565] = { unicodeslot=0x2565, category='so', adobename='SF480000', description='BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE' },
+ [0x2566] = { unicodeslot=0x2566, category='so', adobename='SF410000', description='BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL' },
+ [0x2567] = { unicodeslot=0x2567, category='so', adobename='SF450000', description='BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE' },
+ [0x2568] = { unicodeslot=0x2568, category='so', adobename='SF460000', description='BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE' },
+ [0x2569] = { unicodeslot=0x2569, category='so', adobename='SF400000', description='BOX DRAWINGS DOUBLE UP AND HORIZONTAL' },
+ [0x256A] = { unicodeslot=0x256A, category='so', adobename='SF540000', description='BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE' },
+ [0x256B] = { unicodeslot=0x256B, category='so', adobename='SF530000', description='BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE' },
+ [0x256C] = { unicodeslot=0x256C, category='so', adobename='SF440000', description='BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL' },
+ [0x256D] = { unicodeslot=0x256D, category='so', description='BOX DRAWINGS LIGHT ARC DOWN AND RIGHT' },
+ [0x256E] = { unicodeslot=0x256E, category='so', description='BOX DRAWINGS LIGHT ARC DOWN AND LEFT' },
+ [0x256F] = { unicodeslot=0x256F, category='so', description='BOX DRAWINGS LIGHT ARC UP AND LEFT' },
+ [0x2570] = { unicodeslot=0x2570, category='so', description='BOX DRAWINGS LIGHT ARC UP AND RIGHT' },
+ [0x2571] = { unicodeslot=0x2571, category='so', description='BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT' },
+ [0x2572] = { unicodeslot=0x2572, category='so', description='BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT' },
+ [0x2573] = { unicodeslot=0x2573, category='so', description='BOX DRAWINGS LIGHT DIAGONAL CROSS' },
+ [0x2574] = { unicodeslot=0x2574, category='so', description='BOX DRAWINGS LIGHT LEFT' },
+ [0x2575] = { unicodeslot=0x2575, category='so', description='BOX DRAWINGS LIGHT UP' },
+ [0x2576] = { unicodeslot=0x2576, category='so', description='BOX DRAWINGS LIGHT RIGHT' },
+ [0x2577] = { unicodeslot=0x2577, category='so', description='BOX DRAWINGS LIGHT DOWN' },
+ [0x2578] = { unicodeslot=0x2578, category='so', description='BOX DRAWINGS HEAVY LEFT' },
+ [0x2579] = { unicodeslot=0x2579, category='so', description='BOX DRAWINGS HEAVY UP' },
+ [0x257A] = { unicodeslot=0x257A, category='so', description='BOX DRAWINGS HEAVY RIGHT' },
+ [0x257B] = { unicodeslot=0x257B, category='so', description='BOX DRAWINGS HEAVY DOWN' },
+ [0x257C] = { unicodeslot=0x257C, category='so', description='BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT' },
+ [0x257D] = { unicodeslot=0x257D, category='so', description='BOX DRAWINGS LIGHT UP AND HEAVY DOWN' },
+ [0x257E] = { unicodeslot=0x257E, category='so', description='BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT' },
+ [0x257F] = { unicodeslot=0x257F, category='so', description='BOX DRAWINGS HEAVY UP AND LIGHT DOWN' },
+ [0x2580] = { unicodeslot=0x2580, category='so', adobename='upblock', description='UPPER HALF BLOCK' },
+ [0x2581] = { unicodeslot=0x2581, category='so', description='LOWER ONE EIGHTH BLOCK' },
+ [0x2582] = { unicodeslot=0x2582, category='so', description='LOWER ONE QUARTER BLOCK' },
+ [0x2583] = { unicodeslot=0x2583, category='so', description='LOWER THREE EIGHTHS BLOCK' },
+ [0x2584] = { unicodeslot=0x2584, category='so', adobename='dnblock', description='LOWER HALF BLOCK' },
+ [0x2585] = { unicodeslot=0x2585, category='so', description='LOWER FIVE EIGHTHS BLOCK' },
+ [0x2586] = { unicodeslot=0x2586, category='so', description='LOWER THREE QUARTERS BLOCK' },
+ [0x2587] = { unicodeslot=0x2587, category='so', description='LOWER SEVEN EIGHTHS BLOCK' },
+ [0x2588] = { unicodeslot=0x2588, category='so', adobename='block', description='FULL BLOCK' },
+ [0x2589] = { unicodeslot=0x2589, category='so', description='LEFT SEVEN EIGHTHS BLOCK' },
+ [0x258A] = { unicodeslot=0x258A, category='so', description='LEFT THREE QUARTERS BLOCK' },
+ [0x258B] = { unicodeslot=0x258B, category='so', description='LEFT FIVE EIGHTHS BLOCK' },
+ [0x258C] = { unicodeslot=0x258C, category='so', adobename='lfblock', description='LEFT HALF BLOCK' },
+ [0x258D] = { unicodeslot=0x258D, category='so', description='LEFT THREE EIGHTHS BLOCK' },
+ [0x258E] = { unicodeslot=0x258E, category='so', description='LEFT ONE QUARTER BLOCK' },
+ [0x258F] = { unicodeslot=0x258F, category='so', description='LEFT ONE EIGHTH BLOCK' },
+ [0x2590] = { unicodeslot=0x2590, category='so', adobename='rtblock', description='RIGHT HALF BLOCK' },
+ [0x2591] = { unicodeslot=0x2591, category='so', adobename='ltshade', description='LIGHT SHADE' },
+ [0x2592] = { unicodeslot=0x2592, category='so', adobename='shade', description='MEDIUM SHADE' },
+ [0x2593] = { unicodeslot=0x2593, category='so', adobename='dkshade', description='DARK SHADE' },
+ [0x2594] = { unicodeslot=0x2594, category='so', description='UPPER ONE EIGHTH BLOCK' },
+ [0x2595] = { unicodeslot=0x2595, category='so', description='RIGHT ONE EIGHTH BLOCK' },
+ [0x2596] = { unicodeslot=0x2596, category='so', description='QUADRANT LOWER LEFT' },
+ [0x2597] = { unicodeslot=0x2597, category='so', description='QUADRANT LOWER RIGHT' },
+ [0x2598] = { unicodeslot=0x2598, category='so', description='QUADRANT UPPER LEFT' },
+ [0x2599] = { unicodeslot=0x2599, category='so', description='QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT' },
+ [0x259A] = { unicodeslot=0x259A, category='so', description='QUADRANT UPPER LEFT AND LOWER RIGHT' },
+ [0x259B] = { unicodeslot=0x259B, category='so', description='QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT' },
+ [0x259C] = { unicodeslot=0x259C, category='so', description='QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT' },
+ [0x259D] = { unicodeslot=0x259D, category='so', description='QUADRANT UPPER RIGHT' },
+ [0x259E] = { unicodeslot=0x259E, category='so', description='QUADRANT UPPER RIGHT AND LOWER LEFT' },
+ [0x259F] = { unicodeslot=0x259F, category='so', description='QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT' },
+ [0x25A0] = { unicodeslot=0x25A0, category='so', adobename='filledbox', description='BLACK SQUARE' },
+ [0x25A1] = { unicodeslot=0x25A1, category='so', adobename='H22073', description='WHITE SQUARE' },
+ [0x25A2] = { unicodeslot=0x25A2, category='so', description='WHITE SQUARE WITH ROUNDED CORNERS' },
+ [0x25A3] = { unicodeslot=0x25A3, category='so', description='WHITE SQUARE CONTAINING BLACK SMALL SQUARE' },
+ [0x25A4] = { unicodeslot=0x25A4, category='so', description='SQUARE WITH HORIZONTAL FILL' },
+ [0x25A5] = { unicodeslot=0x25A5, category='so', description='SQUARE WITH VERTICAL FILL' },
+ [0x25A6] = { unicodeslot=0x25A6, category='so', description='SQUARE WITH ORTHOGONAL CROSSHATCH FILL' },
+ [0x25A7] = { unicodeslot=0x25A7, category='so', description='SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL' },
+ [0x25A8] = { unicodeslot=0x25A8, category='so', description='SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL' },
+ [0x25A9] = { unicodeslot=0x25A9, category='so', description='SQUARE WITH DIAGONAL CROSSHATCH FILL' },
+ [0x25AA] = { unicodeslot=0x25AA, category='so', adobename='H18543', description='BLACK SMALL SQUARE' },
+ [0x25AB] = { unicodeslot=0x25AB, category='so', adobename='H18551', description='WHITE SMALL SQUARE' },
+ [0x25AC] = { unicodeslot=0x25AC, category='so', adobename='filledrect', description='BLACK RECTANGLE' },
+ [0x25AD] = { unicodeslot=0x25AD, category='so', description='WHITE RECTANGLE' },
+ [0x25AE] = { unicodeslot=0x25AE, category='so', description='BLACK VERTICAL RECTANGLE' },
+ [0x25AF] = { unicodeslot=0x25AF, category='so', description='WHITE VERTICAL RECTANGLE' },
+ [0x25B0] = { unicodeslot=0x25B0, category='so', description='BLACK PARALLELOGRAM' },
+ [0x25B1] = { unicodeslot=0x25B1, category='so', description='WHITE PARALLELOGRAM' },
+ [0x25B2] = { unicodeslot=0x25B2, category='so', adobename='triagup', description='BLACK UP-POINTING TRIANGLE' },
+ [0x25B3] = { unicodeslot=0x25B3, category='so', description='WHITE UP-POINTING TRIANGLE' },
+ [0x25B4] = { unicodeslot=0x25B4, category='so', description='BLACK UP-POINTING SMALL TRIANGLE' },
+ [0x25B5] = { unicodeslot=0x25B5, category='so', description='WHITE UP-POINTING SMALL TRIANGLE' },
+ [0x25B6] = { unicodeslot=0x25B6, category='so', description='BLACK RIGHT-POINTING TRIANGLE' },
+ [0x25B7] = { unicodeslot=0x25B7, category='sm', description='WHITE RIGHT-POINTING TRIANGLE' },
+ [0x25B8] = { unicodeslot=0x25B8, category='so', description='BLACK RIGHT-POINTING SMALL TRIANGLE' },
+ [0x25B9] = { unicodeslot=0x25B9, category='so', description='WHITE RIGHT-POINTING SMALL TRIANGLE' },
+ [0x25BA] = { unicodeslot=0x25BA, category='so', adobename='triagrt', description='BLACK RIGHT-POINTING POINTER' },
+ [0x25BB] = { unicodeslot=0x25BB, category='so', description='WHITE RIGHT-POINTING POINTER' },
+ [0x25BC] = { unicodeslot=0x25BC, category='so', adobename='triagdn', description='BLACK DOWN-POINTING TRIANGLE' },
+ [0x25BD] = { unicodeslot=0x25BD, category='so', description='WHITE DOWN-POINTING TRIANGLE' },
+ [0x25BE] = { unicodeslot=0x25BE, category='so', description='BLACK DOWN-POINTING SMALL TRIANGLE' },
+ [0x25BF] = { unicodeslot=0x25BF, category='so', description='WHITE DOWN-POINTING SMALL TRIANGLE' },
+ [0x25C0] = { unicodeslot=0x25C0, category='so', description='BLACK LEFT-POINTING TRIANGLE' },
+ [0x25C1] = { unicodeslot=0x25C1, category='sm', description='WHITE LEFT-POINTING TRIANGLE' },
+ [0x25C2] = { unicodeslot=0x25C2, category='so', description='BLACK LEFT-POINTING SMALL TRIANGLE' },
+ [0x25C3] = { unicodeslot=0x25C3, category='so', description='WHITE LEFT-POINTING SMALL TRIANGLE' },
+ [0x25C4] = { unicodeslot=0x25C4, category='so', adobename='triaglf', description='BLACK LEFT-POINTING POINTER' },
+ [0x25C5] = { unicodeslot=0x25C5, category='so', description='WHITE LEFT-POINTING POINTER' },
+ [0x25C6] = { unicodeslot=0x25C6, category='so', description='BLACK DIAMOND' },
+ [0x25C7] = { unicodeslot=0x25C7, category='so', description='WHITE DIAMOND' },
+ [0x25C8] = { unicodeslot=0x25C8, category='so', description='WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND' },
+ [0x25C9] = { unicodeslot=0x25C9, category='so', description='FISHEYE' },
+ [0x25CA] = { unicodeslot=0x25CA, category='so', adobename='lozenge', description='LOZENGE' },
+ [0x25CB] = { unicodeslot=0x25CB, category='so', adobename='circle', description='WHITE CIRCLE' },
+ [0x25CC] = { unicodeslot=0x25CC, category='so', description='DOTTED CIRCLE' },
+ [0x25CD] = { unicodeslot=0x25CD, category='so', description='CIRCLE WITH VERTICAL FILL' },
+ [0x25CE] = { unicodeslot=0x25CE, category='so', description='BULLSEYE' },
+ [0x25CF] = { unicodeslot=0x25CF, category='so', adobename='H18533', description='BLACK CIRCLE' },
+ [0x25D0] = { unicodeslot=0x25D0, category='so', description='CIRCLE WITH LEFT HALF BLACK' },
+ [0x25D1] = { unicodeslot=0x25D1, category='so', description='CIRCLE WITH RIGHT HALF BLACK' },
+ [0x25D2] = { unicodeslot=0x25D2, category='so', description='CIRCLE WITH LOWER HALF BLACK' },
+ [0x25D3] = { unicodeslot=0x25D3, category='so', description='CIRCLE WITH UPPER HALF BLACK' },
+ [0x25D4] = { unicodeslot=0x25D4, category='so', description='CIRCLE WITH UPPER RIGHT QUADRANT BLACK' },
+ [0x25D5] = { unicodeslot=0x25D5, category='so', description='CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK' },
+ [0x25D6] = { unicodeslot=0x25D6, category='so', description='LEFT HALF BLACK CIRCLE' },
+ [0x25D7] = { unicodeslot=0x25D7, category='so', description='RIGHT HALF BLACK CIRCLE' },
+ [0x25D8] = { unicodeslot=0x25D8, category='so', adobename='invbullet', description='INVERSE BULLET' },
+ [0x25D9] = { unicodeslot=0x25D9, category='so', adobename='invcircle', description='INVERSE WHITE CIRCLE' },
+ [0x25DA] = { unicodeslot=0x25DA, category='so', description='UPPER HALF INVERSE WHITE CIRCLE' },
+ [0x25DB] = { unicodeslot=0x25DB, category='so', description='LOWER HALF INVERSE WHITE CIRCLE' },
+ [0x25DC] = { unicodeslot=0x25DC, category='so', description='UPPER LEFT QUADRANT CIRCULAR ARC' },
+ [0x25DD] = { unicodeslot=0x25DD, category='so', description='UPPER RIGHT QUADRANT CIRCULAR ARC' },
+ [0x25DE] = { unicodeslot=0x25DE, category='so', description='LOWER RIGHT QUADRANT CIRCULAR ARC' },
+ [0x25DF] = { unicodeslot=0x25DF, category='so', description='LOWER LEFT QUADRANT CIRCULAR ARC' },
+ [0x25E0] = { unicodeslot=0x25E0, category='so', description='UPPER HALF CIRCLE' },
+ [0x25E1] = { unicodeslot=0x25E1, category='so', description='LOWER HALF CIRCLE' },
+ [0x25E2] = { unicodeslot=0x25E2, category='so', description='BLACK LOWER RIGHT TRIANGLE' },
+ [0x25E3] = { unicodeslot=0x25E3, category='so', description='BLACK LOWER LEFT TRIANGLE' },
+ [0x25E4] = { unicodeslot=0x25E4, category='so', description='BLACK UPPER LEFT TRIANGLE' },
+ [0x25E5] = { unicodeslot=0x25E5, category='so', description='BLACK UPPER RIGHT TRIANGLE' },
+ [0x25E6] = { unicodeslot=0x25E6, category='so', adobename='openbullet', description='WHITE BULLET' },
+ [0x25E7] = { unicodeslot=0x25E7, category='so', description='SQUARE WITH LEFT HALF BLACK' },
+ [0x25E8] = { unicodeslot=0x25E8, category='so', description='SQUARE WITH RIGHT HALF BLACK' },
+ [0x25E9] = { unicodeslot=0x25E9, category='so', description='SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK' },
+ [0x25EA] = { unicodeslot=0x25EA, category='so', description='SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK' },
+ [0x25EB] = { unicodeslot=0x25EB, category='so', description='WHITE SQUARE WITH VERTICAL BISECTING LINE' },
+ [0x25EC] = { unicodeslot=0x25EC, category='so', description='WHITE UP-POINTING TRIANGLE WITH DOT' },
+ [0x25ED] = { unicodeslot=0x25ED, category='so', description='UP-POINTING TRIANGLE WITH LEFT HALF BLACK' },
+ [0x25EE] = { unicodeslot=0x25EE, category='so', description='UP-POINTING TRIANGLE WITH RIGHT HALF BLACK' },
+ [0x25EF] = { unicodeslot=0x25EF, category='so', description='LARGE CIRCLE' },
+ [0x25F0] = { unicodeslot=0x25F0, category='so', description='WHITE SQUARE WITH UPPER LEFT QUADRANT' },
+ [0x25F1] = { unicodeslot=0x25F1, category='so', description='WHITE SQUARE WITH LOWER LEFT QUADRANT' },
+ [0x25F2] = { unicodeslot=0x25F2, category='so', description='WHITE SQUARE WITH LOWER RIGHT QUADRANT' },
+ [0x25F3] = { unicodeslot=0x25F3, category='so', description='WHITE SQUARE WITH UPPER RIGHT QUADRANT' },
+ [0x25F4] = { unicodeslot=0x25F4, category='so', description='WHITE CIRCLE WITH UPPER LEFT QUADRANT' },
+ [0x25F5] = { unicodeslot=0x25F5, category='so', description='WHITE CIRCLE WITH LOWER LEFT QUADRANT' },
+ [0x25F6] = { unicodeslot=0x25F6, category='so', description='WHITE CIRCLE WITH LOWER RIGHT QUADRANT' },
+ [0x25F7] = { unicodeslot=0x25F7, category='so', description='WHITE CIRCLE WITH UPPER RIGHT QUADRANT' },
+ [0x25F8] = { unicodeslot=0x25F8, category='sm', description='UPPER LEFT TRIANGLE' },
+ [0x25F9] = { unicodeslot=0x25F9, category='sm', description='UPPER RIGHT TRIANGLE' },
+ [0x25FA] = { unicodeslot=0x25FA, category='sm', description='LOWER LEFT TRIANGLE' },
+ [0x25FB] = { unicodeslot=0x25FB, category='sm', description='WHITE MEDIUM SQUARE' },
+ [0x25FC] = { unicodeslot=0x25FC, category='sm', description='BLACK MEDIUM SQUARE' },
+ [0x25FD] = { unicodeslot=0x25FD, category='sm', description='WHITE MEDIUM SMALL SQUARE' },
+ [0x25FE] = { unicodeslot=0x25FE, category='sm', description='BLACK MEDIUM SMALL SQUARE' },
+ [0x25FF] = { unicodeslot=0x25FF, category='sm', description='LOWER RIGHT TRIANGLE' },
+ [0x2600] = { unicodeslot=0x2600, category='so', description='BLACK SUN WITH RAYS' },
+ [0x2601] = { unicodeslot=0x2601, category='so', description='CLOUD' },
+ [0x2602] = { unicodeslot=0x2602, category='so', description='UMBRELLA' },
+ [0x2603] = { unicodeslot=0x2603, category='so', description='SNOWMAN' },
+ [0x2604] = { unicodeslot=0x2604, category='so', description='COMET' },
+ [0x2605] = { unicodeslot=0x2605, category='so', description='BLACK STAR' },
+ [0x2606] = { unicodeslot=0x2606, category='so', description='WHITE STAR' },
+ [0x2607] = { unicodeslot=0x2607, category='so', description='LIGHTNING' },
+ [0x2608] = { unicodeslot=0x2608, category='so', description='THUNDERSTORM' },
+ [0x2609] = { unicodeslot=0x2609, category='so', description='SUN' },
+ [0x260A] = { unicodeslot=0x260A, category='so', description='ASCENDING NODE' },
+ [0x260B] = { unicodeslot=0x260B, category='so', description='DESCENDING NODE' },
+ [0x260C] = { unicodeslot=0x260C, category='so', description='CONJUNCTION' },
+ [0x260D] = { unicodeslot=0x260D, category='so', description='OPPOSITION' },
+ [0x260E] = { unicodeslot=0x260E, category='so', description='BLACK TELEPHONE' },
+ [0x260F] = { unicodeslot=0x260F, category='so', description='WHITE TELEPHONE' },
+ [0x2610] = { unicodeslot=0x2610, category='so', description='BALLOT BOX' },
+ [0x2611] = { unicodeslot=0x2611, category='so', description='BALLOT BOX WITH CHECK' },
+ [0x2612] = { unicodeslot=0x2612, category='so', description='BALLOT BOX WITH X' },
+ [0x2613] = { unicodeslot=0x2613, category='so', description='SALTIRE' },
+ [0x2614] = { unicodeslot=0x2614, category='so', description='UMBRELLA WITH RAIN DROPS' },
+ [0x2615] = { unicodeslot=0x2615, category='so', description='HOT BEVERAGE' },
+ [0x2616] = { unicodeslot=0x2616, category='so', description='WHITE SHOGI PIECE' },
+ [0x2617] = { unicodeslot=0x2617, category='so', description='BLACK SHOGI PIECE' },
+ [0x2618] = { unicodeslot=0x2618, category='so', description='SHAMROCK' },
+ [0x2619] = { unicodeslot=0x2619, category='so', description='REVERSED ROTATED FLORAL HEART BULLET' },
+ [0x261A] = { unicodeslot=0x261A, category='so', description='BLACK LEFT POINTING INDEX' },
+ [0x261B] = { unicodeslot=0x261B, category='so', description='BLACK RIGHT POINTING INDEX' },
+ [0x261C] = { unicodeslot=0x261C, category='so', description='WHITE LEFT POINTING INDEX' },
+ [0x261D] = { unicodeslot=0x261D, category='so', description='WHITE UP POINTING INDEX' },
+ [0x261E] = { unicodeslot=0x261E, category='so', description='WHITE RIGHT POINTING INDEX' },
+ [0x261F] = { unicodeslot=0x261F, category='so', description='WHITE DOWN POINTING INDEX' },
+ [0x2620] = { unicodeslot=0x2620, category='so', description='SKULL AND CROSSBONES' },
+ [0x2621] = { unicodeslot=0x2621, category='so', description='CAUTION SIGN' },
+ [0x2622] = { unicodeslot=0x2622, category='so', description='RADIOACTIVE SIGN' },
+ [0x2623] = { unicodeslot=0x2623, category='so', description='BIOHAZARD SIGN' },
+ [0x2624] = { unicodeslot=0x2624, category='so', description='CADUCEUS' },
+ [0x2625] = { unicodeslot=0x2625, category='so', description='ANKH' },
+ [0x2626] = { unicodeslot=0x2626, category='so', description='ORTHODOX CROSS' },
+ [0x2627] = { unicodeslot=0x2627, category='so', description='CHI RHO' },
+ [0x2628] = { unicodeslot=0x2628, category='so', description='CROSS OF LORRAINE' },
+ [0x2629] = { unicodeslot=0x2629, category='so', description='CROSS OF JERUSALEM' },
+ [0x262A] = { unicodeslot=0x262A, category='so', description='STAR AND CRESCENT' },
+ [0x262B] = { unicodeslot=0x262B, category='so', description='FARSI SYMBOL' },
+ [0x262C] = { unicodeslot=0x262C, category='so', description='ADI SHAKTI' },
+ [0x262D] = { unicodeslot=0x262D, category='so', description='HAMMER AND SICKLE' },
+ [0x262E] = { unicodeslot=0x262E, category='so', description='PEACE SYMBOL' },
+ [0x262F] = { unicodeslot=0x262F, category='so', description='YIN YANG' },
+ [0x2630] = { unicodeslot=0x2630, category='so', description='TRIGRAM FOR HEAVEN' },
+ [0x2631] = { unicodeslot=0x2631, category='so', description='TRIGRAM FOR LAKE' },
+ [0x2632] = { unicodeslot=0x2632, category='so', description='TRIGRAM FOR FIRE' },
+ [0x2633] = { unicodeslot=0x2633, category='so', description='TRIGRAM FOR THUNDER' },
+ [0x2634] = { unicodeslot=0x2634, category='so', description='TRIGRAM FOR WIND' },
+ [0x2635] = { unicodeslot=0x2635, category='so', description='TRIGRAM FOR WATER' },
+ [0x2636] = { unicodeslot=0x2636, category='so', description='TRIGRAM FOR MOUNTAIN' },
+ [0x2637] = { unicodeslot=0x2637, category='so', description='TRIGRAM FOR EARTH' },
+ [0x2638] = { unicodeslot=0x2638, category='so', description='WHEEL OF DHARMA' },
+ [0x2639] = { unicodeslot=0x2639, category='so', description='WHITE FROWNING FACE' },
+ [0x263A] = { unicodeslot=0x263A, category='so', adobename='smileface', description='WHITE SMILING FACE' },
+ [0x263B] = { unicodeslot=0x263B, category='so', adobename='invsmileface', description='BLACK SMILING FACE' },
+ [0x263C] = { unicodeslot=0x263C, category='so', adobename='sun', description='WHITE SUN WITH RAYS' },
+ [0x263D] = { unicodeslot=0x263D, category='so', description='FIRST QUARTER MOON' },
+ [0x263E] = { unicodeslot=0x263E, category='so', description='LAST QUARTER MOON' },
+ [0x263F] = { unicodeslot=0x263F, category='so', description='MERCURY' },
+ [0x2640] = { unicodeslot=0x2640, category='so', adobename='female', description='FEMALE SIGN' },
+ [0x2641] = { unicodeslot=0x2641, category='so', description='EARTH' },
+ [0x2642] = { unicodeslot=0x2642, category='so', adobename='male', description='MALE SIGN' },
+ [0x2643] = { unicodeslot=0x2643, category='so', description='JUPITER' },
+ [0x2644] = { unicodeslot=0x2644, category='so', description='SATURN' },
+ [0x2645] = { unicodeslot=0x2645, category='so', description='URANUS' },
+ [0x2646] = { unicodeslot=0x2646, category='so', description='NEPTUNE' },
+ [0x2647] = { unicodeslot=0x2647, category='so', description='PLUTO' },
+ [0x2648] = { unicodeslot=0x2648, category='so', description='ARIES' },
+ [0x2649] = { unicodeslot=0x2649, category='so', description='TAURUS' },
+ [0x264A] = { unicodeslot=0x264A, category='so', description='GEMINI' },
+ [0x264B] = { unicodeslot=0x264B, category='so', description='CANCER' },
+ [0x264C] = { unicodeslot=0x264C, category='so', description='LEO' },
+ [0x264D] = { unicodeslot=0x264D, category='so', description='VIRGO' },
+ [0x264E] = { unicodeslot=0x264E, category='so', description='LIBRA' },
+ [0x264F] = { unicodeslot=0x264F, category='so', description='SCORPIUS' },
+ [0x2650] = { unicodeslot=0x2650, category='so', description='SAGITTARIUS' },
+ [0x2651] = { unicodeslot=0x2651, category='so', description='CAPRICORN' },
+ [0x2652] = { unicodeslot=0x2652, category='so', description='AQUARIUS' },
+ [0x2653] = { unicodeslot=0x2653, category='so', description='PISCES' },
+ [0x2654] = { unicodeslot=0x2654, category='so', description='WHITE CHESS KING' },
+ [0x2655] = { unicodeslot=0x2655, category='so', description='WHITE CHESS QUEEN' },
+ [0x2656] = { unicodeslot=0x2656, category='so', description='WHITE CHESS ROOK' },
+ [0x2657] = { unicodeslot=0x2657, category='so', description='WHITE CHESS BISHOP' },
+ [0x2658] = { unicodeslot=0x2658, category='so', description='WHITE CHESS KNIGHT' },
+ [0x2659] = { unicodeslot=0x2659, category='so', description='WHITE CHESS PAWN' },
+ [0x265A] = { unicodeslot=0x265A, category='so', description='BLACK CHESS KING' },
+ [0x265B] = { unicodeslot=0x265B, category='so', description='BLACK CHESS QUEEN' },
+ [0x265C] = { unicodeslot=0x265C, category='so', description='BLACK CHESS ROOK' },
+ [0x265D] = { unicodeslot=0x265D, category='so', description='BLACK CHESS BISHOP' },
+ [0x265E] = { unicodeslot=0x265E, category='so', description='BLACK CHESS KNIGHT' },
+ [0x265F] = { unicodeslot=0x265F, category='so', description='BLACK CHESS PAWN' },
+ [0x2660] = { unicodeslot=0x2660, category='so', adobename='spade', description='BLACK SPADE SUIT' },
+ [0x2661] = { unicodeslot=0x2661, category='so', description='WHITE HEART SUIT' },
+ [0x2662] = { unicodeslot=0x2662, category='so', description='WHITE DIAMOND SUIT' },
+ [0x2663] = { unicodeslot=0x2663, category='so', adobename='club', description='BLACK CLUB SUIT' },
+ [0x2664] = { unicodeslot=0x2664, category='so', description='WHITE SPADE SUIT' },
+ [0x2665] = { unicodeslot=0x2665, category='so', adobename='heart', description='BLACK HEART SUIT' },
+ [0x2666] = { unicodeslot=0x2666, category='so', adobename='diamond', description='BLACK DIAMOND SUIT' },
+ [0x2667] = { unicodeslot=0x2667, category='so', description='WHITE CLUB SUIT' },
+ [0x2668] = { unicodeslot=0x2668, category='so', description='HOT SPRINGS' },
+ [0x2669] = { unicodeslot=0x2669, category='so', description='QUARTER NOTE' },
+ [0x266A] = { unicodeslot=0x266A, category='so', adobename='musicalnote', description='EIGHTH NOTE' },
+ [0x266B] = { unicodeslot=0x266B, category='so', adobename='musicalnotedbl', description='BEAMED EIGHTH NOTES' },
+ [0x266C] = { unicodeslot=0x266C, category='so', description='BEAMED SIXTEENTH NOTES' },
+ [0x266D] = { unicodeslot=0x266D, category='so', description='MUSIC FLAT SIGN' },
+ [0x266E] = { unicodeslot=0x266E, category='so', description='MUSIC NATURAL SIGN' },
+ [0x266F] = { unicodeslot=0x266F, category='sm', description='MUSIC SHARP SIGN' },
+ [0x2670] = { unicodeslot=0x2670, category='so', description='WEST SYRIAC CROSS' },
+ [0x2671] = { unicodeslot=0x2671, category='so', description='EAST SYRIAC CROSS' },
+ [0x2672] = { unicodeslot=0x2672, category='so', description='UNIVERSAL RECYCLING SYMBOL' },
+ [0x2673] = { unicodeslot=0x2673, category='so', description='RECYCLING SYMBOL FOR TYPE-1 PLASTICS' },
+ [0x2674] = { unicodeslot=0x2674, category='so', description='RECYCLING SYMBOL FOR TYPE-2 PLASTICS' },
+ [0x2675] = { unicodeslot=0x2675, category='so', description='RECYCLING SYMBOL FOR TYPE-3 PLASTICS' },
+ [0x2676] = { unicodeslot=0x2676, category='so', description='RECYCLING SYMBOL FOR TYPE-4 PLASTICS' },
+ [0x2677] = { unicodeslot=0x2677, category='so', description='RECYCLING SYMBOL FOR TYPE-5 PLASTICS' },
+ [0x2678] = { unicodeslot=0x2678, category='so', description='RECYCLING SYMBOL FOR TYPE-6 PLASTICS' },
+ [0x2679] = { unicodeslot=0x2679, category='so', description='RECYCLING SYMBOL FOR TYPE-7 PLASTICS' },
+ [0x267A] = { unicodeslot=0x267A, category='so', description='RECYCLING SYMBOL FOR GENERIC MATERIALS' },
+ [0x267B] = { unicodeslot=0x267B, category='so', description='BLACK UNIVERSAL RECYCLING SYMBOL' },
+ [0x267C] = { unicodeslot=0x267C, category='so', description='RECYCLED PAPER SYMBOL' },
+ [0x267D] = { unicodeslot=0x267D, category='so', description='PARTIALLY-RECYCLED PAPER SYMBOL' },
+ [0x267E] = { unicodeslot=0x267E, category='so', description='PERMANENT PAPER SIGN' },
+ [0x267F] = { unicodeslot=0x267F, category='so', description='WHEELCHAIR SYMBOL' },
+ [0x2680] = { unicodeslot=0x2680, category='so', description='DIE FACE-1' },
+ [0x2681] = { unicodeslot=0x2681, category='so', description='DIE FACE-2' },
+ [0x2682] = { unicodeslot=0x2682, category='so', description='DIE FACE-3' },
+ [0x2683] = { unicodeslot=0x2683, category='so', description='DIE FACE-4' },
+ [0x2684] = { unicodeslot=0x2684, category='so', description='DIE FACE-5' },
+ [0x2685] = { unicodeslot=0x2685, category='so', description='DIE FACE-6' },
+ [0x2686] = { unicodeslot=0x2686, category='so', description='WHITE CIRCLE WITH DOT RIGHT' },
+ [0x2687] = { unicodeslot=0x2687, category='so', description='WHITE CIRCLE WITH TWO DOTS' },
+ [0x2688] = { unicodeslot=0x2688, category='so', description='BLACK CIRCLE WITH WHITE DOT RIGHT' },
+ [0x2689] = { unicodeslot=0x2689, category='so', description='BLACK CIRCLE WITH TWO WHITE DOTS' },
+ [0x268A] = { unicodeslot=0x268A, category='so', description='MONOGRAM FOR YANG' },
+ [0x268B] = { unicodeslot=0x268B, category='so', description='MONOGRAM FOR YIN' },
+ [0x268C] = { unicodeslot=0x268C, category='so', description='DIGRAM FOR GREATER YANG' },
+ [0x268D] = { unicodeslot=0x268D, category='so', description='DIGRAM FOR LESSER YIN' },
+ [0x268E] = { unicodeslot=0x268E, category='so', description='DIGRAM FOR LESSER YANG' },
+ [0x268F] = { unicodeslot=0x268F, category='so', description='DIGRAM FOR GREATER YIN' },
+ [0x2690] = { unicodeslot=0x2690, category='so', description='WHITE FLAG' },
+ [0x2691] = { unicodeslot=0x2691, category='so', description='BLACK FLAG' },
+ [0x2692] = { unicodeslot=0x2692, category='so', description='HAMMER AND PICK' },
+ [0x2693] = { unicodeslot=0x2693, category='so', description='ANCHOR' },
+ [0x2694] = { unicodeslot=0x2694, category='so', description='CROSSED SWORDS' },
+ [0x2695] = { unicodeslot=0x2695, category='so', description='STAFF OF AESCULAPIUS' },
+ [0x2696] = { unicodeslot=0x2696, category='so', description='SCALES' },
+ [0x2697] = { unicodeslot=0x2697, category='so', description='ALEMBIC' },
+ [0x2698] = { unicodeslot=0x2698, category='so', description='FLOWER' },
+ [0x2699] = { unicodeslot=0x2699, category='so', description='GEAR' },
+ [0x269A] = { unicodeslot=0x269A, category='so', description='STAFF OF HERMES' },
+ [0x269B] = { unicodeslot=0x269B, category='so', description='ATOM SYMBOL' },
+ [0x269C] = { unicodeslot=0x269C, category='so', description='FLEUR-DE-LIS' },
+ [0x26A0] = { unicodeslot=0x26A0, category='so', description='WARNING SIGN' },
+ [0x26A1] = { unicodeslot=0x26A1, category='so', description='HIGH VOLTAGE SIGN' },
+ [0x26A2] = { unicodeslot=0x26A2, category='so', description='DOUBLED FEMALE SIGN' },
+ [0x26A3] = { unicodeslot=0x26A3, category='so', description='DOUBLED MALE SIGN' },
+ [0x26A4] = { unicodeslot=0x26A4, category='so', description='INTERLOCKED FEMALE AND MALE SIGN' },
+ [0x26A5] = { unicodeslot=0x26A5, category='so', description='MALE AND FEMALE SIGN' },
+ [0x26A6] = { unicodeslot=0x26A6, category='so', description='MALE WITH STROKE SIGN' },
+ [0x26A7] = { unicodeslot=0x26A7, category='so', description='MALE WITH STROKE AND MALE AND FEMALE SIGN' },
+ [0x26A8] = { unicodeslot=0x26A8, category='so', description='VERTICAL MALE WITH STROKE SIGN' },
+ [0x26A9] = { unicodeslot=0x26A9, category='so', description='HORIZONTAL MALE WITH STROKE SIGN' },
+ [0x26AA] = { unicodeslot=0x26AA, category='so', description='MEDIUM WHITE CIRCLE' },
+ [0x26AB] = { unicodeslot=0x26AB, category='so', description='MEDIUM BLACK CIRCLE' },
+ [0x26AC] = { unicodeslot=0x26AC, category='so', description='MEDIUM SMALL WHITE CIRCLE' },
+ [0x26AD] = { unicodeslot=0x26AD, category='so', description='MARRIAGE SYMBOL' },
+ [0x26AE] = { unicodeslot=0x26AE, category='so', description='DIVORCE SYMBOL' },
+ [0x26AF] = { unicodeslot=0x26AF, category='so', description='UNMARRIED PARTNERSHIP SYMBOL' },
+ [0x26B0] = { unicodeslot=0x26B0, category='so', description='COFFIN' },
+ [0x26B1] = { unicodeslot=0x26B1, category='so', description='FUNERAL URN' },
+ [0x26B2] = { unicodeslot=0x26B2, category='so', description='NEUTER' },
+ [0x2701] = { unicodeslot=0x2701, category='so', description='UPPER BLADE SCISSORS' },
+ [0x2702] = { unicodeslot=0x2702, category='so', description='BLACK SCISSORS' },
+ [0x2703] = { unicodeslot=0x2703, category='so', description='LOWER BLADE SCISSORS' },
+ [0x2704] = { unicodeslot=0x2704, category='so', description='WHITE SCISSORS' },
+ [0x2706] = { unicodeslot=0x2706, category='so', description='TELEPHONE LOCATION SIGN' },
+ [0x2707] = { unicodeslot=0x2707, category='so', description='TAPE DRIVE' },
+ [0x2708] = { unicodeslot=0x2708, category='so', description='AIRPLANE' },
+ [0x2709] = { unicodeslot=0x2709, category='so', description='ENVELOPE' },
+ [0x270C] = { unicodeslot=0x270C, category='so', description='VICTORY HAND' },
+ [0x270D] = { unicodeslot=0x270D, category='so', description='WRITING HAND' },
+ [0x270E] = { unicodeslot=0x270E, category='so', description='LOWER RIGHT PENCIL' },
+ [0x270F] = { unicodeslot=0x270F, category='so', description='PENCIL' },
+ [0x2710] = { unicodeslot=0x2710, category='so', description='UPPER RIGHT PENCIL' },
+ [0x2711] = { unicodeslot=0x2711, category='so', description='WHITE NIB' },
+ [0x2712] = { unicodeslot=0x2712, category='so', description='BLACK NIB' },
+ [0x2713] = { unicodeslot=0x2713, category='so', description='CHECK MARK' },
+ [0x2714] = { unicodeslot=0x2714, category='so', description='HEAVY CHECK MARK' },
+ [0x2715] = { unicodeslot=0x2715, category='so', description='MULTIPLICATION X' },
+ [0x2716] = { unicodeslot=0x2716, category='so', description='HEAVY MULTIPLICATION X' },
+ [0x2717] = { unicodeslot=0x2717, category='so', description='BALLOT X' },
+ [0x2718] = { unicodeslot=0x2718, category='so', description='HEAVY BALLOT X' },
+ [0x2719] = { unicodeslot=0x2719, category='so', description='OUTLINED GREEK CROSS' },
+ [0x271A] = { unicodeslot=0x271A, category='so', description='HEAVY GREEK CROSS' },
+ [0x271B] = { unicodeslot=0x271B, category='so', description='OPEN CENTRE CROSS' },
+ [0x271C] = { unicodeslot=0x271C, category='so', description='HEAVY OPEN CENTRE CROSS' },
+ [0x271D] = { unicodeslot=0x271D, category='so', description='LATIN CROSS' },
+ [0x271E] = { unicodeslot=0x271E, category='so', description='SHADOWED WHITE LATIN CROSS' },
+ [0x271F] = { unicodeslot=0x271F, category='so', description='OUTLINED LATIN CROSS' },
+ [0x2720] = { unicodeslot=0x2720, category='so', description='MALTESE CROSS' },
+ [0x2721] = { unicodeslot=0x2721, category='so', description='STAR OF DAVID' },
+ [0x2722] = { unicodeslot=0x2722, category='so', description='FOUR TEARDROP-SPOKED ASTERISK' },
+ [0x2723] = { unicodeslot=0x2723, category='so', description='FOUR BALLOON-SPOKED ASTERISK' },
+ [0x2724] = { unicodeslot=0x2724, category='so', description='HEAVY FOUR BALLOON-SPOKED ASTERISK' },
+ [0x2725] = { unicodeslot=0x2725, category='so', description='FOUR CLUB-SPOKED ASTERISK' },
+ [0x2726] = { unicodeslot=0x2726, category='so', description='BLACK FOUR POINTED STAR' },
+ [0x2727] = { unicodeslot=0x2727, category='so', description='WHITE FOUR POINTED STAR' },
+ [0x2729] = { unicodeslot=0x2729, category='so', description='STRESS OUTLINED WHITE STAR' },
+ [0x272A] = { unicodeslot=0x272A, category='so', description='CIRCLED WHITE STAR' },
+ [0x272B] = { unicodeslot=0x272B, category='so', description='OPEN CENTRE BLACK STAR' },
+ [0x272C] = { unicodeslot=0x272C, category='so', description='BLACK CENTRE WHITE STAR' },
+ [0x272D] = { unicodeslot=0x272D, category='so', description='OUTLINED BLACK STAR' },
+ [0x272E] = { unicodeslot=0x272E, category='so', description='HEAVY OUTLINED BLACK STAR' },
+ [0x272F] = { unicodeslot=0x272F, category='so', description='PINWHEEL STAR' },
+ [0x2730] = { unicodeslot=0x2730, category='so', description='SHADOWED WHITE STAR' },
+ [0x2731] = { unicodeslot=0x2731, category='so', description='HEAVY ASTERISK' },
+ [0x2732] = { unicodeslot=0x2732, category='so', description='OPEN CENTRE ASTERISK' },
+ [0x2733] = { unicodeslot=0x2733, category='so', description='EIGHT SPOKED ASTERISK' },
+ [0x2734] = { unicodeslot=0x2734, category='so', description='EIGHT POINTED BLACK STAR' },
+ [0x2735] = { unicodeslot=0x2735, category='so', description='EIGHT POINTED PINWHEEL STAR' },
+ [0x2736] = { unicodeslot=0x2736, category='so', description='SIX POINTED BLACK STAR' },
+ [0x2737] = { unicodeslot=0x2737, category='so', description='EIGHT POINTED RECTILINEAR BLACK STAR' },
+ [0x2738] = { unicodeslot=0x2738, category='so', description='HEAVY EIGHT POINTED RECTILINEAR BLACK STAR' },
+ [0x2739] = { unicodeslot=0x2739, category='so', description='TWELVE POINTED BLACK STAR' },
+ [0x273A] = { unicodeslot=0x273A, category='so', description='SIXTEEN POINTED ASTERISK' },
+ [0x273B] = { unicodeslot=0x273B, category='so', description='TEARDROP-SPOKED ASTERISK' },
+ [0x273C] = { unicodeslot=0x273C, category='so', description='OPEN CENTRE TEARDROP-SPOKED ASTERISK' },
+ [0x273D] = { unicodeslot=0x273D, category='so', description='HEAVY TEARDROP-SPOKED ASTERISK' },
+ [0x273E] = { unicodeslot=0x273E, category='so', description='SIX PETALLED BLACK AND WHITE FLORETTE' },
+ [0x273F] = { unicodeslot=0x273F, category='so', description='BLACK FLORETTE' },
+ [0x2740] = { unicodeslot=0x2740, category='so', description='WHITE FLORETTE' },
+ [0x2741] = { unicodeslot=0x2741, category='so', description='EIGHT PETALLED OUTLINED BLACK FLORETTE' },
+ [0x2742] = { unicodeslot=0x2742, category='so', description='CIRCLED OPEN CENTRE EIGHT POINTED STAR' },
+ [0x2743] = { unicodeslot=0x2743, category='so', description='HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK' },
+ [0x2744] = { unicodeslot=0x2744, category='so', description='SNOWFLAKE' },
+ [0x2745] = { unicodeslot=0x2745, category='so', description='TIGHT TRIFOLIATE SNOWFLAKE' },
+ [0x2746] = { unicodeslot=0x2746, category='so', description='HEAVY CHEVRON SNOWFLAKE' },
+ [0x2747] = { unicodeslot=0x2747, category='so', description='SPARKLE' },
+ [0x2748] = { unicodeslot=0x2748, category='so', description='HEAVY SPARKLE' },
+ [0x2749] = { unicodeslot=0x2749, category='so', description='BALLOON-SPOKED ASTERISK' },
+ [0x274A] = { unicodeslot=0x274A, category='so', description='EIGHT TEARDROP-SPOKED PROPELLER ASTERISK' },
+ [0x274B] = { unicodeslot=0x274B, category='so', description='HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK' },
+ [0x274D] = { unicodeslot=0x274D, category='so', description='SHADOWED WHITE CIRCLE' },
+ [0x274F] = { unicodeslot=0x274F, category='so', description='LOWER RIGHT DROP-SHADOWED WHITE SQUARE' },
+ [0x2750] = { unicodeslot=0x2750, category='so', description='UPPER RIGHT DROP-SHADOWED WHITE SQUARE' },
+ [0x2751] = { unicodeslot=0x2751, category='so', description='LOWER RIGHT SHADOWED WHITE SQUARE' },
+ [0x2752] = { unicodeslot=0x2752, category='so', description='UPPER RIGHT SHADOWED WHITE SQUARE' },
+ [0x2756] = { unicodeslot=0x2756, category='so', description='BLACK DIAMOND MINUS WHITE X' },
+ [0x2758] = { unicodeslot=0x2758, category='so', description='LIGHT VERTICAL BAR' },
+ [0x2759] = { unicodeslot=0x2759, category='so', description='MEDIUM VERTICAL BAR' },
+ [0x275A] = { unicodeslot=0x275A, category='so', description='HEAVY VERTICAL BAR' },
+ [0x275B] = { unicodeslot=0x275B, category='so', description='HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT' },
+ [0x275C] = { unicodeslot=0x275C, category='so', description='HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT' },
+ [0x275D] = { unicodeslot=0x275D, category='so', description='HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT' },
+ [0x275E] = { unicodeslot=0x275E, category='so', description='HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT' },
+ [0x2761] = { unicodeslot=0x2761, category='so', description='CURVED STEM PARAGRAPH SIGN ORNAMENT' },
+ [0x2762] = { unicodeslot=0x2762, category='so', description='HEAVY EXCLAMATION MARK ORNAMENT' },
+ [0x2763] = { unicodeslot=0x2763, category='so', description='HEAVY HEART EXCLAMATION MARK ORNAMENT' },
+ [0x2764] = { unicodeslot=0x2764, category='so', description='HEAVY BLACK HEART' },
+ [0x2765] = { unicodeslot=0x2765, category='so', description='ROTATED HEAVY BLACK HEART BULLET' },
+ [0x2766] = { unicodeslot=0x2766, category='so', description='FLORAL HEART' },
+ [0x2767] = { unicodeslot=0x2767, category='so', description='ROTATED FLORAL HEART BULLET' },
+ [0x2768] = { unicodeslot=0x2768, category='ps', description='MEDIUM LEFT PARENTHESIS ORNAMENT' },
+ [0x2769] = { unicodeslot=0x2769, category='pe', description='MEDIUM RIGHT PARENTHESIS ORNAMENT' },
+ [0x276A] = { unicodeslot=0x276A, category='ps', description='MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT' },
+ [0x276B] = { unicodeslot=0x276B, category='pe', description='MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT' },
+ [0x276C] = { unicodeslot=0x276C, category='ps', description='MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT' },
+ [0x276D] = { unicodeslot=0x276D, category='pe', description='MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT' },
+ [0x276E] = { unicodeslot=0x276E, category='ps', description='HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT' },
+ [0x276F] = { unicodeslot=0x276F, category='pe', description='HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT' },
+ [0x2770] = { unicodeslot=0x2770, category='ps', description='HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT' },
+ [0x2771] = { unicodeslot=0x2771, category='pe', description='HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT' },
+ [0x2772] = { unicodeslot=0x2772, category='ps', description='LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT' },
+ [0x2773] = { unicodeslot=0x2773, category='pe', description='LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT' },
+ [0x2774] = { unicodeslot=0x2774, category='ps', description='MEDIUM LEFT CURLY BRACKET ORNAMENT' },
+ [0x2775] = { unicodeslot=0x2775, category='pe', description='MEDIUM RIGHT CURLY BRACKET ORNAMENT' },
+ [0x2776] = { unicodeslot=0x2776, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT ONE' },
+ [0x2777] = { unicodeslot=0x2777, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT TWO' },
+ [0x2778] = { unicodeslot=0x2778, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT THREE' },
+ [0x2779] = { unicodeslot=0x2779, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT FOUR' },
+ [0x277A] = { unicodeslot=0x277A, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT FIVE' },
+ [0x277B] = { unicodeslot=0x277B, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT SIX' },
+ [0x277C] = { unicodeslot=0x277C, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT SEVEN' },
+ [0x277D] = { unicodeslot=0x277D, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT EIGHT' },
+ [0x277E] = { unicodeslot=0x277E, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT NINE' },
+ [0x277F] = { unicodeslot=0x277F, category='no', description='DINGBAT NEGATIVE CIRCLED NUMBER TEN' },
+ [0x2780] = { unicodeslot=0x2780, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT ONE' },
+ [0x2781] = { unicodeslot=0x2781, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT TWO' },
+ [0x2782] = { unicodeslot=0x2782, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT THREE' },
+ [0x2783] = { unicodeslot=0x2783, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT FOUR' },
+ [0x2784] = { unicodeslot=0x2784, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT FIVE' },
+ [0x2785] = { unicodeslot=0x2785, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT SIX' },
+ [0x2786] = { unicodeslot=0x2786, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN' },
+ [0x2787] = { unicodeslot=0x2787, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT' },
+ [0x2788] = { unicodeslot=0x2788, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT NINE' },
+ [0x2789] = { unicodeslot=0x2789, category='no', description='DINGBAT CIRCLED SANS-SERIF NUMBER TEN' },
+ [0x278A] = { unicodeslot=0x278A, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE' },
+ [0x278B] = { unicodeslot=0x278B, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO' },
+ [0x278C] = { unicodeslot=0x278C, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE' },
+ [0x278D] = { unicodeslot=0x278D, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR' },
+ [0x278E] = { unicodeslot=0x278E, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE' },
+ [0x278F] = { unicodeslot=0x278F, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX' },
+ [0x2790] = { unicodeslot=0x2790, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN' },
+ [0x2791] = { unicodeslot=0x2791, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT' },
+ [0x2792] = { unicodeslot=0x2792, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE' },
+ [0x2793] = { unicodeslot=0x2793, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN' },
+ [0x2794] = { unicodeslot=0x2794, category='so', description='HEAVY WIDE-HEADED RIGHTWARDS ARROW' },
+ [0x2798] = { unicodeslot=0x2798, category='so', description='HEAVY SOUTH EAST ARROW' },
+ [0x2799] = { unicodeslot=0x2799, category='so', description='HEAVY RIGHTWARDS ARROW' },
+ [0x279A] = { unicodeslot=0x279A, category='so', description='HEAVY NORTH EAST ARROW' },
+ [0x279B] = { unicodeslot=0x279B, category='so', description='DRAFTING POINT RIGHTWARDS ARROW' },
+ [0x279C] = { unicodeslot=0x279C, category='so', description='HEAVY ROUND-TIPPED RIGHTWARDS ARROW' },
+ [0x279D] = { unicodeslot=0x279D, category='so', description='TRIANGLE-HEADED RIGHTWARDS ARROW' },
+ [0x279E] = { unicodeslot=0x279E, category='so', description='HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW' },
+ [0x279F] = { unicodeslot=0x279F, category='so', description='DASHED TRIANGLE-HEADED RIGHTWARDS ARROW' },
+ [0x27A0] = { unicodeslot=0x27A0, category='so', description='HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW' },
+ [0x27A1] = { unicodeslot=0x27A1, category='so', description='BLACK RIGHTWARDS ARROW' },
+ [0x27A2] = { unicodeslot=0x27A2, category='so', description='THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD' },
+ [0x27A3] = { unicodeslot=0x27A3, category='so', description='THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD' },
+ [0x27A4] = { unicodeslot=0x27A4, category='so', description='BLACK RIGHTWARDS ARROWHEAD' },
+ [0x27A5] = { unicodeslot=0x27A5, category='so', description='HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW' },
+ [0x27A6] = { unicodeslot=0x27A6, category='so', description='HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW' },
+ [0x27A7] = { unicodeslot=0x27A7, category='so', description='SQUAT BLACK RIGHTWARDS ARROW' },
+ [0x27A8] = { unicodeslot=0x27A8, category='so', description='HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW' },
+ [0x27A9] = { unicodeslot=0x27A9, category='so', description='RIGHT-SHADED WHITE RIGHTWARDS ARROW' },
+ [0x27AA] = { unicodeslot=0x27AA, category='so', description='LEFT-SHADED WHITE RIGHTWARDS ARROW' },
+ [0x27AB] = { unicodeslot=0x27AB, category='so', description='BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW' },
+ [0x27AC] = { unicodeslot=0x27AC, category='so', description='FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW' },
+ [0x27AD] = { unicodeslot=0x27AD, category='so', description='HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' },
+ [0x27AE] = { unicodeslot=0x27AE, category='so', description='HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' },
+ [0x27AF] = { unicodeslot=0x27AF, category='so', description='NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' },
+ [0x27B1] = { unicodeslot=0x27B1, category='so', description='NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' },
+ [0x27B2] = { unicodeslot=0x27B2, category='so', description='CIRCLED HEAVY WHITE RIGHTWARDS ARROW' },
+ [0x27B3] = { unicodeslot=0x27B3, category='so', description='WHITE-FEATHERED RIGHTWARDS ARROW' },
+ [0x27B4] = { unicodeslot=0x27B4, category='so', description='BLACK-FEATHERED SOUTH EAST ARROW' },
+ [0x27B5] = { unicodeslot=0x27B5, category='so', description='BLACK-FEATHERED RIGHTWARDS ARROW' },
+ [0x27B6] = { unicodeslot=0x27B6, category='so', description='BLACK-FEATHERED NORTH EAST ARROW' },
+ [0x27B7] = { unicodeslot=0x27B7, category='so', description='HEAVY BLACK-FEATHERED SOUTH EAST ARROW' },
+ [0x27B8] = { unicodeslot=0x27B8, category='so', description='HEAVY BLACK-FEATHERED RIGHTWARDS ARROW' },
+ [0x27B9] = { unicodeslot=0x27B9, category='so', description='HEAVY BLACK-FEATHERED NORTH EAST ARROW' },
+ [0x27BA] = { unicodeslot=0x27BA, category='so', description='TEARDROP-BARBED RIGHTWARDS ARROW' },
+ [0x27BB] = { unicodeslot=0x27BB, category='so', description='HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW' },
+ [0x27BC] = { unicodeslot=0x27BC, category='so', description='WEDGE-TAILED RIGHTWARDS ARROW' },
+ [0x27BD] = { unicodeslot=0x27BD, category='so', description='HEAVY WEDGE-TAILED RIGHTWARDS ARROW' },
+ [0x27BE] = { unicodeslot=0x27BE, category='so', description='OPEN-OUTLINED RIGHTWARDS ARROW' },
+ [0x27C0] = { unicodeslot=0x27C0, category='sm', description='THREE DIMENSIONAL ANGLE' },
+ [0x27C1] = { unicodeslot=0x27C1, category='sm', description='WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE' },
+ [0x27C2] = { unicodeslot=0x27C2, category='sm', description='PERPENDICULAR' },
+ [0x27C3] = { unicodeslot=0x27C3, category='sm', description='OPEN SUBSET' },
+ [0x27C4] = { unicodeslot=0x27C4, category='sm', description='OPEN SUPERSET' },
+ [0x27C5] = { unicodeslot=0x27C5, category='ps', description='LEFT S-SHAPED BAG DELIMITER' },
+ [0x27C6] = { unicodeslot=0x27C6, category='pe', description='RIGHT S-SHAPED BAG DELIMITER' },
+ [0x27C7] = { unicodeslot=0x27C7, category='sm', description='OR WITH DOT INSIDE' },
+ [0x27C8] = { unicodeslot=0x27C8, category='sm', description='REVERSE SOLIDUS PRECEDING SUBSET' },
+ [0x27C9] = { unicodeslot=0x27C9, category='sm', description='SUPERSET PRECEDING SOLIDUS' },
+ [0x27CA] = { unicodeslot=0x27CA, category='sm', description='VERTICAL BAR WITH HORIZONTAL STROKE' },
+ [0x27D0] = { unicodeslot=0x27D0, category='sm', description='WHITE DIAMOND WITH CENTRED DOT' },
+ [0x27D1] = { unicodeslot=0x27D1, category='sm', description='AND WITH DOT' },
+ [0x27D2] = { unicodeslot=0x27D2, category='sm', description='ELEMENT OF OPENING UPWARDS' },
+ [0x27D3] = { unicodeslot=0x27D3, category='sm', description='LOWER RIGHT CORNER WITH DOT' },
+ [0x27D4] = { unicodeslot=0x27D4, category='sm', description='UPPER LEFT CORNER WITH DOT' },
+ [0x27D5] = { unicodeslot=0x27D5, category='sm', description='LEFT OUTER JOIN' },
+ [0x27D6] = { unicodeslot=0x27D6, category='sm', description='RIGHT OUTER JOIN' },
+ [0x27D7] = { unicodeslot=0x27D7, category='sm', description='FULL OUTER JOIN' },
+ [0x27D8] = { unicodeslot=0x27D8, category='sm', description='LARGE UP TACK' },
+ [0x27D9] = { unicodeslot=0x27D9, category='sm', description='LARGE DOWN TACK' },
+ [0x27DA] = { unicodeslot=0x27DA, category='sm', description='LEFT AND RIGHT DOUBLE TURNSTILE' },
+ [0x27DB] = { unicodeslot=0x27DB, category='sm', description='LEFT AND RIGHT TACK' },
+ [0x27DC] = { unicodeslot=0x27DC, category='sm', description='LEFT MULTIMAP' },
+ [0x27DD] = { unicodeslot=0x27DD, category='sm', description='LONG RIGHT TACK' },
+ [0x27DE] = { unicodeslot=0x27DE, category='sm', description='LONG LEFT TACK' },
+ [0x27DF] = { unicodeslot=0x27DF, category='sm', description='UP TACK WITH CIRCLE ABOVE' },
+ [0x27E0] = { unicodeslot=0x27E0, category='sm', description='LOZENGE DIVIDED BY HORIZONTAL RULE' },
+ [0x27E1] = { unicodeslot=0x27E1, category='sm', description='WHITE CONCAVE-SIDED DIAMOND' },
+ [0x27E2] = { unicodeslot=0x27E2, category='sm', description='WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK' },
+ [0x27E3] = { unicodeslot=0x27E3, category='sm', description='WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK' },
+ [0x27E4] = { unicodeslot=0x27E4, category='sm', description='WHITE SQUARE WITH LEFTWARDS TICK' },
+ [0x27E5] = { unicodeslot=0x27E5, category='sm', description='WHITE SQUARE WITH RIGHTWARDS TICK' },
+ [0x27E6] = { unicodeslot=0x27E6, category='ps', description='MATHEMATICAL LEFT WHITE SQUARE BRACKET' },
+ [0x27E7] = { unicodeslot=0x27E7, category='pe', description='MATHEMATICAL RIGHT WHITE SQUARE BRACKET' },
+ [0x27E8] = { unicodeslot=0x27E8, category='ps', description='MATHEMATICAL LEFT ANGLE BRACKET' },
+ [0x27E9] = { unicodeslot=0x27E9, category='pe', description='MATHEMATICAL RIGHT ANGLE BRACKET' },
+ [0x27EA] = { unicodeslot=0x27EA, category='ps', description='MATHEMATICAL LEFT DOUBLE ANGLE BRACKET' },
+ [0x27EB] = { unicodeslot=0x27EB, category='pe', description='MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET' },
+ [0x27F0] = { unicodeslot=0x27F0, category='sm', description='UPWARDS QUADRUPLE ARROW' },
+ [0x27F1] = { unicodeslot=0x27F1, category='sm', description='DOWNWARDS QUADRUPLE ARROW' },
+ [0x27F2] = { unicodeslot=0x27F2, category='sm', description='ANTICLOCKWISE GAPPED CIRCLE ARROW' },
+ [0x27F3] = { unicodeslot=0x27F3, category='sm', description='CLOCKWISE GAPPED CIRCLE ARROW' },
+ [0x27F4] = { unicodeslot=0x27F4, category='sm', description='RIGHT ARROW WITH CIRCLED PLUS' },
+ [0x27F5] = { unicodeslot=0x27F5, category='sm', description='LONG LEFTWARDS ARROW' },
+ [0x27F6] = { unicodeslot=0x27F6, category='sm', description='LONG RIGHTWARDS ARROW' },
+ [0x27F7] = { unicodeslot=0x27F7, category='sm', description='LONG LEFT RIGHT ARROW' },
+ [0x27F8] = { unicodeslot=0x27F8, category='sm', description='LONG LEFTWARDS DOUBLE ARROW' },
+ [0x27F9] = { unicodeslot=0x27F9, category='sm', description='LONG RIGHTWARDS DOUBLE ARROW' },
+ [0x27FA] = { unicodeslot=0x27FA, category='sm', description='LONG LEFT RIGHT DOUBLE ARROW' },
+ [0x27FB] = { unicodeslot=0x27FB, category='sm', description='LONG LEFTWARDS ARROW FROM BAR' },
+ [0x27FC] = { unicodeslot=0x27FC, category='sm', description='LONG RIGHTWARDS ARROW FROM BAR' },
+ [0x27FD] = { unicodeslot=0x27FD, category='sm', description='LONG LEFTWARDS DOUBLE ARROW FROM BAR' },
+ [0x27FE] = { unicodeslot=0x27FE, category='sm', description='LONG RIGHTWARDS DOUBLE ARROW FROM BAR' },
+ [0x27FF] = { unicodeslot=0x27FF, category='sm', description='LONG RIGHTWARDS SQUIGGLE ARROW' },
+ [0x2800] = { unicodeslot=0x2800, category='so', description='BRAILLE PATTERN BLANK' },
+ [0x2801] = { unicodeslot=0x2801, category='so', description='BRAILLE PATTERN DOTS-1' },
+ [0x2802] = { unicodeslot=0x2802, category='so', description='BRAILLE PATTERN DOTS-2' },
+ [0x2803] = { unicodeslot=0x2803, category='so', description='BRAILLE PATTERN DOTS-12' },
+ [0x2804] = { unicodeslot=0x2804, category='so', description='BRAILLE PATTERN DOTS-3' },
+ [0x2805] = { unicodeslot=0x2805, category='so', description='BRAILLE PATTERN DOTS-13' },
+ [0x2806] = { unicodeslot=0x2806, category='so', description='BRAILLE PATTERN DOTS-23' },
+ [0x2807] = { unicodeslot=0x2807, category='so', description='BRAILLE PATTERN DOTS-123' },
+ [0x2808] = { unicodeslot=0x2808, category='so', description='BRAILLE PATTERN DOTS-4' },
+ [0x2809] = { unicodeslot=0x2809, category='so', description='BRAILLE PATTERN DOTS-14' },
+ [0x280A] = { unicodeslot=0x280A, category='so', description='BRAILLE PATTERN DOTS-24' },
+ [0x280B] = { unicodeslot=0x280B, category='so', description='BRAILLE PATTERN DOTS-124' },
+ [0x280C] = { unicodeslot=0x280C, category='so', description='BRAILLE PATTERN DOTS-34' },
+ [0x280D] = { unicodeslot=0x280D, category='so', description='BRAILLE PATTERN DOTS-134' },
+ [0x280E] = { unicodeslot=0x280E, category='so', description='BRAILLE PATTERN DOTS-234' },
+ [0x280F] = { unicodeslot=0x280F, category='so', description='BRAILLE PATTERN DOTS-1234' },
+ [0x2810] = { unicodeslot=0x2810, category='so', description='BRAILLE PATTERN DOTS-5' },
+ [0x2811] = { unicodeslot=0x2811, category='so', description='BRAILLE PATTERN DOTS-15' },
+ [0x2812] = { unicodeslot=0x2812, category='so', description='BRAILLE PATTERN DOTS-25' },
+ [0x2813] = { unicodeslot=0x2813, category='so', description='BRAILLE PATTERN DOTS-125' },
+ [0x2814] = { unicodeslot=0x2814, category='so', description='BRAILLE PATTERN DOTS-35' },
+ [0x2815] = { unicodeslot=0x2815, category='so', description='BRAILLE PATTERN DOTS-135' },
+ [0x2816] = { unicodeslot=0x2816, category='so', description='BRAILLE PATTERN DOTS-235' },
+ [0x2817] = { unicodeslot=0x2817, category='so', description='BRAILLE PATTERN DOTS-1235' },
+ [0x2818] = { unicodeslot=0x2818, category='so', description='BRAILLE PATTERN DOTS-45' },
+ [0x2819] = { unicodeslot=0x2819, category='so', description='BRAILLE PATTERN DOTS-145' },
+ [0x281A] = { unicodeslot=0x281A, category='so', description='BRAILLE PATTERN DOTS-245' },
+ [0x281B] = { unicodeslot=0x281B, category='so', description='BRAILLE PATTERN DOTS-1245' },
+ [0x281C] = { unicodeslot=0x281C, category='so', description='BRAILLE PATTERN DOTS-345' },
+ [0x281D] = { unicodeslot=0x281D, category='so', description='BRAILLE PATTERN DOTS-1345' },
+ [0x281E] = { unicodeslot=0x281E, category='so', description='BRAILLE PATTERN DOTS-2345' },
+ [0x281F] = { unicodeslot=0x281F, category='so', description='BRAILLE PATTERN DOTS-12345' },
+ [0x2820] = { unicodeslot=0x2820, category='so', description='BRAILLE PATTERN DOTS-6' },
+ [0x2821] = { unicodeslot=0x2821, category='so', description='BRAILLE PATTERN DOTS-16' },
+ [0x2822] = { unicodeslot=0x2822, category='so', description='BRAILLE PATTERN DOTS-26' },
+ [0x2823] = { unicodeslot=0x2823, category='so', description='BRAILLE PATTERN DOTS-126' },
+ [0x2824] = { unicodeslot=0x2824, category='so', description='BRAILLE PATTERN DOTS-36' },
+ [0x2825] = { unicodeslot=0x2825, category='so', description='BRAILLE PATTERN DOTS-136' },
+ [0x2826] = { unicodeslot=0x2826, category='so', description='BRAILLE PATTERN DOTS-236' },
+ [0x2827] = { unicodeslot=0x2827, category='so', description='BRAILLE PATTERN DOTS-1236' },
+ [0x2828] = { unicodeslot=0x2828, category='so', description='BRAILLE PATTERN DOTS-46' },
+ [0x2829] = { unicodeslot=0x2829, category='so', description='BRAILLE PATTERN DOTS-146' },
+ [0x282A] = { unicodeslot=0x282A, category='so', description='BRAILLE PATTERN DOTS-246' },
+ [0x282B] = { unicodeslot=0x282B, category='so', description='BRAILLE PATTERN DOTS-1246' },
+ [0x282C] = { unicodeslot=0x282C, category='so', description='BRAILLE PATTERN DOTS-346' },
+ [0x282D] = { unicodeslot=0x282D, category='so', description='BRAILLE PATTERN DOTS-1346' },
+ [0x282E] = { unicodeslot=0x282E, category='so', description='BRAILLE PATTERN DOTS-2346' },
+ [0x282F] = { unicodeslot=0x282F, category='so', description='BRAILLE PATTERN DOTS-12346' },
+ [0x2830] = { unicodeslot=0x2830, category='so', description='BRAILLE PATTERN DOTS-56' },
+ [0x2831] = { unicodeslot=0x2831, category='so', description='BRAILLE PATTERN DOTS-156' },
+ [0x2832] = { unicodeslot=0x2832, category='so', description='BRAILLE PATTERN DOTS-256' },
+ [0x2833] = { unicodeslot=0x2833, category='so', description='BRAILLE PATTERN DOTS-1256' },
+ [0x2834] = { unicodeslot=0x2834, category='so', description='BRAILLE PATTERN DOTS-356' },
+ [0x2835] = { unicodeslot=0x2835, category='so', description='BRAILLE PATTERN DOTS-1356' },
+ [0x2836] = { unicodeslot=0x2836, category='so', description='BRAILLE PATTERN DOTS-2356' },
+ [0x2837] = { unicodeslot=0x2837, category='so', description='BRAILLE PATTERN DOTS-12356' },
+ [0x2838] = { unicodeslot=0x2838, category='so', description='BRAILLE PATTERN DOTS-456' },
+ [0x2839] = { unicodeslot=0x2839, category='so', description='BRAILLE PATTERN DOTS-1456' },
+ [0x283A] = { unicodeslot=0x283A, category='so', description='BRAILLE PATTERN DOTS-2456' },
+ [0x283B] = { unicodeslot=0x283B, category='so', description='BRAILLE PATTERN DOTS-12456' },
+ [0x283C] = { unicodeslot=0x283C, category='so', description='BRAILLE PATTERN DOTS-3456' },
+ [0x283D] = { unicodeslot=0x283D, category='so', description='BRAILLE PATTERN DOTS-13456' },
+ [0x283E] = { unicodeslot=0x283E, category='so', description='BRAILLE PATTERN DOTS-23456' },
+ [0x283F] = { unicodeslot=0x283F, category='so', description='BRAILLE PATTERN DOTS-123456' },
+ [0x2840] = { unicodeslot=0x2840, category='so', description='BRAILLE PATTERN DOTS-7' },
+ [0x2841] = { unicodeslot=0x2841, category='so', description='BRAILLE PATTERN DOTS-17' },
+ [0x2842] = { unicodeslot=0x2842, category='so', description='BRAILLE PATTERN DOTS-27' },
+ [0x2843] = { unicodeslot=0x2843, category='so', description='BRAILLE PATTERN DOTS-127' },
+ [0x2844] = { unicodeslot=0x2844, category='so', description='BRAILLE PATTERN DOTS-37' },
+ [0x2845] = { unicodeslot=0x2845, category='so', description='BRAILLE PATTERN DOTS-137' },
+ [0x2846] = { unicodeslot=0x2846, category='so', description='BRAILLE PATTERN DOTS-237' },
+ [0x2847] = { unicodeslot=0x2847, category='so', description='BRAILLE PATTERN DOTS-1237' },
+ [0x2848] = { unicodeslot=0x2848, category='so', description='BRAILLE PATTERN DOTS-47' },
+ [0x2849] = { unicodeslot=0x2849, category='so', description='BRAILLE PATTERN DOTS-147' },
+ [0x284A] = { unicodeslot=0x284A, category='so', description='BRAILLE PATTERN DOTS-247' },
+ [0x284B] = { unicodeslot=0x284B, category='so', description='BRAILLE PATTERN DOTS-1247' },
+ [0x284C] = { unicodeslot=0x284C, category='so', description='BRAILLE PATTERN DOTS-347' },
+ [0x284D] = { unicodeslot=0x284D, category='so', description='BRAILLE PATTERN DOTS-1347' },
+ [0x284E] = { unicodeslot=0x284E, category='so', description='BRAILLE PATTERN DOTS-2347' },
+ [0x284F] = { unicodeslot=0x284F, category='so', description='BRAILLE PATTERN DOTS-12347' },
+ [0x2850] = { unicodeslot=0x2850, category='so', description='BRAILLE PATTERN DOTS-57' },
+ [0x2851] = { unicodeslot=0x2851, category='so', description='BRAILLE PATTERN DOTS-157' },
+ [0x2852] = { unicodeslot=0x2852, category='so', description='BRAILLE PATTERN DOTS-257' },
+ [0x2853] = { unicodeslot=0x2853, category='so', description='BRAILLE PATTERN DOTS-1257' },
+ [0x2854] = { unicodeslot=0x2854, category='so', description='BRAILLE PATTERN DOTS-357' },
+ [0x2855] = { unicodeslot=0x2855, category='so', description='BRAILLE PATTERN DOTS-1357' },
+ [0x2856] = { unicodeslot=0x2856, category='so', description='BRAILLE PATTERN DOTS-2357' },
+ [0x2857] = { unicodeslot=0x2857, category='so', description='BRAILLE PATTERN DOTS-12357' },
+ [0x2858] = { unicodeslot=0x2858, category='so', description='BRAILLE PATTERN DOTS-457' },
+ [0x2859] = { unicodeslot=0x2859, category='so', description='BRAILLE PATTERN DOTS-1457' },
+ [0x285A] = { unicodeslot=0x285A, category='so', description='BRAILLE PATTERN DOTS-2457' },
+ [0x285B] = { unicodeslot=0x285B, category='so', description='BRAILLE PATTERN DOTS-12457' },
+ [0x285C] = { unicodeslot=0x285C, category='so', description='BRAILLE PATTERN DOTS-3457' },
+ [0x285D] = { unicodeslot=0x285D, category='so', description='BRAILLE PATTERN DOTS-13457' },
+ [0x285E] = { unicodeslot=0x285E, category='so', description='BRAILLE PATTERN DOTS-23457' },
+ [0x285F] = { unicodeslot=0x285F, category='so', description='BRAILLE PATTERN DOTS-123457' },
+ [0x2860] = { unicodeslot=0x2860, category='so', description='BRAILLE PATTERN DOTS-67' },
+ [0x2861] = { unicodeslot=0x2861, category='so', description='BRAILLE PATTERN DOTS-167' },
+ [0x2862] = { unicodeslot=0x2862, category='so', description='BRAILLE PATTERN DOTS-267' },
+ [0x2863] = { unicodeslot=0x2863, category='so', description='BRAILLE PATTERN DOTS-1267' },
+ [0x2864] = { unicodeslot=0x2864, category='so', description='BRAILLE PATTERN DOTS-367' },
+ [0x2865] = { unicodeslot=0x2865, category='so', description='BRAILLE PATTERN DOTS-1367' },
+ [0x2866] = { unicodeslot=0x2866, category='so', description='BRAILLE PATTERN DOTS-2367' },
+ [0x2867] = { unicodeslot=0x2867, category='so', description='BRAILLE PATTERN DOTS-12367' },
+ [0x2868] = { unicodeslot=0x2868, category='so', description='BRAILLE PATTERN DOTS-467' },
+ [0x2869] = { unicodeslot=0x2869, category='so', description='BRAILLE PATTERN DOTS-1467' },
+ [0x286A] = { unicodeslot=0x286A, category='so', description='BRAILLE PATTERN DOTS-2467' },
+ [0x286B] = { unicodeslot=0x286B, category='so', description='BRAILLE PATTERN DOTS-12467' },
+ [0x286C] = { unicodeslot=0x286C, category='so', description='BRAILLE PATTERN DOTS-3467' },
+ [0x286D] = { unicodeslot=0x286D, category='so', description='BRAILLE PATTERN DOTS-13467' },
+ [0x286E] = { unicodeslot=0x286E, category='so', description='BRAILLE PATTERN DOTS-23467' },
+ [0x286F] = { unicodeslot=0x286F, category='so', description='BRAILLE PATTERN DOTS-123467' },
+ [0x2870] = { unicodeslot=0x2870, category='so', description='BRAILLE PATTERN DOTS-567' },
+ [0x2871] = { unicodeslot=0x2871, category='so', description='BRAILLE PATTERN DOTS-1567' },
+ [0x2872] = { unicodeslot=0x2872, category='so', description='BRAILLE PATTERN DOTS-2567' },
+ [0x2873] = { unicodeslot=0x2873, category='so', description='BRAILLE PATTERN DOTS-12567' },
+ [0x2874] = { unicodeslot=0x2874, category='so', description='BRAILLE PATTERN DOTS-3567' },
+ [0x2875] = { unicodeslot=0x2875, category='so', description='BRAILLE PATTERN DOTS-13567' },
+ [0x2876] = { unicodeslot=0x2876, category='so', description='BRAILLE PATTERN DOTS-23567' },
+ [0x2877] = { unicodeslot=0x2877, category='so', description='BRAILLE PATTERN DOTS-123567' },
+ [0x2878] = { unicodeslot=0x2878, category='so', description='BRAILLE PATTERN DOTS-4567' },
+ [0x2879] = { unicodeslot=0x2879, category='so', description='BRAILLE PATTERN DOTS-14567' },
+ [0x287A] = { unicodeslot=0x287A, category='so', description='BRAILLE PATTERN DOTS-24567' },
+ [0x287B] = { unicodeslot=0x287B, category='so', description='BRAILLE PATTERN DOTS-124567' },
+ [0x287C] = { unicodeslot=0x287C, category='so', description='BRAILLE PATTERN DOTS-34567' },
+ [0x287D] = { unicodeslot=0x287D, category='so', description='BRAILLE PATTERN DOTS-134567' },
+ [0x287E] = { unicodeslot=0x287E, category='so', description='BRAILLE PATTERN DOTS-234567' },
+ [0x287F] = { unicodeslot=0x287F, category='so', description='BRAILLE PATTERN DOTS-1234567' },
+ [0x2880] = { unicodeslot=0x2880, category='so', description='BRAILLE PATTERN DOTS-8' },
+ [0x2881] = { unicodeslot=0x2881, category='so', description='BRAILLE PATTERN DOTS-18' },
+ [0x2882] = { unicodeslot=0x2882, category='so', description='BRAILLE PATTERN DOTS-28' },
+ [0x2883] = { unicodeslot=0x2883, category='so', description='BRAILLE PATTERN DOTS-128' },
+ [0x2884] = { unicodeslot=0x2884, category='so', description='BRAILLE PATTERN DOTS-38' },
+ [0x2885] = { unicodeslot=0x2885, category='so', description='BRAILLE PATTERN DOTS-138' },
+ [0x2886] = { unicodeslot=0x2886, category='so', description='BRAILLE PATTERN DOTS-238' },
+ [0x2887] = { unicodeslot=0x2887, category='so', description='BRAILLE PATTERN DOTS-1238' },
+ [0x2888] = { unicodeslot=0x2888, category='so', description='BRAILLE PATTERN DOTS-48' },
+ [0x2889] = { unicodeslot=0x2889, category='so', description='BRAILLE PATTERN DOTS-148' },
+ [0x288A] = { unicodeslot=0x288A, category='so', description='BRAILLE PATTERN DOTS-248' },
+ [0x288B] = { unicodeslot=0x288B, category='so', description='BRAILLE PATTERN DOTS-1248' },
+ [0x288C] = { unicodeslot=0x288C, category='so', description='BRAILLE PATTERN DOTS-348' },
+ [0x288D] = { unicodeslot=0x288D, category='so', description='BRAILLE PATTERN DOTS-1348' },
+ [0x288E] = { unicodeslot=0x288E, category='so', description='BRAILLE PATTERN DOTS-2348' },
+ [0x288F] = { unicodeslot=0x288F, category='so', description='BRAILLE PATTERN DOTS-12348' },
+ [0x2890] = { unicodeslot=0x2890, category='so', description='BRAILLE PATTERN DOTS-58' },
+ [0x2891] = { unicodeslot=0x2891, category='so', description='BRAILLE PATTERN DOTS-158' },
+ [0x2892] = { unicodeslot=0x2892, category='so', description='BRAILLE PATTERN DOTS-258' },
+ [0x2893] = { unicodeslot=0x2893, category='so', description='BRAILLE PATTERN DOTS-1258' },
+ [0x2894] = { unicodeslot=0x2894, category='so', description='BRAILLE PATTERN DOTS-358' },
+ [0x2895] = { unicodeslot=0x2895, category='so', description='BRAILLE PATTERN DOTS-1358' },
+ [0x2896] = { unicodeslot=0x2896, category='so', description='BRAILLE PATTERN DOTS-2358' },
+ [0x2897] = { unicodeslot=0x2897, category='so', description='BRAILLE PATTERN DOTS-12358' },
+ [0x2898] = { unicodeslot=0x2898, category='so', description='BRAILLE PATTERN DOTS-458' },
+ [0x2899] = { unicodeslot=0x2899, category='so', description='BRAILLE PATTERN DOTS-1458' },
+ [0x289A] = { unicodeslot=0x289A, category='so', description='BRAILLE PATTERN DOTS-2458' },
+ [0x289B] = { unicodeslot=0x289B, category='so', description='BRAILLE PATTERN DOTS-12458' },
+ [0x289C] = { unicodeslot=0x289C, category='so', description='BRAILLE PATTERN DOTS-3458' },
+ [0x289D] = { unicodeslot=0x289D, category='so', description='BRAILLE PATTERN DOTS-13458' },
+ [0x289E] = { unicodeslot=0x289E, category='so', description='BRAILLE PATTERN DOTS-23458' },
+ [0x289F] = { unicodeslot=0x289F, category='so', description='BRAILLE PATTERN DOTS-123458' },
+ [0x28A0] = { unicodeslot=0x28A0, category='so', description='BRAILLE PATTERN DOTS-68' },
+ [0x28A1] = { unicodeslot=0x28A1, category='so', description='BRAILLE PATTERN DOTS-168' },
+ [0x28A2] = { unicodeslot=0x28A2, category='so', description='BRAILLE PATTERN DOTS-268' },
+ [0x28A3] = { unicodeslot=0x28A3, category='so', description='BRAILLE PATTERN DOTS-1268' },
+ [0x28A4] = { unicodeslot=0x28A4, category='so', description='BRAILLE PATTERN DOTS-368' },
+ [0x28A5] = { unicodeslot=0x28A5, category='so', description='BRAILLE PATTERN DOTS-1368' },
+ [0x28A6] = { unicodeslot=0x28A6, category='so', description='BRAILLE PATTERN DOTS-2368' },
+ [0x28A7] = { unicodeslot=0x28A7, category='so', description='BRAILLE PATTERN DOTS-12368' },
+ [0x28A8] = { unicodeslot=0x28A8, category='so', description='BRAILLE PATTERN DOTS-468' },
+ [0x28A9] = { unicodeslot=0x28A9, category='so', description='BRAILLE PATTERN DOTS-1468' },
+ [0x28AA] = { unicodeslot=0x28AA, category='so', description='BRAILLE PATTERN DOTS-2468' },
+ [0x28AB] = { unicodeslot=0x28AB, category='so', description='BRAILLE PATTERN DOTS-12468' },
+ [0x28AC] = { unicodeslot=0x28AC, category='so', description='BRAILLE PATTERN DOTS-3468' },
+ [0x28AD] = { unicodeslot=0x28AD, category='so', description='BRAILLE PATTERN DOTS-13468' },
+ [0x28AE] = { unicodeslot=0x28AE, category='so', description='BRAILLE PATTERN DOTS-23468' },
+ [0x28AF] = { unicodeslot=0x28AF, category='so', description='BRAILLE PATTERN DOTS-123468' },
+ [0x28B0] = { unicodeslot=0x28B0, category='so', description='BRAILLE PATTERN DOTS-568' },
+ [0x28B1] = { unicodeslot=0x28B1, category='so', description='BRAILLE PATTERN DOTS-1568' },
+ [0x28B2] = { unicodeslot=0x28B2, category='so', description='BRAILLE PATTERN DOTS-2568' },
+ [0x28B3] = { unicodeslot=0x28B3, category='so', description='BRAILLE PATTERN DOTS-12568' },
+ [0x28B4] = { unicodeslot=0x28B4, category='so', description='BRAILLE PATTERN DOTS-3568' },
+ [0x28B5] = { unicodeslot=0x28B5, category='so', description='BRAILLE PATTERN DOTS-13568' },
+ [0x28B6] = { unicodeslot=0x28B6, category='so', description='BRAILLE PATTERN DOTS-23568' },
+ [0x28B7] = { unicodeslot=0x28B7, category='so', description='BRAILLE PATTERN DOTS-123568' },
+ [0x28B8] = { unicodeslot=0x28B8, category='so', description='BRAILLE PATTERN DOTS-4568' },
+ [0x28B9] = { unicodeslot=0x28B9, category='so', description='BRAILLE PATTERN DOTS-14568' },
+ [0x28BA] = { unicodeslot=0x28BA, category='so', description='BRAILLE PATTERN DOTS-24568' },
+ [0x28BB] = { unicodeslot=0x28BB, category='so', description='BRAILLE PATTERN DOTS-124568' },
+ [0x28BC] = { unicodeslot=0x28BC, category='so', description='BRAILLE PATTERN DOTS-34568' },
+ [0x28BD] = { unicodeslot=0x28BD, category='so', description='BRAILLE PATTERN DOTS-134568' },
+ [0x28BE] = { unicodeslot=0x28BE, category='so', description='BRAILLE PATTERN DOTS-234568' },
+ [0x28BF] = { unicodeslot=0x28BF, category='so', description='BRAILLE PATTERN DOTS-1234568' },
+ [0x28C0] = { unicodeslot=0x28C0, category='so', description='BRAILLE PATTERN DOTS-78' },
+ [0x28C1] = { unicodeslot=0x28C1, category='so', description='BRAILLE PATTERN DOTS-178' },
+ [0x28C2] = { unicodeslot=0x28C2, category='so', description='BRAILLE PATTERN DOTS-278' },
+ [0x28C3] = { unicodeslot=0x28C3, category='so', description='BRAILLE PATTERN DOTS-1278' },
+ [0x28C4] = { unicodeslot=0x28C4, category='so', description='BRAILLE PATTERN DOTS-378' },
+ [0x28C5] = { unicodeslot=0x28C5, category='so', description='BRAILLE PATTERN DOTS-1378' },
+ [0x28C6] = { unicodeslot=0x28C6, category='so', description='BRAILLE PATTERN DOTS-2378' },
+ [0x28C7] = { unicodeslot=0x28C7, category='so', description='BRAILLE PATTERN DOTS-12378' },
+ [0x28C8] = { unicodeslot=0x28C8, category='so', description='BRAILLE PATTERN DOTS-478' },
+ [0x28C9] = { unicodeslot=0x28C9, category='so', description='BRAILLE PATTERN DOTS-1478' },
+ [0x28CA] = { unicodeslot=0x28CA, category='so', description='BRAILLE PATTERN DOTS-2478' },
+ [0x28CB] = { unicodeslot=0x28CB, category='so', description='BRAILLE PATTERN DOTS-12478' },
+ [0x28CC] = { unicodeslot=0x28CC, category='so', description='BRAILLE PATTERN DOTS-3478' },
+ [0x28CD] = { unicodeslot=0x28CD, category='so', description='BRAILLE PATTERN DOTS-13478' },
+ [0x28CE] = { unicodeslot=0x28CE, category='so', description='BRAILLE PATTERN DOTS-23478' },
+ [0x28CF] = { unicodeslot=0x28CF, category='so', description='BRAILLE PATTERN DOTS-123478' },
+ [0x28D0] = { unicodeslot=0x28D0, category='so', description='BRAILLE PATTERN DOTS-578' },
+ [0x28D1] = { unicodeslot=0x28D1, category='so', description='BRAILLE PATTERN DOTS-1578' },
+ [0x28D2] = { unicodeslot=0x28D2, category='so', description='BRAILLE PATTERN DOTS-2578' },
+ [0x28D3] = { unicodeslot=0x28D3, category='so', description='BRAILLE PATTERN DOTS-12578' },
+ [0x28D4] = { unicodeslot=0x28D4, category='so', description='BRAILLE PATTERN DOTS-3578' },
+ [0x28D5] = { unicodeslot=0x28D5, category='so', description='BRAILLE PATTERN DOTS-13578' },
+ [0x28D6] = { unicodeslot=0x28D6, category='so', description='BRAILLE PATTERN DOTS-23578' },
+ [0x28D7] = { unicodeslot=0x28D7, category='so', description='BRAILLE PATTERN DOTS-123578' },
+ [0x28D8] = { unicodeslot=0x28D8, category='so', description='BRAILLE PATTERN DOTS-4578' },
+ [0x28D9] = { unicodeslot=0x28D9, category='so', description='BRAILLE PATTERN DOTS-14578' },
+ [0x28DA] = { unicodeslot=0x28DA, category='so', description='BRAILLE PATTERN DOTS-24578' },
+ [0x28DB] = { unicodeslot=0x28DB, category='so', description='BRAILLE PATTERN DOTS-124578' },
+ [0x28DC] = { unicodeslot=0x28DC, category='so', description='BRAILLE PATTERN DOTS-34578' },
+ [0x28DD] = { unicodeslot=0x28DD, category='so', description='BRAILLE PATTERN DOTS-134578' },
+ [0x28DE] = { unicodeslot=0x28DE, category='so', description='BRAILLE PATTERN DOTS-234578' },
+ [0x28DF] = { unicodeslot=0x28DF, category='so', description='BRAILLE PATTERN DOTS-1234578' },
+ [0x28E0] = { unicodeslot=0x28E0, category='so', description='BRAILLE PATTERN DOTS-678' },
+ [0x28E1] = { unicodeslot=0x28E1, category='so', description='BRAILLE PATTERN DOTS-1678' },
+ [0x28E2] = { unicodeslot=0x28E2, category='so', description='BRAILLE PATTERN DOTS-2678' },
+ [0x28E3] = { unicodeslot=0x28E3, category='so', description='BRAILLE PATTERN DOTS-12678' },
+ [0x28E4] = { unicodeslot=0x28E4, category='so', description='BRAILLE PATTERN DOTS-3678' },
+ [0x28E5] = { unicodeslot=0x28E5, category='so', description='BRAILLE PATTERN DOTS-13678' },
+ [0x28E6] = { unicodeslot=0x28E6, category='so', description='BRAILLE PATTERN DOTS-23678' },
+ [0x28E7] = { unicodeslot=0x28E7, category='so', description='BRAILLE PATTERN DOTS-123678' },
+ [0x28E8] = { unicodeslot=0x28E8, category='so', description='BRAILLE PATTERN DOTS-4678' },
+ [0x28E9] = { unicodeslot=0x28E9, category='so', description='BRAILLE PATTERN DOTS-14678' },
+ [0x28EA] = { unicodeslot=0x28EA, category='so', description='BRAILLE PATTERN DOTS-24678' },
+ [0x28EB] = { unicodeslot=0x28EB, category='so', description='BRAILLE PATTERN DOTS-124678' },
+ [0x28EC] = { unicodeslot=0x28EC, category='so', description='BRAILLE PATTERN DOTS-34678' },
+ [0x28ED] = { unicodeslot=0x28ED, category='so', description='BRAILLE PATTERN DOTS-134678' },
+ [0x28EE] = { unicodeslot=0x28EE, category='so', description='BRAILLE PATTERN DOTS-234678' },
+ [0x28EF] = { unicodeslot=0x28EF, category='so', description='BRAILLE PATTERN DOTS-1234678' },
+ [0x28F0] = { unicodeslot=0x28F0, category='so', description='BRAILLE PATTERN DOTS-5678' },
+ [0x28F1] = { unicodeslot=0x28F1, category='so', description='BRAILLE PATTERN DOTS-15678' },
+ [0x28F2] = { unicodeslot=0x28F2, category='so', description='BRAILLE PATTERN DOTS-25678' },
+ [0x28F3] = { unicodeslot=0x28F3, category='so', description='BRAILLE PATTERN DOTS-125678' },
+ [0x28F4] = { unicodeslot=0x28F4, category='so', description='BRAILLE PATTERN DOTS-35678' },
+ [0x28F5] = { unicodeslot=0x28F5, category='so', description='BRAILLE PATTERN DOTS-135678' },
+ [0x28F6] = { unicodeslot=0x28F6, category='so', description='BRAILLE PATTERN DOTS-235678' },
+ [0x28F7] = { unicodeslot=0x28F7, category='so', description='BRAILLE PATTERN DOTS-1235678' },
+ [0x28F8] = { unicodeslot=0x28F8, category='so', description='BRAILLE PATTERN DOTS-45678' },
+ [0x28F9] = { unicodeslot=0x28F9, category='so', description='BRAILLE PATTERN DOTS-145678' },
+ [0x28FA] = { unicodeslot=0x28FA, category='so', description='BRAILLE PATTERN DOTS-245678' },
+ [0x28FB] = { unicodeslot=0x28FB, category='so', description='BRAILLE PATTERN DOTS-1245678' },
+ [0x28FC] = { unicodeslot=0x28FC, category='so', description='BRAILLE PATTERN DOTS-345678' },
+ [0x28FD] = { unicodeslot=0x28FD, category='so', description='BRAILLE PATTERN DOTS-1345678' },
+ [0x28FE] = { unicodeslot=0x28FE, category='so', description='BRAILLE PATTERN DOTS-2345678' },
+ [0x28FF] = { unicodeslot=0x28FF, category='so', description='BRAILLE PATTERN DOTS-12345678' },
+ [0x2900] = { unicodeslot=0x2900, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE' },
+ [0x2901] = { unicodeslot=0x2901, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE' },
+ [0x2902] = { unicodeslot=0x2902, category='sm', description='LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE' },
+ [0x2903] = { unicodeslot=0x2903, category='sm', description='RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE' },
+ [0x2904] = { unicodeslot=0x2904, category='sm', description='LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE' },
+ [0x2905] = { unicodeslot=0x2905, category='sm', description='RIGHTWARDS TWO-HEADED ARROW FROM BAR' },
+ [0x2906] = { unicodeslot=0x2906, category='sm', description='LEFTWARDS DOUBLE ARROW FROM BAR' },
+ [0x2907] = { unicodeslot=0x2907, category='sm', description='RIGHTWARDS DOUBLE ARROW FROM BAR' },
+ [0x2908] = { unicodeslot=0x2908, category='sm', description='DOWNWARDS ARROW WITH HORIZONTAL STROKE' },
+ [0x2909] = { unicodeslot=0x2909, category='sm', description='UPWARDS ARROW WITH HORIZONTAL STROKE' },
+ [0x290A] = { unicodeslot=0x290A, category='sm', description='UPWARDS TRIPLE ARROW' },
+ [0x290B] = { unicodeslot=0x290B, category='sm', description='DOWNWARDS TRIPLE ARROW' },
+ [0x290C] = { unicodeslot=0x290C, category='sm', description='LEFTWARDS DOUBLE DASH ARROW' },
+ [0x290D] = { unicodeslot=0x290D, category='sm', description='RIGHTWARDS DOUBLE DASH ARROW' },
+ [0x290E] = { unicodeslot=0x290E, category='sm', description='LEFTWARDS TRIPLE DASH ARROW' },
+ [0x290F] = { unicodeslot=0x290F, category='sm', description='RIGHTWARDS TRIPLE DASH ARROW' },
+ [0x2910] = { unicodeslot=0x2910, category='sm', description='RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW' },
+ [0x2911] = { unicodeslot=0x2911, category='sm', description='RIGHTWARDS ARROW WITH DOTTED STEM' },
+ [0x2912] = { unicodeslot=0x2912, category='sm', description='UPWARDS ARROW TO BAR' },
+ [0x2913] = { unicodeslot=0x2913, category='sm', description='DOWNWARDS ARROW TO BAR' },
+ [0x2914] = { unicodeslot=0x2914, category='sm', description='RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE' },
+ [0x2915] = { unicodeslot=0x2915, category='sm', description='RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE' },
+ [0x2916] = { unicodeslot=0x2916, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH TAIL' },
+ [0x2917] = { unicodeslot=0x2917, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE' },
+ [0x2918] = { unicodeslot=0x2918, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE' },
+ [0x2919] = { unicodeslot=0x2919, category='sm', description='LEFTWARDS ARROW-TAIL' },
+ [0x291A] = { unicodeslot=0x291A, category='sm', description='RIGHTWARDS ARROW-TAIL' },
+ [0x291B] = { unicodeslot=0x291B, category='sm', description='LEFTWARDS DOUBLE ARROW-TAIL' },
+ [0x291C] = { unicodeslot=0x291C, category='sm', description='RIGHTWARDS DOUBLE ARROW-TAIL' },
+ [0x291D] = { unicodeslot=0x291D, category='sm', description='LEFTWARDS ARROW TO BLACK DIAMOND' },
+ [0x291E] = { unicodeslot=0x291E, category='sm', description='RIGHTWARDS ARROW TO BLACK DIAMOND' },
+ [0x291F] = { unicodeslot=0x291F, category='sm', description='LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND' },
+ [0x2920] = { unicodeslot=0x2920, category='sm', description='RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND' },
+ [0x2921] = { unicodeslot=0x2921, category='sm', description='NORTH WEST AND SOUTH EAST ARROW' },
+ [0x2922] = { unicodeslot=0x2922, category='sm', description='NORTH EAST AND SOUTH WEST ARROW' },
+ [0x2923] = { unicodeslot=0x2923, category='sm', description='NORTH WEST ARROW WITH HOOK' },
+ [0x2924] = { unicodeslot=0x2924, category='sm', description='NORTH EAST ARROW WITH HOOK' },
+ [0x2925] = { unicodeslot=0x2925, category='sm', description='SOUTH EAST ARROW WITH HOOK' },
+ [0x2926] = { unicodeslot=0x2926, category='sm', description='SOUTH WEST ARROW WITH HOOK' },
+ [0x2927] = { unicodeslot=0x2927, category='sm', description='NORTH WEST ARROW AND NORTH EAST ARROW' },
+ [0x2928] = { unicodeslot=0x2928, category='sm', description='NORTH EAST ARROW AND SOUTH EAST ARROW' },
+ [0x2929] = { unicodeslot=0x2929, category='sm', description='SOUTH EAST ARROW AND SOUTH WEST ARROW' },
+ [0x292A] = { unicodeslot=0x292A, category='sm', description='SOUTH WEST ARROW AND NORTH WEST ARROW' },
+ [0x292B] = { unicodeslot=0x292B, category='sm', description='RISING DIAGONAL CROSSING FALLING DIAGONAL' },
+ [0x292C] = { unicodeslot=0x292C, category='sm', description='FALLING DIAGONAL CROSSING RISING DIAGONAL' },
+ [0x292D] = { unicodeslot=0x292D, category='sm', description='SOUTH EAST ARROW CROSSING NORTH EAST ARROW' },
+ [0x292E] = { unicodeslot=0x292E, category='sm', description='NORTH EAST ARROW CROSSING SOUTH EAST ARROW' },
+ [0x292F] = { unicodeslot=0x292F, category='sm', description='FALLING DIAGONAL CROSSING NORTH EAST ARROW' },
+ [0x2930] = { unicodeslot=0x2930, category='sm', description='RISING DIAGONAL CROSSING SOUTH EAST ARROW' },
+ [0x2931] = { unicodeslot=0x2931, category='sm', description='NORTH EAST ARROW CROSSING NORTH WEST ARROW' },
+ [0x2932] = { unicodeslot=0x2932, category='sm', description='NORTH WEST ARROW CROSSING NORTH EAST ARROW' },
+ [0x2933] = { unicodeslot=0x2933, category='sm', description='WAVE ARROW POINTING DIRECTLY RIGHT' },
+ [0x2934] = { unicodeslot=0x2934, category='sm', description='ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS' },
+ [0x2935] = { unicodeslot=0x2935, category='sm', description='ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS' },
+ [0x2936] = { unicodeslot=0x2936, category='sm', description='ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS' },
+ [0x2937] = { unicodeslot=0x2937, category='sm', description='ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS' },
+ [0x2938] = { unicodeslot=0x2938, category='sm', description='RIGHT-SIDE ARC CLOCKWISE ARROW' },
+ [0x2939] = { unicodeslot=0x2939, category='sm', description='LEFT-SIDE ARC ANTICLOCKWISE ARROW' },
+ [0x293A] = { unicodeslot=0x293A, category='sm', description='TOP ARC ANTICLOCKWISE ARROW' },
+ [0x293B] = { unicodeslot=0x293B, category='sm', description='BOTTOM ARC ANTICLOCKWISE ARROW' },
+ [0x293C] = { unicodeslot=0x293C, category='sm', description='TOP ARC CLOCKWISE ARROW WITH MINUS' },
+ [0x293D] = { unicodeslot=0x293D, category='sm', description='TOP ARC ANTICLOCKWISE ARROW WITH PLUS' },
+ [0x293E] = { unicodeslot=0x293E, category='sm', description='LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW' },
+ [0x293F] = { unicodeslot=0x293F, category='sm', description='LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW' },
+ [0x2940] = { unicodeslot=0x2940, category='sm', description='ANTICLOCKWISE CLOSED CIRCLE ARROW' },
+ [0x2941] = { unicodeslot=0x2941, category='sm', description='CLOCKWISE CLOSED CIRCLE ARROW' },
+ [0x2942] = { unicodeslot=0x2942, category='sm', description='RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW' },
+ [0x2943] = { unicodeslot=0x2943, category='sm', description='LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW' },
+ [0x2944] = { unicodeslot=0x2944, category='sm', description='SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW' },
+ [0x2945] = { unicodeslot=0x2945, category='sm', description='RIGHTWARDS ARROW WITH PLUS BELOW' },
+ [0x2946] = { unicodeslot=0x2946, category='sm', description='LEFTWARDS ARROW WITH PLUS BELOW' },
+ [0x2947] = { unicodeslot=0x2947, category='sm', description='RIGHTWARDS ARROW THROUGH X' },
+ [0x2948] = { unicodeslot=0x2948, category='sm', description='LEFT RIGHT ARROW THROUGH SMALL CIRCLE' },
+ [0x2949] = { unicodeslot=0x2949, category='sm', description='UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE' },
+ [0x294A] = { unicodeslot=0x294A, category='sm', description='LEFT BARB UP RIGHT BARB DOWN HARPOON' },
+ [0x294B] = { unicodeslot=0x294B, category='sm', description='LEFT BARB DOWN RIGHT BARB UP HARPOON' },
+ [0x294C] = { unicodeslot=0x294C, category='sm', description='UP BARB RIGHT DOWN BARB LEFT HARPOON' },
+ [0x294D] = { unicodeslot=0x294D, category='sm', description='UP BARB LEFT DOWN BARB RIGHT HARPOON' },
+ [0x294E] = { unicodeslot=0x294E, category='sm', description='LEFT BARB UP RIGHT BARB UP HARPOON' },
+ [0x294F] = { unicodeslot=0x294F, category='sm', description='UP BARB RIGHT DOWN BARB RIGHT HARPOON' },
+ [0x2950] = { unicodeslot=0x2950, category='sm', description='LEFT BARB DOWN RIGHT BARB DOWN HARPOON' },
+ [0x2951] = { unicodeslot=0x2951, category='sm', description='UP BARB LEFT DOWN BARB LEFT HARPOON' },
+ [0x2952] = { unicodeslot=0x2952, category='sm', description='LEFTWARDS HARPOON WITH BARB UP TO BAR' },
+ [0x2953] = { unicodeslot=0x2953, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP TO BAR' },
+ [0x2954] = { unicodeslot=0x2954, category='sm', description='UPWARDS HARPOON WITH BARB RIGHT TO BAR' },
+ [0x2955] = { unicodeslot=0x2955, category='sm', description='DOWNWARDS HARPOON WITH BARB RIGHT TO BAR' },
+ [0x2956] = { unicodeslot=0x2956, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN TO BAR' },
+ [0x2957] = { unicodeslot=0x2957, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN TO BAR' },
+ [0x2958] = { unicodeslot=0x2958, category='sm', description='UPWARDS HARPOON WITH BARB LEFT TO BAR' },
+ [0x2959] = { unicodeslot=0x2959, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT TO BAR' },
+ [0x295A] = { unicodeslot=0x295A, category='sm', description='LEFTWARDS HARPOON WITH BARB UP FROM BAR' },
+ [0x295B] = { unicodeslot=0x295B, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP FROM BAR' },
+ [0x295C] = { unicodeslot=0x295C, category='sm', description='UPWARDS HARPOON WITH BARB RIGHT FROM BAR' },
+ [0x295D] = { unicodeslot=0x295D, category='sm', description='DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR' },
+ [0x295E] = { unicodeslot=0x295E, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN FROM BAR' },
+ [0x295F] = { unicodeslot=0x295F, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR' },
+ [0x2960] = { unicodeslot=0x2960, category='sm', description='UPWARDS HARPOON WITH BARB LEFT FROM BAR' },
+ [0x2961] = { unicodeslot=0x2961, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT FROM BAR' },
+ [0x2962] = { unicodeslot=0x2962, category='sm', description='LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN' },
+ [0x2963] = { unicodeslot=0x2963, category='sm', description='UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT' },
+ [0x2964] = { unicodeslot=0x2964, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN' },
+ [0x2965] = { unicodeslot=0x2965, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT' },
+ [0x2966] = { unicodeslot=0x2966, category='sm', description='LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP' },
+ [0x2967] = { unicodeslot=0x2967, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN' },
+ [0x2968] = { unicodeslot=0x2968, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP' },
+ [0x2969] = { unicodeslot=0x2969, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN' },
+ [0x296A] = { unicodeslot=0x296A, category='sm', description='LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH' },
+ [0x296B] = { unicodeslot=0x296B, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH' },
+ [0x296C] = { unicodeslot=0x296C, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH' },
+ [0x296D] = { unicodeslot=0x296D, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH' },
+ [0x296E] = { unicodeslot=0x296E, category='sm', description='UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT' },
+ [0x296F] = { unicodeslot=0x296F, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT' },
+ [0x2970] = { unicodeslot=0x2970, category='sm', description='RIGHT DOUBLE ARROW WITH ROUNDED HEAD' },
+ [0x2971] = { unicodeslot=0x2971, category='sm', description='EQUALS SIGN ABOVE RIGHTWARDS ARROW' },
+ [0x2972] = { unicodeslot=0x2972, category='sm', description='TILDE OPERATOR ABOVE RIGHTWARDS ARROW' },
+ [0x2973] = { unicodeslot=0x2973, category='sm', description='LEFTWARDS ARROW ABOVE TILDE OPERATOR' },
+ [0x2974] = { unicodeslot=0x2974, category='sm', description='RIGHTWARDS ARROW ABOVE TILDE OPERATOR' },
+ [0x2975] = { unicodeslot=0x2975, category='sm', description='RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO' },
+ [0x2976] = { unicodeslot=0x2976, category='sm', description='LESS-THAN ABOVE LEFTWARDS ARROW' },
+ [0x2977] = { unicodeslot=0x2977, category='sm', description='LEFTWARDS ARROW THROUGH LESS-THAN' },
+ [0x2978] = { unicodeslot=0x2978, category='sm', description='GREATER-THAN ABOVE RIGHTWARDS ARROW' },
+ [0x2979] = { unicodeslot=0x2979, category='sm', description='SUBSET ABOVE RIGHTWARDS ARROW' },
+ [0x297A] = { unicodeslot=0x297A, category='sm', description='LEFTWARDS ARROW THROUGH SUBSET' },
+ [0x297B] = { unicodeslot=0x297B, category='sm', description='SUPERSET ABOVE LEFTWARDS ARROW' },
+ [0x297C] = { unicodeslot=0x297C, category='sm', description='LEFT FISH TAIL' },
+ [0x297D] = { unicodeslot=0x297D, category='sm', description='RIGHT FISH TAIL' },
+ [0x297E] = { unicodeslot=0x297E, category='sm', description='UP FISH TAIL' },
+ [0x297F] = { unicodeslot=0x297F, category='sm', description='DOWN FISH TAIL' },
+ [0x2980] = { unicodeslot=0x2980, category='sm', description='TRIPLE VERTICAL BAR DELIMITER' },
+ [0x2981] = { unicodeslot=0x2981, category='sm', description='Z NOTATION SPOT' },
+ [0x2982] = { unicodeslot=0x2982, category='sm', description='Z NOTATION TYPE COLON' },
+ [0x2983] = { unicodeslot=0x2983, category='ps', description='LEFT WHITE CURLY BRACKET' },
+ [0x2984] = { unicodeslot=0x2984, category='pe', description='RIGHT WHITE CURLY BRACKET' },
+ [0x2985] = { unicodeslot=0x2985, category='ps', description='LEFT WHITE PARENTHESIS' },
+ [0x2986] = { unicodeslot=0x2986, category='pe', description='RIGHT WHITE PARENTHESIS' },
+ [0x2987] = { unicodeslot=0x2987, category='ps', description='Z NOTATION LEFT IMAGE BRACKET' },
+ [0x2988] = { unicodeslot=0x2988, category='pe', description='Z NOTATION RIGHT IMAGE BRACKET' },
+ [0x2989] = { unicodeslot=0x2989, category='ps', description='Z NOTATION LEFT BINDING BRACKET' },
+ [0x298A] = { unicodeslot=0x298A, category='pe', description='Z NOTATION RIGHT BINDING BRACKET' },
+ [0x298B] = { unicodeslot=0x298B, category='ps', description='LEFT SQUARE BRACKET WITH UNDERBAR' },
+ [0x298C] = { unicodeslot=0x298C, category='pe', description='RIGHT SQUARE BRACKET WITH UNDERBAR' },
+ [0x298D] = { unicodeslot=0x298D, category='ps', description='LEFT SQUARE BRACKET WITH TICK IN TOP CORNER' },
+ [0x298E] = { unicodeslot=0x298E, category='pe', description='RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER' },
+ [0x298F] = { unicodeslot=0x298F, category='ps', description='LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER' },
+ [0x2990] = { unicodeslot=0x2990, category='pe', description='RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER' },
+ [0x2991] = { unicodeslot=0x2991, category='ps', description='LEFT ANGLE BRACKET WITH DOT' },
+ [0x2992] = { unicodeslot=0x2992, category='pe', description='RIGHT ANGLE BRACKET WITH DOT' },
+ [0x2993] = { unicodeslot=0x2993, category='ps', description='LEFT ARC LESS-THAN BRACKET' },
+ [0x2994] = { unicodeslot=0x2994, category='pe', description='RIGHT ARC GREATER-THAN BRACKET' },
+ [0x2995] = { unicodeslot=0x2995, category='ps', description='DOUBLE LEFT ARC GREATER-THAN BRACKET' },
+ [0x2996] = { unicodeslot=0x2996, category='pe', description='DOUBLE RIGHT ARC LESS-THAN BRACKET' },
+ [0x2997] = { unicodeslot=0x2997, category='ps', description='LEFT BLACK TORTOISE SHELL BRACKET' },
+ [0x2998] = { unicodeslot=0x2998, category='pe', description='RIGHT BLACK TORTOISE SHELL BRACKET' },
+ [0x2999] = { unicodeslot=0x2999, category='sm', description='DOTTED FENCE' },
+ [0x299A] = { unicodeslot=0x299A, category='sm', description='VERTICAL ZIGZAG LINE' },
+ [0x299B] = { unicodeslot=0x299B, category='sm', description='MEASURED ANGLE OPENING LEFT' },
+ [0x299C] = { unicodeslot=0x299C, category='sm', description='RIGHT ANGLE VARIANT WITH SQUARE' },
+ [0x299D] = { unicodeslot=0x299D, category='sm', description='MEASURED RIGHT ANGLE WITH DOT' },
+ [0x299E] = { unicodeslot=0x299E, category='sm', description='ANGLE WITH S INSIDE' },
+ [0x299F] = { unicodeslot=0x299F, category='sm', description='ACUTE ANGLE' },
+ [0x29A0] = { unicodeslot=0x29A0, category='sm', description='SPHERICAL ANGLE OPENING LEFT' },
+ [0x29A1] = { unicodeslot=0x29A1, category='sm', description='SPHERICAL ANGLE OPENING UP' },
+ [0x29A2] = { unicodeslot=0x29A2, category='sm', description='TURNED ANGLE' },
+ [0x29A3] = { unicodeslot=0x29A3, category='sm', description='REVERSED ANGLE' },
+ [0x29A4] = { unicodeslot=0x29A4, category='sm', description='ANGLE WITH UNDERBAR' },
+ [0x29A5] = { unicodeslot=0x29A5, category='sm', description='REVERSED ANGLE WITH UNDERBAR' },
+ [0x29A6] = { unicodeslot=0x29A6, category='sm', description='OBLIQUE ANGLE OPENING UP' },
+ [0x29A7] = { unicodeslot=0x29A7, category='sm', description='OBLIQUE ANGLE OPENING DOWN' },
+ [0x29A8] = { unicodeslot=0x29A8, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT' },
+ [0x29A9] = { unicodeslot=0x29A9, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT' },
+ [0x29AA] = { unicodeslot=0x29AA, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT' },
+ [0x29AB] = { unicodeslot=0x29AB, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT' },
+ [0x29AC] = { unicodeslot=0x29AC, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP' },
+ [0x29AD] = { unicodeslot=0x29AD, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP' },
+ [0x29AE] = { unicodeslot=0x29AE, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN' },
+ [0x29AF] = { unicodeslot=0x29AF, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN' },
+ [0x29B0] = { unicodeslot=0x29B0, category='sm', description='REVERSED EMPTY SET' },
+ [0x29B1] = { unicodeslot=0x29B1, category='sm', description='EMPTY SET WITH OVERBAR' },
+ [0x29B2] = { unicodeslot=0x29B2, category='sm', description='EMPTY SET WITH SMALL CIRCLE ABOVE' },
+ [0x29B3] = { unicodeslot=0x29B3, category='sm', description='EMPTY SET WITH RIGHT ARROW ABOVE' },
+ [0x29B4] = { unicodeslot=0x29B4, category='sm', description='EMPTY SET WITH LEFT ARROW ABOVE' },
+ [0x29B5] = { unicodeslot=0x29B5, category='sm', description='CIRCLE WITH HORIZONTAL BAR' },
+ [0x29B6] = { unicodeslot=0x29B6, category='sm', description='CIRCLED VERTICAL BAR' },
+ [0x29B7] = { unicodeslot=0x29B7, category='sm', description='CIRCLED PARALLEL' },
+ [0x29B8] = { unicodeslot=0x29B8, category='sm', description='CIRCLED REVERSE SOLIDUS' },
+ [0x29B9] = { unicodeslot=0x29B9, category='sm', description='CIRCLED PERPENDICULAR' },
+ [0x29BA] = { unicodeslot=0x29BA, category='sm', description='CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR' },
+ [0x29BB] = { unicodeslot=0x29BB, category='sm', description='CIRCLE WITH SUPERIMPOSED X' },
+ [0x29BC] = { unicodeslot=0x29BC, category='sm', description='CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN' },
+ [0x29BD] = { unicodeslot=0x29BD, category='sm', description='UP ARROW THROUGH CIRCLE' },
+ [0x29BE] = { unicodeslot=0x29BE, category='sm', description='CIRCLED WHITE BULLET' },
+ [0x29BF] = { unicodeslot=0x29BF, category='sm', description='CIRCLED BULLET' },
+ [0x29C0] = { unicodeslot=0x29C0, category='sm', description='CIRCLED LESS-THAN' },
+ [0x29C1] = { unicodeslot=0x29C1, category='sm', description='CIRCLED GREATER-THAN' },
+ [0x29C2] = { unicodeslot=0x29C2, category='sm', description='CIRCLE WITH SMALL CIRCLE TO THE RIGHT' },
+ [0x29C3] = { unicodeslot=0x29C3, category='sm', description='CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT' },
+ [0x29C4] = { unicodeslot=0x29C4, category='sm', description='SQUARED RISING DIAGONAL SLASH' },
+ [0x29C5] = { unicodeslot=0x29C5, category='sm', description='SQUARED FALLING DIAGONAL SLASH' },
+ [0x29C6] = { unicodeslot=0x29C6, category='sm', description='SQUARED ASTERISK' },
+ [0x29C7] = { unicodeslot=0x29C7, category='sm', description='SQUARED SMALL CIRCLE' },
+ [0x29C8] = { unicodeslot=0x29C8, category='sm', description='SQUARED SQUARE' },
+ [0x29C9] = { unicodeslot=0x29C9, category='sm', description='TWO JOINED SQUARES' },
+ [0x29CA] = { unicodeslot=0x29CA, category='sm', description='TRIANGLE WITH DOT ABOVE' },
+ [0x29CB] = { unicodeslot=0x29CB, category='sm', description='TRIANGLE WITH UNDERBAR' },
+ [0x29CC] = { unicodeslot=0x29CC, category='sm', description='S IN TRIANGLE' },
+ [0x29CD] = { unicodeslot=0x29CD, category='sm', description='TRIANGLE WITH SERIFS AT BOTTOM' },
+ [0x29CE] = { unicodeslot=0x29CE, category='sm', description='RIGHT TRIANGLE ABOVE LEFT TRIANGLE' },
+ [0x29CF] = { unicodeslot=0x29CF, category='sm', description='LEFT TRIANGLE BESIDE VERTICAL BAR' },
+ [0x29D0] = { unicodeslot=0x29D0, category='sm', description='VERTICAL BAR BESIDE RIGHT TRIANGLE' },
+ [0x29D1] = { unicodeslot=0x29D1, category='sm', description='BOWTIE WITH LEFT HALF BLACK' },
+ [0x29D2] = { unicodeslot=0x29D2, category='sm', description='BOWTIE WITH RIGHT HALF BLACK' },
+ [0x29D3] = { unicodeslot=0x29D3, category='sm', description='BLACK BOWTIE' },
+ [0x29D4] = { unicodeslot=0x29D4, category='sm', description='TIMES WITH LEFT HALF BLACK' },
+ [0x29D5] = { unicodeslot=0x29D5, category='sm', description='TIMES WITH RIGHT HALF BLACK' },
+ [0x29D6] = { unicodeslot=0x29D6, category='sm', description='WHITE HOURGLASS' },
+ [0x29D7] = { unicodeslot=0x29D7, category='sm', description='BLACK HOURGLASS' },
+ [0x29D8] = { unicodeslot=0x29D8, category='ps', description='LEFT WIGGLY FENCE' },
+ [0x29D9] = { unicodeslot=0x29D9, category='pe', description='RIGHT WIGGLY FENCE' },
+ [0x29DA] = { unicodeslot=0x29DA, category='ps', description='LEFT DOUBLE WIGGLY FENCE' },
+ [0x29DB] = { unicodeslot=0x29DB, category='pe', description='RIGHT DOUBLE WIGGLY FENCE' },
+ [0x29DC] = { unicodeslot=0x29DC, category='sm', description='INCOMPLETE INFINITY' },
+ [0x29DD] = { unicodeslot=0x29DD, category='sm', description='TIE OVER INFINITY' },
+ [0x29DE] = { unicodeslot=0x29DE, category='sm', description='INFINITY NEGATED WITH VERTICAL BAR' },
+ [0x29DF] = { unicodeslot=0x29DF, category='sm', description='DOUBLE-ENDED MULTIMAP' },
+ [0x29E0] = { unicodeslot=0x29E0, category='sm', description='SQUARE WITH CONTOURED OUTLINE' },
+ [0x29E1] = { unicodeslot=0x29E1, category='sm', description='INCREASES AS' },
+ [0x29E2] = { unicodeslot=0x29E2, category='sm', description='SHUFFLE PRODUCT' },
+ [0x29E3] = { unicodeslot=0x29E3, category='sm', description='EQUALS SIGN AND SLANTED PARALLEL' },
+ [0x29E4] = { unicodeslot=0x29E4, category='sm', description='EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE' },
+ [0x29E5] = { unicodeslot=0x29E5, category='sm', description='IDENTICAL TO AND SLANTED PARALLEL' },
+ [0x29E6] = { unicodeslot=0x29E6, category='sm', description='GLEICH STARK' },
+ [0x29E7] = { unicodeslot=0x29E7, category='sm', description='THERMODYNAMIC' },
+ [0x29E8] = { unicodeslot=0x29E8, category='sm', description='DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK' },
+ [0x29E9] = { unicodeslot=0x29E9, category='sm', description='DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK' },
+ [0x29EA] = { unicodeslot=0x29EA, category='sm', description='BLACK DIAMOND WITH DOWN ARROW' },
+ [0x29EB] = { unicodeslot=0x29EB, category='sm', description='BLACK LOZENGE' },
+ [0x29EC] = { unicodeslot=0x29EC, category='sm', description='WHITE CIRCLE WITH DOWN ARROW' },
+ [0x29ED] = { unicodeslot=0x29ED, category='sm', description='BLACK CIRCLE WITH DOWN ARROW' },
+ [0x29EE] = { unicodeslot=0x29EE, category='sm', description='ERROR-BARRED WHITE SQUARE' },
+ [0x29EF] = { unicodeslot=0x29EF, category='sm', description='ERROR-BARRED BLACK SQUARE' },
+ [0x29F0] = { unicodeslot=0x29F0, category='sm', description='ERROR-BARRED WHITE DIAMOND' },
+ [0x29F1] = { unicodeslot=0x29F1, category='sm', description='ERROR-BARRED BLACK DIAMOND' },
+ [0x29F2] = { unicodeslot=0x29F2, category='sm', description='ERROR-BARRED WHITE CIRCLE' },
+ [0x29F3] = { unicodeslot=0x29F3, category='sm', description='ERROR-BARRED BLACK CIRCLE' },
+ [0x29F4] = { unicodeslot=0x29F4, category='sm', description='RULE-DELAYED' },
+ [0x29F5] = { unicodeslot=0x29F5, category='sm', description='REVERSE SOLIDUS OPERATOR' },
+ [0x29F6] = { unicodeslot=0x29F6, category='sm', description='SOLIDUS WITH OVERBAR' },
+ [0x29F7] = { unicodeslot=0x29F7, category='sm', description='REVERSE SOLIDUS WITH HORIZONTAL STROKE' },
+ [0x29F8] = { unicodeslot=0x29F8, category='sm', description='BIG SOLIDUS' },
+ [0x29F9] = { unicodeslot=0x29F9, category='sm', description='BIG REVERSE SOLIDUS' },
+ [0x29FA] = { unicodeslot=0x29FA, category='sm', description='DOUBLE PLUS' },
+ [0x29FB] = { unicodeslot=0x29FB, category='sm', description='TRIPLE PLUS' },
+ [0x29FC] = { unicodeslot=0x29FC, category='ps', description='LEFT-POINTING CURVED ANGLE BRACKET' },
+ [0x29FD] = { unicodeslot=0x29FD, category='pe', description='RIGHT-POINTING CURVED ANGLE BRACKET' },
+ [0x29FE] = { unicodeslot=0x29FE, category='sm', description='TINY' },
+ [0x29FF] = { unicodeslot=0x29FF, category='sm', description='MINY' },
+ [0x2A00] = { unicodeslot=0x2A00, category='sm', description='N-ARY CIRCLED DOT OPERATOR' },
+ [0x2A01] = { unicodeslot=0x2A01, category='sm', description='N-ARY CIRCLED PLUS OPERATOR' },
+ [0x2A02] = { unicodeslot=0x2A02, category='sm', description='N-ARY CIRCLED TIMES OPERATOR' },
+ [0x2A03] = { unicodeslot=0x2A03, category='sm', description='N-ARY UNION OPERATOR WITH DOT' },
+ [0x2A04] = { unicodeslot=0x2A04, category='sm', description='N-ARY UNION OPERATOR WITH PLUS' },
+ [0x2A05] = { unicodeslot=0x2A05, category='sm', description='N-ARY SQUARE INTERSECTION OPERATOR' },
+ [0x2A06] = { unicodeslot=0x2A06, category='sm', description='N-ARY SQUARE UNION OPERATOR' },
+ [0x2A07] = { unicodeslot=0x2A07, category='sm', description='TWO LOGICAL AND OPERATOR' },
+ [0x2A08] = { unicodeslot=0x2A08, category='sm', description='TWO LOGICAL OR OPERATOR' },
+ [0x2A09] = { unicodeslot=0x2A09, category='sm', description='N-ARY TIMES OPERATOR' },
+ [0x2A0A] = { unicodeslot=0x2A0A, category='sm', description='MODULO TWO SUM' },
+ [0x2A0B] = { unicodeslot=0x2A0B, category='sm', description='SUMMATION WITH INTEGRAL' },
+ [0x2A0C] = { unicodeslot=0x2A0C, category='sm', description='QUADRUPLE INTEGRAL OPERATOR', specials={'compat',0x222B,0x222B,0x222B,0x222B} },
+ [0x2A0D] = { unicodeslot=0x2A0D, category='sm', description='FINITE PART INTEGRAL' },
+ [0x2A0E] = { unicodeslot=0x2A0E, category='sm', description='INTEGRAL WITH DOUBLE STROKE' },
+ [0x2A0F] = { unicodeslot=0x2A0F, category='sm', description='INTEGRAL AVERAGE WITH SLASH' },
+ [0x2A10] = { unicodeslot=0x2A10, category='sm', description='CIRCULATION FUNCTION' },
+ [0x2A11] = { unicodeslot=0x2A11, category='sm', description='ANTICLOCKWISE INTEGRATION' },
+ [0x2A12] = { unicodeslot=0x2A12, category='sm', description='LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE' },
+ [0x2A13] = { unicodeslot=0x2A13, category='sm', description='LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE' },
+ [0x2A14] = { unicodeslot=0x2A14, category='sm', description='LINE INTEGRATION NOT INCLUDING THE POLE' },
+ [0x2A15] = { unicodeslot=0x2A15, category='sm', description='INTEGRAL AROUND A POINT OPERATOR' },
+ [0x2A16] = { unicodeslot=0x2A16, category='sm', description='QUATERNION INTEGRAL OPERATOR' },
+ [0x2A17] = { unicodeslot=0x2A17, category='sm', description='INTEGRAL WITH LEFTWARDS ARROW WITH HOOK' },
+ [0x2A18] = { unicodeslot=0x2A18, category='sm', description='INTEGRAL WITH TIMES SIGN' },
+ [0x2A19] = { unicodeslot=0x2A19, category='sm', description='INTEGRAL WITH INTERSECTION' },
+ [0x2A1A] = { unicodeslot=0x2A1A, category='sm', description='INTEGRAL WITH UNION' },
+ [0x2A1B] = { unicodeslot=0x2A1B, category='sm', description='INTEGRAL WITH OVERBAR' },
+ [0x2A1C] = { unicodeslot=0x2A1C, category='sm', description='INTEGRAL WITH UNDERBAR' },
+ [0x2A1D] = { unicodeslot=0x2A1D, category='sm', description='JOIN' },
+ [0x2A1E] = { unicodeslot=0x2A1E, category='sm', description='LARGE LEFT TRIANGLE OPERATOR' },
+ [0x2A1F] = { unicodeslot=0x2A1F, category='sm', description='Z NOTATION SCHEMA COMPOSITION' },
+ [0x2A20] = { unicodeslot=0x2A20, category='sm', description='Z NOTATION SCHEMA PIPING' },
+ [0x2A21] = { unicodeslot=0x2A21, category='sm', description='Z NOTATION SCHEMA PROJECTION' },
+ [0x2A22] = { unicodeslot=0x2A22, category='sm', description='PLUS SIGN WITH SMALL CIRCLE ABOVE' },
+ [0x2A23] = { unicodeslot=0x2A23, category='sm', description='PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE' },
+ [0x2A24] = { unicodeslot=0x2A24, category='sm', description='PLUS SIGN WITH TILDE ABOVE' },
+ [0x2A25] = { unicodeslot=0x2A25, category='sm', description='PLUS SIGN WITH DOT BELOW' },
+ [0x2A26] = { unicodeslot=0x2A26, category='sm', description='PLUS SIGN WITH TILDE BELOW' },
+ [0x2A27] = { unicodeslot=0x2A27, category='sm', description='PLUS SIGN WITH SUBSCRIPT TWO' },
+ [0x2A28] = { unicodeslot=0x2A28, category='sm', description='PLUS SIGN WITH BLACK TRIANGLE' },
+ [0x2A29] = { unicodeslot=0x2A29, category='sm', description='MINUS SIGN WITH COMMA ABOVE' },
+ [0x2A2A] = { unicodeslot=0x2A2A, category='sm', description='MINUS SIGN WITH DOT BELOW' },
+ [0x2A2B] = { unicodeslot=0x2A2B, category='sm', description='MINUS SIGN WITH FALLING DOTS' },
+ [0x2A2C] = { unicodeslot=0x2A2C, category='sm', description='MINUS SIGN WITH RISING DOTS' },
+ [0x2A2D] = { unicodeslot=0x2A2D, category='sm', description='PLUS SIGN IN LEFT HALF CIRCLE' },
+ [0x2A2E] = { unicodeslot=0x2A2E, category='sm', description='PLUS SIGN IN RIGHT HALF CIRCLE' },
+ [0x2A2F] = { unicodeslot=0x2A2F, category='sm', description='VECTOR OR CROSS PRODUCT' },
+ [0x2A30] = { unicodeslot=0x2A30, category='sm', description='MULTIPLICATION SIGN WITH DOT ABOVE' },
+ [0x2A31] = { unicodeslot=0x2A31, category='sm', description='MULTIPLICATION SIGN WITH UNDERBAR' },
+ [0x2A32] = { unicodeslot=0x2A32, category='sm', description='SEMIDIRECT PRODUCT WITH BOTTOM CLOSED' },
+ [0x2A33] = { unicodeslot=0x2A33, category='sm', description='SMASH PRODUCT' },
+ [0x2A34] = { unicodeslot=0x2A34, category='sm', description='MULTIPLICATION SIGN IN LEFT HALF CIRCLE' },
+ [0x2A35] = { unicodeslot=0x2A35, category='sm', description='MULTIPLICATION SIGN IN RIGHT HALF CIRCLE' },
+ [0x2A36] = { unicodeslot=0x2A36, category='sm', description='CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT' },
+ [0x2A37] = { unicodeslot=0x2A37, category='sm', description='MULTIPLICATION SIGN IN DOUBLE CIRCLE' },
+ [0x2A38] = { unicodeslot=0x2A38, category='sm', description='CIRCLED DIVISION SIGN' },
+ [0x2A39] = { unicodeslot=0x2A39, category='sm', description='PLUS SIGN IN TRIANGLE' },
+ [0x2A3A] = { unicodeslot=0x2A3A, category='sm', description='MINUS SIGN IN TRIANGLE' },
+ [0x2A3B] = { unicodeslot=0x2A3B, category='sm', description='MULTIPLICATION SIGN IN TRIANGLE' },
+ [0x2A3C] = { unicodeslot=0x2A3C, category='sm', description='INTERIOR PRODUCT' },
+ [0x2A3D] = { unicodeslot=0x2A3D, category='sm', description='RIGHTHAND INTERIOR PRODUCT' },
+ [0x2A3E] = { unicodeslot=0x2A3E, category='sm', description='Z NOTATION RELATIONAL COMPOSITION' },
+ [0x2A3F] = { unicodeslot=0x2A3F, category='sm', description='AMALGAMATION OR COPRODUCT' },
+ [0x2A40] = { unicodeslot=0x2A40, category='sm', description='INTERSECTION WITH DOT' },
+ [0x2A41] = { unicodeslot=0x2A41, category='sm', description='UNION WITH MINUS SIGN' },
+ [0x2A42] = { unicodeslot=0x2A42, category='sm', description='UNION WITH OVERBAR' },
+ [0x2A43] = { unicodeslot=0x2A43, category='sm', description='INTERSECTION WITH OVERBAR' },
+ [0x2A44] = { unicodeslot=0x2A44, category='sm', description='INTERSECTION WITH LOGICAL AND' },
+ [0x2A45] = { unicodeslot=0x2A45, category='sm', description='UNION WITH LOGICAL OR' },
+ [0x2A46] = { unicodeslot=0x2A46, category='sm', description='UNION ABOVE INTERSECTION' },
+ [0x2A47] = { unicodeslot=0x2A47, category='sm', description='INTERSECTION ABOVE UNION' },
+ [0x2A48] = { unicodeslot=0x2A48, category='sm', description='UNION ABOVE BAR ABOVE INTERSECTION' },
+ [0x2A49] = { unicodeslot=0x2A49, category='sm', description='INTERSECTION ABOVE BAR ABOVE UNION' },
+ [0x2A4A] = { unicodeslot=0x2A4A, category='sm', description='UNION BESIDE AND JOINED WITH UNION' },
+ [0x2A4B] = { unicodeslot=0x2A4B, category='sm', description='INTERSECTION BESIDE AND JOINED WITH INTERSECTION' },
+ [0x2A4C] = { unicodeslot=0x2A4C, category='sm', description='CLOSED UNION WITH SERIFS' },
+ [0x2A4D] = { unicodeslot=0x2A4D, category='sm', description='CLOSED INTERSECTION WITH SERIFS' },
+ [0x2A4E] = { unicodeslot=0x2A4E, category='sm', description='DOUBLE SQUARE INTERSECTION' },
+ [0x2A4F] = { unicodeslot=0x2A4F, category='sm', description='DOUBLE SQUARE UNION' },
+ [0x2A50] = { unicodeslot=0x2A50, category='sm', description='CLOSED UNION WITH SERIFS AND SMASH PRODUCT' },
+ [0x2A51] = { unicodeslot=0x2A51, category='sm', description='LOGICAL AND WITH DOT ABOVE' },
+ [0x2A52] = { unicodeslot=0x2A52, category='sm', description='LOGICAL OR WITH DOT ABOVE' },
+ [0x2A53] = { unicodeslot=0x2A53, category='sm', description='DOUBLE LOGICAL AND' },
+ [0x2A54] = { unicodeslot=0x2A54, category='sm', description='DOUBLE LOGICAL OR' },
+ [0x2A55] = { unicodeslot=0x2A55, category='sm', description='TWO INTERSECTING LOGICAL AND' },
+ [0x2A56] = { unicodeslot=0x2A56, category='sm', description='TWO INTERSECTING LOGICAL OR' },
+ [0x2A57] = { unicodeslot=0x2A57, category='sm', description='SLOPING LARGE OR' },
+ [0x2A58] = { unicodeslot=0x2A58, category='sm', description='SLOPING LARGE AND' },
+ [0x2A59] = { unicodeslot=0x2A59, category='sm', description='LOGICAL OR OVERLAPPING LOGICAL AND' },
+ [0x2A5A] = { unicodeslot=0x2A5A, category='sm', description='LOGICAL AND WITH MIDDLE STEM' },
+ [0x2A5B] = { unicodeslot=0x2A5B, category='sm', description='LOGICAL OR WITH MIDDLE STEM' },
+ [0x2A5C] = { unicodeslot=0x2A5C, category='sm', description='LOGICAL AND WITH HORIZONTAL DASH' },
+ [0x2A5D] = { unicodeslot=0x2A5D, category='sm', description='LOGICAL OR WITH HORIZONTAL DASH' },
+ [0x2A5E] = { unicodeslot=0x2A5E, category='sm', description='LOGICAL AND WITH DOUBLE OVERBAR' },
+ [0x2A5F] = { unicodeslot=0x2A5F, category='sm', description='LOGICAL AND WITH UNDERBAR' },
+ [0x2A60] = { unicodeslot=0x2A60, category='sm', description='LOGICAL AND WITH DOUBLE UNDERBAR' },
+ [0x2A61] = { unicodeslot=0x2A61, category='sm', description='SMALL VEE WITH UNDERBAR' },
+ [0x2A62] = { unicodeslot=0x2A62, category='sm', description='LOGICAL OR WITH DOUBLE OVERBAR' },
+ [0x2A63] = { unicodeslot=0x2A63, category='sm', description='LOGICAL OR WITH DOUBLE UNDERBAR' },
+ [0x2A64] = { unicodeslot=0x2A64, category='sm', description='Z NOTATION DOMAIN ANTIRESTRICTION' },
+ [0x2A65] = { unicodeslot=0x2A65, category='sm', description='Z NOTATION RANGE ANTIRESTRICTION' },
+ [0x2A66] = { unicodeslot=0x2A66, category='sm', description='EQUALS SIGN WITH DOT BELOW' },
+ [0x2A67] = { unicodeslot=0x2A67, category='sm', description='IDENTICAL WITH DOT ABOVE' },
+ [0x2A68] = { unicodeslot=0x2A68, category='sm', description='TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE' },
+ [0x2A69] = { unicodeslot=0x2A69, category='sm', description='TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE' },
+ [0x2A6A] = { unicodeslot=0x2A6A, category='sm', description='TILDE OPERATOR WITH DOT ABOVE' },
+ [0x2A6B] = { unicodeslot=0x2A6B, category='sm', description='TILDE OPERATOR WITH RISING DOTS' },
+ [0x2A6C] = { unicodeslot=0x2A6C, category='sm', description='SIMILAR MINUS SIMILAR' },
+ [0x2A6D] = { unicodeslot=0x2A6D, category='sm', description='CONGRUENT WITH DOT ABOVE' },
+ [0x2A6E] = { unicodeslot=0x2A6E, category='sm', description='EQUALS WITH ASTERISK' },
+ [0x2A6F] = { unicodeslot=0x2A6F, category='sm', description='ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT' },
+ [0x2A70] = { unicodeslot=0x2A70, category='sm', description='APPROXIMATELY EQUAL OR EQUAL TO' },
+ [0x2A71] = { unicodeslot=0x2A71, category='sm', description='EQUALS SIGN ABOVE PLUS SIGN' },
+ [0x2A72] = { unicodeslot=0x2A72, category='sm', description='PLUS SIGN ABOVE EQUALS SIGN' },
+ [0x2A73] = { unicodeslot=0x2A73, category='sm', description='EQUALS SIGN ABOVE TILDE OPERATOR' },
+ [0x2A74] = { unicodeslot=0x2A74, category='sm', description='DOUBLE COLON EQUAL', specials={'compat',0x003A,0x003A,0x003D} },
+ [0x2A75] = { unicodeslot=0x2A75, category='sm', description='TWO CONSECUTIVE EQUALS SIGNS', specials={'compat',0x003D,0x003D} },
+ [0x2A76] = { unicodeslot=0x2A76, category='sm', description='THREE CONSECUTIVE EQUALS SIGNS', specials={'compat',0x003D,0x003D,0x003D} },
+ [0x2A77] = { unicodeslot=0x2A77, category='sm', description='EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW' },
+ [0x2A78] = { unicodeslot=0x2A78, category='sm', description='EQUIVALENT WITH FOUR DOTS ABOVE' },
+ [0x2A79] = { unicodeslot=0x2A79, category='sm', description='LESS-THAN WITH CIRCLE INSIDE' },
+ [0x2A7A] = { unicodeslot=0x2A7A, category='sm', description='GREATER-THAN WITH CIRCLE INSIDE' },
+ [0x2A7B] = { unicodeslot=0x2A7B, category='sm', description='LESS-THAN WITH QUESTION MARK ABOVE' },
+ [0x2A7C] = { unicodeslot=0x2A7C, category='sm', description='GREATER-THAN WITH QUESTION MARK ABOVE' },
+ [0x2A7D] = { unicodeslot=0x2A7D, category='sm', description='LESS-THAN OR SLANTED EQUAL TO' },
+ [0x2A7E] = { unicodeslot=0x2A7E, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO' },
+ [0x2A7F] = { unicodeslot=0x2A7F, category='sm', description='LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE' },
+ [0x2A80] = { unicodeslot=0x2A80, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE' },
+ [0x2A81] = { unicodeslot=0x2A81, category='sm', description='LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE' },
+ [0x2A82] = { unicodeslot=0x2A82, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE' },
+ [0x2A83] = { unicodeslot=0x2A83, category='sm', description='LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT' },
+ [0x2A84] = { unicodeslot=0x2A84, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT' },
+ [0x2A85] = { unicodeslot=0x2A85, category='sm', description='LESS-THAN OR APPROXIMATE' },
+ [0x2A86] = { unicodeslot=0x2A86, category='sm', description='GREATER-THAN OR APPROXIMATE' },
+ [0x2A87] = { unicodeslot=0x2A87, category='sm', description='LESS-THAN AND SINGLE-LINE NOT EQUAL TO' },
+ [0x2A88] = { unicodeslot=0x2A88, category='sm', description='GREATER-THAN AND SINGLE-LINE NOT EQUAL TO' },
+ [0x2A89] = { unicodeslot=0x2A89, category='sm', description='LESS-THAN AND NOT APPROXIMATE' },
+ [0x2A8A] = { unicodeslot=0x2A8A, category='sm', description='GREATER-THAN AND NOT APPROXIMATE' },
+ [0x2A8B] = { unicodeslot=0x2A8B, category='sm', description='LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN' },
+ [0x2A8C] = { unicodeslot=0x2A8C, category='sm', description='GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN' },
+ [0x2A8D] = { unicodeslot=0x2A8D, category='sm', description='LESS-THAN ABOVE SIMILAR OR EQUAL' },
+ [0x2A8E] = { unicodeslot=0x2A8E, category='sm', description='GREATER-THAN ABOVE SIMILAR OR EQUAL' },
+ [0x2A8F] = { unicodeslot=0x2A8F, category='sm', description='LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN' },
+ [0x2A90] = { unicodeslot=0x2A90, category='sm', description='GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN' },
+ [0x2A91] = { unicodeslot=0x2A91, category='sm', description='LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL' },
+ [0x2A92] = { unicodeslot=0x2A92, category='sm', description='GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL' },
+ [0x2A93] = { unicodeslot=0x2A93, category='sm', description='LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL' },
+ [0x2A94] = { unicodeslot=0x2A94, category='sm', description='GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL' },
+ [0x2A95] = { unicodeslot=0x2A95, category='sm', description='SLANTED EQUAL TO OR LESS-THAN' },
+ [0x2A96] = { unicodeslot=0x2A96, category='sm', description='SLANTED EQUAL TO OR GREATER-THAN' },
+ [0x2A97] = { unicodeslot=0x2A97, category='sm', description='SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE' },
+ [0x2A98] = { unicodeslot=0x2A98, category='sm', description='SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE' },
+ [0x2A99] = { unicodeslot=0x2A99, category='sm', description='DOUBLE-LINE EQUAL TO OR LESS-THAN' },
+ [0x2A9A] = { unicodeslot=0x2A9A, category='sm', description='DOUBLE-LINE EQUAL TO OR GREATER-THAN' },
+ [0x2A9B] = { unicodeslot=0x2A9B, category='sm', description='DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN' },
+ [0x2A9C] = { unicodeslot=0x2A9C, category='sm', description='DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN' },
+ [0x2A9D] = { unicodeslot=0x2A9D, category='sm', description='SIMILAR OR LESS-THAN' },
+ [0x2A9E] = { unicodeslot=0x2A9E, category='sm', description='SIMILAR OR GREATER-THAN' },
+ [0x2A9F] = { unicodeslot=0x2A9F, category='sm', description='SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN' },
+ [0x2AA0] = { unicodeslot=0x2AA0, category='sm', description='SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN' },
+ [0x2AA1] = { unicodeslot=0x2AA1, category='sm', description='DOUBLE NESTED LESS-THAN' },
+ [0x2AA2] = { unicodeslot=0x2AA2, category='sm', description='DOUBLE NESTED GREATER-THAN' },
+ [0x2AA3] = { unicodeslot=0x2AA3, category='sm', description='DOUBLE NESTED LESS-THAN WITH UNDERBAR' },
+ [0x2AA4] = { unicodeslot=0x2AA4, category='sm', description='GREATER-THAN OVERLAPPING LESS-THAN' },
+ [0x2AA5] = { unicodeslot=0x2AA5, category='sm', description='GREATER-THAN BESIDE LESS-THAN' },
+ [0x2AA6] = { unicodeslot=0x2AA6, category='sm', description='LESS-THAN CLOSED BY CURVE' },
+ [0x2AA7] = { unicodeslot=0x2AA7, category='sm', description='GREATER-THAN CLOSED BY CURVE' },
+ [0x2AA8] = { unicodeslot=0x2AA8, category='sm', description='LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL' },
+ [0x2AA9] = { unicodeslot=0x2AA9, category='sm', description='GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL' },
+ [0x2AAA] = { unicodeslot=0x2AAA, category='sm', description='SMALLER THAN' },
+ [0x2AAB] = { unicodeslot=0x2AAB, category='sm', description='LARGER THAN' },
+ [0x2AAC] = { unicodeslot=0x2AAC, category='sm', description='SMALLER THAN OR EQUAL TO' },
+ [0x2AAD] = { unicodeslot=0x2AAD, category='sm', description='LARGER THAN OR EQUAL TO' },
+ [0x2AAE] = { unicodeslot=0x2AAE, category='sm', description='EQUALS SIGN WITH BUMPY ABOVE' },
+ [0x2AAF] = { unicodeslot=0x2AAF, category='sm', description='PRECEDES ABOVE SINGLE-LINE EQUALS SIGN' },
+ [0x2AB0] = { unicodeslot=0x2AB0, category='sm', description='SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN' },
+ [0x2AB1] = { unicodeslot=0x2AB1, category='sm', description='PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO' },
+ [0x2AB2] = { unicodeslot=0x2AB2, category='sm', description='SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO' },
+ [0x2AB3] = { unicodeslot=0x2AB3, category='sm', description='PRECEDES ABOVE EQUALS SIGN' },
+ [0x2AB4] = { unicodeslot=0x2AB4, category='sm', description='SUCCEEDS ABOVE EQUALS SIGN' },
+ [0x2AB5] = { unicodeslot=0x2AB5, category='sm', description='PRECEDES ABOVE NOT EQUAL TO' },
+ [0x2AB6] = { unicodeslot=0x2AB6, category='sm', description='SUCCEEDS ABOVE NOT EQUAL TO' },
+ [0x2AB7] = { unicodeslot=0x2AB7, category='sm', description='PRECEDES ABOVE ALMOST EQUAL TO' },
+ [0x2AB8] = { unicodeslot=0x2AB8, category='sm', description='SUCCEEDS ABOVE ALMOST EQUAL TO' },
+ [0x2AB9] = { unicodeslot=0x2AB9, category='sm', description='PRECEDES ABOVE NOT ALMOST EQUAL TO' },
+ [0x2ABA] = { unicodeslot=0x2ABA, category='sm', description='SUCCEEDS ABOVE NOT ALMOST EQUAL TO' },
+ [0x2ABB] = { unicodeslot=0x2ABB, category='sm', description='DOUBLE PRECEDES' },
+ [0x2ABC] = { unicodeslot=0x2ABC, category='sm', description='DOUBLE SUCCEEDS' },
+ [0x2ABD] = { unicodeslot=0x2ABD, category='sm', description='SUBSET WITH DOT' },
+ [0x2ABE] = { unicodeslot=0x2ABE, category='sm', description='SUPERSET WITH DOT' },
+ [0x2ABF] = { unicodeslot=0x2ABF, category='sm', description='SUBSET WITH PLUS SIGN BELOW' },
+ [0x2AC0] = { unicodeslot=0x2AC0, category='sm', description='SUPERSET WITH PLUS SIGN BELOW' },
+ [0x2AC1] = { unicodeslot=0x2AC1, category='sm', description='SUBSET WITH MULTIPLICATION SIGN BELOW' },
+ [0x2AC2] = { unicodeslot=0x2AC2, category='sm', description='SUPERSET WITH MULTIPLICATION SIGN BELOW' },
+ [0x2AC3] = { unicodeslot=0x2AC3, category='sm', description='SUBSET OF OR EQUAL TO WITH DOT ABOVE' },
+ [0x2AC4] = { unicodeslot=0x2AC4, category='sm', description='SUPERSET OF OR EQUAL TO WITH DOT ABOVE' },
+ [0x2AC5] = { unicodeslot=0x2AC5, category='sm', description='SUBSET OF ABOVE EQUALS SIGN' },
+ [0x2AC6] = { unicodeslot=0x2AC6, category='sm', description='SUPERSET OF ABOVE EQUALS SIGN' },
+ [0x2AC7] = { unicodeslot=0x2AC7, category='sm', description='SUBSET OF ABOVE TILDE OPERATOR' },
+ [0x2AC8] = { unicodeslot=0x2AC8, category='sm', description='SUPERSET OF ABOVE TILDE OPERATOR' },
+ [0x2AC9] = { unicodeslot=0x2AC9, category='sm', description='SUBSET OF ABOVE ALMOST EQUAL TO' },
+ [0x2ACA] = { unicodeslot=0x2ACA, category='sm', description='SUPERSET OF ABOVE ALMOST EQUAL TO' },
+ [0x2ACB] = { unicodeslot=0x2ACB, category='sm', description='SUBSET OF ABOVE NOT EQUAL TO' },
+ [0x2ACC] = { unicodeslot=0x2ACC, category='sm', description='SUPERSET OF ABOVE NOT EQUAL TO' },
+ [0x2ACD] = { unicodeslot=0x2ACD, category='sm', description='SQUARE LEFT OPEN BOX OPERATOR' },
+ [0x2ACE] = { unicodeslot=0x2ACE, category='sm', description='SQUARE RIGHT OPEN BOX OPERATOR' },
+ [0x2ACF] = { unicodeslot=0x2ACF, category='sm', description='CLOSED SUBSET' },
+ [0x2AD0] = { unicodeslot=0x2AD0, category='sm', description='CLOSED SUPERSET' },
+ [0x2AD1] = { unicodeslot=0x2AD1, category='sm', description='CLOSED SUBSET OR EQUAL TO' },
+ [0x2AD2] = { unicodeslot=0x2AD2, category='sm', description='CLOSED SUPERSET OR EQUAL TO' },
+ [0x2AD3] = { unicodeslot=0x2AD3, category='sm', description='SUBSET ABOVE SUPERSET' },
+ [0x2AD4] = { unicodeslot=0x2AD4, category='sm', description='SUPERSET ABOVE SUBSET' },
+ [0x2AD5] = { unicodeslot=0x2AD5, category='sm', description='SUBSET ABOVE SUBSET' },
+ [0x2AD6] = { unicodeslot=0x2AD6, category='sm', description='SUPERSET ABOVE SUPERSET' },
+ [0x2AD7] = { unicodeslot=0x2AD7, category='sm', description='SUPERSET BESIDE SUBSET' },
+ [0x2AD8] = { unicodeslot=0x2AD8, category='sm', description='SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET' },
+ [0x2AD9] = { unicodeslot=0x2AD9, category='sm', description='ELEMENT OF OPENING DOWNWARDS' },
+ [0x2ADA] = { unicodeslot=0x2ADA, category='sm', description='PITCHFORK WITH TEE TOP' },
+ [0x2ADB] = { unicodeslot=0x2ADB, category='sm', description='TRANSVERSAL INTERSECTION' },
+ [0x2ADC] = { unicodeslot=0x2ADC, category='sm', description='FORKING', specials={'char',0x2ADD,0x0338} },
+ [0x2ADD] = { unicodeslot=0x2ADD, category='sm', description='NONFORKING' },
+ [0x2ADE] = { unicodeslot=0x2ADE, category='sm', description='SHORT LEFT TACK' },
+ [0x2ADF] = { unicodeslot=0x2ADF, category='sm', description='SHORT DOWN TACK' },
+ [0x2AE0] = { unicodeslot=0x2AE0, category='sm', description='SHORT UP TACK' },
+ [0x2AE1] = { unicodeslot=0x2AE1, category='sm', description='PERPENDICULAR WITH S' },
+ [0x2AE2] = { unicodeslot=0x2AE2, category='sm', description='VERTICAL BAR TRIPLE RIGHT TURNSTILE' },
+ [0x2AE3] = { unicodeslot=0x2AE3, category='sm', description='DOUBLE VERTICAL BAR LEFT TURNSTILE' },
+ [0x2AE4] = { unicodeslot=0x2AE4, category='sm', description='VERTICAL BAR DOUBLE LEFT TURNSTILE' },
+ [0x2AE5] = { unicodeslot=0x2AE5, category='sm', description='DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE' },
+ [0x2AE6] = { unicodeslot=0x2AE6, category='sm', description='LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL' },
+ [0x2AE7] = { unicodeslot=0x2AE7, category='sm', description='SHORT DOWN TACK WITH OVERBAR' },
+ [0x2AE8] = { unicodeslot=0x2AE8, category='sm', description='SHORT UP TACK WITH UNDERBAR' },
+ [0x2AE9] = { unicodeslot=0x2AE9, category='sm', description='SHORT UP TACK ABOVE SHORT DOWN TACK' },
+ [0x2AEA] = { unicodeslot=0x2AEA, category='sm', description='DOUBLE DOWN TACK' },
+ [0x2AEB] = { unicodeslot=0x2AEB, category='sm', description='DOUBLE UP TACK' },
+ [0x2AEC] = { unicodeslot=0x2AEC, category='sm', description='DOUBLE STROKE NOT SIGN' },
+ [0x2AED] = { unicodeslot=0x2AED, category='sm', description='REVERSED DOUBLE STROKE NOT SIGN' },
+ [0x2AEE] = { unicodeslot=0x2AEE, category='sm', description='DOES NOT DIVIDE WITH REVERSED NEGATION SLASH' },
+ [0x2AEF] = { unicodeslot=0x2AEF, category='sm', description='VERTICAL LINE WITH CIRCLE ABOVE' },
+ [0x2AF0] = { unicodeslot=0x2AF0, category='sm', description='VERTICAL LINE WITH CIRCLE BELOW' },
+ [0x2AF1] = { unicodeslot=0x2AF1, category='sm', description='DOWN TACK WITH CIRCLE BELOW' },
+ [0x2AF2] = { unicodeslot=0x2AF2, category='sm', description='PARALLEL WITH HORIZONTAL STROKE' },
+ [0x2AF3] = { unicodeslot=0x2AF3, category='sm', description='PARALLEL WITH TILDE OPERATOR' },
+ [0x2AF4] = { unicodeslot=0x2AF4, category='sm', description='TRIPLE VERTICAL BAR BINARY RELATION' },
+ [0x2AF5] = { unicodeslot=0x2AF5, category='sm', description='TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE' },
+ [0x2AF6] = { unicodeslot=0x2AF6, category='sm', description='TRIPLE COLON OPERATOR' },
+ [0x2AF7] = { unicodeslot=0x2AF7, category='sm', description='TRIPLE NESTED LESS-THAN' },
+ [0x2AF8] = { unicodeslot=0x2AF8, category='sm', description='TRIPLE NESTED GREATER-THAN' },
+ [0x2AF9] = { unicodeslot=0x2AF9, category='sm', description='DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO' },
+ [0x2AFA] = { unicodeslot=0x2AFA, category='sm', description='DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO' },
+ [0x2AFB] = { unicodeslot=0x2AFB, category='sm', description='TRIPLE SOLIDUS BINARY RELATION' },
+ [0x2AFC] = { unicodeslot=0x2AFC, category='sm', description='LARGE TRIPLE VERTICAL BAR OPERATOR' },
+ [0x2AFD] = { unicodeslot=0x2AFD, category='sm', description='DOUBLE SOLIDUS OPERATOR' },
+ [0x2AFE] = { unicodeslot=0x2AFE, category='sm', description='WHITE VERTICAL BAR' },
+ [0x2AFF] = { unicodeslot=0x2AFF, category='sm', description='N-ARY WHITE VERTICAL BAR' },
+ [0x2B00] = { unicodeslot=0x2B00, category='so', description='NORTH EAST WHITE ARROW' },
+ [0x2B01] = { unicodeslot=0x2B01, category='so', description='NORTH WEST WHITE ARROW' },
+ [0x2B02] = { unicodeslot=0x2B02, category='so', description='SOUTH EAST WHITE ARROW' },
+ [0x2B03] = { unicodeslot=0x2B03, category='so', description='SOUTH WEST WHITE ARROW' },
+ [0x2B04] = { unicodeslot=0x2B04, category='so', description='LEFT RIGHT WHITE ARROW' },
+ [0x2B05] = { unicodeslot=0x2B05, category='so', description='LEFTWARDS BLACK ARROW' },
+ [0x2B06] = { unicodeslot=0x2B06, category='so', description='UPWARDS BLACK ARROW' },
+ [0x2B07] = { unicodeslot=0x2B07, category='so', description='DOWNWARDS BLACK ARROW' },
+ [0x2B08] = { unicodeslot=0x2B08, category='so', description='NORTH EAST BLACK ARROW' },
+ [0x2B09] = { unicodeslot=0x2B09, category='so', description='NORTH WEST BLACK ARROW' },
+ [0x2B0A] = { unicodeslot=0x2B0A, category='so', description='SOUTH EAST BLACK ARROW' },
+ [0x2B0B] = { unicodeslot=0x2B0B, category='so', description='SOUTH WEST BLACK ARROW' },
+ [0x2B0C] = { unicodeslot=0x2B0C, category='so', description='LEFT RIGHT BLACK ARROW' },
+ [0x2B0D] = { unicodeslot=0x2B0D, category='so', description='UP DOWN BLACK ARROW' },
+ [0x2B0E] = { unicodeslot=0x2B0E, category='so', description='RIGHTWARDS ARROW WITH TIP DOWNWARDS' },
+ [0x2B0F] = { unicodeslot=0x2B0F, category='so', description='RIGHTWARDS ARROW WITH TIP UPWARDS' },
+ [0x2B10] = { unicodeslot=0x2B10, category='so', description='LEFTWARDS ARROW WITH TIP DOWNWARDS' },
+ [0x2B11] = { unicodeslot=0x2B11, category='so', description='LEFTWARDS ARROW WITH TIP UPWARDS' },
+ [0x2B12] = { unicodeslot=0x2B12, category='so', description='SQUARE WITH TOP HALF BLACK' },
+ [0x2B13] = { unicodeslot=0x2B13, category='so', description='SQUARE WITH BOTTOM HALF BLACK' },
+ [0x2B14] = { unicodeslot=0x2B14, category='so', description='SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK' },
+ [0x2B15] = { unicodeslot=0x2B15, category='so', description='SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK' },
+ [0x2B16] = { unicodeslot=0x2B16, category='so', description='DIAMOND WITH LEFT HALF BLACK' },
+ [0x2B17] = { unicodeslot=0x2B17, category='so', description='DIAMOND WITH RIGHT HALF BLACK' },
+ [0x2B18] = { unicodeslot=0x2B18, category='so', description='DIAMOND WITH TOP HALF BLACK' },
+ [0x2B19] = { unicodeslot=0x2B19, category='so', description='DIAMOND WITH BOTTOM HALF BLACK' },
+ [0x2B1A] = { unicodeslot=0x2B1A, category='so', description='DOTTED SQUARE' },
+ [0x2B20] = { unicodeslot=0x2B20, category='so', description='WHITE PENTAGON' },
+ [0x2B21] = { unicodeslot=0x2B21, category='so', description='WHITE HEXAGON' },
+ [0x2B22] = { unicodeslot=0x2B22, category='so', description='BLACK HEXAGON' },
+ [0x2B23] = { unicodeslot=0x2B23, category='so', description='HORIZONTAL BLACK HEXAGON' },
+ [0x2C00] = { unicodeslot=0x2C00, category='lu', description='GLAGOLITIC CAPITAL LETTER AZU', lccode=0x2C30 },
+ [0x2C01] = { unicodeslot=0x2C01, category='lu', description='GLAGOLITIC CAPITAL LETTER BUKY', lccode=0x2C31 },
+ [0x2C02] = { unicodeslot=0x2C02, category='lu', description='GLAGOLITIC CAPITAL LETTER VEDE', lccode=0x2C32 },
+ [0x2C03] = { unicodeslot=0x2C03, category='lu', description='GLAGOLITIC CAPITAL LETTER GLAGOLI', lccode=0x2C33 },
+ [0x2C04] = { unicodeslot=0x2C04, category='lu', description='GLAGOLITIC CAPITAL LETTER DOBRO', lccode=0x2C34 },
+ [0x2C05] = { unicodeslot=0x2C05, category='lu', description='GLAGOLITIC CAPITAL LETTER YESTU', lccode=0x2C35 },
+ [0x2C06] = { unicodeslot=0x2C06, category='lu', description='GLAGOLITIC CAPITAL LETTER ZHIVETE', lccode=0x2C36 },
+ [0x2C07] = { unicodeslot=0x2C07, category='lu', description='GLAGOLITIC CAPITAL LETTER DZELO', lccode=0x2C37 },
+ [0x2C08] = { unicodeslot=0x2C08, category='lu', description='GLAGOLITIC CAPITAL LETTER ZEMLJA', lccode=0x2C38 },
+ [0x2C09] = { unicodeslot=0x2C09, category='lu', description='GLAGOLITIC CAPITAL LETTER IZHE', lccode=0x2C39 },
+ [0x2C0A] = { unicodeslot=0x2C0A, category='lu', description='GLAGOLITIC CAPITAL LETTER INITIAL IZHE', lccode=0x2C3A },
+ [0x2C0B] = { unicodeslot=0x2C0B, category='lu', description='GLAGOLITIC CAPITAL LETTER I', lccode=0x2C3B },
+ [0x2C0C] = { unicodeslot=0x2C0C, category='lu', description='GLAGOLITIC CAPITAL LETTER DJERVI', lccode=0x2C3C },
+ [0x2C0D] = { unicodeslot=0x2C0D, category='lu', description='GLAGOLITIC CAPITAL LETTER KAKO', lccode=0x2C3D },
+ [0x2C0E] = { unicodeslot=0x2C0E, category='lu', description='GLAGOLITIC CAPITAL LETTER LJUDIJE', lccode=0x2C3E },
+ [0x2C0F] = { unicodeslot=0x2C0F, category='lu', description='GLAGOLITIC CAPITAL LETTER MYSLITE', lccode=0x2C3F },
+ [0x2C10] = { unicodeslot=0x2C10, category='lu', description='GLAGOLITIC CAPITAL LETTER NASHI', lccode=0x2C40 },
+ [0x2C11] = { unicodeslot=0x2C11, category='lu', description='GLAGOLITIC CAPITAL LETTER ONU', lccode=0x2C41 },
+ [0x2C12] = { unicodeslot=0x2C12, category='lu', description='GLAGOLITIC CAPITAL LETTER POKOJI', lccode=0x2C42 },
+ [0x2C13] = { unicodeslot=0x2C13, category='lu', description='GLAGOLITIC CAPITAL LETTER RITSI', lccode=0x2C43 },
+ [0x2C14] = { unicodeslot=0x2C14, category='lu', description='GLAGOLITIC CAPITAL LETTER SLOVO', lccode=0x2C44 },
+ [0x2C15] = { unicodeslot=0x2C15, category='lu', description='GLAGOLITIC CAPITAL LETTER TVRIDO', lccode=0x2C45 },
+ [0x2C16] = { unicodeslot=0x2C16, category='lu', description='GLAGOLITIC CAPITAL LETTER UKU', lccode=0x2C46 },
+ [0x2C17] = { unicodeslot=0x2C17, category='lu', description='GLAGOLITIC CAPITAL LETTER FRITU', lccode=0x2C47 },
+ [0x2C18] = { unicodeslot=0x2C18, category='lu', description='GLAGOLITIC CAPITAL LETTER HERU', lccode=0x2C48 },
+ [0x2C19] = { unicodeslot=0x2C19, category='lu', description='GLAGOLITIC CAPITAL LETTER OTU', lccode=0x2C49 },
+ [0x2C1A] = { unicodeslot=0x2C1A, category='lu', description='GLAGOLITIC CAPITAL LETTER PE', lccode=0x2C4A },
+ [0x2C1B] = { unicodeslot=0x2C1B, category='lu', description='GLAGOLITIC CAPITAL LETTER SHTA', lccode=0x2C4B },
+ [0x2C1C] = { unicodeslot=0x2C1C, category='lu', description='GLAGOLITIC CAPITAL LETTER TSI', lccode=0x2C4C },
+ [0x2C1D] = { unicodeslot=0x2C1D, category='lu', description='GLAGOLITIC CAPITAL LETTER CHRIVI', lccode=0x2C4D },
+ [0x2C1E] = { unicodeslot=0x2C1E, category='lu', description='GLAGOLITIC CAPITAL LETTER SHA', lccode=0x2C4E },
+ [0x2C1F] = { unicodeslot=0x2C1F, category='lu', description='GLAGOLITIC CAPITAL LETTER YERU', lccode=0x2C4F },
+ [0x2C20] = { unicodeslot=0x2C20, category='lu', description='GLAGOLITIC CAPITAL LETTER YERI', lccode=0x2C50 },
+ [0x2C21] = { unicodeslot=0x2C21, category='lu', description='GLAGOLITIC CAPITAL LETTER YATI', lccode=0x2C51 },
+ [0x2C22] = { unicodeslot=0x2C22, category='lu', description='GLAGOLITIC CAPITAL LETTER SPIDERY HA', lccode=0x2C52 },
+ [0x2C23] = { unicodeslot=0x2C23, category='lu', description='GLAGOLITIC CAPITAL LETTER YU', lccode=0x2C53 },
+ [0x2C24] = { unicodeslot=0x2C24, category='lu', description='GLAGOLITIC CAPITAL LETTER SMALL YUS', lccode=0x2C54 },
+ [0x2C25] = { unicodeslot=0x2C25, category='lu', description='GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL', lccode=0x2C55 },
+ [0x2C26] = { unicodeslot=0x2C26, category='lu', description='GLAGOLITIC CAPITAL LETTER YO', lccode=0x2C56 },
+ [0x2C27] = { unicodeslot=0x2C27, category='lu', description='GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS', lccode=0x2C57 },
+ [0x2C28] = { unicodeslot=0x2C28, category='lu', description='GLAGOLITIC CAPITAL LETTER BIG YUS', lccode=0x2C58 },
+ [0x2C29] = { unicodeslot=0x2C29, category='lu', description='GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS', lccode=0x2C59 },
+ [0x2C2A] = { unicodeslot=0x2C2A, category='lu', description='GLAGOLITIC CAPITAL LETTER FITA', lccode=0x2C5A },
+ [0x2C2B] = { unicodeslot=0x2C2B, category='lu', description='GLAGOLITIC CAPITAL LETTER IZHITSA', lccode=0x2C5B },
+ [0x2C2C] = { unicodeslot=0x2C2C, category='lu', description='GLAGOLITIC CAPITAL LETTER SHTAPIC', lccode=0x2C5C },
+ [0x2C2D] = { unicodeslot=0x2C2D, category='lu', description='GLAGOLITIC CAPITAL LETTER TROKUTASTI A', lccode=0x2C5D },
+ [0x2C2E] = { unicodeslot=0x2C2E, category='lu', description='GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE', lccode=0x2C5E },
+ [0x2C30] = { unicodeslot=0x2C30, category='ll', description='GLAGOLITIC SMALL LETTER AZU', uccode=0x2C00 },
+ [0x2C31] = { unicodeslot=0x2C31, category='ll', description='GLAGOLITIC SMALL LETTER BUKY', uccode=0x2C01 },
+ [0x2C32] = { unicodeslot=0x2C32, category='ll', description='GLAGOLITIC SMALL LETTER VEDE', uccode=0x2C02 },
+ [0x2C33] = { unicodeslot=0x2C33, category='ll', description='GLAGOLITIC SMALL LETTER GLAGOLI', uccode=0x2C03 },
+ [0x2C34] = { unicodeslot=0x2C34, category='ll', description='GLAGOLITIC SMALL LETTER DOBRO', uccode=0x2C04 },
+ [0x2C35] = { unicodeslot=0x2C35, category='ll', description='GLAGOLITIC SMALL LETTER YESTU', uccode=0x2C05 },
+ [0x2C36] = { unicodeslot=0x2C36, category='ll', description='GLAGOLITIC SMALL LETTER ZHIVETE', uccode=0x2C06 },
+ [0x2C37] = { unicodeslot=0x2C37, category='ll', description='GLAGOLITIC SMALL LETTER DZELO', uccode=0x2C07 },
+ [0x2C38] = { unicodeslot=0x2C38, category='ll', description='GLAGOLITIC SMALL LETTER ZEMLJA', uccode=0x2C08 },
+ [0x2C39] = { unicodeslot=0x2C39, category='ll', description='GLAGOLITIC SMALL LETTER IZHE', uccode=0x2C09 },
+ [0x2C3A] = { unicodeslot=0x2C3A, category='ll', description='GLAGOLITIC SMALL LETTER INITIAL IZHE', uccode=0x2C0A },
+ [0x2C3B] = { unicodeslot=0x2C3B, category='ll', description='GLAGOLITIC SMALL LETTER I', uccode=0x2C0B },
+ [0x2C3C] = { unicodeslot=0x2C3C, category='ll', description='GLAGOLITIC SMALL LETTER DJERVI', uccode=0x2C0C },
+ [0x2C3D] = { unicodeslot=0x2C3D, category='ll', description='GLAGOLITIC SMALL LETTER KAKO', uccode=0x2C0D },
+ [0x2C3E] = { unicodeslot=0x2C3E, category='ll', description='GLAGOLITIC SMALL LETTER LJUDIJE', uccode=0x2C0E },
+ [0x2C3F] = { unicodeslot=0x2C3F, category='ll', description='GLAGOLITIC SMALL LETTER MYSLITE', uccode=0x2C0F },
+ [0x2C40] = { unicodeslot=0x2C40, category='ll', description='GLAGOLITIC SMALL LETTER NASHI', uccode=0x2C10 },
+ [0x2C41] = { unicodeslot=0x2C41, category='ll', description='GLAGOLITIC SMALL LETTER ONU', uccode=0x2C11 },
+ [0x2C42] = { unicodeslot=0x2C42, category='ll', description='GLAGOLITIC SMALL LETTER POKOJI', uccode=0x2C12 },
+ [0x2C43] = { unicodeslot=0x2C43, category='ll', description='GLAGOLITIC SMALL LETTER RITSI', uccode=0x2C13 },
+ [0x2C44] = { unicodeslot=0x2C44, category='ll', description='GLAGOLITIC SMALL LETTER SLOVO', uccode=0x2C14 },
+ [0x2C45] = { unicodeslot=0x2C45, category='ll', description='GLAGOLITIC SMALL LETTER TVRIDO', uccode=0x2C15 },
+ [0x2C46] = { unicodeslot=0x2C46, category='ll', description='GLAGOLITIC SMALL LETTER UKU', uccode=0x2C16 },
+ [0x2C47] = { unicodeslot=0x2C47, category='ll', description='GLAGOLITIC SMALL LETTER FRITU', uccode=0x2C17 },
+ [0x2C48] = { unicodeslot=0x2C48, category='ll', description='GLAGOLITIC SMALL LETTER HERU', uccode=0x2C18 },
+ [0x2C49] = { unicodeslot=0x2C49, category='ll', description='GLAGOLITIC SMALL LETTER OTU', uccode=0x2C19 },
+ [0x2C4A] = { unicodeslot=0x2C4A, category='ll', description='GLAGOLITIC SMALL LETTER PE', uccode=0x2C1A },
+ [0x2C4B] = { unicodeslot=0x2C4B, category='ll', description='GLAGOLITIC SMALL LETTER SHTA', uccode=0x2C1B },
+ [0x2C4C] = { unicodeslot=0x2C4C, category='ll', description='GLAGOLITIC SMALL LETTER TSI', uccode=0x2C1C },
+ [0x2C4D] = { unicodeslot=0x2C4D, category='ll', description='GLAGOLITIC SMALL LETTER CHRIVI', uccode=0x2C1D },
+ [0x2C4E] = { unicodeslot=0x2C4E, category='ll', description='GLAGOLITIC SMALL LETTER SHA', uccode=0x2C1E },
+ [0x2C4F] = { unicodeslot=0x2C4F, category='ll', description='GLAGOLITIC SMALL LETTER YERU', uccode=0x2C1F },
+ [0x2C50] = { unicodeslot=0x2C50, category='ll', description='GLAGOLITIC SMALL LETTER YERI', uccode=0x2C20 },
+ [0x2C51] = { unicodeslot=0x2C51, category='ll', description='GLAGOLITIC SMALL LETTER YATI', uccode=0x2C21 },
+ [0x2C52] = { unicodeslot=0x2C52, category='ll', description='GLAGOLITIC SMALL LETTER SPIDERY HA', uccode=0x2C22 },
+ [0x2C53] = { unicodeslot=0x2C53, category='ll', description='GLAGOLITIC SMALL LETTER YU', uccode=0x2C23 },
+ [0x2C54] = { unicodeslot=0x2C54, category='ll', description='GLAGOLITIC SMALL LETTER SMALL YUS', uccode=0x2C24 },
+ [0x2C55] = { unicodeslot=0x2C55, category='ll', description='GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL', uccode=0x2C25 },
+ [0x2C56] = { unicodeslot=0x2C56, category='ll', description='GLAGOLITIC SMALL LETTER YO', uccode=0x2C26 },
+ [0x2C57] = { unicodeslot=0x2C57, category='ll', description='GLAGOLITIC SMALL LETTER IOTATED SMALL YUS', uccode=0x2C27 },
+ [0x2C58] = { unicodeslot=0x2C58, category='ll', description='GLAGOLITIC SMALL LETTER BIG YUS', uccode=0x2C28 },
+ [0x2C59] = { unicodeslot=0x2C59, category='ll', description='GLAGOLITIC SMALL LETTER IOTATED BIG YUS', uccode=0x2C29 },
+ [0x2C5A] = { unicodeslot=0x2C5A, category='ll', description='GLAGOLITIC SMALL LETTER FITA', uccode=0x2C2A },
+ [0x2C5B] = { unicodeslot=0x2C5B, category='ll', description='GLAGOLITIC SMALL LETTER IZHITSA', uccode=0x2C2B },
+ [0x2C5C] = { unicodeslot=0x2C5C, category='ll', description='GLAGOLITIC SMALL LETTER SHTAPIC', uccode=0x2C2C },
+ [0x2C5D] = { unicodeslot=0x2C5D, category='ll', description='GLAGOLITIC SMALL LETTER TROKUTASTI A', uccode=0x2C2D },
+ [0x2C5E] = { unicodeslot=0x2C5E, category='ll', description='GLAGOLITIC SMALL LETTER LATINATE MYSLITE', uccode=0x2C2E },
+ [0x2C60] = { unicodeslot=0x2C60, category='lu', description='LATIN CAPITAL LETTER L WITH DOUBLE BAR', shcode=0x004C, lccode=0x2C61 },
+ [0x2C61] = { unicodeslot=0x2C61, category='ll', description='LATIN SMALL LETTER L WITH DOUBLE BAR', shcode=0x006C, uccode=0x2C60 },
+ [0x2C62] = { unicodeslot=0x2C62, category='lu', description='LATIN CAPITAL LETTER L WITH MIDDLE TILDE', shcode=0x004C, lccode=0x026B },
+ [0x2C63] = { unicodeslot=0x2C63, category='lu', description='LATIN CAPITAL LETTER P WITH STROKE', shcode=0x0050, lccode=0x1D7D },
+ [0x2C64] = { unicodeslot=0x2C64, category='lu', description='LATIN CAPITAL LETTER R WITH TAIL', shcode=0x0052, lccode=0x027D },
+ [0x2C65] = { unicodeslot=0x2C65, category='ll', description='LATIN SMALL LETTER A WITH STROKE', shcode=0x0061, uccode=0x023A },
+ [0x2C66] = { unicodeslot=0x2C66, category='ll', description='LATIN SMALL LETTER T WITH DIAGONAL STROKE', shcode=0x0074, uccode=0x023E },
+ [0x2C67] = { unicodeslot=0x2C67, category='lu', description='LATIN CAPITAL LETTER H WITH DESCENDER', shcode=0x0048, lccode=0x2C68 },
+ [0x2C68] = { unicodeslot=0x2C68, category='ll', description='LATIN SMALL LETTER H WITH DESCENDER', shcode=0x0068, uccode=0x2C67 },
+ [0x2C69] = { unicodeslot=0x2C69, category='lu', description='LATIN CAPITAL LETTER K WITH DESCENDER', shcode=0x004B, lccode=0x2C6A },
+ [0x2C6A] = { unicodeslot=0x2C6A, category='ll', description='LATIN SMALL LETTER K WITH DESCENDER', shcode=0x006B, uccode=0x2C69 },
+ [0x2C6B] = { unicodeslot=0x2C6B, category='lu', description='LATIN CAPITAL LETTER Z WITH DESCENDER', shcode=0x005A, lccode=0x2C6C },
+ [0x2C6C] = { unicodeslot=0x2C6C, category='ll', description='LATIN SMALL LETTER Z WITH DESCENDER', shcode=0x007A, uccode=0x2C6B },
+ [0x2C74] = { unicodeslot=0x2C74, category='ll', description='LATIN SMALL LETTER V WITH CURL', shcode=0x0076 },
+ [0x2C75] = { unicodeslot=0x2C75, category='lu', description='LATIN CAPITAL LETTER HALF H', lccode=0x2C76 },
+ [0x2C76] = { unicodeslot=0x2C76, category='ll', description='LATIN SMALL LETTER HALF H', uccode=0x2C75 },
+ [0x2C77] = { unicodeslot=0x2C77, category='ll', description='LATIN SMALL LETTER TAILLESS PHI' },
+ [0x2C80] = { unicodeslot=0x2C80, category='lu', description='COPTIC CAPITAL LETTER ALFA', lccode=0x2C81 },
+ [0x2C81] = { unicodeslot=0x2C81, category='ll', description='COPTIC SMALL LETTER ALFA', uccode=0x2C80 },
+ [0x2C82] = { unicodeslot=0x2C82, category='lu', description='COPTIC CAPITAL LETTER VIDA', lccode=0x2C83 },
+ [0x2C83] = { unicodeslot=0x2C83, category='ll', description='COPTIC SMALL LETTER VIDA', uccode=0x2C82 },
+ [0x2C84] = { unicodeslot=0x2C84, category='lu', description='COPTIC CAPITAL LETTER GAMMA', lccode=0x2C85 },
+ [0x2C85] = { unicodeslot=0x2C85, category='ll', description='COPTIC SMALL LETTER GAMMA', uccode=0x2C84 },
+ [0x2C86] = { unicodeslot=0x2C86, category='lu', description='COPTIC CAPITAL LETTER DALDA', lccode=0x2C87 },
+ [0x2C87] = { unicodeslot=0x2C87, category='ll', description='COPTIC SMALL LETTER DALDA', uccode=0x2C86 },
+ [0x2C88] = { unicodeslot=0x2C88, category='lu', description='COPTIC CAPITAL LETTER EIE', lccode=0x2C89 },
+ [0x2C89] = { unicodeslot=0x2C89, category='ll', description='COPTIC SMALL LETTER EIE', uccode=0x2C88 },
+ [0x2C8A] = { unicodeslot=0x2C8A, category='lu', description='COPTIC CAPITAL LETTER SOU', lccode=0x2C8B },
+ [0x2C8B] = { unicodeslot=0x2C8B, category='ll', description='COPTIC SMALL LETTER SOU', uccode=0x2C8A },
+ [0x2C8C] = { unicodeslot=0x2C8C, category='lu', description='COPTIC CAPITAL LETTER ZATA', lccode=0x2C8D },
+ [0x2C8D] = { unicodeslot=0x2C8D, category='ll', description='COPTIC SMALL LETTER ZATA', uccode=0x2C8C },
+ [0x2C8E] = { unicodeslot=0x2C8E, category='lu', description='COPTIC CAPITAL LETTER HATE', lccode=0x2C8F },
+ [0x2C8F] = { unicodeslot=0x2C8F, category='ll', description='COPTIC SMALL LETTER HATE', uccode=0x2C8E },
+ [0x2C90] = { unicodeslot=0x2C90, category='lu', description='COPTIC CAPITAL LETTER THETHE', lccode=0x2C91 },
+ [0x2C91] = { unicodeslot=0x2C91, category='ll', description='COPTIC SMALL LETTER THETHE', uccode=0x2C90 },
+ [0x2C92] = { unicodeslot=0x2C92, category='lu', description='COPTIC CAPITAL LETTER IAUDA', lccode=0x2C93 },
+ [0x2C93] = { unicodeslot=0x2C93, category='ll', description='COPTIC SMALL LETTER IAUDA', uccode=0x2C92 },
+ [0x2C94] = { unicodeslot=0x2C94, category='lu', description='COPTIC CAPITAL LETTER KAPA', lccode=0x2C95 },
+ [0x2C95] = { unicodeslot=0x2C95, category='ll', description='COPTIC SMALL LETTER KAPA', uccode=0x2C94 },
+ [0x2C96] = { unicodeslot=0x2C96, category='lu', description='COPTIC CAPITAL LETTER LAULA', lccode=0x2C97 },
+ [0x2C97] = { unicodeslot=0x2C97, category='ll', description='COPTIC SMALL LETTER LAULA', uccode=0x2C96 },
+ [0x2C98] = { unicodeslot=0x2C98, category='lu', description='COPTIC CAPITAL LETTER MI', lccode=0x2C99 },
+ [0x2C99] = { unicodeslot=0x2C99, category='ll', description='COPTIC SMALL LETTER MI', uccode=0x2C98 },
+ [0x2C9A] = { unicodeslot=0x2C9A, category='lu', description='COPTIC CAPITAL LETTER NI', lccode=0x2C9B },
+ [0x2C9B] = { unicodeslot=0x2C9B, category='ll', description='COPTIC SMALL LETTER NI', uccode=0x2C9A },
+ [0x2C9C] = { unicodeslot=0x2C9C, category='lu', description='COPTIC CAPITAL LETTER KSI', lccode=0x2C9D },
+ [0x2C9D] = { unicodeslot=0x2C9D, category='ll', description='COPTIC SMALL LETTER KSI', uccode=0x2C9C },
+ [0x2C9E] = { unicodeslot=0x2C9E, category='lu', description='COPTIC CAPITAL LETTER O', lccode=0x2C9F },
+ [0x2C9F] = { unicodeslot=0x2C9F, category='ll', description='COPTIC SMALL LETTER O', uccode=0x2C9E },
+ [0x2CA0] = { unicodeslot=0x2CA0, category='lu', description='COPTIC CAPITAL LETTER PI', lccode=0x2CA1 },
+ [0x2CA1] = { unicodeslot=0x2CA1, category='ll', description='COPTIC SMALL LETTER PI', uccode=0x2CA0 },
+ [0x2CA2] = { unicodeslot=0x2CA2, category='lu', description='COPTIC CAPITAL LETTER RO', lccode=0x2CA3 },
+ [0x2CA3] = { unicodeslot=0x2CA3, category='ll', description='COPTIC SMALL LETTER RO', uccode=0x2CA2 },
+ [0x2CA4] = { unicodeslot=0x2CA4, category='lu', description='COPTIC CAPITAL LETTER SIMA', lccode=0x2CA5 },
+ [0x2CA5] = { unicodeslot=0x2CA5, category='ll', description='COPTIC SMALL LETTER SIMA', uccode=0x2CA4 },
+ [0x2CA6] = { unicodeslot=0x2CA6, category='lu', description='COPTIC CAPITAL LETTER TAU', lccode=0x2CA7 },
+ [0x2CA7] = { unicodeslot=0x2CA7, category='ll', description='COPTIC SMALL LETTER TAU', uccode=0x2CA6 },
+ [0x2CA8] = { unicodeslot=0x2CA8, category='lu', description='COPTIC CAPITAL LETTER UA', lccode=0x2CA9 },
+ [0x2CA9] = { unicodeslot=0x2CA9, category='ll', description='COPTIC SMALL LETTER UA', uccode=0x2CA8 },
+ [0x2CAA] = { unicodeslot=0x2CAA, category='lu', description='COPTIC CAPITAL LETTER FI', lccode=0x2CAB },
+ [0x2CAB] = { unicodeslot=0x2CAB, category='ll', description='COPTIC SMALL LETTER FI', uccode=0x2CAA },
+ [0x2CAC] = { unicodeslot=0x2CAC, category='lu', description='COPTIC CAPITAL LETTER KHI', lccode=0x2CAD },
+ [0x2CAD] = { unicodeslot=0x2CAD, category='ll', description='COPTIC SMALL LETTER KHI', uccode=0x2CAC },
+ [0x2CAE] = { unicodeslot=0x2CAE, category='lu', description='COPTIC CAPITAL LETTER PSI', lccode=0x2CAF },
+ [0x2CAF] = { unicodeslot=0x2CAF, category='ll', description='COPTIC SMALL LETTER PSI', uccode=0x2CAE },
+ [0x2CB0] = { unicodeslot=0x2CB0, category='lu', description='COPTIC CAPITAL LETTER OOU', lccode=0x2CB1 },
+ [0x2CB1] = { unicodeslot=0x2CB1, category='ll', description='COPTIC SMALL LETTER OOU', uccode=0x2CB0 },
+ [0x2CB2] = { unicodeslot=0x2CB2, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P ALEF', lccode=0x2CB3 },
+ [0x2CB3] = { unicodeslot=0x2CB3, category='ll', description='COPTIC SMALL LETTER DIALECT-P ALEF', uccode=0x2CB2 },
+ [0x2CB4] = { unicodeslot=0x2CB4, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC AIN', lccode=0x2CB5 },
+ [0x2CB5] = { unicodeslot=0x2CB5, category='ll', description='COPTIC SMALL LETTER OLD COPTIC AIN', uccode=0x2CB4 },
+ [0x2CB6] = { unicodeslot=0x2CB6, category='lu', description='COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE', lccode=0x2CB7 },
+ [0x2CB7] = { unicodeslot=0x2CB7, category='ll', description='COPTIC SMALL LETTER CRYPTOGRAMMIC EIE', uccode=0x2CB6 },
+ [0x2CB8] = { unicodeslot=0x2CB8, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P KAPA', lccode=0x2CB9 },
+ [0x2CB9] = { unicodeslot=0x2CB9, category='ll', description='COPTIC SMALL LETTER DIALECT-P KAPA', uccode=0x2CB8 },
+ [0x2CBA] = { unicodeslot=0x2CBA, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P NI', lccode=0x2CBB },
+ [0x2CBB] = { unicodeslot=0x2CBB, category='ll', description='COPTIC SMALL LETTER DIALECT-P NI', uccode=0x2CBA },
+ [0x2CBC] = { unicodeslot=0x2CBC, category='lu', description='COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI', lccode=0x2CBD },
+ [0x2CBD] = { unicodeslot=0x2CBD, category='ll', description='COPTIC SMALL LETTER CRYPTOGRAMMIC NI', uccode=0x2CBC },
+ [0x2CBE] = { unicodeslot=0x2CBE, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC OOU', lccode=0x2CBF },
+ [0x2CBF] = { unicodeslot=0x2CBF, category='ll', description='COPTIC SMALL LETTER OLD COPTIC OOU', uccode=0x2CBE },
+ [0x2CC0] = { unicodeslot=0x2CC0, category='lu', description='COPTIC CAPITAL LETTER SAMPI', lccode=0x2CC1 },
+ [0x2CC1] = { unicodeslot=0x2CC1, category='ll', description='COPTIC SMALL LETTER SAMPI', uccode=0x2CC0 },
+ [0x2CC2] = { unicodeslot=0x2CC2, category='lu', description='COPTIC CAPITAL LETTER CROSSED SHEI', lccode=0x2CC3 },
+ [0x2CC3] = { unicodeslot=0x2CC3, category='ll', description='COPTIC SMALL LETTER CROSSED SHEI', uccode=0x2CC2 },
+ [0x2CC4] = { unicodeslot=0x2CC4, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC SHEI', lccode=0x2CC5 },
+ [0x2CC5] = { unicodeslot=0x2CC5, category='ll', description='COPTIC SMALL LETTER OLD COPTIC SHEI', uccode=0x2CC4 },
+ [0x2CC6] = { unicodeslot=0x2CC6, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC ESH', lccode=0x2CC7 },
+ [0x2CC7] = { unicodeslot=0x2CC7, category='ll', description='COPTIC SMALL LETTER OLD COPTIC ESH', uccode=0x2CC6 },
+ [0x2CC8] = { unicodeslot=0x2CC8, category='lu', description='COPTIC CAPITAL LETTER AKHMIMIC KHEI', lccode=0x2CC9 },
+ [0x2CC9] = { unicodeslot=0x2CC9, category='ll', description='COPTIC SMALL LETTER AKHMIMIC KHEI', uccode=0x2CC8 },
+ [0x2CCA] = { unicodeslot=0x2CCA, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P HORI', lccode=0x2CCB },
+ [0x2CCB] = { unicodeslot=0x2CCB, category='ll', description='COPTIC SMALL LETTER DIALECT-P HORI', uccode=0x2CCA },
+ [0x2CCC] = { unicodeslot=0x2CCC, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HORI', lccode=0x2CCD },
+ [0x2CCD] = { unicodeslot=0x2CCD, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HORI', uccode=0x2CCC },
+ [0x2CCE] = { unicodeslot=0x2CCE, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HA', lccode=0x2CCF },
+ [0x2CCF] = { unicodeslot=0x2CCF, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HA', uccode=0x2CCE },
+ [0x2CD0] = { unicodeslot=0x2CD0, category='lu', description='COPTIC CAPITAL LETTER L-SHAPED HA', lccode=0x2CD1 },
+ [0x2CD1] = { unicodeslot=0x2CD1, category='ll', description='COPTIC SMALL LETTER L-SHAPED HA', uccode=0x2CD0 },
+ [0x2CD2] = { unicodeslot=0x2CD2, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HEI', lccode=0x2CD3 },
+ [0x2CD3] = { unicodeslot=0x2CD3, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HEI', uccode=0x2CD2 },
+ [0x2CD4] = { unicodeslot=0x2CD4, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HAT', lccode=0x2CD5 },
+ [0x2CD5] = { unicodeslot=0x2CD5, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HAT', uccode=0x2CD4 },
+ [0x2CD6] = { unicodeslot=0x2CD6, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC GANGIA', lccode=0x2CD7 },
+ [0x2CD7] = { unicodeslot=0x2CD7, category='ll', description='COPTIC SMALL LETTER OLD COPTIC GANGIA', uccode=0x2CD6 },
+ [0x2CD8] = { unicodeslot=0x2CD8, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC DJA', lccode=0x2CD9 },
+ [0x2CD9] = { unicodeslot=0x2CD9, category='ll', description='COPTIC SMALL LETTER OLD COPTIC DJA', uccode=0x2CD8 },
+ [0x2CDA] = { unicodeslot=0x2CDA, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC SHIMA', lccode=0x2CDB },
+ [0x2CDB] = { unicodeslot=0x2CDB, category='ll', description='COPTIC SMALL LETTER OLD COPTIC SHIMA', uccode=0x2CDA },
+ [0x2CDC] = { unicodeslot=0x2CDC, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN SHIMA', lccode=0x2CDD },
+ [0x2CDD] = { unicodeslot=0x2CDD, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN SHIMA', uccode=0x2CDC },
+ [0x2CDE] = { unicodeslot=0x2CDE, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN NGI', lccode=0x2CDF },
+ [0x2CDF] = { unicodeslot=0x2CDF, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN NGI', uccode=0x2CDE },
+ [0x2CE0] = { unicodeslot=0x2CE0, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN NYI', lccode=0x2CE1 },
+ [0x2CE1] = { unicodeslot=0x2CE1, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN NYI', uccode=0x2CE0 },
+ [0x2CE2] = { unicodeslot=0x2CE2, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN WAU', lccode=0x2CE3 },
+ [0x2CE3] = { unicodeslot=0x2CE3, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN WAU', uccode=0x2CE2 },
+ [0x2CE4] = { unicodeslot=0x2CE4, category='ll', description='COPTIC SYMBOL KAI' },
+ [0x2CE5] = { unicodeslot=0x2CE5, category='so', description='COPTIC SYMBOL MI RO' },
+ [0x2CE6] = { unicodeslot=0x2CE6, category='so', description='COPTIC SYMBOL PI RO' },
+ [0x2CE7] = { unicodeslot=0x2CE7, category='so', description='COPTIC SYMBOL STAUROS' },
+ [0x2CE8] = { unicodeslot=0x2CE8, category='so', description='COPTIC SYMBOL TAU RO' },
+ [0x2CE9] = { unicodeslot=0x2CE9, category='so', description='COPTIC SYMBOL KHI RO' },
+ [0x2CEA] = { unicodeslot=0x2CEA, category='so', description='COPTIC SYMBOL SHIMA SIMA' },
+ [0x2CF9] = { unicodeslot=0x2CF9, category='po', description='COPTIC OLD NUBIAN FULL STOP' },
+ [0x2CFA] = { unicodeslot=0x2CFA, category='po', description='COPTIC OLD NUBIAN DIRECT QUESTION MARK' },
+ [0x2CFB] = { unicodeslot=0x2CFB, category='po', description='COPTIC OLD NUBIAN INDIRECT QUESTION MARK' },
+ [0x2CFC] = { unicodeslot=0x2CFC, category='po', description='COPTIC OLD NUBIAN VERSE DIVIDER' },
+ [0x2CFD] = { unicodeslot=0x2CFD, category='no', description='COPTIC FRACTION ONE HALF' },
+ [0x2CFE] = { unicodeslot=0x2CFE, category='po', description='COPTIC FULL STOP' },
+ [0x2CFF] = { unicodeslot=0x2CFF, category='po', description='COPTIC MORPHOLOGICAL DIVIDER' },
+ [0x2D00] = { unicodeslot=0x2D00, category='ll', description='GEORGIAN SMALL LETTER AN', uccode=0x10A0 },
+ [0x2D01] = { unicodeslot=0x2D01, category='ll', description='GEORGIAN SMALL LETTER BAN', uccode=0x10A1 },
+ [0x2D02] = { unicodeslot=0x2D02, category='ll', description='GEORGIAN SMALL LETTER GAN', uccode=0x10A2 },
+ [0x2D03] = { unicodeslot=0x2D03, category='ll', description='GEORGIAN SMALL LETTER DON', uccode=0x10A3 },
+ [0x2D04] = { unicodeslot=0x2D04, category='ll', description='GEORGIAN SMALL LETTER EN', uccode=0x10A4 },
+ [0x2D05] = { unicodeslot=0x2D05, category='ll', description='GEORGIAN SMALL LETTER VIN', uccode=0x10A5 },
+ [0x2D06] = { unicodeslot=0x2D06, category='ll', description='GEORGIAN SMALL LETTER ZEN', uccode=0x10A6 },
+ [0x2D07] = { unicodeslot=0x2D07, category='ll', description='GEORGIAN SMALL LETTER TAN', uccode=0x10A7 },
+ [0x2D08] = { unicodeslot=0x2D08, category='ll', description='GEORGIAN SMALL LETTER IN', uccode=0x10A8 },
+ [0x2D09] = { unicodeslot=0x2D09, category='ll', description='GEORGIAN SMALL LETTER KAN', uccode=0x10A9 },
+ [0x2D0A] = { unicodeslot=0x2D0A, category='ll', description='GEORGIAN SMALL LETTER LAS', uccode=0x10AA },
+ [0x2D0B] = { unicodeslot=0x2D0B, category='ll', description='GEORGIAN SMALL LETTER MAN', uccode=0x10AB },
+ [0x2D0C] = { unicodeslot=0x2D0C, category='ll', description='GEORGIAN SMALL LETTER NAR', uccode=0x10AC },
+ [0x2D0D] = { unicodeslot=0x2D0D, category='ll', description='GEORGIAN SMALL LETTER ON', uccode=0x10AD },
+ [0x2D0E] = { unicodeslot=0x2D0E, category='ll', description='GEORGIAN SMALL LETTER PAR', uccode=0x10AE },
+ [0x2D0F] = { unicodeslot=0x2D0F, category='ll', description='GEORGIAN SMALL LETTER ZHAR', uccode=0x10AF },
+ [0x2D10] = { unicodeslot=0x2D10, category='ll', description='GEORGIAN SMALL LETTER RAE', uccode=0x10B0 },
+ [0x2D11] = { unicodeslot=0x2D11, category='ll', description='GEORGIAN SMALL LETTER SAN', uccode=0x10B1 },
+ [0x2D12] = { unicodeslot=0x2D12, category='ll', description='GEORGIAN SMALL LETTER TAR', uccode=0x10B2 },
+ [0x2D13] = { unicodeslot=0x2D13, category='ll', description='GEORGIAN SMALL LETTER UN', uccode=0x10B3 },
+ [0x2D14] = { unicodeslot=0x2D14, category='ll', description='GEORGIAN SMALL LETTER PHAR', uccode=0x10B4 },
+ [0x2D15] = { unicodeslot=0x2D15, category='ll', description='GEORGIAN SMALL LETTER KHAR', uccode=0x10B5 },
+ [0x2D16] = { unicodeslot=0x2D16, category='ll', description='GEORGIAN SMALL LETTER GHAN', uccode=0x10B6 },
+ [0x2D17] = { unicodeslot=0x2D17, category='ll', description='GEORGIAN SMALL LETTER QAR', uccode=0x10B7 },
+ [0x2D18] = { unicodeslot=0x2D18, category='ll', description='GEORGIAN SMALL LETTER SHIN', uccode=0x10B8 },
+ [0x2D19] = { unicodeslot=0x2D19, category='ll', description='GEORGIAN SMALL LETTER CHIN', uccode=0x10B9 },
+ [0x2D1A] = { unicodeslot=0x2D1A, category='ll', description='GEORGIAN SMALL LETTER CAN', uccode=0x10BA },
+ [0x2D1B] = { unicodeslot=0x2D1B, category='ll', description='GEORGIAN SMALL LETTER JIL', uccode=0x10BB },
+ [0x2D1C] = { unicodeslot=0x2D1C, category='ll', description='GEORGIAN SMALL LETTER CIL', uccode=0x10BC },
+ [0x2D1D] = { unicodeslot=0x2D1D, category='ll', description='GEORGIAN SMALL LETTER CHAR', uccode=0x10BD },
+ [0x2D1E] = { unicodeslot=0x2D1E, category='ll', description='GEORGIAN SMALL LETTER XAN', uccode=0x10BE },
+ [0x2D1F] = { unicodeslot=0x2D1F, category='ll', description='GEORGIAN SMALL LETTER JHAN', uccode=0x10BF },
+ [0x2D20] = { unicodeslot=0x2D20, category='ll', description='GEORGIAN SMALL LETTER HAE', uccode=0x10C0 },
+ [0x2D21] = { unicodeslot=0x2D21, category='ll', description='GEORGIAN SMALL LETTER HE', uccode=0x10C1 },
+ [0x2D22] = { unicodeslot=0x2D22, category='ll', description='GEORGIAN SMALL LETTER HIE', uccode=0x10C2 },
+ [0x2D23] = { unicodeslot=0x2D23, category='ll', description='GEORGIAN SMALL LETTER WE', uccode=0x10C3 },
+ [0x2D24] = { unicodeslot=0x2D24, category='ll', description='GEORGIAN SMALL LETTER HAR', uccode=0x10C4 },
+ [0x2D25] = { unicodeslot=0x2D25, category='ll', description='GEORGIAN SMALL LETTER HOE', uccode=0x10C5 },
+ [0x2D30] = { unicodeslot=0x2D30, category='lo', description='TIFINAGH LETTER YA' },
+ [0x2D31] = { unicodeslot=0x2D31, category='lo', description='TIFINAGH LETTER YAB' },
+ [0x2D32] = { unicodeslot=0x2D32, category='lo', description='TIFINAGH LETTER YABH' },
+ [0x2D33] = { unicodeslot=0x2D33, category='lo', description='TIFINAGH LETTER YAG' },
+ [0x2D34] = { unicodeslot=0x2D34, category='lo', description='TIFINAGH LETTER YAGHH' },
+ [0x2D35] = { unicodeslot=0x2D35, category='lo', description='TIFINAGH LETTER BERBER ACADEMY YAJ' },
+ [0x2D36] = { unicodeslot=0x2D36, category='lo', description='TIFINAGH LETTER YAJ' },
+ [0x2D37] = { unicodeslot=0x2D37, category='lo', description='TIFINAGH LETTER YAD' },
+ [0x2D38] = { unicodeslot=0x2D38, category='lo', description='TIFINAGH LETTER YADH' },
+ [0x2D39] = { unicodeslot=0x2D39, category='lo', description='TIFINAGH LETTER YADD' },
+ [0x2D3A] = { unicodeslot=0x2D3A, category='lo', description='TIFINAGH LETTER YADDH' },
+ [0x2D3B] = { unicodeslot=0x2D3B, category='lo', description='TIFINAGH LETTER YEY' },
+ [0x2D3C] = { unicodeslot=0x2D3C, category='lo', description='TIFINAGH LETTER YAF' },
+ [0x2D3D] = { unicodeslot=0x2D3D, category='lo', description='TIFINAGH LETTER YAK' },
+ [0x2D3E] = { unicodeslot=0x2D3E, category='lo', description='TIFINAGH LETTER TUAREG YAK' },
+ [0x2D3F] = { unicodeslot=0x2D3F, category='lo', description='TIFINAGH LETTER YAKHH' },
+ [0x2D40] = { unicodeslot=0x2D40, category='lo', description='TIFINAGH LETTER YAH' },
+ [0x2D41] = { unicodeslot=0x2D41, category='lo', description='TIFINAGH LETTER BERBER ACADEMY YAH' },
+ [0x2D42] = { unicodeslot=0x2D42, category='lo', description='TIFINAGH LETTER TUAREG YAH' },
+ [0x2D43] = { unicodeslot=0x2D43, category='lo', description='TIFINAGH LETTER YAHH' },
+ [0x2D44] = { unicodeslot=0x2D44, category='lo', description='TIFINAGH LETTER YAA' },
+ [0x2D45] = { unicodeslot=0x2D45, category='lo', description='TIFINAGH LETTER YAKH' },
+ [0x2D46] = { unicodeslot=0x2D46, category='lo', description='TIFINAGH LETTER TUAREG YAKH' },
+ [0x2D47] = { unicodeslot=0x2D47, category='lo', description='TIFINAGH LETTER YAQ' },
+ [0x2D48] = { unicodeslot=0x2D48, category='lo', description='TIFINAGH LETTER TUAREG YAQ' },
+ [0x2D49] = { unicodeslot=0x2D49, category='lo', description='TIFINAGH LETTER YI' },
+ [0x2D4A] = { unicodeslot=0x2D4A, category='lo', description='TIFINAGH LETTER YAZH' },
+ [0x2D4B] = { unicodeslot=0x2D4B, category='lo', description='TIFINAGH LETTER AHAGGAR YAZH' },
+ [0x2D4C] = { unicodeslot=0x2D4C, category='lo', description='TIFINAGH LETTER TUAREG YAZH' },
+ [0x2D4D] = { unicodeslot=0x2D4D, category='lo', description='TIFINAGH LETTER YAL' },
+ [0x2D4E] = { unicodeslot=0x2D4E, category='lo', description='TIFINAGH LETTER YAM' },
+ [0x2D4F] = { unicodeslot=0x2D4F, category='lo', description='TIFINAGH LETTER YAN' },
+ [0x2D50] = { unicodeslot=0x2D50, category='lo', description='TIFINAGH LETTER TUAREG YAGN' },
+ [0x2D51] = { unicodeslot=0x2D51, category='lo', description='TIFINAGH LETTER TUAREG YANG' },
+ [0x2D52] = { unicodeslot=0x2D52, category='lo', description='TIFINAGH LETTER YAP' },
+ [0x2D53] = { unicodeslot=0x2D53, category='lo', description='TIFINAGH LETTER YU' },
+ [0x2D54] = { unicodeslot=0x2D54, category='lo', description='TIFINAGH LETTER YAR' },
+ [0x2D55] = { unicodeslot=0x2D55, category='lo', description='TIFINAGH LETTER YARR' },
+ [0x2D56] = { unicodeslot=0x2D56, category='lo', description='TIFINAGH LETTER YAGH' },
+ [0x2D57] = { unicodeslot=0x2D57, category='lo', description='TIFINAGH LETTER TUAREG YAGH' },
+ [0x2D58] = { unicodeslot=0x2D58, category='lo', description='TIFINAGH LETTER AYER YAGH' },
+ [0x2D59] = { unicodeslot=0x2D59, category='lo', description='TIFINAGH LETTER YAS' },
+ [0x2D5A] = { unicodeslot=0x2D5A, category='lo', description='TIFINAGH LETTER YASS' },
+ [0x2D5B] = { unicodeslot=0x2D5B, category='lo', description='TIFINAGH LETTER YASH' },
+ [0x2D5C] = { unicodeslot=0x2D5C, category='lo', description='TIFINAGH LETTER YAT' },
+ [0x2D5D] = { unicodeslot=0x2D5D, category='lo', description='TIFINAGH LETTER YATH' },
+ [0x2D5E] = { unicodeslot=0x2D5E, category='lo', description='TIFINAGH LETTER YACH' },
+ [0x2D5F] = { unicodeslot=0x2D5F, category='lo', description='TIFINAGH LETTER YATT' },
+ [0x2D60] = { unicodeslot=0x2D60, category='lo', description='TIFINAGH LETTER YAV' },
+ [0x2D61] = { unicodeslot=0x2D61, category='lo', description='TIFINAGH LETTER YAW' },
+ [0x2D62] = { unicodeslot=0x2D62, category='lo', description='TIFINAGH LETTER YAY' },
+ [0x2D63] = { unicodeslot=0x2D63, category='lo', description='TIFINAGH LETTER YAZ' },
+ [0x2D64] = { unicodeslot=0x2D64, category='lo', description='TIFINAGH LETTER TAWELLEMET YAZ' },
+ [0x2D65] = { unicodeslot=0x2D65, category='lo', description='TIFINAGH LETTER YAZZ' },
+ [0x2D6F] = { unicodeslot=0x2D6F, category='lm', description='TIFINAGH MODIFIER LETTER LABIALIZATION MARK', specials={'super',0x2D61} },
+ [0x2D80] = { unicodeslot=0x2D80, category='lo', description='ETHIOPIC SYLLABLE LOA' },
+ [0x2D81] = { unicodeslot=0x2D81, category='lo', description='ETHIOPIC SYLLABLE MOA' },
+ [0x2D82] = { unicodeslot=0x2D82, category='lo', description='ETHIOPIC SYLLABLE ROA' },
+ [0x2D83] = { unicodeslot=0x2D83, category='lo', description='ETHIOPIC SYLLABLE SOA' },
+ [0x2D84] = { unicodeslot=0x2D84, category='lo', description='ETHIOPIC SYLLABLE SHOA' },
+ [0x2D85] = { unicodeslot=0x2D85, category='lo', description='ETHIOPIC SYLLABLE BOA' },
+ [0x2D86] = { unicodeslot=0x2D86, category='lo', description='ETHIOPIC SYLLABLE TOA' },
+ [0x2D87] = { unicodeslot=0x2D87, category='lo', description='ETHIOPIC SYLLABLE COA' },
+ [0x2D88] = { unicodeslot=0x2D88, category='lo', description='ETHIOPIC SYLLABLE NOA' },
+ [0x2D89] = { unicodeslot=0x2D89, category='lo', description='ETHIOPIC SYLLABLE NYOA' },
+ [0x2D8A] = { unicodeslot=0x2D8A, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL OA' },
+ [0x2D8B] = { unicodeslot=0x2D8B, category='lo', description='ETHIOPIC SYLLABLE ZOA' },
+ [0x2D8C] = { unicodeslot=0x2D8C, category='lo', description='ETHIOPIC SYLLABLE DOA' },
+ [0x2D8D] = { unicodeslot=0x2D8D, category='lo', description='ETHIOPIC SYLLABLE DDOA' },
+ [0x2D8E] = { unicodeslot=0x2D8E, category='lo', description='ETHIOPIC SYLLABLE JOA' },
+ [0x2D8F] = { unicodeslot=0x2D8F, category='lo', description='ETHIOPIC SYLLABLE THOA' },
+ [0x2D90] = { unicodeslot=0x2D90, category='lo', description='ETHIOPIC SYLLABLE CHOA' },
+ [0x2D91] = { unicodeslot=0x2D91, category='lo', description='ETHIOPIC SYLLABLE PHOA' },
+ [0x2D92] = { unicodeslot=0x2D92, category='lo', description='ETHIOPIC SYLLABLE POA' },
+ [0x2D93] = { unicodeslot=0x2D93, category='lo', description='ETHIOPIC SYLLABLE GGWA' },
+ [0x2D94] = { unicodeslot=0x2D94, category='lo', description='ETHIOPIC SYLLABLE GGWI' },
+ [0x2D95] = { unicodeslot=0x2D95, category='lo', description='ETHIOPIC SYLLABLE GGWEE' },
+ [0x2D96] = { unicodeslot=0x2D96, category='lo', description='ETHIOPIC SYLLABLE GGWE' },
+ [0x2DA0] = { unicodeslot=0x2DA0, category='lo', description='ETHIOPIC SYLLABLE SSA' },
+ [0x2DA1] = { unicodeslot=0x2DA1, category='lo', description='ETHIOPIC SYLLABLE SSU' },
+ [0x2DA2] = { unicodeslot=0x2DA2, category='lo', description='ETHIOPIC SYLLABLE SSI' },
+ [0x2DA3] = { unicodeslot=0x2DA3, category='lo', description='ETHIOPIC SYLLABLE SSAA' },
+ [0x2DA4] = { unicodeslot=0x2DA4, category='lo', description='ETHIOPIC SYLLABLE SSEE' },
+ [0x2DA5] = { unicodeslot=0x2DA5, category='lo', description='ETHIOPIC SYLLABLE SSE' },
+ [0x2DA6] = { unicodeslot=0x2DA6, category='lo', description='ETHIOPIC SYLLABLE SSO' },
+ [0x2DA8] = { unicodeslot=0x2DA8, category='lo', description='ETHIOPIC SYLLABLE CCA' },
+ [0x2DA9] = { unicodeslot=0x2DA9, category='lo', description='ETHIOPIC SYLLABLE CCU' },
+ [0x2DAA] = { unicodeslot=0x2DAA, category='lo', description='ETHIOPIC SYLLABLE CCI' },
+ [0x2DAB] = { unicodeslot=0x2DAB, category='lo', description='ETHIOPIC SYLLABLE CCAA' },
+ [0x2DAC] = { unicodeslot=0x2DAC, category='lo', description='ETHIOPIC SYLLABLE CCEE' },
+ [0x2DAD] = { unicodeslot=0x2DAD, category='lo', description='ETHIOPIC SYLLABLE CCE' },
+ [0x2DAE] = { unicodeslot=0x2DAE, category='lo', description='ETHIOPIC SYLLABLE CCO' },
+ [0x2DB0] = { unicodeslot=0x2DB0, category='lo', description='ETHIOPIC SYLLABLE ZZA' },
+ [0x2DB1] = { unicodeslot=0x2DB1, category='lo', description='ETHIOPIC SYLLABLE ZZU' },
+ [0x2DB2] = { unicodeslot=0x2DB2, category='lo', description='ETHIOPIC SYLLABLE ZZI' },
+ [0x2DB3] = { unicodeslot=0x2DB3, category='lo', description='ETHIOPIC SYLLABLE ZZAA' },
+ [0x2DB4] = { unicodeslot=0x2DB4, category='lo', description='ETHIOPIC SYLLABLE ZZEE' },
+ [0x2DB5] = { unicodeslot=0x2DB5, category='lo', description='ETHIOPIC SYLLABLE ZZE' },
+ [0x2DB6] = { unicodeslot=0x2DB6, category='lo', description='ETHIOPIC SYLLABLE ZZO' },
+ [0x2DB8] = { unicodeslot=0x2DB8, category='lo', description='ETHIOPIC SYLLABLE CCHA' },
+ [0x2DB9] = { unicodeslot=0x2DB9, category='lo', description='ETHIOPIC SYLLABLE CCHU' },
+ [0x2DBA] = { unicodeslot=0x2DBA, category='lo', description='ETHIOPIC SYLLABLE CCHI' },
+ [0x2DBB] = { unicodeslot=0x2DBB, category='lo', description='ETHIOPIC SYLLABLE CCHAA' },
+ [0x2DBC] = { unicodeslot=0x2DBC, category='lo', description='ETHIOPIC SYLLABLE CCHEE' },
+ [0x2DBD] = { unicodeslot=0x2DBD, category='lo', description='ETHIOPIC SYLLABLE CCHE' },
+ [0x2DBE] = { unicodeslot=0x2DBE, category='lo', description='ETHIOPIC SYLLABLE CCHO' },
+ [0x2DC0] = { unicodeslot=0x2DC0, category='lo', description='ETHIOPIC SYLLABLE QYA' },
+ [0x2DC1] = { unicodeslot=0x2DC1, category='lo', description='ETHIOPIC SYLLABLE QYU' },
+ [0x2DC2] = { unicodeslot=0x2DC2, category='lo', description='ETHIOPIC SYLLABLE QYI' },
+ [0x2DC3] = { unicodeslot=0x2DC3, category='lo', description='ETHIOPIC SYLLABLE QYAA' },
+ [0x2DC4] = { unicodeslot=0x2DC4, category='lo', description='ETHIOPIC SYLLABLE QYEE' },
+ [0x2DC5] = { unicodeslot=0x2DC5, category='lo', description='ETHIOPIC SYLLABLE QYE' },
+ [0x2DC6] = { unicodeslot=0x2DC6, category='lo', description='ETHIOPIC SYLLABLE QYO' },
+ [0x2DC8] = { unicodeslot=0x2DC8, category='lo', description='ETHIOPIC SYLLABLE KYA' },
+ [0x2DC9] = { unicodeslot=0x2DC9, category='lo', description='ETHIOPIC SYLLABLE KYU' },
+ [0x2DCA] = { unicodeslot=0x2DCA, category='lo', description='ETHIOPIC SYLLABLE KYI' },
+ [0x2DCB] = { unicodeslot=0x2DCB, category='lo', description='ETHIOPIC SYLLABLE KYAA' },
+ [0x2DCC] = { unicodeslot=0x2DCC, category='lo', description='ETHIOPIC SYLLABLE KYEE' },
+ [0x2DCD] = { unicodeslot=0x2DCD, category='lo', description='ETHIOPIC SYLLABLE KYE' },
+ [0x2DCE] = { unicodeslot=0x2DCE, category='lo', description='ETHIOPIC SYLLABLE KYO' },
+ [0x2DD0] = { unicodeslot=0x2DD0, category='lo', description='ETHIOPIC SYLLABLE XYA' },
+ [0x2DD1] = { unicodeslot=0x2DD1, category='lo', description='ETHIOPIC SYLLABLE XYU' },
+ [0x2DD2] = { unicodeslot=0x2DD2, category='lo', description='ETHIOPIC SYLLABLE XYI' },
+ [0x2DD3] = { unicodeslot=0x2DD3, category='lo', description='ETHIOPIC SYLLABLE XYAA' },
+ [0x2DD4] = { unicodeslot=0x2DD4, category='lo', description='ETHIOPIC SYLLABLE XYEE' },
+ [0x2DD5] = { unicodeslot=0x2DD5, category='lo', description='ETHIOPIC SYLLABLE XYE' },
+ [0x2DD6] = { unicodeslot=0x2DD6, category='lo', description='ETHIOPIC SYLLABLE XYO' },
+ [0x2DD8] = { unicodeslot=0x2DD8, category='lo', description='ETHIOPIC SYLLABLE GYA' },
+ [0x2DD9] = { unicodeslot=0x2DD9, category='lo', description='ETHIOPIC SYLLABLE GYU' },
+ [0x2DDA] = { unicodeslot=0x2DDA, category='lo', description='ETHIOPIC SYLLABLE GYI' },
+ [0x2DDB] = { unicodeslot=0x2DDB, category='lo', description='ETHIOPIC SYLLABLE GYAA' },
+ [0x2DDC] = { unicodeslot=0x2DDC, category='lo', description='ETHIOPIC SYLLABLE GYEE' },
+ [0x2DDD] = { unicodeslot=0x2DDD, category='lo', description='ETHIOPIC SYLLABLE GYE' },
+ [0x2DDE] = { unicodeslot=0x2DDE, category='lo', description='ETHIOPIC SYLLABLE GYO' },
+ [0x2E00] = { unicodeslot=0x2E00, category='po', description='RIGHT ANGLE SUBSTITUTION MARKER' },
+ [0x2E01] = { unicodeslot=0x2E01, category='po', description='RIGHT ANGLE DOTTED SUBSTITUTION MARKER' },
+ [0x2E02] = { unicodeslot=0x2E02, category='pi', description='LEFT SUBSTITUTION BRACKET' },
+ [0x2E03] = { unicodeslot=0x2E03, category='pf', description='RIGHT SUBSTITUTION BRACKET' },
+ [0x2E04] = { unicodeslot=0x2E04, category='pi', description='LEFT DOTTED SUBSTITUTION BRACKET' },
+ [0x2E05] = { unicodeslot=0x2E05, category='pf', description='RIGHT DOTTED SUBSTITUTION BRACKET' },
+ [0x2E06] = { unicodeslot=0x2E06, category='po', description='RAISED INTERPOLATION MARKER' },
+ [0x2E07] = { unicodeslot=0x2E07, category='po', description='RAISED DOTTED INTERPOLATION MARKER' },
+ [0x2E08] = { unicodeslot=0x2E08, category='po', description='DOTTED TRANSPOSITION MARKER' },
+ [0x2E09] = { unicodeslot=0x2E09, category='pi', description='LEFT TRANSPOSITION BRACKET' },
+ [0x2E0A] = { unicodeslot=0x2E0A, category='pf', description='RIGHT TRANSPOSITION BRACKET' },
+ [0x2E0B] = { unicodeslot=0x2E0B, category='po', description='RAISED SQUARE' },
+ [0x2E0C] = { unicodeslot=0x2E0C, category='pi', description='LEFT RAISED OMISSION BRACKET' },
+ [0x2E0D] = { unicodeslot=0x2E0D, category='pf', description='RIGHT RAISED OMISSION BRACKET' },
+ [0x2E0E] = { unicodeslot=0x2E0E, category='po', description='EDITORIAL CORONIS' },
+ [0x2E0F] = { unicodeslot=0x2E0F, category='po', description='PARAGRAPHOS' },
+ [0x2E10] = { unicodeslot=0x2E10, category='po', description='FORKED PARAGRAPHOS' },
+ [0x2E11] = { unicodeslot=0x2E11, category='po', description='REVERSED FORKED PARAGRAPHOS' },
+ [0x2E12] = { unicodeslot=0x2E12, category='po', description='HYPODIASTOLE' },
+ [0x2E13] = { unicodeslot=0x2E13, category='po', description='DOTTED OBELOS' },
+ [0x2E14] = { unicodeslot=0x2E14, category='po', description='DOWNWARDS ANCORA' },
+ [0x2E15] = { unicodeslot=0x2E15, category='po', description='UPWARDS ANCORA' },
+ [0x2E16] = { unicodeslot=0x2E16, category='po', description='DOTTED RIGHT-POINTING ANGLE' },
+ [0x2E17] = { unicodeslot=0x2E17, category='pd', description='DOUBLE OBLIQUE HYPHEN' },
+ [0x2E1C] = { unicodeslot=0x2E1C, category='pi', description='LEFT LOW PARAPHRASE BRACKET' },
+ [0x2E1D] = { unicodeslot=0x2E1D, category='pf', description='RIGHT LOW PARAPHRASE BRACKET' },
+ [0x2E80] = { unicodeslot=0x2E80, category='so', description='CJK RADICAL REPEAT' },
+ [0x2E81] = { unicodeslot=0x2E81, category='so', description='CJK RADICAL CLIFF' },
+ [0x2E82] = { unicodeslot=0x2E82, category='so', description='CJK RADICAL SECOND ONE' },
+ [0x2E83] = { unicodeslot=0x2E83, category='so', description='CJK RADICAL SECOND TWO' },
+ [0x2E84] = { unicodeslot=0x2E84, category='so', description='CJK RADICAL SECOND THREE' },
+ [0x2E85] = { unicodeslot=0x2E85, category='so', description='CJK RADICAL PERSON' },
+ [0x2E86] = { unicodeslot=0x2E86, category='so', description='CJK RADICAL BOX' },
+ [0x2E87] = { unicodeslot=0x2E87, category='so', description='CJK RADICAL TABLE' },
+ [0x2E88] = { unicodeslot=0x2E88, category='so', description='CJK RADICAL KNIFE ONE' },
+ [0x2E89] = { unicodeslot=0x2E89, category='so', description='CJK RADICAL KNIFE TWO' },
+ [0x2E8A] = { unicodeslot=0x2E8A, category='so', description='CJK RADICAL DIVINATION' },
+ [0x2E8B] = { unicodeslot=0x2E8B, category='so', description='CJK RADICAL SEAL' },
+ [0x2E8C] = { unicodeslot=0x2E8C, category='so', description='CJK RADICAL SMALL ONE' },
+ [0x2E8D] = { unicodeslot=0x2E8D, category='so', description='CJK RADICAL SMALL TWO' },
+ [0x2E8E] = { unicodeslot=0x2E8E, category='so', description='CJK RADICAL LAME ONE' },
+ [0x2E8F] = { unicodeslot=0x2E8F, category='so', description='CJK RADICAL LAME TWO' },
+ [0x2E90] = { unicodeslot=0x2E90, category='so', description='CJK RADICAL LAME THREE' },
+ [0x2E91] = { unicodeslot=0x2E91, category='so', description='CJK RADICAL LAME FOUR' },
+ [0x2E92] = { unicodeslot=0x2E92, category='so', description='CJK RADICAL SNAKE' },
+ [0x2E93] = { unicodeslot=0x2E93, category='so', description='CJK RADICAL THREAD' },
+ [0x2E94] = { unicodeslot=0x2E94, category='so', description='CJK RADICAL SNOUT ONE' },
+ [0x2E95] = { unicodeslot=0x2E95, category='so', description='CJK RADICAL SNOUT TWO' },
+ [0x2E96] = { unicodeslot=0x2E96, category='so', description='CJK RADICAL HEART ONE' },
+ [0x2E97] = { unicodeslot=0x2E97, category='so', description='CJK RADICAL HEART TWO' },
+ [0x2E98] = { unicodeslot=0x2E98, category='so', description='CJK RADICAL HAND' },
+ [0x2E99] = { unicodeslot=0x2E99, category='so', description='CJK RADICAL RAP' },
+ [0x2E9B] = { unicodeslot=0x2E9B, category='so', description='CJK RADICAL CHOKE' },
+ [0x2E9C] = { unicodeslot=0x2E9C, category='so', description='CJK RADICAL SUN' },
+ [0x2E9D] = { unicodeslot=0x2E9D, category='so', description='CJK RADICAL MOON' },
+ [0x2E9E] = { unicodeslot=0x2E9E, category='so', description='CJK RADICAL DEATH' },
+ [0x2E9F] = { unicodeslot=0x2E9F, category='so', description='CJK RADICAL MOTHER', specials={'compat',0x6BCD} },
+ [0x2EA0] = { unicodeslot=0x2EA0, category='so', description='CJK RADICAL CIVILIAN' },
+ [0x2EA1] = { unicodeslot=0x2EA1, category='so', description='CJK RADICAL WATER ONE' },
+ [0x2EA2] = { unicodeslot=0x2EA2, category='so', description='CJK RADICAL WATER TWO' },
+ [0x2EA3] = { unicodeslot=0x2EA3, category='so', description='CJK RADICAL FIRE' },
+ [0x2EA4] = { unicodeslot=0x2EA4, category='so', description='CJK RADICAL PAW ONE' },
+ [0x2EA5] = { unicodeslot=0x2EA5, category='so', description='CJK RADICAL PAW TWO' },
+ [0x2EA6] = { unicodeslot=0x2EA6, category='so', description='CJK RADICAL SIMPLIFIED HALF TREE TRUNK' },
+ [0x2EA7] = { unicodeslot=0x2EA7, category='so', description='CJK RADICAL COW' },
+ [0x2EA8] = { unicodeslot=0x2EA8, category='so', description='CJK RADICAL DOG' },
+ [0x2EA9] = { unicodeslot=0x2EA9, category='so', description='CJK RADICAL JADE' },
+ [0x2EAA] = { unicodeslot=0x2EAA, category='so', description='CJK RADICAL BOLT OF CLOTH' },
+ [0x2EAB] = { unicodeslot=0x2EAB, category='so', description='CJK RADICAL EYE' },
+ [0x2EAC] = { unicodeslot=0x2EAC, category='so', description='CJK RADICAL SPIRIT ONE' },
+ [0x2EAD] = { unicodeslot=0x2EAD, category='so', description='CJK RADICAL SPIRIT TWO' },
+ [0x2EAE] = { unicodeslot=0x2EAE, category='so', description='CJK RADICAL BAMBOO' },
+ [0x2EAF] = { unicodeslot=0x2EAF, category='so', description='CJK RADICAL SILK' },
+ [0x2EB0] = { unicodeslot=0x2EB0, category='so', description='CJK RADICAL C-SIMPLIFIED SILK' },
+ [0x2EB1] = { unicodeslot=0x2EB1, category='so', description='CJK RADICAL NET ONE' },
+ [0x2EB2] = { unicodeslot=0x2EB2, category='so', description='CJK RADICAL NET TWO' },
+ [0x2EB3] = { unicodeslot=0x2EB3, category='so', description='CJK RADICAL NET THREE' },
+ [0x2EB4] = { unicodeslot=0x2EB4, category='so', description='CJK RADICAL NET FOUR' },
+ [0x2EB5] = { unicodeslot=0x2EB5, category='so', description='CJK RADICAL MESH' },
+ [0x2EB6] = { unicodeslot=0x2EB6, category='so', description='CJK RADICAL SHEEP' },
+ [0x2EB7] = { unicodeslot=0x2EB7, category='so', description='CJK RADICAL RAM' },
+ [0x2EB8] = { unicodeslot=0x2EB8, category='so', description='CJK RADICAL EWE' },
+ [0x2EB9] = { unicodeslot=0x2EB9, category='so', description='CJK RADICAL OLD' },
+ [0x2EBA] = { unicodeslot=0x2EBA, category='so', description='CJK RADICAL BRUSH ONE' },
+ [0x2EBB] = { unicodeslot=0x2EBB, category='so', description='CJK RADICAL BRUSH TWO' },
+ [0x2EBC] = { unicodeslot=0x2EBC, category='so', description='CJK RADICAL MEAT' },
+ [0x2EBD] = { unicodeslot=0x2EBD, category='so', description='CJK RADICAL MORTAR' },
+ [0x2EBE] = { unicodeslot=0x2EBE, category='so', description='CJK RADICAL GRASS ONE' },
+ [0x2EBF] = { unicodeslot=0x2EBF, category='so', description='CJK RADICAL GRASS TWO' },
+ [0x2EC0] = { unicodeslot=0x2EC0, category='so', description='CJK RADICAL GRASS THREE' },
+ [0x2EC1] = { unicodeslot=0x2EC1, category='so', description='CJK RADICAL TIGER' },
+ [0x2EC2] = { unicodeslot=0x2EC2, category='so', description='CJK RADICAL CLOTHES' },
+ [0x2EC3] = { unicodeslot=0x2EC3, category='so', description='CJK RADICAL WEST ONE' },
+ [0x2EC4] = { unicodeslot=0x2EC4, category='so', description='CJK RADICAL WEST TWO' },
+ [0x2EC5] = { unicodeslot=0x2EC5, category='so', description='CJK RADICAL C-SIMPLIFIED SEE' },
+ [0x2EC6] = { unicodeslot=0x2EC6, category='so', description='CJK RADICAL SIMPLIFIED HORN' },
+ [0x2EC7] = { unicodeslot=0x2EC7, category='so', description='CJK RADICAL HORN' },
+ [0x2EC8] = { unicodeslot=0x2EC8, category='so', description='CJK RADICAL C-SIMPLIFIED SPEECH' },
+ [0x2EC9] = { unicodeslot=0x2EC9, category='so', description='CJK RADICAL C-SIMPLIFIED SHELL' },
+ [0x2ECA] = { unicodeslot=0x2ECA, category='so', description='CJK RADICAL FOOT' },
+ [0x2ECB] = { unicodeslot=0x2ECB, category='so', description='CJK RADICAL C-SIMPLIFIED CART' },
+ [0x2ECC] = { unicodeslot=0x2ECC, category='so', description='CJK RADICAL SIMPLIFIED WALK' },
+ [0x2ECD] = { unicodeslot=0x2ECD, category='so', description='CJK RADICAL WALK ONE' },
+ [0x2ECE] = { unicodeslot=0x2ECE, category='so', description='CJK RADICAL WALK TWO' },
+ [0x2ECF] = { unicodeslot=0x2ECF, category='so', description='CJK RADICAL CITY' },
+ [0x2ED0] = { unicodeslot=0x2ED0, category='so', description='CJK RADICAL C-SIMPLIFIED GOLD' },
+ [0x2ED1] = { unicodeslot=0x2ED1, category='so', description='CJK RADICAL LONG ONE' },
+ [0x2ED2] = { unicodeslot=0x2ED2, category='so', description='CJK RADICAL LONG TWO' },
+ [0x2ED3] = { unicodeslot=0x2ED3, category='so', description='CJK RADICAL C-SIMPLIFIED LONG' },
+ [0x2ED4] = { unicodeslot=0x2ED4, category='so', description='CJK RADICAL C-SIMPLIFIED GATE' },
+ [0x2ED5] = { unicodeslot=0x2ED5, category='so', description='CJK RADICAL MOUND ONE' },
+ [0x2ED6] = { unicodeslot=0x2ED6, category='so', description='CJK RADICAL MOUND TWO' },
+ [0x2ED7] = { unicodeslot=0x2ED7, category='so', description='CJK RADICAL RAIN' },
+ [0x2ED8] = { unicodeslot=0x2ED8, category='so', description='CJK RADICAL BLUE' },
+ [0x2ED9] = { unicodeslot=0x2ED9, category='so', description='CJK RADICAL C-SIMPLIFIED TANNED LEATHER' },
+ [0x2EDA] = { unicodeslot=0x2EDA, category='so', description='CJK RADICAL C-SIMPLIFIED LEAF' },
+ [0x2EDB] = { unicodeslot=0x2EDB, category='so', description='CJK RADICAL C-SIMPLIFIED WIND' },
+ [0x2EDC] = { unicodeslot=0x2EDC, category='so', description='CJK RADICAL C-SIMPLIFIED FLY' },
+ [0x2EDD] = { unicodeslot=0x2EDD, category='so', description='CJK RADICAL EAT ONE' },
+ [0x2EDE] = { unicodeslot=0x2EDE, category='so', description='CJK RADICAL EAT TWO' },
+ [0x2EDF] = { unicodeslot=0x2EDF, category='so', description='CJK RADICAL EAT THREE' },
+ [0x2EE0] = { unicodeslot=0x2EE0, category='so', description='CJK RADICAL C-SIMPLIFIED EAT' },
+ [0x2EE1] = { unicodeslot=0x2EE1, category='so', description='CJK RADICAL HEAD' },
+ [0x2EE2] = { unicodeslot=0x2EE2, category='so', description='CJK RADICAL C-SIMPLIFIED HORSE' },
+ [0x2EE3] = { unicodeslot=0x2EE3, category='so', description='CJK RADICAL BONE' },
+ [0x2EE4] = { unicodeslot=0x2EE4, category='so', description='CJK RADICAL GHOST' },
+ [0x2EE5] = { unicodeslot=0x2EE5, category='so', description='CJK RADICAL C-SIMPLIFIED FISH' },
+ [0x2EE6] = { unicodeslot=0x2EE6, category='so', description='CJK RADICAL C-SIMPLIFIED BIRD' },
+ [0x2EE7] = { unicodeslot=0x2EE7, category='so', description='CJK RADICAL C-SIMPLIFIED SALT' },
+ [0x2EE8] = { unicodeslot=0x2EE8, category='so', description='CJK RADICAL SIMPLIFIED WHEAT' },
+ [0x2EE9] = { unicodeslot=0x2EE9, category='so', description='CJK RADICAL SIMPLIFIED YELLOW' },
+ [0x2EEA] = { unicodeslot=0x2EEA, category='so', description='CJK RADICAL C-SIMPLIFIED FROG' },
+ [0x2EEB] = { unicodeslot=0x2EEB, category='so', description='CJK RADICAL J-SIMPLIFIED EVEN' },
+ [0x2EEC] = { unicodeslot=0x2EEC, category='so', description='CJK RADICAL C-SIMPLIFIED EVEN' },
+ [0x2EED] = { unicodeslot=0x2EED, category='so', description='CJK RADICAL J-SIMPLIFIED TOOTH' },
+ [0x2EEE] = { unicodeslot=0x2EEE, category='so', description='CJK RADICAL C-SIMPLIFIED TOOTH' },
+ [0x2EEF] = { unicodeslot=0x2EEF, category='so', description='CJK RADICAL J-SIMPLIFIED DRAGON' },
+ [0x2EF0] = { unicodeslot=0x2EF0, category='so', description='CJK RADICAL C-SIMPLIFIED DRAGON' },
+ [0x2EF1] = { unicodeslot=0x2EF1, category='so', description='CJK RADICAL TURTLE' },
+ [0x2EF2] = { unicodeslot=0x2EF2, category='so', description='CJK RADICAL J-SIMPLIFIED TURTLE' },
+ [0x2EF3] = { unicodeslot=0x2EF3, category='so', description='CJK RADICAL C-SIMPLIFIED TURTLE', specials={'compat',0x9F9F} },
+ [0x2F00] = { unicodeslot=0x2F00, category='so', description='KANGXI RADICAL ONE', specials={'compat',0x4E00} },
+ [0x2F01] = { unicodeslot=0x2F01, category='so', description='KANGXI RADICAL LINE', specials={'compat',0x4E28} },
+ [0x2F02] = { unicodeslot=0x2F02, category='so', description='KANGXI RADICAL DOT', specials={'compat',0x4E36} },
+ [0x2F03] = { unicodeslot=0x2F03, category='so', description='KANGXI RADICAL SLASH', specials={'compat',0x4E3F} },
+ [0x2F04] = { unicodeslot=0x2F04, category='so', description='KANGXI RADICAL SECOND', specials={'compat',0x4E59} },
+ [0x2F05] = { unicodeslot=0x2F05, category='so', description='KANGXI RADICAL HOOK', specials={'compat',0x4E85} },
+ [0x2F06] = { unicodeslot=0x2F06, category='so', description='KANGXI RADICAL TWO', specials={'compat',0x4E8C} },
+ [0x2F07] = { unicodeslot=0x2F07, category='so', description='KANGXI RADICAL LID', specials={'compat',0x4EA0} },
+ [0x2F08] = { unicodeslot=0x2F08, category='so', description='KANGXI RADICAL MAN', specials={'compat',0x4EBA} },
+ [0x2F09] = { unicodeslot=0x2F09, category='so', description='KANGXI RADICAL LEGS', specials={'compat',0x513F} },
+ [0x2F0A] = { unicodeslot=0x2F0A, category='so', description='KANGXI RADICAL ENTER', specials={'compat',0x5165} },
+ [0x2F0B] = { unicodeslot=0x2F0B, category='so', description='KANGXI RADICAL EIGHT', specials={'compat',0x516B} },
+ [0x2F0C] = { unicodeslot=0x2F0C, category='so', description='KANGXI RADICAL DOWN BOX', specials={'compat',0x5182} },
+ [0x2F0D] = { unicodeslot=0x2F0D, category='so', description='KANGXI RADICAL COVER', specials={'compat',0x5196} },
+ [0x2F0E] = { unicodeslot=0x2F0E, category='so', description='KANGXI RADICAL ICE', specials={'compat',0x51AB} },
+ [0x2F0F] = { unicodeslot=0x2F0F, category='so', description='KANGXI RADICAL TABLE', specials={'compat',0x51E0} },
+ [0x2F10] = { unicodeslot=0x2F10, category='so', description='KANGXI RADICAL OPEN BOX', specials={'compat',0x51F5} },
+ [0x2F11] = { unicodeslot=0x2F11, category='so', description='KANGXI RADICAL KNIFE', specials={'compat',0x5200} },
+ [0x2F12] = { unicodeslot=0x2F12, category='so', description='KANGXI RADICAL POWER', specials={'compat',0x529B} },
+ [0x2F13] = { unicodeslot=0x2F13, category='so', description='KANGXI RADICAL WRAP', specials={'compat',0x52F9} },
+ [0x2F14] = { unicodeslot=0x2F14, category='so', description='KANGXI RADICAL SPOON', specials={'compat',0x5315} },
+ [0x2F15] = { unicodeslot=0x2F15, category='so', description='KANGXI RADICAL RIGHT OPEN BOX', specials={'compat',0x531A} },
+ [0x2F16] = { unicodeslot=0x2F16, category='so', description='KANGXI RADICAL HIDING ENCLOSURE', specials={'compat',0x5338} },
+ [0x2F17] = { unicodeslot=0x2F17, category='so', description='KANGXI RADICAL TEN', specials={'compat',0x5341} },
+ [0x2F18] = { unicodeslot=0x2F18, category='so', description='KANGXI RADICAL DIVINATION', specials={'compat',0x535C} },
+ [0x2F19] = { unicodeslot=0x2F19, category='so', description='KANGXI RADICAL SEAL', specials={'compat',0x5369} },
+ [0x2F1A] = { unicodeslot=0x2F1A, category='so', description='KANGXI RADICAL CLIFF', specials={'compat',0x5382} },
+ [0x2F1B] = { unicodeslot=0x2F1B, category='so', description='KANGXI RADICAL PRIVATE', specials={'compat',0x53B6} },
+ [0x2F1C] = { unicodeslot=0x2F1C, category='so', description='KANGXI RADICAL AGAIN', specials={'compat',0x53C8} },
+ [0x2F1D] = { unicodeslot=0x2F1D, category='so', description='KANGXI RADICAL MOUTH', specials={'compat',0x53E3} },
+ [0x2F1E] = { unicodeslot=0x2F1E, category='so', description='KANGXI RADICAL ENCLOSURE', specials={'compat',0x56D7} },
+ [0x2F1F] = { unicodeslot=0x2F1F, category='so', description='KANGXI RADICAL EARTH', specials={'compat',0x571F} },
+ [0x2F20] = { unicodeslot=0x2F20, category='so', description='KANGXI RADICAL SCHOLAR', specials={'compat',0x58EB} },
+ [0x2F21] = { unicodeslot=0x2F21, category='so', description='KANGXI RADICAL GO', specials={'compat',0x5902} },
+ [0x2F22] = { unicodeslot=0x2F22, category='so', description='KANGXI RADICAL GO SLOWLY', specials={'compat',0x590A} },
+ [0x2F23] = { unicodeslot=0x2F23, category='so', description='KANGXI RADICAL EVENING', specials={'compat',0x5915} },
+ [0x2F24] = { unicodeslot=0x2F24, category='so', description='KANGXI RADICAL BIG', specials={'compat',0x5927} },
+ [0x2F25] = { unicodeslot=0x2F25, category='so', description='KANGXI RADICAL WOMAN', specials={'compat',0x5973} },
+ [0x2F26] = { unicodeslot=0x2F26, category='so', description='KANGXI RADICAL CHILD', specials={'compat',0x5B50} },
+ [0x2F27] = { unicodeslot=0x2F27, category='so', description='KANGXI RADICAL ROOF', specials={'compat',0x5B80} },
+ [0x2F28] = { unicodeslot=0x2F28, category='so', description='KANGXI RADICAL INCH', specials={'compat',0x5BF8} },
+ [0x2F29] = { unicodeslot=0x2F29, category='so', description='KANGXI RADICAL SMALL', specials={'compat',0x5C0F} },
+ [0x2F2A] = { unicodeslot=0x2F2A, category='so', description='KANGXI RADICAL LAME', specials={'compat',0x5C22} },
+ [0x2F2B] = { unicodeslot=0x2F2B, category='so', description='KANGXI RADICAL CORPSE', specials={'compat',0x5C38} },
+ [0x2F2C] = { unicodeslot=0x2F2C, category='so', description='KANGXI RADICAL SPROUT', specials={'compat',0x5C6E} },
+ [0x2F2D] = { unicodeslot=0x2F2D, category='so', description='KANGXI RADICAL MOUNTAIN', specials={'compat',0x5C71} },
+ [0x2F2E] = { unicodeslot=0x2F2E, category='so', description='KANGXI RADICAL RIVER', specials={'compat',0x5DDB} },
+ [0x2F2F] = { unicodeslot=0x2F2F, category='so', description='KANGXI RADICAL WORK', specials={'compat',0x5DE5} },
+ [0x2F30] = { unicodeslot=0x2F30, category='so', description='KANGXI RADICAL ONESELF', specials={'compat',0x5DF1} },
+ [0x2F31] = { unicodeslot=0x2F31, category='so', description='KANGXI RADICAL TURBAN', specials={'compat',0x5DFE} },
+ [0x2F32] = { unicodeslot=0x2F32, category='so', description='KANGXI RADICAL DRY', specials={'compat',0x5E72} },
+ [0x2F33] = { unicodeslot=0x2F33, category='so', description='KANGXI RADICAL SHORT THREAD', specials={'compat',0x5E7A} },
+ [0x2F34] = { unicodeslot=0x2F34, category='so', description='KANGXI RADICAL DOTTED CLIFF', specials={'compat',0x5E7F} },
+ [0x2F35] = { unicodeslot=0x2F35, category='so', description='KANGXI RADICAL LONG STRIDE', specials={'compat',0x5EF4} },
+ [0x2F36] = { unicodeslot=0x2F36, category='so', description='KANGXI RADICAL TWO HANDS', specials={'compat',0x5EFE} },
+ [0x2F37] = { unicodeslot=0x2F37, category='so', description='KANGXI RADICAL SHOOT', specials={'compat',0x5F0B} },
+ [0x2F38] = { unicodeslot=0x2F38, category='so', description='KANGXI RADICAL BOW', specials={'compat',0x5F13} },
+ [0x2F39] = { unicodeslot=0x2F39, category='so', description='KANGXI RADICAL SNOUT', specials={'compat',0x5F50} },
+ [0x2F3A] = { unicodeslot=0x2F3A, category='so', description='KANGXI RADICAL BRISTLE', specials={'compat',0x5F61} },
+ [0x2F3B] = { unicodeslot=0x2F3B, category='so', description='KANGXI RADICAL STEP', specials={'compat',0x5F73} },
+ [0x2F3C] = { unicodeslot=0x2F3C, category='so', description='KANGXI RADICAL HEART', specials={'compat',0x5FC3} },
+ [0x2F3D] = { unicodeslot=0x2F3D, category='so', description='KANGXI RADICAL HALBERD', specials={'compat',0x6208} },
+ [0x2F3E] = { unicodeslot=0x2F3E, category='so', description='KANGXI RADICAL DOOR', specials={'compat',0x6236} },
+ [0x2F3F] = { unicodeslot=0x2F3F, category='so', description='KANGXI RADICAL HAND', specials={'compat',0x624B} },
+ [0x2F40] = { unicodeslot=0x2F40, category='so', description='KANGXI RADICAL BRANCH', specials={'compat',0x652F} },
+ [0x2F41] = { unicodeslot=0x2F41, category='so', description='KANGXI RADICAL RAP', specials={'compat',0x6534} },
+ [0x2F42] = { unicodeslot=0x2F42, category='so', description='KANGXI RADICAL SCRIPT', specials={'compat',0x6587} },
+ [0x2F43] = { unicodeslot=0x2F43, category='so', description='KANGXI RADICAL DIPPER', specials={'compat',0x6597} },
+ [0x2F44] = { unicodeslot=0x2F44, category='so', description='KANGXI RADICAL AXE', specials={'compat',0x65A4} },
+ [0x2F45] = { unicodeslot=0x2F45, category='so', description='KANGXI RADICAL SQUARE', specials={'compat',0x65B9} },
+ [0x2F46] = { unicodeslot=0x2F46, category='so', description='KANGXI RADICAL NOT', specials={'compat',0x65E0} },
+ [0x2F47] = { unicodeslot=0x2F47, category='so', description='KANGXI RADICAL SUN', specials={'compat',0x65E5} },
+ [0x2F48] = { unicodeslot=0x2F48, category='so', description='KANGXI RADICAL SAY', specials={'compat',0x66F0} },
+ [0x2F49] = { unicodeslot=0x2F49, category='so', description='KANGXI RADICAL MOON', specials={'compat',0x6708} },
+ [0x2F4A] = { unicodeslot=0x2F4A, category='so', description='KANGXI RADICAL TREE', specials={'compat',0x6728} },
+ [0x2F4B] = { unicodeslot=0x2F4B, category='so', description='KANGXI RADICAL LACK', specials={'compat',0x6B20} },
+ [0x2F4C] = { unicodeslot=0x2F4C, category='so', description='KANGXI RADICAL STOP', specials={'compat',0x6B62} },
+ [0x2F4D] = { unicodeslot=0x2F4D, category='so', description='KANGXI RADICAL DEATH', specials={'compat',0x6B79} },
+ [0x2F4E] = { unicodeslot=0x2F4E, category='so', description='KANGXI RADICAL WEAPON', specials={'compat',0x6BB3} },
+ [0x2F4F] = { unicodeslot=0x2F4F, category='so', description='KANGXI RADICAL DO NOT', specials={'compat',0x6BCB} },
+ [0x2F50] = { unicodeslot=0x2F50, category='so', description='KANGXI RADICAL COMPARE', specials={'compat',0x6BD4} },
+ [0x2F51] = { unicodeslot=0x2F51, category='so', description='KANGXI RADICAL FUR', specials={'compat',0x6BDB} },
+ [0x2F52] = { unicodeslot=0x2F52, category='so', description='KANGXI RADICAL CLAN', specials={'compat',0x6C0F} },
+ [0x2F53] = { unicodeslot=0x2F53, category='so', description='KANGXI RADICAL STEAM', specials={'compat',0x6C14} },
+ [0x2F54] = { unicodeslot=0x2F54, category='so', description='KANGXI RADICAL WATER', specials={'compat',0x6C34} },
+ [0x2F55] = { unicodeslot=0x2F55, category='so', description='KANGXI RADICAL FIRE', specials={'compat',0x706B} },
+ [0x2F56] = { unicodeslot=0x2F56, category='so', description='KANGXI RADICAL CLAW', specials={'compat',0x722A} },
+ [0x2F57] = { unicodeslot=0x2F57, category='so', description='KANGXI RADICAL FATHER', specials={'compat',0x7236} },
+ [0x2F58] = { unicodeslot=0x2F58, category='so', description='KANGXI RADICAL DOUBLE X', specials={'compat',0x723B} },
+ [0x2F59] = { unicodeslot=0x2F59, category='so', description='KANGXI RADICAL HALF TREE TRUNK', specials={'compat',0x723F} },
+ [0x2F5A] = { unicodeslot=0x2F5A, category='so', description='KANGXI RADICAL SLICE', specials={'compat',0x7247} },
+ [0x2F5B] = { unicodeslot=0x2F5B, category='so', description='KANGXI RADICAL FANG', specials={'compat',0x7259} },
+ [0x2F5C] = { unicodeslot=0x2F5C, category='so', description='KANGXI RADICAL COW', specials={'compat',0x725B} },
+ [0x2F5D] = { unicodeslot=0x2F5D, category='so', description='KANGXI RADICAL DOG', specials={'compat',0x72AC} },
+ [0x2F5E] = { unicodeslot=0x2F5E, category='so', description='KANGXI RADICAL PROFOUND', specials={'compat',0x7384} },
+ [0x2F5F] = { unicodeslot=0x2F5F, category='so', description='KANGXI RADICAL JADE', specials={'compat',0x7389} },
+ [0x2F60] = { unicodeslot=0x2F60, category='so', description='KANGXI RADICAL MELON', specials={'compat',0x74DC} },
+ [0x2F61] = { unicodeslot=0x2F61, category='so', description='KANGXI RADICAL TILE', specials={'compat',0x74E6} },
+ [0x2F62] = { unicodeslot=0x2F62, category='so', description='KANGXI RADICAL SWEET', specials={'compat',0x7518} },
+ [0x2F63] = { unicodeslot=0x2F63, category='so', description='KANGXI RADICAL LIFE', specials={'compat',0x751F} },
+ [0x2F64] = { unicodeslot=0x2F64, category='so', description='KANGXI RADICAL USE', specials={'compat',0x7528} },
+ [0x2F65] = { unicodeslot=0x2F65, category='so', description='KANGXI RADICAL FIELD', specials={'compat',0x7530} },
+ [0x2F66] = { unicodeslot=0x2F66, category='so', description='KANGXI RADICAL BOLT OF CLOTH', specials={'compat',0x758B} },
+ [0x2F67] = { unicodeslot=0x2F67, category='so', description='KANGXI RADICAL SICKNESS', specials={'compat',0x7592} },
+ [0x2F68] = { unicodeslot=0x2F68, category='so', description='KANGXI RADICAL DOTTED TENT', specials={'compat',0x7676} },
+ [0x2F69] = { unicodeslot=0x2F69, category='so', description='KANGXI RADICAL WHITE', specials={'compat',0x767D} },
+ [0x2F6A] = { unicodeslot=0x2F6A, category='so', description='KANGXI RADICAL SKIN', specials={'compat',0x76AE} },
+ [0x2F6B] = { unicodeslot=0x2F6B, category='so', description='KANGXI RADICAL DISH', specials={'compat',0x76BF} },
+ [0x2F6C] = { unicodeslot=0x2F6C, category='so', description='KANGXI RADICAL EYE', specials={'compat',0x76EE} },
+ [0x2F6D] = { unicodeslot=0x2F6D, category='so', description='KANGXI RADICAL SPEAR', specials={'compat',0x77DB} },
+ [0x2F6E] = { unicodeslot=0x2F6E, category='so', description='KANGXI RADICAL ARROW', specials={'compat',0x77E2} },
+ [0x2F6F] = { unicodeslot=0x2F6F, category='so', description='KANGXI RADICAL STONE', specials={'compat',0x77F3} },
+ [0x2F70] = { unicodeslot=0x2F70, category='so', description='KANGXI RADICAL SPIRIT', specials={'compat',0x793A} },
+ [0x2F71] = { unicodeslot=0x2F71, category='so', description='KANGXI RADICAL TRACK', specials={'compat',0x79B8} },
+ [0x2F72] = { unicodeslot=0x2F72, category='so', description='KANGXI RADICAL GRAIN', specials={'compat',0x79BE} },
+ [0x2F73] = { unicodeslot=0x2F73, category='so', description='KANGXI RADICAL CAVE', specials={'compat',0x7A74} },
+ [0x2F74] = { unicodeslot=0x2F74, category='so', description='KANGXI RADICAL STAND', specials={'compat',0x7ACB} },
+ [0x2F75] = { unicodeslot=0x2F75, category='so', description='KANGXI RADICAL BAMBOO', specials={'compat',0x7AF9} },
+ [0x2F76] = { unicodeslot=0x2F76, category='so', description='KANGXI RADICAL RICE', specials={'compat',0x7C73} },
+ [0x2F77] = { unicodeslot=0x2F77, category='so', description='KANGXI RADICAL SILK', specials={'compat',0x7CF8} },
+ [0x2F78] = { unicodeslot=0x2F78, category='so', description='KANGXI RADICAL JAR', specials={'compat',0x7F36} },
+ [0x2F79] = { unicodeslot=0x2F79, category='so', description='KANGXI RADICAL NET', specials={'compat',0x7F51} },
+ [0x2F7A] = { unicodeslot=0x2F7A, category='so', description='KANGXI RADICAL SHEEP', specials={'compat',0x7F8A} },
+ [0x2F7B] = { unicodeslot=0x2F7B, category='so', description='KANGXI RADICAL FEATHER', specials={'compat',0x7FBD} },
+ [0x2F7C] = { unicodeslot=0x2F7C, category='so', description='KANGXI RADICAL OLD', specials={'compat',0x8001} },
+ [0x2F7D] = { unicodeslot=0x2F7D, category='so', description='KANGXI RADICAL AND', specials={'compat',0x800C} },
+ [0x2F7E] = { unicodeslot=0x2F7E, category='so', description='KANGXI RADICAL PLOW', specials={'compat',0x8012} },
+ [0x2F7F] = { unicodeslot=0x2F7F, category='so', description='KANGXI RADICAL EAR', specials={'compat',0x8033} },
+ [0x2F80] = { unicodeslot=0x2F80, category='so', description='KANGXI RADICAL BRUSH', specials={'compat',0x807F} },
+ [0x2F81] = { unicodeslot=0x2F81, category='so', description='KANGXI RADICAL MEAT', specials={'compat',0x8089} },
+ [0x2F82] = { unicodeslot=0x2F82, category='so', description='KANGXI RADICAL MINISTER', specials={'compat',0x81E3} },
+ [0x2F83] = { unicodeslot=0x2F83, category='so', description='KANGXI RADICAL SELF', specials={'compat',0x81EA} },
+ [0x2F84] = { unicodeslot=0x2F84, category='so', description='KANGXI RADICAL ARRIVE', specials={'compat',0x81F3} },
+ [0x2F85] = { unicodeslot=0x2F85, category='so', description='KANGXI RADICAL MORTAR', specials={'compat',0x81FC} },
+ [0x2F86] = { unicodeslot=0x2F86, category='so', description='KANGXI RADICAL TONGUE', specials={'compat',0x820C} },
+ [0x2F87] = { unicodeslot=0x2F87, category='so', description='KANGXI RADICAL OPPOSE', specials={'compat',0x821B} },
+ [0x2F88] = { unicodeslot=0x2F88, category='so', description='KANGXI RADICAL BOAT', specials={'compat',0x821F} },
+ [0x2F89] = { unicodeslot=0x2F89, category='so', description='KANGXI RADICAL STOPPING', specials={'compat',0x826E} },
+ [0x2F8A] = { unicodeslot=0x2F8A, category='so', description='KANGXI RADICAL COLOR', specials={'compat',0x8272} },
+ [0x2F8B] = { unicodeslot=0x2F8B, category='so', description='KANGXI RADICAL GRASS', specials={'compat',0x8278} },
+ [0x2F8C] = { unicodeslot=0x2F8C, category='so', description='KANGXI RADICAL TIGER', specials={'compat',0x864D} },
+ [0x2F8D] = { unicodeslot=0x2F8D, category='so', description='KANGXI RADICAL INSECT', specials={'compat',0x866B} },
+ [0x2F8E] = { unicodeslot=0x2F8E, category='so', description='KANGXI RADICAL BLOOD', specials={'compat',0x8840} },
+ [0x2F8F] = { unicodeslot=0x2F8F, category='so', description='KANGXI RADICAL WALK ENCLOSURE', specials={'compat',0x884C} },
+ [0x2F90] = { unicodeslot=0x2F90, category='so', description='KANGXI RADICAL CLOTHES', specials={'compat',0x8863} },
+ [0x2F91] = { unicodeslot=0x2F91, category='so', description='KANGXI RADICAL WEST', specials={'compat',0x897E} },
+ [0x2F92] = { unicodeslot=0x2F92, category='so', description='KANGXI RADICAL SEE', specials={'compat',0x898B} },
+ [0x2F93] = { unicodeslot=0x2F93, category='so', description='KANGXI RADICAL HORN', specials={'compat',0x89D2} },
+ [0x2F94] = { unicodeslot=0x2F94, category='so', description='KANGXI RADICAL SPEECH', specials={'compat',0x8A00} },
+ [0x2F95] = { unicodeslot=0x2F95, category='so', description='KANGXI RADICAL VALLEY', specials={'compat',0x8C37} },
+ [0x2F96] = { unicodeslot=0x2F96, category='so', description='KANGXI RADICAL BEAN', specials={'compat',0x8C46} },
+ [0x2F97] = { unicodeslot=0x2F97, category='so', description='KANGXI RADICAL PIG', specials={'compat',0x8C55} },
+ [0x2F98] = { unicodeslot=0x2F98, category='so', description='KANGXI RADICAL BADGER', specials={'compat',0x8C78} },
+ [0x2F99] = { unicodeslot=0x2F99, category='so', description='KANGXI RADICAL SHELL', specials={'compat',0x8C9D} },
+ [0x2F9A] = { unicodeslot=0x2F9A, category='so', description='KANGXI RADICAL RED', specials={'compat',0x8D64} },
+ [0x2F9B] = { unicodeslot=0x2F9B, category='so', description='KANGXI RADICAL RUN', specials={'compat',0x8D70} },
+ [0x2F9C] = { unicodeslot=0x2F9C, category='so', description='KANGXI RADICAL FOOT', specials={'compat',0x8DB3} },
+ [0x2F9D] = { unicodeslot=0x2F9D, category='so', description='KANGXI RADICAL BODY', specials={'compat',0x8EAB} },
+ [0x2F9E] = { unicodeslot=0x2F9E, category='so', description='KANGXI RADICAL CART', specials={'compat',0x8ECA} },
+ [0x2F9F] = { unicodeslot=0x2F9F, category='so', description='KANGXI RADICAL BITTER', specials={'compat',0x8F9B} },
+ [0x2FA0] = { unicodeslot=0x2FA0, category='so', description='KANGXI RADICAL MORNING', specials={'compat',0x8FB0} },
+ [0x2FA1] = { unicodeslot=0x2FA1, category='so', description='KANGXI RADICAL WALK', specials={'compat',0x8FB5} },
+ [0x2FA2] = { unicodeslot=0x2FA2, category='so', description='KANGXI RADICAL CITY', specials={'compat',0x9091} },
+ [0x2FA3] = { unicodeslot=0x2FA3, category='so', description='KANGXI RADICAL WINE', specials={'compat',0x9149} },
+ [0x2FA4] = { unicodeslot=0x2FA4, category='so', description='KANGXI RADICAL DISTINGUISH', specials={'compat',0x91C6} },
+ [0x2FA5] = { unicodeslot=0x2FA5, category='so', description='KANGXI RADICAL VILLAGE', specials={'compat',0x91CC} },
+ [0x2FA6] = { unicodeslot=0x2FA6, category='so', description='KANGXI RADICAL GOLD', specials={'compat',0x91D1} },
+ [0x2FA7] = { unicodeslot=0x2FA7, category='so', description='KANGXI RADICAL LONG', specials={'compat',0x9577} },
+ [0x2FA8] = { unicodeslot=0x2FA8, category='so', description='KANGXI RADICAL GATE', specials={'compat',0x9580} },
+ [0x2FA9] = { unicodeslot=0x2FA9, category='so', description='KANGXI RADICAL MOUND', specials={'compat',0x961C} },
+ [0x2FAA] = { unicodeslot=0x2FAA, category='so', description='KANGXI RADICAL SLAVE', specials={'compat',0x96B6} },
+ [0x2FAB] = { unicodeslot=0x2FAB, category='so', description='KANGXI RADICAL SHORT TAILED BIRD', specials={'compat',0x96B9} },
+ [0x2FAC] = { unicodeslot=0x2FAC, category='so', description='KANGXI RADICAL RAIN', specials={'compat',0x96E8} },
+ [0x2FAD] = { unicodeslot=0x2FAD, category='so', description='KANGXI RADICAL BLUE', specials={'compat',0x9751} },
+ [0x2FAE] = { unicodeslot=0x2FAE, category='so', description='KANGXI RADICAL WRONG', specials={'compat',0x975E} },
+ [0x2FAF] = { unicodeslot=0x2FAF, category='so', description='KANGXI RADICAL FACE', specials={'compat',0x9762} },
+ [0x2FB0] = { unicodeslot=0x2FB0, category='so', description='KANGXI RADICAL LEATHER', specials={'compat',0x9769} },
+ [0x2FB1] = { unicodeslot=0x2FB1, category='so', description='KANGXI RADICAL TANNED LEATHER', specials={'compat',0x97CB} },
+ [0x2FB2] = { unicodeslot=0x2FB2, category='so', description='KANGXI RADICAL LEEK', specials={'compat',0x97ED} },
+ [0x2FB3] = { unicodeslot=0x2FB3, category='so', description='KANGXI RADICAL SOUND', specials={'compat',0x97F3} },
+ [0x2FB4] = { unicodeslot=0x2FB4, category='so', description='KANGXI RADICAL LEAF', specials={'compat',0x9801} },
+ [0x2FB5] = { unicodeslot=0x2FB5, category='so', description='KANGXI RADICAL WIND', specials={'compat',0x98A8} },
+ [0x2FB6] = { unicodeslot=0x2FB6, category='so', description='KANGXI RADICAL FLY', specials={'compat',0x98DB} },
+ [0x2FB7] = { unicodeslot=0x2FB7, category='so', description='KANGXI RADICAL EAT', specials={'compat',0x98DF} },
+ [0x2FB8] = { unicodeslot=0x2FB8, category='so', description='KANGXI RADICAL HEAD', specials={'compat',0x9996} },
+ [0x2FB9] = { unicodeslot=0x2FB9, category='so', description='KANGXI RADICAL FRAGRANT', specials={'compat',0x9999} },
+ [0x2FBA] = { unicodeslot=0x2FBA, category='so', description='KANGXI RADICAL HORSE', specials={'compat',0x99AC} },
+ [0x2FBB] = { unicodeslot=0x2FBB, category='so', description='KANGXI RADICAL BONE', specials={'compat',0x9AA8} },
+ [0x2FBC] = { unicodeslot=0x2FBC, category='so', description='KANGXI RADICAL TALL', specials={'compat',0x9AD8} },
+ [0x2FBD] = { unicodeslot=0x2FBD, category='so', description='KANGXI RADICAL HAIR', specials={'compat',0x9ADF} },
+ [0x2FBE] = { unicodeslot=0x2FBE, category='so', description='KANGXI RADICAL FIGHT', specials={'compat',0x9B25} },
+ [0x2FBF] = { unicodeslot=0x2FBF, category='so', description='KANGXI RADICAL SACRIFICIAL WINE', specials={'compat',0x9B2F} },
+ [0x2FC0] = { unicodeslot=0x2FC0, category='so', description='KANGXI RADICAL CAULDRON', specials={'compat',0x9B32} },
+ [0x2FC1] = { unicodeslot=0x2FC1, category='so', description='KANGXI RADICAL GHOST', specials={'compat',0x9B3C} },
+ [0x2FC2] = { unicodeslot=0x2FC2, category='so', description='KANGXI RADICAL FISH', specials={'compat',0x9B5A} },
+ [0x2FC3] = { unicodeslot=0x2FC3, category='so', description='KANGXI RADICAL BIRD', specials={'compat',0x9CE5} },
+ [0x2FC4] = { unicodeslot=0x2FC4, category='so', description='KANGXI RADICAL SALT', specials={'compat',0x9E75} },
+ [0x2FC5] = { unicodeslot=0x2FC5, category='so', description='KANGXI RADICAL DEER', specials={'compat',0x9E7F} },
+ [0x2FC6] = { unicodeslot=0x2FC6, category='so', description='KANGXI RADICAL WHEAT', specials={'compat',0x9EA5} },
+ [0x2FC7] = { unicodeslot=0x2FC7, category='so', description='KANGXI RADICAL HEMP', specials={'compat',0x9EBB} },
+ [0x2FC8] = { unicodeslot=0x2FC8, category='so', description='KANGXI RADICAL YELLOW', specials={'compat',0x9EC3} },
+ [0x2FC9] = { unicodeslot=0x2FC9, category='so', description='KANGXI RADICAL MILLET', specials={'compat',0x9ECD} },
+ [0x2FCA] = { unicodeslot=0x2FCA, category='so', description='KANGXI RADICAL BLACK', specials={'compat',0x9ED1} },
+ [0x2FCB] = { unicodeslot=0x2FCB, category='so', description='KANGXI RADICAL EMBROIDERY', specials={'compat',0x9EF9} },
+ [0x2FCC] = { unicodeslot=0x2FCC, category='so', description='KANGXI RADICAL FROG', specials={'compat',0x9EFD} },
+ [0x2FCD] = { unicodeslot=0x2FCD, category='so', description='KANGXI RADICAL TRIPOD', specials={'compat',0x9F0E} },
+ [0x2FCE] = { unicodeslot=0x2FCE, category='so', description='KANGXI RADICAL DRUM', specials={'compat',0x9F13} },
+ [0x2FCF] = { unicodeslot=0x2FCF, category='so', description='KANGXI RADICAL RAT', specials={'compat',0x9F20} },
+ [0x2FD0] = { unicodeslot=0x2FD0, category='so', description='KANGXI RADICAL NOSE', specials={'compat',0x9F3B} },
+ [0x2FD1] = { unicodeslot=0x2FD1, category='so', description='KANGXI RADICAL EVEN', specials={'compat',0x9F4A} },
+ [0x2FD2] = { unicodeslot=0x2FD2, category='so', description='KANGXI RADICAL TOOTH', specials={'compat',0x9F52} },
+ [0x2FD3] = { unicodeslot=0x2FD3, category='so', description='KANGXI RADICAL DRAGON', specials={'compat',0x9F8D} },
+ [0x2FD4] = { unicodeslot=0x2FD4, category='so', description='KANGXI RADICAL TURTLE', specials={'compat',0x9F9C} },
+ [0x2FD5] = { unicodeslot=0x2FD5, category='so', description='KANGXI RADICAL FLUTE', specials={'compat',0x9FA0} },
+ [0x2FF0] = { unicodeslot=0x2FF0, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT' },
+ [0x2FF1] = { unicodeslot=0x2FF1, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW' },
+ [0x2FF2] = { unicodeslot=0x2FF2, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT' },
+ [0x2FF3] = { unicodeslot=0x2FF3, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW' },
+ [0x2FF4] = { unicodeslot=0x2FF4, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND' },
+ [0x2FF5] = { unicodeslot=0x2FF5, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE' },
+ [0x2FF6] = { unicodeslot=0x2FF6, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW' },
+ [0x2FF7] = { unicodeslot=0x2FF7, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT' },
+ [0x2FF8] = { unicodeslot=0x2FF8, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT' },
+ [0x2FF9] = { unicodeslot=0x2FF9, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT' },
+ [0x2FFA] = { unicodeslot=0x2FFA, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT' },
+ [0x2FFB] = { unicodeslot=0x2FFB, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID' },
+ [0x3000] = { unicodeslot=0x3000, category='zs', description='IDEOGRAPHIC SPACE', specials={'wide',0x0020} },
+ [0x3001] = { unicodeslot=0x3001, category='po', description='IDEOGRAPHIC COMMA' },
+ [0x3002] = { unicodeslot=0x3002, category='po', description='IDEOGRAPHIC FULL STOP' },
+ [0x3003] = { unicodeslot=0x3003, category='po', description='DITTO MARK' },
+ [0x3004] = { unicodeslot=0x3004, category='so', description='JAPANESE INDUSTRIAL STANDARD SYMBOL' },
+ [0x3005] = { unicodeslot=0x3005, category='lm', description='IDEOGRAPHIC ITERATION MARK' },
+ [0x3006] = { unicodeslot=0x3006, category='lo', description='IDEOGRAPHIC CLOSING MARK' },
+ [0x3007] = { unicodeslot=0x3007, category='nl', description='IDEOGRAPHIC NUMBER ZERO' },
+ [0x3008] = { unicodeslot=0x3008, category='ps', description='LEFT ANGLE BRACKET' },
+ [0x3009] = { unicodeslot=0x3009, category='pe', description='RIGHT ANGLE BRACKET' },
+ [0x300A] = { unicodeslot=0x300A, category='ps', description='LEFT DOUBLE ANGLE BRACKET' },
+ [0x300B] = { unicodeslot=0x300B, category='pe', description='RIGHT DOUBLE ANGLE BRACKET' },
+ [0x300C] = { unicodeslot=0x300C, category='ps', description='LEFT CORNER BRACKET' },
+ [0x300D] = { unicodeslot=0x300D, category='pe', description='RIGHT CORNER BRACKET' },
+ [0x300E] = { unicodeslot=0x300E, category='ps', description='LEFT WHITE CORNER BRACKET' },
+ [0x300F] = { unicodeslot=0x300F, category='pe', description='RIGHT WHITE CORNER BRACKET' },
+ [0x3010] = { unicodeslot=0x3010, category='ps', description='LEFT BLACK LENTICULAR BRACKET' },
+ [0x3011] = { unicodeslot=0x3011, category='pe', description='RIGHT BLACK LENTICULAR BRACKET' },
+ [0x3012] = { unicodeslot=0x3012, category='so', description='POSTAL MARK' },
+ [0x3013] = { unicodeslot=0x3013, category='so', description='GETA MARK' },
+ [0x3014] = { unicodeslot=0x3014, category='ps', description='LEFT TORTOISE SHELL BRACKET' },
+ [0x3015] = { unicodeslot=0x3015, category='pe', description='RIGHT TORTOISE SHELL BRACKET' },
+ [0x3016] = { unicodeslot=0x3016, category='ps', description='LEFT WHITE LENTICULAR BRACKET' },
+ [0x3017] = { unicodeslot=0x3017, category='pe', description='RIGHT WHITE LENTICULAR BRACKET' },
+ [0x3018] = { unicodeslot=0x3018, category='ps', description='LEFT WHITE TORTOISE SHELL BRACKET' },
+ [0x3019] = { unicodeslot=0x3019, category='pe', description='RIGHT WHITE TORTOISE SHELL BRACKET' },
+ [0x301A] = { unicodeslot=0x301A, category='ps', description='LEFT WHITE SQUARE BRACKET' },
+ [0x301B] = { unicodeslot=0x301B, category='pe', description='RIGHT WHITE SQUARE BRACKET' },
+ [0x301C] = { unicodeslot=0x301C, category='pd', description='WAVE DASH' },
+ [0x301D] = { unicodeslot=0x301D, category='ps', description='REVERSED DOUBLE PRIME QUOTATION MARK' },
+ [0x301E] = { unicodeslot=0x301E, category='pe', description='DOUBLE PRIME QUOTATION MARK' },
+ [0x301F] = { unicodeslot=0x301F, category='pe', description='LOW DOUBLE PRIME QUOTATION MARK' },
+ [0x3020] = { unicodeslot=0x3020, category='so', description='POSTAL MARK FACE' },
+ [0x3021] = { unicodeslot=0x3021, category='nl', description='HANGZHOU NUMERAL ONE' },
+ [0x3022] = { unicodeslot=0x3022, category='nl', description='HANGZHOU NUMERAL TWO' },
+ [0x3023] = { unicodeslot=0x3023, category='nl', description='HANGZHOU NUMERAL THREE' },
+ [0x3024] = { unicodeslot=0x3024, category='nl', description='HANGZHOU NUMERAL FOUR' },
+ [0x3025] = { unicodeslot=0x3025, category='nl', description='HANGZHOU NUMERAL FIVE' },
+ [0x3026] = { unicodeslot=0x3026, category='nl', description='HANGZHOU NUMERAL SIX' },
+ [0x3027] = { unicodeslot=0x3027, category='nl', description='HANGZHOU NUMERAL SEVEN' },
+ [0x3028] = { unicodeslot=0x3028, category='nl', description='HANGZHOU NUMERAL EIGHT' },
+ [0x3029] = { unicodeslot=0x3029, category='nl', description='HANGZHOU NUMERAL NINE' },
+ [0x302A] = { unicodeslot=0x302A, category='mn', description='IDEOGRAPHIC LEVEL TONE MARK' },
+ [0x302B] = { unicodeslot=0x302B, category='mn', description='IDEOGRAPHIC RISING TONE MARK' },
+ [0x302C] = { unicodeslot=0x302C, category='mn', description='IDEOGRAPHIC DEPARTING TONE MARK' },
+ [0x302D] = { unicodeslot=0x302D, category='mn', description='IDEOGRAPHIC ENTERING TONE MARK' },
+ [0x302E] = { unicodeslot=0x302E, category='mn', description='HANGUL SINGLE DOT TONE MARK' },
+ [0x302F] = { unicodeslot=0x302F, category='mn', description='HANGUL DOUBLE DOT TONE MARK' },
+ [0x3030] = { unicodeslot=0x3030, category='pd', description='WAVY DASH' },
+ [0x3031] = { unicodeslot=0x3031, category='lm', description='VERTICAL KANA REPEAT MARK' },
+ [0x3032] = { unicodeslot=0x3032, category='lm', description='VERTICAL KANA REPEAT WITH VOICED SOUND MARK' },
+ [0x3033] = { unicodeslot=0x3033, category='lm', description='VERTICAL KANA REPEAT MARK UPPER HALF' },
+ [0x3034] = { unicodeslot=0x3034, category='lm', description='VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF' },
+ [0x3035] = { unicodeslot=0x3035, category='lm', description='VERTICAL KANA REPEAT MARK LOWER HALF' },
+ [0x3036] = { unicodeslot=0x3036, category='so', description='CIRCLED POSTAL MARK', specials={'compat',0x3012} },
+ [0x3037] = { unicodeslot=0x3037, category='so', description='IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL' },
+ [0x3038] = { unicodeslot=0x3038, category='nl', description='HANGZHOU NUMERAL TEN', specials={'compat',0x5341} },
+ [0x3039] = { unicodeslot=0x3039, category='nl', description='HANGZHOU NUMERAL TWENTY', specials={'compat',0x5344} },
+ [0x303A] = { unicodeslot=0x303A, category='nl', description='HANGZHOU NUMERAL THIRTY', specials={'compat',0x5345} },
+ [0x303B] = { unicodeslot=0x303B, category='lm', description='VERTICAL IDEOGRAPHIC ITERATION MARK' },
+ [0x303C] = { unicodeslot=0x303C, category='lo', description='MASU MARK' },
+ [0x303D] = { unicodeslot=0x303D, category='po', description='PART ALTERNATION MARK' },
+ [0x303E] = { unicodeslot=0x303E, category='so', description='IDEOGRAPHIC VARIATION INDICATOR' },
+ [0x303F] = { unicodeslot=0x303F, category='so', description='IDEOGRAPHIC HALF FILL SPACE' },
+ [0x3041] = { unicodeslot=0x3041, category='lo', description='HIRAGANA LETTER SMALL A' },
+ [0x3042] = { unicodeslot=0x3042, category='lo', description='HIRAGANA LETTER A' },
+ [0x3043] = { unicodeslot=0x3043, category='lo', description='HIRAGANA LETTER SMALL I' },
+ [0x3044] = { unicodeslot=0x3044, category='lo', description='HIRAGANA LETTER I' },
+ [0x3045] = { unicodeslot=0x3045, category='lo', description='HIRAGANA LETTER SMALL U' },
+ [0x3046] = { unicodeslot=0x3046, category='lo', description='HIRAGANA LETTER U' },
+ [0x3047] = { unicodeslot=0x3047, category='lo', description='HIRAGANA LETTER SMALL E' },
+ [0x3048] = { unicodeslot=0x3048, category='lo', description='HIRAGANA LETTER E' },
+ [0x3049] = { unicodeslot=0x3049, category='lo', description='HIRAGANA LETTER SMALL O' },
+ [0x304A] = { unicodeslot=0x304A, category='lo', description='HIRAGANA LETTER O' },
+ [0x304B] = { unicodeslot=0x304B, category='lo', description='HIRAGANA LETTER KA' },
+ [0x304C] = { unicodeslot=0x304C, category='lo', description='HIRAGANA LETTER GA', specials={'char',0x304B,0x3099} },
+ [0x304D] = { unicodeslot=0x304D, category='lo', description='HIRAGANA LETTER KI' },
+ [0x304E] = { unicodeslot=0x304E, category='lo', description='HIRAGANA LETTER GI', specials={'char',0x304D,0x3099} },
+ [0x304F] = { unicodeslot=0x304F, category='lo', description='HIRAGANA LETTER KU' },
+ [0x3050] = { unicodeslot=0x3050, category='lo', description='HIRAGANA LETTER GU', specials={'char',0x304F,0x3099} },
+ [0x3051] = { unicodeslot=0x3051, category='lo', description='HIRAGANA LETTER KE' },
+ [0x3052] = { unicodeslot=0x3052, category='lo', description='HIRAGANA LETTER GE', specials={'char',0x3051,0x3099} },
+ [0x3053] = { unicodeslot=0x3053, category='lo', description='HIRAGANA LETTER KO' },
+ [0x3054] = { unicodeslot=0x3054, category='lo', description='HIRAGANA LETTER GO', specials={'char',0x3053,0x3099} },
+ [0x3055] = { unicodeslot=0x3055, category='lo', description='HIRAGANA LETTER SA' },
+ [0x3056] = { unicodeslot=0x3056, category='lo', description='HIRAGANA LETTER ZA', specials={'char',0x3055,0x3099} },
+ [0x3057] = { unicodeslot=0x3057, category='lo', description='HIRAGANA LETTER SI' },
+ [0x3058] = { unicodeslot=0x3058, category='lo', description='HIRAGANA LETTER ZI', specials={'char',0x3057,0x3099} },
+ [0x3059] = { unicodeslot=0x3059, category='lo', description='HIRAGANA LETTER SU' },
+ [0x305A] = { unicodeslot=0x305A, category='lo', description='HIRAGANA LETTER ZU', specials={'char',0x3059,0x3099} },
+ [0x305B] = { unicodeslot=0x305B, category='lo', description='HIRAGANA LETTER SE' },
+ [0x305C] = { unicodeslot=0x305C, category='lo', description='HIRAGANA LETTER ZE', specials={'char',0x305B,0x3099} },
+ [0x305D] = { unicodeslot=0x305D, category='lo', description='HIRAGANA LETTER SO' },
+ [0x305E] = { unicodeslot=0x305E, category='lo', description='HIRAGANA LETTER ZO', specials={'char',0x305D,0x3099} },
+ [0x305F] = { unicodeslot=0x305F, category='lo', description='HIRAGANA LETTER TA' },
+ [0x3060] = { unicodeslot=0x3060, category='lo', description='HIRAGANA LETTER DA', specials={'char',0x305F,0x3099} },
+ [0x3061] = { unicodeslot=0x3061, category='lo', description='HIRAGANA LETTER TI' },
+ [0x3062] = { unicodeslot=0x3062, category='lo', description='HIRAGANA LETTER DI', specials={'char',0x3061,0x3099} },
+ [0x3063] = { unicodeslot=0x3063, category='lo', description='HIRAGANA LETTER SMALL TU' },
+ [0x3064] = { unicodeslot=0x3064, category='lo', description='HIRAGANA LETTER TU' },
+ [0x3065] = { unicodeslot=0x3065, category='lo', description='HIRAGANA LETTER DU', specials={'char',0x3064,0x3099} },
+ [0x3066] = { unicodeslot=0x3066, category='lo', description='HIRAGANA LETTER TE' },
+ [0x3067] = { unicodeslot=0x3067, category='lo', description='HIRAGANA LETTER DE', specials={'char',0x3066,0x3099} },
+ [0x3068] = { unicodeslot=0x3068, category='lo', description='HIRAGANA LETTER TO' },
+ [0x3069] = { unicodeslot=0x3069, category='lo', description='HIRAGANA LETTER DO', specials={'char',0x3068,0x3099} },
+ [0x306A] = { unicodeslot=0x306A, category='lo', description='HIRAGANA LETTER NA' },
+ [0x306B] = { unicodeslot=0x306B, category='lo', description='HIRAGANA LETTER NI' },
+ [0x306C] = { unicodeslot=0x306C, category='lo', description='HIRAGANA LETTER NU' },
+ [0x306D] = { unicodeslot=0x306D, category='lo', description='HIRAGANA LETTER NE' },
+ [0x306E] = { unicodeslot=0x306E, category='lo', description='HIRAGANA LETTER NO' },
+ [0x306F] = { unicodeslot=0x306F, category='lo', description='HIRAGANA LETTER HA' },
+ [0x3070] = { unicodeslot=0x3070, category='lo', description='HIRAGANA LETTER BA', specials={'char',0x306F,0x3099} },
+ [0x3071] = { unicodeslot=0x3071, category='lo', description='HIRAGANA LETTER PA', specials={'char',0x306F,0x309A} },
+ [0x3072] = { unicodeslot=0x3072, category='lo', description='HIRAGANA LETTER HI' },
+ [0x3073] = { unicodeslot=0x3073, category='lo', description='HIRAGANA LETTER BI', specials={'char',0x3072,0x3099} },
+ [0x3074] = { unicodeslot=0x3074, category='lo', description='HIRAGANA LETTER PI', specials={'char',0x3072,0x309A} },
+ [0x3075] = { unicodeslot=0x3075, category='lo', description='HIRAGANA LETTER HU' },
+ [0x3076] = { unicodeslot=0x3076, category='lo', description='HIRAGANA LETTER BU', specials={'char',0x3075,0x3099} },
+ [0x3077] = { unicodeslot=0x3077, category='lo', description='HIRAGANA LETTER PU', specials={'char',0x3075,0x309A} },
+ [0x3078] = { unicodeslot=0x3078, category='lo', description='HIRAGANA LETTER HE' },
+ [0x3079] = { unicodeslot=0x3079, category='lo', description='HIRAGANA LETTER BE', specials={'char',0x3078,0x3099} },
+ [0x307A] = { unicodeslot=0x307A, category='lo', description='HIRAGANA LETTER PE', specials={'char',0x3078,0x309A} },
+ [0x307B] = { unicodeslot=0x307B, category='lo', description='HIRAGANA LETTER HO' },
+ [0x307C] = { unicodeslot=0x307C, category='lo', description='HIRAGANA LETTER BO', specials={'char',0x307B,0x3099} },
+ [0x307D] = { unicodeslot=0x307D, category='lo', description='HIRAGANA LETTER PO', specials={'char',0x307B,0x309A} },
+ [0x307E] = { unicodeslot=0x307E, category='lo', description='HIRAGANA LETTER MA' },
+ [0x307F] = { unicodeslot=0x307F, category='lo', description='HIRAGANA LETTER MI' },
+ [0x3080] = { unicodeslot=0x3080, category='lo', description='HIRAGANA LETTER MU' },
+ [0x3081] = { unicodeslot=0x3081, category='lo', description='HIRAGANA LETTER ME' },
+ [0x3082] = { unicodeslot=0x3082, category='lo', description='HIRAGANA LETTER MO' },
+ [0x3083] = { unicodeslot=0x3083, category='lo', description='HIRAGANA LETTER SMALL YA' },
+ [0x3084] = { unicodeslot=0x3084, category='lo', description='HIRAGANA LETTER YA' },
+ [0x3085] = { unicodeslot=0x3085, category='lo', description='HIRAGANA LETTER SMALL YU' },
+ [0x3086] = { unicodeslot=0x3086, category='lo', description='HIRAGANA LETTER YU' },
+ [0x3087] = { unicodeslot=0x3087, category='lo', description='HIRAGANA LETTER SMALL YO' },
+ [0x3088] = { unicodeslot=0x3088, category='lo', description='HIRAGANA LETTER YO' },
+ [0x3089] = { unicodeslot=0x3089, category='lo', description='HIRAGANA LETTER RA' },
+ [0x308A] = { unicodeslot=0x308A, category='lo', description='HIRAGANA LETTER RI' },
+ [0x308B] = { unicodeslot=0x308B, category='lo', description='HIRAGANA LETTER RU' },
+ [0x308C] = { unicodeslot=0x308C, category='lo', description='HIRAGANA LETTER RE' },
+ [0x308D] = { unicodeslot=0x308D, category='lo', description='HIRAGANA LETTER RO' },
+ [0x308E] = { unicodeslot=0x308E, category='lo', description='HIRAGANA LETTER SMALL WA' },
+ [0x308F] = { unicodeslot=0x308F, category='lo', description='HIRAGANA LETTER WA' },
+ [0x3090] = { unicodeslot=0x3090, category='lo', description='HIRAGANA LETTER WI' },
+ [0x3091] = { unicodeslot=0x3091, category='lo', description='HIRAGANA LETTER WE' },
+ [0x3092] = { unicodeslot=0x3092, category='lo', description='HIRAGANA LETTER WO' },
+ [0x3093] = { unicodeslot=0x3093, category='lo', description='HIRAGANA LETTER N' },
+ [0x3094] = { unicodeslot=0x3094, category='lo', description='HIRAGANA LETTER VU', specials={'char',0x3046,0x3099} },
+ [0x3095] = { unicodeslot=0x3095, category='lo', description='HIRAGANA LETTER SMALL KA' },
+ [0x3096] = { unicodeslot=0x3096, category='lo', description='HIRAGANA LETTER SMALL KE' },
+ [0x3099] = { unicodeslot=0x3099, category='mn', description='COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK' },
+ [0x309A] = { unicodeslot=0x309A, category='mn', description='COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK' },
+ [0x309B] = { unicodeslot=0x309B, category='sk', description='KATAKANA-HIRAGANA VOICED SOUND MARK', specials={'compat',0x0020,0x3099} },
+ [0x309C] = { unicodeslot=0x309C, category='sk', description='KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK', specials={'compat',0x0020,0x309A} },
+ [0x309D] = { unicodeslot=0x309D, category='lm', description='HIRAGANA ITERATION MARK' },
+ [0x309E] = { unicodeslot=0x309E, category='lm', description='HIRAGANA VOICED ITERATION MARK', specials={'char',0x309D,0x3099} },
+ [0x309F] = { unicodeslot=0x309F, category='lo', description='HIRAGANA DIGRAPH YORI', specials={'vertical',0x3088,0x308A} },
+ [0x30A0] = { unicodeslot=0x30A0, category='pd', description='KATAKANA-HIRAGANA DOUBLE HYPHEN' },
+ [0x30A1] = { unicodeslot=0x30A1, category='lo', description='KATAKANA LETTER SMALL A' },
+ [0x30A2] = { unicodeslot=0x30A2, category='lo', description='KATAKANA LETTER A' },
+ [0x30A3] = { unicodeslot=0x30A3, category='lo', description='KATAKANA LETTER SMALL I' },
+ [0x30A4] = { unicodeslot=0x30A4, category='lo', description='KATAKANA LETTER I' },
+ [0x30A5] = { unicodeslot=0x30A5, category='lo', description='KATAKANA LETTER SMALL U' },
+ [0x30A6] = { unicodeslot=0x30A6, category='lo', description='KATAKANA LETTER U' },
+ [0x30A7] = { unicodeslot=0x30A7, category='lo', description='KATAKANA LETTER SMALL E' },
+ [0x30A8] = { unicodeslot=0x30A8, category='lo', description='KATAKANA LETTER E' },
+ [0x30A9] = { unicodeslot=0x30A9, category='lo', description='KATAKANA LETTER SMALL O' },
+ [0x30AA] = { unicodeslot=0x30AA, category='lo', description='KATAKANA LETTER O' },
+ [0x30AB] = { unicodeslot=0x30AB, category='lo', description='KATAKANA LETTER KA' },
+ [0x30AC] = { unicodeslot=0x30AC, category='lo', description='KATAKANA LETTER GA', specials={'char',0x30AB,0x3099} },
+ [0x30AD] = { unicodeslot=0x30AD, category='lo', description='KATAKANA LETTER KI' },
+ [0x30AE] = { unicodeslot=0x30AE, category='lo', description='KATAKANA LETTER GI', specials={'char',0x30AD,0x3099} },
+ [0x30AF] = { unicodeslot=0x30AF, category='lo', description='KATAKANA LETTER KU' },
+ [0x30B0] = { unicodeslot=0x30B0, category='lo', description='KATAKANA LETTER GU', specials={'char',0x30AF,0x3099} },
+ [0x30B1] = { unicodeslot=0x30B1, category='lo', description='KATAKANA LETTER KE' },
+ [0x30B2] = { unicodeslot=0x30B2, category='lo', description='KATAKANA LETTER GE', specials={'char',0x30B1,0x3099} },
+ [0x30B3] = { unicodeslot=0x30B3, category='lo', description='KATAKANA LETTER KO' },
+ [0x30B4] = { unicodeslot=0x30B4, category='lo', description='KATAKANA LETTER GO', specials={'char',0x30B3,0x3099} },
+ [0x30B5] = { unicodeslot=0x30B5, category='lo', description='KATAKANA LETTER SA' },
+ [0x30B6] = { unicodeslot=0x30B6, category='lo', description='KATAKANA LETTER ZA', specials={'char',0x30B5,0x3099} },
+ [0x30B7] = { unicodeslot=0x30B7, category='lo', description='KATAKANA LETTER SI' },
+ [0x30B8] = { unicodeslot=0x30B8, category='lo', description='KATAKANA LETTER ZI', specials={'char',0x30B7,0x3099} },
+ [0x30B9] = { unicodeslot=0x30B9, category='lo', description='KATAKANA LETTER SU' },
+ [0x30BA] = { unicodeslot=0x30BA, category='lo', description='KATAKANA LETTER ZU', specials={'char',0x30B9,0x3099} },
+ [0x30BB] = { unicodeslot=0x30BB, category='lo', description='KATAKANA LETTER SE' },
+ [0x30BC] = { unicodeslot=0x30BC, category='lo', description='KATAKANA LETTER ZE', specials={'char',0x30BB,0x3099} },
+ [0x30BD] = { unicodeslot=0x30BD, category='lo', description='KATAKANA LETTER SO' },
+ [0x30BE] = { unicodeslot=0x30BE, category='lo', description='KATAKANA LETTER ZO', specials={'char',0x30BD,0x3099} },
+ [0x30BF] = { unicodeslot=0x30BF, category='lo', description='KATAKANA LETTER TA' },
+ [0x30C0] = { unicodeslot=0x30C0, category='lo', description='KATAKANA LETTER DA', specials={'char',0x30BF,0x3099} },
+ [0x30C1] = { unicodeslot=0x30C1, category='lo', description='KATAKANA LETTER TI' },
+ [0x30C2] = { unicodeslot=0x30C2, category='lo', description='KATAKANA LETTER DI', specials={'char',0x30C1,0x3099} },
+ [0x30C3] = { unicodeslot=0x30C3, category='lo', description='KATAKANA LETTER SMALL TU' },
+ [0x30C4] = { unicodeslot=0x30C4, category='lo', description='KATAKANA LETTER TU' },
+ [0x30C5] = { unicodeslot=0x30C5, category='lo', description='KATAKANA LETTER DU', specials={'char',0x30C4,0x3099} },
+ [0x30C6] = { unicodeslot=0x30C6, category='lo', description='KATAKANA LETTER TE' },
+ [0x30C7] = { unicodeslot=0x30C7, category='lo', description='KATAKANA LETTER DE', specials={'char',0x30C6,0x3099} },
+ [0x30C8] = { unicodeslot=0x30C8, category='lo', description='KATAKANA LETTER TO' },
+ [0x30C9] = { unicodeslot=0x30C9, category='lo', description='KATAKANA LETTER DO', specials={'char',0x30C8,0x3099} },
+ [0x30CA] = { unicodeslot=0x30CA, category='lo', description='KATAKANA LETTER NA' },
+ [0x30CB] = { unicodeslot=0x30CB, category='lo', description='KATAKANA LETTER NI' },
+ [0x30CC] = { unicodeslot=0x30CC, category='lo', description='KATAKANA LETTER NU' },
+ [0x30CD] = { unicodeslot=0x30CD, category='lo', description='KATAKANA LETTER NE' },
+ [0x30CE] = { unicodeslot=0x30CE, category='lo', description='KATAKANA LETTER NO' },
+ [0x30CF] = { unicodeslot=0x30CF, category='lo', description='KATAKANA LETTER HA' },
+ [0x30D0] = { unicodeslot=0x30D0, category='lo', description='KATAKANA LETTER BA', specials={'char',0x30CF,0x3099} },
+ [0x30D1] = { unicodeslot=0x30D1, category='lo', description='KATAKANA LETTER PA', specials={'char',0x30CF,0x309A} },
+ [0x30D2] = { unicodeslot=0x30D2, category='lo', description='KATAKANA LETTER HI' },
+ [0x30D3] = { unicodeslot=0x30D3, category='lo', description='KATAKANA LETTER BI', specials={'char',0x30D2,0x3099} },
+ [0x30D4] = { unicodeslot=0x30D4, category='lo', description='KATAKANA LETTER PI', specials={'char',0x30D2,0x309A} },
+ [0x30D5] = { unicodeslot=0x30D5, category='lo', description='KATAKANA LETTER HU' },
+ [0x30D6] = { unicodeslot=0x30D6, category='lo', description='KATAKANA LETTER BU', specials={'char',0x30D5,0x3099} },
+ [0x30D7] = { unicodeslot=0x30D7, category='lo', description='KATAKANA LETTER PU', specials={'char',0x30D5,0x309A} },
+ [0x30D8] = { unicodeslot=0x30D8, category='lo', description='KATAKANA LETTER HE' },
+ [0x30D9] = { unicodeslot=0x30D9, category='lo', description='KATAKANA LETTER BE', specials={'char',0x30D8,0x3099} },
+ [0x30DA] = { unicodeslot=0x30DA, category='lo', description='KATAKANA LETTER PE', specials={'char',0x30D8,0x309A} },
+ [0x30DB] = { unicodeslot=0x30DB, category='lo', description='KATAKANA LETTER HO' },
+ [0x30DC] = { unicodeslot=0x30DC, category='lo', description='KATAKANA LETTER BO', specials={'char',0x30DB,0x3099} },
+ [0x30DD] = { unicodeslot=0x30DD, category='lo', description='KATAKANA LETTER PO', specials={'char',0x30DB,0x309A} },
+ [0x30DE] = { unicodeslot=0x30DE, category='lo', description='KATAKANA LETTER MA' },
+ [0x30DF] = { unicodeslot=0x30DF, category='lo', description='KATAKANA LETTER MI' },
+ [0x30E0] = { unicodeslot=0x30E0, category='lo', description='KATAKANA LETTER MU' },
+ [0x30E1] = { unicodeslot=0x30E1, category='lo', description='KATAKANA LETTER ME' },
+ [0x30E2] = { unicodeslot=0x30E2, category='lo', description='KATAKANA LETTER MO' },
+ [0x30E3] = { unicodeslot=0x30E3, category='lo', description='KATAKANA LETTER SMALL YA' },
+ [0x30E4] = { unicodeslot=0x30E4, category='lo', description='KATAKANA LETTER YA' },
+ [0x30E5] = { unicodeslot=0x30E5, category='lo', description='KATAKANA LETTER SMALL YU' },
+ [0x30E6] = { unicodeslot=0x30E6, category='lo', description='KATAKANA LETTER YU' },
+ [0x30E7] = { unicodeslot=0x30E7, category='lo', description='KATAKANA LETTER SMALL YO' },
+ [0x30E8] = { unicodeslot=0x30E8, category='lo', description='KATAKANA LETTER YO' },
+ [0x30E9] = { unicodeslot=0x30E9, category='lo', description='KATAKANA LETTER RA' },
+ [0x30EA] = { unicodeslot=0x30EA, category='lo', description='KATAKANA LETTER RI' },
+ [0x30EB] = { unicodeslot=0x30EB, category='lo', description='KATAKANA LETTER RU' },
+ [0x30EC] = { unicodeslot=0x30EC, category='lo', description='KATAKANA LETTER RE' },
+ [0x30ED] = { unicodeslot=0x30ED, category='lo', description='KATAKANA LETTER RO' },
+ [0x30EE] = { unicodeslot=0x30EE, category='lo', description='KATAKANA LETTER SMALL WA' },
+ [0x30EF] = { unicodeslot=0x30EF, category='lo', description='KATAKANA LETTER WA' },
+ [0x30F0] = { unicodeslot=0x30F0, category='lo', description='KATAKANA LETTER WI' },
+ [0x30F1] = { unicodeslot=0x30F1, category='lo', description='KATAKANA LETTER WE' },
+ [0x30F2] = { unicodeslot=0x30F2, category='lo', description='KATAKANA LETTER WO' },
+ [0x30F3] = { unicodeslot=0x30F3, category='lo', description='KATAKANA LETTER N' },
+ [0x30F4] = { unicodeslot=0x30F4, category='lo', description='KATAKANA LETTER VU', specials={'char',0x30A6,0x3099} },
+ [0x30F5] = { unicodeslot=0x30F5, category='lo', description='KATAKANA LETTER SMALL KA' },
+ [0x30F6] = { unicodeslot=0x30F6, category='lo', description='KATAKANA LETTER SMALL KE' },
+ [0x30F7] = { unicodeslot=0x30F7, category='lo', description='KATAKANA LETTER VA', specials={'char',0x30EF,0x3099} },
+ [0x30F8] = { unicodeslot=0x30F8, category='lo', description='KATAKANA LETTER VI', specials={'char',0x30F0,0x3099} },
+ [0x30F9] = { unicodeslot=0x30F9, category='lo', description='KATAKANA LETTER VE', specials={'char',0x30F1,0x3099} },
+ [0x30FA] = { unicodeslot=0x30FA, category='lo', description='KATAKANA LETTER VO', specials={'char',0x30F2,0x3099} },
+ [0x30FB] = { unicodeslot=0x30FB, category='po', description='KATAKANA MIDDLE DOT' },
+ [0x30FC] = { unicodeslot=0x30FC, category='lm', description='KATAKANA-HIRAGANA PROLONGED SOUND MARK' },
+ [0x30FD] = { unicodeslot=0x30FD, category='lm', description='KATAKANA ITERATION MARK' },
+ [0x30FE] = { unicodeslot=0x30FE, category='lm', description='KATAKANA VOICED ITERATION MARK', specials={'char',0x30FD,0x3099} },
+ [0x30FF] = { unicodeslot=0x30FF, category='lo', description='KATAKANA DIGRAPH KOTO', specials={'vertical',0x30B3,0x30C8} },
+ [0x3105] = { unicodeslot=0x3105, category='lo', description='BOPOMOFO LETTER B' },
+ [0x3106] = { unicodeslot=0x3106, category='lo', description='BOPOMOFO LETTER P' },
+ [0x3107] = { unicodeslot=0x3107, category='lo', description='BOPOMOFO LETTER M' },
+ [0x3108] = { unicodeslot=0x3108, category='lo', description='BOPOMOFO LETTER F' },
+ [0x3109] = { unicodeslot=0x3109, category='lo', description='BOPOMOFO LETTER D' },
+ [0x310A] = { unicodeslot=0x310A, category='lo', description='BOPOMOFO LETTER T' },
+ [0x310B] = { unicodeslot=0x310B, category='lo', description='BOPOMOFO LETTER N' },
+ [0x310C] = { unicodeslot=0x310C, category='lo', description='BOPOMOFO LETTER L' },
+ [0x310D] = { unicodeslot=0x310D, category='lo', description='BOPOMOFO LETTER G' },
+ [0x310E] = { unicodeslot=0x310E, category='lo', description='BOPOMOFO LETTER K' },
+ [0x310F] = { unicodeslot=0x310F, category='lo', description='BOPOMOFO LETTER H' },
+ [0x3110] = { unicodeslot=0x3110, category='lo', description='BOPOMOFO LETTER J' },
+ [0x3111] = { unicodeslot=0x3111, category='lo', description='BOPOMOFO LETTER Q' },
+ [0x3112] = { unicodeslot=0x3112, category='lo', description='BOPOMOFO LETTER X' },
+ [0x3113] = { unicodeslot=0x3113, category='lo', description='BOPOMOFO LETTER ZH' },
+ [0x3114] = { unicodeslot=0x3114, category='lo', description='BOPOMOFO LETTER CH' },
+ [0x3115] = { unicodeslot=0x3115, category='lo', description='BOPOMOFO LETTER SH' },
+ [0x3116] = { unicodeslot=0x3116, category='lo', description='BOPOMOFO LETTER R' },
+ [0x3117] = { unicodeslot=0x3117, category='lo', description='BOPOMOFO LETTER Z' },
+ [0x3118] = { unicodeslot=0x3118, category='lo', description='BOPOMOFO LETTER C' },
+ [0x3119] = { unicodeslot=0x3119, category='lo', description='BOPOMOFO LETTER S' },
+ [0x311A] = { unicodeslot=0x311A, category='lo', description='BOPOMOFO LETTER A' },
+ [0x311B] = { unicodeslot=0x311B, category='lo', description='BOPOMOFO LETTER O' },
+ [0x311C] = { unicodeslot=0x311C, category='lo', description='BOPOMOFO LETTER E' },
+ [0x311D] = { unicodeslot=0x311D, category='lo', description='BOPOMOFO LETTER EH' },
+ [0x311E] = { unicodeslot=0x311E, category='lo', description='BOPOMOFO LETTER AI' },
+ [0x311F] = { unicodeslot=0x311F, category='lo', description='BOPOMOFO LETTER EI' },
+ [0x3120] = { unicodeslot=0x3120, category='lo', description='BOPOMOFO LETTER AU' },
+ [0x3121] = { unicodeslot=0x3121, category='lo', description='BOPOMOFO LETTER OU' },
+ [0x3122] = { unicodeslot=0x3122, category='lo', description='BOPOMOFO LETTER AN' },
+ [0x3123] = { unicodeslot=0x3123, category='lo', description='BOPOMOFO LETTER EN' },
+ [0x3124] = { unicodeslot=0x3124, category='lo', description='BOPOMOFO LETTER ANG' },
+ [0x3125] = { unicodeslot=0x3125, category='lo', description='BOPOMOFO LETTER ENG' },
+ [0x3126] = { unicodeslot=0x3126, category='lo', description='BOPOMOFO LETTER ER' },
+ [0x3127] = { unicodeslot=0x3127, category='lo', description='BOPOMOFO LETTER I' },
+ [0x3128] = { unicodeslot=0x3128, category='lo', description='BOPOMOFO LETTER U' },
+ [0x3129] = { unicodeslot=0x3129, category='lo', description='BOPOMOFO LETTER IU' },
+ [0x312A] = { unicodeslot=0x312A, category='lo', description='BOPOMOFO LETTER V' },
+ [0x312B] = { unicodeslot=0x312B, category='lo', description='BOPOMOFO LETTER NG' },
+ [0x312C] = { unicodeslot=0x312C, category='lo', description='BOPOMOFO LETTER GN' },
+ [0x3131] = { unicodeslot=0x3131, category='lo', description='HANGUL LETTER KIYEOK', specials={'compat',0x1100} },
+ [0x3132] = { unicodeslot=0x3132, category='lo', description='HANGUL LETTER SSANGKIYEOK', specials={'compat',0x1101} },
+ [0x3133] = { unicodeslot=0x3133, category='lo', description='HANGUL LETTER KIYEOK-SIOS', specials={'compat',0x11AA} },
+ [0x3134] = { unicodeslot=0x3134, category='lo', description='HANGUL LETTER NIEUN', specials={'compat',0x1102} },
+ [0x3135] = { unicodeslot=0x3135, category='lo', description='HANGUL LETTER NIEUN-CIEUC', specials={'compat',0x11AC} },
+ [0x3136] = { unicodeslot=0x3136, category='lo', description='HANGUL LETTER NIEUN-HIEUH', specials={'compat',0x11AD} },
+ [0x3137] = { unicodeslot=0x3137, category='lo', description='HANGUL LETTER TIKEUT', specials={'compat',0x1103} },
+ [0x3138] = { unicodeslot=0x3138, category='lo', description='HANGUL LETTER SSANGTIKEUT', specials={'compat',0x1104} },
+ [0x3139] = { unicodeslot=0x3139, category='lo', description='HANGUL LETTER RIEUL', specials={'compat',0x1105} },
+ [0x313A] = { unicodeslot=0x313A, category='lo', description='HANGUL LETTER RIEUL-KIYEOK', specials={'compat',0x11B0} },
+ [0x313B] = { unicodeslot=0x313B, category='lo', description='HANGUL LETTER RIEUL-MIEUM', specials={'compat',0x11B1} },
+ [0x313C] = { unicodeslot=0x313C, category='lo', description='HANGUL LETTER RIEUL-PIEUP', specials={'compat',0x11B2} },
+ [0x313D] = { unicodeslot=0x313D, category='lo', description='HANGUL LETTER RIEUL-SIOS', specials={'compat',0x11B3} },
+ [0x313E] = { unicodeslot=0x313E, category='lo', description='HANGUL LETTER RIEUL-THIEUTH', specials={'compat',0x11B4} },
+ [0x313F] = { unicodeslot=0x313F, category='lo', description='HANGUL LETTER RIEUL-PHIEUPH', specials={'compat',0x11B5} },
+ [0x3140] = { unicodeslot=0x3140, category='lo', description='HANGUL LETTER RIEUL-HIEUH', specials={'compat',0x111A} },
+ [0x3141] = { unicodeslot=0x3141, category='lo', description='HANGUL LETTER MIEUM', specials={'compat',0x1106} },
+ [0x3142] = { unicodeslot=0x3142, category='lo', description='HANGUL LETTER PIEUP', specials={'compat',0x1107} },
+ [0x3143] = { unicodeslot=0x3143, category='lo', description='HANGUL LETTER SSANGPIEUP', specials={'compat',0x1108} },
+ [0x3144] = { unicodeslot=0x3144, category='lo', description='HANGUL LETTER PIEUP-SIOS', specials={'compat',0x1121} },
+ [0x3145] = { unicodeslot=0x3145, category='lo', description='HANGUL LETTER SIOS', specials={'compat',0x1109} },
+ [0x3146] = { unicodeslot=0x3146, category='lo', description='HANGUL LETTER SSANGSIOS', specials={'compat',0x110A} },
+ [0x3147] = { unicodeslot=0x3147, category='lo', description='HANGUL LETTER IEUNG', specials={'compat',0x110B} },
+ [0x3148] = { unicodeslot=0x3148, category='lo', description='HANGUL LETTER CIEUC', specials={'compat',0x110C} },
+ [0x3149] = { unicodeslot=0x3149, category='lo', description='HANGUL LETTER SSANGCIEUC', specials={'compat',0x110D} },
+ [0x314A] = { unicodeslot=0x314A, category='lo', description='HANGUL LETTER CHIEUCH', specials={'compat',0x110E} },
+ [0x314B] = { unicodeslot=0x314B, category='lo', description='HANGUL LETTER KHIEUKH', specials={'compat',0x110F} },
+ [0x314C] = { unicodeslot=0x314C, category='lo', description='HANGUL LETTER THIEUTH', specials={'compat',0x1110} },
+ [0x314D] = { unicodeslot=0x314D, category='lo', description='HANGUL LETTER PHIEUPH', specials={'compat',0x1111} },
+ [0x314E] = { unicodeslot=0x314E, category='lo', description='HANGUL LETTER HIEUH', specials={'compat',0x1112} },
+ [0x314F] = { unicodeslot=0x314F, category='lo', description='HANGUL LETTER A', specials={'compat',0x1161} },
+ [0x3150] = { unicodeslot=0x3150, category='lo', description='HANGUL LETTER AE', specials={'compat',0x1162} },
+ [0x3151] = { unicodeslot=0x3151, category='lo', description='HANGUL LETTER YA', specials={'compat',0x1163} },
+ [0x3152] = { unicodeslot=0x3152, category='lo', description='HANGUL LETTER YAE', specials={'compat',0x1164} },
+ [0x3153] = { unicodeslot=0x3153, category='lo', description='HANGUL LETTER EO', specials={'compat',0x1165} },
+ [0x3154] = { unicodeslot=0x3154, category='lo', description='HANGUL LETTER E', specials={'compat',0x1166} },
+ [0x3155] = { unicodeslot=0x3155, category='lo', description='HANGUL LETTER YEO', specials={'compat',0x1167} },
+ [0x3156] = { unicodeslot=0x3156, category='lo', description='HANGUL LETTER YE', specials={'compat',0x1168} },
+ [0x3157] = { unicodeslot=0x3157, category='lo', description='HANGUL LETTER O', specials={'compat',0x1169} },
+ [0x3158] = { unicodeslot=0x3158, category='lo', description='HANGUL LETTER WA', specials={'compat',0x116A} },
+ [0x3159] = { unicodeslot=0x3159, category='lo', description='HANGUL LETTER WAE', specials={'compat',0x116B} },
+ [0x315A] = { unicodeslot=0x315A, category='lo', description='HANGUL LETTER OE', specials={'compat',0x116C} },
+ [0x315B] = { unicodeslot=0x315B, category='lo', description='HANGUL LETTER YO', specials={'compat',0x116D} },
+ [0x315C] = { unicodeslot=0x315C, category='lo', description='HANGUL LETTER U', specials={'compat',0x116E} },
+ [0x315D] = { unicodeslot=0x315D, category='lo', description='HANGUL LETTER WEO', specials={'compat',0x116F} },
+ [0x315E] = { unicodeslot=0x315E, category='lo', description='HANGUL LETTER WE', specials={'compat',0x1170} },
+ [0x315F] = { unicodeslot=0x315F, category='lo', description='HANGUL LETTER WI', specials={'compat',0x1171} },
+ [0x3160] = { unicodeslot=0x3160, category='lo', description='HANGUL LETTER YU', specials={'compat',0x1172} },
+ [0x3161] = { unicodeslot=0x3161, category='lo', description='HANGUL LETTER EU', specials={'compat',0x1173} },
+ [0x3162] = { unicodeslot=0x3162, category='lo', description='HANGUL LETTER YI', specials={'compat',0x1174} },
+ [0x3163] = { unicodeslot=0x3163, category='lo', description='HANGUL LETTER I', specials={'compat',0x1175} },
+ [0x3164] = { unicodeslot=0x3164, category='lo', description='HANGUL FILLER', specials={'compat',0x1160} },
+ [0x3165] = { unicodeslot=0x3165, category='lo', description='HANGUL LETTER SSANGNIEUN', specials={'compat',0x1114} },
+ [0x3166] = { unicodeslot=0x3166, category='lo', description='HANGUL LETTER NIEUN-TIKEUT', specials={'compat',0x1115} },
+ [0x3167] = { unicodeslot=0x3167, category='lo', description='HANGUL LETTER NIEUN-SIOS', specials={'compat',0x11C7} },
+ [0x3168] = { unicodeslot=0x3168, category='lo', description='HANGUL LETTER NIEUN-PANSIOS', specials={'compat',0x11C8} },
+ [0x3169] = { unicodeslot=0x3169, category='lo', description='HANGUL LETTER RIEUL-KIYEOK-SIOS', specials={'compat',0x11CC} },
+ [0x316A] = { unicodeslot=0x316A, category='lo', description='HANGUL LETTER RIEUL-TIKEUT', specials={'compat',0x11CE} },
+ [0x316B] = { unicodeslot=0x316B, category='lo', description='HANGUL LETTER RIEUL-PIEUP-SIOS', specials={'compat',0x11D3} },
+ [0x316C] = { unicodeslot=0x316C, category='lo', description='HANGUL LETTER RIEUL-PANSIOS', specials={'compat',0x11D7} },
+ [0x316D] = { unicodeslot=0x316D, category='lo', description='HANGUL LETTER RIEUL-YEORINHIEUH', specials={'compat',0x11D9} },
+ [0x316E] = { unicodeslot=0x316E, category='lo', description='HANGUL LETTER MIEUM-PIEUP', specials={'compat',0x111C} },
+ [0x316F] = { unicodeslot=0x316F, category='lo', description='HANGUL LETTER MIEUM-SIOS', specials={'compat',0x11DD} },
+ [0x3170] = { unicodeslot=0x3170, category='lo', description='HANGUL LETTER MIEUM-PANSIOS', specials={'compat',0x11DF} },
+ [0x3171] = { unicodeslot=0x3171, category='lo', description='HANGUL LETTER KAPYEOUNMIEUM', specials={'compat',0x111D} },
+ [0x3172] = { unicodeslot=0x3172, category='lo', description='HANGUL LETTER PIEUP-KIYEOK', specials={'compat',0x111E} },
+ [0x3173] = { unicodeslot=0x3173, category='lo', description='HANGUL LETTER PIEUP-TIKEUT', specials={'compat',0x1120} },
+ [0x3174] = { unicodeslot=0x3174, category='lo', description='HANGUL LETTER PIEUP-SIOS-KIYEOK', specials={'compat',0x1122} },
+ [0x3175] = { unicodeslot=0x3175, category='lo', description='HANGUL LETTER PIEUP-SIOS-TIKEUT', specials={'compat',0x1123} },
+ [0x3176] = { unicodeslot=0x3176, category='lo', description='HANGUL LETTER PIEUP-CIEUC', specials={'compat',0x1127} },
+ [0x3177] = { unicodeslot=0x3177, category='lo', description='HANGUL LETTER PIEUP-THIEUTH', specials={'compat',0x1129} },
+ [0x3178] = { unicodeslot=0x3178, category='lo', description='HANGUL LETTER KAPYEOUNPIEUP', specials={'compat',0x112B} },
+ [0x3179] = { unicodeslot=0x3179, category='lo', description='HANGUL LETTER KAPYEOUNSSANGPIEUP', specials={'compat',0x112C} },
+ [0x317A] = { unicodeslot=0x317A, category='lo', description='HANGUL LETTER SIOS-KIYEOK', specials={'compat',0x112D} },
+ [0x317B] = { unicodeslot=0x317B, category='lo', description='HANGUL LETTER SIOS-NIEUN', specials={'compat',0x112E} },
+ [0x317C] = { unicodeslot=0x317C, category='lo', description='HANGUL LETTER SIOS-TIKEUT', specials={'compat',0x112F} },
+ [0x317D] = { unicodeslot=0x317D, category='lo', description='HANGUL LETTER SIOS-PIEUP', specials={'compat',0x1132} },
+ [0x317E] = { unicodeslot=0x317E, category='lo', description='HANGUL LETTER SIOS-CIEUC', specials={'compat',0x1136} },
+ [0x317F] = { unicodeslot=0x317F, category='lo', description='HANGUL LETTER PANSIOS', specials={'compat',0x1140} },
+ [0x3180] = { unicodeslot=0x3180, category='lo', description='HANGUL LETTER SSANGIEUNG', specials={'compat',0x1147} },
+ [0x3181] = { unicodeslot=0x3181, category='lo', description='HANGUL LETTER YESIEUNG', specials={'compat',0x114C} },
+ [0x3182] = { unicodeslot=0x3182, category='lo', description='HANGUL LETTER YESIEUNG-SIOS', specials={'compat',0x11F1} },
+ [0x3183] = { unicodeslot=0x3183, category='lo', description='HANGUL LETTER YESIEUNG-PANSIOS', specials={'compat',0x11F2} },
+ [0x3184] = { unicodeslot=0x3184, category='lo', description='HANGUL LETTER KAPYEOUNPHIEUPH', specials={'compat',0x1157} },
+ [0x3185] = { unicodeslot=0x3185, category='lo', description='HANGUL LETTER SSANGHIEUH', specials={'compat',0x1158} },
+ [0x3186] = { unicodeslot=0x3186, category='lo', description='HANGUL LETTER YEORINHIEUH', specials={'compat',0x1159} },
+ [0x3187] = { unicodeslot=0x3187, category='lo', description='HANGUL LETTER YO-YA', specials={'compat',0x1184} },
+ [0x3188] = { unicodeslot=0x3188, category='lo', description='HANGUL LETTER YO-YAE', specials={'compat',0x1185} },
+ [0x3189] = { unicodeslot=0x3189, category='lo', description='HANGUL LETTER YO-I', specials={'compat',0x1188} },
+ [0x318A] = { unicodeslot=0x318A, category='lo', description='HANGUL LETTER YU-YEO', specials={'compat',0x1191} },
+ [0x318B] = { unicodeslot=0x318B, category='lo', description='HANGUL LETTER YU-YE', specials={'compat',0x1192} },
+ [0x318C] = { unicodeslot=0x318C, category='lo', description='HANGUL LETTER YU-I', specials={'compat',0x1194} },
+ [0x318D] = { unicodeslot=0x318D, category='lo', description='HANGUL LETTER ARAEA', specials={'compat',0x119E} },
+ [0x318E] = { unicodeslot=0x318E, category='lo', description='HANGUL LETTER ARAEAE', specials={'compat',0x11A1} },
+ [0x3190] = { unicodeslot=0x3190, category='so', description='IDEOGRAPHIC ANNOTATION LINKING MARK' },
+ [0x3191] = { unicodeslot=0x3191, category='so', description='IDEOGRAPHIC ANNOTATION REVERSE MARK' },
+ [0x3192] = { unicodeslot=0x3192, category='no', description='IDEOGRAPHIC ANNOTATION ONE MARK', specials={'super',0x4E00} },
+ [0x3193] = { unicodeslot=0x3193, category='no', description='IDEOGRAPHIC ANNOTATION TWO MARK', specials={'super',0x4E8C} },
+ [0x3194] = { unicodeslot=0x3194, category='no', description='IDEOGRAPHIC ANNOTATION THREE MARK', specials={'super',0x4E09} },
+ [0x3195] = { unicodeslot=0x3195, category='no', description='IDEOGRAPHIC ANNOTATION FOUR MARK', specials={'super',0x56DB} },
+ [0x3196] = { unicodeslot=0x3196, category='so', description='IDEOGRAPHIC ANNOTATION TOP MARK', specials={'super',0x4E0A} },
+ [0x3197] = { unicodeslot=0x3197, category='so', description='IDEOGRAPHIC ANNOTATION MIDDLE MARK', specials={'super',0x4E2D} },
+ [0x3198] = { unicodeslot=0x3198, category='so', description='IDEOGRAPHIC ANNOTATION BOTTOM MARK', specials={'super',0x4E0B} },
+ [0x3199] = { unicodeslot=0x3199, category='so', description='IDEOGRAPHIC ANNOTATION FIRST MARK', specials={'super',0x7532} },
+ [0x319A] = { unicodeslot=0x319A, category='so', description='IDEOGRAPHIC ANNOTATION SECOND MARK', specials={'super',0x4E59} },
+ [0x319B] = { unicodeslot=0x319B, category='so', description='IDEOGRAPHIC ANNOTATION THIRD MARK', specials={'super',0x4E19} },
+ [0x319C] = { unicodeslot=0x319C, category='so', description='IDEOGRAPHIC ANNOTATION FOURTH MARK', specials={'super',0x4E01} },
+ [0x319D] = { unicodeslot=0x319D, category='so', description='IDEOGRAPHIC ANNOTATION HEAVEN MARK', specials={'super',0x5929} },
+ [0x319E] = { unicodeslot=0x319E, category='so', description='IDEOGRAPHIC ANNOTATION EARTH MARK', specials={'super',0x5730} },
+ [0x319F] = { unicodeslot=0x319F, category='so', description='IDEOGRAPHIC ANNOTATION MAN MARK', specials={'super',0x4EBA} },
+ [0x31A0] = { unicodeslot=0x31A0, category='lo', description='BOPOMOFO LETTER BU' },
+ [0x31A1] = { unicodeslot=0x31A1, category='lo', description='BOPOMOFO LETTER ZI' },
+ [0x31A2] = { unicodeslot=0x31A2, category='lo', description='BOPOMOFO LETTER JI' },
+ [0x31A3] = { unicodeslot=0x31A3, category='lo', description='BOPOMOFO LETTER GU' },
+ [0x31A4] = { unicodeslot=0x31A4, category='lo', description='BOPOMOFO LETTER EE' },
+ [0x31A5] = { unicodeslot=0x31A5, category='lo', description='BOPOMOFO LETTER ENN' },
+ [0x31A6] = { unicodeslot=0x31A6, category='lo', description='BOPOMOFO LETTER OO' },
+ [0x31A7] = { unicodeslot=0x31A7, category='lo', description='BOPOMOFO LETTER ONN' },
+ [0x31A8] = { unicodeslot=0x31A8, category='lo', description='BOPOMOFO LETTER IR' },
+ [0x31A9] = { unicodeslot=0x31A9, category='lo', description='BOPOMOFO LETTER ANN' },
+ [0x31AA] = { unicodeslot=0x31AA, category='lo', description='BOPOMOFO LETTER INN' },
+ [0x31AB] = { unicodeslot=0x31AB, category='lo', description='BOPOMOFO LETTER UNN' },
+ [0x31AC] = { unicodeslot=0x31AC, category='lo', description='BOPOMOFO LETTER IM' },
+ [0x31AD] = { unicodeslot=0x31AD, category='lo', description='BOPOMOFO LETTER NGG' },
+ [0x31AE] = { unicodeslot=0x31AE, category='lo', description='BOPOMOFO LETTER AINN' },
+ [0x31AF] = { unicodeslot=0x31AF, category='lo', description='BOPOMOFO LETTER AUNN' },
+ [0x31B0] = { unicodeslot=0x31B0, category='lo', description='BOPOMOFO LETTER AM' },
+ [0x31B1] = { unicodeslot=0x31B1, category='lo', description='BOPOMOFO LETTER OM' },
+ [0x31B2] = { unicodeslot=0x31B2, category='lo', description='BOPOMOFO LETTER ONG' },
+ [0x31B3] = { unicodeslot=0x31B3, category='lo', description='BOPOMOFO LETTER INNN' },
+ [0x31B4] = { unicodeslot=0x31B4, category='lo', description='BOPOMOFO FINAL LETTER P' },
+ [0x31B5] = { unicodeslot=0x31B5, category='lo', description='BOPOMOFO FINAL LETTER T' },
+ [0x31B6] = { unicodeslot=0x31B6, category='lo', description='BOPOMOFO FINAL LETTER K' },
+ [0x31B7] = { unicodeslot=0x31B7, category='lo', description='BOPOMOFO FINAL LETTER H' },
+ [0x31C0] = { unicodeslot=0x31C0, category='so', description='CJK STROKE T' },
+ [0x31C1] = { unicodeslot=0x31C1, category='so', description='CJK STROKE WG' },
+ [0x31C2] = { unicodeslot=0x31C2, category='so', description='CJK STROKE XG' },
+ [0x31C3] = { unicodeslot=0x31C3, category='so', description='CJK STROKE BXG' },
+ [0x31C4] = { unicodeslot=0x31C4, category='so', description='CJK STROKE SW' },
+ [0x31C5] = { unicodeslot=0x31C5, category='so', description='CJK STROKE HZZ' },
+ [0x31C6] = { unicodeslot=0x31C6, category='so', description='CJK STROKE HZG' },
+ [0x31C7] = { unicodeslot=0x31C7, category='so', description='CJK STROKE HP' },
+ [0x31C8] = { unicodeslot=0x31C8, category='so', description='CJK STROKE HZWG' },
+ [0x31C9] = { unicodeslot=0x31C9, category='so', description='CJK STROKE SZWG' },
+ [0x31CA] = { unicodeslot=0x31CA, category='so', description='CJK STROKE HZT' },
+ [0x31CB] = { unicodeslot=0x31CB, category='so', description='CJK STROKE HZZP' },
+ [0x31CC] = { unicodeslot=0x31CC, category='so', description='CJK STROKE HPWG' },
+ [0x31CD] = { unicodeslot=0x31CD, category='so', description='CJK STROKE HZW' },
+ [0x31CE] = { unicodeslot=0x31CE, category='so', description='CJK STROKE HZZZ' },
+ [0x31CF] = { unicodeslot=0x31CF, category='so', description='CJK STROKE N' },
+ [0x31F0] = { unicodeslot=0x31F0, category='lo', description='KATAKANA LETTER SMALL KU' },
+ [0x31F1] = { unicodeslot=0x31F1, category='lo', description='KATAKANA LETTER SMALL SI' },
+ [0x31F2] = { unicodeslot=0x31F2, category='lo', description='KATAKANA LETTER SMALL SU' },
+ [0x31F3] = { unicodeslot=0x31F3, category='lo', description='KATAKANA LETTER SMALL TO' },
+ [0x31F4] = { unicodeslot=0x31F4, category='lo', description='KATAKANA LETTER SMALL NU' },
+ [0x31F5] = { unicodeslot=0x31F5, category='lo', description='KATAKANA LETTER SMALL HA' },
+ [0x31F6] = { unicodeslot=0x31F6, category='lo', description='KATAKANA LETTER SMALL HI' },
+ [0x31F7] = { unicodeslot=0x31F7, category='lo', description='KATAKANA LETTER SMALL HU' },
+ [0x31F8] = { unicodeslot=0x31F8, category='lo', description='KATAKANA LETTER SMALL HE' },
+ [0x31F9] = { unicodeslot=0x31F9, category='lo', description='KATAKANA LETTER SMALL HO' },
+ [0x31FA] = { unicodeslot=0x31FA, category='lo', description='KATAKANA LETTER SMALL MU' },
+ [0x31FB] = { unicodeslot=0x31FB, category='lo', description='KATAKANA LETTER SMALL RA' },
+ [0x31FC] = { unicodeslot=0x31FC, category='lo', description='KATAKANA LETTER SMALL RI' },
+ [0x31FD] = { unicodeslot=0x31FD, category='lo', description='KATAKANA LETTER SMALL RU' },
+ [0x31FE] = { unicodeslot=0x31FE, category='lo', description='KATAKANA LETTER SMALL RE' },
+ [0x31FF] = { unicodeslot=0x31FF, category='lo', description='KATAKANA LETTER SMALL RO' },
+ [0x3200] = { unicodeslot=0x3200, category='so', description='PARENTHESIZED HANGUL KIYEOK', specials={'compat',0x0028,0x1100,0x0029} },
+ [0x3201] = { unicodeslot=0x3201, category='so', description='PARENTHESIZED HANGUL NIEUN', specials={'compat',0x0028,0x1102,0x0029} },
+ [0x3202] = { unicodeslot=0x3202, category='so', description='PARENTHESIZED HANGUL TIKEUT', specials={'compat',0x0028,0x1103,0x0029} },
+ [0x3203] = { unicodeslot=0x3203, category='so', description='PARENTHESIZED HANGUL RIEUL', specials={'compat',0x0028,0x1105,0x0029} },
+ [0x3204] = { unicodeslot=0x3204, category='so', description='PARENTHESIZED HANGUL MIEUM', specials={'compat',0x0028,0x1106,0x0029} },
+ [0x3205] = { unicodeslot=0x3205, category='so', description='PARENTHESIZED HANGUL PIEUP', specials={'compat',0x0028,0x1107,0x0029} },
+ [0x3206] = { unicodeslot=0x3206, category='so', description='PARENTHESIZED HANGUL SIOS', specials={'compat',0x0028,0x1109,0x0029} },
+ [0x3207] = { unicodeslot=0x3207, category='so', description='PARENTHESIZED HANGUL IEUNG', specials={'compat',0x0028,0x110B,0x0029} },
+ [0x3208] = { unicodeslot=0x3208, category='so', description='PARENTHESIZED HANGUL CIEUC', specials={'compat',0x0028,0x110C,0x0029} },
+ [0x3209] = { unicodeslot=0x3209, category='so', description='PARENTHESIZED HANGUL CHIEUCH', specials={'compat',0x0028,0x110E,0x0029} },
+ [0x320A] = { unicodeslot=0x320A, category='so', description='PARENTHESIZED HANGUL KHIEUKH', specials={'compat',0x0028,0x110F,0x0029} },
+ [0x320B] = { unicodeslot=0x320B, category='so', description='PARENTHESIZED HANGUL THIEUTH', specials={'compat',0x0028,0x1110,0x0029} },
+ [0x320C] = { unicodeslot=0x320C, category='so', description='PARENTHESIZED HANGUL PHIEUPH', specials={'compat',0x0028,0x1111,0x0029} },
+ [0x320D] = { unicodeslot=0x320D, category='so', description='PARENTHESIZED HANGUL HIEUH', specials={'compat',0x0028,0x1112,0x0029} },
+ [0x320E] = { unicodeslot=0x320E, category='so', description='PARENTHESIZED HANGUL KIYEOK A', specials={'compat',0x0028,0x1100,0x1161,0x0029} },
+ [0x320F] = { unicodeslot=0x320F, category='so', description='PARENTHESIZED HANGUL NIEUN A', specials={'compat',0x0028,0x1102,0x1161,0x0029} },
+ [0x3210] = { unicodeslot=0x3210, category='so', description='PARENTHESIZED HANGUL TIKEUT A', specials={'compat',0x0028,0x1103,0x1161,0x0029} },
+ [0x3211] = { unicodeslot=0x3211, category='so', description='PARENTHESIZED HANGUL RIEUL A', specials={'compat',0x0028,0x1105,0x1161,0x0029} },
+ [0x3212] = { unicodeslot=0x3212, category='so', description='PARENTHESIZED HANGUL MIEUM A', specials={'compat',0x0028,0x1106,0x1161,0x0029} },
+ [0x3213] = { unicodeslot=0x3213, category='so', description='PARENTHESIZED HANGUL PIEUP A', specials={'compat',0x0028,0x1107,0x1161,0x0029} },
+ [0x3214] = { unicodeslot=0x3214, category='so', description='PARENTHESIZED HANGUL SIOS A', specials={'compat',0x0028,0x1109,0x1161,0x0029} },
+ [0x3215] = { unicodeslot=0x3215, category='so', description='PARENTHESIZED HANGUL IEUNG A', specials={'compat',0x0028,0x110B,0x1161,0x0029} },
+ [0x3216] = { unicodeslot=0x3216, category='so', description='PARENTHESIZED HANGUL CIEUC A', specials={'compat',0x0028,0x110C,0x1161,0x0029} },
+ [0x3217] = { unicodeslot=0x3217, category='so', description='PARENTHESIZED HANGUL CHIEUCH A', specials={'compat',0x0028,0x110E,0x1161,0x0029} },
+ [0x3218] = { unicodeslot=0x3218, category='so', description='PARENTHESIZED HANGUL KHIEUKH A', specials={'compat',0x0028,0x110F,0x1161,0x0029} },
+ [0x3219] = { unicodeslot=0x3219, category='so', description='PARENTHESIZED HANGUL THIEUTH A', specials={'compat',0x0028,0x1110,0x1161,0x0029} },
+ [0x321A] = { unicodeslot=0x321A, category='so', description='PARENTHESIZED HANGUL PHIEUPH A', specials={'compat',0x0028,0x1111,0x1161,0x0029} },
+ [0x321B] = { unicodeslot=0x321B, category='so', description='PARENTHESIZED HANGUL HIEUH A', specials={'compat',0x0028,0x1112,0x1161,0x0029} },
+ [0x321C] = { unicodeslot=0x321C, category='so', description='PARENTHESIZED HANGUL CIEUC U', specials={'compat',0x0028,0x110C,0x116E,0x0029} },
+ [0x321D] = { unicodeslot=0x321D, category='so', description='PARENTHESIZED KOREAN CHARACTER OJEON', specials={'compat',0x0028,0x110B,0x1169,0x110C,0x1165,0x11AB,0x0029} },
+ [0x321E] = { unicodeslot=0x321E, category='so', description='PARENTHESIZED KOREAN CHARACTER O HU', specials={'compat',0x0028,0x110B,0x1169,0x1112,0x116E,0x0029} },
+ [0x3220] = { unicodeslot=0x3220, category='no', description='PARENTHESIZED IDEOGRAPH ONE', specials={'compat',0x0028,0x4E00,0x0029} },
+ [0x3221] = { unicodeslot=0x3221, category='no', description='PARENTHESIZED IDEOGRAPH TWO', specials={'compat',0x0028,0x4E8C,0x0029} },
+ [0x3222] = { unicodeslot=0x3222, category='no', description='PARENTHESIZED IDEOGRAPH THREE', specials={'compat',0x0028,0x4E09,0x0029} },
+ [0x3223] = { unicodeslot=0x3223, category='no', description='PARENTHESIZED IDEOGRAPH FOUR', specials={'compat',0x0028,0x56DB,0x0029} },
+ [0x3224] = { unicodeslot=0x3224, category='no', description='PARENTHESIZED IDEOGRAPH FIVE', specials={'compat',0x0028,0x4E94,0x0029} },
+ [0x3225] = { unicodeslot=0x3225, category='no', description='PARENTHESIZED IDEOGRAPH SIX', specials={'compat',0x0028,0x516D,0x0029} },
+ [0x3226] = { unicodeslot=0x3226, category='no', description='PARENTHESIZED IDEOGRAPH SEVEN', specials={'compat',0x0028,0x4E03,0x0029} },
+ [0x3227] = { unicodeslot=0x3227, category='no', description='PARENTHESIZED IDEOGRAPH EIGHT', specials={'compat',0x0028,0x516B,0x0029} },
+ [0x3228] = { unicodeslot=0x3228, category='no', description='PARENTHESIZED IDEOGRAPH NINE', specials={'compat',0x0028,0x4E5D,0x0029} },
+ [0x3229] = { unicodeslot=0x3229, category='no', description='PARENTHESIZED IDEOGRAPH TEN', specials={'compat',0x0028,0x5341,0x0029} },
+ [0x322A] = { unicodeslot=0x322A, category='so', description='PARENTHESIZED IDEOGRAPH MOON', specials={'compat',0x0028,0x6708,0x0029} },
+ [0x322B] = { unicodeslot=0x322B, category='so', description='PARENTHESIZED IDEOGRAPH FIRE', specials={'compat',0x0028,0x706B,0x0029} },
+ [0x322C] = { unicodeslot=0x322C, category='so', description='PARENTHESIZED IDEOGRAPH WATER', specials={'compat',0x0028,0x6C34,0x0029} },
+ [0x322D] = { unicodeslot=0x322D, category='so', description='PARENTHESIZED IDEOGRAPH WOOD', specials={'compat',0x0028,0x6728,0x0029} },
+ [0x322E] = { unicodeslot=0x322E, category='so', description='PARENTHESIZED IDEOGRAPH METAL', specials={'compat',0x0028,0x91D1,0x0029} },
+ [0x322F] = { unicodeslot=0x322F, category='so', description='PARENTHESIZED IDEOGRAPH EARTH', specials={'compat',0x0028,0x571F,0x0029} },
+ [0x3230] = { unicodeslot=0x3230, category='so', description='PARENTHESIZED IDEOGRAPH SUN', specials={'compat',0x0028,0x65E5,0x0029} },
+ [0x3231] = { unicodeslot=0x3231, category='so', description='PARENTHESIZED IDEOGRAPH STOCK', specials={'compat',0x0028,0x682A,0x0029} },
+ [0x3232] = { unicodeslot=0x3232, category='so', description='PARENTHESIZED IDEOGRAPH HAVE', specials={'compat',0x0028,0x6709,0x0029} },
+ [0x3233] = { unicodeslot=0x3233, category='so', description='PARENTHESIZED IDEOGRAPH SOCIETY', specials={'compat',0x0028,0x793E,0x0029} },
+ [0x3234] = { unicodeslot=0x3234, category='so', description='PARENTHESIZED IDEOGRAPH NAME', specials={'compat',0x0028,0x540D,0x0029} },
+ [0x3235] = { unicodeslot=0x3235, category='so', description='PARENTHESIZED IDEOGRAPH SPECIAL', specials={'compat',0x0028,0x7279,0x0029} },
+ [0x3236] = { unicodeslot=0x3236, category='so', description='PARENTHESIZED IDEOGRAPH FINANCIAL', specials={'compat',0x0028,0x8CA1,0x0029} },
+ [0x3237] = { unicodeslot=0x3237, category='so', description='PARENTHESIZED IDEOGRAPH CONGRATULATION', specials={'compat',0x0028,0x795D,0x0029} },
+ [0x3238] = { unicodeslot=0x3238, category='so', description='PARENTHESIZED IDEOGRAPH LABOR', specials={'compat',0x0028,0x52B4,0x0029} },
+ [0x3239] = { unicodeslot=0x3239, category='so', description='PARENTHESIZED IDEOGRAPH REPRESENT', specials={'compat',0x0028,0x4EE3,0x0029} },
+ [0x323A] = { unicodeslot=0x323A, category='so', description='PARENTHESIZED IDEOGRAPH CALL', specials={'compat',0x0028,0x547C,0x0029} },
+ [0x323B] = { unicodeslot=0x323B, category='so', description='PARENTHESIZED IDEOGRAPH STUDY', specials={'compat',0x0028,0x5B66,0x0029} },
+ [0x323C] = { unicodeslot=0x323C, category='so', description='PARENTHESIZED IDEOGRAPH SUPERVISE', specials={'compat',0x0028,0x76E3,0x0029} },
+ [0x323D] = { unicodeslot=0x323D, category='so', description='PARENTHESIZED IDEOGRAPH ENTERPRISE', specials={'compat',0x0028,0x4F01,0x0029} },
+ [0x323E] = { unicodeslot=0x323E, category='so', description='PARENTHESIZED IDEOGRAPH RESOURCE', specials={'compat',0x0028,0x8CC7,0x0029} },
+ [0x323F] = { unicodeslot=0x323F, category='so', description='PARENTHESIZED IDEOGRAPH ALLIANCE', specials={'compat',0x0028,0x5354,0x0029} },
+ [0x3240] = { unicodeslot=0x3240, category='so', description='PARENTHESIZED IDEOGRAPH FESTIVAL', specials={'compat',0x0028,0x796D,0x0029} },
+ [0x3241] = { unicodeslot=0x3241, category='so', description='PARENTHESIZED IDEOGRAPH REST', specials={'compat',0x0028,0x4F11,0x0029} },
+ [0x3242] = { unicodeslot=0x3242, category='so', description='PARENTHESIZED IDEOGRAPH SELF', specials={'compat',0x0028,0x81EA,0x0029} },
+ [0x3243] = { unicodeslot=0x3243, category='so', description='PARENTHESIZED IDEOGRAPH REACH', specials={'compat',0x0028,0x81F3,0x0029} },
+ [0x3250] = { unicodeslot=0x3250, category='so', description='PARTNERSHIP SIGN', specials={'square',0x0050,0x0054,0x0045} },
+ [0x3251] = { unicodeslot=0x3251, category='no', description='CIRCLED NUMBER TWENTY ONE', specials={'circle',0x0032,0x0031} },
+ [0x3252] = { unicodeslot=0x3252, category='no', description='CIRCLED NUMBER TWENTY TWO', specials={'circle',0x0032,0x0032} },
+ [0x3253] = { unicodeslot=0x3253, category='no', description='CIRCLED NUMBER TWENTY THREE', specials={'circle',0x0032,0x0033} },
+ [0x3254] = { unicodeslot=0x3254, category='no', description='CIRCLED NUMBER TWENTY FOUR', specials={'circle',0x0032,0x0034} },
+ [0x3255] = { unicodeslot=0x3255, category='no', description='CIRCLED NUMBER TWENTY FIVE', specials={'circle',0x0032,0x0035} },
+ [0x3256] = { unicodeslot=0x3256, category='no', description='CIRCLED NUMBER TWENTY SIX', specials={'circle',0x0032,0x0036} },
+ [0x3257] = { unicodeslot=0x3257, category='no', description='CIRCLED NUMBER TWENTY SEVEN', specials={'circle',0x0032,0x0037} },
+ [0x3258] = { unicodeslot=0x3258, category='no', description='CIRCLED NUMBER TWENTY EIGHT', specials={'circle',0x0032,0x0038} },
+ [0x3259] = { unicodeslot=0x3259, category='no', description='CIRCLED NUMBER TWENTY NINE', specials={'circle',0x0032,0x0039} },
+ [0x325A] = { unicodeslot=0x325A, category='no', description='CIRCLED NUMBER THIRTY', specials={'circle',0x0033,0x0030} },
+ [0x325B] = { unicodeslot=0x325B, category='no', description='CIRCLED NUMBER THIRTY ONE', specials={'circle',0x0033,0x0031} },
+ [0x325C] = { unicodeslot=0x325C, category='no', description='CIRCLED NUMBER THIRTY TWO', specials={'circle',0x0033,0x0032} },
+ [0x325D] = { unicodeslot=0x325D, category='no', description='CIRCLED NUMBER THIRTY THREE', specials={'circle',0x0033,0x0033} },
+ [0x325E] = { unicodeslot=0x325E, category='no', description='CIRCLED NUMBER THIRTY FOUR', specials={'circle',0x0033,0x0034} },
+ [0x325F] = { unicodeslot=0x325F, category='no', description='CIRCLED NUMBER THIRTY FIVE', specials={'circle',0x0033,0x0035} },
+ [0x3260] = { unicodeslot=0x3260, category='so', description='CIRCLED HANGUL KIYEOK', specials={'circle',0x1100} },
+ [0x3261] = { unicodeslot=0x3261, category='so', description='CIRCLED HANGUL NIEUN', specials={'circle',0x1102} },
+ [0x3262] = { unicodeslot=0x3262, category='so', description='CIRCLED HANGUL TIKEUT', specials={'circle',0x1103} },
+ [0x3263] = { unicodeslot=0x3263, category='so', description='CIRCLED HANGUL RIEUL', specials={'circle',0x1105} },
+ [0x3264] = { unicodeslot=0x3264, category='so', description='CIRCLED HANGUL MIEUM', specials={'circle',0x1106} },
+ [0x3265] = { unicodeslot=0x3265, category='so', description='CIRCLED HANGUL PIEUP', specials={'circle',0x1107} },
+ [0x3266] = { unicodeslot=0x3266, category='so', description='CIRCLED HANGUL SIOS', specials={'circle',0x1109} },
+ [0x3267] = { unicodeslot=0x3267, category='so', description='CIRCLED HANGUL IEUNG', specials={'circle',0x110B} },
+ [0x3268] = { unicodeslot=0x3268, category='so', description='CIRCLED HANGUL CIEUC', specials={'circle',0x110C} },
+ [0x3269] = { unicodeslot=0x3269, category='so', description='CIRCLED HANGUL CHIEUCH', specials={'circle',0x110E} },
+ [0x326A] = { unicodeslot=0x326A, category='so', description='CIRCLED HANGUL KHIEUKH', specials={'circle',0x110F} },
+ [0x326B] = { unicodeslot=0x326B, category='so', description='CIRCLED HANGUL THIEUTH', specials={'circle',0x1110} },
+ [0x326C] = { unicodeslot=0x326C, category='so', description='CIRCLED HANGUL PHIEUPH', specials={'circle',0x1111} },
+ [0x326D] = { unicodeslot=0x326D, category='so', description='CIRCLED HANGUL HIEUH', specials={'circle',0x1112} },
+ [0x326E] = { unicodeslot=0x326E, category='so', description='CIRCLED HANGUL KIYEOK A', specials={'circle',0x1100,0x1161} },
+ [0x326F] = { unicodeslot=0x326F, category='so', description='CIRCLED HANGUL NIEUN A', specials={'circle',0x1102,0x1161} },
+ [0x3270] = { unicodeslot=0x3270, category='so', description='CIRCLED HANGUL TIKEUT A', specials={'circle',0x1103,0x1161} },
+ [0x3271] = { unicodeslot=0x3271, category='so', description='CIRCLED HANGUL RIEUL A', specials={'circle',0x1105,0x1161} },
+ [0x3272] = { unicodeslot=0x3272, category='so', description='CIRCLED HANGUL MIEUM A', specials={'circle',0x1106,0x1161} },
+ [0x3273] = { unicodeslot=0x3273, category='so', description='CIRCLED HANGUL PIEUP A', specials={'circle',0x1107,0x1161} },
+ [0x3274] = { unicodeslot=0x3274, category='so', description='CIRCLED HANGUL SIOS A', specials={'circle',0x1109,0x1161} },
+ [0x3275] = { unicodeslot=0x3275, category='so', description='CIRCLED HANGUL IEUNG A', specials={'circle',0x110B,0x1161} },
+ [0x3276] = { unicodeslot=0x3276, category='so', description='CIRCLED HANGUL CIEUC A', specials={'circle',0x110C,0x1161} },
+ [0x3277] = { unicodeslot=0x3277, category='so', description='CIRCLED HANGUL CHIEUCH A', specials={'circle',0x110E,0x1161} },
+ [0x3278] = { unicodeslot=0x3278, category='so', description='CIRCLED HANGUL KHIEUKH A', specials={'circle',0x110F,0x1161} },
+ [0x3279] = { unicodeslot=0x3279, category='so', description='CIRCLED HANGUL THIEUTH A', specials={'circle',0x1110,0x1161} },
+ [0x327A] = { unicodeslot=0x327A, category='so', description='CIRCLED HANGUL PHIEUPH A', specials={'circle',0x1111,0x1161} },
+ [0x327B] = { unicodeslot=0x327B, category='so', description='CIRCLED HANGUL HIEUH A', specials={'circle',0x1112,0x1161} },
+ [0x327C] = { unicodeslot=0x327C, category='so', description='CIRCLED KOREAN CHARACTER CHAMKO', specials={'circle',0x110E,0x1161,0x11B7,0x1100,0x1169} },
+ [0x327D] = { unicodeslot=0x327D, category='so', description='CIRCLED KOREAN CHARACTER JUEUI', specials={'circle',0x110C,0x116E,0x110B,0x1174} },
+ [0x327E] = { unicodeslot=0x327E, category='so', description='CIRCLED HANGUL IEUNG U', specials={'circle',0x110B,0x116E} },
+ [0x327F] = { unicodeslot=0x327F, category='so', description='KOREAN STANDARD SYMBOL' },
+ [0x3280] = { unicodeslot=0x3280, category='no', description='CIRCLED IDEOGRAPH ONE', specials={'circle',0x4E00} },
+ [0x3281] = { unicodeslot=0x3281, category='no', description='CIRCLED IDEOGRAPH TWO', specials={'circle',0x4E8C} },
+ [0x3282] = { unicodeslot=0x3282, category='no', description='CIRCLED IDEOGRAPH THREE', specials={'circle',0x4E09} },
+ [0x3283] = { unicodeslot=0x3283, category='no', description='CIRCLED IDEOGRAPH FOUR', specials={'circle',0x56DB} },
+ [0x3284] = { unicodeslot=0x3284, category='no', description='CIRCLED IDEOGRAPH FIVE', specials={'circle',0x4E94} },
+ [0x3285] = { unicodeslot=0x3285, category='no', description='CIRCLED IDEOGRAPH SIX', specials={'circle',0x516D} },
+ [0x3286] = { unicodeslot=0x3286, category='no', description='CIRCLED IDEOGRAPH SEVEN', specials={'circle',0x4E03} },
+ [0x3287] = { unicodeslot=0x3287, category='no', description='CIRCLED IDEOGRAPH EIGHT', specials={'circle',0x516B} },
+ [0x3288] = { unicodeslot=0x3288, category='no', description='CIRCLED IDEOGRAPH NINE', specials={'circle',0x4E5D} },
+ [0x3289] = { unicodeslot=0x3289, category='no', description='CIRCLED IDEOGRAPH TEN', specials={'circle',0x5341} },
+ [0x328A] = { unicodeslot=0x328A, category='so', description='CIRCLED IDEOGRAPH MOON', specials={'circle',0x6708} },
+ [0x328B] = { unicodeslot=0x328B, category='so', description='CIRCLED IDEOGRAPH FIRE', specials={'circle',0x706B} },
+ [0x328C] = { unicodeslot=0x328C, category='so', description='CIRCLED IDEOGRAPH WATER', specials={'circle',0x6C34} },
+ [0x328D] = { unicodeslot=0x328D, category='so', description='CIRCLED IDEOGRAPH WOOD', specials={'circle',0x6728} },
+ [0x328E] = { unicodeslot=0x328E, category='so', description='CIRCLED IDEOGRAPH METAL', specials={'circle',0x91D1} },
+ [0x328F] = { unicodeslot=0x328F, category='so', description='CIRCLED IDEOGRAPH EARTH', specials={'circle',0x571F} },
+ [0x3290] = { unicodeslot=0x3290, category='so', description='CIRCLED IDEOGRAPH SUN', specials={'circle',0x65E5} },
+ [0x3291] = { unicodeslot=0x3291, category='so', description='CIRCLED IDEOGRAPH STOCK', specials={'circle',0x682A} },
+ [0x3292] = { unicodeslot=0x3292, category='so', description='CIRCLED IDEOGRAPH HAVE', specials={'circle',0x6709} },
+ [0x3293] = { unicodeslot=0x3293, category='so', description='CIRCLED IDEOGRAPH SOCIETY', specials={'circle',0x793E} },
+ [0x3294] = { unicodeslot=0x3294, category='so', description='CIRCLED IDEOGRAPH NAME', specials={'circle',0x540D} },
+ [0x3295] = { unicodeslot=0x3295, category='so', description='CIRCLED IDEOGRAPH SPECIAL', specials={'circle',0x7279} },
+ [0x3296] = { unicodeslot=0x3296, category='so', description='CIRCLED IDEOGRAPH FINANCIAL', specials={'circle',0x8CA1} },
+ [0x3297] = { unicodeslot=0x3297, category='so', description='CIRCLED IDEOGRAPH CONGRATULATION', specials={'circle',0x795D} },
+ [0x3298] = { unicodeslot=0x3298, category='so', description='CIRCLED IDEOGRAPH LABOR', specials={'circle',0x52B4} },
+ [0x3299] = { unicodeslot=0x3299, category='so', description='CIRCLED IDEOGRAPH SECRET', specials={'circle',0x79D8} },
+ [0x329A] = { unicodeslot=0x329A, category='so', description='CIRCLED IDEOGRAPH MALE', specials={'circle',0x7537} },
+ [0x329B] = { unicodeslot=0x329B, category='so', description='CIRCLED IDEOGRAPH FEMALE', specials={'circle',0x5973} },
+ [0x329C] = { unicodeslot=0x329C, category='so', description='CIRCLED IDEOGRAPH SUITABLE', specials={'circle',0x9069} },
+ [0x329D] = { unicodeslot=0x329D, category='so', description='CIRCLED IDEOGRAPH EXCELLENT', specials={'circle',0x512A} },
+ [0x329E] = { unicodeslot=0x329E, category='so', description='CIRCLED IDEOGRAPH PRINT', specials={'circle',0x5370} },
+ [0x329F] = { unicodeslot=0x329F, category='so', description='CIRCLED IDEOGRAPH ATTENTION', specials={'circle',0x6CE8} },
+ [0x32A0] = { unicodeslot=0x32A0, category='so', description='CIRCLED IDEOGRAPH ITEM', specials={'circle',0x9805} },
+ [0x32A1] = { unicodeslot=0x32A1, category='so', description='CIRCLED IDEOGRAPH REST', specials={'circle',0x4F11} },
+ [0x32A2] = { unicodeslot=0x32A2, category='so', description='CIRCLED IDEOGRAPH COPY', specials={'circle',0x5199} },
+ [0x32A3] = { unicodeslot=0x32A3, category='so', description='CIRCLED IDEOGRAPH CORRECT', specials={'circle',0x6B63} },
+ [0x32A4] = { unicodeslot=0x32A4, category='so', description='CIRCLED IDEOGRAPH HIGH', specials={'circle',0x4E0A} },
+ [0x32A5] = { unicodeslot=0x32A5, category='so', description='CIRCLED IDEOGRAPH CENTRE', specials={'circle',0x4E2D} },
+ [0x32A6] = { unicodeslot=0x32A6, category='so', description='CIRCLED IDEOGRAPH LOW', specials={'circle',0x4E0B} },
+ [0x32A7] = { unicodeslot=0x32A7, category='so', description='CIRCLED IDEOGRAPH LEFT', specials={'circle',0x5DE6} },
+ [0x32A8] = { unicodeslot=0x32A8, category='so', description='CIRCLED IDEOGRAPH RIGHT', specials={'circle',0x53F3} },
+ [0x32A9] = { unicodeslot=0x32A9, category='so', description='CIRCLED IDEOGRAPH MEDICINE', specials={'circle',0x533B} },
+ [0x32AA] = { unicodeslot=0x32AA, category='so', description='CIRCLED IDEOGRAPH RELIGION', specials={'circle',0x5B97} },
+ [0x32AB] = { unicodeslot=0x32AB, category='so', description='CIRCLED IDEOGRAPH STUDY', specials={'circle',0x5B66} },
+ [0x32AC] = { unicodeslot=0x32AC, category='so', description='CIRCLED IDEOGRAPH SUPERVISE', specials={'circle',0x76E3} },
+ [0x32AD] = { unicodeslot=0x32AD, category='so', description='CIRCLED IDEOGRAPH ENTERPRISE', specials={'circle',0x4F01} },
+ [0x32AE] = { unicodeslot=0x32AE, category='so', description='CIRCLED IDEOGRAPH RESOURCE', specials={'circle',0x8CC7} },
+ [0x32AF] = { unicodeslot=0x32AF, category='so', description='CIRCLED IDEOGRAPH ALLIANCE', specials={'circle',0x5354} },
+ [0x32B0] = { unicodeslot=0x32B0, category='so', description='CIRCLED IDEOGRAPH NIGHT', specials={'circle',0x591C} },
+ [0x32B1] = { unicodeslot=0x32B1, category='no', description='CIRCLED NUMBER THIRTY SIX', specials={'circle',0x0033,0x0036} },
+ [0x32B2] = { unicodeslot=0x32B2, category='no', description='CIRCLED NUMBER THIRTY SEVEN', specials={'circle',0x0033,0x0037} },
+ [0x32B3] = { unicodeslot=0x32B3, category='no', description='CIRCLED NUMBER THIRTY EIGHT', specials={'circle',0x0033,0x0038} },
+ [0x32B4] = { unicodeslot=0x32B4, category='no', description='CIRCLED NUMBER THIRTY NINE', specials={'circle',0x0033,0x0039} },
+ [0x32B5] = { unicodeslot=0x32B5, category='no', description='CIRCLED NUMBER FORTY', specials={'circle',0x0034,0x0030} },
+ [0x32B6] = { unicodeslot=0x32B6, category='no', description='CIRCLED NUMBER FORTY ONE', specials={'circle',0x0034,0x0031} },
+ [0x32B7] = { unicodeslot=0x32B7, category='no', description='CIRCLED NUMBER FORTY TWO', specials={'circle',0x0034,0x0032} },
+ [0x32B8] = { unicodeslot=0x32B8, category='no', description='CIRCLED NUMBER FORTY THREE', specials={'circle',0x0034,0x0033} },
+ [0x32B9] = { unicodeslot=0x32B9, category='no', description='CIRCLED NUMBER FORTY FOUR', specials={'circle',0x0034,0x0034} },
+ [0x32BA] = { unicodeslot=0x32BA, category='no', description='CIRCLED NUMBER FORTY FIVE', specials={'circle',0x0034,0x0035} },
+ [0x32BB] = { unicodeslot=0x32BB, category='no', description='CIRCLED NUMBER FORTY SIX', specials={'circle',0x0034,0x0036} },
+ [0x32BC] = { unicodeslot=0x32BC, category='no', description='CIRCLED NUMBER FORTY SEVEN', specials={'circle',0x0034,0x0037} },
+ [0x32BD] = { unicodeslot=0x32BD, category='no', description='CIRCLED NUMBER FORTY EIGHT', specials={'circle',0x0034,0x0038} },
+ [0x32BE] = { unicodeslot=0x32BE, category='no', description='CIRCLED NUMBER FORTY NINE', specials={'circle',0x0034,0x0039} },
+ [0x32BF] = { unicodeslot=0x32BF, category='no', description='CIRCLED NUMBER FIFTY', specials={'circle',0x0035,0x0030} },
+ [0x32C0] = { unicodeslot=0x32C0, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY', specials={'compat',0x0031,0x6708} },
+ [0x32C1] = { unicodeslot=0x32C1, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY', specials={'compat',0x0032,0x6708} },
+ [0x32C2] = { unicodeslot=0x32C2, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH', specials={'compat',0x0033,0x6708} },
+ [0x32C3] = { unicodeslot=0x32C3, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL', specials={'compat',0x0034,0x6708} },
+ [0x32C4] = { unicodeslot=0x32C4, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY', specials={'compat',0x0035,0x6708} },
+ [0x32C5] = { unicodeslot=0x32C5, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE', specials={'compat',0x0036,0x6708} },
+ [0x32C6] = { unicodeslot=0x32C6, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY', specials={'compat',0x0037,0x6708} },
+ [0x32C7] = { unicodeslot=0x32C7, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST', specials={'compat',0x0038,0x6708} },
+ [0x32C8] = { unicodeslot=0x32C8, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER', specials={'compat',0x0039,0x6708} },
+ [0x32C9] = { unicodeslot=0x32C9, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER', specials={'compat',0x0031,0x0030,0x6708} },
+ [0x32CA] = { unicodeslot=0x32CA, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER', specials={'compat',0x0031,0x0031,0x6708} },
+ [0x32CB] = { unicodeslot=0x32CB, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER', specials={'compat',0x0031,0x0032,0x6708} },
+ [0x32CC] = { unicodeslot=0x32CC, category='so', description='SQUARE HG', specials={'square',0x0048,0x0067} },
+ [0x32CD] = { unicodeslot=0x32CD, category='so', description='SQUARE ERG', specials={'square',0x0065,0x0072,0x0067} },
+ [0x32CE] = { unicodeslot=0x32CE, category='so', description='SQUARE EV', specials={'square',0x0065,0x0056} },
+ [0x32CF] = { unicodeslot=0x32CF, category='so', description='LIMITED LIABILITY SIGN', specials={'square',0x004C,0x0054,0x0044} },
+ [0x32D0] = { unicodeslot=0x32D0, category='so', description='CIRCLED KATAKANA A', specials={'circle',0x30A2} },
+ [0x32D1] = { unicodeslot=0x32D1, category='so', description='CIRCLED KATAKANA I', specials={'circle',0x30A4} },
+ [0x32D2] = { unicodeslot=0x32D2, category='so', description='CIRCLED KATAKANA U', specials={'circle',0x30A6} },
+ [0x32D3] = { unicodeslot=0x32D3, category='so', description='CIRCLED KATAKANA E', specials={'circle',0x30A8} },
+ [0x32D4] = { unicodeslot=0x32D4, category='so', description='CIRCLED KATAKANA O', specials={'circle',0x30AA} },
+ [0x32D5] = { unicodeslot=0x32D5, category='so', description='CIRCLED KATAKANA KA', specials={'circle',0x30AB} },
+ [0x32D6] = { unicodeslot=0x32D6, category='so', description='CIRCLED KATAKANA KI', specials={'circle',0x30AD} },
+ [0x32D7] = { unicodeslot=0x32D7, category='so', description='CIRCLED KATAKANA KU', specials={'circle',0x30AF} },
+ [0x32D8] = { unicodeslot=0x32D8, category='so', description='CIRCLED KATAKANA KE', specials={'circle',0x30B1} },
+ [0x32D9] = { unicodeslot=0x32D9, category='so', description='CIRCLED KATAKANA KO', specials={'circle',0x30B3} },
+ [0x32DA] = { unicodeslot=0x32DA, category='so', description='CIRCLED KATAKANA SA', specials={'circle',0x30B5} },
+ [0x32DB] = { unicodeslot=0x32DB, category='so', description='CIRCLED KATAKANA SI', specials={'circle',0x30B7} },
+ [0x32DC] = { unicodeslot=0x32DC, category='so', description='CIRCLED KATAKANA SU', specials={'circle',0x30B9} },
+ [0x32DD] = { unicodeslot=0x32DD, category='so', description='CIRCLED KATAKANA SE', specials={'circle',0x30BB} },
+ [0x32DE] = { unicodeslot=0x32DE, category='so', description='CIRCLED KATAKANA SO', specials={'circle',0x30BD} },
+ [0x32DF] = { unicodeslot=0x32DF, category='so', description='CIRCLED KATAKANA TA', specials={'circle',0x30BF} },
+ [0x32E0] = { unicodeslot=0x32E0, category='so', description='CIRCLED KATAKANA TI', specials={'circle',0x30C1} },
+ [0x32E1] = { unicodeslot=0x32E1, category='so', description='CIRCLED KATAKANA TU', specials={'circle',0x30C4} },
+ [0x32E2] = { unicodeslot=0x32E2, category='so', description='CIRCLED KATAKANA TE', specials={'circle',0x30C6} },
+ [0x32E3] = { unicodeslot=0x32E3, category='so', description='CIRCLED KATAKANA TO', specials={'circle',0x30C8} },
+ [0x32E4] = { unicodeslot=0x32E4, category='so', description='CIRCLED KATAKANA NA', specials={'circle',0x30CA} },
+ [0x32E5] = { unicodeslot=0x32E5, category='so', description='CIRCLED KATAKANA NI', specials={'circle',0x30CB} },
+ [0x32E6] = { unicodeslot=0x32E6, category='so', description='CIRCLED KATAKANA NU', specials={'circle',0x30CC} },
+ [0x32E7] = { unicodeslot=0x32E7, category='so', description='CIRCLED KATAKANA NE', specials={'circle',0x30CD} },
+ [0x32E8] = { unicodeslot=0x32E8, category='so', description='CIRCLED KATAKANA NO', specials={'circle',0x30CE} },
+ [0x32E9] = { unicodeslot=0x32E9, category='so', description='CIRCLED KATAKANA HA', specials={'circle',0x30CF} },
+ [0x32EA] = { unicodeslot=0x32EA, category='so', description='CIRCLED KATAKANA HI', specials={'circle',0x30D2} },
+ [0x32EB] = { unicodeslot=0x32EB, category='so', description='CIRCLED KATAKANA HU', specials={'circle',0x30D5} },
+ [0x32EC] = { unicodeslot=0x32EC, category='so', description='CIRCLED KATAKANA HE', specials={'circle',0x30D8} },
+ [0x32ED] = { unicodeslot=0x32ED, category='so', description='CIRCLED KATAKANA HO', specials={'circle',0x30DB} },
+ [0x32EE] = { unicodeslot=0x32EE, category='so', description='CIRCLED KATAKANA MA', specials={'circle',0x30DE} },
+ [0x32EF] = { unicodeslot=0x32EF, category='so', description='CIRCLED KATAKANA MI', specials={'circle',0x30DF} },
+ [0x32F0] = { unicodeslot=0x32F0, category='so', description='CIRCLED KATAKANA MU', specials={'circle',0x30E0} },
+ [0x32F1] = { unicodeslot=0x32F1, category='so', description='CIRCLED KATAKANA ME', specials={'circle',0x30E1} },
+ [0x32F2] = { unicodeslot=0x32F2, category='so', description='CIRCLED KATAKANA MO', specials={'circle',0x30E2} },
+ [0x32F3] = { unicodeslot=0x32F3, category='so', description='CIRCLED KATAKANA YA', specials={'circle',0x30E4} },
+ [0x32F4] = { unicodeslot=0x32F4, category='so', description='CIRCLED KATAKANA YU', specials={'circle',0x30E6} },
+ [0x32F5] = { unicodeslot=0x32F5, category='so', description='CIRCLED KATAKANA YO', specials={'circle',0x30E8} },
+ [0x32F6] = { unicodeslot=0x32F6, category='so', description='CIRCLED KATAKANA RA', specials={'circle',0x30E9} },
+ [0x32F7] = { unicodeslot=0x32F7, category='so', description='CIRCLED KATAKANA RI', specials={'circle',0x30EA} },
+ [0x32F8] = { unicodeslot=0x32F8, category='so', description='CIRCLED KATAKANA RU', specials={'circle',0x30EB} },
+ [0x32F9] = { unicodeslot=0x32F9, category='so', description='CIRCLED KATAKANA RE', specials={'circle',0x30EC} },
+ [0x32FA] = { unicodeslot=0x32FA, category='so', description='CIRCLED KATAKANA RO', specials={'circle',0x30ED} },
+ [0x32FB] = { unicodeslot=0x32FB, category='so', description='CIRCLED KATAKANA WA', specials={'circle',0x30EF} },
+ [0x32FC] = { unicodeslot=0x32FC, category='so', description='CIRCLED KATAKANA WI', specials={'circle',0x30F0} },
+ [0x32FD] = { unicodeslot=0x32FD, category='so', description='CIRCLED KATAKANA WE', specials={'circle',0x30F1} },
+ [0x32FE] = { unicodeslot=0x32FE, category='so', description='CIRCLED KATAKANA WO', specials={'circle',0x30F2} },
+ [0x3300] = { unicodeslot=0x3300, category='so', description='SQUARE APAATO', specials={'square',0x30A2,0x30D1,0x30FC,0x30C8} },
+ [0x3301] = { unicodeslot=0x3301, category='so', description='SQUARE ARUHUA', specials={'square',0x30A2,0x30EB,0x30D5,0x30A1} },
+ [0x3302] = { unicodeslot=0x3302, category='so', description='SQUARE ANPEA', specials={'square',0x30A2,0x30F3,0x30DA,0x30A2} },
+ [0x3303] = { unicodeslot=0x3303, category='so', description='SQUARE AARU', specials={'square',0x30A2,0x30FC,0x30EB} },
+ [0x3304] = { unicodeslot=0x3304, category='so', description='SQUARE ININGU', specials={'square',0x30A4,0x30CB,0x30F3,0x30B0} },
+ [0x3305] = { unicodeslot=0x3305, category='so', description='SQUARE INTI', specials={'square',0x30A4,0x30F3,0x30C1} },
+ [0x3306] = { unicodeslot=0x3306, category='so', description='SQUARE UON', specials={'square',0x30A6,0x30A9,0x30F3} },
+ [0x3307] = { unicodeslot=0x3307, category='so', description='SQUARE ESUKUUDO', specials={'square',0x30A8,0x30B9,0x30AF,0x30FC,0x30C9} },
+ [0x3308] = { unicodeslot=0x3308, category='so', description='SQUARE EEKAA', specials={'square',0x30A8,0x30FC,0x30AB,0x30FC} },
+ [0x3309] = { unicodeslot=0x3309, category='so', description='SQUARE ONSU', specials={'square',0x30AA,0x30F3,0x30B9} },
+ [0x330A] = { unicodeslot=0x330A, category='so', description='SQUARE OOMU', specials={'square',0x30AA,0x30FC,0x30E0} },
+ [0x330B] = { unicodeslot=0x330B, category='so', description='SQUARE KAIRI', specials={'square',0x30AB,0x30A4,0x30EA} },
+ [0x330C] = { unicodeslot=0x330C, category='so', description='SQUARE KARATTO', specials={'square',0x30AB,0x30E9,0x30C3,0x30C8} },
+ [0x330D] = { unicodeslot=0x330D, category='so', description='SQUARE KARORII', specials={'square',0x30AB,0x30ED,0x30EA,0x30FC} },
+ [0x330E] = { unicodeslot=0x330E, category='so', description='SQUARE GARON', specials={'square',0x30AC,0x30ED,0x30F3} },
+ [0x330F] = { unicodeslot=0x330F, category='so', description='SQUARE GANMA', specials={'square',0x30AC,0x30F3,0x30DE} },
+ [0x3310] = { unicodeslot=0x3310, category='so', description='SQUARE GIGA', specials={'square',0x30AE,0x30AC} },
+ [0x3311] = { unicodeslot=0x3311, category='so', description='SQUARE GINII', specials={'square',0x30AE,0x30CB,0x30FC} },
+ [0x3312] = { unicodeslot=0x3312, category='so', description='SQUARE KYURII', specials={'square',0x30AD,0x30E5,0x30EA,0x30FC} },
+ [0x3313] = { unicodeslot=0x3313, category='so', description='SQUARE GIRUDAA', specials={'square',0x30AE,0x30EB,0x30C0,0x30FC} },
+ [0x3314] = { unicodeslot=0x3314, category='so', description='SQUARE KIRO', specials={'square',0x30AD,0x30ED} },
+ [0x3315] = { unicodeslot=0x3315, category='so', description='SQUARE KIROGURAMU', specials={'square',0x30AD,0x30ED,0x30B0,0x30E9,0x30E0} },
+ [0x3316] = { unicodeslot=0x3316, category='so', description='SQUARE KIROMEETORU', specials={'square',0x30AD,0x30ED,0x30E1,0x30FC,0x30C8,0x30EB} },
+ [0x3317] = { unicodeslot=0x3317, category='so', description='SQUARE KIROWATTO', specials={'square',0x30AD,0x30ED,0x30EF,0x30C3,0x30C8} },
+ [0x3318] = { unicodeslot=0x3318, category='so', description='SQUARE GURAMU', specials={'square',0x30B0,0x30E9,0x30E0} },
+ [0x3319] = { unicodeslot=0x3319, category='so', description='SQUARE GURAMUTON', specials={'square',0x30B0,0x30E9,0x30E0,0x30C8,0x30F3} },
+ [0x331A] = { unicodeslot=0x331A, category='so', description='SQUARE KURUZEIRO', specials={'square',0x30AF,0x30EB,0x30BC,0x30A4,0x30ED} },
+ [0x331B] = { unicodeslot=0x331B, category='so', description='SQUARE KUROONE', specials={'square',0x30AF,0x30ED,0x30FC,0x30CD} },
+ [0x331C] = { unicodeslot=0x331C, category='so', description='SQUARE KEESU', specials={'square',0x30B1,0x30FC,0x30B9} },
+ [0x331D] = { unicodeslot=0x331D, category='so', description='SQUARE KORUNA', specials={'square',0x30B3,0x30EB,0x30CA} },
+ [0x331E] = { unicodeslot=0x331E, category='so', description='SQUARE KOOPO', specials={'square',0x30B3,0x30FC,0x30DD} },
+ [0x331F] = { unicodeslot=0x331F, category='so', description='SQUARE SAIKURU', specials={'square',0x30B5,0x30A4,0x30AF,0x30EB} },
+ [0x3320] = { unicodeslot=0x3320, category='so', description='SQUARE SANTIIMU', specials={'square',0x30B5,0x30F3,0x30C1,0x30FC,0x30E0} },
+ [0x3321] = { unicodeslot=0x3321, category='so', description='SQUARE SIRINGU', specials={'square',0x30B7,0x30EA,0x30F3,0x30B0} },
+ [0x3322] = { unicodeslot=0x3322, category='so', description='SQUARE SENTI', specials={'square',0x30BB,0x30F3,0x30C1} },
+ [0x3323] = { unicodeslot=0x3323, category='so', description='SQUARE SENTO', specials={'square',0x30BB,0x30F3,0x30C8} },
+ [0x3324] = { unicodeslot=0x3324, category='so', description='SQUARE DAASU', specials={'square',0x30C0,0x30FC,0x30B9} },
+ [0x3325] = { unicodeslot=0x3325, category='so', description='SQUARE DESI', specials={'square',0x30C7,0x30B7} },
+ [0x3326] = { unicodeslot=0x3326, category='so', description='SQUARE DORU', specials={'square',0x30C9,0x30EB} },
+ [0x3327] = { unicodeslot=0x3327, category='so', description='SQUARE TON', specials={'square',0x30C8,0x30F3} },
+ [0x3328] = { unicodeslot=0x3328, category='so', description='SQUARE NANO', specials={'square',0x30CA,0x30CE} },
+ [0x3329] = { unicodeslot=0x3329, category='so', description='SQUARE NOTTO', specials={'square',0x30CE,0x30C3,0x30C8} },
+ [0x332A] = { unicodeslot=0x332A, category='so', description='SQUARE HAITU', specials={'square',0x30CF,0x30A4,0x30C4} },
+ [0x332B] = { unicodeslot=0x332B, category='so', description='SQUARE PAASENTO', specials={'square',0x30D1,0x30FC,0x30BB,0x30F3,0x30C8} },
+ [0x332C] = { unicodeslot=0x332C, category='so', description='SQUARE PAATU', specials={'square',0x30D1,0x30FC,0x30C4} },
+ [0x332D] = { unicodeslot=0x332D, category='so', description='SQUARE BAARERU', specials={'square',0x30D0,0x30FC,0x30EC,0x30EB} },
+ [0x332E] = { unicodeslot=0x332E, category='so', description='SQUARE PIASUTORU', specials={'square',0x30D4,0x30A2,0x30B9,0x30C8,0x30EB} },
+ [0x332F] = { unicodeslot=0x332F, category='so', description='SQUARE PIKURU', specials={'square',0x30D4,0x30AF,0x30EB} },
+ [0x3330] = { unicodeslot=0x3330, category='so', description='SQUARE PIKO', specials={'square',0x30D4,0x30B3} },
+ [0x3331] = { unicodeslot=0x3331, category='so', description='SQUARE BIRU', specials={'square',0x30D3,0x30EB} },
+ [0x3332] = { unicodeslot=0x3332, category='so', description='SQUARE HUARADDO', specials={'square',0x30D5,0x30A1,0x30E9,0x30C3,0x30C9} },
+ [0x3333] = { unicodeslot=0x3333, category='so', description='SQUARE HUIITO', specials={'square',0x30D5,0x30A3,0x30FC,0x30C8} },
+ [0x3334] = { unicodeslot=0x3334, category='so', description='SQUARE BUSSYERU', specials={'square',0x30D6,0x30C3,0x30B7,0x30A7,0x30EB} },
+ [0x3335] = { unicodeslot=0x3335, category='so', description='SQUARE HURAN', specials={'square',0x30D5,0x30E9,0x30F3} },
+ [0x3336] = { unicodeslot=0x3336, category='so', description='SQUARE HEKUTAARU', specials={'square',0x30D8,0x30AF,0x30BF,0x30FC,0x30EB} },
+ [0x3337] = { unicodeslot=0x3337, category='so', description='SQUARE PESO', specials={'square',0x30DA,0x30BD} },
+ [0x3338] = { unicodeslot=0x3338, category='so', description='SQUARE PENIHI', specials={'square',0x30DA,0x30CB,0x30D2} },
+ [0x3339] = { unicodeslot=0x3339, category='so', description='SQUARE HERUTU', specials={'square',0x30D8,0x30EB,0x30C4} },
+ [0x333A] = { unicodeslot=0x333A, category='so', description='SQUARE PENSU', specials={'square',0x30DA,0x30F3,0x30B9} },
+ [0x333B] = { unicodeslot=0x333B, category='so', description='SQUARE PEEZI', specials={'square',0x30DA,0x30FC,0x30B8} },
+ [0x333C] = { unicodeslot=0x333C, category='so', description='SQUARE BEETA', specials={'square',0x30D9,0x30FC,0x30BF} },
+ [0x333D] = { unicodeslot=0x333D, category='so', description='SQUARE POINTO', specials={'square',0x30DD,0x30A4,0x30F3,0x30C8} },
+ [0x333E] = { unicodeslot=0x333E, category='so', description='SQUARE BORUTO', specials={'square',0x30DC,0x30EB,0x30C8} },
+ [0x333F] = { unicodeslot=0x333F, category='so', description='SQUARE HON', specials={'square',0x30DB,0x30F3} },
+ [0x3340] = { unicodeslot=0x3340, category='so', description='SQUARE PONDO', specials={'square',0x30DD,0x30F3,0x30C9} },
+ [0x3341] = { unicodeslot=0x3341, category='so', description='SQUARE HOORU', specials={'square',0x30DB,0x30FC,0x30EB} },
+ [0x3342] = { unicodeslot=0x3342, category='so', description='SQUARE HOON', specials={'square',0x30DB,0x30FC,0x30F3} },
+ [0x3343] = { unicodeslot=0x3343, category='so', description='SQUARE MAIKURO', specials={'square',0x30DE,0x30A4,0x30AF,0x30ED} },
+ [0x3344] = { unicodeslot=0x3344, category='so', description='SQUARE MAIRU', specials={'square',0x30DE,0x30A4,0x30EB} },
+ [0x3345] = { unicodeslot=0x3345, category='so', description='SQUARE MAHHA', specials={'square',0x30DE,0x30C3,0x30CF} },
+ [0x3346] = { unicodeslot=0x3346, category='so', description='SQUARE MARUKU', specials={'square',0x30DE,0x30EB,0x30AF} },
+ [0x3347] = { unicodeslot=0x3347, category='so', description='SQUARE MANSYON', specials={'square',0x30DE,0x30F3,0x30B7,0x30E7,0x30F3} },
+ [0x3348] = { unicodeslot=0x3348, category='so', description='SQUARE MIKURON', specials={'square',0x30DF,0x30AF,0x30ED,0x30F3} },
+ [0x3349] = { unicodeslot=0x3349, category='so', description='SQUARE MIRI', specials={'square',0x30DF,0x30EA} },
+ [0x334A] = { unicodeslot=0x334A, category='so', description='SQUARE MIRIBAARU', specials={'square',0x30DF,0x30EA,0x30D0,0x30FC,0x30EB} },
+ [0x334B] = { unicodeslot=0x334B, category='so', description='SQUARE MEGA', specials={'square',0x30E1,0x30AC} },
+ [0x334C] = { unicodeslot=0x334C, category='so', description='SQUARE MEGATON', specials={'square',0x30E1,0x30AC,0x30C8,0x30F3} },
+ [0x334D] = { unicodeslot=0x334D, category='so', description='SQUARE MEETORU', specials={'square',0x30E1,0x30FC,0x30C8,0x30EB} },
+ [0x334E] = { unicodeslot=0x334E, category='so', description='SQUARE YAADO', specials={'square',0x30E4,0x30FC,0x30C9} },
+ [0x334F] = { unicodeslot=0x334F, category='so', description='SQUARE YAARU', specials={'square',0x30E4,0x30FC,0x30EB} },
+ [0x3350] = { unicodeslot=0x3350, category='so', description='SQUARE YUAN', specials={'square',0x30E6,0x30A2,0x30F3} },
+ [0x3351] = { unicodeslot=0x3351, category='so', description='SQUARE RITTORU', specials={'square',0x30EA,0x30C3,0x30C8,0x30EB} },
+ [0x3352] = { unicodeslot=0x3352, category='so', description='SQUARE RIRA', specials={'square',0x30EA,0x30E9} },
+ [0x3353] = { unicodeslot=0x3353, category='so', description='SQUARE RUPII', specials={'square',0x30EB,0x30D4,0x30FC} },
+ [0x3354] = { unicodeslot=0x3354, category='so', description='SQUARE RUUBURU', specials={'square',0x30EB,0x30FC,0x30D6,0x30EB} },
+ [0x3355] = { unicodeslot=0x3355, category='so', description='SQUARE REMU', specials={'square',0x30EC,0x30E0} },
+ [0x3356] = { unicodeslot=0x3356, category='so', description='SQUARE RENTOGEN', specials={'square',0x30EC,0x30F3,0x30C8,0x30B2,0x30F3} },
+ [0x3357] = { unicodeslot=0x3357, category='so', description='SQUARE WATTO', specials={'square',0x30EF,0x30C3,0x30C8} },
+ [0x3358] = { unicodeslot=0x3358, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO', specials={'compat',0x0030,0x70B9} },
+ [0x3359] = { unicodeslot=0x3359, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE', specials={'compat',0x0031,0x70B9} },
+ [0x335A] = { unicodeslot=0x335A, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO', specials={'compat',0x0032,0x70B9} },
+ [0x335B] = { unicodeslot=0x335B, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE', specials={'compat',0x0033,0x70B9} },
+ [0x335C] = { unicodeslot=0x335C, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR', specials={'compat',0x0034,0x70B9} },
+ [0x335D] = { unicodeslot=0x335D, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE', specials={'compat',0x0035,0x70B9} },
+ [0x335E] = { unicodeslot=0x335E, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX', specials={'compat',0x0036,0x70B9} },
+ [0x335F] = { unicodeslot=0x335F, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN', specials={'compat',0x0037,0x70B9} },
+ [0x3360] = { unicodeslot=0x3360, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT', specials={'compat',0x0038,0x70B9} },
+ [0x3361] = { unicodeslot=0x3361, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE', specials={'compat',0x0039,0x70B9} },
+ [0x3362] = { unicodeslot=0x3362, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN', specials={'compat',0x0031,0x0030,0x70B9} },
+ [0x3363] = { unicodeslot=0x3363, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN', specials={'compat',0x0031,0x0031,0x70B9} },
+ [0x3364] = { unicodeslot=0x3364, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE', specials={'compat',0x0031,0x0032,0x70B9} },
+ [0x3365] = { unicodeslot=0x3365, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN', specials={'compat',0x0031,0x0033,0x70B9} },
+ [0x3366] = { unicodeslot=0x3366, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN', specials={'compat',0x0031,0x0034,0x70B9} },
+ [0x3367] = { unicodeslot=0x3367, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN', specials={'compat',0x0031,0x0035,0x70B9} },
+ [0x3368] = { unicodeslot=0x3368, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN', specials={'compat',0x0031,0x0036,0x70B9} },
+ [0x3369] = { unicodeslot=0x3369, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN', specials={'compat',0x0031,0x0037,0x70B9} },
+ [0x336A] = { unicodeslot=0x336A, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN', specials={'compat',0x0031,0x0038,0x70B9} },
+ [0x336B] = { unicodeslot=0x336B, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN', specials={'compat',0x0031,0x0039,0x70B9} },
+ [0x336C] = { unicodeslot=0x336C, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY', specials={'compat',0x0032,0x0030,0x70B9} },
+ [0x336D] = { unicodeslot=0x336D, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE', specials={'compat',0x0032,0x0031,0x70B9} },
+ [0x336E] = { unicodeslot=0x336E, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO', specials={'compat',0x0032,0x0032,0x70B9} },
+ [0x336F] = { unicodeslot=0x336F, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE', specials={'compat',0x0032,0x0033,0x70B9} },
+ [0x3370] = { unicodeslot=0x3370, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR', specials={'compat',0x0032,0x0034,0x70B9} },
+ [0x3371] = { unicodeslot=0x3371, category='so', description='SQUARE HPA', specials={'square',0x0068,0x0050,0x0061} },
+ [0x3372] = { unicodeslot=0x3372, category='so', description='SQUARE DA', specials={'square',0x0064,0x0061} },
+ [0x3373] = { unicodeslot=0x3373, category='so', description='SQUARE AU', specials={'square',0x0041,0x0055} },
+ [0x3374] = { unicodeslot=0x3374, category='so', description='SQUARE BAR', specials={'square',0x0062,0x0061,0x0072} },
+ [0x3375] = { unicodeslot=0x3375, category='so', description='SQUARE OV', specials={'square',0x006F,0x0056} },
+ [0x3376] = { unicodeslot=0x3376, category='so', description='SQUARE PC', specials={'square',0x0070,0x0063} },
+ [0x3377] = { unicodeslot=0x3377, category='so', description='SQUARE DM', specials={'square',0x0064,0x006D} },
+ [0x3378] = { unicodeslot=0x3378, category='so', description='SQUARE DM SQUARED', specials={'square',0x0064,0x006D,0x00B2} },
+ [0x3379] = { unicodeslot=0x3379, category='so', description='SQUARE DM CUBED', specials={'square',0x0064,0x006D,0x00B3} },
+ [0x337A] = { unicodeslot=0x337A, category='so', description='SQUARE IU', specials={'square',0x0049,0x0055} },
+ [0x337B] = { unicodeslot=0x337B, category='so', description='SQUARE ERA NAME HEISEI', specials={'square',0x5E73,0x6210} },
+ [0x337C] = { unicodeslot=0x337C, category='so', description='SQUARE ERA NAME SYOUWA', specials={'square',0x662D,0x548C} },
+ [0x337D] = { unicodeslot=0x337D, category='so', description='SQUARE ERA NAME TAISYOU', specials={'square',0x5927,0x6B63} },
+ [0x337E] = { unicodeslot=0x337E, category='so', description='SQUARE ERA NAME MEIZI', specials={'square',0x660E,0x6CBB} },
+ [0x337F] = { unicodeslot=0x337F, category='so', description='SQUARE CORPORATION', specials={'square',0x682A,0x5F0F,0x4F1A,0x793E} },
+ [0x3380] = { unicodeslot=0x3380, category='so', description='SQUARE PA AMPS', specials={'square',0x0070,0x0041} },
+ [0x3381] = { unicodeslot=0x3381, category='so', description='SQUARE NA', specials={'square',0x006E,0x0041} },
+ [0x3382] = { unicodeslot=0x3382, category='so', description='SQUARE MU A', specials={'square',0x03BC,0x0041} },
+ [0x3383] = { unicodeslot=0x3383, category='so', description='SQUARE MA', specials={'square',0x006D,0x0041} },
+ [0x3384] = { unicodeslot=0x3384, category='so', description='SQUARE KA', specials={'square',0x006B,0x0041} },
+ [0x3385] = { unicodeslot=0x3385, category='so', description='SQUARE KB', specials={'square',0x004B,0x0042} },
+ [0x3386] = { unicodeslot=0x3386, category='so', description='SQUARE MB', specials={'square',0x004D,0x0042} },
+ [0x3387] = { unicodeslot=0x3387, category='so', description='SQUARE GB', specials={'square',0x0047,0x0042} },
+ [0x3388] = { unicodeslot=0x3388, category='so', description='SQUARE CAL', specials={'square',0x0063,0x0061,0x006C} },
+ [0x3389] = { unicodeslot=0x3389, category='so', description='SQUARE KCAL', specials={'square',0x006B,0x0063,0x0061,0x006C} },
+ [0x338A] = { unicodeslot=0x338A, category='so', description='SQUARE PF', specials={'square',0x0070,0x0046} },
+ [0x338B] = { unicodeslot=0x338B, category='so', description='SQUARE NF', specials={'square',0x006E,0x0046} },
+ [0x338C] = { unicodeslot=0x338C, category='so', description='SQUARE MU F', specials={'square',0x03BC,0x0046} },
+ [0x338D] = { unicodeslot=0x338D, category='so', description='SQUARE MU G', specials={'square',0x03BC,0x0067} },
+ [0x338E] = { unicodeslot=0x338E, category='so', description='SQUARE MG', specials={'square',0x006D,0x0067} },
+ [0x338F] = { unicodeslot=0x338F, category='so', description='SQUARE KG', specials={'square',0x006B,0x0067} },
+ [0x3390] = { unicodeslot=0x3390, category='so', description='SQUARE HZ', specials={'square',0x0048,0x007A} },
+ [0x3391] = { unicodeslot=0x3391, category='so', description='SQUARE KHZ', specials={'square',0x006B,0x0048,0x007A} },
+ [0x3392] = { unicodeslot=0x3392, category='so', description='SQUARE MHZ', specials={'square',0x004D,0x0048,0x007A} },
+ [0x3393] = { unicodeslot=0x3393, category='so', description='SQUARE GHZ', specials={'square',0x0047,0x0048,0x007A} },
+ [0x3394] = { unicodeslot=0x3394, category='so', description='SQUARE THZ', specials={'square',0x0054,0x0048,0x007A} },
+ [0x3395] = { unicodeslot=0x3395, category='so', description='SQUARE MU L', specials={'square',0x03BC,0x2113} },
+ [0x3396] = { unicodeslot=0x3396, category='so', description='SQUARE ML', specials={'square',0x006D,0x2113} },
+ [0x3397] = { unicodeslot=0x3397, category='so', description='SQUARE DL', specials={'square',0x0064,0x2113} },
+ [0x3398] = { unicodeslot=0x3398, category='so', description='SQUARE KL', specials={'square',0x006B,0x2113} },
+ [0x3399] = { unicodeslot=0x3399, category='so', description='SQUARE FM', specials={'square',0x0066,0x006D} },
+ [0x339A] = { unicodeslot=0x339A, category='so', description='SQUARE NM', specials={'square',0x006E,0x006D} },
+ [0x339B] = { unicodeslot=0x339B, category='so', description='SQUARE MU M', specials={'square',0x03BC,0x006D} },
+ [0x339C] = { unicodeslot=0x339C, category='so', description='SQUARE MM', specials={'square',0x006D,0x006D} },
+ [0x339D] = { unicodeslot=0x339D, category='so', description='SQUARE CM', specials={'square',0x0063,0x006D} },
+ [0x339E] = { unicodeslot=0x339E, category='so', description='SQUARE KM', specials={'square',0x006B,0x006D} },
+ [0x339F] = { unicodeslot=0x339F, category='so', description='SQUARE MM SQUARED', specials={'square',0x006D,0x006D,0x00B2} },
+ [0x33A0] = { unicodeslot=0x33A0, category='so', description='SQUARE CM SQUARED', specials={'square',0x0063,0x006D,0x00B2} },
+ [0x33A1] = { unicodeslot=0x33A1, category='so', description='SQUARE M SQUARED', specials={'square',0x006D,0x00B2} },
+ [0x33A2] = { unicodeslot=0x33A2, category='so', description='SQUARE KM SQUARED', specials={'square',0x006B,0x006D,0x00B2} },
+ [0x33A3] = { unicodeslot=0x33A3, category='so', description='SQUARE MM CUBED', specials={'square',0x006D,0x006D,0x00B3} },
+ [0x33A4] = { unicodeslot=0x33A4, category='so', description='SQUARE CM CUBED', specials={'square',0x0063,0x006D,0x00B3} },
+ [0x33A5] = { unicodeslot=0x33A5, category='so', description='SQUARE M CUBED', specials={'square',0x006D,0x00B3} },
+ [0x33A6] = { unicodeslot=0x33A6, category='so', description='SQUARE KM CUBED', specials={'square',0x006B,0x006D,0x00B3} },
+ [0x33A7] = { unicodeslot=0x33A7, category='so', description='SQUARE M OVER S', specials={'square',0x006D,0x2215,0x0073} },
+ [0x33A8] = { unicodeslot=0x33A8, category='so', description='SQUARE M OVER S SQUARED', specials={'square',0x006D,0x2215,0x0073,0x00B2} },
+ [0x33A9] = { unicodeslot=0x33A9, category='so', description='SQUARE PA', specials={'square',0x0050,0x0061} },
+ [0x33AA] = { unicodeslot=0x33AA, category='so', description='SQUARE KPA', specials={'square',0x006B,0x0050,0x0061} },
+ [0x33AB] = { unicodeslot=0x33AB, category='so', description='SQUARE MPA', specials={'square',0x004D,0x0050,0x0061} },
+ [0x33AC] = { unicodeslot=0x33AC, category='so', description='SQUARE GPA', specials={'square',0x0047,0x0050,0x0061} },
+ [0x33AD] = { unicodeslot=0x33AD, category='so', description='SQUARE RAD', specials={'square',0x0072,0x0061,0x0064} },
+ [0x33AE] = { unicodeslot=0x33AE, category='so', description='SQUARE RAD OVER S', specials={'square',0x0072,0x0061,0x0064,0x2215,0x0073} },
+ [0x33AF] = { unicodeslot=0x33AF, category='so', description='SQUARE RAD OVER S SQUARED', specials={'square',0x0072,0x0061,0x0064,0x2215,0x0073,0x00B2} },
+ [0x33B0] = { unicodeslot=0x33B0, category='so', description='SQUARE PS', specials={'square',0x0070,0x0073} },
+ [0x33B1] = { unicodeslot=0x33B1, category='so', description='SQUARE NS', specials={'square',0x006E,0x0073} },
+ [0x33B2] = { unicodeslot=0x33B2, category='so', description='SQUARE MU S', specials={'square',0x03BC,0x0073} },
+ [0x33B3] = { unicodeslot=0x33B3, category='so', description='SQUARE MS', specials={'square',0x006D,0x0073} },
+ [0x33B4] = { unicodeslot=0x33B4, category='so', description='SQUARE PV', specials={'square',0x0070,0x0056} },
+ [0x33B5] = { unicodeslot=0x33B5, category='so', description='SQUARE NV', specials={'square',0x006E,0x0056} },
+ [0x33B6] = { unicodeslot=0x33B6, category='so', description='SQUARE MU V', specials={'square',0x03BC,0x0056} },
+ [0x33B7] = { unicodeslot=0x33B7, category='so', description='SQUARE MV', specials={'square',0x006D,0x0056} },
+ [0x33B8] = { unicodeslot=0x33B8, category='so', description='SQUARE KV', specials={'square',0x006B,0x0056} },
+ [0x33B9] = { unicodeslot=0x33B9, category='so', description='SQUARE MV MEGA', specials={'square',0x004D,0x0056} },
+ [0x33BA] = { unicodeslot=0x33BA, category='so', description='SQUARE PW', specials={'square',0x0070,0x0057} },
+ [0x33BB] = { unicodeslot=0x33BB, category='so', description='SQUARE NW', specials={'square',0x006E,0x0057} },
+ [0x33BC] = { unicodeslot=0x33BC, category='so', description='SQUARE MU W', specials={'square',0x03BC,0x0057} },
+ [0x33BD] = { unicodeslot=0x33BD, category='so', description='SQUARE MW', specials={'square',0x006D,0x0057} },
+ [0x33BE] = { unicodeslot=0x33BE, category='so', description='SQUARE KW', specials={'square',0x006B,0x0057} },
+ [0x33BF] = { unicodeslot=0x33BF, category='so', description='SQUARE MW MEGA', specials={'square',0x004D,0x0057} },
+ [0x33C0] = { unicodeslot=0x33C0, category='so', description='SQUARE K OHM', specials={'square',0x006B,0x03A9} },
+ [0x33C1] = { unicodeslot=0x33C1, category='so', description='SQUARE M OHM', specials={'square',0x004D,0x03A9} },
+ [0x33C2] = { unicodeslot=0x33C2, category='so', description='SQUARE AM', specials={'square',0x0061,0x002E,0x006D,0x002E} },
+ [0x33C3] = { unicodeslot=0x33C3, category='so', description='SQUARE BQ', specials={'square',0x0042,0x0071} },
+ [0x33C4] = { unicodeslot=0x33C4, category='so', description='SQUARE CC', specials={'square',0x0063,0x0063} },
+ [0x33C5] = { unicodeslot=0x33C5, category='so', description='SQUARE CD', specials={'square',0x0063,0x0064} },
+ [0x33C6] = { unicodeslot=0x33C6, category='so', description='SQUARE C OVER KG', specials={'square',0x0043,0x2215,0x006B,0x0067} },
+ [0x33C7] = { unicodeslot=0x33C7, category='so', description='SQUARE CO', specials={'square',0x0043,0x006F,0x002E} },
+ [0x33C8] = { unicodeslot=0x33C8, category='so', description='SQUARE DB', specials={'square',0x0064,0x0042} },
+ [0x33C9] = { unicodeslot=0x33C9, category='so', description='SQUARE GY', specials={'square',0x0047,0x0079} },
+ [0x33CA] = { unicodeslot=0x33CA, category='so', description='SQUARE HA', specials={'square',0x0068,0x0061} },
+ [0x33CB] = { unicodeslot=0x33CB, category='so', description='SQUARE HP', specials={'square',0x0048,0x0050} },
+ [0x33CC] = { unicodeslot=0x33CC, category='so', description='SQUARE IN', specials={'square',0x0069,0x006E} },
+ [0x33CD] = { unicodeslot=0x33CD, category='so', description='SQUARE KK', specials={'square',0x004B,0x004B} },
+ [0x33CE] = { unicodeslot=0x33CE, category='so', description='SQUARE KM CAPITAL', specials={'square',0x004B,0x004D} },
+ [0x33CF] = { unicodeslot=0x33CF, category='so', description='SQUARE KT', specials={'square',0x006B,0x0074} },
+ [0x33D0] = { unicodeslot=0x33D0, category='so', description='SQUARE LM', specials={'square',0x006C,0x006D} },
+ [0x33D1] = { unicodeslot=0x33D1, category='so', description='SQUARE LN', specials={'square',0x006C,0x006E} },
+ [0x33D2] = { unicodeslot=0x33D2, category='so', description='SQUARE LOG', specials={'square',0x006C,0x006F,0x0067} },
+ [0x33D3] = { unicodeslot=0x33D3, category='so', description='SQUARE LX', specials={'square',0x006C,0x0078} },
+ [0x33D4] = { unicodeslot=0x33D4, category='so', description='SQUARE MB SMALL', specials={'square',0x006D,0x0062} },
+ [0x33D5] = { unicodeslot=0x33D5, category='so', description='SQUARE MIL', specials={'square',0x006D,0x0069,0x006C} },
+ [0x33D6] = { unicodeslot=0x33D6, category='so', description='SQUARE MOL', specials={'square',0x006D,0x006F,0x006C} },
+ [0x33D7] = { unicodeslot=0x33D7, category='so', description='SQUARE PH', specials={'square',0x0050,0x0048} },
+ [0x33D8] = { unicodeslot=0x33D8, category='so', description='SQUARE PM', specials={'square',0x0070,0x002E,0x006D,0x002E} },
+ [0x33D9] = { unicodeslot=0x33D9, category='so', description='SQUARE PPM', specials={'square',0x0050,0x0050,0x004D} },
+ [0x33DA] = { unicodeslot=0x33DA, category='so', description='SQUARE PR', specials={'square',0x0050,0x0052} },
+ [0x33DB] = { unicodeslot=0x33DB, category='so', description='SQUARE SR', specials={'square',0x0073,0x0072} },
+ [0x33DC] = { unicodeslot=0x33DC, category='so', description='SQUARE SV', specials={'square',0x0053,0x0076} },
+ [0x33DD] = { unicodeslot=0x33DD, category='so', description='SQUARE WB', specials={'square',0x0057,0x0062} },
+ [0x33DE] = { unicodeslot=0x33DE, category='so', description='SQUARE V OVER M', specials={'square',0x0056,0x2215,0x006D} },
+ [0x33DF] = { unicodeslot=0x33DF, category='so', description='SQUARE A OVER M', specials={'square',0x0041,0x2215,0x006D} },
+ [0x33E0] = { unicodeslot=0x33E0, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE', specials={'compat',0x0031,0x65E5} },
+ [0x33E1] = { unicodeslot=0x33E1, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO', specials={'compat',0x0032,0x65E5} },
+ [0x33E2] = { unicodeslot=0x33E2, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE', specials={'compat',0x0033,0x65E5} },
+ [0x33E3] = { unicodeslot=0x33E3, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR', specials={'compat',0x0034,0x65E5} },
+ [0x33E4] = { unicodeslot=0x33E4, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE', specials={'compat',0x0035,0x65E5} },
+ [0x33E5] = { unicodeslot=0x33E5, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX', specials={'compat',0x0036,0x65E5} },
+ [0x33E6] = { unicodeslot=0x33E6, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN', specials={'compat',0x0037,0x65E5} },
+ [0x33E7] = { unicodeslot=0x33E7, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT', specials={'compat',0x0038,0x65E5} },
+ [0x33E8] = { unicodeslot=0x33E8, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE', specials={'compat',0x0039,0x65E5} },
+ [0x33E9] = { unicodeslot=0x33E9, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN', specials={'compat',0x0031,0x0030,0x65E5} },
+ [0x33EA] = { unicodeslot=0x33EA, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN', specials={'compat',0x0031,0x0031,0x65E5} },
+ [0x33EB] = { unicodeslot=0x33EB, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE', specials={'compat',0x0031,0x0032,0x65E5} },
+ [0x33EC] = { unicodeslot=0x33EC, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN', specials={'compat',0x0031,0x0033,0x65E5} },
+ [0x33ED] = { unicodeslot=0x33ED, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN', specials={'compat',0x0031,0x0034,0x65E5} },
+ [0x33EE] = { unicodeslot=0x33EE, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN', specials={'compat',0x0031,0x0035,0x65E5} },
+ [0x33EF] = { unicodeslot=0x33EF, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN', specials={'compat',0x0031,0x0036,0x65E5} },
+ [0x33F0] = { unicodeslot=0x33F0, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN', specials={'compat',0x0031,0x0037,0x65E5} },
+ [0x33F1] = { unicodeslot=0x33F1, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN', specials={'compat',0x0031,0x0038,0x65E5} },
+ [0x33F2] = { unicodeslot=0x33F2, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN', specials={'compat',0x0031,0x0039,0x65E5} },
+ [0x33F3] = { unicodeslot=0x33F3, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY', specials={'compat',0x0032,0x0030,0x65E5} },
+ [0x33F4] = { unicodeslot=0x33F4, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE', specials={'compat',0x0032,0x0031,0x65E5} },
+ [0x33F5] = { unicodeslot=0x33F5, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO', specials={'compat',0x0032,0x0032,0x65E5} },
+ [0x33F6] = { unicodeslot=0x33F6, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE', specials={'compat',0x0032,0x0033,0x65E5} },
+ [0x33F7] = { unicodeslot=0x33F7, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR', specials={'compat',0x0032,0x0034,0x65E5} },
+ [0x33F8] = { unicodeslot=0x33F8, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE', specials={'compat',0x0032,0x0035,0x65E5} },
+ [0x33F9] = { unicodeslot=0x33F9, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX', specials={'compat',0x0032,0x0036,0x65E5} },
+ [0x33FA] = { unicodeslot=0x33FA, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN', specials={'compat',0x0032,0x0037,0x65E5} },
+ [0x33FB] = { unicodeslot=0x33FB, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT', specials={'compat',0x0032,0x0038,0x65E5} },
+ [0x33FC] = { unicodeslot=0x33FC, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE', specials={'compat',0x0032,0x0039,0x65E5} },
+ [0x33FD] = { unicodeslot=0x33FD, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY', specials={'compat',0x0033,0x0030,0x65E5} },
+ [0x33FE] = { unicodeslot=0x33FE, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE', specials={'compat',0x0033,0x0031,0x65E5} },
+ [0x33FF] = { unicodeslot=0x33FF, category='so', description='SQUARE GAL', specials={'square',0x0067,0x0061,0x006C} },
+ [0x3400] = { unicodeslot=0x3400, category='lo', description='<CJK Ideograph Extension A, First>' },
+ [0x4DB5] = { unicodeslot=0x4DB5, category='lo', description='<CJK Ideograph Extension A, Last>' },
+ [0x4DC0] = { unicodeslot=0x4DC0, category='so', description='HEXAGRAM FOR THE CREATIVE HEAVEN' },
+ [0x4DC1] = { unicodeslot=0x4DC1, category='so', description='HEXAGRAM FOR THE RECEPTIVE EARTH' },
+ [0x4DC2] = { unicodeslot=0x4DC2, category='so', description='HEXAGRAM FOR DIFFICULTY AT THE BEGINNING' },
+ [0x4DC3] = { unicodeslot=0x4DC3, category='so', description='HEXAGRAM FOR YOUTHFUL FOLLY' },
+ [0x4DC4] = { unicodeslot=0x4DC4, category='so', description='HEXAGRAM FOR WAITING' },
+ [0x4DC5] = { unicodeslot=0x4DC5, category='so', description='HEXAGRAM FOR CONFLICT' },
+ [0x4DC6] = { unicodeslot=0x4DC6, category='so', description='HEXAGRAM FOR THE ARMY' },
+ [0x4DC7] = { unicodeslot=0x4DC7, category='so', description='HEXAGRAM FOR HOLDING TOGETHER' },
+ [0x4DC8] = { unicodeslot=0x4DC8, category='so', description='HEXAGRAM FOR SMALL TAMING' },
+ [0x4DC9] = { unicodeslot=0x4DC9, category='so', description='HEXAGRAM FOR TREADING' },
+ [0x4DCA] = { unicodeslot=0x4DCA, category='so', description='HEXAGRAM FOR PEACE' },
+ [0x4DCB] = { unicodeslot=0x4DCB, category='so', description='HEXAGRAM FOR STANDSTILL' },
+ [0x4DCC] = { unicodeslot=0x4DCC, category='so', description='HEXAGRAM FOR FELLOWSHIP' },
+ [0x4DCD] = { unicodeslot=0x4DCD, category='so', description='HEXAGRAM FOR GREAT POSSESSION' },
+ [0x4DCE] = { unicodeslot=0x4DCE, category='so', description='HEXAGRAM FOR MODESTY' },
+ [0x4DCF] = { unicodeslot=0x4DCF, category='so', description='HEXAGRAM FOR ENTHUSIASM' },
+ [0x4DD0] = { unicodeslot=0x4DD0, category='so', description='HEXAGRAM FOR FOLLOWING' },
+ [0x4DD1] = { unicodeslot=0x4DD1, category='so', description='HEXAGRAM FOR WORK ON THE DECAYED' },
+ [0x4DD2] = { unicodeslot=0x4DD2, category='so', description='HEXAGRAM FOR APPROACH' },
+ [0x4DD3] = { unicodeslot=0x4DD3, category='so', description='HEXAGRAM FOR CONTEMPLATION' },
+ [0x4DD4] = { unicodeslot=0x4DD4, category='so', description='HEXAGRAM FOR BITING THROUGH' },
+ [0x4DD5] = { unicodeslot=0x4DD5, category='so', description='HEXAGRAM FOR GRACE' },
+ [0x4DD6] = { unicodeslot=0x4DD6, category='so', description='HEXAGRAM FOR SPLITTING APART' },
+ [0x4DD7] = { unicodeslot=0x4DD7, category='so', description='HEXAGRAM FOR RETURN' },
+ [0x4DD8] = { unicodeslot=0x4DD8, category='so', description='HEXAGRAM FOR INNOCENCE' },
+ [0x4DD9] = { unicodeslot=0x4DD9, category='so', description='HEXAGRAM FOR GREAT TAMING' },
+ [0x4DDA] = { unicodeslot=0x4DDA, category='so', description='HEXAGRAM FOR MOUTH CORNERS' },
+ [0x4DDB] = { unicodeslot=0x4DDB, category='so', description='HEXAGRAM FOR GREAT PREPONDERANCE' },
+ [0x4DDC] = { unicodeslot=0x4DDC, category='so', description='HEXAGRAM FOR THE ABYSMAL WATER' },
+ [0x4DDD] = { unicodeslot=0x4DDD, category='so', description='HEXAGRAM FOR THE CLINGING FIRE' },
+ [0x4DDE] = { unicodeslot=0x4DDE, category='so', description='HEXAGRAM FOR INFLUENCE' },
+ [0x4DDF] = { unicodeslot=0x4DDF, category='so', description='HEXAGRAM FOR DURATION' },
+ [0x4DE0] = { unicodeslot=0x4DE0, category='so', description='HEXAGRAM FOR RETREAT' },
+ [0x4DE1] = { unicodeslot=0x4DE1, category='so', description='HEXAGRAM FOR GREAT POWER' },
+ [0x4DE2] = { unicodeslot=0x4DE2, category='so', description='HEXAGRAM FOR PROGRESS' },
+ [0x4DE3] = { unicodeslot=0x4DE3, category='so', description='HEXAGRAM FOR DARKENING OF THE LIGHT' },
+ [0x4DE4] = { unicodeslot=0x4DE4, category='so', description='HEXAGRAM FOR THE FAMILY' },
+ [0x4DE5] = { unicodeslot=0x4DE5, category='so', description='HEXAGRAM FOR OPPOSITION' },
+ [0x4DE6] = { unicodeslot=0x4DE6, category='so', description='HEXAGRAM FOR OBSTRUCTION' },
+ [0x4DE7] = { unicodeslot=0x4DE7, category='so', description='HEXAGRAM FOR DELIVERANCE' },
+ [0x4DE8] = { unicodeslot=0x4DE8, category='so', description='HEXAGRAM FOR DECREASE' },
+ [0x4DE9] = { unicodeslot=0x4DE9, category='so', description='HEXAGRAM FOR INCREASE' },
+ [0x4DEA] = { unicodeslot=0x4DEA, category='so', description='HEXAGRAM FOR BREAKTHROUGH' },
+ [0x4DEB] = { unicodeslot=0x4DEB, category='so', description='HEXAGRAM FOR COMING TO MEET' },
+ [0x4DEC] = { unicodeslot=0x4DEC, category='so', description='HEXAGRAM FOR GATHERING TOGETHER' },
+ [0x4DED] = { unicodeslot=0x4DED, category='so', description='HEXAGRAM FOR PUSHING UPWARD' },
+ [0x4DEE] = { unicodeslot=0x4DEE, category='so', description='HEXAGRAM FOR OPPRESSION' },
+ [0x4DEF] = { unicodeslot=0x4DEF, category='so', description='HEXAGRAM FOR THE WELL' },
+ [0x4DF0] = { unicodeslot=0x4DF0, category='so', description='HEXAGRAM FOR REVOLUTION' },
+ [0x4DF1] = { unicodeslot=0x4DF1, category='so', description='HEXAGRAM FOR THE CAULDRON' },
+ [0x4DF2] = { unicodeslot=0x4DF2, category='so', description='HEXAGRAM FOR THE AROUSING THUNDER' },
+ [0x4DF3] = { unicodeslot=0x4DF3, category='so', description='HEXAGRAM FOR THE KEEPING STILL MOUNTAIN' },
+ [0x4DF4] = { unicodeslot=0x4DF4, category='so', description='HEXAGRAM FOR DEVELOPMENT' },
+ [0x4DF5] = { unicodeslot=0x4DF5, category='so', description='HEXAGRAM FOR THE MARRYING MAIDEN' },
+ [0x4DF6] = { unicodeslot=0x4DF6, category='so', description='HEXAGRAM FOR ABUNDANCE' },
+ [0x4DF7] = { unicodeslot=0x4DF7, category='so', description='HEXAGRAM FOR THE WANDERER' },
+ [0x4DF8] = { unicodeslot=0x4DF8, category='so', description='HEXAGRAM FOR THE GENTLE WIND' },
+ [0x4DF9] = { unicodeslot=0x4DF9, category='so', description='HEXAGRAM FOR THE JOYOUS LAKE' },
+ [0x4DFA] = { unicodeslot=0x4DFA, category='so', description='HEXAGRAM FOR DISPERSION' },
+ [0x4DFB] = { unicodeslot=0x4DFB, category='so', description='HEXAGRAM FOR LIMITATION' },
+ [0x4DFC] = { unicodeslot=0x4DFC, category='so', description='HEXAGRAM FOR INNER TRUTH' },
+ [0x4DFD] = { unicodeslot=0x4DFD, category='so', description='HEXAGRAM FOR SMALL PREPONDERANCE' },
+ [0x4DFE] = { unicodeslot=0x4DFE, category='so', description='HEXAGRAM FOR AFTER COMPLETION' },
+ [0x4DFF] = { unicodeslot=0x4DFF, category='so', description='HEXAGRAM FOR BEFORE COMPLETION' },
+ [0x4E00] = { unicodeslot=0x4E00, category='lo', description='<CJK Ideograph, First>' },
+ [0x9FBB] = { unicodeslot=0x9FBB, category='lo', description='<CJK Ideograph, Last>' },
+ [0xA000] = { unicodeslot=0xA000, category='lo', description='YI SYLLABLE IT' },
+ [0xA001] = { unicodeslot=0xA001, category='lo', description='YI SYLLABLE IX' },
+ [0xA002] = { unicodeslot=0xA002, category='lo', description='YI SYLLABLE I' },
+ [0xA003] = { unicodeslot=0xA003, category='lo', description='YI SYLLABLE IP' },
+ [0xA004] = { unicodeslot=0xA004, category='lo', description='YI SYLLABLE IET' },
+ [0xA005] = { unicodeslot=0xA005, category='lo', description='YI SYLLABLE IEX' },
+ [0xA006] = { unicodeslot=0xA006, category='lo', description='YI SYLLABLE IE' },
+ [0xA007] = { unicodeslot=0xA007, category='lo', description='YI SYLLABLE IEP' },
+ [0xA008] = { unicodeslot=0xA008, category='lo', description='YI SYLLABLE AT' },
+ [0xA009] = { unicodeslot=0xA009, category='lo', description='YI SYLLABLE AX' },
+ [0xA00A] = { unicodeslot=0xA00A, category='lo', description='YI SYLLABLE A' },
+ [0xA00B] = { unicodeslot=0xA00B, category='lo', description='YI SYLLABLE AP' },
+ [0xA00C] = { unicodeslot=0xA00C, category='lo', description='YI SYLLABLE UOX' },
+ [0xA00D] = { unicodeslot=0xA00D, category='lo', description='YI SYLLABLE UO' },
+ [0xA00E] = { unicodeslot=0xA00E, category='lo', description='YI SYLLABLE UOP' },
+ [0xA00F] = { unicodeslot=0xA00F, category='lo', description='YI SYLLABLE OT' },
+ [0xA010] = { unicodeslot=0xA010, category='lo', description='YI SYLLABLE OX' },
+ [0xA011] = { unicodeslot=0xA011, category='lo', description='YI SYLLABLE O' },
+ [0xA012] = { unicodeslot=0xA012, category='lo', description='YI SYLLABLE OP' },
+ [0xA013] = { unicodeslot=0xA013, category='lo', description='YI SYLLABLE EX' },
+ [0xA014] = { unicodeslot=0xA014, category='lo', description='YI SYLLABLE E' },
+ [0xA015] = { unicodeslot=0xA015, category='lm', description='YI SYLLABLE WU' },
+ [0xA016] = { unicodeslot=0xA016, category='lo', description='YI SYLLABLE BIT' },
+ [0xA017] = { unicodeslot=0xA017, category='lo', description='YI SYLLABLE BIX' },
+ [0xA018] = { unicodeslot=0xA018, category='lo', description='YI SYLLABLE BI' },
+ [0xA019] = { unicodeslot=0xA019, category='lo', description='YI SYLLABLE BIP' },
+ [0xA01A] = { unicodeslot=0xA01A, category='lo', description='YI SYLLABLE BIET' },
+ [0xA01B] = { unicodeslot=0xA01B, category='lo', description='YI SYLLABLE BIEX' },
+ [0xA01C] = { unicodeslot=0xA01C, category='lo', description='YI SYLLABLE BIE' },
+ [0xA01D] = { unicodeslot=0xA01D, category='lo', description='YI SYLLABLE BIEP' },
+ [0xA01E] = { unicodeslot=0xA01E, category='lo', description='YI SYLLABLE BAT' },
+ [0xA01F] = { unicodeslot=0xA01F, category='lo', description='YI SYLLABLE BAX' },
+ [0xA020] = { unicodeslot=0xA020, category='lo', description='YI SYLLABLE BA' },
+ [0xA021] = { unicodeslot=0xA021, category='lo', description='YI SYLLABLE BAP' },
+ [0xA022] = { unicodeslot=0xA022, category='lo', description='YI SYLLABLE BUOX' },
+ [0xA023] = { unicodeslot=0xA023, category='lo', description='YI SYLLABLE BUO' },
+ [0xA024] = { unicodeslot=0xA024, category='lo', description='YI SYLLABLE BUOP' },
+ [0xA025] = { unicodeslot=0xA025, category='lo', description='YI SYLLABLE BOT' },
+ [0xA026] = { unicodeslot=0xA026, category='lo', description='YI SYLLABLE BOX' },
+ [0xA027] = { unicodeslot=0xA027, category='lo', description='YI SYLLABLE BO' },
+ [0xA028] = { unicodeslot=0xA028, category='lo', description='YI SYLLABLE BOP' },
+ [0xA029] = { unicodeslot=0xA029, category='lo', description='YI SYLLABLE BEX' },
+ [0xA02A] = { unicodeslot=0xA02A, category='lo', description='YI SYLLABLE BE' },
+ [0xA02B] = { unicodeslot=0xA02B, category='lo', description='YI SYLLABLE BEP' },
+ [0xA02C] = { unicodeslot=0xA02C, category='lo', description='YI SYLLABLE BUT' },
+ [0xA02D] = { unicodeslot=0xA02D, category='lo', description='YI SYLLABLE BUX' },
+ [0xA02E] = { unicodeslot=0xA02E, category='lo', description='YI SYLLABLE BU' },
+ [0xA02F] = { unicodeslot=0xA02F, category='lo', description='YI SYLLABLE BUP' },
+ [0xA030] = { unicodeslot=0xA030, category='lo', description='YI SYLLABLE BURX' },
+ [0xA031] = { unicodeslot=0xA031, category='lo', description='YI SYLLABLE BUR' },
+ [0xA032] = { unicodeslot=0xA032, category='lo', description='YI SYLLABLE BYT' },
+ [0xA033] = { unicodeslot=0xA033, category='lo', description='YI SYLLABLE BYX' },
+ [0xA034] = { unicodeslot=0xA034, category='lo', description='YI SYLLABLE BY' },
+ [0xA035] = { unicodeslot=0xA035, category='lo', description='YI SYLLABLE BYP' },
+ [0xA036] = { unicodeslot=0xA036, category='lo', description='YI SYLLABLE BYRX' },
+ [0xA037] = { unicodeslot=0xA037, category='lo', description='YI SYLLABLE BYR' },
+ [0xA038] = { unicodeslot=0xA038, category='lo', description='YI SYLLABLE PIT' },
+ [0xA039] = { unicodeslot=0xA039, category='lo', description='YI SYLLABLE PIX' },
+ [0xA03A] = { unicodeslot=0xA03A, category='lo', description='YI SYLLABLE PI' },
+ [0xA03B] = { unicodeslot=0xA03B, category='lo', description='YI SYLLABLE PIP' },
+ [0xA03C] = { unicodeslot=0xA03C, category='lo', description='YI SYLLABLE PIEX' },
+ [0xA03D] = { unicodeslot=0xA03D, category='lo', description='YI SYLLABLE PIE' },
+ [0xA03E] = { unicodeslot=0xA03E, category='lo', description='YI SYLLABLE PIEP' },
+ [0xA03F] = { unicodeslot=0xA03F, category='lo', description='YI SYLLABLE PAT' },
+ [0xA040] = { unicodeslot=0xA040, category='lo', description='YI SYLLABLE PAX' },
+ [0xA041] = { unicodeslot=0xA041, category='lo', description='YI SYLLABLE PA' },
+ [0xA042] = { unicodeslot=0xA042, category='lo', description='YI SYLLABLE PAP' },
+ [0xA043] = { unicodeslot=0xA043, category='lo', description='YI SYLLABLE PUOX' },
+ [0xA044] = { unicodeslot=0xA044, category='lo', description='YI SYLLABLE PUO' },
+ [0xA045] = { unicodeslot=0xA045, category='lo', description='YI SYLLABLE PUOP' },
+ [0xA046] = { unicodeslot=0xA046, category='lo', description='YI SYLLABLE POT' },
+ [0xA047] = { unicodeslot=0xA047, category='lo', description='YI SYLLABLE POX' },
+ [0xA048] = { unicodeslot=0xA048, category='lo', description='YI SYLLABLE PO' },
+ [0xA049] = { unicodeslot=0xA049, category='lo', description='YI SYLLABLE POP' },
+ [0xA04A] = { unicodeslot=0xA04A, category='lo', description='YI SYLLABLE PUT' },
+ [0xA04B] = { unicodeslot=0xA04B, category='lo', description='YI SYLLABLE PUX' },
+ [0xA04C] = { unicodeslot=0xA04C, category='lo', description='YI SYLLABLE PU' },
+ [0xA04D] = { unicodeslot=0xA04D, category='lo', description='YI SYLLABLE PUP' },
+ [0xA04E] = { unicodeslot=0xA04E, category='lo', description='YI SYLLABLE PURX' },
+ [0xA04F] = { unicodeslot=0xA04F, category='lo', description='YI SYLLABLE PUR' },
+ [0xA050] = { unicodeslot=0xA050, category='lo', description='YI SYLLABLE PYT' },
+ [0xA051] = { unicodeslot=0xA051, category='lo', description='YI SYLLABLE PYX' },
+ [0xA052] = { unicodeslot=0xA052, category='lo', description='YI SYLLABLE PY' },
+ [0xA053] = { unicodeslot=0xA053, category='lo', description='YI SYLLABLE PYP' },
+ [0xA054] = { unicodeslot=0xA054, category='lo', description='YI SYLLABLE PYRX' },
+ [0xA055] = { unicodeslot=0xA055, category='lo', description='YI SYLLABLE PYR' },
+ [0xA056] = { unicodeslot=0xA056, category='lo', description='YI SYLLABLE BBIT' },
+ [0xA057] = { unicodeslot=0xA057, category='lo', description='YI SYLLABLE BBIX' },
+ [0xA058] = { unicodeslot=0xA058, category='lo', description='YI SYLLABLE BBI' },
+ [0xA059] = { unicodeslot=0xA059, category='lo', description='YI SYLLABLE BBIP' },
+ [0xA05A] = { unicodeslot=0xA05A, category='lo', description='YI SYLLABLE BBIET' },
+ [0xA05B] = { unicodeslot=0xA05B, category='lo', description='YI SYLLABLE BBIEX' },
+ [0xA05C] = { unicodeslot=0xA05C, category='lo', description='YI SYLLABLE BBIE' },
+ [0xA05D] = { unicodeslot=0xA05D, category='lo', description='YI SYLLABLE BBIEP' },
+ [0xA05E] = { unicodeslot=0xA05E, category='lo', description='YI SYLLABLE BBAT' },
+ [0xA05F] = { unicodeslot=0xA05F, category='lo', description='YI SYLLABLE BBAX' },
+ [0xA060] = { unicodeslot=0xA060, category='lo', description='YI SYLLABLE BBA' },
+ [0xA061] = { unicodeslot=0xA061, category='lo', description='YI SYLLABLE BBAP' },
+ [0xA062] = { unicodeslot=0xA062, category='lo', description='YI SYLLABLE BBUOX' },
+ [0xA063] = { unicodeslot=0xA063, category='lo', description='YI SYLLABLE BBUO' },
+ [0xA064] = { unicodeslot=0xA064, category='lo', description='YI SYLLABLE BBUOP' },
+ [0xA065] = { unicodeslot=0xA065, category='lo', description='YI SYLLABLE BBOT' },
+ [0xA066] = { unicodeslot=0xA066, category='lo', description='YI SYLLABLE BBOX' },
+ [0xA067] = { unicodeslot=0xA067, category='lo', description='YI SYLLABLE BBO' },
+ [0xA068] = { unicodeslot=0xA068, category='lo', description='YI SYLLABLE BBOP' },
+ [0xA069] = { unicodeslot=0xA069, category='lo', description='YI SYLLABLE BBEX' },
+ [0xA06A] = { unicodeslot=0xA06A, category='lo', description='YI SYLLABLE BBE' },
+ [0xA06B] = { unicodeslot=0xA06B, category='lo', description='YI SYLLABLE BBEP' },
+ [0xA06C] = { unicodeslot=0xA06C, category='lo', description='YI SYLLABLE BBUT' },
+ [0xA06D] = { unicodeslot=0xA06D, category='lo', description='YI SYLLABLE BBUX' },
+ [0xA06E] = { unicodeslot=0xA06E, category='lo', description='YI SYLLABLE BBU' },
+ [0xA06F] = { unicodeslot=0xA06F, category='lo', description='YI SYLLABLE BBUP' },
+ [0xA070] = { unicodeslot=0xA070, category='lo', description='YI SYLLABLE BBURX' },
+ [0xA071] = { unicodeslot=0xA071, category='lo', description='YI SYLLABLE BBUR' },
+ [0xA072] = { unicodeslot=0xA072, category='lo', description='YI SYLLABLE BBYT' },
+ [0xA073] = { unicodeslot=0xA073, category='lo', description='YI SYLLABLE BBYX' },
+ [0xA074] = { unicodeslot=0xA074, category='lo', description='YI SYLLABLE BBY' },
+ [0xA075] = { unicodeslot=0xA075, category='lo', description='YI SYLLABLE BBYP' },
+ [0xA076] = { unicodeslot=0xA076, category='lo', description='YI SYLLABLE NBIT' },
+ [0xA077] = { unicodeslot=0xA077, category='lo', description='YI SYLLABLE NBIX' },
+ [0xA078] = { unicodeslot=0xA078, category='lo', description='YI SYLLABLE NBI' },
+ [0xA079] = { unicodeslot=0xA079, category='lo', description='YI SYLLABLE NBIP' },
+ [0xA07A] = { unicodeslot=0xA07A, category='lo', description='YI SYLLABLE NBIEX' },
+ [0xA07B] = { unicodeslot=0xA07B, category='lo', description='YI SYLLABLE NBIE' },
+ [0xA07C] = { unicodeslot=0xA07C, category='lo', description='YI SYLLABLE NBIEP' },
+ [0xA07D] = { unicodeslot=0xA07D, category='lo', description='YI SYLLABLE NBAT' },
+ [0xA07E] = { unicodeslot=0xA07E, category='lo', description='YI SYLLABLE NBAX' },
+ [0xA07F] = { unicodeslot=0xA07F, category='lo', description='YI SYLLABLE NBA' },
+ [0xA080] = { unicodeslot=0xA080, category='lo', description='YI SYLLABLE NBAP' },
+ [0xA081] = { unicodeslot=0xA081, category='lo', description='YI SYLLABLE NBOT' },
+ [0xA082] = { unicodeslot=0xA082, category='lo', description='YI SYLLABLE NBOX' },
+ [0xA083] = { unicodeslot=0xA083, category='lo', description='YI SYLLABLE NBO' },
+ [0xA084] = { unicodeslot=0xA084, category='lo', description='YI SYLLABLE NBOP' },
+ [0xA085] = { unicodeslot=0xA085, category='lo', description='YI SYLLABLE NBUT' },
+ [0xA086] = { unicodeslot=0xA086, category='lo', description='YI SYLLABLE NBUX' },
+ [0xA087] = { unicodeslot=0xA087, category='lo', description='YI SYLLABLE NBU' },
+ [0xA088] = { unicodeslot=0xA088, category='lo', description='YI SYLLABLE NBUP' },
+ [0xA089] = { unicodeslot=0xA089, category='lo', description='YI SYLLABLE NBURX' },
+ [0xA08A] = { unicodeslot=0xA08A, category='lo', description='YI SYLLABLE NBUR' },
+ [0xA08B] = { unicodeslot=0xA08B, category='lo', description='YI SYLLABLE NBYT' },
+ [0xA08C] = { unicodeslot=0xA08C, category='lo', description='YI SYLLABLE NBYX' },
+ [0xA08D] = { unicodeslot=0xA08D, category='lo', description='YI SYLLABLE NBY' },
+ [0xA08E] = { unicodeslot=0xA08E, category='lo', description='YI SYLLABLE NBYP' },
+ [0xA08F] = { unicodeslot=0xA08F, category='lo', description='YI SYLLABLE NBYRX' },
+ [0xA090] = { unicodeslot=0xA090, category='lo', description='YI SYLLABLE NBYR' },
+ [0xA091] = { unicodeslot=0xA091, category='lo', description='YI SYLLABLE HMIT' },
+ [0xA092] = { unicodeslot=0xA092, category='lo', description='YI SYLLABLE HMIX' },
+ [0xA093] = { unicodeslot=0xA093, category='lo', description='YI SYLLABLE HMI' },
+ [0xA094] = { unicodeslot=0xA094, category='lo', description='YI SYLLABLE HMIP' },
+ [0xA095] = { unicodeslot=0xA095, category='lo', description='YI SYLLABLE HMIEX' },
+ [0xA096] = { unicodeslot=0xA096, category='lo', description='YI SYLLABLE HMIE' },
+ [0xA097] = { unicodeslot=0xA097, category='lo', description='YI SYLLABLE HMIEP' },
+ [0xA098] = { unicodeslot=0xA098, category='lo', description='YI SYLLABLE HMAT' },
+ [0xA099] = { unicodeslot=0xA099, category='lo', description='YI SYLLABLE HMAX' },
+ [0xA09A] = { unicodeslot=0xA09A, category='lo', description='YI SYLLABLE HMA' },
+ [0xA09B] = { unicodeslot=0xA09B, category='lo', description='YI SYLLABLE HMAP' },
+ [0xA09C] = { unicodeslot=0xA09C, category='lo', description='YI SYLLABLE HMUOX' },
+ [0xA09D] = { unicodeslot=0xA09D, category='lo', description='YI SYLLABLE HMUO' },
+ [0xA09E] = { unicodeslot=0xA09E, category='lo', description='YI SYLLABLE HMUOP' },
+ [0xA09F] = { unicodeslot=0xA09F, category='lo', description='YI SYLLABLE HMOT' },
+ [0xA0A0] = { unicodeslot=0xA0A0, category='lo', description='YI SYLLABLE HMOX' },
+ [0xA0A1] = { unicodeslot=0xA0A1, category='lo', description='YI SYLLABLE HMO' },
+ [0xA0A2] = { unicodeslot=0xA0A2, category='lo', description='YI SYLLABLE HMOP' },
+ [0xA0A3] = { unicodeslot=0xA0A3, category='lo', description='YI SYLLABLE HMUT' },
+ [0xA0A4] = { unicodeslot=0xA0A4, category='lo', description='YI SYLLABLE HMUX' },
+ [0xA0A5] = { unicodeslot=0xA0A5, category='lo', description='YI SYLLABLE HMU' },
+ [0xA0A6] = { unicodeslot=0xA0A6, category='lo', description='YI SYLLABLE HMUP' },
+ [0xA0A7] = { unicodeslot=0xA0A7, category='lo', description='YI SYLLABLE HMURX' },
+ [0xA0A8] = { unicodeslot=0xA0A8, category='lo', description='YI SYLLABLE HMUR' },
+ [0xA0A9] = { unicodeslot=0xA0A9, category='lo', description='YI SYLLABLE HMYX' },
+ [0xA0AA] = { unicodeslot=0xA0AA, category='lo', description='YI SYLLABLE HMY' },
+ [0xA0AB] = { unicodeslot=0xA0AB, category='lo', description='YI SYLLABLE HMYP' },
+ [0xA0AC] = { unicodeslot=0xA0AC, category='lo', description='YI SYLLABLE HMYRX' },
+ [0xA0AD] = { unicodeslot=0xA0AD, category='lo', description='YI SYLLABLE HMYR' },
+ [0xA0AE] = { unicodeslot=0xA0AE, category='lo', description='YI SYLLABLE MIT' },
+ [0xA0AF] = { unicodeslot=0xA0AF, category='lo', description='YI SYLLABLE MIX' },
+ [0xA0B0] = { unicodeslot=0xA0B0, category='lo', description='YI SYLLABLE MI' },
+ [0xA0B1] = { unicodeslot=0xA0B1, category='lo', description='YI SYLLABLE MIP' },
+ [0xA0B2] = { unicodeslot=0xA0B2, category='lo', description='YI SYLLABLE MIEX' },
+ [0xA0B3] = { unicodeslot=0xA0B3, category='lo', description='YI SYLLABLE MIE' },
+ [0xA0B4] = { unicodeslot=0xA0B4, category='lo', description='YI SYLLABLE MIEP' },
+ [0xA0B5] = { unicodeslot=0xA0B5, category='lo', description='YI SYLLABLE MAT' },
+ [0xA0B6] = { unicodeslot=0xA0B6, category='lo', description='YI SYLLABLE MAX' },
+ [0xA0B7] = { unicodeslot=0xA0B7, category='lo', description='YI SYLLABLE MA' },
+ [0xA0B8] = { unicodeslot=0xA0B8, category='lo', description='YI SYLLABLE MAP' },
+ [0xA0B9] = { unicodeslot=0xA0B9, category='lo', description='YI SYLLABLE MUOT' },
+ [0xA0BA] = { unicodeslot=0xA0BA, category='lo', description='YI SYLLABLE MUOX' },
+ [0xA0BB] = { unicodeslot=0xA0BB, category='lo', description='YI SYLLABLE MUO' },
+ [0xA0BC] = { unicodeslot=0xA0BC, category='lo', description='YI SYLLABLE MUOP' },
+ [0xA0BD] = { unicodeslot=0xA0BD, category='lo', description='YI SYLLABLE MOT' },
+ [0xA0BE] = { unicodeslot=0xA0BE, category='lo', description='YI SYLLABLE MOX' },
+ [0xA0BF] = { unicodeslot=0xA0BF, category='lo', description='YI SYLLABLE MO' },
+ [0xA0C0] = { unicodeslot=0xA0C0, category='lo', description='YI SYLLABLE MOP' },
+ [0xA0C1] = { unicodeslot=0xA0C1, category='lo', description='YI SYLLABLE MEX' },
+ [0xA0C2] = { unicodeslot=0xA0C2, category='lo', description='YI SYLLABLE ME' },
+ [0xA0C3] = { unicodeslot=0xA0C3, category='lo', description='YI SYLLABLE MUT' },
+ [0xA0C4] = { unicodeslot=0xA0C4, category='lo', description='YI SYLLABLE MUX' },
+ [0xA0C5] = { unicodeslot=0xA0C5, category='lo', description='YI SYLLABLE MU' },
+ [0xA0C6] = { unicodeslot=0xA0C6, category='lo', description='YI SYLLABLE MUP' },
+ [0xA0C7] = { unicodeslot=0xA0C7, category='lo', description='YI SYLLABLE MURX' },
+ [0xA0C8] = { unicodeslot=0xA0C8, category='lo', description='YI SYLLABLE MUR' },
+ [0xA0C9] = { unicodeslot=0xA0C9, category='lo', description='YI SYLLABLE MYT' },
+ [0xA0CA] = { unicodeslot=0xA0CA, category='lo', description='YI SYLLABLE MYX' },
+ [0xA0CB] = { unicodeslot=0xA0CB, category='lo', description='YI SYLLABLE MY' },
+ [0xA0CC] = { unicodeslot=0xA0CC, category='lo', description='YI SYLLABLE MYP' },
+ [0xA0CD] = { unicodeslot=0xA0CD, category='lo', description='YI SYLLABLE FIT' },
+ [0xA0CE] = { unicodeslot=0xA0CE, category='lo', description='YI SYLLABLE FIX' },
+ [0xA0CF] = { unicodeslot=0xA0CF, category='lo', description='YI SYLLABLE FI' },
+ [0xA0D0] = { unicodeslot=0xA0D0, category='lo', description='YI SYLLABLE FIP' },
+ [0xA0D1] = { unicodeslot=0xA0D1, category='lo', description='YI SYLLABLE FAT' },
+ [0xA0D2] = { unicodeslot=0xA0D2, category='lo', description='YI SYLLABLE FAX' },
+ [0xA0D3] = { unicodeslot=0xA0D3, category='lo', description='YI SYLLABLE FA' },
+ [0xA0D4] = { unicodeslot=0xA0D4, category='lo', description='YI SYLLABLE FAP' },
+ [0xA0D5] = { unicodeslot=0xA0D5, category='lo', description='YI SYLLABLE FOX' },
+ [0xA0D6] = { unicodeslot=0xA0D6, category='lo', description='YI SYLLABLE FO' },
+ [0xA0D7] = { unicodeslot=0xA0D7, category='lo', description='YI SYLLABLE FOP' },
+ [0xA0D8] = { unicodeslot=0xA0D8, category='lo', description='YI SYLLABLE FUT' },
+ [0xA0D9] = { unicodeslot=0xA0D9, category='lo', description='YI SYLLABLE FUX' },
+ [0xA0DA] = { unicodeslot=0xA0DA, category='lo', description='YI SYLLABLE FU' },
+ [0xA0DB] = { unicodeslot=0xA0DB, category='lo', description='YI SYLLABLE FUP' },
+ [0xA0DC] = { unicodeslot=0xA0DC, category='lo', description='YI SYLLABLE FURX' },
+ [0xA0DD] = { unicodeslot=0xA0DD, category='lo', description='YI SYLLABLE FUR' },
+ [0xA0DE] = { unicodeslot=0xA0DE, category='lo', description='YI SYLLABLE FYT' },
+ [0xA0DF] = { unicodeslot=0xA0DF, category='lo', description='YI SYLLABLE FYX' },
+ [0xA0E0] = { unicodeslot=0xA0E0, category='lo', description='YI SYLLABLE FY' },
+ [0xA0E1] = { unicodeslot=0xA0E1, category='lo', description='YI SYLLABLE FYP' },
+ [0xA0E2] = { unicodeslot=0xA0E2, category='lo', description='YI SYLLABLE VIT' },
+ [0xA0E3] = { unicodeslot=0xA0E3, category='lo', description='YI SYLLABLE VIX' },
+ [0xA0E4] = { unicodeslot=0xA0E4, category='lo', description='YI SYLLABLE VI' },
+ [0xA0E5] = { unicodeslot=0xA0E5, category='lo', description='YI SYLLABLE VIP' },
+ [0xA0E6] = { unicodeslot=0xA0E6, category='lo', description='YI SYLLABLE VIET' },
+ [0xA0E7] = { unicodeslot=0xA0E7, category='lo', description='YI SYLLABLE VIEX' },
+ [0xA0E8] = { unicodeslot=0xA0E8, category='lo', description='YI SYLLABLE VIE' },
+ [0xA0E9] = { unicodeslot=0xA0E9, category='lo', description='YI SYLLABLE VIEP' },
+ [0xA0EA] = { unicodeslot=0xA0EA, category='lo', description='YI SYLLABLE VAT' },
+ [0xA0EB] = { unicodeslot=0xA0EB, category='lo', description='YI SYLLABLE VAX' },
+ [0xA0EC] = { unicodeslot=0xA0EC, category='lo', description='YI SYLLABLE VA' },
+ [0xA0ED] = { unicodeslot=0xA0ED, category='lo', description='YI SYLLABLE VAP' },
+ [0xA0EE] = { unicodeslot=0xA0EE, category='lo', description='YI SYLLABLE VOT' },
+ [0xA0EF] = { unicodeslot=0xA0EF, category='lo', description='YI SYLLABLE VOX' },
+ [0xA0F0] = { unicodeslot=0xA0F0, category='lo', description='YI SYLLABLE VO' },
+ [0xA0F1] = { unicodeslot=0xA0F1, category='lo', description='YI SYLLABLE VOP' },
+ [0xA0F2] = { unicodeslot=0xA0F2, category='lo', description='YI SYLLABLE VEX' },
+ [0xA0F3] = { unicodeslot=0xA0F3, category='lo', description='YI SYLLABLE VEP' },
+ [0xA0F4] = { unicodeslot=0xA0F4, category='lo', description='YI SYLLABLE VUT' },
+ [0xA0F5] = { unicodeslot=0xA0F5, category='lo', description='YI SYLLABLE VUX' },
+ [0xA0F6] = { unicodeslot=0xA0F6, category='lo', description='YI SYLLABLE VU' },
+ [0xA0F7] = { unicodeslot=0xA0F7, category='lo', description='YI SYLLABLE VUP' },
+ [0xA0F8] = { unicodeslot=0xA0F8, category='lo', description='YI SYLLABLE VURX' },
+ [0xA0F9] = { unicodeslot=0xA0F9, category='lo', description='YI SYLLABLE VUR' },
+ [0xA0FA] = { unicodeslot=0xA0FA, category='lo', description='YI SYLLABLE VYT' },
+ [0xA0FB] = { unicodeslot=0xA0FB, category='lo', description='YI SYLLABLE VYX' },
+ [0xA0FC] = { unicodeslot=0xA0FC, category='lo', description='YI SYLLABLE VY' },
+ [0xA0FD] = { unicodeslot=0xA0FD, category='lo', description='YI SYLLABLE VYP' },
+ [0xA0FE] = { unicodeslot=0xA0FE, category='lo', description='YI SYLLABLE VYRX' },
+ [0xA0FF] = { unicodeslot=0xA0FF, category='lo', description='YI SYLLABLE VYR' },
+ [0xA100] = { unicodeslot=0xA100, category='lo', description='YI SYLLABLE DIT' },
+ [0xA101] = { unicodeslot=0xA101, category='lo', description='YI SYLLABLE DIX' },
+ [0xA102] = { unicodeslot=0xA102, category='lo', description='YI SYLLABLE DI' },
+ [0xA103] = { unicodeslot=0xA103, category='lo', description='YI SYLLABLE DIP' },
+ [0xA104] = { unicodeslot=0xA104, category='lo', description='YI SYLLABLE DIEX' },
+ [0xA105] = { unicodeslot=0xA105, category='lo', description='YI SYLLABLE DIE' },
+ [0xA106] = { unicodeslot=0xA106, category='lo', description='YI SYLLABLE DIEP' },
+ [0xA107] = { unicodeslot=0xA107, category='lo', description='YI SYLLABLE DAT' },
+ [0xA108] = { unicodeslot=0xA108, category='lo', description='YI SYLLABLE DAX' },
+ [0xA109] = { unicodeslot=0xA109, category='lo', description='YI SYLLABLE DA' },
+ [0xA10A] = { unicodeslot=0xA10A, category='lo', description='YI SYLLABLE DAP' },
+ [0xA10B] = { unicodeslot=0xA10B, category='lo', description='YI SYLLABLE DUOX' },
+ [0xA10C] = { unicodeslot=0xA10C, category='lo', description='YI SYLLABLE DUO' },
+ [0xA10D] = { unicodeslot=0xA10D, category='lo', description='YI SYLLABLE DOT' },
+ [0xA10E] = { unicodeslot=0xA10E, category='lo', description='YI SYLLABLE DOX' },
+ [0xA10F] = { unicodeslot=0xA10F, category='lo', description='YI SYLLABLE DO' },
+ [0xA110] = { unicodeslot=0xA110, category='lo', description='YI SYLLABLE DOP' },
+ [0xA111] = { unicodeslot=0xA111, category='lo', description='YI SYLLABLE DEX' },
+ [0xA112] = { unicodeslot=0xA112, category='lo', description='YI SYLLABLE DE' },
+ [0xA113] = { unicodeslot=0xA113, category='lo', description='YI SYLLABLE DEP' },
+ [0xA114] = { unicodeslot=0xA114, category='lo', description='YI SYLLABLE DUT' },
+ [0xA115] = { unicodeslot=0xA115, category='lo', description='YI SYLLABLE DUX' },
+ [0xA116] = { unicodeslot=0xA116, category='lo', description='YI SYLLABLE DU' },
+ [0xA117] = { unicodeslot=0xA117, category='lo', description='YI SYLLABLE DUP' },
+ [0xA118] = { unicodeslot=0xA118, category='lo', description='YI SYLLABLE DURX' },
+ [0xA119] = { unicodeslot=0xA119, category='lo', description='YI SYLLABLE DUR' },
+ [0xA11A] = { unicodeslot=0xA11A, category='lo', description='YI SYLLABLE TIT' },
+ [0xA11B] = { unicodeslot=0xA11B, category='lo', description='YI SYLLABLE TIX' },
+ [0xA11C] = { unicodeslot=0xA11C, category='lo', description='YI SYLLABLE TI' },
+ [0xA11D] = { unicodeslot=0xA11D, category='lo', description='YI SYLLABLE TIP' },
+ [0xA11E] = { unicodeslot=0xA11E, category='lo', description='YI SYLLABLE TIEX' },
+ [0xA11F] = { unicodeslot=0xA11F, category='lo', description='YI SYLLABLE TIE' },
+ [0xA120] = { unicodeslot=0xA120, category='lo', description='YI SYLLABLE TIEP' },
+ [0xA121] = { unicodeslot=0xA121, category='lo', description='YI SYLLABLE TAT' },
+ [0xA122] = { unicodeslot=0xA122, category='lo', description='YI SYLLABLE TAX' },
+ [0xA123] = { unicodeslot=0xA123, category='lo', description='YI SYLLABLE TA' },
+ [0xA124] = { unicodeslot=0xA124, category='lo', description='YI SYLLABLE TAP' },
+ [0xA125] = { unicodeslot=0xA125, category='lo', description='YI SYLLABLE TUOT' },
+ [0xA126] = { unicodeslot=0xA126, category='lo', description='YI SYLLABLE TUOX' },
+ [0xA127] = { unicodeslot=0xA127, category='lo', description='YI SYLLABLE TUO' },
+ [0xA128] = { unicodeslot=0xA128, category='lo', description='YI SYLLABLE TUOP' },
+ [0xA129] = { unicodeslot=0xA129, category='lo', description='YI SYLLABLE TOT' },
+ [0xA12A] = { unicodeslot=0xA12A, category='lo', description='YI SYLLABLE TOX' },
+ [0xA12B] = { unicodeslot=0xA12B, category='lo', description='YI SYLLABLE TO' },
+ [0xA12C] = { unicodeslot=0xA12C, category='lo', description='YI SYLLABLE TOP' },
+ [0xA12D] = { unicodeslot=0xA12D, category='lo', description='YI SYLLABLE TEX' },
+ [0xA12E] = { unicodeslot=0xA12E, category='lo', description='YI SYLLABLE TE' },
+ [0xA12F] = { unicodeslot=0xA12F, category='lo', description='YI SYLLABLE TEP' },
+ [0xA130] = { unicodeslot=0xA130, category='lo', description='YI SYLLABLE TUT' },
+ [0xA131] = { unicodeslot=0xA131, category='lo', description='YI SYLLABLE TUX' },
+ [0xA132] = { unicodeslot=0xA132, category='lo', description='YI SYLLABLE TU' },
+ [0xA133] = { unicodeslot=0xA133, category='lo', description='YI SYLLABLE TUP' },
+ [0xA134] = { unicodeslot=0xA134, category='lo', description='YI SYLLABLE TURX' },
+ [0xA135] = { unicodeslot=0xA135, category='lo', description='YI SYLLABLE TUR' },
+ [0xA136] = { unicodeslot=0xA136, category='lo', description='YI SYLLABLE DDIT' },
+ [0xA137] = { unicodeslot=0xA137, category='lo', description='YI SYLLABLE DDIX' },
+ [0xA138] = { unicodeslot=0xA138, category='lo', description='YI SYLLABLE DDI' },
+ [0xA139] = { unicodeslot=0xA139, category='lo', description='YI SYLLABLE DDIP' },
+ [0xA13A] = { unicodeslot=0xA13A, category='lo', description='YI SYLLABLE DDIEX' },
+ [0xA13B] = { unicodeslot=0xA13B, category='lo', description='YI SYLLABLE DDIE' },
+ [0xA13C] = { unicodeslot=0xA13C, category='lo', description='YI SYLLABLE DDIEP' },
+ [0xA13D] = { unicodeslot=0xA13D, category='lo', description='YI SYLLABLE DDAT' },
+ [0xA13E] = { unicodeslot=0xA13E, category='lo', description='YI SYLLABLE DDAX' },
+ [0xA13F] = { unicodeslot=0xA13F, category='lo', description='YI SYLLABLE DDA' },
+ [0xA140] = { unicodeslot=0xA140, category='lo', description='YI SYLLABLE DDAP' },
+ [0xA141] = { unicodeslot=0xA141, category='lo', description='YI SYLLABLE DDUOX' },
+ [0xA142] = { unicodeslot=0xA142, category='lo', description='YI SYLLABLE DDUO' },
+ [0xA143] = { unicodeslot=0xA143, category='lo', description='YI SYLLABLE DDUOP' },
+ [0xA144] = { unicodeslot=0xA144, category='lo', description='YI SYLLABLE DDOT' },
+ [0xA145] = { unicodeslot=0xA145, category='lo', description='YI SYLLABLE DDOX' },
+ [0xA146] = { unicodeslot=0xA146, category='lo', description='YI SYLLABLE DDO' },
+ [0xA147] = { unicodeslot=0xA147, category='lo', description='YI SYLLABLE DDOP' },
+ [0xA148] = { unicodeslot=0xA148, category='lo', description='YI SYLLABLE DDEX' },
+ [0xA149] = { unicodeslot=0xA149, category='lo', description='YI SYLLABLE DDE' },
+ [0xA14A] = { unicodeslot=0xA14A, category='lo', description='YI SYLLABLE DDEP' },
+ [0xA14B] = { unicodeslot=0xA14B, category='lo', description='YI SYLLABLE DDUT' },
+ [0xA14C] = { unicodeslot=0xA14C, category='lo', description='YI SYLLABLE DDUX' },
+ [0xA14D] = { unicodeslot=0xA14D, category='lo', description='YI SYLLABLE DDU' },
+ [0xA14E] = { unicodeslot=0xA14E, category='lo', description='YI SYLLABLE DDUP' },
+ [0xA14F] = { unicodeslot=0xA14F, category='lo', description='YI SYLLABLE DDURX' },
+ [0xA150] = { unicodeslot=0xA150, category='lo', description='YI SYLLABLE DDUR' },
+ [0xA151] = { unicodeslot=0xA151, category='lo', description='YI SYLLABLE NDIT' },
+ [0xA152] = { unicodeslot=0xA152, category='lo', description='YI SYLLABLE NDIX' },
+ [0xA153] = { unicodeslot=0xA153, category='lo', description='YI SYLLABLE NDI' },
+ [0xA154] = { unicodeslot=0xA154, category='lo', description='YI SYLLABLE NDIP' },
+ [0xA155] = { unicodeslot=0xA155, category='lo', description='YI SYLLABLE NDIEX' },
+ [0xA156] = { unicodeslot=0xA156, category='lo', description='YI SYLLABLE NDIE' },
+ [0xA157] = { unicodeslot=0xA157, category='lo', description='YI SYLLABLE NDAT' },
+ [0xA158] = { unicodeslot=0xA158, category='lo', description='YI SYLLABLE NDAX' },
+ [0xA159] = { unicodeslot=0xA159, category='lo', description='YI SYLLABLE NDA' },
+ [0xA15A] = { unicodeslot=0xA15A, category='lo', description='YI SYLLABLE NDAP' },
+ [0xA15B] = { unicodeslot=0xA15B, category='lo', description='YI SYLLABLE NDOT' },
+ [0xA15C] = { unicodeslot=0xA15C, category='lo', description='YI SYLLABLE NDOX' },
+ [0xA15D] = { unicodeslot=0xA15D, category='lo', description='YI SYLLABLE NDO' },
+ [0xA15E] = { unicodeslot=0xA15E, category='lo', description='YI SYLLABLE NDOP' },
+ [0xA15F] = { unicodeslot=0xA15F, category='lo', description='YI SYLLABLE NDEX' },
+ [0xA160] = { unicodeslot=0xA160, category='lo', description='YI SYLLABLE NDE' },
+ [0xA161] = { unicodeslot=0xA161, category='lo', description='YI SYLLABLE NDEP' },
+ [0xA162] = { unicodeslot=0xA162, category='lo', description='YI SYLLABLE NDUT' },
+ [0xA163] = { unicodeslot=0xA163, category='lo', description='YI SYLLABLE NDUX' },
+ [0xA164] = { unicodeslot=0xA164, category='lo', description='YI SYLLABLE NDU' },
+ [0xA165] = { unicodeslot=0xA165, category='lo', description='YI SYLLABLE NDUP' },
+ [0xA166] = { unicodeslot=0xA166, category='lo', description='YI SYLLABLE NDURX' },
+ [0xA167] = { unicodeslot=0xA167, category='lo', description='YI SYLLABLE NDUR' },
+ [0xA168] = { unicodeslot=0xA168, category='lo', description='YI SYLLABLE HNIT' },
+ [0xA169] = { unicodeslot=0xA169, category='lo', description='YI SYLLABLE HNIX' },
+ [0xA16A] = { unicodeslot=0xA16A, category='lo', description='YI SYLLABLE HNI' },
+ [0xA16B] = { unicodeslot=0xA16B, category='lo', description='YI SYLLABLE HNIP' },
+ [0xA16C] = { unicodeslot=0xA16C, category='lo', description='YI SYLLABLE HNIET' },
+ [0xA16D] = { unicodeslot=0xA16D, category='lo', description='YI SYLLABLE HNIEX' },
+ [0xA16E] = { unicodeslot=0xA16E, category='lo', description='YI SYLLABLE HNIE' },
+ [0xA16F] = { unicodeslot=0xA16F, category='lo', description='YI SYLLABLE HNIEP' },
+ [0xA170] = { unicodeslot=0xA170, category='lo', description='YI SYLLABLE HNAT' },
+ [0xA171] = { unicodeslot=0xA171, category='lo', description='YI SYLLABLE HNAX' },
+ [0xA172] = { unicodeslot=0xA172, category='lo', description='YI SYLLABLE HNA' },
+ [0xA173] = { unicodeslot=0xA173, category='lo', description='YI SYLLABLE HNAP' },
+ [0xA174] = { unicodeslot=0xA174, category='lo', description='YI SYLLABLE HNUOX' },
+ [0xA175] = { unicodeslot=0xA175, category='lo', description='YI SYLLABLE HNUO' },
+ [0xA176] = { unicodeslot=0xA176, category='lo', description='YI SYLLABLE HNOT' },
+ [0xA177] = { unicodeslot=0xA177, category='lo', description='YI SYLLABLE HNOX' },
+ [0xA178] = { unicodeslot=0xA178, category='lo', description='YI SYLLABLE HNOP' },
+ [0xA179] = { unicodeslot=0xA179, category='lo', description='YI SYLLABLE HNEX' },
+ [0xA17A] = { unicodeslot=0xA17A, category='lo', description='YI SYLLABLE HNE' },
+ [0xA17B] = { unicodeslot=0xA17B, category='lo', description='YI SYLLABLE HNEP' },
+ [0xA17C] = { unicodeslot=0xA17C, category='lo', description='YI SYLLABLE HNUT' },
+ [0xA17D] = { unicodeslot=0xA17D, category='lo', description='YI SYLLABLE NIT' },
+ [0xA17E] = { unicodeslot=0xA17E, category='lo', description='YI SYLLABLE NIX' },
+ [0xA17F] = { unicodeslot=0xA17F, category='lo', description='YI SYLLABLE NI' },
+ [0xA180] = { unicodeslot=0xA180, category='lo', description='YI SYLLABLE NIP' },
+ [0xA181] = { unicodeslot=0xA181, category='lo', description='YI SYLLABLE NIEX' },
+ [0xA182] = { unicodeslot=0xA182, category='lo', description='YI SYLLABLE NIE' },
+ [0xA183] = { unicodeslot=0xA183, category='lo', description='YI SYLLABLE NIEP' },
+ [0xA184] = { unicodeslot=0xA184, category='lo', description='YI SYLLABLE NAX' },
+ [0xA185] = { unicodeslot=0xA185, category='lo', description='YI SYLLABLE NA' },
+ [0xA186] = { unicodeslot=0xA186, category='lo', description='YI SYLLABLE NAP' },
+ [0xA187] = { unicodeslot=0xA187, category='lo', description='YI SYLLABLE NUOX' },
+ [0xA188] = { unicodeslot=0xA188, category='lo', description='YI SYLLABLE NUO' },
+ [0xA189] = { unicodeslot=0xA189, category='lo', description='YI SYLLABLE NUOP' },
+ [0xA18A] = { unicodeslot=0xA18A, category='lo', description='YI SYLLABLE NOT' },
+ [0xA18B] = { unicodeslot=0xA18B, category='lo', description='YI SYLLABLE NOX' },
+ [0xA18C] = { unicodeslot=0xA18C, category='lo', description='YI SYLLABLE NO' },
+ [0xA18D] = { unicodeslot=0xA18D, category='lo', description='YI SYLLABLE NOP' },
+ [0xA18E] = { unicodeslot=0xA18E, category='lo', description='YI SYLLABLE NEX' },
+ [0xA18F] = { unicodeslot=0xA18F, category='lo', description='YI SYLLABLE NE' },
+ [0xA190] = { unicodeslot=0xA190, category='lo', description='YI SYLLABLE NEP' },
+ [0xA191] = { unicodeslot=0xA191, category='lo', description='YI SYLLABLE NUT' },
+ [0xA192] = { unicodeslot=0xA192, category='lo', description='YI SYLLABLE NUX' },
+ [0xA193] = { unicodeslot=0xA193, category='lo', description='YI SYLLABLE NU' },
+ [0xA194] = { unicodeslot=0xA194, category='lo', description='YI SYLLABLE NUP' },
+ [0xA195] = { unicodeslot=0xA195, category='lo', description='YI SYLLABLE NURX' },
+ [0xA196] = { unicodeslot=0xA196, category='lo', description='YI SYLLABLE NUR' },
+ [0xA197] = { unicodeslot=0xA197, category='lo', description='YI SYLLABLE HLIT' },
+ [0xA198] = { unicodeslot=0xA198, category='lo', description='YI SYLLABLE HLIX' },
+ [0xA199] = { unicodeslot=0xA199, category='lo', description='YI SYLLABLE HLI' },
+ [0xA19A] = { unicodeslot=0xA19A, category='lo', description='YI SYLLABLE HLIP' },
+ [0xA19B] = { unicodeslot=0xA19B, category='lo', description='YI SYLLABLE HLIEX' },
+ [0xA19C] = { unicodeslot=0xA19C, category='lo', description='YI SYLLABLE HLIE' },
+ [0xA19D] = { unicodeslot=0xA19D, category='lo', description='YI SYLLABLE HLIEP' },
+ [0xA19E] = { unicodeslot=0xA19E, category='lo', description='YI SYLLABLE HLAT' },
+ [0xA19F] = { unicodeslot=0xA19F, category='lo', description='YI SYLLABLE HLAX' },
+ [0xA1A0] = { unicodeslot=0xA1A0, category='lo', description='YI SYLLABLE HLA' },
+ [0xA1A1] = { unicodeslot=0xA1A1, category='lo', description='YI SYLLABLE HLAP' },
+ [0xA1A2] = { unicodeslot=0xA1A2, category='lo', description='YI SYLLABLE HLUOX' },
+ [0xA1A3] = { unicodeslot=0xA1A3, category='lo', description='YI SYLLABLE HLUO' },
+ [0xA1A4] = { unicodeslot=0xA1A4, category='lo', description='YI SYLLABLE HLUOP' },
+ [0xA1A5] = { unicodeslot=0xA1A5, category='lo', description='YI SYLLABLE HLOX' },
+ [0xA1A6] = { unicodeslot=0xA1A6, category='lo', description='YI SYLLABLE HLO' },
+ [0xA1A7] = { unicodeslot=0xA1A7, category='lo', description='YI SYLLABLE HLOP' },
+ [0xA1A8] = { unicodeslot=0xA1A8, category='lo', description='YI SYLLABLE HLEX' },
+ [0xA1A9] = { unicodeslot=0xA1A9, category='lo', description='YI SYLLABLE HLE' },
+ [0xA1AA] = { unicodeslot=0xA1AA, category='lo', description='YI SYLLABLE HLEP' },
+ [0xA1AB] = { unicodeslot=0xA1AB, category='lo', description='YI SYLLABLE HLUT' },
+ [0xA1AC] = { unicodeslot=0xA1AC, category='lo', description='YI SYLLABLE HLUX' },
+ [0xA1AD] = { unicodeslot=0xA1AD, category='lo', description='YI SYLLABLE HLU' },
+ [0xA1AE] = { unicodeslot=0xA1AE, category='lo', description='YI SYLLABLE HLUP' },
+ [0xA1AF] = { unicodeslot=0xA1AF, category='lo', description='YI SYLLABLE HLURX' },
+ [0xA1B0] = { unicodeslot=0xA1B0, category='lo', description='YI SYLLABLE HLUR' },
+ [0xA1B1] = { unicodeslot=0xA1B1, category='lo', description='YI SYLLABLE HLYT' },
+ [0xA1B2] = { unicodeslot=0xA1B2, category='lo', description='YI SYLLABLE HLYX' },
+ [0xA1B3] = { unicodeslot=0xA1B3, category='lo', description='YI SYLLABLE HLY' },
+ [0xA1B4] = { unicodeslot=0xA1B4, category='lo', description='YI SYLLABLE HLYP' },
+ [0xA1B5] = { unicodeslot=0xA1B5, category='lo', description='YI SYLLABLE HLYRX' },
+ [0xA1B6] = { unicodeslot=0xA1B6, category='lo', description='YI SYLLABLE HLYR' },
+ [0xA1B7] = { unicodeslot=0xA1B7, category='lo', description='YI SYLLABLE LIT' },
+ [0xA1B8] = { unicodeslot=0xA1B8, category='lo', description='YI SYLLABLE LIX' },
+ [0xA1B9] = { unicodeslot=0xA1B9, category='lo', description='YI SYLLABLE LI' },
+ [0xA1BA] = { unicodeslot=0xA1BA, category='lo', description='YI SYLLABLE LIP' },
+ [0xA1BB] = { unicodeslot=0xA1BB, category='lo', description='YI SYLLABLE LIET' },
+ [0xA1BC] = { unicodeslot=0xA1BC, category='lo', description='YI SYLLABLE LIEX' },
+ [0xA1BD] = { unicodeslot=0xA1BD, category='lo', description='YI SYLLABLE LIE' },
+ [0xA1BE] = { unicodeslot=0xA1BE, category='lo', description='YI SYLLABLE LIEP' },
+ [0xA1BF] = { unicodeslot=0xA1BF, category='lo', description='YI SYLLABLE LAT' },
+ [0xA1C0] = { unicodeslot=0xA1C0, category='lo', description='YI SYLLABLE LAX' },
+ [0xA1C1] = { unicodeslot=0xA1C1, category='lo', description='YI SYLLABLE LA' },
+ [0xA1C2] = { unicodeslot=0xA1C2, category='lo', description='YI SYLLABLE LAP' },
+ [0xA1C3] = { unicodeslot=0xA1C3, category='lo', description='YI SYLLABLE LUOT' },
+ [0xA1C4] = { unicodeslot=0xA1C4, category='lo', description='YI SYLLABLE LUOX' },
+ [0xA1C5] = { unicodeslot=0xA1C5, category='lo', description='YI SYLLABLE LUO' },
+ [0xA1C6] = { unicodeslot=0xA1C6, category='lo', description='YI SYLLABLE LUOP' },
+ [0xA1C7] = { unicodeslot=0xA1C7, category='lo', description='YI SYLLABLE LOT' },
+ [0xA1C8] = { unicodeslot=0xA1C8, category='lo', description='YI SYLLABLE LOX' },
+ [0xA1C9] = { unicodeslot=0xA1C9, category='lo', description='YI SYLLABLE LO' },
+ [0xA1CA] = { unicodeslot=0xA1CA, category='lo', description='YI SYLLABLE LOP' },
+ [0xA1CB] = { unicodeslot=0xA1CB, category='lo', description='YI SYLLABLE LEX' },
+ [0xA1CC] = { unicodeslot=0xA1CC, category='lo', description='YI SYLLABLE LE' },
+ [0xA1CD] = { unicodeslot=0xA1CD, category='lo', description='YI SYLLABLE LEP' },
+ [0xA1CE] = { unicodeslot=0xA1CE, category='lo', description='YI SYLLABLE LUT' },
+ [0xA1CF] = { unicodeslot=0xA1CF, category='lo', description='YI SYLLABLE LUX' },
+ [0xA1D0] = { unicodeslot=0xA1D0, category='lo', description='YI SYLLABLE LU' },
+ [0xA1D1] = { unicodeslot=0xA1D1, category='lo', description='YI SYLLABLE LUP' },
+ [0xA1D2] = { unicodeslot=0xA1D2, category='lo', description='YI SYLLABLE LURX' },
+ [0xA1D3] = { unicodeslot=0xA1D3, category='lo', description='YI SYLLABLE LUR' },
+ [0xA1D4] = { unicodeslot=0xA1D4, category='lo', description='YI SYLLABLE LYT' },
+ [0xA1D5] = { unicodeslot=0xA1D5, category='lo', description='YI SYLLABLE LYX' },
+ [0xA1D6] = { unicodeslot=0xA1D6, category='lo', description='YI SYLLABLE LY' },
+ [0xA1D7] = { unicodeslot=0xA1D7, category='lo', description='YI SYLLABLE LYP' },
+ [0xA1D8] = { unicodeslot=0xA1D8, category='lo', description='YI SYLLABLE LYRX' },
+ [0xA1D9] = { unicodeslot=0xA1D9, category='lo', description='YI SYLLABLE LYR' },
+ [0xA1DA] = { unicodeslot=0xA1DA, category='lo', description='YI SYLLABLE GIT' },
+ [0xA1DB] = { unicodeslot=0xA1DB, category='lo', description='YI SYLLABLE GIX' },
+ [0xA1DC] = { unicodeslot=0xA1DC, category='lo', description='YI SYLLABLE GI' },
+ [0xA1DD] = { unicodeslot=0xA1DD, category='lo', description='YI SYLLABLE GIP' },
+ [0xA1DE] = { unicodeslot=0xA1DE, category='lo', description='YI SYLLABLE GIET' },
+ [0xA1DF] = { unicodeslot=0xA1DF, category='lo', description='YI SYLLABLE GIEX' },
+ [0xA1E0] = { unicodeslot=0xA1E0, category='lo', description='YI SYLLABLE GIE' },
+ [0xA1E1] = { unicodeslot=0xA1E1, category='lo', description='YI SYLLABLE GIEP' },
+ [0xA1E2] = { unicodeslot=0xA1E2, category='lo', description='YI SYLLABLE GAT' },
+ [0xA1E3] = { unicodeslot=0xA1E3, category='lo', description='YI SYLLABLE GAX' },
+ [0xA1E4] = { unicodeslot=0xA1E4, category='lo', description='YI SYLLABLE GA' },
+ [0xA1E5] = { unicodeslot=0xA1E5, category='lo', description='YI SYLLABLE GAP' },
+ [0xA1E6] = { unicodeslot=0xA1E6, category='lo', description='YI SYLLABLE GUOT' },
+ [0xA1E7] = { unicodeslot=0xA1E7, category='lo', description='YI SYLLABLE GUOX' },
+ [0xA1E8] = { unicodeslot=0xA1E8, category='lo', description='YI SYLLABLE GUO' },
+ [0xA1E9] = { unicodeslot=0xA1E9, category='lo', description='YI SYLLABLE GUOP' },
+ [0xA1EA] = { unicodeslot=0xA1EA, category='lo', description='YI SYLLABLE GOT' },
+ [0xA1EB] = { unicodeslot=0xA1EB, category='lo', description='YI SYLLABLE GOX' },
+ [0xA1EC] = { unicodeslot=0xA1EC, category='lo', description='YI SYLLABLE GO' },
+ [0xA1ED] = { unicodeslot=0xA1ED, category='lo', description='YI SYLLABLE GOP' },
+ [0xA1EE] = { unicodeslot=0xA1EE, category='lo', description='YI SYLLABLE GET' },
+ [0xA1EF] = { unicodeslot=0xA1EF, category='lo', description='YI SYLLABLE GEX' },
+ [0xA1F0] = { unicodeslot=0xA1F0, category='lo', description='YI SYLLABLE GE' },
+ [0xA1F1] = { unicodeslot=0xA1F1, category='lo', description='YI SYLLABLE GEP' },
+ [0xA1F2] = { unicodeslot=0xA1F2, category='lo', description='YI SYLLABLE GUT' },
+ [0xA1F3] = { unicodeslot=0xA1F3, category='lo', description='YI SYLLABLE GUX' },
+ [0xA1F4] = { unicodeslot=0xA1F4, category='lo', description='YI SYLLABLE GU' },
+ [0xA1F5] = { unicodeslot=0xA1F5, category='lo', description='YI SYLLABLE GUP' },
+ [0xA1F6] = { unicodeslot=0xA1F6, category='lo', description='YI SYLLABLE GURX' },
+ [0xA1F7] = { unicodeslot=0xA1F7, category='lo', description='YI SYLLABLE GUR' },
+ [0xA1F8] = { unicodeslot=0xA1F8, category='lo', description='YI SYLLABLE KIT' },
+ [0xA1F9] = { unicodeslot=0xA1F9, category='lo', description='YI SYLLABLE KIX' },
+ [0xA1FA] = { unicodeslot=0xA1FA, category='lo', description='YI SYLLABLE KI' },
+ [0xA1FB] = { unicodeslot=0xA1FB, category='lo', description='YI SYLLABLE KIP' },
+ [0xA1FC] = { unicodeslot=0xA1FC, category='lo', description='YI SYLLABLE KIEX' },
+ [0xA1FD] = { unicodeslot=0xA1FD, category='lo', description='YI SYLLABLE KIE' },
+ [0xA1FE] = { unicodeslot=0xA1FE, category='lo', description='YI SYLLABLE KIEP' },
+ [0xA1FF] = { unicodeslot=0xA1FF, category='lo', description='YI SYLLABLE KAT' },
+ [0xA200] = { unicodeslot=0xA200, category='lo', description='YI SYLLABLE KAX' },
+ [0xA201] = { unicodeslot=0xA201, category='lo', description='YI SYLLABLE KA' },
+ [0xA202] = { unicodeslot=0xA202, category='lo', description='YI SYLLABLE KAP' },
+ [0xA203] = { unicodeslot=0xA203, category='lo', description='YI SYLLABLE KUOX' },
+ [0xA204] = { unicodeslot=0xA204, category='lo', description='YI SYLLABLE KUO' },
+ [0xA205] = { unicodeslot=0xA205, category='lo', description='YI SYLLABLE KUOP' },
+ [0xA206] = { unicodeslot=0xA206, category='lo', description='YI SYLLABLE KOT' },
+ [0xA207] = { unicodeslot=0xA207, category='lo', description='YI SYLLABLE KOX' },
+ [0xA208] = { unicodeslot=0xA208, category='lo', description='YI SYLLABLE KO' },
+ [0xA209] = { unicodeslot=0xA209, category='lo', description='YI SYLLABLE KOP' },
+ [0xA20A] = { unicodeslot=0xA20A, category='lo', description='YI SYLLABLE KET' },
+ [0xA20B] = { unicodeslot=0xA20B, category='lo', description='YI SYLLABLE KEX' },
+ [0xA20C] = { unicodeslot=0xA20C, category='lo', description='YI SYLLABLE KE' },
+ [0xA20D] = { unicodeslot=0xA20D, category='lo', description='YI SYLLABLE KEP' },
+ [0xA20E] = { unicodeslot=0xA20E, category='lo', description='YI SYLLABLE KUT' },
+ [0xA20F] = { unicodeslot=0xA20F, category='lo', description='YI SYLLABLE KUX' },
+ [0xA210] = { unicodeslot=0xA210, category='lo', description='YI SYLLABLE KU' },
+ [0xA211] = { unicodeslot=0xA211, category='lo', description='YI SYLLABLE KUP' },
+ [0xA212] = { unicodeslot=0xA212, category='lo', description='YI SYLLABLE KURX' },
+ [0xA213] = { unicodeslot=0xA213, category='lo', description='YI SYLLABLE KUR' },
+ [0xA214] = { unicodeslot=0xA214, category='lo', description='YI SYLLABLE GGIT' },
+ [0xA215] = { unicodeslot=0xA215, category='lo', description='YI SYLLABLE GGIX' },
+ [0xA216] = { unicodeslot=0xA216, category='lo', description='YI SYLLABLE GGI' },
+ [0xA217] = { unicodeslot=0xA217, category='lo', description='YI SYLLABLE GGIEX' },
+ [0xA218] = { unicodeslot=0xA218, category='lo', description='YI SYLLABLE GGIE' },
+ [0xA219] = { unicodeslot=0xA219, category='lo', description='YI SYLLABLE GGIEP' },
+ [0xA21A] = { unicodeslot=0xA21A, category='lo', description='YI SYLLABLE GGAT' },
+ [0xA21B] = { unicodeslot=0xA21B, category='lo', description='YI SYLLABLE GGAX' },
+ [0xA21C] = { unicodeslot=0xA21C, category='lo', description='YI SYLLABLE GGA' },
+ [0xA21D] = { unicodeslot=0xA21D, category='lo', description='YI SYLLABLE GGAP' },
+ [0xA21E] = { unicodeslot=0xA21E, category='lo', description='YI SYLLABLE GGUOT' },
+ [0xA21F] = { unicodeslot=0xA21F, category='lo', description='YI SYLLABLE GGUOX' },
+ [0xA220] = { unicodeslot=0xA220, category='lo', description='YI SYLLABLE GGUO' },
+ [0xA221] = { unicodeslot=0xA221, category='lo', description='YI SYLLABLE GGUOP' },
+ [0xA222] = { unicodeslot=0xA222, category='lo', description='YI SYLLABLE GGOT' },
+ [0xA223] = { unicodeslot=0xA223, category='lo', description='YI SYLLABLE GGOX' },
+ [0xA224] = { unicodeslot=0xA224, category='lo', description='YI SYLLABLE GGO' },
+ [0xA225] = { unicodeslot=0xA225, category='lo', description='YI SYLLABLE GGOP' },
+ [0xA226] = { unicodeslot=0xA226, category='lo', description='YI SYLLABLE GGET' },
+ [0xA227] = { unicodeslot=0xA227, category='lo', description='YI SYLLABLE GGEX' },
+ [0xA228] = { unicodeslot=0xA228, category='lo', description='YI SYLLABLE GGE' },
+ [0xA229] = { unicodeslot=0xA229, category='lo', description='YI SYLLABLE GGEP' },
+ [0xA22A] = { unicodeslot=0xA22A, category='lo', description='YI SYLLABLE GGUT' },
+ [0xA22B] = { unicodeslot=0xA22B, category='lo', description='YI SYLLABLE GGUX' },
+ [0xA22C] = { unicodeslot=0xA22C, category='lo', description='YI SYLLABLE GGU' },
+ [0xA22D] = { unicodeslot=0xA22D, category='lo', description='YI SYLLABLE GGUP' },
+ [0xA22E] = { unicodeslot=0xA22E, category='lo', description='YI SYLLABLE GGURX' },
+ [0xA22F] = { unicodeslot=0xA22F, category='lo', description='YI SYLLABLE GGUR' },
+ [0xA230] = { unicodeslot=0xA230, category='lo', description='YI SYLLABLE MGIEX' },
+ [0xA231] = { unicodeslot=0xA231, category='lo', description='YI SYLLABLE MGIE' },
+ [0xA232] = { unicodeslot=0xA232, category='lo', description='YI SYLLABLE MGAT' },
+ [0xA233] = { unicodeslot=0xA233, category='lo', description='YI SYLLABLE MGAX' },
+ [0xA234] = { unicodeslot=0xA234, category='lo', description='YI SYLLABLE MGA' },
+ [0xA235] = { unicodeslot=0xA235, category='lo', description='YI SYLLABLE MGAP' },
+ [0xA236] = { unicodeslot=0xA236, category='lo', description='YI SYLLABLE MGUOX' },
+ [0xA237] = { unicodeslot=0xA237, category='lo', description='YI SYLLABLE MGUO' },
+ [0xA238] = { unicodeslot=0xA238, category='lo', description='YI SYLLABLE MGUOP' },
+ [0xA239] = { unicodeslot=0xA239, category='lo', description='YI SYLLABLE MGOT' },
+ [0xA23A] = { unicodeslot=0xA23A, category='lo', description='YI SYLLABLE MGOX' },
+ [0xA23B] = { unicodeslot=0xA23B, category='lo', description='YI SYLLABLE MGO' },
+ [0xA23C] = { unicodeslot=0xA23C, category='lo', description='YI SYLLABLE MGOP' },
+ [0xA23D] = { unicodeslot=0xA23D, category='lo', description='YI SYLLABLE MGEX' },
+ [0xA23E] = { unicodeslot=0xA23E, category='lo', description='YI SYLLABLE MGE' },
+ [0xA23F] = { unicodeslot=0xA23F, category='lo', description='YI SYLLABLE MGEP' },
+ [0xA240] = { unicodeslot=0xA240, category='lo', description='YI SYLLABLE MGUT' },
+ [0xA241] = { unicodeslot=0xA241, category='lo', description='YI SYLLABLE MGUX' },
+ [0xA242] = { unicodeslot=0xA242, category='lo', description='YI SYLLABLE MGU' },
+ [0xA243] = { unicodeslot=0xA243, category='lo', description='YI SYLLABLE MGUP' },
+ [0xA244] = { unicodeslot=0xA244, category='lo', description='YI SYLLABLE MGURX' },
+ [0xA245] = { unicodeslot=0xA245, category='lo', description='YI SYLLABLE MGUR' },
+ [0xA246] = { unicodeslot=0xA246, category='lo', description='YI SYLLABLE HXIT' },
+ [0xA247] = { unicodeslot=0xA247, category='lo', description='YI SYLLABLE HXIX' },
+ [0xA248] = { unicodeslot=0xA248, category='lo', description='YI SYLLABLE HXI' },
+ [0xA249] = { unicodeslot=0xA249, category='lo', description='YI SYLLABLE HXIP' },
+ [0xA24A] = { unicodeslot=0xA24A, category='lo', description='YI SYLLABLE HXIET' },
+ [0xA24B] = { unicodeslot=0xA24B, category='lo', description='YI SYLLABLE HXIEX' },
+ [0xA24C] = { unicodeslot=0xA24C, category='lo', description='YI SYLLABLE HXIE' },
+ [0xA24D] = { unicodeslot=0xA24D, category='lo', description='YI SYLLABLE HXIEP' },
+ [0xA24E] = { unicodeslot=0xA24E, category='lo', description='YI SYLLABLE HXAT' },
+ [0xA24F] = { unicodeslot=0xA24F, category='lo', description='YI SYLLABLE HXAX' },
+ [0xA250] = { unicodeslot=0xA250, category='lo', description='YI SYLLABLE HXA' },
+ [0xA251] = { unicodeslot=0xA251, category='lo', description='YI SYLLABLE HXAP' },
+ [0xA252] = { unicodeslot=0xA252, category='lo', description='YI SYLLABLE HXUOT' },
+ [0xA253] = { unicodeslot=0xA253, category='lo', description='YI SYLLABLE HXUOX' },
+ [0xA254] = { unicodeslot=0xA254, category='lo', description='YI SYLLABLE HXUO' },
+ [0xA255] = { unicodeslot=0xA255, category='lo', description='YI SYLLABLE HXUOP' },
+ [0xA256] = { unicodeslot=0xA256, category='lo', description='YI SYLLABLE HXOT' },
+ [0xA257] = { unicodeslot=0xA257, category='lo', description='YI SYLLABLE HXOX' },
+ [0xA258] = { unicodeslot=0xA258, category='lo', description='YI SYLLABLE HXO' },
+ [0xA259] = { unicodeslot=0xA259, category='lo', description='YI SYLLABLE HXOP' },
+ [0xA25A] = { unicodeslot=0xA25A, category='lo', description='YI SYLLABLE HXEX' },
+ [0xA25B] = { unicodeslot=0xA25B, category='lo', description='YI SYLLABLE HXE' },
+ [0xA25C] = { unicodeslot=0xA25C, category='lo', description='YI SYLLABLE HXEP' },
+ [0xA25D] = { unicodeslot=0xA25D, category='lo', description='YI SYLLABLE NGIEX' },
+ [0xA25E] = { unicodeslot=0xA25E, category='lo', description='YI SYLLABLE NGIE' },
+ [0xA25F] = { unicodeslot=0xA25F, category='lo', description='YI SYLLABLE NGIEP' },
+ [0xA260] = { unicodeslot=0xA260, category='lo', description='YI SYLLABLE NGAT' },
+ [0xA261] = { unicodeslot=0xA261, category='lo', description='YI SYLLABLE NGAX' },
+ [0xA262] = { unicodeslot=0xA262, category='lo', description='YI SYLLABLE NGA' },
+ [0xA263] = { unicodeslot=0xA263, category='lo', description='YI SYLLABLE NGAP' },
+ [0xA264] = { unicodeslot=0xA264, category='lo', description='YI SYLLABLE NGUOT' },
+ [0xA265] = { unicodeslot=0xA265, category='lo', description='YI SYLLABLE NGUOX' },
+ [0xA266] = { unicodeslot=0xA266, category='lo', description='YI SYLLABLE NGUO' },
+ [0xA267] = { unicodeslot=0xA267, category='lo', description='YI SYLLABLE NGOT' },
+ [0xA268] = { unicodeslot=0xA268, category='lo', description='YI SYLLABLE NGOX' },
+ [0xA269] = { unicodeslot=0xA269, category='lo', description='YI SYLLABLE NGO' },
+ [0xA26A] = { unicodeslot=0xA26A, category='lo', description='YI SYLLABLE NGOP' },
+ [0xA26B] = { unicodeslot=0xA26B, category='lo', description='YI SYLLABLE NGEX' },
+ [0xA26C] = { unicodeslot=0xA26C, category='lo', description='YI SYLLABLE NGE' },
+ [0xA26D] = { unicodeslot=0xA26D, category='lo', description='YI SYLLABLE NGEP' },
+ [0xA26E] = { unicodeslot=0xA26E, category='lo', description='YI SYLLABLE HIT' },
+ [0xA26F] = { unicodeslot=0xA26F, category='lo', description='YI SYLLABLE HIEX' },
+ [0xA270] = { unicodeslot=0xA270, category='lo', description='YI SYLLABLE HIE' },
+ [0xA271] = { unicodeslot=0xA271, category='lo', description='YI SYLLABLE HAT' },
+ [0xA272] = { unicodeslot=0xA272, category='lo', description='YI SYLLABLE HAX' },
+ [0xA273] = { unicodeslot=0xA273, category='lo', description='YI SYLLABLE HA' },
+ [0xA274] = { unicodeslot=0xA274, category='lo', description='YI SYLLABLE HAP' },
+ [0xA275] = { unicodeslot=0xA275, category='lo', description='YI SYLLABLE HUOT' },
+ [0xA276] = { unicodeslot=0xA276, category='lo', description='YI SYLLABLE HUOX' },
+ [0xA277] = { unicodeslot=0xA277, category='lo', description='YI SYLLABLE HUO' },
+ [0xA278] = { unicodeslot=0xA278, category='lo', description='YI SYLLABLE HUOP' },
+ [0xA279] = { unicodeslot=0xA279, category='lo', description='YI SYLLABLE HOT' },
+ [0xA27A] = { unicodeslot=0xA27A, category='lo', description='YI SYLLABLE HOX' },
+ [0xA27B] = { unicodeslot=0xA27B, category='lo', description='YI SYLLABLE HO' },
+ [0xA27C] = { unicodeslot=0xA27C, category='lo', description='YI SYLLABLE HOP' },
+ [0xA27D] = { unicodeslot=0xA27D, category='lo', description='YI SYLLABLE HEX' },
+ [0xA27E] = { unicodeslot=0xA27E, category='lo', description='YI SYLLABLE HE' },
+ [0xA27F] = { unicodeslot=0xA27F, category='lo', description='YI SYLLABLE HEP' },
+ [0xA280] = { unicodeslot=0xA280, category='lo', description='YI SYLLABLE WAT' },
+ [0xA281] = { unicodeslot=0xA281, category='lo', description='YI SYLLABLE WAX' },
+ [0xA282] = { unicodeslot=0xA282, category='lo', description='YI SYLLABLE WA' },
+ [0xA283] = { unicodeslot=0xA283, category='lo', description='YI SYLLABLE WAP' },
+ [0xA284] = { unicodeslot=0xA284, category='lo', description='YI SYLLABLE WUOX' },
+ [0xA285] = { unicodeslot=0xA285, category='lo', description='YI SYLLABLE WUO' },
+ [0xA286] = { unicodeslot=0xA286, category='lo', description='YI SYLLABLE WUOP' },
+ [0xA287] = { unicodeslot=0xA287, category='lo', description='YI SYLLABLE WOX' },
+ [0xA288] = { unicodeslot=0xA288, category='lo', description='YI SYLLABLE WO' },
+ [0xA289] = { unicodeslot=0xA289, category='lo', description='YI SYLLABLE WOP' },
+ [0xA28A] = { unicodeslot=0xA28A, category='lo', description='YI SYLLABLE WEX' },
+ [0xA28B] = { unicodeslot=0xA28B, category='lo', description='YI SYLLABLE WE' },
+ [0xA28C] = { unicodeslot=0xA28C, category='lo', description='YI SYLLABLE WEP' },
+ [0xA28D] = { unicodeslot=0xA28D, category='lo', description='YI SYLLABLE ZIT' },
+ [0xA28E] = { unicodeslot=0xA28E, category='lo', description='YI SYLLABLE ZIX' },
+ [0xA28F] = { unicodeslot=0xA28F, category='lo', description='YI SYLLABLE ZI' },
+ [0xA290] = { unicodeslot=0xA290, category='lo', description='YI SYLLABLE ZIP' },
+ [0xA291] = { unicodeslot=0xA291, category='lo', description='YI SYLLABLE ZIEX' },
+ [0xA292] = { unicodeslot=0xA292, category='lo', description='YI SYLLABLE ZIE' },
+ [0xA293] = { unicodeslot=0xA293, category='lo', description='YI SYLLABLE ZIEP' },
+ [0xA294] = { unicodeslot=0xA294, category='lo', description='YI SYLLABLE ZAT' },
+ [0xA295] = { unicodeslot=0xA295, category='lo', description='YI SYLLABLE ZAX' },
+ [0xA296] = { unicodeslot=0xA296, category='lo', description='YI SYLLABLE ZA' },
+ [0xA297] = { unicodeslot=0xA297, category='lo', description='YI SYLLABLE ZAP' },
+ [0xA298] = { unicodeslot=0xA298, category='lo', description='YI SYLLABLE ZUOX' },
+ [0xA299] = { unicodeslot=0xA299, category='lo', description='YI SYLLABLE ZUO' },
+ [0xA29A] = { unicodeslot=0xA29A, category='lo', description='YI SYLLABLE ZUOP' },
+ [0xA29B] = { unicodeslot=0xA29B, category='lo', description='YI SYLLABLE ZOT' },
+ [0xA29C] = { unicodeslot=0xA29C, category='lo', description='YI SYLLABLE ZOX' },
+ [0xA29D] = { unicodeslot=0xA29D, category='lo', description='YI SYLLABLE ZO' },
+ [0xA29E] = { unicodeslot=0xA29E, category='lo', description='YI SYLLABLE ZOP' },
+ [0xA29F] = { unicodeslot=0xA29F, category='lo', description='YI SYLLABLE ZEX' },
+ [0xA2A0] = { unicodeslot=0xA2A0, category='lo', description='YI SYLLABLE ZE' },
+ [0xA2A1] = { unicodeslot=0xA2A1, category='lo', description='YI SYLLABLE ZEP' },
+ [0xA2A2] = { unicodeslot=0xA2A2, category='lo', description='YI SYLLABLE ZUT' },
+ [0xA2A3] = { unicodeslot=0xA2A3, category='lo', description='YI SYLLABLE ZUX' },
+ [0xA2A4] = { unicodeslot=0xA2A4, category='lo', description='YI SYLLABLE ZU' },
+ [0xA2A5] = { unicodeslot=0xA2A5, category='lo', description='YI SYLLABLE ZUP' },
+ [0xA2A6] = { unicodeslot=0xA2A6, category='lo', description='YI SYLLABLE ZURX' },
+ [0xA2A7] = { unicodeslot=0xA2A7, category='lo', description='YI SYLLABLE ZUR' },
+ [0xA2A8] = { unicodeslot=0xA2A8, category='lo', description='YI SYLLABLE ZYT' },
+ [0xA2A9] = { unicodeslot=0xA2A9, category='lo', description='YI SYLLABLE ZYX' },
+ [0xA2AA] = { unicodeslot=0xA2AA, category='lo', description='YI SYLLABLE ZY' },
+ [0xA2AB] = { unicodeslot=0xA2AB, category='lo', description='YI SYLLABLE ZYP' },
+ [0xA2AC] = { unicodeslot=0xA2AC, category='lo', description='YI SYLLABLE ZYRX' },
+ [0xA2AD] = { unicodeslot=0xA2AD, category='lo', description='YI SYLLABLE ZYR' },
+ [0xA2AE] = { unicodeslot=0xA2AE, category='lo', description='YI SYLLABLE CIT' },
+ [0xA2AF] = { unicodeslot=0xA2AF, category='lo', description='YI SYLLABLE CIX' },
+ [0xA2B0] = { unicodeslot=0xA2B0, category='lo', description='YI SYLLABLE CI' },
+ [0xA2B1] = { unicodeslot=0xA2B1, category='lo', description='YI SYLLABLE CIP' },
+ [0xA2B2] = { unicodeslot=0xA2B2, category='lo', description='YI SYLLABLE CIET' },
+ [0xA2B3] = { unicodeslot=0xA2B3, category='lo', description='YI SYLLABLE CIEX' },
+ [0xA2B4] = { unicodeslot=0xA2B4, category='lo', description='YI SYLLABLE CIE' },
+ [0xA2B5] = { unicodeslot=0xA2B5, category='lo', description='YI SYLLABLE CIEP' },
+ [0xA2B6] = { unicodeslot=0xA2B6, category='lo', description='YI SYLLABLE CAT' },
+ [0xA2B7] = { unicodeslot=0xA2B7, category='lo', description='YI SYLLABLE CAX' },
+ [0xA2B8] = { unicodeslot=0xA2B8, category='lo', description='YI SYLLABLE CA' },
+ [0xA2B9] = { unicodeslot=0xA2B9, category='lo', description='YI SYLLABLE CAP' },
+ [0xA2BA] = { unicodeslot=0xA2BA, category='lo', description='YI SYLLABLE CUOX' },
+ [0xA2BB] = { unicodeslot=0xA2BB, category='lo', description='YI SYLLABLE CUO' },
+ [0xA2BC] = { unicodeslot=0xA2BC, category='lo', description='YI SYLLABLE CUOP' },
+ [0xA2BD] = { unicodeslot=0xA2BD, category='lo', description='YI SYLLABLE COT' },
+ [0xA2BE] = { unicodeslot=0xA2BE, category='lo', description='YI SYLLABLE COX' },
+ [0xA2BF] = { unicodeslot=0xA2BF, category='lo', description='YI SYLLABLE CO' },
+ [0xA2C0] = { unicodeslot=0xA2C0, category='lo', description='YI SYLLABLE COP' },
+ [0xA2C1] = { unicodeslot=0xA2C1, category='lo', description='YI SYLLABLE CEX' },
+ [0xA2C2] = { unicodeslot=0xA2C2, category='lo', description='YI SYLLABLE CE' },
+ [0xA2C3] = { unicodeslot=0xA2C3, category='lo', description='YI SYLLABLE CEP' },
+ [0xA2C4] = { unicodeslot=0xA2C4, category='lo', description='YI SYLLABLE CUT' },
+ [0xA2C5] = { unicodeslot=0xA2C5, category='lo', description='YI SYLLABLE CUX' },
+ [0xA2C6] = { unicodeslot=0xA2C6, category='lo', description='YI SYLLABLE CU' },
+ [0xA2C7] = { unicodeslot=0xA2C7, category='lo', description='YI SYLLABLE CUP' },
+ [0xA2C8] = { unicodeslot=0xA2C8, category='lo', description='YI SYLLABLE CURX' },
+ [0xA2C9] = { unicodeslot=0xA2C9, category='lo', description='YI SYLLABLE CUR' },
+ [0xA2CA] = { unicodeslot=0xA2CA, category='lo', description='YI SYLLABLE CYT' },
+ [0xA2CB] = { unicodeslot=0xA2CB, category='lo', description='YI SYLLABLE CYX' },
+ [0xA2CC] = { unicodeslot=0xA2CC, category='lo', description='YI SYLLABLE CY' },
+ [0xA2CD] = { unicodeslot=0xA2CD, category='lo', description='YI SYLLABLE CYP' },
+ [0xA2CE] = { unicodeslot=0xA2CE, category='lo', description='YI SYLLABLE CYRX' },
+ [0xA2CF] = { unicodeslot=0xA2CF, category='lo', description='YI SYLLABLE CYR' },
+ [0xA2D0] = { unicodeslot=0xA2D0, category='lo', description='YI SYLLABLE ZZIT' },
+ [0xA2D1] = { unicodeslot=0xA2D1, category='lo', description='YI SYLLABLE ZZIX' },
+ [0xA2D2] = { unicodeslot=0xA2D2, category='lo', description='YI SYLLABLE ZZI' },
+ [0xA2D3] = { unicodeslot=0xA2D3, category='lo', description='YI SYLLABLE ZZIP' },
+ [0xA2D4] = { unicodeslot=0xA2D4, category='lo', description='YI SYLLABLE ZZIET' },
+ [0xA2D5] = { unicodeslot=0xA2D5, category='lo', description='YI SYLLABLE ZZIEX' },
+ [0xA2D6] = { unicodeslot=0xA2D6, category='lo', description='YI SYLLABLE ZZIE' },
+ [0xA2D7] = { unicodeslot=0xA2D7, category='lo', description='YI SYLLABLE ZZIEP' },
+ [0xA2D8] = { unicodeslot=0xA2D8, category='lo', description='YI SYLLABLE ZZAT' },
+ [0xA2D9] = { unicodeslot=0xA2D9, category='lo', description='YI SYLLABLE ZZAX' },
+ [0xA2DA] = { unicodeslot=0xA2DA, category='lo', description='YI SYLLABLE ZZA' },
+ [0xA2DB] = { unicodeslot=0xA2DB, category='lo', description='YI SYLLABLE ZZAP' },
+ [0xA2DC] = { unicodeslot=0xA2DC, category='lo', description='YI SYLLABLE ZZOX' },
+ [0xA2DD] = { unicodeslot=0xA2DD, category='lo', description='YI SYLLABLE ZZO' },
+ [0xA2DE] = { unicodeslot=0xA2DE, category='lo', description='YI SYLLABLE ZZOP' },
+ [0xA2DF] = { unicodeslot=0xA2DF, category='lo', description='YI SYLLABLE ZZEX' },
+ [0xA2E0] = { unicodeslot=0xA2E0, category='lo', description='YI SYLLABLE ZZE' },
+ [0xA2E1] = { unicodeslot=0xA2E1, category='lo', description='YI SYLLABLE ZZEP' },
+ [0xA2E2] = { unicodeslot=0xA2E2, category='lo', description='YI SYLLABLE ZZUX' },
+ [0xA2E3] = { unicodeslot=0xA2E3, category='lo', description='YI SYLLABLE ZZU' },
+ [0xA2E4] = { unicodeslot=0xA2E4, category='lo', description='YI SYLLABLE ZZUP' },
+ [0xA2E5] = { unicodeslot=0xA2E5, category='lo', description='YI SYLLABLE ZZURX' },
+ [0xA2E6] = { unicodeslot=0xA2E6, category='lo', description='YI SYLLABLE ZZUR' },
+ [0xA2E7] = { unicodeslot=0xA2E7, category='lo', description='YI SYLLABLE ZZYT' },
+ [0xA2E8] = { unicodeslot=0xA2E8, category='lo', description='YI SYLLABLE ZZYX' },
+ [0xA2E9] = { unicodeslot=0xA2E9, category='lo', description='YI SYLLABLE ZZY' },
+ [0xA2EA] = { unicodeslot=0xA2EA, category='lo', description='YI SYLLABLE ZZYP' },
+ [0xA2EB] = { unicodeslot=0xA2EB, category='lo', description='YI SYLLABLE ZZYRX' },
+ [0xA2EC] = { unicodeslot=0xA2EC, category='lo', description='YI SYLLABLE ZZYR' },
+ [0xA2ED] = { unicodeslot=0xA2ED, category='lo', description='YI SYLLABLE NZIT' },
+ [0xA2EE] = { unicodeslot=0xA2EE, category='lo', description='YI SYLLABLE NZIX' },
+ [0xA2EF] = { unicodeslot=0xA2EF, category='lo', description='YI SYLLABLE NZI' },
+ [0xA2F0] = { unicodeslot=0xA2F0, category='lo', description='YI SYLLABLE NZIP' },
+ [0xA2F1] = { unicodeslot=0xA2F1, category='lo', description='YI SYLLABLE NZIEX' },
+ [0xA2F2] = { unicodeslot=0xA2F2, category='lo', description='YI SYLLABLE NZIE' },
+ [0xA2F3] = { unicodeslot=0xA2F3, category='lo', description='YI SYLLABLE NZIEP' },
+ [0xA2F4] = { unicodeslot=0xA2F4, category='lo', description='YI SYLLABLE NZAT' },
+ [0xA2F5] = { unicodeslot=0xA2F5, category='lo', description='YI SYLLABLE NZAX' },
+ [0xA2F6] = { unicodeslot=0xA2F6, category='lo', description='YI SYLLABLE NZA' },
+ [0xA2F7] = { unicodeslot=0xA2F7, category='lo', description='YI SYLLABLE NZAP' },
+ [0xA2F8] = { unicodeslot=0xA2F8, category='lo', description='YI SYLLABLE NZUOX' },
+ [0xA2F9] = { unicodeslot=0xA2F9, category='lo', description='YI SYLLABLE NZUO' },
+ [0xA2FA] = { unicodeslot=0xA2FA, category='lo', description='YI SYLLABLE NZOX' },
+ [0xA2FB] = { unicodeslot=0xA2FB, category='lo', description='YI SYLLABLE NZOP' },
+ [0xA2FC] = { unicodeslot=0xA2FC, category='lo', description='YI SYLLABLE NZEX' },
+ [0xA2FD] = { unicodeslot=0xA2FD, category='lo', description='YI SYLLABLE NZE' },
+ [0xA2FE] = { unicodeslot=0xA2FE, category='lo', description='YI SYLLABLE NZUX' },
+ [0xA2FF] = { unicodeslot=0xA2FF, category='lo', description='YI SYLLABLE NZU' },
+ [0xA300] = { unicodeslot=0xA300, category='lo', description='YI SYLLABLE NZUP' },
+ [0xA301] = { unicodeslot=0xA301, category='lo', description='YI SYLLABLE NZURX' },
+ [0xA302] = { unicodeslot=0xA302, category='lo', description='YI SYLLABLE NZUR' },
+ [0xA303] = { unicodeslot=0xA303, category='lo', description='YI SYLLABLE NZYT' },
+ [0xA304] = { unicodeslot=0xA304, category='lo', description='YI SYLLABLE NZYX' },
+ [0xA305] = { unicodeslot=0xA305, category='lo', description='YI SYLLABLE NZY' },
+ [0xA306] = { unicodeslot=0xA306, category='lo', description='YI SYLLABLE NZYP' },
+ [0xA307] = { unicodeslot=0xA307, category='lo', description='YI SYLLABLE NZYRX' },
+ [0xA308] = { unicodeslot=0xA308, category='lo', description='YI SYLLABLE NZYR' },
+ [0xA309] = { unicodeslot=0xA309, category='lo', description='YI SYLLABLE SIT' },
+ [0xA30A] = { unicodeslot=0xA30A, category='lo', description='YI SYLLABLE SIX' },
+ [0xA30B] = { unicodeslot=0xA30B, category='lo', description='YI SYLLABLE SI' },
+ [0xA30C] = { unicodeslot=0xA30C, category='lo', description='YI SYLLABLE SIP' },
+ [0xA30D] = { unicodeslot=0xA30D, category='lo', description='YI SYLLABLE SIEX' },
+ [0xA30E] = { unicodeslot=0xA30E, category='lo', description='YI SYLLABLE SIE' },
+ [0xA30F] = { unicodeslot=0xA30F, category='lo', description='YI SYLLABLE SIEP' },
+ [0xA310] = { unicodeslot=0xA310, category='lo', description='YI SYLLABLE SAT' },
+ [0xA311] = { unicodeslot=0xA311, category='lo', description='YI SYLLABLE SAX' },
+ [0xA312] = { unicodeslot=0xA312, category='lo', description='YI SYLLABLE SA' },
+ [0xA313] = { unicodeslot=0xA313, category='lo', description='YI SYLLABLE SAP' },
+ [0xA314] = { unicodeslot=0xA314, category='lo', description='YI SYLLABLE SUOX' },
+ [0xA315] = { unicodeslot=0xA315, category='lo', description='YI SYLLABLE SUO' },
+ [0xA316] = { unicodeslot=0xA316, category='lo', description='YI SYLLABLE SUOP' },
+ [0xA317] = { unicodeslot=0xA317, category='lo', description='YI SYLLABLE SOT' },
+ [0xA318] = { unicodeslot=0xA318, category='lo', description='YI SYLLABLE SOX' },
+ [0xA319] = { unicodeslot=0xA319, category='lo', description='YI SYLLABLE SO' },
+ [0xA31A] = { unicodeslot=0xA31A, category='lo', description='YI SYLLABLE SOP' },
+ [0xA31B] = { unicodeslot=0xA31B, category='lo', description='YI SYLLABLE SEX' },
+ [0xA31C] = { unicodeslot=0xA31C, category='lo', description='YI SYLLABLE SE' },
+ [0xA31D] = { unicodeslot=0xA31D, category='lo', description='YI SYLLABLE SEP' },
+ [0xA31E] = { unicodeslot=0xA31E, category='lo', description='YI SYLLABLE SUT' },
+ [0xA31F] = { unicodeslot=0xA31F, category='lo', description='YI SYLLABLE SUX' },
+ [0xA320] = { unicodeslot=0xA320, category='lo', description='YI SYLLABLE SU' },
+ [0xA321] = { unicodeslot=0xA321, category='lo', description='YI SYLLABLE SUP' },
+ [0xA322] = { unicodeslot=0xA322, category='lo', description='YI SYLLABLE SURX' },
+ [0xA323] = { unicodeslot=0xA323, category='lo', description='YI SYLLABLE SUR' },
+ [0xA324] = { unicodeslot=0xA324, category='lo', description='YI SYLLABLE SYT' },
+ [0xA325] = { unicodeslot=0xA325, category='lo', description='YI SYLLABLE SYX' },
+ [0xA326] = { unicodeslot=0xA326, category='lo', description='YI SYLLABLE SY' },
+ [0xA327] = { unicodeslot=0xA327, category='lo', description='YI SYLLABLE SYP' },
+ [0xA328] = { unicodeslot=0xA328, category='lo', description='YI SYLLABLE SYRX' },
+ [0xA329] = { unicodeslot=0xA329, category='lo', description='YI SYLLABLE SYR' },
+ [0xA32A] = { unicodeslot=0xA32A, category='lo', description='YI SYLLABLE SSIT' },
+ [0xA32B] = { unicodeslot=0xA32B, category='lo', description='YI SYLLABLE SSIX' },
+ [0xA32C] = { unicodeslot=0xA32C, category='lo', description='YI SYLLABLE SSI' },
+ [0xA32D] = { unicodeslot=0xA32D, category='lo', description='YI SYLLABLE SSIP' },
+ [0xA32E] = { unicodeslot=0xA32E, category='lo', description='YI SYLLABLE SSIEX' },
+ [0xA32F] = { unicodeslot=0xA32F, category='lo', description='YI SYLLABLE SSIE' },
+ [0xA330] = { unicodeslot=0xA330, category='lo', description='YI SYLLABLE SSIEP' },
+ [0xA331] = { unicodeslot=0xA331, category='lo', description='YI SYLLABLE SSAT' },
+ [0xA332] = { unicodeslot=0xA332, category='lo', description='YI SYLLABLE SSAX' },
+ [0xA333] = { unicodeslot=0xA333, category='lo', description='YI SYLLABLE SSA' },
+ [0xA334] = { unicodeslot=0xA334, category='lo', description='YI SYLLABLE SSAP' },
+ [0xA335] = { unicodeslot=0xA335, category='lo', description='YI SYLLABLE SSOT' },
+ [0xA336] = { unicodeslot=0xA336, category='lo', description='YI SYLLABLE SSOX' },
+ [0xA337] = { unicodeslot=0xA337, category='lo', description='YI SYLLABLE SSO' },
+ [0xA338] = { unicodeslot=0xA338, category='lo', description='YI SYLLABLE SSOP' },
+ [0xA339] = { unicodeslot=0xA339, category='lo', description='YI SYLLABLE SSEX' },
+ [0xA33A] = { unicodeslot=0xA33A, category='lo', description='YI SYLLABLE SSE' },
+ [0xA33B] = { unicodeslot=0xA33B, category='lo', description='YI SYLLABLE SSEP' },
+ [0xA33C] = { unicodeslot=0xA33C, category='lo', description='YI SYLLABLE SSUT' },
+ [0xA33D] = { unicodeslot=0xA33D, category='lo', description='YI SYLLABLE SSUX' },
+ [0xA33E] = { unicodeslot=0xA33E, category='lo', description='YI SYLLABLE SSU' },
+ [0xA33F] = { unicodeslot=0xA33F, category='lo', description='YI SYLLABLE SSUP' },
+ [0xA340] = { unicodeslot=0xA340, category='lo', description='YI SYLLABLE SSYT' },
+ [0xA341] = { unicodeslot=0xA341, category='lo', description='YI SYLLABLE SSYX' },
+ [0xA342] = { unicodeslot=0xA342, category='lo', description='YI SYLLABLE SSY' },
+ [0xA343] = { unicodeslot=0xA343, category='lo', description='YI SYLLABLE SSYP' },
+ [0xA344] = { unicodeslot=0xA344, category='lo', description='YI SYLLABLE SSYRX' },
+ [0xA345] = { unicodeslot=0xA345, category='lo', description='YI SYLLABLE SSYR' },
+ [0xA346] = { unicodeslot=0xA346, category='lo', description='YI SYLLABLE ZHAT' },
+ [0xA347] = { unicodeslot=0xA347, category='lo', description='YI SYLLABLE ZHAX' },
+ [0xA348] = { unicodeslot=0xA348, category='lo', description='YI SYLLABLE ZHA' },
+ [0xA349] = { unicodeslot=0xA349, category='lo', description='YI SYLLABLE ZHAP' },
+ [0xA34A] = { unicodeslot=0xA34A, category='lo', description='YI SYLLABLE ZHUOX' },
+ [0xA34B] = { unicodeslot=0xA34B, category='lo', description='YI SYLLABLE ZHUO' },
+ [0xA34C] = { unicodeslot=0xA34C, category='lo', description='YI SYLLABLE ZHUOP' },
+ [0xA34D] = { unicodeslot=0xA34D, category='lo', description='YI SYLLABLE ZHOT' },
+ [0xA34E] = { unicodeslot=0xA34E, category='lo', description='YI SYLLABLE ZHOX' },
+ [0xA34F] = { unicodeslot=0xA34F, category='lo', description='YI SYLLABLE ZHO' },
+ [0xA350] = { unicodeslot=0xA350, category='lo', description='YI SYLLABLE ZHOP' },
+ [0xA351] = { unicodeslot=0xA351, category='lo', description='YI SYLLABLE ZHET' },
+ [0xA352] = { unicodeslot=0xA352, category='lo', description='YI SYLLABLE ZHEX' },
+ [0xA353] = { unicodeslot=0xA353, category='lo', description='YI SYLLABLE ZHE' },
+ [0xA354] = { unicodeslot=0xA354, category='lo', description='YI SYLLABLE ZHEP' },
+ [0xA355] = { unicodeslot=0xA355, category='lo', description='YI SYLLABLE ZHUT' },
+ [0xA356] = { unicodeslot=0xA356, category='lo', description='YI SYLLABLE ZHUX' },
+ [0xA357] = { unicodeslot=0xA357, category='lo', description='YI SYLLABLE ZHU' },
+ [0xA358] = { unicodeslot=0xA358, category='lo', description='YI SYLLABLE ZHUP' },
+ [0xA359] = { unicodeslot=0xA359, category='lo', description='YI SYLLABLE ZHURX' },
+ [0xA35A] = { unicodeslot=0xA35A, category='lo', description='YI SYLLABLE ZHUR' },
+ [0xA35B] = { unicodeslot=0xA35B, category='lo', description='YI SYLLABLE ZHYT' },
+ [0xA35C] = { unicodeslot=0xA35C, category='lo', description='YI SYLLABLE ZHYX' },
+ [0xA35D] = { unicodeslot=0xA35D, category='lo', description='YI SYLLABLE ZHY' },
+ [0xA35E] = { unicodeslot=0xA35E, category='lo', description='YI SYLLABLE ZHYP' },
+ [0xA35F] = { unicodeslot=0xA35F, category='lo', description='YI SYLLABLE ZHYRX' },
+ [0xA360] = { unicodeslot=0xA360, category='lo', description='YI SYLLABLE ZHYR' },
+ [0xA361] = { unicodeslot=0xA361, category='lo', description='YI SYLLABLE CHAT' },
+ [0xA362] = { unicodeslot=0xA362, category='lo', description='YI SYLLABLE CHAX' },
+ [0xA363] = { unicodeslot=0xA363, category='lo', description='YI SYLLABLE CHA' },
+ [0xA364] = { unicodeslot=0xA364, category='lo', description='YI SYLLABLE CHAP' },
+ [0xA365] = { unicodeslot=0xA365, category='lo', description='YI SYLLABLE CHUOT' },
+ [0xA366] = { unicodeslot=0xA366, category='lo', description='YI SYLLABLE CHUOX' },
+ [0xA367] = { unicodeslot=0xA367, category='lo', description='YI SYLLABLE CHUO' },
+ [0xA368] = { unicodeslot=0xA368, category='lo', description='YI SYLLABLE CHUOP' },
+ [0xA369] = { unicodeslot=0xA369, category='lo', description='YI SYLLABLE CHOT' },
+ [0xA36A] = { unicodeslot=0xA36A, category='lo', description='YI SYLLABLE CHOX' },
+ [0xA36B] = { unicodeslot=0xA36B, category='lo', description='YI SYLLABLE CHO' },
+ [0xA36C] = { unicodeslot=0xA36C, category='lo', description='YI SYLLABLE CHOP' },
+ [0xA36D] = { unicodeslot=0xA36D, category='lo', description='YI SYLLABLE CHET' },
+ [0xA36E] = { unicodeslot=0xA36E, category='lo', description='YI SYLLABLE CHEX' },
+ [0xA36F] = { unicodeslot=0xA36F, category='lo', description='YI SYLLABLE CHE' },
+ [0xA370] = { unicodeslot=0xA370, category='lo', description='YI SYLLABLE CHEP' },
+ [0xA371] = { unicodeslot=0xA371, category='lo', description='YI SYLLABLE CHUX' },
+ [0xA372] = { unicodeslot=0xA372, category='lo', description='YI SYLLABLE CHU' },
+ [0xA373] = { unicodeslot=0xA373, category='lo', description='YI SYLLABLE CHUP' },
+ [0xA374] = { unicodeslot=0xA374, category='lo', description='YI SYLLABLE CHURX' },
+ [0xA375] = { unicodeslot=0xA375, category='lo', description='YI SYLLABLE CHUR' },
+ [0xA376] = { unicodeslot=0xA376, category='lo', description='YI SYLLABLE CHYT' },
+ [0xA377] = { unicodeslot=0xA377, category='lo', description='YI SYLLABLE CHYX' },
+ [0xA378] = { unicodeslot=0xA378, category='lo', description='YI SYLLABLE CHY' },
+ [0xA379] = { unicodeslot=0xA379, category='lo', description='YI SYLLABLE CHYP' },
+ [0xA37A] = { unicodeslot=0xA37A, category='lo', description='YI SYLLABLE CHYRX' },
+ [0xA37B] = { unicodeslot=0xA37B, category='lo', description='YI SYLLABLE CHYR' },
+ [0xA37C] = { unicodeslot=0xA37C, category='lo', description='YI SYLLABLE RRAX' },
+ [0xA37D] = { unicodeslot=0xA37D, category='lo', description='YI SYLLABLE RRA' },
+ [0xA37E] = { unicodeslot=0xA37E, category='lo', description='YI SYLLABLE RRUOX' },
+ [0xA37F] = { unicodeslot=0xA37F, category='lo', description='YI SYLLABLE RRUO' },
+ [0xA380] = { unicodeslot=0xA380, category='lo', description='YI SYLLABLE RROT' },
+ [0xA381] = { unicodeslot=0xA381, category='lo', description='YI SYLLABLE RROX' },
+ [0xA382] = { unicodeslot=0xA382, category='lo', description='YI SYLLABLE RRO' },
+ [0xA383] = { unicodeslot=0xA383, category='lo', description='YI SYLLABLE RROP' },
+ [0xA384] = { unicodeslot=0xA384, category='lo', description='YI SYLLABLE RRET' },
+ [0xA385] = { unicodeslot=0xA385, category='lo', description='YI SYLLABLE RREX' },
+ [0xA386] = { unicodeslot=0xA386, category='lo', description='YI SYLLABLE RRE' },
+ [0xA387] = { unicodeslot=0xA387, category='lo', description='YI SYLLABLE RREP' },
+ [0xA388] = { unicodeslot=0xA388, category='lo', description='YI SYLLABLE RRUT' },
+ [0xA389] = { unicodeslot=0xA389, category='lo', description='YI SYLLABLE RRUX' },
+ [0xA38A] = { unicodeslot=0xA38A, category='lo', description='YI SYLLABLE RRU' },
+ [0xA38B] = { unicodeslot=0xA38B, category='lo', description='YI SYLLABLE RRUP' },
+ [0xA38C] = { unicodeslot=0xA38C, category='lo', description='YI SYLLABLE RRURX' },
+ [0xA38D] = { unicodeslot=0xA38D, category='lo', description='YI SYLLABLE RRUR' },
+ [0xA38E] = { unicodeslot=0xA38E, category='lo', description='YI SYLLABLE RRYT' },
+ [0xA38F] = { unicodeslot=0xA38F, category='lo', description='YI SYLLABLE RRYX' },
+ [0xA390] = { unicodeslot=0xA390, category='lo', description='YI SYLLABLE RRY' },
+ [0xA391] = { unicodeslot=0xA391, category='lo', description='YI SYLLABLE RRYP' },
+ [0xA392] = { unicodeslot=0xA392, category='lo', description='YI SYLLABLE RRYRX' },
+ [0xA393] = { unicodeslot=0xA393, category='lo', description='YI SYLLABLE RRYR' },
+ [0xA394] = { unicodeslot=0xA394, category='lo', description='YI SYLLABLE NRAT' },
+ [0xA395] = { unicodeslot=0xA395, category='lo', description='YI SYLLABLE NRAX' },
+ [0xA396] = { unicodeslot=0xA396, category='lo', description='YI SYLLABLE NRA' },
+ [0xA397] = { unicodeslot=0xA397, category='lo', description='YI SYLLABLE NRAP' },
+ [0xA398] = { unicodeslot=0xA398, category='lo', description='YI SYLLABLE NROX' },
+ [0xA399] = { unicodeslot=0xA399, category='lo', description='YI SYLLABLE NRO' },
+ [0xA39A] = { unicodeslot=0xA39A, category='lo', description='YI SYLLABLE NROP' },
+ [0xA39B] = { unicodeslot=0xA39B, category='lo', description='YI SYLLABLE NRET' },
+ [0xA39C] = { unicodeslot=0xA39C, category='lo', description='YI SYLLABLE NREX' },
+ [0xA39D] = { unicodeslot=0xA39D, category='lo', description='YI SYLLABLE NRE' },
+ [0xA39E] = { unicodeslot=0xA39E, category='lo', description='YI SYLLABLE NREP' },
+ [0xA39F] = { unicodeslot=0xA39F, category='lo', description='YI SYLLABLE NRUT' },
+ [0xA3A0] = { unicodeslot=0xA3A0, category='lo', description='YI SYLLABLE NRUX' },
+ [0xA3A1] = { unicodeslot=0xA3A1, category='lo', description='YI SYLLABLE NRU' },
+ [0xA3A2] = { unicodeslot=0xA3A2, category='lo', description='YI SYLLABLE NRUP' },
+ [0xA3A3] = { unicodeslot=0xA3A3, category='lo', description='YI SYLLABLE NRURX' },
+ [0xA3A4] = { unicodeslot=0xA3A4, category='lo', description='YI SYLLABLE NRUR' },
+ [0xA3A5] = { unicodeslot=0xA3A5, category='lo', description='YI SYLLABLE NRYT' },
+ [0xA3A6] = { unicodeslot=0xA3A6, category='lo', description='YI SYLLABLE NRYX' },
+ [0xA3A7] = { unicodeslot=0xA3A7, category='lo', description='YI SYLLABLE NRY' },
+ [0xA3A8] = { unicodeslot=0xA3A8, category='lo', description='YI SYLLABLE NRYP' },
+ [0xA3A9] = { unicodeslot=0xA3A9, category='lo', description='YI SYLLABLE NRYRX' },
+ [0xA3AA] = { unicodeslot=0xA3AA, category='lo', description='YI SYLLABLE NRYR' },
+ [0xA3AB] = { unicodeslot=0xA3AB, category='lo', description='YI SYLLABLE SHAT' },
+ [0xA3AC] = { unicodeslot=0xA3AC, category='lo', description='YI SYLLABLE SHAX' },
+ [0xA3AD] = { unicodeslot=0xA3AD, category='lo', description='YI SYLLABLE SHA' },
+ [0xA3AE] = { unicodeslot=0xA3AE, category='lo', description='YI SYLLABLE SHAP' },
+ [0xA3AF] = { unicodeslot=0xA3AF, category='lo', description='YI SYLLABLE SHUOX' },
+ [0xA3B0] = { unicodeslot=0xA3B0, category='lo', description='YI SYLLABLE SHUO' },
+ [0xA3B1] = { unicodeslot=0xA3B1, category='lo', description='YI SYLLABLE SHUOP' },
+ [0xA3B2] = { unicodeslot=0xA3B2, category='lo', description='YI SYLLABLE SHOT' },
+ [0xA3B3] = { unicodeslot=0xA3B3, category='lo', description='YI SYLLABLE SHOX' },
+ [0xA3B4] = { unicodeslot=0xA3B4, category='lo', description='YI SYLLABLE SHO' },
+ [0xA3B5] = { unicodeslot=0xA3B5, category='lo', description='YI SYLLABLE SHOP' },
+ [0xA3B6] = { unicodeslot=0xA3B6, category='lo', description='YI SYLLABLE SHET' },
+ [0xA3B7] = { unicodeslot=0xA3B7, category='lo', description='YI SYLLABLE SHEX' },
+ [0xA3B8] = { unicodeslot=0xA3B8, category='lo', description='YI SYLLABLE SHE' },
+ [0xA3B9] = { unicodeslot=0xA3B9, category='lo', description='YI SYLLABLE SHEP' },
+ [0xA3BA] = { unicodeslot=0xA3BA, category='lo', description='YI SYLLABLE SHUT' },
+ [0xA3BB] = { unicodeslot=0xA3BB, category='lo', description='YI SYLLABLE SHUX' },
+ [0xA3BC] = { unicodeslot=0xA3BC, category='lo', description='YI SYLLABLE SHU' },
+ [0xA3BD] = { unicodeslot=0xA3BD, category='lo', description='YI SYLLABLE SHUP' },
+ [0xA3BE] = { unicodeslot=0xA3BE, category='lo', description='YI SYLLABLE SHURX' },
+ [0xA3BF] = { unicodeslot=0xA3BF, category='lo', description='YI SYLLABLE SHUR' },
+ [0xA3C0] = { unicodeslot=0xA3C0, category='lo', description='YI SYLLABLE SHYT' },
+ [0xA3C1] = { unicodeslot=0xA3C1, category='lo', description='YI SYLLABLE SHYX' },
+ [0xA3C2] = { unicodeslot=0xA3C2, category='lo', description='YI SYLLABLE SHY' },
+ [0xA3C3] = { unicodeslot=0xA3C3, category='lo', description='YI SYLLABLE SHYP' },
+ [0xA3C4] = { unicodeslot=0xA3C4, category='lo', description='YI SYLLABLE SHYRX' },
+ [0xA3C5] = { unicodeslot=0xA3C5, category='lo', description='YI SYLLABLE SHYR' },
+ [0xA3C6] = { unicodeslot=0xA3C6, category='lo', description='YI SYLLABLE RAT' },
+ [0xA3C7] = { unicodeslot=0xA3C7, category='lo', description='YI SYLLABLE RAX' },
+ [0xA3C8] = { unicodeslot=0xA3C8, category='lo', description='YI SYLLABLE RA' },
+ [0xA3C9] = { unicodeslot=0xA3C9, category='lo', description='YI SYLLABLE RAP' },
+ [0xA3CA] = { unicodeslot=0xA3CA, category='lo', description='YI SYLLABLE RUOX' },
+ [0xA3CB] = { unicodeslot=0xA3CB, category='lo', description='YI SYLLABLE RUO' },
+ [0xA3CC] = { unicodeslot=0xA3CC, category='lo', description='YI SYLLABLE RUOP' },
+ [0xA3CD] = { unicodeslot=0xA3CD, category='lo', description='YI SYLLABLE ROT' },
+ [0xA3CE] = { unicodeslot=0xA3CE, category='lo', description='YI SYLLABLE ROX' },
+ [0xA3CF] = { unicodeslot=0xA3CF, category='lo', description='YI SYLLABLE RO' },
+ [0xA3D0] = { unicodeslot=0xA3D0, category='lo', description='YI SYLLABLE ROP' },
+ [0xA3D1] = { unicodeslot=0xA3D1, category='lo', description='YI SYLLABLE REX' },
+ [0xA3D2] = { unicodeslot=0xA3D2, category='lo', description='YI SYLLABLE RE' },
+ [0xA3D3] = { unicodeslot=0xA3D3, category='lo', description='YI SYLLABLE REP' },
+ [0xA3D4] = { unicodeslot=0xA3D4, category='lo', description='YI SYLLABLE RUT' },
+ [0xA3D5] = { unicodeslot=0xA3D5, category='lo', description='YI SYLLABLE RUX' },
+ [0xA3D6] = { unicodeslot=0xA3D6, category='lo', description='YI SYLLABLE RU' },
+ [0xA3D7] = { unicodeslot=0xA3D7, category='lo', description='YI SYLLABLE RUP' },
+ [0xA3D8] = { unicodeslot=0xA3D8, category='lo', description='YI SYLLABLE RURX' },
+ [0xA3D9] = { unicodeslot=0xA3D9, category='lo', description='YI SYLLABLE RUR' },
+ [0xA3DA] = { unicodeslot=0xA3DA, category='lo', description='YI SYLLABLE RYT' },
+ [0xA3DB] = { unicodeslot=0xA3DB, category='lo', description='YI SYLLABLE RYX' },
+ [0xA3DC] = { unicodeslot=0xA3DC, category='lo', description='YI SYLLABLE RY' },
+ [0xA3DD] = { unicodeslot=0xA3DD, category='lo', description='YI SYLLABLE RYP' },
+ [0xA3DE] = { unicodeslot=0xA3DE, category='lo', description='YI SYLLABLE RYRX' },
+ [0xA3DF] = { unicodeslot=0xA3DF, category='lo', description='YI SYLLABLE RYR' },
+ [0xA3E0] = { unicodeslot=0xA3E0, category='lo', description='YI SYLLABLE JIT' },
+ [0xA3E1] = { unicodeslot=0xA3E1, category='lo', description='YI SYLLABLE JIX' },
+ [0xA3E2] = { unicodeslot=0xA3E2, category='lo', description='YI SYLLABLE JI' },
+ [0xA3E3] = { unicodeslot=0xA3E3, category='lo', description='YI SYLLABLE JIP' },
+ [0xA3E4] = { unicodeslot=0xA3E4, category='lo', description='YI SYLLABLE JIET' },
+ [0xA3E5] = { unicodeslot=0xA3E5, category='lo', description='YI SYLLABLE JIEX' },
+ [0xA3E6] = { unicodeslot=0xA3E6, category='lo', description='YI SYLLABLE JIE' },
+ [0xA3E7] = { unicodeslot=0xA3E7, category='lo', description='YI SYLLABLE JIEP' },
+ [0xA3E8] = { unicodeslot=0xA3E8, category='lo', description='YI SYLLABLE JUOT' },
+ [0xA3E9] = { unicodeslot=0xA3E9, category='lo', description='YI SYLLABLE JUOX' },
+ [0xA3EA] = { unicodeslot=0xA3EA, category='lo', description='YI SYLLABLE JUO' },
+ [0xA3EB] = { unicodeslot=0xA3EB, category='lo', description='YI SYLLABLE JUOP' },
+ [0xA3EC] = { unicodeslot=0xA3EC, category='lo', description='YI SYLLABLE JOT' },
+ [0xA3ED] = { unicodeslot=0xA3ED, category='lo', description='YI SYLLABLE JOX' },
+ [0xA3EE] = { unicodeslot=0xA3EE, category='lo', description='YI SYLLABLE JO' },
+ [0xA3EF] = { unicodeslot=0xA3EF, category='lo', description='YI SYLLABLE JOP' },
+ [0xA3F0] = { unicodeslot=0xA3F0, category='lo', description='YI SYLLABLE JUT' },
+ [0xA3F1] = { unicodeslot=0xA3F1, category='lo', description='YI SYLLABLE JUX' },
+ [0xA3F2] = { unicodeslot=0xA3F2, category='lo', description='YI SYLLABLE JU' },
+ [0xA3F3] = { unicodeslot=0xA3F3, category='lo', description='YI SYLLABLE JUP' },
+ [0xA3F4] = { unicodeslot=0xA3F4, category='lo', description='YI SYLLABLE JURX' },
+ [0xA3F5] = { unicodeslot=0xA3F5, category='lo', description='YI SYLLABLE JUR' },
+ [0xA3F6] = { unicodeslot=0xA3F6, category='lo', description='YI SYLLABLE JYT' },
+ [0xA3F7] = { unicodeslot=0xA3F7, category='lo', description='YI SYLLABLE JYX' },
+ [0xA3F8] = { unicodeslot=0xA3F8, category='lo', description='YI SYLLABLE JY' },
+ [0xA3F9] = { unicodeslot=0xA3F9, category='lo', description='YI SYLLABLE JYP' },
+ [0xA3FA] = { unicodeslot=0xA3FA, category='lo', description='YI SYLLABLE JYRX' },
+ [0xA3FB] = { unicodeslot=0xA3FB, category='lo', description='YI SYLLABLE JYR' },
+ [0xA3FC] = { unicodeslot=0xA3FC, category='lo', description='YI SYLLABLE QIT' },
+ [0xA3FD] = { unicodeslot=0xA3FD, category='lo', description='YI SYLLABLE QIX' },
+ [0xA3FE] = { unicodeslot=0xA3FE, category='lo', description='YI SYLLABLE QI' },
+ [0xA3FF] = { unicodeslot=0xA3FF, category='lo', description='YI SYLLABLE QIP' },
+ [0xA400] = { unicodeslot=0xA400, category='lo', description='YI SYLLABLE QIET' },
+ [0xA401] = { unicodeslot=0xA401, category='lo', description='YI SYLLABLE QIEX' },
+ [0xA402] = { unicodeslot=0xA402, category='lo', description='YI SYLLABLE QIE' },
+ [0xA403] = { unicodeslot=0xA403, category='lo', description='YI SYLLABLE QIEP' },
+ [0xA404] = { unicodeslot=0xA404, category='lo', description='YI SYLLABLE QUOT' },
+ [0xA405] = { unicodeslot=0xA405, category='lo', description='YI SYLLABLE QUOX' },
+ [0xA406] = { unicodeslot=0xA406, category='lo', description='YI SYLLABLE QUO' },
+ [0xA407] = { unicodeslot=0xA407, category='lo', description='YI SYLLABLE QUOP' },
+ [0xA408] = { unicodeslot=0xA408, category='lo', description='YI SYLLABLE QOT' },
+ [0xA409] = { unicodeslot=0xA409, category='lo', description='YI SYLLABLE QOX' },
+ [0xA40A] = { unicodeslot=0xA40A, category='lo', description='YI SYLLABLE QO' },
+ [0xA40B] = { unicodeslot=0xA40B, category='lo', description='YI SYLLABLE QOP' },
+ [0xA40C] = { unicodeslot=0xA40C, category='lo', description='YI SYLLABLE QUT' },
+ [0xA40D] = { unicodeslot=0xA40D, category='lo', description='YI SYLLABLE QUX' },
+ [0xA40E] = { unicodeslot=0xA40E, category='lo', description='YI SYLLABLE QU' },
+ [0xA40F] = { unicodeslot=0xA40F, category='lo', description='YI SYLLABLE QUP' },
+ [0xA410] = { unicodeslot=0xA410, category='lo', description='YI SYLLABLE QURX' },
+ [0xA411] = { unicodeslot=0xA411, category='lo', description='YI SYLLABLE QUR' },
+ [0xA412] = { unicodeslot=0xA412, category='lo', description='YI SYLLABLE QYT' },
+ [0xA413] = { unicodeslot=0xA413, category='lo', description='YI SYLLABLE QYX' },
+ [0xA414] = { unicodeslot=0xA414, category='lo', description='YI SYLLABLE QY' },
+ [0xA415] = { unicodeslot=0xA415, category='lo', description='YI SYLLABLE QYP' },
+ [0xA416] = { unicodeslot=0xA416, category='lo', description='YI SYLLABLE QYRX' },
+ [0xA417] = { unicodeslot=0xA417, category='lo', description='YI SYLLABLE QYR' },
+ [0xA418] = { unicodeslot=0xA418, category='lo', description='YI SYLLABLE JJIT' },
+ [0xA419] = { unicodeslot=0xA419, category='lo', description='YI SYLLABLE JJIX' },
+ [0xA41A] = { unicodeslot=0xA41A, category='lo', description='YI SYLLABLE JJI' },
+ [0xA41B] = { unicodeslot=0xA41B, category='lo', description='YI SYLLABLE JJIP' },
+ [0xA41C] = { unicodeslot=0xA41C, category='lo', description='YI SYLLABLE JJIET' },
+ [0xA41D] = { unicodeslot=0xA41D, category='lo', description='YI SYLLABLE JJIEX' },
+ [0xA41E] = { unicodeslot=0xA41E, category='lo', description='YI SYLLABLE JJIE' },
+ [0xA41F] = { unicodeslot=0xA41F, category='lo', description='YI SYLLABLE JJIEP' },
+ [0xA420] = { unicodeslot=0xA420, category='lo', description='YI SYLLABLE JJUOX' },
+ [0xA421] = { unicodeslot=0xA421, category='lo', description='YI SYLLABLE JJUO' },
+ [0xA422] = { unicodeslot=0xA422, category='lo', description='YI SYLLABLE JJUOP' },
+ [0xA423] = { unicodeslot=0xA423, category='lo', description='YI SYLLABLE JJOT' },
+ [0xA424] = { unicodeslot=0xA424, category='lo', description='YI SYLLABLE JJOX' },
+ [0xA425] = { unicodeslot=0xA425, category='lo', description='YI SYLLABLE JJO' },
+ [0xA426] = { unicodeslot=0xA426, category='lo', description='YI SYLLABLE JJOP' },
+ [0xA427] = { unicodeslot=0xA427, category='lo', description='YI SYLLABLE JJUT' },
+ [0xA428] = { unicodeslot=0xA428, category='lo', description='YI SYLLABLE JJUX' },
+ [0xA429] = { unicodeslot=0xA429, category='lo', description='YI SYLLABLE JJU' },
+ [0xA42A] = { unicodeslot=0xA42A, category='lo', description='YI SYLLABLE JJUP' },
+ [0xA42B] = { unicodeslot=0xA42B, category='lo', description='YI SYLLABLE JJURX' },
+ [0xA42C] = { unicodeslot=0xA42C, category='lo', description='YI SYLLABLE JJUR' },
+ [0xA42D] = { unicodeslot=0xA42D, category='lo', description='YI SYLLABLE JJYT' },
+ [0xA42E] = { unicodeslot=0xA42E, category='lo', description='YI SYLLABLE JJYX' },
+ [0xA42F] = { unicodeslot=0xA42F, category='lo', description='YI SYLLABLE JJY' },
+ [0xA430] = { unicodeslot=0xA430, category='lo', description='YI SYLLABLE JJYP' },
+ [0xA431] = { unicodeslot=0xA431, category='lo', description='YI SYLLABLE NJIT' },
+ [0xA432] = { unicodeslot=0xA432, category='lo', description='YI SYLLABLE NJIX' },
+ [0xA433] = { unicodeslot=0xA433, category='lo', description='YI SYLLABLE NJI' },
+ [0xA434] = { unicodeslot=0xA434, category='lo', description='YI SYLLABLE NJIP' },
+ [0xA435] = { unicodeslot=0xA435, category='lo', description='YI SYLLABLE NJIET' },
+ [0xA436] = { unicodeslot=0xA436, category='lo', description='YI SYLLABLE NJIEX' },
+ [0xA437] = { unicodeslot=0xA437, category='lo', description='YI SYLLABLE NJIE' },
+ [0xA438] = { unicodeslot=0xA438, category='lo', description='YI SYLLABLE NJIEP' },
+ [0xA439] = { unicodeslot=0xA439, category='lo', description='YI SYLLABLE NJUOX' },
+ [0xA43A] = { unicodeslot=0xA43A, category='lo', description='YI SYLLABLE NJUO' },
+ [0xA43B] = { unicodeslot=0xA43B, category='lo', description='YI SYLLABLE NJOT' },
+ [0xA43C] = { unicodeslot=0xA43C, category='lo', description='YI SYLLABLE NJOX' },
+ [0xA43D] = { unicodeslot=0xA43D, category='lo', description='YI SYLLABLE NJO' },
+ [0xA43E] = { unicodeslot=0xA43E, category='lo', description='YI SYLLABLE NJOP' },
+ [0xA43F] = { unicodeslot=0xA43F, category='lo', description='YI SYLLABLE NJUX' },
+ [0xA440] = { unicodeslot=0xA440, category='lo', description='YI SYLLABLE NJU' },
+ [0xA441] = { unicodeslot=0xA441, category='lo', description='YI SYLLABLE NJUP' },
+ [0xA442] = { unicodeslot=0xA442, category='lo', description='YI SYLLABLE NJURX' },
+ [0xA443] = { unicodeslot=0xA443, category='lo', description='YI SYLLABLE NJUR' },
+ [0xA444] = { unicodeslot=0xA444, category='lo', description='YI SYLLABLE NJYT' },
+ [0xA445] = { unicodeslot=0xA445, category='lo', description='YI SYLLABLE NJYX' },
+ [0xA446] = { unicodeslot=0xA446, category='lo', description='YI SYLLABLE NJY' },
+ [0xA447] = { unicodeslot=0xA447, category='lo', description='YI SYLLABLE NJYP' },
+ [0xA448] = { unicodeslot=0xA448, category='lo', description='YI SYLLABLE NJYRX' },
+ [0xA449] = { unicodeslot=0xA449, category='lo', description='YI SYLLABLE NJYR' },
+ [0xA44A] = { unicodeslot=0xA44A, category='lo', description='YI SYLLABLE NYIT' },
+ [0xA44B] = { unicodeslot=0xA44B, category='lo', description='YI SYLLABLE NYIX' },
+ [0xA44C] = { unicodeslot=0xA44C, category='lo', description='YI SYLLABLE NYI' },
+ [0xA44D] = { unicodeslot=0xA44D, category='lo', description='YI SYLLABLE NYIP' },
+ [0xA44E] = { unicodeslot=0xA44E, category='lo', description='YI SYLLABLE NYIET' },
+ [0xA44F] = { unicodeslot=0xA44F, category='lo', description='YI SYLLABLE NYIEX' },
+ [0xA450] = { unicodeslot=0xA450, category='lo', description='YI SYLLABLE NYIE' },
+ [0xA451] = { unicodeslot=0xA451, category='lo', description='YI SYLLABLE NYIEP' },
+ [0xA452] = { unicodeslot=0xA452, category='lo', description='YI SYLLABLE NYUOX' },
+ [0xA453] = { unicodeslot=0xA453, category='lo', description='YI SYLLABLE NYUO' },
+ [0xA454] = { unicodeslot=0xA454, category='lo', description='YI SYLLABLE NYUOP' },
+ [0xA455] = { unicodeslot=0xA455, category='lo', description='YI SYLLABLE NYOT' },
+ [0xA456] = { unicodeslot=0xA456, category='lo', description='YI SYLLABLE NYOX' },
+ [0xA457] = { unicodeslot=0xA457, category='lo', description='YI SYLLABLE NYO' },
+ [0xA458] = { unicodeslot=0xA458, category='lo', description='YI SYLLABLE NYOP' },
+ [0xA459] = { unicodeslot=0xA459, category='lo', description='YI SYLLABLE NYUT' },
+ [0xA45A] = { unicodeslot=0xA45A, category='lo', description='YI SYLLABLE NYUX' },
+ [0xA45B] = { unicodeslot=0xA45B, category='lo', description='YI SYLLABLE NYU' },
+ [0xA45C] = { unicodeslot=0xA45C, category='lo', description='YI SYLLABLE NYUP' },
+ [0xA45D] = { unicodeslot=0xA45D, category='lo', description='YI SYLLABLE XIT' },
+ [0xA45E] = { unicodeslot=0xA45E, category='lo', description='YI SYLLABLE XIX' },
+ [0xA45F] = { unicodeslot=0xA45F, category='lo', description='YI SYLLABLE XI' },
+ [0xA460] = { unicodeslot=0xA460, category='lo', description='YI SYLLABLE XIP' },
+ [0xA461] = { unicodeslot=0xA461, category='lo', description='YI SYLLABLE XIET' },
+ [0xA462] = { unicodeslot=0xA462, category='lo', description='YI SYLLABLE XIEX' },
+ [0xA463] = { unicodeslot=0xA463, category='lo', description='YI SYLLABLE XIE' },
+ [0xA464] = { unicodeslot=0xA464, category='lo', description='YI SYLLABLE XIEP' },
+ [0xA465] = { unicodeslot=0xA465, category='lo', description='YI SYLLABLE XUOX' },
+ [0xA466] = { unicodeslot=0xA466, category='lo', description='YI SYLLABLE XUO' },
+ [0xA467] = { unicodeslot=0xA467, category='lo', description='YI SYLLABLE XOT' },
+ [0xA468] = { unicodeslot=0xA468, category='lo', description='YI SYLLABLE XOX' },
+ [0xA469] = { unicodeslot=0xA469, category='lo', description='YI SYLLABLE XO' },
+ [0xA46A] = { unicodeslot=0xA46A, category='lo', description='YI SYLLABLE XOP' },
+ [0xA46B] = { unicodeslot=0xA46B, category='lo', description='YI SYLLABLE XYT' },
+ [0xA46C] = { unicodeslot=0xA46C, category='lo', description='YI SYLLABLE XYX' },
+ [0xA46D] = { unicodeslot=0xA46D, category='lo', description='YI SYLLABLE XY' },
+ [0xA46E] = { unicodeslot=0xA46E, category='lo', description='YI SYLLABLE XYP' },
+ [0xA46F] = { unicodeslot=0xA46F, category='lo', description='YI SYLLABLE XYRX' },
+ [0xA470] = { unicodeslot=0xA470, category='lo', description='YI SYLLABLE XYR' },
+ [0xA471] = { unicodeslot=0xA471, category='lo', description='YI SYLLABLE YIT' },
+ [0xA472] = { unicodeslot=0xA472, category='lo', description='YI SYLLABLE YIX' },
+ [0xA473] = { unicodeslot=0xA473, category='lo', description='YI SYLLABLE YI' },
+ [0xA474] = { unicodeslot=0xA474, category='lo', description='YI SYLLABLE YIP' },
+ [0xA475] = { unicodeslot=0xA475, category='lo', description='YI SYLLABLE YIET' },
+ [0xA476] = { unicodeslot=0xA476, category='lo', description='YI SYLLABLE YIEX' },
+ [0xA477] = { unicodeslot=0xA477, category='lo', description='YI SYLLABLE YIE' },
+ [0xA478] = { unicodeslot=0xA478, category='lo', description='YI SYLLABLE YIEP' },
+ [0xA479] = { unicodeslot=0xA479, category='lo', description='YI SYLLABLE YUOT' },
+ [0xA47A] = { unicodeslot=0xA47A, category='lo', description='YI SYLLABLE YUOX' },
+ [0xA47B] = { unicodeslot=0xA47B, category='lo', description='YI SYLLABLE YUO' },
+ [0xA47C] = { unicodeslot=0xA47C, category='lo', description='YI SYLLABLE YUOP' },
+ [0xA47D] = { unicodeslot=0xA47D, category='lo', description='YI SYLLABLE YOT' },
+ [0xA47E] = { unicodeslot=0xA47E, category='lo', description='YI SYLLABLE YOX' },
+ [0xA47F] = { unicodeslot=0xA47F, category='lo', description='YI SYLLABLE YO' },
+ [0xA480] = { unicodeslot=0xA480, category='lo', description='YI SYLLABLE YOP' },
+ [0xA481] = { unicodeslot=0xA481, category='lo', description='YI SYLLABLE YUT' },
+ [0xA482] = { unicodeslot=0xA482, category='lo', description='YI SYLLABLE YUX' },
+ [0xA483] = { unicodeslot=0xA483, category='lo', description='YI SYLLABLE YU' },
+ [0xA484] = { unicodeslot=0xA484, category='lo', description='YI SYLLABLE YUP' },
+ [0xA485] = { unicodeslot=0xA485, category='lo', description='YI SYLLABLE YURX' },
+ [0xA486] = { unicodeslot=0xA486, category='lo', description='YI SYLLABLE YUR' },
+ [0xA487] = { unicodeslot=0xA487, category='lo', description='YI SYLLABLE YYT' },
+ [0xA488] = { unicodeslot=0xA488, category='lo', description='YI SYLLABLE YYX' },
+ [0xA489] = { unicodeslot=0xA489, category='lo', description='YI SYLLABLE YY' },
+ [0xA48A] = { unicodeslot=0xA48A, category='lo', description='YI SYLLABLE YYP' },
+ [0xA48B] = { unicodeslot=0xA48B, category='lo', description='YI SYLLABLE YYRX' },
+ [0xA48C] = { unicodeslot=0xA48C, category='lo', description='YI SYLLABLE YYR' },
+ [0xA490] = { unicodeslot=0xA490, category='so', description='YI RADICAL QOT' },
+ [0xA491] = { unicodeslot=0xA491, category='so', description='YI RADICAL LI' },
+ [0xA492] = { unicodeslot=0xA492, category='so', description='YI RADICAL KIT' },
+ [0xA493] = { unicodeslot=0xA493, category='so', description='YI RADICAL NYIP' },
+ [0xA494] = { unicodeslot=0xA494, category='so', description='YI RADICAL CYP' },
+ [0xA495] = { unicodeslot=0xA495, category='so', description='YI RADICAL SSI' },
+ [0xA496] = { unicodeslot=0xA496, category='so', description='YI RADICAL GGOP' },
+ [0xA497] = { unicodeslot=0xA497, category='so', description='YI RADICAL GEP' },
+ [0xA498] = { unicodeslot=0xA498, category='so', description='YI RADICAL MI' },
+ [0xA499] = { unicodeslot=0xA499, category='so', description='YI RADICAL HXIT' },
+ [0xA49A] = { unicodeslot=0xA49A, category='so', description='YI RADICAL LYR' },
+ [0xA49B] = { unicodeslot=0xA49B, category='so', description='YI RADICAL BBUT' },
+ [0xA49C] = { unicodeslot=0xA49C, category='so', description='YI RADICAL MOP' },
+ [0xA49D] = { unicodeslot=0xA49D, category='so', description='YI RADICAL YO' },
+ [0xA49E] = { unicodeslot=0xA49E, category='so', description='YI RADICAL PUT' },
+ [0xA49F] = { unicodeslot=0xA49F, category='so', description='YI RADICAL HXUO' },
+ [0xA4A0] = { unicodeslot=0xA4A0, category='so', description='YI RADICAL TAT' },
+ [0xA4A1] = { unicodeslot=0xA4A1, category='so', description='YI RADICAL GA' },
+ [0xA4A2] = { unicodeslot=0xA4A2, category='so', description='YI RADICAL ZUP' },
+ [0xA4A3] = { unicodeslot=0xA4A3, category='so', description='YI RADICAL CYT' },
+ [0xA4A4] = { unicodeslot=0xA4A4, category='so', description='YI RADICAL DDUR' },
+ [0xA4A5] = { unicodeslot=0xA4A5, category='so', description='YI RADICAL BUR' },
+ [0xA4A6] = { unicodeslot=0xA4A6, category='so', description='YI RADICAL GGUO' },
+ [0xA4A7] = { unicodeslot=0xA4A7, category='so', description='YI RADICAL NYOP' },
+ [0xA4A8] = { unicodeslot=0xA4A8, category='so', description='YI RADICAL TU' },
+ [0xA4A9] = { unicodeslot=0xA4A9, category='so', description='YI RADICAL OP' },
+ [0xA4AA] = { unicodeslot=0xA4AA, category='so', description='YI RADICAL JJUT' },
+ [0xA4AB] = { unicodeslot=0xA4AB, category='so', description='YI RADICAL ZOT' },
+ [0xA4AC] = { unicodeslot=0xA4AC, category='so', description='YI RADICAL PYT' },
+ [0xA4AD] = { unicodeslot=0xA4AD, category='so', description='YI RADICAL HMO' },
+ [0xA4AE] = { unicodeslot=0xA4AE, category='so', description='YI RADICAL YIT' },
+ [0xA4AF] = { unicodeslot=0xA4AF, category='so', description='YI RADICAL VUR' },
+ [0xA4B0] = { unicodeslot=0xA4B0, category='so', description='YI RADICAL SHY' },
+ [0xA4B1] = { unicodeslot=0xA4B1, category='so', description='YI RADICAL VEP' },
+ [0xA4B2] = { unicodeslot=0xA4B2, category='so', description='YI RADICAL ZA' },
+ [0xA4B3] = { unicodeslot=0xA4B3, category='so', description='YI RADICAL JO' },
+ [0xA4B4] = { unicodeslot=0xA4B4, category='so', description='YI RADICAL NZUP' },
+ [0xA4B5] = { unicodeslot=0xA4B5, category='so', description='YI RADICAL JJY' },
+ [0xA4B6] = { unicodeslot=0xA4B6, category='so', description='YI RADICAL GOT' },
+ [0xA4B7] = { unicodeslot=0xA4B7, category='so', description='YI RADICAL JJIE' },
+ [0xA4B8] = { unicodeslot=0xA4B8, category='so', description='YI RADICAL WO' },
+ [0xA4B9] = { unicodeslot=0xA4B9, category='so', description='YI RADICAL DU' },
+ [0xA4BA] = { unicodeslot=0xA4BA, category='so', description='YI RADICAL SHUR' },
+ [0xA4BB] = { unicodeslot=0xA4BB, category='so', description='YI RADICAL LIE' },
+ [0xA4BC] = { unicodeslot=0xA4BC, category='so', description='YI RADICAL CY' },
+ [0xA4BD] = { unicodeslot=0xA4BD, category='so', description='YI RADICAL CUOP' },
+ [0xA4BE] = { unicodeslot=0xA4BE, category='so', description='YI RADICAL CIP' },
+ [0xA4BF] = { unicodeslot=0xA4BF, category='so', description='YI RADICAL HXOP' },
+ [0xA4C0] = { unicodeslot=0xA4C0, category='so', description='YI RADICAL SHAT' },
+ [0xA4C1] = { unicodeslot=0xA4C1, category='so', description='YI RADICAL ZUR' },
+ [0xA4C2] = { unicodeslot=0xA4C2, category='so', description='YI RADICAL SHOP' },
+ [0xA4C3] = { unicodeslot=0xA4C3, category='so', description='YI RADICAL CHE' },
+ [0xA4C4] = { unicodeslot=0xA4C4, category='so', description='YI RADICAL ZZIET' },
+ [0xA4C5] = { unicodeslot=0xA4C5, category='so', description='YI RADICAL NBIE' },
+ [0xA4C6] = { unicodeslot=0xA4C6, category='so', description='YI RADICAL KE' },
+ [0xA700] = { unicodeslot=0xA700, category='sk', description='MODIFIER LETTER CHINESE TONE YIN PING' },
+ [0xA701] = { unicodeslot=0xA701, category='sk', description='MODIFIER LETTER CHINESE TONE YANG PING' },
+ [0xA702] = { unicodeslot=0xA702, category='sk', description='MODIFIER LETTER CHINESE TONE YIN SHANG' },
+ [0xA703] = { unicodeslot=0xA703, category='sk', description='MODIFIER LETTER CHINESE TONE YANG SHANG' },
+ [0xA704] = { unicodeslot=0xA704, category='sk', description='MODIFIER LETTER CHINESE TONE YIN QU' },
+ [0xA705] = { unicodeslot=0xA705, category='sk', description='MODIFIER LETTER CHINESE TONE YANG QU' },
+ [0xA706] = { unicodeslot=0xA706, category='sk', description='MODIFIER LETTER CHINESE TONE YIN RU' },
+ [0xA707] = { unicodeslot=0xA707, category='sk', description='MODIFIER LETTER CHINESE TONE YANG RU' },
+ [0xA708] = { unicodeslot=0xA708, category='sk', description='MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR' },
+ [0xA709] = { unicodeslot=0xA709, category='sk', description='MODIFIER LETTER HIGH DOTTED TONE BAR' },
+ [0xA70A] = { unicodeslot=0xA70A, category='sk', description='MODIFIER LETTER MID DOTTED TONE BAR' },
+ [0xA70B] = { unicodeslot=0xA70B, category='sk', description='MODIFIER LETTER LOW DOTTED TONE BAR' },
+ [0xA70C] = { unicodeslot=0xA70C, category='sk', description='MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR' },
+ [0xA70D] = { unicodeslot=0xA70D, category='sk', description='MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR' },
+ [0xA70E] = { unicodeslot=0xA70E, category='sk', description='MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR' },
+ [0xA70F] = { unicodeslot=0xA70F, category='sk', description='MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR' },
+ [0xA710] = { unicodeslot=0xA710, category='sk', description='MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR' },
+ [0xA711] = { unicodeslot=0xA711, category='sk', description='MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR' },
+ [0xA712] = { unicodeslot=0xA712, category='sk', description='MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR' },
+ [0xA713] = { unicodeslot=0xA713, category='sk', description='MODIFIER LETTER HIGH LEFT-STEM TONE BAR' },
+ [0xA714] = { unicodeslot=0xA714, category='sk', description='MODIFIER LETTER MID LEFT-STEM TONE BAR' },
+ [0xA715] = { unicodeslot=0xA715, category='sk', description='MODIFIER LETTER LOW LEFT-STEM TONE BAR' },
+ [0xA716] = { unicodeslot=0xA716, category='sk', description='MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR' },
+ [0xA717] = { unicodeslot=0xA717, category='lm', description='MODIFIER LETTER DOT VERTICAL BAR' },
+ [0xA718] = { unicodeslot=0xA718, category='lm', description='MODIFIER LETTER DOT SLASH' },
+ [0xA719] = { unicodeslot=0xA719, category='lm', description='MODIFIER LETTER DOT HORIZONTAL BAR' },
+ [0xA71A] = { unicodeslot=0xA71A, category='lm', description='MODIFIER LETTER LOWER RIGHT CORNER ANGLE' },
+ [0xA720] = { unicodeslot=0xA720, category='sk', description='MODIFIER LETTER STRESS AND HIGH TONE' },
+ [0xA721] = { unicodeslot=0xA721, category='sk', description='MODIFIER LETTER STRESS AND LOW TONE' },
+ [0xA800] = { unicodeslot=0xA800, category='lo', description='SYLOTI NAGRI LETTER A' },
+ [0xA801] = { unicodeslot=0xA801, category='lo', description='SYLOTI NAGRI LETTER I' },
+ [0xA802] = { unicodeslot=0xA802, category='mc', description='SYLOTI NAGRI SIGN DVISVARA' },
+ [0xA803] = { unicodeslot=0xA803, category='lo', description='SYLOTI NAGRI LETTER U' },
+ [0xA804] = { unicodeslot=0xA804, category='lo', description='SYLOTI NAGRI LETTER E' },
+ [0xA805] = { unicodeslot=0xA805, category='lo', description='SYLOTI NAGRI LETTER O' },
+ [0xA806] = { unicodeslot=0xA806, category='mn', description='SYLOTI NAGRI SIGN HASANTA' },
+ [0xA807] = { unicodeslot=0xA807, category='lo', description='SYLOTI NAGRI LETTER KO' },
+ [0xA808] = { unicodeslot=0xA808, category='lo', description='SYLOTI NAGRI LETTER KHO' },
+ [0xA809] = { unicodeslot=0xA809, category='lo', description='SYLOTI NAGRI LETTER GO' },
+ [0xA80A] = { unicodeslot=0xA80A, category='lo', description='SYLOTI NAGRI LETTER GHO' },
+ [0xA80B] = { unicodeslot=0xA80B, category='mn', description='SYLOTI NAGRI SIGN ANUSVARA' },
+ [0xA80C] = { unicodeslot=0xA80C, category='lo', description='SYLOTI NAGRI LETTER CO' },
+ [0xA80D] = { unicodeslot=0xA80D, category='lo', description='SYLOTI NAGRI LETTER CHO' },
+ [0xA80E] = { unicodeslot=0xA80E, category='lo', description='SYLOTI NAGRI LETTER JO' },
+ [0xA80F] = { unicodeslot=0xA80F, category='lo', description='SYLOTI NAGRI LETTER JHO' },
+ [0xA810] = { unicodeslot=0xA810, category='lo', description='SYLOTI NAGRI LETTER TTO' },
+ [0xA811] = { unicodeslot=0xA811, category='lo', description='SYLOTI NAGRI LETTER TTHO' },
+ [0xA812] = { unicodeslot=0xA812, category='lo', description='SYLOTI NAGRI LETTER DDO' },
+ [0xA813] = { unicodeslot=0xA813, category='lo', description='SYLOTI NAGRI LETTER DDHO' },
+ [0xA814] = { unicodeslot=0xA814, category='lo', description='SYLOTI NAGRI LETTER TO' },
+ [0xA815] = { unicodeslot=0xA815, category='lo', description='SYLOTI NAGRI LETTER THO' },
+ [0xA816] = { unicodeslot=0xA816, category='lo', description='SYLOTI NAGRI LETTER DO' },
+ [0xA817] = { unicodeslot=0xA817, category='lo', description='SYLOTI NAGRI LETTER DHO' },
+ [0xA818] = { unicodeslot=0xA818, category='lo', description='SYLOTI NAGRI LETTER NO' },
+ [0xA819] = { unicodeslot=0xA819, category='lo', description='SYLOTI NAGRI LETTER PO' },
+ [0xA81A] = { unicodeslot=0xA81A, category='lo', description='SYLOTI NAGRI LETTER PHO' },
+ [0xA81B] = { unicodeslot=0xA81B, category='lo', description='SYLOTI NAGRI LETTER BO' },
+ [0xA81C] = { unicodeslot=0xA81C, category='lo', description='SYLOTI NAGRI LETTER BHO' },
+ [0xA81D] = { unicodeslot=0xA81D, category='lo', description='SYLOTI NAGRI LETTER MO' },
+ [0xA81E] = { unicodeslot=0xA81E, category='lo', description='SYLOTI NAGRI LETTER RO' },
+ [0xA81F] = { unicodeslot=0xA81F, category='lo', description='SYLOTI NAGRI LETTER LO' },
+ [0xA820] = { unicodeslot=0xA820, category='lo', description='SYLOTI NAGRI LETTER RRO' },
+ [0xA821] = { unicodeslot=0xA821, category='lo', description='SYLOTI NAGRI LETTER SO' },
+ [0xA822] = { unicodeslot=0xA822, category='lo', description='SYLOTI NAGRI LETTER HO' },
+ [0xA823] = { unicodeslot=0xA823, category='mc', description='SYLOTI NAGRI VOWEL SIGN A' },
+ [0xA824] = { unicodeslot=0xA824, category='mc', description='SYLOTI NAGRI VOWEL SIGN I' },
+ [0xA825] = { unicodeslot=0xA825, category='mn', description='SYLOTI NAGRI VOWEL SIGN U' },
+ [0xA826] = { unicodeslot=0xA826, category='mn', description='SYLOTI NAGRI VOWEL SIGN E' },
+ [0xA827] = { unicodeslot=0xA827, category='mc', description='SYLOTI NAGRI VOWEL SIGN OO' },
+ [0xA828] = { unicodeslot=0xA828, category='so', description='SYLOTI NAGRI POETRY MARK-1' },
+ [0xA829] = { unicodeslot=0xA829, category='so', description='SYLOTI NAGRI POETRY MARK-2' },
+ [0xA82A] = { unicodeslot=0xA82A, category='so', description='SYLOTI NAGRI POETRY MARK-3' },
+ [0xA82B] = { unicodeslot=0xA82B, category='so', description='SYLOTI NAGRI POETRY MARK-4' },
+ [0xA840] = { unicodeslot=0xA840, category='lo', description='PHAGS-PA LETTER KA' },
+ [0xA841] = { unicodeslot=0xA841, category='lo', description='PHAGS-PA LETTER KHA' },
+ [0xA842] = { unicodeslot=0xA842, category='lo', description='PHAGS-PA LETTER GA' },
+ [0xA843] = { unicodeslot=0xA843, category='lo', description='PHAGS-PA LETTER NGA' },
+ [0xA844] = { unicodeslot=0xA844, category='lo', description='PHAGS-PA LETTER CA' },
+ [0xA845] = { unicodeslot=0xA845, category='lo', description='PHAGS-PA LETTER CHA' },
+ [0xA846] = { unicodeslot=0xA846, category='lo', description='PHAGS-PA LETTER JA' },
+ [0xA847] = { unicodeslot=0xA847, category='lo', description='PHAGS-PA LETTER NYA' },
+ [0xA848] = { unicodeslot=0xA848, category='lo', description='PHAGS-PA LETTER TA' },
+ [0xA849] = { unicodeslot=0xA849, category='lo', description='PHAGS-PA LETTER THA' },
+ [0xA84A] = { unicodeslot=0xA84A, category='lo', description='PHAGS-PA LETTER DA' },
+ [0xA84B] = { unicodeslot=0xA84B, category='lo', description='PHAGS-PA LETTER NA' },
+ [0xA84C] = { unicodeslot=0xA84C, category='lo', description='PHAGS-PA LETTER PA' },
+ [0xA84D] = { unicodeslot=0xA84D, category='lo', description='PHAGS-PA LETTER PHA' },
+ [0xA84E] = { unicodeslot=0xA84E, category='lo', description='PHAGS-PA LETTER BA' },
+ [0xA84F] = { unicodeslot=0xA84F, category='lo', description='PHAGS-PA LETTER MA' },
+ [0xA850] = { unicodeslot=0xA850, category='lo', description='PHAGS-PA LETTER TSA' },
+ [0xA851] = { unicodeslot=0xA851, category='lo', description='PHAGS-PA LETTER TSHA' },
+ [0xA852] = { unicodeslot=0xA852, category='lo', description='PHAGS-PA LETTER DZA' },
+ [0xA853] = { unicodeslot=0xA853, category='lo', description='PHAGS-PA LETTER WA' },
+ [0xA854] = { unicodeslot=0xA854, category='lo', description='PHAGS-PA LETTER ZHA' },
+ [0xA855] = { unicodeslot=0xA855, category='lo', description='PHAGS-PA LETTER ZA' },
+ [0xA856] = { unicodeslot=0xA856, category='lo', description='PHAGS-PA LETTER SMALL A' },
+ [0xA857] = { unicodeslot=0xA857, category='lo', description='PHAGS-PA LETTER YA' },
+ [0xA858] = { unicodeslot=0xA858, category='lo', description='PHAGS-PA LETTER RA' },
+ [0xA859] = { unicodeslot=0xA859, category='lo', description='PHAGS-PA LETTER LA' },
+ [0xA85A] = { unicodeslot=0xA85A, category='lo', description='PHAGS-PA LETTER SHA' },
+ [0xA85B] = { unicodeslot=0xA85B, category='lo', description='PHAGS-PA LETTER SA' },
+ [0xA85C] = { unicodeslot=0xA85C, category='lo', description='PHAGS-PA LETTER HA' },
+ [0xA85D] = { unicodeslot=0xA85D, category='lo', description='PHAGS-PA LETTER A' },
+ [0xA85E] = { unicodeslot=0xA85E, category='lo', description='PHAGS-PA LETTER I' },
+ [0xA85F] = { unicodeslot=0xA85F, category='lo', description='PHAGS-PA LETTER U' },
+ [0xA860] = { unicodeslot=0xA860, category='lo', description='PHAGS-PA LETTER E' },
+ [0xA861] = { unicodeslot=0xA861, category='lo', description='PHAGS-PA LETTER O' },
+ [0xA862] = { unicodeslot=0xA862, category='lo', description='PHAGS-PA LETTER QA' },
+ [0xA863] = { unicodeslot=0xA863, category='lo', description='PHAGS-PA LETTER XA' },
+ [0xA864] = { unicodeslot=0xA864, category='lo', description='PHAGS-PA LETTER FA' },
+ [0xA865] = { unicodeslot=0xA865, category='lo', description='PHAGS-PA LETTER GGA' },
+ [0xA866] = { unicodeslot=0xA866, category='lo', description='PHAGS-PA LETTER EE' },
+ [0xA867] = { unicodeslot=0xA867, category='lo', description='PHAGS-PA SUBJOINED LETTER WA' },
+ [0xA868] = { unicodeslot=0xA868, category='lo', description='PHAGS-PA SUBJOINED LETTER YA' },
+ [0xA869] = { unicodeslot=0xA869, category='lo', description='PHAGS-PA LETTER TTA' },
+ [0xA86A] = { unicodeslot=0xA86A, category='lo', description='PHAGS-PA LETTER TTHA' },
+ [0xA86B] = { unicodeslot=0xA86B, category='lo', description='PHAGS-PA LETTER DDA' },
+ [0xA86C] = { unicodeslot=0xA86C, category='lo', description='PHAGS-PA LETTER NNA' },
+ [0xA86D] = { unicodeslot=0xA86D, category='lo', description='PHAGS-PA LETTER ALTERNATE YA' },
+ [0xA86E] = { unicodeslot=0xA86E, category='lo', description='PHAGS-PA LETTER VOICELESS SHA' },
+ [0xA86F] = { unicodeslot=0xA86F, category='lo', description='PHAGS-PA LETTER VOICED HA' },
+ [0xA870] = { unicodeslot=0xA870, category='lo', description='PHAGS-PA LETTER ASPIRATED FA' },
+ [0xA871] = { unicodeslot=0xA871, category='lo', description='PHAGS-PA SUBJOINED LETTER RA' },
+ [0xA872] = { unicodeslot=0xA872, category='lo', description='PHAGS-PA SUPERFIXED LETTER RA' },
+ [0xA873] = { unicodeslot=0xA873, category='lo', description='PHAGS-PA LETTER CANDRABINDU' },
+ [0xA874] = { unicodeslot=0xA874, category='po', description='PHAGS-PA SINGLE HEAD MARK' },
+ [0xA875] = { unicodeslot=0xA875, category='po', description='PHAGS-PA DOUBLE HEAD MARK' },
+ [0xA876] = { unicodeslot=0xA876, category='po', description='PHAGS-PA MARK SHAD' },
+ [0xA877] = { unicodeslot=0xA877, category='po', description='PHAGS-PA MARK DOUBLE SHAD' },
+ [0xAC00] = { unicodeslot=0xAC00, category='lo', description='<Hangul Syllable, First>' },
+ [0xD7A3] = { unicodeslot=0xD7A3, category='lo', description='<Hangul Syllable, Last>' },
+ [0xD800] = { unicodeslot=0xD800, category='cs', description='<Non Private Use High Surrogate, First>' },
+ [0xDB7F] = { unicodeslot=0xDB7F, category='cs', description='<Non Private Use High Surrogate, Last>' },
+ [0xDB80] = { unicodeslot=0xDB80, category='cs', description='<Private Use High Surrogate, First>' },
+ [0xDBFF] = { unicodeslot=0xDBFF, category='cs', description='<Private Use High Surrogate, Last>' },
+ [0xDC00] = { unicodeslot=0xDC00, category='cs', description='<Low Surrogate, First>' },
+ [0xDFFF] = { unicodeslot=0xDFFF, category='cs', description='<Low Surrogate, Last>' },
+ [0xE000] = { unicodeslot=0xE000, category='co', description='<Private Use, First>' },
+ [0xF8FF] = { unicodeslot=0xF8FF, category='co', description='<Private Use, Last>' },
+ [0xF900] = { unicodeslot=0xF900, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F900', specials={'char',0x8C48} },
+ [0xF901] = { unicodeslot=0xF901, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F901', specials={'char',0x66F4} },
+ [0xF902] = { unicodeslot=0xF902, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F902', specials={'char',0x8ECA} },
+ [0xF903] = { unicodeslot=0xF903, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F903', specials={'char',0x8CC8} },
+ [0xF904] = { unicodeslot=0xF904, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F904', specials={'char',0x6ED1} },
+ [0xF905] = { unicodeslot=0xF905, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F905', specials={'char',0x4E32} },
+ [0xF906] = { unicodeslot=0xF906, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F906', specials={'char',0x53E5} },
+ [0xF907] = { unicodeslot=0xF907, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F907', specials={'char',0x9F9C} },
+ [0xF908] = { unicodeslot=0xF908, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F908', specials={'char',0x9F9C} },
+ [0xF909] = { unicodeslot=0xF909, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F909', specials={'char',0x5951} },
+ [0xF90A] = { unicodeslot=0xF90A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90A', specials={'char',0x91D1} },
+ [0xF90B] = { unicodeslot=0xF90B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90B', specials={'char',0x5587} },
+ [0xF90C] = { unicodeslot=0xF90C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90C', specials={'char',0x5948} },
+ [0xF90D] = { unicodeslot=0xF90D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90D', specials={'char',0x61F6} },
+ [0xF90E] = { unicodeslot=0xF90E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90E', specials={'char',0x7669} },
+ [0xF90F] = { unicodeslot=0xF90F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90F', specials={'char',0x7F85} },
+ [0xF910] = { unicodeslot=0xF910, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F910', specials={'char',0x863F} },
+ [0xF911] = { unicodeslot=0xF911, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F911', specials={'char',0x87BA} },
+ [0xF912] = { unicodeslot=0xF912, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F912', specials={'char',0x88F8} },
+ [0xF913] = { unicodeslot=0xF913, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F913', specials={'char',0x908F} },
+ [0xF914] = { unicodeslot=0xF914, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F914', specials={'char',0x6A02} },
+ [0xF915] = { unicodeslot=0xF915, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F915', specials={'char',0x6D1B} },
+ [0xF916] = { unicodeslot=0xF916, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F916', specials={'char',0x70D9} },
+ [0xF917] = { unicodeslot=0xF917, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F917', specials={'char',0x73DE} },
+ [0xF918] = { unicodeslot=0xF918, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F918', specials={'char',0x843D} },
+ [0xF919] = { unicodeslot=0xF919, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F919', specials={'char',0x916A} },
+ [0xF91A] = { unicodeslot=0xF91A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91A', specials={'char',0x99F1} },
+ [0xF91B] = { unicodeslot=0xF91B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91B', specials={'char',0x4E82} },
+ [0xF91C] = { unicodeslot=0xF91C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91C', specials={'char',0x5375} },
+ [0xF91D] = { unicodeslot=0xF91D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91D', specials={'char',0x6B04} },
+ [0xF91E] = { unicodeslot=0xF91E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91E', specials={'char',0x721B} },
+ [0xF91F] = { unicodeslot=0xF91F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91F', specials={'char',0x862D} },
+ [0xF920] = { unicodeslot=0xF920, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F920', specials={'char',0x9E1E} },
+ [0xF921] = { unicodeslot=0xF921, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F921', specials={'char',0x5D50} },
+ [0xF922] = { unicodeslot=0xF922, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F922', specials={'char',0x6FEB} },
+ [0xF923] = { unicodeslot=0xF923, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F923', specials={'char',0x85CD} },
+ [0xF924] = { unicodeslot=0xF924, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F924', specials={'char',0x8964} },
+ [0xF925] = { unicodeslot=0xF925, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F925', specials={'char',0x62C9} },
+ [0xF926] = { unicodeslot=0xF926, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F926', specials={'char',0x81D8} },
+ [0xF927] = { unicodeslot=0xF927, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F927', specials={'char',0x881F} },
+ [0xF928] = { unicodeslot=0xF928, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F928', specials={'char',0x5ECA} },
+ [0xF929] = { unicodeslot=0xF929, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F929', specials={'char',0x6717} },
+ [0xF92A] = { unicodeslot=0xF92A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92A', specials={'char',0x6D6A} },
+ [0xF92B] = { unicodeslot=0xF92B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92B', specials={'char',0x72FC} },
+ [0xF92C] = { unicodeslot=0xF92C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92C', specials={'char',0x90CE} },
+ [0xF92D] = { unicodeslot=0xF92D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92D', specials={'char',0x4F86} },
+ [0xF92E] = { unicodeslot=0xF92E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92E', specials={'char',0x51B7} },
+ [0xF92F] = { unicodeslot=0xF92F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92F', specials={'char',0x52DE} },
+ [0xF930] = { unicodeslot=0xF930, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F930', specials={'char',0x64C4} },
+ [0xF931] = { unicodeslot=0xF931, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F931', specials={'char',0x6AD3} },
+ [0xF932] = { unicodeslot=0xF932, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F932', specials={'char',0x7210} },
+ [0xF933] = { unicodeslot=0xF933, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F933', specials={'char',0x76E7} },
+ [0xF934] = { unicodeslot=0xF934, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F934', specials={'char',0x8001} },
+ [0xF935] = { unicodeslot=0xF935, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F935', specials={'char',0x8606} },
+ [0xF936] = { unicodeslot=0xF936, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F936', specials={'char',0x865C} },
+ [0xF937] = { unicodeslot=0xF937, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F937', specials={'char',0x8DEF} },
+ [0xF938] = { unicodeslot=0xF938, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F938', specials={'char',0x9732} },
+ [0xF939] = { unicodeslot=0xF939, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F939', specials={'char',0x9B6F} },
+ [0xF93A] = { unicodeslot=0xF93A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93A', specials={'char',0x9DFA} },
+ [0xF93B] = { unicodeslot=0xF93B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93B', specials={'char',0x788C} },
+ [0xF93C] = { unicodeslot=0xF93C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93C', specials={'char',0x797F} },
+ [0xF93D] = { unicodeslot=0xF93D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93D', specials={'char',0x7DA0} },
+ [0xF93E] = { unicodeslot=0xF93E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93E', specials={'char',0x83C9} },
+ [0xF93F] = { unicodeslot=0xF93F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93F', specials={'char',0x9304} },
+ [0xF940] = { unicodeslot=0xF940, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F940', specials={'char',0x9E7F} },
+ [0xF941] = { unicodeslot=0xF941, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F941', specials={'char',0x8AD6} },
+ [0xF942] = { unicodeslot=0xF942, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F942', specials={'char',0x58DF} },
+ [0xF943] = { unicodeslot=0xF943, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F943', specials={'char',0x5F04} },
+ [0xF944] = { unicodeslot=0xF944, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F944', specials={'char',0x7C60} },
+ [0xF945] = { unicodeslot=0xF945, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F945', specials={'char',0x807E} },
+ [0xF946] = { unicodeslot=0xF946, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F946', specials={'char',0x7262} },
+ [0xF947] = { unicodeslot=0xF947, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F947', specials={'char',0x78CA} },
+ [0xF948] = { unicodeslot=0xF948, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F948', specials={'char',0x8CC2} },
+ [0xF949] = { unicodeslot=0xF949, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F949', specials={'char',0x96F7} },
+ [0xF94A] = { unicodeslot=0xF94A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94A', specials={'char',0x58D8} },
+ [0xF94B] = { unicodeslot=0xF94B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94B', specials={'char',0x5C62} },
+ [0xF94C] = { unicodeslot=0xF94C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94C', specials={'char',0x6A13} },
+ [0xF94D] = { unicodeslot=0xF94D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94D', specials={'char',0x6DDA} },
+ [0xF94E] = { unicodeslot=0xF94E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94E', specials={'char',0x6F0F} },
+ [0xF94F] = { unicodeslot=0xF94F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94F', specials={'char',0x7D2F} },
+ [0xF950] = { unicodeslot=0xF950, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F950', specials={'char',0x7E37} },
+ [0xF951] = { unicodeslot=0xF951, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F951', specials={'char',0x964B} },
+ [0xF952] = { unicodeslot=0xF952, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F952', specials={'char',0x52D2} },
+ [0xF953] = { unicodeslot=0xF953, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F953', specials={'char',0x808B} },
+ [0xF954] = { unicodeslot=0xF954, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F954', specials={'char',0x51DC} },
+ [0xF955] = { unicodeslot=0xF955, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F955', specials={'char',0x51CC} },
+ [0xF956] = { unicodeslot=0xF956, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F956', specials={'char',0x7A1C} },
+ [0xF957] = { unicodeslot=0xF957, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F957', specials={'char',0x7DBE} },
+ [0xF958] = { unicodeslot=0xF958, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F958', specials={'char',0x83F1} },
+ [0xF959] = { unicodeslot=0xF959, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F959', specials={'char',0x9675} },
+ [0xF95A] = { unicodeslot=0xF95A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95A', specials={'char',0x8B80} },
+ [0xF95B] = { unicodeslot=0xF95B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95B', specials={'char',0x62CF} },
+ [0xF95C] = { unicodeslot=0xF95C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95C', specials={'char',0x6A02} },
+ [0xF95D] = { unicodeslot=0xF95D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95D', specials={'char',0x8AFE} },
+ [0xF95E] = { unicodeslot=0xF95E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95E', specials={'char',0x4E39} },
+ [0xF95F] = { unicodeslot=0xF95F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95F', specials={'char',0x5BE7} },
+ [0xF960] = { unicodeslot=0xF960, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F960', specials={'char',0x6012} },
+ [0xF961] = { unicodeslot=0xF961, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F961', specials={'char',0x7387} },
+ [0xF962] = { unicodeslot=0xF962, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F962', specials={'char',0x7570} },
+ [0xF963] = { unicodeslot=0xF963, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F963', specials={'char',0x5317} },
+ [0xF964] = { unicodeslot=0xF964, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F964', specials={'char',0x78FB} },
+ [0xF965] = { unicodeslot=0xF965, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F965', specials={'char',0x4FBF} },
+ [0xF966] = { unicodeslot=0xF966, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F966', specials={'char',0x5FA9} },
+ [0xF967] = { unicodeslot=0xF967, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F967', specials={'char',0x4E0D} },
+ [0xF968] = { unicodeslot=0xF968, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F968', specials={'char',0x6CCC} },
+ [0xF969] = { unicodeslot=0xF969, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F969', specials={'char',0x6578} },
+ [0xF96A] = { unicodeslot=0xF96A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96A', specials={'char',0x7D22} },
+ [0xF96B] = { unicodeslot=0xF96B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96B', specials={'char',0x53C3} },
+ [0xF96C] = { unicodeslot=0xF96C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96C', specials={'char',0x585E} },
+ [0xF96D] = { unicodeslot=0xF96D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96D', specials={'char',0x7701} },
+ [0xF96E] = { unicodeslot=0xF96E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96E', specials={'char',0x8449} },
+ [0xF96F] = { unicodeslot=0xF96F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96F', specials={'char',0x8AAA} },
+ [0xF970] = { unicodeslot=0xF970, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F970', specials={'char',0x6BBA} },
+ [0xF971] = { unicodeslot=0xF971, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F971', specials={'char',0x8FB0} },
+ [0xF972] = { unicodeslot=0xF972, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F972', specials={'char',0x6C88} },
+ [0xF973] = { unicodeslot=0xF973, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F973', specials={'char',0x62FE} },
+ [0xF974] = { unicodeslot=0xF974, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F974', specials={'char',0x82E5} },
+ [0xF975] = { unicodeslot=0xF975, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F975', specials={'char',0x63A0} },
+ [0xF976] = { unicodeslot=0xF976, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F976', specials={'char',0x7565} },
+ [0xF977] = { unicodeslot=0xF977, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F977', specials={'char',0x4EAE} },
+ [0xF978] = { unicodeslot=0xF978, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F978', specials={'char',0x5169} },
+ [0xF979] = { unicodeslot=0xF979, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F979', specials={'char',0x51C9} },
+ [0xF97A] = { unicodeslot=0xF97A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97A', specials={'char',0x6881} },
+ [0xF97B] = { unicodeslot=0xF97B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97B', specials={'char',0x7CE7} },
+ [0xF97C] = { unicodeslot=0xF97C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97C', specials={'char',0x826F} },
+ [0xF97D] = { unicodeslot=0xF97D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97D', specials={'char',0x8AD2} },
+ [0xF97E] = { unicodeslot=0xF97E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97E', specials={'char',0x91CF} },
+ [0xF97F] = { unicodeslot=0xF97F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97F', specials={'char',0x52F5} },
+ [0xF980] = { unicodeslot=0xF980, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F980', specials={'char',0x5442} },
+ [0xF981] = { unicodeslot=0xF981, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F981', specials={'char',0x5973} },
+ [0xF982] = { unicodeslot=0xF982, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F982', specials={'char',0x5EEC} },
+ [0xF983] = { unicodeslot=0xF983, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F983', specials={'char',0x65C5} },
+ [0xF984] = { unicodeslot=0xF984, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F984', specials={'char',0x6FFE} },
+ [0xF985] = { unicodeslot=0xF985, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F985', specials={'char',0x792A} },
+ [0xF986] = { unicodeslot=0xF986, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F986', specials={'char',0x95AD} },
+ [0xF987] = { unicodeslot=0xF987, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F987', specials={'char',0x9A6A} },
+ [0xF988] = { unicodeslot=0xF988, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F988', specials={'char',0x9E97} },
+ [0xF989] = { unicodeslot=0xF989, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F989', specials={'char',0x9ECE} },
+ [0xF98A] = { unicodeslot=0xF98A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98A', specials={'char',0x529B} },
+ [0xF98B] = { unicodeslot=0xF98B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98B', specials={'char',0x66C6} },
+ [0xF98C] = { unicodeslot=0xF98C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98C', specials={'char',0x6B77} },
+ [0xF98D] = { unicodeslot=0xF98D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98D', specials={'char',0x8F62} },
+ [0xF98E] = { unicodeslot=0xF98E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98E', specials={'char',0x5E74} },
+ [0xF98F] = { unicodeslot=0xF98F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98F', specials={'char',0x6190} },
+ [0xF990] = { unicodeslot=0xF990, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F990', specials={'char',0x6200} },
+ [0xF991] = { unicodeslot=0xF991, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F991', specials={'char',0x649A} },
+ [0xF992] = { unicodeslot=0xF992, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F992', specials={'char',0x6F23} },
+ [0xF993] = { unicodeslot=0xF993, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F993', specials={'char',0x7149} },
+ [0xF994] = { unicodeslot=0xF994, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F994', specials={'char',0x7489} },
+ [0xF995] = { unicodeslot=0xF995, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F995', specials={'char',0x79CA} },
+ [0xF996] = { unicodeslot=0xF996, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F996', specials={'char',0x7DF4} },
+ [0xF997] = { unicodeslot=0xF997, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F997', specials={'char',0x806F} },
+ [0xF998] = { unicodeslot=0xF998, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F998', specials={'char',0x8F26} },
+ [0xF999] = { unicodeslot=0xF999, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F999', specials={'char',0x84EE} },
+ [0xF99A] = { unicodeslot=0xF99A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99A', specials={'char',0x9023} },
+ [0xF99B] = { unicodeslot=0xF99B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99B', specials={'char',0x934A} },
+ [0xF99C] = { unicodeslot=0xF99C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99C', specials={'char',0x5217} },
+ [0xF99D] = { unicodeslot=0xF99D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99D', specials={'char',0x52A3} },
+ [0xF99E] = { unicodeslot=0xF99E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99E', specials={'char',0x54BD} },
+ [0xF99F] = { unicodeslot=0xF99F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99F', specials={'char',0x70C8} },
+ [0xF9A0] = { unicodeslot=0xF9A0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A0', specials={'char',0x88C2} },
+ [0xF9A1] = { unicodeslot=0xF9A1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A1', specials={'char',0x8AAA} },
+ [0xF9A2] = { unicodeslot=0xF9A2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A2', specials={'char',0x5EC9} },
+ [0xF9A3] = { unicodeslot=0xF9A3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A3', specials={'char',0x5FF5} },
+ [0xF9A4] = { unicodeslot=0xF9A4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A4', specials={'char',0x637B} },
+ [0xF9A5] = { unicodeslot=0xF9A5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A5', specials={'char',0x6BAE} },
+ [0xF9A6] = { unicodeslot=0xF9A6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A6', specials={'char',0x7C3E} },
+ [0xF9A7] = { unicodeslot=0xF9A7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A7', specials={'char',0x7375} },
+ [0xF9A8] = { unicodeslot=0xF9A8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A8', specials={'char',0x4EE4} },
+ [0xF9A9] = { unicodeslot=0xF9A9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A9', specials={'char',0x56F9} },
+ [0xF9AA] = { unicodeslot=0xF9AA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AA', specials={'char',0x5BE7} },
+ [0xF9AB] = { unicodeslot=0xF9AB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AB', specials={'char',0x5DBA} },
+ [0xF9AC] = { unicodeslot=0xF9AC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AC', specials={'char',0x601C} },
+ [0xF9AD] = { unicodeslot=0xF9AD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AD', specials={'char',0x73B2} },
+ [0xF9AE] = { unicodeslot=0xF9AE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AE', specials={'char',0x7469} },
+ [0xF9AF] = { unicodeslot=0xF9AF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AF', specials={'char',0x7F9A} },
+ [0xF9B0] = { unicodeslot=0xF9B0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B0', specials={'char',0x8046} },
+ [0xF9B1] = { unicodeslot=0xF9B1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B1', specials={'char',0x9234} },
+ [0xF9B2] = { unicodeslot=0xF9B2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B2', specials={'char',0x96F6} },
+ [0xF9B3] = { unicodeslot=0xF9B3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B3', specials={'char',0x9748} },
+ [0xF9B4] = { unicodeslot=0xF9B4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B4', specials={'char',0x9818} },
+ [0xF9B5] = { unicodeslot=0xF9B5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B5', specials={'char',0x4F8B} },
+ [0xF9B6] = { unicodeslot=0xF9B6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B6', specials={'char',0x79AE} },
+ [0xF9B7] = { unicodeslot=0xF9B7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B7', specials={'char',0x91B4} },
+ [0xF9B8] = { unicodeslot=0xF9B8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B8', specials={'char',0x96B8} },
+ [0xF9B9] = { unicodeslot=0xF9B9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B9', specials={'char',0x60E1} },
+ [0xF9BA] = { unicodeslot=0xF9BA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BA', specials={'char',0x4E86} },
+ [0xF9BB] = { unicodeslot=0xF9BB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BB', specials={'char',0x50DA} },
+ [0xF9BC] = { unicodeslot=0xF9BC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BC', specials={'char',0x5BEE} },
+ [0xF9BD] = { unicodeslot=0xF9BD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BD', specials={'char',0x5C3F} },
+ [0xF9BE] = { unicodeslot=0xF9BE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BE', specials={'char',0x6599} },
+ [0xF9BF] = { unicodeslot=0xF9BF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BF', specials={'char',0x6A02} },
+ [0xF9C0] = { unicodeslot=0xF9C0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C0', specials={'char',0x71CE} },
+ [0xF9C1] = { unicodeslot=0xF9C1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C1', specials={'char',0x7642} },
+ [0xF9C2] = { unicodeslot=0xF9C2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C2', specials={'char',0x84FC} },
+ [0xF9C3] = { unicodeslot=0xF9C3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C3', specials={'char',0x907C} },
+ [0xF9C4] = { unicodeslot=0xF9C4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C4', specials={'char',0x9F8D} },
+ [0xF9C5] = { unicodeslot=0xF9C5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C5', specials={'char',0x6688} },
+ [0xF9C6] = { unicodeslot=0xF9C6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C6', specials={'char',0x962E} },
+ [0xF9C7] = { unicodeslot=0xF9C7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C7', specials={'char',0x5289} },
+ [0xF9C8] = { unicodeslot=0xF9C8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C8', specials={'char',0x677B} },
+ [0xF9C9] = { unicodeslot=0xF9C9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C9', specials={'char',0x67F3} },
+ [0xF9CA] = { unicodeslot=0xF9CA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CA', specials={'char',0x6D41} },
+ [0xF9CB] = { unicodeslot=0xF9CB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CB', specials={'char',0x6E9C} },
+ [0xF9CC] = { unicodeslot=0xF9CC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CC', specials={'char',0x7409} },
+ [0xF9CD] = { unicodeslot=0xF9CD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CD', specials={'char',0x7559} },
+ [0xF9CE] = { unicodeslot=0xF9CE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CE', specials={'char',0x786B} },
+ [0xF9CF] = { unicodeslot=0xF9CF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CF', specials={'char',0x7D10} },
+ [0xF9D0] = { unicodeslot=0xF9D0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D0', specials={'char',0x985E} },
+ [0xF9D1] = { unicodeslot=0xF9D1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D1', specials={'char',0x516D} },
+ [0xF9D2] = { unicodeslot=0xF9D2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D2', specials={'char',0x622E} },
+ [0xF9D3] = { unicodeslot=0xF9D3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D3', specials={'char',0x9678} },
+ [0xF9D4] = { unicodeslot=0xF9D4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D4', specials={'char',0x502B} },
+ [0xF9D5] = { unicodeslot=0xF9D5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D5', specials={'char',0x5D19} },
+ [0xF9D6] = { unicodeslot=0xF9D6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D6', specials={'char',0x6DEA} },
+ [0xF9D7] = { unicodeslot=0xF9D7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D7', specials={'char',0x8F2A} },
+ [0xF9D8] = { unicodeslot=0xF9D8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D8', specials={'char',0x5F8B} },
+ [0xF9D9] = { unicodeslot=0xF9D9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D9', specials={'char',0x6144} },
+ [0xF9DA] = { unicodeslot=0xF9DA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DA', specials={'char',0x6817} },
+ [0xF9DB] = { unicodeslot=0xF9DB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DB', specials={'char',0x7387} },
+ [0xF9DC] = { unicodeslot=0xF9DC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DC', specials={'char',0x9686} },
+ [0xF9DD] = { unicodeslot=0xF9DD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DD', specials={'char',0x5229} },
+ [0xF9DE] = { unicodeslot=0xF9DE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DE', specials={'char',0x540F} },
+ [0xF9DF] = { unicodeslot=0xF9DF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DF', specials={'char',0x5C65} },
+ [0xF9E0] = { unicodeslot=0xF9E0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E0', specials={'char',0x6613} },
+ [0xF9E1] = { unicodeslot=0xF9E1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E1', specials={'char',0x674E} },
+ [0xF9E2] = { unicodeslot=0xF9E2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E2', specials={'char',0x68A8} },
+ [0xF9E3] = { unicodeslot=0xF9E3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E3', specials={'char',0x6CE5} },
+ [0xF9E4] = { unicodeslot=0xF9E4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E4', specials={'char',0x7406} },
+ [0xF9E5] = { unicodeslot=0xF9E5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E5', specials={'char',0x75E2} },
+ [0xF9E6] = { unicodeslot=0xF9E6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E6', specials={'char',0x7F79} },
+ [0xF9E7] = { unicodeslot=0xF9E7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E7', specials={'char',0x88CF} },
+ [0xF9E8] = { unicodeslot=0xF9E8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E8', specials={'char',0x88E1} },
+ [0xF9E9] = { unicodeslot=0xF9E9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E9', specials={'char',0x91CC} },
+ [0xF9EA] = { unicodeslot=0xF9EA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EA', specials={'char',0x96E2} },
+ [0xF9EB] = { unicodeslot=0xF9EB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EB', specials={'char',0x533F} },
+ [0xF9EC] = { unicodeslot=0xF9EC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EC', specials={'char',0x6EBA} },
+ [0xF9ED] = { unicodeslot=0xF9ED, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9ED', specials={'char',0x541D} },
+ [0xF9EE] = { unicodeslot=0xF9EE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EE', specials={'char',0x71D0} },
+ [0xF9EF] = { unicodeslot=0xF9EF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EF', specials={'char',0x7498} },
+ [0xF9F0] = { unicodeslot=0xF9F0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F0', specials={'char',0x85FA} },
+ [0xF9F1] = { unicodeslot=0xF9F1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F1', specials={'char',0x96A3} },
+ [0xF9F2] = { unicodeslot=0xF9F2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F2', specials={'char',0x9C57} },
+ [0xF9F3] = { unicodeslot=0xF9F3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F3', specials={'char',0x9E9F} },
+ [0xF9F4] = { unicodeslot=0xF9F4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F4', specials={'char',0x6797} },
+ [0xF9F5] = { unicodeslot=0xF9F5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F5', specials={'char',0x6DCB} },
+ [0xF9F6] = { unicodeslot=0xF9F6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F6', specials={'char',0x81E8} },
+ [0xF9F7] = { unicodeslot=0xF9F7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F7', specials={'char',0x7ACB} },
+ [0xF9F8] = { unicodeslot=0xF9F8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F8', specials={'char',0x7B20} },
+ [0xF9F9] = { unicodeslot=0xF9F9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F9', specials={'char',0x7C92} },
+ [0xF9FA] = { unicodeslot=0xF9FA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FA', specials={'char',0x72C0} },
+ [0xF9FB] = { unicodeslot=0xF9FB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FB', specials={'char',0x7099} },
+ [0xF9FC] = { unicodeslot=0xF9FC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FC', specials={'char',0x8B58} },
+ [0xF9FD] = { unicodeslot=0xF9FD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FD', specials={'char',0x4EC0} },
+ [0xF9FE] = { unicodeslot=0xF9FE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FE', specials={'char',0x8336} },
+ [0xF9FF] = { unicodeslot=0xF9FF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FF', specials={'char',0x523A} },
+ [0xFA00] = { unicodeslot=0xFA00, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA00', specials={'char',0x5207} },
+ [0xFA01] = { unicodeslot=0xFA01, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA01', specials={'char',0x5EA6} },
+ [0xFA02] = { unicodeslot=0xFA02, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA02', specials={'char',0x62D3} },
+ [0xFA03] = { unicodeslot=0xFA03, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA03', specials={'char',0x7CD6} },
+ [0xFA04] = { unicodeslot=0xFA04, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA04', specials={'char',0x5B85} },
+ [0xFA05] = { unicodeslot=0xFA05, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA05', specials={'char',0x6D1E} },
+ [0xFA06] = { unicodeslot=0xFA06, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA06', specials={'char',0x66B4} },
+ [0xFA07] = { unicodeslot=0xFA07, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA07', specials={'char',0x8F3B} },
+ [0xFA08] = { unicodeslot=0xFA08, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA08', specials={'char',0x884C} },
+ [0xFA09] = { unicodeslot=0xFA09, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA09', specials={'char',0x964D} },
+ [0xFA0A] = { unicodeslot=0xFA0A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0A', specials={'char',0x898B} },
+ [0xFA0B] = { unicodeslot=0xFA0B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0B', specials={'char',0x5ED3} },
+ [0xFA0C] = { unicodeslot=0xFA0C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0C', specials={'char',0x5140} },
+ [0xFA0D] = { unicodeslot=0xFA0D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0D', specials={'char',0x55C0} },
+ [0xFA0E] = { unicodeslot=0xFA0E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0E' },
+ [0xFA0F] = { unicodeslot=0xFA0F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0F' },
+ [0xFA10] = { unicodeslot=0xFA10, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA10', specials={'char',0x585A} },
+ [0xFA11] = { unicodeslot=0xFA11, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA11' },
+ [0xFA12] = { unicodeslot=0xFA12, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA12', specials={'char',0x6674} },
+ [0xFA13] = { unicodeslot=0xFA13, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA13' },
+ [0xFA14] = { unicodeslot=0xFA14, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA14' },
+ [0xFA15] = { unicodeslot=0xFA15, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA15', specials={'char',0x51DE} },
+ [0xFA16] = { unicodeslot=0xFA16, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA16', specials={'char',0x732A} },
+ [0xFA17] = { unicodeslot=0xFA17, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA17', specials={'char',0x76CA} },
+ [0xFA18] = { unicodeslot=0xFA18, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA18', specials={'char',0x793C} },
+ [0xFA19] = { unicodeslot=0xFA19, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA19', specials={'char',0x795E} },
+ [0xFA1A] = { unicodeslot=0xFA1A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1A', specials={'char',0x7965} },
+ [0xFA1B] = { unicodeslot=0xFA1B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1B', specials={'char',0x798F} },
+ [0xFA1C] = { unicodeslot=0xFA1C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1C', specials={'char',0x9756} },
+ [0xFA1D] = { unicodeslot=0xFA1D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1D', specials={'char',0x7CBE} },
+ [0xFA1E] = { unicodeslot=0xFA1E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1E', specials={'char',0x7FBD} },
+ [0xFA1F] = { unicodeslot=0xFA1F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1F' },
+ [0xFA20] = { unicodeslot=0xFA20, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA20', specials={'char',0x8612} },
+ [0xFA21] = { unicodeslot=0xFA21, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA21' },
+ [0xFA22] = { unicodeslot=0xFA22, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA22', specials={'char',0x8AF8} },
+ [0xFA23] = { unicodeslot=0xFA23, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA23' },
+ [0xFA24] = { unicodeslot=0xFA24, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA24' },
+ [0xFA25] = { unicodeslot=0xFA25, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA25', specials={'char',0x9038} },
+ [0xFA26] = { unicodeslot=0xFA26, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA26', specials={'char',0x90FD} },
+ [0xFA27] = { unicodeslot=0xFA27, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA27' },
+ [0xFA28] = { unicodeslot=0xFA28, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA28' },
+ [0xFA29] = { unicodeslot=0xFA29, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA29' },
+ [0xFA2A] = { unicodeslot=0xFA2A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2A', specials={'char',0x98EF} },
+ [0xFA2B] = { unicodeslot=0xFA2B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2B', specials={'char',0x98FC} },
+ [0xFA2C] = { unicodeslot=0xFA2C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2C', specials={'char',0x9928} },
+ [0xFA2D] = { unicodeslot=0xFA2D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2D', specials={'char',0x9DB4} },
+ [0xFA30] = { unicodeslot=0xFA30, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA30', specials={'char',0x4FAE} },
+ [0xFA31] = { unicodeslot=0xFA31, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA31', specials={'char',0x50E7} },
+ [0xFA32] = { unicodeslot=0xFA32, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA32', specials={'char',0x514D} },
+ [0xFA33] = { unicodeslot=0xFA33, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA33', specials={'char',0x52C9} },
+ [0xFA34] = { unicodeslot=0xFA34, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA34', specials={'char',0x52E4} },
+ [0xFA35] = { unicodeslot=0xFA35, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA35', specials={'char',0x5351} },
+ [0xFA36] = { unicodeslot=0xFA36, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA36', specials={'char',0x559D} },
+ [0xFA37] = { unicodeslot=0xFA37, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA37', specials={'char',0x5606} },
+ [0xFA38] = { unicodeslot=0xFA38, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA38', specials={'char',0x5668} },
+ [0xFA39] = { unicodeslot=0xFA39, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA39', specials={'char',0x5840} },
+ [0xFA3A] = { unicodeslot=0xFA3A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3A', specials={'char',0x58A8} },
+ [0xFA3B] = { unicodeslot=0xFA3B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3B', specials={'char',0x5C64} },
+ [0xFA3C] = { unicodeslot=0xFA3C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3C', specials={'char',0x5C6E} },
+ [0xFA3D] = { unicodeslot=0xFA3D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3D', specials={'char',0x6094} },
+ [0xFA3E] = { unicodeslot=0xFA3E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3E', specials={'char',0x6168} },
+ [0xFA3F] = { unicodeslot=0xFA3F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3F', specials={'char',0x618E} },
+ [0xFA40] = { unicodeslot=0xFA40, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA40', specials={'char',0x61F2} },
+ [0xFA41] = { unicodeslot=0xFA41, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA41', specials={'char',0x654F} },
+ [0xFA42] = { unicodeslot=0xFA42, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA42', specials={'char',0x65E2} },
+ [0xFA43] = { unicodeslot=0xFA43, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA43', specials={'char',0x6691} },
+ [0xFA44] = { unicodeslot=0xFA44, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA44', specials={'char',0x6885} },
+ [0xFA45] = { unicodeslot=0xFA45, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA45', specials={'char',0x6D77} },
+ [0xFA46] = { unicodeslot=0xFA46, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA46', specials={'char',0x6E1A} },
+ [0xFA47] = { unicodeslot=0xFA47, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA47', specials={'char',0x6F22} },
+ [0xFA48] = { unicodeslot=0xFA48, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA48', specials={'char',0x716E} },
+ [0xFA49] = { unicodeslot=0xFA49, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA49', specials={'char',0x722B} },
+ [0xFA4A] = { unicodeslot=0xFA4A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4A', specials={'char',0x7422} },
+ [0xFA4B] = { unicodeslot=0xFA4B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4B', specials={'char',0x7891} },
+ [0xFA4C] = { unicodeslot=0xFA4C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4C', specials={'char',0x793E} },
+ [0xFA4D] = { unicodeslot=0xFA4D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4D', specials={'char',0x7949} },
+ [0xFA4E] = { unicodeslot=0xFA4E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4E', specials={'char',0x7948} },
+ [0xFA4F] = { unicodeslot=0xFA4F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4F', specials={'char',0x7950} },
+ [0xFA50] = { unicodeslot=0xFA50, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA50', specials={'char',0x7956} },
+ [0xFA51] = { unicodeslot=0xFA51, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA51', specials={'char',0x795D} },
+ [0xFA52] = { unicodeslot=0xFA52, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA52', specials={'char',0x798D} },
+ [0xFA53] = { unicodeslot=0xFA53, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA53', specials={'char',0x798E} },
+ [0xFA54] = { unicodeslot=0xFA54, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA54', specials={'char',0x7A40} },
+ [0xFA55] = { unicodeslot=0xFA55, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA55', specials={'char',0x7A81} },
+ [0xFA56] = { unicodeslot=0xFA56, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA56', specials={'char',0x7BC0} },
+ [0xFA57] = { unicodeslot=0xFA57, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA57', specials={'char',0x7DF4} },
+ [0xFA58] = { unicodeslot=0xFA58, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA58', specials={'char',0x7E09} },
+ [0xFA59] = { unicodeslot=0xFA59, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA59', specials={'char',0x7E41} },
+ [0xFA5A] = { unicodeslot=0xFA5A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5A', specials={'char',0x7F72} },
+ [0xFA5B] = { unicodeslot=0xFA5B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5B', specials={'char',0x8005} },
+ [0xFA5C] = { unicodeslot=0xFA5C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5C', specials={'char',0x81ED} },
+ [0xFA5D] = { unicodeslot=0xFA5D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5D', specials={'char',0x8279} },
+ [0xFA5E] = { unicodeslot=0xFA5E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5E', specials={'char',0x8279} },
+ [0xFA5F] = { unicodeslot=0xFA5F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5F', specials={'char',0x8457} },
+ [0xFA60] = { unicodeslot=0xFA60, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA60', specials={'char',0x8910} },
+ [0xFA61] = { unicodeslot=0xFA61, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA61', specials={'char',0x8996} },
+ [0xFA62] = { unicodeslot=0xFA62, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA62', specials={'char',0x8B01} },
+ [0xFA63] = { unicodeslot=0xFA63, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA63', specials={'char',0x8B39} },
+ [0xFA64] = { unicodeslot=0xFA64, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA64', specials={'char',0x8CD3} },
+ [0xFA65] = { unicodeslot=0xFA65, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA65', specials={'char',0x8D08} },
+ [0xFA66] = { unicodeslot=0xFA66, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA66', specials={'char',0x8FB6} },
+ [0xFA67] = { unicodeslot=0xFA67, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA67', specials={'char',0x9038} },
+ [0xFA68] = { unicodeslot=0xFA68, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA68', specials={'char',0x96E3} },
+ [0xFA69] = { unicodeslot=0xFA69, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA69', specials={'char',0x97FF} },
+ [0xFA6A] = { unicodeslot=0xFA6A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA6A', specials={'char',0x983B} },
+ [0xFA70] = { unicodeslot=0xFA70, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA70', specials={'char',0x4E26} },
+ [0xFA71] = { unicodeslot=0xFA71, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA71', specials={'char',0x51B5} },
+ [0xFA72] = { unicodeslot=0xFA72, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA72', specials={'char',0x5168} },
+ [0xFA73] = { unicodeslot=0xFA73, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA73', specials={'char',0x4F80} },
+ [0xFA74] = { unicodeslot=0xFA74, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA74', specials={'char',0x5145} },
+ [0xFA75] = { unicodeslot=0xFA75, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA75', specials={'char',0x5180} },
+ [0xFA76] = { unicodeslot=0xFA76, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA76', specials={'char',0x52C7} },
+ [0xFA77] = { unicodeslot=0xFA77, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA77', specials={'char',0x52FA} },
+ [0xFA78] = { unicodeslot=0xFA78, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA78', specials={'char',0x559D} },
+ [0xFA79] = { unicodeslot=0xFA79, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA79', specials={'char',0x5555} },
+ [0xFA7A] = { unicodeslot=0xFA7A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7A', specials={'char',0x5599} },
+ [0xFA7B] = { unicodeslot=0xFA7B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7B', specials={'char',0x55E2} },
+ [0xFA7C] = { unicodeslot=0xFA7C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7C', specials={'char',0x585A} },
+ [0xFA7D] = { unicodeslot=0xFA7D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7D', specials={'char',0x58B3} },
+ [0xFA7E] = { unicodeslot=0xFA7E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7E', specials={'char',0x5944} },
+ [0xFA7F] = { unicodeslot=0xFA7F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7F', specials={'char',0x5954} },
+ [0xFA80] = { unicodeslot=0xFA80, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA80', specials={'char',0x5A62} },
+ [0xFA81] = { unicodeslot=0xFA81, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA81', specials={'char',0x5B28} },
+ [0xFA82] = { unicodeslot=0xFA82, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA82', specials={'char',0x5ED2} },
+ [0xFA83] = { unicodeslot=0xFA83, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA83', specials={'char',0x5ED9} },
+ [0xFA84] = { unicodeslot=0xFA84, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA84', specials={'char',0x5F69} },
+ [0xFA85] = { unicodeslot=0xFA85, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA85', specials={'char',0x5FAD} },
+ [0xFA86] = { unicodeslot=0xFA86, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA86', specials={'char',0x60D8} },
+ [0xFA87] = { unicodeslot=0xFA87, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA87', specials={'char',0x614E} },
+ [0xFA88] = { unicodeslot=0xFA88, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA88', specials={'char',0x6108} },
+ [0xFA89] = { unicodeslot=0xFA89, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA89', specials={'char',0x618E} },
+ [0xFA8A] = { unicodeslot=0xFA8A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8A', specials={'char',0x6160} },
+ [0xFA8B] = { unicodeslot=0xFA8B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8B', specials={'char',0x61F2} },
+ [0xFA8C] = { unicodeslot=0xFA8C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8C', specials={'char',0x6234} },
+ [0xFA8D] = { unicodeslot=0xFA8D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8D', specials={'char',0x63C4} },
+ [0xFA8E] = { unicodeslot=0xFA8E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8E', specials={'char',0x641C} },
+ [0xFA8F] = { unicodeslot=0xFA8F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8F', specials={'char',0x6452} },
+ [0xFA90] = { unicodeslot=0xFA90, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA90', specials={'char',0x6556} },
+ [0xFA91] = { unicodeslot=0xFA91, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA91', specials={'char',0x6674} },
+ [0xFA92] = { unicodeslot=0xFA92, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA92', specials={'char',0x6717} },
+ [0xFA93] = { unicodeslot=0xFA93, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA93', specials={'char',0x671B} },
+ [0xFA94] = { unicodeslot=0xFA94, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA94', specials={'char',0x6756} },
+ [0xFA95] = { unicodeslot=0xFA95, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA95', specials={'char',0x6B79} },
+ [0xFA96] = { unicodeslot=0xFA96, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA96', specials={'char',0x6BBA} },
+ [0xFA97] = { unicodeslot=0xFA97, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA97', specials={'char',0x6D41} },
+ [0xFA98] = { unicodeslot=0xFA98, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA98', specials={'char',0x6EDB} },
+ [0xFA99] = { unicodeslot=0xFA99, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA99', specials={'char',0x6ECB} },
+ [0xFA9A] = { unicodeslot=0xFA9A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9A', specials={'char',0x6F22} },
+ [0xFA9B] = { unicodeslot=0xFA9B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9B', specials={'char',0x701E} },
+ [0xFA9C] = { unicodeslot=0xFA9C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9C', specials={'char',0x716E} },
+ [0xFA9D] = { unicodeslot=0xFA9D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9D', specials={'char',0x77A7} },
+ [0xFA9E] = { unicodeslot=0xFA9E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9E', specials={'char',0x7235} },
+ [0xFA9F] = { unicodeslot=0xFA9F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9F', specials={'char',0x72AF} },
+ [0xFAA0] = { unicodeslot=0xFAA0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA0', specials={'char',0x732A} },
+ [0xFAA1] = { unicodeslot=0xFAA1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA1', specials={'char',0x7471} },
+ [0xFAA2] = { unicodeslot=0xFAA2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA2', specials={'char',0x7506} },
+ [0xFAA3] = { unicodeslot=0xFAA3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA3', specials={'char',0x753B} },
+ [0xFAA4] = { unicodeslot=0xFAA4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA4', specials={'char',0x761D} },
+ [0xFAA5] = { unicodeslot=0xFAA5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA5', specials={'char',0x761F} },
+ [0xFAA6] = { unicodeslot=0xFAA6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA6', specials={'char',0x76CA} },
+ [0xFAA7] = { unicodeslot=0xFAA7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA7', specials={'char',0x76DB} },
+ [0xFAA8] = { unicodeslot=0xFAA8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA8', specials={'char',0x76F4} },
+ [0xFAA9] = { unicodeslot=0xFAA9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA9', specials={'char',0x774A} },
+ [0xFAAA] = { unicodeslot=0xFAAA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAA', specials={'char',0x7740} },
+ [0xFAAB] = { unicodeslot=0xFAAB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAB', specials={'char',0x78CC} },
+ [0xFAAC] = { unicodeslot=0xFAAC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAC', specials={'char',0x7AB1} },
+ [0xFAAD] = { unicodeslot=0xFAAD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAD', specials={'char',0x7BC0} },
+ [0xFAAE] = { unicodeslot=0xFAAE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAE', specials={'char',0x7C7B} },
+ [0xFAAF] = { unicodeslot=0xFAAF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAF', specials={'char',0x7D5B} },
+ [0xFAB0] = { unicodeslot=0xFAB0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB0', specials={'char',0x7DF4} },
+ [0xFAB1] = { unicodeslot=0xFAB1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB1', specials={'char',0x7F3E} },
+ [0xFAB2] = { unicodeslot=0xFAB2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB2', specials={'char',0x8005} },
+ [0xFAB3] = { unicodeslot=0xFAB3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB3', specials={'char',0x8352} },
+ [0xFAB4] = { unicodeslot=0xFAB4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB4', specials={'char',0x83EF} },
+ [0xFAB5] = { unicodeslot=0xFAB5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB5', specials={'char',0x8779} },
+ [0xFAB6] = { unicodeslot=0xFAB6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB6', specials={'char',0x8941} },
+ [0xFAB7] = { unicodeslot=0xFAB7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB7', specials={'char',0x8986} },
+ [0xFAB8] = { unicodeslot=0xFAB8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB8', specials={'char',0x8996} },
+ [0xFAB9] = { unicodeslot=0xFAB9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB9', specials={'char',0x8ABF} },
+ [0xFABA] = { unicodeslot=0xFABA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABA', specials={'char',0x8AF8} },
+ [0xFABB] = { unicodeslot=0xFABB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABB', specials={'char',0x8ACB} },
+ [0xFABC] = { unicodeslot=0xFABC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABC', specials={'char',0x8B01} },
+ [0xFABD] = { unicodeslot=0xFABD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABD', specials={'char',0x8AFE} },
+ [0xFABE] = { unicodeslot=0xFABE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABE', specials={'char',0x8AED} },
+ [0xFABF] = { unicodeslot=0xFABF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABF', specials={'char',0x8B39} },
+ [0xFAC0] = { unicodeslot=0xFAC0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC0', specials={'char',0x8B8A} },
+ [0xFAC1] = { unicodeslot=0xFAC1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC1', specials={'char',0x8D08} },
+ [0xFAC2] = { unicodeslot=0xFAC2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC2', specials={'char',0x8F38} },
+ [0xFAC3] = { unicodeslot=0xFAC3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC3', specials={'char',0x9072} },
+ [0xFAC4] = { unicodeslot=0xFAC4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC4', specials={'char',0x9199} },
+ [0xFAC5] = { unicodeslot=0xFAC5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC5', specials={'char',0x9276} },
+ [0xFAC6] = { unicodeslot=0xFAC6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC6', specials={'char',0x967C} },
+ [0xFAC7] = { unicodeslot=0xFAC7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC7', specials={'char',0x96E3} },
+ [0xFAC8] = { unicodeslot=0xFAC8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC8', specials={'char',0x9756} },
+ [0xFAC9] = { unicodeslot=0xFAC9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC9', specials={'char',0x97DB} },
+ [0xFACA] = { unicodeslot=0xFACA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACA', specials={'char',0x97FF} },
+ [0xFACB] = { unicodeslot=0xFACB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACB', specials={'char',0x980B} },
+ [0xFACC] = { unicodeslot=0xFACC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACC', specials={'char',0x983B} },
+ [0xFACD] = { unicodeslot=0xFACD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACD', specials={'char',0x9B12} },
+ [0xFACE] = { unicodeslot=0xFACE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACE', specials={'char',0x9F9C} },
+ [0xFACF] = { unicodeslot=0xFACF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACF', specials={'char',0x2284A} },
+ [0xFAD0] = { unicodeslot=0xFAD0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD0', specials={'char',0x22844} },
+ [0xFAD1] = { unicodeslot=0xFAD1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD1', specials={'char',0x233D5} },
+ [0xFAD2] = { unicodeslot=0xFAD2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD2', specials={'char',0x3B9D} },
+ [0xFAD3] = { unicodeslot=0xFAD3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD3', specials={'char',0x4018} },
+ [0xFAD4] = { unicodeslot=0xFAD4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD4', specials={'char',0x4039} },
+ [0xFAD5] = { unicodeslot=0xFAD5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD5', specials={'char',0x25249} },
+ [0xFAD6] = { unicodeslot=0xFAD6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD6', specials={'char',0x25CD0} },
+ [0xFAD7] = { unicodeslot=0xFAD7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD7', specials={'char',0x27ED3} },
+ [0xFAD8] = { unicodeslot=0xFAD8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD8', specials={'char',0x9F43} },
+ [0xFAD9] = { unicodeslot=0xFAD9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD9', specials={'char',0x9F8E} },
+ [0xFB00] = { unicodeslot=0xFB00, category='ll', contextname='ffligature', description='LATIN SMALL LIGATURE FF', specials={'compat',0x0066,0x0066} },
+ [0xFB01] = { unicodeslot=0xFB01, category='ll', contextname='filigature', description='LATIN SMALL LIGATURE FI', specials={'compat',0x0066,0x0069} },
+ [0xFB02] = { unicodeslot=0xFB02, category='ll', contextname='flligature', description='LATIN SMALL LIGATURE FL', specials={'compat',0x0066,0x006C} },
+ [0xFB03] = { unicodeslot=0xFB03, category='ll', contextname='ffiligature', description='LATIN SMALL LIGATURE FFI', specials={'compat',0x0066,0x0066,0x0069} },
+ [0xFB04] = { unicodeslot=0xFB04, category='ll', contextname='fflligature', description='LATIN SMALL LIGATURE FFL', specials={'compat',0x0066,0x0066,0x006C} },
+ [0xFB05] = { unicodeslot=0xFB05, category='ll', description='LATIN SMALL LIGATURE LONG S T', specials={'compat',0x017F,0x0074} },
+ [0xFB06] = { unicodeslot=0xFB06, category='ll', contextname='stligature', description='LATIN SMALL LIGATURE ST', specials={'compat',0x0073,0x0074} },
+ [0xFB13] = { unicodeslot=0xFB13, category='ll', description='ARMENIAN SMALL LIGATURE MEN NOW', specials={'compat',0x0574,0x0576} },
+ [0xFB14] = { unicodeslot=0xFB14, category='ll', description='ARMENIAN SMALL LIGATURE MEN ECH', specials={'compat',0x0574,0x0565} },
+ [0xFB15] = { unicodeslot=0xFB15, category='ll', description='ARMENIAN SMALL LIGATURE MEN INI', specials={'compat',0x0574,0x056B} },
+ [0xFB16] = { unicodeslot=0xFB16, category='ll', description='ARMENIAN SMALL LIGATURE VEW NOW', specials={'compat',0x057E,0x0576} },
+ [0xFB17] = { unicodeslot=0xFB17, category='ll', description='ARMENIAN SMALL LIGATURE MEN XEH', specials={'compat',0x0574,0x056D} },
+ [0xFB1D] = { unicodeslot=0xFB1D, category='lo', description='HEBREW LETTER YOD WITH HIRIQ', shcode=0x05D9, specials={'char',0x05D9,0x05B4} },
+ [0xFB1E] = { unicodeslot=0xFB1E, category='mn', description='HEBREW POINT JUDEO-SPANISH VARIKA' },
+ [0xFB1F] = { unicodeslot=0xFB1F, category='lo', description='HEBREW LIGATURE YIDDISH YOD YOD PATAH', specials={'char',0x05F2,0x05B7} },
+ [0xFB20] = { unicodeslot=0xFB20, category='lo', description='HEBREW LETTER ALTERNATIVE AYIN', specials={'font',0x05E2} },
+ [0xFB21] = { unicodeslot=0xFB21, category='lo', description='HEBREW LETTER WIDE ALEF', specials={'font',0x05D0} },
+ [0xFB22] = { unicodeslot=0xFB22, category='lo', description='HEBREW LETTER WIDE DALET', specials={'font',0x05D3} },
+ [0xFB23] = { unicodeslot=0xFB23, category='lo', description='HEBREW LETTER WIDE HE', specials={'font',0x05D4} },
+ [0xFB24] = { unicodeslot=0xFB24, category='lo', description='HEBREW LETTER WIDE KAF', specials={'font',0x05DB} },
+ [0xFB25] = { unicodeslot=0xFB25, category='lo', description='HEBREW LETTER WIDE LAMED', specials={'font',0x05DC} },
+ [0xFB26] = { unicodeslot=0xFB26, category='lo', description='HEBREW LETTER WIDE FINAL MEM', specials={'font',0x05DD} },
+ [0xFB27] = { unicodeslot=0xFB27, category='lo', description='HEBREW LETTER WIDE RESH', specials={'font',0x05E8} },
+ [0xFB28] = { unicodeslot=0xFB28, category='lo', description='HEBREW LETTER WIDE TAV', specials={'font',0x05EA} },
+ [0xFB29] = { unicodeslot=0xFB29, category='sm', description='HEBREW LETTER ALTERNATIVE PLUS SIGN', specials={'font',0x002B} },
+ [0xFB2A] = { unicodeslot=0xFB2A, category='lo', description='HEBREW LETTER SHIN WITH SHIN DOT', shcode=0x05E9, specials={'char',0x05E9,0x05C1} },
+ [0xFB2B] = { unicodeslot=0xFB2B, category='lo', description='HEBREW LETTER SHIN WITH SIN DOT', shcode=0x05E9, specials={'char',0x05E9,0x05C2} },
+ [0xFB2C] = { unicodeslot=0xFB2C, category='lo', description='HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT', shcode=0x05E9, specials={'char',0xFB49,0x05C1} },
+ [0xFB2D] = { unicodeslot=0xFB2D, category='lo', description='HEBREW LETTER SHIN WITH DAGESH AND SIN DOT', shcode=0x05E9, specials={'char',0xFB49,0x05C2} },
+ [0xFB2E] = { unicodeslot=0xFB2E, category='lo', description='HEBREW LETTER ALEF WITH PATAH', shcode=0x05D0, specials={'char',0x05D0,0x05B7} },
+ [0xFB2F] = { unicodeslot=0xFB2F, category='lo', description='HEBREW LETTER ALEF WITH QAMATS', shcode=0x05D0, specials={'char',0x05D0,0x05B8} },
+ [0xFB30] = { unicodeslot=0xFB30, category='lo', description='HEBREW LETTER ALEF WITH MAPIQ', shcode=0x05D0, specials={'char',0x05D0,0x05BC} },
+ [0xFB31] = { unicodeslot=0xFB31, category='lo', description='HEBREW LETTER BET WITH DAGESH', shcode=0x05D1, specials={'char',0x05D1,0x05BC} },
+ [0xFB32] = { unicodeslot=0xFB32, category='lo', description='HEBREW LETTER GIMEL WITH DAGESH', shcode=0x05D2, specials={'char',0x05D2,0x05BC} },
+ [0xFB33] = { unicodeslot=0xFB33, category='lo', description='HEBREW LETTER DALET WITH DAGESH', shcode=0x05D3, specials={'char',0x05D3,0x05BC} },
+ [0xFB34] = { unicodeslot=0xFB34, category='lo', description='HEBREW LETTER HE WITH MAPIQ', shcode=0x05D4, specials={'char',0x05D4,0x05BC} },
+ [0xFB35] = { unicodeslot=0xFB35, category='lo', description='HEBREW LETTER VAV WITH DAGESH', shcode=0x05D5, specials={'char',0x05D5,0x05BC} },
+ [0xFB36] = { unicodeslot=0xFB36, category='lo', description='HEBREW LETTER ZAYIN WITH DAGESH', shcode=0x05D6, specials={'char',0x05D6,0x05BC} },
+ [0xFB38] = { unicodeslot=0xFB38, category='lo', description='HEBREW LETTER TET WITH DAGESH', shcode=0x05D8, specials={'char',0x05D8,0x05BC} },
+ [0xFB39] = { unicodeslot=0xFB39, category='lo', description='HEBREW LETTER YOD WITH DAGESH', shcode=0x05D9, specials={'char',0x05D9,0x05BC} },
+ [0xFB3A] = { unicodeslot=0xFB3A, category='lo', description='HEBREW LETTER FINAL KAF WITH DAGESH', specials={'char',0x05DA,0x05BC} },
+ [0xFB3B] = { unicodeslot=0xFB3B, category='lo', description='HEBREW LETTER KAF WITH DAGESH', shcode=0x05DB, specials={'char',0x05DB,0x05BC} },
+ [0xFB3C] = { unicodeslot=0xFB3C, category='lo', description='HEBREW LETTER LAMED WITH DAGESH', shcode=0x05DC, specials={'char',0x05DC,0x05BC} },
+ [0xFB3E] = { unicodeslot=0xFB3E, category='lo', description='HEBREW LETTER MEM WITH DAGESH', shcode=0x05DE, specials={'char',0x05DE,0x05BC} },
+ [0xFB40] = { unicodeslot=0xFB40, category='lo', description='HEBREW LETTER NUN WITH DAGESH', shcode=0x05E0, specials={'char',0x05E0,0x05BC} },
+ [0xFB41] = { unicodeslot=0xFB41, category='lo', description='HEBREW LETTER SAMEKH WITH DAGESH', shcode=0x05E1, specials={'char',0x05E1,0x05BC} },
+ [0xFB43] = { unicodeslot=0xFB43, category='lo', description='HEBREW LETTER FINAL PE WITH DAGESH', specials={'char',0x05E3,0x05BC} },
+ [0xFB44] = { unicodeslot=0xFB44, category='lo', description='HEBREW LETTER PE WITH DAGESH', shcode=0x05E4, specials={'char',0x05E4,0x05BC} },
+ [0xFB46] = { unicodeslot=0xFB46, category='lo', description='HEBREW LETTER TSADI WITH DAGESH', shcode=0x05E6, specials={'char',0x05E6,0x05BC} },
+ [0xFB47] = { unicodeslot=0xFB47, category='lo', description='HEBREW LETTER QOF WITH DAGESH', shcode=0x05E7, specials={'char',0x05E7,0x05BC} },
+ [0xFB48] = { unicodeslot=0xFB48, category='lo', description='HEBREW LETTER RESH WITH DAGESH', shcode=0x05E8, specials={'char',0x05E8,0x05BC} },
+ [0xFB49] = { unicodeslot=0xFB49, category='lo', description='HEBREW LETTER SHIN WITH DAGESH', shcode=0x05E9, specials={'char',0x05E9,0x05BC} },
+ [0xFB4A] = { unicodeslot=0xFB4A, category='lo', description='HEBREW LETTER TAV WITH DAGESH', shcode=0x05EA, specials={'char',0x05EA,0x05BC} },
+ [0xFB4B] = { unicodeslot=0xFB4B, category='lo', description='HEBREW LETTER VAV WITH HOLAM', shcode=0x05D5, specials={'char',0x05D5,0x05B9} },
+ [0xFB4C] = { unicodeslot=0xFB4C, category='lo', description='HEBREW LETTER BET WITH RAFE', shcode=0x05D1, specials={'char',0x05D1,0x05BF} },
+ [0xFB4D] = { unicodeslot=0xFB4D, category='lo', description='HEBREW LETTER KAF WITH RAFE', shcode=0x05DB, specials={'char',0x05DB,0x05BF} },
+ [0xFB4E] = { unicodeslot=0xFB4E, category='lo', description='HEBREW LETTER PE WITH RAFE', shcode=0x05E4, specials={'char',0x05E4,0x05BF} },
+ [0xFB4F] = { unicodeslot=0xFB4F, category='lo', description='HEBREW LIGATURE ALEF LAMED', specials={'compat',0x05D0,0x05DC} },
+ [0xFB50] = { unicodeslot=0xFB50, category='lo', description='ARABIC LETTER ALEF WASLA ISOLATED FORM', specials={'isolated',0x0671} },
+ [0xFB51] = { unicodeslot=0xFB51, category='lo', description='ARABIC LETTER ALEF WASLA FINAL FORM', specials={'final',0x0671} },
+ [0xFB52] = { unicodeslot=0xFB52, category='lo', description='ARABIC LETTER BEEH ISOLATED FORM', specials={'isolated',0x067B} },
+ [0xFB53] = { unicodeslot=0xFB53, category='lo', description='ARABIC LETTER BEEH FINAL FORM', specials={'final',0x067B} },
+ [0xFB54] = { unicodeslot=0xFB54, category='lo', description='ARABIC LETTER BEEH INITIAL FORM', specials={'initial',0x067B} },
+ [0xFB55] = { unicodeslot=0xFB55, category='lo', description='ARABIC LETTER BEEH MEDIAL FORM', specials={'medial',0x067B} },
+ [0xFB56] = { unicodeslot=0xFB56, category='lo', description='ARABIC LETTER PEH ISOLATED FORM', specials={'isolated',0x067E} },
+ [0xFB57] = { unicodeslot=0xFB57, category='lo', description='ARABIC LETTER PEH FINAL FORM', specials={'final',0x067E} },
+ [0xFB58] = { unicodeslot=0xFB58, category='lo', description='ARABIC LETTER PEH INITIAL FORM', specials={'initial',0x067E} },
+ [0xFB59] = { unicodeslot=0xFB59, category='lo', description='ARABIC LETTER PEH MEDIAL FORM', specials={'medial',0x067E} },
+ [0xFB5A] = { unicodeslot=0xFB5A, category='lo', description='ARABIC LETTER BEHEH ISOLATED FORM', specials={'isolated',0x0680} },
+ [0xFB5B] = { unicodeslot=0xFB5B, category='lo', description='ARABIC LETTER BEHEH FINAL FORM', specials={'final',0x0680} },
+ [0xFB5C] = { unicodeslot=0xFB5C, category='lo', description='ARABIC LETTER BEHEH INITIAL FORM', specials={'initial',0x0680} },
+ [0xFB5D] = { unicodeslot=0xFB5D, category='lo', description='ARABIC LETTER BEHEH MEDIAL FORM', specials={'medial',0x0680} },
+ [0xFB5E] = { unicodeslot=0xFB5E, category='lo', description='ARABIC LETTER TTEHEH ISOLATED FORM', specials={'isolated',0x067A} },
+ [0xFB5F] = { unicodeslot=0xFB5F, category='lo', description='ARABIC LETTER TTEHEH FINAL FORM', specials={'final',0x067A} },
+ [0xFB60] = { unicodeslot=0xFB60, category='lo', description='ARABIC LETTER TTEHEH INITIAL FORM', specials={'initial',0x067A} },
+ [0xFB61] = { unicodeslot=0xFB61, category='lo', description='ARABIC LETTER TTEHEH MEDIAL FORM', specials={'medial',0x067A} },
+ [0xFB62] = { unicodeslot=0xFB62, category='lo', description='ARABIC LETTER TEHEH ISOLATED FORM', specials={'isolated',0x067F} },
+ [0xFB63] = { unicodeslot=0xFB63, category='lo', description='ARABIC LETTER TEHEH FINAL FORM', specials={'final',0x067F} },
+ [0xFB64] = { unicodeslot=0xFB64, category='lo', description='ARABIC LETTER TEHEH INITIAL FORM', specials={'initial',0x067F} },
+ [0xFB65] = { unicodeslot=0xFB65, category='lo', description='ARABIC LETTER TEHEH MEDIAL FORM', specials={'medial',0x067F} },
+ [0xFB66] = { unicodeslot=0xFB66, category='lo', description='ARABIC LETTER TTEH ISOLATED FORM', specials={'isolated',0x0679} },
+ [0xFB67] = { unicodeslot=0xFB67, category='lo', description='ARABIC LETTER TTEH FINAL FORM', specials={'final',0x0679} },
+ [0xFB68] = { unicodeslot=0xFB68, category='lo', description='ARABIC LETTER TTEH INITIAL FORM', specials={'initial',0x0679} },
+ [0xFB69] = { unicodeslot=0xFB69, category='lo', description='ARABIC LETTER TTEH MEDIAL FORM', specials={'medial',0x0679} },
+ [0xFB6A] = { unicodeslot=0xFB6A, category='lo', description='ARABIC LETTER VEH ISOLATED FORM', specials={'isolated',0x06A4} },
+ [0xFB6B] = { unicodeslot=0xFB6B, category='lo', description='ARABIC LETTER VEH FINAL FORM', specials={'final',0x06A4} },
+ [0xFB6C] = { unicodeslot=0xFB6C, category='lo', description='ARABIC LETTER VEH INITIAL FORM', specials={'initial',0x06A4} },
+ [0xFB6D] = { unicodeslot=0xFB6D, category='lo', description='ARABIC LETTER VEH MEDIAL FORM', specials={'medial',0x06A4} },
+ [0xFB6E] = { unicodeslot=0xFB6E, category='lo', description='ARABIC LETTER PEHEH ISOLATED FORM', specials={'isolated',0x06A6} },
+ [0xFB6F] = { unicodeslot=0xFB6F, category='lo', description='ARABIC LETTER PEHEH FINAL FORM', specials={'final',0x06A6} },
+ [0xFB70] = { unicodeslot=0xFB70, category='lo', description='ARABIC LETTER PEHEH INITIAL FORM', specials={'initial',0x06A6} },
+ [0xFB71] = { unicodeslot=0xFB71, category='lo', description='ARABIC LETTER PEHEH MEDIAL FORM', specials={'medial',0x06A6} },
+ [0xFB72] = { unicodeslot=0xFB72, category='lo', description='ARABIC LETTER DYEH ISOLATED FORM', specials={'isolated',0x0684} },
+ [0xFB73] = { unicodeslot=0xFB73, category='lo', description='ARABIC LETTER DYEH FINAL FORM', specials={'final',0x0684} },
+ [0xFB74] = { unicodeslot=0xFB74, category='lo', description='ARABIC LETTER DYEH INITIAL FORM', specials={'initial',0x0684} },
+ [0xFB75] = { unicodeslot=0xFB75, category='lo', description='ARABIC LETTER DYEH MEDIAL FORM', specials={'medial',0x0684} },
+ [0xFB76] = { unicodeslot=0xFB76, category='lo', description='ARABIC LETTER NYEH ISOLATED FORM', specials={'isolated',0x0683} },
+ [0xFB77] = { unicodeslot=0xFB77, category='lo', description='ARABIC LETTER NYEH FINAL FORM', specials={'final',0x0683} },
+ [0xFB78] = { unicodeslot=0xFB78, category='lo', description='ARABIC LETTER NYEH INITIAL FORM', specials={'initial',0x0683} },
+ [0xFB79] = { unicodeslot=0xFB79, category='lo', description='ARABIC LETTER NYEH MEDIAL FORM', specials={'medial',0x0683} },
+ [0xFB7A] = { unicodeslot=0xFB7A, category='lo', description='ARABIC LETTER TCHEH ISOLATED FORM', specials={'isolated',0x0686} },
+ [0xFB7B] = { unicodeslot=0xFB7B, category='lo', description='ARABIC LETTER TCHEH FINAL FORM', specials={'final',0x0686} },
+ [0xFB7C] = { unicodeslot=0xFB7C, category='lo', description='ARABIC LETTER TCHEH INITIAL FORM', specials={'initial',0x0686} },
+ [0xFB7D] = { unicodeslot=0xFB7D, category='lo', description='ARABIC LETTER TCHEH MEDIAL FORM', specials={'medial',0x0686} },
+ [0xFB7E] = { unicodeslot=0xFB7E, category='lo', description='ARABIC LETTER TCHEHEH ISOLATED FORM', specials={'isolated',0x0687} },
+ [0xFB7F] = { unicodeslot=0xFB7F, category='lo', description='ARABIC LETTER TCHEHEH FINAL FORM', specials={'final',0x0687} },
+ [0xFB80] = { unicodeslot=0xFB80, category='lo', description='ARABIC LETTER TCHEHEH INITIAL FORM', specials={'initial',0x0687} },
+ [0xFB81] = { unicodeslot=0xFB81, category='lo', description='ARABIC LETTER TCHEHEH MEDIAL FORM', specials={'medial',0x0687} },
+ [0xFB82] = { unicodeslot=0xFB82, category='lo', description='ARABIC LETTER DDAHAL ISOLATED FORM', specials={'isolated',0x068D} },
+ [0xFB83] = { unicodeslot=0xFB83, category='lo', description='ARABIC LETTER DDAHAL FINAL FORM', specials={'final',0x068D} },
+ [0xFB84] = { unicodeslot=0xFB84, category='lo', description='ARABIC LETTER DAHAL ISOLATED FORM', specials={'isolated',0x068C} },
+ [0xFB85] = { unicodeslot=0xFB85, category='lo', description='ARABIC LETTER DAHAL FINAL FORM', specials={'final',0x068C} },
+ [0xFB86] = { unicodeslot=0xFB86, category='lo', description='ARABIC LETTER DUL ISOLATED FORM', specials={'isolated',0x068E} },
+ [0xFB87] = { unicodeslot=0xFB87, category='lo', description='ARABIC LETTER DUL FINAL FORM', specials={'final',0x068E} },
+ [0xFB88] = { unicodeslot=0xFB88, category='lo', description='ARABIC LETTER DDAL ISOLATED FORM', specials={'isolated',0x0688} },
+ [0xFB89] = { unicodeslot=0xFB89, category='lo', description='ARABIC LETTER DDAL FINAL FORM', specials={'final',0x0688} },
+ [0xFB8A] = { unicodeslot=0xFB8A, category='lo', description='ARABIC LETTER JEH ISOLATED FORM', specials={'isolated',0x0698} },
+ [0xFB8B] = { unicodeslot=0xFB8B, category='lo', description='ARABIC LETTER JEH FINAL FORM', specials={'final',0x0698} },
+ [0xFB8C] = { unicodeslot=0xFB8C, category='lo', description='ARABIC LETTER RREH ISOLATED FORM', specials={'isolated',0x0691} },
+ [0xFB8D] = { unicodeslot=0xFB8D, category='lo', description='ARABIC LETTER RREH FINAL FORM', specials={'final',0x0691} },
+ [0xFB8E] = { unicodeslot=0xFB8E, category='lo', description='ARABIC LETTER KEHEH ISOLATED FORM', specials={'isolated',0x06A9} },
+ [0xFB8F] = { unicodeslot=0xFB8F, category='lo', description='ARABIC LETTER KEHEH FINAL FORM', specials={'final',0x06A9} },
+ [0xFB90] = { unicodeslot=0xFB90, category='lo', description='ARABIC LETTER KEHEH INITIAL FORM', specials={'initial',0x06A9} },
+ [0xFB91] = { unicodeslot=0xFB91, category='lo', description='ARABIC LETTER KEHEH MEDIAL FORM', specials={'medial',0x06A9} },
+ [0xFB92] = { unicodeslot=0xFB92, category='lo', description='ARABIC LETTER GAF ISOLATED FORM', specials={'isolated',0x06AF} },
+ [0xFB93] = { unicodeslot=0xFB93, category='lo', description='ARABIC LETTER GAF FINAL FORM', specials={'final',0x06AF} },
+ [0xFB94] = { unicodeslot=0xFB94, category='lo', description='ARABIC LETTER GAF INITIAL FORM', specials={'initial',0x06AF} },
+ [0xFB95] = { unicodeslot=0xFB95, category='lo', description='ARABIC LETTER GAF MEDIAL FORM', specials={'medial',0x06AF} },
+ [0xFB96] = { unicodeslot=0xFB96, category='lo', description='ARABIC LETTER GUEH ISOLATED FORM', specials={'isolated',0x06B3} },
+ [0xFB97] = { unicodeslot=0xFB97, category='lo', description='ARABIC LETTER GUEH FINAL FORM', specials={'final',0x06B3} },
+ [0xFB98] = { unicodeslot=0xFB98, category='lo', description='ARABIC LETTER GUEH INITIAL FORM', specials={'initial',0x06B3} },
+ [0xFB99] = { unicodeslot=0xFB99, category='lo', description='ARABIC LETTER GUEH MEDIAL FORM', specials={'medial',0x06B3} },
+ [0xFB9A] = { unicodeslot=0xFB9A, category='lo', description='ARABIC LETTER NGOEH ISOLATED FORM', specials={'isolated',0x06B1} },
+ [0xFB9B] = { unicodeslot=0xFB9B, category='lo', description='ARABIC LETTER NGOEH FINAL FORM', specials={'final',0x06B1} },
+ [0xFB9C] = { unicodeslot=0xFB9C, category='lo', description='ARABIC LETTER NGOEH INITIAL FORM', specials={'initial',0x06B1} },
+ [0xFB9D] = { unicodeslot=0xFB9D, category='lo', description='ARABIC LETTER NGOEH MEDIAL FORM', specials={'medial',0x06B1} },
+ [0xFB9E] = { unicodeslot=0xFB9E, category='lo', description='ARABIC LETTER NOON GHUNNA ISOLATED FORM', specials={'isolated',0x06BA} },
+ [0xFB9F] = { unicodeslot=0xFB9F, category='lo', description='ARABIC LETTER NOON GHUNNA FINAL FORM', specials={'final',0x06BA} },
+ [0xFBA0] = { unicodeslot=0xFBA0, category='lo', description='ARABIC LETTER RNOON ISOLATED FORM', specials={'isolated',0x06BB} },
+ [0xFBA1] = { unicodeslot=0xFBA1, category='lo', description='ARABIC LETTER RNOON FINAL FORM', specials={'final',0x06BB} },
+ [0xFBA2] = { unicodeslot=0xFBA2, category='lo', description='ARABIC LETTER RNOON INITIAL FORM', specials={'initial',0x06BB} },
+ [0xFBA3] = { unicodeslot=0xFBA3, category='lo', description='ARABIC LETTER RNOON MEDIAL FORM', specials={'medial',0x06BB} },
+ [0xFBA4] = { unicodeslot=0xFBA4, category='lo', description='ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM', shcode=0x0647, specials={'isolated',0x06C0} },
+ [0xFBA5] = { unicodeslot=0xFBA5, category='lo', description='ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM', shcode=0x0647, specials={'final',0x06C0} },
+ [0xFBA6] = { unicodeslot=0xFBA6, category='lo', description='ARABIC LETTER HEH GOAL ISOLATED FORM', specials={'isolated',0x06C1} },
+ [0xFBA7] = { unicodeslot=0xFBA7, category='lo', description='ARABIC LETTER HEH GOAL FINAL FORM', specials={'final',0x06C1} },
+ [0xFBA8] = { unicodeslot=0xFBA8, category='lo', description='ARABIC LETTER HEH GOAL INITIAL FORM', specials={'initial',0x06C1} },
+ [0xFBA9] = { unicodeslot=0xFBA9, category='lo', description='ARABIC LETTER HEH GOAL MEDIAL FORM', specials={'medial',0x06C1} },
+ [0xFBAA] = { unicodeslot=0xFBAA, category='lo', description='ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM', specials={'isolated',0x06BE} },
+ [0xFBAB] = { unicodeslot=0xFBAB, category='lo', description='ARABIC LETTER HEH DOACHASHMEE FINAL FORM', specials={'final',0x06BE} },
+ [0xFBAC] = { unicodeslot=0xFBAC, category='lo', description='ARABIC LETTER HEH DOACHASHMEE INITIAL FORM', specials={'initial',0x06BE} },
+ [0xFBAD] = { unicodeslot=0xFBAD, category='lo', description='ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM', specials={'medial',0x06BE} },
+ [0xFBAE] = { unicodeslot=0xFBAE, category='lo', description='ARABIC LETTER YEH BARREE ISOLATED FORM', specials={'isolated',0x06D2} },
+ [0xFBAF] = { unicodeslot=0xFBAF, category='lo', description='ARABIC LETTER YEH BARREE FINAL FORM', specials={'final',0x06D2} },
+ [0xFBB0] = { unicodeslot=0xFBB0, category='lo', description='ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM', specials={'isolated',0x06D3} },
+ [0xFBB1] = { unicodeslot=0xFBB1, category='lo', description='ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM', specials={'final',0x06D3} },
+ [0xFBD3] = { unicodeslot=0xFBD3, category='lo', description='ARABIC LETTER NG ISOLATED FORM', specials={'isolated',0x06AD} },
+ [0xFBD4] = { unicodeslot=0xFBD4, category='lo', description='ARABIC LETTER NG FINAL FORM', specials={'final',0x06AD} },
+ [0xFBD5] = { unicodeslot=0xFBD5, category='lo', description='ARABIC LETTER NG INITIAL FORM', specials={'initial',0x06AD} },
+ [0xFBD6] = { unicodeslot=0xFBD6, category='lo', description='ARABIC LETTER NG MEDIAL FORM', specials={'medial',0x06AD} },
+ [0xFBD7] = { unicodeslot=0xFBD7, category='lo', description='ARABIC LETTER U ISOLATED FORM', specials={'isolated',0x06C7} },
+ [0xFBD8] = { unicodeslot=0xFBD8, category='lo', description='ARABIC LETTER U FINAL FORM', specials={'final',0x06C7} },
+ [0xFBD9] = { unicodeslot=0xFBD9, category='lo', description='ARABIC LETTER OE ISOLATED FORM', specials={'isolated',0x06C6} },
+ [0xFBDA] = { unicodeslot=0xFBDA, category='lo', description='ARABIC LETTER OE FINAL FORM', specials={'final',0x06C6} },
+ [0xFBDB] = { unicodeslot=0xFBDB, category='lo', description='ARABIC LETTER YU ISOLATED FORM', specials={'isolated',0x06C8} },
+ [0xFBDC] = { unicodeslot=0xFBDC, category='lo', description='ARABIC LETTER YU FINAL FORM', specials={'final',0x06C8} },
+ [0xFBDD] = { unicodeslot=0xFBDD, category='lo', description='ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM', shcode=0x06C7, specials={'isolated',0x0677} },
+ [0xFBDE] = { unicodeslot=0xFBDE, category='lo', description='ARABIC LETTER VE ISOLATED FORM', specials={'isolated',0x06CB} },
+ [0xFBDF] = { unicodeslot=0xFBDF, category='lo', description='ARABIC LETTER VE FINAL FORM', specials={'final',0x06CB} },
+ [0xFBE0] = { unicodeslot=0xFBE0, category='lo', description='ARABIC LETTER KIRGHIZ OE ISOLATED FORM', specials={'isolated',0x06C5} },
+ [0xFBE1] = { unicodeslot=0xFBE1, category='lo', description='ARABIC LETTER KIRGHIZ OE FINAL FORM', specials={'final',0x06C5} },
+ [0xFBE2] = { unicodeslot=0xFBE2, category='lo', description='ARABIC LETTER KIRGHIZ YU ISOLATED FORM', specials={'isolated',0x06C9} },
+ [0xFBE3] = { unicodeslot=0xFBE3, category='lo', description='ARABIC LETTER KIRGHIZ YU FINAL FORM', specials={'final',0x06C9} },
+ [0xFBE4] = { unicodeslot=0xFBE4, category='lo', description='ARABIC LETTER E ISOLATED FORM', specials={'isolated',0x06D0} },
+ [0xFBE5] = { unicodeslot=0xFBE5, category='lo', description='ARABIC LETTER E FINAL FORM', specials={'final',0x06D0} },
+ [0xFBE6] = { unicodeslot=0xFBE6, category='lo', description='ARABIC LETTER E INITIAL FORM', specials={'initial',0x06D0} },
+ [0xFBE7] = { unicodeslot=0xFBE7, category='lo', description='ARABIC LETTER E MEDIAL FORM', specials={'medial',0x06D0} },
+ [0xFBE8] = { unicodeslot=0xFBE8, category='lo', description='ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM', specials={'initial',0x0649} },
+ [0xFBE9] = { unicodeslot=0xFBE9, category='lo', description='ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM', specials={'medial',0x0649} },
+ [0xFBEA] = { unicodeslot=0xFBEA, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM', specials={'isolated',0x0626,0x0627} },
+ [0xFBEB] = { unicodeslot=0xFBEB, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM', specials={'final',0x0626,0x0627} },
+ [0xFBEC] = { unicodeslot=0xFBEC, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM', specials={'isolated',0x0626,0x06D5} },
+ [0xFBED] = { unicodeslot=0xFBED, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM', specials={'final',0x0626,0x06D5} },
+ [0xFBEE] = { unicodeslot=0xFBEE, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM', specials={'isolated',0x0626,0x0648} },
+ [0xFBEF] = { unicodeslot=0xFBEF, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM', specials={'final',0x0626,0x0648} },
+ [0xFBF0] = { unicodeslot=0xFBF0, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM', specials={'isolated',0x0626,0x06C7} },
+ [0xFBF1] = { unicodeslot=0xFBF1, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM', specials={'final',0x0626,0x06C7} },
+ [0xFBF2] = { unicodeslot=0xFBF2, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM', specials={'isolated',0x0626,0x06C6} },
+ [0xFBF3] = { unicodeslot=0xFBF3, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM', specials={'final',0x0626,0x06C6} },
+ [0xFBF4] = { unicodeslot=0xFBF4, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM', specials={'isolated',0x0626,0x06C8} },
+ [0xFBF5] = { unicodeslot=0xFBF5, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM', specials={'final',0x0626,0x06C8} },
+ [0xFBF6] = { unicodeslot=0xFBF6, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM', specials={'isolated',0x0626,0x06D0} },
+ [0xFBF7] = { unicodeslot=0xFBF7, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM', specials={'final',0x0626,0x06D0} },
+ [0xFBF8] = { unicodeslot=0xFBF8, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM', specials={'initial',0x0626,0x06D0} },
+ [0xFBF9] = { unicodeslot=0xFBF9, category='lo', description='ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0626,0x0649} },
+ [0xFBFA] = { unicodeslot=0xFBFA, category='lo', description='ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0626,0x0649} },
+ [0xFBFB] = { unicodeslot=0xFBFB, category='lo', description='ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM', specials={'initial',0x0626,0x0649} },
+ [0xFBFC] = { unicodeslot=0xFBFC, category='lo', description='ARABIC LETTER FARSI YEH ISOLATED FORM', specials={'isolated',0x06CC} },
+ [0xFBFD] = { unicodeslot=0xFBFD, category='lo', description='ARABIC LETTER FARSI YEH FINAL FORM', specials={'final',0x06CC} },
+ [0xFBFE] = { unicodeslot=0xFBFE, category='lo', description='ARABIC LETTER FARSI YEH INITIAL FORM', specials={'initial',0x06CC} },
+ [0xFBFF] = { unicodeslot=0xFBFF, category='lo', description='ARABIC LETTER FARSI YEH MEDIAL FORM', specials={'medial',0x06CC} },
+ [0xFC00] = { unicodeslot=0xFC00, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM', specials={'isolated',0x0626,0x062C} },
+ [0xFC01] = { unicodeslot=0xFC01, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM', specials={'isolated',0x0626,0x062D} },
+ [0xFC02] = { unicodeslot=0xFC02, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM', specials={'isolated',0x0626,0x0645} },
+ [0xFC03] = { unicodeslot=0xFC03, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0626,0x0649} },
+ [0xFC04] = { unicodeslot=0xFC04, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM', specials={'isolated',0x0626,0x064A} },
+ [0xFC05] = { unicodeslot=0xFC05, category='lo', description='ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM', specials={'isolated',0x0628,0x062C} },
+ [0xFC06] = { unicodeslot=0xFC06, category='lo', description='ARABIC LIGATURE BEH WITH HAH ISOLATED FORM', specials={'isolated',0x0628,0x062D} },
+ [0xFC07] = { unicodeslot=0xFC07, category='lo', description='ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM', specials={'isolated',0x0628,0x062E} },
+ [0xFC08] = { unicodeslot=0xFC08, category='lo', description='ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM', specials={'isolated',0x0628,0x0645} },
+ [0xFC09] = { unicodeslot=0xFC09, category='lo', description='ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0628,0x0649} },
+ [0xFC0A] = { unicodeslot=0xFC0A, category='lo', description='ARABIC LIGATURE BEH WITH YEH ISOLATED FORM', specials={'isolated',0x0628,0x064A} },
+ [0xFC0B] = { unicodeslot=0xFC0B, category='lo', description='ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM', specials={'isolated',0x062A,0x062C} },
+ [0xFC0C] = { unicodeslot=0xFC0C, category='lo', description='ARABIC LIGATURE TEH WITH HAH ISOLATED FORM', specials={'isolated',0x062A,0x062D} },
+ [0xFC0D] = { unicodeslot=0xFC0D, category='lo', description='ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM', specials={'isolated',0x062A,0x062E} },
+ [0xFC0E] = { unicodeslot=0xFC0E, category='lo', description='ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM', specials={'isolated',0x062A,0x0645} },
+ [0xFC0F] = { unicodeslot=0xFC0F, category='lo', description='ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062A,0x0649} },
+ [0xFC10] = { unicodeslot=0xFC10, category='lo', description='ARABIC LIGATURE TEH WITH YEH ISOLATED FORM', specials={'isolated',0x062A,0x064A} },
+ [0xFC11] = { unicodeslot=0xFC11, category='lo', description='ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM', specials={'isolated',0x062B,0x062C} },
+ [0xFC12] = { unicodeslot=0xFC12, category='lo', description='ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM', specials={'isolated',0x062B,0x0645} },
+ [0xFC13] = { unicodeslot=0xFC13, category='lo', description='ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062B,0x0649} },
+ [0xFC14] = { unicodeslot=0xFC14, category='lo', description='ARABIC LIGATURE THEH WITH YEH ISOLATED FORM', specials={'isolated',0x062B,0x064A} },
+ [0xFC15] = { unicodeslot=0xFC15, category='lo', description='ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM', specials={'isolated',0x062C,0x062D} },
+ [0xFC16] = { unicodeslot=0xFC16, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM', specials={'isolated',0x062C,0x0645} },
+ [0xFC17] = { unicodeslot=0xFC17, category='lo', description='ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM', specials={'isolated',0x062D,0x062C} },
+ [0xFC18] = { unicodeslot=0xFC18, category='lo', description='ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM', specials={'isolated',0x062D,0x0645} },
+ [0xFC19] = { unicodeslot=0xFC19, category='lo', description='ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM', specials={'isolated',0x062E,0x062C} },
+ [0xFC1A] = { unicodeslot=0xFC1A, category='lo', description='ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM', specials={'isolated',0x062E,0x062D} },
+ [0xFC1B] = { unicodeslot=0xFC1B, category='lo', description='ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM', specials={'isolated',0x062E,0x0645} },
+ [0xFC1C] = { unicodeslot=0xFC1C, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM', specials={'isolated',0x0633,0x062C} },
+ [0xFC1D] = { unicodeslot=0xFC1D, category='lo', description='ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM', specials={'isolated',0x0633,0x062D} },
+ [0xFC1E] = { unicodeslot=0xFC1E, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM', specials={'isolated',0x0633,0x062E} },
+ [0xFC1F] = { unicodeslot=0xFC1F, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM', specials={'isolated',0x0633,0x0645} },
+ [0xFC20] = { unicodeslot=0xFC20, category='lo', description='ARABIC LIGATURE SAD WITH HAH ISOLATED FORM', specials={'isolated',0x0635,0x062D} },
+ [0xFC21] = { unicodeslot=0xFC21, category='lo', description='ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM', specials={'isolated',0x0635,0x0645} },
+ [0xFC22] = { unicodeslot=0xFC22, category='lo', description='ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM', specials={'isolated',0x0636,0x062C} },
+ [0xFC23] = { unicodeslot=0xFC23, category='lo', description='ARABIC LIGATURE DAD WITH HAH ISOLATED FORM', specials={'isolated',0x0636,0x062D} },
+ [0xFC24] = { unicodeslot=0xFC24, category='lo', description='ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM', specials={'isolated',0x0636,0x062E} },
+ [0xFC25] = { unicodeslot=0xFC25, category='lo', description='ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM', specials={'isolated',0x0636,0x0645} },
+ [0xFC26] = { unicodeslot=0xFC26, category='lo', description='ARABIC LIGATURE TAH WITH HAH ISOLATED FORM', specials={'isolated',0x0637,0x062D} },
+ [0xFC27] = { unicodeslot=0xFC27, category='lo', description='ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM', specials={'isolated',0x0637,0x0645} },
+ [0xFC28] = { unicodeslot=0xFC28, category='lo', description='ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM', specials={'isolated',0x0638,0x0645} },
+ [0xFC29] = { unicodeslot=0xFC29, category='lo', description='ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM', specials={'isolated',0x0639,0x062C} },
+ [0xFC2A] = { unicodeslot=0xFC2A, category='lo', description='ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM', specials={'isolated',0x0639,0x0645} },
+ [0xFC2B] = { unicodeslot=0xFC2B, category='lo', description='ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM', specials={'isolated',0x063A,0x062C} },
+ [0xFC2C] = { unicodeslot=0xFC2C, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM', specials={'isolated',0x063A,0x0645} },
+ [0xFC2D] = { unicodeslot=0xFC2D, category='lo', description='ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM', specials={'isolated',0x0641,0x062C} },
+ [0xFC2E] = { unicodeslot=0xFC2E, category='lo', description='ARABIC LIGATURE FEH WITH HAH ISOLATED FORM', specials={'isolated',0x0641,0x062D} },
+ [0xFC2F] = { unicodeslot=0xFC2F, category='lo', description='ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM', specials={'isolated',0x0641,0x062E} },
+ [0xFC30] = { unicodeslot=0xFC30, category='lo', description='ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM', specials={'isolated',0x0641,0x0645} },
+ [0xFC31] = { unicodeslot=0xFC31, category='lo', description='ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0641,0x0649} },
+ [0xFC32] = { unicodeslot=0xFC32, category='lo', description='ARABIC LIGATURE FEH WITH YEH ISOLATED FORM', specials={'isolated',0x0641,0x064A} },
+ [0xFC33] = { unicodeslot=0xFC33, category='lo', description='ARABIC LIGATURE QAF WITH HAH ISOLATED FORM', specials={'isolated',0x0642,0x062D} },
+ [0xFC34] = { unicodeslot=0xFC34, category='lo', description='ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM', specials={'isolated',0x0642,0x0645} },
+ [0xFC35] = { unicodeslot=0xFC35, category='lo', description='ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0642,0x0649} },
+ [0xFC36] = { unicodeslot=0xFC36, category='lo', description='ARABIC LIGATURE QAF WITH YEH ISOLATED FORM', specials={'isolated',0x0642,0x064A} },
+ [0xFC37] = { unicodeslot=0xFC37, category='lo', description='ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM', specials={'isolated',0x0643,0x0627} },
+ [0xFC38] = { unicodeslot=0xFC38, category='lo', description='ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM', specials={'isolated',0x0643,0x062C} },
+ [0xFC39] = { unicodeslot=0xFC39, category='lo', description='ARABIC LIGATURE KAF WITH HAH ISOLATED FORM', specials={'isolated',0x0643,0x062D} },
+ [0xFC3A] = { unicodeslot=0xFC3A, category='lo', description='ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM', specials={'isolated',0x0643,0x062E} },
+ [0xFC3B] = { unicodeslot=0xFC3B, category='lo', description='ARABIC LIGATURE KAF WITH LAM ISOLATED FORM', specials={'isolated',0x0643,0x0644} },
+ [0xFC3C] = { unicodeslot=0xFC3C, category='lo', description='ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM', specials={'isolated',0x0643,0x0645} },
+ [0xFC3D] = { unicodeslot=0xFC3D, category='lo', description='ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0643,0x0649} },
+ [0xFC3E] = { unicodeslot=0xFC3E, category='lo', description='ARABIC LIGATURE KAF WITH YEH ISOLATED FORM', specials={'isolated',0x0643,0x064A} },
+ [0xFC3F] = { unicodeslot=0xFC3F, category='lo', description='ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM', specials={'isolated',0x0644,0x062C} },
+ [0xFC40] = { unicodeslot=0xFC40, category='lo', description='ARABIC LIGATURE LAM WITH HAH ISOLATED FORM', specials={'isolated',0x0644,0x062D} },
+ [0xFC41] = { unicodeslot=0xFC41, category='lo', description='ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM', specials={'isolated',0x0644,0x062E} },
+ [0xFC42] = { unicodeslot=0xFC42, category='lo', description='ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM', specials={'isolated',0x0644,0x0645} },
+ [0xFC43] = { unicodeslot=0xFC43, category='lo', description='ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0644,0x0649} },
+ [0xFC44] = { unicodeslot=0xFC44, category='lo', description='ARABIC LIGATURE LAM WITH YEH ISOLATED FORM', specials={'isolated',0x0644,0x064A} },
+ [0xFC45] = { unicodeslot=0xFC45, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM', specials={'isolated',0x0645,0x062C} },
+ [0xFC46] = { unicodeslot=0xFC46, category='lo', description='ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM', specials={'isolated',0x0645,0x062D} },
+ [0xFC47] = { unicodeslot=0xFC47, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM', specials={'isolated',0x0645,0x062E} },
+ [0xFC48] = { unicodeslot=0xFC48, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM', specials={'isolated',0x0645,0x0645} },
+ [0xFC49] = { unicodeslot=0xFC49, category='lo', description='ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0645,0x0649} },
+ [0xFC4A] = { unicodeslot=0xFC4A, category='lo', description='ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM', specials={'isolated',0x0645,0x064A} },
+ [0xFC4B] = { unicodeslot=0xFC4B, category='lo', description='ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM', specials={'isolated',0x0646,0x062C} },
+ [0xFC4C] = { unicodeslot=0xFC4C, category='lo', description='ARABIC LIGATURE NOON WITH HAH ISOLATED FORM', specials={'isolated',0x0646,0x062D} },
+ [0xFC4D] = { unicodeslot=0xFC4D, category='lo', description='ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM', specials={'isolated',0x0646,0x062E} },
+ [0xFC4E] = { unicodeslot=0xFC4E, category='lo', description='ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM', specials={'isolated',0x0646,0x0645} },
+ [0xFC4F] = { unicodeslot=0xFC4F, category='lo', description='ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0646,0x0649} },
+ [0xFC50] = { unicodeslot=0xFC50, category='lo', description='ARABIC LIGATURE NOON WITH YEH ISOLATED FORM', specials={'isolated',0x0646,0x064A} },
+ [0xFC51] = { unicodeslot=0xFC51, category='lo', description='ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM', specials={'isolated',0x0647,0x062C} },
+ [0xFC52] = { unicodeslot=0xFC52, category='lo', description='ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM', specials={'isolated',0x0647,0x0645} },
+ [0xFC53] = { unicodeslot=0xFC53, category='lo', description='ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0647,0x0649} },
+ [0xFC54] = { unicodeslot=0xFC54, category='lo', description='ARABIC LIGATURE HEH WITH YEH ISOLATED FORM', specials={'isolated',0x0647,0x064A} },
+ [0xFC55] = { unicodeslot=0xFC55, category='lo', description='ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM', specials={'isolated',0x064A,0x062C} },
+ [0xFC56] = { unicodeslot=0xFC56, category='lo', description='ARABIC LIGATURE YEH WITH HAH ISOLATED FORM', specials={'isolated',0x064A,0x062D} },
+ [0xFC57] = { unicodeslot=0xFC57, category='lo', description='ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM', specials={'isolated',0x064A,0x062E} },
+ [0xFC58] = { unicodeslot=0xFC58, category='lo', description='ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM', specials={'isolated',0x064A,0x0645} },
+ [0xFC59] = { unicodeslot=0xFC59, category='lo', description='ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x064A,0x0649} },
+ [0xFC5A] = { unicodeslot=0xFC5A, category='lo', description='ARABIC LIGATURE YEH WITH YEH ISOLATED FORM', specials={'isolated',0x064A,0x064A} },
+ [0xFC5B] = { unicodeslot=0xFC5B, category='lo', description='ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0630,0x0670} },
+ [0xFC5C] = { unicodeslot=0xFC5C, category='lo', description='ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0631,0x0670} },
+ [0xFC5D] = { unicodeslot=0xFC5D, category='lo', description='ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0649,0x0670} },
+ [0xFC5E] = { unicodeslot=0xFC5E, category='lo', description='ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM', specials={'isolated',0x0020,0x064C,0x0651} },
+ [0xFC5F] = { unicodeslot=0xFC5F, category='lo', description='ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM', specials={'isolated',0x0020,0x064D,0x0651} },
+ [0xFC60] = { unicodeslot=0xFC60, category='lo', description='ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM', specials={'isolated',0x0020,0x064E,0x0651} },
+ [0xFC61] = { unicodeslot=0xFC61, category='lo', description='ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM', specials={'isolated',0x0020,0x064F,0x0651} },
+ [0xFC62] = { unicodeslot=0xFC62, category='lo', description='ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM', specials={'isolated',0x0020,0x0650,0x0651} },
+ [0xFC63] = { unicodeslot=0xFC63, category='lo', description='ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0020,0x0651,0x0670} },
+ [0xFC64] = { unicodeslot=0xFC64, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM', specials={'final',0x0626,0x0631} },
+ [0xFC65] = { unicodeslot=0xFC65, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM', specials={'final',0x0626,0x0632} },
+ [0xFC66] = { unicodeslot=0xFC66, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM', specials={'final',0x0626,0x0645} },
+ [0xFC67] = { unicodeslot=0xFC67, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM', specials={'final',0x0626,0x0646} },
+ [0xFC68] = { unicodeslot=0xFC68, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0626,0x0649} },
+ [0xFC69] = { unicodeslot=0xFC69, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM', specials={'final',0x0626,0x064A} },
+ [0xFC6A] = { unicodeslot=0xFC6A, category='lo', description='ARABIC LIGATURE BEH WITH REH FINAL FORM', specials={'final',0x0628,0x0631} },
+ [0xFC6B] = { unicodeslot=0xFC6B, category='lo', description='ARABIC LIGATURE BEH WITH ZAIN FINAL FORM', specials={'final',0x0628,0x0632} },
+ [0xFC6C] = { unicodeslot=0xFC6C, category='lo', description='ARABIC LIGATURE BEH WITH MEEM FINAL FORM', specials={'final',0x0628,0x0645} },
+ [0xFC6D] = { unicodeslot=0xFC6D, category='lo', description='ARABIC LIGATURE BEH WITH NOON FINAL FORM', specials={'final',0x0628,0x0646} },
+ [0xFC6E] = { unicodeslot=0xFC6E, category='lo', description='ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0628,0x0649} },
+ [0xFC6F] = { unicodeslot=0xFC6F, category='lo', description='ARABIC LIGATURE BEH WITH YEH FINAL FORM', specials={'final',0x0628,0x064A} },
+ [0xFC70] = { unicodeslot=0xFC70, category='lo', description='ARABIC LIGATURE TEH WITH REH FINAL FORM', specials={'final',0x062A,0x0631} },
+ [0xFC71] = { unicodeslot=0xFC71, category='lo', description='ARABIC LIGATURE TEH WITH ZAIN FINAL FORM', specials={'final',0x062A,0x0632} },
+ [0xFC72] = { unicodeslot=0xFC72, category='lo', description='ARABIC LIGATURE TEH WITH MEEM FINAL FORM', specials={'final',0x062A,0x0645} },
+ [0xFC73] = { unicodeslot=0xFC73, category='lo', description='ARABIC LIGATURE TEH WITH NOON FINAL FORM', specials={'final',0x062A,0x0646} },
+ [0xFC74] = { unicodeslot=0xFC74, category='lo', description='ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x0649} },
+ [0xFC75] = { unicodeslot=0xFC75, category='lo', description='ARABIC LIGATURE TEH WITH YEH FINAL FORM', specials={'final',0x062A,0x064A} },
+ [0xFC76] = { unicodeslot=0xFC76, category='lo', description='ARABIC LIGATURE THEH WITH REH FINAL FORM', specials={'final',0x062B,0x0631} },
+ [0xFC77] = { unicodeslot=0xFC77, category='lo', description='ARABIC LIGATURE THEH WITH ZAIN FINAL FORM', specials={'final',0x062B,0x0632} },
+ [0xFC78] = { unicodeslot=0xFC78, category='lo', description='ARABIC LIGATURE THEH WITH MEEM FINAL FORM', specials={'final',0x062B,0x0645} },
+ [0xFC79] = { unicodeslot=0xFC79, category='lo', description='ARABIC LIGATURE THEH WITH NOON FINAL FORM', specials={'final',0x062B,0x0646} },
+ [0xFC7A] = { unicodeslot=0xFC7A, category='lo', description='ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062B,0x0649} },
+ [0xFC7B] = { unicodeslot=0xFC7B, category='lo', description='ARABIC LIGATURE THEH WITH YEH FINAL FORM', specials={'final',0x062B,0x064A} },
+ [0xFC7C] = { unicodeslot=0xFC7C, category='lo', description='ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0641,0x0649} },
+ [0xFC7D] = { unicodeslot=0xFC7D, category='lo', description='ARABIC LIGATURE FEH WITH YEH FINAL FORM', specials={'final',0x0641,0x064A} },
+ [0xFC7E] = { unicodeslot=0xFC7E, category='lo', description='ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0642,0x0649} },
+ [0xFC7F] = { unicodeslot=0xFC7F, category='lo', description='ARABIC LIGATURE QAF WITH YEH FINAL FORM', specials={'final',0x0642,0x064A} },
+ [0xFC80] = { unicodeslot=0xFC80, category='lo', description='ARABIC LIGATURE KAF WITH ALEF FINAL FORM', specials={'final',0x0643,0x0627} },
+ [0xFC81] = { unicodeslot=0xFC81, category='lo', description='ARABIC LIGATURE KAF WITH LAM FINAL FORM', specials={'final',0x0643,0x0644} },
+ [0xFC82] = { unicodeslot=0xFC82, category='lo', description='ARABIC LIGATURE KAF WITH MEEM FINAL FORM', specials={'final',0x0643,0x0645} },
+ [0xFC83] = { unicodeslot=0xFC83, category='lo', description='ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0643,0x0649} },
+ [0xFC84] = { unicodeslot=0xFC84, category='lo', description='ARABIC LIGATURE KAF WITH YEH FINAL FORM', specials={'final',0x0643,0x064A} },
+ [0xFC85] = { unicodeslot=0xFC85, category='lo', description='ARABIC LIGATURE LAM WITH MEEM FINAL FORM', specials={'final',0x0644,0x0645} },
+ [0xFC86] = { unicodeslot=0xFC86, category='lo', description='ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0644,0x0649} },
+ [0xFC87] = { unicodeslot=0xFC87, category='lo', description='ARABIC LIGATURE LAM WITH YEH FINAL FORM', specials={'final',0x0644,0x064A} },
+ [0xFC88] = { unicodeslot=0xFC88, category='lo', description='ARABIC LIGATURE MEEM WITH ALEF FINAL FORM', specials={'final',0x0645,0x0627} },
+ [0xFC89] = { unicodeslot=0xFC89, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM FINAL FORM', specials={'final',0x0645,0x0645} },
+ [0xFC8A] = { unicodeslot=0xFC8A, category='lo', description='ARABIC LIGATURE NOON WITH REH FINAL FORM', specials={'final',0x0646,0x0631} },
+ [0xFC8B] = { unicodeslot=0xFC8B, category='lo', description='ARABIC LIGATURE NOON WITH ZAIN FINAL FORM', specials={'final',0x0646,0x0632} },
+ [0xFC8C] = { unicodeslot=0xFC8C, category='lo', description='ARABIC LIGATURE NOON WITH MEEM FINAL FORM', specials={'final',0x0646,0x0645} },
+ [0xFC8D] = { unicodeslot=0xFC8D, category='lo', description='ARABIC LIGATURE NOON WITH NOON FINAL FORM', specials={'final',0x0646,0x0646} },
+ [0xFC8E] = { unicodeslot=0xFC8E, category='lo', description='ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x0649} },
+ [0xFC8F] = { unicodeslot=0xFC8F, category='lo', description='ARABIC LIGATURE NOON WITH YEH FINAL FORM', specials={'final',0x0646,0x064A} },
+ [0xFC90] = { unicodeslot=0xFC90, category='lo', description='ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM', specials={'final',0x0649,0x0670} },
+ [0xFC91] = { unicodeslot=0xFC91, category='lo', description='ARABIC LIGATURE YEH WITH REH FINAL FORM', specials={'final',0x064A,0x0631} },
+ [0xFC92] = { unicodeslot=0xFC92, category='lo', description='ARABIC LIGATURE YEH WITH ZAIN FINAL FORM', specials={'final',0x064A,0x0632} },
+ [0xFC93] = { unicodeslot=0xFC93, category='lo', description='ARABIC LIGATURE YEH WITH MEEM FINAL FORM', specials={'final',0x064A,0x0645} },
+ [0xFC94] = { unicodeslot=0xFC94, category='lo', description='ARABIC LIGATURE YEH WITH NOON FINAL FORM', specials={'final',0x064A,0x0646} },
+ [0xFC95] = { unicodeslot=0xFC95, category='lo', description='ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x064A,0x0649} },
+ [0xFC96] = { unicodeslot=0xFC96, category='lo', description='ARABIC LIGATURE YEH WITH YEH FINAL FORM', specials={'final',0x064A,0x064A} },
+ [0xFC97] = { unicodeslot=0xFC97, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM', specials={'initial',0x0626,0x062C} },
+ [0xFC98] = { unicodeslot=0xFC98, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM', specials={'initial',0x0626,0x062D} },
+ [0xFC99] = { unicodeslot=0xFC99, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM', specials={'initial',0x0626,0x062E} },
+ [0xFC9A] = { unicodeslot=0xFC9A, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM', specials={'initial',0x0626,0x0645} },
+ [0xFC9B] = { unicodeslot=0xFC9B, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM', specials={'initial',0x0626,0x0647} },
+ [0xFC9C] = { unicodeslot=0xFC9C, category='lo', description='ARABIC LIGATURE BEH WITH JEEM INITIAL FORM', specials={'initial',0x0628,0x062C} },
+ [0xFC9D] = { unicodeslot=0xFC9D, category='lo', description='ARABIC LIGATURE BEH WITH HAH INITIAL FORM', specials={'initial',0x0628,0x062D} },
+ [0xFC9E] = { unicodeslot=0xFC9E, category='lo', description='ARABIC LIGATURE BEH WITH KHAH INITIAL FORM', specials={'initial',0x0628,0x062E} },
+ [0xFC9F] = { unicodeslot=0xFC9F, category='lo', description='ARABIC LIGATURE BEH WITH MEEM INITIAL FORM', specials={'initial',0x0628,0x0645} },
+ [0xFCA0] = { unicodeslot=0xFCA0, category='lo', description='ARABIC LIGATURE BEH WITH HEH INITIAL FORM', specials={'initial',0x0628,0x0647} },
+ [0xFCA1] = { unicodeslot=0xFCA1, category='lo', description='ARABIC LIGATURE TEH WITH JEEM INITIAL FORM', specials={'initial',0x062A,0x062C} },
+ [0xFCA2] = { unicodeslot=0xFCA2, category='lo', description='ARABIC LIGATURE TEH WITH HAH INITIAL FORM', specials={'initial',0x062A,0x062D} },
+ [0xFCA3] = { unicodeslot=0xFCA3, category='lo', description='ARABIC LIGATURE TEH WITH KHAH INITIAL FORM', specials={'initial',0x062A,0x062E} },
+ [0xFCA4] = { unicodeslot=0xFCA4, category='lo', description='ARABIC LIGATURE TEH WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x0645} },
+ [0xFCA5] = { unicodeslot=0xFCA5, category='lo', description='ARABIC LIGATURE TEH WITH HEH INITIAL FORM', specials={'initial',0x062A,0x0647} },
+ [0xFCA6] = { unicodeslot=0xFCA6, category='lo', description='ARABIC LIGATURE THEH WITH MEEM INITIAL FORM', specials={'initial',0x062B,0x0645} },
+ [0xFCA7] = { unicodeslot=0xFCA7, category='lo', description='ARABIC LIGATURE JEEM WITH HAH INITIAL FORM', specials={'initial',0x062C,0x062D} },
+ [0xFCA8] = { unicodeslot=0xFCA8, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM', specials={'initial',0x062C,0x0645} },
+ [0xFCA9] = { unicodeslot=0xFCA9, category='lo', description='ARABIC LIGATURE HAH WITH JEEM INITIAL FORM', specials={'initial',0x062D,0x062C} },
+ [0xFCAA] = { unicodeslot=0xFCAA, category='lo', description='ARABIC LIGATURE HAH WITH MEEM INITIAL FORM', specials={'initial',0x062D,0x0645} },
+ [0xFCAB] = { unicodeslot=0xFCAB, category='lo', description='ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM', specials={'initial',0x062E,0x062C} },
+ [0xFCAC] = { unicodeslot=0xFCAC, category='lo', description='ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM', specials={'initial',0x062E,0x0645} },
+ [0xFCAD] = { unicodeslot=0xFCAD, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM', specials={'initial',0x0633,0x062C} },
+ [0xFCAE] = { unicodeslot=0xFCAE, category='lo', description='ARABIC LIGATURE SEEN WITH HAH INITIAL FORM', specials={'initial',0x0633,0x062D} },
+ [0xFCAF] = { unicodeslot=0xFCAF, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM', specials={'initial',0x0633,0x062E} },
+ [0xFCB0] = { unicodeslot=0xFCB0, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM', specials={'initial',0x0633,0x0645} },
+ [0xFCB1] = { unicodeslot=0xFCB1, category='lo', description='ARABIC LIGATURE SAD WITH HAH INITIAL FORM', specials={'initial',0x0635,0x062D} },
+ [0xFCB2] = { unicodeslot=0xFCB2, category='lo', description='ARABIC LIGATURE SAD WITH KHAH INITIAL FORM', specials={'initial',0x0635,0x062E} },
+ [0xFCB3] = { unicodeslot=0xFCB3, category='lo', description='ARABIC LIGATURE SAD WITH MEEM INITIAL FORM', specials={'initial',0x0635,0x0645} },
+ [0xFCB4] = { unicodeslot=0xFCB4, category='lo', description='ARABIC LIGATURE DAD WITH JEEM INITIAL FORM', specials={'initial',0x0636,0x062C} },
+ [0xFCB5] = { unicodeslot=0xFCB5, category='lo', description='ARABIC LIGATURE DAD WITH HAH INITIAL FORM', specials={'initial',0x0636,0x062D} },
+ [0xFCB6] = { unicodeslot=0xFCB6, category='lo', description='ARABIC LIGATURE DAD WITH KHAH INITIAL FORM', specials={'initial',0x0636,0x062E} },
+ [0xFCB7] = { unicodeslot=0xFCB7, category='lo', description='ARABIC LIGATURE DAD WITH MEEM INITIAL FORM', specials={'initial',0x0636,0x0645} },
+ [0xFCB8] = { unicodeslot=0xFCB8, category='lo', description='ARABIC LIGATURE TAH WITH HAH INITIAL FORM', specials={'initial',0x0637,0x062D} },
+ [0xFCB9] = { unicodeslot=0xFCB9, category='lo', description='ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM', specials={'initial',0x0638,0x0645} },
+ [0xFCBA] = { unicodeslot=0xFCBA, category='lo', description='ARABIC LIGATURE AIN WITH JEEM INITIAL FORM', specials={'initial',0x0639,0x062C} },
+ [0xFCBB] = { unicodeslot=0xFCBB, category='lo', description='ARABIC LIGATURE AIN WITH MEEM INITIAL FORM', specials={'initial',0x0639,0x0645} },
+ [0xFCBC] = { unicodeslot=0xFCBC, category='lo', description='ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM', specials={'initial',0x063A,0x062C} },
+ [0xFCBD] = { unicodeslot=0xFCBD, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM', specials={'initial',0x063A,0x0645} },
+ [0xFCBE] = { unicodeslot=0xFCBE, category='lo', description='ARABIC LIGATURE FEH WITH JEEM INITIAL FORM', specials={'initial',0x0641,0x062C} },
+ [0xFCBF] = { unicodeslot=0xFCBF, category='lo', description='ARABIC LIGATURE FEH WITH HAH INITIAL FORM', specials={'initial',0x0641,0x062D} },
+ [0xFCC0] = { unicodeslot=0xFCC0, category='lo', description='ARABIC LIGATURE FEH WITH KHAH INITIAL FORM', specials={'initial',0x0641,0x062E} },
+ [0xFCC1] = { unicodeslot=0xFCC1, category='lo', description='ARABIC LIGATURE FEH WITH MEEM INITIAL FORM', specials={'initial',0x0641,0x0645} },
+ [0xFCC2] = { unicodeslot=0xFCC2, category='lo', description='ARABIC LIGATURE QAF WITH HAH INITIAL FORM', specials={'initial',0x0642,0x062D} },
+ [0xFCC3] = { unicodeslot=0xFCC3, category='lo', description='ARABIC LIGATURE QAF WITH MEEM INITIAL FORM', specials={'initial',0x0642,0x0645} },
+ [0xFCC4] = { unicodeslot=0xFCC4, category='lo', description='ARABIC LIGATURE KAF WITH JEEM INITIAL FORM', specials={'initial',0x0643,0x062C} },
+ [0xFCC5] = { unicodeslot=0xFCC5, category='lo', description='ARABIC LIGATURE KAF WITH HAH INITIAL FORM', specials={'initial',0x0643,0x062D} },
+ [0xFCC6] = { unicodeslot=0xFCC6, category='lo', description='ARABIC LIGATURE KAF WITH KHAH INITIAL FORM', specials={'initial',0x0643,0x062E} },
+ [0xFCC7] = { unicodeslot=0xFCC7, category='lo', description='ARABIC LIGATURE KAF WITH LAM INITIAL FORM', specials={'initial',0x0643,0x0644} },
+ [0xFCC8] = { unicodeslot=0xFCC8, category='lo', description='ARABIC LIGATURE KAF WITH MEEM INITIAL FORM', specials={'initial',0x0643,0x0645} },
+ [0xFCC9] = { unicodeslot=0xFCC9, category='lo', description='ARABIC LIGATURE LAM WITH JEEM INITIAL FORM', specials={'initial',0x0644,0x062C} },
+ [0xFCCA] = { unicodeslot=0xFCCA, category='lo', description='ARABIC LIGATURE LAM WITH HAH INITIAL FORM', specials={'initial',0x0644,0x062D} },
+ [0xFCCB] = { unicodeslot=0xFCCB, category='lo', description='ARABIC LIGATURE LAM WITH KHAH INITIAL FORM', specials={'initial',0x0644,0x062E} },
+ [0xFCCC] = { unicodeslot=0xFCCC, category='lo', description='ARABIC LIGATURE LAM WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x0645} },
+ [0xFCCD] = { unicodeslot=0xFCCD, category='lo', description='ARABIC LIGATURE LAM WITH HEH INITIAL FORM', specials={'initial',0x0644,0x0647} },
+ [0xFCCE] = { unicodeslot=0xFCCE, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM', specials={'initial',0x0645,0x062C} },
+ [0xFCCF] = { unicodeslot=0xFCCF, category='lo', description='ARABIC LIGATURE MEEM WITH HAH INITIAL FORM', specials={'initial',0x0645,0x062D} },
+ [0xFCD0] = { unicodeslot=0xFCD0, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM', specials={'initial',0x0645,0x062E} },
+ [0xFCD1] = { unicodeslot=0xFCD1, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x0645} },
+ [0xFCD2] = { unicodeslot=0xFCD2, category='lo', description='ARABIC LIGATURE NOON WITH JEEM INITIAL FORM', specials={'initial',0x0646,0x062C} },
+ [0xFCD3] = { unicodeslot=0xFCD3, category='lo', description='ARABIC LIGATURE NOON WITH HAH INITIAL FORM', specials={'initial',0x0646,0x062D} },
+ [0xFCD4] = { unicodeslot=0xFCD4, category='lo', description='ARABIC LIGATURE NOON WITH KHAH INITIAL FORM', specials={'initial',0x0646,0x062E} },
+ [0xFCD5] = { unicodeslot=0xFCD5, category='lo', description='ARABIC LIGATURE NOON WITH MEEM INITIAL FORM', specials={'initial',0x0646,0x0645} },
+ [0xFCD6] = { unicodeslot=0xFCD6, category='lo', description='ARABIC LIGATURE NOON WITH HEH INITIAL FORM', specials={'initial',0x0646,0x0647} },
+ [0xFCD7] = { unicodeslot=0xFCD7, category='lo', description='ARABIC LIGATURE HEH WITH JEEM INITIAL FORM', specials={'initial',0x0647,0x062C} },
+ [0xFCD8] = { unicodeslot=0xFCD8, category='lo', description='ARABIC LIGATURE HEH WITH MEEM INITIAL FORM', specials={'initial',0x0647,0x0645} },
+ [0xFCD9] = { unicodeslot=0xFCD9, category='lo', description='ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM', specials={'initial',0x0647,0x0670} },
+ [0xFCDA] = { unicodeslot=0xFCDA, category='lo', description='ARABIC LIGATURE YEH WITH JEEM INITIAL FORM', specials={'initial',0x064A,0x062C} },
+ [0xFCDB] = { unicodeslot=0xFCDB, category='lo', description='ARABIC LIGATURE YEH WITH HAH INITIAL FORM', specials={'initial',0x064A,0x062D} },
+ [0xFCDC] = { unicodeslot=0xFCDC, category='lo', description='ARABIC LIGATURE YEH WITH KHAH INITIAL FORM', specials={'initial',0x064A,0x062E} },
+ [0xFCDD] = { unicodeslot=0xFCDD, category='lo', description='ARABIC LIGATURE YEH WITH MEEM INITIAL FORM', specials={'initial',0x064A,0x0645} },
+ [0xFCDE] = { unicodeslot=0xFCDE, category='lo', description='ARABIC LIGATURE YEH WITH HEH INITIAL FORM', specials={'initial',0x064A,0x0647} },
+ [0xFCDF] = { unicodeslot=0xFCDF, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM', specials={'medial',0x0626,0x0645} },
+ [0xFCE0] = { unicodeslot=0xFCE0, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM', specials={'medial',0x0626,0x0647} },
+ [0xFCE1] = { unicodeslot=0xFCE1, category='lo', description='ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM', specials={'medial',0x0628,0x0645} },
+ [0xFCE2] = { unicodeslot=0xFCE2, category='lo', description='ARABIC LIGATURE BEH WITH HEH MEDIAL FORM', specials={'medial',0x0628,0x0647} },
+ [0xFCE3] = { unicodeslot=0xFCE3, category='lo', description='ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM', specials={'medial',0x062A,0x0645} },
+ [0xFCE4] = { unicodeslot=0xFCE4, category='lo', description='ARABIC LIGATURE TEH WITH HEH MEDIAL FORM', specials={'medial',0x062A,0x0647} },
+ [0xFCE5] = { unicodeslot=0xFCE5, category='lo', description='ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM', specials={'medial',0x062B,0x0645} },
+ [0xFCE6] = { unicodeslot=0xFCE6, category='lo', description='ARABIC LIGATURE THEH WITH HEH MEDIAL FORM', specials={'medial',0x062B,0x0647} },
+ [0xFCE7] = { unicodeslot=0xFCE7, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM', specials={'medial',0x0633,0x0645} },
+ [0xFCE8] = { unicodeslot=0xFCE8, category='lo', description='ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM', specials={'medial',0x0633,0x0647} },
+ [0xFCE9] = { unicodeslot=0xFCE9, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM', specials={'medial',0x0634,0x0645} },
+ [0xFCEA] = { unicodeslot=0xFCEA, category='lo', description='ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM', specials={'medial',0x0634,0x0647} },
+ [0xFCEB] = { unicodeslot=0xFCEB, category='lo', description='ARABIC LIGATURE KAF WITH LAM MEDIAL FORM', specials={'medial',0x0643,0x0644} },
+ [0xFCEC] = { unicodeslot=0xFCEC, category='lo', description='ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM', specials={'medial',0x0643,0x0645} },
+ [0xFCED] = { unicodeslot=0xFCED, category='lo', description='ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM', specials={'medial',0x0644,0x0645} },
+ [0xFCEE] = { unicodeslot=0xFCEE, category='lo', description='ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM', specials={'medial',0x0646,0x0645} },
+ [0xFCEF] = { unicodeslot=0xFCEF, category='lo', description='ARABIC LIGATURE NOON WITH HEH MEDIAL FORM', specials={'medial',0x0646,0x0647} },
+ [0xFCF0] = { unicodeslot=0xFCF0, category='lo', description='ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM', specials={'medial',0x064A,0x0645} },
+ [0xFCF1] = { unicodeslot=0xFCF1, category='lo', description='ARABIC LIGATURE YEH WITH HEH MEDIAL FORM', specials={'medial',0x064A,0x0647} },
+ [0xFCF2] = { unicodeslot=0xFCF2, category='lo', description='ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM', specials={'medial',0x0640,0x064E,0x0651} },
+ [0xFCF3] = { unicodeslot=0xFCF3, category='lo', description='ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM', specials={'medial',0x0640,0x064F,0x0651} },
+ [0xFCF4] = { unicodeslot=0xFCF4, category='lo', description='ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM', specials={'medial',0x0640,0x0650,0x0651} },
+ [0xFCF5] = { unicodeslot=0xFCF5, category='lo', description='ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0637,0x0649} },
+ [0xFCF6] = { unicodeslot=0xFCF6, category='lo', description='ARABIC LIGATURE TAH WITH YEH ISOLATED FORM', specials={'isolated',0x0637,0x064A} },
+ [0xFCF7] = { unicodeslot=0xFCF7, category='lo', description='ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0639,0x0649} },
+ [0xFCF8] = { unicodeslot=0xFCF8, category='lo', description='ARABIC LIGATURE AIN WITH YEH ISOLATED FORM', specials={'isolated',0x0639,0x064A} },
+ [0xFCF9] = { unicodeslot=0xFCF9, category='lo', description='ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x063A,0x0649} },
+ [0xFCFA] = { unicodeslot=0xFCFA, category='lo', description='ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM', specials={'isolated',0x063A,0x064A} },
+ [0xFCFB] = { unicodeslot=0xFCFB, category='lo', description='ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0633,0x0649} },
+ [0xFCFC] = { unicodeslot=0xFCFC, category='lo', description='ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM', specials={'isolated',0x0633,0x064A} },
+ [0xFCFD] = { unicodeslot=0xFCFD, category='lo', description='ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0634,0x0649} },
+ [0xFCFE] = { unicodeslot=0xFCFE, category='lo', description='ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM', specials={'isolated',0x0634,0x064A} },
+ [0xFCFF] = { unicodeslot=0xFCFF, category='lo', description='ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062D,0x0649} },
+ [0xFD00] = { unicodeslot=0xFD00, category='lo', description='ARABIC LIGATURE HAH WITH YEH ISOLATED FORM', specials={'isolated',0x062D,0x064A} },
+ [0xFD01] = { unicodeslot=0xFD01, category='lo', description='ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062C,0x0649} },
+ [0xFD02] = { unicodeslot=0xFD02, category='lo', description='ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM', specials={'isolated',0x062C,0x064A} },
+ [0xFD03] = { unicodeslot=0xFD03, category='lo', description='ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062E,0x0649} },
+ [0xFD04] = { unicodeslot=0xFD04, category='lo', description='ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM', specials={'isolated',0x062E,0x064A} },
+ [0xFD05] = { unicodeslot=0xFD05, category='lo', description='ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0635,0x0649} },
+ [0xFD06] = { unicodeslot=0xFD06, category='lo', description='ARABIC LIGATURE SAD WITH YEH ISOLATED FORM', specials={'isolated',0x0635,0x064A} },
+ [0xFD07] = { unicodeslot=0xFD07, category='lo', description='ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0636,0x0649} },
+ [0xFD08] = { unicodeslot=0xFD08, category='lo', description='ARABIC LIGATURE DAD WITH YEH ISOLATED FORM', specials={'isolated',0x0636,0x064A} },
+ [0xFD09] = { unicodeslot=0xFD09, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM', specials={'isolated',0x0634,0x062C} },
+ [0xFD0A] = { unicodeslot=0xFD0A, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM', specials={'isolated',0x0634,0x062D} },
+ [0xFD0B] = { unicodeslot=0xFD0B, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM', specials={'isolated',0x0634,0x062E} },
+ [0xFD0C] = { unicodeslot=0xFD0C, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM', specials={'isolated',0x0634,0x0645} },
+ [0xFD0D] = { unicodeslot=0xFD0D, category='lo', description='ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM', specials={'isolated',0x0634,0x0631} },
+ [0xFD0E] = { unicodeslot=0xFD0E, category='lo', description='ARABIC LIGATURE SEEN WITH REH ISOLATED FORM', specials={'isolated',0x0633,0x0631} },
+ [0xFD0F] = { unicodeslot=0xFD0F, category='lo', description='ARABIC LIGATURE SAD WITH REH ISOLATED FORM', specials={'isolated',0x0635,0x0631} },
+ [0xFD10] = { unicodeslot=0xFD10, category='lo', description='ARABIC LIGATURE DAD WITH REH ISOLATED FORM', specials={'isolated',0x0636,0x0631} },
+ [0xFD11] = { unicodeslot=0xFD11, category='lo', description='ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0637,0x0649} },
+ [0xFD12] = { unicodeslot=0xFD12, category='lo', description='ARABIC LIGATURE TAH WITH YEH FINAL FORM', specials={'final',0x0637,0x064A} },
+ [0xFD13] = { unicodeslot=0xFD13, category='lo', description='ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0639,0x0649} },
+ [0xFD14] = { unicodeslot=0xFD14, category='lo', description='ARABIC LIGATURE AIN WITH YEH FINAL FORM', specials={'final',0x0639,0x064A} },
+ [0xFD15] = { unicodeslot=0xFD15, category='lo', description='ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x063A,0x0649} },
+ [0xFD16] = { unicodeslot=0xFD16, category='lo', description='ARABIC LIGATURE GHAIN WITH YEH FINAL FORM', specials={'final',0x063A,0x064A} },
+ [0xFD17] = { unicodeslot=0xFD17, category='lo', description='ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0633,0x0649} },
+ [0xFD18] = { unicodeslot=0xFD18, category='lo', description='ARABIC LIGATURE SEEN WITH YEH FINAL FORM', specials={'final',0x0633,0x064A} },
+ [0xFD19] = { unicodeslot=0xFD19, category='lo', description='ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0634,0x0649} },
+ [0xFD1A] = { unicodeslot=0xFD1A, category='lo', description='ARABIC LIGATURE SHEEN WITH YEH FINAL FORM', specials={'final',0x0634,0x064A} },
+ [0xFD1B] = { unicodeslot=0xFD1B, category='lo', description='ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062D,0x0649} },
+ [0xFD1C] = { unicodeslot=0xFD1C, category='lo', description='ARABIC LIGATURE HAH WITH YEH FINAL FORM', specials={'final',0x062D,0x064A} },
+ [0xFD1D] = { unicodeslot=0xFD1D, category='lo', description='ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062C,0x0649} },
+ [0xFD1E] = { unicodeslot=0xFD1E, category='lo', description='ARABIC LIGATURE JEEM WITH YEH FINAL FORM', specials={'final',0x062C,0x064A} },
+ [0xFD1F] = { unicodeslot=0xFD1F, category='lo', description='ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062E,0x0649} },
+ [0xFD20] = { unicodeslot=0xFD20, category='lo', description='ARABIC LIGATURE KHAH WITH YEH FINAL FORM', specials={'final',0x062E,0x064A} },
+ [0xFD21] = { unicodeslot=0xFD21, category='lo', description='ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0635,0x0649} },
+ [0xFD22] = { unicodeslot=0xFD22, category='lo', description='ARABIC LIGATURE SAD WITH YEH FINAL FORM', specials={'final',0x0635,0x064A} },
+ [0xFD23] = { unicodeslot=0xFD23, category='lo', description='ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0636,0x0649} },
+ [0xFD24] = { unicodeslot=0xFD24, category='lo', description='ARABIC LIGATURE DAD WITH YEH FINAL FORM', specials={'final',0x0636,0x064A} },
+ [0xFD25] = { unicodeslot=0xFD25, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM', specials={'final',0x0634,0x062C} },
+ [0xFD26] = { unicodeslot=0xFD26, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH FINAL FORM', specials={'final',0x0634,0x062D} },
+ [0xFD27] = { unicodeslot=0xFD27, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM', specials={'final',0x0634,0x062E} },
+ [0xFD28] = { unicodeslot=0xFD28, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM', specials={'final',0x0634,0x0645} },
+ [0xFD29] = { unicodeslot=0xFD29, category='lo', description='ARABIC LIGATURE SHEEN WITH REH FINAL FORM', specials={'final',0x0634,0x0631} },
+ [0xFD2A] = { unicodeslot=0xFD2A, category='lo', description='ARABIC LIGATURE SEEN WITH REH FINAL FORM', specials={'final',0x0633,0x0631} },
+ [0xFD2B] = { unicodeslot=0xFD2B, category='lo', description='ARABIC LIGATURE SAD WITH REH FINAL FORM', specials={'final',0x0635,0x0631} },
+ [0xFD2C] = { unicodeslot=0xFD2C, category='lo', description='ARABIC LIGATURE DAD WITH REH FINAL FORM', specials={'final',0x0636,0x0631} },
+ [0xFD2D] = { unicodeslot=0xFD2D, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM', specials={'initial',0x0634,0x062C} },
+ [0xFD2E] = { unicodeslot=0xFD2E, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM', specials={'initial',0x0634,0x062D} },
+ [0xFD2F] = { unicodeslot=0xFD2F, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM', specials={'initial',0x0634,0x062E} },
+ [0xFD30] = { unicodeslot=0xFD30, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM', specials={'initial',0x0634,0x0645} },
+ [0xFD31] = { unicodeslot=0xFD31, category='lo', description='ARABIC LIGATURE SEEN WITH HEH INITIAL FORM', specials={'initial',0x0633,0x0647} },
+ [0xFD32] = { unicodeslot=0xFD32, category='lo', description='ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM', specials={'initial',0x0634,0x0647} },
+ [0xFD33] = { unicodeslot=0xFD33, category='lo', description='ARABIC LIGATURE TAH WITH MEEM INITIAL FORM', specials={'initial',0x0637,0x0645} },
+ [0xFD34] = { unicodeslot=0xFD34, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM', specials={'medial',0x0633,0x062C} },
+ [0xFD35] = { unicodeslot=0xFD35, category='lo', description='ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM', specials={'medial',0x0633,0x062D} },
+ [0xFD36] = { unicodeslot=0xFD36, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM', specials={'medial',0x0633,0x062E} },
+ [0xFD37] = { unicodeslot=0xFD37, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM', specials={'medial',0x0634,0x062C} },
+ [0xFD38] = { unicodeslot=0xFD38, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM', specials={'medial',0x0634,0x062D} },
+ [0xFD39] = { unicodeslot=0xFD39, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM', specials={'medial',0x0634,0x062E} },
+ [0xFD3A] = { unicodeslot=0xFD3A, category='lo', description='ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM', specials={'medial',0x0637,0x0645} },
+ [0xFD3B] = { unicodeslot=0xFD3B, category='lo', description='ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM', specials={'medial',0x0638,0x0645} },
+ [0xFD3C] = { unicodeslot=0xFD3C, category='lo', description='ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM', specials={'final',0x0627,0x064B} },
+ [0xFD3D] = { unicodeslot=0xFD3D, category='lo', description='ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM', specials={'isolated',0x0627,0x064B} },
+ [0xFD3E] = { unicodeslot=0xFD3E, category='ps', description='ORNATE LEFT PARENTHESIS' },
+ [0xFD3F] = { unicodeslot=0xFD3F, category='pe', description='ORNATE RIGHT PARENTHESIS' },
+ [0xFD50] = { unicodeslot=0xFD50, category='lo', description='ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x062C,0x0645} },
+ [0xFD51] = { unicodeslot=0xFD51, category='lo', description='ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM', specials={'final',0x062A,0x062D,0x062C} },
+ [0xFD52] = { unicodeslot=0xFD52, category='lo', description='ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM', specials={'initial',0x062A,0x062D,0x062C} },
+ [0xFD53] = { unicodeslot=0xFD53, category='lo', description='ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x062D,0x0645} },
+ [0xFD54] = { unicodeslot=0xFD54, category='lo', description='ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x062E,0x0645} },
+ [0xFD55] = { unicodeslot=0xFD55, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM', specials={'initial',0x062A,0x0645,0x062C} },
+ [0xFD56] = { unicodeslot=0xFD56, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x062A,0x0645,0x062D} },
+ [0xFD57] = { unicodeslot=0xFD57, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM', specials={'initial',0x062A,0x0645,0x062E} },
+ [0xFD58] = { unicodeslot=0xFD58, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM', specials={'final',0x062C,0x0645,0x062D} },
+ [0xFD59] = { unicodeslot=0xFD59, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x062C,0x0645,0x062D} },
+ [0xFD5A] = { unicodeslot=0xFD5A, category='lo', description='ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x062D,0x0645,0x064A} },
+ [0xFD5B] = { unicodeslot=0xFD5B, category='lo', description='ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062D,0x0645,0x0649} },
+ [0xFD5C] = { unicodeslot=0xFD5C, category='lo', description='ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM', specials={'initial',0x0633,0x062D,0x062C} },
+ [0xFD5D] = { unicodeslot=0xFD5D, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM', specials={'initial',0x0633,0x062C,0x062D} },
+ [0xFD5E] = { unicodeslot=0xFD5E, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0633,0x062C,0x0649} },
+ [0xFD5F] = { unicodeslot=0xFD5F, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0633,0x0645,0x062D} },
+ [0xFD60] = { unicodeslot=0xFD60, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0633,0x0645,0x062D} },
+ [0xFD61] = { unicodeslot=0xFD61, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM', specials={'initial',0x0633,0x0645,0x062C} },
+ [0xFD62] = { unicodeslot=0xFD62, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0633,0x0645,0x0645} },
+ [0xFD63] = { unicodeslot=0xFD63, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0633,0x0645,0x0645} },
+ [0xFD64] = { unicodeslot=0xFD64, category='lo', description='ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM', specials={'final',0x0635,0x062D,0x062D} },
+ [0xFD65] = { unicodeslot=0xFD65, category='lo', description='ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM', specials={'initial',0x0635,0x062D,0x062D} },
+ [0xFD66] = { unicodeslot=0xFD66, category='lo', description='ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0635,0x0645,0x0645} },
+ [0xFD67] = { unicodeslot=0xFD67, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM', specials={'final',0x0634,0x062D,0x0645} },
+ [0xFD68] = { unicodeslot=0xFD68, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0634,0x062D,0x0645} },
+ [0xFD69] = { unicodeslot=0xFD69, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0634,0x062C,0x064A} },
+ [0xFD6A] = { unicodeslot=0xFD6A, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM', specials={'final',0x0634,0x0645,0x062E} },
+ [0xFD6B] = { unicodeslot=0xFD6B, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM', specials={'initial',0x0634,0x0645,0x062E} },
+ [0xFD6C] = { unicodeslot=0xFD6C, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0634,0x0645,0x0645} },
+ [0xFD6D] = { unicodeslot=0xFD6D, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0634,0x0645,0x0645} },
+ [0xFD6E] = { unicodeslot=0xFD6E, category='lo', description='ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0636,0x062D,0x0649} },
+ [0xFD6F] = { unicodeslot=0xFD6F, category='lo', description='ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM', specials={'final',0x0636,0x062E,0x0645} },
+ [0xFD70] = { unicodeslot=0xFD70, category='lo', description='ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0636,0x062E,0x0645} },
+ [0xFD71] = { unicodeslot=0xFD71, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0637,0x0645,0x062D} },
+ [0xFD72] = { unicodeslot=0xFD72, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0637,0x0645,0x062D} },
+ [0xFD73] = { unicodeslot=0xFD73, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0637,0x0645,0x0645} },
+ [0xFD74] = { unicodeslot=0xFD74, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0637,0x0645,0x064A} },
+ [0xFD75] = { unicodeslot=0xFD75, category='lo', description='ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM', specials={'final',0x0639,0x062C,0x0645} },
+ [0xFD76] = { unicodeslot=0xFD76, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0639,0x0645,0x0645} },
+ [0xFD77] = { unicodeslot=0xFD77, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0639,0x0645,0x0645} },
+ [0xFD78] = { unicodeslot=0xFD78, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0639,0x0645,0x0649} },
+ [0xFD79] = { unicodeslot=0xFD79, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x063A,0x0645,0x0645} },
+ [0xFD7A] = { unicodeslot=0xFD7A, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM', specials={'final',0x063A,0x0645,0x064A} },
+ [0xFD7B] = { unicodeslot=0xFD7B, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x063A,0x0645,0x0649} },
+ [0xFD7C] = { unicodeslot=0xFD7C, category='lo', description='ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM', specials={'final',0x0641,0x062E,0x0645} },
+ [0xFD7D] = { unicodeslot=0xFD7D, category='lo', description='ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0641,0x062E,0x0645} },
+ [0xFD7E] = { unicodeslot=0xFD7E, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0642,0x0645,0x062D} },
+ [0xFD7F] = { unicodeslot=0xFD7F, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0642,0x0645,0x0645} },
+ [0xFD80] = { unicodeslot=0xFD80, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM', specials={'final',0x0644,0x062D,0x0645} },
+ [0xFD81] = { unicodeslot=0xFD81, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM', specials={'final',0x0644,0x062D,0x064A} },
+ [0xFD82] = { unicodeslot=0xFD82, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0644,0x062D,0x0649} },
+ [0xFD83] = { unicodeslot=0xFD83, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM', specials={'initial',0x0644,0x062C,0x062C} },
+ [0xFD84] = { unicodeslot=0xFD84, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM', specials={'final',0x0644,0x062C,0x062C} },
+ [0xFD85] = { unicodeslot=0xFD85, category='lo', description='ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM', specials={'final',0x0644,0x062E,0x0645} },
+ [0xFD86] = { unicodeslot=0xFD86, category='lo', description='ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x062E,0x0645} },
+ [0xFD87] = { unicodeslot=0xFD87, category='lo', description='ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0644,0x0645,0x062D} },
+ [0xFD88] = { unicodeslot=0xFD88, category='lo', description='ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0644,0x0645,0x062D} },
+ [0xFD89] = { unicodeslot=0xFD89, category='lo', description='ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM', specials={'initial',0x0645,0x062D,0x062C} },
+ [0xFD8A] = { unicodeslot=0xFD8A, category='lo', description='ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x062D,0x0645} },
+ [0xFD8B] = { unicodeslot=0xFD8B, category='lo', description='ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM', specials={'final',0x0645,0x062D,0x064A} },
+ [0xFD8C] = { unicodeslot=0xFD8C, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM', specials={'initial',0x0645,0x062C,0x062D} },
+ [0xFD8D] = { unicodeslot=0xFD8D, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x062C,0x0645} },
+ [0xFD8E] = { unicodeslot=0xFD8E, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM', specials={'initial',0x0645,0x062E,0x062C} },
+ [0xFD8F] = { unicodeslot=0xFD8F, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x062E,0x0645} },
+ [0xFD92] = { unicodeslot=0xFD92, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM', specials={'initial',0x0645,0x062C,0x062E} },
+ [0xFD93] = { unicodeslot=0xFD93, category='lo', description='ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM', specials={'initial',0x0647,0x0645,0x062C} },
+ [0xFD94] = { unicodeslot=0xFD94, category='lo', description='ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0647,0x0645,0x0645} },
+ [0xFD95] = { unicodeslot=0xFD95, category='lo', description='ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0646,0x062D,0x0645} },
+ [0xFD96] = { unicodeslot=0xFD96, category='lo', description='ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x062D,0x0649} },
+ [0xFD97] = { unicodeslot=0xFD97, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM', specials={'final',0x0646,0x062C,0x0645} },
+ [0xFD98] = { unicodeslot=0xFD98, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0646,0x062C,0x0645} },
+ [0xFD99] = { unicodeslot=0xFD99, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x062C,0x0649} },
+ [0xFD9A] = { unicodeslot=0xFD9A, category='lo', description='ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0646,0x0645,0x064A} },
+ [0xFD9B] = { unicodeslot=0xFD9B, category='lo', description='ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x0645,0x0649} },
+ [0xFD9C] = { unicodeslot=0xFD9C, category='lo', description='ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x064A,0x0645,0x0645} },
+ [0xFD9D] = { unicodeslot=0xFD9D, category='lo', description='ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x064A,0x0645,0x0645} },
+ [0xFD9E] = { unicodeslot=0xFD9E, category='lo', description='ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM', specials={'final',0x0628,0x062E,0x064A} },
+ [0xFD9F] = { unicodeslot=0xFD9F, category='lo', description='ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM', specials={'final',0x062A,0x062C,0x064A} },
+ [0xFDA0] = { unicodeslot=0xFDA0, category='lo', description='ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x062C,0x0649} },
+ [0xFDA1] = { unicodeslot=0xFDA1, category='lo', description='ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM', specials={'final',0x062A,0x062E,0x064A} },
+ [0xFDA2] = { unicodeslot=0xFDA2, category='lo', description='ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x062E,0x0649} },
+ [0xFDA3] = { unicodeslot=0xFDA3, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x062A,0x0645,0x064A} },
+ [0xFDA4] = { unicodeslot=0xFDA4, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x0645,0x0649} },
+ [0xFDA5] = { unicodeslot=0xFDA5, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM', specials={'final',0x062C,0x0645,0x064A} },
+ [0xFDA6] = { unicodeslot=0xFDA6, category='lo', description='ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062C,0x062D,0x0649} },
+ [0xFDA7] = { unicodeslot=0xFDA7, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062C,0x0645,0x0649} },
+ [0xFDA8] = { unicodeslot=0xFDA8, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0633,0x062E,0x0649} },
+ [0xFDA9] = { unicodeslot=0xFDA9, category='lo', description='ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM', specials={'final',0x0635,0x062D,0x064A} },
+ [0xFDAA] = { unicodeslot=0xFDAA, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM', specials={'final',0x0634,0x062D,0x064A} },
+ [0xFDAB] = { unicodeslot=0xFDAB, category='lo', description='ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM', specials={'final',0x0636,0x062D,0x064A} },
+ [0xFDAC] = { unicodeslot=0xFDAC, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0644,0x062C,0x064A} },
+ [0xFDAD] = { unicodeslot=0xFDAD, category='lo', description='ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0644,0x0645,0x064A} },
+ [0xFDAE] = { unicodeslot=0xFDAE, category='lo', description='ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM', specials={'final',0x064A,0x062D,0x064A} },
+ [0xFDAF] = { unicodeslot=0xFDAF, category='lo', description='ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM', specials={'final',0x064A,0x062C,0x064A} },
+ [0xFDB0] = { unicodeslot=0xFDB0, category='lo', description='ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x064A,0x0645,0x064A} },
+ [0xFDB1] = { unicodeslot=0xFDB1, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0645,0x0645,0x064A} },
+ [0xFDB2] = { unicodeslot=0xFDB2, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0642,0x0645,0x064A} },
+ [0xFDB3] = { unicodeslot=0xFDB3, category='lo', description='ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM', specials={'final',0x0646,0x062D,0x064A} },
+ [0xFDB4] = { unicodeslot=0xFDB4, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0642,0x0645,0x062D} },
+ [0xFDB5] = { unicodeslot=0xFDB5, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x062D,0x0645} },
+ [0xFDB6] = { unicodeslot=0xFDB6, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0639,0x0645,0x064A} },
+ [0xFDB7] = { unicodeslot=0xFDB7, category='lo', description='ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0643,0x0645,0x064A} },
+ [0xFDB8] = { unicodeslot=0xFDB8, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM', specials={'initial',0x0646,0x062C,0x062D} },
+ [0xFDB9] = { unicodeslot=0xFDB9, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM', specials={'final',0x0645,0x062E,0x064A} },
+ [0xFDBA] = { unicodeslot=0xFDBA, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x062C,0x0645} },
+ [0xFDBB] = { unicodeslot=0xFDBB, category='lo', description='ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0643,0x0645,0x0645} },
+ [0xFDBC] = { unicodeslot=0xFDBC, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM', specials={'final',0x0644,0x062C,0x0645} },
+ [0xFDBD] = { unicodeslot=0xFDBD, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM', specials={'final',0x0646,0x062C,0x062D} },
+ [0xFDBE] = { unicodeslot=0xFDBE, category='lo', description='ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM', specials={'final',0x062C,0x062D,0x064A} },
+ [0xFDBF] = { unicodeslot=0xFDBF, category='lo', description='ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM', specials={'final',0x062D,0x062C,0x064A} },
+ [0xFDC0] = { unicodeslot=0xFDC0, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0645,0x062C,0x064A} },
+ [0xFDC1] = { unicodeslot=0xFDC1, category='lo', description='ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0641,0x0645,0x064A} },
+ [0xFDC2] = { unicodeslot=0xFDC2, category='lo', description='ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM', specials={'final',0x0628,0x062D,0x064A} },
+ [0xFDC3] = { unicodeslot=0xFDC3, category='lo', description='ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0643,0x0645,0x0645} },
+ [0xFDC4] = { unicodeslot=0xFDC4, category='lo', description='ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0639,0x062C,0x0645} },
+ [0xFDC5] = { unicodeslot=0xFDC5, category='lo', description='ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0635,0x0645,0x0645} },
+ [0xFDC6] = { unicodeslot=0xFDC6, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM', specials={'final',0x0633,0x062E,0x064A} },
+ [0xFDC7] = { unicodeslot=0xFDC7, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0646,0x062C,0x064A} },
+ [0xFDF0] = { unicodeslot=0xFDF0, category='lo', description='ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM', specials={'isolated',0x0635,0x0644,0x06D2} },
+ [0xFDF1] = { unicodeslot=0xFDF1, category='lo', description='ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM', specials={'isolated',0x0642,0x0644,0x06D2} },
+ [0xFDF2] = { unicodeslot=0xFDF2, category='lo', description='ARABIC LIGATURE ALLAH ISOLATED FORM', specials={'isolated',0x0627,0x0644,0x0644,0x0647} },
+ [0xFDF3] = { unicodeslot=0xFDF3, category='lo', description='ARABIC LIGATURE AKBAR ISOLATED FORM', specials={'isolated',0x0627,0x0643,0x0628,0x0631} },
+ [0xFDF4] = { unicodeslot=0xFDF4, category='lo', description='ARABIC LIGATURE MOHAMMAD ISOLATED FORM', specials={'isolated',0x0645,0x062D,0x0645,0x062F} },
+ [0xFDF5] = { unicodeslot=0xFDF5, category='lo', description='ARABIC LIGATURE SALAM ISOLATED FORM', specials={'isolated',0x0635,0x0644,0x0639,0x0645} },
+ [0xFDF6] = { unicodeslot=0xFDF6, category='lo', description='ARABIC LIGATURE RASOUL ISOLATED FORM', specials={'isolated',0x0631,0x0633,0x0648,0x0644} },
+ [0xFDF7] = { unicodeslot=0xFDF7, category='lo', description='ARABIC LIGATURE ALAYHE ISOLATED FORM', specials={'isolated',0x0639,0x0644,0x064A,0x0647} },
+ [0xFDF8] = { unicodeslot=0xFDF8, category='lo', description='ARABIC LIGATURE WASALLAM ISOLATED FORM', specials={'isolated',0x0648,0x0633,0x0644,0x0645} },
+ [0xFDF9] = { unicodeslot=0xFDF9, category='lo', description='ARABIC LIGATURE SALLA ISOLATED FORM', specials={'isolated',0x0635,0x0644,0x0649} },
+ [0xFDFA] = { unicodeslot=0xFDFA, category='lo', description='ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM', specials={'isolated',0x0635,0x0644,0x0649,0x0020,0x0627,0x0644,0x0644,0x0647,0x0020,0x0639,0x0644,0x064A,0x0647,0x0020,0x0648,0x0633,0x0644,0x0645} },
+ [0xFDFB] = { unicodeslot=0xFDFB, category='lo', description='ARABIC LIGATURE JALLAJALALOUHOU', specials={'isolated',0x062C,0x0644,0x0020,0x062C,0x0644,0x0627,0x0644,0x0647} },
+ [0xFDFC] = { unicodeslot=0xFDFC, category='sc', description='RIAL SIGN', specials={'isolated',0x0631,0x06CC,0x0627,0x0644} },
+ [0xFDFD] = { unicodeslot=0xFDFD, category='so', description='ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM' },
+ [0xFE00] = { unicodeslot=0xFE00, category='mn', description='VARIATION SELECTOR-1' },
+ [0xFE01] = { unicodeslot=0xFE01, category='mn', description='VARIATION SELECTOR-2' },
+ [0xFE02] = { unicodeslot=0xFE02, category='mn', description='VARIATION SELECTOR-3' },
+ [0xFE03] = { unicodeslot=0xFE03, category='mn', description='VARIATION SELECTOR-4' },
+ [0xFE04] = { unicodeslot=0xFE04, category='mn', description='VARIATION SELECTOR-5' },
+ [0xFE05] = { unicodeslot=0xFE05, category='mn', description='VARIATION SELECTOR-6' },
+ [0xFE06] = { unicodeslot=0xFE06, category='mn', description='VARIATION SELECTOR-7' },
+ [0xFE07] = { unicodeslot=0xFE07, category='mn', description='VARIATION SELECTOR-8' },
+ [0xFE08] = { unicodeslot=0xFE08, category='mn', description='VARIATION SELECTOR-9' },
+ [0xFE09] = { unicodeslot=0xFE09, category='mn', description='VARIATION SELECTOR-10' },
+ [0xFE0A] = { unicodeslot=0xFE0A, category='mn', description='VARIATION SELECTOR-11' },
+ [0xFE0B] = { unicodeslot=0xFE0B, category='mn', description='VARIATION SELECTOR-12' },
+ [0xFE0C] = { unicodeslot=0xFE0C, category='mn', description='VARIATION SELECTOR-13' },
+ [0xFE0D] = { unicodeslot=0xFE0D, category='mn', description='VARIATION SELECTOR-14' },
+ [0xFE0E] = { unicodeslot=0xFE0E, category='mn', description='VARIATION SELECTOR-15' },
+ [0xFE0F] = { unicodeslot=0xFE0F, category='mn', description='VARIATION SELECTOR-16' },
+ [0xFE10] = { unicodeslot=0xFE10, category='po', description='PRESENTATION FORM FOR VERTICAL COMMA', specials={'vertical',0x002C} },
+ [0xFE11] = { unicodeslot=0xFE11, category='po', description='PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA', specials={'vertical',0x3001} },
+ [0xFE12] = { unicodeslot=0xFE12, category='po', description='PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP', specials={'vertical',0x3002} },
+ [0xFE13] = { unicodeslot=0xFE13, category='po', description='PRESENTATION FORM FOR VERTICAL COLON', specials={'vertical',0x003A} },
+ [0xFE14] = { unicodeslot=0xFE14, category='po', description='PRESENTATION FORM FOR VERTICAL SEMICOLON', specials={'vertical',0x003B} },
+ [0xFE15] = { unicodeslot=0xFE15, category='po', description='PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK', specials={'vertical',0x0021} },
+ [0xFE16] = { unicodeslot=0xFE16, category='po', description='PRESENTATION FORM FOR VERTICAL QUESTION MARK', specials={'vertical',0x003F} },
+ [0xFE17] = { unicodeslot=0xFE17, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET', specials={'vertical',0x3016} },
+ [0xFE18] = { unicodeslot=0xFE18, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET', specials={'vertical',0x3017} },
+ [0xFE19] = { unicodeslot=0xFE19, category='po', description='PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS', specials={'vertical',0x2026} },
+ [0xFE20] = { unicodeslot=0xFE20, category='mn', description='COMBINING LIGATURE LEFT HALF' },
+ [0xFE21] = { unicodeslot=0xFE21, category='mn', description='COMBINING LIGATURE RIGHT HALF' },
+ [0xFE22] = { unicodeslot=0xFE22, category='mn', description='COMBINING DOUBLE TILDE LEFT HALF' },
+ [0xFE23] = { unicodeslot=0xFE23, category='mn', description='COMBINING DOUBLE TILDE RIGHT HALF' },
+ [0xFE30] = { unicodeslot=0xFE30, category='po', description='PRESENTATION FORM FOR VERTICAL TWO DOT LEADER', specials={'vertical',0x2025} },
+ [0xFE31] = { unicodeslot=0xFE31, category='pd', description='PRESENTATION FORM FOR VERTICAL EM DASH', specials={'vertical',0x2014} },
+ [0xFE32] = { unicodeslot=0xFE32, category='pd', description='PRESENTATION FORM FOR VERTICAL EN DASH', specials={'vertical',0x2013} },
+ [0xFE33] = { unicodeslot=0xFE33, category='pc', description='PRESENTATION FORM FOR VERTICAL LOW LINE', specials={'vertical',0x005F} },
+ [0xFE34] = { unicodeslot=0xFE34, category='pc', description='PRESENTATION FORM FOR VERTICAL WAVY LOW LINE', specials={'vertical',0x005F} },
+ [0xFE35] = { unicodeslot=0xFE35, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS', specials={'vertical',0x0028} },
+ [0xFE36] = { unicodeslot=0xFE36, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS', specials={'vertical',0x0029} },
+ [0xFE37] = { unicodeslot=0xFE37, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET', specials={'vertical',0x007B} },
+ [0xFE38] = { unicodeslot=0xFE38, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET', specials={'vertical',0x007D} },
+ [0xFE39] = { unicodeslot=0xFE39, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET', specials={'vertical',0x3014} },
+ [0xFE3A] = { unicodeslot=0xFE3A, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET', specials={'vertical',0x3015} },
+ [0xFE3B] = { unicodeslot=0xFE3B, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET', specials={'vertical',0x3010} },
+ [0xFE3C] = { unicodeslot=0xFE3C, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET', specials={'vertical',0x3011} },
+ [0xFE3D] = { unicodeslot=0xFE3D, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET', specials={'vertical',0x300A} },
+ [0xFE3E] = { unicodeslot=0xFE3E, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET', specials={'vertical',0x300B} },
+ [0xFE3F] = { unicodeslot=0xFE3F, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET', specials={'vertical',0x3008} },
+ [0xFE40] = { unicodeslot=0xFE40, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET', specials={'vertical',0x3009} },
+ [0xFE41] = { unicodeslot=0xFE41, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET', specials={'vertical',0x300C} },
+ [0xFE42] = { unicodeslot=0xFE42, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET', specials={'vertical',0x300D} },
+ [0xFE43] = { unicodeslot=0xFE43, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET', specials={'vertical',0x300E} },
+ [0xFE44] = { unicodeslot=0xFE44, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET', specials={'vertical',0x300F} },
+ [0xFE45] = { unicodeslot=0xFE45, category='po', description='SESAME DOT' },
+ [0xFE46] = { unicodeslot=0xFE46, category='po', description='WHITE SESAME DOT' },
+ [0xFE47] = { unicodeslot=0xFE47, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET', specials={'vertical',0x005B} },
+ [0xFE48] = { unicodeslot=0xFE48, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET', specials={'vertical',0x005D} },
+ [0xFE49] = { unicodeslot=0xFE49, category='po', description='DASHED OVERLINE', specials={'compat',0x203E} },
+ [0xFE4A] = { unicodeslot=0xFE4A, category='po', description='CENTRELINE OVERLINE', specials={'compat',0x203E} },
+ [0xFE4B] = { unicodeslot=0xFE4B, category='po', description='WAVY OVERLINE', specials={'compat',0x203E} },
+ [0xFE4C] = { unicodeslot=0xFE4C, category='po', description='DOUBLE WAVY OVERLINE', specials={'compat',0x203E} },
+ [0xFE4D] = { unicodeslot=0xFE4D, category='pc', description='DASHED LOW LINE', specials={'compat',0x005F} },
+ [0xFE4E] = { unicodeslot=0xFE4E, category='pc', description='CENTRELINE LOW LINE', specials={'compat',0x005F} },
+ [0xFE4F] = { unicodeslot=0xFE4F, category='pc', description='WAVY LOW LINE', specials={'compat',0x005F} },
+ [0xFE50] = { unicodeslot=0xFE50, category='po', description='SMALL COMMA', specials={'small',0x002C} },
+ [0xFE51] = { unicodeslot=0xFE51, category='po', description='SMALL IDEOGRAPHIC COMMA', specials={'small',0x3001} },
+ [0xFE52] = { unicodeslot=0xFE52, category='po', description='SMALL FULL STOP', specials={'small',0x002E} },
+ [0xFE54] = { unicodeslot=0xFE54, category='po', description='SMALL SEMICOLON', specials={'small',0x003B} },
+ [0xFE55] = { unicodeslot=0xFE55, category='po', description='SMALL COLON', specials={'small',0x003A} },
+ [0xFE56] = { unicodeslot=0xFE56, category='po', description='SMALL QUESTION MARK', specials={'small',0x003F} },
+ [0xFE57] = { unicodeslot=0xFE57, category='po', description='SMALL EXCLAMATION MARK', specials={'small',0x0021} },
+ [0xFE58] = { unicodeslot=0xFE58, category='pd', description='SMALL EM DASH', specials={'small',0x2014} },
+ [0xFE59] = { unicodeslot=0xFE59, category='ps', description='SMALL LEFT PARENTHESIS', specials={'small',0x0028} },
+ [0xFE5A] = { unicodeslot=0xFE5A, category='pe', description='SMALL RIGHT PARENTHESIS', specials={'small',0x0029} },
+ [0xFE5B] = { unicodeslot=0xFE5B, category='ps', description='SMALL LEFT CURLY BRACKET', specials={'small',0x007B} },
+ [0xFE5C] = { unicodeslot=0xFE5C, category='pe', description='SMALL RIGHT CURLY BRACKET', specials={'small',0x007D} },
+ [0xFE5D] = { unicodeslot=0xFE5D, category='ps', description='SMALL LEFT TORTOISE SHELL BRACKET', specials={'small',0x3014} },
+ [0xFE5E] = { unicodeslot=0xFE5E, category='pe', description='SMALL RIGHT TORTOISE SHELL BRACKET', specials={'small',0x3015} },
+ [0xFE5F] = { unicodeslot=0xFE5F, category='po', description='SMALL NUMBER SIGN', specials={'small',0x0023} },
+ [0xFE60] = { unicodeslot=0xFE60, category='po', description='SMALL AMPERSAND', specials={'small',0x0026} },
+ [0xFE61] = { unicodeslot=0xFE61, category='po', description='SMALL ASTERISK', specials={'small',0x002A} },
+ [0xFE62] = { unicodeslot=0xFE62, category='sm', description='SMALL PLUS SIGN', specials={'small',0x002B} },
+ [0xFE63] = { unicodeslot=0xFE63, category='pd', description='SMALL HYPHEN-MINUS', specials={'small',0x002D} },
+ [0xFE64] = { unicodeslot=0xFE64, category='sm', description='SMALL LESS-THAN SIGN', specials={'small',0x003C} },
+ [0xFE65] = { unicodeslot=0xFE65, category='sm', description='SMALL GREATER-THAN SIGN', specials={'small',0x003E} },
+ [0xFE66] = { unicodeslot=0xFE66, category='sm', description='SMALL EQUALS SIGN', specials={'small',0x003D} },
+ [0xFE68] = { unicodeslot=0xFE68, category='po', description='SMALL REVERSE SOLIDUS', specials={'small',0x005C} },
+ [0xFE69] = { unicodeslot=0xFE69, category='sc', description='SMALL DOLLAR SIGN', specials={'small',0x0024} },
+ [0xFE6A] = { unicodeslot=0xFE6A, category='po', description='SMALL PERCENT SIGN', specials={'small',0x0025} },
+ [0xFE6B] = { unicodeslot=0xFE6B, category='po', description='SMALL COMMERCIAL AT', specials={'small',0x0040} },
+ [0xFE70] = { unicodeslot=0xFE70, category='lo', description='ARABIC FATHATAN ISOLATED FORM', specials={'isolated',0x0020,0x064B} },
+ [0xFE71] = { unicodeslot=0xFE71, category='lo', description='ARABIC TATWEEL WITH FATHATAN ABOVE', specials={'medial',0x0640,0x064B} },
+ [0xFE72] = { unicodeslot=0xFE72, category='lo', description='ARABIC DAMMATAN ISOLATED FORM', specials={'isolated',0x0020,0x064C} },
+ [0xFE73] = { unicodeslot=0xFE73, category='lo', description='ARABIC TAIL FRAGMENT' },
+ [0xFE74] = { unicodeslot=0xFE74, category='lo', description='ARABIC KASRATAN ISOLATED FORM', specials={'isolated',0x0020,0x064D} },
+ [0xFE76] = { unicodeslot=0xFE76, category='lo', description='ARABIC FATHA ISOLATED FORM', specials={'isolated',0x0020,0x064E} },
+ [0xFE77] = { unicodeslot=0xFE77, category='lo', description='ARABIC FATHA MEDIAL FORM', specials={'medial',0x0640,0x064E} },
+ [0xFE78] = { unicodeslot=0xFE78, category='lo', description='ARABIC DAMMA ISOLATED FORM', specials={'isolated',0x0020,0x064F} },
+ [0xFE79] = { unicodeslot=0xFE79, category='lo', description='ARABIC DAMMA MEDIAL FORM', specials={'medial',0x0640,0x064F} },
+ [0xFE7A] = { unicodeslot=0xFE7A, category='lo', description='ARABIC KASRA ISOLATED FORM', specials={'isolated',0x0020,0x0650} },
+ [0xFE7B] = { unicodeslot=0xFE7B, category='lo', description='ARABIC KASRA MEDIAL FORM', specials={'medial',0x0640,0x0650} },
+ [0xFE7C] = { unicodeslot=0xFE7C, category='lo', description='ARABIC SHADDA ISOLATED FORM', specials={'isolated',0x0020,0x0651} },
+ [0xFE7D] = { unicodeslot=0xFE7D, category='lo', description='ARABIC SHADDA MEDIAL FORM', specials={'medial',0x0640,0x0651} },
+ [0xFE7E] = { unicodeslot=0xFE7E, category='lo', description='ARABIC SUKUN ISOLATED FORM', specials={'isolated',0x0020,0x0652} },
+ [0xFE7F] = { unicodeslot=0xFE7F, category='lo', description='ARABIC SUKUN MEDIAL FORM', specials={'medial',0x0640,0x0652} },
+ [0xFE80] = { unicodeslot=0xFE80, category='lo', description='ARABIC LETTER HAMZA ISOLATED FORM', specials={'isolated',0x0621} },
+ [0xFE81] = { unicodeslot=0xFE81, category='lo', description='ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM', shcode=0x0627, specials={'isolated',0x0622} },
+ [0xFE82] = { unicodeslot=0xFE82, category='lo', description='ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM', shcode=0x0627, specials={'final',0x0622} },
+ [0xFE83] = { unicodeslot=0xFE83, category='lo', description='ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM', shcode=0x0627, specials={'isolated',0x0623} },
+ [0xFE84] = { unicodeslot=0xFE84, category='lo', description='ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM', shcode=0x0627, specials={'final',0x0623} },
+ [0xFE85] = { unicodeslot=0xFE85, category='lo', description='ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM', shcode=0x0648, specials={'isolated',0x0624} },
+ [0xFE86] = { unicodeslot=0xFE86, category='lo', description='ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM', shcode=0x0648, specials={'final',0x0624} },
+ [0xFE87] = { unicodeslot=0xFE87, category='lo', description='ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM', shcode=0x0627, specials={'isolated',0x0625} },
+ [0xFE88] = { unicodeslot=0xFE88, category='lo', description='ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM', shcode=0x0627, specials={'final',0x0625} },
+ [0xFE89] = { unicodeslot=0xFE89, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM', shcode=0x064A, specials={'isolated',0x0626} },
+ [0xFE8A] = { unicodeslot=0xFE8A, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM', shcode=0x064A, specials={'final',0x0626} },
+ [0xFE8B] = { unicodeslot=0xFE8B, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM', shcode=0x064A, specials={'initial',0x0626} },
+ [0xFE8C] = { unicodeslot=0xFE8C, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM', shcode=0x064A, specials={'medial',0x0626} },
+ [0xFE8D] = { unicodeslot=0xFE8D, category='lo', description='ARABIC LETTER ALEF ISOLATED FORM', specials={'isolated',0x0627} },
+ [0xFE8E] = { unicodeslot=0xFE8E, category='lo', description='ARABIC LETTER ALEF FINAL FORM', specials={'final',0x0627} },
+ [0xFE8F] = { unicodeslot=0xFE8F, category='lo', description='ARABIC LETTER BEH ISOLATED FORM', specials={'isolated',0x0628} },
+ [0xFE90] = { unicodeslot=0xFE90, category='lo', description='ARABIC LETTER BEH FINAL FORM', specials={'final',0x0628} },
+ [0xFE91] = { unicodeslot=0xFE91, category='lo', description='ARABIC LETTER BEH INITIAL FORM', specials={'initial',0x0628} },
+ [0xFE92] = { unicodeslot=0xFE92, category='lo', description='ARABIC LETTER BEH MEDIAL FORM', specials={'medial',0x0628} },
+ [0xFE93] = { unicodeslot=0xFE93, category='lo', description='ARABIC LETTER TEH MARBUTA ISOLATED FORM', specials={'isolated',0x0629} },
+ [0xFE94] = { unicodeslot=0xFE94, category='lo', description='ARABIC LETTER TEH MARBUTA FINAL FORM', specials={'final',0x0629} },
+ [0xFE95] = { unicodeslot=0xFE95, category='lo', description='ARABIC LETTER TEH ISOLATED FORM', specials={'isolated',0x062A} },
+ [0xFE96] = { unicodeslot=0xFE96, category='lo', description='ARABIC LETTER TEH FINAL FORM', specials={'final',0x062A} },
+ [0xFE97] = { unicodeslot=0xFE97, category='lo', description='ARABIC LETTER TEH INITIAL FORM', specials={'initial',0x062A} },
+ [0xFE98] = { unicodeslot=0xFE98, category='lo', description='ARABIC LETTER TEH MEDIAL FORM', specials={'medial',0x062A} },
+ [0xFE99] = { unicodeslot=0xFE99, category='lo', description='ARABIC LETTER THEH ISOLATED FORM', specials={'isolated',0x062B} },
+ [0xFE9A] = { unicodeslot=0xFE9A, category='lo', description='ARABIC LETTER THEH FINAL FORM', specials={'final',0x062B} },
+ [0xFE9B] = { unicodeslot=0xFE9B, category='lo', description='ARABIC LETTER THEH INITIAL FORM', specials={'initial',0x062B} },
+ [0xFE9C] = { unicodeslot=0xFE9C, category='lo', description='ARABIC LETTER THEH MEDIAL FORM', specials={'medial',0x062B} },
+ [0xFE9D] = { unicodeslot=0xFE9D, category='lo', description='ARABIC LETTER JEEM ISOLATED FORM', specials={'isolated',0x062C} },
+ [0xFE9E] = { unicodeslot=0xFE9E, category='lo', description='ARABIC LETTER JEEM FINAL FORM', specials={'final',0x062C} },
+ [0xFE9F] = { unicodeslot=0xFE9F, category='lo', description='ARABIC LETTER JEEM INITIAL FORM', specials={'initial',0x062C} },
+ [0xFEA0] = { unicodeslot=0xFEA0, category='lo', description='ARABIC LETTER JEEM MEDIAL FORM', specials={'medial',0x062C} },
+ [0xFEA1] = { unicodeslot=0xFEA1, category='lo', description='ARABIC LETTER HAH ISOLATED FORM', specials={'isolated',0x062D} },
+ [0xFEA2] = { unicodeslot=0xFEA2, category='lo', description='ARABIC LETTER HAH FINAL FORM', specials={'final',0x062D} },
+ [0xFEA3] = { unicodeslot=0xFEA3, category='lo', description='ARABIC LETTER HAH INITIAL FORM', specials={'initial',0x062D} },
+ [0xFEA4] = { unicodeslot=0xFEA4, category='lo', description='ARABIC LETTER HAH MEDIAL FORM', specials={'medial',0x062D} },
+ [0xFEA5] = { unicodeslot=0xFEA5, category='lo', description='ARABIC LETTER KHAH ISOLATED FORM', specials={'isolated',0x062E} },
+ [0xFEA6] = { unicodeslot=0xFEA6, category='lo', description='ARABIC LETTER KHAH FINAL FORM', specials={'final',0x062E} },
+ [0xFEA7] = { unicodeslot=0xFEA7, category='lo', description='ARABIC LETTER KHAH INITIAL FORM', specials={'initial',0x062E} },
+ [0xFEA8] = { unicodeslot=0xFEA8, category='lo', description='ARABIC LETTER KHAH MEDIAL FORM', specials={'medial',0x062E} },
+ [0xFEA9] = { unicodeslot=0xFEA9, category='lo', description='ARABIC LETTER DAL ISOLATED FORM', specials={'isolated',0x062F} },
+ [0xFEAA] = { unicodeslot=0xFEAA, category='lo', description='ARABIC LETTER DAL FINAL FORM', specials={'final',0x062F} },
+ [0xFEAB] = { unicodeslot=0xFEAB, category='lo', description='ARABIC LETTER THAL ISOLATED FORM', specials={'isolated',0x0630} },
+ [0xFEAC] = { unicodeslot=0xFEAC, category='lo', description='ARABIC LETTER THAL FINAL FORM', specials={'final',0x0630} },
+ [0xFEAD] = { unicodeslot=0xFEAD, category='lo', description='ARABIC LETTER REH ISOLATED FORM', specials={'isolated',0x0631} },
+ [0xFEAE] = { unicodeslot=0xFEAE, category='lo', description='ARABIC LETTER REH FINAL FORM', specials={'final',0x0631} },
+ [0xFEAF] = { unicodeslot=0xFEAF, category='lo', description='ARABIC LETTER ZAIN ISOLATED FORM', specials={'isolated',0x0632} },
+ [0xFEB0] = { unicodeslot=0xFEB0, category='lo', description='ARABIC LETTER ZAIN FINAL FORM', specials={'final',0x0632} },
+ [0xFEB1] = { unicodeslot=0xFEB1, category='lo', description='ARABIC LETTER SEEN ISOLATED FORM', specials={'isolated',0x0633} },
+ [0xFEB2] = { unicodeslot=0xFEB2, category='lo', description='ARABIC LETTER SEEN FINAL FORM', specials={'final',0x0633} },
+ [0xFEB3] = { unicodeslot=0xFEB3, category='lo', description='ARABIC LETTER SEEN INITIAL FORM', specials={'initial',0x0633} },
+ [0xFEB4] = { unicodeslot=0xFEB4, category='lo', description='ARABIC LETTER SEEN MEDIAL FORM', specials={'medial',0x0633} },
+ [0xFEB5] = { unicodeslot=0xFEB5, category='lo', description='ARABIC LETTER SHEEN ISOLATED FORM', specials={'isolated',0x0634} },
+ [0xFEB6] = { unicodeslot=0xFEB6, category='lo', description='ARABIC LETTER SHEEN FINAL FORM', specials={'final',0x0634} },
+ [0xFEB7] = { unicodeslot=0xFEB7, category='lo', description='ARABIC LETTER SHEEN INITIAL FORM', specials={'initial',0x0634} },
+ [0xFEB8] = { unicodeslot=0xFEB8, category='lo', description='ARABIC LETTER SHEEN MEDIAL FORM', specials={'medial',0x0634} },
+ [0xFEB9] = { unicodeslot=0xFEB9, category='lo', description='ARABIC LETTER SAD ISOLATED FORM', specials={'isolated',0x0635} },
+ [0xFEBA] = { unicodeslot=0xFEBA, category='lo', description='ARABIC LETTER SAD FINAL FORM', specials={'final',0x0635} },
+ [0xFEBB] = { unicodeslot=0xFEBB, category='lo', description='ARABIC LETTER SAD INITIAL FORM', specials={'initial',0x0635} },
+ [0xFEBC] = { unicodeslot=0xFEBC, category='lo', description='ARABIC LETTER SAD MEDIAL FORM', specials={'medial',0x0635} },
+ [0xFEBD] = { unicodeslot=0xFEBD, category='lo', description='ARABIC LETTER DAD ISOLATED FORM', specials={'isolated',0x0636} },
+ [0xFEBE] = { unicodeslot=0xFEBE, category='lo', description='ARABIC LETTER DAD FINAL FORM', specials={'final',0x0636} },
+ [0xFEBF] = { unicodeslot=0xFEBF, category='lo', description='ARABIC LETTER DAD INITIAL FORM', specials={'initial',0x0636} },
+ [0xFEC0] = { unicodeslot=0xFEC0, category='lo', description='ARABIC LETTER DAD MEDIAL FORM', specials={'medial',0x0636} },
+ [0xFEC1] = { unicodeslot=0xFEC1, category='lo', description='ARABIC LETTER TAH ISOLATED FORM', specials={'isolated',0x0637} },
+ [0xFEC2] = { unicodeslot=0xFEC2, category='lo', description='ARABIC LETTER TAH FINAL FORM', specials={'final',0x0637} },
+ [0xFEC3] = { unicodeslot=0xFEC3, category='lo', description='ARABIC LETTER TAH INITIAL FORM', specials={'initial',0x0637} },
+ [0xFEC4] = { unicodeslot=0xFEC4, category='lo', description='ARABIC LETTER TAH MEDIAL FORM', specials={'medial',0x0637} },
+ [0xFEC5] = { unicodeslot=0xFEC5, category='lo', description='ARABIC LETTER ZAH ISOLATED FORM', specials={'isolated',0x0638} },
+ [0xFEC6] = { unicodeslot=0xFEC6, category='lo', description='ARABIC LETTER ZAH FINAL FORM', specials={'final',0x0638} },
+ [0xFEC7] = { unicodeslot=0xFEC7, category='lo', description='ARABIC LETTER ZAH INITIAL FORM', specials={'initial',0x0638} },
+ [0xFEC8] = { unicodeslot=0xFEC8, category='lo', description='ARABIC LETTER ZAH MEDIAL FORM', specials={'medial',0x0638} },
+ [0xFEC9] = { unicodeslot=0xFEC9, category='lo', description='ARABIC LETTER AIN ISOLATED FORM', specials={'isolated',0x0639} },
+ [0xFECA] = { unicodeslot=0xFECA, category='lo', description='ARABIC LETTER AIN FINAL FORM', specials={'final',0x0639} },
+ [0xFECB] = { unicodeslot=0xFECB, category='lo', description='ARABIC LETTER AIN INITIAL FORM', specials={'initial',0x0639} },
+ [0xFECC] = { unicodeslot=0xFECC, category='lo', description='ARABIC LETTER AIN MEDIAL FORM', specials={'medial',0x0639} },
+ [0xFECD] = { unicodeslot=0xFECD, category='lo', description='ARABIC LETTER GHAIN ISOLATED FORM', specials={'isolated',0x063A} },
+ [0xFECE] = { unicodeslot=0xFECE, category='lo', description='ARABIC LETTER GHAIN FINAL FORM', specials={'final',0x063A} },
+ [0xFECF] = { unicodeslot=0xFECF, category='lo', description='ARABIC LETTER GHAIN INITIAL FORM', specials={'initial',0x063A} },
+ [0xFED0] = { unicodeslot=0xFED0, category='lo', description='ARABIC LETTER GHAIN MEDIAL FORM', specials={'medial',0x063A} },
+ [0xFED1] = { unicodeslot=0xFED1, category='lo', description='ARABIC LETTER FEH ISOLATED FORM', specials={'isolated',0x0641} },
+ [0xFED2] = { unicodeslot=0xFED2, category='lo', description='ARABIC LETTER FEH FINAL FORM', specials={'final',0x0641} },
+ [0xFED3] = { unicodeslot=0xFED3, category='lo', description='ARABIC LETTER FEH INITIAL FORM', specials={'initial',0x0641} },
+ [0xFED4] = { unicodeslot=0xFED4, category='lo', description='ARABIC LETTER FEH MEDIAL FORM', specials={'medial',0x0641} },
+ [0xFED5] = { unicodeslot=0xFED5, category='lo', description='ARABIC LETTER QAF ISOLATED FORM', specials={'isolated',0x0642} },
+ [0xFED6] = { unicodeslot=0xFED6, category='lo', description='ARABIC LETTER QAF FINAL FORM', specials={'final',0x0642} },
+ [0xFED7] = { unicodeslot=0xFED7, category='lo', description='ARABIC LETTER QAF INITIAL FORM', specials={'initial',0x0642} },
+ [0xFED8] = { unicodeslot=0xFED8, category='lo', description='ARABIC LETTER QAF MEDIAL FORM', specials={'medial',0x0642} },
+ [0xFED9] = { unicodeslot=0xFED9, category='lo', description='ARABIC LETTER KAF ISOLATED FORM', specials={'isolated',0x0643} },
+ [0xFEDA] = { unicodeslot=0xFEDA, category='lo', description='ARABIC LETTER KAF FINAL FORM', specials={'final',0x0643} },
+ [0xFEDB] = { unicodeslot=0xFEDB, category='lo', description='ARABIC LETTER KAF INITIAL FORM', specials={'initial',0x0643} },
+ [0xFEDC] = { unicodeslot=0xFEDC, category='lo', description='ARABIC LETTER KAF MEDIAL FORM', specials={'medial',0x0643} },
+ [0xFEDD] = { unicodeslot=0xFEDD, category='lo', description='ARABIC LETTER LAM ISOLATED FORM', specials={'isolated',0x0644} },
+ [0xFEDE] = { unicodeslot=0xFEDE, category='lo', description='ARABIC LETTER LAM FINAL FORM', specials={'final',0x0644} },
+ [0xFEDF] = { unicodeslot=0xFEDF, category='lo', description='ARABIC LETTER LAM INITIAL FORM', specials={'initial',0x0644} },
+ [0xFEE0] = { unicodeslot=0xFEE0, category='lo', description='ARABIC LETTER LAM MEDIAL FORM', specials={'medial',0x0644} },
+ [0xFEE1] = { unicodeslot=0xFEE1, category='lo', description='ARABIC LETTER MEEM ISOLATED FORM', specials={'isolated',0x0645} },
+ [0xFEE2] = { unicodeslot=0xFEE2, category='lo', description='ARABIC LETTER MEEM FINAL FORM', specials={'final',0x0645} },
+ [0xFEE3] = { unicodeslot=0xFEE3, category='lo', description='ARABIC LETTER MEEM INITIAL FORM', specials={'initial',0x0645} },
+ [0xFEE4] = { unicodeslot=0xFEE4, category='lo', description='ARABIC LETTER MEEM MEDIAL FORM', specials={'medial',0x0645} },
+ [0xFEE5] = { unicodeslot=0xFEE5, category='lo', description='ARABIC LETTER NOON ISOLATED FORM', specials={'isolated',0x0646} },
+ [0xFEE6] = { unicodeslot=0xFEE6, category='lo', description='ARABIC LETTER NOON FINAL FORM', specials={'final',0x0646} },
+ [0xFEE7] = { unicodeslot=0xFEE7, category='lo', description='ARABIC LETTER NOON INITIAL FORM', specials={'initial',0x0646} },
+ [0xFEE8] = { unicodeslot=0xFEE8, category='lo', description='ARABIC LETTER NOON MEDIAL FORM', specials={'medial',0x0646} },
+ [0xFEE9] = { unicodeslot=0xFEE9, category='lo', description='ARABIC LETTER HEH ISOLATED FORM', specials={'isolated',0x0647} },
+ [0xFEEA] = { unicodeslot=0xFEEA, category='lo', description='ARABIC LETTER HEH FINAL FORM', specials={'final',0x0647} },
+ [0xFEEB] = { unicodeslot=0xFEEB, category='lo', description='ARABIC LETTER HEH INITIAL FORM', specials={'initial',0x0647} },
+ [0xFEEC] = { unicodeslot=0xFEEC, category='lo', description='ARABIC LETTER HEH MEDIAL FORM', specials={'medial',0x0647} },
+ [0xFEED] = { unicodeslot=0xFEED, category='lo', description='ARABIC LETTER WAW ISOLATED FORM', specials={'isolated',0x0648} },
+ [0xFEEE] = { unicodeslot=0xFEEE, category='lo', description='ARABIC LETTER WAW FINAL FORM', specials={'final',0x0648} },
+ [0xFEEF] = { unicodeslot=0xFEEF, category='lo', description='ARABIC LETTER ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0649} },
+ [0xFEF0] = { unicodeslot=0xFEF0, category='lo', description='ARABIC LETTER ALEF MAKSURA FINAL FORM', specials={'final',0x0649} },
+ [0xFEF1] = { unicodeslot=0xFEF1, category='lo', description='ARABIC LETTER YEH ISOLATED FORM', specials={'isolated',0x064A} },
+ [0xFEF2] = { unicodeslot=0xFEF2, category='lo', description='ARABIC LETTER YEH FINAL FORM', specials={'final',0x064A} },
+ [0xFEF3] = { unicodeslot=0xFEF3, category='lo', description='ARABIC LETTER YEH INITIAL FORM', specials={'initial',0x064A} },
+ [0xFEF4] = { unicodeslot=0xFEF4, category='lo', description='ARABIC LETTER YEH MEDIAL FORM', specials={'medial',0x064A} },
+ [0xFEF5] = { unicodeslot=0xFEF5, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM', specials={'isolated',0x0644,0x0622} },
+ [0xFEF6] = { unicodeslot=0xFEF6, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM', specials={'final',0x0644,0x0622} },
+ [0xFEF7] = { unicodeslot=0xFEF7, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM', specials={'isolated',0x0644,0x0623} },
+ [0xFEF8] = { unicodeslot=0xFEF8, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM', specials={'final',0x0644,0x0623} },
+ [0xFEF9] = { unicodeslot=0xFEF9, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM', specials={'isolated',0x0644,0x0625} },
+ [0xFEFA] = { unicodeslot=0xFEFA, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM', specials={'final',0x0644,0x0625} },
+ [0xFEFB] = { unicodeslot=0xFEFB, category='lo', description='ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM', specials={'isolated',0x0644,0x0627} },
+ [0xFEFC] = { unicodeslot=0xFEFC, category='lo', description='ARABIC LIGATURE LAM WITH ALEF FINAL FORM', specials={'final',0x0644,0x0627} },
+ [0xFEFF] = { unicodeslot=0xFEFF, category='cf', description='ZERO WIDTH NO-BREAK SPACE' },
+ [0xFF01] = { unicodeslot=0xFF01, category='po', description='FULLWIDTH EXCLAMATION MARK', specials={'wide',0x0021} },
+ [0xFF02] = { unicodeslot=0xFF02, category='po', description='FULLWIDTH QUOTATION MARK', specials={'wide',0x0022} },
+ [0xFF03] = { unicodeslot=0xFF03, category='po', description='FULLWIDTH NUMBER SIGN', specials={'wide',0x0023} },
+ [0xFF04] = { unicodeslot=0xFF04, category='sc', description='FULLWIDTH DOLLAR SIGN', specials={'wide',0x0024} },
+ [0xFF05] = { unicodeslot=0xFF05, category='po', description='FULLWIDTH PERCENT SIGN', specials={'wide',0x0025} },
+ [0xFF06] = { unicodeslot=0xFF06, category='po', description='FULLWIDTH AMPERSAND', specials={'wide',0x0026} },
+ [0xFF07] = { unicodeslot=0xFF07, category='po', description='FULLWIDTH APOSTROPHE', specials={'wide',0x0027} },
+ [0xFF08] = { unicodeslot=0xFF08, category='ps', description='FULLWIDTH LEFT PARENTHESIS', specials={'wide',0x0028} },
+ [0xFF09] = { unicodeslot=0xFF09, category='pe', description='FULLWIDTH RIGHT PARENTHESIS', specials={'wide',0x0029} },
+ [0xFF0A] = { unicodeslot=0xFF0A, category='po', description='FULLWIDTH ASTERISK', specials={'wide',0x002A} },
+ [0xFF0B] = { unicodeslot=0xFF0B, category='sm', description='FULLWIDTH PLUS SIGN', specials={'wide',0x002B} },
+ [0xFF0C] = { unicodeslot=0xFF0C, category='po', description='FULLWIDTH COMMA', specials={'wide',0x002C} },
+ [0xFF0D] = { unicodeslot=0xFF0D, category='pd', description='FULLWIDTH HYPHEN-MINUS', specials={'wide',0x002D} },
+ [0xFF0E] = { unicodeslot=0xFF0E, category='po', description='FULLWIDTH FULL STOP', specials={'wide',0x002E} },
+ [0xFF0F] = { unicodeslot=0xFF0F, category='po', description='FULLWIDTH SOLIDUS', specials={'wide',0x002F} },
+ [0xFF10] = { unicodeslot=0xFF10, category='nd', description='FULLWIDTH DIGIT ZERO', specials={'wide',0x0030} },
+ [0xFF11] = { unicodeslot=0xFF11, category='nd', description='FULLWIDTH DIGIT ONE', specials={'wide',0x0031} },
+ [0xFF12] = { unicodeslot=0xFF12, category='nd', description='FULLWIDTH DIGIT TWO', specials={'wide',0x0032} },
+ [0xFF13] = { unicodeslot=0xFF13, category='nd', description='FULLWIDTH DIGIT THREE', specials={'wide',0x0033} },
+ [0xFF14] = { unicodeslot=0xFF14, category='nd', description='FULLWIDTH DIGIT FOUR', specials={'wide',0x0034} },
+ [0xFF15] = { unicodeslot=0xFF15, category='nd', description='FULLWIDTH DIGIT FIVE', specials={'wide',0x0035} },
+ [0xFF16] = { unicodeslot=0xFF16, category='nd', description='FULLWIDTH DIGIT SIX', specials={'wide',0x0036} },
+ [0xFF17] = { unicodeslot=0xFF17, category='nd', description='FULLWIDTH DIGIT SEVEN', specials={'wide',0x0037} },
+ [0xFF18] = { unicodeslot=0xFF18, category='nd', description='FULLWIDTH DIGIT EIGHT', specials={'wide',0x0038} },
+ [0xFF19] = { unicodeslot=0xFF19, category='nd', description='FULLWIDTH DIGIT NINE', specials={'wide',0x0039} },
+ [0xFF1A] = { unicodeslot=0xFF1A, category='po', description='FULLWIDTH COLON', specials={'wide',0x003A} },
+ [0xFF1B] = { unicodeslot=0xFF1B, category='po', description='FULLWIDTH SEMICOLON', specials={'wide',0x003B} },
+ [0xFF1C] = { unicodeslot=0xFF1C, category='sm', description='FULLWIDTH LESS-THAN SIGN', specials={'wide',0x003C} },
+ [0xFF1D] = { unicodeslot=0xFF1D, category='sm', description='FULLWIDTH EQUALS SIGN', specials={'wide',0x003D} },
+ [0xFF1E] = { unicodeslot=0xFF1E, category='sm', description='FULLWIDTH GREATER-THAN SIGN', specials={'wide',0x003E} },
+ [0xFF1F] = { unicodeslot=0xFF1F, category='po', description='FULLWIDTH QUESTION MARK', specials={'wide',0x003F} },
+ [0xFF20] = { unicodeslot=0xFF20, category='po', description='FULLWIDTH COMMERCIAL AT', specials={'wide',0x0040} },
+ [0xFF21] = { unicodeslot=0xFF21, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER A', lccode=0xFF41, specials={'wide',0x0041} },
+ [0xFF22] = { unicodeslot=0xFF22, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER B', lccode=0xFF42, specials={'wide',0x0042} },
+ [0xFF23] = { unicodeslot=0xFF23, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER C', lccode=0xFF43, specials={'wide',0x0043} },
+ [0xFF24] = { unicodeslot=0xFF24, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER D', lccode=0xFF44, specials={'wide',0x0044} },
+ [0xFF25] = { unicodeslot=0xFF25, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER E', lccode=0xFF45, specials={'wide',0x0045} },
+ [0xFF26] = { unicodeslot=0xFF26, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER F', lccode=0xFF46, specials={'wide',0x0046} },
+ [0xFF27] = { unicodeslot=0xFF27, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER G', lccode=0xFF47, specials={'wide',0x0047} },
+ [0xFF28] = { unicodeslot=0xFF28, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER H', lccode=0xFF48, specials={'wide',0x0048} },
+ [0xFF29] = { unicodeslot=0xFF29, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER I', lccode=0xFF49, specials={'wide',0x0049} },
+ [0xFF2A] = { unicodeslot=0xFF2A, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER J', lccode=0xFF4A, specials={'wide',0x004A} },
+ [0xFF2B] = { unicodeslot=0xFF2B, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER K', lccode=0xFF4B, specials={'wide',0x004B} },
+ [0xFF2C] = { unicodeslot=0xFF2C, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER L', lccode=0xFF4C, specials={'wide',0x004C} },
+ [0xFF2D] = { unicodeslot=0xFF2D, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER M', lccode=0xFF4D, specials={'wide',0x004D} },
+ [0xFF2E] = { unicodeslot=0xFF2E, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER N', lccode=0xFF4E, specials={'wide',0x004E} },
+ [0xFF2F] = { unicodeslot=0xFF2F, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER O', lccode=0xFF4F, specials={'wide',0x004F} },
+ [0xFF30] = { unicodeslot=0xFF30, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER P', lccode=0xFF50, specials={'wide',0x0050} },
+ [0xFF31] = { unicodeslot=0xFF31, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER Q', lccode=0xFF51, specials={'wide',0x0051} },
+ [0xFF32] = { unicodeslot=0xFF32, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER R', lccode=0xFF52, specials={'wide',0x0052} },
+ [0xFF33] = { unicodeslot=0xFF33, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER S', lccode=0xFF53, specials={'wide',0x0053} },
+ [0xFF34] = { unicodeslot=0xFF34, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER T', lccode=0xFF54, specials={'wide',0x0054} },
+ [0xFF35] = { unicodeslot=0xFF35, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER U', lccode=0xFF55, specials={'wide',0x0055} },
+ [0xFF36] = { unicodeslot=0xFF36, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER V', lccode=0xFF56, specials={'wide',0x0056} },
+ [0xFF37] = { unicodeslot=0xFF37, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER W', lccode=0xFF57, specials={'wide',0x0057} },
+ [0xFF38] = { unicodeslot=0xFF38, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER X', lccode=0xFF58, specials={'wide',0x0058} },
+ [0xFF39] = { unicodeslot=0xFF39, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER Y', lccode=0xFF59, specials={'wide',0x0059} },
+ [0xFF3A] = { unicodeslot=0xFF3A, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER Z', lccode=0xFF5A, specials={'wide',0x005A} },
+ [0xFF3B] = { unicodeslot=0xFF3B, category='ps', description='FULLWIDTH LEFT SQUARE BRACKET', specials={'wide',0x005B} },
+ [0xFF3C] = { unicodeslot=0xFF3C, category='po', description='FULLWIDTH REVERSE SOLIDUS', specials={'wide',0x005C} },
+ [0xFF3D] = { unicodeslot=0xFF3D, category='pe', description='FULLWIDTH RIGHT SQUARE BRACKET', specials={'wide',0x005D} },
+ [0xFF3E] = { unicodeslot=0xFF3E, category='sk', description='FULLWIDTH CIRCUMFLEX ACCENT', specials={'wide',0x005E} },
+ [0xFF3F] = { unicodeslot=0xFF3F, category='pc', description='FULLWIDTH LOW LINE', specials={'wide',0x005F} },
+ [0xFF40] = { unicodeslot=0xFF40, category='sk', description='FULLWIDTH GRAVE ACCENT', specials={'wide',0x0060} },
+ [0xFF41] = { unicodeslot=0xFF41, category='ll', description='FULLWIDTH LATIN SMALL LETTER A', uccode=0xFF21, specials={'wide',0x0061} },
+ [0xFF42] = { unicodeslot=0xFF42, category='ll', description='FULLWIDTH LATIN SMALL LETTER B', uccode=0xFF22, specials={'wide',0x0062} },
+ [0xFF43] = { unicodeslot=0xFF43, category='ll', description='FULLWIDTH LATIN SMALL LETTER C', uccode=0xFF23, specials={'wide',0x0063} },
+ [0xFF44] = { unicodeslot=0xFF44, category='ll', description='FULLWIDTH LATIN SMALL LETTER D', uccode=0xFF24, specials={'wide',0x0064} },
+ [0xFF45] = { unicodeslot=0xFF45, category='ll', description='FULLWIDTH LATIN SMALL LETTER E', uccode=0xFF25, specials={'wide',0x0065} },
+ [0xFF46] = { unicodeslot=0xFF46, category='ll', description='FULLWIDTH LATIN SMALL LETTER F', uccode=0xFF26, specials={'wide',0x0066} },
+ [0xFF47] = { unicodeslot=0xFF47, category='ll', description='FULLWIDTH LATIN SMALL LETTER G', uccode=0xFF27, specials={'wide',0x0067} },
+ [0xFF48] = { unicodeslot=0xFF48, category='ll', description='FULLWIDTH LATIN SMALL LETTER H', uccode=0xFF28, specials={'wide',0x0068} },
+ [0xFF49] = { unicodeslot=0xFF49, category='ll', description='FULLWIDTH LATIN SMALL LETTER I', uccode=0xFF29, specials={'wide',0x0069} },
+ [0xFF4A] = { unicodeslot=0xFF4A, category='ll', description='FULLWIDTH LATIN SMALL LETTER J', uccode=0xFF2A, specials={'wide',0x006A} },
+ [0xFF4B] = { unicodeslot=0xFF4B, category='ll', description='FULLWIDTH LATIN SMALL LETTER K', uccode=0xFF2B, specials={'wide',0x006B} },
+ [0xFF4C] = { unicodeslot=0xFF4C, category='ll', description='FULLWIDTH LATIN SMALL LETTER L', uccode=0xFF2C, specials={'wide',0x006C} },
+ [0xFF4D] = { unicodeslot=0xFF4D, category='ll', description='FULLWIDTH LATIN SMALL LETTER M', uccode=0xFF2D, specials={'wide',0x006D} },
+ [0xFF4E] = { unicodeslot=0xFF4E, category='ll', description='FULLWIDTH LATIN SMALL LETTER N', uccode=0xFF2E, specials={'wide',0x006E} },
+ [0xFF4F] = { unicodeslot=0xFF4F, category='ll', description='FULLWIDTH LATIN SMALL LETTER O', uccode=0xFF2F, specials={'wide',0x006F} },
+ [0xFF50] = { unicodeslot=0xFF50, category='ll', description='FULLWIDTH LATIN SMALL LETTER P', uccode=0xFF30, specials={'wide',0x0070} },
+ [0xFF51] = { unicodeslot=0xFF51, category='ll', description='FULLWIDTH LATIN SMALL LETTER Q', uccode=0xFF31, specials={'wide',0x0071} },
+ [0xFF52] = { unicodeslot=0xFF52, category='ll', description='FULLWIDTH LATIN SMALL LETTER R', uccode=0xFF32, specials={'wide',0x0072} },
+ [0xFF53] = { unicodeslot=0xFF53, category='ll', description='FULLWIDTH LATIN SMALL LETTER S', uccode=0xFF33, specials={'wide',0x0073} },
+ [0xFF54] = { unicodeslot=0xFF54, category='ll', description='FULLWIDTH LATIN SMALL LETTER T', uccode=0xFF34, specials={'wide',0x0074} },
+ [0xFF55] = { unicodeslot=0xFF55, category='ll', description='FULLWIDTH LATIN SMALL LETTER U', uccode=0xFF35, specials={'wide',0x0075} },
+ [0xFF56] = { unicodeslot=0xFF56, category='ll', description='FULLWIDTH LATIN SMALL LETTER V', uccode=0xFF36, specials={'wide',0x0076} },
+ [0xFF57] = { unicodeslot=0xFF57, category='ll', description='FULLWIDTH LATIN SMALL LETTER W', uccode=0xFF37, specials={'wide',0x0077} },
+ [0xFF58] = { unicodeslot=0xFF58, category='ll', description='FULLWIDTH LATIN SMALL LETTER X', uccode=0xFF38, specials={'wide',0x0078} },
+ [0xFF59] = { unicodeslot=0xFF59, category='ll', description='FULLWIDTH LATIN SMALL LETTER Y', uccode=0xFF39, specials={'wide',0x0079} },
+ [0xFF5A] = { unicodeslot=0xFF5A, category='ll', description='FULLWIDTH LATIN SMALL LETTER Z', uccode=0xFF3A, specials={'wide',0x007A} },
+ [0xFF5B] = { unicodeslot=0xFF5B, category='ps', description='FULLWIDTH LEFT CURLY BRACKET', specials={'wide',0x007B} },
+ [0xFF5C] = { unicodeslot=0xFF5C, category='sm', description='FULLWIDTH VERTICAL LINE', specials={'wide',0x007C} },
+ [0xFF5D] = { unicodeslot=0xFF5D, category='pe', description='FULLWIDTH RIGHT CURLY BRACKET', specials={'wide',0x007D} },
+ [0xFF5E] = { unicodeslot=0xFF5E, category='sm', description='FULLWIDTH TILDE', specials={'wide',0x007E} },
+ [0xFF5F] = { unicodeslot=0xFF5F, category='ps', description='FULLWIDTH LEFT WHITE PARENTHESIS', specials={'wide',0x2985} },
+ [0xFF60] = { unicodeslot=0xFF60, category='pe', description='FULLWIDTH RIGHT WHITE PARENTHESIS', specials={'wide',0x2986} },
+ [0xFF61] = { unicodeslot=0xFF61, category='po', description='HALFWIDTH IDEOGRAPHIC FULL STOP', specials={'narrow',0x3002} },
+ [0xFF62] = { unicodeslot=0xFF62, category='ps', description='HALFWIDTH LEFT CORNER BRACKET', specials={'narrow',0x300C} },
+ [0xFF63] = { unicodeslot=0xFF63, category='pe', description='HALFWIDTH RIGHT CORNER BRACKET', specials={'narrow',0x300D} },
+ [0xFF64] = { unicodeslot=0xFF64, category='po', description='HALFWIDTH IDEOGRAPHIC COMMA', specials={'narrow',0x3001} },
+ [0xFF65] = { unicodeslot=0xFF65, category='po', description='HALFWIDTH KATAKANA MIDDLE DOT', specials={'narrow',0x30FB} },
+ [0xFF66] = { unicodeslot=0xFF66, category='lo', description='HALFWIDTH KATAKANA LETTER WO', specials={'narrow',0x30F2} },
+ [0xFF67] = { unicodeslot=0xFF67, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL A', specials={'narrow',0x30A1} },
+ [0xFF68] = { unicodeslot=0xFF68, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL I', specials={'narrow',0x30A3} },
+ [0xFF69] = { unicodeslot=0xFF69, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL U', specials={'narrow',0x30A5} },
+ [0xFF6A] = { unicodeslot=0xFF6A, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL E', specials={'narrow',0x30A7} },
+ [0xFF6B] = { unicodeslot=0xFF6B, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL O', specials={'narrow',0x30A9} },
+ [0xFF6C] = { unicodeslot=0xFF6C, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL YA', specials={'narrow',0x30E3} },
+ [0xFF6D] = { unicodeslot=0xFF6D, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL YU', specials={'narrow',0x30E5} },
+ [0xFF6E] = { unicodeslot=0xFF6E, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL YO', specials={'narrow',0x30E7} },
+ [0xFF6F] = { unicodeslot=0xFF6F, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL TU', specials={'narrow',0x30C3} },
+ [0xFF70] = { unicodeslot=0xFF70, category='lm', description='HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK', specials={'narrow',0x30FC} },
+ [0xFF71] = { unicodeslot=0xFF71, category='lo', description='HALFWIDTH KATAKANA LETTER A', specials={'narrow',0x30A2} },
+ [0xFF72] = { unicodeslot=0xFF72, category='lo', description='HALFWIDTH KATAKANA LETTER I', specials={'narrow',0x30A4} },
+ [0xFF73] = { unicodeslot=0xFF73, category='lo', description='HALFWIDTH KATAKANA LETTER U', specials={'narrow',0x30A6} },
+ [0xFF74] = { unicodeslot=0xFF74, category='lo', description='HALFWIDTH KATAKANA LETTER E', specials={'narrow',0x30A8} },
+ [0xFF75] = { unicodeslot=0xFF75, category='lo', description='HALFWIDTH KATAKANA LETTER O', specials={'narrow',0x30AA} },
+ [0xFF76] = { unicodeslot=0xFF76, category='lo', description='HALFWIDTH KATAKANA LETTER KA', specials={'narrow',0x30AB} },
+ [0xFF77] = { unicodeslot=0xFF77, category='lo', description='HALFWIDTH KATAKANA LETTER KI', specials={'narrow',0x30AD} },
+ [0xFF78] = { unicodeslot=0xFF78, category='lo', description='HALFWIDTH KATAKANA LETTER KU', specials={'narrow',0x30AF} },
+ [0xFF79] = { unicodeslot=0xFF79, category='lo', description='HALFWIDTH KATAKANA LETTER KE', specials={'narrow',0x30B1} },
+ [0xFF7A] = { unicodeslot=0xFF7A, category='lo', description='HALFWIDTH KATAKANA LETTER KO', specials={'narrow',0x30B3} },
+ [0xFF7B] = { unicodeslot=0xFF7B, category='lo', description='HALFWIDTH KATAKANA LETTER SA', specials={'narrow',0x30B5} },
+ [0xFF7C] = { unicodeslot=0xFF7C, category='lo', description='HALFWIDTH KATAKANA LETTER SI', specials={'narrow',0x30B7} },
+ [0xFF7D] = { unicodeslot=0xFF7D, category='lo', description='HALFWIDTH KATAKANA LETTER SU', specials={'narrow',0x30B9} },
+ [0xFF7E] = { unicodeslot=0xFF7E, category='lo', description='HALFWIDTH KATAKANA LETTER SE', specials={'narrow',0x30BB} },
+ [0xFF7F] = { unicodeslot=0xFF7F, category='lo', description='HALFWIDTH KATAKANA LETTER SO', specials={'narrow',0x30BD} },
+ [0xFF80] = { unicodeslot=0xFF80, category='lo', description='HALFWIDTH KATAKANA LETTER TA', specials={'narrow',0x30BF} },
+ [0xFF81] = { unicodeslot=0xFF81, category='lo', description='HALFWIDTH KATAKANA LETTER TI', specials={'narrow',0x30C1} },
+ [0xFF82] = { unicodeslot=0xFF82, category='lo', description='HALFWIDTH KATAKANA LETTER TU', specials={'narrow',0x30C4} },
+ [0xFF83] = { unicodeslot=0xFF83, category='lo', description='HALFWIDTH KATAKANA LETTER TE', specials={'narrow',0x30C6} },
+ [0xFF84] = { unicodeslot=0xFF84, category='lo', description='HALFWIDTH KATAKANA LETTER TO', specials={'narrow',0x30C8} },
+ [0xFF85] = { unicodeslot=0xFF85, category='lo', description='HALFWIDTH KATAKANA LETTER NA', specials={'narrow',0x30CA} },
+ [0xFF86] = { unicodeslot=0xFF86, category='lo', description='HALFWIDTH KATAKANA LETTER NI', specials={'narrow',0x30CB} },
+ [0xFF87] = { unicodeslot=0xFF87, category='lo', description='HALFWIDTH KATAKANA LETTER NU', specials={'narrow',0x30CC} },
+ [0xFF88] = { unicodeslot=0xFF88, category='lo', description='HALFWIDTH KATAKANA LETTER NE', specials={'narrow',0x30CD} },
+ [0xFF89] = { unicodeslot=0xFF89, category='lo', description='HALFWIDTH KATAKANA LETTER NO', specials={'narrow',0x30CE} },
+ [0xFF8A] = { unicodeslot=0xFF8A, category='lo', description='HALFWIDTH KATAKANA LETTER HA', specials={'narrow',0x30CF} },
+ [0xFF8B] = { unicodeslot=0xFF8B, category='lo', description='HALFWIDTH KATAKANA LETTER HI', specials={'narrow',0x30D2} },
+ [0xFF8C] = { unicodeslot=0xFF8C, category='lo', description='HALFWIDTH KATAKANA LETTER HU', specials={'narrow',0x30D5} },
+ [0xFF8D] = { unicodeslot=0xFF8D, category='lo', description='HALFWIDTH KATAKANA LETTER HE', specials={'narrow',0x30D8} },
+ [0xFF8E] = { unicodeslot=0xFF8E, category='lo', description='HALFWIDTH KATAKANA LETTER HO', specials={'narrow',0x30DB} },
+ [0xFF8F] = { unicodeslot=0xFF8F, category='lo', description='HALFWIDTH KATAKANA LETTER MA', specials={'narrow',0x30DE} },
+ [0xFF90] = { unicodeslot=0xFF90, category='lo', description='HALFWIDTH KATAKANA LETTER MI', specials={'narrow',0x30DF} },
+ [0xFF91] = { unicodeslot=0xFF91, category='lo', description='HALFWIDTH KATAKANA LETTER MU', specials={'narrow',0x30E0} },
+ [0xFF92] = { unicodeslot=0xFF92, category='lo', description='HALFWIDTH KATAKANA LETTER ME', specials={'narrow',0x30E1} },
+ [0xFF93] = { unicodeslot=0xFF93, category='lo', description='HALFWIDTH KATAKANA LETTER MO', specials={'narrow',0x30E2} },
+ [0xFF94] = { unicodeslot=0xFF94, category='lo', description='HALFWIDTH KATAKANA LETTER YA', specials={'narrow',0x30E4} },
+ [0xFF95] = { unicodeslot=0xFF95, category='lo', description='HALFWIDTH KATAKANA LETTER YU', specials={'narrow',0x30E6} },
+ [0xFF96] = { unicodeslot=0xFF96, category='lo', description='HALFWIDTH KATAKANA LETTER YO', specials={'narrow',0x30E8} },
+ [0xFF97] = { unicodeslot=0xFF97, category='lo', description='HALFWIDTH KATAKANA LETTER RA', specials={'narrow',0x30E9} },
+ [0xFF98] = { unicodeslot=0xFF98, category='lo', description='HALFWIDTH KATAKANA LETTER RI', specials={'narrow',0x30EA} },
+ [0xFF99] = { unicodeslot=0xFF99, category='lo', description='HALFWIDTH KATAKANA LETTER RU', specials={'narrow',0x30EB} },
+ [0xFF9A] = { unicodeslot=0xFF9A, category='lo', description='HALFWIDTH KATAKANA LETTER RE', specials={'narrow',0x30EC} },
+ [0xFF9B] = { unicodeslot=0xFF9B, category='lo', description='HALFWIDTH KATAKANA LETTER RO', specials={'narrow',0x30ED} },
+ [0xFF9C] = { unicodeslot=0xFF9C, category='lo', description='HALFWIDTH KATAKANA LETTER WA', specials={'narrow',0x30EF} },
+ [0xFF9D] = { unicodeslot=0xFF9D, category='lo', description='HALFWIDTH KATAKANA LETTER N', specials={'narrow',0x30F3} },
+ [0xFF9E] = { unicodeslot=0xFF9E, category='lm', description='HALFWIDTH KATAKANA VOICED SOUND MARK', specials={'narrow',0x3099} },
+ [0xFF9F] = { unicodeslot=0xFF9F, category='lm', description='HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK', specials={'narrow',0x309A} },
+ [0xFFA0] = { unicodeslot=0xFFA0, category='lo', description='HALFWIDTH HANGUL FILLER', specials={'narrow',0x3164} },
+ [0xFFA1] = { unicodeslot=0xFFA1, category='lo', description='HALFWIDTH HANGUL LETTER KIYEOK', specials={'narrow',0x3131} },
+ [0xFFA2] = { unicodeslot=0xFFA2, category='lo', description='HALFWIDTH HANGUL LETTER SSANGKIYEOK', specials={'narrow',0x3132} },
+ [0xFFA3] = { unicodeslot=0xFFA3, category='lo', description='HALFWIDTH HANGUL LETTER KIYEOK-SIOS', specials={'narrow',0x3133} },
+ [0xFFA4] = { unicodeslot=0xFFA4, category='lo', description='HALFWIDTH HANGUL LETTER NIEUN', specials={'narrow',0x3134} },
+ [0xFFA5] = { unicodeslot=0xFFA5, category='lo', description='HALFWIDTH HANGUL LETTER NIEUN-CIEUC', specials={'narrow',0x3135} },
+ [0xFFA6] = { unicodeslot=0xFFA6, category='lo', description='HALFWIDTH HANGUL LETTER NIEUN-HIEUH', specials={'narrow',0x3136} },
+ [0xFFA7] = { unicodeslot=0xFFA7, category='lo', description='HALFWIDTH HANGUL LETTER TIKEUT', specials={'narrow',0x3137} },
+ [0xFFA8] = { unicodeslot=0xFFA8, category='lo', description='HALFWIDTH HANGUL LETTER SSANGTIKEUT', specials={'narrow',0x3138} },
+ [0xFFA9] = { unicodeslot=0xFFA9, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL', specials={'narrow',0x3139} },
+ [0xFFAA] = { unicodeslot=0xFFAA, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-KIYEOK', specials={'narrow',0x313A} },
+ [0xFFAB] = { unicodeslot=0xFFAB, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-MIEUM', specials={'narrow',0x313B} },
+ [0xFFAC] = { unicodeslot=0xFFAC, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-PIEUP', specials={'narrow',0x313C} },
+ [0xFFAD] = { unicodeslot=0xFFAD, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-SIOS', specials={'narrow',0x313D} },
+ [0xFFAE] = { unicodeslot=0xFFAE, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-THIEUTH', specials={'narrow',0x313E} },
+ [0xFFAF] = { unicodeslot=0xFFAF, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH', specials={'narrow',0x313F} },
+ [0xFFB0] = { unicodeslot=0xFFB0, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-HIEUH', specials={'narrow',0x3140} },
+ [0xFFB1] = { unicodeslot=0xFFB1, category='lo', description='HALFWIDTH HANGUL LETTER MIEUM', specials={'narrow',0x3141} },
+ [0xFFB2] = { unicodeslot=0xFFB2, category='lo', description='HALFWIDTH HANGUL LETTER PIEUP', specials={'narrow',0x3142} },
+ [0xFFB3] = { unicodeslot=0xFFB3, category='lo', description='HALFWIDTH HANGUL LETTER SSANGPIEUP', specials={'narrow',0x3143} },
+ [0xFFB4] = { unicodeslot=0xFFB4, category='lo', description='HALFWIDTH HANGUL LETTER PIEUP-SIOS', specials={'narrow',0x3144} },
+ [0xFFB5] = { unicodeslot=0xFFB5, category='lo', description='HALFWIDTH HANGUL LETTER SIOS', specials={'narrow',0x3145} },
+ [0xFFB6] = { unicodeslot=0xFFB6, category='lo', description='HALFWIDTH HANGUL LETTER SSANGSIOS', specials={'narrow',0x3146} },
+ [0xFFB7] = { unicodeslot=0xFFB7, category='lo', description='HALFWIDTH HANGUL LETTER IEUNG', specials={'narrow',0x3147} },
+ [0xFFB8] = { unicodeslot=0xFFB8, category='lo', description='HALFWIDTH HANGUL LETTER CIEUC', specials={'narrow',0x3148} },
+ [0xFFB9] = { unicodeslot=0xFFB9, category='lo', description='HALFWIDTH HANGUL LETTER SSANGCIEUC', specials={'narrow',0x3149} },
+ [0xFFBA] = { unicodeslot=0xFFBA, category='lo', description='HALFWIDTH HANGUL LETTER CHIEUCH', specials={'narrow',0x314A} },
+ [0xFFBB] = { unicodeslot=0xFFBB, category='lo', description='HALFWIDTH HANGUL LETTER KHIEUKH', specials={'narrow',0x314B} },
+ [0xFFBC] = { unicodeslot=0xFFBC, category='lo', description='HALFWIDTH HANGUL LETTER THIEUTH', specials={'narrow',0x314C} },
+ [0xFFBD] = { unicodeslot=0xFFBD, category='lo', description='HALFWIDTH HANGUL LETTER PHIEUPH', specials={'narrow',0x314D} },
+ [0xFFBE] = { unicodeslot=0xFFBE, category='lo', description='HALFWIDTH HANGUL LETTER HIEUH', specials={'narrow',0x314E} },
+ [0xFFC2] = { unicodeslot=0xFFC2, category='lo', description='HALFWIDTH HANGUL LETTER A', specials={'narrow',0x314F} },
+ [0xFFC3] = { unicodeslot=0xFFC3, category='lo', description='HALFWIDTH HANGUL LETTER AE', specials={'narrow',0x3150} },
+ [0xFFC4] = { unicodeslot=0xFFC4, category='lo', description='HALFWIDTH HANGUL LETTER YA', specials={'narrow',0x3151} },
+ [0xFFC5] = { unicodeslot=0xFFC5, category='lo', description='HALFWIDTH HANGUL LETTER YAE', specials={'narrow',0x3152} },
+ [0xFFC6] = { unicodeslot=0xFFC6, category='lo', description='HALFWIDTH HANGUL LETTER EO', specials={'narrow',0x3153} },
+ [0xFFC7] = { unicodeslot=0xFFC7, category='lo', description='HALFWIDTH HANGUL LETTER E', specials={'narrow',0x3154} },
+ [0xFFCA] = { unicodeslot=0xFFCA, category='lo', description='HALFWIDTH HANGUL LETTER YEO', specials={'narrow',0x3155} },
+ [0xFFCB] = { unicodeslot=0xFFCB, category='lo', description='HALFWIDTH HANGUL LETTER YE', specials={'narrow',0x3156} },
+ [0xFFCC] = { unicodeslot=0xFFCC, category='lo', description='HALFWIDTH HANGUL LETTER O', specials={'narrow',0x3157} },
+ [0xFFCD] = { unicodeslot=0xFFCD, category='lo', description='HALFWIDTH HANGUL LETTER WA', specials={'narrow',0x3158} },
+ [0xFFCE] = { unicodeslot=0xFFCE, category='lo', description='HALFWIDTH HANGUL LETTER WAE', specials={'narrow',0x3159} },
+ [0xFFCF] = { unicodeslot=0xFFCF, category='lo', description='HALFWIDTH HANGUL LETTER OE', specials={'narrow',0x315A} },
+ [0xFFD2] = { unicodeslot=0xFFD2, category='lo', description='HALFWIDTH HANGUL LETTER YO', specials={'narrow',0x315B} },
+ [0xFFD3] = { unicodeslot=0xFFD3, category='lo', description='HALFWIDTH HANGUL LETTER U', specials={'narrow',0x315C} },
+ [0xFFD4] = { unicodeslot=0xFFD4, category='lo', description='HALFWIDTH HANGUL LETTER WEO', specials={'narrow',0x315D} },
+ [0xFFD5] = { unicodeslot=0xFFD5, category='lo', description='HALFWIDTH HANGUL LETTER WE', specials={'narrow',0x315E} },
+ [0xFFD6] = { unicodeslot=0xFFD6, category='lo', description='HALFWIDTH HANGUL LETTER WI', specials={'narrow',0x315F} },
+ [0xFFD7] = { unicodeslot=0xFFD7, category='lo', description='HALFWIDTH HANGUL LETTER YU', specials={'narrow',0x3160} },
+ [0xFFDA] = { unicodeslot=0xFFDA, category='lo', description='HALFWIDTH HANGUL LETTER EU', specials={'narrow',0x3161} },
+ [0xFFDB] = { unicodeslot=0xFFDB, category='lo', description='HALFWIDTH HANGUL LETTER YI', specials={'narrow',0x3162} },
+ [0xFFDC] = { unicodeslot=0xFFDC, category='lo', description='HALFWIDTH HANGUL LETTER I', specials={'narrow',0x3163} },
+ [0xFFE0] = { unicodeslot=0xFFE0, category='sc', description='FULLWIDTH CENT SIGN', specials={'wide',0x00A2} },
+ [0xFFE1] = { unicodeslot=0xFFE1, category='sc', description='FULLWIDTH POUND SIGN', specials={'wide',0x00A3} },
+ [0xFFE2] = { unicodeslot=0xFFE2, category='sm', description='FULLWIDTH NOT SIGN', specials={'wide',0x00AC} },
+ [0xFFE3] = { unicodeslot=0xFFE3, category='sk', description='FULLWIDTH MACRON', specials={'wide',0x00AF} },
+ [0xFFE4] = { unicodeslot=0xFFE4, category='so', description='FULLWIDTH BROKEN BAR', specials={'wide',0x00A6} },
+ [0xFFE5] = { unicodeslot=0xFFE5, category='sc', description='FULLWIDTH YEN SIGN', specials={'wide',0x00A5} },
+ [0xFFE6] = { unicodeslot=0xFFE6, category='sc', description='FULLWIDTH WON SIGN', specials={'wide',0x20A9} },
+ [0xFFE8] = { unicodeslot=0xFFE8, category='so', description='HALFWIDTH FORMS LIGHT VERTICAL', specials={'narrow',0x2502} },
+ [0xFFE9] = { unicodeslot=0xFFE9, category='sm', description='HALFWIDTH LEFTWARDS ARROW', specials={'narrow',0x2190} },
+ [0xFFEA] = { unicodeslot=0xFFEA, category='sm', description='HALFWIDTH UPWARDS ARROW', specials={'narrow',0x2191} },
+ [0xFFEB] = { unicodeslot=0xFFEB, category='sm', description='HALFWIDTH RIGHTWARDS ARROW', specials={'narrow',0x2192} },
+ [0xFFEC] = { unicodeslot=0xFFEC, category='sm', description='HALFWIDTH DOWNWARDS ARROW', specials={'narrow',0x2193} },
+ [0xFFED] = { unicodeslot=0xFFED, category='so', description='HALFWIDTH BLACK SQUARE', specials={'narrow',0x25A0} },
+ [0xFFEE] = { unicodeslot=0xFFEE, category='so', description='HALFWIDTH WHITE CIRCLE', specials={'narrow',0x25CB} },
+ [0xFFF9] = { unicodeslot=0xFFF9, category='cf', description='INTERLINEAR ANNOTATION ANCHOR' },
+ [0xFFFA] = { unicodeslot=0xFFFA, category='cf', description='INTERLINEAR ANNOTATION SEPARATOR' },
+ [0xFFFB] = { unicodeslot=0xFFFB, category='cf', description='INTERLINEAR ANNOTATION TERMINATOR' },
+ [0xFFFC] = { unicodeslot=0xFFFC, category='so', description='OBJECT REPLACEMENT CHARACTER' },
+ [0xFFFD] = { unicodeslot=0xFFFD, category='so', description='REPLACEMENT CHARACTER' },
+ [0x10000] = { unicodeslot=0x10000, category='lo', description='LINEAR B SYLLABLE B008 A' },
+ [0x10001] = { unicodeslot=0x10001, category='lo', description='LINEAR B SYLLABLE B038 E' },
+ [0x10002] = { unicodeslot=0x10002, category='lo', description='LINEAR B SYLLABLE B028 I' },
+ [0x10003] = { unicodeslot=0x10003, category='lo', description='LINEAR B SYLLABLE B061 O' },
+ [0x10004] = { unicodeslot=0x10004, category='lo', description='LINEAR B SYLLABLE B010 U' },
+ [0x10005] = { unicodeslot=0x10005, category='lo', description='LINEAR B SYLLABLE B001 DA' },
+ [0x10006] = { unicodeslot=0x10006, category='lo', description='LINEAR B SYLLABLE B045 DE' },
+ [0x10007] = { unicodeslot=0x10007, category='lo', description='LINEAR B SYLLABLE B007 DI' },
+ [0x10008] = { unicodeslot=0x10008, category='lo', description='LINEAR B SYLLABLE B014 DO' },
+ [0x10009] = { unicodeslot=0x10009, category='lo', description='LINEAR B SYLLABLE B051 DU' },
+ [0x1000A] = { unicodeslot=0x1000A, category='lo', description='LINEAR B SYLLABLE B057 JA' },
+ [0x1000B] = { unicodeslot=0x1000B, category='lo', description='LINEAR B SYLLABLE B046 JE' },
+ [0x1000D] = { unicodeslot=0x1000D, category='lo', description='LINEAR B SYLLABLE B036 JO' },
+ [0x1000E] = { unicodeslot=0x1000E, category='lo', description='LINEAR B SYLLABLE B065 JU' },
+ [0x1000F] = { unicodeslot=0x1000F, category='lo', description='LINEAR B SYLLABLE B077 KA' },
+ [0x10010] = { unicodeslot=0x10010, category='lo', description='LINEAR B SYLLABLE B044 KE' },
+ [0x10011] = { unicodeslot=0x10011, category='lo', description='LINEAR B SYLLABLE B067 KI' },
+ [0x10012] = { unicodeslot=0x10012, category='lo', description='LINEAR B SYLLABLE B070 KO' },
+ [0x10013] = { unicodeslot=0x10013, category='lo', description='LINEAR B SYLLABLE B081 KU' },
+ [0x10014] = { unicodeslot=0x10014, category='lo', description='LINEAR B SYLLABLE B080 MA' },
+ [0x10015] = { unicodeslot=0x10015, category='lo', description='LINEAR B SYLLABLE B013 ME' },
+ [0x10016] = { unicodeslot=0x10016, category='lo', description='LINEAR B SYLLABLE B073 MI' },
+ [0x10017] = { unicodeslot=0x10017, category='lo', description='LINEAR B SYLLABLE B015 MO' },
+ [0x10018] = { unicodeslot=0x10018, category='lo', description='LINEAR B SYLLABLE B023 MU' },
+ [0x10019] = { unicodeslot=0x10019, category='lo', description='LINEAR B SYLLABLE B006 NA' },
+ [0x1001A] = { unicodeslot=0x1001A, category='lo', description='LINEAR B SYLLABLE B024 NE' },
+ [0x1001B] = { unicodeslot=0x1001B, category='lo', description='LINEAR B SYLLABLE B030 NI' },
+ [0x1001C] = { unicodeslot=0x1001C, category='lo', description='LINEAR B SYLLABLE B052 NO' },
+ [0x1001D] = { unicodeslot=0x1001D, category='lo', description='LINEAR B SYLLABLE B055 NU' },
+ [0x1001E] = { unicodeslot=0x1001E, category='lo', description='LINEAR B SYLLABLE B003 PA' },
+ [0x1001F] = { unicodeslot=0x1001F, category='lo', description='LINEAR B SYLLABLE B072 PE' },
+ [0x10020] = { unicodeslot=0x10020, category='lo', description='LINEAR B SYLLABLE B039 PI' },
+ [0x10021] = { unicodeslot=0x10021, category='lo', description='LINEAR B SYLLABLE B011 PO' },
+ [0x10022] = { unicodeslot=0x10022, category='lo', description='LINEAR B SYLLABLE B050 PU' },
+ [0x10023] = { unicodeslot=0x10023, category='lo', description='LINEAR B SYLLABLE B016 QA' },
+ [0x10024] = { unicodeslot=0x10024, category='lo', description='LINEAR B SYLLABLE B078 QE' },
+ [0x10025] = { unicodeslot=0x10025, category='lo', description='LINEAR B SYLLABLE B021 QI' },
+ [0x10026] = { unicodeslot=0x10026, category='lo', description='LINEAR B SYLLABLE B032 QO' },
+ [0x10028] = { unicodeslot=0x10028, category='lo', description='LINEAR B SYLLABLE B060 RA' },
+ [0x10029] = { unicodeslot=0x10029, category='lo', description='LINEAR B SYLLABLE B027 RE' },
+ [0x1002A] = { unicodeslot=0x1002A, category='lo', description='LINEAR B SYLLABLE B053 RI' },
+ [0x1002B] = { unicodeslot=0x1002B, category='lo', description='LINEAR B SYLLABLE B002 RO' },
+ [0x1002C] = { unicodeslot=0x1002C, category='lo', description='LINEAR B SYLLABLE B026 RU' },
+ [0x1002D] = { unicodeslot=0x1002D, category='lo', description='LINEAR B SYLLABLE B031 SA' },
+ [0x1002E] = { unicodeslot=0x1002E, category='lo', description='LINEAR B SYLLABLE B009 SE' },
+ [0x1002F] = { unicodeslot=0x1002F, category='lo', description='LINEAR B SYLLABLE B041 SI' },
+ [0x10030] = { unicodeslot=0x10030, category='lo', description='LINEAR B SYLLABLE B012 SO' },
+ [0x10031] = { unicodeslot=0x10031, category='lo', description='LINEAR B SYLLABLE B058 SU' },
+ [0x10032] = { unicodeslot=0x10032, category='lo', description='LINEAR B SYLLABLE B059 TA' },
+ [0x10033] = { unicodeslot=0x10033, category='lo', description='LINEAR B SYLLABLE B004 TE' },
+ [0x10034] = { unicodeslot=0x10034, category='lo', description='LINEAR B SYLLABLE B037 TI' },
+ [0x10035] = { unicodeslot=0x10035, category='lo', description='LINEAR B SYLLABLE B005 TO' },
+ [0x10036] = { unicodeslot=0x10036, category='lo', description='LINEAR B SYLLABLE B069 TU' },
+ [0x10037] = { unicodeslot=0x10037, category='lo', description='LINEAR B SYLLABLE B054 WA' },
+ [0x10038] = { unicodeslot=0x10038, category='lo', description='LINEAR B SYLLABLE B075 WE' },
+ [0x10039] = { unicodeslot=0x10039, category='lo', description='LINEAR B SYLLABLE B040 WI' },
+ [0x1003A] = { unicodeslot=0x1003A, category='lo', description='LINEAR B SYLLABLE B042 WO' },
+ [0x1003C] = { unicodeslot=0x1003C, category='lo', description='LINEAR B SYLLABLE B017 ZA' },
+ [0x1003D] = { unicodeslot=0x1003D, category='lo', description='LINEAR B SYLLABLE B074 ZE' },
+ [0x1003F] = { unicodeslot=0x1003F, category='lo', description='LINEAR B SYLLABLE B020 ZO' },
+ [0x10040] = { unicodeslot=0x10040, category='lo', description='LINEAR B SYLLABLE B025 A2' },
+ [0x10041] = { unicodeslot=0x10041, category='lo', description='LINEAR B SYLLABLE B043 A3' },
+ [0x10042] = { unicodeslot=0x10042, category='lo', description='LINEAR B SYLLABLE B085 AU' },
+ [0x10043] = { unicodeslot=0x10043, category='lo', description='LINEAR B SYLLABLE B071 DWE' },
+ [0x10044] = { unicodeslot=0x10044, category='lo', description='LINEAR B SYLLABLE B090 DWO' },
+ [0x10045] = { unicodeslot=0x10045, category='lo', description='LINEAR B SYLLABLE B048 NWA' },
+ [0x10046] = { unicodeslot=0x10046, category='lo', description='LINEAR B SYLLABLE B029 PU2' },
+ [0x10047] = { unicodeslot=0x10047, category='lo', description='LINEAR B SYLLABLE B062 PTE' },
+ [0x10048] = { unicodeslot=0x10048, category='lo', description='LINEAR B SYLLABLE B076 RA2' },
+ [0x10049] = { unicodeslot=0x10049, category='lo', description='LINEAR B SYLLABLE B033 RA3' },
+ [0x1004A] = { unicodeslot=0x1004A, category='lo', description='LINEAR B SYLLABLE B068 RO2' },
+ [0x1004B] = { unicodeslot=0x1004B, category='lo', description='LINEAR B SYLLABLE B066 TA2' },
+ [0x1004C] = { unicodeslot=0x1004C, category='lo', description='LINEAR B SYLLABLE B087 TWE' },
+ [0x1004D] = { unicodeslot=0x1004D, category='lo', description='LINEAR B SYLLABLE B091 TWO' },
+ [0x10050] = { unicodeslot=0x10050, category='lo', description='LINEAR B SYMBOL B018' },
+ [0x10051] = { unicodeslot=0x10051, category='lo', description='LINEAR B SYMBOL B019' },
+ [0x10052] = { unicodeslot=0x10052, category='lo', description='LINEAR B SYMBOL B022' },
+ [0x10053] = { unicodeslot=0x10053, category='lo', description='LINEAR B SYMBOL B034' },
+ [0x10054] = { unicodeslot=0x10054, category='lo', description='LINEAR B SYMBOL B047' },
+ [0x10055] = { unicodeslot=0x10055, category='lo', description='LINEAR B SYMBOL B049' },
+ [0x10056] = { unicodeslot=0x10056, category='lo', description='LINEAR B SYMBOL B056' },
+ [0x10057] = { unicodeslot=0x10057, category='lo', description='LINEAR B SYMBOL B063' },
+ [0x10058] = { unicodeslot=0x10058, category='lo', description='LINEAR B SYMBOL B064' },
+ [0x10059] = { unicodeslot=0x10059, category='lo', description='LINEAR B SYMBOL B079' },
+ [0x1005A] = { unicodeslot=0x1005A, category='lo', description='LINEAR B SYMBOL B082' },
+ [0x1005B] = { unicodeslot=0x1005B, category='lo', description='LINEAR B SYMBOL B083' },
+ [0x1005C] = { unicodeslot=0x1005C, category='lo', description='LINEAR B SYMBOL B086' },
+ [0x1005D] = { unicodeslot=0x1005D, category='lo', description='LINEAR B SYMBOL B089' },
+ [0x10080] = { unicodeslot=0x10080, category='lo', description='LINEAR B IDEOGRAM B100 MAN' },
+ [0x10081] = { unicodeslot=0x10081, category='lo', description='LINEAR B IDEOGRAM B102 WOMAN' },
+ [0x10082] = { unicodeslot=0x10082, category='lo', description='LINEAR B IDEOGRAM B104 DEER' },
+ [0x10083] = { unicodeslot=0x10083, category='lo', description='LINEAR B IDEOGRAM B105 EQUID' },
+ [0x10084] = { unicodeslot=0x10084, category='lo', description='LINEAR B IDEOGRAM B105F MARE' },
+ [0x10085] = { unicodeslot=0x10085, category='lo', description='LINEAR B IDEOGRAM B105M STALLION' },
+ [0x10086] = { unicodeslot=0x10086, category='lo', description='LINEAR B IDEOGRAM B106F EWE' },
+ [0x10087] = { unicodeslot=0x10087, category='lo', description='LINEAR B IDEOGRAM B106M RAM' },
+ [0x10088] = { unicodeslot=0x10088, category='lo', description='LINEAR B IDEOGRAM B107F SHE-GOAT' },
+ [0x10089] = { unicodeslot=0x10089, category='lo', description='LINEAR B IDEOGRAM B107M HE-GOAT' },
+ [0x1008A] = { unicodeslot=0x1008A, category='lo', description='LINEAR B IDEOGRAM B108F SOW' },
+ [0x1008B] = { unicodeslot=0x1008B, category='lo', description='LINEAR B IDEOGRAM B108M BOAR' },
+ [0x1008C] = { unicodeslot=0x1008C, category='lo', description='LINEAR B IDEOGRAM B109F COW' },
+ [0x1008D] = { unicodeslot=0x1008D, category='lo', description='LINEAR B IDEOGRAM B109M BULL' },
+ [0x1008E] = { unicodeslot=0x1008E, category='lo', description='LINEAR B IDEOGRAM B120 WHEAT' },
+ [0x1008F] = { unicodeslot=0x1008F, category='lo', description='LINEAR B IDEOGRAM B121 BARLEY' },
+ [0x10090] = { unicodeslot=0x10090, category='lo', description='LINEAR B IDEOGRAM B122 OLIVE' },
+ [0x10091] = { unicodeslot=0x10091, category='lo', description='LINEAR B IDEOGRAM B123 SPICE' },
+ [0x10092] = { unicodeslot=0x10092, category='lo', description='LINEAR B IDEOGRAM B125 CYPERUS' },
+ [0x10093] = { unicodeslot=0x10093, category='lo', description='LINEAR B MONOGRAM B127 KAPO' },
+ [0x10094] = { unicodeslot=0x10094, category='lo', description='LINEAR B MONOGRAM B128 KANAKO' },
+ [0x10095] = { unicodeslot=0x10095, category='lo', description='LINEAR B IDEOGRAM B130 OIL' },
+ [0x10096] = { unicodeslot=0x10096, category='lo', description='LINEAR B IDEOGRAM B131 WINE' },
+ [0x10097] = { unicodeslot=0x10097, category='lo', description='LINEAR B IDEOGRAM B132' },
+ [0x10098] = { unicodeslot=0x10098, category='lo', description='LINEAR B MONOGRAM B133 AREPA' },
+ [0x10099] = { unicodeslot=0x10099, category='lo', description='LINEAR B MONOGRAM B135 MERI' },
+ [0x1009A] = { unicodeslot=0x1009A, category='lo', description='LINEAR B IDEOGRAM B140 BRONZE' },
+ [0x1009B] = { unicodeslot=0x1009B, category='lo', description='LINEAR B IDEOGRAM B141 GOLD' },
+ [0x1009C] = { unicodeslot=0x1009C, category='lo', description='LINEAR B IDEOGRAM B142' },
+ [0x1009D] = { unicodeslot=0x1009D, category='lo', description='LINEAR B IDEOGRAM B145 WOOL' },
+ [0x1009E] = { unicodeslot=0x1009E, category='lo', description='LINEAR B IDEOGRAM B146' },
+ [0x1009F] = { unicodeslot=0x1009F, category='lo', description='LINEAR B IDEOGRAM B150' },
+ [0x100A0] = { unicodeslot=0x100A0, category='lo', description='LINEAR B IDEOGRAM B151 HORN' },
+ [0x100A1] = { unicodeslot=0x100A1, category='lo', description='LINEAR B IDEOGRAM B152' },
+ [0x100A2] = { unicodeslot=0x100A2, category='lo', description='LINEAR B IDEOGRAM B153' },
+ [0x100A3] = { unicodeslot=0x100A3, category='lo', description='LINEAR B IDEOGRAM B154' },
+ [0x100A4] = { unicodeslot=0x100A4, category='lo', description='LINEAR B MONOGRAM B156 TURO2' },
+ [0x100A5] = { unicodeslot=0x100A5, category='lo', description='LINEAR B IDEOGRAM B157' },
+ [0x100A6] = { unicodeslot=0x100A6, category='lo', description='LINEAR B IDEOGRAM B158' },
+ [0x100A7] = { unicodeslot=0x100A7, category='lo', description='LINEAR B IDEOGRAM B159 CLOTH' },
+ [0x100A8] = { unicodeslot=0x100A8, category='lo', description='LINEAR B IDEOGRAM B160' },
+ [0x100A9] = { unicodeslot=0x100A9, category='lo', description='LINEAR B IDEOGRAM B161' },
+ [0x100AA] = { unicodeslot=0x100AA, category='lo', description='LINEAR B IDEOGRAM B162 GARMENT' },
+ [0x100AB] = { unicodeslot=0x100AB, category='lo', description='LINEAR B IDEOGRAM B163 ARMOUR' },
+ [0x100AC] = { unicodeslot=0x100AC, category='lo', description='LINEAR B IDEOGRAM B164' },
+ [0x100AD] = { unicodeslot=0x100AD, category='lo', description='LINEAR B IDEOGRAM B165' },
+ [0x100AE] = { unicodeslot=0x100AE, category='lo', description='LINEAR B IDEOGRAM B166' },
+ [0x100AF] = { unicodeslot=0x100AF, category='lo', description='LINEAR B IDEOGRAM B167' },
+ [0x100B0] = { unicodeslot=0x100B0, category='lo', description='LINEAR B IDEOGRAM B168' },
+ [0x100B1] = { unicodeslot=0x100B1, category='lo', description='LINEAR B IDEOGRAM B169' },
+ [0x100B2] = { unicodeslot=0x100B2, category='lo', description='LINEAR B IDEOGRAM B170' },
+ [0x100B3] = { unicodeslot=0x100B3, category='lo', description='LINEAR B IDEOGRAM B171' },
+ [0x100B4] = { unicodeslot=0x100B4, category='lo', description='LINEAR B IDEOGRAM B172' },
+ [0x100B5] = { unicodeslot=0x100B5, category='lo', description='LINEAR B IDEOGRAM B173 MONTH' },
+ [0x100B6] = { unicodeslot=0x100B6, category='lo', description='LINEAR B IDEOGRAM B174' },
+ [0x100B7] = { unicodeslot=0x100B7, category='lo', description='LINEAR B IDEOGRAM B176 TREE' },
+ [0x100B8] = { unicodeslot=0x100B8, category='lo', description='LINEAR B IDEOGRAM B177' },
+ [0x100B9] = { unicodeslot=0x100B9, category='lo', description='LINEAR B IDEOGRAM B178' },
+ [0x100BA] = { unicodeslot=0x100BA, category='lo', description='LINEAR B IDEOGRAM B179' },
+ [0x100BB] = { unicodeslot=0x100BB, category='lo', description='LINEAR B IDEOGRAM B180' },
+ [0x100BC] = { unicodeslot=0x100BC, category='lo', description='LINEAR B IDEOGRAM B181' },
+ [0x100BD] = { unicodeslot=0x100BD, category='lo', description='LINEAR B IDEOGRAM B182' },
+ [0x100BE] = { unicodeslot=0x100BE, category='lo', description='LINEAR B IDEOGRAM B183' },
+ [0x100BF] = { unicodeslot=0x100BF, category='lo', description='LINEAR B IDEOGRAM B184' },
+ [0x100C0] = { unicodeslot=0x100C0, category='lo', description='LINEAR B IDEOGRAM B185' },
+ [0x100C1] = { unicodeslot=0x100C1, category='lo', description='LINEAR B IDEOGRAM B189' },
+ [0x100C2] = { unicodeslot=0x100C2, category='lo', description='LINEAR B IDEOGRAM B190' },
+ [0x100C3] = { unicodeslot=0x100C3, category='lo', description='LINEAR B IDEOGRAM B191 HELMET' },
+ [0x100C4] = { unicodeslot=0x100C4, category='lo', description='LINEAR B IDEOGRAM B220 FOOTSTOOL' },
+ [0x100C5] = { unicodeslot=0x100C5, category='lo', description='LINEAR B IDEOGRAM B225 BATHTUB' },
+ [0x100C6] = { unicodeslot=0x100C6, category='lo', description='LINEAR B IDEOGRAM B230 SPEAR' },
+ [0x100C7] = { unicodeslot=0x100C7, category='lo', description='LINEAR B IDEOGRAM B231 ARROW' },
+ [0x100C8] = { unicodeslot=0x100C8, category='lo', description='LINEAR B IDEOGRAM B232' },
+ [0x100C9] = { unicodeslot=0x100C9, category='lo', description='LINEAR B IDEOGRAM B233 SWORD' },
+ [0x100CA] = { unicodeslot=0x100CA, category='lo', description='LINEAR B IDEOGRAM B234' },
+ [0x100CB] = { unicodeslot=0x100CB, category='lo', description='LINEAR B IDEOGRAM B236' },
+ [0x100CC] = { unicodeslot=0x100CC, category='lo', description='LINEAR B IDEOGRAM B240 WHEELED CHARIOT' },
+ [0x100CD] = { unicodeslot=0x100CD, category='lo', description='LINEAR B IDEOGRAM B241 CHARIOT' },
+ [0x100CE] = { unicodeslot=0x100CE, category='lo', description='LINEAR B IDEOGRAM B242 CHARIOT FRAME' },
+ [0x100CF] = { unicodeslot=0x100CF, category='lo', description='LINEAR B IDEOGRAM B243 WHEEL' },
+ [0x100D0] = { unicodeslot=0x100D0, category='lo', description='LINEAR B IDEOGRAM B245' },
+ [0x100D1] = { unicodeslot=0x100D1, category='lo', description='LINEAR B IDEOGRAM B246' },
+ [0x100D2] = { unicodeslot=0x100D2, category='lo', description='LINEAR B MONOGRAM B247 DIPTE' },
+ [0x100D3] = { unicodeslot=0x100D3, category='lo', description='LINEAR B IDEOGRAM B248' },
+ [0x100D4] = { unicodeslot=0x100D4, category='lo', description='LINEAR B IDEOGRAM B249' },
+ [0x100D5] = { unicodeslot=0x100D5, category='lo', description='LINEAR B IDEOGRAM B251' },
+ [0x100D6] = { unicodeslot=0x100D6, category='lo', description='LINEAR B IDEOGRAM B252' },
+ [0x100D7] = { unicodeslot=0x100D7, category='lo', description='LINEAR B IDEOGRAM B253' },
+ [0x100D8] = { unicodeslot=0x100D8, category='lo', description='LINEAR B IDEOGRAM B254 DART' },
+ [0x100D9] = { unicodeslot=0x100D9, category='lo', description='LINEAR B IDEOGRAM B255' },
+ [0x100DA] = { unicodeslot=0x100DA, category='lo', description='LINEAR B IDEOGRAM B256' },
+ [0x100DB] = { unicodeslot=0x100DB, category='lo', description='LINEAR B IDEOGRAM B257' },
+ [0x100DC] = { unicodeslot=0x100DC, category='lo', description='LINEAR B IDEOGRAM B258' },
+ [0x100DD] = { unicodeslot=0x100DD, category='lo', description='LINEAR B IDEOGRAM B259' },
+ [0x100DE] = { unicodeslot=0x100DE, category='lo', description='LINEAR B IDEOGRAM VESSEL B155' },
+ [0x100DF] = { unicodeslot=0x100DF, category='lo', description='LINEAR B IDEOGRAM VESSEL B200' },
+ [0x100E0] = { unicodeslot=0x100E0, category='lo', description='LINEAR B IDEOGRAM VESSEL B201' },
+ [0x100E1] = { unicodeslot=0x100E1, category='lo', description='LINEAR B IDEOGRAM VESSEL B202' },
+ [0x100E2] = { unicodeslot=0x100E2, category='lo', description='LINEAR B IDEOGRAM VESSEL B203' },
+ [0x100E3] = { unicodeslot=0x100E3, category='lo', description='LINEAR B IDEOGRAM VESSEL B204' },
+ [0x100E4] = { unicodeslot=0x100E4, category='lo', description='LINEAR B IDEOGRAM VESSEL B205' },
+ [0x100E5] = { unicodeslot=0x100E5, category='lo', description='LINEAR B IDEOGRAM VESSEL B206' },
+ [0x100E6] = { unicodeslot=0x100E6, category='lo', description='LINEAR B IDEOGRAM VESSEL B207' },
+ [0x100E7] = { unicodeslot=0x100E7, category='lo', description='LINEAR B IDEOGRAM VESSEL B208' },
+ [0x100E8] = { unicodeslot=0x100E8, category='lo', description='LINEAR B IDEOGRAM VESSEL B209' },
+ [0x100E9] = { unicodeslot=0x100E9, category='lo', description='LINEAR B IDEOGRAM VESSEL B210' },
+ [0x100EA] = { unicodeslot=0x100EA, category='lo', description='LINEAR B IDEOGRAM VESSEL B211' },
+ [0x100EB] = { unicodeslot=0x100EB, category='lo', description='LINEAR B IDEOGRAM VESSEL B212' },
+ [0x100EC] = { unicodeslot=0x100EC, category='lo', description='LINEAR B IDEOGRAM VESSEL B213' },
+ [0x100ED] = { unicodeslot=0x100ED, category='lo', description='LINEAR B IDEOGRAM VESSEL B214' },
+ [0x100EE] = { unicodeslot=0x100EE, category='lo', description='LINEAR B IDEOGRAM VESSEL B215' },
+ [0x100EF] = { unicodeslot=0x100EF, category='lo', description='LINEAR B IDEOGRAM VESSEL B216' },
+ [0x100F0] = { unicodeslot=0x100F0, category='lo', description='LINEAR B IDEOGRAM VESSEL B217' },
+ [0x100F1] = { unicodeslot=0x100F1, category='lo', description='LINEAR B IDEOGRAM VESSEL B218' },
+ [0x100F2] = { unicodeslot=0x100F2, category='lo', description='LINEAR B IDEOGRAM VESSEL B219' },
+ [0x100F3] = { unicodeslot=0x100F3, category='lo', description='LINEAR B IDEOGRAM VESSEL B221' },
+ [0x100F4] = { unicodeslot=0x100F4, category='lo', description='LINEAR B IDEOGRAM VESSEL B222' },
+ [0x100F5] = { unicodeslot=0x100F5, category='lo', description='LINEAR B IDEOGRAM VESSEL B226' },
+ [0x100F6] = { unicodeslot=0x100F6, category='lo', description='LINEAR B IDEOGRAM VESSEL B227' },
+ [0x100F7] = { unicodeslot=0x100F7, category='lo', description='LINEAR B IDEOGRAM VESSEL B228' },
+ [0x100F8] = { unicodeslot=0x100F8, category='lo', description='LINEAR B IDEOGRAM VESSEL B229' },
+ [0x100F9] = { unicodeslot=0x100F9, category='lo', description='LINEAR B IDEOGRAM VESSEL B250' },
+ [0x100FA] = { unicodeslot=0x100FA, category='lo', description='LINEAR B IDEOGRAM VESSEL B305' },
+ [0x10100] = { unicodeslot=0x10100, category='po', description='AEGEAN WORD SEPARATOR LINE' },
+ [0x10101] = { unicodeslot=0x10101, category='po', description='AEGEAN WORD SEPARATOR DOT' },
+ [0x10102] = { unicodeslot=0x10102, category='so', description='AEGEAN CHECK MARK' },
+ [0x10107] = { unicodeslot=0x10107, category='no', description='AEGEAN NUMBER ONE' },
+ [0x10108] = { unicodeslot=0x10108, category='no', description='AEGEAN NUMBER TWO' },
+ [0x10109] = { unicodeslot=0x10109, category='no', description='AEGEAN NUMBER THREE' },
+ [0x1010A] = { unicodeslot=0x1010A, category='no', description='AEGEAN NUMBER FOUR' },
+ [0x1010B] = { unicodeslot=0x1010B, category='no', description='AEGEAN NUMBER FIVE' },
+ [0x1010C] = { unicodeslot=0x1010C, category='no', description='AEGEAN NUMBER SIX' },
+ [0x1010D] = { unicodeslot=0x1010D, category='no', description='AEGEAN NUMBER SEVEN' },
+ [0x1010E] = { unicodeslot=0x1010E, category='no', description='AEGEAN NUMBER EIGHT' },
+ [0x1010F] = { unicodeslot=0x1010F, category='no', description='AEGEAN NUMBER NINE' },
+ [0x10110] = { unicodeslot=0x10110, category='no', description='AEGEAN NUMBER TEN' },
+ [0x10111] = { unicodeslot=0x10111, category='no', description='AEGEAN NUMBER TWENTY' },
+ [0x10112] = { unicodeslot=0x10112, category='no', description='AEGEAN NUMBER THIRTY' },
+ [0x10113] = { unicodeslot=0x10113, category='no', description='AEGEAN NUMBER FORTY' },
+ [0x10114] = { unicodeslot=0x10114, category='no', description='AEGEAN NUMBER FIFTY' },
+ [0x10115] = { unicodeslot=0x10115, category='no', description='AEGEAN NUMBER SIXTY' },
+ [0x10116] = { unicodeslot=0x10116, category='no', description='AEGEAN NUMBER SEVENTY' },
+ [0x10117] = { unicodeslot=0x10117, category='no', description='AEGEAN NUMBER EIGHTY' },
+ [0x10118] = { unicodeslot=0x10118, category='no', description='AEGEAN NUMBER NINETY' },
+ [0x10119] = { unicodeslot=0x10119, category='no', description='AEGEAN NUMBER ONE HUNDRED' },
+ [0x1011A] = { unicodeslot=0x1011A, category='no', description='AEGEAN NUMBER TWO HUNDRED' },
+ [0x1011B] = { unicodeslot=0x1011B, category='no', description='AEGEAN NUMBER THREE HUNDRED' },
+ [0x1011C] = { unicodeslot=0x1011C, category='no', description='AEGEAN NUMBER FOUR HUNDRED' },
+ [0x1011D] = { unicodeslot=0x1011D, category='no', description='AEGEAN NUMBER FIVE HUNDRED' },
+ [0x1011E] = { unicodeslot=0x1011E, category='no', description='AEGEAN NUMBER SIX HUNDRED' },
+ [0x1011F] = { unicodeslot=0x1011F, category='no', description='AEGEAN NUMBER SEVEN HUNDRED' },
+ [0x10120] = { unicodeslot=0x10120, category='no', description='AEGEAN NUMBER EIGHT HUNDRED' },
+ [0x10121] = { unicodeslot=0x10121, category='no', description='AEGEAN NUMBER NINE HUNDRED' },
+ [0x10122] = { unicodeslot=0x10122, category='no', description='AEGEAN NUMBER ONE THOUSAND' },
+ [0x10123] = { unicodeslot=0x10123, category='no', description='AEGEAN NUMBER TWO THOUSAND' },
+ [0x10124] = { unicodeslot=0x10124, category='no', description='AEGEAN NUMBER THREE THOUSAND' },
+ [0x10125] = { unicodeslot=0x10125, category='no', description='AEGEAN NUMBER FOUR THOUSAND' },
+ [0x10126] = { unicodeslot=0x10126, category='no', description='AEGEAN NUMBER FIVE THOUSAND' },
+ [0x10127] = { unicodeslot=0x10127, category='no', description='AEGEAN NUMBER SIX THOUSAND' },
+ [0x10128] = { unicodeslot=0x10128, category='no', description='AEGEAN NUMBER SEVEN THOUSAND' },
+ [0x10129] = { unicodeslot=0x10129, category='no', description='AEGEAN NUMBER EIGHT THOUSAND' },
+ [0x1012A] = { unicodeslot=0x1012A, category='no', description='AEGEAN NUMBER NINE THOUSAND' },
+ [0x1012B] = { unicodeslot=0x1012B, category='no', description='AEGEAN NUMBER TEN THOUSAND' },
+ [0x1012C] = { unicodeslot=0x1012C, category='no', description='AEGEAN NUMBER TWENTY THOUSAND' },
+ [0x1012D] = { unicodeslot=0x1012D, category='no', description='AEGEAN NUMBER THIRTY THOUSAND' },
+ [0x1012E] = { unicodeslot=0x1012E, category='no', description='AEGEAN NUMBER FORTY THOUSAND' },
+ [0x1012F] = { unicodeslot=0x1012F, category='no', description='AEGEAN NUMBER FIFTY THOUSAND' },
+ [0x10130] = { unicodeslot=0x10130, category='no', description='AEGEAN NUMBER SIXTY THOUSAND' },
+ [0x10131] = { unicodeslot=0x10131, category='no', description='AEGEAN NUMBER SEVENTY THOUSAND' },
+ [0x10132] = { unicodeslot=0x10132, category='no', description='AEGEAN NUMBER EIGHTY THOUSAND' },
+ [0x10133] = { unicodeslot=0x10133, category='no', description='AEGEAN NUMBER NINETY THOUSAND' },
+ [0x10137] = { unicodeslot=0x10137, category='so', description='AEGEAN WEIGHT BASE UNIT' },
+ [0x10138] = { unicodeslot=0x10138, category='so', description='AEGEAN WEIGHT FIRST SUBUNIT' },
+ [0x10139] = { unicodeslot=0x10139, category='so', description='AEGEAN WEIGHT SECOND SUBUNIT' },
+ [0x1013A] = { unicodeslot=0x1013A, category='so', description='AEGEAN WEIGHT THIRD SUBUNIT' },
+ [0x1013B] = { unicodeslot=0x1013B, category='so', description='AEGEAN WEIGHT FOURTH SUBUNIT' },
+ [0x1013C] = { unicodeslot=0x1013C, category='so', description='AEGEAN DRY MEASURE FIRST SUBUNIT' },
+ [0x1013D] = { unicodeslot=0x1013D, category='so', description='AEGEAN LIQUID MEASURE FIRST SUBUNIT' },
+ [0x1013E] = { unicodeslot=0x1013E, category='so', description='AEGEAN MEASURE SECOND SUBUNIT' },
+ [0x1013F] = { unicodeslot=0x1013F, category='so', description='AEGEAN MEASURE THIRD SUBUNIT' },
+ [0x10140] = { unicodeslot=0x10140, category='nl', description='GREEK ACROPHONIC ATTIC ONE QUARTER' },
+ [0x10141] = { unicodeslot=0x10141, category='nl', description='GREEK ACROPHONIC ATTIC ONE HALF' },
+ [0x10142] = { unicodeslot=0x10142, category='nl', description='GREEK ACROPHONIC ATTIC ONE DRACHMA' },
+ [0x10143] = { unicodeslot=0x10143, category='nl', description='GREEK ACROPHONIC ATTIC FIVE' },
+ [0x10144] = { unicodeslot=0x10144, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY' },
+ [0x10145] = { unicodeslot=0x10145, category='nl', description='GREEK ACROPHONIC ATTIC FIVE HUNDRED' },
+ [0x10146] = { unicodeslot=0x10146, category='nl', description='GREEK ACROPHONIC ATTIC FIVE THOUSAND' },
+ [0x10147] = { unicodeslot=0x10147, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY THOUSAND' },
+ [0x10148] = { unicodeslot=0x10148, category='nl', description='GREEK ACROPHONIC ATTIC FIVE TALENTS' },
+ [0x10149] = { unicodeslot=0x10149, category='nl', description='GREEK ACROPHONIC ATTIC TEN TALENTS' },
+ [0x1014A] = { unicodeslot=0x1014A, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY TALENTS' },
+ [0x1014B] = { unicodeslot=0x1014B, category='nl', description='GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS' },
+ [0x1014C] = { unicodeslot=0x1014C, category='nl', description='GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS' },
+ [0x1014D] = { unicodeslot=0x1014D, category='nl', description='GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS' },
+ [0x1014E] = { unicodeslot=0x1014E, category='nl', description='GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS' },
+ [0x1014F] = { unicodeslot=0x1014F, category='nl', description='GREEK ACROPHONIC ATTIC FIVE STATERS' },
+ [0x10150] = { unicodeslot=0x10150, category='nl', description='GREEK ACROPHONIC ATTIC TEN STATERS' },
+ [0x10151] = { unicodeslot=0x10151, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY STATERS' },
+ [0x10152] = { unicodeslot=0x10152, category='nl', description='GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS' },
+ [0x10153] = { unicodeslot=0x10153, category='nl', description='GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS' },
+ [0x10154] = { unicodeslot=0x10154, category='nl', description='GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS' },
+ [0x10155] = { unicodeslot=0x10155, category='nl', description='GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS' },
+ [0x10156] = { unicodeslot=0x10156, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS' },
+ [0x10157] = { unicodeslot=0x10157, category='nl', description='GREEK ACROPHONIC ATTIC TEN MNAS' },
+ [0x10158] = { unicodeslot=0x10158, category='nl', description='GREEK ACROPHONIC HERAEUM ONE PLETHRON' },
+ [0x10159] = { unicodeslot=0x10159, category='nl', description='GREEK ACROPHONIC THESPIAN ONE' },
+ [0x1015A] = { unicodeslot=0x1015A, category='nl', description='GREEK ACROPHONIC HERMIONIAN ONE' },
+ [0x1015B] = { unicodeslot=0x1015B, category='nl', description='GREEK ACROPHONIC EPIDAUREAN TWO' },
+ [0x1015C] = { unicodeslot=0x1015C, category='nl', description='GREEK ACROPHONIC THESPIAN TWO' },
+ [0x1015D] = { unicodeslot=0x1015D, category='nl', description='GREEK ACROPHONIC CYRENAIC TWO DRACHMAS' },
+ [0x1015E] = { unicodeslot=0x1015E, category='nl', description='GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS' },
+ [0x1015F] = { unicodeslot=0x1015F, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIVE' },
+ [0x10160] = { unicodeslot=0x10160, category='nl', description='GREEK ACROPHONIC TROEZENIAN TEN' },
+ [0x10161] = { unicodeslot=0x10161, category='nl', description='GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM' },
+ [0x10162] = { unicodeslot=0x10162, category='nl', description='GREEK ACROPHONIC HERMIONIAN TEN' },
+ [0x10163] = { unicodeslot=0x10163, category='nl', description='GREEK ACROPHONIC MESSENIAN TEN' },
+ [0x10164] = { unicodeslot=0x10164, category='nl', description='GREEK ACROPHONIC THESPIAN TEN' },
+ [0x10165] = { unicodeslot=0x10165, category='nl', description='GREEK ACROPHONIC THESPIAN THIRTY' },
+ [0x10166] = { unicodeslot=0x10166, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIFTY' },
+ [0x10167] = { unicodeslot=0x10167, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM' },
+ [0x10168] = { unicodeslot=0x10168, category='nl', description='GREEK ACROPHONIC HERMIONIAN FIFTY' },
+ [0x10169] = { unicodeslot=0x10169, category='nl', description='GREEK ACROPHONIC THESPIAN FIFTY' },
+ [0x1016A] = { unicodeslot=0x1016A, category='nl', description='GREEK ACROPHONIC THESPIAN ONE HUNDRED' },
+ [0x1016B] = { unicodeslot=0x1016B, category='nl', description='GREEK ACROPHONIC THESPIAN THREE HUNDRED' },
+ [0x1016C] = { unicodeslot=0x1016C, category='nl', description='GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED' },
+ [0x1016D] = { unicodeslot=0x1016D, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED' },
+ [0x1016E] = { unicodeslot=0x1016E, category='nl', description='GREEK ACROPHONIC THESPIAN FIVE HUNDRED' },
+ [0x1016F] = { unicodeslot=0x1016F, category='nl', description='GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED' },
+ [0x10170] = { unicodeslot=0x10170, category='nl', description='GREEK ACROPHONIC NAXIAN FIVE HUNDRED' },
+ [0x10171] = { unicodeslot=0x10171, category='nl', description='GREEK ACROPHONIC THESPIAN ONE THOUSAND' },
+ [0x10172] = { unicodeslot=0x10172, category='nl', description='GREEK ACROPHONIC THESPIAN FIVE THOUSAND' },
+ [0x10173] = { unicodeslot=0x10173, category='nl', description='GREEK ACROPHONIC DELPHIC FIVE MNAS' },
+ [0x10174] = { unicodeslot=0x10174, category='nl', description='GREEK ACROPHONIC STRATIAN FIFTY MNAS' },
+ [0x10175] = { unicodeslot=0x10175, category='no', description='GREEK ONE HALF SIGN' },
+ [0x10176] = { unicodeslot=0x10176, category='no', description='GREEK ONE HALF SIGN ALTERNATE FORM' },
+ [0x10177] = { unicodeslot=0x10177, category='no', description='GREEK TWO THIRDS SIGN' },
+ [0x10178] = { unicodeslot=0x10178, category='no', description='GREEK THREE QUARTERS SIGN' },
+ [0x10179] = { unicodeslot=0x10179, category='so', description='GREEK YEAR SIGN' },
+ [0x1017A] = { unicodeslot=0x1017A, category='so', description='GREEK TALENT SIGN' },
+ [0x1017B] = { unicodeslot=0x1017B, category='so', description='GREEK DRACHMA SIGN' },
+ [0x1017C] = { unicodeslot=0x1017C, category='so', description='GREEK OBOL SIGN' },
+ [0x1017D] = { unicodeslot=0x1017D, category='so', description='GREEK TWO OBOLS SIGN' },
+ [0x1017E] = { unicodeslot=0x1017E, category='so', description='GREEK THREE OBOLS SIGN' },
+ [0x1017F] = { unicodeslot=0x1017F, category='so', description='GREEK FOUR OBOLS SIGN' },
+ [0x10180] = { unicodeslot=0x10180, category='so', description='GREEK FIVE OBOLS SIGN' },
+ [0x10181] = { unicodeslot=0x10181, category='so', description='GREEK METRETES SIGN' },
+ [0x10182] = { unicodeslot=0x10182, category='so', description='GREEK KYATHOS BASE SIGN' },
+ [0x10183] = { unicodeslot=0x10183, category='so', description='GREEK LITRA SIGN' },
+ [0x10184] = { unicodeslot=0x10184, category='so', description='GREEK OUNKIA SIGN' },
+ [0x10185] = { unicodeslot=0x10185, category='so', description='GREEK XESTES SIGN' },
+ [0x10186] = { unicodeslot=0x10186, category='so', description='GREEK ARTABE SIGN' },
+ [0x10187] = { unicodeslot=0x10187, category='so', description='GREEK AROURA SIGN' },
+ [0x10188] = { unicodeslot=0x10188, category='so', description='GREEK GRAMMA SIGN' },
+ [0x10189] = { unicodeslot=0x10189, category='so', description='GREEK TRYBLION BASE SIGN' },
+ [0x1018A] = { unicodeslot=0x1018A, category='no', description='GREEK ZERO SIGN' },
+ [0x10300] = { unicodeslot=0x10300, category='lo', description='OLD ITALIC LETTER A' },
+ [0x10301] = { unicodeslot=0x10301, category='lo', description='OLD ITALIC LETTER BE' },
+ [0x10302] = { unicodeslot=0x10302, category='lo', description='OLD ITALIC LETTER KE' },
+ [0x10303] = { unicodeslot=0x10303, category='lo', description='OLD ITALIC LETTER DE' },
+ [0x10304] = { unicodeslot=0x10304, category='lo', description='OLD ITALIC LETTER E' },
+ [0x10305] = { unicodeslot=0x10305, category='lo', description='OLD ITALIC LETTER VE' },
+ [0x10306] = { unicodeslot=0x10306, category='lo', description='OLD ITALIC LETTER ZE' },
+ [0x10307] = { unicodeslot=0x10307, category='lo', description='OLD ITALIC LETTER HE' },
+ [0x10308] = { unicodeslot=0x10308, category='lo', description='OLD ITALIC LETTER THE' },
+ [0x10309] = { unicodeslot=0x10309, category='lo', description='OLD ITALIC LETTER I' },
+ [0x1030A] = { unicodeslot=0x1030A, category='lo', description='OLD ITALIC LETTER KA' },
+ [0x1030B] = { unicodeslot=0x1030B, category='lo', description='OLD ITALIC LETTER EL' },
+ [0x1030C] = { unicodeslot=0x1030C, category='lo', description='OLD ITALIC LETTER EM' },
+ [0x1030D] = { unicodeslot=0x1030D, category='lo', description='OLD ITALIC LETTER EN' },
+ [0x1030E] = { unicodeslot=0x1030E, category='lo', description='OLD ITALIC LETTER ESH' },
+ [0x1030F] = { unicodeslot=0x1030F, category='lo', description='OLD ITALIC LETTER O' },
+ [0x10310] = { unicodeslot=0x10310, category='lo', description='OLD ITALIC LETTER PE' },
+ [0x10311] = { unicodeslot=0x10311, category='lo', description='OLD ITALIC LETTER SHE' },
+ [0x10312] = { unicodeslot=0x10312, category='lo', description='OLD ITALIC LETTER KU' },
+ [0x10313] = { unicodeslot=0x10313, category='lo', description='OLD ITALIC LETTER ER' },
+ [0x10314] = { unicodeslot=0x10314, category='lo', description='OLD ITALIC LETTER ES' },
+ [0x10315] = { unicodeslot=0x10315, category='lo', description='OLD ITALIC LETTER TE' },
+ [0x10316] = { unicodeslot=0x10316, category='lo', description='OLD ITALIC LETTER U' },
+ [0x10317] = { unicodeslot=0x10317, category='lo', description='OLD ITALIC LETTER EKS' },
+ [0x10318] = { unicodeslot=0x10318, category='lo', description='OLD ITALIC LETTER PHE' },
+ [0x10319] = { unicodeslot=0x10319, category='lo', description='OLD ITALIC LETTER KHE' },
+ [0x1031A] = { unicodeslot=0x1031A, category='lo', description='OLD ITALIC LETTER EF' },
+ [0x1031B] = { unicodeslot=0x1031B, category='lo', description='OLD ITALIC LETTER ERS' },
+ [0x1031C] = { unicodeslot=0x1031C, category='lo', description='OLD ITALIC LETTER CHE' },
+ [0x1031D] = { unicodeslot=0x1031D, category='lo', description='OLD ITALIC LETTER II' },
+ [0x1031E] = { unicodeslot=0x1031E, category='lo', description='OLD ITALIC LETTER UU' },
+ [0x10320] = { unicodeslot=0x10320, category='no', description='OLD ITALIC NUMERAL ONE' },
+ [0x10321] = { unicodeslot=0x10321, category='no', description='OLD ITALIC NUMERAL FIVE' },
+ [0x10322] = { unicodeslot=0x10322, category='no', description='OLD ITALIC NUMERAL TEN' },
+ [0x10323] = { unicodeslot=0x10323, category='no', description='OLD ITALIC NUMERAL FIFTY' },
+ [0x10330] = { unicodeslot=0x10330, category='lo', description='GOTHIC LETTER AHSA' },
+ [0x10331] = { unicodeslot=0x10331, category='lo', description='GOTHIC LETTER BAIRKAN' },
+ [0x10332] = { unicodeslot=0x10332, category='lo', description='GOTHIC LETTER GIBA' },
+ [0x10333] = { unicodeslot=0x10333, category='lo', description='GOTHIC LETTER DAGS' },
+ [0x10334] = { unicodeslot=0x10334, category='lo', description='GOTHIC LETTER AIHVUS' },
+ [0x10335] = { unicodeslot=0x10335, category='lo', description='GOTHIC LETTER QAIRTHRA' },
+ [0x10336] = { unicodeslot=0x10336, category='lo', description='GOTHIC LETTER IUJA' },
+ [0x10337] = { unicodeslot=0x10337, category='lo', description='GOTHIC LETTER HAGL' },
+ [0x10338] = { unicodeslot=0x10338, category='lo', description='GOTHIC LETTER THIUTH' },
+ [0x10339] = { unicodeslot=0x10339, category='lo', description='GOTHIC LETTER EIS' },
+ [0x1033A] = { unicodeslot=0x1033A, category='lo', description='GOTHIC LETTER KUSMA' },
+ [0x1033B] = { unicodeslot=0x1033B, category='lo', description='GOTHIC LETTER LAGUS' },
+ [0x1033C] = { unicodeslot=0x1033C, category='lo', description='GOTHIC LETTER MANNA' },
+ [0x1033D] = { unicodeslot=0x1033D, category='lo', description='GOTHIC LETTER NAUTHS' },
+ [0x1033E] = { unicodeslot=0x1033E, category='lo', description='GOTHIC LETTER JER' },
+ [0x1033F] = { unicodeslot=0x1033F, category='lo', description='GOTHIC LETTER URUS' },
+ [0x10340] = { unicodeslot=0x10340, category='lo', description='GOTHIC LETTER PAIRTHRA' },
+ [0x10341] = { unicodeslot=0x10341, category='nl', description='GOTHIC LETTER NINETY' },
+ [0x10342] = { unicodeslot=0x10342, category='lo', description='GOTHIC LETTER RAIDA' },
+ [0x10343] = { unicodeslot=0x10343, category='lo', description='GOTHIC LETTER SAUIL' },
+ [0x10344] = { unicodeslot=0x10344, category='lo', description='GOTHIC LETTER TEIWS' },
+ [0x10345] = { unicodeslot=0x10345, category='lo', description='GOTHIC LETTER WINJA' },
+ [0x10346] = { unicodeslot=0x10346, category='lo', description='GOTHIC LETTER FAIHU' },
+ [0x10347] = { unicodeslot=0x10347, category='lo', description='GOTHIC LETTER IGGWS' },
+ [0x10348] = { unicodeslot=0x10348, category='lo', description='GOTHIC LETTER HWAIR' },
+ [0x10349] = { unicodeslot=0x10349, category='lo', description='GOTHIC LETTER OTHAL' },
+ [0x1034A] = { unicodeslot=0x1034A, category='nl', description='GOTHIC LETTER NINE HUNDRED' },
+ [0x10380] = { unicodeslot=0x10380, category='lo', description='UGARITIC LETTER ALPA' },
+ [0x10381] = { unicodeslot=0x10381, category='lo', description='UGARITIC LETTER BETA' },
+ [0x10382] = { unicodeslot=0x10382, category='lo', description='UGARITIC LETTER GAMLA' },
+ [0x10383] = { unicodeslot=0x10383, category='lo', description='UGARITIC LETTER KHA' },
+ [0x10384] = { unicodeslot=0x10384, category='lo', description='UGARITIC LETTER DELTA' },
+ [0x10385] = { unicodeslot=0x10385, category='lo', description='UGARITIC LETTER HO' },
+ [0x10386] = { unicodeslot=0x10386, category='lo', description='UGARITIC LETTER WO' },
+ [0x10387] = { unicodeslot=0x10387, category='lo', description='UGARITIC LETTER ZETA' },
+ [0x10388] = { unicodeslot=0x10388, category='lo', description='UGARITIC LETTER HOTA' },
+ [0x10389] = { unicodeslot=0x10389, category='lo', description='UGARITIC LETTER TET' },
+ [0x1038A] = { unicodeslot=0x1038A, category='lo', description='UGARITIC LETTER YOD' },
+ [0x1038B] = { unicodeslot=0x1038B, category='lo', description='UGARITIC LETTER KAF' },
+ [0x1038C] = { unicodeslot=0x1038C, category='lo', description='UGARITIC LETTER SHIN' },
+ [0x1038D] = { unicodeslot=0x1038D, category='lo', description='UGARITIC LETTER LAMDA' },
+ [0x1038E] = { unicodeslot=0x1038E, category='lo', description='UGARITIC LETTER MEM' },
+ [0x1038F] = { unicodeslot=0x1038F, category='lo', description='UGARITIC LETTER DHAL' },
+ [0x10390] = { unicodeslot=0x10390, category='lo', description='UGARITIC LETTER NUN' },
+ [0x10391] = { unicodeslot=0x10391, category='lo', description='UGARITIC LETTER ZU' },
+ [0x10392] = { unicodeslot=0x10392, category='lo', description='UGARITIC LETTER SAMKA' },
+ [0x10393] = { unicodeslot=0x10393, category='lo', description='UGARITIC LETTER AIN' },
+ [0x10394] = { unicodeslot=0x10394, category='lo', description='UGARITIC LETTER PU' },
+ [0x10395] = { unicodeslot=0x10395, category='lo', description='UGARITIC LETTER SADE' },
+ [0x10396] = { unicodeslot=0x10396, category='lo', description='UGARITIC LETTER QOPA' },
+ [0x10397] = { unicodeslot=0x10397, category='lo', description='UGARITIC LETTER RASHA' },
+ [0x10398] = { unicodeslot=0x10398, category='lo', description='UGARITIC LETTER THANNA' },
+ [0x10399] = { unicodeslot=0x10399, category='lo', description='UGARITIC LETTER GHAIN' },
+ [0x1039A] = { unicodeslot=0x1039A, category='lo', description='UGARITIC LETTER TO' },
+ [0x1039B] = { unicodeslot=0x1039B, category='lo', description='UGARITIC LETTER I' },
+ [0x1039C] = { unicodeslot=0x1039C, category='lo', description='UGARITIC LETTER U' },
+ [0x1039D] = { unicodeslot=0x1039D, category='lo', description='UGARITIC LETTER SSU' },
+ [0x1039F] = { unicodeslot=0x1039F, category='po', description='UGARITIC WORD DIVIDER' },
+ [0x103A0] = { unicodeslot=0x103A0, category='lo', description='OLD PERSIAN SIGN A' },
+ [0x103A1] = { unicodeslot=0x103A1, category='lo', description='OLD PERSIAN SIGN I' },
+ [0x103A2] = { unicodeslot=0x103A2, category='lo', description='OLD PERSIAN SIGN U' },
+ [0x103A3] = { unicodeslot=0x103A3, category='lo', description='OLD PERSIAN SIGN KA' },
+ [0x103A4] = { unicodeslot=0x103A4, category='lo', description='OLD PERSIAN SIGN KU' },
+ [0x103A5] = { unicodeslot=0x103A5, category='lo', description='OLD PERSIAN SIGN GA' },
+ [0x103A6] = { unicodeslot=0x103A6, category='lo', description='OLD PERSIAN SIGN GU' },
+ [0x103A7] = { unicodeslot=0x103A7, category='lo', description='OLD PERSIAN SIGN XA' },
+ [0x103A8] = { unicodeslot=0x103A8, category='lo', description='OLD PERSIAN SIGN CA' },
+ [0x103A9] = { unicodeslot=0x103A9, category='lo', description='OLD PERSIAN SIGN JA' },
+ [0x103AA] = { unicodeslot=0x103AA, category='lo', description='OLD PERSIAN SIGN JI' },
+ [0x103AB] = { unicodeslot=0x103AB, category='lo', description='OLD PERSIAN SIGN TA' },
+ [0x103AC] = { unicodeslot=0x103AC, category='lo', description='OLD PERSIAN SIGN TU' },
+ [0x103AD] = { unicodeslot=0x103AD, category='lo', description='OLD PERSIAN SIGN DA' },
+ [0x103AE] = { unicodeslot=0x103AE, category='lo', description='OLD PERSIAN SIGN DI' },
+ [0x103AF] = { unicodeslot=0x103AF, category='lo', description='OLD PERSIAN SIGN DU' },
+ [0x103B0] = { unicodeslot=0x103B0, category='lo', description='OLD PERSIAN SIGN THA' },
+ [0x103B1] = { unicodeslot=0x103B1, category='lo', description='OLD PERSIAN SIGN PA' },
+ [0x103B2] = { unicodeslot=0x103B2, category='lo', description='OLD PERSIAN SIGN BA' },
+ [0x103B3] = { unicodeslot=0x103B3, category='lo', description='OLD PERSIAN SIGN FA' },
+ [0x103B4] = { unicodeslot=0x103B4, category='lo', description='OLD PERSIAN SIGN NA' },
+ [0x103B5] = { unicodeslot=0x103B5, category='lo', description='OLD PERSIAN SIGN NU' },
+ [0x103B6] = { unicodeslot=0x103B6, category='lo', description='OLD PERSIAN SIGN MA' },
+ [0x103B7] = { unicodeslot=0x103B7, category='lo', description='OLD PERSIAN SIGN MI' },
+ [0x103B8] = { unicodeslot=0x103B8, category='lo', description='OLD PERSIAN SIGN MU' },
+ [0x103B9] = { unicodeslot=0x103B9, category='lo', description='OLD PERSIAN SIGN YA' },
+ [0x103BA] = { unicodeslot=0x103BA, category='lo', description='OLD PERSIAN SIGN VA' },
+ [0x103BB] = { unicodeslot=0x103BB, category='lo', description='OLD PERSIAN SIGN VI' },
+ [0x103BC] = { unicodeslot=0x103BC, category='lo', description='OLD PERSIAN SIGN RA' },
+ [0x103BD] = { unicodeslot=0x103BD, category='lo', description='OLD PERSIAN SIGN RU' },
+ [0x103BE] = { unicodeslot=0x103BE, category='lo', description='OLD PERSIAN SIGN LA' },
+ [0x103BF] = { unicodeslot=0x103BF, category='lo', description='OLD PERSIAN SIGN SA' },
+ [0x103C0] = { unicodeslot=0x103C0, category='lo', description='OLD PERSIAN SIGN ZA' },
+ [0x103C1] = { unicodeslot=0x103C1, category='lo', description='OLD PERSIAN SIGN SHA' },
+ [0x103C2] = { unicodeslot=0x103C2, category='lo', description='OLD PERSIAN SIGN SSA' },
+ [0x103C3] = { unicodeslot=0x103C3, category='lo', description='OLD PERSIAN SIGN HA' },
+ [0x103C8] = { unicodeslot=0x103C8, category='lo', description='OLD PERSIAN SIGN AURAMAZDAA' },
+ [0x103C9] = { unicodeslot=0x103C9, category='lo', description='OLD PERSIAN SIGN AURAMAZDAA-2' },
+ [0x103CA] = { unicodeslot=0x103CA, category='lo', description='OLD PERSIAN SIGN AURAMAZDAAHA' },
+ [0x103CB] = { unicodeslot=0x103CB, category='lo', description='OLD PERSIAN SIGN XSHAAYATHIYA' },
+ [0x103CC] = { unicodeslot=0x103CC, category='lo', description='OLD PERSIAN SIGN DAHYAAUSH' },
+ [0x103CD] = { unicodeslot=0x103CD, category='lo', description='OLD PERSIAN SIGN DAHYAAUSH-2' },
+ [0x103CE] = { unicodeslot=0x103CE, category='lo', description='OLD PERSIAN SIGN BAGA' },
+ [0x103CF] = { unicodeslot=0x103CF, category='lo', description='OLD PERSIAN SIGN BUUMISH' },
+ [0x103D0] = { unicodeslot=0x103D0, category='po', description='OLD PERSIAN WORD DIVIDER' },
+ [0x103D1] = { unicodeslot=0x103D1, category='nl', description='OLD PERSIAN NUMBER ONE' },
+ [0x103D2] = { unicodeslot=0x103D2, category='nl', description='OLD PERSIAN NUMBER TWO' },
+ [0x103D3] = { unicodeslot=0x103D3, category='nl', description='OLD PERSIAN NUMBER TEN' },
+ [0x103D4] = { unicodeslot=0x103D4, category='nl', description='OLD PERSIAN NUMBER TWENTY' },
+ [0x103D5] = { unicodeslot=0x103D5, category='nl', description='OLD PERSIAN NUMBER HUNDRED' },
+ [0x10400] = { unicodeslot=0x10400, category='lu', description='DESERET CAPITAL LETTER LONG I', lccode=0x10428 },
+ [0x10401] = { unicodeslot=0x10401, category='lu', description='DESERET CAPITAL LETTER LONG E', lccode=0x10429 },
+ [0x10402] = { unicodeslot=0x10402, category='lu', description='DESERET CAPITAL LETTER LONG A', lccode=0x1042A },
+ [0x10403] = { unicodeslot=0x10403, category='lu', description='DESERET CAPITAL LETTER LONG AH', lccode=0x1042B },
+ [0x10404] = { unicodeslot=0x10404, category='lu', description='DESERET CAPITAL LETTER LONG O', lccode=0x1042C },
+ [0x10405] = { unicodeslot=0x10405, category='lu', description='DESERET CAPITAL LETTER LONG OO', lccode=0x1042D },
+ [0x10406] = { unicodeslot=0x10406, category='lu', description='DESERET CAPITAL LETTER SHORT I', lccode=0x1042E },
+ [0x10407] = { unicodeslot=0x10407, category='lu', description='DESERET CAPITAL LETTER SHORT E', lccode=0x1042F },
+ [0x10408] = { unicodeslot=0x10408, category='lu', description='DESERET CAPITAL LETTER SHORT A', lccode=0x10430 },
+ [0x10409] = { unicodeslot=0x10409, category='lu', description='DESERET CAPITAL LETTER SHORT AH', lccode=0x10431 },
+ [0x1040A] = { unicodeslot=0x1040A, category='lu', description='DESERET CAPITAL LETTER SHORT O', lccode=0x10432 },
+ [0x1040B] = { unicodeslot=0x1040B, category='lu', description='DESERET CAPITAL LETTER SHORT OO', lccode=0x10433 },
+ [0x1040C] = { unicodeslot=0x1040C, category='lu', description='DESERET CAPITAL LETTER AY', lccode=0x10434 },
+ [0x1040D] = { unicodeslot=0x1040D, category='lu', description='DESERET CAPITAL LETTER OW', lccode=0x10435 },
+ [0x1040E] = { unicodeslot=0x1040E, category='lu', description='DESERET CAPITAL LETTER WU', lccode=0x10436 },
+ [0x1040F] = { unicodeslot=0x1040F, category='lu', description='DESERET CAPITAL LETTER YEE', lccode=0x10437 },
+ [0x10410] = { unicodeslot=0x10410, category='lu', description='DESERET CAPITAL LETTER H', lccode=0x10438 },
+ [0x10411] = { unicodeslot=0x10411, category='lu', description='DESERET CAPITAL LETTER PEE', lccode=0x10439 },
+ [0x10412] = { unicodeslot=0x10412, category='lu', description='DESERET CAPITAL LETTER BEE', lccode=0x1043A },
+ [0x10413] = { unicodeslot=0x10413, category='lu', description='DESERET CAPITAL LETTER TEE', lccode=0x1043B },
+ [0x10414] = { unicodeslot=0x10414, category='lu', description='DESERET CAPITAL LETTER DEE', lccode=0x1043C },
+ [0x10415] = { unicodeslot=0x10415, category='lu', description='DESERET CAPITAL LETTER CHEE', lccode=0x1043D },
+ [0x10416] = { unicodeslot=0x10416, category='lu', description='DESERET CAPITAL LETTER JEE', lccode=0x1043E },
+ [0x10417] = { unicodeslot=0x10417, category='lu', description='DESERET CAPITAL LETTER KAY', lccode=0x1043F },
+ [0x10418] = { unicodeslot=0x10418, category='lu', description='DESERET CAPITAL LETTER GAY', lccode=0x10440 },
+ [0x10419] = { unicodeslot=0x10419, category='lu', description='DESERET CAPITAL LETTER EF', lccode=0x10441 },
+ [0x1041A] = { unicodeslot=0x1041A, category='lu', description='DESERET CAPITAL LETTER VEE', lccode=0x10442 },
+ [0x1041B] = { unicodeslot=0x1041B, category='lu', description='DESERET CAPITAL LETTER ETH', lccode=0x10443 },
+ [0x1041C] = { unicodeslot=0x1041C, category='lu', description='DESERET CAPITAL LETTER THEE', lccode=0x10444 },
+ [0x1041D] = { unicodeslot=0x1041D, category='lu', description='DESERET CAPITAL LETTER ES', lccode=0x10445 },
+ [0x1041E] = { unicodeslot=0x1041E, category='lu', description='DESERET CAPITAL LETTER ZEE', lccode=0x10446 },
+ [0x1041F] = { unicodeslot=0x1041F, category='lu', description='DESERET CAPITAL LETTER ESH', lccode=0x10447 },
+ [0x10420] = { unicodeslot=0x10420, category='lu', description='DESERET CAPITAL LETTER ZHEE', lccode=0x10448 },
+ [0x10421] = { unicodeslot=0x10421, category='lu', description='DESERET CAPITAL LETTER ER', lccode=0x10449 },
+ [0x10422] = { unicodeslot=0x10422, category='lu', description='DESERET CAPITAL LETTER EL', lccode=0x1044A },
+ [0x10423] = { unicodeslot=0x10423, category='lu', description='DESERET CAPITAL LETTER EM', lccode=0x1044B },
+ [0x10424] = { unicodeslot=0x10424, category='lu', description='DESERET CAPITAL LETTER EN', lccode=0x1044C },
+ [0x10425] = { unicodeslot=0x10425, category='lu', description='DESERET CAPITAL LETTER ENG', lccode=0x1044D },
+ [0x10426] = { unicodeslot=0x10426, category='lu', description='DESERET CAPITAL LETTER OI', lccode=0x1044E },
+ [0x10427] = { unicodeslot=0x10427, category='lu', description='DESERET CAPITAL LETTER EW', lccode=0x1044F },
+ [0x10428] = { unicodeslot=0x10428, category='ll', description='DESERET SMALL LETTER LONG I', uccode=0x10400 },
+ [0x10429] = { unicodeslot=0x10429, category='ll', description='DESERET SMALL LETTER LONG E', uccode=0x10401 },
+ [0x1042A] = { unicodeslot=0x1042A, category='ll', description='DESERET SMALL LETTER LONG A', uccode=0x10402 },
+ [0x1042B] = { unicodeslot=0x1042B, category='ll', description='DESERET SMALL LETTER LONG AH', uccode=0x10403 },
+ [0x1042C] = { unicodeslot=0x1042C, category='ll', description='DESERET SMALL LETTER LONG O', uccode=0x10404 },
+ [0x1042D] = { unicodeslot=0x1042D, category='ll', description='DESERET SMALL LETTER LONG OO', uccode=0x10405 },
+ [0x1042E] = { unicodeslot=0x1042E, category='ll', description='DESERET SMALL LETTER SHORT I', uccode=0x10406 },
+ [0x1042F] = { unicodeslot=0x1042F, category='ll', description='DESERET SMALL LETTER SHORT E', uccode=0x10407 },
+ [0x10430] = { unicodeslot=0x10430, category='ll', description='DESERET SMALL LETTER SHORT A', uccode=0x10408 },
+ [0x10431] = { unicodeslot=0x10431, category='ll', description='DESERET SMALL LETTER SHORT AH', uccode=0x10409 },
+ [0x10432] = { unicodeslot=0x10432, category='ll', description='DESERET SMALL LETTER SHORT O', uccode=0x1040A },
+ [0x10433] = { unicodeslot=0x10433, category='ll', description='DESERET SMALL LETTER SHORT OO', uccode=0x1040B },
+ [0x10434] = { unicodeslot=0x10434, category='ll', description='DESERET SMALL LETTER AY', uccode=0x1040C },
+ [0x10435] = { unicodeslot=0x10435, category='ll', description='DESERET SMALL LETTER OW', uccode=0x1040D },
+ [0x10436] = { unicodeslot=0x10436, category='ll', description='DESERET SMALL LETTER WU', uccode=0x1040E },
+ [0x10437] = { unicodeslot=0x10437, category='ll', description='DESERET SMALL LETTER YEE', uccode=0x1040F },
+ [0x10438] = { unicodeslot=0x10438, category='ll', description='DESERET SMALL LETTER H', uccode=0x10410 },
+ [0x10439] = { unicodeslot=0x10439, category='ll', description='DESERET SMALL LETTER PEE', uccode=0x10411 },
+ [0x1043A] = { unicodeslot=0x1043A, category='ll', description='DESERET SMALL LETTER BEE', uccode=0x10412 },
+ [0x1043B] = { unicodeslot=0x1043B, category='ll', description='DESERET SMALL LETTER TEE', uccode=0x10413 },
+ [0x1043C] = { unicodeslot=0x1043C, category='ll', description='DESERET SMALL LETTER DEE', uccode=0x10414 },
+ [0x1043D] = { unicodeslot=0x1043D, category='ll', description='DESERET SMALL LETTER CHEE', uccode=0x10415 },
+ [0x1043E] = { unicodeslot=0x1043E, category='ll', description='DESERET SMALL LETTER JEE', uccode=0x10416 },
+ [0x1043F] = { unicodeslot=0x1043F, category='ll', description='DESERET SMALL LETTER KAY', uccode=0x10417 },
+ [0x10440] = { unicodeslot=0x10440, category='ll', description='DESERET SMALL LETTER GAY', uccode=0x10418 },
+ [0x10441] = { unicodeslot=0x10441, category='ll', description='DESERET SMALL LETTER EF', uccode=0x10419 },
+ [0x10442] = { unicodeslot=0x10442, category='ll', description='DESERET SMALL LETTER VEE', uccode=0x1041A },
+ [0x10443] = { unicodeslot=0x10443, category='ll', description='DESERET SMALL LETTER ETH', uccode=0x1041B },
+ [0x10444] = { unicodeslot=0x10444, category='ll', description='DESERET SMALL LETTER THEE', uccode=0x1041C },
+ [0x10445] = { unicodeslot=0x10445, category='ll', description='DESERET SMALL LETTER ES', uccode=0x1041D },
+ [0x10446] = { unicodeslot=0x10446, category='ll', description='DESERET SMALL LETTER ZEE', uccode=0x1041E },
+ [0x10447] = { unicodeslot=0x10447, category='ll', description='DESERET SMALL LETTER ESH', uccode=0x1041F },
+ [0x10448] = { unicodeslot=0x10448, category='ll', description='DESERET SMALL LETTER ZHEE', uccode=0x10420 },
+ [0x10449] = { unicodeslot=0x10449, category='ll', description='DESERET SMALL LETTER ER', uccode=0x10421 },
+ [0x1044A] = { unicodeslot=0x1044A, category='ll', description='DESERET SMALL LETTER EL', uccode=0x10422 },
+ [0x1044B] = { unicodeslot=0x1044B, category='ll', description='DESERET SMALL LETTER EM', uccode=0x10423 },
+ [0x1044C] = { unicodeslot=0x1044C, category='ll', description='DESERET SMALL LETTER EN', uccode=0x10424 },
+ [0x1044D] = { unicodeslot=0x1044D, category='ll', description='DESERET SMALL LETTER ENG', uccode=0x10425 },
+ [0x1044E] = { unicodeslot=0x1044E, category='ll', description='DESERET SMALL LETTER OI', uccode=0x10426 },
+ [0x1044F] = { unicodeslot=0x1044F, category='ll', description='DESERET SMALL LETTER EW', uccode=0x10427 },
+ [0x10450] = { unicodeslot=0x10450, category='lo', description='SHAVIAN LETTER PEEP' },
+ [0x10451] = { unicodeslot=0x10451, category='lo', description='SHAVIAN LETTER TOT' },
+ [0x10452] = { unicodeslot=0x10452, category='lo', description='SHAVIAN LETTER KICK' },
+ [0x10453] = { unicodeslot=0x10453, category='lo', description='SHAVIAN LETTER FEE' },
+ [0x10454] = { unicodeslot=0x10454, category='lo', description='SHAVIAN LETTER THIGH' },
+ [0x10455] = { unicodeslot=0x10455, category='lo', description='SHAVIAN LETTER SO' },
+ [0x10456] = { unicodeslot=0x10456, category='lo', description='SHAVIAN LETTER SURE' },
+ [0x10457] = { unicodeslot=0x10457, category='lo', description='SHAVIAN LETTER CHURCH' },
+ [0x10458] = { unicodeslot=0x10458, category='lo', description='SHAVIAN LETTER YEA' },
+ [0x10459] = { unicodeslot=0x10459, category='lo', description='SHAVIAN LETTER HUNG' },
+ [0x1045A] = { unicodeslot=0x1045A, category='lo', description='SHAVIAN LETTER BIB' },
+ [0x1045B] = { unicodeslot=0x1045B, category='lo', description='SHAVIAN LETTER DEAD' },
+ [0x1045C] = { unicodeslot=0x1045C, category='lo', description='SHAVIAN LETTER GAG' },
+ [0x1045D] = { unicodeslot=0x1045D, category='lo', description='SHAVIAN LETTER VOW' },
+ [0x1045E] = { unicodeslot=0x1045E, category='lo', description='SHAVIAN LETTER THEY' },
+ [0x1045F] = { unicodeslot=0x1045F, category='lo', description='SHAVIAN LETTER ZOO' },
+ [0x10460] = { unicodeslot=0x10460, category='lo', description='SHAVIAN LETTER MEASURE' },
+ [0x10461] = { unicodeslot=0x10461, category='lo', description='SHAVIAN LETTER JUDGE' },
+ [0x10462] = { unicodeslot=0x10462, category='lo', description='SHAVIAN LETTER WOE' },
+ [0x10463] = { unicodeslot=0x10463, category='lo', description='SHAVIAN LETTER HA-HA' },
+ [0x10464] = { unicodeslot=0x10464, category='lo', description='SHAVIAN LETTER LOLL' },
+ [0x10465] = { unicodeslot=0x10465, category='lo', description='SHAVIAN LETTER MIME' },
+ [0x10466] = { unicodeslot=0x10466, category='lo', description='SHAVIAN LETTER IF' },
+ [0x10467] = { unicodeslot=0x10467, category='lo', description='SHAVIAN LETTER EGG' },
+ [0x10468] = { unicodeslot=0x10468, category='lo', description='SHAVIAN LETTER ASH' },
+ [0x10469] = { unicodeslot=0x10469, category='lo', description='SHAVIAN LETTER ADO' },
+ [0x1046A] = { unicodeslot=0x1046A, category='lo', description='SHAVIAN LETTER ON' },
+ [0x1046B] = { unicodeslot=0x1046B, category='lo', description='SHAVIAN LETTER WOOL' },
+ [0x1046C] = { unicodeslot=0x1046C, category='lo', description='SHAVIAN LETTER OUT' },
+ [0x1046D] = { unicodeslot=0x1046D, category='lo', description='SHAVIAN LETTER AH' },
+ [0x1046E] = { unicodeslot=0x1046E, category='lo', description='SHAVIAN LETTER ROAR' },
+ [0x1046F] = { unicodeslot=0x1046F, category='lo', description='SHAVIAN LETTER NUN' },
+ [0x10470] = { unicodeslot=0x10470, category='lo', description='SHAVIAN LETTER EAT' },
+ [0x10471] = { unicodeslot=0x10471, category='lo', description='SHAVIAN LETTER AGE' },
+ [0x10472] = { unicodeslot=0x10472, category='lo', description='SHAVIAN LETTER ICE' },
+ [0x10473] = { unicodeslot=0x10473, category='lo', description='SHAVIAN LETTER UP' },
+ [0x10474] = { unicodeslot=0x10474, category='lo', description='SHAVIAN LETTER OAK' },
+ [0x10475] = { unicodeslot=0x10475, category='lo', description='SHAVIAN LETTER OOZE' },
+ [0x10476] = { unicodeslot=0x10476, category='lo', description='SHAVIAN LETTER OIL' },
+ [0x10477] = { unicodeslot=0x10477, category='lo', description='SHAVIAN LETTER AWE' },
+ [0x10478] = { unicodeslot=0x10478, category='lo', description='SHAVIAN LETTER ARE' },
+ [0x10479] = { unicodeslot=0x10479, category='lo', description='SHAVIAN LETTER OR' },
+ [0x1047A] = { unicodeslot=0x1047A, category='lo', description='SHAVIAN LETTER AIR' },
+ [0x1047B] = { unicodeslot=0x1047B, category='lo', description='SHAVIAN LETTER ERR' },
+ [0x1047C] = { unicodeslot=0x1047C, category='lo', description='SHAVIAN LETTER ARRAY' },
+ [0x1047D] = { unicodeslot=0x1047D, category='lo', description='SHAVIAN LETTER EAR' },
+ [0x1047E] = { unicodeslot=0x1047E, category='lo', description='SHAVIAN LETTER IAN' },
+ [0x1047F] = { unicodeslot=0x1047F, category='lo', description='SHAVIAN LETTER YEW' },
+ [0x10480] = { unicodeslot=0x10480, category='lo', description='OSMANYA LETTER ALEF' },
+ [0x10481] = { unicodeslot=0x10481, category='lo', description='OSMANYA LETTER BA' },
+ [0x10482] = { unicodeslot=0x10482, category='lo', description='OSMANYA LETTER TA' },
+ [0x10483] = { unicodeslot=0x10483, category='lo', description='OSMANYA LETTER JA' },
+ [0x10484] = { unicodeslot=0x10484, category='lo', description='OSMANYA LETTER XA' },
+ [0x10485] = { unicodeslot=0x10485, category='lo', description='OSMANYA LETTER KHA' },
+ [0x10486] = { unicodeslot=0x10486, category='lo', description='OSMANYA LETTER DEEL' },
+ [0x10487] = { unicodeslot=0x10487, category='lo', description='OSMANYA LETTER RA' },
+ [0x10488] = { unicodeslot=0x10488, category='lo', description='OSMANYA LETTER SA' },
+ [0x10489] = { unicodeslot=0x10489, category='lo', description='OSMANYA LETTER SHIIN' },
+ [0x1048A] = { unicodeslot=0x1048A, category='lo', description='OSMANYA LETTER DHA' },
+ [0x1048B] = { unicodeslot=0x1048B, category='lo', description='OSMANYA LETTER CAYN' },
+ [0x1048C] = { unicodeslot=0x1048C, category='lo', description='OSMANYA LETTER GA' },
+ [0x1048D] = { unicodeslot=0x1048D, category='lo', description='OSMANYA LETTER FA' },
+ [0x1048E] = { unicodeslot=0x1048E, category='lo', description='OSMANYA LETTER QAAF' },
+ [0x1048F] = { unicodeslot=0x1048F, category='lo', description='OSMANYA LETTER KAAF' },
+ [0x10490] = { unicodeslot=0x10490, category='lo', description='OSMANYA LETTER LAAN' },
+ [0x10491] = { unicodeslot=0x10491, category='lo', description='OSMANYA LETTER MIIN' },
+ [0x10492] = { unicodeslot=0x10492, category='lo', description='OSMANYA LETTER NUUN' },
+ [0x10493] = { unicodeslot=0x10493, category='lo', description='OSMANYA LETTER WAW' },
+ [0x10494] = { unicodeslot=0x10494, category='lo', description='OSMANYA LETTER HA' },
+ [0x10495] = { unicodeslot=0x10495, category='lo', description='OSMANYA LETTER YA' },
+ [0x10496] = { unicodeslot=0x10496, category='lo', description='OSMANYA LETTER A' },
+ [0x10497] = { unicodeslot=0x10497, category='lo', description='OSMANYA LETTER E' },
+ [0x10498] = { unicodeslot=0x10498, category='lo', description='OSMANYA LETTER I' },
+ [0x10499] = { unicodeslot=0x10499, category='lo', description='OSMANYA LETTER O' },
+ [0x1049A] = { unicodeslot=0x1049A, category='lo', description='OSMANYA LETTER U' },
+ [0x1049B] = { unicodeslot=0x1049B, category='lo', description='OSMANYA LETTER AA' },
+ [0x1049C] = { unicodeslot=0x1049C, category='lo', description='OSMANYA LETTER EE' },
+ [0x1049D] = { unicodeslot=0x1049D, category='lo', description='OSMANYA LETTER OO' },
+ [0x104A0] = { unicodeslot=0x104A0, category='nd', description='OSMANYA DIGIT ZERO' },
+ [0x104A1] = { unicodeslot=0x104A1, category='nd', description='OSMANYA DIGIT ONE' },
+ [0x104A2] = { unicodeslot=0x104A2, category='nd', description='OSMANYA DIGIT TWO' },
+ [0x104A3] = { unicodeslot=0x104A3, category='nd', description='OSMANYA DIGIT THREE' },
+ [0x104A4] = { unicodeslot=0x104A4, category='nd', description='OSMANYA DIGIT FOUR' },
+ [0x104A5] = { unicodeslot=0x104A5, category='nd', description='OSMANYA DIGIT FIVE' },
+ [0x104A6] = { unicodeslot=0x104A6, category='nd', description='OSMANYA DIGIT SIX' },
+ [0x104A7] = { unicodeslot=0x104A7, category='nd', description='OSMANYA DIGIT SEVEN' },
+ [0x104A8] = { unicodeslot=0x104A8, category='nd', description='OSMANYA DIGIT EIGHT' },
+ [0x104A9] = { unicodeslot=0x104A9, category='nd', description='OSMANYA DIGIT NINE' },
+ [0x10800] = { unicodeslot=0x10800, category='lo', description='CYPRIOT SYLLABLE A' },
+ [0x10801] = { unicodeslot=0x10801, category='lo', description='CYPRIOT SYLLABLE E' },
+ [0x10802] = { unicodeslot=0x10802, category='lo', description='CYPRIOT SYLLABLE I' },
+ [0x10803] = { unicodeslot=0x10803, category='lo', description='CYPRIOT SYLLABLE O' },
+ [0x10804] = { unicodeslot=0x10804, category='lo', description='CYPRIOT SYLLABLE U' },
+ [0x10805] = { unicodeslot=0x10805, category='lo', description='CYPRIOT SYLLABLE JA' },
+ [0x10808] = { unicodeslot=0x10808, category='lo', description='CYPRIOT SYLLABLE JO' },
+ [0x1080A] = { unicodeslot=0x1080A, category='lo', description='CYPRIOT SYLLABLE KA' },
+ [0x1080B] = { unicodeslot=0x1080B, category='lo', description='CYPRIOT SYLLABLE KE' },
+ [0x1080C] = { unicodeslot=0x1080C, category='lo', description='CYPRIOT SYLLABLE KI' },
+ [0x1080D] = { unicodeslot=0x1080D, category='lo', description='CYPRIOT SYLLABLE KO' },
+ [0x1080E] = { unicodeslot=0x1080E, category='lo', description='CYPRIOT SYLLABLE KU' },
+ [0x1080F] = { unicodeslot=0x1080F, category='lo', description='CYPRIOT SYLLABLE LA' },
+ [0x10810] = { unicodeslot=0x10810, category='lo', description='CYPRIOT SYLLABLE LE' },
+ [0x10811] = { unicodeslot=0x10811, category='lo', description='CYPRIOT SYLLABLE LI' },
+ [0x10812] = { unicodeslot=0x10812, category='lo', description='CYPRIOT SYLLABLE LO' },
+ [0x10813] = { unicodeslot=0x10813, category='lo', description='CYPRIOT SYLLABLE LU' },
+ [0x10814] = { unicodeslot=0x10814, category='lo', description='CYPRIOT SYLLABLE MA' },
+ [0x10815] = { unicodeslot=0x10815, category='lo', description='CYPRIOT SYLLABLE ME' },
+ [0x10816] = { unicodeslot=0x10816, category='lo', description='CYPRIOT SYLLABLE MI' },
+ [0x10817] = { unicodeslot=0x10817, category='lo', description='CYPRIOT SYLLABLE MO' },
+ [0x10818] = { unicodeslot=0x10818, category='lo', description='CYPRIOT SYLLABLE MU' },
+ [0x10819] = { unicodeslot=0x10819, category='lo', description='CYPRIOT SYLLABLE NA' },
+ [0x1081A] = { unicodeslot=0x1081A, category='lo', description='CYPRIOT SYLLABLE NE' },
+ [0x1081B] = { unicodeslot=0x1081B, category='lo', description='CYPRIOT SYLLABLE NI' },
+ [0x1081C] = { unicodeslot=0x1081C, category='lo', description='CYPRIOT SYLLABLE NO' },
+ [0x1081D] = { unicodeslot=0x1081D, category='lo', description='CYPRIOT SYLLABLE NU' },
+ [0x1081E] = { unicodeslot=0x1081E, category='lo', description='CYPRIOT SYLLABLE PA' },
+ [0x1081F] = { unicodeslot=0x1081F, category='lo', description='CYPRIOT SYLLABLE PE' },
+ [0x10820] = { unicodeslot=0x10820, category='lo', description='CYPRIOT SYLLABLE PI' },
+ [0x10821] = { unicodeslot=0x10821, category='lo', description='CYPRIOT SYLLABLE PO' },
+ [0x10822] = { unicodeslot=0x10822, category='lo', description='CYPRIOT SYLLABLE PU' },
+ [0x10823] = { unicodeslot=0x10823, category='lo', description='CYPRIOT SYLLABLE RA' },
+ [0x10824] = { unicodeslot=0x10824, category='lo', description='CYPRIOT SYLLABLE RE' },
+ [0x10825] = { unicodeslot=0x10825, category='lo', description='CYPRIOT SYLLABLE RI' },
+ [0x10826] = { unicodeslot=0x10826, category='lo', description='CYPRIOT SYLLABLE RO' },
+ [0x10827] = { unicodeslot=0x10827, category='lo', description='CYPRIOT SYLLABLE RU' },
+ [0x10828] = { unicodeslot=0x10828, category='lo', description='CYPRIOT SYLLABLE SA' },
+ [0x10829] = { unicodeslot=0x10829, category='lo', description='CYPRIOT SYLLABLE SE' },
+ [0x1082A] = { unicodeslot=0x1082A, category='lo', description='CYPRIOT SYLLABLE SI' },
+ [0x1082B] = { unicodeslot=0x1082B, category='lo', description='CYPRIOT SYLLABLE SO' },
+ [0x1082C] = { unicodeslot=0x1082C, category='lo', description='CYPRIOT SYLLABLE SU' },
+ [0x1082D] = { unicodeslot=0x1082D, category='lo', description='CYPRIOT SYLLABLE TA' },
+ [0x1082E] = { unicodeslot=0x1082E, category='lo', description='CYPRIOT SYLLABLE TE' },
+ [0x1082F] = { unicodeslot=0x1082F, category='lo', description='CYPRIOT SYLLABLE TI' },
+ [0x10830] = { unicodeslot=0x10830, category='lo', description='CYPRIOT SYLLABLE TO' },
+ [0x10831] = { unicodeslot=0x10831, category='lo', description='CYPRIOT SYLLABLE TU' },
+ [0x10832] = { unicodeslot=0x10832, category='lo', description='CYPRIOT SYLLABLE WA' },
+ [0x10833] = { unicodeslot=0x10833, category='lo', description='CYPRIOT SYLLABLE WE' },
+ [0x10834] = { unicodeslot=0x10834, category='lo', description='CYPRIOT SYLLABLE WI' },
+ [0x10835] = { unicodeslot=0x10835, category='lo', description='CYPRIOT SYLLABLE WO' },
+ [0x10837] = { unicodeslot=0x10837, category='lo', description='CYPRIOT SYLLABLE XA' },
+ [0x10838] = { unicodeslot=0x10838, category='lo', description='CYPRIOT SYLLABLE XE' },
+ [0x1083C] = { unicodeslot=0x1083C, category='lo', description='CYPRIOT SYLLABLE ZA' },
+ [0x1083F] = { unicodeslot=0x1083F, category='lo', description='CYPRIOT SYLLABLE ZO' },
+ [0x10900] = { unicodeslot=0x10900, category='lo', description='PHOENICIAN LETTER ALF' },
+ [0x10901] = { unicodeslot=0x10901, category='lo', description='PHOENICIAN LETTER BET' },
+ [0x10902] = { unicodeslot=0x10902, category='lo', description='PHOENICIAN LETTER GAML' },
+ [0x10903] = { unicodeslot=0x10903, category='lo', description='PHOENICIAN LETTER DELT' },
+ [0x10904] = { unicodeslot=0x10904, category='lo', description='PHOENICIAN LETTER HE' },
+ [0x10905] = { unicodeslot=0x10905, category='lo', description='PHOENICIAN LETTER WAU' },
+ [0x10906] = { unicodeslot=0x10906, category='lo', description='PHOENICIAN LETTER ZAI' },
+ [0x10907] = { unicodeslot=0x10907, category='lo', description='PHOENICIAN LETTER HET' },
+ [0x10908] = { unicodeslot=0x10908, category='lo', description='PHOENICIAN LETTER TET' },
+ [0x10909] = { unicodeslot=0x10909, category='lo', description='PHOENICIAN LETTER YOD' },
+ [0x1090A] = { unicodeslot=0x1090A, category='lo', description='PHOENICIAN LETTER KAF' },
+ [0x1090B] = { unicodeslot=0x1090B, category='lo', description='PHOENICIAN LETTER LAMD' },
+ [0x1090C] = { unicodeslot=0x1090C, category='lo', description='PHOENICIAN LETTER MEM' },
+ [0x1090D] = { unicodeslot=0x1090D, category='lo', description='PHOENICIAN LETTER NUN' },
+ [0x1090E] = { unicodeslot=0x1090E, category='lo', description='PHOENICIAN LETTER SEMK' },
+ [0x1090F] = { unicodeslot=0x1090F, category='lo', description='PHOENICIAN LETTER AIN' },
+ [0x10910] = { unicodeslot=0x10910, category='lo', description='PHOENICIAN LETTER PE' },
+ [0x10911] = { unicodeslot=0x10911, category='lo', description='PHOENICIAN LETTER SADE' },
+ [0x10912] = { unicodeslot=0x10912, category='lo', description='PHOENICIAN LETTER QOF' },
+ [0x10913] = { unicodeslot=0x10913, category='lo', description='PHOENICIAN LETTER ROSH' },
+ [0x10914] = { unicodeslot=0x10914, category='lo', description='PHOENICIAN LETTER SHIN' },
+ [0x10915] = { unicodeslot=0x10915, category='lo', description='PHOENICIAN LETTER TAU' },
+ [0x10916] = { unicodeslot=0x10916, category='no', description='PHOENICIAN NUMBER ONE' },
+ [0x10917] = { unicodeslot=0x10917, category='no', description='PHOENICIAN NUMBER TEN' },
+ [0x10918] = { unicodeslot=0x10918, category='no', description='PHOENICIAN NUMBER TWENTY' },
+ [0x10919] = { unicodeslot=0x10919, category='no', description='PHOENICIAN NUMBER ONE HUNDRED' },
+ [0x1091F] = { unicodeslot=0x1091F, category='po', description='PHOENICIAN WORD SEPARATOR' },
+ [0x10A00] = { unicodeslot=0x10A00, category='lo', description='KHAROSHTHI LETTER A' },
+ [0x10A01] = { unicodeslot=0x10A01, category='mn', description='KHAROSHTHI VOWEL SIGN I' },
+ [0x10A02] = { unicodeslot=0x10A02, category='mn', description='KHAROSHTHI VOWEL SIGN U' },
+ [0x10A03] = { unicodeslot=0x10A03, category='mn', description='KHAROSHTHI VOWEL SIGN VOCALIC R' },
+ [0x10A05] = { unicodeslot=0x10A05, category='mn', description='KHAROSHTHI VOWEL SIGN E' },
+ [0x10A06] = { unicodeslot=0x10A06, category='mn', description='KHAROSHTHI VOWEL SIGN O' },
+ [0x10A0C] = { unicodeslot=0x10A0C, category='mn', description='KHAROSHTHI VOWEL LENGTH MARK' },
+ [0x10A0D] = { unicodeslot=0x10A0D, category='mn', description='KHAROSHTHI SIGN DOUBLE RING BELOW' },
+ [0x10A0E] = { unicodeslot=0x10A0E, category='mn', description='KHAROSHTHI SIGN ANUSVARA' },
+ [0x10A0F] = { unicodeslot=0x10A0F, category='mn', description='KHAROSHTHI SIGN VISARGA' },
+ [0x10A10] = { unicodeslot=0x10A10, category='lo', description='KHAROSHTHI LETTER KA' },
+ [0x10A11] = { unicodeslot=0x10A11, category='lo', description='KHAROSHTHI LETTER KHA' },
+ [0x10A12] = { unicodeslot=0x10A12, category='lo', description='KHAROSHTHI LETTER GA' },
+ [0x10A13] = { unicodeslot=0x10A13, category='lo', description='KHAROSHTHI LETTER GHA' },
+ [0x10A15] = { unicodeslot=0x10A15, category='lo', description='KHAROSHTHI LETTER CA' },
+ [0x10A16] = { unicodeslot=0x10A16, category='lo', description='KHAROSHTHI LETTER CHA' },
+ [0x10A17] = { unicodeslot=0x10A17, category='lo', description='KHAROSHTHI LETTER JA' },
+ [0x10A19] = { unicodeslot=0x10A19, category='lo', description='KHAROSHTHI LETTER NYA' },
+ [0x10A1A] = { unicodeslot=0x10A1A, category='lo', description='KHAROSHTHI LETTER TTA' },
+ [0x10A1B] = { unicodeslot=0x10A1B, category='lo', description='KHAROSHTHI LETTER TTHA' },
+ [0x10A1C] = { unicodeslot=0x10A1C, category='lo', description='KHAROSHTHI LETTER DDA' },
+ [0x10A1D] = { unicodeslot=0x10A1D, category='lo', description='KHAROSHTHI LETTER DDHA' },
+ [0x10A1E] = { unicodeslot=0x10A1E, category='lo', description='KHAROSHTHI LETTER NNA' },
+ [0x10A1F] = { unicodeslot=0x10A1F, category='lo', description='KHAROSHTHI LETTER TA' },
+ [0x10A20] = { unicodeslot=0x10A20, category='lo', description='KHAROSHTHI LETTER THA' },
+ [0x10A21] = { unicodeslot=0x10A21, category='lo', description='KHAROSHTHI LETTER DA' },
+ [0x10A22] = { unicodeslot=0x10A22, category='lo', description='KHAROSHTHI LETTER DHA' },
+ [0x10A23] = { unicodeslot=0x10A23, category='lo', description='KHAROSHTHI LETTER NA' },
+ [0x10A24] = { unicodeslot=0x10A24, category='lo', description='KHAROSHTHI LETTER PA' },
+ [0x10A25] = { unicodeslot=0x10A25, category='lo', description='KHAROSHTHI LETTER PHA' },
+ [0x10A26] = { unicodeslot=0x10A26, category='lo', description='KHAROSHTHI LETTER BA' },
+ [0x10A27] = { unicodeslot=0x10A27, category='lo', description='KHAROSHTHI LETTER BHA' },
+ [0x10A28] = { unicodeslot=0x10A28, category='lo', description='KHAROSHTHI LETTER MA' },
+ [0x10A29] = { unicodeslot=0x10A29, category='lo', description='KHAROSHTHI LETTER YA' },
+ [0x10A2A] = { unicodeslot=0x10A2A, category='lo', description='KHAROSHTHI LETTER RA' },
+ [0x10A2B] = { unicodeslot=0x10A2B, category='lo', description='KHAROSHTHI LETTER LA' },
+ [0x10A2C] = { unicodeslot=0x10A2C, category='lo', description='KHAROSHTHI LETTER VA' },
+ [0x10A2D] = { unicodeslot=0x10A2D, category='lo', description='KHAROSHTHI LETTER SHA' },
+ [0x10A2E] = { unicodeslot=0x10A2E, category='lo', description='KHAROSHTHI LETTER SSA' },
+ [0x10A2F] = { unicodeslot=0x10A2F, category='lo', description='KHAROSHTHI LETTER SA' },
+ [0x10A30] = { unicodeslot=0x10A30, category='lo', description='KHAROSHTHI LETTER ZA' },
+ [0x10A31] = { unicodeslot=0x10A31, category='lo', description='KHAROSHTHI LETTER HA' },
+ [0x10A32] = { unicodeslot=0x10A32, category='lo', description='KHAROSHTHI LETTER KKA' },
+ [0x10A33] = { unicodeslot=0x10A33, category='lo', description='KHAROSHTHI LETTER TTTHA' },
+ [0x10A38] = { unicodeslot=0x10A38, category='mn', description='KHAROSHTHI SIGN BAR ABOVE' },
+ [0x10A39] = { unicodeslot=0x10A39, category='mn', description='KHAROSHTHI SIGN CAUDA' },
+ [0x10A3A] = { unicodeslot=0x10A3A, category='mn', description='KHAROSHTHI SIGN DOT BELOW' },
+ [0x10A3F] = { unicodeslot=0x10A3F, category='mn', description='KHAROSHTHI VIRAMA' },
+ [0x10A40] = { unicodeslot=0x10A40, category='no', description='KHAROSHTHI DIGIT ONE' },
+ [0x10A41] = { unicodeslot=0x10A41, category='no', description='KHAROSHTHI DIGIT TWO' },
+ [0x10A42] = { unicodeslot=0x10A42, category='no', description='KHAROSHTHI DIGIT THREE' },
+ [0x10A43] = { unicodeslot=0x10A43, category='no', description='KHAROSHTHI DIGIT FOUR' },
+ [0x10A44] = { unicodeslot=0x10A44, category='no', description='KHAROSHTHI NUMBER TEN' },
+ [0x10A45] = { unicodeslot=0x10A45, category='no', description='KHAROSHTHI NUMBER TWENTY' },
+ [0x10A46] = { unicodeslot=0x10A46, category='no', description='KHAROSHTHI NUMBER ONE HUNDRED' },
+ [0x10A47] = { unicodeslot=0x10A47, category='no', description='KHAROSHTHI NUMBER ONE THOUSAND' },
+ [0x10A50] = { unicodeslot=0x10A50, category='po', description='KHAROSHTHI PUNCTUATION DOT' },
+ [0x10A51] = { unicodeslot=0x10A51, category='po', description='KHAROSHTHI PUNCTUATION SMALL CIRCLE' },
+ [0x10A52] = { unicodeslot=0x10A52, category='po', description='KHAROSHTHI PUNCTUATION CIRCLE' },
+ [0x10A53] = { unicodeslot=0x10A53, category='po', description='KHAROSHTHI PUNCTUATION CRESCENT BAR' },
+ [0x10A54] = { unicodeslot=0x10A54, category='po', description='KHAROSHTHI PUNCTUATION MANGALAM' },
+ [0x10A55] = { unicodeslot=0x10A55, category='po', description='KHAROSHTHI PUNCTUATION LOTUS' },
+ [0x10A56] = { unicodeslot=0x10A56, category='po', description='KHAROSHTHI PUNCTUATION DANDA' },
+ [0x10A57] = { unicodeslot=0x10A57, category='po', description='KHAROSHTHI PUNCTUATION DOUBLE DANDA' },
+ [0x10A58] = { unicodeslot=0x10A58, category='po', description='KHAROSHTHI PUNCTUATION LINES' },
+ [0x12000] = { unicodeslot=0x12000, category='lo', description='CUNEIFORM SIGN A' },
+ [0x12001] = { unicodeslot=0x12001, category='lo', description='CUNEIFORM SIGN A TIMES A' },
+ [0x12002] = { unicodeslot=0x12002, category='lo', description='CUNEIFORM SIGN A TIMES BAD' },
+ [0x12003] = { unicodeslot=0x12003, category='lo', description='CUNEIFORM SIGN A TIMES GAN2 TENU' },
+ [0x12004] = { unicodeslot=0x12004, category='lo', description='CUNEIFORM SIGN A TIMES HA' },
+ [0x12005] = { unicodeslot=0x12005, category='lo', description='CUNEIFORM SIGN A TIMES IGI' },
+ [0x12006] = { unicodeslot=0x12006, category='lo', description='CUNEIFORM SIGN A TIMES LAGAR GUNU' },
+ [0x12007] = { unicodeslot=0x12007, category='lo', description='CUNEIFORM SIGN A TIMES MUSH' },
+ [0x12008] = { unicodeslot=0x12008, category='lo', description='CUNEIFORM SIGN A TIMES SAG' },
+ [0x12009] = { unicodeslot=0x12009, category='lo', description='CUNEIFORM SIGN A2' },
+ [0x1200A] = { unicodeslot=0x1200A, category='lo', description='CUNEIFORM SIGN AB' },
+ [0x1200B] = { unicodeslot=0x1200B, category='lo', description='CUNEIFORM SIGN AB TIMES ASH2' },
+ [0x1200C] = { unicodeslot=0x1200C, category='lo', description='CUNEIFORM SIGN AB TIMES DUN3 GUNU' },
+ [0x1200D] = { unicodeslot=0x1200D, category='lo', description='CUNEIFORM SIGN AB TIMES GAL' },
+ [0x1200E] = { unicodeslot=0x1200E, category='lo', description='CUNEIFORM SIGN AB TIMES GAN2 TENU' },
+ [0x1200F] = { unicodeslot=0x1200F, category='lo', description='CUNEIFORM SIGN AB TIMES HA' },
+ [0x12010] = { unicodeslot=0x12010, category='lo', description='CUNEIFORM SIGN AB TIMES IGI GUNU' },
+ [0x12011] = { unicodeslot=0x12011, category='lo', description='CUNEIFORM SIGN AB TIMES IMIN' },
+ [0x12012] = { unicodeslot=0x12012, category='lo', description='CUNEIFORM SIGN AB TIMES LAGAB' },
+ [0x12013] = { unicodeslot=0x12013, category='lo', description='CUNEIFORM SIGN AB TIMES SHESH' },
+ [0x12014] = { unicodeslot=0x12014, category='lo', description='CUNEIFORM SIGN AB TIMES U PLUS U PLUS U' },
+ [0x12015] = { unicodeslot=0x12015, category='lo', description='CUNEIFORM SIGN AB GUNU' },
+ [0x12016] = { unicodeslot=0x12016, category='lo', description='CUNEIFORM SIGN AB2' },
+ [0x12017] = { unicodeslot=0x12017, category='lo', description='CUNEIFORM SIGN AB2 TIMES BALAG' },
+ [0x12018] = { unicodeslot=0x12018, category='lo', description='CUNEIFORM SIGN AB2 TIMES GAN2 TENU' },
+ [0x12019] = { unicodeslot=0x12019, category='lo', description='CUNEIFORM SIGN AB2 TIMES ME PLUS EN' },
+ [0x1201A] = { unicodeslot=0x1201A, category='lo', description='CUNEIFORM SIGN AB2 TIMES SHA3' },
+ [0x1201B] = { unicodeslot=0x1201B, category='lo', description='CUNEIFORM SIGN AB2 TIMES TAK4' },
+ [0x1201C] = { unicodeslot=0x1201C, category='lo', description='CUNEIFORM SIGN AD' },
+ [0x1201D] = { unicodeslot=0x1201D, category='lo', description='CUNEIFORM SIGN AK' },
+ [0x1201E] = { unicodeslot=0x1201E, category='lo', description='CUNEIFORM SIGN AK TIMES ERIN2' },
+ [0x1201F] = { unicodeslot=0x1201F, category='lo', description='CUNEIFORM SIGN AK TIMES SHITA PLUS GISH' },
+ [0x12020] = { unicodeslot=0x12020, category='lo', description='CUNEIFORM SIGN AL' },
+ [0x12021] = { unicodeslot=0x12021, category='lo', description='CUNEIFORM SIGN AL TIMES AL' },
+ [0x12022] = { unicodeslot=0x12022, category='lo', description='CUNEIFORM SIGN AL TIMES DIM2' },
+ [0x12023] = { unicodeslot=0x12023, category='lo', description='CUNEIFORM SIGN AL TIMES GISH' },
+ [0x12024] = { unicodeslot=0x12024, category='lo', description='CUNEIFORM SIGN AL TIMES HA' },
+ [0x12025] = { unicodeslot=0x12025, category='lo', description='CUNEIFORM SIGN AL TIMES KAD3' },
+ [0x12026] = { unicodeslot=0x12026, category='lo', description='CUNEIFORM SIGN AL TIMES KI' },
+ [0x12027] = { unicodeslot=0x12027, category='lo', description='CUNEIFORM SIGN AL TIMES SHE' },
+ [0x12028] = { unicodeslot=0x12028, category='lo', description='CUNEIFORM SIGN AL TIMES USH' },
+ [0x12029] = { unicodeslot=0x12029, category='lo', description='CUNEIFORM SIGN ALAN' },
+ [0x1202A] = { unicodeslot=0x1202A, category='lo', description='CUNEIFORM SIGN ALEPH' },
+ [0x1202B] = { unicodeslot=0x1202B, category='lo', description='CUNEIFORM SIGN AMAR' },
+ [0x1202C] = { unicodeslot=0x1202C, category='lo', description='CUNEIFORM SIGN AMAR TIMES SHE' },
+ [0x1202D] = { unicodeslot=0x1202D, category='lo', description='CUNEIFORM SIGN AN' },
+ [0x1202E] = { unicodeslot=0x1202E, category='lo', description='CUNEIFORM SIGN AN OVER AN' },
+ [0x1202F] = { unicodeslot=0x1202F, category='lo', description='CUNEIFORM SIGN AN THREE TIMES' },
+ [0x12030] = { unicodeslot=0x12030, category='lo', description='CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA' },
+ [0x12031] = { unicodeslot=0x12031, category='lo', description='CUNEIFORM SIGN AN PLUS NAGA SQUARED' },
+ [0x12032] = { unicodeslot=0x12032, category='lo', description='CUNEIFORM SIGN ANSHE' },
+ [0x12033] = { unicodeslot=0x12033, category='lo', description='CUNEIFORM SIGN APIN' },
+ [0x12034] = { unicodeslot=0x12034, category='lo', description='CUNEIFORM SIGN ARAD' },
+ [0x12035] = { unicodeslot=0x12035, category='lo', description='CUNEIFORM SIGN ARAD TIMES KUR' },
+ [0x12036] = { unicodeslot=0x12036, category='lo', description='CUNEIFORM SIGN ARKAB' },
+ [0x12037] = { unicodeslot=0x12037, category='lo', description='CUNEIFORM SIGN ASAL2' },
+ [0x12038] = { unicodeslot=0x12038, category='lo', description='CUNEIFORM SIGN ASH' },
+ [0x12039] = { unicodeslot=0x12039, category='lo', description='CUNEIFORM SIGN ASH ZIDA TENU' },
+ [0x1203A] = { unicodeslot=0x1203A, category='lo', description='CUNEIFORM SIGN ASH KABA TENU' },
+ [0x1203B] = { unicodeslot=0x1203B, category='lo', description='CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP' },
+ [0x1203C] = { unicodeslot=0x1203C, category='lo', description='CUNEIFORM SIGN ASH OVER ASH OVER ASH' },
+ [0x1203D] = { unicodeslot=0x1203D, category='lo', description='CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH' },
+ [0x1203E] = { unicodeslot=0x1203E, category='lo', description='CUNEIFORM SIGN ASH2' },
+ [0x1203F] = { unicodeslot=0x1203F, category='lo', description='CUNEIFORM SIGN ASHGAB' },
+ [0x12040] = { unicodeslot=0x12040, category='lo', description='CUNEIFORM SIGN BA' },
+ [0x12041] = { unicodeslot=0x12041, category='lo', description='CUNEIFORM SIGN BAD' },
+ [0x12042] = { unicodeslot=0x12042, category='lo', description='CUNEIFORM SIGN BAG3' },
+ [0x12043] = { unicodeslot=0x12043, category='lo', description='CUNEIFORM SIGN BAHAR2' },
+ [0x12044] = { unicodeslot=0x12044, category='lo', description='CUNEIFORM SIGN BAL' },
+ [0x12045] = { unicodeslot=0x12045, category='lo', description='CUNEIFORM SIGN BAL OVER BAL' },
+ [0x12046] = { unicodeslot=0x12046, category='lo', description='CUNEIFORM SIGN BALAG' },
+ [0x12047] = { unicodeslot=0x12047, category='lo', description='CUNEIFORM SIGN BAR' },
+ [0x12048] = { unicodeslot=0x12048, category='lo', description='CUNEIFORM SIGN BARA2' },
+ [0x12049] = { unicodeslot=0x12049, category='lo', description='CUNEIFORM SIGN BI' },
+ [0x1204A] = { unicodeslot=0x1204A, category='lo', description='CUNEIFORM SIGN BI TIMES A' },
+ [0x1204B] = { unicodeslot=0x1204B, category='lo', description='CUNEIFORM SIGN BI TIMES GAR' },
+ [0x1204C] = { unicodeslot=0x1204C, category='lo', description='CUNEIFORM SIGN BI TIMES IGI GUNU' },
+ [0x1204D] = { unicodeslot=0x1204D, category='lo', description='CUNEIFORM SIGN BU' },
+ [0x1204E] = { unicodeslot=0x1204E, category='lo', description='CUNEIFORM SIGN BU OVER BU AB' },
+ [0x1204F] = { unicodeslot=0x1204F, category='lo', description='CUNEIFORM SIGN BU OVER BU UN' },
+ [0x12050] = { unicodeslot=0x12050, category='lo', description='CUNEIFORM SIGN BU CROSSING BU' },
+ [0x12051] = { unicodeslot=0x12051, category='lo', description='CUNEIFORM SIGN BULUG' },
+ [0x12052] = { unicodeslot=0x12052, category='lo', description='CUNEIFORM SIGN BULUG OVER BULUG' },
+ [0x12053] = { unicodeslot=0x12053, category='lo', description='CUNEIFORM SIGN BUR' },
+ [0x12054] = { unicodeslot=0x12054, category='lo', description='CUNEIFORM SIGN BUR2' },
+ [0x12055] = { unicodeslot=0x12055, category='lo', description='CUNEIFORM SIGN DA' },
+ [0x12056] = { unicodeslot=0x12056, category='lo', description='CUNEIFORM SIGN DAG' },
+ [0x12057] = { unicodeslot=0x12057, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH' },
+ [0x12058] = { unicodeslot=0x12058, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES AMAR' },
+ [0x12059] = { unicodeslot=0x12059, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES BALAG' },
+ [0x1205A] = { unicodeslot=0x1205A, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES BI' },
+ [0x1205B] = { unicodeslot=0x1205B, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GA' },
+ [0x1205C] = { unicodeslot=0x1205C, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH' },
+ [0x1205D] = { unicodeslot=0x1205D, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GI' },
+ [0x1205E] = { unicodeslot=0x1205E, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GIR2' },
+ [0x1205F] = { unicodeslot=0x1205F, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GUD' },
+ [0x12060] = { unicodeslot=0x12060, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES HA' },
+ [0x12061] = { unicodeslot=0x12061, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES IR' },
+ [0x12062] = { unicodeslot=0x12062, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU' },
+ [0x12063] = { unicodeslot=0x12063, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES KAK' },
+ [0x12064] = { unicodeslot=0x12064, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LA' },
+ [0x12065] = { unicodeslot=0x12065, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LU' },
+ [0x12066] = { unicodeslot=0x12066, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2' },
+ [0x12067] = { unicodeslot=0x12067, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LUM' },
+ [0x12068] = { unicodeslot=0x12068, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES NE' },
+ [0x12069] = { unicodeslot=0x12069, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP' },
+ [0x1206A] = { unicodeslot=0x1206A, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES SI' },
+ [0x1206B] = { unicodeslot=0x1206B, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES TAK4' },
+ [0x1206C] = { unicodeslot=0x1206C, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2' },
+ [0x1206D] = { unicodeslot=0x1206D, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES USH' },
+ [0x1206E] = { unicodeslot=0x1206E, category='lo', description='CUNEIFORM SIGN DAM' },
+ [0x1206F] = { unicodeslot=0x1206F, category='lo', description='CUNEIFORM SIGN DAR' },
+ [0x12070] = { unicodeslot=0x12070, category='lo', description='CUNEIFORM SIGN DARA3' },
+ [0x12071] = { unicodeslot=0x12071, category='lo', description='CUNEIFORM SIGN DARA4' },
+ [0x12072] = { unicodeslot=0x12072, category='lo', description='CUNEIFORM SIGN DI' },
+ [0x12073] = { unicodeslot=0x12073, category='lo', description='CUNEIFORM SIGN DIB' },
+ [0x12074] = { unicodeslot=0x12074, category='lo', description='CUNEIFORM SIGN DIM' },
+ [0x12075] = { unicodeslot=0x12075, category='lo', description='CUNEIFORM SIGN DIM TIMES SHE' },
+ [0x12076] = { unicodeslot=0x12076, category='lo', description='CUNEIFORM SIGN DIM2' },
+ [0x12077] = { unicodeslot=0x12077, category='lo', description='CUNEIFORM SIGN DIN' },
+ [0x12078] = { unicodeslot=0x12078, category='lo', description='CUNEIFORM SIGN DIN KASKAL U GUNU DISH' },
+ [0x12079] = { unicodeslot=0x12079, category='lo', description='CUNEIFORM SIGN DISH' },
+ [0x1207A] = { unicodeslot=0x1207A, category='lo', description='CUNEIFORM SIGN DU' },
+ [0x1207B] = { unicodeslot=0x1207B, category='lo', description='CUNEIFORM SIGN DU OVER DU' },
+ [0x1207C] = { unicodeslot=0x1207C, category='lo', description='CUNEIFORM SIGN DU GUNU' },
+ [0x1207D] = { unicodeslot=0x1207D, category='lo', description='CUNEIFORM SIGN DU SHESHIG' },
+ [0x1207E] = { unicodeslot=0x1207E, category='lo', description='CUNEIFORM SIGN DUB' },
+ [0x1207F] = { unicodeslot=0x1207F, category='lo', description='CUNEIFORM SIGN DUB TIMES ESH2' },
+ [0x12080] = { unicodeslot=0x12080, category='lo', description='CUNEIFORM SIGN DUB2' },
+ [0x12081] = { unicodeslot=0x12081, category='lo', description='CUNEIFORM SIGN DUG' },
+ [0x12082] = { unicodeslot=0x12082, category='lo', description='CUNEIFORM SIGN DUGUD' },
+ [0x12083] = { unicodeslot=0x12083, category='lo', description='CUNEIFORM SIGN DUH' },
+ [0x12084] = { unicodeslot=0x12084, category='lo', description='CUNEIFORM SIGN DUN' },
+ [0x12085] = { unicodeslot=0x12085, category='lo', description='CUNEIFORM SIGN DUN3' },
+ [0x12086] = { unicodeslot=0x12086, category='lo', description='CUNEIFORM SIGN DUN3 GUNU' },
+ [0x12087] = { unicodeslot=0x12087, category='lo', description='CUNEIFORM SIGN DUN3 GUNU GUNU' },
+ [0x12088] = { unicodeslot=0x12088, category='lo', description='CUNEIFORM SIGN DUN4' },
+ [0x12089] = { unicodeslot=0x12089, category='lo', description='CUNEIFORM SIGN DUR2' },
+ [0x1208A] = { unicodeslot=0x1208A, category='lo', description='CUNEIFORM SIGN E' },
+ [0x1208B] = { unicodeslot=0x1208B, category='lo', description='CUNEIFORM SIGN E TIMES PAP' },
+ [0x1208C] = { unicodeslot=0x1208C, category='lo', description='CUNEIFORM SIGN E OVER E NUN OVER NUN' },
+ [0x1208D] = { unicodeslot=0x1208D, category='lo', description='CUNEIFORM SIGN E2' },
+ [0x1208E] = { unicodeslot=0x1208E, category='lo', description='CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA' },
+ [0x1208F] = { unicodeslot=0x1208F, category='lo', description='CUNEIFORM SIGN E2 TIMES GAR' },
+ [0x12090] = { unicodeslot=0x12090, category='lo', description='CUNEIFORM SIGN E2 TIMES MI' },
+ [0x12091] = { unicodeslot=0x12091, category='lo', description='CUNEIFORM SIGN E2 TIMES SAL' },
+ [0x12092] = { unicodeslot=0x12092, category='lo', description='CUNEIFORM SIGN E2 TIMES SHE' },
+ [0x12093] = { unicodeslot=0x12093, category='lo', description='CUNEIFORM SIGN E2 TIMES U' },
+ [0x12094] = { unicodeslot=0x12094, category='lo', description='CUNEIFORM SIGN EDIN' },
+ [0x12095] = { unicodeslot=0x12095, category='lo', description='CUNEIFORM SIGN EGIR' },
+ [0x12096] = { unicodeslot=0x12096, category='lo', description='CUNEIFORM SIGN EL' },
+ [0x12097] = { unicodeslot=0x12097, category='lo', description='CUNEIFORM SIGN EN' },
+ [0x12098] = { unicodeslot=0x12098, category='lo', description='CUNEIFORM SIGN EN TIMES GAN2' },
+ [0x12099] = { unicodeslot=0x12099, category='lo', description='CUNEIFORM SIGN EN TIMES GAN2 TENU' },
+ [0x1209A] = { unicodeslot=0x1209A, category='lo', description='CUNEIFORM SIGN EN TIMES ME' },
+ [0x1209B] = { unicodeslot=0x1209B, category='lo', description='CUNEIFORM SIGN EN CROSSING EN' },
+ [0x1209C] = { unicodeslot=0x1209C, category='lo', description='CUNEIFORM SIGN EN OPPOSING EN' },
+ [0x1209D] = { unicodeslot=0x1209D, category='lo', description='CUNEIFORM SIGN EN SQUARED' },
+ [0x1209E] = { unicodeslot=0x1209E, category='lo', description='CUNEIFORM SIGN EREN' },
+ [0x1209F] = { unicodeslot=0x1209F, category='lo', description='CUNEIFORM SIGN ERIN2' },
+ [0x120A0] = { unicodeslot=0x120A0, category='lo', description='CUNEIFORM SIGN ESH2' },
+ [0x120A1] = { unicodeslot=0x120A1, category='lo', description='CUNEIFORM SIGN EZEN' },
+ [0x120A2] = { unicodeslot=0x120A2, category='lo', description='CUNEIFORM SIGN EZEN TIMES A' },
+ [0x120A3] = { unicodeslot=0x120A3, category='lo', description='CUNEIFORM SIGN EZEN TIMES A PLUS LAL' },
+ [0x120A4] = { unicodeslot=0x120A4, category='lo', description='CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL' },
+ [0x120A5] = { unicodeslot=0x120A5, category='lo', description='CUNEIFORM SIGN EZEN TIMES AN' },
+ [0x120A6] = { unicodeslot=0x120A6, category='lo', description='CUNEIFORM SIGN EZEN TIMES BAD' },
+ [0x120A7] = { unicodeslot=0x120A7, category='lo', description='CUNEIFORM SIGN EZEN TIMES DUN3 GUNU' },
+ [0x120A8] = { unicodeslot=0x120A8, category='lo', description='CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU' },
+ [0x120A9] = { unicodeslot=0x120A9, category='lo', description='CUNEIFORM SIGN EZEN TIMES HA' },
+ [0x120AA] = { unicodeslot=0x120AA, category='lo', description='CUNEIFORM SIGN EZEN TIMES HA GUNU' },
+ [0x120AB] = { unicodeslot=0x120AB, category='lo', description='CUNEIFORM SIGN EZEN TIMES IGI GUNU' },
+ [0x120AC] = { unicodeslot=0x120AC, category='lo', description='CUNEIFORM SIGN EZEN TIMES KASKAL' },
+ [0x120AD] = { unicodeslot=0x120AD, category='lo', description='CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED' },
+ [0x120AE] = { unicodeslot=0x120AE, category='lo', description='CUNEIFORM SIGN EZEN TIMES KU3' },
+ [0x120AF] = { unicodeslot=0x120AF, category='lo', description='CUNEIFORM SIGN EZEN TIMES LA' },
+ [0x120B0] = { unicodeslot=0x120B0, category='lo', description='CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL' },
+ [0x120B1] = { unicodeslot=0x120B1, category='lo', description='CUNEIFORM SIGN EZEN TIMES LI' },
+ [0x120B2] = { unicodeslot=0x120B2, category='lo', description='CUNEIFORM SIGN EZEN TIMES LU' },
+ [0x120B3] = { unicodeslot=0x120B3, category='lo', description='CUNEIFORM SIGN EZEN TIMES U2' },
+ [0x120B4] = { unicodeslot=0x120B4, category='lo', description='CUNEIFORM SIGN EZEN TIMES UD' },
+ [0x120B5] = { unicodeslot=0x120B5, category='lo', description='CUNEIFORM SIGN GA' },
+ [0x120B6] = { unicodeslot=0x120B6, category='lo', description='CUNEIFORM SIGN GA GUNU' },
+ [0x120B7] = { unicodeslot=0x120B7, category='lo', description='CUNEIFORM SIGN GA2' },
+ [0x120B8] = { unicodeslot=0x120B8, category='lo', description='CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA' },
+ [0x120B9] = { unicodeslot=0x120B9, category='lo', description='CUNEIFORM SIGN GA2 TIMES A PLUS HA' },
+ [0x120BA] = { unicodeslot=0x120BA, category='lo', description='CUNEIFORM SIGN GA2 TIMES A PLUS IGI' },
+ [0x120BB] = { unicodeslot=0x120BB, category='lo', description='CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB' },
+ [0x120BC] = { unicodeslot=0x120BC, category='lo', description='CUNEIFORM SIGN GA2 TIMES AN' },
+ [0x120BD] = { unicodeslot=0x120BD, category='lo', description='CUNEIFORM SIGN GA2 TIMES ASH' },
+ [0x120BE] = { unicodeslot=0x120BE, category='lo', description='CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL' },
+ [0x120BF] = { unicodeslot=0x120BF, category='lo', description='CUNEIFORM SIGN GA2 TIMES BAD' },
+ [0x120C0] = { unicodeslot=0x120C0, category='lo', description='CUNEIFORM SIGN GA2 TIMES BAR PLUS RA' },
+ [0x120C1] = { unicodeslot=0x120C1, category='lo', description='CUNEIFORM SIGN GA2 TIMES BUR' },
+ [0x120C2] = { unicodeslot=0x120C2, category='lo', description='CUNEIFORM SIGN GA2 TIMES BUR PLUS RA' },
+ [0x120C3] = { unicodeslot=0x120C3, category='lo', description='CUNEIFORM SIGN GA2 TIMES DA' },
+ [0x120C4] = { unicodeslot=0x120C4, category='lo', description='CUNEIFORM SIGN GA2 TIMES DI' },
+ [0x120C5] = { unicodeslot=0x120C5, category='lo', description='CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE' },
+ [0x120C6] = { unicodeslot=0x120C6, category='lo', description='CUNEIFORM SIGN GA2 TIMES DUB' },
+ [0x120C7] = { unicodeslot=0x120C7, category='lo', description='CUNEIFORM SIGN GA2 TIMES EL' },
+ [0x120C8] = { unicodeslot=0x120C8, category='lo', description='CUNEIFORM SIGN GA2 TIMES EL PLUS LA' },
+ [0x120C9] = { unicodeslot=0x120C9, category='lo', description='CUNEIFORM SIGN GA2 TIMES EN' },
+ [0x120CA] = { unicodeslot=0x120CA, category='lo', description='CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU' },
+ [0x120CB] = { unicodeslot=0x120CB, category='lo', description='CUNEIFORM SIGN GA2 TIMES GAN2 TENU' },
+ [0x120CC] = { unicodeslot=0x120CC, category='lo', description='CUNEIFORM SIGN GA2 TIMES GAR' },
+ [0x120CD] = { unicodeslot=0x120CD, category='lo', description='CUNEIFORM SIGN GA2 TIMES GI' },
+ [0x120CE] = { unicodeslot=0x120CE, category='lo', description='CUNEIFORM SIGN GA2 TIMES GI4' },
+ [0x120CF] = { unicodeslot=0x120CF, category='lo', description='CUNEIFORM SIGN GA2 TIMES GI4 PLUS A' },
+ [0x120D0] = { unicodeslot=0x120D0, category='lo', description='CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU' },
+ [0x120D1] = { unicodeslot=0x120D1, category='lo', description='CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2' },
+ [0x120D2] = { unicodeslot=0x120D2, category='lo', description='CUNEIFORM SIGN GA2 TIMES HAL' },
+ [0x120D3] = { unicodeslot=0x120D3, category='lo', description='CUNEIFORM SIGN GA2 TIMES HAL PLUS LA' },
+ [0x120D4] = { unicodeslot=0x120D4, category='lo', description='CUNEIFORM SIGN GA2 TIMES HI PLUS LI' },
+ [0x120D5] = { unicodeslot=0x120D5, category='lo', description='CUNEIFORM SIGN GA2 TIMES HUB2' },
+ [0x120D6] = { unicodeslot=0x120D6, category='lo', description='CUNEIFORM SIGN GA2 TIMES IGI GUNU' },
+ [0x120D7] = { unicodeslot=0x120D7, category='lo', description='CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH' },
+ [0x120D8] = { unicodeslot=0x120D8, category='lo', description='CUNEIFORM SIGN GA2 TIMES KAK' },
+ [0x120D9] = { unicodeslot=0x120D9, category='lo', description='CUNEIFORM SIGN GA2 TIMES KASKAL' },
+ [0x120DA] = { unicodeslot=0x120DA, category='lo', description='CUNEIFORM SIGN GA2 TIMES KID' },
+ [0x120DB] = { unicodeslot=0x120DB, category='lo', description='CUNEIFORM SIGN GA2 TIMES KID PLUS LAL' },
+ [0x120DC] = { unicodeslot=0x120DC, category='lo', description='CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN' },
+ [0x120DD] = { unicodeslot=0x120DD, category='lo', description='CUNEIFORM SIGN GA2 TIMES LA' },
+ [0x120DE] = { unicodeslot=0x120DE, category='lo', description='CUNEIFORM SIGN GA2 TIMES ME PLUS EN' },
+ [0x120DF] = { unicodeslot=0x120DF, category='lo', description='CUNEIFORM SIGN GA2 TIMES MI' },
+ [0x120E0] = { unicodeslot=0x120E0, category='lo', description='CUNEIFORM SIGN GA2 TIMES NUN' },
+ [0x120E1] = { unicodeslot=0x120E1, category='lo', description='CUNEIFORM SIGN GA2 TIMES NUN OVER NUN' },
+ [0x120E2] = { unicodeslot=0x120E2, category='lo', description='CUNEIFORM SIGN GA2 TIMES PA' },
+ [0x120E3] = { unicodeslot=0x120E3, category='lo', description='CUNEIFORM SIGN GA2 TIMES SAL' },
+ [0x120E4] = { unicodeslot=0x120E4, category='lo', description='CUNEIFORM SIGN GA2 TIMES SAR' },
+ [0x120E5] = { unicodeslot=0x120E5, category='lo', description='CUNEIFORM SIGN GA2 TIMES SHE' },
+ [0x120E6] = { unicodeslot=0x120E6, category='lo', description='CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR' },
+ [0x120E7] = { unicodeslot=0x120E7, category='lo', description='CUNEIFORM SIGN GA2 TIMES SHID' },
+ [0x120E8] = { unicodeslot=0x120E8, category='lo', description='CUNEIFORM SIGN GA2 TIMES SUM' },
+ [0x120E9] = { unicodeslot=0x120E9, category='lo', description='CUNEIFORM SIGN GA2 TIMES TAK4' },
+ [0x120EA] = { unicodeslot=0x120EA, category='lo', description='CUNEIFORM SIGN GA2 TIMES U' },
+ [0x120EB] = { unicodeslot=0x120EB, category='lo', description='CUNEIFORM SIGN GA2 TIMES UD' },
+ [0x120EC] = { unicodeslot=0x120EC, category='lo', description='CUNEIFORM SIGN GA2 TIMES UD PLUS DU' },
+ [0x120ED] = { unicodeslot=0x120ED, category='lo', description='CUNEIFORM SIGN GA2 OVER GA2' },
+ [0x120EE] = { unicodeslot=0x120EE, category='lo', description='CUNEIFORM SIGN GABA' },
+ [0x120EF] = { unicodeslot=0x120EF, category='lo', description='CUNEIFORM SIGN GABA CROSSING GABA' },
+ [0x120F0] = { unicodeslot=0x120F0, category='lo', description='CUNEIFORM SIGN GAD' },
+ [0x120F1] = { unicodeslot=0x120F1, category='lo', description='CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR' },
+ [0x120F2] = { unicodeslot=0x120F2, category='lo', description='CUNEIFORM SIGN GAL' },
+ [0x120F3] = { unicodeslot=0x120F3, category='lo', description='CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR' },
+ [0x120F4] = { unicodeslot=0x120F4, category='lo', description='CUNEIFORM SIGN GALAM' },
+ [0x120F5] = { unicodeslot=0x120F5, category='lo', description='CUNEIFORM SIGN GAM' },
+ [0x120F6] = { unicodeslot=0x120F6, category='lo', description='CUNEIFORM SIGN GAN' },
+ [0x120F7] = { unicodeslot=0x120F7, category='lo', description='CUNEIFORM SIGN GAN2' },
+ [0x120F8] = { unicodeslot=0x120F8, category='lo', description='CUNEIFORM SIGN GAN2 TENU' },
+ [0x120F9] = { unicodeslot=0x120F9, category='lo', description='CUNEIFORM SIGN GAN2 OVER GAN2' },
+ [0x120FA] = { unicodeslot=0x120FA, category='lo', description='CUNEIFORM SIGN GAN2 CROSSING GAN2' },
+ [0x120FB] = { unicodeslot=0x120FB, category='lo', description='CUNEIFORM SIGN GAR' },
+ [0x120FC] = { unicodeslot=0x120FC, category='lo', description='CUNEIFORM SIGN GAR3' },
+ [0x120FD] = { unicodeslot=0x120FD, category='lo', description='CUNEIFORM SIGN GASHAN' },
+ [0x120FE] = { unicodeslot=0x120FE, category='lo', description='CUNEIFORM SIGN GESHTIN' },
+ [0x120FF] = { unicodeslot=0x120FF, category='lo', description='CUNEIFORM SIGN GESHTIN TIMES KUR' },
+ [0x12100] = { unicodeslot=0x12100, category='lo', description='CUNEIFORM SIGN GI' },
+ [0x12101] = { unicodeslot=0x12101, category='lo', description='CUNEIFORM SIGN GI TIMES E' },
+ [0x12102] = { unicodeslot=0x12102, category='lo', description='CUNEIFORM SIGN GI TIMES U' },
+ [0x12103] = { unicodeslot=0x12103, category='lo', description='CUNEIFORM SIGN GI CROSSING GI' },
+ [0x12104] = { unicodeslot=0x12104, category='lo', description='CUNEIFORM SIGN GI4' },
+ [0x12105] = { unicodeslot=0x12105, category='lo', description='CUNEIFORM SIGN GI4 OVER GI4' },
+ [0x12106] = { unicodeslot=0x12106, category='lo', description='CUNEIFORM SIGN GI4 CROSSING GI4' },
+ [0x12107] = { unicodeslot=0x12107, category='lo', description='CUNEIFORM SIGN GIDIM' },
+ [0x12108] = { unicodeslot=0x12108, category='lo', description='CUNEIFORM SIGN GIR2' },
+ [0x12109] = { unicodeslot=0x12109, category='lo', description='CUNEIFORM SIGN GIR2 GUNU' },
+ [0x1210A] = { unicodeslot=0x1210A, category='lo', description='CUNEIFORM SIGN GIR3' },
+ [0x1210B] = { unicodeslot=0x1210B, category='lo', description='CUNEIFORM SIGN GIR3 TIMES A PLUS IGI' },
+ [0x1210C] = { unicodeslot=0x1210C, category='lo', description='CUNEIFORM SIGN GIR3 TIMES GAN2 TENU' },
+ [0x1210D] = { unicodeslot=0x1210D, category='lo', description='CUNEIFORM SIGN GIR3 TIMES IGI' },
+ [0x1210E] = { unicodeslot=0x1210E, category='lo', description='CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI' },
+ [0x1210F] = { unicodeslot=0x1210F, category='lo', description='CUNEIFORM SIGN GIR3 TIMES PA' },
+ [0x12110] = { unicodeslot=0x12110, category='lo', description='CUNEIFORM SIGN GISAL' },
+ [0x12111] = { unicodeslot=0x12111, category='lo', description='CUNEIFORM SIGN GISH' },
+ [0x12112] = { unicodeslot=0x12112, category='lo', description='CUNEIFORM SIGN GISH CROSSING GISH' },
+ [0x12113] = { unicodeslot=0x12113, category='lo', description='CUNEIFORM SIGN GISH TIMES BAD' },
+ [0x12114] = { unicodeslot=0x12114, category='lo', description='CUNEIFORM SIGN GISH TIMES TAK4' },
+ [0x12115] = { unicodeslot=0x12115, category='lo', description='CUNEIFORM SIGN GISH TENU' },
+ [0x12116] = { unicodeslot=0x12116, category='lo', description='CUNEIFORM SIGN GU' },
+ [0x12117] = { unicodeslot=0x12117, category='lo', description='CUNEIFORM SIGN GU CROSSING GU' },
+ [0x12118] = { unicodeslot=0x12118, category='lo', description='CUNEIFORM SIGN GU2' },
+ [0x12119] = { unicodeslot=0x12119, category='lo', description='CUNEIFORM SIGN GU2 TIMES KAK' },
+ [0x1211A] = { unicodeslot=0x1211A, category='lo', description='CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU' },
+ [0x1211B] = { unicodeslot=0x1211B, category='lo', description='CUNEIFORM SIGN GU2 TIMES NUN' },
+ [0x1211C] = { unicodeslot=0x1211C, category='lo', description='CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2' },
+ [0x1211D] = { unicodeslot=0x1211D, category='lo', description='CUNEIFORM SIGN GU2 GUNU' },
+ [0x1211E] = { unicodeslot=0x1211E, category='lo', description='CUNEIFORM SIGN GUD' },
+ [0x1211F] = { unicodeslot=0x1211F, category='lo', description='CUNEIFORM SIGN GUD TIMES A PLUS KUR' },
+ [0x12120] = { unicodeslot=0x12120, category='lo', description='CUNEIFORM SIGN GUD TIMES KUR' },
+ [0x12121] = { unicodeslot=0x12121, category='lo', description='CUNEIFORM SIGN GUD OVER GUD LUGAL' },
+ [0x12122] = { unicodeslot=0x12122, category='lo', description='CUNEIFORM SIGN GUL' },
+ [0x12123] = { unicodeslot=0x12123, category='lo', description='CUNEIFORM SIGN GUM' },
+ [0x12124] = { unicodeslot=0x12124, category='lo', description='CUNEIFORM SIGN GUM TIMES SHE' },
+ [0x12125] = { unicodeslot=0x12125, category='lo', description='CUNEIFORM SIGN GUR' },
+ [0x12126] = { unicodeslot=0x12126, category='lo', description='CUNEIFORM SIGN GUR7' },
+ [0x12127] = { unicodeslot=0x12127, category='lo', description='CUNEIFORM SIGN GURUN' },
+ [0x12128] = { unicodeslot=0x12128, category='lo', description='CUNEIFORM SIGN GURUSH' },
+ [0x12129] = { unicodeslot=0x12129, category='lo', description='CUNEIFORM SIGN HA' },
+ [0x1212A] = { unicodeslot=0x1212A, category='lo', description='CUNEIFORM SIGN HA TENU' },
+ [0x1212B] = { unicodeslot=0x1212B, category='lo', description='CUNEIFORM SIGN HA GUNU' },
+ [0x1212C] = { unicodeslot=0x1212C, category='lo', description='CUNEIFORM SIGN HAL' },
+ [0x1212D] = { unicodeslot=0x1212D, category='lo', description='CUNEIFORM SIGN HI' },
+ [0x1212E] = { unicodeslot=0x1212E, category='lo', description='CUNEIFORM SIGN HI TIMES ASH' },
+ [0x1212F] = { unicodeslot=0x1212F, category='lo', description='CUNEIFORM SIGN HI TIMES ASH2' },
+ [0x12130] = { unicodeslot=0x12130, category='lo', description='CUNEIFORM SIGN HI TIMES BAD' },
+ [0x12131] = { unicodeslot=0x12131, category='lo', description='CUNEIFORM SIGN HI TIMES DISH' },
+ [0x12132] = { unicodeslot=0x12132, category='lo', description='CUNEIFORM SIGN HI TIMES GAD' },
+ [0x12133] = { unicodeslot=0x12133, category='lo', description='CUNEIFORM SIGN HI TIMES KIN' },
+ [0x12134] = { unicodeslot=0x12134, category='lo', description='CUNEIFORM SIGN HI TIMES NUN' },
+ [0x12135] = { unicodeslot=0x12135, category='lo', description='CUNEIFORM SIGN HI TIMES SHE' },
+ [0x12136] = { unicodeslot=0x12136, category='lo', description='CUNEIFORM SIGN HI TIMES U' },
+ [0x12137] = { unicodeslot=0x12137, category='lo', description='CUNEIFORM SIGN HU' },
+ [0x12138] = { unicodeslot=0x12138, category='lo', description='CUNEIFORM SIGN HUB2' },
+ [0x12139] = { unicodeslot=0x12139, category='lo', description='CUNEIFORM SIGN HUB2 TIMES AN' },
+ [0x1213A] = { unicodeslot=0x1213A, category='lo', description='CUNEIFORM SIGN HUB2 TIMES HAL' },
+ [0x1213B] = { unicodeslot=0x1213B, category='lo', description='CUNEIFORM SIGN HUB2 TIMES KASKAL' },
+ [0x1213C] = { unicodeslot=0x1213C, category='lo', description='CUNEIFORM SIGN HUB2 TIMES LISH' },
+ [0x1213D] = { unicodeslot=0x1213D, category='lo', description='CUNEIFORM SIGN HUB2 TIMES UD' },
+ [0x1213E] = { unicodeslot=0x1213E, category='lo', description='CUNEIFORM SIGN HUL2' },
+ [0x1213F] = { unicodeslot=0x1213F, category='lo', description='CUNEIFORM SIGN I' },
+ [0x12140] = { unicodeslot=0x12140, category='lo', description='CUNEIFORM SIGN I A' },
+ [0x12141] = { unicodeslot=0x12141, category='lo', description='CUNEIFORM SIGN IB' },
+ [0x12142] = { unicodeslot=0x12142, category='lo', description='CUNEIFORM SIGN IDIM' },
+ [0x12143] = { unicodeslot=0x12143, category='lo', description='CUNEIFORM SIGN IDIM OVER IDIM BUR' },
+ [0x12144] = { unicodeslot=0x12144, category='lo', description='CUNEIFORM SIGN IDIM OVER IDIM SQUARED' },
+ [0x12145] = { unicodeslot=0x12145, category='lo', description='CUNEIFORM SIGN IG' },
+ [0x12146] = { unicodeslot=0x12146, category='lo', description='CUNEIFORM SIGN IGI' },
+ [0x12147] = { unicodeslot=0x12147, category='lo', description='CUNEIFORM SIGN IGI DIB' },
+ [0x12148] = { unicodeslot=0x12148, category='lo', description='CUNEIFORM SIGN IGI RI' },
+ [0x12149] = { unicodeslot=0x12149, category='lo', description='CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD' },
+ [0x1214A] = { unicodeslot=0x1214A, category='lo', description='CUNEIFORM SIGN IGI GUNU' },
+ [0x1214B] = { unicodeslot=0x1214B, category='lo', description='CUNEIFORM SIGN IL' },
+ [0x1214C] = { unicodeslot=0x1214C, category='lo', description='CUNEIFORM SIGN IL TIMES GAN2 TENU' },
+ [0x1214D] = { unicodeslot=0x1214D, category='lo', description='CUNEIFORM SIGN IL2' },
+ [0x1214E] = { unicodeslot=0x1214E, category='lo', description='CUNEIFORM SIGN IM' },
+ [0x1214F] = { unicodeslot=0x1214F, category='lo', description='CUNEIFORM SIGN IM TIMES TAK4' },
+ [0x12150] = { unicodeslot=0x12150, category='lo', description='CUNEIFORM SIGN IM CROSSING IM' },
+ [0x12151] = { unicodeslot=0x12151, category='lo', description='CUNEIFORM SIGN IM OPPOSING IM' },
+ [0x12152] = { unicodeslot=0x12152, category='lo', description='CUNEIFORM SIGN IM SQUARED' },
+ [0x12153] = { unicodeslot=0x12153, category='lo', description='CUNEIFORM SIGN IMIN' },
+ [0x12154] = { unicodeslot=0x12154, category='lo', description='CUNEIFORM SIGN IN' },
+ [0x12155] = { unicodeslot=0x12155, category='lo', description='CUNEIFORM SIGN IR' },
+ [0x12156] = { unicodeslot=0x12156, category='lo', description='CUNEIFORM SIGN ISH' },
+ [0x12157] = { unicodeslot=0x12157, category='lo', description='CUNEIFORM SIGN KA' },
+ [0x12158] = { unicodeslot=0x12158, category='lo', description='CUNEIFORM SIGN KA TIMES A' },
+ [0x12159] = { unicodeslot=0x12159, category='lo', description='CUNEIFORM SIGN KA TIMES AD' },
+ [0x1215A] = { unicodeslot=0x1215A, category='lo', description='CUNEIFORM SIGN KA TIMES AD PLUS KU3' },
+ [0x1215B] = { unicodeslot=0x1215B, category='lo', description='CUNEIFORM SIGN KA TIMES ASH2' },
+ [0x1215C] = { unicodeslot=0x1215C, category='lo', description='CUNEIFORM SIGN KA TIMES BAD' },
+ [0x1215D] = { unicodeslot=0x1215D, category='lo', description='CUNEIFORM SIGN KA TIMES BALAG' },
+ [0x1215E] = { unicodeslot=0x1215E, category='lo', description='CUNEIFORM SIGN KA TIMES BAR' },
+ [0x1215F] = { unicodeslot=0x1215F, category='lo', description='CUNEIFORM SIGN KA TIMES BI' },
+ [0x12160] = { unicodeslot=0x12160, category='lo', description='CUNEIFORM SIGN KA TIMES ERIN2' },
+ [0x12161] = { unicodeslot=0x12161, category='lo', description='CUNEIFORM SIGN KA TIMES ESH2' },
+ [0x12162] = { unicodeslot=0x12162, category='lo', description='CUNEIFORM SIGN KA TIMES GA' },
+ [0x12163] = { unicodeslot=0x12163, category='lo', description='CUNEIFORM SIGN KA TIMES GAL' },
+ [0x12164] = { unicodeslot=0x12164, category='lo', description='CUNEIFORM SIGN KA TIMES GAN2 TENU' },
+ [0x12165] = { unicodeslot=0x12165, category='lo', description='CUNEIFORM SIGN KA TIMES GAR' },
+ [0x12166] = { unicodeslot=0x12166, category='lo', description='CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A' },
+ [0x12167] = { unicodeslot=0x12167, category='lo', description='CUNEIFORM SIGN KA TIMES GI' },
+ [0x12168] = { unicodeslot=0x12168, category='lo', description='CUNEIFORM SIGN KA TIMES GIR2' },
+ [0x12169] = { unicodeslot=0x12169, category='lo', description='CUNEIFORM SIGN KA TIMES GISH PLUS SAR' },
+ [0x1216A] = { unicodeslot=0x1216A, category='lo', description='CUNEIFORM SIGN KA TIMES GISH CROSSING GISH' },
+ [0x1216B] = { unicodeslot=0x1216B, category='lo', description='CUNEIFORM SIGN KA TIMES GU' },
+ [0x1216C] = { unicodeslot=0x1216C, category='lo', description='CUNEIFORM SIGN KA TIMES GUR7' },
+ [0x1216D] = { unicodeslot=0x1216D, category='lo', description='CUNEIFORM SIGN KA TIMES IGI' },
+ [0x1216E] = { unicodeslot=0x1216E, category='lo', description='CUNEIFORM SIGN KA TIMES IM' },
+ [0x1216F] = { unicodeslot=0x1216F, category='lo', description='CUNEIFORM SIGN KA TIMES KAK' },
+ [0x12170] = { unicodeslot=0x12170, category='lo', description='CUNEIFORM SIGN KA TIMES KI' },
+ [0x12171] = { unicodeslot=0x12171, category='lo', description='CUNEIFORM SIGN KA TIMES KID' },
+ [0x12172] = { unicodeslot=0x12172, category='lo', description='CUNEIFORM SIGN KA TIMES LI' },
+ [0x12173] = { unicodeslot=0x12173, category='lo', description='CUNEIFORM SIGN KA TIMES LU' },
+ [0x12174] = { unicodeslot=0x12174, category='lo', description='CUNEIFORM SIGN KA TIMES ME' },
+ [0x12175] = { unicodeslot=0x12175, category='lo', description='CUNEIFORM SIGN KA TIMES ME PLUS DU' },
+ [0x12176] = { unicodeslot=0x12176, category='lo', description='CUNEIFORM SIGN KA TIMES ME PLUS GI' },
+ [0x12177] = { unicodeslot=0x12177, category='lo', description='CUNEIFORM SIGN KA TIMES ME PLUS TE' },
+ [0x12178] = { unicodeslot=0x12178, category='lo', description='CUNEIFORM SIGN KA TIMES MI' },
+ [0x12179] = { unicodeslot=0x12179, category='lo', description='CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ' },
+ [0x1217A] = { unicodeslot=0x1217A, category='lo', description='CUNEIFORM SIGN KA TIMES NE' },
+ [0x1217B] = { unicodeslot=0x1217B, category='lo', description='CUNEIFORM SIGN KA TIMES NUN' },
+ [0x1217C] = { unicodeslot=0x1217C, category='lo', description='CUNEIFORM SIGN KA TIMES PI' },
+ [0x1217D] = { unicodeslot=0x1217D, category='lo', description='CUNEIFORM SIGN KA TIMES RU' },
+ [0x1217E] = { unicodeslot=0x1217E, category='lo', description='CUNEIFORM SIGN KA TIMES SA' },
+ [0x1217F] = { unicodeslot=0x1217F, category='lo', description='CUNEIFORM SIGN KA TIMES SAR' },
+ [0x12180] = { unicodeslot=0x12180, category='lo', description='CUNEIFORM SIGN KA TIMES SHA' },
+ [0x12181] = { unicodeslot=0x12181, category='lo', description='CUNEIFORM SIGN KA TIMES SHE' },
+ [0x12182] = { unicodeslot=0x12182, category='lo', description='CUNEIFORM SIGN KA TIMES SHID' },
+ [0x12183] = { unicodeslot=0x12183, category='lo', description='CUNEIFORM SIGN KA TIMES SHU' },
+ [0x12184] = { unicodeslot=0x12184, category='lo', description='CUNEIFORM SIGN KA TIMES SIG' },
+ [0x12185] = { unicodeslot=0x12185, category='lo', description='CUNEIFORM SIGN KA TIMES SUHUR' },
+ [0x12186] = { unicodeslot=0x12186, category='lo', description='CUNEIFORM SIGN KA TIMES TAR' },
+ [0x12187] = { unicodeslot=0x12187, category='lo', description='CUNEIFORM SIGN KA TIMES U' },
+ [0x12188] = { unicodeslot=0x12188, category='lo', description='CUNEIFORM SIGN KA TIMES U2' },
+ [0x12189] = { unicodeslot=0x12189, category='lo', description='CUNEIFORM SIGN KA TIMES UD' },
+ [0x1218A] = { unicodeslot=0x1218A, category='lo', description='CUNEIFORM SIGN KA TIMES UMUM TIMES PA' },
+ [0x1218B] = { unicodeslot=0x1218B, category='lo', description='CUNEIFORM SIGN KA TIMES USH' },
+ [0x1218C] = { unicodeslot=0x1218C, category='lo', description='CUNEIFORM SIGN KA TIMES ZI' },
+ [0x1218D] = { unicodeslot=0x1218D, category='lo', description='CUNEIFORM SIGN KA2' },
+ [0x1218E] = { unicodeslot=0x1218E, category='lo', description='CUNEIFORM SIGN KA2 CROSSING KA2' },
+ [0x1218F] = { unicodeslot=0x1218F, category='lo', description='CUNEIFORM SIGN KAB' },
+ [0x12190] = { unicodeslot=0x12190, category='lo', description='CUNEIFORM SIGN KAD2' },
+ [0x12191] = { unicodeslot=0x12191, category='lo', description='CUNEIFORM SIGN KAD3' },
+ [0x12192] = { unicodeslot=0x12192, category='lo', description='CUNEIFORM SIGN KAD4' },
+ [0x12193] = { unicodeslot=0x12193, category='lo', description='CUNEIFORM SIGN KAD5' },
+ [0x12194] = { unicodeslot=0x12194, category='lo', description='CUNEIFORM SIGN KAD5 OVER KAD5' },
+ [0x12195] = { unicodeslot=0x12195, category='lo', description='CUNEIFORM SIGN KAK' },
+ [0x12196] = { unicodeslot=0x12196, category='lo', description='CUNEIFORM SIGN KAK TIMES IGI GUNU' },
+ [0x12197] = { unicodeslot=0x12197, category='lo', description='CUNEIFORM SIGN KAL' },
+ [0x12198] = { unicodeslot=0x12198, category='lo', description='CUNEIFORM SIGN KAL TIMES BAD' },
+ [0x12199] = { unicodeslot=0x12199, category='lo', description='CUNEIFORM SIGN KAL CROSSING KAL' },
+ [0x1219A] = { unicodeslot=0x1219A, category='lo', description='CUNEIFORM SIGN KAM2' },
+ [0x1219B] = { unicodeslot=0x1219B, category='lo', description='CUNEIFORM SIGN KAM4' },
+ [0x1219C] = { unicodeslot=0x1219C, category='lo', description='CUNEIFORM SIGN KASKAL' },
+ [0x1219D] = { unicodeslot=0x1219D, category='lo', description='CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U' },
+ [0x1219E] = { unicodeslot=0x1219E, category='lo', description='CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U' },
+ [0x1219F] = { unicodeslot=0x1219F, category='lo', description='CUNEIFORM SIGN KESH2' },
+ [0x121A0] = { unicodeslot=0x121A0, category='lo', description='CUNEIFORM SIGN KI' },
+ [0x121A1] = { unicodeslot=0x121A1, category='lo', description='CUNEIFORM SIGN KI TIMES BAD' },
+ [0x121A2] = { unicodeslot=0x121A2, category='lo', description='CUNEIFORM SIGN KI TIMES U' },
+ [0x121A3] = { unicodeslot=0x121A3, category='lo', description='CUNEIFORM SIGN KI TIMES UD' },
+ [0x121A4] = { unicodeslot=0x121A4, category='lo', description='CUNEIFORM SIGN KID' },
+ [0x121A5] = { unicodeslot=0x121A5, category='lo', description='CUNEIFORM SIGN KIN' },
+ [0x121A6] = { unicodeslot=0x121A6, category='lo', description='CUNEIFORM SIGN KISAL' },
+ [0x121A7] = { unicodeslot=0x121A7, category='lo', description='CUNEIFORM SIGN KISH' },
+ [0x121A8] = { unicodeslot=0x121A8, category='lo', description='CUNEIFORM SIGN KISIM5' },
+ [0x121A9] = { unicodeslot=0x121A9, category='lo', description='CUNEIFORM SIGN KISIM5 OVER KISIM5' },
+ [0x121AA] = { unicodeslot=0x121AA, category='lo', description='CUNEIFORM SIGN KU' },
+ [0x121AB] = { unicodeslot=0x121AB, category='lo', description='CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2' },
+ [0x121AC] = { unicodeslot=0x121AC, category='lo', description='CUNEIFORM SIGN KU3' },
+ [0x121AD] = { unicodeslot=0x121AD, category='lo', description='CUNEIFORM SIGN KU4' },
+ [0x121AE] = { unicodeslot=0x121AE, category='lo', description='CUNEIFORM SIGN KU4 VARIANT FORM' },
+ [0x121AF] = { unicodeslot=0x121AF, category='lo', description='CUNEIFORM SIGN KU7' },
+ [0x121B0] = { unicodeslot=0x121B0, category='lo', description='CUNEIFORM SIGN KUL' },
+ [0x121B1] = { unicodeslot=0x121B1, category='lo', description='CUNEIFORM SIGN KUL GUNU' },
+ [0x121B2] = { unicodeslot=0x121B2, category='lo', description='CUNEIFORM SIGN KUN' },
+ [0x121B3] = { unicodeslot=0x121B3, category='lo', description='CUNEIFORM SIGN KUR' },
+ [0x121B4] = { unicodeslot=0x121B4, category='lo', description='CUNEIFORM SIGN KUR OPPOSING KUR' },
+ [0x121B5] = { unicodeslot=0x121B5, category='lo', description='CUNEIFORM SIGN KUSHU2' },
+ [0x121B6] = { unicodeslot=0x121B6, category='lo', description='CUNEIFORM SIGN KWU318' },
+ [0x121B7] = { unicodeslot=0x121B7, category='lo', description='CUNEIFORM SIGN LA' },
+ [0x121B8] = { unicodeslot=0x121B8, category='lo', description='CUNEIFORM SIGN LAGAB' },
+ [0x121B9] = { unicodeslot=0x121B9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A' },
+ [0x121BA] = { unicodeslot=0x121BA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA' },
+ [0x121BB] = { unicodeslot=0x121BB, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A PLUS GAR' },
+ [0x121BC] = { unicodeslot=0x121BC, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A PLUS LAL' },
+ [0x121BD] = { unicodeslot=0x121BD, category='lo', description='CUNEIFORM SIGN LAGAB TIMES AL' },
+ [0x121BE] = { unicodeslot=0x121BE, category='lo', description='CUNEIFORM SIGN LAGAB TIMES AN' },
+ [0x121BF] = { unicodeslot=0x121BF, category='lo', description='CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU' },
+ [0x121C0] = { unicodeslot=0x121C0, category='lo', description='CUNEIFORM SIGN LAGAB TIMES BAD' },
+ [0x121C1] = { unicodeslot=0x121C1, category='lo', description='CUNEIFORM SIGN LAGAB TIMES BI' },
+ [0x121C2] = { unicodeslot=0x121C2, category='lo', description='CUNEIFORM SIGN LAGAB TIMES DAR' },
+ [0x121C3] = { unicodeslot=0x121C3, category='lo', description='CUNEIFORM SIGN LAGAB TIMES EN' },
+ [0x121C4] = { unicodeslot=0x121C4, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GA' },
+ [0x121C5] = { unicodeslot=0x121C5, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GAR' },
+ [0x121C6] = { unicodeslot=0x121C6, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GUD' },
+ [0x121C7] = { unicodeslot=0x121C7, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD' },
+ [0x121C8] = { unicodeslot=0x121C8, category='lo', description='CUNEIFORM SIGN LAGAB TIMES HA' },
+ [0x121C9] = { unicodeslot=0x121C9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES HAL' },
+ [0x121CA] = { unicodeslot=0x121CA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN' },
+ [0x121CB] = { unicodeslot=0x121CB, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IGI GUNU' },
+ [0x121CC] = { unicodeslot=0x121CC, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IM' },
+ [0x121CD] = { unicodeslot=0x121CD, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IM PLUS HA' },
+ [0x121CE] = { unicodeslot=0x121CE, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IM PLUS LU' },
+ [0x121CF] = { unicodeslot=0x121CF, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KI' },
+ [0x121D0] = { unicodeslot=0x121D0, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KIN' },
+ [0x121D1] = { unicodeslot=0x121D1, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KU3' },
+ [0x121D2] = { unicodeslot=0x121D2, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KUL' },
+ [0x121D3] = { unicodeslot=0x121D3, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A' },
+ [0x121D4] = { unicodeslot=0x121D4, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LAGAB' },
+ [0x121D5] = { unicodeslot=0x121D5, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LISH' },
+ [0x121D6] = { unicodeslot=0x121D6, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LU' },
+ [0x121D7] = { unicodeslot=0x121D7, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LUL' },
+ [0x121D8] = { unicodeslot=0x121D8, category='lo', description='CUNEIFORM SIGN LAGAB TIMES ME' },
+ [0x121D9] = { unicodeslot=0x121D9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES ME PLUS EN' },
+ [0x121DA] = { unicodeslot=0x121DA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES MUSH' },
+ [0x121DB] = { unicodeslot=0x121DB, category='lo', description='CUNEIFORM SIGN LAGAB TIMES NE' },
+ [0x121DC] = { unicodeslot=0x121DC, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM' },
+ [0x121DD] = { unicodeslot=0x121DD, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2' },
+ [0x121DE] = { unicodeslot=0x121DE, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU' },
+ [0x121DF] = { unicodeslot=0x121DF, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHU2' },
+ [0x121E0] = { unicodeslot=0x121E0, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2' },
+ [0x121E1] = { unicodeslot=0x121E1, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SUM' },
+ [0x121E2] = { unicodeslot=0x121E2, category='lo', description='CUNEIFORM SIGN LAGAB TIMES TAG' },
+ [0x121E3] = { unicodeslot=0x121E3, category='lo', description='CUNEIFORM SIGN LAGAB TIMES TAK4' },
+ [0x121E4] = { unicodeslot=0x121E4, category='lo', description='CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA' },
+ [0x121E5] = { unicodeslot=0x121E5, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U' },
+ [0x121E6] = { unicodeslot=0x121E6, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U PLUS A' },
+ [0x121E7] = { unicodeslot=0x121E7, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U' },
+ [0x121E8] = { unicodeslot=0x121E8, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH' },
+ [0x121E9] = { unicodeslot=0x121E9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES UD' },
+ [0x121EA] = { unicodeslot=0x121EA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES USH' },
+ [0x121EB] = { unicodeslot=0x121EB, category='lo', description='CUNEIFORM SIGN LAGAB SQUARED' },
+ [0x121EC] = { unicodeslot=0x121EC, category='lo', description='CUNEIFORM SIGN LAGAR' },
+ [0x121ED] = { unicodeslot=0x121ED, category='lo', description='CUNEIFORM SIGN LAGAR TIMES SHE' },
+ [0x121EE] = { unicodeslot=0x121EE, category='lo', description='CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM' },
+ [0x121EF] = { unicodeslot=0x121EF, category='lo', description='CUNEIFORM SIGN LAGAR GUNU' },
+ [0x121F0] = { unicodeslot=0x121F0, category='lo', description='CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE' },
+ [0x121F1] = { unicodeslot=0x121F1, category='lo', description='CUNEIFORM SIGN LAHSHU' },
+ [0x121F2] = { unicodeslot=0x121F2, category='lo', description='CUNEIFORM SIGN LAL' },
+ [0x121F3] = { unicodeslot=0x121F3, category='lo', description='CUNEIFORM SIGN LAL TIMES LAL' },
+ [0x121F4] = { unicodeslot=0x121F4, category='lo', description='CUNEIFORM SIGN LAM' },
+ [0x121F5] = { unicodeslot=0x121F5, category='lo', description='CUNEIFORM SIGN LAM TIMES KUR' },
+ [0x121F6] = { unicodeslot=0x121F6, category='lo', description='CUNEIFORM SIGN LAM TIMES KUR PLUS RU' },
+ [0x121F7] = { unicodeslot=0x121F7, category='lo', description='CUNEIFORM SIGN LI' },
+ [0x121F8] = { unicodeslot=0x121F8, category='lo', description='CUNEIFORM SIGN LIL' },
+ [0x121F9] = { unicodeslot=0x121F9, category='lo', description='CUNEIFORM SIGN LIMMU2' },
+ [0x121FA] = { unicodeslot=0x121FA, category='lo', description='CUNEIFORM SIGN LISH' },
+ [0x121FB] = { unicodeslot=0x121FB, category='lo', description='CUNEIFORM SIGN LU' },
+ [0x121FC] = { unicodeslot=0x121FC, category='lo', description='CUNEIFORM SIGN LU TIMES BAD' },
+ [0x121FD] = { unicodeslot=0x121FD, category='lo', description='CUNEIFORM SIGN LU2' },
+ [0x121FE] = { unicodeslot=0x121FE, category='lo', description='CUNEIFORM SIGN LU2 TIMES AL' },
+ [0x121FF] = { unicodeslot=0x121FF, category='lo', description='CUNEIFORM SIGN LU2 TIMES BAD' },
+ [0x12200] = { unicodeslot=0x12200, category='lo', description='CUNEIFORM SIGN LU2 TIMES ESH2' },
+ [0x12201] = { unicodeslot=0x12201, category='lo', description='CUNEIFORM SIGN LU2 TIMES ESH2 TENU' },
+ [0x12202] = { unicodeslot=0x12202, category='lo', description='CUNEIFORM SIGN LU2 TIMES GAN2 TENU' },
+ [0x12203] = { unicodeslot=0x12203, category='lo', description='CUNEIFORM SIGN LU2 TIMES HI TIMES BAD' },
+ [0x12204] = { unicodeslot=0x12204, category='lo', description='CUNEIFORM SIGN LU2 TIMES IM' },
+ [0x12205] = { unicodeslot=0x12205, category='lo', description='CUNEIFORM SIGN LU2 TIMES KAD2' },
+ [0x12206] = { unicodeslot=0x12206, category='lo', description='CUNEIFORM SIGN LU2 TIMES KAD3' },
+ [0x12207] = { unicodeslot=0x12207, category='lo', description='CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH' },
+ [0x12208] = { unicodeslot=0x12208, category='lo', description='CUNEIFORM SIGN LU2 TIMES KI' },
+ [0x12209] = { unicodeslot=0x12209, category='lo', description='CUNEIFORM SIGN LU2 TIMES LA PLUS ASH' },
+ [0x1220A] = { unicodeslot=0x1220A, category='lo', description='CUNEIFORM SIGN LU2 TIMES LAGAB' },
+ [0x1220B] = { unicodeslot=0x1220B, category='lo', description='CUNEIFORM SIGN LU2 TIMES ME PLUS EN' },
+ [0x1220C] = { unicodeslot=0x1220C, category='lo', description='CUNEIFORM SIGN LU2 TIMES NE' },
+ [0x1220D] = { unicodeslot=0x1220D, category='lo', description='CUNEIFORM SIGN LU2 TIMES NU' },
+ [0x1220E] = { unicodeslot=0x1220E, category='lo', description='CUNEIFORM SIGN LU2 TIMES SI PLUS ASH' },
+ [0x1220F] = { unicodeslot=0x1220F, category='lo', description='CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU' },
+ [0x12210] = { unicodeslot=0x12210, category='lo', description='CUNEIFORM SIGN LU2 TIMES TUG2' },
+ [0x12211] = { unicodeslot=0x12211, category='lo', description='CUNEIFORM SIGN LU2 TENU' },
+ [0x12212] = { unicodeslot=0x12212, category='lo', description='CUNEIFORM SIGN LU2 CROSSING LU2' },
+ [0x12213] = { unicodeslot=0x12213, category='lo', description='CUNEIFORM SIGN LU2 OPPOSING LU2' },
+ [0x12214] = { unicodeslot=0x12214, category='lo', description='CUNEIFORM SIGN LU2 SQUARED' },
+ [0x12215] = { unicodeslot=0x12215, category='lo', description='CUNEIFORM SIGN LU2 SHESHIG' },
+ [0x12216] = { unicodeslot=0x12216, category='lo', description='CUNEIFORM SIGN LU3' },
+ [0x12217] = { unicodeslot=0x12217, category='lo', description='CUNEIFORM SIGN LUGAL' },
+ [0x12218] = { unicodeslot=0x12218, category='lo', description='CUNEIFORM SIGN LUGAL OVER LUGAL' },
+ [0x12219] = { unicodeslot=0x12219, category='lo', description='CUNEIFORM SIGN LUGAL OPPOSING LUGAL' },
+ [0x1221A] = { unicodeslot=0x1221A, category='lo', description='CUNEIFORM SIGN LUGAL SHESHIG' },
+ [0x1221B] = { unicodeslot=0x1221B, category='lo', description='CUNEIFORM SIGN LUH' },
+ [0x1221C] = { unicodeslot=0x1221C, category='lo', description='CUNEIFORM SIGN LUL' },
+ [0x1221D] = { unicodeslot=0x1221D, category='lo', description='CUNEIFORM SIGN LUM' },
+ [0x1221E] = { unicodeslot=0x1221E, category='lo', description='CUNEIFORM SIGN LUM OVER LUM' },
+ [0x1221F] = { unicodeslot=0x1221F, category='lo', description='CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR' },
+ [0x12220] = { unicodeslot=0x12220, category='lo', description='CUNEIFORM SIGN MA' },
+ [0x12221] = { unicodeslot=0x12221, category='lo', description='CUNEIFORM SIGN MA TIMES TAK4' },
+ [0x12222] = { unicodeslot=0x12222, category='lo', description='CUNEIFORM SIGN MA GUNU' },
+ [0x12223] = { unicodeslot=0x12223, category='lo', description='CUNEIFORM SIGN MA2' },
+ [0x12224] = { unicodeslot=0x12224, category='lo', description='CUNEIFORM SIGN MAH' },
+ [0x12225] = { unicodeslot=0x12225, category='lo', description='CUNEIFORM SIGN MAR' },
+ [0x12226] = { unicodeslot=0x12226, category='lo', description='CUNEIFORM SIGN MASH' },
+ [0x12227] = { unicodeslot=0x12227, category='lo', description='CUNEIFORM SIGN MASH2' },
+ [0x12228] = { unicodeslot=0x12228, category='lo', description='CUNEIFORM SIGN ME' },
+ [0x12229] = { unicodeslot=0x12229, category='lo', description='CUNEIFORM SIGN MES' },
+ [0x1222A] = { unicodeslot=0x1222A, category='lo', description='CUNEIFORM SIGN MI' },
+ [0x1222B] = { unicodeslot=0x1222B, category='lo', description='CUNEIFORM SIGN MIN' },
+ [0x1222C] = { unicodeslot=0x1222C, category='lo', description='CUNEIFORM SIGN MU' },
+ [0x1222D] = { unicodeslot=0x1222D, category='lo', description='CUNEIFORM SIGN MU OVER MU' },
+ [0x1222E] = { unicodeslot=0x1222E, category='lo', description='CUNEIFORM SIGN MUG' },
+ [0x1222F] = { unicodeslot=0x1222F, category='lo', description='CUNEIFORM SIGN MUG GUNU' },
+ [0x12230] = { unicodeslot=0x12230, category='lo', description='CUNEIFORM SIGN MUNSUB' },
+ [0x12231] = { unicodeslot=0x12231, category='lo', description='CUNEIFORM SIGN MURGU2' },
+ [0x12232] = { unicodeslot=0x12232, category='lo', description='CUNEIFORM SIGN MUSH' },
+ [0x12233] = { unicodeslot=0x12233, category='lo', description='CUNEIFORM SIGN MUSH TIMES A' },
+ [0x12234] = { unicodeslot=0x12234, category='lo', description='CUNEIFORM SIGN MUSH TIMES KUR' },
+ [0x12235] = { unicodeslot=0x12235, category='lo', description='CUNEIFORM SIGN MUSH TIMES ZA' },
+ [0x12236] = { unicodeslot=0x12236, category='lo', description='CUNEIFORM SIGN MUSH OVER MUSH' },
+ [0x12237] = { unicodeslot=0x12237, category='lo', description='CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA' },
+ [0x12238] = { unicodeslot=0x12238, category='lo', description='CUNEIFORM SIGN MUSH CROSSING MUSH' },
+ [0x12239] = { unicodeslot=0x12239, category='lo', description='CUNEIFORM SIGN MUSH3' },
+ [0x1223A] = { unicodeslot=0x1223A, category='lo', description='CUNEIFORM SIGN MUSH3 TIMES A' },
+ [0x1223B] = { unicodeslot=0x1223B, category='lo', description='CUNEIFORM SIGN MUSH3 TIMES A PLUS DI' },
+ [0x1223C] = { unicodeslot=0x1223C, category='lo', description='CUNEIFORM SIGN MUSH3 TIMES DI' },
+ [0x1223D] = { unicodeslot=0x1223D, category='lo', description='CUNEIFORM SIGN MUSH3 GUNU' },
+ [0x1223E] = { unicodeslot=0x1223E, category='lo', description='CUNEIFORM SIGN NA' },
+ [0x1223F] = { unicodeslot=0x1223F, category='lo', description='CUNEIFORM SIGN NA2' },
+ [0x12240] = { unicodeslot=0x12240, category='lo', description='CUNEIFORM SIGN NAGA' },
+ [0x12241] = { unicodeslot=0x12241, category='lo', description='CUNEIFORM SIGN NAGA INVERTED' },
+ [0x12242] = { unicodeslot=0x12242, category='lo', description='CUNEIFORM SIGN NAGA TIMES SHU TENU' },
+ [0x12243] = { unicodeslot=0x12243, category='lo', description='CUNEIFORM SIGN NAGA OPPOSING NAGA' },
+ [0x12244] = { unicodeslot=0x12244, category='lo', description='CUNEIFORM SIGN NAGAR' },
+ [0x12245] = { unicodeslot=0x12245, category='lo', description='CUNEIFORM SIGN NAM NUTILLU' },
+ [0x12246] = { unicodeslot=0x12246, category='lo', description='CUNEIFORM SIGN NAM' },
+ [0x12247] = { unicodeslot=0x12247, category='lo', description='CUNEIFORM SIGN NAM2' },
+ [0x12248] = { unicodeslot=0x12248, category='lo', description='CUNEIFORM SIGN NE' },
+ [0x12249] = { unicodeslot=0x12249, category='lo', description='CUNEIFORM SIGN NE TIMES A' },
+ [0x1224A] = { unicodeslot=0x1224A, category='lo', description='CUNEIFORM SIGN NE TIMES UD' },
+ [0x1224B] = { unicodeslot=0x1224B, category='lo', description='CUNEIFORM SIGN NE SHESHIG' },
+ [0x1224C] = { unicodeslot=0x1224C, category='lo', description='CUNEIFORM SIGN NI' },
+ [0x1224D] = { unicodeslot=0x1224D, category='lo', description='CUNEIFORM SIGN NI TIMES E' },
+ [0x1224E] = { unicodeslot=0x1224E, category='lo', description='CUNEIFORM SIGN NI2' },
+ [0x1224F] = { unicodeslot=0x1224F, category='lo', description='CUNEIFORM SIGN NIM' },
+ [0x12250] = { unicodeslot=0x12250, category='lo', description='CUNEIFORM SIGN NIM TIMES GAN2 TENU' },
+ [0x12251] = { unicodeslot=0x12251, category='lo', description='CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU' },
+ [0x12252] = { unicodeslot=0x12252, category='lo', description='CUNEIFORM SIGN NINDA2' },
+ [0x12253] = { unicodeslot=0x12253, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES AN' },
+ [0x12254] = { unicodeslot=0x12254, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES ASH' },
+ [0x12255] = { unicodeslot=0x12255, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH' },
+ [0x12256] = { unicodeslot=0x12256, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES GUD' },
+ [0x12257] = { unicodeslot=0x12257, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU' },
+ [0x12258] = { unicodeslot=0x12258, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES NE' },
+ [0x12259] = { unicodeslot=0x12259, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES NUN' },
+ [0x1225A] = { unicodeslot=0x1225A, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE' },
+ [0x1225B] = { unicodeslot=0x1225B, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN' },
+ [0x1225C] = { unicodeslot=0x1225C, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH' },
+ [0x1225D] = { unicodeslot=0x1225D, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH' },
+ [0x1225E] = { unicodeslot=0x1225E, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH' },
+ [0x1225F] = { unicodeslot=0x1225F, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES USH' },
+ [0x12260] = { unicodeslot=0x12260, category='lo', description='CUNEIFORM SIGN NISAG' },
+ [0x12261] = { unicodeslot=0x12261, category='lo', description='CUNEIFORM SIGN NU' },
+ [0x12262] = { unicodeslot=0x12262, category='lo', description='CUNEIFORM SIGN NU11' },
+ [0x12263] = { unicodeslot=0x12263, category='lo', description='CUNEIFORM SIGN NUN' },
+ [0x12264] = { unicodeslot=0x12264, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES GAR' },
+ [0x12265] = { unicodeslot=0x12265, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES MASH' },
+ [0x12266] = { unicodeslot=0x12266, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES SAL' },
+ [0x12267] = { unicodeslot=0x12267, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL' },
+ [0x12268] = { unicodeslot=0x12268, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES USH' },
+ [0x12269] = { unicodeslot=0x12269, category='lo', description='CUNEIFORM SIGN NUN TENU' },
+ [0x1226A] = { unicodeslot=0x1226A, category='lo', description='CUNEIFORM SIGN NUN OVER NUN' },
+ [0x1226B] = { unicodeslot=0x1226B, category='lo', description='CUNEIFORM SIGN NUN CROSSING NUN' },
+ [0x1226C] = { unicodeslot=0x1226C, category='lo', description='CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR' },
+ [0x1226D] = { unicodeslot=0x1226D, category='lo', description='CUNEIFORM SIGN NUNUZ' },
+ [0x1226E] = { unicodeslot=0x1226E, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB' },
+ [0x1226F] = { unicodeslot=0x1226F, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES BI' },
+ [0x12270] = { unicodeslot=0x12270, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES DUG' },
+ [0x12271] = { unicodeslot=0x12271, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES GUD' },
+ [0x12272] = { unicodeslot=0x12272, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU' },
+ [0x12273] = { unicodeslot=0x12273, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3' },
+ [0x12274] = { unicodeslot=0x12274, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES LA' },
+ [0x12275] = { unicodeslot=0x12275, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES NE' },
+ [0x12276] = { unicodeslot=0x12276, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3' },
+ [0x12277] = { unicodeslot=0x12277, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES U2' },
+ [0x12278] = { unicodeslot=0x12278, category='lo', description='CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI' },
+ [0x12279] = { unicodeslot=0x12279, category='lo', description='CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U' },
+ [0x1227A] = { unicodeslot=0x1227A, category='lo', description='CUNEIFORM SIGN PA' },
+ [0x1227B] = { unicodeslot=0x1227B, category='lo', description='CUNEIFORM SIGN PAD' },
+ [0x1227C] = { unicodeslot=0x1227C, category='lo', description='CUNEIFORM SIGN PAN' },
+ [0x1227D] = { unicodeslot=0x1227D, category='lo', description='CUNEIFORM SIGN PAP' },
+ [0x1227E] = { unicodeslot=0x1227E, category='lo', description='CUNEIFORM SIGN PESH2' },
+ [0x1227F] = { unicodeslot=0x1227F, category='lo', description='CUNEIFORM SIGN PI' },
+ [0x12280] = { unicodeslot=0x12280, category='lo', description='CUNEIFORM SIGN PI TIMES A' },
+ [0x12281] = { unicodeslot=0x12281, category='lo', description='CUNEIFORM SIGN PI TIMES AB' },
+ [0x12282] = { unicodeslot=0x12282, category='lo', description='CUNEIFORM SIGN PI TIMES BI' },
+ [0x12283] = { unicodeslot=0x12283, category='lo', description='CUNEIFORM SIGN PI TIMES BU' },
+ [0x12284] = { unicodeslot=0x12284, category='lo', description='CUNEIFORM SIGN PI TIMES E' },
+ [0x12285] = { unicodeslot=0x12285, category='lo', description='CUNEIFORM SIGN PI TIMES I' },
+ [0x12286] = { unicodeslot=0x12286, category='lo', description='CUNEIFORM SIGN PI TIMES IB' },
+ [0x12287] = { unicodeslot=0x12287, category='lo', description='CUNEIFORM SIGN PI TIMES U' },
+ [0x12288] = { unicodeslot=0x12288, category='lo', description='CUNEIFORM SIGN PI TIMES U2' },
+ [0x12289] = { unicodeslot=0x12289, category='lo', description='CUNEIFORM SIGN PI CROSSING PI' },
+ [0x1228A] = { unicodeslot=0x1228A, category='lo', description='CUNEIFORM SIGN PIRIG' },
+ [0x1228B] = { unicodeslot=0x1228B, category='lo', description='CUNEIFORM SIGN PIRIG TIMES KAL' },
+ [0x1228C] = { unicodeslot=0x1228C, category='lo', description='CUNEIFORM SIGN PIRIG TIMES UD' },
+ [0x1228D] = { unicodeslot=0x1228D, category='lo', description='CUNEIFORM SIGN PIRIG TIMES ZA' },
+ [0x1228E] = { unicodeslot=0x1228E, category='lo', description='CUNEIFORM SIGN PIRIG OPPOSING PIRIG' },
+ [0x1228F] = { unicodeslot=0x1228F, category='lo', description='CUNEIFORM SIGN RA' },
+ [0x12290] = { unicodeslot=0x12290, category='lo', description='CUNEIFORM SIGN RAB' },
+ [0x12291] = { unicodeslot=0x12291, category='lo', description='CUNEIFORM SIGN RI' },
+ [0x12292] = { unicodeslot=0x12292, category='lo', description='CUNEIFORM SIGN RU' },
+ [0x12293] = { unicodeslot=0x12293, category='lo', description='CUNEIFORM SIGN SA' },
+ [0x12294] = { unicodeslot=0x12294, category='lo', description='CUNEIFORM SIGN SAG NUTILLU' },
+ [0x12295] = { unicodeslot=0x12295, category='lo', description='CUNEIFORM SIGN SAG' },
+ [0x12296] = { unicodeslot=0x12296, category='lo', description='CUNEIFORM SIGN SAG TIMES A' },
+ [0x12297] = { unicodeslot=0x12297, category='lo', description='CUNEIFORM SIGN SAG TIMES DU' },
+ [0x12298] = { unicodeslot=0x12298, category='lo', description='CUNEIFORM SIGN SAG TIMES DUB' },
+ [0x12299] = { unicodeslot=0x12299, category='lo', description='CUNEIFORM SIGN SAG TIMES HA' },
+ [0x1229A] = { unicodeslot=0x1229A, category='lo', description='CUNEIFORM SIGN SAG TIMES KAK' },
+ [0x1229B] = { unicodeslot=0x1229B, category='lo', description='CUNEIFORM SIGN SAG TIMES KUR' },
+ [0x1229C] = { unicodeslot=0x1229C, category='lo', description='CUNEIFORM SIGN SAG TIMES LUM' },
+ [0x1229D] = { unicodeslot=0x1229D, category='lo', description='CUNEIFORM SIGN SAG TIMES MI' },
+ [0x1229E] = { unicodeslot=0x1229E, category='lo', description='CUNEIFORM SIGN SAG TIMES NUN' },
+ [0x1229F] = { unicodeslot=0x1229F, category='lo', description='CUNEIFORM SIGN SAG TIMES SAL' },
+ [0x122A0] = { unicodeslot=0x122A0, category='lo', description='CUNEIFORM SIGN SAG TIMES SHID' },
+ [0x122A1] = { unicodeslot=0x122A1, category='lo', description='CUNEIFORM SIGN SAG TIMES TAB' },
+ [0x122A2] = { unicodeslot=0x122A2, category='lo', description='CUNEIFORM SIGN SAG TIMES U2' },
+ [0x122A3] = { unicodeslot=0x122A3, category='lo', description='CUNEIFORM SIGN SAG TIMES UB' },
+ [0x122A4] = { unicodeslot=0x122A4, category='lo', description='CUNEIFORM SIGN SAG TIMES UM' },
+ [0x122A5] = { unicodeslot=0x122A5, category='lo', description='CUNEIFORM SIGN SAG TIMES UR' },
+ [0x122A6] = { unicodeslot=0x122A6, category='lo', description='CUNEIFORM SIGN SAG TIMES USH' },
+ [0x122A7] = { unicodeslot=0x122A7, category='lo', description='CUNEIFORM SIGN SAG OVER SAG' },
+ [0x122A8] = { unicodeslot=0x122A8, category='lo', description='CUNEIFORM SIGN SAG GUNU' },
+ [0x122A9] = { unicodeslot=0x122A9, category='lo', description='CUNEIFORM SIGN SAL' },
+ [0x122AA] = { unicodeslot=0x122AA, category='lo', description='CUNEIFORM SIGN SAL LAGAB TIMES ASH2' },
+ [0x122AB] = { unicodeslot=0x122AB, category='lo', description='CUNEIFORM SIGN SANGA2' },
+ [0x122AC] = { unicodeslot=0x122AC, category='lo', description='CUNEIFORM SIGN SAR' },
+ [0x122AD] = { unicodeslot=0x122AD, category='lo', description='CUNEIFORM SIGN SHA' },
+ [0x122AE] = { unicodeslot=0x122AE, category='lo', description='CUNEIFORM SIGN SHA3' },
+ [0x122AF] = { unicodeslot=0x122AF, category='lo', description='CUNEIFORM SIGN SHA3 TIMES A' },
+ [0x122B0] = { unicodeslot=0x122B0, category='lo', description='CUNEIFORM SIGN SHA3 TIMES BAD' },
+ [0x122B1] = { unicodeslot=0x122B1, category='lo', description='CUNEIFORM SIGN SHA3 TIMES GISH' },
+ [0x122B2] = { unicodeslot=0x122B2, category='lo', description='CUNEIFORM SIGN SHA3 TIMES NE' },
+ [0x122B3] = { unicodeslot=0x122B3, category='lo', description='CUNEIFORM SIGN SHA3 TIMES SHU2' },
+ [0x122B4] = { unicodeslot=0x122B4, category='lo', description='CUNEIFORM SIGN SHA3 TIMES TUR' },
+ [0x122B5] = { unicodeslot=0x122B5, category='lo', description='CUNEIFORM SIGN SHA3 TIMES U' },
+ [0x122B6] = { unicodeslot=0x122B6, category='lo', description='CUNEIFORM SIGN SHA3 TIMES U PLUS A' },
+ [0x122B7] = { unicodeslot=0x122B7, category='lo', description='CUNEIFORM SIGN SHA6' },
+ [0x122B8] = { unicodeslot=0x122B8, category='lo', description='CUNEIFORM SIGN SHAB6' },
+ [0x122B9] = { unicodeslot=0x122B9, category='lo', description='CUNEIFORM SIGN SHAR2' },
+ [0x122BA] = { unicodeslot=0x122BA, category='lo', description='CUNEIFORM SIGN SHE' },
+ [0x122BB] = { unicodeslot=0x122BB, category='lo', description='CUNEIFORM SIGN SHE HU' },
+ [0x122BC] = { unicodeslot=0x122BC, category='lo', description='CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR' },
+ [0x122BD] = { unicodeslot=0x122BD, category='lo', description='CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR' },
+ [0x122BE] = { unicodeslot=0x122BE, category='lo', description='CUNEIFORM SIGN SHEG9' },
+ [0x122BF] = { unicodeslot=0x122BF, category='lo', description='CUNEIFORM SIGN SHEN' },
+ [0x122C0] = { unicodeslot=0x122C0, category='lo', description='CUNEIFORM SIGN SHESH' },
+ [0x122C1] = { unicodeslot=0x122C1, category='lo', description='CUNEIFORM SIGN SHESH2' },
+ [0x122C2] = { unicodeslot=0x122C2, category='lo', description='CUNEIFORM SIGN SHESHLAM' },
+ [0x122C3] = { unicodeslot=0x122C3, category='lo', description='CUNEIFORM SIGN SHID' },
+ [0x122C4] = { unicodeslot=0x122C4, category='lo', description='CUNEIFORM SIGN SHID TIMES A' },
+ [0x122C5] = { unicodeslot=0x122C5, category='lo', description='CUNEIFORM SIGN SHID TIMES IM' },
+ [0x122C6] = { unicodeslot=0x122C6, category='lo', description='CUNEIFORM SIGN SHIM' },
+ [0x122C7] = { unicodeslot=0x122C7, category='lo', description='CUNEIFORM SIGN SHIM TIMES A' },
+ [0x122C8] = { unicodeslot=0x122C8, category='lo', description='CUNEIFORM SIGN SHIM TIMES BAL' },
+ [0x122C9] = { unicodeslot=0x122C9, category='lo', description='CUNEIFORM SIGN SHIM TIMES BULUG' },
+ [0x122CA] = { unicodeslot=0x122CA, category='lo', description='CUNEIFORM SIGN SHIM TIMES DIN' },
+ [0x122CB] = { unicodeslot=0x122CB, category='lo', description='CUNEIFORM SIGN SHIM TIMES GAR' },
+ [0x122CC] = { unicodeslot=0x122CC, category='lo', description='CUNEIFORM SIGN SHIM TIMES IGI' },
+ [0x122CD] = { unicodeslot=0x122CD, category='lo', description='CUNEIFORM SIGN SHIM TIMES IGI GUNU' },
+ [0x122CE] = { unicodeslot=0x122CE, category='lo', description='CUNEIFORM SIGN SHIM TIMES KUSHU2' },
+ [0x122CF] = { unicodeslot=0x122CF, category='lo', description='CUNEIFORM SIGN SHIM TIMES LUL' },
+ [0x122D0] = { unicodeslot=0x122D0, category='lo', description='CUNEIFORM SIGN SHIM TIMES MUG' },
+ [0x122D1] = { unicodeslot=0x122D1, category='lo', description='CUNEIFORM SIGN SHIM TIMES SAL' },
+ [0x122D2] = { unicodeslot=0x122D2, category='lo', description='CUNEIFORM SIGN SHINIG' },
+ [0x122D3] = { unicodeslot=0x122D3, category='lo', description='CUNEIFORM SIGN SHIR' },
+ [0x122D4] = { unicodeslot=0x122D4, category='lo', description='CUNEIFORM SIGN SHIR TENU' },
+ [0x122D5] = { unicodeslot=0x122D5, category='lo', description='CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR' },
+ [0x122D6] = { unicodeslot=0x122D6, category='lo', description='CUNEIFORM SIGN SHITA' },
+ [0x122D7] = { unicodeslot=0x122D7, category='lo', description='CUNEIFORM SIGN SHU' },
+ [0x122D8] = { unicodeslot=0x122D8, category='lo', description='CUNEIFORM SIGN SHU OVER INVERTED SHU' },
+ [0x122D9] = { unicodeslot=0x122D9, category='lo', description='CUNEIFORM SIGN SHU2' },
+ [0x122DA] = { unicodeslot=0x122DA, category='lo', description='CUNEIFORM SIGN SHUBUR' },
+ [0x122DB] = { unicodeslot=0x122DB, category='lo', description='CUNEIFORM SIGN SI' },
+ [0x122DC] = { unicodeslot=0x122DC, category='lo', description='CUNEIFORM SIGN SI GUNU' },
+ [0x122DD] = { unicodeslot=0x122DD, category='lo', description='CUNEIFORM SIGN SIG' },
+ [0x122DE] = { unicodeslot=0x122DE, category='lo', description='CUNEIFORM SIGN SIG4' },
+ [0x122DF] = { unicodeslot=0x122DF, category='lo', description='CUNEIFORM SIGN SIG4 OVER SIG4 SHU2' },
+ [0x122E0] = { unicodeslot=0x122E0, category='lo', description='CUNEIFORM SIGN SIK2' },
+ [0x122E1] = { unicodeslot=0x122E1, category='lo', description='CUNEIFORM SIGN SILA3' },
+ [0x122E2] = { unicodeslot=0x122E2, category='lo', description='CUNEIFORM SIGN SU' },
+ [0x122E3] = { unicodeslot=0x122E3, category='lo', description='CUNEIFORM SIGN SU OVER SU' },
+ [0x122E4] = { unicodeslot=0x122E4, category='lo', description='CUNEIFORM SIGN SUD' },
+ [0x122E5] = { unicodeslot=0x122E5, category='lo', description='CUNEIFORM SIGN SUD2' },
+ [0x122E6] = { unicodeslot=0x122E6, category='lo', description='CUNEIFORM SIGN SUHUR' },
+ [0x122E7] = { unicodeslot=0x122E7, category='lo', description='CUNEIFORM SIGN SUM' },
+ [0x122E8] = { unicodeslot=0x122E8, category='lo', description='CUNEIFORM SIGN SUMASH' },
+ [0x122E9] = { unicodeslot=0x122E9, category='lo', description='CUNEIFORM SIGN SUR' },
+ [0x122EA] = { unicodeslot=0x122EA, category='lo', description='CUNEIFORM SIGN SUR9' },
+ [0x122EB] = { unicodeslot=0x122EB, category='lo', description='CUNEIFORM SIGN TA' },
+ [0x122EC] = { unicodeslot=0x122EC, category='lo', description='CUNEIFORM SIGN TA ASTERISK' },
+ [0x122ED] = { unicodeslot=0x122ED, category='lo', description='CUNEIFORM SIGN TA TIMES HI' },
+ [0x122EE] = { unicodeslot=0x122EE, category='lo', description='CUNEIFORM SIGN TA TIMES MI' },
+ [0x122EF] = { unicodeslot=0x122EF, category='lo', description='CUNEIFORM SIGN TA GUNU' },
+ [0x122F0] = { unicodeslot=0x122F0, category='lo', description='CUNEIFORM SIGN TAB' },
+ [0x122F1] = { unicodeslot=0x122F1, category='lo', description='CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH' },
+ [0x122F2] = { unicodeslot=0x122F2, category='lo', description='CUNEIFORM SIGN TAB SQUARED' },
+ [0x122F3] = { unicodeslot=0x122F3, category='lo', description='CUNEIFORM SIGN TAG' },
+ [0x122F4] = { unicodeslot=0x122F4, category='lo', description='CUNEIFORM SIGN TAG TIMES BI' },
+ [0x122F5] = { unicodeslot=0x122F5, category='lo', description='CUNEIFORM SIGN TAG TIMES GUD' },
+ [0x122F6] = { unicodeslot=0x122F6, category='lo', description='CUNEIFORM SIGN TAG TIMES SHE' },
+ [0x122F7] = { unicodeslot=0x122F7, category='lo', description='CUNEIFORM SIGN TAG TIMES SHU' },
+ [0x122F8] = { unicodeslot=0x122F8, category='lo', description='CUNEIFORM SIGN TAG TIMES TUG2' },
+ [0x122F9] = { unicodeslot=0x122F9, category='lo', description='CUNEIFORM SIGN TAG TIMES UD' },
+ [0x122FA] = { unicodeslot=0x122FA, category='lo', description='CUNEIFORM SIGN TAK4' },
+ [0x122FB] = { unicodeslot=0x122FB, category='lo', description='CUNEIFORM SIGN TAR' },
+ [0x122FC] = { unicodeslot=0x122FC, category='lo', description='CUNEIFORM SIGN TE' },
+ [0x122FD] = { unicodeslot=0x122FD, category='lo', description='CUNEIFORM SIGN TE GUNU' },
+ [0x122FE] = { unicodeslot=0x122FE, category='lo', description='CUNEIFORM SIGN TI' },
+ [0x122FF] = { unicodeslot=0x122FF, category='lo', description='CUNEIFORM SIGN TI TENU' },
+ [0x12300] = { unicodeslot=0x12300, category='lo', description='CUNEIFORM SIGN TIL' },
+ [0x12301] = { unicodeslot=0x12301, category='lo', description='CUNEIFORM SIGN TIR' },
+ [0x12302] = { unicodeslot=0x12302, category='lo', description='CUNEIFORM SIGN TIR TIMES TAK4' },
+ [0x12303] = { unicodeslot=0x12303, category='lo', description='CUNEIFORM SIGN TIR OVER TIR' },
+ [0x12304] = { unicodeslot=0x12304, category='lo', description='CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR' },
+ [0x12305] = { unicodeslot=0x12305, category='lo', description='CUNEIFORM SIGN TU' },
+ [0x12306] = { unicodeslot=0x12306, category='lo', description='CUNEIFORM SIGN TUG2' },
+ [0x12307] = { unicodeslot=0x12307, category='lo', description='CUNEIFORM SIGN TUK' },
+ [0x12308] = { unicodeslot=0x12308, category='lo', description='CUNEIFORM SIGN TUM' },
+ [0x12309] = { unicodeslot=0x12309, category='lo', description='CUNEIFORM SIGN TUR' },
+ [0x1230A] = { unicodeslot=0x1230A, category='lo', description='CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA' },
+ [0x1230B] = { unicodeslot=0x1230B, category='lo', description='CUNEIFORM SIGN U' },
+ [0x1230C] = { unicodeslot=0x1230C, category='lo', description='CUNEIFORM SIGN U GUD' },
+ [0x1230D] = { unicodeslot=0x1230D, category='lo', description='CUNEIFORM SIGN U U U' },
+ [0x1230E] = { unicodeslot=0x1230E, category='lo', description='CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR' },
+ [0x1230F] = { unicodeslot=0x1230F, category='lo', description='CUNEIFORM SIGN U OVER U SUR OVER SUR' },
+ [0x12310] = { unicodeslot=0x12310, category='lo', description='CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED' },
+ [0x12311] = { unicodeslot=0x12311, category='lo', description='CUNEIFORM SIGN U2' },
+ [0x12312] = { unicodeslot=0x12312, category='lo', description='CUNEIFORM SIGN UB' },
+ [0x12313] = { unicodeslot=0x12313, category='lo', description='CUNEIFORM SIGN UD' },
+ [0x12314] = { unicodeslot=0x12314, category='lo', description='CUNEIFORM SIGN UD KUSHU2' },
+ [0x12315] = { unicodeslot=0x12315, category='lo', description='CUNEIFORM SIGN UD TIMES BAD' },
+ [0x12316] = { unicodeslot=0x12316, category='lo', description='CUNEIFORM SIGN UD TIMES MI' },
+ [0x12317] = { unicodeslot=0x12317, category='lo', description='CUNEIFORM SIGN UD TIMES U PLUS U PLUS U' },
+ [0x12318] = { unicodeslot=0x12318, category='lo', description='CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU' },
+ [0x12319] = { unicodeslot=0x12319, category='lo', description='CUNEIFORM SIGN UD GUNU' },
+ [0x1231A] = { unicodeslot=0x1231A, category='lo', description='CUNEIFORM SIGN UD SHESHIG' },
+ [0x1231B] = { unicodeslot=0x1231B, category='lo', description='CUNEIFORM SIGN UD SHESHIG TIMES BAD' },
+ [0x1231C] = { unicodeslot=0x1231C, category='lo', description='CUNEIFORM SIGN UDUG' },
+ [0x1231D] = { unicodeslot=0x1231D, category='lo', description='CUNEIFORM SIGN UM' },
+ [0x1231E] = { unicodeslot=0x1231E, category='lo', description='CUNEIFORM SIGN UM TIMES LAGAB' },
+ [0x1231F] = { unicodeslot=0x1231F, category='lo', description='CUNEIFORM SIGN UM TIMES ME PLUS DA' },
+ [0x12320] = { unicodeslot=0x12320, category='lo', description='CUNEIFORM SIGN UM TIMES SHA3' },
+ [0x12321] = { unicodeslot=0x12321, category='lo', description='CUNEIFORM SIGN UM TIMES U' },
+ [0x12322] = { unicodeslot=0x12322, category='lo', description='CUNEIFORM SIGN UMBIN' },
+ [0x12323] = { unicodeslot=0x12323, category='lo', description='CUNEIFORM SIGN UMUM' },
+ [0x12324] = { unicodeslot=0x12324, category='lo', description='CUNEIFORM SIGN UMUM TIMES KASKAL' },
+ [0x12325] = { unicodeslot=0x12325, category='lo', description='CUNEIFORM SIGN UMUM TIMES PA' },
+ [0x12326] = { unicodeslot=0x12326, category='lo', description='CUNEIFORM SIGN UN' },
+ [0x12327] = { unicodeslot=0x12327, category='lo', description='CUNEIFORM SIGN UN GUNU' },
+ [0x12328] = { unicodeslot=0x12328, category='lo', description='CUNEIFORM SIGN UR' },
+ [0x12329] = { unicodeslot=0x12329, category='lo', description='CUNEIFORM SIGN UR CROSSING UR' },
+ [0x1232A] = { unicodeslot=0x1232A, category='lo', description='CUNEIFORM SIGN UR SHESHIG' },
+ [0x1232B] = { unicodeslot=0x1232B, category='lo', description='CUNEIFORM SIGN UR2' },
+ [0x1232C] = { unicodeslot=0x1232C, category='lo', description='CUNEIFORM SIGN UR2 TIMES A PLUS HA' },
+ [0x1232D] = { unicodeslot=0x1232D, category='lo', description='CUNEIFORM SIGN UR2 TIMES A PLUS NA' },
+ [0x1232E] = { unicodeslot=0x1232E, category='lo', description='CUNEIFORM SIGN UR2 TIMES AL' },
+ [0x1232F] = { unicodeslot=0x1232F, category='lo', description='CUNEIFORM SIGN UR2 TIMES HA' },
+ [0x12330] = { unicodeslot=0x12330, category='lo', description='CUNEIFORM SIGN UR2 TIMES NUN' },
+ [0x12331] = { unicodeslot=0x12331, category='lo', description='CUNEIFORM SIGN UR2 TIMES U2' },
+ [0x12332] = { unicodeslot=0x12332, category='lo', description='CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH' },
+ [0x12333] = { unicodeslot=0x12333, category='lo', description='CUNEIFORM SIGN UR2 TIMES U2 PLUS BI' },
+ [0x12334] = { unicodeslot=0x12334, category='lo', description='CUNEIFORM SIGN UR4' },
+ [0x12335] = { unicodeslot=0x12335, category='lo', description='CUNEIFORM SIGN URI' },
+ [0x12336] = { unicodeslot=0x12336, category='lo', description='CUNEIFORM SIGN URI3' },
+ [0x12337] = { unicodeslot=0x12337, category='lo', description='CUNEIFORM SIGN URU' },
+ [0x12338] = { unicodeslot=0x12338, category='lo', description='CUNEIFORM SIGN URU TIMES A' },
+ [0x12339] = { unicodeslot=0x12339, category='lo', description='CUNEIFORM SIGN URU TIMES ASHGAB' },
+ [0x1233A] = { unicodeslot=0x1233A, category='lo', description='CUNEIFORM SIGN URU TIMES BAR' },
+ [0x1233B] = { unicodeslot=0x1233B, category='lo', description='CUNEIFORM SIGN URU TIMES DUN' },
+ [0x1233C] = { unicodeslot=0x1233C, category='lo', description='CUNEIFORM SIGN URU TIMES GA' },
+ [0x1233D] = { unicodeslot=0x1233D, category='lo', description='CUNEIFORM SIGN URU TIMES GAL' },
+ [0x1233E] = { unicodeslot=0x1233E, category='lo', description='CUNEIFORM SIGN URU TIMES GAN2 TENU' },
+ [0x1233F] = { unicodeslot=0x1233F, category='lo', description='CUNEIFORM SIGN URU TIMES GAR' },
+ [0x12340] = { unicodeslot=0x12340, category='lo', description='CUNEIFORM SIGN URU TIMES GU' },
+ [0x12341] = { unicodeslot=0x12341, category='lo', description='CUNEIFORM SIGN URU TIMES HA' },
+ [0x12342] = { unicodeslot=0x12342, category='lo', description='CUNEIFORM SIGN URU TIMES IGI' },
+ [0x12343] = { unicodeslot=0x12343, category='lo', description='CUNEIFORM SIGN URU TIMES IM' },
+ [0x12344] = { unicodeslot=0x12344, category='lo', description='CUNEIFORM SIGN URU TIMES ISH' },
+ [0x12345] = { unicodeslot=0x12345, category='lo', description='CUNEIFORM SIGN URU TIMES KI' },
+ [0x12346] = { unicodeslot=0x12346, category='lo', description='CUNEIFORM SIGN URU TIMES LUM' },
+ [0x12347] = { unicodeslot=0x12347, category='lo', description='CUNEIFORM SIGN URU TIMES MIN' },
+ [0x12348] = { unicodeslot=0x12348, category='lo', description='CUNEIFORM SIGN URU TIMES PA' },
+ [0x12349] = { unicodeslot=0x12349, category='lo', description='CUNEIFORM SIGN URU TIMES SHE' },
+ [0x1234A] = { unicodeslot=0x1234A, category='lo', description='CUNEIFORM SIGN URU TIMES SIG4' },
+ [0x1234B] = { unicodeslot=0x1234B, category='lo', description='CUNEIFORM SIGN URU TIMES TU' },
+ [0x1234C] = { unicodeslot=0x1234C, category='lo', description='CUNEIFORM SIGN URU TIMES U PLUS GUD' },
+ [0x1234D] = { unicodeslot=0x1234D, category='lo', description='CUNEIFORM SIGN URU TIMES UD' },
+ [0x1234E] = { unicodeslot=0x1234E, category='lo', description='CUNEIFORM SIGN URU TIMES URUDA' },
+ [0x1234F] = { unicodeslot=0x1234F, category='lo', description='CUNEIFORM SIGN URUDA' },
+ [0x12350] = { unicodeslot=0x12350, category='lo', description='CUNEIFORM SIGN URUDA TIMES U' },
+ [0x12351] = { unicodeslot=0x12351, category='lo', description='CUNEIFORM SIGN USH' },
+ [0x12352] = { unicodeslot=0x12352, category='lo', description='CUNEIFORM SIGN USH TIMES A' },
+ [0x12353] = { unicodeslot=0x12353, category='lo', description='CUNEIFORM SIGN USH TIMES KU' },
+ [0x12354] = { unicodeslot=0x12354, category='lo', description='CUNEIFORM SIGN USH TIMES KUR' },
+ [0x12355] = { unicodeslot=0x12355, category='lo', description='CUNEIFORM SIGN USH TIMES TAK4' },
+ [0x12356] = { unicodeslot=0x12356, category='lo', description='CUNEIFORM SIGN USHX' },
+ [0x12357] = { unicodeslot=0x12357, category='lo', description='CUNEIFORM SIGN USH2' },
+ [0x12358] = { unicodeslot=0x12358, category='lo', description='CUNEIFORM SIGN USHUMX' },
+ [0x12359] = { unicodeslot=0x12359, category='lo', description='CUNEIFORM SIGN UTUKI' },
+ [0x1235A] = { unicodeslot=0x1235A, category='lo', description='CUNEIFORM SIGN UZ3' },
+ [0x1235B] = { unicodeslot=0x1235B, category='lo', description='CUNEIFORM SIGN UZ3 TIMES KASKAL' },
+ [0x1235C] = { unicodeslot=0x1235C, category='lo', description='CUNEIFORM SIGN UZU' },
+ [0x1235D] = { unicodeslot=0x1235D, category='lo', description='CUNEIFORM SIGN ZA' },
+ [0x1235E] = { unicodeslot=0x1235E, category='lo', description='CUNEIFORM SIGN ZA TENU' },
+ [0x1235F] = { unicodeslot=0x1235F, category='lo', description='CUNEIFORM SIGN ZA SQUARED TIMES KUR' },
+ [0x12360] = { unicodeslot=0x12360, category='lo', description='CUNEIFORM SIGN ZAG' },
+ [0x12361] = { unicodeslot=0x12361, category='lo', description='CUNEIFORM SIGN ZAMX' },
+ [0x12362] = { unicodeslot=0x12362, category='lo', description='CUNEIFORM SIGN ZE2' },
+ [0x12363] = { unicodeslot=0x12363, category='lo', description='CUNEIFORM SIGN ZI' },
+ [0x12364] = { unicodeslot=0x12364, category='lo', description='CUNEIFORM SIGN ZI OVER ZI' },
+ [0x12365] = { unicodeslot=0x12365, category='lo', description='CUNEIFORM SIGN ZI3' },
+ [0x12366] = { unicodeslot=0x12366, category='lo', description='CUNEIFORM SIGN ZIB' },
+ [0x12367] = { unicodeslot=0x12367, category='lo', description='CUNEIFORM SIGN ZIB KABA TENU' },
+ [0x12368] = { unicodeslot=0x12368, category='lo', description='CUNEIFORM SIGN ZIG' },
+ [0x12369] = { unicodeslot=0x12369, category='lo', description='CUNEIFORM SIGN ZIZ2' },
+ [0x1236A] = { unicodeslot=0x1236A, category='lo', description='CUNEIFORM SIGN ZU' },
+ [0x1236B] = { unicodeslot=0x1236B, category='lo', description='CUNEIFORM SIGN ZU5' },
+ [0x1236C] = { unicodeslot=0x1236C, category='lo', description='CUNEIFORM SIGN ZU5 TIMES A' },
+ [0x1236D] = { unicodeslot=0x1236D, category='lo', description='CUNEIFORM SIGN ZUBUR' },
+ [0x1236E] = { unicodeslot=0x1236E, category='lo', description='CUNEIFORM SIGN ZUM' },
+ [0x12400] = { unicodeslot=0x12400, category='nl', description='CUNEIFORM NUMERIC SIGN TWO ASH' },
+ [0x12401] = { unicodeslot=0x12401, category='nl', description='CUNEIFORM NUMERIC SIGN THREE ASH' },
+ [0x12402] = { unicodeslot=0x12402, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR ASH' },
+ [0x12403] = { unicodeslot=0x12403, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE ASH' },
+ [0x12404] = { unicodeslot=0x12404, category='nl', description='CUNEIFORM NUMERIC SIGN SIX ASH' },
+ [0x12405] = { unicodeslot=0x12405, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN ASH' },
+ [0x12406] = { unicodeslot=0x12406, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT ASH' },
+ [0x12407] = { unicodeslot=0x12407, category='nl', description='CUNEIFORM NUMERIC SIGN NINE ASH' },
+ [0x12408] = { unicodeslot=0x12408, category='nl', description='CUNEIFORM NUMERIC SIGN THREE DISH' },
+ [0x12409] = { unicodeslot=0x12409, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR DISH' },
+ [0x1240A] = { unicodeslot=0x1240A, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE DISH' },
+ [0x1240B] = { unicodeslot=0x1240B, category='nl', description='CUNEIFORM NUMERIC SIGN SIX DISH' },
+ [0x1240C] = { unicodeslot=0x1240C, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN DISH' },
+ [0x1240D] = { unicodeslot=0x1240D, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT DISH' },
+ [0x1240E] = { unicodeslot=0x1240E, category='nl', description='CUNEIFORM NUMERIC SIGN NINE DISH' },
+ [0x1240F] = { unicodeslot=0x1240F, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR U' },
+ [0x12410] = { unicodeslot=0x12410, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE U' },
+ [0x12411] = { unicodeslot=0x12411, category='nl', description='CUNEIFORM NUMERIC SIGN SIX U' },
+ [0x12412] = { unicodeslot=0x12412, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN U' },
+ [0x12413] = { unicodeslot=0x12413, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT U' },
+ [0x12414] = { unicodeslot=0x12414, category='nl', description='CUNEIFORM NUMERIC SIGN NINE U' },
+ [0x12415] = { unicodeslot=0x12415, category='nl', description='CUNEIFORM NUMERIC SIGN ONE GESH2' },
+ [0x12416] = { unicodeslot=0x12416, category='nl', description='CUNEIFORM NUMERIC SIGN TWO GESH2' },
+ [0x12417] = { unicodeslot=0x12417, category='nl', description='CUNEIFORM NUMERIC SIGN THREE GESH2' },
+ [0x12418] = { unicodeslot=0x12418, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR GESH2' },
+ [0x12419] = { unicodeslot=0x12419, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE GESH2' },
+ [0x1241A] = { unicodeslot=0x1241A, category='nl', description='CUNEIFORM NUMERIC SIGN SIX GESH2' },
+ [0x1241B] = { unicodeslot=0x1241B, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN GESH2' },
+ [0x1241C] = { unicodeslot=0x1241C, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT GESH2' },
+ [0x1241D] = { unicodeslot=0x1241D, category='nl', description='CUNEIFORM NUMERIC SIGN NINE GESH2' },
+ [0x1241E] = { unicodeslot=0x1241E, category='nl', description='CUNEIFORM NUMERIC SIGN ONE GESHU' },
+ [0x1241F] = { unicodeslot=0x1241F, category='nl', description='CUNEIFORM NUMERIC SIGN TWO GESHU' },
+ [0x12420] = { unicodeslot=0x12420, category='nl', description='CUNEIFORM NUMERIC SIGN THREE GESHU' },
+ [0x12421] = { unicodeslot=0x12421, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR GESHU' },
+ [0x12422] = { unicodeslot=0x12422, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE GESHU' },
+ [0x12423] = { unicodeslot=0x12423, category='nl', description='CUNEIFORM NUMERIC SIGN TWO SHAR2' },
+ [0x12424] = { unicodeslot=0x12424, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHAR2' },
+ [0x12425] = { unicodeslot=0x12425, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM' },
+ [0x12426] = { unicodeslot=0x12426, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR SHAR2' },
+ [0x12427] = { unicodeslot=0x12427, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE SHAR2' },
+ [0x12428] = { unicodeslot=0x12428, category='nl', description='CUNEIFORM NUMERIC SIGN SIX SHAR2' },
+ [0x12429] = { unicodeslot=0x12429, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN SHAR2' },
+ [0x1242A] = { unicodeslot=0x1242A, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT SHAR2' },
+ [0x1242B] = { unicodeslot=0x1242B, category='nl', description='CUNEIFORM NUMERIC SIGN NINE SHAR2' },
+ [0x1242C] = { unicodeslot=0x1242C, category='nl', description='CUNEIFORM NUMERIC SIGN ONE SHARU' },
+ [0x1242D] = { unicodeslot=0x1242D, category='nl', description='CUNEIFORM NUMERIC SIGN TWO SHARU' },
+ [0x1242E] = { unicodeslot=0x1242E, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHARU' },
+ [0x1242F] = { unicodeslot=0x1242F, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM' },
+ [0x12430] = { unicodeslot=0x12430, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR SHARU' },
+ [0x12431] = { unicodeslot=0x12431, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE SHARU' },
+ [0x12432] = { unicodeslot=0x12432, category='nl', description='CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH' },
+ [0x12433] = { unicodeslot=0x12433, category='nl', description='CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN' },
+ [0x12434] = { unicodeslot=0x12434, category='nl', description='CUNEIFORM NUMERIC SIGN ONE BURU' },
+ [0x12435] = { unicodeslot=0x12435, category='nl', description='CUNEIFORM NUMERIC SIGN TWO BURU' },
+ [0x12436] = { unicodeslot=0x12436, category='nl', description='CUNEIFORM NUMERIC SIGN THREE BURU' },
+ [0x12437] = { unicodeslot=0x12437, category='nl', description='CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM' },
+ [0x12438] = { unicodeslot=0x12438, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR BURU' },
+ [0x12439] = { unicodeslot=0x12439, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE BURU' },
+ [0x1243A] = { unicodeslot=0x1243A, category='nl', description='CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16' },
+ [0x1243B] = { unicodeslot=0x1243B, category='nl', description='CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21' },
+ [0x1243C] = { unicodeslot=0x1243C, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU' },
+ [0x1243D] = { unicodeslot=0x1243D, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4' },
+ [0x1243E] = { unicodeslot=0x1243E, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A' },
+ [0x1243F] = { unicodeslot=0x1243F, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B' },
+ [0x12440] = { unicodeslot=0x12440, category='nl', description='CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9' },
+ [0x12441] = { unicodeslot=0x12441, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3' },
+ [0x12442] = { unicodeslot=0x12442, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A' },
+ [0x12443] = { unicodeslot=0x12443, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B' },
+ [0x12444] = { unicodeslot=0x12444, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU' },
+ [0x12445] = { unicodeslot=0x12445, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3' },
+ [0x12446] = { unicodeslot=0x12446, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU' },
+ [0x12447] = { unicodeslot=0x12447, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3' },
+ [0x12448] = { unicodeslot=0x12448, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4' },
+ [0x12449] = { unicodeslot=0x12449, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A' },
+ [0x1244A] = { unicodeslot=0x1244A, category='nl', description='CUNEIFORM NUMERIC SIGN TWO ASH TENU' },
+ [0x1244B] = { unicodeslot=0x1244B, category='nl', description='CUNEIFORM NUMERIC SIGN THREE ASH TENU' },
+ [0x1244C] = { unicodeslot=0x1244C, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR ASH TENU' },
+ [0x1244D] = { unicodeslot=0x1244D, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE ASH TENU' },
+ [0x1244E] = { unicodeslot=0x1244E, category='nl', description='CUNEIFORM NUMERIC SIGN SIX ASH TENU' },
+ [0x1244F] = { unicodeslot=0x1244F, category='nl', description='CUNEIFORM NUMERIC SIGN ONE BAN2' },
+ [0x12450] = { unicodeslot=0x12450, category='nl', description='CUNEIFORM NUMERIC SIGN TWO BAN2' },
+ [0x12451] = { unicodeslot=0x12451, category='nl', description='CUNEIFORM NUMERIC SIGN THREE BAN2' },
+ [0x12452] = { unicodeslot=0x12452, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR BAN2' },
+ [0x12453] = { unicodeslot=0x12453, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM' },
+ [0x12454] = { unicodeslot=0x12454, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE BAN2' },
+ [0x12455] = { unicodeslot=0x12455, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM' },
+ [0x12456] = { unicodeslot=0x12456, category='nl', description='CUNEIFORM NUMERIC SIGN NIGIDAMIN' },
+ [0x12457] = { unicodeslot=0x12457, category='nl', description='CUNEIFORM NUMERIC SIGN NIGIDAESH' },
+ [0x12458] = { unicodeslot=0x12458, category='nl', description='CUNEIFORM NUMERIC SIGN ONE ESHE3' },
+ [0x12459] = { unicodeslot=0x12459, category='nl', description='CUNEIFORM NUMERIC SIGN TWO ESHE3' },
+ [0x1245A] = { unicodeslot=0x1245A, category='nl', description='CUNEIFORM NUMERIC SIGN ONE THIRD DISH' },
+ [0x1245B] = { unicodeslot=0x1245B, category='nl', description='CUNEIFORM NUMERIC SIGN TWO THIRDS DISH' },
+ [0x1245C] = { unicodeslot=0x1245C, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH' },
+ [0x1245D] = { unicodeslot=0x1245D, category='nl', description='CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A' },
+ [0x1245E] = { unicodeslot=0x1245E, category='nl', description='CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A' },
+ [0x1245F] = { unicodeslot=0x1245F, category='nl', description='CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH' },
+ [0x12460] = { unicodeslot=0x12460, category='nl', description='CUNEIFORM NUMERIC SIGN ONE QUARTER ASH' },
+ [0x12461] = { unicodeslot=0x12461, category='nl', description='CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH' },
+ [0x12462] = { unicodeslot=0x12462, category='nl', description='CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER' },
+ [0x12470] = { unicodeslot=0x12470, category='po', description='CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER' },
+ [0x12471] = { unicodeslot=0x12471, category='po', description='CUNEIFORM PUNCTUATION SIGN VERTICAL COLON' },
+ [0x12472] = { unicodeslot=0x12472, category='po', description='CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON' },
+ [0x12473] = { unicodeslot=0x12473, category='po', description='CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON' },
+ [0x1D000] = { unicodeslot=0x1D000, category='so', description='BYZANTINE MUSICAL SYMBOL PSILI' },
+ [0x1D001] = { unicodeslot=0x1D001, category='so', description='BYZANTINE MUSICAL SYMBOL DASEIA' },
+ [0x1D002] = { unicodeslot=0x1D002, category='so', description='BYZANTINE MUSICAL SYMBOL PERISPOMENI' },
+ [0x1D003] = { unicodeslot=0x1D003, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON' },
+ [0x1D004] = { unicodeslot=0x1D004, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIA DIPLI' },
+ [0x1D005] = { unicodeslot=0x1D005, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON' },
+ [0x1D006] = { unicodeslot=0x1D006, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIA DIPLI' },
+ [0x1D007] = { unicodeslot=0x1D007, category='so', description='BYZANTINE MUSICAL SYMBOL KATHISTI' },
+ [0x1D008] = { unicodeslot=0x1D008, category='so', description='BYZANTINE MUSICAL SYMBOL SYRMATIKI' },
+ [0x1D009] = { unicodeslot=0x1D009, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKLITIKI' },
+ [0x1D00A] = { unicodeslot=0x1D00A, category='so', description='BYZANTINE MUSICAL SYMBOL YPOKRISIS' },
+ [0x1D00B] = { unicodeslot=0x1D00B, category='so', description='BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI' },
+ [0x1D00C] = { unicodeslot=0x1D00C, category='so', description='BYZANTINE MUSICAL SYMBOL KREMASTI' },
+ [0x1D00D] = { unicodeslot=0x1D00D, category='so', description='BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON' },
+ [0x1D00E] = { unicodeslot=0x1D00E, category='so', description='BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON' },
+ [0x1D00F] = { unicodeslot=0x1D00F, category='so', description='BYZANTINE MUSICAL SYMBOL TELEIA' },
+ [0x1D010] = { unicodeslot=0x1D010, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA' },
+ [0x1D011] = { unicodeslot=0x1D011, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOS' },
+ [0x1D012] = { unicodeslot=0x1D012, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI' },
+ [0x1D013] = { unicodeslot=0x1D013, category='so', description='BYZANTINE MUSICAL SYMBOL SYNEVMA' },
+ [0x1D014] = { unicodeslot=0x1D014, category='so', description='BYZANTINE MUSICAL SYMBOL THITA' },
+ [0x1D015] = { unicodeslot=0x1D015, category='so', description='BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION' },
+ [0x1D016] = { unicodeslot=0x1D016, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON ARCHAION' },
+ [0x1D017] = { unicodeslot=0x1D017, category='so', description='BYZANTINE MUSICAL SYMBOL PSILON' },
+ [0x1D018] = { unicodeslot=0x1D018, category='so', description='BYZANTINE MUSICAL SYMBOL CHAMILON' },
+ [0x1D019] = { unicodeslot=0x1D019, category='so', description='BYZANTINE MUSICAL SYMBOL VATHY' },
+ [0x1D01A] = { unicodeslot=0x1D01A, category='so', description='BYZANTINE MUSICAL SYMBOL ISON ARCHAION' },
+ [0x1D01B] = { unicodeslot=0x1D01B, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION' },
+ [0x1D01C] = { unicodeslot=0x1D01C, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION' },
+ [0x1D01D] = { unicodeslot=0x1D01D, category='so', description='BYZANTINE MUSICAL SYMBOL SAXIMATA' },
+ [0x1D01E] = { unicodeslot=0x1D01E, category='so', description='BYZANTINE MUSICAL SYMBOL PARICHON' },
+ [0x1D01F] = { unicodeslot=0x1D01F, category='so', description='BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA' },
+ [0x1D020] = { unicodeslot=0x1D020, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION' },
+ [0x1D021] = { unicodeslot=0x1D021, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION' },
+ [0x1D022] = { unicodeslot=0x1D022, category='so', description='BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION' },
+ [0x1D023] = { unicodeslot=0x1D023, category='so', description='BYZANTINE MUSICAL SYMBOL APOTHEMA' },
+ [0x1D024] = { unicodeslot=0x1D024, category='so', description='BYZANTINE MUSICAL SYMBOL KLASMA' },
+ [0x1D025] = { unicodeslot=0x1D025, category='so', description='BYZANTINE MUSICAL SYMBOL REVMA' },
+ [0x1D026] = { unicodeslot=0x1D026, category='so', description='BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION' },
+ [0x1D027] = { unicodeslot=0x1D027, category='so', description='BYZANTINE MUSICAL SYMBOL TINAGMA' },
+ [0x1D028] = { unicodeslot=0x1D028, category='so', description='BYZANTINE MUSICAL SYMBOL ANATRICHISMA' },
+ [0x1D029] = { unicodeslot=0x1D029, category='so', description='BYZANTINE MUSICAL SYMBOL SEISMA' },
+ [0x1D02A] = { unicodeslot=0x1D02A, category='so', description='BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION' },
+ [0x1D02B] = { unicodeslot=0x1D02B, category='so', description='BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU' },
+ [0x1D02C] = { unicodeslot=0x1D02C, category='so', description='BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION' },
+ [0x1D02D] = { unicodeslot=0x1D02D, category='so', description='BYZANTINE MUSICAL SYMBOL THEMA' },
+ [0x1D02E] = { unicodeslot=0x1D02E, category='so', description='BYZANTINE MUSICAL SYMBOL LEMOI' },
+ [0x1D02F] = { unicodeslot=0x1D02F, category='so', description='BYZANTINE MUSICAL SYMBOL DYO' },
+ [0x1D030] = { unicodeslot=0x1D030, category='so', description='BYZANTINE MUSICAL SYMBOL TRIA' },
+ [0x1D031] = { unicodeslot=0x1D031, category='so', description='BYZANTINE MUSICAL SYMBOL TESSERA' },
+ [0x1D032] = { unicodeslot=0x1D032, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMATA' },
+ [0x1D033] = { unicodeslot=0x1D033, category='so', description='BYZANTINE MUSICAL SYMBOL APESO EXO NEO' },
+ [0x1D034] = { unicodeslot=0x1D034, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION' },
+ [0x1D035] = { unicodeslot=0x1D035, category='so', description='BYZANTINE MUSICAL SYMBOL IMIFTHORA' },
+ [0x1D036] = { unicodeslot=0x1D036, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION' },
+ [0x1D037] = { unicodeslot=0x1D037, category='so', description='BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON' },
+ [0x1D038] = { unicodeslot=0x1D038, category='so', description='BYZANTINE MUSICAL SYMBOL PELASTON' },
+ [0x1D039] = { unicodeslot=0x1D039, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTON' },
+ [0x1D03A] = { unicodeslot=0x1D03A, category='so', description='BYZANTINE MUSICAL SYMBOL KONTEVMA' },
+ [0x1D03B] = { unicodeslot=0x1D03B, category='so', description='BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION' },
+ [0x1D03C] = { unicodeslot=0x1D03C, category='so', description='BYZANTINE MUSICAL SYMBOL RAPISMA' },
+ [0x1D03D] = { unicodeslot=0x1D03D, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION' },
+ [0x1D03E] = { unicodeslot=0x1D03E, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION' },
+ [0x1D03F] = { unicodeslot=0x1D03F, category='so', description='BYZANTINE MUSICAL SYMBOL ICHADIN' },
+ [0x1D040] = { unicodeslot=0x1D040, category='so', description='BYZANTINE MUSICAL SYMBOL NANA' },
+ [0x1D041] = { unicodeslot=0x1D041, category='so', description='BYZANTINE MUSICAL SYMBOL PETASMA' },
+ [0x1D042] = { unicodeslot=0x1D042, category='so', description='BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO' },
+ [0x1D043] = { unicodeslot=0x1D043, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKON ALLO' },
+ [0x1D044] = { unicodeslot=0x1D044, category='so', description='BYZANTINE MUSICAL SYMBOL STRAGGISMATA' },
+ [0x1D045] = { unicodeslot=0x1D045, category='so', description='BYZANTINE MUSICAL SYMBOL GRONTHISMATA' },
+ [0x1D046] = { unicodeslot=0x1D046, category='so', description='BYZANTINE MUSICAL SYMBOL ISON NEO' },
+ [0x1D047] = { unicodeslot=0x1D047, category='so', description='BYZANTINE MUSICAL SYMBOL OLIGON NEO' },
+ [0x1D048] = { unicodeslot=0x1D048, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIA NEO' },
+ [0x1D049] = { unicodeslot=0x1D049, category='so', description='BYZANTINE MUSICAL SYMBOL PETASTI' },
+ [0x1D04A] = { unicodeslot=0x1D04A, category='so', description='BYZANTINE MUSICAL SYMBOL KOUFISMA' },
+ [0x1D04B] = { unicodeslot=0x1D04B, category='so', description='BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA' },
+ [0x1D04C] = { unicodeslot=0x1D04C, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA' },
+ [0x1D04D] = { unicodeslot=0x1D04D, category='so', description='BYZANTINE MUSICAL SYMBOL PELASTON NEO' },
+ [0x1D04E] = { unicodeslot=0x1D04E, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO' },
+ [0x1D04F] = { unicodeslot=0x1D04F, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO' },
+ [0x1D050] = { unicodeslot=0x1D050, category='so', description='BYZANTINE MUSICAL SYMBOL YPSILI' },
+ [0x1D051] = { unicodeslot=0x1D051, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO' },
+ [0x1D052] = { unicodeslot=0x1D052, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO' },
+ [0x1D053] = { unicodeslot=0x1D053, category='so', description='BYZANTINE MUSICAL SYMBOL YPORROI' },
+ [0x1D054] = { unicodeslot=0x1D054, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON' },
+ [0x1D055] = { unicodeslot=0x1D055, category='so', description='BYZANTINE MUSICAL SYMBOL ELAFRON' },
+ [0x1D056] = { unicodeslot=0x1D056, category='so', description='BYZANTINE MUSICAL SYMBOL CHAMILI' },
+ [0x1D057] = { unicodeslot=0x1D057, category='so', description='BYZANTINE MUSICAL SYMBOL MIKRON ISON' },
+ [0x1D058] = { unicodeslot=0x1D058, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIA NEO' },
+ [0x1D059] = { unicodeslot=0x1D059, category='so', description='BYZANTINE MUSICAL SYMBOL PIASMA NEO' },
+ [0x1D05A] = { unicodeslot=0x1D05A, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTON NEO' },
+ [0x1D05B] = { unicodeslot=0x1D05B, category='so', description='BYZANTINE MUSICAL SYMBOL OMALON' },
+ [0x1D05C] = { unicodeslot=0x1D05C, category='so', description='BYZANTINE MUSICAL SYMBOL ANTIKENOMA' },
+ [0x1D05D] = { unicodeslot=0x1D05D, category='so', description='BYZANTINE MUSICAL SYMBOL LYGISMA' },
+ [0x1D05E] = { unicodeslot=0x1D05E, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO' },
+ [0x1D05F] = { unicodeslot=0x1D05F, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO' },
+ [0x1D060] = { unicodeslot=0x1D060, category='so', description='BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA' },
+ [0x1D061] = { unicodeslot=0x1D061, category='so', description='BYZANTINE MUSICAL SYMBOL KYLISMA' },
+ [0x1D062] = { unicodeslot=0x1D062, category='so', description='BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA' },
+ [0x1D063] = { unicodeslot=0x1D063, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKON NEO' },
+ [0x1D064] = { unicodeslot=0x1D064, category='so', description='BYZANTINE MUSICAL SYMBOL EKSTREPTON' },
+ [0x1D065] = { unicodeslot=0x1D065, category='so', description='BYZANTINE MUSICAL SYMBOL SYNAGMA NEO' },
+ [0x1D066] = { unicodeslot=0x1D066, category='so', description='BYZANTINE MUSICAL SYMBOL SYRMA' },
+ [0x1D067] = { unicodeslot=0x1D067, category='so', description='BYZANTINE MUSICAL SYMBOL CHOREVMA NEO' },
+ [0x1D068] = { unicodeslot=0x1D068, category='so', description='BYZANTINE MUSICAL SYMBOL EPEGERMA' },
+ [0x1D069] = { unicodeslot=0x1D069, category='so', description='BYZANTINE MUSICAL SYMBOL SEISMA NEO' },
+ [0x1D06A] = { unicodeslot=0x1D06A, category='so', description='BYZANTINE MUSICAL SYMBOL XIRON KLASMA' },
+ [0x1D06B] = { unicodeslot=0x1D06B, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON' },
+ [0x1D06C] = { unicodeslot=0x1D06C, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA' },
+ [0x1D06D] = { unicodeslot=0x1D06D, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA' },
+ [0x1D06E] = { unicodeslot=0x1D06E, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA' },
+ [0x1D06F] = { unicodeslot=0x1D06F, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA' },
+ [0x1D070] = { unicodeslot=0x1D070, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA' },
+ [0x1D071] = { unicodeslot=0x1D071, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA' },
+ [0x1D072] = { unicodeslot=0x1D072, category='so', description='BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON' },
+ [0x1D073] = { unicodeslot=0x1D073, category='so', description='BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON' },
+ [0x1D074] = { unicodeslot=0x1D074, category='so', description='BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON' },
+ [0x1D075] = { unicodeslot=0x1D075, category='so', description='BYZANTINE MUSICAL SYMBOL OYRANISMA NEO' },
+ [0x1D076] = { unicodeslot=0x1D076, category='so', description='BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO' },
+ [0x1D077] = { unicodeslot=0x1D077, category='so', description='BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO' },
+ [0x1D078] = { unicodeslot=0x1D078, category='so', description='BYZANTINE MUSICAL SYMBOL THEMA APLOUN' },
+ [0x1D079] = { unicodeslot=0x1D079, category='so', description='BYZANTINE MUSICAL SYMBOL THES KAI APOTHES' },
+ [0x1D07A] = { unicodeslot=0x1D07A, category='so', description='BYZANTINE MUSICAL SYMBOL KATAVASMA' },
+ [0x1D07B] = { unicodeslot=0x1D07B, category='so', description='BYZANTINE MUSICAL SYMBOL ENDOFONON' },
+ [0x1D07C] = { unicodeslot=0x1D07C, category='so', description='BYZANTINE MUSICAL SYMBOL YFEN KATO' },
+ [0x1D07D] = { unicodeslot=0x1D07D, category='so', description='BYZANTINE MUSICAL SYMBOL YFEN ANO' },
+ [0x1D07E] = { unicodeslot=0x1D07E, category='so', description='BYZANTINE MUSICAL SYMBOL STAVROS' },
+ [0x1D07F] = { unicodeslot=0x1D07F, category='so', description='BYZANTINE MUSICAL SYMBOL KLASMA ANO' },
+ [0x1D080] = { unicodeslot=0x1D080, category='so', description='BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION' },
+ [0x1D081] = { unicodeslot=0x1D081, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION' },
+ [0x1D082] = { unicodeslot=0x1D082, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMA ALLO' },
+ [0x1D083] = { unicodeslot=0x1D083, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMA NEO' },
+ [0x1D084] = { unicodeslot=0x1D084, category='so', description='BYZANTINE MUSICAL SYMBOL APODERMA NEO' },
+ [0x1D085] = { unicodeslot=0x1D085, category='so', description='BYZANTINE MUSICAL SYMBOL APLI' },
+ [0x1D086] = { unicodeslot=0x1D086, category='so', description='BYZANTINE MUSICAL SYMBOL DIPLI' },
+ [0x1D087] = { unicodeslot=0x1D087, category='so', description='BYZANTINE MUSICAL SYMBOL TRIPLI' },
+ [0x1D088] = { unicodeslot=0x1D088, category='so', description='BYZANTINE MUSICAL SYMBOL TETRAPLI' },
+ [0x1D089] = { unicodeslot=0x1D089, category='so', description='BYZANTINE MUSICAL SYMBOL KORONIS' },
+ [0x1D08A] = { unicodeslot=0x1D08A, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU' },
+ [0x1D08B] = { unicodeslot=0x1D08B, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON' },
+ [0x1D08C] = { unicodeslot=0x1D08C, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON' },
+ [0x1D08D] = { unicodeslot=0x1D08D, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON' },
+ [0x1D08E] = { unicodeslot=0x1D08E, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU' },
+ [0x1D08F] = { unicodeslot=0x1D08F, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON NEO ANO' },
+ [0x1D090] = { unicodeslot=0x1D090, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA' },
+ [0x1D091] = { unicodeslot=0x1D091, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA' },
+ [0x1D092] = { unicodeslot=0x1D092, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON' },
+ [0x1D093] = { unicodeslot=0x1D093, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO' },
+ [0x1D094] = { unicodeslot=0x1D094, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO' },
+ [0x1D095] = { unicodeslot=0x1D095, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA' },
+ [0x1D096] = { unicodeslot=0x1D096, category='so', description='BYZANTINE MUSICAL SYMBOL TRIGORGON' },
+ [0x1D097] = { unicodeslot=0x1D097, category='so', description='BYZANTINE MUSICAL SYMBOL ARGON' },
+ [0x1D098] = { unicodeslot=0x1D098, category='so', description='BYZANTINE MUSICAL SYMBOL IMIDIARGON' },
+ [0x1D099] = { unicodeslot=0x1D099, category='so', description='BYZANTINE MUSICAL SYMBOL DIARGON' },
+ [0x1D09A] = { unicodeslot=0x1D09A, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI' },
+ [0x1D09B] = { unicodeslot=0x1D09B, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI' },
+ [0x1D09C] = { unicodeslot=0x1D09C, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI ARGI' },
+ [0x1D09D] = { unicodeslot=0x1D09D, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI METRIA' },
+ [0x1D09E] = { unicodeslot=0x1D09E, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI MESI' },
+ [0x1D09F] = { unicodeslot=0x1D09F, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI GORGI' },
+ [0x1D0A0] = { unicodeslot=0x1D0A0, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI' },
+ [0x1D0A1] = { unicodeslot=0x1D0A1, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI' },
+ [0x1D0A2] = { unicodeslot=0x1D0A2, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS' },
+ [0x1D0A3] = { unicodeslot=0x1D0A3, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS' },
+ [0x1D0A4] = { unicodeslot=0x1D0A4, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS' },
+ [0x1D0A5] = { unicodeslot=0x1D0A5, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS' },
+ [0x1D0A6] = { unicodeslot=0x1D0A6, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS' },
+ [0x1D0A7] = { unicodeslot=0x1D0A7, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS' },
+ [0x1D0A8] = { unicodeslot=0x1D0A8, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS' },
+ [0x1D0A9] = { unicodeslot=0x1D0A9, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS' },
+ [0x1D0AA] = { unicodeslot=0x1D0AA, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS' },
+ [0x1D0AB] = { unicodeslot=0x1D0AB, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS' },
+ [0x1D0AC] = { unicodeslot=0x1D0AC, category='so', description='BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS' },
+ [0x1D0AD] = { unicodeslot=0x1D0AD, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS' },
+ [0x1D0AE] = { unicodeslot=0x1D0AE, category='so', description='BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS' },
+ [0x1D0AF] = { unicodeslot=0x1D0AF, category='so', description='BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS' },
+ [0x1D0B0] = { unicodeslot=0x1D0B0, category='so', description='BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS' },
+ [0x1D0B1] = { unicodeslot=0x1D0B1, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS' },
+ [0x1D0B2] = { unicodeslot=0x1D0B2, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS' },
+ [0x1D0B3] = { unicodeslot=0x1D0B3, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS' },
+ [0x1D0B4] = { unicodeslot=0x1D0B4, category='so', description='BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN' },
+ [0x1D0B5] = { unicodeslot=0x1D0B5, category='so', description='BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN' },
+ [0x1D0B6] = { unicodeslot=0x1D0B6, category='so', description='BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU' },
+ [0x1D0B7] = { unicodeslot=0x1D0B7, category='so', description='BYZANTINE MUSICAL SYMBOL IMIFONON' },
+ [0x1D0B8] = { unicodeslot=0x1D0B8, category='so', description='BYZANTINE MUSICAL SYMBOL IMIFTHORON' },
+ [0x1D0B9] = { unicodeslot=0x1D0B9, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU' },
+ [0x1D0BA] = { unicodeslot=0x1D0BA, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA' },
+ [0x1D0BB] = { unicodeslot=0x1D0BB, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA' },
+ [0x1D0BC] = { unicodeslot=0x1D0BC, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS' },
+ [0x1D0BD] = { unicodeslot=0x1D0BD, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI' },
+ [0x1D0BE] = { unicodeslot=0x1D0BE, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI' },
+ [0x1D0BF] = { unicodeslot=0x1D0BF, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE' },
+ [0x1D0C0] = { unicodeslot=0x1D0C0, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO' },
+ [0x1D0C1] = { unicodeslot=0x1D0C1, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO' },
+ [0x1D0C2] = { unicodeslot=0x1D0C2, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO' },
+ [0x1D0C3] = { unicodeslot=0x1D0C3, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS' },
+ [0x1D0C4] = { unicodeslot=0x1D0C4, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS' },
+ [0x1D0C5] = { unicodeslot=0x1D0C5, category='so', description='BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS' },
+ [0x1D0C6] = { unicodeslot=0x1D0C6, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI' },
+ [0x1D0C7] = { unicodeslot=0x1D0C7, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA NENANO' },
+ [0x1D0C8] = { unicodeslot=0x1D0C8, category='so', description='BYZANTINE MUSICAL SYMBOL CHROA ZYGOS' },
+ [0x1D0C9] = { unicodeslot=0x1D0C9, category='so', description='BYZANTINE MUSICAL SYMBOL CHROA KLITON' },
+ [0x1D0CA] = { unicodeslot=0x1D0CA, category='so', description='BYZANTINE MUSICAL SYMBOL CHROA SPATHI' },
+ [0x1D0CB] = { unicodeslot=0x1D0CB, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION' },
+ [0x1D0CC] = { unicodeslot=0x1D0CC, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA' },
+ [0x1D0CD] = { unicodeslot=0x1D0CD, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION' },
+ [0x1D0CE] = { unicodeslot=0x1D0CE, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION' },
+ [0x1D0CF] = { unicodeslot=0x1D0CF, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION' },
+ [0x1D0D0] = { unicodeslot=0x1D0D0, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA' },
+ [0x1D0D1] = { unicodeslot=0x1D0D1, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA' },
+ [0x1D0D2] = { unicodeslot=0x1D0D2, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA' },
+ [0x1D0D3] = { unicodeslot=0x1D0D3, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA' },
+ [0x1D0D4] = { unicodeslot=0x1D0D4, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA' },
+ [0x1D0D5] = { unicodeslot=0x1D0D5, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA' },
+ [0x1D0D6] = { unicodeslot=0x1D0D6, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA' },
+ [0x1D0D7] = { unicodeslot=0x1D0D7, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA' },
+ [0x1D0D8] = { unicodeslot=0x1D0D8, category='so', description='BYZANTINE MUSICAL SYMBOL GENIKI DIESIS' },
+ [0x1D0D9] = { unicodeslot=0x1D0D9, category='so', description='BYZANTINE MUSICAL SYMBOL GENIKI YFESIS' },
+ [0x1D0DA] = { unicodeslot=0x1D0DA, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI' },
+ [0x1D0DB] = { unicodeslot=0x1D0DB, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI' },
+ [0x1D0DC] = { unicodeslot=0x1D0DC, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI' },
+ [0x1D0DD] = { unicodeslot=0x1D0DD, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS' },
+ [0x1D0DE] = { unicodeslot=0x1D0DE, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS' },
+ [0x1D0DF] = { unicodeslot=0x1D0DF, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU' },
+ [0x1D0E0] = { unicodeslot=0x1D0E0, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU' },
+ [0x1D0E1] = { unicodeslot=0x1D0E1, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU' },
+ [0x1D0E2] = { unicodeslot=0x1D0E2, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS' },
+ [0x1D0E3] = { unicodeslot=0x1D0E3, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU' },
+ [0x1D0E4] = { unicodeslot=0x1D0E4, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU' },
+ [0x1D0E5] = { unicodeslot=0x1D0E5, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU' },
+ [0x1D0E6] = { unicodeslot=0x1D0E6, category='so', description='BYZANTINE MUSICAL SYMBOL DIGRAMMA GG' },
+ [0x1D0E7] = { unicodeslot=0x1D0E7, category='so', description='BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU' },
+ [0x1D0E8] = { unicodeslot=0x1D0E8, category='so', description='BYZANTINE MUSICAL SYMBOL STIGMA' },
+ [0x1D0E9] = { unicodeslot=0x1D0E9, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO PA' },
+ [0x1D0EA] = { unicodeslot=0x1D0EA, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO VOU' },
+ [0x1D0EB] = { unicodeslot=0x1D0EB, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO GA' },
+ [0x1D0EC] = { unicodeslot=0x1D0EC, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO DI' },
+ [0x1D0ED] = { unicodeslot=0x1D0ED, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO KE' },
+ [0x1D0EE] = { unicodeslot=0x1D0EE, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO ZO' },
+ [0x1D0EF] = { unicodeslot=0x1D0EF, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO NI' },
+ [0x1D0F0] = { unicodeslot=0x1D0F0, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO' },
+ [0x1D0F1] = { unicodeslot=0x1D0F1, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO' },
+ [0x1D0F2] = { unicodeslot=0x1D0F2, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO' },
+ [0x1D0F3] = { unicodeslot=0x1D0F3, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO' },
+ [0x1D0F4] = { unicodeslot=0x1D0F4, category='so', description='BYZANTINE MUSICAL SYMBOL KLASMA KATO' },
+ [0x1D0F5] = { unicodeslot=0x1D0F5, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON NEO KATO' },
+ [0x1D100] = { unicodeslot=0x1D100, category='so', description='MUSICAL SYMBOL SINGLE BARLINE' },
+ [0x1D101] = { unicodeslot=0x1D101, category='so', description='MUSICAL SYMBOL DOUBLE BARLINE' },
+ [0x1D102] = { unicodeslot=0x1D102, category='so', description='MUSICAL SYMBOL FINAL BARLINE' },
+ [0x1D103] = { unicodeslot=0x1D103, category='so', description='MUSICAL SYMBOL REVERSE FINAL BARLINE' },
+ [0x1D104] = { unicodeslot=0x1D104, category='so', description='MUSICAL SYMBOL DASHED BARLINE' },
+ [0x1D105] = { unicodeslot=0x1D105, category='so', description='MUSICAL SYMBOL SHORT BARLINE' },
+ [0x1D106] = { unicodeslot=0x1D106, category='so', description='MUSICAL SYMBOL LEFT REPEAT SIGN' },
+ [0x1D107] = { unicodeslot=0x1D107, category='so', description='MUSICAL SYMBOL RIGHT REPEAT SIGN' },
+ [0x1D108] = { unicodeslot=0x1D108, category='so', description='MUSICAL SYMBOL REPEAT DOTS' },
+ [0x1D109] = { unicodeslot=0x1D109, category='so', description='MUSICAL SYMBOL DAL SEGNO' },
+ [0x1D10A] = { unicodeslot=0x1D10A, category='so', description='MUSICAL SYMBOL DA CAPO' },
+ [0x1D10B] = { unicodeslot=0x1D10B, category='so', description='MUSICAL SYMBOL SEGNO' },
+ [0x1D10C] = { unicodeslot=0x1D10C, category='so', description='MUSICAL SYMBOL CODA' },
+ [0x1D10D] = { unicodeslot=0x1D10D, category='so', description='MUSICAL SYMBOL REPEATED FIGURE-1' },
+ [0x1D10E] = { unicodeslot=0x1D10E, category='so', description='MUSICAL SYMBOL REPEATED FIGURE-2' },
+ [0x1D10F] = { unicodeslot=0x1D10F, category='so', description='MUSICAL SYMBOL REPEATED FIGURE-3' },
+ [0x1D110] = { unicodeslot=0x1D110, category='so', description='MUSICAL SYMBOL FERMATA' },
+ [0x1D111] = { unicodeslot=0x1D111, category='so', description='MUSICAL SYMBOL FERMATA BELOW' },
+ [0x1D112] = { unicodeslot=0x1D112, category='so', description='MUSICAL SYMBOL BREATH MARK' },
+ [0x1D113] = { unicodeslot=0x1D113, category='so', description='MUSICAL SYMBOL CAESURA' },
+ [0x1D114] = { unicodeslot=0x1D114, category='so', description='MUSICAL SYMBOL BRACE' },
+ [0x1D115] = { unicodeslot=0x1D115, category='so', description='MUSICAL SYMBOL BRACKET' },
+ [0x1D116] = { unicodeslot=0x1D116, category='so', description='MUSICAL SYMBOL ONE-LINE STAFF' },
+ [0x1D117] = { unicodeslot=0x1D117, category='so', description='MUSICAL SYMBOL TWO-LINE STAFF' },
+ [0x1D118] = { unicodeslot=0x1D118, category='so', description='MUSICAL SYMBOL THREE-LINE STAFF' },
+ [0x1D119] = { unicodeslot=0x1D119, category='so', description='MUSICAL SYMBOL FOUR-LINE STAFF' },
+ [0x1D11A] = { unicodeslot=0x1D11A, category='so', description='MUSICAL SYMBOL FIVE-LINE STAFF' },
+ [0x1D11B] = { unicodeslot=0x1D11B, category='so', description='MUSICAL SYMBOL SIX-LINE STAFF' },
+ [0x1D11C] = { unicodeslot=0x1D11C, category='so', description='MUSICAL SYMBOL SIX-STRING FRETBOARD' },
+ [0x1D11D] = { unicodeslot=0x1D11D, category='so', description='MUSICAL SYMBOL FOUR-STRING FRETBOARD' },
+ [0x1D11E] = { unicodeslot=0x1D11E, category='so', description='MUSICAL SYMBOL G CLEF' },
+ [0x1D11F] = { unicodeslot=0x1D11F, category='so', description='MUSICAL SYMBOL G CLEF OTTAVA ALTA' },
+ [0x1D120] = { unicodeslot=0x1D120, category='so', description='MUSICAL SYMBOL G CLEF OTTAVA BASSA' },
+ [0x1D121] = { unicodeslot=0x1D121, category='so', description='MUSICAL SYMBOL C CLEF' },
+ [0x1D122] = { unicodeslot=0x1D122, category='so', description='MUSICAL SYMBOL F CLEF' },
+ [0x1D123] = { unicodeslot=0x1D123, category='so', description='MUSICAL SYMBOL F CLEF OTTAVA ALTA' },
+ [0x1D124] = { unicodeslot=0x1D124, category='so', description='MUSICAL SYMBOL F CLEF OTTAVA BASSA' },
+ [0x1D125] = { unicodeslot=0x1D125, category='so', description='MUSICAL SYMBOL DRUM CLEF-1' },
+ [0x1D126] = { unicodeslot=0x1D126, category='so', description='MUSICAL SYMBOL DRUM CLEF-2' },
+ [0x1D12A] = { unicodeslot=0x1D12A, category='so', description='MUSICAL SYMBOL DOUBLE SHARP' },
+ [0x1D12B] = { unicodeslot=0x1D12B, category='so', description='MUSICAL SYMBOL DOUBLE FLAT' },
+ [0x1D12C] = { unicodeslot=0x1D12C, category='so', description='MUSICAL SYMBOL FLAT UP' },
+ [0x1D12D] = { unicodeslot=0x1D12D, category='so', description='MUSICAL SYMBOL FLAT DOWN' },
+ [0x1D12E] = { unicodeslot=0x1D12E, category='so', description='MUSICAL SYMBOL NATURAL UP' },
+ [0x1D12F] = { unicodeslot=0x1D12F, category='so', description='MUSICAL SYMBOL NATURAL DOWN' },
+ [0x1D130] = { unicodeslot=0x1D130, category='so', description='MUSICAL SYMBOL SHARP UP' },
+ [0x1D131] = { unicodeslot=0x1D131, category='so', description='MUSICAL SYMBOL SHARP DOWN' },
+ [0x1D132] = { unicodeslot=0x1D132, category='so', description='MUSICAL SYMBOL QUARTER TONE SHARP' },
+ [0x1D133] = { unicodeslot=0x1D133, category='so', description='MUSICAL SYMBOL QUARTER TONE FLAT' },
+ [0x1D134] = { unicodeslot=0x1D134, category='so', description='MUSICAL SYMBOL COMMON TIME' },
+ [0x1D135] = { unicodeslot=0x1D135, category='so', description='MUSICAL SYMBOL CUT TIME' },
+ [0x1D136] = { unicodeslot=0x1D136, category='so', description='MUSICAL SYMBOL OTTAVA ALTA' },
+ [0x1D137] = { unicodeslot=0x1D137, category='so', description='MUSICAL SYMBOL OTTAVA BASSA' },
+ [0x1D138] = { unicodeslot=0x1D138, category='so', description='MUSICAL SYMBOL QUINDICESIMA ALTA' },
+ [0x1D139] = { unicodeslot=0x1D139, category='so', description='MUSICAL SYMBOL QUINDICESIMA BASSA' },
+ [0x1D13A] = { unicodeslot=0x1D13A, category='so', description='MUSICAL SYMBOL MULTI REST' },
+ [0x1D13B] = { unicodeslot=0x1D13B, category='so', description='MUSICAL SYMBOL WHOLE REST' },
+ [0x1D13C] = { unicodeslot=0x1D13C, category='so', description='MUSICAL SYMBOL HALF REST' },
+ [0x1D13D] = { unicodeslot=0x1D13D, category='so', description='MUSICAL SYMBOL QUARTER REST' },
+ [0x1D13E] = { unicodeslot=0x1D13E, category='so', description='MUSICAL SYMBOL EIGHTH REST' },
+ [0x1D13F] = { unicodeslot=0x1D13F, category='so', description='MUSICAL SYMBOL SIXTEENTH REST' },
+ [0x1D140] = { unicodeslot=0x1D140, category='so', description='MUSICAL SYMBOL THIRTY-SECOND REST' },
+ [0x1D141] = { unicodeslot=0x1D141, category='so', description='MUSICAL SYMBOL SIXTY-FOURTH REST' },
+ [0x1D142] = { unicodeslot=0x1D142, category='so', description='MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST' },
+ [0x1D143] = { unicodeslot=0x1D143, category='so', description='MUSICAL SYMBOL X NOTEHEAD' },
+ [0x1D144] = { unicodeslot=0x1D144, category='so', description='MUSICAL SYMBOL PLUS NOTEHEAD' },
+ [0x1D145] = { unicodeslot=0x1D145, category='so', description='MUSICAL SYMBOL CIRCLE X NOTEHEAD' },
+ [0x1D146] = { unicodeslot=0x1D146, category='so', description='MUSICAL SYMBOL SQUARE NOTEHEAD WHITE' },
+ [0x1D147] = { unicodeslot=0x1D147, category='so', description='MUSICAL SYMBOL SQUARE NOTEHEAD BLACK' },
+ [0x1D148] = { unicodeslot=0x1D148, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE' },
+ [0x1D149] = { unicodeslot=0x1D149, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK' },
+ [0x1D14A] = { unicodeslot=0x1D14A, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE' },
+ [0x1D14B] = { unicodeslot=0x1D14B, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK' },
+ [0x1D14C] = { unicodeslot=0x1D14C, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE' },
+ [0x1D14D] = { unicodeslot=0x1D14D, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK' },
+ [0x1D14E] = { unicodeslot=0x1D14E, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE' },
+ [0x1D14F] = { unicodeslot=0x1D14F, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK' },
+ [0x1D150] = { unicodeslot=0x1D150, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE' },
+ [0x1D151] = { unicodeslot=0x1D151, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK' },
+ [0x1D152] = { unicodeslot=0x1D152, category='so', description='MUSICAL SYMBOL MOON NOTEHEAD WHITE' },
+ [0x1D153] = { unicodeslot=0x1D153, category='so', description='MUSICAL SYMBOL MOON NOTEHEAD BLACK' },
+ [0x1D154] = { unicodeslot=0x1D154, category='so', description='MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE' },
+ [0x1D155] = { unicodeslot=0x1D155, category='so', description='MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK' },
+ [0x1D156] = { unicodeslot=0x1D156, category='so', description='MUSICAL SYMBOL PARENTHESIS NOTEHEAD' },
+ [0x1D157] = { unicodeslot=0x1D157, category='so', description='MUSICAL SYMBOL VOID NOTEHEAD' },
+ [0x1D158] = { unicodeslot=0x1D158, category='so', description='MUSICAL SYMBOL NOTEHEAD BLACK' },
+ [0x1D159] = { unicodeslot=0x1D159, category='so', description='MUSICAL SYMBOL NULL NOTEHEAD' },
+ [0x1D15A] = { unicodeslot=0x1D15A, category='so', description='MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE' },
+ [0x1D15B] = { unicodeslot=0x1D15B, category='so', description='MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK' },
+ [0x1D15C] = { unicodeslot=0x1D15C, category='so', description='MUSICAL SYMBOL BREVE' },
+ [0x1D15D] = { unicodeslot=0x1D15D, category='so', description='MUSICAL SYMBOL WHOLE NOTE' },
+ [0x1D15E] = { unicodeslot=0x1D15E, category='so', description='MUSICAL SYMBOL HALF NOTE', specials={'char',0x1D157,0x1D165} },
+ [0x1D15F] = { unicodeslot=0x1D15F, category='so', description='MUSICAL SYMBOL QUARTER NOTE', specials={'char',0x1D158,0x1D165} },
+ [0x1D160] = { unicodeslot=0x1D160, category='so', description='MUSICAL SYMBOL EIGHTH NOTE', specials={'char',0x1D15F,0x1D16E} },
+ [0x1D161] = { unicodeslot=0x1D161, category='so', description='MUSICAL SYMBOL SIXTEENTH NOTE', specials={'char',0x1D15F,0x1D16F} },
+ [0x1D162] = { unicodeslot=0x1D162, category='so', description='MUSICAL SYMBOL THIRTY-SECOND NOTE', specials={'char',0x1D15F,0x1D170} },
+ [0x1D163] = { unicodeslot=0x1D163, category='so', description='MUSICAL SYMBOL SIXTY-FOURTH NOTE', specials={'char',0x1D15F,0x1D171} },
+ [0x1D164] = { unicodeslot=0x1D164, category='so', description='MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE', specials={'char',0x1D15F,0x1D172} },
+ [0x1D165] = { unicodeslot=0x1D165, category='mc', description='MUSICAL SYMBOL COMBINING STEM' },
+ [0x1D166] = { unicodeslot=0x1D166, category='mc', description='MUSICAL SYMBOL COMBINING SPRECHGESANG STEM' },
+ [0x1D167] = { unicodeslot=0x1D167, category='mn', description='MUSICAL SYMBOL COMBINING TREMOLO-1' },
+ [0x1D168] = { unicodeslot=0x1D168, category='mn', description='MUSICAL SYMBOL COMBINING TREMOLO-2' },
+ [0x1D169] = { unicodeslot=0x1D169, category='mn', description='MUSICAL SYMBOL COMBINING TREMOLO-3' },
+ [0x1D16A] = { unicodeslot=0x1D16A, category='so', description='MUSICAL SYMBOL FINGERED TREMOLO-1' },
+ [0x1D16B] = { unicodeslot=0x1D16B, category='so', description='MUSICAL SYMBOL FINGERED TREMOLO-2' },
+ [0x1D16C] = { unicodeslot=0x1D16C, category='so', description='MUSICAL SYMBOL FINGERED TREMOLO-3' },
+ [0x1D16D] = { unicodeslot=0x1D16D, category='mc', description='MUSICAL SYMBOL COMBINING AUGMENTATION DOT' },
+ [0x1D16E] = { unicodeslot=0x1D16E, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-1' },
+ [0x1D16F] = { unicodeslot=0x1D16F, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-2' },
+ [0x1D170] = { unicodeslot=0x1D170, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-3' },
+ [0x1D171] = { unicodeslot=0x1D171, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-4' },
+ [0x1D172] = { unicodeslot=0x1D172, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-5' },
+ [0x1D173] = { unicodeslot=0x1D173, category='cf', description='MUSICAL SYMBOL BEGIN BEAM' },
+ [0x1D174] = { unicodeslot=0x1D174, category='cf', description='MUSICAL SYMBOL END BEAM' },
+ [0x1D175] = { unicodeslot=0x1D175, category='cf', description='MUSICAL SYMBOL BEGIN TIE' },
+ [0x1D176] = { unicodeslot=0x1D176, category='cf', description='MUSICAL SYMBOL END TIE' },
+ [0x1D177] = { unicodeslot=0x1D177, category='cf', description='MUSICAL SYMBOL BEGIN SLUR' },
+ [0x1D178] = { unicodeslot=0x1D178, category='cf', description='MUSICAL SYMBOL END SLUR' },
+ [0x1D179] = { unicodeslot=0x1D179, category='cf', description='MUSICAL SYMBOL BEGIN PHRASE' },
+ [0x1D17A] = { unicodeslot=0x1D17A, category='cf', description='MUSICAL SYMBOL END PHRASE' },
+ [0x1D17B] = { unicodeslot=0x1D17B, category='mn', description='MUSICAL SYMBOL COMBINING ACCENT' },
+ [0x1D17C] = { unicodeslot=0x1D17C, category='mn', description='MUSICAL SYMBOL COMBINING STACCATO' },
+ [0x1D17D] = { unicodeslot=0x1D17D, category='mn', description='MUSICAL SYMBOL COMBINING TENUTO' },
+ [0x1D17E] = { unicodeslot=0x1D17E, category='mn', description='MUSICAL SYMBOL COMBINING STACCATISSIMO' },
+ [0x1D17F] = { unicodeslot=0x1D17F, category='mn', description='MUSICAL SYMBOL COMBINING MARCATO' },
+ [0x1D180] = { unicodeslot=0x1D180, category='mn', description='MUSICAL SYMBOL COMBINING MARCATO-STACCATO' },
+ [0x1D181] = { unicodeslot=0x1D181, category='mn', description='MUSICAL SYMBOL COMBINING ACCENT-STACCATO' },
+ [0x1D182] = { unicodeslot=0x1D182, category='mn', description='MUSICAL SYMBOL COMBINING LOURE' },
+ [0x1D183] = { unicodeslot=0x1D183, category='so', description='MUSICAL SYMBOL ARPEGGIATO UP' },
+ [0x1D184] = { unicodeslot=0x1D184, category='so', description='MUSICAL SYMBOL ARPEGGIATO DOWN' },
+ [0x1D185] = { unicodeslot=0x1D185, category='mn', description='MUSICAL SYMBOL COMBINING DOIT' },
+ [0x1D186] = { unicodeslot=0x1D186, category='mn', description='MUSICAL SYMBOL COMBINING RIP' },
+ [0x1D187] = { unicodeslot=0x1D187, category='mn', description='MUSICAL SYMBOL COMBINING FLIP' },
+ [0x1D188] = { unicodeslot=0x1D188, category='mn', description='MUSICAL SYMBOL COMBINING SMEAR' },
+ [0x1D189] = { unicodeslot=0x1D189, category='mn', description='MUSICAL SYMBOL COMBINING BEND' },
+ [0x1D18A] = { unicodeslot=0x1D18A, category='mn', description='MUSICAL SYMBOL COMBINING DOUBLE TONGUE' },
+ [0x1D18B] = { unicodeslot=0x1D18B, category='mn', description='MUSICAL SYMBOL COMBINING TRIPLE TONGUE' },
+ [0x1D18C] = { unicodeslot=0x1D18C, category='so', description='MUSICAL SYMBOL RINFORZANDO' },
+ [0x1D18D] = { unicodeslot=0x1D18D, category='so', description='MUSICAL SYMBOL SUBITO' },
+ [0x1D18E] = { unicodeslot=0x1D18E, category='so', description='MUSICAL SYMBOL Z' },
+ [0x1D18F] = { unicodeslot=0x1D18F, category='so', description='MUSICAL SYMBOL PIANO' },
+ [0x1D190] = { unicodeslot=0x1D190, category='so', description='MUSICAL SYMBOL MEZZO' },
+ [0x1D191] = { unicodeslot=0x1D191, category='so', description='MUSICAL SYMBOL FORTE' },
+ [0x1D192] = { unicodeslot=0x1D192, category='so', description='MUSICAL SYMBOL CRESCENDO' },
+ [0x1D193] = { unicodeslot=0x1D193, category='so', description='MUSICAL SYMBOL DECRESCENDO' },
+ [0x1D194] = { unicodeslot=0x1D194, category='so', description='MUSICAL SYMBOL GRACE NOTE SLASH' },
+ [0x1D195] = { unicodeslot=0x1D195, category='so', description='MUSICAL SYMBOL GRACE NOTE NO SLASH' },
+ [0x1D196] = { unicodeslot=0x1D196, category='so', description='MUSICAL SYMBOL TR' },
+ [0x1D197] = { unicodeslot=0x1D197, category='so', description='MUSICAL SYMBOL TURN' },
+ [0x1D198] = { unicodeslot=0x1D198, category='so', description='MUSICAL SYMBOL INVERTED TURN' },
+ [0x1D199] = { unicodeslot=0x1D199, category='so', description='MUSICAL SYMBOL TURN SLASH' },
+ [0x1D19A] = { unicodeslot=0x1D19A, category='so', description='MUSICAL SYMBOL TURN UP' },
+ [0x1D19B] = { unicodeslot=0x1D19B, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-1' },
+ [0x1D19C] = { unicodeslot=0x1D19C, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-2' },
+ [0x1D19D] = { unicodeslot=0x1D19D, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-3' },
+ [0x1D19E] = { unicodeslot=0x1D19E, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-4' },
+ [0x1D19F] = { unicodeslot=0x1D19F, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-5' },
+ [0x1D1A0] = { unicodeslot=0x1D1A0, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-6' },
+ [0x1D1A1] = { unicodeslot=0x1D1A1, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-7' },
+ [0x1D1A2] = { unicodeslot=0x1D1A2, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-8' },
+ [0x1D1A3] = { unicodeslot=0x1D1A3, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-9' },
+ [0x1D1A4] = { unicodeslot=0x1D1A4, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-10' },
+ [0x1D1A5] = { unicodeslot=0x1D1A5, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-11' },
+ [0x1D1A6] = { unicodeslot=0x1D1A6, category='so', description='MUSICAL SYMBOL HAUPTSTIMME' },
+ [0x1D1A7] = { unicodeslot=0x1D1A7, category='so', description='MUSICAL SYMBOL NEBENSTIMME' },
+ [0x1D1A8] = { unicodeslot=0x1D1A8, category='so', description='MUSICAL SYMBOL END OF STIMME' },
+ [0x1D1A9] = { unicodeslot=0x1D1A9, category='so', description='MUSICAL SYMBOL DEGREE SLASH' },
+ [0x1D1AA] = { unicodeslot=0x1D1AA, category='mn', description='MUSICAL SYMBOL COMBINING DOWN BOW' },
+ [0x1D1AB] = { unicodeslot=0x1D1AB, category='mn', description='MUSICAL SYMBOL COMBINING UP BOW' },
+ [0x1D1AC] = { unicodeslot=0x1D1AC, category='mn', description='MUSICAL SYMBOL COMBINING HARMONIC' },
+ [0x1D1AD] = { unicodeslot=0x1D1AD, category='mn', description='MUSICAL SYMBOL COMBINING SNAP PIZZICATO' },
+ [0x1D1AE] = { unicodeslot=0x1D1AE, category='so', description='MUSICAL SYMBOL PEDAL MARK' },
+ [0x1D1AF] = { unicodeslot=0x1D1AF, category='so', description='MUSICAL SYMBOL PEDAL UP MARK' },
+ [0x1D1B0] = { unicodeslot=0x1D1B0, category='so', description='MUSICAL SYMBOL HALF PEDAL MARK' },
+ [0x1D1B1] = { unicodeslot=0x1D1B1, category='so', description='MUSICAL SYMBOL GLISSANDO UP' },
+ [0x1D1B2] = { unicodeslot=0x1D1B2, category='so', description='MUSICAL SYMBOL GLISSANDO DOWN' },
+ [0x1D1B3] = { unicodeslot=0x1D1B3, category='so', description='MUSICAL SYMBOL WITH FINGERNAILS' },
+ [0x1D1B4] = { unicodeslot=0x1D1B4, category='so', description='MUSICAL SYMBOL DAMP' },
+ [0x1D1B5] = { unicodeslot=0x1D1B5, category='so', description='MUSICAL SYMBOL DAMP ALL' },
+ [0x1D1B6] = { unicodeslot=0x1D1B6, category='so', description='MUSICAL SYMBOL MAXIMA' },
+ [0x1D1B7] = { unicodeslot=0x1D1B7, category='so', description='MUSICAL SYMBOL LONGA' },
+ [0x1D1B8] = { unicodeslot=0x1D1B8, category='so', description='MUSICAL SYMBOL BREVIS' },
+ [0x1D1B9] = { unicodeslot=0x1D1B9, category='so', description='MUSICAL SYMBOL SEMIBREVIS WHITE' },
+ [0x1D1BA] = { unicodeslot=0x1D1BA, category='so', description='MUSICAL SYMBOL SEMIBREVIS BLACK' },
+ [0x1D1BB] = { unicodeslot=0x1D1BB, category='so', description='MUSICAL SYMBOL MINIMA', specials={'char',0x1D1B9,0x1D165} },
+ [0x1D1BC] = { unicodeslot=0x1D1BC, category='so', description='MUSICAL SYMBOL MINIMA BLACK', specials={'char',0x1D1BA,0x1D165} },
+ [0x1D1BD] = { unicodeslot=0x1D1BD, category='so', description='MUSICAL SYMBOL SEMIMINIMA WHITE', specials={'char',0x1D1BB,0x1D16E} },
+ [0x1D1BE] = { unicodeslot=0x1D1BE, category='so', description='MUSICAL SYMBOL SEMIMINIMA BLACK', specials={'char',0x1D1BC,0x1D16E} },
+ [0x1D1BF] = { unicodeslot=0x1D1BF, category='so', description='MUSICAL SYMBOL FUSA WHITE', specials={'char',0x1D1BB,0x1D16F} },
+ [0x1D1C0] = { unicodeslot=0x1D1C0, category='so', description='MUSICAL SYMBOL FUSA BLACK', specials={'char',0x1D1BC,0x1D16F} },
+ [0x1D1C1] = { unicodeslot=0x1D1C1, category='so', description='MUSICAL SYMBOL LONGA PERFECTA REST' },
+ [0x1D1C2] = { unicodeslot=0x1D1C2, category='so', description='MUSICAL SYMBOL LONGA IMPERFECTA REST' },
+ [0x1D1C3] = { unicodeslot=0x1D1C3, category='so', description='MUSICAL SYMBOL BREVIS REST' },
+ [0x1D1C4] = { unicodeslot=0x1D1C4, category='so', description='MUSICAL SYMBOL SEMIBREVIS REST' },
+ [0x1D1C5] = { unicodeslot=0x1D1C5, category='so', description='MUSICAL SYMBOL MINIMA REST' },
+ [0x1D1C6] = { unicodeslot=0x1D1C6, category='so', description='MUSICAL SYMBOL SEMIMINIMA REST' },
+ [0x1D1C7] = { unicodeslot=0x1D1C7, category='so', description='MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA' },
+ [0x1D1C8] = { unicodeslot=0x1D1C8, category='so', description='MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA' },
+ [0x1D1C9] = { unicodeslot=0x1D1C9, category='so', description='MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1' },
+ [0x1D1CA] = { unicodeslot=0x1D1CA, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA' },
+ [0x1D1CB] = { unicodeslot=0x1D1CB, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA' },
+ [0x1D1CC] = { unicodeslot=0x1D1CC, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1' },
+ [0x1D1CD] = { unicodeslot=0x1D1CD, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2' },
+ [0x1D1CE] = { unicodeslot=0x1D1CE, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3' },
+ [0x1D1CF] = { unicodeslot=0x1D1CF, category='so', description='MUSICAL SYMBOL CROIX' },
+ [0x1D1D0] = { unicodeslot=0x1D1D0, category='so', description='MUSICAL SYMBOL GREGORIAN C CLEF' },
+ [0x1D1D1] = { unicodeslot=0x1D1D1, category='so', description='MUSICAL SYMBOL GREGORIAN F CLEF' },
+ [0x1D1D2] = { unicodeslot=0x1D1D2, category='so', description='MUSICAL SYMBOL SQUARE B' },
+ [0x1D1D3] = { unicodeslot=0x1D1D3, category='so', description='MUSICAL SYMBOL VIRGA' },
+ [0x1D1D4] = { unicodeslot=0x1D1D4, category='so', description='MUSICAL SYMBOL PODATUS' },
+ [0x1D1D5] = { unicodeslot=0x1D1D5, category='so', description='MUSICAL SYMBOL CLIVIS' },
+ [0x1D1D6] = { unicodeslot=0x1D1D6, category='so', description='MUSICAL SYMBOL SCANDICUS' },
+ [0x1D1D7] = { unicodeslot=0x1D1D7, category='so', description='MUSICAL SYMBOL CLIMACUS' },
+ [0x1D1D8] = { unicodeslot=0x1D1D8, category='so', description='MUSICAL SYMBOL TORCULUS' },
+ [0x1D1D9] = { unicodeslot=0x1D1D9, category='so', description='MUSICAL SYMBOL PORRECTUS' },
+ [0x1D1DA] = { unicodeslot=0x1D1DA, category='so', description='MUSICAL SYMBOL PORRECTUS FLEXUS' },
+ [0x1D1DB] = { unicodeslot=0x1D1DB, category='so', description='MUSICAL SYMBOL SCANDICUS FLEXUS' },
+ [0x1D1DC] = { unicodeslot=0x1D1DC, category='so', description='MUSICAL SYMBOL TORCULUS RESUPINUS' },
+ [0x1D1DD] = { unicodeslot=0x1D1DD, category='so', description='MUSICAL SYMBOL PES SUBPUNCTIS' },
+ [0x1D200] = { unicodeslot=0x1D200, category='so', description='GREEK VOCAL NOTATION SYMBOL-1' },
+ [0x1D201] = { unicodeslot=0x1D201, category='so', description='GREEK VOCAL NOTATION SYMBOL-2' },
+ [0x1D202] = { unicodeslot=0x1D202, category='so', description='GREEK VOCAL NOTATION SYMBOL-3' },
+ [0x1D203] = { unicodeslot=0x1D203, category='so', description='GREEK VOCAL NOTATION SYMBOL-4' },
+ [0x1D204] = { unicodeslot=0x1D204, category='so', description='GREEK VOCAL NOTATION SYMBOL-5' },
+ [0x1D205] = { unicodeslot=0x1D205, category='so', description='GREEK VOCAL NOTATION SYMBOL-6' },
+ [0x1D206] = { unicodeslot=0x1D206, category='so', description='GREEK VOCAL NOTATION SYMBOL-7' },
+ [0x1D207] = { unicodeslot=0x1D207, category='so', description='GREEK VOCAL NOTATION SYMBOL-8' },
+ [0x1D208] = { unicodeslot=0x1D208, category='so', description='GREEK VOCAL NOTATION SYMBOL-9' },
+ [0x1D209] = { unicodeslot=0x1D209, category='so', description='GREEK VOCAL NOTATION SYMBOL-10' },
+ [0x1D20A] = { unicodeslot=0x1D20A, category='so', description='GREEK VOCAL NOTATION SYMBOL-11' },
+ [0x1D20B] = { unicodeslot=0x1D20B, category='so', description='GREEK VOCAL NOTATION SYMBOL-12' },
+ [0x1D20C] = { unicodeslot=0x1D20C, category='so', description='GREEK VOCAL NOTATION SYMBOL-13' },
+ [0x1D20D] = { unicodeslot=0x1D20D, category='so', description='GREEK VOCAL NOTATION SYMBOL-14' },
+ [0x1D20E] = { unicodeslot=0x1D20E, category='so', description='GREEK VOCAL NOTATION SYMBOL-15' },
+ [0x1D20F] = { unicodeslot=0x1D20F, category='so', description='GREEK VOCAL NOTATION SYMBOL-16' },
+ [0x1D210] = { unicodeslot=0x1D210, category='so', description='GREEK VOCAL NOTATION SYMBOL-17' },
+ [0x1D211] = { unicodeslot=0x1D211, category='so', description='GREEK VOCAL NOTATION SYMBOL-18' },
+ [0x1D212] = { unicodeslot=0x1D212, category='so', description='GREEK VOCAL NOTATION SYMBOL-19' },
+ [0x1D213] = { unicodeslot=0x1D213, category='so', description='GREEK VOCAL NOTATION SYMBOL-20' },
+ [0x1D214] = { unicodeslot=0x1D214, category='so', description='GREEK VOCAL NOTATION SYMBOL-21' },
+ [0x1D215] = { unicodeslot=0x1D215, category='so', description='GREEK VOCAL NOTATION SYMBOL-22' },
+ [0x1D216] = { unicodeslot=0x1D216, category='so', description='GREEK VOCAL NOTATION SYMBOL-23' },
+ [0x1D217] = { unicodeslot=0x1D217, category='so', description='GREEK VOCAL NOTATION SYMBOL-24' },
+ [0x1D218] = { unicodeslot=0x1D218, category='so', description='GREEK VOCAL NOTATION SYMBOL-50' },
+ [0x1D219] = { unicodeslot=0x1D219, category='so', description='GREEK VOCAL NOTATION SYMBOL-51' },
+ [0x1D21A] = { unicodeslot=0x1D21A, category='so', description='GREEK VOCAL NOTATION SYMBOL-52' },
+ [0x1D21B] = { unicodeslot=0x1D21B, category='so', description='GREEK VOCAL NOTATION SYMBOL-53' },
+ [0x1D21C] = { unicodeslot=0x1D21C, category='so', description='GREEK VOCAL NOTATION SYMBOL-54' },
+ [0x1D21D] = { unicodeslot=0x1D21D, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-1' },
+ [0x1D21E] = { unicodeslot=0x1D21E, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-2' },
+ [0x1D21F] = { unicodeslot=0x1D21F, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-4' },
+ [0x1D220] = { unicodeslot=0x1D220, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-5' },
+ [0x1D221] = { unicodeslot=0x1D221, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-7' },
+ [0x1D222] = { unicodeslot=0x1D222, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-8' },
+ [0x1D223] = { unicodeslot=0x1D223, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-11' },
+ [0x1D224] = { unicodeslot=0x1D224, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-12' },
+ [0x1D225] = { unicodeslot=0x1D225, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-13' },
+ [0x1D226] = { unicodeslot=0x1D226, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-14' },
+ [0x1D227] = { unicodeslot=0x1D227, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-17' },
+ [0x1D228] = { unicodeslot=0x1D228, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-18' },
+ [0x1D229] = { unicodeslot=0x1D229, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-19' },
+ [0x1D22A] = { unicodeslot=0x1D22A, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-23' },
+ [0x1D22B] = { unicodeslot=0x1D22B, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-24' },
+ [0x1D22C] = { unicodeslot=0x1D22C, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-25' },
+ [0x1D22D] = { unicodeslot=0x1D22D, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-26' },
+ [0x1D22E] = { unicodeslot=0x1D22E, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-27' },
+ [0x1D22F] = { unicodeslot=0x1D22F, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-29' },
+ [0x1D230] = { unicodeslot=0x1D230, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-30' },
+ [0x1D231] = { unicodeslot=0x1D231, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-32' },
+ [0x1D232] = { unicodeslot=0x1D232, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-36' },
+ [0x1D233] = { unicodeslot=0x1D233, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-37' },
+ [0x1D234] = { unicodeslot=0x1D234, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-38' },
+ [0x1D235] = { unicodeslot=0x1D235, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-39' },
+ [0x1D236] = { unicodeslot=0x1D236, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-40' },
+ [0x1D237] = { unicodeslot=0x1D237, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-42' },
+ [0x1D238] = { unicodeslot=0x1D238, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-43' },
+ [0x1D239] = { unicodeslot=0x1D239, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-45' },
+ [0x1D23A] = { unicodeslot=0x1D23A, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-47' },
+ [0x1D23B] = { unicodeslot=0x1D23B, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-48' },
+ [0x1D23C] = { unicodeslot=0x1D23C, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-49' },
+ [0x1D23D] = { unicodeslot=0x1D23D, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-50' },
+ [0x1D23E] = { unicodeslot=0x1D23E, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-51' },
+ [0x1D23F] = { unicodeslot=0x1D23F, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-52' },
+ [0x1D240] = { unicodeslot=0x1D240, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-53' },
+ [0x1D241] = { unicodeslot=0x1D241, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-54' },
+ [0x1D242] = { unicodeslot=0x1D242, category='mn', description='COMBINING GREEK MUSICAL TRISEME' },
+ [0x1D243] = { unicodeslot=0x1D243, category='mn', description='COMBINING GREEK MUSICAL TETRASEME' },
+ [0x1D244] = { unicodeslot=0x1D244, category='mn', description='COMBINING GREEK MUSICAL PENTASEME' },
+ [0x1D245] = { unicodeslot=0x1D245, category='so', description='GREEK MUSICAL LEIMMA' },
+ [0x1D300] = { unicodeslot=0x1D300, category='so', description='MONOGRAM FOR EARTH' },
+ [0x1D301] = { unicodeslot=0x1D301, category='so', description='DIGRAM FOR HEAVENLY EARTH' },
+ [0x1D302] = { unicodeslot=0x1D302, category='so', description='DIGRAM FOR HUMAN EARTH' },
+ [0x1D303] = { unicodeslot=0x1D303, category='so', description='DIGRAM FOR EARTHLY HEAVEN' },
+ [0x1D304] = { unicodeslot=0x1D304, category='so', description='DIGRAM FOR EARTHLY HUMAN' },
+ [0x1D305] = { unicodeslot=0x1D305, category='so', description='DIGRAM FOR EARTH' },
+ [0x1D306] = { unicodeslot=0x1D306, category='so', description='TETRAGRAM FOR CENTRE' },
+ [0x1D307] = { unicodeslot=0x1D307, category='so', description='TETRAGRAM FOR FULL CIRCLE' },
+ [0x1D308] = { unicodeslot=0x1D308, category='so', description='TETRAGRAM FOR MIRED' },
+ [0x1D309] = { unicodeslot=0x1D309, category='so', description='TETRAGRAM FOR BARRIER' },
+ [0x1D30A] = { unicodeslot=0x1D30A, category='so', description='TETRAGRAM FOR KEEPING SMALL' },
+ [0x1D30B] = { unicodeslot=0x1D30B, category='so', description='TETRAGRAM FOR CONTRARIETY' },
+ [0x1D30C] = { unicodeslot=0x1D30C, category='so', description='TETRAGRAM FOR ASCENT' },
+ [0x1D30D] = { unicodeslot=0x1D30D, category='so', description='TETRAGRAM FOR OPPOSITION' },
+ [0x1D30E] = { unicodeslot=0x1D30E, category='so', description='TETRAGRAM FOR BRANCHING OUT' },
+ [0x1D30F] = { unicodeslot=0x1D30F, category='so', description='TETRAGRAM FOR DEFECTIVENESS OR DISTORTION' },
+ [0x1D310] = { unicodeslot=0x1D310, category='so', description='TETRAGRAM FOR DIVERGENCE' },
+ [0x1D311] = { unicodeslot=0x1D311, category='so', description='TETRAGRAM FOR YOUTHFULNESS' },
+ [0x1D312] = { unicodeslot=0x1D312, category='so', description='TETRAGRAM FOR INCREASE' },
+ [0x1D313] = { unicodeslot=0x1D313, category='so', description='TETRAGRAM FOR PENETRATION' },
+ [0x1D314] = { unicodeslot=0x1D314, category='so', description='TETRAGRAM FOR REACH' },
+ [0x1D315] = { unicodeslot=0x1D315, category='so', description='TETRAGRAM FOR CONTACT' },
+ [0x1D316] = { unicodeslot=0x1D316, category='so', description='TETRAGRAM FOR HOLDING BACK' },
+ [0x1D317] = { unicodeslot=0x1D317, category='so', description='TETRAGRAM FOR WAITING' },
+ [0x1D318] = { unicodeslot=0x1D318, category='so', description='TETRAGRAM FOR FOLLOWING' },
+ [0x1D319] = { unicodeslot=0x1D319, category='so', description='TETRAGRAM FOR ADVANCE' },
+ [0x1D31A] = { unicodeslot=0x1D31A, category='so', description='TETRAGRAM FOR RELEASE' },
+ [0x1D31B] = { unicodeslot=0x1D31B, category='so', description='TETRAGRAM FOR RESISTANCE' },
+ [0x1D31C] = { unicodeslot=0x1D31C, category='so', description='TETRAGRAM FOR EASE' },
+ [0x1D31D] = { unicodeslot=0x1D31D, category='so', description='TETRAGRAM FOR JOY' },
+ [0x1D31E] = { unicodeslot=0x1D31E, category='so', description='TETRAGRAM FOR CONTENTION' },
+ [0x1D31F] = { unicodeslot=0x1D31F, category='so', description='TETRAGRAM FOR ENDEAVOUR' },
+ [0x1D320] = { unicodeslot=0x1D320, category='so', description='TETRAGRAM FOR DUTIES' },
+ [0x1D321] = { unicodeslot=0x1D321, category='so', description='TETRAGRAM FOR CHANGE' },
+ [0x1D322] = { unicodeslot=0x1D322, category='so', description='TETRAGRAM FOR DECISIVENESS' },
+ [0x1D323] = { unicodeslot=0x1D323, category='so', description='TETRAGRAM FOR BOLD RESOLUTION' },
+ [0x1D324] = { unicodeslot=0x1D324, category='so', description='TETRAGRAM FOR PACKING' },
+ [0x1D325] = { unicodeslot=0x1D325, category='so', description='TETRAGRAM FOR LEGION' },
+ [0x1D326] = { unicodeslot=0x1D326, category='so', description='TETRAGRAM FOR CLOSENESS' },
+ [0x1D327] = { unicodeslot=0x1D327, category='so', description='TETRAGRAM FOR KINSHIP' },
+ [0x1D328] = { unicodeslot=0x1D328, category='so', description='TETRAGRAM FOR GATHERING' },
+ [0x1D329] = { unicodeslot=0x1D329, category='so', description='TETRAGRAM FOR STRENGTH' },
+ [0x1D32A] = { unicodeslot=0x1D32A, category='so', description='TETRAGRAM FOR PURITY' },
+ [0x1D32B] = { unicodeslot=0x1D32B, category='so', description='TETRAGRAM FOR FULLNESS' },
+ [0x1D32C] = { unicodeslot=0x1D32C, category='so', description='TETRAGRAM FOR RESIDENCE' },
+ [0x1D32D] = { unicodeslot=0x1D32D, category='so', description='TETRAGRAM FOR LAW OR MODEL' },
+ [0x1D32E] = { unicodeslot=0x1D32E, category='so', description='TETRAGRAM FOR RESPONSE' },
+ [0x1D32F] = { unicodeslot=0x1D32F, category='so', description='TETRAGRAM FOR GOING TO MEET' },
+ [0x1D330] = { unicodeslot=0x1D330, category='so', description='TETRAGRAM FOR ENCOUNTERS' },
+ [0x1D331] = { unicodeslot=0x1D331, category='so', description='TETRAGRAM FOR STOVE' },
+ [0x1D332] = { unicodeslot=0x1D332, category='so', description='TETRAGRAM FOR GREATNESS' },
+ [0x1D333] = { unicodeslot=0x1D333, category='so', description='TETRAGRAM FOR ENLARGEMENT' },
+ [0x1D334] = { unicodeslot=0x1D334, category='so', description='TETRAGRAM FOR PATTERN' },
+ [0x1D335] = { unicodeslot=0x1D335, category='so', description='TETRAGRAM FOR RITUAL' },
+ [0x1D336] = { unicodeslot=0x1D336, category='so', description='TETRAGRAM FOR FLIGHT' },
+ [0x1D337] = { unicodeslot=0x1D337, category='so', description='TETRAGRAM FOR VASTNESS OR WASTING' },
+ [0x1D338] = { unicodeslot=0x1D338, category='so', description='TETRAGRAM FOR CONSTANCY' },
+ [0x1D339] = { unicodeslot=0x1D339, category='so', description='TETRAGRAM FOR MEASURE' },
+ [0x1D33A] = { unicodeslot=0x1D33A, category='so', description='TETRAGRAM FOR ETERNITY' },
+ [0x1D33B] = { unicodeslot=0x1D33B, category='so', description='TETRAGRAM FOR UNITY' },
+ [0x1D33C] = { unicodeslot=0x1D33C, category='so', description='TETRAGRAM FOR DIMINISHMENT' },
+ [0x1D33D] = { unicodeslot=0x1D33D, category='so', description='TETRAGRAM FOR CLOSED MOUTH' },
+ [0x1D33E] = { unicodeslot=0x1D33E, category='so', description='TETRAGRAM FOR GUARDEDNESS' },
+ [0x1D33F] = { unicodeslot=0x1D33F, category='so', description='TETRAGRAM FOR GATHERING IN' },
+ [0x1D340] = { unicodeslot=0x1D340, category='so', description='TETRAGRAM FOR MASSING' },
+ [0x1D341] = { unicodeslot=0x1D341, category='so', description='TETRAGRAM FOR ACCUMULATION' },
+ [0x1D342] = { unicodeslot=0x1D342, category='so', description='TETRAGRAM FOR EMBELLISHMENT' },
+ [0x1D343] = { unicodeslot=0x1D343, category='so', description='TETRAGRAM FOR DOUBT' },
+ [0x1D344] = { unicodeslot=0x1D344, category='so', description='TETRAGRAM FOR WATCH' },
+ [0x1D345] = { unicodeslot=0x1D345, category='so', description='TETRAGRAM FOR SINKING' },
+ [0x1D346] = { unicodeslot=0x1D346, category='so', description='TETRAGRAM FOR INNER' },
+ [0x1D347] = { unicodeslot=0x1D347, category='so', description='TETRAGRAM FOR DEPARTURE' },
+ [0x1D348] = { unicodeslot=0x1D348, category='so', description='TETRAGRAM FOR DARKENING' },
+ [0x1D349] = { unicodeslot=0x1D349, category='so', description='TETRAGRAM FOR DIMMING' },
+ [0x1D34A] = { unicodeslot=0x1D34A, category='so', description='TETRAGRAM FOR EXHAUSTION' },
+ [0x1D34B] = { unicodeslot=0x1D34B, category='so', description='TETRAGRAM FOR SEVERANCE' },
+ [0x1D34C] = { unicodeslot=0x1D34C, category='so', description='TETRAGRAM FOR STOPPAGE' },
+ [0x1D34D] = { unicodeslot=0x1D34D, category='so', description='TETRAGRAM FOR HARDNESS' },
+ [0x1D34E] = { unicodeslot=0x1D34E, category='so', description='TETRAGRAM FOR COMPLETION' },
+ [0x1D34F] = { unicodeslot=0x1D34F, category='so', description='TETRAGRAM FOR CLOSURE' },
+ [0x1D350] = { unicodeslot=0x1D350, category='so', description='TETRAGRAM FOR FAILURE' },
+ [0x1D351] = { unicodeslot=0x1D351, category='so', description='TETRAGRAM FOR AGGRAVATION' },
+ [0x1D352] = { unicodeslot=0x1D352, category='so', description='TETRAGRAM FOR COMPLIANCE' },
+ [0x1D353] = { unicodeslot=0x1D353, category='so', description='TETRAGRAM FOR ON THE VERGE' },
+ [0x1D354] = { unicodeslot=0x1D354, category='so', description='TETRAGRAM FOR DIFFICULTIES' },
+ [0x1D355] = { unicodeslot=0x1D355, category='so', description='TETRAGRAM FOR LABOURING' },
+ [0x1D356] = { unicodeslot=0x1D356, category='so', description='TETRAGRAM FOR FOSTERING' },
+ [0x1D360] = { unicodeslot=0x1D360, category='no', description='COUNTING ROD UNIT DIGIT ONE' },
+ [0x1D361] = { unicodeslot=0x1D361, category='no', description='COUNTING ROD UNIT DIGIT TWO' },
+ [0x1D362] = { unicodeslot=0x1D362, category='no', description='COUNTING ROD UNIT DIGIT THREE' },
+ [0x1D363] = { unicodeslot=0x1D363, category='no', description='COUNTING ROD UNIT DIGIT FOUR' },
+ [0x1D364] = { unicodeslot=0x1D364, category='no', description='COUNTING ROD UNIT DIGIT FIVE' },
+ [0x1D365] = { unicodeslot=0x1D365, category='no', description='COUNTING ROD UNIT DIGIT SIX' },
+ [0x1D366] = { unicodeslot=0x1D366, category='no', description='COUNTING ROD UNIT DIGIT SEVEN' },
+ [0x1D367] = { unicodeslot=0x1D367, category='no', description='COUNTING ROD UNIT DIGIT EIGHT' },
+ [0x1D368] = { unicodeslot=0x1D368, category='no', description='COUNTING ROD UNIT DIGIT NINE' },
+ [0x1D369] = { unicodeslot=0x1D369, category='no', description='COUNTING ROD TENS DIGIT ONE' },
+ [0x1D36A] = { unicodeslot=0x1D36A, category='no', description='COUNTING ROD TENS DIGIT TWO' },
+ [0x1D36B] = { unicodeslot=0x1D36B, category='no', description='COUNTING ROD TENS DIGIT THREE' },
+ [0x1D36C] = { unicodeslot=0x1D36C, category='no', description='COUNTING ROD TENS DIGIT FOUR' },
+ [0x1D36D] = { unicodeslot=0x1D36D, category='no', description='COUNTING ROD TENS DIGIT FIVE' },
+ [0x1D36E] = { unicodeslot=0x1D36E, category='no', description='COUNTING ROD TENS DIGIT SIX' },
+ [0x1D36F] = { unicodeslot=0x1D36F, category='no', description='COUNTING ROD TENS DIGIT SEVEN' },
+ [0x1D370] = { unicodeslot=0x1D370, category='no', description='COUNTING ROD TENS DIGIT EIGHT' },
+ [0x1D371] = { unicodeslot=0x1D371, category='no', description='COUNTING ROD TENS DIGIT NINE' },
+ [0x1D400] = { unicodeslot=0x1D400, category='lu', description='MATHEMATICAL BOLD CAPITAL A', specials={'font',0x0041} },
+ [0x1D401] = { unicodeslot=0x1D401, category='lu', description='MATHEMATICAL BOLD CAPITAL B', specials={'font',0x0042} },
+ [0x1D402] = { unicodeslot=0x1D402, category='lu', description='MATHEMATICAL BOLD CAPITAL C', specials={'font',0x0043} },
+ [0x1D403] = { unicodeslot=0x1D403, category='lu', description='MATHEMATICAL BOLD CAPITAL D', specials={'font',0x0044} },
+ [0x1D404] = { unicodeslot=0x1D404, category='lu', description='MATHEMATICAL BOLD CAPITAL E', specials={'font',0x0045} },
+ [0x1D405] = { unicodeslot=0x1D405, category='lu', description='MATHEMATICAL BOLD CAPITAL F', specials={'font',0x0046} },
+ [0x1D406] = { unicodeslot=0x1D406, category='lu', description='MATHEMATICAL BOLD CAPITAL G', specials={'font',0x0047} },
+ [0x1D407] = { unicodeslot=0x1D407, category='lu', description='MATHEMATICAL BOLD CAPITAL H', specials={'font',0x0048} },
+ [0x1D408] = { unicodeslot=0x1D408, category='lu', description='MATHEMATICAL BOLD CAPITAL I', specials={'font',0x0049} },
+ [0x1D409] = { unicodeslot=0x1D409, category='lu', description='MATHEMATICAL BOLD CAPITAL J', specials={'font',0x004A} },
+ [0x1D40A] = { unicodeslot=0x1D40A, category='lu', description='MATHEMATICAL BOLD CAPITAL K', specials={'font',0x004B} },
+ [0x1D40B] = { unicodeslot=0x1D40B, category='lu', description='MATHEMATICAL BOLD CAPITAL L', specials={'font',0x004C} },
+ [0x1D40C] = { unicodeslot=0x1D40C, category='lu', description='MATHEMATICAL BOLD CAPITAL M', specials={'font',0x004D} },
+ [0x1D40D] = { unicodeslot=0x1D40D, category='lu', description='MATHEMATICAL BOLD CAPITAL N', specials={'font',0x004E} },
+ [0x1D40E] = { unicodeslot=0x1D40E, category='lu', description='MATHEMATICAL BOLD CAPITAL O', specials={'font',0x004F} },
+ [0x1D40F] = { unicodeslot=0x1D40F, category='lu', description='MATHEMATICAL BOLD CAPITAL P', specials={'font',0x0050} },
+ [0x1D410] = { unicodeslot=0x1D410, category='lu', description='MATHEMATICAL BOLD CAPITAL Q', specials={'font',0x0051} },
+ [0x1D411] = { unicodeslot=0x1D411, category='lu', description='MATHEMATICAL BOLD CAPITAL R', specials={'font',0x0052} },
+ [0x1D412] = { unicodeslot=0x1D412, category='lu', description='MATHEMATICAL BOLD CAPITAL S', specials={'font',0x0053} },
+ [0x1D413] = { unicodeslot=0x1D413, category='lu', description='MATHEMATICAL BOLD CAPITAL T', specials={'font',0x0054} },
+ [0x1D414] = { unicodeslot=0x1D414, category='lu', description='MATHEMATICAL BOLD CAPITAL U', specials={'font',0x0055} },
+ [0x1D415] = { unicodeslot=0x1D415, category='lu', description='MATHEMATICAL BOLD CAPITAL V', specials={'font',0x0056} },
+ [0x1D416] = { unicodeslot=0x1D416, category='lu', description='MATHEMATICAL BOLD CAPITAL W', specials={'font',0x0057} },
+ [0x1D417] = { unicodeslot=0x1D417, category='lu', description='MATHEMATICAL BOLD CAPITAL X', specials={'font',0x0058} },
+ [0x1D418] = { unicodeslot=0x1D418, category='lu', description='MATHEMATICAL BOLD CAPITAL Y', specials={'font',0x0059} },
+ [0x1D419] = { unicodeslot=0x1D419, category='lu', description='MATHEMATICAL BOLD CAPITAL Z', specials={'font',0x005A} },
+ [0x1D41A] = { unicodeslot=0x1D41A, category='ll', description='MATHEMATICAL BOLD SMALL A', specials={'font',0x0061} },
+ [0x1D41B] = { unicodeslot=0x1D41B, category='ll', description='MATHEMATICAL BOLD SMALL B', specials={'font',0x0062} },
+ [0x1D41C] = { unicodeslot=0x1D41C, category='ll', description='MATHEMATICAL BOLD SMALL C', specials={'font',0x0063} },
+ [0x1D41D] = { unicodeslot=0x1D41D, category='ll', description='MATHEMATICAL BOLD SMALL D', specials={'font',0x0064} },
+ [0x1D41E] = { unicodeslot=0x1D41E, category='ll', description='MATHEMATICAL BOLD SMALL E', specials={'font',0x0065} },
+ [0x1D41F] = { unicodeslot=0x1D41F, category='ll', description='MATHEMATICAL BOLD SMALL F', specials={'font',0x0066} },
+ [0x1D420] = { unicodeslot=0x1D420, category='ll', description='MATHEMATICAL BOLD SMALL G', specials={'font',0x0067} },
+ [0x1D421] = { unicodeslot=0x1D421, category='ll', description='MATHEMATICAL BOLD SMALL H', specials={'font',0x0068} },
+ [0x1D422] = { unicodeslot=0x1D422, category='ll', description='MATHEMATICAL BOLD SMALL I', specials={'font',0x0069} },
+ [0x1D423] = { unicodeslot=0x1D423, category='ll', description='MATHEMATICAL BOLD SMALL J', specials={'font',0x006A} },
+ [0x1D424] = { unicodeslot=0x1D424, category='ll', description='MATHEMATICAL BOLD SMALL K', specials={'font',0x006B} },
+ [0x1D425] = { unicodeslot=0x1D425, category='ll', description='MATHEMATICAL BOLD SMALL L', specials={'font',0x006C} },
+ [0x1D426] = { unicodeslot=0x1D426, category='ll', description='MATHEMATICAL BOLD SMALL M', specials={'font',0x006D} },
+ [0x1D427] = { unicodeslot=0x1D427, category='ll', description='MATHEMATICAL BOLD SMALL N', specials={'font',0x006E} },
+ [0x1D428] = { unicodeslot=0x1D428, category='ll', description='MATHEMATICAL BOLD SMALL O', specials={'font',0x006F} },
+ [0x1D429] = { unicodeslot=0x1D429, category='ll', description='MATHEMATICAL BOLD SMALL P', specials={'font',0x0070} },
+ [0x1D42A] = { unicodeslot=0x1D42A, category='ll', description='MATHEMATICAL BOLD SMALL Q', specials={'font',0x0071} },
+ [0x1D42B] = { unicodeslot=0x1D42B, category='ll', description='MATHEMATICAL BOLD SMALL R', specials={'font',0x0072} },
+ [0x1D42C] = { unicodeslot=0x1D42C, category='ll', description='MATHEMATICAL BOLD SMALL S', specials={'font',0x0073} },
+ [0x1D42D] = { unicodeslot=0x1D42D, category='ll', description='MATHEMATICAL BOLD SMALL T', specials={'font',0x0074} },
+ [0x1D42E] = { unicodeslot=0x1D42E, category='ll', description='MATHEMATICAL BOLD SMALL U', specials={'font',0x0075} },
+ [0x1D42F] = { unicodeslot=0x1D42F, category='ll', description='MATHEMATICAL BOLD SMALL V', specials={'font',0x0076} },
+ [0x1D430] = { unicodeslot=0x1D430, category='ll', description='MATHEMATICAL BOLD SMALL W', specials={'font',0x0077} },
+ [0x1D431] = { unicodeslot=0x1D431, category='ll', description='MATHEMATICAL BOLD SMALL X', specials={'font',0x0078} },
+ [0x1D432] = { unicodeslot=0x1D432, category='ll', description='MATHEMATICAL BOLD SMALL Y', specials={'font',0x0079} },
+ [0x1D433] = { unicodeslot=0x1D433, category='ll', description='MATHEMATICAL BOLD SMALL Z', specials={'font',0x007A} },
+ [0x1D434] = { unicodeslot=0x1D434, category='lu', description='MATHEMATICAL ITALIC CAPITAL A', specials={'font',0x0041} },
+ [0x1D435] = { unicodeslot=0x1D435, category='lu', description='MATHEMATICAL ITALIC CAPITAL B', specials={'font',0x0042} },
+ [0x1D436] = { unicodeslot=0x1D436, category='lu', description='MATHEMATICAL ITALIC CAPITAL C', specials={'font',0x0043} },
+ [0x1D437] = { unicodeslot=0x1D437, category='lu', description='MATHEMATICAL ITALIC CAPITAL D', specials={'font',0x0044} },
+ [0x1D438] = { unicodeslot=0x1D438, category='lu', description='MATHEMATICAL ITALIC CAPITAL E', specials={'font',0x0045} },
+ [0x1D439] = { unicodeslot=0x1D439, category='lu', description='MATHEMATICAL ITALIC CAPITAL F', specials={'font',0x0046} },
+ [0x1D43A] = { unicodeslot=0x1D43A, category='lu', description='MATHEMATICAL ITALIC CAPITAL G', specials={'font',0x0047} },
+ [0x1D43B] = { unicodeslot=0x1D43B, category='lu', description='MATHEMATICAL ITALIC CAPITAL H', specials={'font',0x0048} },
+ [0x1D43C] = { unicodeslot=0x1D43C, category='lu', description='MATHEMATICAL ITALIC CAPITAL I', specials={'font',0x0049} },
+ [0x1D43D] = { unicodeslot=0x1D43D, category='lu', description='MATHEMATICAL ITALIC CAPITAL J', specials={'font',0x004A} },
+ [0x1D43E] = { unicodeslot=0x1D43E, category='lu', description='MATHEMATICAL ITALIC CAPITAL K', specials={'font',0x004B} },
+ [0x1D43F] = { unicodeslot=0x1D43F, category='lu', description='MATHEMATICAL ITALIC CAPITAL L', specials={'font',0x004C} },
+ [0x1D440] = { unicodeslot=0x1D440, category='lu', description='MATHEMATICAL ITALIC CAPITAL M', specials={'font',0x004D} },
+ [0x1D441] = { unicodeslot=0x1D441, category='lu', description='MATHEMATICAL ITALIC CAPITAL N', specials={'font',0x004E} },
+ [0x1D442] = { unicodeslot=0x1D442, category='lu', description='MATHEMATICAL ITALIC CAPITAL O', specials={'font',0x004F} },
+ [0x1D443] = { unicodeslot=0x1D443, category='lu', description='MATHEMATICAL ITALIC CAPITAL P', specials={'font',0x0050} },
+ [0x1D444] = { unicodeslot=0x1D444, category='lu', description='MATHEMATICAL ITALIC CAPITAL Q', specials={'font',0x0051} },
+ [0x1D445] = { unicodeslot=0x1D445, category='lu', description='MATHEMATICAL ITALIC CAPITAL R', specials={'font',0x0052} },
+ [0x1D446] = { unicodeslot=0x1D446, category='lu', description='MATHEMATICAL ITALIC CAPITAL S', specials={'font',0x0053} },
+ [0x1D447] = { unicodeslot=0x1D447, category='lu', description='MATHEMATICAL ITALIC CAPITAL T', specials={'font',0x0054} },
+ [0x1D448] = { unicodeslot=0x1D448, category='lu', description='MATHEMATICAL ITALIC CAPITAL U', specials={'font',0x0055} },
+ [0x1D449] = { unicodeslot=0x1D449, category='lu', description='MATHEMATICAL ITALIC CAPITAL V', specials={'font',0x0056} },
+ [0x1D44A] = { unicodeslot=0x1D44A, category='lu', description='MATHEMATICAL ITALIC CAPITAL W', specials={'font',0x0057} },
+ [0x1D44B] = { unicodeslot=0x1D44B, category='lu', description='MATHEMATICAL ITALIC CAPITAL X', specials={'font',0x0058} },
+ [0x1D44C] = { unicodeslot=0x1D44C, category='lu', description='MATHEMATICAL ITALIC CAPITAL Y', specials={'font',0x0059} },
+ [0x1D44D] = { unicodeslot=0x1D44D, category='lu', description='MATHEMATICAL ITALIC CAPITAL Z', specials={'font',0x005A} },
+ [0x1D44E] = { unicodeslot=0x1D44E, category='ll', description='MATHEMATICAL ITALIC SMALL A', specials={'font',0x0061} },
+ [0x1D44F] = { unicodeslot=0x1D44F, category='ll', description='MATHEMATICAL ITALIC SMALL B', specials={'font',0x0062} },
+ [0x1D450] = { unicodeslot=0x1D450, category='ll', description='MATHEMATICAL ITALIC SMALL C', specials={'font',0x0063} },
+ [0x1D451] = { unicodeslot=0x1D451, category='ll', description='MATHEMATICAL ITALIC SMALL D', specials={'font',0x0064} },
+ [0x1D452] = { unicodeslot=0x1D452, category='ll', description='MATHEMATICAL ITALIC SMALL E', specials={'font',0x0065} },
+ [0x1D453] = { unicodeslot=0x1D453, category='ll', description='MATHEMATICAL ITALIC SMALL F', specials={'font',0x0066} },
+ [0x1D454] = { unicodeslot=0x1D454, category='ll', description='MATHEMATICAL ITALIC SMALL G', specials={'font',0x0067} },
+ [0x1D456] = { unicodeslot=0x1D456, category='ll', description='MATHEMATICAL ITALIC SMALL I', specials={'font',0x0069} },
+ [0x1D457] = { unicodeslot=0x1D457, category='ll', description='MATHEMATICAL ITALIC SMALL J', specials={'font',0x006A} },
+ [0x1D458] = { unicodeslot=0x1D458, category='ll', description='MATHEMATICAL ITALIC SMALL K', specials={'font',0x006B} },
+ [0x1D459] = { unicodeslot=0x1D459, category='ll', description='MATHEMATICAL ITALIC SMALL L', specials={'font',0x006C} },
+ [0x1D45A] = { unicodeslot=0x1D45A, category='ll', description='MATHEMATICAL ITALIC SMALL M', specials={'font',0x006D} },
+ [0x1D45B] = { unicodeslot=0x1D45B, category='ll', description='MATHEMATICAL ITALIC SMALL N', specials={'font',0x006E} },
+ [0x1D45C] = { unicodeslot=0x1D45C, category='ll', description='MATHEMATICAL ITALIC SMALL O', specials={'font',0x006F} },
+ [0x1D45D] = { unicodeslot=0x1D45D, category='ll', description='MATHEMATICAL ITALIC SMALL P', specials={'font',0x0070} },
+ [0x1D45E] = { unicodeslot=0x1D45E, category='ll', description='MATHEMATICAL ITALIC SMALL Q', specials={'font',0x0071} },
+ [0x1D45F] = { unicodeslot=0x1D45F, category='ll', description='MATHEMATICAL ITALIC SMALL R', specials={'font',0x0072} },
+ [0x1D460] = { unicodeslot=0x1D460, category='ll', description='MATHEMATICAL ITALIC SMALL S', specials={'font',0x0073} },
+ [0x1D461] = { unicodeslot=0x1D461, category='ll', description='MATHEMATICAL ITALIC SMALL T', specials={'font',0x0074} },
+ [0x1D462] = { unicodeslot=0x1D462, category='ll', description='MATHEMATICAL ITALIC SMALL U', specials={'font',0x0075} },
+ [0x1D463] = { unicodeslot=0x1D463, category='ll', description='MATHEMATICAL ITALIC SMALL V', specials={'font',0x0076} },
+ [0x1D464] = { unicodeslot=0x1D464, category='ll', description='MATHEMATICAL ITALIC SMALL W', specials={'font',0x0077} },
+ [0x1D465] = { unicodeslot=0x1D465, category='ll', description='MATHEMATICAL ITALIC SMALL X', specials={'font',0x0078} },
+ [0x1D466] = { unicodeslot=0x1D466, category='ll', description='MATHEMATICAL ITALIC SMALL Y', specials={'font',0x0079} },
+ [0x1D467] = { unicodeslot=0x1D467, category='ll', description='MATHEMATICAL ITALIC SMALL Z', specials={'font',0x007A} },
+ [0x1D468] = { unicodeslot=0x1D468, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL A', specials={'font',0x0041} },
+ [0x1D469] = { unicodeslot=0x1D469, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL B', specials={'font',0x0042} },
+ [0x1D46A] = { unicodeslot=0x1D46A, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL C', specials={'font',0x0043} },
+ [0x1D46B] = { unicodeslot=0x1D46B, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL D', specials={'font',0x0044} },
+ [0x1D46C] = { unicodeslot=0x1D46C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL E', specials={'font',0x0045} },
+ [0x1D46D] = { unicodeslot=0x1D46D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL F', specials={'font',0x0046} },
+ [0x1D46E] = { unicodeslot=0x1D46E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL G', specials={'font',0x0047} },
+ [0x1D46F] = { unicodeslot=0x1D46F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL H', specials={'font',0x0048} },
+ [0x1D470] = { unicodeslot=0x1D470, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL I', specials={'font',0x0049} },
+ [0x1D471] = { unicodeslot=0x1D471, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL J', specials={'font',0x004A} },
+ [0x1D472] = { unicodeslot=0x1D472, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL K', specials={'font',0x004B} },
+ [0x1D473] = { unicodeslot=0x1D473, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL L', specials={'font',0x004C} },
+ [0x1D474] = { unicodeslot=0x1D474, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL M', specials={'font',0x004D} },
+ [0x1D475] = { unicodeslot=0x1D475, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL N', specials={'font',0x004E} },
+ [0x1D476] = { unicodeslot=0x1D476, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL O', specials={'font',0x004F} },
+ [0x1D477] = { unicodeslot=0x1D477, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL P', specials={'font',0x0050} },
+ [0x1D478] = { unicodeslot=0x1D478, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL Q', specials={'font',0x0051} },
+ [0x1D479] = { unicodeslot=0x1D479, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL R', specials={'font',0x0052} },
+ [0x1D47A] = { unicodeslot=0x1D47A, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL S', specials={'font',0x0053} },
+ [0x1D47B] = { unicodeslot=0x1D47B, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL T', specials={'font',0x0054} },
+ [0x1D47C] = { unicodeslot=0x1D47C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL U', specials={'font',0x0055} },
+ [0x1D47D] = { unicodeslot=0x1D47D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL V', specials={'font',0x0056} },
+ [0x1D47E] = { unicodeslot=0x1D47E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL W', specials={'font',0x0057} },
+ [0x1D47F] = { unicodeslot=0x1D47F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL X', specials={'font',0x0058} },
+ [0x1D480] = { unicodeslot=0x1D480, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL Y', specials={'font',0x0059} },
+ [0x1D481] = { unicodeslot=0x1D481, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL Z', specials={'font',0x005A} },
+ [0x1D482] = { unicodeslot=0x1D482, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL A', specials={'font',0x0061} },
+ [0x1D483] = { unicodeslot=0x1D483, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL B', specials={'font',0x0062} },
+ [0x1D484] = { unicodeslot=0x1D484, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL C', specials={'font',0x0063} },
+ [0x1D485] = { unicodeslot=0x1D485, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL D', specials={'font',0x0064} },
+ [0x1D486] = { unicodeslot=0x1D486, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL E', specials={'font',0x0065} },
+ [0x1D487] = { unicodeslot=0x1D487, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL F', specials={'font',0x0066} },
+ [0x1D488] = { unicodeslot=0x1D488, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL G', specials={'font',0x0067} },
+ [0x1D489] = { unicodeslot=0x1D489, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL H', specials={'font',0x0068} },
+ [0x1D48A] = { unicodeslot=0x1D48A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL I', specials={'font',0x0069} },
+ [0x1D48B] = { unicodeslot=0x1D48B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL J', specials={'font',0x006A} },
+ [0x1D48C] = { unicodeslot=0x1D48C, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL K', specials={'font',0x006B} },
+ [0x1D48D] = { unicodeslot=0x1D48D, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL L', specials={'font',0x006C} },
+ [0x1D48E] = { unicodeslot=0x1D48E, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL M', specials={'font',0x006D} },
+ [0x1D48F] = { unicodeslot=0x1D48F, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL N', specials={'font',0x006E} },
+ [0x1D490] = { unicodeslot=0x1D490, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL O', specials={'font',0x006F} },
+ [0x1D491] = { unicodeslot=0x1D491, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL P', specials={'font',0x0070} },
+ [0x1D492] = { unicodeslot=0x1D492, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL Q', specials={'font',0x0071} },
+ [0x1D493] = { unicodeslot=0x1D493, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL R', specials={'font',0x0072} },
+ [0x1D494] = { unicodeslot=0x1D494, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL S', specials={'font',0x0073} },
+ [0x1D495] = { unicodeslot=0x1D495, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL T', specials={'font',0x0074} },
+ [0x1D496] = { unicodeslot=0x1D496, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL U', specials={'font',0x0075} },
+ [0x1D497] = { unicodeslot=0x1D497, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL V', specials={'font',0x0076} },
+ [0x1D498] = { unicodeslot=0x1D498, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL W', specials={'font',0x0077} },
+ [0x1D499] = { unicodeslot=0x1D499, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL X', specials={'font',0x0078} },
+ [0x1D49A] = { unicodeslot=0x1D49A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL Y', specials={'font',0x0079} },
+ [0x1D49B] = { unicodeslot=0x1D49B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL Z', specials={'font',0x007A} },
+ [0x1D49C] = { unicodeslot=0x1D49C, category='lu', description='MATHEMATICAL SCRIPT CAPITAL A', specials={'font',0x0041} },
+ [0x1D49E] = { unicodeslot=0x1D49E, category='lu', description='MATHEMATICAL SCRIPT CAPITAL C', specials={'font',0x0043} },
+ [0x1D49F] = { unicodeslot=0x1D49F, category='lu', description='MATHEMATICAL SCRIPT CAPITAL D', specials={'font',0x0044} },
+ [0x1D4A2] = { unicodeslot=0x1D4A2, category='lu', description='MATHEMATICAL SCRIPT CAPITAL G', specials={'font',0x0047} },
+ [0x1D4A5] = { unicodeslot=0x1D4A5, category='lu', description='MATHEMATICAL SCRIPT CAPITAL J', specials={'font',0x004A} },
+ [0x1D4A6] = { unicodeslot=0x1D4A6, category='lu', description='MATHEMATICAL SCRIPT CAPITAL K', specials={'font',0x004B} },
+ [0x1D4A9] = { unicodeslot=0x1D4A9, category='lu', description='MATHEMATICAL SCRIPT CAPITAL N', specials={'font',0x004E} },
+ [0x1D4AA] = { unicodeslot=0x1D4AA, category='lu', description='MATHEMATICAL SCRIPT CAPITAL O', specials={'font',0x004F} },
+ [0x1D4AB] = { unicodeslot=0x1D4AB, category='lu', description='MATHEMATICAL SCRIPT CAPITAL P', specials={'font',0x0050} },
+ [0x1D4AC] = { unicodeslot=0x1D4AC, category='lu', description='MATHEMATICAL SCRIPT CAPITAL Q', specials={'font',0x0051} },
+ [0x1D4AE] = { unicodeslot=0x1D4AE, category='lu', description='MATHEMATICAL SCRIPT CAPITAL S', specials={'font',0x0053} },
+ [0x1D4AF] = { unicodeslot=0x1D4AF, category='lu', description='MATHEMATICAL SCRIPT CAPITAL T', specials={'font',0x0054} },
+ [0x1D4B0] = { unicodeslot=0x1D4B0, category='lu', description='MATHEMATICAL SCRIPT CAPITAL U', specials={'font',0x0055} },
+ [0x1D4B1] = { unicodeslot=0x1D4B1, category='lu', description='MATHEMATICAL SCRIPT CAPITAL V', specials={'font',0x0056} },
+ [0x1D4B2] = { unicodeslot=0x1D4B2, category='lu', description='MATHEMATICAL SCRIPT CAPITAL W', specials={'font',0x0057} },
+ [0x1D4B3] = { unicodeslot=0x1D4B3, category='lu', description='MATHEMATICAL SCRIPT CAPITAL X', specials={'font',0x0058} },
+ [0x1D4B4] = { unicodeslot=0x1D4B4, category='lu', description='MATHEMATICAL SCRIPT CAPITAL Y', specials={'font',0x0059} },
+ [0x1D4B5] = { unicodeslot=0x1D4B5, category='lu', description='MATHEMATICAL SCRIPT CAPITAL Z', specials={'font',0x005A} },
+ [0x1D4B6] = { unicodeslot=0x1D4B6, category='ll', description='MATHEMATICAL SCRIPT SMALL A', specials={'font',0x0061} },
+ [0x1D4B7] = { unicodeslot=0x1D4B7, category='ll', description='MATHEMATICAL SCRIPT SMALL B', specials={'font',0x0062} },
+ [0x1D4B8] = { unicodeslot=0x1D4B8, category='ll', description='MATHEMATICAL SCRIPT SMALL C', specials={'font',0x0063} },
+ [0x1D4B9] = { unicodeslot=0x1D4B9, category='ll', description='MATHEMATICAL SCRIPT SMALL D', specials={'font',0x0064} },
+ [0x1D4BB] = { unicodeslot=0x1D4BB, category='ll', description='MATHEMATICAL SCRIPT SMALL F', specials={'font',0x0066} },
+ [0x1D4BD] = { unicodeslot=0x1D4BD, category='ll', description='MATHEMATICAL SCRIPT SMALL H', specials={'font',0x0068} },
+ [0x1D4BE] = { unicodeslot=0x1D4BE, category='ll', description='MATHEMATICAL SCRIPT SMALL I', specials={'font',0x0069} },
+ [0x1D4BF] = { unicodeslot=0x1D4BF, category='ll', description='MATHEMATICAL SCRIPT SMALL J', specials={'font',0x006A} },
+ [0x1D4C0] = { unicodeslot=0x1D4C0, category='ll', description='MATHEMATICAL SCRIPT SMALL K', specials={'font',0x006B} },
+ [0x1D4C1] = { unicodeslot=0x1D4C1, category='ll', description='MATHEMATICAL SCRIPT SMALL L', specials={'font',0x006C} },
+ [0x1D4C2] = { unicodeslot=0x1D4C2, category='ll', description='MATHEMATICAL SCRIPT SMALL M', specials={'font',0x006D} },
+ [0x1D4C3] = { unicodeslot=0x1D4C3, category='ll', description='MATHEMATICAL SCRIPT SMALL N', specials={'font',0x006E} },
+ [0x1D4C5] = { unicodeslot=0x1D4C5, category='ll', description='MATHEMATICAL SCRIPT SMALL P', specials={'font',0x0070} },
+ [0x1D4C6] = { unicodeslot=0x1D4C6, category='ll', description='MATHEMATICAL SCRIPT SMALL Q', specials={'font',0x0071} },
+ [0x1D4C7] = { unicodeslot=0x1D4C7, category='ll', description='MATHEMATICAL SCRIPT SMALL R', specials={'font',0x0072} },
+ [0x1D4C8] = { unicodeslot=0x1D4C8, category='ll', description='MATHEMATICAL SCRIPT SMALL S', specials={'font',0x0073} },
+ [0x1D4C9] = { unicodeslot=0x1D4C9, category='ll', description='MATHEMATICAL SCRIPT SMALL T', specials={'font',0x0074} },
+ [0x1D4CA] = { unicodeslot=0x1D4CA, category='ll', description='MATHEMATICAL SCRIPT SMALL U', specials={'font',0x0075} },
+ [0x1D4CB] = { unicodeslot=0x1D4CB, category='ll', description='MATHEMATICAL SCRIPT SMALL V', specials={'font',0x0076} },
+ [0x1D4CC] = { unicodeslot=0x1D4CC, category='ll', description='MATHEMATICAL SCRIPT SMALL W', specials={'font',0x0077} },
+ [0x1D4CD] = { unicodeslot=0x1D4CD, category='ll', description='MATHEMATICAL SCRIPT SMALL X', specials={'font',0x0078} },
+ [0x1D4CE] = { unicodeslot=0x1D4CE, category='ll', description='MATHEMATICAL SCRIPT SMALL Y', specials={'font',0x0079} },
+ [0x1D4CF] = { unicodeslot=0x1D4CF, category='ll', description='MATHEMATICAL SCRIPT SMALL Z', specials={'font',0x007A} },
+ [0x1D4D0] = { unicodeslot=0x1D4D0, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL A', specials={'font',0x0041} },
+ [0x1D4D1] = { unicodeslot=0x1D4D1, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL B', specials={'font',0x0042} },
+ [0x1D4D2] = { unicodeslot=0x1D4D2, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL C', specials={'font',0x0043} },
+ [0x1D4D3] = { unicodeslot=0x1D4D3, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL D', specials={'font',0x0044} },
+ [0x1D4D4] = { unicodeslot=0x1D4D4, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL E', specials={'font',0x0045} },
+ [0x1D4D5] = { unicodeslot=0x1D4D5, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL F', specials={'font',0x0046} },
+ [0x1D4D6] = { unicodeslot=0x1D4D6, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL G', specials={'font',0x0047} },
+ [0x1D4D7] = { unicodeslot=0x1D4D7, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL H', specials={'font',0x0048} },
+ [0x1D4D8] = { unicodeslot=0x1D4D8, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL I', specials={'font',0x0049} },
+ [0x1D4D9] = { unicodeslot=0x1D4D9, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL J', specials={'font',0x004A} },
+ [0x1D4DA] = { unicodeslot=0x1D4DA, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL K', specials={'font',0x004B} },
+ [0x1D4DB] = { unicodeslot=0x1D4DB, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL L', specials={'font',0x004C} },
+ [0x1D4DC] = { unicodeslot=0x1D4DC, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL M', specials={'font',0x004D} },
+ [0x1D4DD] = { unicodeslot=0x1D4DD, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL N', specials={'font',0x004E} },
+ [0x1D4DE] = { unicodeslot=0x1D4DE, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL O', specials={'font',0x004F} },
+ [0x1D4DF] = { unicodeslot=0x1D4DF, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL P', specials={'font',0x0050} },
+ [0x1D4E0] = { unicodeslot=0x1D4E0, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL Q', specials={'font',0x0051} },
+ [0x1D4E1] = { unicodeslot=0x1D4E1, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL R', specials={'font',0x0052} },
+ [0x1D4E2] = { unicodeslot=0x1D4E2, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL S', specials={'font',0x0053} },
+ [0x1D4E3] = { unicodeslot=0x1D4E3, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL T', specials={'font',0x0054} },
+ [0x1D4E4] = { unicodeslot=0x1D4E4, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL U', specials={'font',0x0055} },
+ [0x1D4E5] = { unicodeslot=0x1D4E5, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL V', specials={'font',0x0056} },
+ [0x1D4E6] = { unicodeslot=0x1D4E6, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL W', specials={'font',0x0057} },
+ [0x1D4E7] = { unicodeslot=0x1D4E7, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL X', specials={'font',0x0058} },
+ [0x1D4E8] = { unicodeslot=0x1D4E8, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL Y', specials={'font',0x0059} },
+ [0x1D4E9] = { unicodeslot=0x1D4E9, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL Z', specials={'font',0x005A} },
+ [0x1D4EA] = { unicodeslot=0x1D4EA, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL A', specials={'font',0x0061} },
+ [0x1D4EB] = { unicodeslot=0x1D4EB, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL B', specials={'font',0x0062} },
+ [0x1D4EC] = { unicodeslot=0x1D4EC, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL C', specials={'font',0x0063} },
+ [0x1D4ED] = { unicodeslot=0x1D4ED, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL D', specials={'font',0x0064} },
+ [0x1D4EE] = { unicodeslot=0x1D4EE, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL E', specials={'font',0x0065} },
+ [0x1D4EF] = { unicodeslot=0x1D4EF, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL F', specials={'font',0x0066} },
+ [0x1D4F0] = { unicodeslot=0x1D4F0, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL G', specials={'font',0x0067} },
+ [0x1D4F1] = { unicodeslot=0x1D4F1, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL H', specials={'font',0x0068} },
+ [0x1D4F2] = { unicodeslot=0x1D4F2, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL I', specials={'font',0x0069} },
+ [0x1D4F3] = { unicodeslot=0x1D4F3, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL J', specials={'font',0x006A} },
+ [0x1D4F4] = { unicodeslot=0x1D4F4, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL K', specials={'font',0x006B} },
+ [0x1D4F5] = { unicodeslot=0x1D4F5, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL L', specials={'font',0x006C} },
+ [0x1D4F6] = { unicodeslot=0x1D4F6, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL M', specials={'font',0x006D} },
+ [0x1D4F7] = { unicodeslot=0x1D4F7, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL N', specials={'font',0x006E} },
+ [0x1D4F8] = { unicodeslot=0x1D4F8, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL O', specials={'font',0x006F} },
+ [0x1D4F9] = { unicodeslot=0x1D4F9, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL P', specials={'font',0x0070} },
+ [0x1D4FA] = { unicodeslot=0x1D4FA, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL Q', specials={'font',0x0071} },
+ [0x1D4FB] = { unicodeslot=0x1D4FB, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL R', specials={'font',0x0072} },
+ [0x1D4FC] = { unicodeslot=0x1D4FC, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL S', specials={'font',0x0073} },
+ [0x1D4FD] = { unicodeslot=0x1D4FD, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL T', specials={'font',0x0074} },
+ [0x1D4FE] = { unicodeslot=0x1D4FE, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL U', specials={'font',0x0075} },
+ [0x1D4FF] = { unicodeslot=0x1D4FF, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL V', specials={'font',0x0076} },
+ [0x1D500] = { unicodeslot=0x1D500, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL W', specials={'font',0x0077} },
+ [0x1D501] = { unicodeslot=0x1D501, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL X', specials={'font',0x0078} },
+ [0x1D502] = { unicodeslot=0x1D502, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL Y', specials={'font',0x0079} },
+ [0x1D503] = { unicodeslot=0x1D503, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL Z', specials={'font',0x007A} },
+ [0x1D504] = { unicodeslot=0x1D504, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL A', specials={'font',0x0041} },
+ [0x1D505] = { unicodeslot=0x1D505, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL B', specials={'font',0x0042} },
+ [0x1D507] = { unicodeslot=0x1D507, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL D', specials={'font',0x0044} },
+ [0x1D508] = { unicodeslot=0x1D508, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL E', specials={'font',0x0045} },
+ [0x1D509] = { unicodeslot=0x1D509, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL F', specials={'font',0x0046} },
+ [0x1D50A] = { unicodeslot=0x1D50A, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL G', specials={'font',0x0047} },
+ [0x1D50D] = { unicodeslot=0x1D50D, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL J', specials={'font',0x004A} },
+ [0x1D50E] = { unicodeslot=0x1D50E, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL K', specials={'font',0x004B} },
+ [0x1D50F] = { unicodeslot=0x1D50F, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL L', specials={'font',0x004C} },
+ [0x1D510] = { unicodeslot=0x1D510, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL M', specials={'font',0x004D} },
+ [0x1D511] = { unicodeslot=0x1D511, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL N', specials={'font',0x004E} },
+ [0x1D512] = { unicodeslot=0x1D512, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL O', specials={'font',0x004F} },
+ [0x1D513] = { unicodeslot=0x1D513, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL P', specials={'font',0x0050} },
+ [0x1D514] = { unicodeslot=0x1D514, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL Q', specials={'font',0x0051} },
+ [0x1D516] = { unicodeslot=0x1D516, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL S', specials={'font',0x0053} },
+ [0x1D517] = { unicodeslot=0x1D517, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL T', specials={'font',0x0054} },
+ [0x1D518] = { unicodeslot=0x1D518, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL U', specials={'font',0x0055} },
+ [0x1D519] = { unicodeslot=0x1D519, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL V', specials={'font',0x0056} },
+ [0x1D51A] = { unicodeslot=0x1D51A, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL W', specials={'font',0x0057} },
+ [0x1D51B] = { unicodeslot=0x1D51B, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL X', specials={'font',0x0058} },
+ [0x1D51C] = { unicodeslot=0x1D51C, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL Y', specials={'font',0x0059} },
+ [0x1D51E] = { unicodeslot=0x1D51E, category='ll', description='MATHEMATICAL FRAKTUR SMALL A', specials={'font',0x0061} },
+ [0x1D51F] = { unicodeslot=0x1D51F, category='ll', description='MATHEMATICAL FRAKTUR SMALL B', specials={'font',0x0062} },
+ [0x1D520] = { unicodeslot=0x1D520, category='ll', description='MATHEMATICAL FRAKTUR SMALL C', specials={'font',0x0063} },
+ [0x1D521] = { unicodeslot=0x1D521, category='ll', description='MATHEMATICAL FRAKTUR SMALL D', specials={'font',0x0064} },
+ [0x1D522] = { unicodeslot=0x1D522, category='ll', description='MATHEMATICAL FRAKTUR SMALL E', specials={'font',0x0065} },
+ [0x1D523] = { unicodeslot=0x1D523, category='ll', description='MATHEMATICAL FRAKTUR SMALL F', specials={'font',0x0066} },
+ [0x1D524] = { unicodeslot=0x1D524, category='ll', description='MATHEMATICAL FRAKTUR SMALL G', specials={'font',0x0067} },
+ [0x1D525] = { unicodeslot=0x1D525, category='ll', description='MATHEMATICAL FRAKTUR SMALL H', specials={'font',0x0068} },
+ [0x1D526] = { unicodeslot=0x1D526, category='ll', description='MATHEMATICAL FRAKTUR SMALL I', specials={'font',0x0069} },
+ [0x1D527] = { unicodeslot=0x1D527, category='ll', description='MATHEMATICAL FRAKTUR SMALL J', specials={'font',0x006A} },
+ [0x1D528] = { unicodeslot=0x1D528, category='ll', description='MATHEMATICAL FRAKTUR SMALL K', specials={'font',0x006B} },
+ [0x1D529] = { unicodeslot=0x1D529, category='ll', description='MATHEMATICAL FRAKTUR SMALL L', specials={'font',0x006C} },
+ [0x1D52A] = { unicodeslot=0x1D52A, category='ll', description='MATHEMATICAL FRAKTUR SMALL M', specials={'font',0x006D} },
+ [0x1D52B] = { unicodeslot=0x1D52B, category='ll', description='MATHEMATICAL FRAKTUR SMALL N', specials={'font',0x006E} },
+ [0x1D52C] = { unicodeslot=0x1D52C, category='ll', description='MATHEMATICAL FRAKTUR SMALL O', specials={'font',0x006F} },
+ [0x1D52D] = { unicodeslot=0x1D52D, category='ll', description='MATHEMATICAL FRAKTUR SMALL P', specials={'font',0x0070} },
+ [0x1D52E] = { unicodeslot=0x1D52E, category='ll', description='MATHEMATICAL FRAKTUR SMALL Q', specials={'font',0x0071} },
+ [0x1D52F] = { unicodeslot=0x1D52F, category='ll', description='MATHEMATICAL FRAKTUR SMALL R', specials={'font',0x0072} },
+ [0x1D530] = { unicodeslot=0x1D530, category='ll', description='MATHEMATICAL FRAKTUR SMALL S', specials={'font',0x0073} },
+ [0x1D531] = { unicodeslot=0x1D531, category='ll', description='MATHEMATICAL FRAKTUR SMALL T', specials={'font',0x0074} },
+ [0x1D532] = { unicodeslot=0x1D532, category='ll', description='MATHEMATICAL FRAKTUR SMALL U', specials={'font',0x0075} },
+ [0x1D533] = { unicodeslot=0x1D533, category='ll', description='MATHEMATICAL FRAKTUR SMALL V', specials={'font',0x0076} },
+ [0x1D534] = { unicodeslot=0x1D534, category='ll', description='MATHEMATICAL FRAKTUR SMALL W', specials={'font',0x0077} },
+ [0x1D535] = { unicodeslot=0x1D535, category='ll', description='MATHEMATICAL FRAKTUR SMALL X', specials={'font',0x0078} },
+ [0x1D536] = { unicodeslot=0x1D536, category='ll', description='MATHEMATICAL FRAKTUR SMALL Y', specials={'font',0x0079} },
+ [0x1D537] = { unicodeslot=0x1D537, category='ll', description='MATHEMATICAL FRAKTUR SMALL Z', specials={'font',0x007A} },
+ [0x1D538] = { unicodeslot=0x1D538, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL A', specials={'font',0x0041} },
+ [0x1D539] = { unicodeslot=0x1D539, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL B', specials={'font',0x0042} },
+ [0x1D53B] = { unicodeslot=0x1D53B, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL D', specials={'font',0x0044} },
+ [0x1D53C] = { unicodeslot=0x1D53C, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL E', specials={'font',0x0045} },
+ [0x1D53D] = { unicodeslot=0x1D53D, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL F', specials={'font',0x0046} },
+ [0x1D53E] = { unicodeslot=0x1D53E, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL G', specials={'font',0x0047} },
+ [0x1D540] = { unicodeslot=0x1D540, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL I', specials={'font',0x0049} },
+ [0x1D541] = { unicodeslot=0x1D541, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL J', specials={'font',0x004A} },
+ [0x1D542] = { unicodeslot=0x1D542, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL K', specials={'font',0x004B} },
+ [0x1D543] = { unicodeslot=0x1D543, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL L', specials={'font',0x004C} },
+ [0x1D544] = { unicodeslot=0x1D544, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL M', specials={'font',0x004D} },
+ [0x1D546] = { unicodeslot=0x1D546, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL O', specials={'font',0x004F} },
+ [0x1D54A] = { unicodeslot=0x1D54A, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL S', specials={'font',0x0053} },
+ [0x1D54B] = { unicodeslot=0x1D54B, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL T', specials={'font',0x0054} },
+ [0x1D54C] = { unicodeslot=0x1D54C, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL U', specials={'font',0x0055} },
+ [0x1D54D] = { unicodeslot=0x1D54D, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL V', specials={'font',0x0056} },
+ [0x1D54E] = { unicodeslot=0x1D54E, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL W', specials={'font',0x0057} },
+ [0x1D54F] = { unicodeslot=0x1D54F, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL X', specials={'font',0x0058} },
+ [0x1D550] = { unicodeslot=0x1D550, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL Y', specials={'font',0x0059} },
+ [0x1D552] = { unicodeslot=0x1D552, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL A', specials={'font',0x0061} },
+ [0x1D553] = { unicodeslot=0x1D553, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL B', specials={'font',0x0062} },
+ [0x1D554] = { unicodeslot=0x1D554, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL C', specials={'font',0x0063} },
+ [0x1D555] = { unicodeslot=0x1D555, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL D', specials={'font',0x0064} },
+ [0x1D556] = { unicodeslot=0x1D556, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL E', specials={'font',0x0065} },
+ [0x1D557] = { unicodeslot=0x1D557, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL F', specials={'font',0x0066} },
+ [0x1D558] = { unicodeslot=0x1D558, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL G', specials={'font',0x0067} },
+ [0x1D559] = { unicodeslot=0x1D559, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL H', specials={'font',0x0068} },
+ [0x1D55A] = { unicodeslot=0x1D55A, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL I', specials={'font',0x0069} },
+ [0x1D55B] = { unicodeslot=0x1D55B, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL J', specials={'font',0x006A} },
+ [0x1D55C] = { unicodeslot=0x1D55C, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL K', specials={'font',0x006B} },
+ [0x1D55D] = { unicodeslot=0x1D55D, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL L', specials={'font',0x006C} },
+ [0x1D55E] = { unicodeslot=0x1D55E, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL M', specials={'font',0x006D} },
+ [0x1D55F] = { unicodeslot=0x1D55F, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL N', specials={'font',0x006E} },
+ [0x1D560] = { unicodeslot=0x1D560, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL O', specials={'font',0x006F} },
+ [0x1D561] = { unicodeslot=0x1D561, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL P', specials={'font',0x0070} },
+ [0x1D562] = { unicodeslot=0x1D562, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL Q', specials={'font',0x0071} },
+ [0x1D563] = { unicodeslot=0x1D563, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL R', specials={'font',0x0072} },
+ [0x1D564] = { unicodeslot=0x1D564, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL S', specials={'font',0x0073} },
+ [0x1D565] = { unicodeslot=0x1D565, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL T', specials={'font',0x0074} },
+ [0x1D566] = { unicodeslot=0x1D566, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL U', specials={'font',0x0075} },
+ [0x1D567] = { unicodeslot=0x1D567, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL V', specials={'font',0x0076} },
+ [0x1D568] = { unicodeslot=0x1D568, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL W', specials={'font',0x0077} },
+ [0x1D569] = { unicodeslot=0x1D569, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL X', specials={'font',0x0078} },
+ [0x1D56A] = { unicodeslot=0x1D56A, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL Y', specials={'font',0x0079} },
+ [0x1D56B] = { unicodeslot=0x1D56B, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL Z', specials={'font',0x007A} },
+ [0x1D56C] = { unicodeslot=0x1D56C, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL A', specials={'font',0x0041} },
+ [0x1D56D] = { unicodeslot=0x1D56D, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL B', specials={'font',0x0042} },
+ [0x1D56E] = { unicodeslot=0x1D56E, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL C', specials={'font',0x0043} },
+ [0x1D56F] = { unicodeslot=0x1D56F, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL D', specials={'font',0x0044} },
+ [0x1D570] = { unicodeslot=0x1D570, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL E', specials={'font',0x0045} },
+ [0x1D571] = { unicodeslot=0x1D571, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL F', specials={'font',0x0046} },
+ [0x1D572] = { unicodeslot=0x1D572, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL G', specials={'font',0x0047} },
+ [0x1D573] = { unicodeslot=0x1D573, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL H', specials={'font',0x0048} },
+ [0x1D574] = { unicodeslot=0x1D574, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL I', specials={'font',0x0049} },
+ [0x1D575] = { unicodeslot=0x1D575, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL J', specials={'font',0x004A} },
+ [0x1D576] = { unicodeslot=0x1D576, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL K', specials={'font',0x004B} },
+ [0x1D577] = { unicodeslot=0x1D577, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL L', specials={'font',0x004C} },
+ [0x1D578] = { unicodeslot=0x1D578, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL M', specials={'font',0x004D} },
+ [0x1D579] = { unicodeslot=0x1D579, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL N', specials={'font',0x004E} },
+ [0x1D57A] = { unicodeslot=0x1D57A, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL O', specials={'font',0x004F} },
+ [0x1D57B] = { unicodeslot=0x1D57B, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL P', specials={'font',0x0050} },
+ [0x1D57C] = { unicodeslot=0x1D57C, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL Q', specials={'font',0x0051} },
+ [0x1D57D] = { unicodeslot=0x1D57D, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL R', specials={'font',0x0052} },
+ [0x1D57E] = { unicodeslot=0x1D57E, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL S', specials={'font',0x0053} },
+ [0x1D57F] = { unicodeslot=0x1D57F, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL T', specials={'font',0x0054} },
+ [0x1D580] = { unicodeslot=0x1D580, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL U', specials={'font',0x0055} },
+ [0x1D581] = { unicodeslot=0x1D581, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL V', specials={'font',0x0056} },
+ [0x1D582] = { unicodeslot=0x1D582, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL W', specials={'font',0x0057} },
+ [0x1D583] = { unicodeslot=0x1D583, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL X', specials={'font',0x0058} },
+ [0x1D584] = { unicodeslot=0x1D584, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL Y', specials={'font',0x0059} },
+ [0x1D585] = { unicodeslot=0x1D585, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL Z', specials={'font',0x005A} },
+ [0x1D586] = { unicodeslot=0x1D586, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL A', specials={'font',0x0061} },
+ [0x1D587] = { unicodeslot=0x1D587, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL B', specials={'font',0x0062} },
+ [0x1D588] = { unicodeslot=0x1D588, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL C', specials={'font',0x0063} },
+ [0x1D589] = { unicodeslot=0x1D589, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL D', specials={'font',0x0064} },
+ [0x1D58A] = { unicodeslot=0x1D58A, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL E', specials={'font',0x0065} },
+ [0x1D58B] = { unicodeslot=0x1D58B, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL F', specials={'font',0x0066} },
+ [0x1D58C] = { unicodeslot=0x1D58C, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL G', specials={'font',0x0067} },
+ [0x1D58D] = { unicodeslot=0x1D58D, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL H', specials={'font',0x0068} },
+ [0x1D58E] = { unicodeslot=0x1D58E, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL I', specials={'font',0x0069} },
+ [0x1D58F] = { unicodeslot=0x1D58F, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL J', specials={'font',0x006A} },
+ [0x1D590] = { unicodeslot=0x1D590, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL K', specials={'font',0x006B} },
+ [0x1D591] = { unicodeslot=0x1D591, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL L', specials={'font',0x006C} },
+ [0x1D592] = { unicodeslot=0x1D592, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL M', specials={'font',0x006D} },
+ [0x1D593] = { unicodeslot=0x1D593, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL N', specials={'font',0x006E} },
+ [0x1D594] = { unicodeslot=0x1D594, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL O', specials={'font',0x006F} },
+ [0x1D595] = { unicodeslot=0x1D595, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL P', specials={'font',0x0070} },
+ [0x1D596] = { unicodeslot=0x1D596, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL Q', specials={'font',0x0071} },
+ [0x1D597] = { unicodeslot=0x1D597, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL R', specials={'font',0x0072} },
+ [0x1D598] = { unicodeslot=0x1D598, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL S', specials={'font',0x0073} },
+ [0x1D599] = { unicodeslot=0x1D599, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL T', specials={'font',0x0074} },
+ [0x1D59A] = { unicodeslot=0x1D59A, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL U', specials={'font',0x0075} },
+ [0x1D59B] = { unicodeslot=0x1D59B, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL V', specials={'font',0x0076} },
+ [0x1D59C] = { unicodeslot=0x1D59C, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL W', specials={'font',0x0077} },
+ [0x1D59D] = { unicodeslot=0x1D59D, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL X', specials={'font',0x0078} },
+ [0x1D59E] = { unicodeslot=0x1D59E, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL Y', specials={'font',0x0079} },
+ [0x1D59F] = { unicodeslot=0x1D59F, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL Z', specials={'font',0x007A} },
+ [0x1D5A0] = { unicodeslot=0x1D5A0, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL A', specials={'font',0x0041} },
+ [0x1D5A1] = { unicodeslot=0x1D5A1, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL B', specials={'font',0x0042} },
+ [0x1D5A2] = { unicodeslot=0x1D5A2, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL C', specials={'font',0x0043} },
+ [0x1D5A3] = { unicodeslot=0x1D5A3, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL D', specials={'font',0x0044} },
+ [0x1D5A4] = { unicodeslot=0x1D5A4, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL E', specials={'font',0x0045} },
+ [0x1D5A5] = { unicodeslot=0x1D5A5, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL F', specials={'font',0x0046} },
+ [0x1D5A6] = { unicodeslot=0x1D5A6, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL G', specials={'font',0x0047} },
+ [0x1D5A7] = { unicodeslot=0x1D5A7, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL H', specials={'font',0x0048} },
+ [0x1D5A8] = { unicodeslot=0x1D5A8, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL I', specials={'font',0x0049} },
+ [0x1D5A9] = { unicodeslot=0x1D5A9, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL J', specials={'font',0x004A} },
+ [0x1D5AA] = { unicodeslot=0x1D5AA, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL K', specials={'font',0x004B} },
+ [0x1D5AB] = { unicodeslot=0x1D5AB, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL L', specials={'font',0x004C} },
+ [0x1D5AC] = { unicodeslot=0x1D5AC, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL M', specials={'font',0x004D} },
+ [0x1D5AD] = { unicodeslot=0x1D5AD, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL N', specials={'font',0x004E} },
+ [0x1D5AE] = { unicodeslot=0x1D5AE, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL O', specials={'font',0x004F} },
+ [0x1D5AF] = { unicodeslot=0x1D5AF, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL P', specials={'font',0x0050} },
+ [0x1D5B0] = { unicodeslot=0x1D5B0, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL Q', specials={'font',0x0051} },
+ [0x1D5B1] = { unicodeslot=0x1D5B1, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL R', specials={'font',0x0052} },
+ [0x1D5B2] = { unicodeslot=0x1D5B2, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL S', specials={'font',0x0053} },
+ [0x1D5B3] = { unicodeslot=0x1D5B3, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL T', specials={'font',0x0054} },
+ [0x1D5B4] = { unicodeslot=0x1D5B4, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL U', specials={'font',0x0055} },
+ [0x1D5B5] = { unicodeslot=0x1D5B5, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL V', specials={'font',0x0056} },
+ [0x1D5B6] = { unicodeslot=0x1D5B6, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL W', specials={'font',0x0057} },
+ [0x1D5B7] = { unicodeslot=0x1D5B7, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL X', specials={'font',0x0058} },
+ [0x1D5B8] = { unicodeslot=0x1D5B8, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL Y', specials={'font',0x0059} },
+ [0x1D5B9] = { unicodeslot=0x1D5B9, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL Z', specials={'font',0x005A} },
+ [0x1D5BA] = { unicodeslot=0x1D5BA, category='ll', description='MATHEMATICAL SANS-SERIF SMALL A', specials={'font',0x0061} },
+ [0x1D5BB] = { unicodeslot=0x1D5BB, category='ll', description='MATHEMATICAL SANS-SERIF SMALL B', specials={'font',0x0062} },
+ [0x1D5BC] = { unicodeslot=0x1D5BC, category='ll', description='MATHEMATICAL SANS-SERIF SMALL C', specials={'font',0x0063} },
+ [0x1D5BD] = { unicodeslot=0x1D5BD, category='ll', description='MATHEMATICAL SANS-SERIF SMALL D', specials={'font',0x0064} },
+ [0x1D5BE] = { unicodeslot=0x1D5BE, category='ll', description='MATHEMATICAL SANS-SERIF SMALL E', specials={'font',0x0065} },
+ [0x1D5BF] = { unicodeslot=0x1D5BF, category='ll', description='MATHEMATICAL SANS-SERIF SMALL F', specials={'font',0x0066} },
+ [0x1D5C0] = { unicodeslot=0x1D5C0, category='ll', description='MATHEMATICAL SANS-SERIF SMALL G', specials={'font',0x0067} },
+ [0x1D5C1] = { unicodeslot=0x1D5C1, category='ll', description='MATHEMATICAL SANS-SERIF SMALL H', specials={'font',0x0068} },
+ [0x1D5C2] = { unicodeslot=0x1D5C2, category='ll', description='MATHEMATICAL SANS-SERIF SMALL I', specials={'font',0x0069} },
+ [0x1D5C3] = { unicodeslot=0x1D5C3, category='ll', description='MATHEMATICAL SANS-SERIF SMALL J', specials={'font',0x006A} },
+ [0x1D5C4] = { unicodeslot=0x1D5C4, category='ll', description='MATHEMATICAL SANS-SERIF SMALL K', specials={'font',0x006B} },
+ [0x1D5C5] = { unicodeslot=0x1D5C5, category='ll', description='MATHEMATICAL SANS-SERIF SMALL L', specials={'font',0x006C} },
+ [0x1D5C6] = { unicodeslot=0x1D5C6, category='ll', description='MATHEMATICAL SANS-SERIF SMALL M', specials={'font',0x006D} },
+ [0x1D5C7] = { unicodeslot=0x1D5C7, category='ll', description='MATHEMATICAL SANS-SERIF SMALL N', specials={'font',0x006E} },
+ [0x1D5C8] = { unicodeslot=0x1D5C8, category='ll', description='MATHEMATICAL SANS-SERIF SMALL O', specials={'font',0x006F} },
+ [0x1D5C9] = { unicodeslot=0x1D5C9, category='ll', description='MATHEMATICAL SANS-SERIF SMALL P', specials={'font',0x0070} },
+ [0x1D5CA] = { unicodeslot=0x1D5CA, category='ll', description='MATHEMATICAL SANS-SERIF SMALL Q', specials={'font',0x0071} },
+ [0x1D5CB] = { unicodeslot=0x1D5CB, category='ll', description='MATHEMATICAL SANS-SERIF SMALL R', specials={'font',0x0072} },
+ [0x1D5CC] = { unicodeslot=0x1D5CC, category='ll', description='MATHEMATICAL SANS-SERIF SMALL S', specials={'font',0x0073} },
+ [0x1D5CD] = { unicodeslot=0x1D5CD, category='ll', description='MATHEMATICAL SANS-SERIF SMALL T', specials={'font',0x0074} },
+ [0x1D5CE] = { unicodeslot=0x1D5CE, category='ll', description='MATHEMATICAL SANS-SERIF SMALL U', specials={'font',0x0075} },
+ [0x1D5CF] = { unicodeslot=0x1D5CF, category='ll', description='MATHEMATICAL SANS-SERIF SMALL V', specials={'font',0x0076} },
+ [0x1D5D0] = { unicodeslot=0x1D5D0, category='ll', description='MATHEMATICAL SANS-SERIF SMALL W', specials={'font',0x0077} },
+ [0x1D5D1] = { unicodeslot=0x1D5D1, category='ll', description='MATHEMATICAL SANS-SERIF SMALL X', specials={'font',0x0078} },
+ [0x1D5D2] = { unicodeslot=0x1D5D2, category='ll', description='MATHEMATICAL SANS-SERIF SMALL Y', specials={'font',0x0079} },
+ [0x1D5D3] = { unicodeslot=0x1D5D3, category='ll', description='MATHEMATICAL SANS-SERIF SMALL Z', specials={'font',0x007A} },
+ [0x1D5D4] = { unicodeslot=0x1D5D4, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL A', specials={'font',0x0041} },
+ [0x1D5D5] = { unicodeslot=0x1D5D5, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL B', specials={'font',0x0042} },
+ [0x1D5D6] = { unicodeslot=0x1D5D6, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL C', specials={'font',0x0043} },
+ [0x1D5D7] = { unicodeslot=0x1D5D7, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL D', specials={'font',0x0044} },
+ [0x1D5D8] = { unicodeslot=0x1D5D8, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL E', specials={'font',0x0045} },
+ [0x1D5D9] = { unicodeslot=0x1D5D9, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL F', specials={'font',0x0046} },
+ [0x1D5DA] = { unicodeslot=0x1D5DA, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL G', specials={'font',0x0047} },
+ [0x1D5DB] = { unicodeslot=0x1D5DB, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL H', specials={'font',0x0048} },
+ [0x1D5DC] = { unicodeslot=0x1D5DC, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL I', specials={'font',0x0049} },
+ [0x1D5DD] = { unicodeslot=0x1D5DD, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL J', specials={'font',0x004A} },
+ [0x1D5DE] = { unicodeslot=0x1D5DE, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL K', specials={'font',0x004B} },
+ [0x1D5DF] = { unicodeslot=0x1D5DF, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL L', specials={'font',0x004C} },
+ [0x1D5E0] = { unicodeslot=0x1D5E0, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL M', specials={'font',0x004D} },
+ [0x1D5E1] = { unicodeslot=0x1D5E1, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL N', specials={'font',0x004E} },
+ [0x1D5E2] = { unicodeslot=0x1D5E2, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL O', specials={'font',0x004F} },
+ [0x1D5E3] = { unicodeslot=0x1D5E3, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL P', specials={'font',0x0050} },
+ [0x1D5E4] = { unicodeslot=0x1D5E4, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL Q', specials={'font',0x0051} },
+ [0x1D5E5] = { unicodeslot=0x1D5E5, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL R', specials={'font',0x0052} },
+ [0x1D5E6] = { unicodeslot=0x1D5E6, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL S', specials={'font',0x0053} },
+ [0x1D5E7] = { unicodeslot=0x1D5E7, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL T', specials={'font',0x0054} },
+ [0x1D5E8] = { unicodeslot=0x1D5E8, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL U', specials={'font',0x0055} },
+ [0x1D5E9] = { unicodeslot=0x1D5E9, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL V', specials={'font',0x0056} },
+ [0x1D5EA] = { unicodeslot=0x1D5EA, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL W', specials={'font',0x0057} },
+ [0x1D5EB] = { unicodeslot=0x1D5EB, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL X', specials={'font',0x0058} },
+ [0x1D5EC] = { unicodeslot=0x1D5EC, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL Y', specials={'font',0x0059} },
+ [0x1D5ED] = { unicodeslot=0x1D5ED, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL Z', specials={'font',0x005A} },
+ [0x1D5EE] = { unicodeslot=0x1D5EE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL A', specials={'font',0x0061} },
+ [0x1D5EF] = { unicodeslot=0x1D5EF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL B', specials={'font',0x0062} },
+ [0x1D5F0] = { unicodeslot=0x1D5F0, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL C', specials={'font',0x0063} },
+ [0x1D5F1] = { unicodeslot=0x1D5F1, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL D', specials={'font',0x0064} },
+ [0x1D5F2] = { unicodeslot=0x1D5F2, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL E', specials={'font',0x0065} },
+ [0x1D5F3] = { unicodeslot=0x1D5F3, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL F', specials={'font',0x0066} },
+ [0x1D5F4] = { unicodeslot=0x1D5F4, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL G', specials={'font',0x0067} },
+ [0x1D5F5] = { unicodeslot=0x1D5F5, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL H', specials={'font',0x0068} },
+ [0x1D5F6] = { unicodeslot=0x1D5F6, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL I', specials={'font',0x0069} },
+ [0x1D5F7] = { unicodeslot=0x1D5F7, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL J', specials={'font',0x006A} },
+ [0x1D5F8] = { unicodeslot=0x1D5F8, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL K', specials={'font',0x006B} },
+ [0x1D5F9] = { unicodeslot=0x1D5F9, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL L', specials={'font',0x006C} },
+ [0x1D5FA] = { unicodeslot=0x1D5FA, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL M', specials={'font',0x006D} },
+ [0x1D5FB] = { unicodeslot=0x1D5FB, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL N', specials={'font',0x006E} },
+ [0x1D5FC] = { unicodeslot=0x1D5FC, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL O', specials={'font',0x006F} },
+ [0x1D5FD] = { unicodeslot=0x1D5FD, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL P', specials={'font',0x0070} },
+ [0x1D5FE] = { unicodeslot=0x1D5FE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL Q', specials={'font',0x0071} },
+ [0x1D5FF] = { unicodeslot=0x1D5FF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL R', specials={'font',0x0072} },
+ [0x1D600] = { unicodeslot=0x1D600, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL S', specials={'font',0x0073} },
+ [0x1D601] = { unicodeslot=0x1D601, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL T', specials={'font',0x0074} },
+ [0x1D602] = { unicodeslot=0x1D602, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL U', specials={'font',0x0075} },
+ [0x1D603] = { unicodeslot=0x1D603, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL V', specials={'font',0x0076} },
+ [0x1D604] = { unicodeslot=0x1D604, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL W', specials={'font',0x0077} },
+ [0x1D605] = { unicodeslot=0x1D605, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL X', specials={'font',0x0078} },
+ [0x1D606] = { unicodeslot=0x1D606, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL Y', specials={'font',0x0079} },
+ [0x1D607] = { unicodeslot=0x1D607, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL Z', specials={'font',0x007A} },
+ [0x1D608] = { unicodeslot=0x1D608, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL A', specials={'font',0x0041} },
+ [0x1D609] = { unicodeslot=0x1D609, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL B', specials={'font',0x0042} },
+ [0x1D60A] = { unicodeslot=0x1D60A, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL C', specials={'font',0x0043} },
+ [0x1D60B] = { unicodeslot=0x1D60B, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL D', specials={'font',0x0044} },
+ [0x1D60C] = { unicodeslot=0x1D60C, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL E', specials={'font',0x0045} },
+ [0x1D60D] = { unicodeslot=0x1D60D, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL F', specials={'font',0x0046} },
+ [0x1D60E] = { unicodeslot=0x1D60E, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL G', specials={'font',0x0047} },
+ [0x1D60F] = { unicodeslot=0x1D60F, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL H', specials={'font',0x0048} },
+ [0x1D610] = { unicodeslot=0x1D610, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL I', specials={'font',0x0049} },
+ [0x1D611] = { unicodeslot=0x1D611, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL J', specials={'font',0x004A} },
+ [0x1D612] = { unicodeslot=0x1D612, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL K', specials={'font',0x004B} },
+ [0x1D613] = { unicodeslot=0x1D613, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL L', specials={'font',0x004C} },
+ [0x1D614] = { unicodeslot=0x1D614, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL M', specials={'font',0x004D} },
+ [0x1D615] = { unicodeslot=0x1D615, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL N', specials={'font',0x004E} },
+ [0x1D616] = { unicodeslot=0x1D616, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL O', specials={'font',0x004F} },
+ [0x1D617] = { unicodeslot=0x1D617, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL P', specials={'font',0x0050} },
+ [0x1D618] = { unicodeslot=0x1D618, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q', specials={'font',0x0051} },
+ [0x1D619] = { unicodeslot=0x1D619, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL R', specials={'font',0x0052} },
+ [0x1D61A] = { unicodeslot=0x1D61A, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL S', specials={'font',0x0053} },
+ [0x1D61B] = { unicodeslot=0x1D61B, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL T', specials={'font',0x0054} },
+ [0x1D61C] = { unicodeslot=0x1D61C, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL U', specials={'font',0x0055} },
+ [0x1D61D] = { unicodeslot=0x1D61D, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL V', specials={'font',0x0056} },
+ [0x1D61E] = { unicodeslot=0x1D61E, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL W', specials={'font',0x0057} },
+ [0x1D61F] = { unicodeslot=0x1D61F, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL X', specials={'font',0x0058} },
+ [0x1D620] = { unicodeslot=0x1D620, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y', specials={'font',0x0059} },
+ [0x1D621] = { unicodeslot=0x1D621, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z', specials={'font',0x005A} },
+ [0x1D622] = { unicodeslot=0x1D622, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL A', specials={'font',0x0061} },
+ [0x1D623] = { unicodeslot=0x1D623, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL B', specials={'font',0x0062} },
+ [0x1D624] = { unicodeslot=0x1D624, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL C', specials={'font',0x0063} },
+ [0x1D625] = { unicodeslot=0x1D625, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL D', specials={'font',0x0064} },
+ [0x1D626] = { unicodeslot=0x1D626, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL E', specials={'font',0x0065} },
+ [0x1D627] = { unicodeslot=0x1D627, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL F', specials={'font',0x0066} },
+ [0x1D628] = { unicodeslot=0x1D628, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL G', specials={'font',0x0067} },
+ [0x1D629] = { unicodeslot=0x1D629, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL H', specials={'font',0x0068} },
+ [0x1D62A] = { unicodeslot=0x1D62A, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL I', specials={'font',0x0069} },
+ [0x1D62B] = { unicodeslot=0x1D62B, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL J', specials={'font',0x006A} },
+ [0x1D62C] = { unicodeslot=0x1D62C, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL K', specials={'font',0x006B} },
+ [0x1D62D] = { unicodeslot=0x1D62D, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL L', specials={'font',0x006C} },
+ [0x1D62E] = { unicodeslot=0x1D62E, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL M', specials={'font',0x006D} },
+ [0x1D62F] = { unicodeslot=0x1D62F, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL N', specials={'font',0x006E} },
+ [0x1D630] = { unicodeslot=0x1D630, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL O', specials={'font',0x006F} },
+ [0x1D631] = { unicodeslot=0x1D631, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL P', specials={'font',0x0070} },
+ [0x1D632] = { unicodeslot=0x1D632, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL Q', specials={'font',0x0071} },
+ [0x1D633] = { unicodeslot=0x1D633, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL R', specials={'font',0x0072} },
+ [0x1D634] = { unicodeslot=0x1D634, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL S', specials={'font',0x0073} },
+ [0x1D635] = { unicodeslot=0x1D635, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL T', specials={'font',0x0074} },
+ [0x1D636] = { unicodeslot=0x1D636, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL U', specials={'font',0x0075} },
+ [0x1D637] = { unicodeslot=0x1D637, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL V', specials={'font',0x0076} },
+ [0x1D638] = { unicodeslot=0x1D638, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL W', specials={'font',0x0077} },
+ [0x1D639] = { unicodeslot=0x1D639, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL X', specials={'font',0x0078} },
+ [0x1D63A] = { unicodeslot=0x1D63A, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL Y', specials={'font',0x0079} },
+ [0x1D63B] = { unicodeslot=0x1D63B, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL Z', specials={'font',0x007A} },
+ [0x1D63C] = { unicodeslot=0x1D63C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A', specials={'font',0x0041} },
+ [0x1D63D] = { unicodeslot=0x1D63D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B', specials={'font',0x0042} },
+ [0x1D63E] = { unicodeslot=0x1D63E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C', specials={'font',0x0043} },
+ [0x1D63F] = { unicodeslot=0x1D63F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D', specials={'font',0x0044} },
+ [0x1D640] = { unicodeslot=0x1D640, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E', specials={'font',0x0045} },
+ [0x1D641] = { unicodeslot=0x1D641, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F', specials={'font',0x0046} },
+ [0x1D642] = { unicodeslot=0x1D642, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G', specials={'font',0x0047} },
+ [0x1D643] = { unicodeslot=0x1D643, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H', specials={'font',0x0048} },
+ [0x1D644] = { unicodeslot=0x1D644, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I', specials={'font',0x0049} },
+ [0x1D645] = { unicodeslot=0x1D645, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J', specials={'font',0x004A} },
+ [0x1D646] = { unicodeslot=0x1D646, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K', specials={'font',0x004B} },
+ [0x1D647] = { unicodeslot=0x1D647, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L', specials={'font',0x004C} },
+ [0x1D648] = { unicodeslot=0x1D648, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M', specials={'font',0x004D} },
+ [0x1D649] = { unicodeslot=0x1D649, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N', specials={'font',0x004E} },
+ [0x1D64A] = { unicodeslot=0x1D64A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O', specials={'font',0x004F} },
+ [0x1D64B] = { unicodeslot=0x1D64B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P', specials={'font',0x0050} },
+ [0x1D64C] = { unicodeslot=0x1D64C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q', specials={'font',0x0051} },
+ [0x1D64D] = { unicodeslot=0x1D64D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R', specials={'font',0x0052} },
+ [0x1D64E] = { unicodeslot=0x1D64E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S', specials={'font',0x0053} },
+ [0x1D64F] = { unicodeslot=0x1D64F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T', specials={'font',0x0054} },
+ [0x1D650] = { unicodeslot=0x1D650, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U', specials={'font',0x0055} },
+ [0x1D651] = { unicodeslot=0x1D651, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V', specials={'font',0x0056} },
+ [0x1D652] = { unicodeslot=0x1D652, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W', specials={'font',0x0057} },
+ [0x1D653] = { unicodeslot=0x1D653, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X', specials={'font',0x0058} },
+ [0x1D654] = { unicodeslot=0x1D654, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y', specials={'font',0x0059} },
+ [0x1D655] = { unicodeslot=0x1D655, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z', specials={'font',0x005A} },
+ [0x1D656] = { unicodeslot=0x1D656, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A', specials={'font',0x0061} },
+ [0x1D657] = { unicodeslot=0x1D657, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B', specials={'font',0x0062} },
+ [0x1D658] = { unicodeslot=0x1D658, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C', specials={'font',0x0063} },
+ [0x1D659] = { unicodeslot=0x1D659, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D', specials={'font',0x0064} },
+ [0x1D65A] = { unicodeslot=0x1D65A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E', specials={'font',0x0065} },
+ [0x1D65B] = { unicodeslot=0x1D65B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F', specials={'font',0x0066} },
+ [0x1D65C] = { unicodeslot=0x1D65C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G', specials={'font',0x0067} },
+ [0x1D65D] = { unicodeslot=0x1D65D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H', specials={'font',0x0068} },
+ [0x1D65E] = { unicodeslot=0x1D65E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I', specials={'font',0x0069} },
+ [0x1D65F] = { unicodeslot=0x1D65F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J', specials={'font',0x006A} },
+ [0x1D660] = { unicodeslot=0x1D660, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K', specials={'font',0x006B} },
+ [0x1D661] = { unicodeslot=0x1D661, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L', specials={'font',0x006C} },
+ [0x1D662] = { unicodeslot=0x1D662, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M', specials={'font',0x006D} },
+ [0x1D663] = { unicodeslot=0x1D663, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N', specials={'font',0x006E} },
+ [0x1D664] = { unicodeslot=0x1D664, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O', specials={'font',0x006F} },
+ [0x1D665] = { unicodeslot=0x1D665, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P', specials={'font',0x0070} },
+ [0x1D666] = { unicodeslot=0x1D666, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q', specials={'font',0x0071} },
+ [0x1D667] = { unicodeslot=0x1D667, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R', specials={'font',0x0072} },
+ [0x1D668] = { unicodeslot=0x1D668, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S', specials={'font',0x0073} },
+ [0x1D669] = { unicodeslot=0x1D669, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T', specials={'font',0x0074} },
+ [0x1D66A] = { unicodeslot=0x1D66A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U', specials={'font',0x0075} },
+ [0x1D66B] = { unicodeslot=0x1D66B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V', specials={'font',0x0076} },
+ [0x1D66C] = { unicodeslot=0x1D66C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W', specials={'font',0x0077} },
+ [0x1D66D] = { unicodeslot=0x1D66D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X', specials={'font',0x0078} },
+ [0x1D66E] = { unicodeslot=0x1D66E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y', specials={'font',0x0079} },
+ [0x1D66F] = { unicodeslot=0x1D66F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z', specials={'font',0x007A} },
+ [0x1D670] = { unicodeslot=0x1D670, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL A', specials={'font',0x0041} },
+ [0x1D671] = { unicodeslot=0x1D671, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL B', specials={'font',0x0042} },
+ [0x1D672] = { unicodeslot=0x1D672, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL C', specials={'font',0x0043} },
+ [0x1D673] = { unicodeslot=0x1D673, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL D', specials={'font',0x0044} },
+ [0x1D674] = { unicodeslot=0x1D674, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL E', specials={'font',0x0045} },
+ [0x1D675] = { unicodeslot=0x1D675, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL F', specials={'font',0x0046} },
+ [0x1D676] = { unicodeslot=0x1D676, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL G', specials={'font',0x0047} },
+ [0x1D677] = { unicodeslot=0x1D677, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL H', specials={'font',0x0048} },
+ [0x1D678] = { unicodeslot=0x1D678, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL I', specials={'font',0x0049} },
+ [0x1D679] = { unicodeslot=0x1D679, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL J', specials={'font',0x004A} },
+ [0x1D67A] = { unicodeslot=0x1D67A, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL K', specials={'font',0x004B} },
+ [0x1D67B] = { unicodeslot=0x1D67B, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL L', specials={'font',0x004C} },
+ [0x1D67C] = { unicodeslot=0x1D67C, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL M', specials={'font',0x004D} },
+ [0x1D67D] = { unicodeslot=0x1D67D, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL N', specials={'font',0x004E} },
+ [0x1D67E] = { unicodeslot=0x1D67E, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL O', specials={'font',0x004F} },
+ [0x1D67F] = { unicodeslot=0x1D67F, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL P', specials={'font',0x0050} },
+ [0x1D680] = { unicodeslot=0x1D680, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL Q', specials={'font',0x0051} },
+ [0x1D681] = { unicodeslot=0x1D681, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL R', specials={'font',0x0052} },
+ [0x1D682] = { unicodeslot=0x1D682, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL S', specials={'font',0x0053} },
+ [0x1D683] = { unicodeslot=0x1D683, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL T', specials={'font',0x0054} },
+ [0x1D684] = { unicodeslot=0x1D684, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL U', specials={'font',0x0055} },
+ [0x1D685] = { unicodeslot=0x1D685, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL V', specials={'font',0x0056} },
+ [0x1D686] = { unicodeslot=0x1D686, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL W', specials={'font',0x0057} },
+ [0x1D687] = { unicodeslot=0x1D687, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL X', specials={'font',0x0058} },
+ [0x1D688] = { unicodeslot=0x1D688, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL Y', specials={'font',0x0059} },
+ [0x1D689] = { unicodeslot=0x1D689, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL Z', specials={'font',0x005A} },
+ [0x1D68A] = { unicodeslot=0x1D68A, category='ll', description='MATHEMATICAL MONOSPACE SMALL A', specials={'font',0x0061} },
+ [0x1D68B] = { unicodeslot=0x1D68B, category='ll', description='MATHEMATICAL MONOSPACE SMALL B', specials={'font',0x0062} },
+ [0x1D68C] = { unicodeslot=0x1D68C, category='ll', description='MATHEMATICAL MONOSPACE SMALL C', specials={'font',0x0063} },
+ [0x1D68D] = { unicodeslot=0x1D68D, category='ll', description='MATHEMATICAL MONOSPACE SMALL D', specials={'font',0x0064} },
+ [0x1D68E] = { unicodeslot=0x1D68E, category='ll', description='MATHEMATICAL MONOSPACE SMALL E', specials={'font',0x0065} },
+ [0x1D68F] = { unicodeslot=0x1D68F, category='ll', description='MATHEMATICAL MONOSPACE SMALL F', specials={'font',0x0066} },
+ [0x1D690] = { unicodeslot=0x1D690, category='ll', description='MATHEMATICAL MONOSPACE SMALL G', specials={'font',0x0067} },
+ [0x1D691] = { unicodeslot=0x1D691, category='ll', description='MATHEMATICAL MONOSPACE SMALL H', specials={'font',0x0068} },
+ [0x1D692] = { unicodeslot=0x1D692, category='ll', description='MATHEMATICAL MONOSPACE SMALL I', specials={'font',0x0069} },
+ [0x1D693] = { unicodeslot=0x1D693, category='ll', description='MATHEMATICAL MONOSPACE SMALL J', specials={'font',0x006A} },
+ [0x1D694] = { unicodeslot=0x1D694, category='ll', description='MATHEMATICAL MONOSPACE SMALL K', specials={'font',0x006B} },
+ [0x1D695] = { unicodeslot=0x1D695, category='ll', description='MATHEMATICAL MONOSPACE SMALL L', specials={'font',0x006C} },
+ [0x1D696] = { unicodeslot=0x1D696, category='ll', description='MATHEMATICAL MONOSPACE SMALL M', specials={'font',0x006D} },
+ [0x1D697] = { unicodeslot=0x1D697, category='ll', description='MATHEMATICAL MONOSPACE SMALL N', specials={'font',0x006E} },
+ [0x1D698] = { unicodeslot=0x1D698, category='ll', description='MATHEMATICAL MONOSPACE SMALL O', specials={'font',0x006F} },
+ [0x1D699] = { unicodeslot=0x1D699, category='ll', description='MATHEMATICAL MONOSPACE SMALL P', specials={'font',0x0070} },
+ [0x1D69A] = { unicodeslot=0x1D69A, category='ll', description='MATHEMATICAL MONOSPACE SMALL Q', specials={'font',0x0071} },
+ [0x1D69B] = { unicodeslot=0x1D69B, category='ll', description='MATHEMATICAL MONOSPACE SMALL R', specials={'font',0x0072} },
+ [0x1D69C] = { unicodeslot=0x1D69C, category='ll', description='MATHEMATICAL MONOSPACE SMALL S', specials={'font',0x0073} },
+ [0x1D69D] = { unicodeslot=0x1D69D, category='ll', description='MATHEMATICAL MONOSPACE SMALL T', specials={'font',0x0074} },
+ [0x1D69E] = { unicodeslot=0x1D69E, category='ll', description='MATHEMATICAL MONOSPACE SMALL U', specials={'font',0x0075} },
+ [0x1D69F] = { unicodeslot=0x1D69F, category='ll', description='MATHEMATICAL MONOSPACE SMALL V', specials={'font',0x0076} },
+ [0x1D6A0] = { unicodeslot=0x1D6A0, category='ll', description='MATHEMATICAL MONOSPACE SMALL W', specials={'font',0x0077} },
+ [0x1D6A1] = { unicodeslot=0x1D6A1, category='ll', description='MATHEMATICAL MONOSPACE SMALL X', specials={'font',0x0078} },
+ [0x1D6A2] = { unicodeslot=0x1D6A2, category='ll', description='MATHEMATICAL MONOSPACE SMALL Y', specials={'font',0x0079} },
+ [0x1D6A3] = { unicodeslot=0x1D6A3, category='ll', description='MATHEMATICAL MONOSPACE SMALL Z', specials={'font',0x007A} },
+ [0x1D6A4] = { unicodeslot=0x1D6A4, category='ll', description='MATHEMATICAL ITALIC SMALL DOTLESS I', specials={'font',0x0131} },
+ [0x1D6A5] = { unicodeslot=0x1D6A5, category='ll', description='MATHEMATICAL ITALIC SMALL DOTLESS J', specials={'font',0x0237} },
+ [0x1D6A8] = { unicodeslot=0x1D6A8, category='lu', description='MATHEMATICAL BOLD CAPITAL ALPHA', specials={'font',0x0391} },
+ [0x1D6A9] = { unicodeslot=0x1D6A9, category='lu', description='MATHEMATICAL BOLD CAPITAL BETA', specials={'font',0x0392} },
+ [0x1D6AA] = { unicodeslot=0x1D6AA, category='lu', description='MATHEMATICAL BOLD CAPITAL GAMMA', specials={'font',0x0393} },
+ [0x1D6AB] = { unicodeslot=0x1D6AB, category='lu', description='MATHEMATICAL BOLD CAPITAL DELTA', specials={'font',0x0394} },
+ [0x1D6AC] = { unicodeslot=0x1D6AC, category='lu', description='MATHEMATICAL BOLD CAPITAL EPSILON', specials={'font',0x0395} },
+ [0x1D6AD] = { unicodeslot=0x1D6AD, category='lu', description='MATHEMATICAL BOLD CAPITAL ZETA', specials={'font',0x0396} },
+ [0x1D6AE] = { unicodeslot=0x1D6AE, category='lu', description='MATHEMATICAL BOLD CAPITAL ETA', specials={'font',0x0397} },
+ [0x1D6AF] = { unicodeslot=0x1D6AF, category='lu', description='MATHEMATICAL BOLD CAPITAL THETA', specials={'font',0x0398} },
+ [0x1D6B0] = { unicodeslot=0x1D6B0, category='lu', description='MATHEMATICAL BOLD CAPITAL IOTA', specials={'font',0x0399} },
+ [0x1D6B1] = { unicodeslot=0x1D6B1, category='lu', description='MATHEMATICAL BOLD CAPITAL KAPPA', specials={'font',0x039A} },
+ [0x1D6B2] = { unicodeslot=0x1D6B2, category='lu', description='MATHEMATICAL BOLD CAPITAL LAMDA', specials={'font',0x039B} },
+ [0x1D6B3] = { unicodeslot=0x1D6B3, category='lu', description='MATHEMATICAL BOLD CAPITAL MU', specials={'font',0x039C} },
+ [0x1D6B4] = { unicodeslot=0x1D6B4, category='lu', description='MATHEMATICAL BOLD CAPITAL NU', specials={'font',0x039D} },
+ [0x1D6B5] = { unicodeslot=0x1D6B5, category='lu', description='MATHEMATICAL BOLD CAPITAL XI', specials={'font',0x039E} },
+ [0x1D6B6] = { unicodeslot=0x1D6B6, category='lu', description='MATHEMATICAL BOLD CAPITAL OMICRON', specials={'font',0x039F} },
+ [0x1D6B7] = { unicodeslot=0x1D6B7, category='lu', description='MATHEMATICAL BOLD CAPITAL PI', specials={'font',0x03A0} },
+ [0x1D6B8] = { unicodeslot=0x1D6B8, category='lu', description='MATHEMATICAL BOLD CAPITAL RHO', specials={'font',0x03A1} },
+ [0x1D6B9] = { unicodeslot=0x1D6B9, category='lu', description='MATHEMATICAL BOLD CAPITAL THETA SYMBOL', specials={'font',0x03F4} },
+ [0x1D6BA] = { unicodeslot=0x1D6BA, category='lu', description='MATHEMATICAL BOLD CAPITAL SIGMA', specials={'font',0x03A3} },
+ [0x1D6BB] = { unicodeslot=0x1D6BB, category='lu', description='MATHEMATICAL BOLD CAPITAL TAU', specials={'font',0x03A4} },
+ [0x1D6BC] = { unicodeslot=0x1D6BC, category='lu', description='MATHEMATICAL BOLD CAPITAL UPSILON', specials={'font',0x03A5} },
+ [0x1D6BD] = { unicodeslot=0x1D6BD, category='lu', description='MATHEMATICAL BOLD CAPITAL PHI', specials={'font',0x03A6} },
+ [0x1D6BE] = { unicodeslot=0x1D6BE, category='lu', description='MATHEMATICAL BOLD CAPITAL CHI', specials={'font',0x03A7} },
+ [0x1D6BF] = { unicodeslot=0x1D6BF, category='lu', description='MATHEMATICAL BOLD CAPITAL PSI', specials={'font',0x03A8} },
+ [0x1D6C0] = { unicodeslot=0x1D6C0, category='lu', description='MATHEMATICAL BOLD CAPITAL OMEGA', specials={'font',0x03A9} },
+ [0x1D6C1] = { unicodeslot=0x1D6C1, category='sm', description='MATHEMATICAL BOLD NABLA', specials={'font',0x2207} },
+ [0x1D6C2] = { unicodeslot=0x1D6C2, category='ll', description='MATHEMATICAL BOLD SMALL ALPHA', specials={'font',0x03B1} },
+ [0x1D6C3] = { unicodeslot=0x1D6C3, category='ll', description='MATHEMATICAL BOLD SMALL BETA', specials={'font',0x03B2} },
+ [0x1D6C4] = { unicodeslot=0x1D6C4, category='ll', description='MATHEMATICAL BOLD SMALL GAMMA', specials={'font',0x03B3} },
+ [0x1D6C5] = { unicodeslot=0x1D6C5, category='ll', description='MATHEMATICAL BOLD SMALL DELTA', specials={'font',0x03B4} },
+ [0x1D6C6] = { unicodeslot=0x1D6C6, category='ll', description='MATHEMATICAL BOLD SMALL EPSILON', specials={'font',0x03B5} },
+ [0x1D6C7] = { unicodeslot=0x1D6C7, category='ll', description='MATHEMATICAL BOLD SMALL ZETA', specials={'font',0x03B6} },
+ [0x1D6C8] = { unicodeslot=0x1D6C8, category='ll', description='MATHEMATICAL BOLD SMALL ETA', specials={'font',0x03B7} },
+ [0x1D6C9] = { unicodeslot=0x1D6C9, category='ll', description='MATHEMATICAL BOLD SMALL THETA', specials={'font',0x03B8} },
+ [0x1D6CA] = { unicodeslot=0x1D6CA, category='ll', description='MATHEMATICAL BOLD SMALL IOTA', specials={'font',0x03B9} },
+ [0x1D6CB] = { unicodeslot=0x1D6CB, category='ll', description='MATHEMATICAL BOLD SMALL KAPPA', specials={'font',0x03BA} },
+ [0x1D6CC] = { unicodeslot=0x1D6CC, category='ll', description='MATHEMATICAL BOLD SMALL LAMDA', specials={'font',0x03BB} },
+ [0x1D6CD] = { unicodeslot=0x1D6CD, category='ll', description='MATHEMATICAL BOLD SMALL MU', specials={'font',0x03BC} },
+ [0x1D6CE] = { unicodeslot=0x1D6CE, category='ll', description='MATHEMATICAL BOLD SMALL NU', specials={'font',0x03BD} },
+ [0x1D6CF] = { unicodeslot=0x1D6CF, category='ll', description='MATHEMATICAL BOLD SMALL XI', specials={'font',0x03BE} },
+ [0x1D6D0] = { unicodeslot=0x1D6D0, category='ll', description='MATHEMATICAL BOLD SMALL OMICRON', specials={'font',0x03BF} },
+ [0x1D6D1] = { unicodeslot=0x1D6D1, category='ll', description='MATHEMATICAL BOLD SMALL PI', specials={'font',0x03C0} },
+ [0x1D6D2] = { unicodeslot=0x1D6D2, category='ll', description='MATHEMATICAL BOLD SMALL RHO', specials={'font',0x03C1} },
+ [0x1D6D3] = { unicodeslot=0x1D6D3, category='ll', description='MATHEMATICAL BOLD SMALL FINAL SIGMA', specials={'font',0x03C2} },
+ [0x1D6D4] = { unicodeslot=0x1D6D4, category='ll', description='MATHEMATICAL BOLD SMALL SIGMA', specials={'font',0x03C3} },
+ [0x1D6D5] = { unicodeslot=0x1D6D5, category='ll', description='MATHEMATICAL BOLD SMALL TAU', specials={'font',0x03C4} },
+ [0x1D6D6] = { unicodeslot=0x1D6D6, category='ll', description='MATHEMATICAL BOLD SMALL UPSILON', specials={'font',0x03C5} },
+ [0x1D6D7] = { unicodeslot=0x1D6D7, category='ll', description='MATHEMATICAL BOLD SMALL PHI', specials={'font',0x03C6} },
+ [0x1D6D8] = { unicodeslot=0x1D6D8, category='ll', description='MATHEMATICAL BOLD SMALL CHI', specials={'font',0x03C7} },
+ [0x1D6D9] = { unicodeslot=0x1D6D9, category='ll', description='MATHEMATICAL BOLD SMALL PSI', specials={'font',0x03C8} },
+ [0x1D6DA] = { unicodeslot=0x1D6DA, category='ll', description='MATHEMATICAL BOLD SMALL OMEGA', specials={'font',0x03C9} },
+ [0x1D6DB] = { unicodeslot=0x1D6DB, category='sm', description='MATHEMATICAL BOLD PARTIAL DIFFERENTIAL', specials={'font',0x2202} },
+ [0x1D6DC] = { unicodeslot=0x1D6DC, category='ll', description='MATHEMATICAL BOLD EPSILON SYMBOL', specials={'font',0x03F5} },
+ [0x1D6DD] = { unicodeslot=0x1D6DD, category='ll', description='MATHEMATICAL BOLD THETA SYMBOL', specials={'font',0x03D1} },
+ [0x1D6DE] = { unicodeslot=0x1D6DE, category='ll', description='MATHEMATICAL BOLD KAPPA SYMBOL', specials={'font',0x03F0} },
+ [0x1D6DF] = { unicodeslot=0x1D6DF, category='ll', description='MATHEMATICAL BOLD PHI SYMBOL', specials={'font',0x03D5} },
+ [0x1D6E0] = { unicodeslot=0x1D6E0, category='ll', description='MATHEMATICAL BOLD RHO SYMBOL', specials={'font',0x03F1} },
+ [0x1D6E1] = { unicodeslot=0x1D6E1, category='ll', description='MATHEMATICAL BOLD PI SYMBOL', specials={'font',0x03D6} },
+ [0x1D6E2] = { unicodeslot=0x1D6E2, category='lu', description='MATHEMATICAL ITALIC CAPITAL ALPHA', specials={'font',0x0391} },
+ [0x1D6E3] = { unicodeslot=0x1D6E3, category='lu', description='MATHEMATICAL ITALIC CAPITAL BETA', specials={'font',0x0392} },
+ [0x1D6E4] = { unicodeslot=0x1D6E4, category='lu', description='MATHEMATICAL ITALIC CAPITAL GAMMA', specials={'font',0x0393} },
+ [0x1D6E5] = { unicodeslot=0x1D6E5, category='lu', description='MATHEMATICAL ITALIC CAPITAL DELTA', specials={'font',0x0394} },
+ [0x1D6E6] = { unicodeslot=0x1D6E6, category='lu', description='MATHEMATICAL ITALIC CAPITAL EPSILON', specials={'font',0x0395} },
+ [0x1D6E7] = { unicodeslot=0x1D6E7, category='lu', description='MATHEMATICAL ITALIC CAPITAL ZETA', specials={'font',0x0396} },
+ [0x1D6E8] = { unicodeslot=0x1D6E8, category='lu', description='MATHEMATICAL ITALIC CAPITAL ETA', specials={'font',0x0397} },
+ [0x1D6E9] = { unicodeslot=0x1D6E9, category='lu', description='MATHEMATICAL ITALIC CAPITAL THETA', specials={'font',0x0398} },
+ [0x1D6EA] = { unicodeslot=0x1D6EA, category='lu', description='MATHEMATICAL ITALIC CAPITAL IOTA', specials={'font',0x0399} },
+ [0x1D6EB] = { unicodeslot=0x1D6EB, category='lu', description='MATHEMATICAL ITALIC CAPITAL KAPPA', specials={'font',0x039A} },
+ [0x1D6EC] = { unicodeslot=0x1D6EC, category='lu', description='MATHEMATICAL ITALIC CAPITAL LAMDA', specials={'font',0x039B} },
+ [0x1D6ED] = { unicodeslot=0x1D6ED, category='lu', description='MATHEMATICAL ITALIC CAPITAL MU', specials={'font',0x039C} },
+ [0x1D6EE] = { unicodeslot=0x1D6EE, category='lu', description='MATHEMATICAL ITALIC CAPITAL NU', specials={'font',0x039D} },
+ [0x1D6EF] = { unicodeslot=0x1D6EF, category='lu', description='MATHEMATICAL ITALIC CAPITAL XI', specials={'font',0x039E} },
+ [0x1D6F0] = { unicodeslot=0x1D6F0, category='lu', description='MATHEMATICAL ITALIC CAPITAL OMICRON', specials={'font',0x039F} },
+ [0x1D6F1] = { unicodeslot=0x1D6F1, category='lu', description='MATHEMATICAL ITALIC CAPITAL PI', specials={'font',0x03A0} },
+ [0x1D6F2] = { unicodeslot=0x1D6F2, category='lu', description='MATHEMATICAL ITALIC CAPITAL RHO', specials={'font',0x03A1} },
+ [0x1D6F3] = { unicodeslot=0x1D6F3, category='lu', description='MATHEMATICAL ITALIC CAPITAL THETA SYMBOL', specials={'font',0x03F4} },
+ [0x1D6F4] = { unicodeslot=0x1D6F4, category='lu', description='MATHEMATICAL ITALIC CAPITAL SIGMA', specials={'font',0x03A3} },
+ [0x1D6F5] = { unicodeslot=0x1D6F5, category='lu', description='MATHEMATICAL ITALIC CAPITAL TAU', specials={'font',0x03A4} },
+ [0x1D6F6] = { unicodeslot=0x1D6F6, category='lu', description='MATHEMATICAL ITALIC CAPITAL UPSILON', specials={'font',0x03A5} },
+ [0x1D6F7] = { unicodeslot=0x1D6F7, category='lu', description='MATHEMATICAL ITALIC CAPITAL PHI', specials={'font',0x03A6} },
+ [0x1D6F8] = { unicodeslot=0x1D6F8, category='lu', description='MATHEMATICAL ITALIC CAPITAL CHI', specials={'font',0x03A7} },
+ [0x1D6F9] = { unicodeslot=0x1D6F9, category='lu', description='MATHEMATICAL ITALIC CAPITAL PSI', specials={'font',0x03A8} },
+ [0x1D6FA] = { unicodeslot=0x1D6FA, category='lu', description='MATHEMATICAL ITALIC CAPITAL OMEGA', specials={'font',0x03A9} },
+ [0x1D6FB] = { unicodeslot=0x1D6FB, category='sm', description='MATHEMATICAL ITALIC NABLA', specials={'font',0x2207} },
+ [0x1D6FC] = { unicodeslot=0x1D6FC, category='ll', description='MATHEMATICAL ITALIC SMALL ALPHA', specials={'font',0x03B1} },
+ [0x1D6FD] = { unicodeslot=0x1D6FD, category='ll', description='MATHEMATICAL ITALIC SMALL BETA', specials={'font',0x03B2} },
+ [0x1D6FE] = { unicodeslot=0x1D6FE, category='ll', description='MATHEMATICAL ITALIC SMALL GAMMA', specials={'font',0x03B3} },
+ [0x1D6FF] = { unicodeslot=0x1D6FF, category='ll', description='MATHEMATICAL ITALIC SMALL DELTA', specials={'font',0x03B4} },
+ [0x1D700] = { unicodeslot=0x1D700, category='ll', description='MATHEMATICAL ITALIC SMALL EPSILON', specials={'font',0x03B5} },
+ [0x1D701] = { unicodeslot=0x1D701, category='ll', description='MATHEMATICAL ITALIC SMALL ZETA', specials={'font',0x03B6} },
+ [0x1D702] = { unicodeslot=0x1D702, category='ll', description='MATHEMATICAL ITALIC SMALL ETA', specials={'font',0x03B7} },
+ [0x1D703] = { unicodeslot=0x1D703, category='ll', description='MATHEMATICAL ITALIC SMALL THETA', specials={'font',0x03B8} },
+ [0x1D704] = { unicodeslot=0x1D704, category='ll', description='MATHEMATICAL ITALIC SMALL IOTA', specials={'font',0x03B9} },
+ [0x1D705] = { unicodeslot=0x1D705, category='ll', description='MATHEMATICAL ITALIC SMALL KAPPA', specials={'font',0x03BA} },
+ [0x1D706] = { unicodeslot=0x1D706, category='ll', description='MATHEMATICAL ITALIC SMALL LAMDA', specials={'font',0x03BB} },
+ [0x1D707] = { unicodeslot=0x1D707, category='ll', description='MATHEMATICAL ITALIC SMALL MU', specials={'font',0x03BC} },
+ [0x1D708] = { unicodeslot=0x1D708, category='ll', description='MATHEMATICAL ITALIC SMALL NU', specials={'font',0x03BD} },
+ [0x1D709] = { unicodeslot=0x1D709, category='ll', description='MATHEMATICAL ITALIC SMALL XI', specials={'font',0x03BE} },
+ [0x1D70A] = { unicodeslot=0x1D70A, category='ll', description='MATHEMATICAL ITALIC SMALL OMICRON', specials={'font',0x03BF} },
+ [0x1D70B] = { unicodeslot=0x1D70B, category='ll', description='MATHEMATICAL ITALIC SMALL PI', specials={'font',0x03C0} },
+ [0x1D70C] = { unicodeslot=0x1D70C, category='ll', description='MATHEMATICAL ITALIC SMALL RHO', specials={'font',0x03C1} },
+ [0x1D70D] = { unicodeslot=0x1D70D, category='ll', description='MATHEMATICAL ITALIC SMALL FINAL SIGMA', specials={'font',0x03C2} },
+ [0x1D70E] = { unicodeslot=0x1D70E, category='ll', description='MATHEMATICAL ITALIC SMALL SIGMA', specials={'font',0x03C3} },
+ [0x1D70F] = { unicodeslot=0x1D70F, category='ll', description='MATHEMATICAL ITALIC SMALL TAU', specials={'font',0x03C4} },
+ [0x1D710] = { unicodeslot=0x1D710, category='ll', description='MATHEMATICAL ITALIC SMALL UPSILON', specials={'font',0x03C5} },
+ [0x1D711] = { unicodeslot=0x1D711, category='ll', description='MATHEMATICAL ITALIC SMALL PHI', specials={'font',0x03C6} },
+ [0x1D712] = { unicodeslot=0x1D712, category='ll', description='MATHEMATICAL ITALIC SMALL CHI', specials={'font',0x03C7} },
+ [0x1D713] = { unicodeslot=0x1D713, category='ll', description='MATHEMATICAL ITALIC SMALL PSI', specials={'font',0x03C8} },
+ [0x1D714] = { unicodeslot=0x1D714, category='ll', description='MATHEMATICAL ITALIC SMALL OMEGA', specials={'font',0x03C9} },
+ [0x1D715] = { unicodeslot=0x1D715, category='sm', description='MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL', specials={'font',0x2202} },
+ [0x1D716] = { unicodeslot=0x1D716, category='ll', description='MATHEMATICAL ITALIC EPSILON SYMBOL', specials={'font',0x03F5} },
+ [0x1D717] = { unicodeslot=0x1D717, category='ll', description='MATHEMATICAL ITALIC THETA SYMBOL', specials={'font',0x03D1} },
+ [0x1D718] = { unicodeslot=0x1D718, category='ll', description='MATHEMATICAL ITALIC KAPPA SYMBOL', specials={'font',0x03F0} },
+ [0x1D719] = { unicodeslot=0x1D719, category='ll', description='MATHEMATICAL ITALIC PHI SYMBOL', specials={'font',0x03D5} },
+ [0x1D71A] = { unicodeslot=0x1D71A, category='ll', description='MATHEMATICAL ITALIC RHO SYMBOL', specials={'font',0x03F1} },
+ [0x1D71B] = { unicodeslot=0x1D71B, category='ll', description='MATHEMATICAL ITALIC PI SYMBOL', specials={'font',0x03D6} },
+ [0x1D71C] = { unicodeslot=0x1D71C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL ALPHA', specials={'font',0x0391} },
+ [0x1D71D] = { unicodeslot=0x1D71D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL BETA', specials={'font',0x0392} },
+ [0x1D71E] = { unicodeslot=0x1D71E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL GAMMA', specials={'font',0x0393} },
+ [0x1D71F] = { unicodeslot=0x1D71F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL DELTA', specials={'font',0x0394} },
+ [0x1D720] = { unicodeslot=0x1D720, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL EPSILON', specials={'font',0x0395} },
+ [0x1D721] = { unicodeslot=0x1D721, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL ZETA', specials={'font',0x0396} },
+ [0x1D722] = { unicodeslot=0x1D722, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL ETA', specials={'font',0x0397} },
+ [0x1D723] = { unicodeslot=0x1D723, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL THETA', specials={'font',0x0398} },
+ [0x1D724] = { unicodeslot=0x1D724, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL IOTA', specials={'font',0x0399} },
+ [0x1D725] = { unicodeslot=0x1D725, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL KAPPA', specials={'font',0x039A} },
+ [0x1D726] = { unicodeslot=0x1D726, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL LAMDA', specials={'font',0x039B} },
+ [0x1D727] = { unicodeslot=0x1D727, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL MU', specials={'font',0x039C} },
+ [0x1D728] = { unicodeslot=0x1D728, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL NU', specials={'font',0x039D} },
+ [0x1D729] = { unicodeslot=0x1D729, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL XI', specials={'font',0x039E} },
+ [0x1D72A] = { unicodeslot=0x1D72A, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL OMICRON', specials={'font',0x039F} },
+ [0x1D72B] = { unicodeslot=0x1D72B, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL PI', specials={'font',0x03A0} },
+ [0x1D72C] = { unicodeslot=0x1D72C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL RHO', specials={'font',0x03A1} },
+ [0x1D72D] = { unicodeslot=0x1D72D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL', specials={'font',0x03F4} },
+ [0x1D72E] = { unicodeslot=0x1D72E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL SIGMA', specials={'font',0x03A3} },
+ [0x1D72F] = { unicodeslot=0x1D72F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL TAU', specials={'font',0x03A4} },
+ [0x1D730] = { unicodeslot=0x1D730, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL UPSILON', specials={'font',0x03A5} },
+ [0x1D731] = { unicodeslot=0x1D731, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL PHI', specials={'font',0x03A6} },
+ [0x1D732] = { unicodeslot=0x1D732, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL CHI', specials={'font',0x03A7} },
+ [0x1D733] = { unicodeslot=0x1D733, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL PSI', specials={'font',0x03A8} },
+ [0x1D734] = { unicodeslot=0x1D734, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL OMEGA', specials={'font',0x03A9} },
+ [0x1D735] = { unicodeslot=0x1D735, category='sm', description='MATHEMATICAL BOLD ITALIC NABLA', specials={'font',0x2207} },
+ [0x1D736] = { unicodeslot=0x1D736, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL ALPHA', specials={'font',0x03B1} },
+ [0x1D737] = { unicodeslot=0x1D737, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL BETA', specials={'font',0x03B2} },
+ [0x1D738] = { unicodeslot=0x1D738, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL GAMMA', specials={'font',0x03B3} },
+ [0x1D739] = { unicodeslot=0x1D739, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL DELTA', specials={'font',0x03B4} },
+ [0x1D73A] = { unicodeslot=0x1D73A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL EPSILON', specials={'font',0x03B5} },
+ [0x1D73B] = { unicodeslot=0x1D73B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL ZETA', specials={'font',0x03B6} },
+ [0x1D73C] = { unicodeslot=0x1D73C, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL ETA', specials={'font',0x03B7} },
+ [0x1D73D] = { unicodeslot=0x1D73D, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL THETA', specials={'font',0x03B8} },
+ [0x1D73E] = { unicodeslot=0x1D73E, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL IOTA', specials={'font',0x03B9} },
+ [0x1D73F] = { unicodeslot=0x1D73F, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL KAPPA', specials={'font',0x03BA} },
+ [0x1D740] = { unicodeslot=0x1D740, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL LAMDA', specials={'font',0x03BB} },
+ [0x1D741] = { unicodeslot=0x1D741, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL MU', specials={'font',0x03BC} },
+ [0x1D742] = { unicodeslot=0x1D742, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL NU', specials={'font',0x03BD} },
+ [0x1D743] = { unicodeslot=0x1D743, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL XI', specials={'font',0x03BE} },
+ [0x1D744] = { unicodeslot=0x1D744, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL OMICRON', specials={'font',0x03BF} },
+ [0x1D745] = { unicodeslot=0x1D745, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL PI', specials={'font',0x03C0} },
+ [0x1D746] = { unicodeslot=0x1D746, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL RHO', specials={'font',0x03C1} },
+ [0x1D747] = { unicodeslot=0x1D747, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA', specials={'font',0x03C2} },
+ [0x1D748] = { unicodeslot=0x1D748, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL SIGMA', specials={'font',0x03C3} },
+ [0x1D749] = { unicodeslot=0x1D749, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL TAU', specials={'font',0x03C4} },
+ [0x1D74A] = { unicodeslot=0x1D74A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL UPSILON', specials={'font',0x03C5} },
+ [0x1D74B] = { unicodeslot=0x1D74B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL PHI', specials={'font',0x03C6} },
+ [0x1D74C] = { unicodeslot=0x1D74C, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL CHI', specials={'font',0x03C7} },
+ [0x1D74D] = { unicodeslot=0x1D74D, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL PSI', specials={'font',0x03C8} },
+ [0x1D74E] = { unicodeslot=0x1D74E, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL OMEGA', specials={'font',0x03C9} },
+ [0x1D74F] = { unicodeslot=0x1D74F, category='sm', description='MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL', specials={'font',0x2202} },
+ [0x1D750] = { unicodeslot=0x1D750, category='ll', description='MATHEMATICAL BOLD ITALIC EPSILON SYMBOL', specials={'font',0x03F5} },
+ [0x1D751] = { unicodeslot=0x1D751, category='ll', description='MATHEMATICAL BOLD ITALIC THETA SYMBOL', specials={'font',0x03D1} },
+ [0x1D752] = { unicodeslot=0x1D752, category='ll', description='MATHEMATICAL BOLD ITALIC KAPPA SYMBOL', specials={'font',0x03F0} },
+ [0x1D753] = { unicodeslot=0x1D753, category='ll', description='MATHEMATICAL BOLD ITALIC PHI SYMBOL', specials={'font',0x03D5} },
+ [0x1D754] = { unicodeslot=0x1D754, category='ll', description='MATHEMATICAL BOLD ITALIC RHO SYMBOL', specials={'font',0x03F1} },
+ [0x1D755] = { unicodeslot=0x1D755, category='ll', description='MATHEMATICAL BOLD ITALIC PI SYMBOL', specials={'font',0x03D6} },
+ [0x1D756] = { unicodeslot=0x1D756, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA', specials={'font',0x0391} },
+ [0x1D757] = { unicodeslot=0x1D757, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA', specials={'font',0x0392} },
+ [0x1D758] = { unicodeslot=0x1D758, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA', specials={'font',0x0393} },
+ [0x1D759] = { unicodeslot=0x1D759, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA', specials={'font',0x0394} },
+ [0x1D75A] = { unicodeslot=0x1D75A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON', specials={'font',0x0395} },
+ [0x1D75B] = { unicodeslot=0x1D75B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA', specials={'font',0x0396} },
+ [0x1D75C] = { unicodeslot=0x1D75C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA', specials={'font',0x0397} },
+ [0x1D75D] = { unicodeslot=0x1D75D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA', specials={'font',0x0398} },
+ [0x1D75E] = { unicodeslot=0x1D75E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA', specials={'font',0x0399} },
+ [0x1D75F] = { unicodeslot=0x1D75F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA', specials={'font',0x039A} },
+ [0x1D760] = { unicodeslot=0x1D760, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA', specials={'font',0x039B} },
+ [0x1D761] = { unicodeslot=0x1D761, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL MU', specials={'font',0x039C} },
+ [0x1D762] = { unicodeslot=0x1D762, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL NU', specials={'font',0x039D} },
+ [0x1D763] = { unicodeslot=0x1D763, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL XI', specials={'font',0x039E} },
+ [0x1D764] = { unicodeslot=0x1D764, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON', specials={'font',0x039F} },
+ [0x1D765] = { unicodeslot=0x1D765, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL PI', specials={'font',0x03A0} },
+ [0x1D766] = { unicodeslot=0x1D766, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO', specials={'font',0x03A1} },
+ [0x1D767] = { unicodeslot=0x1D767, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL', specials={'font',0x03F4} },
+ [0x1D768] = { unicodeslot=0x1D768, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA', specials={'font',0x03A3} },
+ [0x1D769] = { unicodeslot=0x1D769, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU', specials={'font',0x03A4} },
+ [0x1D76A] = { unicodeslot=0x1D76A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON', specials={'font',0x03A5} },
+ [0x1D76B] = { unicodeslot=0x1D76B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI', specials={'font',0x03A6} },
+ [0x1D76C] = { unicodeslot=0x1D76C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI', specials={'font',0x03A7} },
+ [0x1D76D] = { unicodeslot=0x1D76D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI', specials={'font',0x03A8} },
+ [0x1D76E] = { unicodeslot=0x1D76E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA', specials={'font',0x03A9} },
+ [0x1D76F] = { unicodeslot=0x1D76F, category='sm', description='MATHEMATICAL SANS-SERIF BOLD NABLA', specials={'font',0x2207} },
+ [0x1D770] = { unicodeslot=0x1D770, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA', specials={'font',0x03B1} },
+ [0x1D771] = { unicodeslot=0x1D771, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL BETA', specials={'font',0x03B2} },
+ [0x1D772] = { unicodeslot=0x1D772, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA', specials={'font',0x03B3} },
+ [0x1D773] = { unicodeslot=0x1D773, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL DELTA', specials={'font',0x03B4} },
+ [0x1D774] = { unicodeslot=0x1D774, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON', specials={'font',0x03B5} },
+ [0x1D775] = { unicodeslot=0x1D775, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL ZETA', specials={'font',0x03B6} },
+ [0x1D776] = { unicodeslot=0x1D776, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL ETA', specials={'font',0x03B7} },
+ [0x1D777] = { unicodeslot=0x1D777, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL THETA', specials={'font',0x03B8} },
+ [0x1D778] = { unicodeslot=0x1D778, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL IOTA', specials={'font',0x03B9} },
+ [0x1D779] = { unicodeslot=0x1D779, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA', specials={'font',0x03BA} },
+ [0x1D77A] = { unicodeslot=0x1D77A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA', specials={'font',0x03BB} },
+ [0x1D77B] = { unicodeslot=0x1D77B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL MU', specials={'font',0x03BC} },
+ [0x1D77C] = { unicodeslot=0x1D77C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL NU', specials={'font',0x03BD} },
+ [0x1D77D] = { unicodeslot=0x1D77D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL XI', specials={'font',0x03BE} },
+ [0x1D77E] = { unicodeslot=0x1D77E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON', specials={'font',0x03BF} },
+ [0x1D77F] = { unicodeslot=0x1D77F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL PI', specials={'font',0x03C0} },
+ [0x1D780] = { unicodeslot=0x1D780, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL RHO', specials={'font',0x03C1} },
+ [0x1D781] = { unicodeslot=0x1D781, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA', specials={'font',0x03C2} },
+ [0x1D782] = { unicodeslot=0x1D782, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA', specials={'font',0x03C3} },
+ [0x1D783] = { unicodeslot=0x1D783, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL TAU', specials={'font',0x03C4} },
+ [0x1D784] = { unicodeslot=0x1D784, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON', specials={'font',0x03C5} },
+ [0x1D785] = { unicodeslot=0x1D785, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL PHI', specials={'font',0x03C6} },
+ [0x1D786] = { unicodeslot=0x1D786, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL CHI', specials={'font',0x03C7} },
+ [0x1D787] = { unicodeslot=0x1D787, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL PSI', specials={'font',0x03C8} },
+ [0x1D788] = { unicodeslot=0x1D788, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA', specials={'font',0x03C9} },
+ [0x1D789] = { unicodeslot=0x1D789, category='sm', description='MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL', specials={'font',0x2202} },
+ [0x1D78A] = { unicodeslot=0x1D78A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL', specials={'font',0x03F5} },
+ [0x1D78B] = { unicodeslot=0x1D78B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL', specials={'font',0x03D1} },
+ [0x1D78C] = { unicodeslot=0x1D78C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL', specials={'font',0x03F0} },
+ [0x1D78D] = { unicodeslot=0x1D78D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL', specials={'font',0x03D5} },
+ [0x1D78E] = { unicodeslot=0x1D78E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL', specials={'font',0x03F1} },
+ [0x1D78F] = { unicodeslot=0x1D78F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD PI SYMBOL', specials={'font',0x03D6} },
+ [0x1D790] = { unicodeslot=0x1D790, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA', specials={'font',0x0391} },
+ [0x1D791] = { unicodeslot=0x1D791, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA', specials={'font',0x0392} },
+ [0x1D792] = { unicodeslot=0x1D792, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA', specials={'font',0x0393} },
+ [0x1D793] = { unicodeslot=0x1D793, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA', specials={'font',0x0394} },
+ [0x1D794] = { unicodeslot=0x1D794, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON', specials={'font',0x0395} },
+ [0x1D795] = { unicodeslot=0x1D795, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA', specials={'font',0x0396} },
+ [0x1D796] = { unicodeslot=0x1D796, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA', specials={'font',0x0397} },
+ [0x1D797] = { unicodeslot=0x1D797, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA', specials={'font',0x0398} },
+ [0x1D798] = { unicodeslot=0x1D798, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA', specials={'font',0x0399} },
+ [0x1D799] = { unicodeslot=0x1D799, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA', specials={'font',0x039A} },
+ [0x1D79A] = { unicodeslot=0x1D79A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA', specials={'font',0x039B} },
+ [0x1D79B] = { unicodeslot=0x1D79B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU', specials={'font',0x039C} },
+ [0x1D79C] = { unicodeslot=0x1D79C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU', specials={'font',0x039D} },
+ [0x1D79D] = { unicodeslot=0x1D79D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI', specials={'font',0x039E} },
+ [0x1D79E] = { unicodeslot=0x1D79E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON', specials={'font',0x039F} },
+ [0x1D79F] = { unicodeslot=0x1D79F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI', specials={'font',0x03A0} },
+ [0x1D7A0] = { unicodeslot=0x1D7A0, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO', specials={'font',0x03A1} },
+ [0x1D7A1] = { unicodeslot=0x1D7A1, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL', specials={'font',0x03F4} },
+ [0x1D7A2] = { unicodeslot=0x1D7A2, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA', specials={'font',0x03A3} },
+ [0x1D7A3] = { unicodeslot=0x1D7A3, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU', specials={'font',0x03A4} },
+ [0x1D7A4] = { unicodeslot=0x1D7A4, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON', specials={'font',0x03A5} },
+ [0x1D7A5] = { unicodeslot=0x1D7A5, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI', specials={'font',0x03A6} },
+ [0x1D7A6] = { unicodeslot=0x1D7A6, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI', specials={'font',0x03A7} },
+ [0x1D7A7] = { unicodeslot=0x1D7A7, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI', specials={'font',0x03A8} },
+ [0x1D7A8] = { unicodeslot=0x1D7A8, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA', specials={'font',0x03A9} },
+ [0x1D7A9] = { unicodeslot=0x1D7A9, category='sm', description='MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA', specials={'font',0x2207} },
+ [0x1D7AA] = { unicodeslot=0x1D7AA, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA', specials={'font',0x03B1} },
+ [0x1D7AB] = { unicodeslot=0x1D7AB, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA', specials={'font',0x03B2} },
+ [0x1D7AC] = { unicodeslot=0x1D7AC, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA', specials={'font',0x03B3} },
+ [0x1D7AD] = { unicodeslot=0x1D7AD, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA', specials={'font',0x03B4} },
+ [0x1D7AE] = { unicodeslot=0x1D7AE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON', specials={'font',0x03B5} },
+ [0x1D7AF] = { unicodeslot=0x1D7AF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA', specials={'font',0x03B6} },
+ [0x1D7B0] = { unicodeslot=0x1D7B0, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA', specials={'font',0x03B7} },
+ [0x1D7B1] = { unicodeslot=0x1D7B1, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA', specials={'font',0x03B8} },
+ [0x1D7B2] = { unicodeslot=0x1D7B2, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA', specials={'font',0x03B9} },
+ [0x1D7B3] = { unicodeslot=0x1D7B3, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA', specials={'font',0x03BA} },
+ [0x1D7B4] = { unicodeslot=0x1D7B4, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA', specials={'font',0x03BB} },
+ [0x1D7B5] = { unicodeslot=0x1D7B5, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU', specials={'font',0x03BC} },
+ [0x1D7B6] = { unicodeslot=0x1D7B6, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU', specials={'font',0x03BD} },
+ [0x1D7B7] = { unicodeslot=0x1D7B7, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI', specials={'font',0x03BE} },
+ [0x1D7B8] = { unicodeslot=0x1D7B8, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON', specials={'font',0x03BF} },
+ [0x1D7B9] = { unicodeslot=0x1D7B9, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI', specials={'font',0x03C0} },
+ [0x1D7BA] = { unicodeslot=0x1D7BA, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO', specials={'font',0x03C1} },
+ [0x1D7BB] = { unicodeslot=0x1D7BB, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA', specials={'font',0x03C2} },
+ [0x1D7BC] = { unicodeslot=0x1D7BC, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA', specials={'font',0x03C3} },
+ [0x1D7BD] = { unicodeslot=0x1D7BD, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU', specials={'font',0x03C4} },
+ [0x1D7BE] = { unicodeslot=0x1D7BE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON', specials={'font',0x03C5} },
+ [0x1D7BF] = { unicodeslot=0x1D7BF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI', specials={'font',0x03C6} },
+ [0x1D7C0] = { unicodeslot=0x1D7C0, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI', specials={'font',0x03C7} },
+ [0x1D7C1] = { unicodeslot=0x1D7C1, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI', specials={'font',0x03C8} },
+ [0x1D7C2] = { unicodeslot=0x1D7C2, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA', specials={'font',0x03C9} },
+ [0x1D7C3] = { unicodeslot=0x1D7C3, category='sm', description='MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL', specials={'font',0x2202} },
+ [0x1D7C4] = { unicodeslot=0x1D7C4, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL', specials={'font',0x03F5} },
+ [0x1D7C5] = { unicodeslot=0x1D7C5, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL', specials={'font',0x03D1} },
+ [0x1D7C6] = { unicodeslot=0x1D7C6, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL', specials={'font',0x03F0} },
+ [0x1D7C7] = { unicodeslot=0x1D7C7, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL', specials={'font',0x03D5} },
+ [0x1D7C8] = { unicodeslot=0x1D7C8, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL', specials={'font',0x03F1} },
+ [0x1D7C9] = { unicodeslot=0x1D7C9, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL', specials={'font',0x03D6} },
+ [0x1D7CA] = { unicodeslot=0x1D7CA, category='lu', description='MATHEMATICAL BOLD CAPITAL DIGAMMA', specials={'font',0x03DC} },
+ [0x1D7CB] = { unicodeslot=0x1D7CB, category='ll', description='MATHEMATICAL BOLD SMALL DIGAMMA', specials={'font',0x03DD} },
+ [0x1D7CE] = { unicodeslot=0x1D7CE, category='nd', description='MATHEMATICAL BOLD DIGIT ZERO', specials={'font',0x0030} },
+ [0x1D7CF] = { unicodeslot=0x1D7CF, category='nd', description='MATHEMATICAL BOLD DIGIT ONE', specials={'font',0x0031} },
+ [0x1D7D0] = { unicodeslot=0x1D7D0, category='nd', description='MATHEMATICAL BOLD DIGIT TWO', specials={'font',0x0032} },
+ [0x1D7D1] = { unicodeslot=0x1D7D1, category='nd', description='MATHEMATICAL BOLD DIGIT THREE', specials={'font',0x0033} },
+ [0x1D7D2] = { unicodeslot=0x1D7D2, category='nd', description='MATHEMATICAL BOLD DIGIT FOUR', specials={'font',0x0034} },
+ [0x1D7D3] = { unicodeslot=0x1D7D3, category='nd', description='MATHEMATICAL BOLD DIGIT FIVE', specials={'font',0x0035} },
+ [0x1D7D4] = { unicodeslot=0x1D7D4, category='nd', description='MATHEMATICAL BOLD DIGIT SIX', specials={'font',0x0036} },
+ [0x1D7D5] = { unicodeslot=0x1D7D5, category='nd', description='MATHEMATICAL BOLD DIGIT SEVEN', specials={'font',0x0037} },
+ [0x1D7D6] = { unicodeslot=0x1D7D6, category='nd', description='MATHEMATICAL BOLD DIGIT EIGHT', specials={'font',0x0038} },
+ [0x1D7D7] = { unicodeslot=0x1D7D7, category='nd', description='MATHEMATICAL BOLD DIGIT NINE', specials={'font',0x0039} },
+ [0x1D7D8] = { unicodeslot=0x1D7D8, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO', specials={'font',0x0030} },
+ [0x1D7D9] = { unicodeslot=0x1D7D9, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT ONE', specials={'font',0x0031} },
+ [0x1D7DA] = { unicodeslot=0x1D7DA, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT TWO', specials={'font',0x0032} },
+ [0x1D7DB] = { unicodeslot=0x1D7DB, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT THREE', specials={'font',0x0033} },
+ [0x1D7DC] = { unicodeslot=0x1D7DC, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR', specials={'font',0x0034} },
+ [0x1D7DD] = { unicodeslot=0x1D7DD, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE', specials={'font',0x0035} },
+ [0x1D7DE] = { unicodeslot=0x1D7DE, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT SIX', specials={'font',0x0036} },
+ [0x1D7DF] = { unicodeslot=0x1D7DF, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN', specials={'font',0x0037} },
+ [0x1D7E0] = { unicodeslot=0x1D7E0, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT', specials={'font',0x0038} },
+ [0x1D7E1] = { unicodeslot=0x1D7E1, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT NINE', specials={'font',0x0039} },
+ [0x1D7E2] = { unicodeslot=0x1D7E2, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT ZERO', specials={'font',0x0030} },
+ [0x1D7E3] = { unicodeslot=0x1D7E3, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT ONE', specials={'font',0x0031} },
+ [0x1D7E4] = { unicodeslot=0x1D7E4, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT TWO', specials={'font',0x0032} },
+ [0x1D7E5] = { unicodeslot=0x1D7E5, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT THREE', specials={'font',0x0033} },
+ [0x1D7E6] = { unicodeslot=0x1D7E6, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT FOUR', specials={'font',0x0034} },
+ [0x1D7E7] = { unicodeslot=0x1D7E7, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT FIVE', specials={'font',0x0035} },
+ [0x1D7E8] = { unicodeslot=0x1D7E8, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT SIX', specials={'font',0x0036} },
+ [0x1D7E9] = { unicodeslot=0x1D7E9, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT SEVEN', specials={'font',0x0037} },
+ [0x1D7EA] = { unicodeslot=0x1D7EA, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT EIGHT', specials={'font',0x0038} },
+ [0x1D7EB] = { unicodeslot=0x1D7EB, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT NINE', specials={'font',0x0039} },
+ [0x1D7EC] = { unicodeslot=0x1D7EC, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO', specials={'font',0x0030} },
+ [0x1D7ED] = { unicodeslot=0x1D7ED, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT ONE', specials={'font',0x0031} },
+ [0x1D7EE] = { unicodeslot=0x1D7EE, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT TWO', specials={'font',0x0032} },
+ [0x1D7EF] = { unicodeslot=0x1D7EF, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT THREE', specials={'font',0x0033} },
+ [0x1D7F0] = { unicodeslot=0x1D7F0, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR', specials={'font',0x0034} },
+ [0x1D7F1] = { unicodeslot=0x1D7F1, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE', specials={'font',0x0035} },
+ [0x1D7F2] = { unicodeslot=0x1D7F2, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT SIX', specials={'font',0x0036} },
+ [0x1D7F3] = { unicodeslot=0x1D7F3, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN', specials={'font',0x0037} },
+ [0x1D7F4] = { unicodeslot=0x1D7F4, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT', specials={'font',0x0038} },
+ [0x1D7F5] = { unicodeslot=0x1D7F5, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT NINE', specials={'font',0x0039} },
+ [0x1D7F6] = { unicodeslot=0x1D7F6, category='nd', description='MATHEMATICAL MONOSPACE DIGIT ZERO', specials={'font',0x0030} },
+ [0x1D7F7] = { unicodeslot=0x1D7F7, category='nd', description='MATHEMATICAL MONOSPACE DIGIT ONE', specials={'font',0x0031} },
+ [0x1D7F8] = { unicodeslot=0x1D7F8, category='nd', description='MATHEMATICAL MONOSPACE DIGIT TWO', specials={'font',0x0032} },
+ [0x1D7F9] = { unicodeslot=0x1D7F9, category='nd', description='MATHEMATICAL MONOSPACE DIGIT THREE', specials={'font',0x0033} },
+ [0x1D7FA] = { unicodeslot=0x1D7FA, category='nd', description='MATHEMATICAL MONOSPACE DIGIT FOUR', specials={'font',0x0034} },
+ [0x1D7FB] = { unicodeslot=0x1D7FB, category='nd', description='MATHEMATICAL MONOSPACE DIGIT FIVE', specials={'font',0x0035} },
+ [0x1D7FC] = { unicodeslot=0x1D7FC, category='nd', description='MATHEMATICAL MONOSPACE DIGIT SIX', specials={'font',0x0036} },
+ [0x1D7FD] = { unicodeslot=0x1D7FD, category='nd', description='MATHEMATICAL MONOSPACE DIGIT SEVEN', specials={'font',0x0037} },
+ [0x1D7FE] = { unicodeslot=0x1D7FE, category='nd', description='MATHEMATICAL MONOSPACE DIGIT EIGHT', specials={'font',0x0038} },
+ [0x1D7FF] = { unicodeslot=0x1D7FF, category='nd', description='MATHEMATICAL MONOSPACE DIGIT NINE', specials={'font',0x0039} },
+ [0x20000] = { unicodeslot=0x20000, category='lo', description='<CJK Ideograph Extension B, First>' },
+ [0x2A6D6] = { unicodeslot=0x2A6D6, category='lo', description='<CJK Ideograph Extension B, Last>' },
+ [0x2F800] = { unicodeslot=0x2F800, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F800', specials={'char',0x4E3D} },
+ [0x2F801] = { unicodeslot=0x2F801, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F801', specials={'char',0x4E38} },
+ [0x2F802] = { unicodeslot=0x2F802, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F802', specials={'char',0x4E41} },
+ [0x2F803] = { unicodeslot=0x2F803, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F803', specials={'char',0x20122} },
+ [0x2F804] = { unicodeslot=0x2F804, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F804', specials={'char',0x4F60} },
+ [0x2F805] = { unicodeslot=0x2F805, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F805', specials={'char',0x4FAE} },
+ [0x2F806] = { unicodeslot=0x2F806, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F806', specials={'char',0x4FBB} },
+ [0x2F807] = { unicodeslot=0x2F807, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F807', specials={'char',0x5002} },
+ [0x2F808] = { unicodeslot=0x2F808, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F808', specials={'char',0x507A} },
+ [0x2F809] = { unicodeslot=0x2F809, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F809', specials={'char',0x5099} },
+ [0x2F80A] = { unicodeslot=0x2F80A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80A', specials={'char',0x50E7} },
+ [0x2F80B] = { unicodeslot=0x2F80B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80B', specials={'char',0x50CF} },
+ [0x2F80C] = { unicodeslot=0x2F80C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80C', specials={'char',0x349E} },
+ [0x2F80D] = { unicodeslot=0x2F80D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80D', specials={'char',0x2063A} },
+ [0x2F80E] = { unicodeslot=0x2F80E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80E', specials={'char',0x514D} },
+ [0x2F80F] = { unicodeslot=0x2F80F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80F', specials={'char',0x5154} },
+ [0x2F810] = { unicodeslot=0x2F810, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F810', specials={'char',0x5164} },
+ [0x2F811] = { unicodeslot=0x2F811, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F811', specials={'char',0x5177} },
+ [0x2F812] = { unicodeslot=0x2F812, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F812', specials={'char',0x2051C} },
+ [0x2F813] = { unicodeslot=0x2F813, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F813', specials={'char',0x34B9} },
+ [0x2F814] = { unicodeslot=0x2F814, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F814', specials={'char',0x5167} },
+ [0x2F815] = { unicodeslot=0x2F815, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F815', specials={'char',0x518D} },
+ [0x2F816] = { unicodeslot=0x2F816, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F816', specials={'char',0x2054B} },
+ [0x2F817] = { unicodeslot=0x2F817, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F817', specials={'char',0x5197} },
+ [0x2F818] = { unicodeslot=0x2F818, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F818', specials={'char',0x51A4} },
+ [0x2F819] = { unicodeslot=0x2F819, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F819', specials={'char',0x4ECC} },
+ [0x2F81A] = { unicodeslot=0x2F81A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81A', specials={'char',0x51AC} },
+ [0x2F81B] = { unicodeslot=0x2F81B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81B', specials={'char',0x51B5} },
+ [0x2F81C] = { unicodeslot=0x2F81C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81C', specials={'char',0x291DF} },
+ [0x2F81D] = { unicodeslot=0x2F81D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81D', specials={'char',0x51F5} },
+ [0x2F81E] = { unicodeslot=0x2F81E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81E', specials={'char',0x5203} },
+ [0x2F81F] = { unicodeslot=0x2F81F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81F', specials={'char',0x34DF} },
+ [0x2F820] = { unicodeslot=0x2F820, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F820', specials={'char',0x523B} },
+ [0x2F821] = { unicodeslot=0x2F821, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F821', specials={'char',0x5246} },
+ [0x2F822] = { unicodeslot=0x2F822, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F822', specials={'char',0x5272} },
+ [0x2F823] = { unicodeslot=0x2F823, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F823', specials={'char',0x5277} },
+ [0x2F824] = { unicodeslot=0x2F824, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F824', specials={'char',0x3515} },
+ [0x2F825] = { unicodeslot=0x2F825, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F825', specials={'char',0x52C7} },
+ [0x2F826] = { unicodeslot=0x2F826, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F826', specials={'char',0x52C9} },
+ [0x2F827] = { unicodeslot=0x2F827, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F827', specials={'char',0x52E4} },
+ [0x2F828] = { unicodeslot=0x2F828, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F828', specials={'char',0x52FA} },
+ [0x2F829] = { unicodeslot=0x2F829, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F829', specials={'char',0x5305} },
+ [0x2F82A] = { unicodeslot=0x2F82A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82A', specials={'char',0x5306} },
+ [0x2F82B] = { unicodeslot=0x2F82B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82B', specials={'char',0x5317} },
+ [0x2F82C] = { unicodeslot=0x2F82C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82C', specials={'char',0x5349} },
+ [0x2F82D] = { unicodeslot=0x2F82D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82D', specials={'char',0x5351} },
+ [0x2F82E] = { unicodeslot=0x2F82E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82E', specials={'char',0x535A} },
+ [0x2F82F] = { unicodeslot=0x2F82F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82F', specials={'char',0x5373} },
+ [0x2F830] = { unicodeslot=0x2F830, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F830', specials={'char',0x537D} },
+ [0x2F831] = { unicodeslot=0x2F831, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F831', specials={'char',0x537F} },
+ [0x2F832] = { unicodeslot=0x2F832, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F832', specials={'char',0x537F} },
+ [0x2F833] = { unicodeslot=0x2F833, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F833', specials={'char',0x537F} },
+ [0x2F834] = { unicodeslot=0x2F834, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F834', specials={'char',0x20A2C} },
+ [0x2F835] = { unicodeslot=0x2F835, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F835', specials={'char',0x7070} },
+ [0x2F836] = { unicodeslot=0x2F836, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F836', specials={'char',0x53CA} },
+ [0x2F837] = { unicodeslot=0x2F837, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F837', specials={'char',0x53DF} },
+ [0x2F838] = { unicodeslot=0x2F838, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F838', specials={'char',0x20B63} },
+ [0x2F839] = { unicodeslot=0x2F839, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F839', specials={'char',0x53EB} },
+ [0x2F83A] = { unicodeslot=0x2F83A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83A', specials={'char',0x53F1} },
+ [0x2F83B] = { unicodeslot=0x2F83B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83B', specials={'char',0x5406} },
+ [0x2F83C] = { unicodeslot=0x2F83C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83C', specials={'char',0x549E} },
+ [0x2F83D] = { unicodeslot=0x2F83D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83D', specials={'char',0x5438} },
+ [0x2F83E] = { unicodeslot=0x2F83E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83E', specials={'char',0x5448} },
+ [0x2F83F] = { unicodeslot=0x2F83F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83F', specials={'char',0x5468} },
+ [0x2F840] = { unicodeslot=0x2F840, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F840', specials={'char',0x54A2} },
+ [0x2F841] = { unicodeslot=0x2F841, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F841', specials={'char',0x54F6} },
+ [0x2F842] = { unicodeslot=0x2F842, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F842', specials={'char',0x5510} },
+ [0x2F843] = { unicodeslot=0x2F843, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F843', specials={'char',0x5553} },
+ [0x2F844] = { unicodeslot=0x2F844, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F844', specials={'char',0x5563} },
+ [0x2F845] = { unicodeslot=0x2F845, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F845', specials={'char',0x5584} },
+ [0x2F846] = { unicodeslot=0x2F846, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F846', specials={'char',0x5584} },
+ [0x2F847] = { unicodeslot=0x2F847, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F847', specials={'char',0x5599} },
+ [0x2F848] = { unicodeslot=0x2F848, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F848', specials={'char',0x55AB} },
+ [0x2F849] = { unicodeslot=0x2F849, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F849', specials={'char',0x55B3} },
+ [0x2F84A] = { unicodeslot=0x2F84A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84A', specials={'char',0x55C2} },
+ [0x2F84B] = { unicodeslot=0x2F84B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84B', specials={'char',0x5716} },
+ [0x2F84C] = { unicodeslot=0x2F84C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84C', specials={'char',0x5606} },
+ [0x2F84D] = { unicodeslot=0x2F84D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84D', specials={'char',0x5717} },
+ [0x2F84E] = { unicodeslot=0x2F84E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84E', specials={'char',0x5651} },
+ [0x2F84F] = { unicodeslot=0x2F84F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84F', specials={'char',0x5674} },
+ [0x2F850] = { unicodeslot=0x2F850, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F850', specials={'char',0x5207} },
+ [0x2F851] = { unicodeslot=0x2F851, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F851', specials={'char',0x58EE} },
+ [0x2F852] = { unicodeslot=0x2F852, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F852', specials={'char',0x57CE} },
+ [0x2F853] = { unicodeslot=0x2F853, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F853', specials={'char',0x57F4} },
+ [0x2F854] = { unicodeslot=0x2F854, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F854', specials={'char',0x580D} },
+ [0x2F855] = { unicodeslot=0x2F855, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F855', specials={'char',0x578B} },
+ [0x2F856] = { unicodeslot=0x2F856, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F856', specials={'char',0x5832} },
+ [0x2F857] = { unicodeslot=0x2F857, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F857', specials={'char',0x5831} },
+ [0x2F858] = { unicodeslot=0x2F858, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F858', specials={'char',0x58AC} },
+ [0x2F859] = { unicodeslot=0x2F859, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F859', specials={'char',0x214E4} },
+ [0x2F85A] = { unicodeslot=0x2F85A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85A', specials={'char',0x58F2} },
+ [0x2F85B] = { unicodeslot=0x2F85B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85B', specials={'char',0x58F7} },
+ [0x2F85C] = { unicodeslot=0x2F85C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85C', specials={'char',0x5906} },
+ [0x2F85D] = { unicodeslot=0x2F85D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85D', specials={'char',0x591A} },
+ [0x2F85E] = { unicodeslot=0x2F85E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85E', specials={'char',0x5922} },
+ [0x2F85F] = { unicodeslot=0x2F85F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85F', specials={'char',0x5962} },
+ [0x2F860] = { unicodeslot=0x2F860, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F860', specials={'char',0x216A8} },
+ [0x2F861] = { unicodeslot=0x2F861, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F861', specials={'char',0x216EA} },
+ [0x2F862] = { unicodeslot=0x2F862, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F862', specials={'char',0x59EC} },
+ [0x2F863] = { unicodeslot=0x2F863, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F863', specials={'char',0x5A1B} },
+ [0x2F864] = { unicodeslot=0x2F864, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F864', specials={'char',0x5A27} },
+ [0x2F865] = { unicodeslot=0x2F865, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F865', specials={'char',0x59D8} },
+ [0x2F866] = { unicodeslot=0x2F866, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F866', specials={'char',0x5A66} },
+ [0x2F867] = { unicodeslot=0x2F867, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F867', specials={'char',0x36EE} },
+ [0x2F868] = { unicodeslot=0x2F868, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F868', specials={'char',0x36FC} },
+ [0x2F869] = { unicodeslot=0x2F869, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F869', specials={'char',0x5B08} },
+ [0x2F86A] = { unicodeslot=0x2F86A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86A', specials={'char',0x5B3E} },
+ [0x2F86B] = { unicodeslot=0x2F86B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86B', specials={'char',0x5B3E} },
+ [0x2F86C] = { unicodeslot=0x2F86C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86C', specials={'char',0x219C8} },
+ [0x2F86D] = { unicodeslot=0x2F86D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86D', specials={'char',0x5BC3} },
+ [0x2F86E] = { unicodeslot=0x2F86E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86E', specials={'char',0x5BD8} },
+ [0x2F86F] = { unicodeslot=0x2F86F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86F', specials={'char',0x5BE7} },
+ [0x2F870] = { unicodeslot=0x2F870, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F870', specials={'char',0x5BF3} },
+ [0x2F871] = { unicodeslot=0x2F871, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F871', specials={'char',0x21B18} },
+ [0x2F872] = { unicodeslot=0x2F872, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F872', specials={'char',0x5BFF} },
+ [0x2F873] = { unicodeslot=0x2F873, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F873', specials={'char',0x5C06} },
+ [0x2F874] = { unicodeslot=0x2F874, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F874', specials={'char',0x5F53} },
+ [0x2F875] = { unicodeslot=0x2F875, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F875', specials={'char',0x5C22} },
+ [0x2F876] = { unicodeslot=0x2F876, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F876', specials={'char',0x3781} },
+ [0x2F877] = { unicodeslot=0x2F877, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F877', specials={'char',0x5C60} },
+ [0x2F878] = { unicodeslot=0x2F878, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F878', specials={'char',0x5C6E} },
+ [0x2F879] = { unicodeslot=0x2F879, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F879', specials={'char',0x5CC0} },
+ [0x2F87A] = { unicodeslot=0x2F87A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87A', specials={'char',0x5C8D} },
+ [0x2F87B] = { unicodeslot=0x2F87B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87B', specials={'char',0x21DE4} },
+ [0x2F87C] = { unicodeslot=0x2F87C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87C', specials={'char',0x5D43} },
+ [0x2F87D] = { unicodeslot=0x2F87D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87D', specials={'char',0x21DE6} },
+ [0x2F87E] = { unicodeslot=0x2F87E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87E', specials={'char',0x5D6E} },
+ [0x2F87F] = { unicodeslot=0x2F87F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87F', specials={'char',0x5D6B} },
+ [0x2F880] = { unicodeslot=0x2F880, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F880', specials={'char',0x5D7C} },
+ [0x2F881] = { unicodeslot=0x2F881, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F881', specials={'char',0x5DE1} },
+ [0x2F882] = { unicodeslot=0x2F882, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F882', specials={'char',0x5DE2} },
+ [0x2F883] = { unicodeslot=0x2F883, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F883', specials={'char',0x382F} },
+ [0x2F884] = { unicodeslot=0x2F884, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F884', specials={'char',0x5DFD} },
+ [0x2F885] = { unicodeslot=0x2F885, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F885', specials={'char',0x5E28} },
+ [0x2F886] = { unicodeslot=0x2F886, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F886', specials={'char',0x5E3D} },
+ [0x2F887] = { unicodeslot=0x2F887, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F887', specials={'char',0x5E69} },
+ [0x2F888] = { unicodeslot=0x2F888, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F888', specials={'char',0x3862} },
+ [0x2F889] = { unicodeslot=0x2F889, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F889', specials={'char',0x22183} },
+ [0x2F88A] = { unicodeslot=0x2F88A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88A', specials={'char',0x387C} },
+ [0x2F88B] = { unicodeslot=0x2F88B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88B', specials={'char',0x5EB0} },
+ [0x2F88C] = { unicodeslot=0x2F88C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88C', specials={'char',0x5EB3} },
+ [0x2F88D] = { unicodeslot=0x2F88D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88D', specials={'char',0x5EB6} },
+ [0x2F88E] = { unicodeslot=0x2F88E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88E', specials={'char',0x5ECA} },
+ [0x2F88F] = { unicodeslot=0x2F88F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88F', specials={'char',0x2A392} },
+ [0x2F890] = { unicodeslot=0x2F890, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F890', specials={'char',0x5EFE} },
+ [0x2F891] = { unicodeslot=0x2F891, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F891', specials={'char',0x22331} },
+ [0x2F892] = { unicodeslot=0x2F892, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F892', specials={'char',0x22331} },
+ [0x2F893] = { unicodeslot=0x2F893, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F893', specials={'char',0x8201} },
+ [0x2F894] = { unicodeslot=0x2F894, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F894', specials={'char',0x5F22} },
+ [0x2F895] = { unicodeslot=0x2F895, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F895', specials={'char',0x5F22} },
+ [0x2F896] = { unicodeslot=0x2F896, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F896', specials={'char',0x38C7} },
+ [0x2F897] = { unicodeslot=0x2F897, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F897', specials={'char',0x232B8} },
+ [0x2F898] = { unicodeslot=0x2F898, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F898', specials={'char',0x261DA} },
+ [0x2F899] = { unicodeslot=0x2F899, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F899', specials={'char',0x5F62} },
+ [0x2F89A] = { unicodeslot=0x2F89A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89A', specials={'char',0x5F6B} },
+ [0x2F89B] = { unicodeslot=0x2F89B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89B', specials={'char',0x38E3} },
+ [0x2F89C] = { unicodeslot=0x2F89C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89C', specials={'char',0x5F9A} },
+ [0x2F89D] = { unicodeslot=0x2F89D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89D', specials={'char',0x5FCD} },
+ [0x2F89E] = { unicodeslot=0x2F89E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89E', specials={'char',0x5FD7} },
+ [0x2F89F] = { unicodeslot=0x2F89F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89F', specials={'char',0x5FF9} },
+ [0x2F8A0] = { unicodeslot=0x2F8A0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A0', specials={'char',0x6081} },
+ [0x2F8A1] = { unicodeslot=0x2F8A1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A1', specials={'char',0x393A} },
+ [0x2F8A2] = { unicodeslot=0x2F8A2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A2', specials={'char',0x391C} },
+ [0x2F8A3] = { unicodeslot=0x2F8A3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A3', specials={'char',0x6094} },
+ [0x2F8A4] = { unicodeslot=0x2F8A4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A4', specials={'char',0x226D4} },
+ [0x2F8A5] = { unicodeslot=0x2F8A5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A5', specials={'char',0x60C7} },
+ [0x2F8A6] = { unicodeslot=0x2F8A6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A6', specials={'char',0x6148} },
+ [0x2F8A7] = { unicodeslot=0x2F8A7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A7', specials={'char',0x614C} },
+ [0x2F8A8] = { unicodeslot=0x2F8A8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A8', specials={'char',0x614E} },
+ [0x2F8A9] = { unicodeslot=0x2F8A9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A9', specials={'char',0x614C} },
+ [0x2F8AA] = { unicodeslot=0x2F8AA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AA', specials={'char',0x617A} },
+ [0x2F8AB] = { unicodeslot=0x2F8AB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AB', specials={'char',0x618E} },
+ [0x2F8AC] = { unicodeslot=0x2F8AC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AC', specials={'char',0x61B2} },
+ [0x2F8AD] = { unicodeslot=0x2F8AD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AD', specials={'char',0x61A4} },
+ [0x2F8AE] = { unicodeslot=0x2F8AE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AE', specials={'char',0x61AF} },
+ [0x2F8AF] = { unicodeslot=0x2F8AF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AF', specials={'char',0x61DE} },
+ [0x2F8B0] = { unicodeslot=0x2F8B0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B0', specials={'char',0x61F2} },
+ [0x2F8B1] = { unicodeslot=0x2F8B1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B1', specials={'char',0x61F6} },
+ [0x2F8B2] = { unicodeslot=0x2F8B2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B2', specials={'char',0x6210} },
+ [0x2F8B3] = { unicodeslot=0x2F8B3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B3', specials={'char',0x621B} },
+ [0x2F8B4] = { unicodeslot=0x2F8B4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B4', specials={'char',0x625D} },
+ [0x2F8B5] = { unicodeslot=0x2F8B5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B5', specials={'char',0x62B1} },
+ [0x2F8B6] = { unicodeslot=0x2F8B6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B6', specials={'char',0x62D4} },
+ [0x2F8B7] = { unicodeslot=0x2F8B7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B7', specials={'char',0x6350} },
+ [0x2F8B8] = { unicodeslot=0x2F8B8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B8', specials={'char',0x22B0C} },
+ [0x2F8B9] = { unicodeslot=0x2F8B9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B9', specials={'char',0x633D} },
+ [0x2F8BA] = { unicodeslot=0x2F8BA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BA', specials={'char',0x62FC} },
+ [0x2F8BB] = { unicodeslot=0x2F8BB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BB', specials={'char',0x6368} },
+ [0x2F8BC] = { unicodeslot=0x2F8BC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BC', specials={'char',0x6383} },
+ [0x2F8BD] = { unicodeslot=0x2F8BD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BD', specials={'char',0x63E4} },
+ [0x2F8BE] = { unicodeslot=0x2F8BE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BE', specials={'char',0x22BF1} },
+ [0x2F8BF] = { unicodeslot=0x2F8BF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BF', specials={'char',0x6422} },
+ [0x2F8C0] = { unicodeslot=0x2F8C0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C0', specials={'char',0x63C5} },
+ [0x2F8C1] = { unicodeslot=0x2F8C1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C1', specials={'char',0x63A9} },
+ [0x2F8C2] = { unicodeslot=0x2F8C2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C2', specials={'char',0x3A2E} },
+ [0x2F8C3] = { unicodeslot=0x2F8C3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C3', specials={'char',0x6469} },
+ [0x2F8C4] = { unicodeslot=0x2F8C4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C4', specials={'char',0x647E} },
+ [0x2F8C5] = { unicodeslot=0x2F8C5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C5', specials={'char',0x649D} },
+ [0x2F8C6] = { unicodeslot=0x2F8C6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C6', specials={'char',0x6477} },
+ [0x2F8C7] = { unicodeslot=0x2F8C7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C7', specials={'char',0x3A6C} },
+ [0x2F8C8] = { unicodeslot=0x2F8C8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C8', specials={'char',0x654F} },
+ [0x2F8C9] = { unicodeslot=0x2F8C9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C9', specials={'char',0x656C} },
+ [0x2F8CA] = { unicodeslot=0x2F8CA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CA', specials={'char',0x2300A} },
+ [0x2F8CB] = { unicodeslot=0x2F8CB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CB', specials={'char',0x65E3} },
+ [0x2F8CC] = { unicodeslot=0x2F8CC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CC', specials={'char',0x66F8} },
+ [0x2F8CD] = { unicodeslot=0x2F8CD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CD', specials={'char',0x6649} },
+ [0x2F8CE] = { unicodeslot=0x2F8CE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CE', specials={'char',0x3B19} },
+ [0x2F8CF] = { unicodeslot=0x2F8CF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CF', specials={'char',0x6691} },
+ [0x2F8D0] = { unicodeslot=0x2F8D0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D0', specials={'char',0x3B08} },
+ [0x2F8D1] = { unicodeslot=0x2F8D1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D1', specials={'char',0x3AE4} },
+ [0x2F8D2] = { unicodeslot=0x2F8D2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D2', specials={'char',0x5192} },
+ [0x2F8D3] = { unicodeslot=0x2F8D3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D3', specials={'char',0x5195} },
+ [0x2F8D4] = { unicodeslot=0x2F8D4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D4', specials={'char',0x6700} },
+ [0x2F8D5] = { unicodeslot=0x2F8D5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D5', specials={'char',0x669C} },
+ [0x2F8D6] = { unicodeslot=0x2F8D6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D6', specials={'char',0x80AD} },
+ [0x2F8D7] = { unicodeslot=0x2F8D7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D7', specials={'char',0x43D9} },
+ [0x2F8D8] = { unicodeslot=0x2F8D8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D8', specials={'char',0x6717} },
+ [0x2F8D9] = { unicodeslot=0x2F8D9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D9', specials={'char',0x671B} },
+ [0x2F8DA] = { unicodeslot=0x2F8DA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DA', specials={'char',0x6721} },
+ [0x2F8DB] = { unicodeslot=0x2F8DB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DB', specials={'char',0x675E} },
+ [0x2F8DC] = { unicodeslot=0x2F8DC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DC', specials={'char',0x6753} },
+ [0x2F8DD] = { unicodeslot=0x2F8DD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DD', specials={'char',0x233C3} },
+ [0x2F8DE] = { unicodeslot=0x2F8DE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DE', specials={'char',0x3B49} },
+ [0x2F8DF] = { unicodeslot=0x2F8DF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DF', specials={'char',0x67FA} },
+ [0x2F8E0] = { unicodeslot=0x2F8E0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E0', specials={'char',0x6785} },
+ [0x2F8E1] = { unicodeslot=0x2F8E1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E1', specials={'char',0x6852} },
+ [0x2F8E2] = { unicodeslot=0x2F8E2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E2', specials={'char',0x6885} },
+ [0x2F8E3] = { unicodeslot=0x2F8E3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E3', specials={'char',0x2346D} },
+ [0x2F8E4] = { unicodeslot=0x2F8E4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E4', specials={'char',0x688E} },
+ [0x2F8E5] = { unicodeslot=0x2F8E5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E5', specials={'char',0x681F} },
+ [0x2F8E6] = { unicodeslot=0x2F8E6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E6', specials={'char',0x6914} },
+ [0x2F8E7] = { unicodeslot=0x2F8E7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E7', specials={'char',0x3B9D} },
+ [0x2F8E8] = { unicodeslot=0x2F8E8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E8', specials={'char',0x6942} },
+ [0x2F8E9] = { unicodeslot=0x2F8E9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E9', specials={'char',0x69A3} },
+ [0x2F8EA] = { unicodeslot=0x2F8EA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EA', specials={'char',0x69EA} },
+ [0x2F8EB] = { unicodeslot=0x2F8EB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EB', specials={'char',0x6AA8} },
+ [0x2F8EC] = { unicodeslot=0x2F8EC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EC', specials={'char',0x236A3} },
+ [0x2F8ED] = { unicodeslot=0x2F8ED, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8ED', specials={'char',0x6ADB} },
+ [0x2F8EE] = { unicodeslot=0x2F8EE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EE', specials={'char',0x3C18} },
+ [0x2F8EF] = { unicodeslot=0x2F8EF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EF', specials={'char',0x6B21} },
+ [0x2F8F0] = { unicodeslot=0x2F8F0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F0', specials={'char',0x238A7} },
+ [0x2F8F1] = { unicodeslot=0x2F8F1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F1', specials={'char',0x6B54} },
+ [0x2F8F2] = { unicodeslot=0x2F8F2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F2', specials={'char',0x3C4E} },
+ [0x2F8F3] = { unicodeslot=0x2F8F3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F3', specials={'char',0x6B72} },
+ [0x2F8F4] = { unicodeslot=0x2F8F4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F4', specials={'char',0x6B9F} },
+ [0x2F8F5] = { unicodeslot=0x2F8F5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F5', specials={'char',0x6BBA} },
+ [0x2F8F6] = { unicodeslot=0x2F8F6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F6', specials={'char',0x6BBB} },
+ [0x2F8F7] = { unicodeslot=0x2F8F7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F7', specials={'char',0x23A8D} },
+ [0x2F8F8] = { unicodeslot=0x2F8F8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F8', specials={'char',0x21D0B} },
+ [0x2F8F9] = { unicodeslot=0x2F8F9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F9', specials={'char',0x23AFA} },
+ [0x2F8FA] = { unicodeslot=0x2F8FA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FA', specials={'char',0x6C4E} },
+ [0x2F8FB] = { unicodeslot=0x2F8FB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FB', specials={'char',0x23CBC} },
+ [0x2F8FC] = { unicodeslot=0x2F8FC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FC', specials={'char',0x6CBF} },
+ [0x2F8FD] = { unicodeslot=0x2F8FD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FD', specials={'char',0x6CCD} },
+ [0x2F8FE] = { unicodeslot=0x2F8FE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FE', specials={'char',0x6C67} },
+ [0x2F8FF] = { unicodeslot=0x2F8FF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FF', specials={'char',0x6D16} },
+ [0x2F900] = { unicodeslot=0x2F900, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F900', specials={'char',0x6D3E} },
+ [0x2F901] = { unicodeslot=0x2F901, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F901', specials={'char',0x6D77} },
+ [0x2F902] = { unicodeslot=0x2F902, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F902', specials={'char',0x6D41} },
+ [0x2F903] = { unicodeslot=0x2F903, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F903', specials={'char',0x6D69} },
+ [0x2F904] = { unicodeslot=0x2F904, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F904', specials={'char',0x6D78} },
+ [0x2F905] = { unicodeslot=0x2F905, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F905', specials={'char',0x6D85} },
+ [0x2F906] = { unicodeslot=0x2F906, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F906', specials={'char',0x23D1E} },
+ [0x2F907] = { unicodeslot=0x2F907, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F907', specials={'char',0x6D34} },
+ [0x2F908] = { unicodeslot=0x2F908, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F908', specials={'char',0x6E2F} },
+ [0x2F909] = { unicodeslot=0x2F909, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F909', specials={'char',0x6E6E} },
+ [0x2F90A] = { unicodeslot=0x2F90A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90A', specials={'char',0x3D33} },
+ [0x2F90B] = { unicodeslot=0x2F90B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90B', specials={'char',0x6ECB} },
+ [0x2F90C] = { unicodeslot=0x2F90C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90C', specials={'char',0x6EC7} },
+ [0x2F90D] = { unicodeslot=0x2F90D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90D', specials={'char',0x23ED1} },
+ [0x2F90E] = { unicodeslot=0x2F90E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90E', specials={'char',0x6DF9} },
+ [0x2F90F] = { unicodeslot=0x2F90F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90F', specials={'char',0x6F6E} },
+ [0x2F910] = { unicodeslot=0x2F910, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F910', specials={'char',0x23F5E} },
+ [0x2F911] = { unicodeslot=0x2F911, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F911', specials={'char',0x23F8E} },
+ [0x2F912] = { unicodeslot=0x2F912, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F912', specials={'char',0x6FC6} },
+ [0x2F913] = { unicodeslot=0x2F913, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F913', specials={'char',0x7039} },
+ [0x2F914] = { unicodeslot=0x2F914, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F914', specials={'char',0x701E} },
+ [0x2F915] = { unicodeslot=0x2F915, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F915', specials={'char',0x701B} },
+ [0x2F916] = { unicodeslot=0x2F916, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F916', specials={'char',0x3D96} },
+ [0x2F917] = { unicodeslot=0x2F917, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F917', specials={'char',0x704A} },
+ [0x2F918] = { unicodeslot=0x2F918, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F918', specials={'char',0x707D} },
+ [0x2F919] = { unicodeslot=0x2F919, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F919', specials={'char',0x7077} },
+ [0x2F91A] = { unicodeslot=0x2F91A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91A', specials={'char',0x70AD} },
+ [0x2F91B] = { unicodeslot=0x2F91B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91B', specials={'char',0x20525} },
+ [0x2F91C] = { unicodeslot=0x2F91C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91C', specials={'char',0x7145} },
+ [0x2F91D] = { unicodeslot=0x2F91D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91D', specials={'char',0x24263} },
+ [0x2F91E] = { unicodeslot=0x2F91E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91E', specials={'char',0x719C} },
+ [0x2F91F] = { unicodeslot=0x2F91F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91F', specials={'char',0x243AB} },
+ [0x2F920] = { unicodeslot=0x2F920, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F920', specials={'char',0x7228} },
+ [0x2F921] = { unicodeslot=0x2F921, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F921', specials={'char',0x7235} },
+ [0x2F922] = { unicodeslot=0x2F922, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F922', specials={'char',0x7250} },
+ [0x2F923] = { unicodeslot=0x2F923, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F923', specials={'char',0x24608} },
+ [0x2F924] = { unicodeslot=0x2F924, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F924', specials={'char',0x7280} },
+ [0x2F925] = { unicodeslot=0x2F925, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F925', specials={'char',0x7295} },
+ [0x2F926] = { unicodeslot=0x2F926, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F926', specials={'char',0x24735} },
+ [0x2F927] = { unicodeslot=0x2F927, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F927', specials={'char',0x24814} },
+ [0x2F928] = { unicodeslot=0x2F928, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F928', specials={'char',0x737A} },
+ [0x2F929] = { unicodeslot=0x2F929, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F929', specials={'char',0x738B} },
+ [0x2F92A] = { unicodeslot=0x2F92A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92A', specials={'char',0x3EAC} },
+ [0x2F92B] = { unicodeslot=0x2F92B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92B', specials={'char',0x73A5} },
+ [0x2F92C] = { unicodeslot=0x2F92C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92C', specials={'char',0x3EB8} },
+ [0x2F92D] = { unicodeslot=0x2F92D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92D', specials={'char',0x3EB8} },
+ [0x2F92E] = { unicodeslot=0x2F92E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92E', specials={'char',0x7447} },
+ [0x2F92F] = { unicodeslot=0x2F92F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92F', specials={'char',0x745C} },
+ [0x2F930] = { unicodeslot=0x2F930, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F930', specials={'char',0x7471} },
+ [0x2F931] = { unicodeslot=0x2F931, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F931', specials={'char',0x7485} },
+ [0x2F932] = { unicodeslot=0x2F932, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F932', specials={'char',0x74CA} },
+ [0x2F933] = { unicodeslot=0x2F933, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F933', specials={'char',0x3F1B} },
+ [0x2F934] = { unicodeslot=0x2F934, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F934', specials={'char',0x7524} },
+ [0x2F935] = { unicodeslot=0x2F935, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F935', specials={'char',0x24C36} },
+ [0x2F936] = { unicodeslot=0x2F936, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F936', specials={'char',0x753E} },
+ [0x2F937] = { unicodeslot=0x2F937, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F937', specials={'char',0x24C92} },
+ [0x2F938] = { unicodeslot=0x2F938, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F938', specials={'char',0x7570} },
+ [0x2F939] = { unicodeslot=0x2F939, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F939', specials={'char',0x2219F} },
+ [0x2F93A] = { unicodeslot=0x2F93A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93A', specials={'char',0x7610} },
+ [0x2F93B] = { unicodeslot=0x2F93B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93B', specials={'char',0x24FA1} },
+ [0x2F93C] = { unicodeslot=0x2F93C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93C', specials={'char',0x24FB8} },
+ [0x2F93D] = { unicodeslot=0x2F93D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93D', specials={'char',0x25044} },
+ [0x2F93E] = { unicodeslot=0x2F93E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93E', specials={'char',0x3FFC} },
+ [0x2F93F] = { unicodeslot=0x2F93F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93F', specials={'char',0x4008} },
+ [0x2F940] = { unicodeslot=0x2F940, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F940', specials={'char',0x76F4} },
+ [0x2F941] = { unicodeslot=0x2F941, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F941', specials={'char',0x250F3} },
+ [0x2F942] = { unicodeslot=0x2F942, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F942', specials={'char',0x250F2} },
+ [0x2F943] = { unicodeslot=0x2F943, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F943', specials={'char',0x25119} },
+ [0x2F944] = { unicodeslot=0x2F944, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F944', specials={'char',0x25133} },
+ [0x2F945] = { unicodeslot=0x2F945, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F945', specials={'char',0x771E} },
+ [0x2F946] = { unicodeslot=0x2F946, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F946', specials={'char',0x771F} },
+ [0x2F947] = { unicodeslot=0x2F947, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F947', specials={'char',0x771F} },
+ [0x2F948] = { unicodeslot=0x2F948, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F948', specials={'char',0x774A} },
+ [0x2F949] = { unicodeslot=0x2F949, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F949', specials={'char',0x4039} },
+ [0x2F94A] = { unicodeslot=0x2F94A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94A', specials={'char',0x778B} },
+ [0x2F94B] = { unicodeslot=0x2F94B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94B', specials={'char',0x4046} },
+ [0x2F94C] = { unicodeslot=0x2F94C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94C', specials={'char',0x4096} },
+ [0x2F94D] = { unicodeslot=0x2F94D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94D', specials={'char',0x2541D} },
+ [0x2F94E] = { unicodeslot=0x2F94E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94E', specials={'char',0x784E} },
+ [0x2F94F] = { unicodeslot=0x2F94F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94F', specials={'char',0x788C} },
+ [0x2F950] = { unicodeslot=0x2F950, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F950', specials={'char',0x78CC} },
+ [0x2F951] = { unicodeslot=0x2F951, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F951', specials={'char',0x40E3} },
+ [0x2F952] = { unicodeslot=0x2F952, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F952', specials={'char',0x25626} },
+ [0x2F953] = { unicodeslot=0x2F953, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F953', specials={'char',0x7956} },
+ [0x2F954] = { unicodeslot=0x2F954, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F954', specials={'char',0x2569A} },
+ [0x2F955] = { unicodeslot=0x2F955, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F955', specials={'char',0x256C5} },
+ [0x2F956] = { unicodeslot=0x2F956, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F956', specials={'char',0x798F} },
+ [0x2F957] = { unicodeslot=0x2F957, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F957', specials={'char',0x79EB} },
+ [0x2F958] = { unicodeslot=0x2F958, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F958', specials={'char',0x412F} },
+ [0x2F959] = { unicodeslot=0x2F959, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F959', specials={'char',0x7A40} },
+ [0x2F95A] = { unicodeslot=0x2F95A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95A', specials={'char',0x7A4A} },
+ [0x2F95B] = { unicodeslot=0x2F95B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95B', specials={'char',0x7A4F} },
+ [0x2F95C] = { unicodeslot=0x2F95C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95C', specials={'char',0x2597C} },
+ [0x2F95D] = { unicodeslot=0x2F95D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95D', specials={'char',0x25AA7} },
+ [0x2F95E] = { unicodeslot=0x2F95E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95E', specials={'char',0x25AA7} },
+ [0x2F95F] = { unicodeslot=0x2F95F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95F', specials={'char',0x7AEE} },
+ [0x2F960] = { unicodeslot=0x2F960, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F960', specials={'char',0x4202} },
+ [0x2F961] = { unicodeslot=0x2F961, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F961', specials={'char',0x25BAB} },
+ [0x2F962] = { unicodeslot=0x2F962, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F962', specials={'char',0x7BC6} },
+ [0x2F963] = { unicodeslot=0x2F963, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F963', specials={'char',0x7BC9} },
+ [0x2F964] = { unicodeslot=0x2F964, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F964', specials={'char',0x4227} },
+ [0x2F965] = { unicodeslot=0x2F965, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F965', specials={'char',0x25C80} },
+ [0x2F966] = { unicodeslot=0x2F966, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F966', specials={'char',0x7CD2} },
+ [0x2F967] = { unicodeslot=0x2F967, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F967', specials={'char',0x42A0} },
+ [0x2F968] = { unicodeslot=0x2F968, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F968', specials={'char',0x7CE8} },
+ [0x2F969] = { unicodeslot=0x2F969, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F969', specials={'char',0x7CE3} },
+ [0x2F96A] = { unicodeslot=0x2F96A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96A', specials={'char',0x7D00} },
+ [0x2F96B] = { unicodeslot=0x2F96B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96B', specials={'char',0x25F86} },
+ [0x2F96C] = { unicodeslot=0x2F96C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96C', specials={'char',0x7D63} },
+ [0x2F96D] = { unicodeslot=0x2F96D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96D', specials={'char',0x4301} },
+ [0x2F96E] = { unicodeslot=0x2F96E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96E', specials={'char',0x7DC7} },
+ [0x2F96F] = { unicodeslot=0x2F96F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96F', specials={'char',0x7E02} },
+ [0x2F970] = { unicodeslot=0x2F970, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F970', specials={'char',0x7E45} },
+ [0x2F971] = { unicodeslot=0x2F971, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F971', specials={'char',0x4334} },
+ [0x2F972] = { unicodeslot=0x2F972, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F972', specials={'char',0x26228} },
+ [0x2F973] = { unicodeslot=0x2F973, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F973', specials={'char',0x26247} },
+ [0x2F974] = { unicodeslot=0x2F974, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F974', specials={'char',0x4359} },
+ [0x2F975] = { unicodeslot=0x2F975, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F975', specials={'char',0x262D9} },
+ [0x2F976] = { unicodeslot=0x2F976, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F976', specials={'char',0x7F7A} },
+ [0x2F977] = { unicodeslot=0x2F977, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F977', specials={'char',0x2633E} },
+ [0x2F978] = { unicodeslot=0x2F978, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F978', specials={'char',0x7F95} },
+ [0x2F979] = { unicodeslot=0x2F979, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F979', specials={'char',0x7FFA} },
+ [0x2F97A] = { unicodeslot=0x2F97A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97A', specials={'char',0x8005} },
+ [0x2F97B] = { unicodeslot=0x2F97B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97B', specials={'char',0x264DA} },
+ [0x2F97C] = { unicodeslot=0x2F97C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97C', specials={'char',0x26523} },
+ [0x2F97D] = { unicodeslot=0x2F97D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97D', specials={'char',0x8060} },
+ [0x2F97E] = { unicodeslot=0x2F97E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97E', specials={'char',0x265A8} },
+ [0x2F97F] = { unicodeslot=0x2F97F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97F', specials={'char',0x8070} },
+ [0x2F980] = { unicodeslot=0x2F980, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F980', specials={'char',0x2335F} },
+ [0x2F981] = { unicodeslot=0x2F981, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F981', specials={'char',0x43D5} },
+ [0x2F982] = { unicodeslot=0x2F982, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F982', specials={'char',0x80B2} },
+ [0x2F983] = { unicodeslot=0x2F983, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F983', specials={'char',0x8103} },
+ [0x2F984] = { unicodeslot=0x2F984, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F984', specials={'char',0x440B} },
+ [0x2F985] = { unicodeslot=0x2F985, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F985', specials={'char',0x813E} },
+ [0x2F986] = { unicodeslot=0x2F986, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F986', specials={'char',0x5AB5} },
+ [0x2F987] = { unicodeslot=0x2F987, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F987', specials={'char',0x267A7} },
+ [0x2F988] = { unicodeslot=0x2F988, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F988', specials={'char',0x267B5} },
+ [0x2F989] = { unicodeslot=0x2F989, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F989', specials={'char',0x23393} },
+ [0x2F98A] = { unicodeslot=0x2F98A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98A', specials={'char',0x2339C} },
+ [0x2F98B] = { unicodeslot=0x2F98B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98B', specials={'char',0x8201} },
+ [0x2F98C] = { unicodeslot=0x2F98C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98C', specials={'char',0x8204} },
+ [0x2F98D] = { unicodeslot=0x2F98D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98D', specials={'char',0x8F9E} },
+ [0x2F98E] = { unicodeslot=0x2F98E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98E', specials={'char',0x446B} },
+ [0x2F98F] = { unicodeslot=0x2F98F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98F', specials={'char',0x8291} },
+ [0x2F990] = { unicodeslot=0x2F990, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F990', specials={'char',0x828B} },
+ [0x2F991] = { unicodeslot=0x2F991, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F991', specials={'char',0x829D} },
+ [0x2F992] = { unicodeslot=0x2F992, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F992', specials={'char',0x52B3} },
+ [0x2F993] = { unicodeslot=0x2F993, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F993', specials={'char',0x82B1} },
+ [0x2F994] = { unicodeslot=0x2F994, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F994', specials={'char',0x82B3} },
+ [0x2F995] = { unicodeslot=0x2F995, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F995', specials={'char',0x82BD} },
+ [0x2F996] = { unicodeslot=0x2F996, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F996', specials={'char',0x82E6} },
+ [0x2F997] = { unicodeslot=0x2F997, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F997', specials={'char',0x26B3C} },
+ [0x2F998] = { unicodeslot=0x2F998, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F998', specials={'char',0x82E5} },
+ [0x2F999] = { unicodeslot=0x2F999, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F999', specials={'char',0x831D} },
+ [0x2F99A] = { unicodeslot=0x2F99A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99A', specials={'char',0x8363} },
+ [0x2F99B] = { unicodeslot=0x2F99B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99B', specials={'char',0x83AD} },
+ [0x2F99C] = { unicodeslot=0x2F99C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99C', specials={'char',0x8323} },
+ [0x2F99D] = { unicodeslot=0x2F99D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99D', specials={'char',0x83BD} },
+ [0x2F99E] = { unicodeslot=0x2F99E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99E', specials={'char',0x83E7} },
+ [0x2F99F] = { unicodeslot=0x2F99F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99F', specials={'char',0x8457} },
+ [0x2F9A0] = { unicodeslot=0x2F9A0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A0', specials={'char',0x8353} },
+ [0x2F9A1] = { unicodeslot=0x2F9A1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A1', specials={'char',0x83CA} },
+ [0x2F9A2] = { unicodeslot=0x2F9A2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A2', specials={'char',0x83CC} },
+ [0x2F9A3] = { unicodeslot=0x2F9A3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A3', specials={'char',0x83DC} },
+ [0x2F9A4] = { unicodeslot=0x2F9A4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A4', specials={'char',0x26C36} },
+ [0x2F9A5] = { unicodeslot=0x2F9A5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A5', specials={'char',0x26D6B} },
+ [0x2F9A6] = { unicodeslot=0x2F9A6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A6', specials={'char',0x26CD5} },
+ [0x2F9A7] = { unicodeslot=0x2F9A7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A7', specials={'char',0x452B} },
+ [0x2F9A8] = { unicodeslot=0x2F9A8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A8', specials={'char',0x84F1} },
+ [0x2F9A9] = { unicodeslot=0x2F9A9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A9', specials={'char',0x84F3} },
+ [0x2F9AA] = { unicodeslot=0x2F9AA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AA', specials={'char',0x8516} },
+ [0x2F9AB] = { unicodeslot=0x2F9AB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AB', specials={'char',0x273CA} },
+ [0x2F9AC] = { unicodeslot=0x2F9AC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AC', specials={'char',0x8564} },
+ [0x2F9AD] = { unicodeslot=0x2F9AD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AD', specials={'char',0x26F2C} },
+ [0x2F9AE] = { unicodeslot=0x2F9AE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AE', specials={'char',0x455D} },
+ [0x2F9AF] = { unicodeslot=0x2F9AF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AF', specials={'char',0x4561} },
+ [0x2F9B0] = { unicodeslot=0x2F9B0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B0', specials={'char',0x26FB1} },
+ [0x2F9B1] = { unicodeslot=0x2F9B1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B1', specials={'char',0x270D2} },
+ [0x2F9B2] = { unicodeslot=0x2F9B2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B2', specials={'char',0x456B} },
+ [0x2F9B3] = { unicodeslot=0x2F9B3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B3', specials={'char',0x8650} },
+ [0x2F9B4] = { unicodeslot=0x2F9B4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B4', specials={'char',0x865C} },
+ [0x2F9B5] = { unicodeslot=0x2F9B5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B5', specials={'char',0x8667} },
+ [0x2F9B6] = { unicodeslot=0x2F9B6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B6', specials={'char',0x8669} },
+ [0x2F9B7] = { unicodeslot=0x2F9B7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B7', specials={'char',0x86A9} },
+ [0x2F9B8] = { unicodeslot=0x2F9B8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B8', specials={'char',0x8688} },
+ [0x2F9B9] = { unicodeslot=0x2F9B9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B9', specials={'char',0x870E} },
+ [0x2F9BA] = { unicodeslot=0x2F9BA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BA', specials={'char',0x86E2} },
+ [0x2F9BB] = { unicodeslot=0x2F9BB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BB', specials={'char',0x8779} },
+ [0x2F9BC] = { unicodeslot=0x2F9BC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BC', specials={'char',0x8728} },
+ [0x2F9BD] = { unicodeslot=0x2F9BD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BD', specials={'char',0x876B} },
+ [0x2F9BE] = { unicodeslot=0x2F9BE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BE', specials={'char',0x8786} },
+ [0x2F9BF] = { unicodeslot=0x2F9BF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BF', specials={'char',0x45D7} },
+ [0x2F9C0] = { unicodeslot=0x2F9C0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C0', specials={'char',0x87E1} },
+ [0x2F9C1] = { unicodeslot=0x2F9C1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C1', specials={'char',0x8801} },
+ [0x2F9C2] = { unicodeslot=0x2F9C2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C2', specials={'char',0x45F9} },
+ [0x2F9C3] = { unicodeslot=0x2F9C3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C3', specials={'char',0x8860} },
+ [0x2F9C4] = { unicodeslot=0x2F9C4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C4', specials={'char',0x8863} },
+ [0x2F9C5] = { unicodeslot=0x2F9C5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C5', specials={'char',0x27667} },
+ [0x2F9C6] = { unicodeslot=0x2F9C6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C6', specials={'char',0x88D7} },
+ [0x2F9C7] = { unicodeslot=0x2F9C7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C7', specials={'char',0x88DE} },
+ [0x2F9C8] = { unicodeslot=0x2F9C8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C8', specials={'char',0x4635} },
+ [0x2F9C9] = { unicodeslot=0x2F9C9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C9', specials={'char',0x88FA} },
+ [0x2F9CA] = { unicodeslot=0x2F9CA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CA', specials={'char',0x34BB} },
+ [0x2F9CB] = { unicodeslot=0x2F9CB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CB', specials={'char',0x278AE} },
+ [0x2F9CC] = { unicodeslot=0x2F9CC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CC', specials={'char',0x27966} },
+ [0x2F9CD] = { unicodeslot=0x2F9CD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CD', specials={'char',0x46BE} },
+ [0x2F9CE] = { unicodeslot=0x2F9CE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CE', specials={'char',0x46C7} },
+ [0x2F9CF] = { unicodeslot=0x2F9CF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CF', specials={'char',0x8AA0} },
+ [0x2F9D0] = { unicodeslot=0x2F9D0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D0', specials={'char',0x8AED} },
+ [0x2F9D1] = { unicodeslot=0x2F9D1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D1', specials={'char',0x8B8A} },
+ [0x2F9D2] = { unicodeslot=0x2F9D2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D2', specials={'char',0x8C55} },
+ [0x2F9D3] = { unicodeslot=0x2F9D3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D3', specials={'char',0x27CA8} },
+ [0x2F9D4] = { unicodeslot=0x2F9D4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D4', specials={'char',0x8CAB} },
+ [0x2F9D5] = { unicodeslot=0x2F9D5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D5', specials={'char',0x8CC1} },
+ [0x2F9D6] = { unicodeslot=0x2F9D6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D6', specials={'char',0x8D1B} },
+ [0x2F9D7] = { unicodeslot=0x2F9D7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D7', specials={'char',0x8D77} },
+ [0x2F9D8] = { unicodeslot=0x2F9D8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D8', specials={'char',0x27F2F} },
+ [0x2F9D9] = { unicodeslot=0x2F9D9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D9', specials={'char',0x20804} },
+ [0x2F9DA] = { unicodeslot=0x2F9DA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DA', specials={'char',0x8DCB} },
+ [0x2F9DB] = { unicodeslot=0x2F9DB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DB', specials={'char',0x8DBC} },
+ [0x2F9DC] = { unicodeslot=0x2F9DC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DC', specials={'char',0x8DF0} },
+ [0x2F9DD] = { unicodeslot=0x2F9DD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DD', specials={'char',0x208DE} },
+ [0x2F9DE] = { unicodeslot=0x2F9DE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DE', specials={'char',0x8ED4} },
+ [0x2F9DF] = { unicodeslot=0x2F9DF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DF', specials={'char',0x8F38} },
+ [0x2F9E0] = { unicodeslot=0x2F9E0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E0', specials={'char',0x285D2} },
+ [0x2F9E1] = { unicodeslot=0x2F9E1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E1', specials={'char',0x285ED} },
+ [0x2F9E2] = { unicodeslot=0x2F9E2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E2', specials={'char',0x9094} },
+ [0x2F9E3] = { unicodeslot=0x2F9E3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E3', specials={'char',0x90F1} },
+ [0x2F9E4] = { unicodeslot=0x2F9E4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E4', specials={'char',0x9111} },
+ [0x2F9E5] = { unicodeslot=0x2F9E5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E5', specials={'char',0x2872E} },
+ [0x2F9E6] = { unicodeslot=0x2F9E6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E6', specials={'char',0x911B} },
+ [0x2F9E7] = { unicodeslot=0x2F9E7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E7', specials={'char',0x9238} },
+ [0x2F9E8] = { unicodeslot=0x2F9E8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E8', specials={'char',0x92D7} },
+ [0x2F9E9] = { unicodeslot=0x2F9E9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E9', specials={'char',0x92D8} },
+ [0x2F9EA] = { unicodeslot=0x2F9EA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EA', specials={'char',0x927C} },
+ [0x2F9EB] = { unicodeslot=0x2F9EB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EB', specials={'char',0x93F9} },
+ [0x2F9EC] = { unicodeslot=0x2F9EC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EC', specials={'char',0x9415} },
+ [0x2F9ED] = { unicodeslot=0x2F9ED, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9ED', specials={'char',0x28BFA} },
+ [0x2F9EE] = { unicodeslot=0x2F9EE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EE', specials={'char',0x958B} },
+ [0x2F9EF] = { unicodeslot=0x2F9EF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EF', specials={'char',0x4995} },
+ [0x2F9F0] = { unicodeslot=0x2F9F0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F0', specials={'char',0x95B7} },
+ [0x2F9F1] = { unicodeslot=0x2F9F1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F1', specials={'char',0x28D77} },
+ [0x2F9F2] = { unicodeslot=0x2F9F2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F2', specials={'char',0x49E6} },
+ [0x2F9F3] = { unicodeslot=0x2F9F3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F3', specials={'char',0x96C3} },
+ [0x2F9F4] = { unicodeslot=0x2F9F4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F4', specials={'char',0x5DB2} },
+ [0x2F9F5] = { unicodeslot=0x2F9F5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F5', specials={'char',0x9723} },
+ [0x2F9F6] = { unicodeslot=0x2F9F6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F6', specials={'char',0x29145} },
+ [0x2F9F7] = { unicodeslot=0x2F9F7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F7', specials={'char',0x2921A} },
+ [0x2F9F8] = { unicodeslot=0x2F9F8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F8', specials={'char',0x4A6E} },
+ [0x2F9F9] = { unicodeslot=0x2F9F9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F9', specials={'char',0x4A76} },
+ [0x2F9FA] = { unicodeslot=0x2F9FA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FA', specials={'char',0x97E0} },
+ [0x2F9FB] = { unicodeslot=0x2F9FB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FB', specials={'char',0x2940A} },
+ [0x2F9FC] = { unicodeslot=0x2F9FC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FC', specials={'char',0x4AB2} },
+ [0x2F9FD] = { unicodeslot=0x2F9FD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FD', specials={'char',0x29496} },
+ [0x2F9FE] = { unicodeslot=0x2F9FE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FE', specials={'char',0x980B} },
+ [0x2F9FF] = { unicodeslot=0x2F9FF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FF', specials={'char',0x980B} },
+ [0x2FA00] = { unicodeslot=0x2FA00, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA00', specials={'char',0x9829} },
+ [0x2FA01] = { unicodeslot=0x2FA01, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA01', specials={'char',0x295B6} },
+ [0x2FA02] = { unicodeslot=0x2FA02, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA02', specials={'char',0x98E2} },
+ [0x2FA03] = { unicodeslot=0x2FA03, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA03', specials={'char',0x4B33} },
+ [0x2FA04] = { unicodeslot=0x2FA04, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA04', specials={'char',0x9929} },
+ [0x2FA05] = { unicodeslot=0x2FA05, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA05', specials={'char',0x99A7} },
+ [0x2FA06] = { unicodeslot=0x2FA06, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA06', specials={'char',0x99C2} },
+ [0x2FA07] = { unicodeslot=0x2FA07, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA07', specials={'char',0x99FE} },
+ [0x2FA08] = { unicodeslot=0x2FA08, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA08', specials={'char',0x4BCE} },
+ [0x2FA09] = { unicodeslot=0x2FA09, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA09', specials={'char',0x29B30} },
+ [0x2FA0A] = { unicodeslot=0x2FA0A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0A', specials={'char',0x9B12} },
+ [0x2FA0B] = { unicodeslot=0x2FA0B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0B', specials={'char',0x9C40} },
+ [0x2FA0C] = { unicodeslot=0x2FA0C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0C', specials={'char',0x9CFD} },
+ [0x2FA0D] = { unicodeslot=0x2FA0D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0D', specials={'char',0x4CCE} },
+ [0x2FA0E] = { unicodeslot=0x2FA0E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0E', specials={'char',0x4CED} },
+ [0x2FA0F] = { unicodeslot=0x2FA0F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0F', specials={'char',0x9D67} },
+ [0x2FA10] = { unicodeslot=0x2FA10, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA10', specials={'char',0x2A0CE} },
+ [0x2FA11] = { unicodeslot=0x2FA11, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA11', specials={'char',0x4CF8} },
+ [0x2FA12] = { unicodeslot=0x2FA12, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA12', specials={'char',0x2A105} },
+ [0x2FA13] = { unicodeslot=0x2FA13, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA13', specials={'char',0x2A20E} },
+ [0x2FA14] = { unicodeslot=0x2FA14, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA14', specials={'char',0x2A291} },
+ [0x2FA15] = { unicodeslot=0x2FA15, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA15', specials={'char',0x9EBB} },
+ [0x2FA16] = { unicodeslot=0x2FA16, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA16', specials={'char',0x4D56} },
+ [0x2FA17] = { unicodeslot=0x2FA17, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA17', specials={'char',0x9EF9} },
+ [0x2FA18] = { unicodeslot=0x2FA18, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA18', specials={'char',0x9EFE} },
+ [0x2FA19] = { unicodeslot=0x2FA19, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA19', specials={'char',0x9F05} },
+ [0x2FA1A] = { unicodeslot=0x2FA1A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1A', specials={'char',0x9F0F} },
+ [0x2FA1B] = { unicodeslot=0x2FA1B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1B', specials={'char',0x9F16} },
+ [0x2FA1C] = { unicodeslot=0x2FA1C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1C', specials={'char',0x9F3B} },
+ [0x2FA1D] = { unicodeslot=0x2FA1D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1D', specials={'char',0x2A600} },
+ [0xE0001] = { unicodeslot=0xE0001, category='cf', description='LANGUAGE TAG' },
+ [0xE0020] = { unicodeslot=0xE0020, category='cf', description='TAG SPACE' },
+ [0xE0021] = { unicodeslot=0xE0021, category='cf', description='TAG EXCLAMATION MARK' },
+ [0xE0022] = { unicodeslot=0xE0022, category='cf', description='TAG QUOTATION MARK' },
+ [0xE0023] = { unicodeslot=0xE0023, category='cf', description='TAG NUMBER SIGN' },
+ [0xE0024] = { unicodeslot=0xE0024, category='cf', description='TAG DOLLAR SIGN' },
+ [0xE0025] = { unicodeslot=0xE0025, category='cf', description='TAG PERCENT SIGN' },
+ [0xE0026] = { unicodeslot=0xE0026, category='cf', description='TAG AMPERSAND' },
+ [0xE0027] = { unicodeslot=0xE0027, category='cf', description='TAG APOSTROPHE' },
+ [0xE0028] = { unicodeslot=0xE0028, category='cf', description='TAG LEFT PARENTHESIS' },
+ [0xE0029] = { unicodeslot=0xE0029, category='cf', description='TAG RIGHT PARENTHESIS' },
+ [0xE002A] = { unicodeslot=0xE002A, category='cf', description='TAG ASTERISK' },
+ [0xE002B] = { unicodeslot=0xE002B, category='cf', description='TAG PLUS SIGN' },
+ [0xE002C] = { unicodeslot=0xE002C, category='cf', description='TAG COMMA' },
+ [0xE002D] = { unicodeslot=0xE002D, category='cf', description='TAG HYPHEN-MINUS' },
+ [0xE002E] = { unicodeslot=0xE002E, category='cf', description='TAG FULL STOP' },
+ [0xE002F] = { unicodeslot=0xE002F, category='cf', description='TAG SOLIDUS' },
+ [0xE0030] = { unicodeslot=0xE0030, category='cf', description='TAG DIGIT ZERO' },
+ [0xE0031] = { unicodeslot=0xE0031, category='cf', description='TAG DIGIT ONE' },
+ [0xE0032] = { unicodeslot=0xE0032, category='cf', description='TAG DIGIT TWO' },
+ [0xE0033] = { unicodeslot=0xE0033, category='cf', description='TAG DIGIT THREE' },
+ [0xE0034] = { unicodeslot=0xE0034, category='cf', description='TAG DIGIT FOUR' },
+ [0xE0035] = { unicodeslot=0xE0035, category='cf', description='TAG DIGIT FIVE' },
+ [0xE0036] = { unicodeslot=0xE0036, category='cf', description='TAG DIGIT SIX' },
+ [0xE0037] = { unicodeslot=0xE0037, category='cf', description='TAG DIGIT SEVEN' },
+ [0xE0038] = { unicodeslot=0xE0038, category='cf', description='TAG DIGIT EIGHT' },
+ [0xE0039] = { unicodeslot=0xE0039, category='cf', description='TAG DIGIT NINE' },
+ [0xE003A] = { unicodeslot=0xE003A, category='cf', description='TAG COLON' },
+ [0xE003B] = { unicodeslot=0xE003B, category='cf', description='TAG SEMICOLON' },
+ [0xE003C] = { unicodeslot=0xE003C, category='cf', description='TAG LESS-THAN SIGN' },
+ [0xE003D] = { unicodeslot=0xE003D, category='cf', description='TAG EQUALS SIGN' },
+ [0xE003E] = { unicodeslot=0xE003E, category='cf', description='TAG GREATER-THAN SIGN' },
+ [0xE003F] = { unicodeslot=0xE003F, category='cf', description='TAG QUESTION MARK' },
+ [0xE0040] = { unicodeslot=0xE0040, category='cf', description='TAG COMMERCIAL AT' },
+ [0xE0041] = { unicodeslot=0xE0041, category='cf', description='TAG LATIN CAPITAL LETTER A' },
+ [0xE0042] = { unicodeslot=0xE0042, category='cf', description='TAG LATIN CAPITAL LETTER B' },
+ [0xE0043] = { unicodeslot=0xE0043, category='cf', description='TAG LATIN CAPITAL LETTER C' },
+ [0xE0044] = { unicodeslot=0xE0044, category='cf', description='TAG LATIN CAPITAL LETTER D' },
+ [0xE0045] = { unicodeslot=0xE0045, category='cf', description='TAG LATIN CAPITAL LETTER E' },
+ [0xE0046] = { unicodeslot=0xE0046, category='cf', description='TAG LATIN CAPITAL LETTER F' },
+ [0xE0047] = { unicodeslot=0xE0047, category='cf', description='TAG LATIN CAPITAL LETTER G' },
+ [0xE0048] = { unicodeslot=0xE0048, category='cf', description='TAG LATIN CAPITAL LETTER H' },
+ [0xE0049] = { unicodeslot=0xE0049, category='cf', description='TAG LATIN CAPITAL LETTER I' },
+ [0xE004A] = { unicodeslot=0xE004A, category='cf', description='TAG LATIN CAPITAL LETTER J' },
+ [0xE004B] = { unicodeslot=0xE004B, category='cf', description='TAG LATIN CAPITAL LETTER K' },
+ [0xE004C] = { unicodeslot=0xE004C, category='cf', description='TAG LATIN CAPITAL LETTER L' },
+ [0xE004D] = { unicodeslot=0xE004D, category='cf', description='TAG LATIN CAPITAL LETTER M' },
+ [0xE004E] = { unicodeslot=0xE004E, category='cf', description='TAG LATIN CAPITAL LETTER N' },
+ [0xE004F] = { unicodeslot=0xE004F, category='cf', description='TAG LATIN CAPITAL LETTER O' },
+ [0xE0050] = { unicodeslot=0xE0050, category='cf', description='TAG LATIN CAPITAL LETTER P' },
+ [0xE0051] = { unicodeslot=0xE0051, category='cf', description='TAG LATIN CAPITAL LETTER Q' },
+ [0xE0052] = { unicodeslot=0xE0052, category='cf', description='TAG LATIN CAPITAL LETTER R' },
+ [0xE0053] = { unicodeslot=0xE0053, category='cf', description='TAG LATIN CAPITAL LETTER S' },
+ [0xE0054] = { unicodeslot=0xE0054, category='cf', description='TAG LATIN CAPITAL LETTER T' },
+ [0xE0055] = { unicodeslot=0xE0055, category='cf', description='TAG LATIN CAPITAL LETTER U' },
+ [0xE0056] = { unicodeslot=0xE0056, category='cf', description='TAG LATIN CAPITAL LETTER V' },
+ [0xE0057] = { unicodeslot=0xE0057, category='cf', description='TAG LATIN CAPITAL LETTER W' },
+ [0xE0058] = { unicodeslot=0xE0058, category='cf', description='TAG LATIN CAPITAL LETTER X' },
+ [0xE0059] = { unicodeslot=0xE0059, category='cf', description='TAG LATIN CAPITAL LETTER Y' },
+ [0xE005A] = { unicodeslot=0xE005A, category='cf', description='TAG LATIN CAPITAL LETTER Z' },
+ [0xE005B] = { unicodeslot=0xE005B, category='cf', description='TAG LEFT SQUARE BRACKET' },
+ [0xE005C] = { unicodeslot=0xE005C, category='cf', description='TAG REVERSE SOLIDUS' },
+ [0xE005D] = { unicodeslot=0xE005D, category='cf', description='TAG RIGHT SQUARE BRACKET' },
+ [0xE005E] = { unicodeslot=0xE005E, category='cf', description='TAG CIRCUMFLEX ACCENT' },
+ [0xE005F] = { unicodeslot=0xE005F, category='cf', description='TAG LOW LINE' },
+ [0xE0060] = { unicodeslot=0xE0060, category='cf', description='TAG GRAVE ACCENT' },
+ [0xE0061] = { unicodeslot=0xE0061, category='cf', description='TAG LATIN SMALL LETTER A' },
+ [0xE0062] = { unicodeslot=0xE0062, category='cf', description='TAG LATIN SMALL LETTER B' },
+ [0xE0063] = { unicodeslot=0xE0063, category='cf', description='TAG LATIN SMALL LETTER C' },
+ [0xE0064] = { unicodeslot=0xE0064, category='cf', description='TAG LATIN SMALL LETTER D' },
+ [0xE0065] = { unicodeslot=0xE0065, category='cf', description='TAG LATIN SMALL LETTER E' },
+ [0xE0066] = { unicodeslot=0xE0066, category='cf', description='TAG LATIN SMALL LETTER F' },
+ [0xE0067] = { unicodeslot=0xE0067, category='cf', description='TAG LATIN SMALL LETTER G' },
+ [0xE0068] = { unicodeslot=0xE0068, category='cf', description='TAG LATIN SMALL LETTER H' },
+ [0xE0069] = { unicodeslot=0xE0069, category='cf', description='TAG LATIN SMALL LETTER I' },
+ [0xE006A] = { unicodeslot=0xE006A, category='cf', description='TAG LATIN SMALL LETTER J' },
+ [0xE006B] = { unicodeslot=0xE006B, category='cf', description='TAG LATIN SMALL LETTER K' },
+ [0xE006C] = { unicodeslot=0xE006C, category='cf', description='TAG LATIN SMALL LETTER L' },
+ [0xE006D] = { unicodeslot=0xE006D, category='cf', description='TAG LATIN SMALL LETTER M' },
+ [0xE006E] = { unicodeslot=0xE006E, category='cf', description='TAG LATIN SMALL LETTER N' },
+ [0xE006F] = { unicodeslot=0xE006F, category='cf', description='TAG LATIN SMALL LETTER O' },
+ [0xE0070] = { unicodeslot=0xE0070, category='cf', description='TAG LATIN SMALL LETTER P' },
+ [0xE0071] = { unicodeslot=0xE0071, category='cf', description='TAG LATIN SMALL LETTER Q' },
+ [0xE0072] = { unicodeslot=0xE0072, category='cf', description='TAG LATIN SMALL LETTER R' },
+ [0xE0073] = { unicodeslot=0xE0073, category='cf', description='TAG LATIN SMALL LETTER S' },
+ [0xE0074] = { unicodeslot=0xE0074, category='cf', description='TAG LATIN SMALL LETTER T' },
+ [0xE0075] = { unicodeslot=0xE0075, category='cf', description='TAG LATIN SMALL LETTER U' },
+ [0xE0076] = { unicodeslot=0xE0076, category='cf', description='TAG LATIN SMALL LETTER V' },
+ [0xE0077] = { unicodeslot=0xE0077, category='cf', description='TAG LATIN SMALL LETTER W' },
+ [0xE0078] = { unicodeslot=0xE0078, category='cf', description='TAG LATIN SMALL LETTER X' },
+ [0xE0079] = { unicodeslot=0xE0079, category='cf', description='TAG LATIN SMALL LETTER Y' },
+ [0xE007A] = { unicodeslot=0xE007A, category='cf', description='TAG LATIN SMALL LETTER Z' },
+ [0xE007B] = { unicodeslot=0xE007B, category='cf', description='TAG LEFT CURLY BRACKET' },
+ [0xE007C] = { unicodeslot=0xE007C, category='cf', description='TAG VERTICAL LINE' },
+ [0xE007D] = { unicodeslot=0xE007D, category='cf', description='TAG RIGHT CURLY BRACKET' },
+ [0xE007E] = { unicodeslot=0xE007E, category='cf', description='TAG TILDE' },
+ [0xE007F] = { unicodeslot=0xE007F, category='cf', description='CANCEL TAG' },
+ [0xE0100] = { unicodeslot=0xE0100, category='mn', description='VARIATION SELECTOR-17' },
+ [0xE0101] = { unicodeslot=0xE0101, category='mn', description='VARIATION SELECTOR-18' },
+ [0xE0102] = { unicodeslot=0xE0102, category='mn', description='VARIATION SELECTOR-19' },
+ [0xE0103] = { unicodeslot=0xE0103, category='mn', description='VARIATION SELECTOR-20' },
+ [0xE0104] = { unicodeslot=0xE0104, category='mn', description='VARIATION SELECTOR-21' },
+ [0xE0105] = { unicodeslot=0xE0105, category='mn', description='VARIATION SELECTOR-22' },
+ [0xE0106] = { unicodeslot=0xE0106, category='mn', description='VARIATION SELECTOR-23' },
+ [0xE0107] = { unicodeslot=0xE0107, category='mn', description='VARIATION SELECTOR-24' },
+ [0xE0108] = { unicodeslot=0xE0108, category='mn', description='VARIATION SELECTOR-25' },
+ [0xE0109] = { unicodeslot=0xE0109, category='mn', description='VARIATION SELECTOR-26' },
+ [0xE010A] = { unicodeslot=0xE010A, category='mn', description='VARIATION SELECTOR-27' },
+ [0xE010B] = { unicodeslot=0xE010B, category='mn', description='VARIATION SELECTOR-28' },
+ [0xE010C] = { unicodeslot=0xE010C, category='mn', description='VARIATION SELECTOR-29' },
+ [0xE010D] = { unicodeslot=0xE010D, category='mn', description='VARIATION SELECTOR-30' },
+ [0xE010E] = { unicodeslot=0xE010E, category='mn', description='VARIATION SELECTOR-31' },
+ [0xE010F] = { unicodeslot=0xE010F, category='mn', description='VARIATION SELECTOR-32' },
+ [0xE0110] = { unicodeslot=0xE0110, category='mn', description='VARIATION SELECTOR-33' },
+ [0xE0111] = { unicodeslot=0xE0111, category='mn', description='VARIATION SELECTOR-34' },
+ [0xE0112] = { unicodeslot=0xE0112, category='mn', description='VARIATION SELECTOR-35' },
+ [0xE0113] = { unicodeslot=0xE0113, category='mn', description='VARIATION SELECTOR-36' },
+ [0xE0114] = { unicodeslot=0xE0114, category='mn', description='VARIATION SELECTOR-37' },
+ [0xE0115] = { unicodeslot=0xE0115, category='mn', description='VARIATION SELECTOR-38' },
+ [0xE0116] = { unicodeslot=0xE0116, category='mn', description='VARIATION SELECTOR-39' },
+ [0xE0117] = { unicodeslot=0xE0117, category='mn', description='VARIATION SELECTOR-40' },
+ [0xE0118] = { unicodeslot=0xE0118, category='mn', description='VARIATION SELECTOR-41' },
+ [0xE0119] = { unicodeslot=0xE0119, category='mn', description='VARIATION SELECTOR-42' },
+ [0xE011A] = { unicodeslot=0xE011A, category='mn', description='VARIATION SELECTOR-43' },
+ [0xE011B] = { unicodeslot=0xE011B, category='mn', description='VARIATION SELECTOR-44' },
+ [0xE011C] = { unicodeslot=0xE011C, category='mn', description='VARIATION SELECTOR-45' },
+ [0xE011D] = { unicodeslot=0xE011D, category='mn', description='VARIATION SELECTOR-46' },
+ [0xE011E] = { unicodeslot=0xE011E, category='mn', description='VARIATION SELECTOR-47' },
+ [0xE011F] = { unicodeslot=0xE011F, category='mn', description='VARIATION SELECTOR-48' },
+ [0xE0120] = { unicodeslot=0xE0120, category='mn', description='VARIATION SELECTOR-49' },
+ [0xE0121] = { unicodeslot=0xE0121, category='mn', description='VARIATION SELECTOR-50' },
+ [0xE0122] = { unicodeslot=0xE0122, category='mn', description='VARIATION SELECTOR-51' },
+ [0xE0123] = { unicodeslot=0xE0123, category='mn', description='VARIATION SELECTOR-52' },
+ [0xE0124] = { unicodeslot=0xE0124, category='mn', description='VARIATION SELECTOR-53' },
+ [0xE0125] = { unicodeslot=0xE0125, category='mn', description='VARIATION SELECTOR-54' },
+ [0xE0126] = { unicodeslot=0xE0126, category='mn', description='VARIATION SELECTOR-55' },
+ [0xE0127] = { unicodeslot=0xE0127, category='mn', description='VARIATION SELECTOR-56' },
+ [0xE0128] = { unicodeslot=0xE0128, category='mn', description='VARIATION SELECTOR-57' },
+ [0xE0129] = { unicodeslot=0xE0129, category='mn', description='VARIATION SELECTOR-58' },
+ [0xE012A] = { unicodeslot=0xE012A, category='mn', description='VARIATION SELECTOR-59' },
+ [0xE012B] = { unicodeslot=0xE012B, category='mn', description='VARIATION SELECTOR-60' },
+ [0xE012C] = { unicodeslot=0xE012C, category='mn', description='VARIATION SELECTOR-61' },
+ [0xE012D] = { unicodeslot=0xE012D, category='mn', description='VARIATION SELECTOR-62' },
+ [0xE012E] = { unicodeslot=0xE012E, category='mn', description='VARIATION SELECTOR-63' },
+ [0xE012F] = { unicodeslot=0xE012F, category='mn', description='VARIATION SELECTOR-64' },
+ [0xE0130] = { unicodeslot=0xE0130, category='mn', description='VARIATION SELECTOR-65' },
+ [0xE0131] = { unicodeslot=0xE0131, category='mn', description='VARIATION SELECTOR-66' },
+ [0xE0132] = { unicodeslot=0xE0132, category='mn', description='VARIATION SELECTOR-67' },
+ [0xE0133] = { unicodeslot=0xE0133, category='mn', description='VARIATION SELECTOR-68' },
+ [0xE0134] = { unicodeslot=0xE0134, category='mn', description='VARIATION SELECTOR-69' },
+ [0xE0135] = { unicodeslot=0xE0135, category='mn', description='VARIATION SELECTOR-70' },
+ [0xE0136] = { unicodeslot=0xE0136, category='mn', description='VARIATION SELECTOR-71' },
+ [0xE0137] = { unicodeslot=0xE0137, category='mn', description='VARIATION SELECTOR-72' },
+ [0xE0138] = { unicodeslot=0xE0138, category='mn', description='VARIATION SELECTOR-73' },
+ [0xE0139] = { unicodeslot=0xE0139, category='mn', description='VARIATION SELECTOR-74' },
+ [0xE013A] = { unicodeslot=0xE013A, category='mn', description='VARIATION SELECTOR-75' },
+ [0xE013B] = { unicodeslot=0xE013B, category='mn', description='VARIATION SELECTOR-76' },
+ [0xE013C] = { unicodeslot=0xE013C, category='mn', description='VARIATION SELECTOR-77' },
+ [0xE013D] = { unicodeslot=0xE013D, category='mn', description='VARIATION SELECTOR-78' },
+ [0xE013E] = { unicodeslot=0xE013E, category='mn', description='VARIATION SELECTOR-79' },
+ [0xE013F] = { unicodeslot=0xE013F, category='mn', description='VARIATION SELECTOR-80' },
+ [0xE0140] = { unicodeslot=0xE0140, category='mn', description='VARIATION SELECTOR-81' },
+ [0xE0141] = { unicodeslot=0xE0141, category='mn', description='VARIATION SELECTOR-82' },
+ [0xE0142] = { unicodeslot=0xE0142, category='mn', description='VARIATION SELECTOR-83' },
+ [0xE0143] = { unicodeslot=0xE0143, category='mn', description='VARIATION SELECTOR-84' },
+ [0xE0144] = { unicodeslot=0xE0144, category='mn', description='VARIATION SELECTOR-85' },
+ [0xE0145] = { unicodeslot=0xE0145, category='mn', description='VARIATION SELECTOR-86' },
+ [0xE0146] = { unicodeslot=0xE0146, category='mn', description='VARIATION SELECTOR-87' },
+ [0xE0147] = { unicodeslot=0xE0147, category='mn', description='VARIATION SELECTOR-88' },
+ [0xE0148] = { unicodeslot=0xE0148, category='mn', description='VARIATION SELECTOR-89' },
+ [0xE0149] = { unicodeslot=0xE0149, category='mn', description='VARIATION SELECTOR-90' },
+ [0xE014A] = { unicodeslot=0xE014A, category='mn', description='VARIATION SELECTOR-91' },
+ [0xE014B] = { unicodeslot=0xE014B, category='mn', description='VARIATION SELECTOR-92' },
+ [0xE014C] = { unicodeslot=0xE014C, category='mn', description='VARIATION SELECTOR-93' },
+ [0xE014D] = { unicodeslot=0xE014D, category='mn', description='VARIATION SELECTOR-94' },
+ [0xE014E] = { unicodeslot=0xE014E, category='mn', description='VARIATION SELECTOR-95' },
+ [0xE014F] = { unicodeslot=0xE014F, category='mn', description='VARIATION SELECTOR-96' },
+ [0xE0150] = { unicodeslot=0xE0150, category='mn', description='VARIATION SELECTOR-97' },
+ [0xE0151] = { unicodeslot=0xE0151, category='mn', description='VARIATION SELECTOR-98' },
+ [0xE0152] = { unicodeslot=0xE0152, category='mn', description='VARIATION SELECTOR-99' },
+ [0xE0153] = { unicodeslot=0xE0153, category='mn', description='VARIATION SELECTOR-100' },
+ [0xE0154] = { unicodeslot=0xE0154, category='mn', description='VARIATION SELECTOR-101' },
+ [0xE0155] = { unicodeslot=0xE0155, category='mn', description='VARIATION SELECTOR-102' },
+ [0xE0156] = { unicodeslot=0xE0156, category='mn', description='VARIATION SELECTOR-103' },
+ [0xE0157] = { unicodeslot=0xE0157, category='mn', description='VARIATION SELECTOR-104' },
+ [0xE0158] = { unicodeslot=0xE0158, category='mn', description='VARIATION SELECTOR-105' },
+ [0xE0159] = { unicodeslot=0xE0159, category='mn', description='VARIATION SELECTOR-106' },
+ [0xE015A] = { unicodeslot=0xE015A, category='mn', description='VARIATION SELECTOR-107' },
+ [0xE015B] = { unicodeslot=0xE015B, category='mn', description='VARIATION SELECTOR-108' },
+ [0xE015C] = { unicodeslot=0xE015C, category='mn', description='VARIATION SELECTOR-109' },
+ [0xE015D] = { unicodeslot=0xE015D, category='mn', description='VARIATION SELECTOR-110' },
+ [0xE015E] = { unicodeslot=0xE015E, category='mn', description='VARIATION SELECTOR-111' },
+ [0xE015F] = { unicodeslot=0xE015F, category='mn', description='VARIATION SELECTOR-112' },
+ [0xE0160] = { unicodeslot=0xE0160, category='mn', description='VARIATION SELECTOR-113' },
+ [0xE0161] = { unicodeslot=0xE0161, category='mn', description='VARIATION SELECTOR-114' },
+ [0xE0162] = { unicodeslot=0xE0162, category='mn', description='VARIATION SELECTOR-115' },
+ [0xE0163] = { unicodeslot=0xE0163, category='mn', description='VARIATION SELECTOR-116' },
+ [0xE0164] = { unicodeslot=0xE0164, category='mn', description='VARIATION SELECTOR-117' },
+ [0xE0165] = { unicodeslot=0xE0165, category='mn', description='VARIATION SELECTOR-118' },
+ [0xE0166] = { unicodeslot=0xE0166, category='mn', description='VARIATION SELECTOR-119' },
+ [0xE0167] = { unicodeslot=0xE0167, category='mn', description='VARIATION SELECTOR-120' },
+ [0xE0168] = { unicodeslot=0xE0168, category='mn', description='VARIATION SELECTOR-121' },
+ [0xE0169] = { unicodeslot=0xE0169, category='mn', description='VARIATION SELECTOR-122' },
+ [0xE016A] = { unicodeslot=0xE016A, category='mn', description='VARIATION SELECTOR-123' },
+ [0xE016B] = { unicodeslot=0xE016B, category='mn', description='VARIATION SELECTOR-124' },
+ [0xE016C] = { unicodeslot=0xE016C, category='mn', description='VARIATION SELECTOR-125' },
+ [0xE016D] = { unicodeslot=0xE016D, category='mn', description='VARIATION SELECTOR-126' },
+ [0xE016E] = { unicodeslot=0xE016E, category='mn', description='VARIATION SELECTOR-127' },
+ [0xE016F] = { unicodeslot=0xE016F, category='mn', description='VARIATION SELECTOR-128' },
+ [0xE0170] = { unicodeslot=0xE0170, category='mn', description='VARIATION SELECTOR-129' },
+ [0xE0171] = { unicodeslot=0xE0171, category='mn', description='VARIATION SELECTOR-130' },
+ [0xE0172] = { unicodeslot=0xE0172, category='mn', description='VARIATION SELECTOR-131' },
+ [0xE0173] = { unicodeslot=0xE0173, category='mn', description='VARIATION SELECTOR-132' },
+ [0xE0174] = { unicodeslot=0xE0174, category='mn', description='VARIATION SELECTOR-133' },
+ [0xE0175] = { unicodeslot=0xE0175, category='mn', description='VARIATION SELECTOR-134' },
+ [0xE0176] = { unicodeslot=0xE0176, category='mn', description='VARIATION SELECTOR-135' },
+ [0xE0177] = { unicodeslot=0xE0177, category='mn', description='VARIATION SELECTOR-136' },
+ [0xE0178] = { unicodeslot=0xE0178, category='mn', description='VARIATION SELECTOR-137' },
+ [0xE0179] = { unicodeslot=0xE0179, category='mn', description='VARIATION SELECTOR-138' },
+ [0xE017A] = { unicodeslot=0xE017A, category='mn', description='VARIATION SELECTOR-139' },
+ [0xE017B] = { unicodeslot=0xE017B, category='mn', description='VARIATION SELECTOR-140' },
+ [0xE017C] = { unicodeslot=0xE017C, category='mn', description='VARIATION SELECTOR-141' },
+ [0xE017D] = { unicodeslot=0xE017D, category='mn', description='VARIATION SELECTOR-142' },
+ [0xE017E] = { unicodeslot=0xE017E, category='mn', description='VARIATION SELECTOR-143' },
+ [0xE017F] = { unicodeslot=0xE017F, category='mn', description='VARIATION SELECTOR-144' },
+ [0xE0180] = { unicodeslot=0xE0180, category='mn', description='VARIATION SELECTOR-145' },
+ [0xE0181] = { unicodeslot=0xE0181, category='mn', description='VARIATION SELECTOR-146' },
+ [0xE0182] = { unicodeslot=0xE0182, category='mn', description='VARIATION SELECTOR-147' },
+ [0xE0183] = { unicodeslot=0xE0183, category='mn', description='VARIATION SELECTOR-148' },
+ [0xE0184] = { unicodeslot=0xE0184, category='mn', description='VARIATION SELECTOR-149' },
+ [0xE0185] = { unicodeslot=0xE0185, category='mn', description='VARIATION SELECTOR-150' },
+ [0xE0186] = { unicodeslot=0xE0186, category='mn', description='VARIATION SELECTOR-151' },
+ [0xE0187] = { unicodeslot=0xE0187, category='mn', description='VARIATION SELECTOR-152' },
+ [0xE0188] = { unicodeslot=0xE0188, category='mn', description='VARIATION SELECTOR-153' },
+ [0xE0189] = { unicodeslot=0xE0189, category='mn', description='VARIATION SELECTOR-154' },
+ [0xE018A] = { unicodeslot=0xE018A, category='mn', description='VARIATION SELECTOR-155' },
+ [0xE018B] = { unicodeslot=0xE018B, category='mn', description='VARIATION SELECTOR-156' },
+ [0xE018C] = { unicodeslot=0xE018C, category='mn', description='VARIATION SELECTOR-157' },
+ [0xE018D] = { unicodeslot=0xE018D, category='mn', description='VARIATION SELECTOR-158' },
+ [0xE018E] = { unicodeslot=0xE018E, category='mn', description='VARIATION SELECTOR-159' },
+ [0xE018F] = { unicodeslot=0xE018F, category='mn', description='VARIATION SELECTOR-160' },
+ [0xE0190] = { unicodeslot=0xE0190, category='mn', description='VARIATION SELECTOR-161' },
+ [0xE0191] = { unicodeslot=0xE0191, category='mn', description='VARIATION SELECTOR-162' },
+ [0xE0192] = { unicodeslot=0xE0192, category='mn', description='VARIATION SELECTOR-163' },
+ [0xE0193] = { unicodeslot=0xE0193, category='mn', description='VARIATION SELECTOR-164' },
+ [0xE0194] = { unicodeslot=0xE0194, category='mn', description='VARIATION SELECTOR-165' },
+ [0xE0195] = { unicodeslot=0xE0195, category='mn', description='VARIATION SELECTOR-166' },
+ [0xE0196] = { unicodeslot=0xE0196, category='mn', description='VARIATION SELECTOR-167' },
+ [0xE0197] = { unicodeslot=0xE0197, category='mn', description='VARIATION SELECTOR-168' },
+ [0xE0198] = { unicodeslot=0xE0198, category='mn', description='VARIATION SELECTOR-169' },
+ [0xE0199] = { unicodeslot=0xE0199, category='mn', description='VARIATION SELECTOR-170' },
+ [0xE019A] = { unicodeslot=0xE019A, category='mn', description='VARIATION SELECTOR-171' },
+ [0xE019B] = { unicodeslot=0xE019B, category='mn', description='VARIATION SELECTOR-172' },
+ [0xE019C] = { unicodeslot=0xE019C, category='mn', description='VARIATION SELECTOR-173' },
+ [0xE019D] = { unicodeslot=0xE019D, category='mn', description='VARIATION SELECTOR-174' },
+ [0xE019E] = { unicodeslot=0xE019E, category='mn', description='VARIATION SELECTOR-175' },
+ [0xE019F] = { unicodeslot=0xE019F, category='mn', description='VARIATION SELECTOR-176' },
+ [0xE01A0] = { unicodeslot=0xE01A0, category='mn', description='VARIATION SELECTOR-177' },
+ [0xE01A1] = { unicodeslot=0xE01A1, category='mn', description='VARIATION SELECTOR-178' },
+ [0xE01A2] = { unicodeslot=0xE01A2, category='mn', description='VARIATION SELECTOR-179' },
+ [0xE01A3] = { unicodeslot=0xE01A3, category='mn', description='VARIATION SELECTOR-180' },
+ [0xE01A4] = { unicodeslot=0xE01A4, category='mn', description='VARIATION SELECTOR-181' },
+ [0xE01A5] = { unicodeslot=0xE01A5, category='mn', description='VARIATION SELECTOR-182' },
+ [0xE01A6] = { unicodeslot=0xE01A6, category='mn', description='VARIATION SELECTOR-183' },
+ [0xE01A7] = { unicodeslot=0xE01A7, category='mn', description='VARIATION SELECTOR-184' },
+ [0xE01A8] = { unicodeslot=0xE01A8, category='mn', description='VARIATION SELECTOR-185' },
+ [0xE01A9] = { unicodeslot=0xE01A9, category='mn', description='VARIATION SELECTOR-186' },
+ [0xE01AA] = { unicodeslot=0xE01AA, category='mn', description='VARIATION SELECTOR-187' },
+ [0xE01AB] = { unicodeslot=0xE01AB, category='mn', description='VARIATION SELECTOR-188' },
+ [0xE01AC] = { unicodeslot=0xE01AC, category='mn', description='VARIATION SELECTOR-189' },
+ [0xE01AD] = { unicodeslot=0xE01AD, category='mn', description='VARIATION SELECTOR-190' },
+ [0xE01AE] = { unicodeslot=0xE01AE, category='mn', description='VARIATION SELECTOR-191' },
+ [0xE01AF] = { unicodeslot=0xE01AF, category='mn', description='VARIATION SELECTOR-192' },
+ [0xE01B0] = { unicodeslot=0xE01B0, category='mn', description='VARIATION SELECTOR-193' },
+ [0xE01B1] = { unicodeslot=0xE01B1, category='mn', description='VARIATION SELECTOR-194' },
+ [0xE01B2] = { unicodeslot=0xE01B2, category='mn', description='VARIATION SELECTOR-195' },
+ [0xE01B3] = { unicodeslot=0xE01B3, category='mn', description='VARIATION SELECTOR-196' },
+ [0xE01B4] = { unicodeslot=0xE01B4, category='mn', description='VARIATION SELECTOR-197' },
+ [0xE01B5] = { unicodeslot=0xE01B5, category='mn', description='VARIATION SELECTOR-198' },
+ [0xE01B6] = { unicodeslot=0xE01B6, category='mn', description='VARIATION SELECTOR-199' },
+ [0xE01B7] = { unicodeslot=0xE01B7, category='mn', description='VARIATION SELECTOR-200' },
+ [0xE01B8] = { unicodeslot=0xE01B8, category='mn', description='VARIATION SELECTOR-201' },
+ [0xE01B9] = { unicodeslot=0xE01B9, category='mn', description='VARIATION SELECTOR-202' },
+ [0xE01BA] = { unicodeslot=0xE01BA, category='mn', description='VARIATION SELECTOR-203' },
+ [0xE01BB] = { unicodeslot=0xE01BB, category='mn', description='VARIATION SELECTOR-204' },
+ [0xE01BC] = { unicodeslot=0xE01BC, category='mn', description='VARIATION SELECTOR-205' },
+ [0xE01BD] = { unicodeslot=0xE01BD, category='mn', description='VARIATION SELECTOR-206' },
+ [0xE01BE] = { unicodeslot=0xE01BE, category='mn', description='VARIATION SELECTOR-207' },
+ [0xE01BF] = { unicodeslot=0xE01BF, category='mn', description='VARIATION SELECTOR-208' },
+ [0xE01C0] = { unicodeslot=0xE01C0, category='mn', description='VARIATION SELECTOR-209' },
+ [0xE01C1] = { unicodeslot=0xE01C1, category='mn', description='VARIATION SELECTOR-210' },
+ [0xE01C2] = { unicodeslot=0xE01C2, category='mn', description='VARIATION SELECTOR-211' },
+ [0xE01C3] = { unicodeslot=0xE01C3, category='mn', description='VARIATION SELECTOR-212' },
+ [0xE01C4] = { unicodeslot=0xE01C4, category='mn', description='VARIATION SELECTOR-213' },
+ [0xE01C5] = { unicodeslot=0xE01C5, category='mn', description='VARIATION SELECTOR-214' },
+ [0xE01C6] = { unicodeslot=0xE01C6, category='mn', description='VARIATION SELECTOR-215' },
+ [0xE01C7] = { unicodeslot=0xE01C7, category='mn', description='VARIATION SELECTOR-216' },
+ [0xE01C8] = { unicodeslot=0xE01C8, category='mn', description='VARIATION SELECTOR-217' },
+ [0xE01C9] = { unicodeslot=0xE01C9, category='mn', description='VARIATION SELECTOR-218' },
+ [0xE01CA] = { unicodeslot=0xE01CA, category='mn', description='VARIATION SELECTOR-219' },
+ [0xE01CB] = { unicodeslot=0xE01CB, category='mn', description='VARIATION SELECTOR-220' },
+ [0xE01CC] = { unicodeslot=0xE01CC, category='mn', description='VARIATION SELECTOR-221' },
+ [0xE01CD] = { unicodeslot=0xE01CD, category='mn', description='VARIATION SELECTOR-222' },
+ [0xE01CE] = { unicodeslot=0xE01CE, category='mn', description='VARIATION SELECTOR-223' },
+ [0xE01CF] = { unicodeslot=0xE01CF, category='mn', description='VARIATION SELECTOR-224' },
+ [0xE01D0] = { unicodeslot=0xE01D0, category='mn', description='VARIATION SELECTOR-225' },
+ [0xE01D1] = { unicodeslot=0xE01D1, category='mn', description='VARIATION SELECTOR-226' },
+ [0xE01D2] = { unicodeslot=0xE01D2, category='mn', description='VARIATION SELECTOR-227' },
+ [0xE01D3] = { unicodeslot=0xE01D3, category='mn', description='VARIATION SELECTOR-228' },
+ [0xE01D4] = { unicodeslot=0xE01D4, category='mn', description='VARIATION SELECTOR-229' },
+ [0xE01D5] = { unicodeslot=0xE01D5, category='mn', description='VARIATION SELECTOR-230' },
+ [0xE01D6] = { unicodeslot=0xE01D6, category='mn', description='VARIATION SELECTOR-231' },
+ [0xE01D7] = { unicodeslot=0xE01D7, category='mn', description='VARIATION SELECTOR-232' },
+ [0xE01D8] = { unicodeslot=0xE01D8, category='mn', description='VARIATION SELECTOR-233' },
+ [0xE01D9] = { unicodeslot=0xE01D9, category='mn', description='VARIATION SELECTOR-234' },
+ [0xE01DA] = { unicodeslot=0xE01DA, category='mn', description='VARIATION SELECTOR-235' },
+ [0xE01DB] = { unicodeslot=0xE01DB, category='mn', description='VARIATION SELECTOR-236' },
+ [0xE01DC] = { unicodeslot=0xE01DC, category='mn', description='VARIATION SELECTOR-237' },
+ [0xE01DD] = { unicodeslot=0xE01DD, category='mn', description='VARIATION SELECTOR-238' },
+ [0xE01DE] = { unicodeslot=0xE01DE, category='mn', description='VARIATION SELECTOR-239' },
+ [0xE01DF] = { unicodeslot=0xE01DF, category='mn', description='VARIATION SELECTOR-240' },
+ [0xE01E0] = { unicodeslot=0xE01E0, category='mn', description='VARIATION SELECTOR-241' },
+ [0xE01E1] = { unicodeslot=0xE01E1, category='mn', description='VARIATION SELECTOR-242' },
+ [0xE01E2] = { unicodeslot=0xE01E2, category='mn', description='VARIATION SELECTOR-243' },
+ [0xE01E3] = { unicodeslot=0xE01E3, category='mn', description='VARIATION SELECTOR-244' },
+ [0xE01E4] = { unicodeslot=0xE01E4, category='mn', description='VARIATION SELECTOR-245' },
+ [0xE01E5] = { unicodeslot=0xE01E5, category='mn', description='VARIATION SELECTOR-246' },
+ [0xE01E6] = { unicodeslot=0xE01E6, category='mn', description='VARIATION SELECTOR-247' },
+ [0xE01E7] = { unicodeslot=0xE01E7, category='mn', description='VARIATION SELECTOR-248' },
+ [0xE01E8] = { unicodeslot=0xE01E8, category='mn', description='VARIATION SELECTOR-249' },
+ [0xE01E9] = { unicodeslot=0xE01E9, category='mn', description='VARIATION SELECTOR-250' },
+ [0xE01EA] = { unicodeslot=0xE01EA, category='mn', description='VARIATION SELECTOR-251' },
+ [0xE01EB] = { unicodeslot=0xE01EB, category='mn', description='VARIATION SELECTOR-252' },
+ [0xE01EC] = { unicodeslot=0xE01EC, category='mn', description='VARIATION SELECTOR-253' },
+ [0xE01ED] = { unicodeslot=0xE01ED, category='mn', description='VARIATION SELECTOR-254' },
+ [0xE01EE] = { unicodeslot=0xE01EE, category='mn', description='VARIATION SELECTOR-255' },
+ [0xE01EF] = { unicodeslot=0xE01EF, category='mn', description='VARIATION SELECTOR-256' },
+ [0xF0000] = { unicodeslot=0xF0000, category='co', description='<Plane 15 Private Use, First>' },
+ [0xFFFFD] = { unicodeslot=0xFFFFD, category='co', description='<Plane 15 Private Use, Last>' },
+ [0x100000] = { unicodeslot=0x100000, category='co', description='<Plane 16 Private Use, First>' },
+ [0x10FFFD] = { unicodeslot=0x10FFFD, category='co', description='<Plane 16 Private Use, Last>' },
+}
diff --git a/tex/context/base/char-def.tex b/tex/context/base/char-def.tex
new file mode 100644
index 000000000..9e722ba13
--- /dev/null
+++ b/tex/context/base/char-def.tex
@@ -0,0 +1,47 @@
+%D \module
+%D [ file=char-def,
+%D version=2005.04.25,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Unicode Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Unicode Support (tables)}
+
+\unprotect
+
+%D An auxiliary macro:
+
+\def\setcclcuc #1 #2 #3 %
+ {\global\catcode#1=11 %
+ \global\lccode #1=#2 %
+ \global\uccode #1=#3 }
+
+\registerctxluafile{char-def}{1.001}
+
+%D The codes are stored in the format, so we don't need to reinitialize
+%D them (unless of course we have adapted the table).
+
+% \startruntimeluacode
+ \ctxlua{characters.setcodes()}
+% \ctxlua{characters.setpdfunicodes()}% pdftounicode mappings can only be done runtime
+% \stopruntimeluacode
+
+%D This is needed for Turkish:
+
+\setcclcuc "201C "201C "201C
+\setcclcuc "201D "201D "201D
+
+\protect \endinput
+
+% \ctxlua{characters.context.show(123)}
+% \ctxlua{characters.context.show(0x7B)}
+% \ctxlua{characters.context.show("7B")}
+
+% \dostepwiserecurse{`A}{`Z}{1}
+% {\ctxlua{characters.context.show(\recurselevel)}}
diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua
new file mode 100644
index 000000000..0daa91c0d
--- /dev/null
+++ b/tex/context/base/char-ini.lua
@@ -0,0 +1,280 @@
+if not modules then modules = { } end modules ['char-ini'] = {
+ version = 1.001,
+ comment = "companion to char-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+utf = utf or unicode.utf
+tex = tex or { }
+
+function tex.ctxprint(...)
+ tex.sprint(tex.ctxcatcodes,...)
+end
+
+--[[ldx--
+<p>This module implements some methods and creates additional datastructured
+from the big character table that we use for all kind of purposes:
+<type>char-def.lua</type>.</p>
+--ldx]]--
+
+characters = characters or { }
+characters.data = characters.data or { }
+characters.context = characters.context or { }
+
+_empty_table_ = { }
+_empty_table_.__index = function(t,k) return "" end
+
+setmetatable(characters.data,_empty_table_)
+
+--[[ldx--
+<p>At this point we assume that the big data table is loaded. From this
+table we derive a few more.</p>
+--ldx]]--
+
+characters.context.unicodes = characters.context.unicodes or { }
+characters.context.utfcodes = characters.context.utfcodes or { }
+characters.context.enccodes = characters.context.enccodes or { }
+
+function characters.context.rehash()
+ local unicodes, utfcodes, enccodes = characters.context.unicodes, characters.context.utfcodes, characters.context.enccodes
+ for k,v in pairs(characters.data) do
+ local contextname, adobename = v.contextname, v.adobename
+ if contextname then
+ unicodes[contextname] = v.unicodeslot
+ utfcodes[contextname] = utf.char(v.unicodeslot)
+ end
+ local encname = adobename or contextname
+ if encname then
+ enccodes[encname] = k
+ end
+ end
+end
+
+--[[ldx--
+<p>The <type>context</type> namespace is used to store methods and data
+which is rather specific to <l n='context'/>.</p>
+--ldx]]--
+
+function characters.context.show(n)
+ local n = characters.number(n)
+ local d = characters.data[n]
+ if d then
+ local function entry(label,name)
+ tex.ctxprint(string.format("\\NC %s\\NC %s\\NC\\NR",label,characters.valid(d[name])))
+ end
+ tex.ctxprint("\\starttabulate[|Tl|Tl|]")
+ entry("unicode index" , "unicodeslot")
+ entry("context name" , "contextname")
+ entry("adobe name" , "adobename")
+ entry("category" , "category")
+ entry("description" , "description")
+ entry("uppercase code", "uccode")
+ entry("lowercase code", "lccode")
+ entry("specials" , "specials")
+ tex.ctxprint("\\stoptabulate ")
+ end
+end
+
+--[[ldx--
+<p>Instead of using a <l n='tex'/> file to define the named glyphs, we
+use the table. After all, we have this information available anyway.</p>
+--ldx]]--
+
+function characters.context.define()
+ local unicodes, utfcodes = characters.context.unicodes, characters.context.utfcodes
+ local flush, tc = tex.sprint, tex.ctxcatcodes
+ for _, chr in pairs(characters.data) do
+ local contextname = chr.contextname
+ if contextname then
+ -- by this time, we're still in normal catcode mode
+ if chr.unicodeslot < 128 then
+ flush(tc, "\\chardef\\" .. contextname .. "=" .. unicodes[contextname])
+ else
+ flush(tc, "\\let\\" .. contextname .. "=" .. utfcodes[contextname])
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>Setting the lccodes is also done in a loop over the data table.</p>
+--ldx]]--
+
+
+function characters.setcodes()
+ local flush, tc = tex.sprint, tex.ctxcatcodes
+ for code, chr in pairs(characters.data) do
+ local cc = chr.category
+ if cc == 'll' or cc == 'lu' or cc == 'lt' then
+ if not chr.lccode then chr.lccode = code end
+ if not chr.uccode then chr.uccode = code end
+ flush(tc, '\\setcclcuc '.. code .. ' ' .. chr.lccode .. ' ' .. chr.uccode .. ' ')
+ end
+ end
+end
+
+--[[ldx--
+<p>Next comes a whole series of helper methods. These are (will be) part
+of the official <l n='api'/>.</p>
+--ldx]]--
+
+--[[ldx--
+<p>This converts a string (if given) into a number.</p>
+--ldx]]--
+
+function characters.number(n)
+ if type(n) == "string" then return tonumber(n,16) else return n end
+end
+
+--[[ldx--
+<p>Checking for valid characters.</p>
+--ldx]]--
+
+function characters.is_valid(s)
+ return s or ""
+end
+
+function characters.checked(s, default)
+ return s or default
+end
+
+characters.valid = characters.is_valid
+
+--[[ldx--
+<p>The next method is used when constructing the main table, although nowadays
+we do this in one step. The index can be a string or a number.</p>
+--ldx]]--
+
+function characters.define(c)
+ characters.data[characters.number(c.unicodeslot)] = c
+end
+
+--[[ldx--
+<p></p>
+--ldx]]--
+-- set a table entry; index is number (can be different from unicodeslot)
+
+function characters.set(n, c)
+ characters.data[characters.number(n)] = c
+end
+
+--[[ldx--
+<p>Get a table entry happens by number. Keep in mind that the unicodeslot
+can be different (not likely).</p>
+--ldx]]--
+
+function characters.get(n)
+ return characters.data[characters.number(n)]
+end
+
+--[[ldx--
+<p>A couple of convenience methods. Beware, these are not that fast due
+to the checking.</p>
+--ldx]]--
+
+function characters.hexindex(n)
+ return string.format("%04X", characters.valid(characters.data[characters.number(n)].unicodeslot))
+end
+
+function characters.contextname(n)
+ return characters.valid(characters.data[characters.number(n)].contextname)
+end
+
+function characters.adobename(n)
+ return characters.valid(characters.data[characters.number(n)].adobename)
+end
+
+function characters.description(n)
+ return characters.valid(characters.data[characters.number(n)].description)
+end
+
+function characters.category(n)
+ return characters.valid(characters.data[characters.number(n)].category)
+end
+
+--[[ldx--
+<p>Requesting lower and uppercase codes:</p>
+--ldx]]--
+
+function characters.uccode(n) return characters.data[n].uccode or n end
+function characters.lccode(n) return characters.data[n].lccode or n end
+
+function characters.flush(n)
+ if characters.data[n].contextname then
+ tex.sprint(tex.texcatcodes, "\\"..characters.data[n].contextname)
+ else
+ tex.sprint(unicode.utf8.char(n))
+ end
+end
+
+function characters.shape(n)
+ return characters.data[n].shcode or n
+end
+
+--[[ldx--
+<p>Categories play an important role, so here are some checkers.</p>
+--ldx]]--
+
+function characters.is_of_category(token,category)
+ if type(token) == "string" then
+ return characters.data[utf.byte(token)].category == category
+ else
+ return characters.data[token].category == category
+ end
+end
+
+function characters.i_is_of_category(i,category) -- by index (number)
+ local cd = characters.data[i]
+ return cd and cd.category == category
+end
+
+function characters.n_is_of_category(n,category) -- by name (string)
+ local cd = characters.data[utf.byte(n)]
+ return cd and cd.category == category
+end
+
+--[[ldx--
+<p>The following code is kind of messy. It is used to generate the right
+unicode reference tables.</p>
+--ldx]]--
+
+function characters.setpdfunicodes()
+ local flush, tc, sf = tex.sprint, tex.ctxcatcodes, string.format
+ for _,v in pairs(characters.data) do
+ if v.adobename then
+ flush(tc,sf("\\pdfglyphtounicode{%s}{%04X}", v.adobename, v.unicodeslot))
+ end
+ end
+end
+
+--[[ldx--
+<p>The next method generates a table for good old <l n='pdftex'/>.</p>
+
+<typing>
+characters.pdftex.make_pdf_to_unicodetable("pdfr-def.tex")
+</typing>
+--ldx]]--
+
+characters.pdftex = characters.pdftex or { }
+
+function characters.pdftex.make_pdf_to_unicodetable(filename)
+ local sf = string.format
+ f = io.open(filename,'w')
+ if f then
+ f:write("% This file is generated with Luatex using the\n")
+ f:write("% character tables that come with ConTeXt MkIV.\n")
+ f:write("%\n")
+ f:write("\\ifx\\pdfglyphtounicode\\undefined\\endinput\\fi\n") -- just to be sure
+ for _, v in pairs(characters.data) do
+ if v.adobename then
+ f:write(sf("\\pdfglyphtounicode{%s}{%04X}", v.adobename, v.unicodeslot))
+ end
+ end
+ f:write("%\n")
+ f:write("%\n")
+ f:write("\\endinput")
+ f:close()
+ end
+end
diff --git a/tex/context/base/char-ini.tex b/tex/context/base/char-ini.tex
new file mode 100644
index 000000000..4b4c55ef1
--- /dev/null
+++ b/tex/context/base/char-ini.tex
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=char-ini,
+%D version=2006.08.20,
+%D title=\CONTEXT\ Character Macros,
+%D subtitle=Character Support (Initialization),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Character Support (initialization)}
+
+\registerctxluafile{char-ini}{1.001}
+\registerctxluafile{char-cmp}{1.001} % maybe we will load this someplace else
+\registerctxluafile{char-tok}{1.001} % maybe we will load this someplace else
+
+\endinput
diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua
new file mode 100644
index 000000000..c30a160bc
--- /dev/null
+++ b/tex/context/base/char-utf.lua
@@ -0,0 +1,298 @@
+if not modules then modules = { } end modules ['char-utf'] = {
+ version = 1.001,
+ comment = "companion to char-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>When a sequence of <l n='utf'/> characters enters the application, it may
+be neccessary to collapse subsequences into their composed variant.</p>
+
+<p>This module implements methods for collapsing and expanding <l n='utf'/>
+sequences. We also provide means to deal with characters that are
+special to <l n='tex'/> as well as 8-bit characters that need to end up
+in special kinds of output (for instance <l n='pdf'/>).</p>
+
+<p>We implement these manipulations as filters. One can run multiple filters
+over a string.</p>
+--ldx]]--
+
+utf = utf or unicode.utf8
+
+characters = characters or { }
+characters.graphemes = characters.graphemes or { }
+characters.filters = characters.filters or { }
+characters.filters.utf = characters.filters.utf or { }
+
+characters.filters.utf.initialized = false
+characters.filters.utf.collapsing = true
+characters.filters.utf.expanding = true
+
+--[[ldx--
+<p>It only makes sense to collapse at runtime, since we don't expect
+source code to depend on collapsing:</p>
+
+<typing>
+characters.filters.utf.collapsing = true
+input.filters.utf_translator = characters.filters.utf.collapse
+</typing>
+--ldx]]--
+
+function characters.filters.utf.initialize()
+ if characters.filters.utf.collapsing and not characters.filters.utf.initialized then
+ characters.graphemes = { }
+ local cg = characters.graphemes
+ local uc = utf.char
+ for k,v in pairs(characters.data) do
+ -- using vs and first testing for length is faster (.02->.01 s)
+ local vs = v.specials
+ if vs and #vs == 3 and vs[1] == 'char' then
+ local first, second = uc(vs[2]), uc(vs[3])
+ if not cg[first] then
+ cg[first] = { }
+ end
+ cg[first][second] = uc(k)
+ end
+ end
+ characters.filters.utf.initialized = true
+ end
+end
+
+function characters.filters.utf.collapse(str)
+ if characters.filters.utf.collapsing and str and #str > 1 then
+ characters.filters.utf.initialize()
+ local tokens, first, done = { }, false, false
+ local cg = characters.graphemes
+ for second in string.utfcharacters(str) do
+ local cgf = cg[first]
+ if cgf and cgf[second] then
+ first, done = cgf[second], true
+ elseif first then
+ tokens[#tokens+1] = first
+ first = second
+ else
+ first = second
+ end
+ end
+ if done then
+ tokens[#tokens+1] = first
+ return table.concat(tokens,"")
+ end
+ end
+ return str
+end
+
+--[[ldx--
+<p>In order to deal with 8-bit output, we need to find a way to
+go from <l n='utf'/> to 8-bit. This is handled in the
+<l n='luatex'/> engine itself.</p>
+
+<p>This leaves us problems with characters that are specific to
+<l n='tex'/> like <type>{}</type>, <type>$</type> and alike.</p>
+
+<p>We can remap some chars that tex input files are sensitive for to
+a private area (while writing to a utility file) and revert then
+to their original slot when we read in such a file. Instead of
+reverting, we can (when we resolve characters to glyphs) map them
+to their right glyph there.</p>
+
+<p>For this purpose we can use the private planes 0x0F0000 and
+0x100000.</p>
+--ldx]]--
+
+characters.filters.utf.private = { }
+characters.filters.utf.private.high = { }
+characters.filters.utf.private.low = { }
+
+do
+
+ local ub, uc, ug = utf.byte, utf.char, utf.gsub
+ local cfup = characters.filters.utf.private
+
+ function characters.filters.utf.private.set(ch)
+ local cb = ub(ch)
+ if cb < 256 then
+ cfup.low[ch] = uc(0x0F0000 + cb)
+ cfup.high[uc(0x0F0000 + cb)] = ch
+ end
+ end
+
+ function characters.filters.utf.private.replace(str)
+ ug("(.)", cfup.low)
+ end
+
+ function characters.filters.utf.private.revert(str)
+ ug("(.)", cfup.high)
+ end
+
+ for _, ch in pairs({ '~', '#', '$', '%', '^', '&', '_', '{', '}' }) do
+ cfup.set(ch)
+ end
+
+end
+
+--[[ldx--
+<p>We get a more efficient variant of this when we integrate
+replacements in collapser. This more or less renders the previous
+private code redundant. The following code is equivalent but the
+first snippet uses the relocated dollars.</p>
+
+<typing>
+[󰀤x󰀤] [$x$]
+</typing>
+--ldx]]--
+
+do
+
+ local cg = characters.graphemes
+ local cr = characters.filters.utf.private.high
+
+ function characters.filters.utf.collapse(str)
+ if characters.filters.utf.collapsing and str then
+ if #str > 1 then
+ characters.filters.utf.initialize()
+ local tokens, first, done = { }, false, false
+ for second in string.utfcharacters(str) do
+ if cr[second] then
+ if first then
+ tokens[#tokens+1] = first
+ end
+ first, done = cr[second], true
+ else
+ local cgf = cg[first]
+ if cgf and cgf[second] then
+ first, done = cgf[second], true
+ elseif first then
+ tokens[#tokens+1] = first
+ first = second
+ else
+ first = second
+ end
+ end
+ end
+ if done then
+ tokens[#tokens+1] = first
+ return table.concat(tokens,"")
+ end
+ elseif #str > 0 then
+ return cr[str] or str
+ end
+ end
+ return str
+ end
+
+end
+
+--[[ldx--
+<p>In the beginning of <l n='luatex'/> we experimented with a sequence
+of filters so that we could manipulate the input stream. However, since
+this is a partial solution (not taking macro expansion into account)
+and since it may interfere with non-text, we will not use this feature
+by default.</p>
+
+<typing>
+characters.filters.utf.collapsing = true
+characters.filters.append(characters.filters.utf.collapse)
+characters.filters.activated = true
+callback.register('process_input_buffer', characters.filters.process)
+</typing>
+
+<p>The following helper functions may disappear (or become optional)
+in the future.</p>
+--ldx]]--
+
+characters.filters.sequences = { }
+characters.filters.activated = false
+
+function characters.filters.append(name)
+ table.insert(characters.filters.sequences,name)
+end
+
+function characters.filters.prepend(name)
+ table.insert(characters.filters.sequences,1,name)
+end
+
+function characters.filters.remove(name)
+ for k,v in pairs(characters.filters.sequences) do
+ if v == name then
+ table.remove(characters.filters.sequences,k)
+ end
+ end
+end
+
+function characters.filters.replace(name_1,name_2)
+ for k,v in pairs(characters.filters.sequences) do
+ if v == name then
+ characters.filters.sequences[k] = name_2
+ end
+ end
+end
+
+function characters.filters.insert_before(name_1,name_2)
+ for k,v in pairs(characters.filters.sequences) do
+ if v == name_1 then
+ table.insert(characters.filters.sequences,k,name_2)
+ end
+ end
+end
+
+function characters.filters.insert_after(name_1,name_2)
+ for k,v in pairs(characters.filters.sequences) do
+ if v == name_1 then
+ table.insert(characters.filters.sequences,k+1,name_2)
+ end
+ end
+end
+
+function characters.filters.list(separator)
+ table.concat(characters.filters.sequences,seperator or ' ')
+end
+
+function characters.filters.process(str)
+ if characters.filters.activated then
+ for _,v in pairs(characters.filters.sequences) do
+ str = v(str)
+ end
+ return str
+ else
+ return nil -- luatex callback optimalisation
+ end
+end
+
+--[[ldx--
+<p>The following code is no longer needed and replaced by token
+collectors somehwere else.</p>
+--ldx]]--
+
+--[[obsolete--
+
+characters.filters.collector = { }
+characters.filters.collector.data = { }
+characters.filters.collector.collecting = false
+
+function characters.filters.collector.reset()
+ characters.filters.collector.data = { }
+end
+
+function characters.filters.collector.flush(separator)
+ tex.sprint(table.concat(characters.filters.collector.data,separator))
+end
+
+function characters.filters.collector.prune(n)
+ for i=1,n do
+ table.remove(characters.filters.collector.data,-1)
+ end
+end
+
+function characters.filters.collector.numerate(str)
+ if characters.filters.collector.collecting then
+ table.insert(characters.filters.collector.data,(unicode.utf8.gsub(str,"(.)", function(c)
+ return string.format("0x%04X ",unicode.utf8.byte(c))
+ end)))
+ end
+ return str
+end
+
+--obsolete]]--
diff --git a/tex/context/base/char-utf.tex b/tex/context/base/char-utf.tex
new file mode 100644
index 000000000..cb6eceea1
--- /dev/null
+++ b/tex/context/base/char-utf.tex
@@ -0,0 +1,54 @@
+%D \module
+%D [ file=char-utf,
+%D version=2006.12.05,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Unicode Support (UTF),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Unicode Support (utf)}
+
+%D After a bit of experimenting we reached a clean state where \UTF\
+%D 8, 16 and 32 were supported as well as collapsing (combining
+%D sequences). Writing the code was a relaxed experience, not in the
+%D last place because it was accompanied by listening to those nice
+%D Vienna Teng cd's (who decided that making music was more fun than
+%D programming, but then, she may not know \TEX\ and \LUA).
+
+\unprotect
+
+\registerctxluafile{char-utf}{1.001}
+
+%D We enable collapsing (combining characters) by default, but
+%D since the source files are rather simple, we postpone the
+%D initialization till runtime.
+
+\appendtoks
+ \ctxlua {
+ characters.filters.utf.collapsing = true
+ input.filters.utf_translator = characters.filters.utf.collapse
+ }%
+\to \everyjob
+
+%D This is a hack, and only meant for special situations. We don't
+%D support this in for instance verbatim. The active characters map
+%D onto the \CONTEXT\ names and font handling etc. is up to the user.
+
+\registerctxluafile{char-act}{1.001}
+
+\def\enableactiveutf {\ctxlua{characters.active.enable()}}
+\def\disableactiveutf{\ctxlua{characters.active.disable()}}
+\def\testactiveutf #1{\ctxlua{characters.active.test("#1")}}
+
+%D Usage:
+%D
+%D \starttyping
+%D \enableactiveutf \testactiveutf{eacute}
+%D \stoptyping
+
+\protect
diff --git a/tex/context/base/colo-ini.tex b/tex/context/base/colo-ini.tex
index 81e7d1cf7..687d41da3 100644
--- a/tex/context/base/colo-ini.tex
+++ b/tex/context/base/colo-ini.tex
@@ -359,8 +359,7 @@
{% this way we can freeze \definecolor[somecolor][somecolor]
% and still prevent cyclic definitions
\iffreezecolors#3{\??cr#5}{\csname\??cr#6\endcsname}\fi}
- {\iffreezecolors\@EA#3\else\@EA#2\fi
- {\??cr#5}{\csname\??cr#6\endcsname}}}
+ {\iffreezecolors\@EA#3\else\@EA#2\fi{\??cr#5}{\csname\??cr#6\endcsname}}}
{\showmessage\m!colors3{#5 (def)}}%
\fi}%
\ifcase#4\or
@@ -527,6 +526,8 @@
%D We now redefine the color definition macro so that you
%D can define both normal and spotcolors.
+%D This messy method will become obsolete in mkiv.
+
\def\definecolor
{\dotripleempty\dodefinewhatevercolor}
@@ -1101,14 +1102,14 @@
\def\predefinecolor[#1]%
{\bgroup
- \flushatshipout{\hbox{\localcolortrue\color[#1]}}% real ones
+ \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
\egroup}
\def\predefineindexcolor[#1]%
{\bgroup
- \flushatshipout{\hbox{\localcolortrue\color[#1]}}% real ones
+ \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones
\let\doexeccolorP\doexeccolorPindex
- \flushatshipout{\hbox{\localcolortrue\color[#1]}}% index one
+ \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% index one
\egroup}
% \def\checkpredefinedcolor[#1]%
@@ -1151,15 +1152,6 @@
\expandafter\noexectransparency
\fi}
-%\def\doexectransparency#1:#2\od
-% {\global\@EA\chardef\csname\@@currenttransparent\endcsname % nasty
-% \ifcase#1\space
-% \zerocount
-% \else
-% \plusone
-% \dostarttransparency{#1}{#2}%
-% \fi}
-
\def\doexectransparency#1:#2\od
{\ifcase#1\space
\global\intransparentfalse
diff --git a/tex/context/base/colo-run.tex b/tex/context/base/colo-run.tex
index 8d21430e1..0b44f2ee5 100644
--- a/tex/context/base/colo-run.tex
+++ b/tex/context/base/colo-run.tex
@@ -239,24 +239,29 @@
% \def\execcolorRCSP#1:{\csname execcolor#1\endcsname} -> \execcolorR
\gdef\dogetcolorcomponents#1%
- {\startnointerference
- \localcolortrue
- \def\doexeccolorR ##1:##2:##3:##4:##5\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##4 \enspace t=\Do##5 \NC r=\Do##1 \enspace g=\Do##2 \enspace b=\Do##3 \NC\NR}}%
- \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##5 \enspace t=\Do##6 \NC c=\Do##1 \enspace m=\Do##2 \enspace y=\Do##3 \enspace k=\Do##4 \NC\NR}}%
- \def\doexeccolorS ##1:##2:##3\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##2 \enspace t=\Do##3 \NC s=\Do##1 \NC\NR}}%
- %\def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace f=\Do##2 \enspace d=\Do##3 \enspace n=##1 \NC\NR}}%
- \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace n=##1 \NC\NR}}%
- \let\doexeccolorPindex\doexeccolorP
- \backgroundline[#1]{}%
- \stopnointerference
+ {\doifelsenothing{#1}
+ {\global\globalscratchtoks{\TB}}
+ {\startnointerference
+ \localcolortrue
+ \def\doexeccolorR ##1:##2:##3:##4:##5\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##4 \enspace t=\Do##5 \NC r=\Do##1 \enspace g=\Do##2 \enspace b=\Do##3 \NC\NR}}%
+ \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##5 \enspace t=\Do##6 \NC c=\Do##1 \enspace m=\Do##2 \enspace y=\Do##3 \enspace k=\Do##4 \NC\NR}}%
+ \def\doexeccolorS ##1:##2:##3\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##2 \enspace t=\Do##3 \NC s=\Do##1 \NC\NR}}%
+ %\def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace f=\Do##2 \enspace d=\Do##3 \enspace n=##1 \NC\NR}}%
+ \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace n=##1 \NC\NR}}%
+ \let\doexeccolorPindex\doexeccolorP
+ \backgroundline[#1]{}%
+ \stopnointerference}%
\appendetoks\the\globalscratchtoks\to\scratchtoks}
+\newdimen\colorcomponentwidth % for my eyes only
+
\gdef\showcolorcomponents[#1]%
{\bgroup
- \def\Od##1 {\backgroundline[##1]{\strut\quad \color[white]{white}\quad\color[black]{black}\quad\quad}}%
+ \def\Od##1 {\backgroundline[##1]{\strut\enspace\color[white]{white}\enspace\color[black]{black}\enspace}}%
\def\Do##1 {\twodigitrounding{##1}}%
+ \def\Nm##1 {\ifdim\colorcomponentwidth>\zeropoint\hbox to \colorcomponentwidth\fi{##1}}%
\scratchtoks\emptytoks
- \appendtoks\starttabulate[|l|l|l|l|]\to\scratchtoks
+ \appendtoks\starttabulate[|l|l|l|p|]\to\scratchtoks
\appendtoks\NC color \NC name \NC transparency \NC specification \NC\NR\TB\to\scratchtoks
\processcommacommand[#1]\dogetcolorcomponents
\appendtoks\stoptabulate\to\scratchtoks
diff --git a/tex/context/base/cont-mtx.tex b/tex/context/base/cont-mtx.tex
new file mode 100644
index 000000000..833785a7f
--- /dev/null
+++ b/tex/context/base/cont-mtx.tex
@@ -0,0 +1,25 @@
+%D \module
+%D [ file=cont-mtx,
+%D version=2006.01.01, % no date -)
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=Experimental MetaTeX Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% format generation : texexec --make --all --luatex
+%
+% pdftex compatible run : texexec --luatex filename
+% aleph compatible run : texexec --luatex --output=dvipdfmx filename
+%
+% or, at top of tex file : % engine=luatex
+
+% \loadcorefile{meta-xxx.tex}
+
+%D Here we load files that are not yet part of the core.
+
+\endinput
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
new file mode 100644
index 000000000..b7b069b45
--- /dev/null
+++ b/tex/context/base/cont-new.mkiv
@@ -0,0 +1,93 @@
+%D \module
+%D [ file=cont-new,
+%D version=2006.10.04,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=New Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ctxlua { fonts.define.method = 2 }
+
+\unprotect
+
+\appendtoks
+ \ctxlua{garbagecollector.update()}%
+\to \everyshipout
+
+% texmf.instance will become just texmf
+
+\appendtoks
+ \writestatus\m!lua{input load time - \ctxlua{input.loadtime(texmf.instance)} seconds}%
+ \writestatus\m!lua{fonts load time - \ctxlua{input.loadtime(fonts)} seconds}%
+ \writestatus\m!lua{mps conversion time - \ctxlua{input.loadtime(mptopdf)} seconds}%
+ \writestatus\m!lua{node processing time - \ctxlua{input.loadtime(nodes)} second}%
+ \writestatus\m!lua{used config path - \ctxlua{tex.print(cache.configpath(texmf.instance))}}%
+ \writestatus\m!lua{used cache path - \ctxlua{tex.print(cache.path)}}%
+ \writestatus\m!lua{modules/dumps/instances - \ctxlua{tex.print((status.luabytecodes-500).."/"..input.storage.done.."/"..status.luastates)}}%
+ \writestatus\m!lua{current memory usage - \ctxlua{tex.print(status.luastate_bytes)} bytes}%
+ \writestatus\m!lua{loaded fonts - \ctxlua{tex.print(fonts.logger.report())}}%
+\to \everystoptext
+
+\def\resettimer {\ctxlua{environment.starttime = os.clock()}}
+\def\elapsedtime {\ctxlua{tex.sprint(os.clock()-environment.starttime)}}
+\let\elapsedseconds \elapsedtime
+
+%D Fonts (experimental AFM loading}
+
+% \ctxlua {
+% remapper.define('encoding','^lm' ,'^(.*)$','lm-\letterpercent1')
+% remapper.define('encoding','^qbk','^(.*)$','q-\letterpercent1')
+% remapper.define('encoding','^qcs','^(.*)$','q-\letterpercent1')
+% remapper.define('encoding','^qpl','^(.*)$','q-\letterpercent1')
+% remapper.define('encoding','^qtm','^(.*)$','q-\letterpercent1')
+% }
+
+\appendtoksonce \loadallXfontmapfiles \to \everyPDFxform
+\appendtoksonce \loadallXfontmapfiles \to \everyPDFximage
+\appendtoksonce \loadallXfontmapfiles \to \everystarttext
+\appendtoksonce \loadallXfontmapfiles \to \everybeforepagebody
+
+\def\loadallXfontmapfiles{\ctxlua {
+ local s = fonts.map.flushlines("pdftex","")
+ tex.sprint(tex.ctxcatcodes,s)
+}}
+
+% \ctxlua{
+% do
+% local pth = "." .. io.fileseparator .. "tmp" .. io.fileseparator .. "\jobname"
+% texio.write_nl("CREATING "..pth)
+% os.execute("mkdir " .. pth)
+% end
+% input.output_files = { }
+% callback.register('find_write_file', function(id,name)
+% input.output_files[name] = file.join(".","tmp","\jobname",name)
+% texio.write_nl("REDIRECTING OUTPUT "..name.. " TO " .. input.output_files[name])
+% return input.output_files[name]
+% end)
+% callback.register('find_read_file', function(id,name)
+% local sname = string.gsub(name,"^\letterpercent./","")
+% if input.output_files[sname] then
+% return input.output_files[name]
+% elseif string.find(sname,"^\jobname[\letterpercent.\letterpercent-]") then
+% local n = file.join(".","tmp","\jobname",sname)
+% local f = io.open(n)
+% if f then
+% input.output_files[name] = n
+% texio.write_nl("REDIRECTING INPUT "..sname.. " TO " .. n)
+% f:close()
+% return n
+% else
+% return input.findtexfile(texmf.instance,name)
+% end
+% else
+% return input.findtexfile(texmf.instance,name)
+% end
+% end)
+% }
+
+\protect \endinput
diff --git a/tex/context/base/context-debug.lmx b/tex/context/base/context-debug.lmx
new file mode 100644
index 000000000..88ca0b450
--- /dev/null
+++ b/tex/context/base/context-debug.lmx
@@ -0,0 +1,108 @@
+<!--
+ -- filename : comm-deb.xml
+ -- comment : companion to comm-xml.tex
+ -- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ -- copyright: PRAGMA ADE / ConTeXt Development Team
+ -- license : see context related readme files
+
+-->
+
+<html>
+ <title><?lua pv('title') ?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <style type="text/css">
+ <!--
+ <?lmx-include context.css ?>
+ #type {
+ text-align: center ;
+ }
+ #variable {
+ width: 10em ;
+ text-align: right ;
+ margin-right: 1em ;
+ }
+ #value {
+ text-align: left ;
+ }
+ -->
+ </style>
+ <script language="JavaScript">
+ <!--
+ window.focus();
+ -->
+ </script>
+ <body>
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title') ?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <!-- empty -->
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <!-- empty -->
+ </div></div></div></div></div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five"></div></div></div></div></div></div></div>
+ <div id="main"><div id='main-settings'>
+ <?lua if trace.knownlist('scratch') then ?>
+ <h1>Scratch Variables</h1>
+ <table>
+ <tr>
+ <th align='middle'>index</th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;dimen</th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;count</th>
+ <th align='left' >&nbsp;&nbsp;&nbsp;toks</th>
+ </tr>
+ <?lua for k,v in pairs(trace.list['scratch']) do ?>
+ <tr>
+ <th align='middle'><?lua t(v) ?></th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;<?lua t(trace.dimen(v)) ?></th>
+ <th align='middle'>&nbsp;&nbsp;&nbsp;<?lua t(trace.count(v)) ?></th>
+ <th align='left' >&nbsp;&nbsp;&nbsp;<?lua t(trace.toks (v)) ?></th>
+ </tr>
+ <?lua end ?>
+ </table>
+ <br/>
+ <?lua end ?>
+ <?lmx-define-begin tvv-head ?>
+ <tr>
+ <th><div id="type" >type </div></th>
+ <th><div id="variable">variable</div></th>
+ <th><div id="value" >value </div></th>
+ </tr>
+ <?lmx-define-end ?>
+ <?lmx-define-begin tvv-body ?>
+ <tr>
+ <th><div id="type" ><?lua t(trace.type(v)) ?></div></th>
+ <th><div id="variable"><?lua t(trace.name(v)) ?></div></th>
+ <th><div id="value" ><?lua t(trace.cs(v)) ?></div></th>
+ </tr>
+ <?lmx-define-end ?>
+ <?lua if trace.knownlist('internals') then ?>
+ <h1>Internal Variables</h1>
+ <table>
+ <?lmx-resolve tvv-head ?>
+ <?lua for k,v in pairs(trace.list['internals']) do ?>
+ <?lmx-resolve tvv-body ?>
+ <?lua end ?>
+ </table>
+ <br/>
+ <?lua end ?>
+ <?lua if trace.knownlist('context') then ?>
+ <h1>ConTeXt Variables</h1>
+ <table>
+ <?lmx-resolve tvv-head ?>
+ <?lua for k,v in pairs(trace.list['context']) do ?>
+ <?lmx-resolve tvv-body ?>
+ <?lua end ?>
+ </table>
+ <br/>
+ <?lua end ?>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ Job Name: <?lua p(environment.jobname) ?> &nbsp;&nbsp;&nbsp;
+ ConTeXt Version: <?lua p(environment.version) ?> &nbsp;&nbsp;&nbsp;
+ Real Page: <?lua p(trace.cs('c:realpageno')) ?> &nbsp;&nbsp;&nbsp;
+ Page: <?lua p(trace.cs('c:pageno')) ?> &nbsp;&nbsp;&nbsp;
+ </div></div></div>
+ </body>
+</html>
diff --git a/tex/context/base/context-error.lmx b/tex/context/base/context-error.lmx
new file mode 100644
index 000000000..075c43073
--- /dev/null
+++ b/tex/context/base/context-error.lmx
@@ -0,0 +1,55 @@
+<!--
+ -- filename : comm-err.xml
+ -- comment : companion to comm-xml.tex
+ -- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+ -- copyright: PRAGMA ADE / ConTeXt Development Team
+ -- license : see context related readme files
+
+-->
+
+<html>
+ <title><?lua pv('title')?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <style type="text/css">
+ <!--
+ <?lmx-include context.css ?>
+ -->
+ </style>
+ <script language="JavaScript">
+ <!--
+ window.focus();
+ parent.close();
+ -->
+ </script>
+ <body>
+ <div id="top"><div id="top-one"><div id="top-two">
+ <?lua pv('title')?>
+ </div></div></div>
+ <div id="left"><div id="left-one"><div id="left-two">
+ <!-- empty -->
+ </div></div></div>
+ <div id="right"><div id="right-safari"><div id="right-one"><div id="right-two"><div id="right-three"><div id="right-four"><div id="right-five">
+ <!-- empty -->
+ <br/>
+ <a href="<?lua pv('filename')?>">edit</a>
+ <br/>
+ </div></div></div></div></div></div></div>
+ <div id="main"><div id="main-settings">
+ <table>
+ <tr><td>Error</td><td>&nbsp;&nbsp;&nbsp;<?lua tv('errormessage')?></td></tr>
+ <tr><td>File </td><td>&nbsp;&nbsp;&nbsp;<?lua tv('filename') ?></td></tr>
+ <tr><td>Line </td><td>&nbsp;&nbsp;&nbsp;<?lua tv('linenumber') ?></td></tr>
+ </table>
+ </br>
+ <pre>
+ <?lua pv('errorcontext')?>
+ </pre>
+ </div></div>
+ <div id="bottom"><div id="bottom-one"><div id="bottom-two">
+ Job Name: <?lua p(environment.jobname) ?> &nbsp;&nbsp;&nbsp;
+ ConTeXt Version: <?lua p(environment.version) ?> &nbsp;&nbsp;&nbsp;
+ Real Page: <?lua p(trace.cs('c:realpageno')) ?> &nbsp;&nbsp;&nbsp;
+ Page: <?lua p(trace.cs('c:pageno')) ?> &nbsp;&nbsp;&nbsp;
+ </div></div></div>
+ </body>
+</html>
diff --git a/tex/context/base/context.css b/tex/context/base/context.css
new file mode 100644
index 000000000..ef4a44cea
--- /dev/null
+++ b/tex/context/base/context.css
@@ -0,0 +1,226 @@
+body {
+ color: #FFFFFF ;
+ background-color: <?lua pv('color-background-body')?> ;
+ font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans ;
+ font-size: 12px ;
+ line-height: 18px ;
+}
+a:link, a:active, a:visited {
+ color: #FFFFFF ;
+}
+a.dir-view:link, a.dir-view:active, a.dir-view:visited {
+ color: #FFFFFF ;
+ text-decoration: underline ;
+}
+h1, .title {
+ font-style: normal ;
+ font-weight: normal ;
+ font-size: 18px ;
+ line-height: 18px ;
+ margin-bottom: 20px ;
+}
+h2, .subtitle {
+ font-style: normal ;
+ font-weight: normal ;
+ font-size: 12px ;
+ margin-top: 18px ;
+ margin-bottom: 18px ;
+}
+table {
+ line-height: 18px ;
+ font-size: 12px ;
+ margin: 0 ;
+}
+p, li {
+ max-width: 60em ;
+}
+.empty-line {
+ margin-top: 4px ;
+}
+.more-room {
+ margin-right: 1.5em ;
+}
+.much-more-room {
+ margin-right: 3em ;
+}
+#main {
+ position: absolute;
+ left: 10% ;
+ top: 10% ;
+ right: 10% ;
+ bottom: 10% ;
+ z-index: 2 ;
+ width: 80% ;
+ height: 80% ;
+ padding: 0% ;
+ margin: 0% ;
+ overflow: auto ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-main')?> ;
+}
+#main-settings {
+ margin: 12px ;
+ x_max-width: 60em ;
+ line-height: 18px ;
+ font-size: 12px ;
+}
+#left {
+ position: absolute;
+ top : 10% ;
+ left: 0% ;
+ bottom: 0%;
+ right: 90% ;
+ z-index: 1 ;
+ width: 10% ;
+ height: 90% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-one')?> ;
+}
+#right {
+ position: absolute;
+ top : 0% ;
+ left: 90% ;
+ bottom: 10% ;
+ right: 0% ;
+ z-index: 1 ;
+ width: 10% ;
+ height: 90% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-one')?> ;
+ _margin-left: -15px ;
+}
+#bottom {
+ position: absolute ;
+ left: 10% ;
+ right: 0% ;
+ top: 90% ;
+ bottom: 0% ;
+ z-index: 1 ;
+ width: 90% ;
+ height: 10% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-two')?> ;
+}
+#top {
+ position: absolute ;
+ left: 0% ;
+ right: 10% ;
+ top: 0% ;
+ bottom: 90% ;
+ z-index: 1 ;
+ width: 90% ;
+ height: 10% ;
+ padding: 0% ;
+ margin: 0% ;
+ font-size: 16px ;
+ border-style: none ;
+ border-width: 0 ;
+ background-color: <?lua pv('color-background-two')?> ;
+}
+#top-one {
+ position: absolute ;
+ bottom: 50% ;
+ width: 100% ;
+ buggedheight: 100% ;
+}
+#top-two {
+ position: relative ;
+ margin-bottom: -9px ;
+ margin-left: 12px ;
+ margin-right: 12px ;
+ line-height: 18px ;
+ text-align: right ;
+ vertical-align: middle ;
+}
+#bottom-one {
+ position: absolute ;
+ bottom: 50% ;
+ width: 100% ;
+ buggedheight: 100% ;
+}
+#bottom-two {
+ position: relative ;
+ margin-bottom: -9px ;
+ margin-left: 12px ;
+ margin-right: 12px ;
+ line-height: 18px ;
+ text-align: left ;
+ vertical-align: middle ;
+}
+#left-one {
+ position: absolute ;
+ width: 100% ;
+ buggedheight: 100% ;
+}
+#left-two {
+ position: relative ;
+ margin-top: 12px ;
+ line-height: 18px ;
+ text-align: center ;
+ vertical-align: top ;
+}
+#right-one {
+ display: table ;
+ height: 100% ;
+ width: 100% ;
+}
+#right-two {
+ display: table-row ;
+ height: 100% ;
+ width: 100% ;
+}
+#right-three {
+ display: table-cell ;
+ width: 100% ;
+ vertical-align: bottom ;
+ _position: absolute ;
+ _top: 100% ;
+}
+#right-four {
+ text-align: center ;
+ margin-bottom: 2ex ;
+ _position: relative ;
+ _top: -100% ;
+}
+#more-top {
+ position: absolute;
+ top: 0% ;
+ left: 90% ;
+ bottom: 90%;
+ right: 0% ;
+ z-index: 3 ;
+ width: 10% ;
+ height: 10% ;
+ padding: 0% ;
+ margin: 0% ;
+ border-style: none ;
+ border-width: 0 ;
+}
+#more-top-settings {
+ text-align: center ;
+}
+#more-right-settings {
+ margin-right: 12px ;
+ margin-left: 12px ;
+ line-height: 18px ;
+ font-size: 10px ;
+ text-align: center ;
+}
+#right-safari {
+ display: table ;
+ width: 100% ;
+ height: 100% ;
+}
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index 70e4dc67a..8a412745b 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -42,7 +42,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2007.07.25 12:35}
+\edef\contextversion{2007.08.07 01:37}
%D For those who want to use this:
@@ -622,6 +622,15 @@
\writeline\writebanner{\copyrightversion}\writeline
+\unprotect
+\beginLUATEX
+ \appendtoks
+ \writestatus\m!lua{used config path - \ctxlua{tex.print(cache.configpath(texmf.instance))}}%
+ \writestatus\m!lua{used cache path - \ctxlua{tex.print(cache.path)}}%
+ \to \everydump
+\endLUATEX
+\protect
+
% %D Except from english, no hyphenation patterns are loaded
% %D yet. Users can specify their needs in the next module:
%
diff --git a/tex/context/base/core-buf.lua b/tex/context/base/core-buf.lua
new file mode 100644
index 000000000..57b5274ff
--- /dev/null
+++ b/tex/context/base/core-buf.lua
@@ -0,0 +1,377 @@
+-- filename : core-buf.lua
+-- comment : companion to core-buf.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- ctx lua reference model / hooks and such
+-- to be optimized
+
+if not versions then versions = { } end versions['core-buf'] = 1.001
+
+if unicode and not utf then utf = unicode.utf8 end
+
+buffers = { }
+buffers.data = { }
+buffers.hooks = { }
+buffers.flags = { }
+buffers.commands = { }
+
+function buffers.erase(name)
+ buffers.data[name] = nil
+end
+
+function buffers.set(name, str)
+ buffers.data[name] = { str } -- CHECK THIS
+end
+
+function buffers.append(name, str)
+ buffers.data[name] = (buffers.data[name] or "") .. str
+end
+
+buffers.flags.store_as_table = true
+
+-- to be sorted out: crlf + \ ; slow now
+
+function buffers.grab(name,begintag,endtag,data)
+ if not buffers.data[name] or buffers.data[name] == "" then
+ buffers.data[name] = ""
+ buffers.level = 0
+ end
+ buffers.level = buffers.level + data:count("\\"..begintag) - data:count("\\"..endtag)
+ local more = buffers.level>0
+ if more then
+ buffers.data[name] = buffers.data[name] .. data .. endtag
+ buffers.level = buffers.level - 1
+ else
+ if buffers.data[name] == "" then
+ buffers.data[name] = data:sub(1,#data-1)
+ else
+ buffers.data[name] = buffers.data[name] .. "\n" .. data:sub(1,#data-1)
+ end
+ buffers.data[name] = buffers.data[name]:gsub("[\010\013]$","")
+ if buffers.flags.store_as_table then
+ -- todo: specific splitter, do we really want to erase the spaces?
+ buffers.data[name] = string.split(buffers.data[name]," *[\010\013]")
+ end
+ end
+ cs.testcase(more)
+end
+
+function buffers.doifelsebuffer(name)
+ cs.testcase(buffers.data[name] ~= nil)
+end
+
+buffers.flags.optimize_verbatim = true
+buffers.flags.count_empty_lines = false
+
+buffers.commands.no_break = "\\doverbatimnobreak"
+buffers.commands.do_break = "\\doverbatimgoodbreak"
+buffers.commands.begin_of_line_command = "\\doverbatimbeginofline"
+buffers.commands.end_of_line_command = "\\doverbatimendofline"
+buffers.commands.empty_line_command = "\\doverbatimemptyline"
+
+function buffers.verbatimbreak(n,m)
+ if buffers.flags.optimize_verbatim then
+ if (n==2) or (n==m) then
+ tex.sprint(buffers.commands.no_break)
+ else
+ tex.sprint(buffers.commands.do_break)
+ end
+ end
+end
+
+function buffers.type(name)
+ if buffers.data[name] then
+ if type(buffers.data[name]) == "string" then
+ -- todo: use linestepper (no need for a table)
+ local lines = string.split(buffers.data[name]," *[\010\013]")
+ local line, n, m = 0, 0, #lines
+ for _,str in ipairs(lines) do
+ n, line = buffers.typeline(str, n, m, line)
+ end
+ else
+ local line, n, m = 0, 0, #buffers.data[name]
+ for _,str in ipairs(buffers.data[name]) do
+ n, line = buffers.typeline(str, n, m, line)
+ end
+ end
+ end
+end
+
+function buffers.typefile(name)
+ local t = input.openfile(name)
+ if t then
+ local line, n, m = 0, 0, t.noflines
+ while true do
+ str = t.reader(t)
+ if str then
+ n, line = buffers.typeline(str, n, m, line)
+ else
+ break
+ end
+ end
+ t.close()
+ end
+end
+
+function buffers.typeline(str,n,m,line)
+ n = n + 1
+ buffers.verbatimbreak(n,m)
+ if str:find("%S") then
+ line = line + 1
+ buffers.hooks.begin_of_line(line)
+ buffers.hooks.flush_line(buffers.hooks.line(str))
+ buffers.hooks.end_of_line()
+ else
+ if buffers.flags.count_empty_lines then
+ line = line + 1
+ end
+ buffers.hooks.empty_line(line)
+ end
+ return n, line
+end
+
+function buffers.get(name)
+ if buffers.data[name] then
+ if type(buffers.data[name]) == "table" then
+ for _,v in ipairs(buffers.data[name]) do
+ tex.print(v)
+ end
+ else
+ string.piecewise(buffers.data[name], " *[\010\013]", tex.print)
+ end
+ end
+end
+
+function buffers.inspect(name)
+ if buffers.data[name] then
+ if type(buffers.data[name]) == "table" then
+ for _,v in ipairs(buffers.data[name]) do
+ if v == "" then
+ tex.sprint(tex.ctxcatcodes,"[crlf]\\par ")
+ else
+ tex.sprint(tex.ctxcatcodes,(string.gsub("(.)",function(c)
+ return " [" .. string.byte(c) .. "] "
+ end)) .. "\\par")
+ end
+ end
+ else
+ tex.sprint(tex.ctxcatcodes,(string.gsub(buffers.data[name],"(.)",function(c)
+ return " [" .. string.byte(c) .. "] "
+ end)))
+ end
+ end
+end
+
+-- maybe just line(n,str) empty(n,str)
+
+buffers.visualizers = { }
+buffers.visualizers.default = { }
+buffers.visualizers.tex = { }
+buffers.visualizers.mp = { }
+
+buffers.visualizers.escapetoken = nil
+buffers.visualizers.tablength = 7
+
+buffers.visualizers.enabletab = false
+buffers.visualizers.enableescape = false
+
+function buffers.visualizers.reset()
+ buffers.visualizers.enabletab = false
+ buffers.visualizers.enableescape = false
+ buffers.currentvisualizer = 'default'
+end
+
+buffers.currentvisualizer = 'default'
+
+function buffers.setvisualizer(str)
+ buffers.currentvisualizer = string.lower(str)
+ if not buffers.visualizers[buffers.currentvisualizer] then
+ buffers.currentvisualizer = 'default'
+ end
+end
+
+function buffers.doifelsevisualizer(str)
+ cs.testcase((str ~= "") and (buffers.visualizers[string.lower(str)] ~= nil))
+end
+
+-- calling routines, don't change
+
+function buffers.hooks.flush_line(str,nesting)
+ if buffers.visualizers[buffers.currentvisualizer].flush_line then
+ buffers.visualizers[buffers.currentvisualizer].flush_line(str,nesting)
+--~ elseif nesting then
+--~ buffers.visualizers.flush_nested(str,false) -- no real nesting
+ else
+ buffers.visualizers.default.flush_line(str,nesting)
+ end
+end
+
+function buffers.hooks.begin_of_line(n)
+ if buffers.visualizers[buffers.currentvisualizer].begin_of_line then
+ buffers.visualizers[buffers.currentvisualizer].begin_of_line(n)
+ else
+ buffers.visualizers.default.begin_of_line(n)
+ end
+end
+
+function buffers.hooks.end_of_line()
+ if buffers.visualizers[buffers.currentvisualizer].end_of_line then
+ buffers.visualizers[buffers.currentvisualizer].end_of_line()
+ else
+ buffers.visualizers.default.end_of_line(str)
+ end
+end
+
+function buffers.hooks.empty_line()
+ if buffers.visualizers[buffers.currentvisualizer].empty_line then
+ buffers.visualizers[buffers.currentvisualizer].empty_line()
+ else
+ buffers.visualizers.default.empty_line()
+ end
+end
+
+function buffers.hooks.line(str)
+ if buffers.visualizers[buffers.currentvisualizer].line then
+ return buffers.visualizers[buffers.currentvisualizer].line(str)
+ else
+ return buffers.visualizers.default.line(str)
+ end
+end
+
+-- defaults
+
+function buffers.visualizers.default.flush_line(str)
+ tex.sprint(tex.ctxcatcodes,buffers.escaped(str))
+end
+
+function buffers.visualizers.default.begin_of_line(n)
+ tex.sprint(tex.ctxcatcodes, buffers.commands.begin_of_line_command .. "{" .. n .. "}")
+end
+
+function buffers.visualizers.default.end_of_line()
+ tex.sprint(tex.ctxcatcodes,buffers.commands.end_of_line_command)
+end
+
+function buffers.visualizers.default.empty_line()
+ tex.sprint(tex.ctxcatcodes,buffers.commands.empty_line_command)
+end
+
+function buffers.visualizers.default.line(str)
+ return str
+end
+
+-- special one
+
+buffers.commands.nested = "\\switchslantedtype "
+
+-- todo : utf + faster
+
+function buffers.visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess
+ local result, c, nested, i = "", "", 0, 1
+ local sb, ss, sf = string.byte, string.sub, string.find
+ while i < #str do -- slow
+ c = ss(str,i,i+1)
+ if c == "<<" then
+ nested = nested + 1
+ if enable then
+ result = result .. "{" .. buffers.commands.nested
+ else
+ result = result .. "{"
+ end
+ i = i + 2
+ elseif c == ">>" then
+ if nested > 0 then
+ nested = nested - 1
+ result = result .. "}"
+ end
+ i = i + 2
+ else
+ c = ss(str,i,i)
+ if c == " " then
+ result = result .. "\\obs "
+ elseif sf(c,"%a") then
+ result = result .. c
+ else
+ result = result .. "\\char" .. sb(c) .. " "
+ end
+ i = i + 1
+ end
+ end
+ result = result .. "\\char" .. sb(ss(str,i,i)) .. " " .. string.rep("}",nested)
+ tex.sprint(tex.ctxcatcodes,result)
+end
+
+-- handy helpers
+--
+-- \sop[color] switch_of_pretty
+-- \bop[color] begin_of_pretty
+-- \eop end_of_pretty
+-- \obs obeyedspace
+-- \char <n> special characters
+
+buffers.currentcolors = { }
+
+function buffers.change_state(n, state, result)
+ if n then
+ if state ~= n then
+ if state > 0 then
+ result[#result+1] = "\\sop[" .. buffers.currentcolors[n] .. "]"
+ else
+ result[#result+1] = "\\bop[" .. buffers.currentcolors[n] .. "]"
+ end
+ return n
+ end
+ elseif state > 0 then
+ result[#result+1] = "\\eop "
+ return 0
+ end
+ return state
+end
+
+function buffers.finish_state(state, result)
+ if state > 0 then
+ result[#result+1] = "\\eop "
+ return 0
+ else
+ return state
+ end
+end
+
+buffers.open_nested = string.rep("\\char"..string.byte('<').." ",2)
+buffers.close_nested = string.rep("\\char"..string.byte('>').." ",2)
+
+function buffers.replace_nested(result)
+ return (string.gsub(string.gsub(result,buffers.open_nested,"{"),buffers.close_nested,"}"))
+end
+
+function buffers.flush_result(result,nested)
+ if nested then
+ tex.sprint(tex.ctxcatcodes,buffers.replace_nested(table.concat(result,"")))
+ else
+ tex.sprint(tex.ctxcatcodes,table.concat(result,""))
+ end
+end
+
+function buffers.escaped(str)
+ local sb, sf = utf.byte, utf.find
+ return (utf.gsub(str,"(.)", function(c)
+ if sf(c,"^(%a%d)$") then
+ return c
+ elseif c == " " then
+ return "\\obs "
+ else
+ return "\\char" .. sb(c) .. " "
+ end
+ end))
+end
+
+function buffers.escaped_chr(ch)
+ local b = utf.byte(ch)
+ if b == 32 then
+ return "\\obs "
+ else
+ return "\\char" .. b .. " "
+ end
+end
diff --git a/tex/context/base/core-buf.mkiv b/tex/context/base/core-buf.mkiv
new file mode 100644
index 000000000..09f4f552e
--- /dev/null
+++ b/tex/context/base/core-buf.mkiv
@@ -0,0 +1,107 @@
+%D \module
+%D [ file=core-buf, % blocks are moved to core-blk
+%D version=2000.01.05,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Buffers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{core-buf}{1.001}
+
+\def\mkresetbuffer
+ {\ctxlua{buffers.erase("\currentbuffer")}}
+
+\long\def\mksetbuffer#1%
+ {\ctxlua{buffers.set("\currentbuffer", \!!bs\detokenize{#1}\!!es)}}
+
+\long\def\mkstartbuffer#1#2#3#4#5%
+ {\doifelsenothing{#4}
+ {\expanded{\setbuffercapsules{\e!start\v!buffer}{\e!stop\v!buffer}}%
+ \letvalue\bufferstop\relax}
+ {\setbuffercapsules{#3}{#4}}% not expanded, can be \cs \cs !
+ \expanded{\dodowithbuffer
+ {\currentbuffer}
+ {\bufferstart}
+ {\bufferstop}
+ {\donothing}
+ {#5% \egroup
+ \noexpand\getvalue{\bufferstop}}}}
+
+\def\mkdobuffer#1%
+ {#1}
+
+\def\mkdoifelsebuffer#1%
+ {\ctxlua{buffers.doifelsebuffer("#1")}}
+
+\def\mkgetbuffer
+ {\ctxlua{buffers.get("\currentbuffer")}}
+
+% will move
+
+\ifx\mkinitializeverbatim\undefined \def\mkinitializeverbatim{\tttf} \fi
+
+\def\mktypebuffer
+ {\mkdotypebuffer{\v!file}{}{\currentbuffer}}
+
+\def\mkprocessbufferverbatim
+ {\mkinitializeverbatim
+ \ctxlua{buffers.type("\currentbuffer")}}
+
+\def\mkprocessbufferlinesverbatim#1#2#3%
+ {#2%
+ % todo, set up numbers
+ \mkinitializeverbatim
+ \ctxlua{buffers.type("\currentbuffer")}
+ #3}
+
+\def\mkdotypebuffer#1#2#3% see dodotypefile
+ {\mkdoifelsebuffer{#3}
+ {\dosometyping{#1}{#2}{#3}\mkprocessbufferverbatim\mkprocessbufferlinesverbatim}
+ {\reporttypingerror{#3}}}
+
+\def\setbuffercapsules#1#2%
+ {\edef\bufferstart{\strippedcsname#1}\edef\bufferstart{\scantextokens\expandafter{\bufferstart}}%
+ \edef\bufferstop {\strippedcsname#2}\edef\bufferstop {\scantextokens\expandafter{\bufferstop }}}
+
+\def\dowithbuffer#1#2#3% name, startsequence, stopsequence, before, after
+ {\setbuffercapsules{#2}{#3}%
+ \expanded{\dodowithbuffer{#1}{\bufferstart}{\bufferstop}}}
+
+\long\def\dodowithbuffer#1#2#3#4#5% name, startsequence, stopsequence, before, after
+ {#4%
+ \bgroup
+ \setcatcodetable \vrbcatcodes
+ \catcode`\\=12
+ \ctxlua{buffers.erase("#1")}%
+ \long\def\nododowithbuffer
+ {\egroup
+ #5}%
+ \long\def\dododowithbuffer##1#3% is detokenize needed? TEST
+ {\ctxlua
+ {buffers.grab("#1","#2","#3",\!!bs\detokenize{##1}\!!es)}
+ \dododowithbuffer
+ \nododowithbuffer}%
+ \dododowithbuffer}
+
+% kind of redundant in mkiv
+
+\let\mkstartmemorybuffer\startbuffer
+\let\mkstartfilebuffer \startbuffer
+
+% bonus
+
+\def\inspectbuffer
+ {\dosingleempty\doinspectbuffer}
+
+\def\doinspectbuffer[#1]%
+ {\setcurrentbuffer{#1}%
+ \ctxlua{buffers.inspect("\currentbuffer")}}
+
+\protect \endinput
diff --git a/tex/context/base/core-con.lua b/tex/context/base/core-con.lua
new file mode 100644
index 000000000..349d33688
--- /dev/null
+++ b/tex/context/base/core-con.lua
@@ -0,0 +1,164 @@
+if not modules then modules = { } end modules ['char-con'] = {
+ version = 1.001,
+ comment = "companion to core-con.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module implements a bunch of conversions. Some are more
+efficient than their <l n='tex'/> counterpart, some are even
+slower but look nicer this way.</p>
+
+<p>Some code may move to a module in the language namespace.</p>
+--ldx]]--
+
+convert = convert or { }
+language = language or { }
+
+language.counters = {
+ ['**'] = {
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+ 0x0066, 0x0067, 0x0068, 0x0069, 0x006A,
+ 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
+ 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A
+ },
+ ['sl'] = {
+ 0x0061, 0x0062, 0x0063, 0x010D, 0x0064,
+ 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0072, 0x0073, 0x0161,
+ 0x0074, 0x0075, 0x0076, 0x007A, 0x017E
+ },
+ ['gr'] = {
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,
+ 0x0396, 0x0397, 0x0398, 0x0399, 0x039A,
+ 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5,
+ 0x03A6, 0x03A7, 0x03A8, 0x03A9
+ },
+ ['arabic'] = {
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664,
+ 0x0665, 0x0666, 0x0667, 0x0668, 0x0669
+ },
+ ['persian'] = {
+ 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4,
+ 0x06F5, 0x06F6, 0x06F7, 0x06F8, 0x06F9
+ },
+ ['thai'] = {
+ 0xE050, 0xE051, 0xE052, 0xE053, 0xE054,
+ 0xE055, 0xE056, 0xE057, 0xE058, 0xE059
+ },
+ ['devangari'] = {
+ 0x0966, 0x0967, 0x0968, 0x0969, 0x096A,
+ 0x096B, 0x096C, 0x096D, 0x096E, 0x096F
+ },
+ ['gurmurkhi'] = {
+ 0x0A66, 0x0A67, 0x0A68, 0x0A69, 0x0A6A,
+ 0x0A6B, 0x0A6C, 0x0A6D, 0x0A6E, 0x0A6F
+ },
+ ['gujarati'] = {
+ 0x0AE6, 0x0AE7, 0x0AE8, 0x0AE9, 0x0AEA,
+ 0x0AEB, 0x0AEC, 0x0AED, 0x0AEE, 0x0AEF
+ },
+ ['tibetan'] = {
+ 0x0F20, 0x0F21, 0x0F22, 0x0F23, 0x0F24,
+ 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29
+ }
+}
+
+function convert.chr(n, m)
+ if n > 0 and n < 27 then
+ tex.sprint(string.char(n+m))
+ end
+end
+
+function convert.maxchrs(n,m,cmd)
+ if n <= m then
+ tex.sprint(tex.texcatcodes, cmd .. "{" .. n .. "}")
+ else
+ convert.maxchrs(math.floor((n-1)/m),m,cmd)
+ tex.sprint(tex.texcatcodes, cmd .. "{" .. ((n-1)%m + 1) .. "}")
+ end
+end
+function convert.chrs(n,m)
+ if n <= 26 then
+ tex.sprint(string.char(n+m))
+ else
+ convert.chrs(math.floor((n-1)/26),m)
+ tex.sprint(string.char(((n-1)%26 + 1)+m))
+ end
+end
+
+function convert.alphabetic(n,code)
+ local code = language.counters[code] or language.counters['**']
+ convert.do_alphabetic(n,#code,function(n) return code[n] end)
+end
+
+function convert.Alphabetic(n,code)
+ local code = language.counters[code] or language.counters['**']
+ convert.do_alphabetic(n,#code,function(n) return characters.uccode(code[n]) end)
+end
+
+function convert.do_alphabetic(n,max,chr)
+ if n <= max then
+ characters.flush(chr(n))
+ else
+ convert.do_alphabetic(math.floor((n-1)/max),max,chr)
+ characters.flush(chr((n-1)%max+1))
+ end
+end
+
+function convert.character(n) convert.chr (n,96) end
+function convert.Character(n) convert.chr (n,64) end
+function convert.characters(n) convert.chrs(n,96) end
+function convert.Characters(n) convert.chrs(n,64) end
+
+function convert.weekday(year,month,day)
+ tex.sprint(os.date("%w",os.time{year=year,month=month,day=day})+1)
+end
+
+function convert.lpy(year)
+ return (year % 400 == 0) or ((year % 100 ~= 0) and (year % 4 == 0))
+end
+
+function convert.leapyear(year)
+ if convert.lpy(year) then tex.sprint(1) else tex.sprint(0) end
+end
+
+convert.mth = {
+ [false] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ [true] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+}
+
+function convert.nofdays(year,month)
+ tex.sprint(convert.mth[convert.lpy(year)][month])
+end
+
+function convert.year () tex.sprint(os.date("%Y")) end
+function convert.month () tex.sprint(os.date("%m")) end
+function convert.hour () tex.sprint(os.date("%H")) end
+function convert.minute () tex.sprint(os.date("%M")) end
+function convert.second () tex.sprint(os.date("%S")) end
+function convert.textime() tex.sprint(tonumber(os.date("%H"))*60+tonumber(os.date("%M"))) end
+
+convert.rom = {
+ { [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' },
+ { [0] = '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC' },
+ { [0] = '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM' },
+}
+
+function convert.toroman(n)
+ if n >= 4000 then
+ return convert.toroman(math.floor(n/1000)) .. " " .. convert.toroman(n%1000)
+ else
+ return string.rep("M",math.floor(n/1000)) .. convert.rom[3][math.floor((n%1000)/100)] ..
+ convert.rom[2][math.floor((n%100)/10)] .. convert.rom[1][math.floor((n% 10)/1)]
+ end
+end
+
+function convert.romannumerals(n) return tex.sprint(string.tolower(convert.toroman(n))) end
+function convert.Romannumerals(n) return tex.sprint( convert.toroman(n) ) end
diff --git a/tex/context/base/core-con.mkiv b/tex/context/base/core-con.mkiv
new file mode 100644
index 000000000..afed14f1d
--- /dev/null
+++ b/tex/context/base/core-con.mkiv
@@ -0,0 +1,90 @@
+%D \module
+%D [ file=core-con,
+%D version=2006.09.16,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Conversion Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{core-con}{1.001}
+
+\def\romannumerals#1{\ctxlua{convert.romannumerals(\number#1)}}
+\def\Romannumerals#1{\ctxlua{convert.Romannumerals(\number#1)}}
+
+\def\greeknumerals#1{\ctxlua{convert.alphabetic(\number#1,"gr")}}
+\def\Greeknumerals#1{\ctxlua{convert.Alphabetic(\number#1,"gr")}}
+
+\def\character #1{\ctxlua{convert.character (\number#1)}}
+\def\Character #1{\ctxlua{convert.Character (\number#1)}}
+\def\characters#1{\ctxlua{convert.characters(\number#1)}}
+\def\Characters#1{\ctxlua{convert.Characters(\number#1)}}
+
+\def\languagecharacters#1{\ctxlua{convert.alphabetic(\number#1,"\currentlanguage")}} % new
+\def\languageCharacters#1{\ctxlua{convert.Alphabetic(\number#1,"\currentlanguage")}} % new
+
+\def\getdayoftheweek#1#2#3{\normalweekday\ctxlua{convert.weekday(\number#1,\number#2,\number#3)}}
+\def\dayoftheweek #1#2#3{\doconvertday{\ctxlua{convert.weekday(\number#1,\number#2,\number#3)}}}
+
+\def\doifleapyearelse#1%
+ {\ifcase\ctxlua{convert.leapyear(\number#1)}
+ \@EA\secondoftwoarguments
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
+
+\def\getdayspermonth#1#2%
+ {\edef\numberofdays{\ctxlua{convert.nofdays(\number#1,\number#2)}}}
+
+\def\dayspermonth#1#2%
+ {\ctxlua{convert.nofdays(\number#1,\number#2)}}
+
+\def\calculatecurrenttime
+ {\edef\currenthour {\ctxlua{convert.hour ()}}%
+ \edef\currentminute{\ctxlua{convert.minute()}}%
+ \edef\currentsecond{\ctxlua{convert.second()}}}
+
+% problem is that we calculate with those numbers
+%
+% \def\time {\numexpr\ctxlua{convert.textime()}\relax}
+% \def\year {\numexpr\ctxlua{convert.year ()}\relax}
+% \def\month{\numexpr\ctxlua{convert.month ()}\relax}
+% \def\day {\numexpr\ctxlua{convert.day ()}\relax}
+
+% \dayoftheweek{2006}{9}{15}
+% \doifleapyearelse{2000}{OK}{NOT OK}
+% \doifleapyearelse{2100}{NOT OK}{OK}
+% \doifleapyearelse{2004}{OK}{NOT OK}
+% \doifleapyearelse{2003}{NOT OK}{OK}
+% \dayspermonth{2000}{2}
+% [\the\normaltime=\the\time]
+
+% we could use an auxiliary macro to save some bytes in the format
+%
+% \def\dolanguagecharacters#1#2{\ctxlua{convert.alphabetic(\number#2,"#1")}}
+
+% this does not belong here, but in a lang-module
+
+\def\arabicnumerals #1{\ctxlua{convert.alphabetic(\number#1,"arabic")}}
+\def\persiannumerals #1{\ctxlua{convert.alphabetic(\number#1,"persian")}}
+\def\thainumerals #1{\ctxlua{convert.alphabetic(\number#1,"thai")}}
+\def\devanagarinumerals#1{\ctxlua{convert.alphabetic(\number#1,"devanagari")}}
+\def\gurmurkhinumerals #1{\ctxlua{convert.alphabetic(\number#1,"gurmurkhi")}}
+\def\gujaratinumerals #1{\ctxlua{convert.alphabetic(\number#1,"gujarati")}}
+\def\tibetannumerals #1{\ctxlua{convert.alphabetic(\number#1,"tibetan")}}
+
+\defineconversion[arabicnumerals] [\arabicnumerals]
+\defineconversion[persiannumerals] [\persiannumerals]
+\defineconversion[thainumerals] [\thainumerals]
+\defineconversion[devanagarinumerals][\devanagarinumerals]
+\defineconversion[gurmurkhinumerals] [\gurmurkhinumerals]
+\defineconversion[gujaratinumerals] [\gujaratinumerals]
+\defineconversion[tibetannumerals] [\tibetannumerals]
+
+\protect \endinput
diff --git a/tex/context/base/core-des.tex b/tex/context/base/core-des.tex
index 1c37b655c..d0152fddc 100644
--- a/tex/context/base/core-des.tex
+++ b/tex/context/base/core-des.tex
@@ -423,7 +423,7 @@
[\c!location,\c!headstyle,\c!style,\c!color,\c!headcolor,\c!title,
\c!width,\c!hang,\c!sample,\c!before,\c!inbetween,\c!after,\c!margin,
\c!indenting,\c!indentnext,\c!align,\c!text,\c!distance,\c!titledistance,\c!command,
- \c!titleleft,\c!titleright,\c!closesymbol,\c!closecommand]%
+ \c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]%
\getparameters[\??dd#1]
[\c!title=\v!yes,\s!do\c!command=\normal@@descriptionhandler,
\c!type=\v!description,\c!list=,\c!listtext=,
@@ -520,9 +520,10 @@
{\doifsomething{#1}
{\doattributes{\??dd\currentdescription}\c!titlestyle\c!titlecolor
{\hskip\descriptionparameter\c!titledistance
- \descriptionparameter\c!titleleft
- \begstrut#1\endstrut
- \descriptionparameter\c!titleright}}}}
+ \descriptionparameter\c!titlecommand
+ {\descriptionparameter\c!titleleft
+ \begstrut#1\endstrut
+ \descriptionparameter\c!titleright}}}}}
\def\showdnpuretext
@@ -653,7 +654,7 @@
\c!sample,\c!hang,\c!align,\c!before,\c!inbetween,\c!after,
\c!levels,\c!way,\c!blockway,\c!separator,\c!margin,
\c!indenting,\c!indentnext,\c!stopper,\c!sectionnumber,
- \c!title,\c!titleleft,\c!titleright,\c!closesymbol,\c!closecommand]%
+ \c!title,\c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]%
\doifassignmentelse{#4}
{\getparameters[\??dd#3#1]%
[\c!text=#1,\??dd\c!number=#1,\c!conversion=,\c!listtext=#1\space,
@@ -671,7 +672,7 @@
\c!sample,\c!hang,\c!align,\c!before,\c!inbetween,\c!after,
\c!stopper,\c!indenting,\c!indentnext,\c!left,\c!right,
\c!coupling,\c!couplingway,
- \c!title,\c!titleleft,\c!titleright,\c!closesymbol,\c!closecommand]%
+ \c!title,\c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]%
\getparameters[\??dd#3#1]
[\c!text=#1,\??dd\c!number=#4,\c!conversion=,#5]%
%docheckenumerationnumber{#1}{#3#1}{#4}}}%
@@ -859,7 +860,8 @@
\c!titleright=),
\c!closesymbol=,
\c!closecommand=\wordright,
- \c!command=]
+ \c!command=,
+ \c!titlecommand=]
\setupenumerations
[\c!location=\v!top,
@@ -893,7 +895,8 @@
\c!closesymbol=,
\c!closecommand=\wordright,
\c!number=,
- \c!command=]
+ \c!command=,
+ \c!titlecommand=]
\setupindentations
[\c!style=\v!normal,
diff --git a/tex/context/base/core-itm.tex b/tex/context/base/core-itm.tex
index 2171ff837..42d45a5df 100644
--- a/tex/context/base/core-itm.tex
+++ b/tex/context/base/core-itm.tex
@@ -87,6 +87,10 @@
\let\currentitemoffset \!!zerocount
\def\currentitemnumber{\countervalue{\@@itemcounter\itemlevel}}
+% tricky ... we cannot use trialtypesetting here because there can be
+% multiple itemizes in e.g. a table, so we need something more advanced
+% where counters etc are reset to pre-outertrial values
+
\def\dolistreference
{\ifconditional\continuelistitems
\savetaggedtwopassdata\s!list\currentlist\currentlist{\itemlevel:\noflistelements:c:\getitemparameter\itemlevel\c!maxwidth}%
@@ -104,9 +108,9 @@
\def\checkcurrentnofitems
{\splititemtwopassdata\noflists
\iftwopassdatafound
- \ifcase\scratchcounter
+ \ifcase\itemdatan\relax % \scratchcounter
\let\currentnofitems \!!zerocount
- \let\currentminnofitems\!!zerocount
+ \let\currentminnofitems\!!plusone
\let\currentmaxnofitems\!!zerocount
\else
\scratchcounter\itemdatan\relax
@@ -615,16 +619,16 @@
\ifconditional\textlistitem\else\doifnotinset\v!text{#1}\par\fi % suboptimal
\fi
\begingroup
-% new where, ok or not / we should integrate random, intro, continue here
-% beware, the following no longer inherit from the previous level, is this ok?
-\setfalse\reverselistitem
-\setfalse\introlistitem
-\setfalse\autointrolistitem
-\setfalse\beforelistitem
-\setfalse\afterlistitem
-\setfalse\nowhitelistitem
-\setfalse\randomizeitems
-%
+ % new where, ok or not / we should integrate random, intro, continue here
+ % beware, the following no longer inherit from the previous level, is this ok?
+ \setfalse\reverselistitem
+ \setfalse\introlistitem
+ \setfalse\autointrolistitem
+ \setfalse\beforelistitem
+ \setfalse\afterlistitem
+ \setfalse\nowhitelistitem
+ \setfalse\randomizeitems
+ %
\doifinsetelse\v!intro {#1}{\settrue\introlistitem }{\setfalse\introlistitem }%
\doifinsetelse\v!random {#1}{\settrue\randomizeitems }{\setfalse\randomizeitems }%
\doifinsetelse\v!continue{#1}{\settrue\continuelistitems}{\setfalse\continuelistitems}%
@@ -636,7 +640,7 @@
\setfalse\sublistitem
\setfalse\symbollistitem
\let\marsymbol\relax
- \globallet\somdestination\empty
+ \globallet\doitemdestination\empty
\let\symsymbol\empty
\the\itemgroupcommands
\checkcurrentnofitems
@@ -781,7 +785,7 @@
{\doitemgroupitem}
\def\itemgroupbutton[#1]%
- {\gdef\somdestination{#1}%
+ {\gdef\doitemdestination{#1}%
\itemgroupitem}
\def\itemgroupdummy
@@ -974,9 +978,9 @@
\setbox8\simplealignedbox{\getitemparameter\itemlevel\c!itemalign}{\itemdataw sp}{\box8}%
\fi
\fi
- \doifsomething\somdestination
- {\setbox8\hbox{\goto{\box8}[\somdestination]}}%
- \globallet\somdestination\empty
+ \doifsomething\doitemdestination
+ {\setbox8\hbox{\goto{\box8}[\doitemdestination]}}%
+ \globallet\doitemdestination\empty
\dimen2=\getitemparameter\itemlevel\c!width\relax
% new, prevents loops when symbol is (not yet found) graphic
\ht8=\strutheight
diff --git a/tex/context/base/core-lst.tex b/tex/context/base/core-lst.tex
index 359e9b8ce..7c26b97f7 100644
--- a/tex/context/base/core-lst.tex
+++ b/tex/context/base/core-lst.tex
@@ -33,6 +33,8 @@
% number uses the text container. We use reference mapping
% (define reference) to keep track of the current ref.
+% \@@sectie == current level
+
\def\dowritetolist#1%
{\doifelsevalue{\??li#1\c!state}\v!start
\dodowritetolist\gobblefourarguments{#1}}
diff --git a/tex/context/base/core-ntb.tex b/tex/context/base/core-ntb.tex
index e8534b714..aa1ace99f 100644
--- a/tex/context/base/core-ntb.tex
+++ b/tex/context/base/core-ntb.tex
@@ -884,11 +884,11 @@
\fi
\else\ifautoTBLrowspan\ifnum\maximumrowspan>1 % max ?
% added jan 2002 because nx=* did no longer work
-\edef\savedhsize{\the\hsize}%
-\hsize\wd0\relax % new per 17/04/2006
+ \edef\savedhsize{\the\hsize}%
+ \hsize\wd0\relax % new per 17/04/2006
\checktblwidthsone % trial run
\checktblwidthstwo % real run
-\hsize\savedhsize
+ \hsize\savedhsize
%
\let\handleTBLcell\dohandleTBLcellC
\setbox\scratchbox\vbox{\trialtypesettingtrue \the\tbltoks}%
@@ -901,7 +901,7 @@
\dorecurse{\gettblcol{##1}{##2}}
{\advance\dimen2 \gettblwid\colTBL
\advance\dimen2 \tbltblcolumndistance
-\ifnum\recurselevel<\gettblcol{##1}{##2}\relax \advance\dimen2 \gettbldis\colTBL\fi
+ \ifnum\recurselevel<\gettblcol{##1}{##2}\relax \advance\dimen2 \gettbldis\colTBL\fi
\increment\colTBL}%
\advance\dimen2 -\tbltblcolumndistance
\edef\widthTBL{\the\dimen2}%
diff --git a/tex/context/base/core-obj.lua b/tex/context/base/core-obj.lua
new file mode 100644
index 000000000..b94719993
--- /dev/null
+++ b/tex/context/base/core-obj.lua
@@ -0,0 +1,36 @@
+if not modules then modules = { } end modules ['core-obj'] = {
+ version = 1.001,
+ comment = "companion to core-obj.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>We save object references in the main utility table. Objects are
+reusable components.</p>
+--ldx]]--
+
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+if not job.objects then job.objects = { } end
+
+function job.getobjectreference(tag,default)
+ if job.objects[tag] then
+ tex.sprint(job.objects[tag][1] or default)
+ else
+ tex.sprint(default)
+ end
+end
+
+function job.getobjectreferencepage(tag,default)
+ if job.objects[tag] then
+ tex.sprint(job.objects[tag][2] or default)
+ else
+ tex.sprint(default)
+ end
+end
+
+function job.doifobjectreference(tag)
+ cs.testcase(job.objects[tag])
+end
diff --git a/tex/context/base/core-obj.mkiv b/tex/context/base/core-obj.mkiv
new file mode 100644
index 000000000..022b6908d
--- /dev/null
+++ b/tex/context/base/core-obj.mkiv
@@ -0,0 +1,55 @@
+%D \module
+%D [ file=core-obj,
+%D version=2006.10.16,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Object Handling,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\let\objectreference\gobblefourarguments % catch mkii tuo stuff
+
+\registerctxluafile{core-obj}{1.001}
+
+\appendtoks
+ \immediatewriteutilitytua{if not job.objects then job.objects = { } end}%
+ \immediatewriteutilitytua{local ob = job.objects}%
+\to \everyopenutilities
+
+\def\mkregisterobjectreference#1#2#3%
+ {\blabelgroup
+ \expanded{\writeutilitytua{ob['#1::#2']={"#3","\noexpand\realfolio"}}}%
+ \expanded{\ctxlua{job.objects['#1::#2']={"#3","\noexpand\realfolio"}}}%
+ \elabelgroup}
+
+\def\mkoverloadobjectreference#1#2#3%
+ {\blabelgroup
+ \expanded{\ctxlua{job.objects['#1::#2']={"#3","\noexpand\realfolio"}}}%
+ \elabelgroup}
+
+\def\mkgetobjectreference#1#2#3%
+ {\blabelgroup
+ \xdef#3{\ctxlua{job.getobjectreference ('#1::#2',"\defaultobjectreference{#1}{#2}")}}%
+ \elabelgroup}
+
+\def\mkgetobjectreferencepage#1#2#3%
+ {\blabelgroup
+ \xdef#3{\ctxlua{job.getobjectreferencepage('#1::#2',"\defaultobjectpage{#1}{#2}")}}%
+ \elabelgroup}
+
+% \def\doifobjectreferencefoundelse#1#2
+% {\ctxlua{job.doifobjectreference('#1::#2')}}
+
+\def\doifobjectreferencefoundelse#1#2%
+ {\blabelgroup
+ \ctxlua{job.doifobjectreference('#1::#2')}%
+ {\elabelgroup\firstoftwoarguments}
+ {\elabelgroup\secondoftwoarguments}}
+
+\protect \endinput
diff --git a/tex/context/base/core-pos.lua b/tex/context/base/core-pos.lua
new file mode 100644
index 000000000..d5c365031
--- /dev/null
+++ b/tex/context/base/core-pos.lua
@@ -0,0 +1,95 @@
+if not modules then modules = { } end modules ['core-pos'] = {
+ version = 1.001,
+ comment = "companion to core-pos.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>We save positional information in the main utility table. Not only
+can we store much more information in <l n='lua'/> but it's also
+more efficient.</p>
+--ldx]]--
+
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+if not job.positions then job.positions = { } end
+
+function job.MPp(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[1]) else tex.sprint('0' ) end end
+function job.MPx(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[2]) else tex.sprint('0pt') end end
+function job.MPy(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[3]) else tex.sprint('0pt') end end
+function job.MPw(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[4]) else tex.sprint('0pt') end end
+function job.MPh(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[5]) else tex.sprint('0pt') end end
+function job.MPd(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[6]) else tex.sprint('0pt') end end
+
+function job.MPxy(id)
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint('('..jpi[2]..','..jpi[3]..')')
+ else
+ tex.sprint('(0pt,0pt)')
+ end
+end
+
+function job.MPll(id)
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint('('..jpi[2]..'-'..-jpi[3]..','..jpi[6]..')')
+ else
+ tex.sprint('(0pt,0pt)')
+ end
+end
+function job.MPlr(id)
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint('('..jpi[2]..'+'..jpi[4]..','..jpi[3]..'-'..jpi[6]..')')
+ else
+ tex.sprint('(0pt,0pt)')
+ end
+end
+function job.MPur(id)
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint('('..jpi[2]..'+'..jpi[4]..','..jpi[3]..'+'..jpi[5]..')')
+ else
+ tex.sprint('(0pt,0pt)')
+ end
+end
+function job.MPul(id)
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint('('..jpi[2]..','..jpi[3]..'+'..jpi[5]..')')
+ else
+ tex.sprint('(0pt,0pt)')
+ end
+end
+
+-- todo
+
+function job.MPpos(id)
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint(table.concat(jpi,',',1,6))
+ else
+ tex.sprint('0,0pt,0pt,0pt,0pt,0pt')
+ end
+end
+
+function job.MPplus(id,n)
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint(jpi[n] or '0pt')
+ else
+ tex.sprint('0pt')
+ end
+end
+
+function job.MPrest(id,default) -- 7 or 8 ?
+ local jpi = job.positions[id]
+ if jpi then
+ tex.sprint(jpi[7] or default)
+ else
+ tex.sprint(default)
+ end
+end
diff --git a/tex/context/base/core-pos.mkiv b/tex/context/base/core-pos.mkiv
new file mode 100644
index 000000000..7c80984dc
--- /dev/null
+++ b/tex/context/base/core-pos.mkiv
@@ -0,0 +1,65 @@
+%D \module
+%D [ file=core-pos,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Positioning Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{core-pos}{1.001}
+
+\appendtoks
+ \immediatewriteutilitytua{if not job.positions then job.positions = { } end}%
+ \immediatewriteutilitytua{local jp = job.positions}%
+\to \everyopenutilities
+
+\def\replacepospxywhd#1#2#3#4#5#6#7%
+ {\ctxlua{job.positions['#1']={\number#2,"\the\dimexpr#3\relax","\the\dimexpr#4\relax",%
+ "\the\dimexpr#5\relax","\the\dimexpr#6\relax","\the\dimexpr#7\relax"}}}
+
+\def\dolazysaveposition#1#2#3#4%
+ {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4"}}}}
+
+\def\dolazysavepositionwhd#1#2#3#4#5#6#7%
+ {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+
+\def\dolazysavepositionplus#1#2#3#4#5#6#7#8%
+ {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+
+\def\dosaveposition#1#2#3#4% tag page x y
+ {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4"}}}}
+
+\def\dosavepositionwhd#1#2#3#4#5#6#7% tag page x y w h d
+ {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+
+\def\dosavepositionplus#1#2#3#4#5#6#7#8% tag page x y w h d list
+ {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+
+\def\MPp #1{\ctxlua{job.MPp("#1")}}
+\def\MPx #1{\ctxlua{job.MPx("#1")}}
+\def\MPy #1{\ctxlua{job.MPy("#1")}}
+\def\MPw #1{\ctxlua{job.MPw("#1")}}
+\def\MPh #1{\ctxlua{job.MPh("#1")}}
+\def\MPd #1{\ctxlua{job.MPd("#1")}}
+\def\MPxy #1{\ctxlua{job.MPxy("#1")}}
+\def\MPll #1{\ctxlua{job.MPll("#1")}}
+\def\MPlr #1{\ctxlua{job.MPlr("#1")}}
+\def\MPur #1{\ctxlua{job.MPur("#1")}}
+\def\MPul #1{\ctxlua{job.MPul("#1")}}
+\def\MPpos#1{\ctxlua{job.MPpos("#1")}}
+
+\def\MPplus#1#2{\ctxlua{job.MPplus("#1",#2)}}
+\def\MPrest#1#2{\ctxlua{job.MPrest("#1","#2")}}
+
+\def\doifpositionelse#1{\ctxlua{cs.testcase(job.positions['#1'])}}
+
+\def\copyposition#1#2{\ctxlua{job.positions['#1']=job.positions['#2']}}
+
+\protect \endinput
diff --git a/tex/context/base/core-reg.lua b/tex/context/base/core-reg.lua
new file mode 100644
index 000000000..b5ca260f8
--- /dev/null
+++ b/tex/context/base/core-reg.lua
@@ -0,0 +1,237 @@
+-- filename : core-reg.lua
+-- comment : companion to core-reg.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['core-reg'] = 1.001
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+if not job.registers then job.registers = { } end
+
+function job.defineregister(id)
+ if not job.registers[id] then
+ job.registers[id] = { }
+ end
+end
+
+-- {'e','3','','test+test+test','2--0-0-0-0-0-0-0--1','1'}
+
+-- load index (we could rease the original entry afterwards, freeing memory)
+
+-- index sorting
+
+sorters = sorters or { }
+sorters.index = sorters.index or { }
+sorters.index.data = sorters.index.data or { }
+
+do
+
+ function sorters.index.compare(a,b)
+ local result = 0
+ for i=1,3 do
+ if result == 0 then
+ result = sorters.comparers.basic(a,b,i)
+ else
+ return result
+ end
+ end
+ if a[1] ~= 's' then -- e/f/t
+ local page_a, page_b = a[3], b[3]
+ if page_a < page_b then
+ return -1
+ elseif page_a > page_b then
+ return 1
+ end
+ end
+ return 0
+ end
+
+ function sorters.index.prepare(data)
+ sorters.prepare(data,sorters.splitters.utf,3)
+ end
+
+ function sorters.index.sort(data)
+ sorters.sort(data,sorters.index.compare)
+ end
+
+ function sorters.index.unique(data)
+ sorters.unique(data)
+ end
+
+ function sorters.index.cleanup(data)
+ sorters.cleanup(data)
+ end
+
+ function sorters.index.finalize(data)
+ local split = { }
+ for k,v in ipairs(data) do
+ local entry, tag = v[2][1][3][1], ""
+ local se = sorters.entries[sorters.language]
+ if se and se[entry] then
+ if type(se[entry]) == "number" then
+ entry = se[entry]
+ end
+ tag = se[entry]
+ else
+ entry = 0
+ tag = "unknown"
+ end
+ split[entry] = split[entry] or { tag = tag, data = { } }
+ split[entry].data[#split[entry].data+1] = v
+ end
+ return split
+ end
+
+--~ local template = {
+--~ page = "\\pageentry{%s}{%s}{%s}{%s}",
+--~ start = {
+--~ [0] = "\\startletter{%s}",
+--~ [1] = "\\startentry{%s}",
+--~ [2] = "\\startsubentry{%s}",
+--~ [3] = "\\startsubsubentry{%s}"
+--~ },
+--~ stop = {
+--~ [0] = "\\stopletter",
+--~ [1] = "\\stopentry",
+--~ [2] = "\\stopsubentry",
+--~ [3] = "\\stopsubsubentry"
+--~ }
+--~ }
+
+--~ function sorters.index.flush(sorted,class,flush)
+--~ flush = flush or print
+--~ class = class or 'index'
+--~ local function flushpage(v)
+--~ flush(string.format(template.page,v[2],v[3] or "",v[4] or "",v[5] or ""))
+--~ end
+--~ for _,v in ipairs(table.sortedkeys(sorted)) do
+--~ local s = sorted[v]
+--~ flush(string.format(template.start[0],s.tag))
+--~ local done = { false, false, false }
+--~ for kk,vv in ipairs(s.data) do
+--~ if vv[1][1] then
+--~ local e = { false, false, false }
+--~ for i=1,3,1 do
+--~ if vv[1][i] then e[i] = vv[1][i][1] end
+--~ end
+--~ for i=3,1,-1 do
+--~ if done[i] and e[i] ~= done[i] then
+--~ flush(template.stop[i])
+--~ end
+--~ end
+--~ for i=1,3,1 do
+--~ if e[i] ~= done[i] then
+--~ if e[i] and e[i] ~= "" then
+--~ done[i] = e[i]
+--~ flush(string.format(template.start[i],e[i]))
+--~ else
+--~ done[i] = false
+--~ end
+--~ end
+--~ end
+--~ flushpage(vv)
+--~ end
+--~ end
+--~ for i=3,1,-1 do
+--~ if done[i] then flush(template.stop[i]) end
+--~ end
+--~ flush(template.stop[0])
+--~ end
+--~ end
+
+ -- \registerpage{index}{,}{6}{2--0-0-0-0-0-0-0--1}{1}
+
+ -- for the moment we use the old structure, some day mmiv code
+ -- will be different: more structure, less mess
+
+ local template = {
+ page = "\\registerpage{%s}{%s}{%s}{%s}{%s}",
+ letter = "\\registerentry{%s}{%s}",
+ entry = {
+ "\\registerentrya{%s}{%s}",
+ "\\registerentryb{%s}{%s}",
+ "\\registerentryc{%s}{%s}",
+ },
+ }
+
+ function sorters.index.flush(sorted,class,flush)
+ flush = flush or print
+ class = class or 'index'
+ for k,v in ipairs(table.sortedkeys(sorted)) do
+ local s = sorted[v]
+ flush(string.format(template.letter,class,s.tag))
+ local done = { false, false, false }
+ for kk,vv in ipairs(s.data) do
+ if vv[2][1] then
+ local e = { false, false, false }
+ for i=1,3,1 do
+ if vv[2][i] then
+ e[i] = vv[2][i][1]
+ end
+ if e[i] ~= done[i] then
+ if e[i] and e[i] ~= "" then
+ done[i] = e[i]
+ flush(string.format(template.entry[i],class,e[i]))
+ else
+ done[i] = false
+ end
+ end
+ end
+ if vv[1] == 'e' then
+ -- format reference pagespec realpage
+ flush(string.format(template.page,class,",",vv[4],vv[5],vv[3]))
+ end
+ end
+ end
+ end
+ end
+
+ function sorters.index.process(data)
+ return sorters.process('index',data)
+ end
+
+end
+
+-- { { entry, key }, { entry, key }, { entry, key } }, kind, realpage|see, reference, pagespec
+
+function job.loadregister(class)
+ if job.registers[class] then
+ if not sorters.index.data[class] then
+ sorters.index.data[class] = {
+ language = 'en',
+ entries = { },
+ flush = function(s) tex.sprint(tex.ctxcatcodes,s) end,
+ sorted = false,
+ class = class
+ }
+ local entries = sorters.index.data[class].entries
+ for k,v in ipairs(job.registers[class]) do
+ if v[1] == 'l' then -- language
+ sorters.index.data[class].language = v[2]
+ else
+ local key, entry = v[3], v[4]
+ if type(entry) == 'string' then
+ entry = entry:splitchr('+')
+ end
+ if type(key) == 'string' then
+ key = key:splitchr('+')
+ end
+ entries[#entries+1] = {
+ v[1], -- kind (e, f, t, s)
+ {
+ { entry[1] or "", key[1] or "" },
+ { entry[2] or "", key[2] or "" },
+ { entry[3] or "", key[3] or "" }
+ },
+ v[6], -- realpage or seeword (check see)
+ v[2], -- reference
+ v[5], -- pagespec
+ }
+ end
+ end
+ end
+ -- maybe we should also save the register result stream
+ sorters.index.process(sorters.index.data[class])
+ end
+end
diff --git a/tex/context/base/core-reg.mkiv b/tex/context/base/core-reg.mkiv
new file mode 100644
index 000000000..d7dc9a9cb
--- /dev/null
+++ b/tex/context/base/core-reg.mkiv
@@ -0,0 +1,57 @@
+%D \module
+%D [ file=core-reg,
+%D version=2007.05.07,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Register Management,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{core-reg}{1.001}
+
+\appendtoks
+ \immediatewriteutilitytua{if not job.registers then job.registers = { } end}%
+ \immediatewriteutilitytua{local jr = job.registers}%
+\to \everyopenutilities
+
+\let\allregisters\empty
+
+\appendtoks
+ \processcommacommand[\allregisters]\mkdodefineregister
+ \globallet\allregisters\empty
+\to \everyopenutilities
+
+\def\mkdodefineregister#1% class
+ {\ctxlua{job.defineregister('#1')}%
+ \immediatewriteutilitytua{job.defineregister('#1')}}
+
+\def\mkdefineregister#1% class
+ {\mkdodefineregister{#1}%
+ \doglobal\addtocommalist{#1}\allregisters}
+
+\def\mksaveregisterentry#1#2#3#4#5#6#7% class type reference key entry pagespec realpage
+ {\expanded{\writeutilitytua{table.insert(jr['#1'],{'#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7'})}}}
+
+\def\mksaveregistersee#1#2#3#4#5#6#7% class type reference key entry see pagespec
+ {\expanded{\writeutilitytua{table.insert(jr['#1'],{'#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7'})}}}
+
+\def\mksaveregistervariable#1#2#3% class type value
+ {\expanded{\immediatewriteutilitytua{table.insert(jr['#1'],{'#2','#3'})}}}
+
+% Beware, we have no filename support here. For that we need to save the resulting
+% tex code in a file. No big deal.
+
+\def\mkloadregister#1% class, todo: loader macro just like mkii
+ {\bgroup
+ \getvalue{\s!set#1}%
+ \ctxlua{job.loadregister('#1')}\par % par needed for hanging indentation
+ \getvalue{\s!reset#1}%
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/core-sec.tex b/tex/context/base/core-sec.tex
index 467b0cf50..b92fbb21c 100644
--- a/tex/context/base/core-sec.tex
+++ b/tex/context/base/core-sec.tex
@@ -1416,6 +1416,9 @@
\def\headparameter#1% to do: everywhere in core-sec
{\executeifdefined{\??ko\currenthead#1}\empty}
+% todo: write to list etc in both args or in enclosing h/vbox else it gets
+% lost when no #1 or #2 is typeset
+
\def\dodododoconstructhead#1[#2]#3#4% [ref] {number} {title}
{\def\currenthead{#1}% dus #1 overal vervangen
\let\finalsectionnumber\dofinalsectionnumber % overloaded ungrouped -)
diff --git a/tex/context/base/core-spa.lua b/tex/context/base/core-spa.lua
new file mode 100644
index 000000000..c6090ab13
--- /dev/null
+++ b/tex/context/base/core-spa.lua
@@ -0,0 +1,526 @@
+if not modules then modules = { } end modules ['core-spa'] = {
+ version = 1.001,
+ comment = "companion to core-spa.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+do
+
+ local glyph, disc, kern, glue, hlist, vlist = node.id('glyph'), node.id('disc'), node.id('kern'), node.id('glue'), node.id('hlist'), node.id('vlist')
+
+ local kernnode = node.new('kern')
+ local stretch = attributes.numbers['kern-chars'] or 141
+
+ function nodes.kern_chars(head)
+ local fti, scale, has_attribute = fonts.tfm.id, tex.scale, node.has_attribute
+ local fnt, pchar, pfont, p, n = nil, nil, nil, nil, head
+-- local marks = fti[font].shared.otfdata.luatex.marks
+ while n do
+ local id = n.id
+ local extra = has_attribute(n,stretch)
+ if id == glyph then
+ if pfont == n.font then
+ -- check for mark
+ local tchar = n.char
+-- if not marks[tchar] then
+ local pdata = fti[pfont].characters[pchar]
+ local pkern = pdata.kerns
+ if pkern and pkern[tchar] then
+ local k = node.copy(kernnode)
+ if extra then
+ k.kern = pkern[tchar] + extra
+ if p.id == disc then
+ p.replace = p.replace + 1
+ end
+ else
+ k.kern = pkern[tchar]
+ end
+ k.attr = n.attr
+ k.next = p.next
+ p.next = k
+ elseif extra then
+ local k = node.copy(kernnode)
+ k.kern = extra
+ k.attr = n.attr
+ k.next = p.next
+ p.next = k
+ if p.id == disc then
+ p.replace = p.replace + 1
+ end
+-- end
+ end
+ else
+ pfont, pchar = n.font, n.char
+ end
+ elseif id == disc then
+ local pre, post = n.pre, n.post
+ if pre then
+ local nn, pp = p.prev, p.next
+ p.prev, p.next = nil, pre -- hijack node
+ pre = nodes.kern_chars(p)
+ pre = pre.next
+ pre.prev = nil
+ p.prev, p.next = nn, pp
+ n.pre = pre
+ end
+ if post and n.next then
+ local tail = node.slide(post)
+ local nn, pp = n.next.prev, n.next.next
+ n.next.next, n.next.prev = nil, tail
+ tail.next = n.next -- hijack node
+ post = nodes.kern_chars(post)
+ tail.next = nil
+ n.next.prev, n.next.next = nn, pp
+ n.post = post
+ end
+ if n.next and n.next.id == glyph then
+ local tchar = n.next.char
+ local pdata = fti[pfont].characters[pchar]
+ local pkern = pdata.kerns
+ if pkern and pkern[tchar] then
+ local k = node.copy(kernnode)
+ if extra then
+ k.kern = pkern[tchar] + extra
+ else
+ k.kern = pkern[tchar]
+ end
+ k.attr = n.attr
+ k.next = n.next
+ n.next = k
+ n.replace = n.replace + 1
+ n = n.next
+ end
+ end
+ else
+ pfont = nil
+ if extra then
+ if id == glue and n.subtype == 0 then
+ local g = n.spec
+ if g.width > 0 then
+ g = node.copy(g)
+ n.spec = g
+ local w = g.width
+ g.width = w + 2*extra
+ local f = g.width/w
+ g.stretch = scale(g.stretch,f)
+ g.shrink = scale(g.shrink, f)
+ end
+ elseif id == kern and n.subtype == 0 then
+ if n.width > 0 then
+ n.width = n.width + extra
+ end
+ elseif id == hlist or id == vlist then
+ if n.width > 0 then -- else parindent etc
+ if p then
+ local k = node.copy(kernnode)
+ k.kern = extra
+ k.attr = n.attr
+ k.next = n
+ k.prev = p
+ p.next = k
+ n.prev = k
+ end
+ if n.next then
+ local k = node.copy(kernnode)
+ k.kern = extra
+ k.attr = n.attr
+ k.next = n.next
+ k.prev = n
+ n.prev = k
+ n.next = k
+ p = k
+ n = n.next
+ end
+ end
+ end
+ end
+ end
+ n.prev = p
+ p = n
+ n = n.next
+ end
+ return head, p
+ end
+
+end
+
+-- vertical space handler
+
+nodes.snapvalues = { }
+
+function nodes.setsnapvalue(n,ht,dp)
+ nodes.snapvalues[n] = { ht, dp, ht+dp }
+end
+
+do
+
+ nodes.trace_collapse = false
+
+ local kern, glue, penalty, hlist = node.id('kern'), node.id('glue'), node.id('penalty'), node.id('hlist')
+
+ local penalty_node = node.new('penalty')
+
+ local has_attribute = node.has_attribute
+ local has_field = node.has_field
+
+ local trace_list = { }
+
+ local function reset_tracing()
+ trace_list = { }
+ end
+ local function trace_skip(str,sc,so,sp,data)
+ trace_list[#trace_list+1] = string.format("%s %8s %8s %8s %8s", str:padd(8), data.spec.width, sc or "-", so or "-", sp or "-")
+ end
+ local function trace_done(str,data)
+ if data.id == penalty then
+ trace_list[#trace_list+1] = string.format("%s %8s penalty", str:padd(8), data.penalty)
+ else
+ trace_list[#trace_list+1] = string.format("%s %8s glue", str:padd(8), data.spec.width)
+ end
+ end
+ local function show_tracing()
+ texio.write_nl(table.concat(trace_list,"\n"))
+ end
+
+ -- we assume that these are defined
+
+ local skip_category = attributes.numbers['skip-category'] or 101
+ local skip_penalty = attributes.numbers['skip-penalty'] or 102
+ local skip_order = attributes.numbers['skip-order'] or 103
+ local snap_category = attributes.numbers['snap-category'] or 111
+ local display_math = attributes.numbers['display-math'] or 121
+
+ -- alignment box begin_of_par vmode_par hmode_par insert penalty before_display after_display
+
+ function nodes.is_display_math(head)
+ n = head.prev
+ while n do
+ local id = n.id
+ if id == penalty then
+ elseif id == glue then
+ if n.subtype == 6 then
+ return true
+ end
+ else
+ break
+ end
+ n = n.prev
+ end
+ n = head.next
+ while n do
+ local id = n.id
+ if id == penalty then
+ elseif id == glue then
+ if n.subtype == 7 then
+ return true
+ end
+ else
+ break
+ end
+ n = n.next
+ end
+ return false
+ end
+
+ -- helpers
+
+ function nodes.snapline(current,where)
+ local sn = has_attribute(current.list,snap_category)
+ if sn then
+ local sv = nodes.snapvalues[sn]
+ if sv then
+ local height, depth, lineheight = sv[1], sv[2], sv[3]
+ current.height = math.ceil((current.height-height)/lineheight)*lineheight + height
+ current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth
+ end
+ end
+ end
+
+ function collapser(head,where)
+ if head then
+ local trace = nodes.trace_collapse
+ local current, tail = head, nil
+ local glue_order, glue_data = 0, nil
+ local penalty_order, penalty_data, natural_penalty = 0, nil, nil
+ if trace then reset_tracing() end
+ while current do
+ local id = current.id
+ if id == glue and current.subtype == 0 then -- todo, other subtypes, like math
+ local sc = has_attribute(current,skip_category)
+ local so = has_attribute(current,skip_order ) or 1
+ local sp = has_attribute(current,skip_penalty )
+ if not sc then
+ if glue_data then
+ if trace then trace_done("before",glue_data) end
+ head, current = nodes.before(head,current,glue_data)
+ end
+ if trace then trace_skip("natural",sc,so,sp,current) end
+ glue_order, glue_data = 0, nil
+ current = current.next
+ elseif sc < 1 or sc > 4 then -- 0 = discard, > 3 = unsupported
+ if trace then trace_skip("ignore",sc,so,sp,current) end
+ head, current = nodes.remove(head, current, true)
+ else
+ if sp then
+ if not penalty_data then
+ penalty_data = sp
+ elseif penalty_order < so then
+ penalty_order, penalty_data = so, sp
+ elseif penalty_order == so and sp > penalty_data then
+ penalty_data = sp
+ end
+ end
+ if not glue_data then
+ if trace then trace_skip("assign",sc,so,sp,current) end
+ glue_order = so
+ head, current, glue_data = nodes.remove(head, current)
+ elseif glue_order < so then
+ if trace then trace_skip("force",sc,so,sp,current) end
+ glue_order = so
+ node.free(glue_data)
+ head, current, glue_data = nodes.remove(head, current)
+ elseif glue_order == so then
+ if sc == 1 then
+ if current.spec.width > glue_data.spec.width then
+ if trace then trace_skip("larger",sc,so,sp,current) end
+ node.free(glue_data)
+ head, current, glue_data = nodes.remove(head, current)
+ else
+ if trace then trace_skip("smaller",sc,so,sp,current) end
+ head, current = nodes.remove(head, current, true)
+ end
+ elseif sc == 2 then
+ if trace then trace_skip("force",sc,so,sp,current) end
+ node.free(glue_data)
+ head, current, glue_data = nodes.remove(head, current)
+ elseif sc == 3 then
+ if trace then trace_skip("penalty",sc,so,sp,current) end
+ node.free(glue_data)
+ head, current = nodes.remove(head, current, true)
+ elseif sc == 4 then
+ if trace then trace_skip("add",sc,so,sp,current) end
+ local old, new = glue_data.spec, current.spec
+ old.width = old.width + new.width
+ old.stretch = old.stretch + new.stretch
+ old.shrink = old.shrink + new.shrink
+ head, current = nodes.remove(head, current, true)
+ else
+ if trace then trace_skip("unknown",sc,so,sp,current) end
+ head, current = nodes.remove(head, current, true)
+ end
+ else
+ if trace then trace_skip("unknown",sc,so,sp,current) end
+ head, current = nodes.remove(head, current, true)
+ end
+ end
+ -- elseif id == penalty then
+ -- natural_penalty = current.penalty
+ -- head, current = nodes.remove(head, current, true)
+ elseif id == glue and current.subtype == 2 then
+ local sn = has_attribute(current,snap_category)
+ if sn then
+ -- local sv = nodes.snapvalues[sn]
+ -- if sv then
+ head, current = nodes.remove(head, current, true)
+ -- else
+ -- current = current.next
+ -- end
+ else
+ current = current.next
+ end
+ else
+ if glue_data then
+ head, current = nodes.before(head,current,glue_data)
+ if trace then trace_done("before",glue_data) end
+ glue_order, glue_data = 0, nil
+ end
+ if id == hlist and where == 'hmode_par' and current.list then
+ nodes.snapline(current,where) -- will be inline later
+ end
+ current = current.next
+ end
+ tail = current
+ end
+ -- if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then
+ -- penalty_data = natural_penalty
+ -- end
+ if penalty_data then
+ local p = node.copy(penalty_node)
+ p.penalty = penalty_data
+ if trace then trace_done("before",p) end
+ head, head = nodes.before(head,head,p)
+ end
+ if glue_data then
+ if trace then trace_done("after",glue_data) end
+ head, tail = nodes.after(head,tail,glue_data)
+ end
+ if trace then show_tracing() end
+ end
+ return head
+ end
+
+ local head, tail = nil, nil
+
+ function nodes.flush_vertical_spacing()
+ input.start_timing(nodes)
+ if head then
+ t = collapser(head)
+ head = nil
+ -- tail = nil
+ else
+ t = nil
+ end
+ input.stop_timing(nodes)
+ return t
+ end
+
+ function nodes.handle_page_spacing(t, where)
+ -- we need to add the latest t too, else we miss skips and such
+ if t then
+ local tt = node.slide(t)
+ local id = tt.id
+ if id == glue then -- or id == penalty then -- or maybe: if not hlist or vlist
+ if head then
+ t.prev = tail
+ tail.next = t
+ else
+ head = t
+ end
+ tail = tt
+ t = nil
+ else
+ input.start_timing(nodes)
+ if head then
+ t.prev = tail
+ tail.next = t
+ -- tail = tt
+ t = collapser(head,where)
+ head = nil
+ -- tail = nil
+ else
+ t = collapser(t,where)
+ end
+ input.stop_timing(nodes,where)
+ end
+ end
+ return t
+ end
+
+ function nodes.handle_vbox_spacing(t)
+ local tail = node.slide(t)
+ return collapser(t,'whole')
+ end
+
+end
+
+-- experimental!
+
+callback.register('vpack_filter', nodes.handle_vbox_spacing)
+callback.register('buildpage_filter', nodes.handle_page_spacing)
+
+-- educational: snapper
+
+--~ function demo_snapper(head,where) -- snap_category 105 / nodes.snapvalue = { [1] = { 8*65536, 4*65536, 12*65536 } }
+--~ if head then
+--~ local current, tail, dummy = head, nil, nil
+--~ while current do
+--~ local id = current.id
+--~ if id == glue and current.subtype == 2 then
+--~ local sn = has_attribute(current,snap_category)
+--~ if sn then
+--~ local sv = nodes.snapvalues[sn]
+--~ if sv then
+--~ head, current, dummy = node.delete(head, current)
+--~ node.free(dummy)
+--~ else
+--~ current = current.next
+--~ end
+--~ else
+--~ current = current.next
+--~ end
+--~ else
+--~ if id == hlist and where == 'hmode_par' and current.list then
+--~ local sn = has_attribute(current.list,snap_category)
+--~ if sn then
+--~ local sv = nodes.snapvalues[sn]
+--~ if sv then
+--~ local height, depth, lineheight = sv[1], sv[2], sv[3]
+--~ current.height = math.ceil((current.height-height)/lineheight)*lineheight + height
+--~ current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth
+--~ end
+--~ end
+--~ end
+--~ current = current.next
+--~ end
+--~ tail = current
+--~ end
+--~ end
+--~ return head
+--~ end
+
+--~ callback.register('buildpage_filter', demo_snapper)
+
+ --~ function nodes.kern_chars(head)
+ --~ local fti = fonts.tfm.id
+ --~ local fnt, pchar, pfont, p, n = nil, nil, nil, nil, head
+ --~ while n do
+ --~ local id = n.id
+ --~ if id == glyph then
+ --~ if pfont == n.font then
+ --~ local tchar = n.char
+ --~ local pdata = fti[pfont].characters[pchar]
+ --~ local pkern = pdata.kerns
+ --~ if pkern and pkern[tchar] then
+ --~ local k = node.copy(kernnode)
+ --~ k.kern = pkern[tchar]
+ --~ k.attr = n.attr
+ --~ k.next = p.next
+ --~ p.next = k
+ --~ -- texio.write_nl(string.format("KERN = %s %s %s",utf.char(pchar), utf.char(tchar), pkern[tchar]))
+ --~ end
+ --~ else
+ --~ pfont, pchar = n.font, n.char
+ --~ end
+ --~ elseif id == disc then
+ --~ if pre then
+ --~ local nn, pp = p.prev, p.next
+ --~ p.prev, p.next = nil, pre -- hijack node
+ --~ pre = nodes.kern_chars(p)
+ --~ pre = pre.next
+ --~ pre.prev = nil
+ --~ p.prev, p.next = nn, pp
+ --~ n.pre = pre
+ --~ end
+ --~ if post then
+ --~ local tail = node.slide(post)
+ --~ local nn, pp = n.next.prev, n.next.next
+ --~ n.next.next, n.next.prev = nil, tail
+ --~ tail.next = n.next -- hijack node
+ --~ post = nodes.kern_chars(post)
+ --~ tail.next = nil
+ --~ n.next.prev, n.next.next = nn, pp
+ --~ n.post = post
+ --~ end
+ --~ local tchar = n.next.char
+ --~ local pdata = fti[pfont].characters[pchar]
+ --~ local pkern = pdata.kerns
+ --~ if pkern and pkern[tchar] then
+ --~ local k = node.copy(kernnode)
+ --~ k.kern = pkern[tchar]
+ --~ k.attr = n.attr
+ --~ k.next = n.next
+ --~ n.next = k
+ --~ n.replace = n.replace + 1
+ --~ n = n.next
+ --~ end
+ --~ else
+ --~ pfont = nil
+ --~ end
+ --~ n.prev = p
+ --~ p = n
+ --~ n = n.next
+ --~ end
+ --~ return head, p
+ --~ end
diff --git a/tex/context/base/core-spa.mkiv b/tex/context/base/core-spa.mkiv
new file mode 100644
index 000000000..03d3c5595
--- /dev/null
+++ b/tex/context/base/core-spa.mkiv
@@ -0,0 +1,126 @@
+%D \module
+%D [ file=core-spa,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Spacing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Context Core Macros / Buffers}
+
+\unprotect
+
+% category:
+%
+% 0 == discard
+% 1 == only if larger
+% 2 == force even if smaller
+% 3 == only take penalty component
+% 4 == add to existing skip
+
+% penalty:
+%
+% larger wins
+
+% order:
+%
+% larger wins
+
+\defineattribute[kern-chars]
+
+\defineattribute[skip-category]
+\defineattribute[skip-penalty]
+\defineattribute[skip-order]
+
+\defineattribute[snap-category]
+
+\defineattribute[display-math]
+
+\registerctxluafile{core-spa}{1.001}
+
+% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop
+% \start \dosetstretch{.5em} effe flink doorfietsen \stop
+
+\def\dosetstretch#1% to be interfaces
+ {\relax\ifdim#1>\zeropoint
+ \dosetattribute{kern-chars}{\number\dimexpr#1\relax}%
+ \else
+ \doresetattribute{kern-chars}%
+ \fi}
+
+\appendtoks\doresetattribute{kern-chars}\to\everyforgetall
+
+\def\mksetupgridsnapping
+ {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}}
+
+\def\mkenablegridsnapping
+ {\dosetattribute{snap-category}{1}%
+ \topskip\strutht
+ \offinterlineskip}
+
+\def\mkdisablegridsnapping
+ {\doresetattribute{snap-category}%
+ % reset topskip
+ \oninterlineskip}
+
+\protect \endinput
+
+\starttext
+
+\dorecurse{2}{
+ $2^{2^{2^{2}}}$ $2_{2_{2_{2}}}^{2^{2^{2^{2^{2^{2^{2^{2^{2}}}}}}}}}$
+ \input tufte \inframed {tufte}
+ \par
+}
+
+\dorecurse{100} {
+
+ \kern \recurselevel pt
+
+ \vbox {
+ \endgraf \strut first \endgraf
+ {\dosetattribute{skip-category}{1}\vskip10pt}
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ {\dosetattribute{skip-category}{1}\vskip20pt}
+ {\dosetattribute{skip-category}{2}\vskip10pt}
+ \endgraf \strut second \endgraf
+ }
+
+ \endgraf \strut first \endgraf
+ {\dosetattribute{skip-category}{1}\vskip10pt}
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ {\dosetattribute{skip-category}{1}\vskip20pt}
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ \endgraf \strut second \endgraf
+
+ {\dosetattribute{skip-category}{0}\vskip10pt} % remove
+ {\dosetattribute{skip-category}{1}\vskip10pt} % take largest
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ {\dosetattribute{skip-category}{1}\vskip40pt}
+ {\dosetattribute{skip-category}{1}\dosetattribute{skip-order}{10}\vskip20pt}
+ {\dosetattribute{skip-category}{4}\dosetattribute{skip-order}{10}\vskip20pt}
+ {\dosetattribute{skip-category}{1}\vskip60pt}
+ {\dosetattribute{skip-category}{1}\vskip20pt}
+ {\dosetattribute{skip-category}{0}\vskip10pt}
+
+ third (no break after this)
+
+ {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip10pt}
+ {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip20pt}
+ {\dosetattribute{skip-category}{1}\vskip10pt}
+ {\dosetattribute{skip-category}{1}\vskip20pt}
+
+ fourth
+ \vskip10pt
+ fifth
+}
+
+\stoptext
diff --git a/tex/context/base/core-syn.lua b/tex/context/base/core-syn.lua
new file mode 100644
index 000000000..fc7b72b5d
--- /dev/null
+++ b/tex/context/base/core-syn.lua
@@ -0,0 +1,116 @@
+-- filename : core-syn.lua
+-- comment : companion to core-syn.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['core-syn'] = 1.001
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+if not job.sortedlists then job.sortedlists = { } end
+
+function job.definesortedlist(id)
+ if not job.sortedlists[id] then
+ job.sortedlists[id] = { }
+ end
+end
+
+sorters = sorters or { }
+sorters.list = sorters.list or { }
+sorters.list.data = sorters.list.data or { }
+
+do
+
+ function sorters.list.compare(a,b)
+ return sorters.comparers.basic(a,b,1)
+ end
+
+ function sorters.list.prepare(data)
+ sorters.prepare(data,sorters.splitters.utf,1)
+ end
+
+ function sorters.list.sort(data)
+ sorters.sort(data,sorters.list.compare)
+ end
+
+ function sorters.list.unique(data)
+ sorters.unique(data)
+ end
+
+ function sorters.list.cleanup(data)
+ sorters.cleanup(data)
+ end
+
+ function sorters.list.finalize(data)
+ -- we use the same splitter as with indices
+ local split = { }
+ for k,v in ipairs(data) do
+ local entry, tag = v[2][1][3][1], ""
+ local se = sorters.entries[sorters.language]
+ if se and se[entry] then
+ if type(se[entry]) == "number" then
+ entry = se[entry]
+ end
+ tag = se[entry]
+ else
+ entry = 0
+ tag = "unknown"
+ end
+ split[entry] = split[entry] or { tag = tag, data = { } }
+ split[entry].data[#split[entry].data+1] = v
+ end
+ return split
+ end
+
+ -- for the moment we use the old structure, some day mmiv code
+ -- will be different: more structure, less mess
+
+ local template = {
+ entry = "\\synonymentry{%s}{%s}{%s}{%s}"
+ }
+
+ function sorters.list.flush(sorted,class,flush)
+ -- for the moment we don't add split data (letters) yet
+ flush = flush or print
+ class = class or 'abbreviation'
+ for k,v in ipairs(table.sortedkeys(sorted)) do
+ for _, vv in ipairs(sorted[v].data) do
+ flush(string.format(template.entry,class,vv[2][1][1],vv[2][1][2],vv[3]))
+ end
+ end
+ end
+
+ function sorters.list.process(data)
+ return sorters.process('list',data)
+ end
+
+end
+
+-- { { entry, key } }, meaning
+
+function job.loadsortedlist(class)
+ if job.sortedlists[class] then
+ if not sorters.list.data[class] then
+ sorters.list.data[class] = {
+ language = 'en',
+ entries = { },
+ flush = function(s) tex.sprint(tex.ctxcatcodes,s) end,
+ sorted = false,
+ class = class
+ }
+ local entries = sorters.list.data[class].entries
+ for k,v in ipairs(job.sortedlists[class]) do
+ if v[1] == 'l' then -- language
+ sorters.list.data[class].language = v[2]
+ else
+ entries[#entries+1] = {
+ v[1], -- kind (e)
+ { { v[3], v[2] } }, -- entry, key
+ v[4] -- optional meaning
+ }
+ end
+ end
+ end
+ sorters.list.process(sorters.list.data[class])
+ end
+end
diff --git a/tex/context/base/core-syn.mkiv b/tex/context/base/core-syn.mkiv
new file mode 100644
index 000000000..8996940dd
--- /dev/null
+++ b/tex/context/base/core-syn.mkiv
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=core-syn,
+%D version=1997.03.31,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Synonyms and Sorts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{core-syn}{1.001}
+
+\appendtoks
+ \immediatewriteutilitytua{if not job.sortedlists then job.sortedlists = { } end}%
+ \immediatewriteutilitytua{local js = job.sortedlists}%
+\to \everyopenutilities
+
+\let\allsortedlists\empty
+
+\appendtoks
+ \processcommacommand[\allsortedlists]\mkdodefinesortedlist
+ \globallet\allsortedlists\empty
+\to \everyopenutilities
+
+\def\mkdodefinesortedlist#1% class
+ {\ctxlua{job.definesortedlist('#1')}%
+ \immediatewriteutilitytua{job.definesortedlist('#1')}}
+
+\def\mkdefinesortedlist#1% class
+ {\mkdodefinesortedlist{#1}%
+ \doglobal\addtocommalist{#1}\allsortedlists}
+
+\def\mksavesortedlistentry#1#2#3#4% class key entry meaning
+ {\immediatewriteutilitytua{table.insert(js['#1'],{'e','#1',\!!bs#2\!!es,\!!bs#3\!!es})}}
+
+\def\mksavesortedlistvariable#1#2#3% class type value
+ {\immediatewriteutilitytua{table.insert(js['#1'],{'#2','#3'})}}
+
+\def\mkloadsortedlist#1% class
+ {\bgroup
+ \getvalue{\s!set#1}%
+ \ctxlua{job.loadsortedlist('#1')}%
+ \getvalue{\s!reset#1}%
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv
new file mode 100644
index 000000000..0cef6c236
--- /dev/null
+++ b/tex/context/base/core-sys.mkiv
@@ -0,0 +1,23 @@
+%D \module
+%D [ file=core-sys,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=System,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startruntimeluacode
+ \ctxlua {
+ environment.inputfilename = "\inputfilename"
+ environment.outputfilename = "\outputfilename"
+ environment.jobfilename = "\jobfilename"
+ environment.jobfilesuffix = "\jobfilesuffix"
+ }
+\stopruntimeluacode
+
+\endinput
diff --git a/tex/context/base/core-two.lua b/tex/context/base/core-two.lua
new file mode 100644
index 000000000..45f1d0f46
--- /dev/null
+++ b/tex/context/base/core-two.lua
@@ -0,0 +1,83 @@
+if not modules then modules = { } end modules ['core-two'] = {
+ version = 1.001,
+ comment = "companion to core-two.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>We save multi-pass information in the main utility table.</p>
+--ldx]]--
+
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+if not job.twopass then job.twopass = { } end
+
+function job.definetwopassdata(id)
+ job.twopass[id] = job.twopass[id] or { }
+end
+
+function job.gettwopassdata(id)
+ local jti = job.twopass[id]
+ if jti and #jti > 0 then
+ tex.print(jti[1])
+ table.remove(jti,1)
+ end
+end
+
+function job.checktwopassdata(id)
+ local jti = job.twopass[id]
+ if jti and #jti > 0 then
+ tex.print(jti[1])
+ end
+end
+
+function job.getfromtwopassdata(id,n)
+ local jti = job.twopass[id]
+ if jti and jti[n] then
+ tex.print(jti[n])
+ end
+end
+
+job.findtwopassdata = job.getfromtwopassdata
+job.getfirstpassdata = job.checktwopassdata
+
+function job.getlasttwopassdata(id)
+ local jti = job.twopass[id]
+ if jti and #jti > 0 then
+ tex.print(jti[#jti])
+ end
+end
+
+function job.noftwopassitems(id)
+ local jti = job.twopass[id]
+ if jti then
+ tex.print(#jti)
+ else
+ tex.print('0')
+ end
+end
+
+function job.twopassdatalist(id)
+ local jti = job.twopass[id]
+ if jti then
+ tex.print(table.concat(jti,','))
+ end
+end
+
+function job.doifelseintwopassdata(id,str)
+ local jti = job.twopass[id]
+ if jti then
+ local found = false
+ for _, v in pairs(jti) do
+ if v == str then
+ found = true
+ break
+ end
+ end
+ cs.testcase(found)
+ else
+ cs.testcase(false)
+ end
+end
diff --git a/tex/context/base/core-two.mkiv b/tex/context/base/core-two.mkiv
new file mode 100644
index 000000000..bbe00be92
--- /dev/null
+++ b/tex/context/base/core-two.mkiv
@@ -0,0 +1,74 @@
+%D \module
+%D [ file=core-two, % moved from core-uti
+%D version=2006.09.24,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Two Pass Data,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{core-two}{1.001}
+
+\appendtoks
+ \immediatewriteutilitytua{if not job.twopass then job.twopass = { } end}%
+ \immediatewriteutilitytua{local tp = job.twopass}%
+\to \everyopenutilities
+
+\def\immediatesavetwopassdata #1#2#3{\expanded{\immediatewriteutilitytua{table.insert(tp['#1'],"#3")}}}
+\def\savetwopassdata #1#2#3{\expanded{\writeutilitytua {table.insert(tp['#1'],"#3")}}}
+\def\immediatesavetaggedtwopassdata#1#2#3#4{\expanded{\immediatewriteutilitytua{tp['#1']['#3']="#4"}}}
+\def\savetaggedtwopassdata #1#2#3#4{\expanded{\writeutilitytua {tp['#1']['#3']="#4"}}}
+
+% temp hack: needs a proper \starteverytimeluacode
+
+\def\dodefinetwopasslist#1%
+ {\ctxlua{job.definetwopassdata('#1')}%
+ \immediatewriteutilitytua{job.definetwopassdata('#1')}}
+
+\def\definetwopasslist#1%
+ {\dodefinetwopasslist{#1}%
+ \doglobal\addtocommalist{#1}\alltwopasslists}
+
+\appendtoks
+ \processcommacommand[\alltwopasslists]\dodefinetwopasslist
+ \globallet\alltwopasslists\empty
+\to \everyopenutilities
+
+\def\testtwopassdata
+ {\ifx\twopassdata\empty\twopassdatafoundfalse\else\twopassdatafoundtrue\fi}
+
+\def\gettwopassdata#1%
+ {\edef\twopassdata{\ctxlua{job.gettwopassdata("#1")}}\testtwopassdata}
+
+\def\checktwopassdata#1%
+ {\edef\twopassdata{\ctxlua{job.checktwopassdata("#1")}}\testtwopassdata}
+
+\def\findtwopassdata#1#2%
+ {\edef\twopassdata{\ctxlua{job.findtwopassdata("#1","#2")}}\testtwopassdata}
+
+\let\getfirsttwopassdata\checktwopassdata
+
+\def\getlasttwopassdata#1%
+ {\edef\noftwopassitems{\ctxlua{job.noftwopassitems("#1")}}%
+ \edef\twopassdata {\ctxlua{job.getlasttwopassdata("#1")}}%
+ \testtwopassdata}
+
+\def\getfromtwopassdata#1#2%
+ {\edef\twopassdata{\ctxlua{job.getfromtwopassdata("#1",#2)}}\testtwopassdata}
+
+\def\gettwopassdatalist
+ {\getnamedtwopassdatalist\twopassdatalist}
+
+\def\getnamedtwopassdatalist#1#2% \cs tag
+ {\edef#1{\ctxlua{job.twopassdatalist("#2")}}}
+
+\def\doifelseintwopassdata#1#2% tag dat
+ {\ctxlua{job.doifelseintwopassdata("#1","#2"))}}
+
+\protect \endinput
diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua
new file mode 100644
index 000000000..00811e528
--- /dev/null
+++ b/tex/context/base/core-uti.lua
@@ -0,0 +1,29 @@
+if not modules then modules = { } end modules ['core-uti'] = {
+ version = 1.001,
+ comment = "companion to core-uti.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>A utility file has always been part of <l n='context'/> and with
+the move to <l n='luatex'/> we also moved a lot of multi-pass info
+to a <l n='lua'/> table. Instead of loading a <l n='tex'/> based
+utility file under different setups, we now load a table once. This
+saves much runtime but at the cost of more memory usage.</p>
+--ldx]]--
+
+if not jobs then jobs = { } end
+if not job then jobs['main'] = { } end job = jobs['main']
+if not job.variables then job.variables = { } end
+
+--[[ldx--
+<p>Variables are saved using in the previously defined table and passed
+onto <l n='tex'/> using the following method. Of course one can also
+directly access the variable using a <l n='lua'/> call.</p>
+--ldx]]--
+
+function job.initializevariable(cs,value)
+ tex.sprint("\\xdef\\"..cs.."{"..value.."}")
+end
diff --git a/tex/context/base/core-uti.mkiv b/tex/context/base/core-uti.mkiv
new file mode 100644
index 000000000..6883f2227
--- /dev/null
+++ b/tex/context/base/core-uti.mkiv
@@ -0,0 +1,103 @@
+%D \module
+%D [ file=core-uti,
+%D version=2006.09.19,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Utility File Handling,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{core-uti}{1.001}
+
+%D We need a way to pass strings safely to \LUA\ without the
+%D need for tricky escaping. Compare:
+%D
+%D \starttyping
+%D \ctxlua {something("anything tricky can go here")}
+%D \ctxlua {something([\luastringsep[anything tricky can go here]\luastringsep])}
+%D \stoptyping
+
+\def\luastringsep{===} % this permits \typefile{self} otherwise nested b/e sep problems
+
+\edef\!!bs{[\luastringsep[}
+\edef\!!es{]\luastringsep]}
+
+%D We have a the following available as primitive so there is no need
+%D for it:
+%D
+%D \starttyping
+%D \long\edef\luaescapestring#1{\!!bs#1\!!es}
+%D \stoptyping
+
+%D Next we implement a few helpers:
+
+\newwrite\utility@tua
+
+\prependtoks
+ \def \writeutilitytua {\write\utility@tua}
+ \def\immediatewriteutilitytua{\immediate\write\utility@tua}
+\to \everyjob
+
+\let \writeutilitytua\gobbleoneargument
+\let\immediatewriteutilitytua\gobbleoneargument
+
+\appendtoks
+ \immediate\openout\utility@tua=\jobname.tua
+ \immediatewriteutilitytua{-- file\space\space\space: \jobname}%
+ \immediatewriteutilitytua{-- format\space: \contextformat}%
+ \immediatewriteutilitytua{-- stamp\space\space: \contextversion}%
+ \immediatewriteutilitytua{-- escape\space: \!!bs\space...\space\!!es}%
+ \immediatewriteutilitytua{-- version: \utilityversion}%
+ \immediatewriteutilitytua{}%
+ \immediatewriteutilitytua{do}%
+ \immediatewriteutilitytua{if job and job.version and not job.version == "\utilityversion" then return end}%
+ \immediatewriteutilitytua{if not job then job = { } end}%
+ \immediatewriteutilitytua{job.version = "\utilityversion"}%
+\to \everyopenutilities
+
+\appendtoks
+ \immediatewriteutilitytua{end}%
+ %immediate\closeout\utility@tua
+\to \everycloseutilities
+
+% The next file can be in lua or luc format:
+
+\appendtoks
+ \ctxlua { do
+ if not job then job = { } end
+ job.version = "\utilityversion"
+ local settings = loadfile("\jobname.tuc")
+ if settings then settings() end
+ end}%
+\to \everyjob
+
+% variables
+
+\appendtoks
+ \immediatewriteutilitytua{if not job.variables then job.variables = { } end}%
+\to \everyopenutilities
+
+\def\savecurrentvalue#1#2%
+ {\immediatewriteutilitytua{job.initializevariable("\strippedcsname#1","#2")}}
+
+% temp
+
+\let\thisisbytesequence\gobbleoneargument
+
+% wrong place but we need to have it someplace
+
+\appendtoks
+ \ctxlua{input.storage.dump()}%
+\to \everydump
+
+\appendtoks
+ \ctxlua{input.storage.finalize()}%
+\to \everyfinalizeluacode
+
+\protect \endinput
diff --git a/tex/context/base/core-ver.mkiv b/tex/context/base/core-ver.mkiv
new file mode 100644
index 000000000..01e46f925
--- /dev/null
+++ b/tex/context/base/core-ver.mkiv
@@ -0,0 +1,207 @@
+%D \module
+%D [ file=core-ver,
+%D version=2000.10.13,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Verbatim,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\def\mksetupprettiesintype
+ {\begingroup
+ \lowercasestring verb-\prettyidentifier\to\filename
+ \doonlyonce\filename{\ctxluafileload\filename\empty}%
+ \endgroup}
+
+% todo: obeytabs|spaces|lines|pages
+
+\def\mksetupprettytype % todo check
+ {\processingverbatimtrue % will move
+ \ctxlua{buffers.doifelsevisualizer("\prettyidentifier")}
+ {\ctxlua{buffers.setvisualizer("\prettyidentifier")}%
+ \localcolortrue % tricky, maybe not here
+ \def\obs{\obeyedspace}%
+ \def\bop{\bgroup\beginofpretty}%
+ \def\eop{\endofpretty\egroup}%
+ \def\sop{\endofpretty\egroup\bgroup\beginofpretty}}
+ {\def\obs{\obeyedspace}}}
+
+\def\mkinitializeverbatim
+ {\ctxlua{buffers.visualizers.reset()}%
+ \def\obs{\obeyedspace}%
+ \verbatimfont
+ \obeycharacters}
+
+% \ctxluafileload{verb-tex}{}
+% \ctxluafileload{verb-mp} {}
+
+% \registerctxluafile{core-buf-tex}{}
+% \registerctxluafile{core-buf-mp} {}
+
+% \def\mktype#1%
+% {\bgroup
+% \begstrut % new, enables leading space in \type { abc } at par start
+% \let\currenttypingclass\??ty
+% \edef\currenttyping{#1}%
+% \initializetype % probably too much
+% \verbatimcolor
+% \setcatcodetable \vrbcatcodes
+% \catcode`\{=\plusone
+% \catcode`\}=\plustwo
+% \dodotype}
+
+% \def\dodotype#1%
+% {\obeycharacters % everyinitializeverbatim
+% \ctxlua{buffers.hooks.flush_line(\!!bs\detokenize{#1}\!!es)}%
+% \egroup}
+
+\let\mksetupslantedtype \relax
+
+\def\mksetupcommandsintype% can also be \string\
+ {\ctxlua{
+ buffers.visualizers.enableescape = true
+ buffers.visualizers.escapetoken = \!!bs\typingparameter\c!escape\!!es
+ }%
+ \setevalue{\typingparameter\c!escape}{\typingparameter\c!escape}}
+
+\def\mktype#1% was \dotype
+ {\bgroup
+ \begstrut % new, enables leading space in \type { abc } at par start / begstrut else no hyphenation
+ \let\currenttypingclass\??ty
+ \edef\currenttyping{#1}%
+ \catcode`\<=\@@other
+ \catcode`\>=\@@other
+ \futurelet\next\dodotype}
+
+\def\dodotype
+ {\ifx\next\bgroup
+ \@EA\dodotypeA
+ \else\if\next<%
+ \doifelse{\typingparameter\c!option}\v!none
+ {\@EAEAEA\dodotypeB}{\@EAEAEA\dodotypeC}%
+ \else
+ \@EAEAEA\dodotypeD
+ \fi\fi}
+
+\def\dodotypeA
+ {\initializetype % probably too much
+ \verbatimcolor
+ \setcatcodetable \vrbcatcodes
+ \catcode`\{=\plusone
+ \catcode`\}=\plustwo
+ \dodotypeAA}
+
+\def\dodotypeAA#1%
+ {\mkinitializeverbatim
+\def\obs{\obeyedspace}%
+ \ctxlua{buffers.hooks.flush_line(\!!bs\detokenize{#1}\!!es)}%
+ \egroup}
+
+\def\dodotypeB#1%
+ {\initializetype
+ \verbatimcolor
+ \setcatcodetable \vrbcatcodes
+ \catcode`\<=\plusone
+ \catcode`\>=\plustwo
+ \dodotypeBB}
+
+\def\dodotypeBB#1%
+ {\mkinitializeverbatim
+ \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,false)}%
+ \egroup
+ \gobbleoneargument} % grab last >
+
+\def\dodotypeC#1%
+ {\initializetype
+ \verbatimcolor
+ \setcatcodetable \vrbcatcodes
+ \catcode`\<=\plusone
+ \catcode`\>=\plustwo
+ \dodotypeCC}
+
+\def\dodotypeCC#1%
+ {\mkinitializeverbatim
+ \ifx\obeycharacters\setupprettytype % temp hack, we need a proper signal
+ \ctxlua{buffers.hooks.flush_line([\!!bs\detokenize{#1}\!!es,true)}%
+ \else
+ \def\obs{\obeyedspace}%
+ \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,true)}%
+ \fi
+ \egroup
+ \gobbleoneargument} % grab last >
+
+\def\dodotypeD#1%
+ {\initializetype
+ \verbatimcolor
+ \setcatcodetable \vrbcatcodes
+ \def\dodotypeDD##1#1{\dodotypeAA{##1}}%
+ \dodotypeDD}
+
+\def\dodotypeDD#1%
+ {\mkinitializeverbatim
+ \ctxlua{buffers.hooks.flush_line(\!!bs\detokenize{#1}\!!es,true)}%
+ \egroup
+ \gobbleoneargument} % grab last >
+
+% \typing:
+
+\def\mktypeblockverbatim#1#2%
+ {\dowithbuffer{_typing_}{#1}{#2}
+ {}
+ {\mkinitializeverbatim
+ \beginofverbatimlines
+ \ctxlua{buffers.type("_typing_")}%
+ \endofverbatimlines
+ \getvalue{\strippedcsname#2}}}
+
+% \typefile:
+
+\def\mktypefileverbatim
+ {\mkinitializeverbatim
+ \ctxlua{buffers.typefile("\readfilename")}}
+
+\def\mktypefilelinesverbatim#1#2%
+ {#1%
+ \mkinitializeverbatim
+ \ctxlua{buffers.typefile("\readfilename")}%
+ #2}
+
+% patched from verb-ini (todo)
+
+\let\beginverbatimline \relax
+\let\endverbatimline \relax
+\let\doopenupverbatimline\empty
+
+\def\doverbatimbeginofline#1% linenumber
+ {\bgroup % due to pretty status
+ \iflinepar\else\EveryPar{}\fi
+ \dontleavehmode % \leavevmode
+ \xdef\dokeepverbatimlinedata % hm, still needed?
+ {\parindent \the\parindent
+ \hangindent\the\hangindent
+ \hangafter \the\hangafter
+ \leftskip \the\leftskip
+ \rightskip \the\rightskip}%
+ \egroup
+ \dokeepverbatimlinedata
+ \doopenupverbatimline
+ \the\everyline\strut
+ \beginverbatimline}
+
+\def\doverbatimendofline
+ {\endverbatimline
+ \global\lineparfalse
+ \obeyedline\par}
+
+\def\doverbatimemptyline
+ {\strut
+ \par
+ \global\linepartrue}
+
+\protect \endinput
diff --git a/tex/context/base/core-ver.tex b/tex/context/base/core-ver.tex
index 8623dffef..259d018a6 100644
--- a/tex/context/base/core-ver.tex
+++ b/tex/context/base/core-ver.tex
@@ -293,7 +293,7 @@
\def\obeyhyphens
{\def\obeyedspace {\hskip\interwordspace}% better than spaceskip
- \def\controlspace{\hskip\zeropoint\hbox{\char32}\hskip\zeropoint}%
+ \def\controlspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint}%
\spaceskip.25em\relax} % hm a bit of stretch !
\def\obeybreakpoints
@@ -302,7 +302,7 @@
\def\ignorehyphens
{\def\obeyedspace {\null\hskip\interwordspace\null}% better than spaceskip
- \def\controlspace{\null\hskip\zeropoint\hbox{\char32}\hskip\zeropoint\null}%
+ \def\controlspace{\null\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\null}%
\spaceskip.5em\relax}
\unexpanded\def\typ
diff --git a/tex/context/base/enco-def.tex b/tex/context/base/enco-def.tex
index c111b6c44..9511f0f58 100644
--- a/tex/context/base/enco-def.tex
+++ b/tex/context/base/enco-def.tex
@@ -895,4 +895,20 @@
\stopencoding
+%D Goodie (makes more sense):
+
+\def\normalcontrolspace
+ {\getglyph{ComputerModernMono}{\char32}}
+
+\def\fakedcontrolspace % can be virtual in luatex
+ {\dontleavehmode\hbox
+ {\scratchdimen.1ex%
+ \kern\scratchdimen
+ \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
+ \vrule \!!width\dimexpr.5em-4\scratchdimen\relax \!!height-2\scratchdimen \!!depth3\scratchdimen
+ \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen
+ \kern\scratchdimen}}
+
+\def\fakecontrolspace{\let\normalcontrolspace\fakedcontrolspace}
+
\endinput
diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv
new file mode 100644
index 000000000..a676c46aa
--- /dev/null
+++ b/tex/context/base/enco-ini.mkiv
@@ -0,0 +1,69 @@
+%D \module
+%D [ file=enco-ini,
+%D version=2007.02.19,
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D In the end we will cleanup enco-ini.tex!
+
+\unprotect
+
+% could also be a new kind of table \definecharacter {name} {char} {fallback}
+
+\startruntimectxluacode
+ characters.context.rehash()
+\stopruntimectxluacode
+
+\ctxlua { characters.context.define() } % redefines all \characters
+
+\useencoding[032,033,037] % fallbacks for some unicode chars, todo
+
+\setupencoding[\s!default=ec] % for the moment keep it this way, till fonts are there
+
+\protect \endinput
+
+When dealing with characters we have four cases to take into account when moving
+from mkii to mkiv:
+
+1. <byte 200> => ref to slot 200 in current font
+2. \char 200 => ref to slot 200 in current font
+3. <active 200> => can (e.g.) map to another slot in current font
+4. \namedglyph => can map to some slot in some font
+
+Using case 2 for special characters is doomed to fail because we are not going
+to intercept these on the fly as happens automatically with traditional font
+encoding handling. We could do that in a node pass but it's not worth the effort
+because we seldom use this case in a document source.
+
+We can consider using utf as internal format for mkii. The main reason for not
+doing this before was that it was slow. On the other hand, it would make dealing
+with utility files easier.
+
+These are the only cases where char references are used:
+
+enco-def.tex : 46 : \definecharacter dotlessi {\char"10 }
+enco-def.tex : 47 : \definecharacter dotlessj {\char"11 }
+enco-def.tex : 54 : \definecharacter aeligature {\char26 } % "1A
+enco-def.tex : 55 : \definecharacter AEligature {\char29 } % "1D
+enco-def.tex : 58 : \definecharacter oeligature {\char27 } % "1B
+enco-def.tex : 59 : \definecharacter OEligature {\char30 } % "1E
+enco-def.tex : 61 : \definecharacter ssharp {\char25 } % "19
+enco-def.tex : 336 : \definecharacter Lstroke {\hsmash{\char32}L}
+enco-def.tex : 337 : \definecharacter lstroke {\hsmash{\char32}l}
+enco-def.tex : 338 : \definecharacter Ostroke {\char31 } % "1F
+enco-def.tex : 339 : \definecharacter ostroke {\char28 } % "1C
+enco-il2.tex : 147 : {\dontleavehmode{\char32l}}
+enco-il2.tex : 152 : \hbox to\wd0{\hss\char32L}%
+symb-eur.tex : 37 : \definesymbol [euro] [\getglyph{Euro}{\char160}]
+symb-glm.tex : 61 : \definesymbol [xleftguillemot] [\getglyph{Guil}{\char19}]
+symb-glm.tex : 62 : \definesymbol [xrightguillemot] [\getglyph{Guil}{\char20}]
+symb-glm.tex : 64 : \definesymbol [xguilsingleleft] [\getglyph{Guil}{\char14}]
+symb-glm.tex : 65 : \definesymbol [xguilsingleright] [\getglyph{Guil}{\char15}]
+
diff --git a/tex/context/base/enco-pfr.mkiv b/tex/context/base/enco-pfr.mkiv
new file mode 100644
index 000000000..2db8670f0
--- /dev/null
+++ b/tex/context/base/enco-pfr.mkiv
@@ -0,0 +1,20 @@
+%D \module
+%D [ file=enco-pfr,
+%D version=2000.12.10, % adapted 2005.08.14 to more delayed loading
+%D title=\CONTEXT\ Encoding Macros,
+%D subtitle=PDF Font Resource Inclusion,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\ifx\pdfglyphtounicode\undefined \else
+ \appendtoks
+ \doif\jobsuffix{pdf}{\ctxlua{characters.setpdfunicodes()}}% pdftounicode mappings can only be done runtime
+ \to \everystarttext
+\fi
+
+\endinput
diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua
new file mode 100644
index 000000000..7f4107386
--- /dev/null
+++ b/tex/context/base/font-afm.lua
@@ -0,0 +1,574 @@
+if not modules then modules = { } end modules ['font-afm'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Some code may look a bit obscure but this has to do with the
+fact that we also use this code for testing and much code evolved
+in the transition from <l n='tfm'/> to <l n='afm'/> to <l
+n='otf'/>.</p>
+
+<p>The following code still has traces of intermediate font support
+where we handles font encodings. Eventually font encoding goes
+away.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.afm = fonts.afm or { }
+fonts.afm.version = 1.10 -- incrementing this number one up will force a re-cache
+fonts.afm.syncspace = true -- when true, nicer stretch values
+fonts.afm.enhance_data = true -- best leave this set to true
+fonts.afm.trace_features = false
+fonts.afm.features = { }
+fonts.afm.features.aux = { }
+fonts.afm.features.data = { }
+fonts.afm.features.list = { }
+fonts.afm.features.default = { }
+fonts.afm.cache = containers.define("fonts", "afm", fonts.afm.version, true)
+
+--[[ldx--
+<p>We start with the basic reader which we give a name similar to the
+built in <l n='tfm'/> and <l n='otf'/> reader.</p>
+--ldx]]--
+
+do
+
+ local keys = { }
+
+ function keys.FontName (data,line) data.fullname = line:strip() end
+ function keys.ItalicAngle (data,line) data.italicangle = tonumber (line) end
+ function keys.IsFixedPitch(data,line) data.isfixedpitch = toboolean(line) end
+ function keys.CharWidth (data,line) data.charwidth = tonumber (line) end
+ function keys.XHeight (data,line) data.xheight = tonumber (line) end
+ function keys.Descender (data,line) data.descender = tonumber (line) end
+ function keys.Ascender (data,line) data.ascender = tonumber (line) end
+ function keys.Comment (data,line)
+ -- Comment DesignSize 12 (pts)
+ -- Comment TFM designsize: 12 (in points)
+ line = line:lower()
+ local designsize = line:match("designsize[^%d]*(%d+)")
+ if designsize then data.designsize = tonumber(designsize) end
+ end
+
+ local function get_charmetrics(characters,charmetrics)
+ local characters = data.characters
+ local chr, str, ind = { }, "", 0
+ for k,v in charmetrics:gmatch("([%a]+) +(.-) *;") do
+ if k == 'C' then
+ if str ~= "" then characters[str] = chr end
+ chr = { }
+ str = ""
+ v = tonumber(v)
+ if v < 0 then
+ ind = ind + 1
+ else
+ ind = v
+ end
+ chr.index = ind
+ elseif k == 'WX' then
+ chr.wx = v
+ elseif k == 'N' then
+ str = v
+ elseif k == 'B' then
+ local llx, lly, urx, ury = v:match("^ *(.-) +(.-) +(.-) +(.-)$")
+ chr.boundingbox = { tonumber(llx), tonumber(lly), tonumber(urx), tonumber(ury) }
+ elseif k == 'L' then
+ local plus, becomes = v:match("^(.-) +(.-)$")
+ if not chr.ligatures then chr.ligatures = { } end
+ chr.ligatures[plus] = becomes
+ end
+ end
+ if str ~= "" then characters[str] = chr end
+ end
+
+ local function get_kernpairs(characters,kernpairs)
+ local characters = data.characters
+ for one, two, value in kernpairs:gmatch("KPX +(.-) +(.-) +(.-)\n") do
+ local chr = characters[one]
+ if chr then
+ if not chr.kerns then chr.kerns = { } end
+ chr.kerns[two] = tonumber(value)
+ end
+ end
+ end
+
+ local function get_variables(data,fontmetrics)
+ for key, rest in fontmetrics:gmatch("(%a+) *(.-)[\n\r]") do
+ if keys[key] then keys[key](data,rest) end
+ end
+ end
+
+ function fonts.afm.read_afm(filename)
+ local ok, afmblob, size = input.loadbinfile(texmf.instance,filename) -- has logging
+ -- local ok, afmblob = true, file.readdata(filename)
+ if ok and afmblob then
+ data = {
+ version = version or '0',
+ characters = { },
+ filename = file.removesuffix(file.basename(filename))
+ }
+ afmblob = afmblob:gsub("StartCharMetrics(.-)EndCharMetrics", function(charmetrics)
+ get_charmetrics(data,charmetrics)
+ return ""
+ end)
+ afmblob = afmblob:gsub("StartKernPairs(.-)EndKernPairs", function(kernpairs)
+ get_kernpairs(data,kernpairs)
+ return ""
+ end)
+ afmblob = afmblob:gsub("StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics)
+ data.afmversion = version
+ get_variables(data,fontmetrics)
+ return ""
+ end)
+ return data
+ else
+ return nil
+ end
+ end
+
+end
+
+--[[ldx--
+<p>We cache files. Caching is taken care of in the loader. We cheat a bit
+by adding ligatures and kern information to the afm derived data. That
+way we can set them faster when defining a font.</p>
+--ldx]]--
+
+function fonts.afm.load(filename)
+ local name = file.removesuffix(filename)
+ local data = containers.read(fonts.afm.cache,name)
+ if not data then
+ local foundname = input.find_file(texmf.instance,filename,'afm')
+ if foundname and foundname ~= "" then
+ data = fonts.afm.read_afm(foundname)
+ if data then
+ fonts.afm.unify(data,filename)
+ if fonts.afm.enhance_data then
+ fonts.afm.add_ligatures(data,'ligatures') -- easier this way
+ fonts.afm.add_ligatures(data,'texligatures') -- easier this way
+ fonts.afm.add_kerns(data) -- faster this way
+ end
+ data = containers.write(fonts.afm.cache, name, data)
+ end
+ end
+ end
+ return data
+end
+
+function fonts.afm.unify(data, filename)
+ local unicode, private, unicodes = containers.content(fonts.enc.cache,'unicode').hash, 0x0F0000, { }
+ for name, blob in pairs(data.characters) do
+ local code = unicode[name]
+ if not code then
+ code = private
+ private = private + 1
+ end
+ blob.unicode = code
+ unicodes[name] = code
+ end
+ data.luatex = {
+ filename = file.basename(filename),
+ -- version = fonts.afm.version,
+ unicodes = unicodes
+ }
+end
+
+--[[ldx--
+<p>These helpers extend the basic table with extra ligatures, texligatures
+and extra kerns. This saves quite some lookups later.</p>
+--ldx]]--
+
+function fonts.afm.add_ligatures(afmdata,ligatures)
+ local chars = afmdata.characters
+ for k,v in pairs(characters[ligatures]) do
+ local one = chars[k]
+ if one then
+ for _, b in pairs(v) do
+ two, three = b[1], b[2]
+ if two and three and chars[two] and chars[three] then
+ if one[ligatures] then
+ if not one.ligatures[two] then
+ one[ligatures][two] = three
+ end
+ else
+ one[ligatures] = { [two] = three }
+ end
+ end
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>We keep the extra kerns in separate kerning tables so that we can use
+them selectively.</p>
+--ldx]]--
+
+function fonts.afm.add_kerns(afmdata)
+ local chars = afmdata.characters
+ -- add complex with values of simplified when present
+ local function do_it_left(what)
+ for _,v in pairs(chars) do
+ if v.kerns then
+ local k = { }
+ for complex,simple in pairs(characters.uncomposed[what]) do
+ if k[simple] and not k[complex] then
+ k[complex] = k[simple]
+ end
+ end
+ if not table.is_empty(k) then
+ v.extrakerns = k
+ end
+ end
+ end
+ end
+ do_it_left("left")
+ do_it_left("both")
+ -- copy kerns from simple char to complex char unless set
+ local function do_it_copy(what)
+ for complex,simple in pairs(characters.uncomposed[what]) do
+ local c = chars[complex]
+ if c then -- optional
+ local s = chars[simple]
+ if s and s.kerns then
+ c.extrakerns = s.kerns -- ok ? no merge ?
+ end
+ end
+ end
+ end
+ do_it_copy("both")
+ do_it_copy("right")
+end
+
+--[[ldx--
+<p>The copying routine looks messy (and is indeed a bit messy).</p>
+--ldx]]--
+
+-- once we have otf sorted out (new format) we can try to make the afm
+-- cache similar to it
+
+function fonts.afm.copy_to_tfm(data)
+ if data and data.characters then
+ local tfm = { characters = { }, parameters = { } }
+ local characters = data.characters
+ if characters then
+ for k, v in pairs(characters) do
+ local t = { }
+ t.height = v.boundingbox[4]
+ t.depth = - v.boundingbox[2]
+ t.width = v.wx
+ t.boundingbox = v.boundingbox
+ t.index = v.index
+ t.name = k
+ t.unicode = v.unicode
+ tfm.characters[t.unicode] = t
+ end
+ end
+ tfm.encodingbytes = 2
+ tfm.units = 1000
+ tfm.name = data.filename
+ tfm.type = "real"
+ tfm.fullname = data.fullname
+ tfm.stretch = stretch
+ tfm.slant = slant
+ tfm.direction = 0
+ tfm.boundarychar_label = 0
+ tfm.boundarychar = 65536
+ --~ tfm.false_boundarychar = 65536 -- produces invalid tfm in luatex
+ tfm.designsize = (data.designsize or 10)*65536
+ local spaceunits = 500
+ tfm.spacer = "500 units"
+ if data.isfixedpitch then
+ if characters['space'] and characters['space'].wx then
+ spaceunits, tfm.spacer = characters['space'].wx, "space"
+ elseif characters['emdash'] and characters['emdash'].wx then -- funny default
+ spaceunits, tfm.spacer = characters['emdash'].wx, "emdash"
+ elseif data.charwidth then
+ spaceunits, tfm.spacer = data.charwidth, "charwidth"
+ end
+ elseif characters['space'] and characters['space'].wx then
+ spaceunits, tfm.spacer = characters['space'].wx, "space"
+ elseif data.charwidth then
+ spaceunits, tfm.spacer = data.charwidth, "charwidth variable"
+ end
+ spaceunits = tonumber(spaceunits)
+ tfm.parameters[1] = 0 -- slant
+ tfm.parameters[2] = spaceunits -- space
+ tfm.parameters[3] = 500 -- space_stretch
+ tfm.parameters[4] = 333 -- space_shrink
+ tfm.parameters[5] = 400 -- x_height
+ tfm.parameters[6] = 1000 -- quad
+ tfm.parameters[7] = 0 -- extra_space (todo)
+ if spaceunits < 200 then
+ -- todo: warning
+ end
+ tfm.italicangle = data.italicangle
+ tfm.ascender = math.abs(data.ascender or 0)
+ tfm.descender = math.abs(data.descender or 0)
+ if data.italicangle then
+ tfm.parameters[1] = tfm.parameters[1] - math.round(math.tan(data.italicangle*math.pi/180))
+ end
+ if data.isfixedpitch then
+ tfm.parameters[3] = 0
+ tfm.parameters[4] = 0
+ elseif fonts.afm.syncspace then
+ -- too little
+ -- tfm.parameters[3] = .2*spaceunits -- space_stretch
+ -- tfm.parameters[4] = .1*spaceunits -- space_shrink
+ -- taco's suggestion:
+ -- tfm.parameters[3] = .4*spaceunits -- space_stretch
+ -- tfm.parameters[4] = .1*spaceunits -- space_shrink
+ -- knuthian values: (for the moment compatible)
+ tfm.parameters[3] = spaceunits/2 -- space_stretch
+ tfm.parameters[4] = spaceunits/3 -- space_shrink
+ end
+ if data.xheight and data.xheight > 0 then
+ tfm.parameters[5] = data.xheight
+ elseif tfm.characters['x'] and tfm.characters['x'].height then
+ tfm.parameters[5] = tfm.characters['x'].height
+ end
+ if table.is_empty(tfm.characters) then
+ return nil
+ else
+ return tfm
+ end
+ else
+ return nil
+ end
+end
+
+
+--~ function set_x(w,h) return h*slant+w*stretch end
+--~ function set_y(h) return h end
+
+--[[ldx--
+<p>Originally we had features kind of hard coded for <l n='afm'/>
+files but since I expect to support more font formats, I decided
+to treat this fontformat like any other and handle features in a
+more configurable way.</p>
+--ldx]]--
+
+function fonts.afm.features.register(name,default)
+ fonts.afm.features.list[#fonts.afm.features.list+1] = name
+ fonts.afm.features.default[name] = default
+end
+
+function fonts.afm.set_features(tfmdata)
+ local shared = tfmdata.shared
+ local afmdata = shared.afmdata
+ shared.features = fonts.define.check(shared.features,fonts.afm.features.default)
+ local features = shared.features
+--~ texio.write_nl(table.serialize(features))
+ if not table.is_empty(features) then
+ local mode = tfmdata.mode or fonts.mode
+ local fi = fonts.initializers[mode]
+ if fi and fi.afm then
+ function initialize(list) -- using tex lig and kerning
+ if list then
+ for _, f in ipairs(list) do
+ local value = features[f]
+ if value and fi.afm[f] then -- brr
+ if fonts.afm.trace_features then
+ logs.report("define afm",string.format("initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown'))
+ end
+ fi.afm[f](tfmdata,value)
+ mode = tfmdata.mode or fonts.mode
+ fi = fonts.initializers[mode]
+ end
+ end
+ end
+ end
+ initialize(fonts.triggers)
+ initialize(fonts.afm.features.list)
+ end
+ local fm = fonts.methods[mode]
+ if fm and fm.afm then
+ function register(list) -- node manipulations
+ if list then
+ for _, f in ipairs(list) do
+ if features[f] and fm.afm[f] then -- brr
+ if not shared.processors then -- maybe also predefine
+ shared.processors = { fm.afm[f] }
+ else
+ shared.processors[#shared.processors+1] = fm.afm[f]
+ end
+ end
+ end
+ end
+ end
+ register(fonts.afm.features.list)
+ end
+ end
+end
+
+function fonts.afm.afm_to_tfm(specification)
+ local afmfile = specification.filename
+ local features = specification.features.normal
+ local cache_id = specification.hash
+ local tfmdata = containers.read(fonts.tfm.cache, cache_id) -- cache with features applied
+ if not tfmdata then
+ local afmdata = fonts.afm.load(afmfile)
+ if not table.is_empty(afmdata) then
+ tfmdata = fonts.afm.copy_to_tfm(afmdata)
+ if not table.is_empty(tfmdata) then
+ tfmdata.shared = tfmdata.shared or { }
+ tfmdata.unique = tfmdata.unique or { }
+ tfmdata.shared.afmdata = afmdata
+ tfmdata.shared.features = features
+ fonts.afm.set_features(tfmdata)
+ end
+ end
+ tfmdata = containers.write(fonts.tfm.cache,cache_id,tfmdata)
+ end
+ return tfmdata
+end
+
+--[[ldx--
+<p>As soon as we could intercept the <l n='tfm'/> reader, I implemented an
+<l n='afm'/> reader. Since traditional <l n='pdftex'/> could use <l n='opentype'/>
+fonts with <l n='afm'/> companions, the following method also could handle
+those cases, but now that we can handle <l n='opentype'/> directly we no longer
+need this features.</p>
+--ldx]]--
+
+fonts.tfm.default_encoding = 'unicode'
+
+function fonts.tfm.set_normal_feature(specification,name,value)
+ if specification and name then
+ specification.features = specification.features or { }
+ specification.features.normal = specification.features.normal or { }
+ specification.features.normal[name] = value
+ end
+end
+
+function fonts.tfm.read_from_afm(specification)
+ local name, size, tfmtable = specification.name, specification.size, nil
+ local encoding, filename = name:match("^(.-)%-(.*)$") -- context: encoding-name.*
+ if filename and encoding and fonts.enc.known[encoding] then
+ fonts.tfm.set_normal_feature(specification,'encoding',encoding)
+ else
+ encoding = nil -- fonts.tfm.default_encoding
+ filename = name
+ end
+ if filename ~= "" then
+ specification.filename = filename .. ".afm"
+ tfmtable = fonts.afm.afm_to_tfm(specification)
+ if tfmtable then
+ tfmtable.name = name
+ tfmtable = fonts.tfm.scale(tfmtable, size)
+ filename = input.findbinfile(texmf.instance,filename,"pfb")
+ if filename then
+ tfmtable.format, tfmtable.filename = 'type1', filename
+ else
+ tfmtable.format, tfmtable.filename = 'pk', nil
+ end
+ if fonts.dontembed[filename] then
+ tfmtable.file = nil
+ end
+ -- begin of map hack
+ local mapentry = {
+ name = tfmtable.name,
+ fullname = tfmtable.fullname,
+ stretch = tfmtable.stretch,
+ slant = tfmtable.slant,
+ file = tfmtable.filename,
+ }
+ -- end of map hack
+ fonts.map.data[name] = mapentry
+ end
+ end
+ return tfmtable
+end
+
+--[[ldx--
+<p>Here comes the implementation of a few features. We only implement
+those that make sense for this format.</p>
+--ldx]]--
+
+function fonts.afm.features.prepare_ligatures(tfmdata,ligatures,value)
+ if value then
+ local charlist = tfmdata.shared.afmdata.characters
+ for k,v in pairs(tfmdata.characters) do
+ local ac = charlist[v.name]
+ if ac then
+ local al = ac[ligatures]
+ if al then
+ local ligatures = { }
+ for k,v in pairs(al) do
+ ligatures[charlist[k].index] = {
+ char = charlist[v].index,
+ type = 0
+ }
+ end
+ v.ligatures = ligatures
+ end
+ end
+ end
+ end
+end
+
+function fonts.afm.features.prepare_kerns(tfmdata,kerns,value)
+ if value then
+ local charlist = tfmdata.shared.afmdata.characters
+ for _, chr in pairs(tfmdata.characters) do
+ local newkerns = charlist[chr.name][kerns]
+ if newkerns then
+ local t = chr.kerns or { }
+ for k,v in pairs(newkerns) do
+ t[charlist[k].index] = v
+ end
+ chr.kerns = t
+ end
+ end
+ end
+end
+
+function fonts.initializers.base.afm.ligatures(tfmdata,value)
+ fonts.afm.features.prepare_ligatures(tfmdata,'ligatures',value)
+end
+
+function fonts.initializers.base.afm.texligatures(tfmdata,value)
+ fonts.afm.features.prepare_ligatures(tfmdata,'texligatures',value)
+end
+
+function fonts.initializers.base.afm.kerns(tfmdata,value)
+ fonts.afm.features.prepare_kerns(tfmdata,'kerns',value)
+end
+
+function fonts.initializers.base.afm.extrakerns(tfmdata,value)
+ fonts.afm.features.prepare_kerns(tfmdata,'extrakerns',value)
+end
+
+fonts.afm.features.register('liga',true)
+fonts.afm.features.register('kerns',true)
+fonts.afm.features.register('extrakerns')
+
+fonts.initializers.node.afm.ligatures = fonts.initializers.base.afm.ligatures
+fonts.initializers.node.afm.texligatures = fonts.initializers.base.afm.texligatures
+fonts.initializers.node.afm.kerns = fonts.initializers.base.afm.kerns
+fonts.initializers.node.afm.extrakerns = fonts.initializers.base.afm.extrakerns
+
+fonts.initializers.base.afm.liga = fonts.initializers.base.afm.ligatures
+fonts.initializers.node.afm.liga = fonts.initializers.base.afm.ligatures
+fonts.initializers.base.afm.tlig = fonts.initializers.base.afm.texligatures
+fonts.initializers.node.afm.tlig = fonts.initializers.base.afm.texligatures
+
+-- tfm features
+
+fonts.initializers.base.afm.equaldigits = fonts.initializers.common.equaldigits
+fonts.initializers.node.afm.equaldigits = fonts.initializers.common.equaldigits
+fonts.initializers.base.afm.lineheight = fonts.initializers.common.lineheight
+fonts.initializers.node.afm.lineheight = fonts.initializers.common.lineheight
+
+-- afm specific, encodings ...kind of obsolete
+
+fonts.afm.features.register('encoding')
+
+fonts.initializers.base.afm.encoding = fonts.initializers.common.encoding
+fonts.initializers.node.afm.encoding = fonts.initializers.common.encoding
+
+-- todo: oldstyle smallcaps as features for afm files
diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua
new file mode 100644
index 000000000..cb8e6f75b
--- /dev/null
+++ b/tex/context/base/font-def.lua
@@ -0,0 +1,477 @@
+if not modules then modules = { } end modules ['font-def'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- check reuse of lmroman1o-regular vs lmr10
+
+--[[ldx--
+<p>Here we deal with defining fonts. We do so by intercepting the
+default loader that only handles <l n='tfm'/>.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.define = fonts.define or { }
+fonts.tfm = fonts.tfm or { }
+fonts.vf = fonts.vf or { }
+fonts.used = fonts.used or { }
+
+fonts.tfm.version = 1.01
+fonts.tfm.cache = containers.define("fonts", "tfm", fonts.tfm.version, false)
+
+--[[ldx--
+<p>Choosing a font by name and specififying its size is only part of the
+game. In order to prevent complex commands, <l n='xetex'/> introduced
+a method to pass feature information as part of the font name. At the
+risk of introducing nasty parsing and compatinility problems, this
+syntax was expanded over time.</p>
+
+<p>For the sake of users who have defined fonts using that syntax, we
+will support it, but we will provide additional methods as well.
+Normally users will not use this direct way, but use a more abstract
+interface.</p>
+ --ldx]]--
+
+--~ name, kind, features = fonts.features.split_xetex("blabla / B : + lnum ; foo = bar ; - whatever ; whow ; + hans ; test = yes")
+
+fonts.define.method = 3 -- 1: tfm 2: tfm and if not then afm 3: afm and if not then tfm
+fonts.define.auto_afm = true
+fonts.define.auto_otf = true
+fonts.define.specify = { }
+fonts.define.splitsymbols = ""
+fonts.define.methods = fonts.define.methods or { }
+
+fonts.tfm.fonts = fonts.tfm.fonts or { }
+fonts.tfm.readers = fonts.tfm.readers or { }
+fonts.tfm.internalized = fonts.tfm.internalized or { } -- internal tex numbers
+fonts.tfm.id = fonts.tfm.id or { } -- font data, maybe use just fonts.ids (faster lookup)
+
+fonts.tfm.readers.sequence = { 'otf', 'ttf', 'afm', 'tfm' }
+
+--[[ldx--
+<p>We hardly gain anything when we cache the final (pre scaled)
+<l n='tfm'/> table. But it can be handy for debugging.</p>
+--ldx]]--
+
+fonts.version = 1.05
+fonts.cache = containers.define("fonts", "def", fonts.version, false)
+
+--[[ldx--
+<p>We can prefix a font specification by <type>name:</type> or
+<type>file:</type>. The first case will result in a lookup in the
+synonym table.</p>
+
+<typing>
+[ name: | file: ] identifier [ separator [ specification ] ]
+</typing>
+
+<p>The following function split the font specification into components
+and prepares a table that will move along as we proceed.</p>
+--ldx]]--
+
+function fonts.define.analyze(name, size, id)
+ local specification = name or 'unknown'
+ local lookup, rest = name:match("^(.-):(.+)$")
+ local sub = ""
+ if lookup == 'file' or lookup == 'name' then
+ name = rest
+ else
+ lookup = 'file'
+ end
+ local font, method, detail = name:match("^(.-)(["..fonts.define.splitsymbols.."])(.+)$")
+ if method and detail then
+ name = font
+ else
+ method, detail = "", ""
+ end
+ local mainfont, subfont = name:match("^(.*-)(%(.*-)(%)$")
+ if mainfont and subfont then
+ name, sub = mainfont, subfont
+ end
+ size = size or (65536*10)
+ return {
+ lookup = lookup, -- forced type
+ specification = specification, -- full specification
+ size = size, -- size in scaled points or -1000*n
+ name = name, -- font or filename
+ sub = sub, -- subfont (eg in ttc)
+ method = method, -- specification method
+ detail = detail, -- specification
+ resolved = "", -- resolved font name
+ forced = "", -- forced loader
+ id = id, -- font id
+ features = { }, -- preprocessed features
+ -- hash = nil
+ -- filename = nil,
+ -- encoding = nil,
+ -- format = nil,
+ }
+end
+
+function fonts.define.register_split(symbol,action)
+ fonts.define.splitsymbols = fonts.define.splitsymbols .. "%" .. symbol
+ fonts.define.specify[symbol] = action
+end
+
+--[[ldx--
+<p>A unique hash value is generated by:</p>
+--ldx]]--
+
+function fonts.tfm.hash_features(specification)
+ if specification.features then
+ local normal = specification.features.normal
+ if not table.is_empty(normal) then
+ local t = { }
+ for _, v in pairs(table.sortedkeys(normal)) do
+ t[#t+1] = v .. '=' .. tostring(normal[v])
+ end
+ return table.concat(t,"+")
+ end
+ end
+ return "unknown"
+end
+
+function fonts.tfm.hash_instance(specification)
+ if not specification.hash then
+ specification.hash = fonts.tfm.hash_features(specification)
+ end
+ return specification.hash .. ' @ ' .. tostring(specification.size)
+end
+
+--[[ldx--
+<p>We can resolve the filename using the next function:</p>
+--ldx]]--
+
+function fonts.define.resolve(specification)
+ if specification.lookup == 'name' then
+ specification.resolved, specification.sub = fonts.names.resolve(specification.name,specification.sub)
+ if specification.resolved then
+ specification.forced = file.extname(specification.resolved)
+ specification.name = file.removesuffix(specification.resolved)
+ end
+ elseif specification.lookup == 'file' then
+ specification.forced = file.extname(specification.name)
+ specification.name = file.removesuffix(specification.name)
+ end
+ if specification.forced == "" then
+ specification.forced = nil
+ end
+ specification.hash = specification.name .. ' @ ' .. fonts.tfm.hash_features(specification)
+ if specification.sub and specification.sub ~= "" then
+ specification.hash = specification.sub .. ' @ ' .. specification.hash
+ end
+ return specification
+end
+
+--[[ldx--
+<p>The main read function either uses a forced reader (as determined by
+a lookup) or tries to resolve the name using the list of readers.</p>
+
+<p>We need to cache when possible. We do cache raw tfm data (from <l
+n='tfm'/>, <l n='afm'/> or <l n='otf'/>). After that we can cache based
+on specificstion (name) and size, that is, <l n='tex'/> only needs a number
+for an already loaded fonts. However, it may make sense to cache fonts
+before they're scaled as well (store <l n='tfm'/>'s with applied methods
+and features). However, there may be a relation between the size and
+features (esp in virtual fonts) so let's not do that now.</p>
+
+<p>Watch out, here we do load a font, but we don't prepare the
+specification yet.</p>
+--ldx]]--
+
+function fonts.tfm.read(specification)
+ garbagecollector.push()
+ input.start_timing(fonts)
+ local hash = fonts.tfm.hash_instance(specification)
+ local tfmtable = fonts.tfm.fonts[hash] -- hashes by size !
+ if not tfmtable then
+ if specification.forced and specification.forced ~= "" then
+ tfmtable = fonts.tfm.readers[specification.forced](specification)
+ else
+ for _, reader in ipairs(fonts.tfm.readers.sequence) do
+ if fonts.tfm.readers[reader] then -- not really needed
+ tfmtable = fonts.tfm.readers[reader](specification)
+ if tfmtable then break end
+ end
+ end
+ end
+ if tfmtable then
+ if tfmtable.filename and fonts.dontembed[tfmtable.filename] then
+ tfmtable.embedding = "no"
+ else
+ tfmtable.embedding = "subset"
+ end
+ end
+ fonts.tfm.fonts[hash] = tfmtable
+ end
+ input.stop_timing(fonts)
+ garbagecollector.pop()
+ return tfmtable
+end
+
+--[[ldx--
+<p>For virtual fonts we need a slightly different approach:</p>
+--ldx]]--
+
+function fonts.tfm.read_and_define(name,size) -- no id
+ local specification = fonts.define.analyze(name,size,nil)
+ if specification.method and fonts.define.specify[specification.method] then
+ specification = fonts.define.specify[specification.method](specification)
+ end
+ specification = fonts.define.resolve(specification)
+ local hash = fonts.tfm.hash_instance(specification)
+ local id = fonts.tfm.internalized[hash]
+ if not id then
+ local fontdata = fonts.tfm.read(specification)
+ id = font.define(fontdata)
+ fonts.tfm.id[id] = fontdata
+ fonts.tfm.internalized[hash] = id
+ end
+ return fonts.tfm.id[id], id
+end
+
+--[[ldx--
+<p>A naive callback could be the following:</p>
+
+<code>
+callback.register('define_font', function(name,size,id)
+ return fonts.define.read(fonts.define.resolve(fonts.define.analyze(name,size,id)))
+end)
+</code>
+--ldx]]--
+
+
+--[[ldx--
+<p>Next follow the readers. This code was written while <l n='luatex'/>
+evolved. Each one has its own way of dealing with its format.</p>
+--ldx]]--
+
+function fonts.tfm.readers.opentype(specification,suffix,what)
+ if fonts.define.auto_otf then
+ local fullname, tfmtable = nil, nil
+ fullname = input.findbinfile(texmf.instance,specification.name,suffix)
+ if fullname and fullname ~= "" then
+ specification.filename, specification.format = fullname, what
+ tfmtable = fonts.tfm.read_from_open_type(specification)
+ fonts.logger.save(tfmtable,suffix,specification)
+ end
+ return tfmtable
+ else
+ return nil
+ end
+end
+
+function fonts.tfm.readers.otf(specification) return fonts.tfm.readers.opentype(specification,"otf","opentype") end
+function fonts.tfm.readers.ttf(specification) return fonts.tfm.readers.opentype(specification,"ttf","truetype") end
+function fonts.tfm.readers.ttc(specification) return fonts.tfm.readers.opentype(specification,"ttf","truetype") end -- !!
+
+function fonts.tfm.readers.afm(specification)
+ local fullname, tfmtable = nil, nil
+ if fonts.define.method == 2 then
+ fullname = input.findbinfile(texmf.instance,specification.name,"ofm") -- ?
+ if not (fullname and fullname ~= "") then
+ specification.filename = fullname
+ tfmtable = fonts.tfm.read_from_afm(specification)
+ fonts.logger.save(tfmtable,'afm',specification)
+ end
+ elseif fonts.define.method == 3 then
+-- maybe also findbinfile here
+ if fonts.define.auto_afm then
+ tfmtable = fonts.tfm.read_from_afm(specification)
+ fonts.logger.save(tfmtable,'afm',specification)
+ end
+ elseif fonts.define.method == 4 then
+-- maybe also findbinfile here
+ tfmtable = fonts.tfm.read_from_afm(specification)
+ fonts.logger.save(tfmtable,'afm',specification)
+ end
+ return tfmtable
+end
+
+function fonts.tfm.readers.tfm(specification)
+ local fullname, tfmtable = nil, nil
+ tfmtable = fonts.tfm.read_from_tfm(specification)
+ fonts.logger.save(tfmtable,'tfm',specification)
+ return tfmtable
+end
+
+--[[ldx--
+<p>So far we haven't really dealt with features (or whatever we want
+to pass along with the font definition. We distinguish the following
+situations:</p>
+
+<code>
+name:xetex like specs
+name@virtual font spec
+name*context specification
+</code>
+
+<p>Of course one can always define more.</p>
+--ldx]]--
+
+function fonts.define.specify.predefined(specification)
+ if specification.detail ~= "" and fonts.define.methods[specification.detail] then
+ specification.features.vtf = { preset = specification.detail }
+ end
+ return specification
+end
+
+fonts.define.register_split("@", fonts.define.specify.predefined)
+
+function fonts.define.specify.colonized(specification)
+ local list = { }
+ if specification.detail and specification.detail ~= "" then
+ local expanded_features = { }
+ local function expand(features)
+ for _,v in pairs(features:split(";")) do
+ expanded_features[#expanded_features+1] = v
+ end
+ end
+ expand(specification.detail)
+ for _,v in pairs(expanded_features) do
+ local a, b = v:match("^%s*(%S+)%s*=%s*(%S+)%s*$")
+ if a and b then
+ list[a] = b:is_boolean()
+ if type(list[a]) == "nil" then
+ list[a] = b
+ end
+ else
+ local a, b = v:match("^%s*([%+%-]?)%s*(%S+)%s*$")
+ if a and b then
+ list[b] = a ~= "-"
+ end
+ end
+ end
+ end
+ specification.features.normal = list
+ return specification
+end
+
+function fonts.tfm.make(specification)
+ local fvm = fonts.define.methods[specification.features.vtf.preset]
+ if fvm then
+ return fvm(specification)
+ else
+ return nil
+ end
+end
+
+fonts.define.register_split(":", fonts.define.specify.colonized)
+
+fonts.define.specify.context_setups = fonts.define.specify.context_setups or { }
+
+input.storage.register(false,"fonts/setups", fonts.define.specify.context_setups, "fonts.define.specify.context_setups")
+
+function fonts.define.specify.preset_context(name,features)
+ local t = aux.settings_to_hash(features)
+ for k,v in pairs(t) do
+ t[k] = v:is_boolean()
+ if type(t[k]) == "nil" then
+ t[k] = v
+ end
+ end
+ fonts.define.specify.context_setups[name] = t
+end
+
+function fonts.define.specify.split_context(features)
+ if fonts.define.specify.context_setups[features] then
+ return fonts.define.specify.context_setups[features]
+ else
+ return fonts.define.specify.preset_context("***",features)
+ end
+end
+
+function fonts.define.specify.starred(features)
+ if features.detail and features.detail ~= "" then
+ features.features.normal = fonts.define.specify.split_context(features.detail)
+ else
+ features.features.normal = { }
+ end
+ return features
+end
+
+fonts.define.register_split('*',fonts.define.specify.starred)
+
+--[[ldx--
+<p>We need to check for default features. For this we provide
+a helper function.</p>
+--ldx]]--
+
+function fonts.define.check(features,defaults)
+ if table.is_empty(features) then
+ features = table.fastcopy(defaults) -- we could do without copy
+ else
+ for k,v in pairs(defaults) do
+ if features[k] == nil then
+ features[k] = v
+ end
+ end
+ end
+ return features
+end
+
+--[[ldx--
+<p>So far the specifyers. Now comes the real definer. Here we cache
+based on id's. Here we also intercept the virtual font handler. Since
+it evolved stepwise I may rewrite this bit (combine code).</p>
+
+In the previously defined reader (the one resulting in a <l n='tfm'/>
+table) we cached the (scaled) instances. Here we cache them again, but
+this time based on id. We could combine this in one cache but this does
+not gain much. By the way, passing id's back to in the callback was
+introduced later in the development.</p>
+--ldx]]--
+
+function fonts.define.read(name,size,id)
+ local specification = fonts.define.analyze(name,size,id)
+ if specification.method and fonts.define.specify[specification.method] then
+ specification = fonts.define.specify[specification.method](specification)
+ end
+ specification = fonts.define.resolve(specification)
+ local hash = fonts.tfm.hash_instance(specification)
+ if true then
+ local fontdata = containers.read(fonts.cache,hash) -- for tracing purposes
+ end
+ local fontdata = fonts.tfm.internalized[hash]
+ if not fontdata then
+ if specification.features.vtf and specification.features.vtf.preset then
+ fontdata = fonts.tfm.make(specification)
+ else
+ fontdata = fonts.tfm.read(specification)
+ end
+ if true then
+ fontdata = containers.write(fonts.cache,hash,fontdata) -- for tracing purposes
+ end
+ fonts.tfm.id[id] = fontdata
+ fonts.tfm.internalized[hash] = id
+ end
+ return fontdata
+end
+
+--~ table.insert(fonts.tfm.readers.sequence,1,'vtf')
+
+--~ function fonts.tfm.readers.vtf(specification)
+--~ if specification.features.vtf and specification.features.vtf.preset then
+--~ return fonts.tfm.make(specification)
+--~ else
+--~ return nil
+--~ end
+--~ end
+
+function fonts.vf.find(name)
+ if fonts.logger.format(name) == 'tfm' then
+ return input.findbinfile(texmf.instance,name,"ovf")
+ else
+ return ""
+ end
+end
+
+--[[ldx--
+<p>We overload both the <l n='tfm'/> and <l n='vf'/> readers.</p>
+--ldx]]--
+
+callback.register('define_font' , fonts.define.read)
+callback.register('find_vf_file', fonts.vf.find )
diff --git a/tex/context/base/font-enc.lua b/tex/context/base/font-enc.lua
new file mode 100644
index 000000000..a29ed83d3
--- /dev/null
+++ b/tex/context/base/font-enc.lua
@@ -0,0 +1,98 @@
+if not modules then modules = { } end modules ['font-enc'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Because encodings are going to disappear, we don't bother defining
+them in tables. But we may do so some day, for consistency.</p>
+--ldx]]--
+
+fonts.enc = fonts.enc or { }
+fonts.enc.version = 1.01
+fonts.enc.cache = containers.define("fonts", "enc", fonts.enc.version, false)
+
+fonts.enc.known = {
+ texnansi = true,
+ ec = true,
+ qx = true,
+ t5 = true,
+ t2a = true,
+ t2b = true,
+ t2c = true,
+ unicode = true
+}
+
+function fonts.enc.is_known(encoding)
+ return containers.is_valid(fonts.enc.cache,encoding)
+end
+
+--[[ldx--
+<p>An encoding file looks like this:</p>
+
+<typing>
+/TeXnANSIEncoding [
+/.notdef
+/Euro
+...
+/ydieresis
+] def
+</typing>
+
+<p>Beware! The generic encoding files don't always apply to the ones that
+ship with fonts. This has to do with the fact that names follow (slightly)
+different standards. However, the fonts where this applies to (for instance
+Latin Modern or <l n='tex'> Gyre) come in OpenType variants too, so these
+will be used.</p>
+--ldx]]--
+
+function fonts.enc.load(filename)
+ local name = file.removesuffix(filename)
+ local data = containers.read(fonts.enc.cache,name)
+ if data then
+ local vector, tag, hash = { }, "", { }
+ local foundname = input.find_file(texmf.instance,filename,'enc')
+ if foundname and foundname ~= "" then
+ local ok, encoding, size = input.loadbinfile(texmf.instance,foundname)
+ if ok and encoding then
+ encoding = encoding:gsub("%%(.-)\n","")
+ local tag, vec = encoding:match("/(%w+)%s*%[(.*)%]%s*def")
+ local i = 0
+ for ch in vec:gmatch("/([%a%d%.]+)") do
+ if ch ~= ".notdef" then
+ vector[i] = ch
+ if not hash[ch] then
+ hash[ch] = i
+ else
+ -- duplicate, play safe for tex ligs and take first
+ end
+ end
+ i = i + 1
+ end
+ end
+ end
+ data = containers.write(fonts.enc.cache, name, { name=name, tag=tag, vector=vector, hash=hash })
+ end
+ return data
+end
+
+--[[ldx--
+<p>There is no unicode encoding but for practical purposed we define
+one.</p>
+--ldx]]--
+
+do
+ local vector, hash = { }, { }
+ for k,v in pairs(characters.data) do
+ local a = v.adobename
+ if a then
+ vector[k], hash[a] = a, k
+ else
+ vector[k] = '.notdef'
+ end
+ end
+ containers.write(fonts.enc.cache, 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash })
+end
diff --git a/tex/context/base/font-fbk.lua b/tex/context/base/font-fbk.lua
new file mode 100644
index 000000000..b81b94309
--- /dev/null
+++ b/tex/context/base/font-fbk.lua
@@ -0,0 +1,219 @@
+if not modules then modules = { } end modules ['font-fbk'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This is very experimental code!</p>
+--ldx]]--
+
+fonts.fallbacks = { }
+fonts.vf.aux.combine.trace = false
+
+fonts.vf.aux.combine.commands["enable-tracing"] = function(g,v)
+ fonts.vf.aux.combine.trace = true
+end
+
+fonts.vf.aux.combine.commands["disable-tracing"] = function(g,v)
+ fonts.vf.aux.combine.trace = false
+end
+
+fonts.vf.aux.combine.commands["set-tracing"] = function(g,v)
+ if v[2] == nil then
+ fonts.vf.aux.combine.trace = true
+ else
+ fonts.vf.aux.combine.trace = v[2]
+ end
+end
+
+function fonts.vf.aux.combine.initialize_trace()
+ if fonts.vf.aux.combine.trace then
+ return "special", "pdf: .8 0 0 rg .8 0 0 RG", "pdf: 0 .8 0 rg 0 .8 0 RG", "pdf: 0 0 .8 rg 0 0 .8 RG", "pdf: 0 g 0 G"
+ else
+ return "comment", "", "", "", ""
+ end
+end
+
+fonts.vf.aux.combine.force_fallback = false
+
+fonts.vf.aux.combine.commands["fake-character"] = function(g,v) -- g, nr, fallback_id
+ local index, fallback = v[2], v[3]
+ if fonts.vf.aux.combine.force_fallback or not g.characters[index] then
+ if fonts.fallbacks[fallback] then
+ g.characters[index] = fonts.fallbacks[fallback](g)
+ end
+ end
+end
+
+fonts.fallbacks['textcent'] = function (g)
+ local c = string.byte("c")
+ local t = table.fastcopy(g.characters[c])
+--~ local s = fonts.tfm.scaled(g.specification.size or g.size or g.private.size)
+--~ local s = fonts.tfm.scaled(g.size or g.private.size)
+ local s = fonts.tfm.scaled(g.specification.size or g.size)
+ local a = - math.tan(math.rad(g.italicangle))
+ local special, red, green, blue, black = fonts.vf.aux.combine.initialize_trace()
+ if a == 0 then
+ t.commands = {
+ {"push"}, {"slot", 1, c}, {"pop"},
+ {"right", .5*t.width},
+ {"down", .2*t.height},
+ {special, green},
+ {"rule", 1.4*t.height, .02*s},
+ {special, black},
+ }
+ else
+ t.commands = {
+ {"push"},
+ {"right", .5*t.width-.025*s},
+ {"down", .2*t.height},
+ {"special",string.format("pdf: q 1 0 %s 1 0 0 cm",a)},
+ {special, green},
+ {"rule", 1.4*t.height, .025*s},
+ {special, black},
+ {"special","pdf: Q"},
+ {"pop"},
+ {"slot", 1, c} -- last else problems with cm
+ }
+ end
+ -- somehow the width is messed up now
+ -- todo: set height
+ t.height = 1.2*t.height
+ t.depth = 0.2*t.height
+ return t
+end
+
+fonts.fallbacks['texteuro'] = function (g)
+ local c = string.byte("C")
+ local t = table.fastcopy(g.characters[c])
+--~ local s = fonts.tfm.scaled(g.specification.size or g.size or g.private.size)
+--~ local s = fonts.tfm.scaled(g.size or g.private.size)
+ local s = fonts.tfm.scaled(g.specification.size or g.size)
+ local d = math.cos(math.rad(90+g.italicangle))
+ local special, red, green, blue, black = fonts.vf.aux.combine.initialize_trace()
+ t.width = 1.05*t.width
+ t.commands = {
+ {"right", .05*t.width},
+ {"push"}, {"slot", 1, c}, {"pop"},
+ {"right", .5*t.width*d},
+ {"down", -.5*t.height},
+ {special, green},
+ {"rule", .05*s, .4*s},
+ {special, black},
+ }
+ return t
+end
+
+-- maybe store llx etc instead of bbox in tfm blob / more efficient
+
+fonts.vf.aux.combine.force_composed = false
+
+fonts.vf.aux.combine.commands["complete-composed-characters"] = function(g,v)
+ local chars = g.characters
+ local cap_lly = chars[string.byte("X")].boundingbox[4]
+ local ita_cor = math.cos(math.rad(90+g.italicangle))
+ local force = fonts.vf.aux.combine.force_composed
+ local special, red, green, blue, black = fonts.vf.aux.combine.initialize_trace()
+ for i,c in pairs(characters.data) do
+ if force or not chars[i] then
+ local s = c.specials
+ if s and s[1] == 'char' then
+ local chr = s[2]
+ if chars[chr] then
+ local cc = c.category
+ if (cc == 'll') or (cc == 'lu') or (cc == 'lt') then
+ local acc = s[3]
+ chars[i] = table.fastcopy(chars[chr])
+ if chars[acc] then
+ local cb = chars[chr].boundingbox
+ local ab = chars[acc].boundingbox
+ local c_llx, c_lly, c_urx, c_ury = cb[1], cb[2], cb[3], cb[4]
+ local a_llx, a_lly, a_urx, a_ury = ab[1], ab[2], ab[3], ab[4]
+ -- local dx = (c_urx-a_urx) - (c_urx-c_llx-a_urx+a_llx)/2
+ -- local dx = (c_urx-a_urx) - (c_urx-a_urx-c_llx+a_llx)/2
+ local dx = (c_urx - a_urx - a_llx + c_llx)/2
+ -- local dd = chars[chr].width*ita_cor
+ local dd = (c_urx-c_llx)*ita_cor
+ if a_ury < 0 then
+ local dy = cap_lly-a_lly
+ chars[i].commands = {
+ {"push"},
+ {"right", dx-dd},
+ {special, red},
+ {"slot", 1, acc},
+ {special, black},
+ {"pop"},
+ {"slot", 1, chr},
+ }
+ elseif c_ury > a_lly then
+ local dy = cap_lly-a_lly
+ chars[i].commands = {
+ {"push"},
+ {"right", dx+dd},
+ {"down", -dy},
+ {special, green},
+ {"slot", 1, acc},
+ {special, black},
+ {"pop"},
+ {"slot", 1, chr},
+ }
+ else
+ chars[i].commands = {
+ {"push"},
+ {"right", dx+dd},
+ {special, blue},
+ {"slot", 1, acc},
+ {special, black},
+ {"pop"},
+ {"slot", 1, chr},
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+--~ {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'},
+--~ {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'},
+--~ -- {'special', 'pdf: /Fm\XX\space Do'},
+--~ {'special', 'pdf: Q'},
+--~ {'special', 'pdf: Q'},
+
+-- for documentation purposes we provide:
+
+fonts.define.methods.install("fallback", { -- todo: auto-fallback with loop over data.characters
+ { "fake-character", 0x00A2, 'textcent' },
+ { "fake-character", 0x20AC, 'texteuro' }
+})
+
+fonts.vf.aux.combine.commands["enable-force"] = function(g,v)
+ fonts.vf.aux.combine.force_composed = true
+ fonts.vf.aux.combine.force_fallback = true
+end
+fonts.vf.aux.combine.commands["disable-force"] = function(g,v)
+ fonts.vf.aux.combine.force_composed = false
+ fonts.vf.aux.combine.force_fallback = false
+end
+
+fonts.define.methods.install("demo-2", {
+ { "enable-tracing" },
+ { "enable-force" },
+ { "initialize" },
+ { "include-method", "fallback" },
+ { "complete-composed-characters" },
+ { "disable-tracing" },
+ { "disable-force" },
+})
+
+fonts.define.methods.install("demo-3", {
+ { "enable-tracing" },
+ { "initialize" },
+ { "complete-composed-characters" },
+ { "disable-tracing" },
+})
diff --git a/tex/context/base/font-ini.lua b/tex/context/base/font-ini.lua
new file mode 100644
index 000000000..68cb49439
--- /dev/null
+++ b/tex/context/base/font-ini.lua
@@ -0,0 +1,57 @@
+if not modules then modules = { } end modules ['font-ini'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Not much is happening here.</p>
+--ldx]]--
+
+-- vtf comes first
+-- fix comes last
+
+fonts = fonts or { }
+
+fonts.mode = 'base'
+
+fonts.methods = {
+ base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+ node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+}
+
+fonts.initializers = {
+ base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
+ node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }
+}
+
+fonts.triggers = {
+ 'mode',
+ 'language',
+ 'script'
+}
+
+-- tracing
+
+do
+
+ fonts.color = fonts.color or { }
+
+ fonts.color.trace = false
+
+ local attribute = attributes.numbers['color'] or 4 -- we happen to know this -)
+ local mapping = attributes.list[attribute]
+
+ local set_attribute = node.set_attribute
+ local unset_attribute = node.unset_attribute
+
+ function fonts.color.set(n,c)
+ set_attribute(n,attribute,mapping[c] or -1)
+ end
+ function fonts.color.reset(n)
+ unset_attribute(n,attribute)
+ end
+
+end
diff --git a/tex/context/base/font-ini.mkii b/tex/context/base/font-ini.mkii
index 25fea33b4..ef2ab85a7 100644
--- a/tex/context/base/font-ini.mkii
+++ b/tex/context/base/font-ini.mkii
@@ -11,65 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% \starttext
-% \definefont
-% [blabla]
-% [name:Latin Modern Something]
-% \definefont
-% [blabla]
-% [file:texnansi-lmr10]
-% \blabla test
-% \definefont
-% [blabla]
-% [texnansi-lmtt10]
-% \blabla test
-% \stoptext
-
\unprotect
-% \definefontsynonym
-% [blabla]
-% [name:Latin Modern Something]
-% \definefontsynonym
-% [blabla]
-% [file:texnansi-lmr10]
-% [encoding=texnansi]
-% \definedfont[blabla] test \currentencoding/\fontfile \par
-% \definefontsynonym
-% [blabla]
-% [texnansi-lmtt10]
-% [encoding=texnansi]
-% \definedfont[blabla] test \currentencoding/\fontfile \par
-% \definefontsynonym
-% [blabla]
-% [ec-lmtt10]
-% [encoding=ec]
-% \definedfont[blabla] test \currentencoding/\fontfile \par
-
-\def\checkfontfilename
- {\expandafter\docheckfontfilename\fontfile:\empty:\empty\relax}
-
-\def\docheckfontfilename#1:#2:#3#4\relax
- {\edef\!!stringa{#1}%
- \edef\!!stringb{#2}%
- \ifx\!!stringb\empty
- \edef\checkedfontfile{\fontfilesome\!!stringa}%
- \else\ifx\!!stringa\v!file
- \edef\checkedfontfile{\fontfilefile\!!stringb}%
- \else\ifx\!!stringa\v!name
- \edef\checkedfontfile{\fontfilename\!!stringb}%
- \else
- \edef\checkedfontfile{\fontfilesome\!!stringb}%
- \fi\fi\fi}
-
-\def\fontfilename#1{"#1"}
-\def\fontfilefile#1{"#1"}
-\def\fontfilesome#1{#1}
-
-\beginXETEX
- \def\fontfilefile#1{"[#1]"}
-\endXETEX
-
\def\mkdefinefontfeature#1% #2
{\setvalue{\??fa#1}} % {#2}
diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv
new file mode 100644
index 000000000..dd597d41f
--- /dev/null
+++ b/tex/context/base/font-ini.mkiv
@@ -0,0 +1,72 @@
+%D \module
+%D [ file=font-ini,
+%D version=2007.01.10,
+%D title=\CONTEXT\ Font Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{font-ini}{1.001}
+\registerctxluafile{font-enc}{1.001}
+\registerctxluafile{font-map}{1.001}
+\registerctxluafile{font-syn}{1.001}
+\registerctxluafile{font-tfm}{1.001}
+\registerctxluafile{font-afm}{1.001}
+\registerctxluafile{font-otf}{1.001}
+\registerctxluafile{font-vf} {1.001}
+\registerctxluafile{font-def}{1.001}
+\registerctxluafile{font-fbk}{1.001}
+
+\unprotect
+
+\def\mkdefinefontfeature#1#2%
+ {\ctxlua{fonts.define.specify.preset_context("#1","#2")}}
+
+% handy for manuals
+
+\def\otfchar#1{\ctxlua{fonts.otf.char("#1")}}
+
+\registerrgbcolor {font:init} {1}{0}{0}%
+\registerrgbcolor {font:medi} {0}{1}{0}%
+\registerrgbcolor {font:fina} {0}{0}{1}%
+\registerrgbcolor {font:isol} {0}{1}{1}%
+\registerrgbcolor {font:mark} {1}{0}{1}%
+\registerrgbcolor {font:rest} {1}{1}{0}%
+
+%D goodies:
+%D
+%D \starttyping
+%D \showinstalledfonts[officinasans.*][all]
+%D \showinstalledfonts[officinaserif.*][all]
+%D \showinstalledfonts[officina.*itc.*][all]
+%D
+%D \showinstalledfonts[officina.*itc.*][all,new]
+%D \stoptyping
+
+\def\showinstalledfonts
+ {\dodoubleempty\doshowinstalledfonts}
+
+\def\doshowinstalledfonts[#1][#2]%
+ {\bgroup
+ \def\pattern{#1}%
+ \def\all{false}%
+ \def\reload{false}%
+ \doifnothing\pattern{\def\pattern{.*}}%
+ \processallactionsinset[#2][\v!new=>\def\reload{true},\v!all=>\def\all{true}]%
+ \ctxlua{fonts.names.table("#1",\reload,\all)}%
+ \egroup}
+
+%D Experimental!
+
+\def\installfontfeature
+ {\dodoubleargument\doinstallfontfeature}
+
+\def\doinstallfontfeature[#1][#2]%
+ {\ctxlua{fonts.install_feature("#1","#2")}}
+
+\protect \endinput
diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex
index 4b48ad5b5..759d8c7fb 100644
--- a/tex/context/base/font-ini.tex
+++ b/tex/context/base/font-ini.tex
@@ -936,55 +936,6 @@
% \def\s!nullfont{nullfont}
-\beginTEX
-
-\def\dodosettextfamily#1%
- {\@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\relax
- \@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\endcsname \relax
- \@EA\ifx\csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname\relax
- \@EA\ifx\csname\fontclass\fontbody\c!rm\fontfamily\endcsname \relax
- \@EA\ifx\csname \fontbody\c!mm\fontfamily\fontsize\endcsname\relax
- \@EA\ifx\csname \fontbody\c!mm\fontfamily\endcsname \relax
- \@EA\ifx\csname \fontbody\c!rm\fontfamily\fontsize\endcsname\relax
- \@EA\ifx\csname \fontbody\c!rm\fontfamily\endcsname \relax
- \autofontsizetrue \nullfont \else
- \autofontsizetrue \csname\fontbody\c!rm\fontfamily\endcsname \fi\else
- \autofontsizefalse \csname\fontbody\c!rm\fontfamily\fontsize\endcsname\fi\else
- \autofontsizetrue \csname\fontbody\c!mm\fontfamily\endcsname \fi\else
- \autofontsizefalse \csname\fontbody\c!mm\fontfamily\fontsize\endcsname\fi\else
- \autofontsizetrue \csname\fontclass\fontbody\c!rm\fontfamily\endcsname \fi\else
- \autofontsizefalse \csname\fontclass\fontbody\c!rm\fontsize\endcsname\fi\else
- \autofontsizetrue \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \fi\else
- \autofontsizefalse \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\fi
- #1\csname\fontfamily\s!fam\endcsname\font}
-
-\endTEX
-
-\beginETEX \ifcsname
-
-%\def\dodosettextfamily#1%
-% {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
-% \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
-% \ifcsname\fontclass\fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
-% \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \else
-% \ifcsname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
-% \csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \else
-% \ifcsname\fontclass\fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
-% \csname\fontclass\fontbody\c!rm\fontfamily\endcsname \else
-% \ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
-% \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
-% \ifcsname \fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
-% \csname \fontbody\c!mm\fontfamily\endcsname \else
-% \ifcsname \fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse
-% \csname \fontbody\c!rm\fontfamily\fontsize\endcsname \else
-% \ifcsname \fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
-% \csname \fontbody\c!rm\fontfamily\endcsname \else
-% \nullfont \autofontsizetrue
-% \fi\fi\fi\fi\fi\fi\fi\fi
-% #1\csname\fontfamily\s!fam\endcsname\font}
-%
-% slightly faster:
-
\def\dodosettextfamily
{\ifx\fontclass\empty
\@EA\dodosettextfamilyA
@@ -1018,8 +969,6 @@
\fi\fi\fi\fi
#1\csname\fontfamily\s!fam\endcsname\font}
-\endETEX
-
\def\mrfallback{\c!rm\c!tf}
\appendtoks
@@ -1048,55 +997,6 @@
\let\fontbody #2\dodosetmathfamily \textfont#1%
\let\fontbody\savedfontbody}
-\beginTEX
-
-\def\dodosetmathfamily#1#2%
- {\@EA\ifx \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\relax
- \@EA\ifx \csname\fontclass\fontbody\c!mm\fontfamily \endcsname\relax
- \@EA\ifx \csname\fontclass\fontbody \backfamily\fontsize\endcsname\relax
- \@EA\ifx \csname\fontclass\fontbody \backfamily \endcsname\relax
- \@EA\ifx \csname \fontbody\c!mm\fontfamily\fontsize\endcsname\relax
- \@EA\ifx \csname \fontbody\c!mm\fontfamily \endcsname\relax
- \@EA\ifx \csname \fontbody \backfamily\fontsize\endcsname\relax
- \@EA\ifx \csname \fontbody \backfamily \endcsname\relax
- \autofontsizetrue \nullfont \else
- \autofontsizetrue \csname \fontbody \backfamily \endcsname\fi \else
- \autofontsizefalse \csname \fontbody \backfamily\fontsize\endcsname\fi \else
- \autofontsizetrue \csname \fontbody\c!mm\fontfamily \endcsname\fi \else
- \autofontsizefalse \csname \fontbody\c!mm\fontfamily\fontsize\endcsname\fi \else
- \autofontsizetrue \csname\fontclass\fontbody \backfamily \endcsname\fi \else
- \autofontsizefalse \csname\fontclass\fontbody \backfamily\fontsize\endcsname\fi \else
- \autofontsizetrue \csname\fontclass\fontbody\c!mm\fontfamily \endcsname\fi \else
- \autofontsizefalse \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\fi
- #1#2\font}
-
-\endTEX
-
-\beginETEX \ifcsname
-
-%\def\dodosetmathfamily#1#2%
-% {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
-% \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else
-% \ifcsname\fontclass\fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
-% \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \else
-% \ifcsname\fontclass\fontbody\backfamily\fontsize\endcsname \autofontsizefalse
-% \csname\fontclass\fontbody\backfamily\fontsize\endcsname \else
-% \ifcsname\fontclass\fontbody\backfamily\endcsname \autofontsizetrue
-% \csname\fontclass\fontbody\backfamily\endcsname \else
-% \ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
-% \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else
-% \ifcsname \fontbody\c!mm\fontfamily\endcsname \autofontsizetrue
-% \csname \fontbody\c!mm\fontfamily\endcsname \else
-% \ifcsname \fontbody\backfamily\fontsize\endcsname \autofontsizefalse
-% \csname \fontbody\backfamily\fontsize\endcsname \else
-% \ifcsname \fontbody\backfamily\endcsname \autofontsizetrue
-% \csname \fontbody\backfamily\endcsname \else
-% \nullfont \autofontsizetrue
-% \fi\fi\fi\fi\fi\fi\fi\fi
-% #1#2\font}
-%
-% sligthly faster:
-
\def\dodosetmathfamily
{\ifx\fontclass\empty
\@EA\dodosetmathfamilyA
@@ -1130,8 +1030,6 @@
\fi\fi\fi\fi
#1#2\font}
-\endETEX
-
\appendtoks
\dosetsymbfamily\mrfam\textface\scriptface\scriptscriptface\c!mr
\dosetsymbfamily\mifam\textface\scriptface\scriptscriptface\c!mi
@@ -1151,24 +1049,6 @@
\let\fontbody #2\dodosetsymbfamily \textfont#1%
\let\fontbody\savedfontbody}
-\beginTEX
-
-\def\dodosetsymbfamily#1#2%
- {\@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname\relax
- \@EA\ifx\csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname\relax
- \else
- \csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
- #1#2\font
- \fi
- \else
- \csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
- #1#2\font
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\dodosetsymbfamily#1#2%
{\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
\csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
@@ -1177,8 +1057,6 @@
\csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname
#1#2\font
\fi\fi}
-
-\endETEX
%D All used styles, like rm, ss and tt, are saved in a comma
%D separated list. Appart from practical limitations one can
@@ -1255,20 +1133,6 @@
\def\saverelativefontsize#1#2% #1=rm|ss|.. #2=waarde
{\setxvalue{\fontclass#1\s!rscale}{#2}}
-\beginTEX
-
-\def\checkrelativefontsize#1%
- {\edef\relativefontsize
- {\@EA\ifx\csname\fontclass#1\s!rscale\endcsname\relax
- \defaultrelativefontsize
- \else
- \csname\fontclass#1\s!rscale\endcsname
- \fi}}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\checkrelativefontsize#1%
{\edef\relativefontsize
{\ifcsname\fontclass#1\s!rscale\endcsname
@@ -1277,8 +1141,6 @@
\defaultrelativefontsize
\fi}}
-\endETEX
-
%D We also save:
\def\savemathtextstyle#1% #1=rm|ss|..
@@ -1302,6 +1164,8 @@
%
% but, better:
+\let\somefontname\empty
+
\def\parsefontspec#1%
{\xdef\somefontspec{#1\space}%
\@EA\doparsefontspec\somefontspec\relax]% =>#1 \relax]
@@ -1482,8 +1346,240 @@
\ifx\checkfontfilename\undefined \let\checkfontfilename\relax \fi
+% \definefontsynonym
+% [blabla]
+% [name:Latin Modern Something]
+% \definefontsynonym
+% [blabla]
+% [file:texnansi-lmr10]
+% [encoding=texnansi]
+% \definedfont[blabla] test \currentencoding/\fontfile \par
+% \definefontsynonym
+% [blabla]
+% [texnansi-lmtt10]
+% [encoding=texnansi]
+% \definedfont[blabla] test \currentencoding/\fontfile \par
+% \definefontsynonym
+% [blabla]
+% [ec-lmtt10]
+% [encoding=ec]
+% \definedfont[blabla] test \currentencoding/\fontfile \par
+
+\beginOLDTEX
+
+ \def\checkfontfilename
+ {\expandafter\docheckfontfilename\fontfile:\empty:\empty\relax}
+
+ \def\docheckfontfilename#1:#2:#3#4\relax
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \ifx\!!stringb\empty
+ \edef\checkedfontfile{\!!stringa}%
+ \else\ifx\!!stringa\v!file
+ \edef\checkedfontfile{"\!!stringb"}%
+ \else\ifx\!!stringa\v!name
+ \edef\checkedfontfile{"\!!stringb"}%
+ \else
+ \edef\checkedfontfile{\!!stringb}%
+ \fi\fi\fi}
+
+\endOLDTEX
+
+% \definefontfeature[default] [liga=yes,texligatures=yes,texquotes=yes]
+% \definefontfeature[default-caps][liga=yes,texligatures=yes,texquotes=yes,smcp=yes,script=latn]
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular][features=default]
+% \definefontsynonym[SerifCaps][palatinonova-regular][features=default-caps] % also sets Serif
+% \stoptypescript
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular*default]
+% \definefontsynonym[SerifCaps] [palatinonova-regular*default-caps]
+% \stoptypescript
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular] [resource=palatinonova-regular,features=default]
+% \definefontsynonym[SerifCaps][palatinonova-regular-sc][resource=palatinonova-regular,features=default-caps] % caps
+% \stoptypescript
+%
+% \definetypeface[mainface][rm][serif][palatino-nova-regular][default] \setupbodyfont[mainface]
+%
+% \starttext
+% ``Test'' -- --- ff fi fl \sc ``Test'' -- --- ff fi fl
+% \stoptext
+
+% \starttext
+% \definefont
+% [blabla]
+% [name:Latin Modern Something]
+% \definefont
+% [blabla]
+% [file:texnansi-lmr10]
+% \blabla test
+% \definefont
+% [blabla]
+% [texnansi-lmtt10]
+% \blabla test
+% \stoptext
+
+\beginLUATEX
+
+ \def\checkfontfilename% -- todo: integrate so that we call do.. directly
+ {\expandafter\docheckfontfilename\fontfile*\empty*\relax}
+
+ \def\docheckfontfilename#1*#2#3*#4\relax % class overrules file
+ {\edef\checkedfontfile{{%
+ \ifx\@@fontresource\empty#1\else\@@fontresource\fi
+ \expandafter\ifx\csname\fontclass\s!features\endcsname\empty
+ \ifx\@@fontfeatures\empty\ifx#2\empty\else*#2#3\fi\else*\@@fontfeatures\fi
+ \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away
+ \ifx\@@fontfeatures\empty\ifx#2\empty\else*#2#3\fi\else*\@@fontfeatures\fi
+ \else
+ *\csname\fontclass\s!features\endcsname
+ \fi\fi
+ }}%
+ \doshowcheckedfontfeatures}
+
+\endLUATEX
+
+% xetex / todo: disable default features !
+
+\beginXETEX
+
+ % for some reason xetex does not support [filename] for tfm files and
+ % quotes also behave kind of strange " vs ' vs [ vs ...
+
+ % we need to use the specs,
+ %
+ % \font\myfont = msam7 % ok
+ % \font\myfont = "msam7" % also ok
+ % \font\myfont = "msam7" at 8pt % error
+
+ \newcount\xetexsavedinteractionmode
+ \newbox \xetexcrappyhackbox
+
+ \def\doiffoundxetexfontelse#1#2%
+ {\xetexsavedinteractionmode\interactionmode
+ \batchmode
+ \setbox\xetexcrappyhackbox\vbox{\par}% resets error count
+ \font\xetextempfont=#2\somefontspec\relax
+ \edef\xetextempfont{\fontname\xetextempfont}%
+ \ifx\xetextempfont\nullfontname
+ \interactionmode\xetexsavedinteractionmode
+ %\writestatus\m!fonts{fails #1: #2 (\xetextempfont)}%
+ \expandafter\secondoftwoarguments
+ \else
+ \interactionmode\xetexsavedinteractionmode
+ %\writestatus\m!fonts{succeeds #1: #2 (\xetextempfont)}%
+ \expandafter\firstoftwoarguments
+ \fi}
+
+ \def\docheckfontfilenameprefix#1:#2:#3#4\relax
+ {\edef\!!stringa{#1}%
+ \edef\!!stringb{#2}%
+ \ifx\!!stringb\empty
+ % no prefix
+ \edef\checkedfontfile{\ifx\@@fontresource\empty\!!stringa\else\@@fontresource\fi}%
+ \doiffoundxetexfontelse{1a}{"\checkedfontfile\checkedfontfeatures"}
+ {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
+ {\doiffoundxetexfontelse{1b}{"[\checkedfontfile]\checkedfontfeatures"}
+ {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+ {\edef\checkedfontfile{\checkedfontfile}}}%
+ \else\ifx\!!stringa\v!file
+ % force file, only file check when no spaces
+ \edef\checkedfontfile{\ifx\@@fontresource\empty\!!stringb\else\@@fontresource\fi}%
+ \doiffoundxetexfontelse{2a}{"[\checkedfontfile]\checkedfontfeatures"}
+ {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}}
+ {\doiffoundxetexfontelse{2b}{"\checkedfontfile\checkedfontfeatures"}
+ {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}}
+ {\edef\checkedfontfile{\checkedfontfile}}}%
+ \else\ifx\!!stringa\v!name
+ % force name, always lookup by xetex itself, "" forces otf/ttf/type1
+ \edef\checkedfontfile{\ifx\@@fontresource\empty\!!stringb\else\@@fontresource\fi}%
+ \edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}%
+ \else
+ % whatever, maybe even xetex spec, forget about features
+ \edef\checkedfontfile{"\ifx\@@fontresource\empty\!!stringa\!!stringb\else\@@fontresource\fi"}%
+ \fi\fi\fi}
+
+ \def\checkfontfilename% -- todo: integrate so that we call do.. directly
+ {\expandafter\docheckfontfilename\fontfile*\empty*\relax}
+
+ \def\docheckfontfilename#1*#2#3*#4\relax % class overrules file
+ {\edef\checkedfontfeatures
+ {\expandafter\ifx\csname\fontclass\s!features\endcsname\empty
+ \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
+ \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away
+ \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi
+ \else
+ \csname\fontclass\s!features\endcsname
+ \fi\fi}%
+ \ifx\checkedfontfeatures\empty
+ % done
+ \else
+ \edef\checkedfontfeatures{\executeifdefined{\??fa\checkedfontfeatures}\empty}%
+ \ifx\checkedfontfeatures\empty
+ % done
+ \else
+ \let\convertedfontfeatures\empty
+ \processcommacommand[\checkedfontfeatures]\doconvertfontfeatures % raw
+ \ifx\convertedfontfeatures\empty
+ \let\checkedfontfeatures\empty
+ \else
+ \edef\checkedfontfeatures{:\convertedfontfeatures}%
+ \fi
+ \fi
+ \fi
+ \docheckfontfilenameprefix#1:\empty:\empty\relax
+ \doshowcheckedfontfeatures}
+
+ \def\dodoconvertfontfeatures#1=#2#3=#4\relax
+ {\ifx#2\empty
+ % invalid feature
+ \else\ifcsname @xtx@#1@#2#3\endcsname
+ \edef\convertedfontfeatures{\convertedfontfeatures\csname @xtx@#1@#2#3\endcsname;}%
+ \else
+ \edef\!!stringa{#1}%
+ \edef\!!stringb{#2#3}%
+ \edef\convertedfontfeatures
+ {\convertedfontfeatures
+ \ifx\!!stringb\v!yes
+ +\!!stringa
+ \else\ifx\!!stringb\v!no
+ -\!!stringa
+ \else
+ \!!stringa=\!!stringb
+ \fi\fi;}%
+ \fi\fi}
+
+ \def\doconvertfontfeatures#1%
+ {\dodoconvertfontfeatures#1=\empty=\relax}
+
+ \def\remapfontfeature #1 #2 #3 {\setvalue{@xtx@#1@#2}{#3}}
+
+ % this may move to another file, maybe font-xtx
+
+ \remapfontfeature tlig yes mapping=tex-text
+ \remapfontfeature tlig no mapping=
+ \remapfontfeature trep yes mapping=tex-text
+ \remapfontfeature trep no mapping=
+ \remapfontfeature texligatures yes mapping=tex-text
+ \remapfontfeature texligatures no mapping=
+ \remapfontfeature texquotes yes mapping=tex-text
+ \remapfontfeature texquotes no mapping=
+
+\endXETEX
+
+\let\doshowcheckedfontfeatures\relax
+
+\def\showcheckedfontfeatures
+ {\def\doshowcheckedfontfeatures{\writestatus\m!fonts{checked: \checkedfontfile}}}
+
\def\checkedfontfile{\fontfile} % default
+% todo: adapt this to luatex, i.e. no encoding etc mess
+
\def\donoparsefontspec % #1 == \cs
{\edef\fontfile{\truefontname\somefontname}%
\ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi
@@ -1500,7 +1596,7 @@
{\expandafter\font\csname#1\endcsname\lastfontname\relax}
\def\definefontglobal#1% stores \somefontname=Mono and \fontfile=cmtt10
- {\expandafter\xdef\csname#1\endcsname
+ {\expandafter\xdef\csname#1\endcsname % ! ! ! ! not needed in luatex ! ! ! !
{\noexpand\csname#1:\endcsname
\noexpand\reactivatefont{\somefontname}{\fontfile}}%
\global\expandafter\font\csname#1:\endcsname\lastfontname\relax}
@@ -1558,24 +1654,11 @@
%D We also accept \type{sa a}||\type{sa d} as specification.
-\beginETEX \ifcsname
-
\def\checkfontscale#1#2\end#3%
{#3\ifcsname\??ft\s!default\noexpand#1\endcsname
\csname\??ft\s!default\noexpand#1\endcsname\else#1#2%
\fi#3}
-\endETEX
-
-\beginTEX
-
-\def\checkfontscale#1#2\end#3%
- {#3\expandafter\ifx\csname\??ft\s!default\noexpand#1\endcsname\relax
- #1#2\else\csname\??ft\s!default\noexpand#1\endcsname
- \fi#3}
-
-\endTEX
-
%D The duplicate font definition, using the ever the same dummy
%D font name, results in less fuzzy error messages. In the log
%D file, for instance when overfull boxes are reported, the
@@ -1626,6 +1709,8 @@
\def\classfont#1#2{#1#2} % \definefont[whatever][\classfont{xx}{yy} at 10pt]
+\beginOLDTEX
+
\def\definefontsynonym[#1]#2[#3]%
{\edef\@@fontfile{#3}%
\@EA\let\csname\??ff\fontclass#1\endcsname\@@fontfile
@@ -1639,8 +1724,47 @@
\getglobalfontparameters
\fi \fi}
+\endOLDTEX
+
+% We need to move the feature into the filename else it may be
+% overloaded by another reference. For instance the definition of
+% a regular and caps variant can use the same font.
+
+% We could use an indirect method ... store in 'array' and refer to
+% slot.
+
+\beginNEWTEX
+
+\def\definefontsynonym[#1]#2[#3]%
+ {\edef\@@fontname{#1}%
+ \edef\@@fontfile{#3}%
+ \doifnextcharelse[\dodefinefontsynonym\nodefinefontsynonym}
+
+\def\nodefinefontsynonym
+ {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile}
+
+\def\dodefinefontsynonym[#1]%
+ {\edef\@@fontdata{#1}%
+ \ifx\@@fontdata\empty
+ \nodefinefontsynonym
+ \else
+ \ifx\fontclass\empty
+ \getfontparameters
+ \else
+ \getglobalfontparameters
+ \fi
+ \ifcsname\??ff\@@fontfile\s!features\endcsname
+ \@EA\edef\csname\??ff\fontclass\@@fontname\endcsname{\@@fontfile*\csname\??ff\@@fontfile\s!features\endcsname}%
+ \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined
+ \else
+ \nodefinefontsynonym
+ \fi
+ \fi}
+
+\endNEWTEX
+
% \def\resetfontsynonym[#1]% fails
-% {\letbeundefined{\??ff\fontclass#1}}
+% {\letbeundefined{\??ff\fontclass#1}\letbeundefined{\??ff#1}}
\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
@@ -1658,57 +1782,6 @@
\fi
\fi}
-\beginTEX
-
-\def\truefontdata#1#2%
- {\expandafter\ifx\csname\??ff#1#2\endcsname\relax
- \expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax
- \expandafter\ifx\csname\??ff#1\endcsname\relax
- \expandafter\ifx\csname\??ff#2\endcsname\relax
- \else
- % raw(key)
- \csname\??ff#2\endcsname
- \fi
- \else
- % exp(Regular) raw(key)
- \expandafter\truefontdata\csname\??ff#1\endcsname#2%
- \fi
- \else
- % exp(palatino Regular) raw(key)
- \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
- \fi
- \else
- % raw(Regular) raw(key)
- \csname\??ff#1#2\endcsname
- \fi}
-
-\def\truefontname#1%
- {\expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax
- \expandafter\ifx\csname\??ff#1\endcsname\relax
- #1%
- \else
- \@EA\truefontname\csname\??ff#1\endcsname
- \fi
- \else
- \@EA\truefontname\csname\??ff\fontclass#1\endcsname
- \fi}
-
-\def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1)
- {\@EA\ifx\csname\??ff\fontclass#2\endcsname\relax\else
- \expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}%
- \fi}
-
-\def\doifelsefontsynonym#1%
- {\@EA\ifx\csname\??ff\fontclass#1\endcsname\relax
- \expandafter\secondoftwoarguments
- \else
- \expandafter\firstoftwoarguments
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\truefontdata#1#2%
{\ifcsname\??ff#1#2\endcsname
% raw(Regular) raw(key)
@@ -1724,6 +1797,8 @@
\csname\??ff#2\endcsname
\fi\fi\fi\fi}
+\beginOLDTEX
+
\def\truefontname#1%
{\ifcsname\??ff\fontclass#1\endcsname
\@EA\truefontname\csname\??ff\fontclass#1\endcsname
@@ -1733,6 +1808,86 @@
#1%
\fi\fi}
+\endOLDTEX
+
+\beginNEWTEX
+
+% simple version
+%
+% \def\truefontname#1%
+% {\@EA\dotruefontname#1*\relax}
+%
+% \def\dotruefontname#1*#2\relax
+% {\ifcsname\??ff\fontclass#1\endcsname
+% \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+% \else\ifcsname\??ff#1\endcsname
+% \@EA\truefontname\csname\??ff#1\endcsname
+% \else
+% #1%
+% \fi\fi}
+%
+% last counts
+%
+% \def\truefontname#1%
+% {\@EA\dotruefontname#1*\empty*\relax}
+%
+% \def\dotruefontname#1*#2#3*#4\relax
+% {\ifcsname\??ff\fontclass#1\endcsname
+% \ifx#2\empty
+% \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+% \else
+% \@EA\truefontname\csname\??ff\fontclass#1\endcsname*#2#3%
+% \fi
+% \else\ifcsname\??ff#1\endcsname
+% \ifx#2\empty
+% \@EA\truefontname\csname\??ff#1\endcsname
+% \else
+% \@EA\truefontname\csname\??ff#1\endcsname*#2#3%
+% \fi
+% \else
+% \ifx#2\empty
+% #1%
+% \else
+% #1*#2#3%
+% \fi
+% \fi\fi}
+%
+% first counts
+
+\def\truefontname#1%
+ {\@EA\dotruefontname#1*\empty*\relax}
+
+\def\dotruefontname#1*#2#3*#4\relax
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \ifx#2\empty
+ \@EA\truefontname\csname\??ff\fontclass#1\endcsname
+ \else
+ \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname*#2#3%
+ \fi
+ \else\ifcsname\??ff#1\endcsname
+ \ifx#2\empty
+ \@EA\truefontname\csname\??ff#1\endcsname
+ \else
+ \@EA\redotruefontname\csname\??ff#1\endcsname*#2#3%
+ \fi
+ \else
+ #1\ifx#2\empty\else*#2#3\fi
+ \fi\fi}
+
+\def\redotruefontname#1%
+ {\@EA\dodotruefontname#1*\relax}
+
+\def\dodotruefontname#1*#2\relax
+ {\ifcsname\??ff\fontclass#1\endcsname
+ \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname
+ \else\ifcsname\??ff#1\endcsname
+ \@EA\redotruefontname\csname\??ff#1\endcsname
+ \else
+ #1%
+ \fi\fi}
+
+\endNEWTEX
+
\def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1)
{\ifcsname\??ff\fontclass#2\endcsname
\expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}%
@@ -1744,8 +1899,6 @@
\else
\expandafter\secondoftwoarguments
\fi}
-
-\endETEX
% \definetypeface[palatino][rm][serif][palatino,allbold][default]
%
@@ -1775,30 +1928,6 @@
%D
%D A goody:
-\beginTEX
-
-\def\tracedfontencoding#1%
- {\expandafter\ifx\csname\??ff#1\s!encoding\endcsname\relax\else
- \space[\csname\??ff#1\s!encoding\endcsname]%
- \fi}
-
-\def\tracedfontname#1%
- {\expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax
- \expandafter\ifx\csname\??ff#1\endcsname\relax
- #1%
- \else
- #1\tracedfontencoding{#1}\space->\space
- \@EA\tracedfontname\csname\??ff#1\endcsname
- \fi
- \else
- #1\tracedfontencoding{\fontclass#1}\space->\space
- \@EA\tracedfontname\csname\??ff\fontclass#1\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX
-
\def\tracedfontencoding#1%
{\ifcsname\??ff#1\s!encoding\endcsname
\space[\csname\??ff#1\s!encoding\endcsname]%
@@ -1814,8 +1943,6 @@
\else
#1%
\fi\fi}
-
-\endETEX
%D \macros
%D {getfontfileparameters}
@@ -1860,17 +1987,7 @@
%D \definefont[Text][LucidaBright sa 5.4] \Text last
%D \stoptyping
%D
-%D The implementation one looks familiar:
-
-% The simple implementation is:
-%
-% \def\definefont
-% {\dodoubleargument\dodefinefont}
-%
-% \def\dodefinefont[#1][#2]%
-% {\doifinstringelse{ }{#2}
-% {\unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}}
-% {\dodefinefont[#1][#2 sa 1]}}
+%D The implementation looks as follows:
\def\definefont
{\dotripleempty\dodefinefont}
@@ -1884,14 +2001,6 @@
\fi}
{\definefont[#1][#2 sa *][#3]}}
-%\def\redodefinefont#1#2#3%
-% {\dododefinefont{#1}{#2}%
-% \doifnumberelse{#3}
-% {\setupinterlinespace[#3]\setupspacing}
-% {\doifassignmentelse{#3}
-% {\setupinterlinespace[#3]\setupspacing}
-% {\setups[#3]}}} % so, we can have setups associated to fonts !
-
\def\redodefinefont#1#2#3%
{\dododefinefont{#1}{#2}%
\doifsetupselse{#3}
@@ -1899,6 +2008,13 @@
{\setuplocalinterlinespace[#3]%
\setupspacing}} % needed ?
+\def\definefrozenfont
+ {\dotripleempty\dodefinefrozenfont}
+
+\def\dodefinefrozenfont[#1][#2][#3]%
+ {\dodefinefont[#1][#2][#3]%
+ \expandafter\let\csname\lastfontidentifier\expandafter\endcsname\csname\rawfontidentifier\endcsname}
+
% \def\defineclassfont
% {\doquadrupleempty\dodefineclassfont}
%
@@ -1940,28 +2056,6 @@
\setfontcharacteristics
\the\everyfontswitch}
-\beginTEX
-
-\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine
- {\edef\lastfontidentifier{#3}%
- \@EA\ifx\csname\newfontidentifier\endcsname\relax
- \def\localrelativefontsize{#1}%
- \def\localabsolutefontsize{#2}%
- \parsefontspec{#4}\newfontidentifier
- \let\localrelativefontsize\defaultrelativefontsize % not needed
- \fi
- \csname\newfontidentifier\endcsname
- \autofontsizefalse
- %\edef\lastfontidentifier{#3}%
- \ifskipfontcharacteristics \else
- \setfontcharacteristics
- \the\everyfontswitch
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine
{\edef\lastfontidentifier{#3}%
\ifcsname\newfontidentifier\endcsname\else
@@ -1978,8 +2072,6 @@
\the\everyfontswitch
\fi}
-\endETEX
-
%D I considered checking for mistakenly use of \PLAIN's
%D \type{\magstep}'s but although it would take only a few
%D lines of code, this would not add to consistent use. I
@@ -2020,19 +2112,6 @@
{\scratchdimen#1\relax % \relax is really needed here
\setvalue{\??ft*\the\scratchdimen}{#2}}
-\beginTEX
-
-\def\setmappedfontsize#1%
- {\expandafter\ifx\csname\??ft*#1\endcsname\relax
- #1%
- \else
- \csname\??ft*#1\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\setmappedfontsize#1%
{\ifcsname\??ft*#1\endcsname
\csname\??ft*#1\endcsname
@@ -2040,8 +2119,6 @@
#1%
\fi}
-\endETEX
-
%D \macros
%D {getfontname}
%D
@@ -2083,34 +2160,6 @@
%D returns the current scaling factor. Take a look at
%D \type {cont-log.tex} for an example of its use.
-\beginTEX
-
-\def\currentfontscale
- {\@EA\ifx\csname\??ft\s!default\xfontsize\endcsname\relax
- \@EA\ifx\csname\??ft\s!default\s!text\endcsname\relax
- 1%
- \else
- \csname\??ft\s!default\s!text\endcsname
- \fi
- \else
- \csname\??ft\s!default\xfontsize\endcsname
- \fi}
-
-\def\currentfontbodyscale
- {\@EA\ifx\csname\??ft\s!default\fontsize\endcsname\relax
- \@EA\ifx\csname\??ft\s!default\s!text\endcsname\relax
- 1%
- \else
- \csname\??ft\s!default\s!text\endcsname
- \fi
- \else
- \csname\??ft\s!default\fontsize\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\currentfontscale
{\csname\??ft\s!default
\ifcsname\??ft\s!default\xfontsize\endcsname \xfontsize \else
@@ -2123,8 +2172,6 @@
\ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi
\endcsname}
-\endETEX
-
\setvalue{\??ft\s!default}{1}
%D Both alternatives use \type {\xfontsize}, a macro that
@@ -2318,20 +2365,9 @@
%D Just a couple of interface macros:
-\beginTEX
-
-\def\bodyfontvariable#1%
- {\??ft\@EA\ifx\csname\??ft\fontclass#1\endcsname\relax\else\fontclass\fi#1}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\bodyfontvariable#1%
{\??ft\ifcsname\??ft\fontclass#1\endcsname\fontclass\fi#1}
-\endETEX
-
\def\bodyfontcsname
{\csname\bodyfontvariable}
@@ -3176,22 +3212,6 @@
\the\everyfontswitch
\fi}
-\beginTEX
-
-\def\dofontstrategy#1#2#3#4#5%
- {\@EA\ifx\csname#2#3#4#5\endcsname\relax\else
- #1\csname#2#3#4#5\endcsname \tryingfontfalse
- \fi}
-
-\def\dofontclassstrategy#1#2#3#4#5%
- {\@EA\ifx\csname\fontclass#2#3#4#5\endcsname\relax\else
- #1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\dofontstrategy#1#2#3#4#5%
{\ifcsname#2#3#4#5\endcsname
#1\csname#2#3#4#5\endcsname \tryingfontfalse
@@ -3202,8 +3222,6 @@
#1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse
\fi}
-\endETEX
-
\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a
\fontbody \fontstyle \fontalternative \fontsize
\fi \to \fontstrategies
@@ -3245,20 +3263,6 @@
%D in text mode the values defined by the bodyfontenvironment are
%D used. Here we also set \type{\currentxfontsize}.
-\beginTEX
-
-\def\dosetcurrentfontxxxalternative#1#2#3#4%
- {\chardef\currentxfontsize#2\relax
- \ifmmode
- #4%
- \else\expandafter\ifx\csname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname\relax\else
- \setcurrentfontbodyalternative{\bodyfontcsname\normalizedbodyfontsize#3\endcsname}{#1}%
- \fi\fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\dosetcurrentfontxxxalternative#1#2#3#4%
{\chardef\currentxfontsize#2\relax
\ifmmode
@@ -3267,8 +3271,6 @@
\setcurrentfontbodyalternative{\bodyfontcsname\normalizedbodyfontsize#3\endcsname}{#1}%
\fi\fi}
-\endETEX
-
\def\setcurrentfontxalternative#1%
{\dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle
\let\tx\txx}
@@ -3488,24 +3490,6 @@
%D The following alternative is meant for math||to||text
%D switching and will be optimized.
-\beginTEX
-
-\def\fastswitchtobodyfont#1%
- {\@EA\ifx\csname\??ft\normalizedbodyfontsize#1\endcsname\else
- \edef\futurebodyfontsize
- {\csname\??ft\normalizedbodyfontsize#1\endcsname}%
- \@EA\ifx\csname\@size@\futurebodyfontsize\endcsname\else
- \csname\@size@\futurebodyfontsize\endcsname
- \localbodyfontsize\futurebodyfontsize\relax
- \fi
- \fi
- \csname\@style@\fontstyle\endcsname
- \the\everybodyfont}
-
-\endTEX
-
-\beginETEX \ifcsname
-
\def\fastswitchtobodyfont#1%
{\ifcsname\??ft\normalizedbodyfontsize#1\endcsname
\edef\futurebodyfontsize
@@ -3518,8 +3502,6 @@
\csname\@style@\fontstyle\endcsname
\the\everybodyfont}
-\endETEX
-
%D Because the last macro can appear in arguments or be assigned
%D to parameters, we protect this one for unwanted expansion.
@@ -3532,19 +3514,8 @@
\scriptfont \mrfam\scriptfont \mffam
\scriptscriptfont\mrfam\scriptscriptfont\mffam}
-\beginTEX
-
- \def\domffam#1%
- {\csname\ifundefined{#1\s!fam}\c!nn\else#1\fi\s!fam\endcsname}
-
-\endTEX
-
-\beginETEX \ifcsname
-
- \def\domffam#1%
- {\csname\ifcsname#1\s!fam\endcsname#1\else\c!nn\fi\s!fam\endcsname}
-
-\endETEX
+\def\domffam#1%
+ {\csname\ifcsname#1\s!fam\endcsname#1\else\c!nn\fi\s!fam\endcsname}
\def\mffam
{\domffam\fontalternative}
@@ -3608,6 +3579,18 @@
\ifx\mkdefinefontfeature\undefined \let\mkdefinefontfeature\gobbletwoarguments \fi
+\definefontfeature
+ [default]
+ [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [smallcaps]
+ [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [oldstyle]
+ [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes
+
%D The next auxilliary macro is an alternative to \type
%D {\fontname}.
@@ -4296,8 +4279,6 @@
% \def\fontstringC{\executeifdefined{\??ff:s:\fontstyle}\empty}
% \def\fontstringD{\executeifdefined{\??ff:t:\csname\??tf\fontclass\s!default\endcsname}\s!Serif}
-\beginETEX \ifcsname
-
\def\glyphfontfile#1%
{#1%
\ifcsname\??ff#1\fontstringA\fontstringC\endcsname
@@ -4312,25 +4293,6 @@
\fontstringC
\fi\fi\fi\fi\fi}
-\endETEX
-
-\beginTEX
-
-\def\glyphfontfile#1%
- {#1%
- \expandafter\ifx\csname\??ff#1\fontstringA\fontstringC\endcsname\relax
- \expandafter\ifx\csname\??ff#1\fontstringB\fontstringC\endcsname\relax
- \expandafter\ifx\csname\??ff#1\fontstringA\endcsname\relax
- \expandafter\ifx\csname\??ff#1\fontstringB\endcsname\relax
- \expandafter\ifx\csname\??ff#1\fontstringC\endcsname\relax
- \else \fontstringC \fi
- \else \fontstringB \fi
- \else \fontstringA \fi
- \else \fontstringB\fontstringC \fi
- \else \fontstringA\fontstringC \fi}
-
-\endTEX
-
%D The next macro can be used to make decisions based on the shape:
\def\doifitalicelse#1#2%
@@ -4914,22 +4876,6 @@
%D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO}
%D \stoptyping
-\beginTEX
-
-\def\doiffontpresentelse#1%
- {\bgroup
- \batchmode\font\dummy=\truefontname{#1}\errorstopmode
- \edef\lastfontname{\fontname\dummy}%
- \ifx\lastfontname\nullfontname
- \egroup\expandafter\secondoftwoarguments
- \else
- \egroup\expandafter\firstoftwoarguments
- \fi}
-
-\endTEX
-
-\beginETEX \interactionmode
-
\def\doiffontpresentelse#1%
{\bgroup
\scratchcounter\interactionmode
@@ -4943,6 +4889,4 @@
\egroup\expandafter\firstoftwoarguments
\fi}
-\endETEX
-
\protect \endinput
diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua
new file mode 100644
index 000000000..4aecde445
--- /dev/null
+++ b/tex/context/base/font-map.lua
@@ -0,0 +1,172 @@
+if not modules then modules = { } end modules ['font-map'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Eventually this code will disappear because map files are kind
+of obsolete. Some code may move to runtime or auxiliary modules.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.map = fonts.map or { }
+fonts.map.data = fonts.map.data or { }
+fonts.map.done = fonts.map.done or { }
+fonts.map.line = fonts.map.line or { }
+fonts.map.loaded = fonts.map.loaded or { }
+fonts.map.direct = fonts.map.direct or { }
+
+function fonts.map.line.pdfmapline(tag,str)
+ return "\\loadmapline[" .. tag .. "][" .. str .. "]"
+end
+
+function fonts.map.line.pdftex(e) -- so far no combination of slant and stretch
+ if e.name and e.file then
+ local fullname = e.fullname or ""
+ if e.slant and tonumber(e.slant) ~= 0 then
+ if e.encoding then
+ return fonts.map.line.pdfmapline("=",string.format('%s %s "%g SlantFont" <%s <%s',e.name,fullname,e.slant,e.encoding,e.file))
+ else
+ return fonts.map.line.pdfmapline("=",string.format('%s %s "%g SlantFont" <%s',e.name,fullname,e.slant,e.file))
+ end
+ elseif e.stretch and tonumber(e.stretch) ~= 1 and tonumber(e.stretch) ~= 0 then
+ if e.encoding then
+ return fonts.map.line.pdfmapline("=",string.format('%s %s "%g ExtendFont" <%s <%s',e.name,fullname,e.stretch,e.encoding,e.file))
+ else
+ return fonts.map.line.pdfmapline("=",string.format('%s %s "%g ExtendFont" <%s',e.name,fullname,e.stretch,e.file))
+ end
+ else
+ if e.encoding then
+ return fonts.map.line.pdfmapline("=",string.format('%s %s <%s <%s',e.name,fullname,e.encoding,e.file))
+ else
+ return fonts.map.line.pdfmapline("=",string.format('%s %s <%s',e.name,fullname,e.file))
+ end
+ end
+ else
+ return nil
+ end
+end
+
+function fonts.map.flushlines(backend,separator)
+ local t = { }
+ for k,v in pairs(fonts.map.data) do
+ if not fonts.map.done[k] then
+ local str = fonts.map.line[backend](v)
+ if str then
+ t[#t+1] = str
+ end
+ fonts.map.done[k] = true
+ end
+ end
+ return table.join(t,separator or "")
+end
+
+fonts.map.line.dvips = fonts.map.line.pdftex
+fonts.map.line.dvipdfmx = function() end
+
+function fonts.map.process_entries(filename, backend, handle)
+ local root = xml.load(filename,true)
+ if root then
+ if not handle then handle = texio.write_nl end
+ xml.process_attributes(root, "/fontlist/font", function(e,k)
+ local str = fonts.map.line[backend](e)
+ if str then
+ handle(str)
+ end
+ end)
+ end
+end
+
+function fonts.map.convert_entries(filename)
+ if not fonts.map.loaded[filename] then
+ local root = xml.load(filename,true) -- todo: stop garbage collector
+ if root then
+ garbagecollector.push()
+ xml.process_attributes(root, "/fontlist/font", function(e,k)
+ if e.name and e.file then
+ fonts.map.data[e.name] = e
+ -- fonts.map.data[e.name].name = nil -- beware, deletes xml entry as well
+ end
+ end)
+ garbagecollector.pop()
+ end
+ fonts.map.loaded[filename] = true
+ end
+end
+
+function fonts.map.direct.pdftex(filename)
+ fonts.map.process_entries(filename,'pdftex',function(str)
+ tex.sprint(tex.ctxcatcodes,str)
+ end)
+end
+
+-- the next one will go to a runtime module, no need to put this in the format
+
+function fonts.map.convert_file(filename, handle) -- when handle is string, then assume file
+ local f, g = io.open(filename), nil
+ if f then
+ if not handle then
+ handle = print
+ elseif type(handle) == "string" then
+ g = io.open(handle,"w")
+ function handle(str)
+ g:write(str .. "\n")
+ end
+ end
+ handle("<?xml version='1.0' standalone='yes'?>\n")
+ handle(string.format("<!-- %s -->\n", "generated by context"))
+ handle(string.format("<fontlist original='%s'>\n", filename))
+ for line in f:lines() do
+ local comment = line:match("^[%#%%]%s*(.*)%s*$")
+ if comment then -- todo: optional
+ handle(string.format(" <!-- %s -->", comment))
+ elseif line:find("^\s*$") then
+ handle("")
+ else
+ name, fullname, spec, encoding, file = line:match("^(%S+)%s+(%S-)%s*\"([^\"]-)\"%s*<%s*(%S-)%s*<%s*(%S-)%s*$")
+ if not name then
+ name, fullname, spec, file = line:match("^(%S+)%s+(%S-)%s*\"([^\"]-)\"%s*<%s*(%S-)%s*$")
+ end
+ if not name then
+ name, fullname, encoding, file = line:match("^(%S+)%s+(%S-)%s*<%s*(%S-)%s*<%s*(%S-)%s*$")
+ end
+ if not name then
+ name, fullname, file = line:match("^(%S+)%s+(%S-)%s*<%s*(%S-)%s*$")
+ end
+ if name and name ~= "" and file and file ~= "" then
+ t = { }
+ if name then t[#t+1] = string.format("name='%s'" , name) end
+ if fullname and fullname ~= "" then t[#t+1] = string.format("fullname='%s'", fullname) end
+ if encoding and encoding ~= "" then t[#t+1] = string.format("encoding='%s'", encoding) end
+ if file then t[#t+1] = string.format("file='%s'" , file) end
+ if spec then
+ local a, b = spec:match("^([%d%.])%s+(%a+)$")
+ if a and b and b == "ExtendFont" then t[#t+1] = string.format("slant='%s'" , a) end
+ if a and b and b == "SlantFont" then t[#t+1] = string.format("stretch='%s'", a) end
+ end
+ handle(string.format(" <font %s/>",table.concat(t," ")))
+ end
+ end
+ end
+ handle("\n</fontlist>")
+ f:close()
+ if g then g:close() end
+ end
+end
+
+--~ fonts.map.convert_file("c:/data/develop/tex/texmf/fonts/map/dvips/lm/lm-ec.map")
+--~ fonts.map.convert_file("maptest.map")
+--~ fonts.map.convert_file("maptest.map", "maptest-1.xml")
+--~ fonts.map.convert_file("c:/data/develop/tex/texmf/fonts/map/pdftex/updmap/pdftex.map")
+--~ fonts.map.convert_file("c:/data/develop/tex/texmf/fonts/map/pdftex/updmap/pdftex.map", "maptest-2.xml")
+
+--~ fonts.map.convert_entries('maptest-2.xml')
+--~ fonts.map.process_entries('maptest.xml','pdftex')
+
+--~ print(table.serialize(fonts.map.data))
+
+--~ tex.sprint(fonts.map.flushlines("pdftex","\n"))
+--~ str = fonts.map.flushlines("pdftex")
diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua
new file mode 100644
index 000000000..c6a100566
--- /dev/null
+++ b/tex/context/base/font-otf.lua
@@ -0,0 +1,3416 @@
+if not modules then modules = { } end modules ['font-otf'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- otfdata zit in tfmdata / check
+
+--~ function string:split_at_space()
+--~ local t = { }
+--~ for s in self:gmatch("(%S+)") do
+--~ t[#t+1] = s
+--~ end
+--~ return t
+--~ end
+
+-- beware, the node related functions need to return head, current -- todo
+-- we may move marks to components so that parsing is faster
+
+-- using for i=1,#t do ... t[i] ... end is much faster than using ipairs
+-- copying some functions is faster than sharing code chunks esp here
+
+--[[ldx--
+<p>This module is sparesely documented because it is a moving target.
+The table format of the reader changes and we experiment a lot with
+different methods for supporting features.</p>
+
+<p>As with the <l n='afm'/> code, we may decide to store more information
+in the <l n='otf'/> table.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.otf = fonts.otf or { }
+fonts.otf.version = 1.56 -- incrementing this number one up will force a re-cache
+fonts.otf.tables = fonts.otf.tables or { }
+fonts.otf.meanings = fonts.otf.meanings or { }
+fonts.otf.enhance_data = false
+fonts.otf.syncspace = true
+fonts.otf.features = { }
+fonts.otf.features.aux = { }
+fonts.otf.features.data = { }
+fonts.otf.features.list = { } -- not (yet) used, oft fonts have gpos/gsub lists
+fonts.otf.features.default = { }
+fonts.otf.trace_features = false
+fonts.otf.trace_replacements = false
+fonts.otf.trace_contexts = false
+fonts.otf.trace_anchors = false
+fonts.otf.trace_ligatures = false
+fonts.otf.trace_kerns = false
+fonts.otf.notdef = false
+fonts.otf.cache = containers.define("fonts", "otf", fonts.otf.version, true)
+
+--[[ldx--
+<p>We start with a lot of tables and related functions.</p>
+--ldx]]--
+
+fonts.otf.tables.scripts = {
+ ['dflt'] = 'Default',
+
+ ['arab'] = 'Arabic',
+ ['armn'] = 'Armenian',
+ ['bali'] = 'Balinese',
+ ['beng'] = 'Bengali',
+ ['bopo'] = 'Bopomofo',
+ ['brai'] = 'Braille',
+ ['bugi'] = 'Buginese',
+ ['buhd'] = 'Buhid',
+ ['byzm'] = 'Byzantine Music',
+ ['cans'] = 'Canadian Syllabics',
+ ['cher'] = 'Cherokee',
+ ['copt'] = 'Coptic',
+ ['cprt'] = 'Cypriot Syllabary',
+ ['cyrl'] = 'Cyrillic',
+ ['deva'] = 'Devanagari',
+ ['dsrt'] = 'Deseret',
+ ['ethi'] = 'Ethiopic',
+ ['geor'] = 'Georgian',
+ ['glag'] = 'Glagolitic',
+ ['goth'] = 'Gothic',
+ ['grek'] = 'Greek',
+ ['gujr'] = 'Gujarati',
+ ['guru'] = 'Gurmukhi',
+ ['hang'] = 'Hangul',
+ ['hani'] = 'CJK Ideographic',
+ ['hano'] = 'Hanunoo',
+ ['hebr'] = 'Hebrew',
+ ['ital'] = 'Old Italic',
+ ['jamo'] = 'Hangul Jamo',
+ ['java'] = 'Javanese',
+ ['kana'] = 'Hiragana and Katakana',
+ ['khar'] = 'Kharosthi',
+ ['khmr'] = 'Khmer',
+ ['knda'] = 'Kannada',
+ ['lao' ] = 'Lao',
+ ['latn'] = 'Latin',
+ ['limb'] = 'Limbu',
+ ['linb'] = 'Linear B',
+ ['math'] = 'Mathematical Alphanumeric Symbols',
+ ['mlym'] = 'Malayalam',
+ ['mong'] = 'Mongolian',
+ ['musc'] = 'Musical Symbols',
+ ['mymr'] = 'Myanmar',
+ ['nko' ] = "N'ko",
+ ['ogam'] = 'Ogham',
+ ['orya'] = 'Oriya',
+ ['osma'] = 'Osmanya',
+ ['phag'] = 'Phags-pa',
+ ['phnx'] = 'Phoenician',
+ ['runr'] = 'Runic',
+ ['shaw'] = 'Shavian',
+ ['sinh'] = 'Sinhala',
+ ['sylo'] = 'Syloti Nagri',
+ ['syrc'] = 'Syriac',
+ ['tagb'] = 'Tagbanwa',
+ ['tale'] = 'Tai Le',
+ ['talu'] = 'Tai Lu',
+ ['taml'] = 'Tamil',
+ ['telu'] = 'Telugu',
+ ['tfng'] = 'Tifinagh',
+ ['tglg'] = 'Tagalog',
+ ['thaa'] = 'Thaana',
+ ['thai'] = 'Thai',
+ ['tibt'] = 'Tibetan',
+ ['ugar'] = 'Ugaritic Cuneiform',
+ ['xpeo'] = 'Old Persian Cuneiform',
+ ['xsux'] = 'Sumero-Akkadian Cuneiform',
+ ['yi' ] = 'Yi'
+}
+
+fonts.otf.tables.languages = {
+ ['dflt'] = 'Default',
+
+ ['aba'] = 'Abaza',
+ ['abk'] = 'Abkhazian',
+ ['ady'] = 'Adyghe',
+ ['afk'] = 'Afrikaans',
+ ['afr'] = 'Afar',
+ ['agw'] = 'Agaw',
+ ['als'] = 'Alsatian',
+ ['alt'] = 'Altai',
+ ['amh'] = 'Amharic',
+ ['ara'] = 'Arabic',
+ ['ari'] = 'Aari',
+ ['ark'] = 'Arakanese',
+ ['asm'] = 'Assamese',
+ ['ath'] = 'Athapaskan',
+ ['avr'] = 'Avar',
+ ['awa'] = 'Awadhi',
+ ['aym'] = 'Aymara',
+ ['aze'] = 'Azeri',
+ ['bad'] = 'Badaga',
+ ['bag'] = 'Baghelkhandi',
+ ['bal'] = 'Balkar',
+ ['bau'] = 'Baule',
+ ['bbr'] = 'Berber',
+ ['bch'] = 'Bench',
+ ['bcr'] = 'Bible Cree',
+ ['bel'] = 'Belarussian',
+ ['bem'] = 'Bemba',
+ ['ben'] = 'Bengali',
+ ['bgr'] = 'Bulgarian',
+ ['bhi'] = 'Bhili',
+ ['bho'] = 'Bhojpuri',
+ ['bik'] = 'Bikol',
+ ['bil'] = 'Bilen',
+ ['bkf'] = 'Blackfoot',
+ ['bli'] = 'Balochi',
+ ['bln'] = 'Balante',
+ ['blt'] = 'Balti',
+ ['bmb'] = 'Bambara',
+ ['bml'] = 'Bamileke',
+ ['bos'] = 'Bosnian',
+ ['bre'] = 'Breton',
+ ['brh'] = 'Brahui',
+ ['bri'] = 'Braj Bhasha',
+ ['brm'] = 'Burmese',
+ ['bsh'] = 'Bashkir',
+ ['bti'] = 'Beti',
+ ['cat'] = 'Catalan',
+ ['ceb'] = 'Cebuano',
+ ['che'] = 'Chechen',
+ ['chg'] = 'Chaha Gurage',
+ ['chh'] = 'Chattisgarhi',
+ ['chi'] = 'Chichewa',
+ ['chk'] = 'Chukchi',
+ ['chp'] = 'Chipewyan',
+ ['chr'] = 'Cherokee',
+ ['chu'] = 'Chuvash',
+ ['cmr'] = 'Comorian',
+ ['cop'] = 'Coptic',
+ ['cos'] = 'Corsican',
+ ['cre'] = 'Cree',
+ ['crr'] = 'Carrier',
+ ['crt'] = 'Crimean Tatar',
+ ['csl'] = 'Church Slavonic',
+ ['csy'] = 'Czech',
+ ['dan'] = 'Danish',
+ ['dar'] = 'Dargwa',
+ ['dcr'] = 'Woods Cree',
+ ['deu'] = 'German',
+ ['dgr'] = 'Dogri',
+ ['div'] = 'Divehi',
+ ['djr'] = 'Djerma',
+ ['dng'] = 'Dangme',
+ ['dnk'] = 'Dinka',
+ ['dri'] = 'Dari',
+ ['dun'] = 'Dungan',
+ ['dzn'] = 'Dzongkha',
+ ['ebi'] = 'Ebira',
+ ['ecr'] = 'Eastern Cree',
+ ['edo'] = 'Edo',
+ ['efi'] = 'Efik',
+ ['ell'] = 'Greek',
+ ['eng'] = 'English',
+ ['erz'] = 'Erzya',
+ ['esp'] = 'Spanish',
+ ['eti'] = 'Estonian',
+ ['euq'] = 'Basque',
+ ['evk'] = 'Evenki',
+ ['evn'] = 'Even',
+ ['ewe'] = 'Ewe',
+ ['fan'] = 'French Antillean',
+ ['far'] = 'Farsi',
+ ['fin'] = 'Finnish',
+ ['fji'] = 'Fijian',
+ ['fle'] = 'Flemish',
+ ['fne'] = 'Forest Nenets',
+ ['fon'] = 'Fon',
+ ['fos'] = 'Faroese',
+ ['fra'] = 'French',
+ ['fri'] = 'Frisian',
+ ['frl'] = 'Friulian',
+ ['fta'] = 'Futa',
+ ['ful'] = 'Fulani',
+ ['gad'] = 'Ga',
+ ['gae'] = 'Gaelic',
+ ['gag'] = 'Gagauz',
+ ['gal'] = 'Galician',
+ ['gar'] = 'Garshuni',
+ ['gaw'] = 'Garhwali',
+ ['gez'] = "Ge'ez",
+ ['gil'] = 'Gilyak',
+ ['gmz'] = 'Gumuz',
+ ['gon'] = 'Gondi',
+ ['grn'] = 'Greenlandic',
+ ['gro'] = 'Garo',
+ ['gua'] = 'Guarani',
+ ['guj'] = 'Gujarati',
+ ['hai'] = 'Haitian',
+ ['hal'] = 'Halam',
+ ['har'] = 'Harauti',
+ ['hau'] = 'Hausa',
+ ['haw'] = 'Hawaiin',
+ ['hbn'] = 'Hammer-Banna',
+ ['hil'] = 'Hiligaynon',
+ ['hin'] = 'Hindi',
+ ['hma'] = 'High Mari',
+ ['hnd'] = 'Hindko',
+ ['ho'] = 'Ho',
+ ['hri'] = 'Harari',
+ ['hrv'] = 'Croatian',
+ ['hun'] = 'Hungarian',
+ ['hye'] = 'Armenian',
+ ['ibo'] = 'Igbo',
+ ['ijo'] = 'Ijo',
+ ['ilo'] = 'Ilokano',
+ ['ind'] = 'Indonesian',
+ ['ing'] = 'Ingush',
+ ['inu'] = 'Inuktitut',
+ ['iri'] = 'Irish',
+ ['irt'] = 'Irish Traditional',
+ ['isl'] = 'Icelandic',
+ ['ism'] = 'Inari Sami',
+ ['ita'] = 'Italian',
+ ['iwr'] = 'Hebrew',
+ ['jan'] = 'Japanese',
+ ['jav'] = 'Javanese',
+ ['jii'] = 'Yiddish',
+ ['jud'] = 'Judezmo',
+ ['jul'] = 'Jula',
+ ['kab'] = 'Kabardian',
+ ['kac'] = 'Kachchi',
+ ['kal'] = 'Kalenjin',
+ ['kan'] = 'Kannada',
+ ['kar'] = 'Karachay',
+ ['kat'] = 'Georgian',
+ ['kaz'] = 'Kazakh',
+ ['keb'] = 'Kebena',
+ ['kge'] = 'Khutsuri Georgian',
+ ['kha'] = 'Khakass',
+ ['khk'] = 'Khanty-Kazim',
+ ['khm'] = 'Khmer',
+ ['khs'] = 'Khanty-Shurishkar',
+ ['khv'] = 'Khanty-Vakhi',
+ ['khw'] = 'Khowar',
+ ['kik'] = 'Kikuyu',
+ ['kir'] = 'Kirghiz',
+ ['kis'] = 'Kisii',
+ ['kkn'] = 'Kokni',
+ ['klm'] = 'Kalmyk',
+ ['kmb'] = 'Kamba',
+ ['kmn'] = 'Kumaoni',
+ ['kmo'] = 'Komo',
+ ['kms'] = 'Komso',
+ ['knr'] = 'Kanuri',
+ ['kod'] = 'Kodagu',
+ ['koh'] = 'Korean Old Hangul',
+ ['kok'] = 'Konkani',
+ ['kon'] = 'Kikongo',
+ ['kop'] = 'Komi-Permyak',
+ ['kor'] = 'Korean',
+ ['koz'] = 'Komi-Zyrian',
+ ['kpl'] = 'Kpelle',
+ ['kri'] = 'Krio',
+ ['krk'] = 'Karakalpak',
+ ['krl'] = 'Karelian',
+ ['krm'] = 'Karaim',
+ ['krn'] = 'Karen',
+ ['krt'] = 'Koorete',
+ ['ksh'] = 'Kashmiri',
+ ['ksi'] = 'Khasi',
+ ['ksm'] = 'Kildin Sami',
+ ['kui'] = 'Kui',
+ ['kul'] = 'Kulvi',
+ ['kum'] = 'Kumyk',
+ ['kur'] = 'Kurdish',
+ ['kuu'] = 'Kurukh',
+ ['kuy'] = 'Kuy',
+ ['kyk'] = 'Koryak',
+ ['lad'] = 'Ladin',
+ ['lah'] = 'Lahuli',
+ ['lak'] = 'Lak',
+ ['lam'] = 'Lambani',
+ ['lao'] = 'Lao',
+ ['lat'] = 'Latin',
+ ['laz'] = 'Laz',
+ ['lcr'] = 'L-Cree',
+ ['ldk'] = 'Ladakhi',
+ ['lez'] = 'Lezgi',
+ ['lin'] = 'Lingala',
+ ['lma'] = 'Low Mari',
+ ['lmb'] = 'Limbu',
+ ['lmw'] = 'Lomwe',
+ ['lsb'] = 'Lower Sorbian',
+ ['lsm'] = 'Lule Sami',
+ ['lth'] = 'Lithuanian',
+ ['ltz'] = 'Luxembourgish',
+ ['lub'] = 'Luba',
+ ['lug'] = 'Luganda',
+ ['luh'] = 'Luhya',
+ ['luo'] = 'Luo',
+ ['lvi'] = 'Latvian',
+ ['maj'] = 'Majang',
+ ['mak'] = 'Makua',
+ ['mal'] = 'Malayalam Traditional',
+ ['man'] = 'Mansi',
+ ['map'] = 'Mapudungun',
+ ['mar'] = 'Marathi',
+ ['maw'] = 'Marwari',
+ ['mbn'] = 'Mbundu',
+ ['mch'] = 'Manchu',
+ ['mcr'] = 'Moose Cree',
+ ['mde'] = 'Mende',
+ ['men'] = "Me'en",
+ ['miz'] = 'Mizo',
+ ['mkd'] = 'Macedonian',
+ ['mle'] = 'Male',
+ ['mlg'] = 'Malagasy',
+ ['mln'] = 'Malinke',
+ ['mlr'] = 'Malayalam Reformed',
+ ['mly'] = 'Malay',
+ ['mnd'] = 'Mandinka',
+ ['mng'] = 'Mongolian',
+ ['mni'] = 'Manipuri',
+ ['mnk'] = 'Maninka',
+ ['mnx'] = 'Manx Gaelic',
+ ['moh'] = 'Mohawk',
+ ['mok'] = 'Moksha',
+ ['mol'] = 'Moldavian',
+ ['mon'] = 'Mon',
+ ['mor'] = 'Moroccan',
+ ['mri'] = 'Maori',
+ ['mth'] = 'Maithili',
+ ['mts'] = 'Maltese',
+ ['mun'] = 'Mundari',
+ ['nag'] = 'Naga-Assamese',
+ ['nan'] = 'Nanai',
+ ['nas'] = 'Naskapi',
+ ['ncr'] = 'N-Cree',
+ ['ndb'] = 'Ndebele',
+ ['ndg'] = 'Ndonga',
+ ['nep'] = 'Nepali',
+ ['new'] = 'Newari',
+ ['ngr'] = 'Nagari',
+ ['nhc'] = 'Norway House Cree',
+ ['nis'] = 'Nisi',
+ ['niu'] = 'Niuean',
+ ['nkl'] = 'Nkole',
+ ['nko'] = "N'ko",
+ ['nld'] = 'Dutch',
+ ['nog'] = 'Nogai',
+ ['nor'] = 'Norwegian',
+ ['nsm'] = 'Northern Sami',
+ ['nta'] = 'Northern Tai',
+ ['nto'] = 'Esperanto',
+ ['nyn'] = 'Nynorsk',
+ ['oci'] = 'Occitan',
+ ['ocr'] = 'Oji-Cree',
+ ['ojb'] = 'Ojibway',
+ ['ori'] = 'Oriya',
+ ['oro'] = 'Oromo',
+ ['oss'] = 'Ossetian',
+ ['paa'] = 'Palestinian Aramaic',
+ ['pal'] = 'Pali',
+ ['pan'] = 'Punjabi',
+ ['pap'] = 'Palpa',
+ ['pas'] = 'Pashto',
+ ['pgr'] = 'Polytonic Greek',
+ ['pil'] = 'Pilipino',
+ ['plg'] = 'Palaung',
+ ['plk'] = 'Polish',
+ ['pro'] = 'Provencal',
+ ['ptg'] = 'Portuguese',
+ ['qin'] = 'Chin',
+ ['raj'] = 'Rajasthani',
+ ['rbu'] = 'Russian Buriat',
+ ['rcr'] = 'R-Cree',
+ ['ria'] = 'Riang',
+ ['rms'] = 'Rhaeto-Romanic',
+ ['rom'] = 'Romanian',
+ ['roy'] = 'Romany',
+ ['rsy'] = 'Rusyn',
+ ['rua'] = 'Ruanda',
+ ['rus'] = 'Russian',
+ ['sad'] = 'Sadri',
+ ['san'] = 'Sanskrit',
+ ['sat'] = 'Santali',
+ ['say'] = 'Sayisi',
+ ['sek'] = 'Sekota',
+ ['sel'] = 'Selkup',
+ ['sgo'] = 'Sango',
+ ['shn'] = 'Shan',
+ ['sib'] = 'Sibe',
+ ['sid'] = 'Sidamo',
+ ['sig'] = 'Silte Gurage',
+ ['sks'] = 'Skolt Sami',
+ ['sky'] = 'Slovak',
+ ['sla'] = 'Slavey',
+ ['slv'] = 'Slovenian',
+ ['sml'] = 'Somali',
+ ['smo'] = 'Samoan',
+ ['sna'] = 'Sena',
+ ['snd'] = 'Sindhi',
+ ['snh'] = 'Sinhalese',
+ ['snk'] = 'Soninke',
+ ['sog'] = 'Sodo Gurage',
+ ['sot'] = 'Sotho',
+ ['sqi'] = 'Albanian',
+ ['srb'] = 'Serbian',
+ ['srk'] = 'Saraiki',
+ ['srr'] = 'Serer',
+ ['ssl'] = 'South Slavey',
+ ['ssm'] = 'Southern Sami',
+ ['sur'] = 'Suri',
+ ['sva'] = 'Svan',
+ ['sve'] = 'Swedish',
+ ['swa'] = 'Swadaya Aramaic',
+ ['swk'] = 'Swahili',
+ ['swz'] = 'Swazi',
+ ['sxt'] = 'Sutu',
+ ['syr'] = 'Syriac',
+ ['tab'] = 'Tabasaran',
+ ['taj'] = 'Tajiki',
+ ['tam'] = 'Tamil',
+ ['tat'] = 'Tatar',
+ ['tcr'] = 'TH-Cree',
+ ['tel'] = 'Telugu',
+ ['tgn'] = 'Tongan',
+ ['tgr'] = 'Tigre',
+ ['tgy'] = 'Tigrinya',
+ ['tha'] = 'Thai',
+ ['tht'] = 'Tahitian',
+ ['tib'] = 'Tibetan',
+ ['tkm'] = 'Turkmen',
+ ['tmn'] = 'Temne',
+ ['tna'] = 'Tswana',
+ ['tne'] = 'Tundra Nenets',
+ ['tng'] = 'Tonga',
+ ['tod'] = 'Todo',
+ ['trk'] = 'Turkish',
+ ['tsg'] = 'Tsonga',
+ ['tua'] = 'Turoyo Aramaic',
+ ['tul'] = 'Tulu',
+ ['tuv'] = 'Tuvin',
+ ['twi'] = 'Twi',
+ ['udm'] = 'Udmurt',
+ ['ukr'] = 'Ukrainian',
+ ['urd'] = 'Urdu',
+ ['usb'] = 'Upper Sorbian',
+ ['uyg'] = 'Uyghur',
+ ['uzb'] = 'Uzbek',
+ ['ven'] = 'Venda',
+ ['vit'] = 'Vietnamese',
+ ['wa' ] = 'Wa',
+ ['wag'] = 'Wagdi',
+ ['wcr'] = 'West-Cree',
+ ['wel'] = 'Welsh',
+ ['wlf'] = 'Wolof',
+ ['xbd'] = 'Tai Lue',
+ ['xhs'] = 'Xhosa',
+ ['yak'] = 'Yakut',
+ ['yba'] = 'Yoruba',
+ ['ycr'] = 'Y-Cree',
+ ['yic'] = 'Yi Classic',
+ ['yim'] = 'Yi Modern',
+ ['zhh'] = 'Chinese Hong Kong',
+ ['zhp'] = 'Chinese Phonetic',
+ ['zhs'] = 'Chinese Simplified',
+ ['zht'] = 'Chinese Traditional',
+ ['znd'] = 'Zande',
+ ['zul'] = 'Zulu'
+}
+
+fonts.otf.tables.features = {
+ ['aalt'] = 'Access All Alternates',
+ ['abvf'] = 'Above-Base Forms',
+ ['abvm'] = 'Above-Base Mark Positioning',
+ ['abvs'] = 'Above-Base Substitutions',
+ ['afrc'] = 'Alternative Fractions',
+ ['akhn'] = 'Akhands',
+ ['blwf'] = 'Below-Base Forms',
+ ['blwm'] = 'Below-Base Mark Positioning',
+ ['blws'] = 'Below-Base Substitutions',
+ ['c2pc'] = 'Petite Capitals From Capitals',
+ ['c2sc'] = 'Small Capitals From Capitals',
+ ['calt'] = 'Contextual Alternates',
+ ['case'] = 'Case-Sensitive Forms',
+ ['ccmp'] = 'Glyph Composition/Decomposition',
+ ['cjct'] = 'Conjunct Forms',
+ ['clig'] = 'Contextual Ligatures',
+ ['cpsp'] = 'Capital Spacing',
+ ['cswh'] = 'Contextual Swash',
+ ['curs'] = 'Cursive Positioning',
+ ['dflt'] = 'Default Processing',
+ ['dist'] = 'Distances',
+ ['dlig'] = 'Discretionary Ligatures',
+ ['dnom'] = 'Denominators',
+ ['expt'] = 'Expert Forms',
+ ['falt'] = 'Final glyph Alternates',
+ ['fin2'] = 'Terminal Forms #2',
+ ['fin3'] = 'Terminal Forms #3',
+ ['fina'] = 'Terminal Forms',
+ ['frac'] = 'Fractions',
+ ['fwid'] = 'Full Width',
+ ['half'] = 'Half Forms',
+ ['haln'] = 'Halant Forms',
+ ['halt'] = 'Alternate Half Width',
+ ['hist'] = 'Historical Forms',
+ ['hkna'] = 'Horizontal Kana Alternates',
+ ['hlig'] = 'Historical Ligatures',
+ ['hngl'] = 'Hangul',
+ ['hojo'] = 'Hojo Kanji Forms',
+ ['hwid'] = 'Half Width',
+ ['init'] = 'Initial Forms',
+ ['isol'] = 'Isolated Forms',
+ ['ital'] = 'Italics',
+ ['jalt'] = 'Justification Alternatives',
+ ['jp04'] = 'JIS2004 Forms',
+ ['jp78'] = 'JIS78 Forms',
+ ['jp83'] = 'JIS83 Forms',
+ ['jp90'] = 'JIS90 Forms',
+ ['kern'] = 'Kerning',
+ ['lfbd'] = 'Left Bounds',
+ ['liga'] = 'Standard Ligatures',
+ ['ljmo'] = 'Leading Jamo Forms',
+ ['lnum'] = 'Lining Figures',
+ ['locl'] = 'Localized Forms',
+ ['mark'] = 'Mark Positioning',
+ ['med2'] = 'Medial Forms #2',
+ ['medi'] = 'Medial Forms',
+ ['mgrk'] = 'Mathematical Greek',
+ ['mkmk'] = 'Mark to Mark Positioning',
+ ['mset'] = 'Mark Positioning via Substitution',
+ ['nalt'] = 'Alternate Annotation Forms',
+ ['nlck'] = 'NLC Kanji Forms',
+ ['nukt'] = 'Nukta Forms',
+ ['numr'] = 'Numerators',
+ ['onum'] = 'Old Style Figures',
+ ['opbd'] = 'Optical Bounds',
+ ['ordn'] = 'Ordinals',
+ ['ornm'] = 'Ornaments',
+ ['palt'] = 'Proportional Alternate Width',
+ ['pcap'] = 'Petite Capitals',
+ ['pnum'] = 'Proportional Figures',
+ ['pref'] = 'Pre-base Forms',
+ ['pres'] = 'Pre-base Substitutions',
+ ['pstf'] = 'Post-base Forms',
+ ['psts'] = 'Post-base Substitutions',
+ ['pwid'] = 'Proportional Widths',
+ ['qwid'] = 'Quarter Widths',
+ ['rand'] = 'Randomize',
+ ['rkrf'] = 'Rakar Forms',
+ ['rlig'] = 'Required Ligatures',
+ ['rphf'] = 'Reph Form',
+ ['rtbd'] = 'Right Bounds',
+ ['rtla'] = 'Right-To-Left Alternates',
+ ['ruby'] = 'Ruby Notation Forms',
+ ['salt'] = 'Stylistic Alternates',
+ ['sinf'] = 'Scientific Inferiors',
+ ['size'] = 'Optical Size',
+ ['smcp'] = 'Small Capitals',
+ ['smpl'] = 'Simplified Forms',
+ ['ss01'] = 'Sylistic Set 1',
+ ['ss02'] = 'Sylistic Set 2',
+ ['ss03'] = 'Sylistic Set 3',
+ ['ss04'] = 'Sylistic Set 4',
+ ['ss05'] = 'Sylistic Set 5',
+ ['ss06'] = 'Sylistic Set 6',
+ ['ss07'] = 'Sylistic Set 7',
+ ['ss08'] = 'Sylistic Set 8',
+ ['ss09'] = 'Sylistic Set 9',
+ ['ss10'] = 'Sylistic Set 10',
+ ['ss11'] = 'Sylistic Set 11',
+ ['ss12'] = 'Sylistic Set 12',
+ ['ss13'] = 'Sylistic Set 13',
+ ['ss14'] = 'Sylistic Set 14',
+ ['ss15'] = 'Sylistic Set 15',
+ ['ss16'] = 'Sylistic Set 16',
+ ['ss17'] = 'Sylistic Set 17',
+ ['ss18'] = 'Sylistic Set 18',
+ ['ss19'] = 'Sylistic Set 19',
+ ['ss20'] = 'Sylistic Set 20',
+ ['subs'] = 'Subscript',
+ ['sups'] = 'Superscript',
+ ['swsh'] = 'Swash',
+ ['titl'] = 'Titling',
+ ['tjmo'] = 'Trailing Jamo Forms',
+ ['tnam'] = 'Traditional Name Forms',
+ ['tnum'] = 'Tabular Figures',
+ ['trad'] = 'Traditional Forms',
+ ['twid'] = 'Third Widths',
+ ['unic'] = 'Unicase',
+ ['valt'] = 'Alternate Vertical Metrics',
+ ['vatu'] = 'Vattu Variants',
+ ['vert'] = 'Vertical Writing',
+ ['vhal'] = 'Alternate Vertical Half Metrics',
+ ['vjmo'] = 'Vowel Jamo Forms',
+ ['vkna'] = 'Vertical Kana Alternates',
+ ['vkrn'] = 'Vertical Kerning',
+ ['vpal'] = 'Proportional Alternate Vertical Metrics',
+ ['vrt2'] = 'Vertical Rotation',
+ ['zero'] = 'Slashed Zero'
+}
+
+fonts.otf.tables.baselines = {
+ ['hang'] = 'Hanging baseline',
+ ['icfb'] = 'Ideographic character face bottom edge baseline',
+ ['icft'] = 'Ideographic character face tope edige baseline',
+ ['ideo'] = 'Ideographic em-box bottom edge baseline',
+ ['idtp'] = 'Ideographic em-box top edge baseline',
+ ['math'] = 'Mathmatical centered baseline',
+ ['romn'] = 'Roman baseline'
+}
+
+function fonts.otf.tables.to_tag(id)
+ return stringformat("%4s",id:lower())
+end
+
+function fonts.otf.meanings.resolve(tab,id)
+ if tab and id then
+ id = id:lower()
+ return tab[id] or tab[id:gsub(" ","")] or tab['dflt'] or ''
+ else
+ return "unknown"
+ end
+end
+
+function fonts.otf.meanings.script(id)
+ return fonts.otf.meanings.resolve(fonts.otf.tables.scripts,id)
+end
+function fonts.otf.meanings.language(id)
+ return fonts.otf.meanings.resolve(fonts.otf.tables.languages,id)
+end
+function fonts.otf.meanings.feature(id)
+ return fonts.otf.meanings.resolve(fonts.otf.tables.features,id)
+end
+function fonts.otf.meanings.baseline(id)
+ return fonts.otf.meanings.resolve(fonts.otf.tables.baselines,id)
+end
+
+--[[ldx--
+<p>Here we go.</p>
+--ldx]]--
+
+fonts.otf.enhance = { }
+
+function fonts.otf.load(filename,format,sub,featurefile)
+ local name = file.basename(file.removesuffix(filename))
+ if featurefile then
+ name = name .. "@" .. file.removesuffix(file.basename(featurefile))
+ end
+ local data = containers.read(fonts.otf.cache, name)
+ if not data then
+ local ff
+ if sub and sub ~= "" then
+ ff = fontforge.open(filename,sub)
+ else
+ ff = fontforge.open(filename)
+ end
+ if ff then
+ logs.report("load otf","loading: " .. filename)
+ if featurefile then
+ featurefile = input.find_file(texmf.instance,file.addsuffix(featurefile,'fea'),"FONTFEATURES")
+ if featurefile and featurefile ~= "" then
+ logs.report("load otf", "featurefile: " .. featurefile)
+ fontforge.apply_featurefile(ff, featurefile)
+ end
+ end
+ data = fontforge.to_table(ff)
+ fontforge.close(ff)
+ if data then
+ logs.report("load otf","enhance: before")
+ fonts.otf.enhance.before(data,filename)
+ logs.report("load otf","enhance: analyze")
+ fonts.otf.enhance.analyze(data,filename)
+ logs.report("load otf","enhance: after")
+ fonts.otf.enhance.after(data,filename)
+ logs.report("load otf","save in cache")
+ data = containers.write(fonts.otf.cache, name, data)
+ else
+ logs.error("load otf","loading failed")
+ end
+ end
+ end
+ if data then
+ local map = data.map.map
+ local backmap = data.map.backmap
+ local unicodes = data.luatex.unicodes
+ local glyphs = data.glyphs
+ -- maybe handy some day, not used
+ data.name_to_unicode = function (n) return unicodes[n] end
+ data.name_to_index = function (n) return map[unicodes[n]] end
+ data.index_to_name = function (i) return glyphs[i].name end
+ data.unicode_to_name = function (u) return glyphs[map[u]].name end
+ data.index_to_unicode = function (u) return backmap[u] end
+ data.unicode_to_index = function (u) return map[u] end
+ end
+ return data
+end
+
+function fonts.otf.enhance.analyze(data,filename)
+ local t = {
+ filename = file.basename(filename),
+ version = fonts.otf.version,
+ creator = "context mkiv",
+ unicodes = fonts.otf.analyze_unicodes(data),
+ gposfeatures = fonts.otf.analyze_features(data.gpos),
+ gsubfeatures = fonts.otf.analyze_features(data.gsub),
+ marks = fonts.otf.analyze_class(data,'mark'),
+ }
+ t.subtables, t.name_to_type, t.internals, t.always_valid, t.ignore_flags = fonts.otf.analyze_subtables(data)
+ data.luatex = t
+end
+
+function fonts.otf.enhance.before(data,filename)
+ local private = 0xE000
+ local uni_to_int = data.map.map
+ local int_to_uni = data.map.backmap
+ for index, glyph in pairs(data.glyphs) do
+ if index > 0 and glyph.unicodeenc == -1 then
+ while uni_to_int[private] do
+ private = private + 1
+ end
+ uni_to_int[private] = index
+ int_to_uni[index] = private
+ glyph.unicodeenc = private
+ logs.report("load otf",string.format("enhance: glyph %s at index %s is moved to private unicode slot %s",glyph.name,index,private))
+ end
+ end
+ if data.ttf_tables then
+ for _, v in ipairs(data.ttf_tables) do
+ if v.data then v.data = "deleted" end
+ --~ if v.data then v.data = v.data:gsub("\026","\\026") end -- does not work out well
+ end
+ end
+end
+
+function fonts.otf.enhance.after(data,filename)
+ local unicodes = data.luatex.unicodes
+ for index, glyph in pairs(data.glyphs) do
+ if glyph.kerns then
+ local mykerns = { }
+ for k,v in ipairs(glyph.kerns) do
+ local mkl = mykerns[v.lookup]
+ if not mkl then
+ mkl = { [unicodes[v.char]] = v.off }
+ mykerns[v.lookup] = mkl
+ else
+ mkl[unicodes[v.char]] = v.off
+ end
+ end
+ glyph.mykerns = mykerns
+ end
+ end
+end
+
+function fonts.otf.analyze_class(data,class)
+ local classes = { }
+ for index, glyph in pairs(data.glyphs) do
+ if glyph.class == class then
+ classes[glyph.unicodeenc] = true
+ end
+ end
+ return classes
+end
+
+function fonts.otf.analyze_subtables(data)
+ local subtables, name_to_type, internals, always_valid, ignore_flags = { }, { }, { }, { }, { }
+ local function collect(g)
+ if g then
+ for k,v in ipairs(g) do
+ if v.features then
+ local ignored = { false, false, false }
+ if v.flags.ignorecombiningmarks then ignored[1] = 'mark' end
+ if v.flags.ignorebasechars then ignored[2] = 'base' end
+ if v.flags.ignoreligatures then ignored[3] = 'ligature' end
+ if v.subtables then
+ local type = v.type
+ for _, feature in ipairs(v.features) do
+ local ft = feature.tag:lower()
+ subtables[ft] = subtables[ft] or { }
+ for _, script in ipairs(feature.scripts) do
+ local ss = script.script
+ ss = ss:lower()
+ ss = ss:strip()
+ sft = subtables[ft]
+ sft[ss] = sft[ss] or { }
+ local sfts = sft[ss]
+ for _, language in ipairs(script.langs) do
+ language = language:lower()
+ language = language:strip()
+ sfts[language] = sfts[language] or { }
+ local sftsl = sfts[language]
+ local lookups, valid = sftsl.lookups or { }, sftsl.valid or { }
+ for n, subtable in ipairs(v.subtables) do
+ local stl = subtable.name
+ if stl then
+ lookups[#lookups+1] = stl
+ valid[stl] = true
+ name_to_type[stl] = type
+ ignore_flags[stl] = ignored
+ end
+ end
+ sftsl.lookups, sftsl.valid = lookups, valid
+ end
+ end
+ end
+ end
+ else
+ -- we have an internal feature, say ss_l_83 that resolves to
+ -- subfeatures like ss_l_83_s which we find in the glyphs
+ name_to_type[v.name] = v.type
+ local lookups, valid = { }, { }
+ for n, subtable in ipairs(v.subtables) do
+ local stl = subtable.name
+ if stl then
+ lookups[#lookups+1] = stl
+ valid[stl] = true
+ -- name_to_type[stl] = type
+ always_valid[stl] = true
+ end
+ end
+ internals[v.name] = {
+ lookups = lookups,
+ valid = valid
+ }
+ always_valid[v.name] = true -- bonus
+ end
+ end
+ end
+ end
+ collect(data.gsub)
+ collect(data.gpos)
+ return subtables, name_to_type, internals, always_valid, ignore_flags
+end
+
+function fonts.otf.analyze_unicodes(data)
+ local unicodes = { }
+ for _, blob in pairs(data.glyphs) do
+ if blob.name then
+ unicodes[blob.name] = blob.unicodeenc or 0
+ end
+ end
+ unicodes['space'] = unicodes['space'] or 32 -- handly later on
+ return unicodes
+end
+
+function fonts.otf.analyze_features(g)
+ if g then
+ local t, done = { }, { }
+ for k,v in ipairs(g) do
+ local f = v.features
+ if f then
+ for k, v in ipairs(f) do
+ -- scripts and tag
+ local tag = v.tag
+ if not done[tag] then
+ t[#t+1] = tag
+ done[tag] = true
+ end
+ end
+ end
+ end
+ if #t > 0 then
+ return t
+ end
+ end
+ return nil
+end
+
+function fonts.otf.valid_subtable(otfdata,language,script,kind)
+ local t = otfdata.luatex.subtables
+ return t[kind] and t[kind][script] and t[kind][script][language] and t[kind][script][language].lookups
+end
+
+function fonts.otf.features.register(name,default)
+ fonts.otf.features.list[#fonts.otf.features.list+1] = name
+ fonts.otf.features.default[name] = default
+end
+
+function fonts.otf.set_features(tfmdata)
+ local shared = tfmdata.shared
+ local otfdata = shared.otfdata
+ shared.features = fonts.define.check(shared.features,fonts.otf.features.default)
+ local features = shared.features
+ if not table.is_empty(features) then
+ local gposlist = otfdata.luatex.gposfeatures
+ local gsublist = otfdata.luatex.gsubfeatures
+ local mode = tfmdata.mode or fonts.mode
+ local fi = fonts.initializers[mode]
+ if fi and fi.otf then
+ function initialize(list) -- using tex lig and kerning
+ if list then
+ for _, f in ipairs(list) do
+ local value = features[f]
+ if value and fi.otf[f] then -- brr
+ if fonts.otf.trace_features then
+ logs.report("define otf",string.format("initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown', tfmdata.name or 'unknown'))
+ end
+ fi.otf[f](tfmdata,value) -- can set mode (no need to pass otf)
+ mode = tfmdata.mode or fonts.mode
+ fi = fonts.initializers[mode]
+ end
+ end
+ end
+ end
+ initialize(fonts.triggers)
+ initialize(gsublist)
+ initialize(gposlist)
+ end
+ local fm = fonts.methods[mode]
+ if fm and fm.otf then
+ function register(list) -- node manipulations
+ if list then
+ for _, f in ipairs(list) do
+ if features[f] and fm.otf[f] then -- brr
+ if not shared.processors then -- maybe also predefine
+ shared.processors = { fm.otf[f] }
+ else
+ shared.processors[#shared.processors+1] = fm.otf[f]
+ end
+ end
+ end
+ end
+ end
+ register(fonts.triggers)
+ register(gsublist)
+ register(gposlist)
+ end
+ end
+end
+
+function fonts.otf.otf_to_tfm(specification)
+ local name = specification.name
+ local sub = specification.sub
+ local filename = specification.filename
+ local format = specification.format
+ local features = specification.features.normal
+ local cache_id = specification.hash
+ local tfmdata = containers.read(fonts.tfm.cache,cache_id)
+ if not tfmdata then
+ local otfdata = fonts.otf.load(filename,format,sub,features and features.featurefile)
+ if not table.is_empty(otfdata) then
+ tfmdata = fonts.otf.copy_to_tfm(otfdata)
+ if not table.is_empty(tfmdata) then
+ tfmdata.shared = tfmdata.shared or { }
+ tfmdata.unique = tfmdata.unique or { }
+ tfmdata.shared.otfdata = otfdata
+ tfmdata.shared.features = features
+ fonts.otf.set_features(tfmdata)
+ end
+ end
+ containers.write(fonts.tfm.cache,cache_id,tfmdata)
+ end
+ return tfmdata
+end
+
+function fonts.otf.features.prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all
+ if value then
+ local otfdata = tfmdata.shared.otfdata
+ local charlist = otfdata.glyphs
+ local unicodes = otfdata.luatex.unicodes
+ local somevalid = fonts.otf.some_valid_feature(otfdata,tfmdata.language,tfmdata.script,kind)
+ for _, chr in pairs(tfmdata.characters) do
+ local d = charlist[chr.index]
+ if d and d.kerns then
+ local t, done = chr.kerns or { }, false
+ for _, v in pairs(d.kerns) do
+ if somevalid[v.lookup] then
+ local k = unicodes[v.char]
+ if k > 0 then
+ t[k], done = v.off, true
+ end
+ end
+ end
+ if done then
+ chr.kerns = t
+ end
+ end
+ end
+ end
+end
+
+function fonts.otf.copy_to_tfm(data)
+ if data then
+ local tfm = { characters = { }, parameters = { } }
+ local unicodes = data.luatex.unicodes
+ local characters = tfm.characters
+ local force = fonts.otf.notdef
+ for k,v in pairs(data.map.map) do
+ -- k = unicode, v = slot
+ local d = data.glyphs[v]
+ -- if d then
+ if d and (force or d.name) then
+ local t = { }
+ t.index = v
+ t.unicode = k
+ t.name = d.name or ".notdef"
+ t.boundingbox = d.boundingbox or nil
+ t.width = d.width or 0
+ t.height = d.boundingbox[4] or 0
+ t.depth = - d.boundingbox[2] or 0
+ t.class = d.class
+ if d.class == "mark" then
+ t.width = -t.width
+ end
+ characters[k] = t
+ end
+ end
+ tfm.units = data.units_per_em or 1000
+ -- we need a runtime lookup because of running from cdrom or zip
+ tfm.filename = input.findbinfile(texmf.instance,data.luatex.filename,"") or data.luatex.filename
+ tfm.fullname = data.fullname or data.fontname
+ tfm.cidinfo = data.cidinfo
+ -- if not tfm.cidinfo.registry then tfm.cidinfo.registry = "" end
+ tfm.cidinfo.registry = tfm.cidinfo.registry or ""
+ tfm.name = file.removesuffix(file.basename(tfm.filename))
+ tfm.type = "real"
+ tfm.stretch = 0 -- stretch
+ tfm.slant = 0 -- slant
+ tfm.direction = 0
+ tfm.boundarychar_label = 0
+ tfm.boundarychar = 65536
+ tfm.designsize = ((data.designsize or 100)/10)*65536
+ local spaceunits = 500
+ tfm.spacer = "500 units"
+ data.isfixedpitch = data.pfminfo and data.pfminfo.panose and data.pfminfo.panose["proportion"] == "Monospaced"
+ data.charwidth = nil
+ if data.pfminfo then
+ data.charwidth = data.pfminfo.avgwidth
+ end
+ if data.isfixedpitch then
+ if data.glyphs[unicodes['space']] then
+ spaceunits, tfm.spacer = data.glyphs[unicodes['space']].width, "space"
+ elseif data.glyphs[unicodes['emdash']] then
+ spaceunits, tfm.spacer = data.glyphs[unicodes['emdash']].width, "emdash"
+ elseif data.charwidth then
+ spaceunits, tfm.spacer = data.charwidth, "charwidth"
+ end
+ elseif data.glyphs[unicodes['space']] then
+ spaceunits, tfm.spacer = data.glyphs[unicodes['space']].width, "space"
+ elseif data.glyphs[unicodes['emdash']] then
+ spaceunits, tfm.spacer = data.glyphs[unicodes['emdash']].width/2, "emdash/2"
+ elseif data.charwidth then
+ spaceunits, tfm.spacer = data.charwidth, "charwidth"
+ end
+ spaceunits = tonumber(spaceunits)
+ tfm.parameters[1] = 0 -- slant
+ tfm.parameters[2] = spaceunits -- space
+ tfm.parameters[3] = 500 -- space_stretch
+ tfm.parameters[4] = 333 -- space_shrink
+ tfm.parameters[5] = 400 -- x_height
+ tfm.parameters[6] = 1000 -- quad
+ tfm.parameters[7] = 0 -- extra_space (todo)
+ if spaceunits < 200 then
+ -- todo: warning
+ end
+ tfm.italicangle = data.italicangle
+ tfm.ascender = math.abs(data.ascent or 0)
+ tfm.descender = math.abs(data.descent or 0)
+ if data.italicangle then -- maybe also in afm _
+ tfm.parameters[1] = tfm.parameters[1] - math.round(math.tan(data.italicangle*math.pi/180))
+ end
+ if data.isfixedpitch then
+ tfm.parameters[3] = 0
+ tfm.parameters[4] = 0
+ elseif fonts.otf.syncspace then
+ tfm.parameters[3] = spaceunits/2 -- space_stretch
+ tfm.parameters[4] = spaceunits/3 -- space_shrink
+ end
+ if data.pfminfo and data.pfminfo.os2_xheight and data.pfminfo.os2_xheight > 0 then
+ tfm.parameters[5] = data.pfminfo.os2_xheight
+ elseif data.glyphs[unicodes['x']] and data.glyphs[unicodes['x']].height then
+ tfm.parameters[5] = data.glyphs[unicodes['x']].height
+ end
+ return tfm
+ else
+ return nil
+ end
+end
+
+function fonts.tfm.read_from_open_type(specification)
+ local tfmtable = fonts.otf.otf_to_tfm(specification)
+ if tfmtable then
+ tfmtable.name = specification.name
+ tfmtable.sub = specification.sub
+ tfmtable = fonts.tfm.scale(tfmtable, specification.size)
+ tfmtable.file = file.basename(specification.filename)
+ tfmtable.format = specification.format
+ end
+ return tfmtable
+end
+
+-- scripts
+
+fonts.otf.default_language = 'latn'
+fonts.otf.default_script = 'dflt'
+
+function fonts.otf.valid_feature(otfdata,language,script) -- return hash is faster
+ local language = language or fonts.otf.default_language
+ local script = script or fonts.otf.default_script
+ if not (script and language) then
+ return boolean.alwaystrue
+ else
+ language = string.padd(language:lower(),4)
+ script = string.padd(script:lower (),4)
+ local t = { }
+ for k,v in pairs(otfdata.luatex.subtables) do
+ local vv = v[script]
+ if vv and vv[language] then
+ t[k] = vv[language].valid
+ end
+ end
+ local always = otfdata.luatex.always_valid -- for the moment not per feature
+ return function(kind,tag) -- is the kind test needed
+ return always[tag] or kind and t[kind] and t[kind][tag]
+ end
+ end
+end
+function fonts.otf.some_valid_feature(otfdata,language,script,kind)
+ local language = language or fonts.otf.default_language
+ local script = script or fonts.otf.default_script
+ if not (script and language) then
+ return boolean.alwaystrue
+ else
+ language = string.padd(language:lower(),4)
+ script = string.padd(script:lower (),4)
+ local t = otfdata.luatex.subtables[kind]
+ if t and t[script] and t[script][language] and t[script][language].valid then
+ return t[script][language].valid
+ else
+ return { }
+ end
+--~ return (t and t[script][language] and t[script][language].valid) or { }
+ end
+end
+
+function fonts.otf.features.aux.resolve_ligatures(tfmdata,ligatures,kind)
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local chars = tfmdata.characters
+ local changed = tfmdata.changed or { }
+ local done = { }
+ kind = kind or "unknown"
+ while true do
+ local ok = false
+ for k,v in pairs(ligatures) do
+ local lig = v[1]
+ if not done[lig] then
+ local ligs = lig:split(" ")
+ if #ligs == 2 then
+ local c, f, s = chars[v[2]], ligs[1], ligs[2]
+ local uf, us = unicodes[f], unicodes[s]
+ if changed[uf] or changed[us] then
+ if fonts.otf.trace_features then
+ logs.report("define otf",string.format("%s: %s (%s) + %s (%s) ignored",kind,f,uf,s,us))
+ end
+ else
+ local first, second = chars[uf], us
+ if first and second then
+ if not first.ligatures then first.ligatures = { } end
+ first.ligatures[second] = {
+ char = unicodes[c.name],
+ type = 0
+ }
+ if fonts.otf.trace_features then
+ logs.report("define otf",string.format("%s: %s (%s) + %s (%s) = %s (%s)",kind,f,uf,s,us,c.name,unicodes[c.name]))
+ end
+ end
+ end
+ ok, done[lig] = true, c.name
+ end
+ end
+ end
+ if ok then
+ for d,n in pairs(done) do
+ local pattern = "^(" .. d .. ") "
+ for k,v in pairs(ligatures) do
+ v[1] = v[1]:gsub(pattern, function(str)
+ return n .. " "
+ end)
+ end
+ end
+ else
+ break
+ end
+ end
+end
+
+function fonts.otf.features.prepare_base_substitutions(tfmdata,kind,value) -- we can share some code with the node features
+ if value then
+ local ligatures = { }
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local trace = fonts.otf.trace_features
+ local chars = tfmdata.characters
+ local somevalid = fonts.otf.some_valid_feature(otfdata,tfmdata.language,tfmdata.script,kind)
+ tfmdata.changed = tfmdata.changed or { }
+ local changed = tfmdata.changed
+ for k,c in pairs(chars) do
+ local o = otfdata.glyphs[c.index]
+ if o and o.lookups then
+ for lookup,ps in pairs(o.lookups) do
+--~ if valid(kind,lookup) then -- can be optimized for #p = 1
+if somevalid[lookup] then -- can be optimized for #p = 1
+ for i=1,#ps do
+ local p = ps[i]
+ local t = p.type
+ if t == 'substitution' then
+ local ps = p.specification
+ if ps and ps.variant then
+ local pv = ps.variant
+ if pv then
+ local upv = unicodes[pv]
+ if upv and chars[upv] then
+ if trace then
+ logs.report("define otf",string.format("%s: %s (%s) => %s (%s)",kind,chars[k].name,k,chars[upv].name,upv))
+ end
+ chars[k] = chars[upv]
+ changed[k] = true
+ end
+ end
+ end
+ elseif t == 'alternate' then
+ local pa = p.specification if pa and pa.components then
+ local pc = pa.components:match("(%S+)")
+ if pc then
+ local upc = unicodes[pc]
+ if upc and chars[upc] then
+ if trace then
+ logs.report("define otf",string.format("%s: %s (%s) => %s (%s)",kind,chars[k].name,k,chars[upc].name,upc))
+ end
+ chars[k] = chars[upc]
+ changed[k] = true
+ end
+ end
+ end
+ elseif t == 'ligature' and not changed[k] then
+ local pl = p.specification
+ if pl and pl.components then
+ if trace then
+ logs.report("define otf",string.format("%s: %s => %s (%s)",kind,pl.components,chars[k].name,k))
+ end
+ ligatures[#ligatures+1] = { pl.components, k }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ fonts.otf.features.aux.resolve_ligatures(tfmdata,ligatures,kind)
+ else
+ tfmdata.ligatures = tfmdata.ligatures or { }
+ end
+end
+
+function fonts.initializers.base.otf.liga(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'liga',value) end
+function fonts.initializers.base.otf.dlig(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'dlig',value) end
+function fonts.initializers.base.otf.rlig(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'rlig',value) end
+function fonts.initializers.base.otf.hlig(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'hlig',value) end
+function fonts.initializers.base.otf.pnum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'pnum',value) end
+function fonts.initializers.base.otf.onum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'onum',value) end
+function fonts.initializers.base.otf.tnum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'tnum',value) end
+function fonts.initializers.base.otf.lnum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'lnum',value) end
+function fonts.initializers.base.otf.zero(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'zero',value) end
+function fonts.initializers.base.otf.smcp(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'smcp',value) end
+function fonts.initializers.base.otf.cpsp(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'cpsp',value) end
+function fonts.initializers.base.otf.c2sc(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'c2sc',value) end
+function fonts.initializers.base.otf.ornm(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'ornm',value) end
+function fonts.initializers.base.otf.aalt(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'aalt',value) end
+
+fonts.otf.features.data.tex = {
+ { "endash", "hyphen hyphen" },
+ { "emdash", "hyphen hyphen hyphen" },
+ { "quotedblleft", "quoteleft quoteleft" },
+ { "quotedblright", "quoteright quoteright" },
+ { "quotedblleft", "grave grave" },
+ { "quotedblright", "quotesingle quotesingle" },
+ { "quotedblbase", "comma comma" }
+}
+
+--~ 0x201C 0x2018 0x2018
+--~ 0x201D 0x2019 0x2019
+--~ 0x201E 0X002C 0x002C
+
+function fonts.initializers.base.otf.texligatures(tfm,value)
+ local otfdata = tfm.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local ligatures = { }
+ for _,v in pairs(fonts.otf.features.data.tex) do
+ if type(v[1]) == "string" then
+ local c = unicodes[v[1]]
+ if c then
+ ligatures[#ligatures+1] = { v[2], c }
+ end
+ else
+ ligatures[#ligatures+1] = { v[2], v[1] }
+ end
+ end
+ fonts.otf.features.aux.resolve_ligatures(tfm,ligatures)
+end
+
+function fonts.initializers.base.otf.texquotes(tfm,value)
+ tfm.characters[0x0022] = table.fastcopy(tfm.characters[0x201D])
+ tfm.characters[0x0027] = table.fastcopy(tfm.characters[0x2019])
+ tfm.characters[0x0060] = table.fastcopy(tfm.characters[0x2018])
+end
+
+fonts.initializers.base.otf.trep = fonts.initializers.base.otf.texquotes
+fonts.initializers.base.otf.tlig = fonts.initializers.base.otf.texligatures
+
+table.insert(fonts.triggers,"texquotes")
+table.insert(fonts.triggers,"texligatures")
+table.insert(fonts.triggers,"tlig")
+
+-- Here comes the real thing ... node processing! The next session prepares
+-- things. The main features (unchained by rules) have their own caches,
+-- while the private ones cache locally.
+
+do
+
+ fonts.otf.features.prepare = { }
+
+ -- also share vars
+
+ function fonts.otf.features.prepare.feature(tfmdata,kind,value) -- check BASE VS NODE
+ if value then
+ tfmdata.unique = tfmdata.unique or { }
+ tfmdata.shared = tfmdata.shared or { }
+ local shared = tfmdata.shared
+ shared.featuredata = shared.featuredata or { }
+ shared.featuredata[kind] = shared.featuredata[kind] or { }
+ shared.featurecache = shared.featurecache or { }
+ shared.featurecache[kind] = false -- signal
+ local otfdata = shared.otfdata
+ local lookuptable = fonts.otf.valid_subtable(otfdata,tfmdata.language,tfmdata.script,kind)
+ shared.lookuptable = shared.lookuptable or { }
+ shared.lookuptable[kind] = lookuptable
+ if lookuptable then
+ shared.processes = shared.processes or { }
+ shared.processes[kind] = shared.processes[kind] or { }
+ local processes = shared.processes[kind]
+ local types = otfdata.luatex.name_to_type
+ local flags = otfdata.luatex.ignore_flags
+ local preparers = fonts.otf.features.prepare
+ local process = fonts.otf.features.process
+ for noflookups, lookupname in ipairs(lookuptable) do
+ local lookuptype = types[lookupname]
+ local prepare = preparers[lookuptype]
+ if prepare then
+ local processdata = prepare(tfmdata,kind,lookupname)
+ if processdata then
+ local processflags = flags[lookupname] or {false,false,false}
+ processes[#processes+1] = { process[lookuptype], lookupname, processdata, processflags }
+ end
+ end
+ end
+ end
+ end
+ end
+
+ -- helper: todo, we don't need to store non local ones for chains so we can pass the
+ -- validator as parameter
+
+ function fonts.otf.features.collect_ligatures(tfmdata,kind,internal) -- ligs are spread all over the place
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = tfmdata.shared.otfdata.luatex.unicodes -- actually the char index is ok too
+ local trace = fonts.otf.trace_features
+ local ligatures = { }
+ local function collect(lookup,o,ps)
+ for i=1,#ps do
+ local p = ps[i]
+ if p.specification and p.type == 'ligature' then
+ if trace then
+ logs.report("define otf",string.format("feature %s ligature %s => %s",kind,p.specification.components,o.name))
+ end
+ local t = ligatures[lookup]
+ if not t then
+ t = { }
+ ligatures[lookup] = t
+ end
+ local first = true
+ for s in p.specification.components:gmatch("(%S+)") do
+ local u = unicodes[s]
+ if first then
+ if not t[u] then
+ t[u] = { { } }
+ end
+ t = t[u]
+ first = false
+ else
+ if not t[1][u] then
+ t[1][u] = { { } }
+ end
+ t = t[1][u]
+ end
+ end
+ t[2] = o.unicodeenc
+ end
+ end
+ end
+ if internal then
+ local always = otfdata.luatex.always_valid
+ for _,o in pairs(otfdata.glyphs) do
+ if o.lookups then
+ for lookup, ps in pairs(o.lookups) do
+ if always[lookup] then
+ collect(lookup,o,ps)
+ end
+ end
+ end
+ end
+ else -- check if this valid is still ok
+ local valid = fonts.otf.valid_feature(otfdata,tfmdata.language,tfmdata.script)
+ for _,o in pairs(otfdata.glyphs) do
+ if o.lookups then
+ for lookup, ps in pairs(o.lookups) do
+ if valid(kind,lookup) then
+ collect(lookup,o,ps)
+ end
+ end
+ end
+ end
+ end
+ return ligatures
+ end
+
+ -- gsub_single -> done
+ -- gsub_multiple -> done
+ -- gsub_alternate -> done
+ -- gsub_ligature -> done
+ -- gsub_context -> todo
+ -- gsub_contextchain -> done
+ -- gsub_reversechain -> todo
+
+ -- we used to share code in the following functions but that was relatively
+ -- due to extensive calls to functions (easily hundreds of thousands per
+ -- document)
+
+ function fonts.otf.features.prepare.gsub_single(tfmdata,kind,lookupname)
+ local featuredata = tfmdata.shared.featuredata[kind]
+ local substitutions = featuredata[lookupname]
+ if not substitutions then
+ substitutions = { }
+ featuredata[lookupname] = substitutions
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local trace = fonts.otf.trace_features
+ for _, o in pairs(otfdata.glyphs) do
+ local lookups = o.lookups
+ if lookups then
+ for lookup,ps in pairs(lookups) do
+ if lookup == lookupname then
+ for i=1,#ps do
+ local p = ps[i]
+ if p.specification and p.type == 'substitution' then
+ local old, new = o.unicodeenc, unicodes[p.specification.variant]
+ substitutions[old] = new
+ if trace then
+ logs.report("define otf",string.format("%s:%s substitution %s => %s",kind,lookupname,old,new))
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return substitutions
+ end
+
+ function fonts.otf.features.prepare.gsub_multiple(tfmdata,kind,lookupname)
+ local featuredata = tfmdata.shared.featuredata[kind]
+ local substitutions = featuredata[lookupname]
+ if not substitutions then
+ substitutions = { }
+ featuredata[lookupname] = substitutions
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local trace = fonts.otf.trace_features
+ for _,o in pairs(otfdata.glyphs) do
+ local lookups = o.lookups
+ if lookups then
+ for lookup,ps in pairs(lookups) do
+ if lookup == lookupname then
+ for i=1,#ps do
+ local p = ps[i]
+ if p.specification and p.type == 'multiple' then
+ local old, new = o.unicodeenc, { }
+ substitutions[old] = new
+ for pc in p.specification.components:gmatch("(%S+)") do
+ new[#new+1] = unicodes[pc]
+ end
+ if trace then
+ logs.report("define otf",string.format("%s:%s multiple %s => %s",kind,lookupname,old,table.concat(new," ")))
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return substitutions
+ end
+
+ function fonts.otf.features.prepare.gsub_alternate(tfmdata,kind,lookupname)
+ -- todo: configurable preference list
+ local featuredata = tfmdata.shared.featuredata[kind]
+ local substitutions = featuredata[lookupname]
+ if not substitutions then
+ featuredata[lookupname] = { }
+ substitutions = featuredata[lookupname]
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local trace = fonts.otf.trace_features
+ for _,o in pairs(otfdata.glyphs) do
+ local lookups = o.lookups
+ if lookups then
+ for lookup,ps in pairs(lookups) do
+ if lookup == lookupname then
+ for i=1,#ps do
+ local p = ps[i]
+ if p.specification and p.type == 'alternate' then
+ local old = o.unicodeenc
+ local t = { }
+ for pc in p.specification.components:gmatch("(%S+)") do
+ t[#t+1] = unicodes[pc]
+ end
+ substitutions[old] = t
+ if trace then
+ logs.report("define otf",string.format("%s:%s alternate %s => %s",kind,lookupname,old,table.concat(substitutions,"|")))
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return substitutions
+ end
+
+ function fonts.otf.features.prepare.gsub_ligature(tfmdata,kind,lookupname)
+ -- we collect them for all lookups, this saves loops, we only use the
+ -- lookupname for testing, we need to check if this leads to redundant
+ -- collections
+ local ligatures = tfmdata.shared.featuredata[kind]
+ if not ligatures[lookupname] then
+ ligatures = fonts.otf.features.collect_ligatures(tfmdata,kind)
+ tfmdata.shared.featuredata[kind] = ligatures
+ end
+ return ligatures[lookupname]
+ end
+
+ function fonts.otf.features.prepare.contextchain(tfmdata,kind,lookupname)
+ local featuredata = tfmdata.shared.featuredata[kind]
+ local contexts = featuredata[lookupname]
+ if not contexts then
+ featuredata[lookupname] = { }
+ contexts = featuredata[lookupname]
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local internals = otfdata.luatex.internals
+ local flags = otfdata.luatex.ignore_flags
+ local types = otfdata.luatex.name_to_type
+ otfdata.luatex.covers = otfdata.luatex.covers or { }
+ local cache = otfdata.luatex.covers
+ local characters = tfmdata.characters
+ local function uncover(covers)
+ if covers then
+ local result = { }
+ for n, c in ipairs(covers) do
+ local cc = cache[c]
+ if not cc then
+ local t = { }
+ for s in c:gmatch("(%S+)") do
+ t[unicodes[s]] = true
+ end
+ cache[c] = t
+ result[n] = t
+ else
+ result[n] = cc
+ end
+ end
+ return result
+ else
+ return { }
+ end
+ end
+ local lookupdata = otfdata.lookups[lookupname]
+ if not lookupdata then
+ texio.write_nl(string.format("error, missing lookupdata table %s",lookupname))
+ elseif lookupdata.rules then
+ for nofrules, rule in ipairs(lookupdata.rules) do
+ local coverage = rule.coverage
+ if coverage and coverage.current then
+ local current = uncover(coverage.current)
+ local before = uncover(coverage.before)
+ local after = uncover(coverage.after)
+ if current[1] then
+ local lookups, lookuptype = rule.lookups, 'self'
+ -- for the moment only lookup index 1
+ if lookups then
+ if #lookups > 1 then
+ logs.report("otf process","WARNING: more than one lookup in rule")
+ end
+ lookuptype = types[lookups[1]]
+ end
+ for unic, _ in pairs(current[1]) do
+ local t = contexts[unic]
+ if not t then
+ contexts[unic] = { lookups={}, flags=flags[lookupname] }
+ t = contexts[unic].lookups
+ end
+ t[#t+1] = { nofrules, lookuptype, current, before, after, lookups }
+ end
+ end
+ end
+ end
+ end
+ end
+ return contexts
+ end
+
+ fonts.otf.features.prepare.gsub_context = fonts.otf.features.prepare.contextchain
+ fonts.otf.features.prepare.gsub_contextchain = fonts.otf.features.prepare.contextchain
+ fonts.otf.features.prepare.gsub_reversecontextchain = fonts.otf.features.prepare.contextchain
+
+ -- ruled->lookup=ks_latn_l_27_c_4 => internal[ls_l_84] => valid[ls_l_84_s]
+
+ -- gpos_mark2base -> done
+ -- gpos_mark2ligature -> done
+ -- gpos_mark2mark -> done
+ -- gpos_single -> not done
+ -- gpos_pair -> not done
+ -- gpos_cursive -> not done
+ -- gpos_context -> not done
+ -- gpos_contextchain -> not done
+
+ function fonts.otf.features.prepare.anchors(tfmdata,kind,lookupname) -- tracing
+ local featuredata = tfmdata.shared.featuredata[kind]
+ local anchors = featuredata[lookupname]
+ if not anchors then
+ featuredata[lookupname] = { }
+ anchors = featuredata[lookupname]
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local validanchors = { }
+ local glyphs = otfdata.glyphs
+ if otfdata.anchor_classes then
+ for k,v in ipairs(otfdata.anchor_classes) do
+ if v.lookup == lookupname then
+ validanchors[v.name] = true
+ end
+ end
+ end
+ for _,o in pairs(glyphs) do
+ local oanchor = o.anchors
+ if oanchor then
+ local t, ok = { }, false
+ for type, anchors in pairs(oanchor) do -- types
+ local tt = false
+ for name, anchor in pairs(anchors) do
+ if validanchors[name] then
+ if not tt then
+ tt = { [name] = anchor }
+ t[type] = tt
+ ok = true
+ else
+ tt[name] = anchor
+ end
+ end
+ end
+ end
+ if ok then
+ anchors[o.unicodeenc] = t
+ end
+ end
+ end
+ end
+ return anchors
+ end
+
+ fonts.otf.features.prepare.gpos_mark2base = fonts.otf.features.prepare.anchors
+ fonts.otf.features.prepare.gpos_mark2ligature = fonts.otf.features.prepare.anchors
+ fonts.otf.features.prepare.gpos_mark2mark = fonts.otf.features.prepare.anchors
+ fonts.otf.features.prepare.gpos_cursive = fonts.otf.features.prepare.anchors
+ fonts.otf.features.prepare.gpos_context = fonts.otf.features.prepare.contextchain
+ fonts.otf.features.prepare.gpos_contextchain = fonts.otf.features.prepare.contextchain
+
+ function fonts.otf.features.prepare.gpos_single(tfmdata,kind,lookupname)
+ logs.report("otf define","gpos_single not yet supported")
+ end
+
+ function fonts.otf.features.prepare.gpos_pair(tfmdata,kind,lookupname)
+ local featuredata = tfmdata.shared.featuredata[kind]
+ local kerns = featuredata[lookupname]
+ if not kerns then
+ featuredata[lookupname] = { }
+ kerns = featuredata[lookupname]
+ local otfdata = tfmdata.shared.otfdata
+ local unicodes = otfdata.luatex.unicodes
+ local glyphs = otfdata.glyphs
+ for k,o in pairs(glyphs) do
+ local list = o.lookups
+ if list then
+ local one = o.unicodeenc
+ for lookup,ps in pairs(list) do
+ if lookup == lookupname then
+ for i=1,#ps do
+ local p = ps[i]
+ if p.type == 'pair' then
+ local specification = p.specification
+ local two = unicodes[specification.paired]
+ local krn = kerns[one]
+ if krn then
+ krn[two] = specification.offsets
+ else
+ kerns[one] = { two = specification.offsets }
+ end
+ if fonts.otf.trace_features then
+ logs.report("define otf",string.format("feature %s kern pair %s - %s",kind,one,two))
+ end
+ end
+ end
+ end
+ end
+ else
+ list = o.kerns
+ if list then
+ local one = o.unicodeenc
+ for lookup,ps in pairs(list) do
+ if lookup == lookupname then
+ for i=1,#ps do
+ local p = ps[i]
+ local char = p.char
+ if char then
+ local two = unicodes[char]
+ local krn = kerns[one]
+ if krn then
+ krn[two] = p.off
+ else
+ kerns[one] = { two = p.off }
+ end
+ if fonts.otf.trace_features then
+ logs.report("define otf",string.format("feature %s kern pair %s - %s",kind,one,two))
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return kerns
+ end
+
+ fonts.otf.features.prepare.gpos_contextchain = fonts.otf.features.prepare.contextchain
+
+end
+
+-- can be generalized: one loop in main
+
+do
+
+ prepare = fonts.otf.features.prepare.feature
+
+ function fonts.initializers.node.otf.afrc(tfm,value) return prepare(tfm,'afrc',value) end
+ function fonts.initializers.node.otf.akhn(tfm,value) return prepare(tfm,'akhn',value) end
+ function fonts.initializers.node.otf.c2pc(tfm,value) return prepare(tfm,'c2pc',value) end
+ function fonts.initializers.node.otf.c2sc(tfm,value) return prepare(tfm,'c2sc',value) end
+ function fonts.initializers.node.otf.calt(tfm,value) return prepare(tfm,'calt',value) end
+ function fonts.initializers.node.otf.case(tfm,value) return prepare(tfm,'case',value) end
+ function fonts.initializers.node.otf.ccmp(tfm,value) return prepare(tfm,'ccmp',value) end
+ function fonts.initializers.node.otf.clig(tfm,value) return prepare(tfm,'clig',value) end
+ function fonts.initializers.node.otf.cpsp(tfm,value) return prepare(tfm,'cpsp',value) end
+ function fonts.initializers.node.otf.cswh(tfm,value) return prepare(tfm,'cswh',value) end
+ function fonts.initializers.node.otf.curs(tfm,value) return prepare(tfm,'curs',value) end
+ function fonts.initializers.node.otf.dlig(tfm,value) return prepare(tfm,'dlig',value) end
+ function fonts.initializers.node.otf.dnom(tfm,value) return prepare(tfm,'dnom',value) end
+ function fonts.initializers.node.otf.expt(tfm,value) return prepare(tfm,'expt',value) end
+ function fonts.initializers.node.otf.fin2(tfm,value) return prepare(tfm,'fin2',value) end
+ function fonts.initializers.node.otf.fin3(tfm,value) return prepare(tfm,'fin3',value) end
+ function fonts.initializers.node.otf.fina(tfm,value) return prepare(tfm,'fina',value) end
+ function fonts.initializers.node.otf.frac(tfm,value) return prepare(tfm,'frac',value) end
+ function fonts.initializers.node.otf.haln(tfm,value) return prepare(tfm,'haln',value) end
+ function fonts.initializers.node.otf.hist(tfm,value) return prepare(tfm,'hist',value) end
+ function fonts.initializers.node.otf.hkna(tfm,value) return prepare(tfm,'hkna',value) end
+ function fonts.initializers.node.otf.hlig(tfm,value) return prepare(tfm,'hlig',value) end
+ function fonts.initializers.node.otf.hngl(tfm,value) return prepare(tfm,'hngl',value) end
+ function fonts.initializers.node.otf.init(tfm,value) return prepare(tfm,'init',value) end
+ function fonts.initializers.node.otf.isol(tfm,value) return prepare(tfm,'isol',value) end
+ function fonts.initializers.node.otf.ital(tfm,value) return prepare(tfm,'ital',value) end
+ function fonts.initializers.node.otf.jp78(tfm,value) return prepare(tfm,'jp78',value) end
+ function fonts.initializers.node.otf.jp83(tfm,value) return prepare(tfm,'jp83',value) end
+ function fonts.initializers.node.otf.jp90(tfm,value) return prepare(tfm,'jp90',value) end
+ function fonts.initializers.node.otf.kern(tfm,value) return prepare(tfm,'kern',value) end
+ function fonts.initializers.node.otf.liga(tfm,value) return prepare(tfm,'liga',value) end
+ function fonts.initializers.node.otf.lnum(tfm,value) return prepare(tfm,'lnum',value) end
+ function fonts.initializers.node.otf.locl(tfm,value) return prepare(tfm,'locl',value) end
+ function fonts.initializers.node.otf.mark(tfm,value) return prepare(tfm,'mark',value) end
+ function fonts.initializers.node.otf.med2(tfm,value) return prepare(tfm,'med2',value) end
+ function fonts.initializers.node.otf.medi(tfm,value) return prepare(tfm,'medi',value) end
+ function fonts.initializers.node.otf.mgrk(tfm,value) return prepare(tfm,'mgrk',value) end
+ function fonts.initializers.node.otf.mkmk(tfm,value) return prepare(tfm,'mkmk',value) end
+ function fonts.initializers.node.otf.nalt(tfm,value) return prepare(tfm,'nalt',value) end
+ function fonts.initializers.node.otf.nlck(tfm,value) return prepare(tfm,'nlck',value) end
+ function fonts.initializers.node.otf.nukt(tfm,value) return prepare(tfm,'nukt',value) end
+ function fonts.initializers.node.otf.numr(tfm,value) return prepare(tfm,'numr',value) end
+ function fonts.initializers.node.otf.onum(tfm,value) return prepare(tfm,'onum',value) end
+ function fonts.initializers.node.otf.ordn(tfm,value) return prepare(tfm,'ordn',value) end
+ function fonts.initializers.node.otf.ornm(tfm,value) return prepare(tfm,'ornm',value) end
+ function fonts.initializers.node.otf.pnum(tfm,value) return prepare(tfm,'pnum',value) end
+ function fonts.initializers.node.otf.pref(tfm,value) return prepare(tfm,'pref',value) end
+ function fonts.initializers.node.otf.pres(tfm,value) return prepare(tfm,'pres',value) end
+ function fonts.initializers.node.otf.pstf(tfm,value) return prepare(tfm,'pstf',value) end
+ function fonts.initializers.node.otf.rlig(tfm,value) return prepare(tfm,'rlig',value) end
+ function fonts.initializers.node.otf.rphf(tfm,value) return prepare(tfm,'rphf',value) end
+ function fonts.initializers.node.otf.salt(tfm,value) return prepare(tfm,'salt',value) end
+ function fonts.initializers.node.otf.sinf(tfm,value) return prepare(tfm,'sinf',value) end
+ function fonts.initializers.node.otf.smcp(tfm,value) return prepare(tfm,'smcp',value) end
+ function fonts.initializers.node.otf.smpl(tfm,value) return prepare(tfm,'smpl',value) end
+ function fonts.initializers.node.otf.ss01(tfm,value) return prepare(tfm,'ss01',value) end
+ function fonts.initializers.node.otf.ss02(tfm,value) return prepare(tfm,'ss02',value) end
+ function fonts.initializers.node.otf.ss03(tfm,value) return prepare(tfm,'ss03',value) end
+ function fonts.initializers.node.otf.ss04(tfm,value) return prepare(tfm,'ss04',value) end
+ function fonts.initializers.node.otf.ss05(tfm,value) return prepare(tfm,'ss05',value) end
+ function fonts.initializers.node.otf.ss06(tfm,value) return prepare(tfm,'ss06',value) end
+ function fonts.initializers.node.otf.ss07(tfm,value) return prepare(tfm,'ss07',value) end
+ function fonts.initializers.node.otf.ss08(tfm,value) return prepare(tfm,'ss08',value) end
+ function fonts.initializers.node.otf.ss09(tfm,value) return prepare(tfm,'ss09',value) end
+ function fonts.initializers.node.otf.subs(tfm,value) return prepare(tfm,'subs',value) end
+ function fonts.initializers.node.otf.sups(tfm,value) return prepare(tfm,'sups',value) end
+ function fonts.initializers.node.otf.swsh(tfm,value) return prepare(tfm,'swsh',value) end
+ function fonts.initializers.node.otf.titl(tfm,value) return prepare(tfm,'titl',value) end
+ function fonts.initializers.node.otf.tnam(tfm,value) return prepare(tfm,'tnam',value) end
+ function fonts.initializers.node.otf.tnum(tfm,value) return prepare(tfm,'tnum',value) end
+ function fonts.initializers.node.otf.trad(tfm,value) return prepare(tfm,'trad',value) end
+ function fonts.initializers.node.otf.unic(tfm,value) return prepare(tfm,'unic',value) end
+ function fonts.initializers.node.otf.zero(tfm,value) return prepare(tfm,'zero',value) end
+
+end
+
+do
+
+ local glyph = node.id('glyph')
+ local glue = node.id('glue')
+ local kern_node = node.new("kern")
+ local glue_node = node.new("glue")
+ local glyph_node = node.new("glyph")
+
+ local fontdata = fonts.tfm.id
+ local has_attribute = node.has_attribute
+ local set_attribute = node.set_attribute
+ local state = attributes.numbers['state'] or 100
+ local marknumber = attributes.numbers['mark'] or 200
+ local format = string.format
+ local report = logs.report
+
+ fonts.otf.features.process = { }
+
+ -- we share aome vars here, after all, we have no nested lookups and
+ -- less code
+
+ local tfmdata = false
+ local otfdata = false
+ local characters = false
+ local marks = false
+ local glyphs = false
+ local currentfont = false
+
+ function fonts.otf.features.process.feature(head,font,kind,attribute)
+ tfmdata = fontdata[font]
+ otfdata = tfmdata.shared.otfdata
+ characters = tfmdata.characters
+ marks = otfdata.luatex.marks
+ glyphs = otfdata.glyphs
+ currentfont = font
+ local lookuptable = tfmdata.shared.lookuptable[kind]
+ if lookuptable then
+ local types = otfdata.luatex.name_to_type
+ local start, done, ok = head, false, false
+ local processes = tfmdata.shared.processes[kind]
+ if #processes == 1 then
+ local p = processes[1]
+ while start do
+ if start.id == glyph and start.font == font and (not attribute or has_attribute(start,state,attribute)) then
+ -- we can make the p vars also global to this closure
+ local pp = p[3] -- all lookups
+ local pc = pp[start.char]
+ if pc then
+ start, ok = p[1](start,kind,p[2],pc,pp,p[4])
+ done = done or ok
+ if start then start = start.next end
+ else
+ start = start.next
+ end
+ else
+ start = start.next
+ end
+ end
+ else
+ while start do
+ if start.id == glyph and start.font == font and (not attribute or has_attribute(start,state,attribute)) then
+ for i=1,#processes do local p = processes[i]
+ local pp = p[3]
+ local pc = pp[start.char]
+ if pc then
+ start, ok = p[1](start,kind,p[2],pc,pp,p[4])
+ if ok then
+ done = true
+ break
+ elseif not start then
+ break
+ end
+ end
+ end
+ if start then start = start.next end
+ else
+ start = start.next
+ end
+ end
+ end
+ return head, done
+ else
+ return head, false
+ end
+ end
+
+ -- todo: components / else subtype 0 / maybe we should be able to force this
+
+ function toligature(start,stop,char,markflag)
+ if start ~= stop then
+ local deletemarks = markflag ~= "mark"
+ start.subtype = 1
+ start.char = char
+ local marknum = 1
+ local next = start.next
+ while true do
+ if marks[next.char] then
+ if not deletemarks then
+ set_attribute(next,marknumber,marknum)
+ end
+ else
+ marknum = marknum + 1
+ end
+ if next == stop then
+ break
+ else
+ next = next.next
+ end
+ end
+ next = stop.next
+ while next do
+ if next.id == glyph and next.font == currentfont and marks[next.char] then
+ set_attribute(next,marknumber,marknum)
+ next = next.next
+ else
+ break
+ end
+ end
+ local next = start.next
+ while true do
+ if next == stop or deletemarks or marks[next.char] then
+ local crap = next
+ next.prev.next = next.next
+ if next.next then
+ next.next.prev = next.prev
+ end
+ if next == stop then
+ stop = crap.prev
+ node.free(crap)
+ break
+ else
+ next = next.next
+ node.free(crap)
+ end
+ else
+ next = next.next
+ end
+ end
+ end
+ return start
+ end
+
+ function fonts.otf.features.process.gsub_single(start,kind,lookupname,replacements)
+ if replacements then
+ start.char = replacements
+ if fonts.otf.trace_replacements then
+ report("process otf",format("%s:%s replacing %s by %s",kind,lookupname,start.char,replacements))
+ end
+ return start, true
+ else
+ return start, false
+ end
+ end
+
+ function fonts.otf.features.process.gsub_alternate(start,kind,lookupname,alternatives)
+ if alternatives then
+ start.char = alternatives[1] -- will be preference
+ if fonts.otf.trace_replacements then
+ report("process otf",format("%s:%s alternative %s => %s",kind,lookupname,start.char,table.concat(alternatives,"|")))
+ end
+ return start, true
+ else
+ return start, false
+ end
+ end
+
+ function fonts.otf.features.process.gsub_multiple(start,kind,lookupname,multiples)
+ if multiples then
+ start.char = multiples[1]
+ if #multiples > 1 then
+ for k=2,#multiples do
+ local n = node.copy(start)
+ n.char = multiples[k]
+ n.next = start.next
+ n.prev = start
+ if start.next then
+ start.next.prev = n
+ end
+ start.next = n
+ start = n
+ end
+ end
+ if fonts.otf.trace_replacements then
+ report("process otf",format("%s:%s alternative %s => %s",kind,lookupname,start.char,table.concat(multiples," ")))
+ end
+ return start, true
+ else
+ return start, false
+ end
+ end
+
+ function fonts.otf.features.process.gsub_ligature(start,kind,lookupname,ligatures,alldata,flags)
+ local s, stop = start.next, nil
+ while s and s.id == glyph and s.subtype == 0 and s.font == currentfont do
+ if marks[s.char] then
+ s = s.next
+ else
+ local lg = ligatures[1][s.char]
+ if not lg then
+ break
+ else
+ stop = s
+ ligatures = lg
+ s = s.next
+ end
+ end
+ end
+ if stop and ligatures[2] then
+ start = toligature(start,stop,ligatures[2],flags[1])
+ if fonts.otf.trace_ligatures then
+ report("process otf",format("%s: inserting ligature %s (%s)",kind,start.char,utf.char(start.char)))
+ end
+ return start, true
+ end
+ return start, false
+ end
+
+ -- again, using copies is more efficient than sharing code
+
+ function fonts.otf.features.process.gpos_mark2base(start,kind,lookupname,baseanchors,anchors) -- maybe use copies
+ local bases = baseanchors['basechar']
+ if bases then
+ local component = start.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ local trace = fonts.otf.trace_anchors
+ local last, done = start, false
+ while true do
+ local markanchors = anchors[component.char]
+ if markanchors then
+ local marks = markanchors['mark']
+ if marks then
+ for anchor,data in pairs(marks) do
+ local ba = bases[anchor]
+ if ba then
+ local dx = tex.scale(ba.x-data.x, tfmdata.factor)
+ local dy = tex.scale(ba.y-data.y, tfmdata.factor)
+ component.xoffset = start.xoffset - dx
+ component.yoffset = start.yoffset + dy
+ if trace then
+ report("process otf",format("%s: anchoring mark %s to basechar %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset))
+ end
+ done = true
+ break
+ end
+ end
+ end
+ last = component
+ end
+ component = component.next
+--~ if component and component.id == kern then
+--~ component = component.next
+--~ end
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ -- ok
+ else
+ break
+ end
+ end
+ return last, done
+ end
+ end
+ return start, false
+ end
+
+ function fonts.otf.features.process.gpos_mark2ligature(start,kind,lookupname,baseanchors,anchors)
+ local bases = baseanchors['baselig']
+ if bases then
+ local component = start.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ local trace = fonts.otf.trace_anchors
+ local last, done = start, false
+ while true do
+ local markanchors = anchors[component.char]
+ if markanchors then
+ local marks = markanchors['mark']
+ if marks then
+ for anchor,data in pairs(marks) do
+ local ba = bases[anchor]
+ if ba then
+ local n = has_attribute(component,marknumber)
+ local ban = ba[n]
+ if ban then
+ local dx = tex.scale(ban.x-data.x, tfmdata.factor)
+ local dy = tex.scale(ban.y-data.y, tfmdata.factor)
+ component.xoffset = start.xoffset - dx
+ component.yoffset = start.yoffset + dy
+ if trace then
+ report("process otf",format("%s:%s:%s anchoring mark %s to baselig %s => (%s,%s) => (%s,%s)",kind,anchor,n,component.char,start.char,dx,dy,component.xoffset,component.yoffset))
+ end
+ done = true
+ break
+ end
+ end
+ end
+ end
+ end
+ last = component
+ component = component.next
+--~ if component and component.id == kern then
+--~ component = component.next
+--~ end
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ -- ok
+ else
+ break
+ end
+ end
+ return last, done
+ end
+ end
+ return start, false
+ end
+
+ function fonts.otf.features.process.gpos_mark2mark(start,kind,lookupname,baseanchors,anchors)
+ -- we can stay in the loop for all anchors
+ local bases = baseanchors['basemark']
+ if bases then
+ local component = start.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ local baseattr = has_attribute(start,marknumber) or 1
+ local trace = fonts.otf.trace_anchors
+ local last, done = start, false
+ while true do
+ local markattr = has_attribute(component,marknumber) or 1
+ if baseattr == markattr then
+ local markanchors = anchors[component.char]
+ if markanchors then
+ local marks = markanchors['mark']
+ if marks then
+ for anchor,data in pairs(marks) do
+ local ba = bases[anchor]
+ if ba then
+ local dx = tex.scale(ba.x-data.x, tfmdata.factor)
+ local dy = tex.scale(ba.y-data.y, tfmdata.factor)
+ component.xoffset = start.xoffset - dx
+ component.yoffset = start.yoffset + dy
+ if trace then
+ report("process otf",format("%s:%s:%s anchoring mark %s to basemark %s => (%s,%s) => (%s,%s)",kind,anchor,n,start.char,component.char,dx,dy,component.xoffset,component.yoffset))
+ end
+ done = true
+ break
+ end
+ end
+ end
+ end
+ last = component
+ component = component.next
+--~ if component and component.id == kern then
+--~ component = component.next
+--~ end
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ -- ok
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ return last, done
+ end
+ end
+ return start, false
+ end
+
+ function fonts.otf.features.process.gpos_cursive(start,kind,lookupname,exitanchors,anchors)
+ local trace = fonts.otf.trace_anchors
+ local next, done, x, y, total, t, first = start.next, false, 0, 0, 0, { }, nil
+ local function finish()
+ local i = 0
+ while first do
+ if characters[first.char].class == 'mark' then
+ first = first.next
+ else
+ first.yoffset = tex.scale(total, tfmdata.factor)
+ if first == next then
+ break
+ else
+ i = i + 1
+ total = total - (t[i] or 0)
+ first = first.next
+ end
+ end
+ end
+ x, y, total, t, first = 0, 0, 0, { }, nil
+ end
+ while next do
+ if next.id == glyph and next.font == currentfont then
+ local nextchar = next.char
+ if marks[nextchar] then
+ next = next.next
+ else
+ local entryanchors, exitanchors = anchors[nextchar], anchors[start.char]
+ if entryanchors and exitanchors then
+ local centry, cexit = entryanchors['centry'], exitanchors['cexit']
+ if centry and cexit then
+ for anchor, entry in pairs(centry) do
+ local exit = cexit[anchor]
+ if exit then
+ if not first then first = start end
+ t[#t+1] = exit.y + entry.y
+ total = total + t[#t]
+ done = true
+ break
+ end
+ end
+ else
+ finish()
+ end
+ else
+ finish()
+ end
+ start = next
+ next = start.next
+ end
+ else
+ finish()
+ break
+ end
+ end
+ return start, done
+ end
+
+ function fonts.otf.features.process.gpos_single(start,kind,lookupname,basekerns,kerns)
+ report("otf process","gpos_single not yet supported")
+ return start, false
+ end
+
+ function fonts.otf.features.process.gpos_pair(start,kind,lookupname,basekerns,kerns)
+ local next, prev, done = start.next, start, false
+ while next and next.id == glyph and next.font == currentfont do
+ if characters[next.char].class == 'mark' then
+ prev = next
+ next = next.next
+ else
+ local krn = basekerns[next.char]
+ if krn then
+ local a, b = krn[1], krn[2]
+ if a and a.x then
+ local k = node.copy(kern_node)
+ k.kern = tex.scale(a.x,fontdata[currentfont].factor) -- tfmdata.factor
+ if b and b.x then
+ report("otf process","we need to do something with the second kern xoff " .. b.x)
+ end
+ k.next = next
+ k.prev = prev
+ prev.next = k
+ next.prev = k
+ if fonts.otf.trace_kerns then
+ -- todo
+ end
+ end
+ -- skip over marks
+ end
+ break
+ end
+ end
+ return start, done
+ end
+
+ chainprocs = { } -- we can probably optimize this because they're all internal lookups
+
+ -- For the moment we save each looked up glyph in the sequence, which is ok because
+ -- each lookup in the chain has its own sequence. This saves memory. Only ligatures
+ -- are stored in the featurecache, because we don't want to loop over all characters
+ -- in order to locate them.
+
+ -- We had a version that shared code, but it was too much a slow down
+ -- todo n x n.
+
+ function chainprocs.gsub_single(start,stop,kind,lookupname,sequence,lookups)
+ local char = start.char
+ local cacheslot = sequence[1]
+ local replacement = cacheslot[char]
+ if replacement == true then
+ if lookups then
+ local looks = glyphs[tfmdata.characters[char].index].lookups
+ if looks then
+ local lookups = otfdata.luatex.internals[lookups[1]].lookups
+ local unicodes = otfdata.luatex.unicodes
+ for l=1,#lookups do
+ local lv = looks[lookups[l]]
+ if lv then
+ replacement = unicodes[lv[1].specification.variant] or char
+ cacheslot[char] = replacement
+ break
+ end
+ end
+ else
+ replacement, cacheslot[char] = char, char
+ end
+ else
+ replacement, cacheslot[char] = char, char
+ end
+ end
+ if fonts.otf.trace_replacements then
+ report("otf chain",format("%s: replacing character %s by single %s",kind,char,replacement))
+ end
+ start.char = replacement
+ return start
+ end
+
+ function chainprocs.gsub_multiple(start,stop,kind,lookupname,sequence,lookups)
+ local char = start.char
+ local cacheslot = sequence[1]
+ local replacement = cacheslot[char]
+ if replacement == true then
+ if lookups then
+ local looks = glyphs[tfmdata.characters[char].index].lookups
+ if looks then
+ local lookups = otfdata.luatex.internals[lookups[1]].lookups
+ local unicodes = otfdata.luatex.unicodes
+ for l=1,#lookups do
+ local lv = looks[lookups[l]]
+ if lv then
+ replacement = { }
+ for c in lv[1].specification.components:gmatch("(%S+)") do
+ replacement[#replacement+1] = unicodes[c]
+ end
+ cacheslot[char] = replacement
+ break
+ end
+ end
+ else
+ replacement = { char }
+ cacheslot[char] = replacement
+ end
+ else
+ replacement = { char }
+ cacheslot[char] = replacement
+ end
+ end
+ if fonts.otf.trace_replacements then
+ report("otf chain",format("%s: replacing character %s by multiple",kind,char))
+ end
+ start.char = replacement[1]
+ if #replacement > 1 then
+ for k=2,#replacement do
+ local n = node.copy(start)
+ n.char = replacement[k]
+ n.next = start.next
+ n.prev = start
+ if start.next then
+ start.next.prev = n
+ end
+ start.next = n
+ start = n
+ end
+ end
+ return start
+ end
+
+ function chainprocs.gsub_alternate(start,stop,kind,lookupname,sequence,lookups)
+ local char = start.char
+ local cacheslot = sequence[1]
+ local replacement = cacheslot[char]
+ if replacement == true then
+ if lookups then
+ local looks = glyphs[tfmdata.characters[char].index].lookups
+ if looks then
+ local lookups = otfdata.luatex.internals[lookups[1]].lookups
+ local unicodes = otfdata.luatex.unicodes
+ for l=1,#lookups do
+ local lv = looks[lookups[l]]
+ if lv then
+ replacement = { }
+ for c in lv[1].specification.components:gmatch("(%S+)") do
+ replacement[#replacement+1] = unicodes[c]
+ end
+ cacheslot[char] = replacement
+ break
+ end
+ end
+ else
+ replacement = { char }
+ cacheslot[char] = replacement
+ end
+ else
+ replacement = { char }
+ cacheslot[char] = replacement
+ end
+ end
+ if fonts.otf.trace_replacements then
+ report("otf chain",format("%s: replacing character %s by alternate",kind,char))
+ end
+ start.char = replacement[1]
+ return start
+ end
+
+ function chainprocs.gsub_ligature(start,stop,kind,lookupname,sequence,lookups,flags)
+ if lookups then
+ local featurecache = fontdata[currentfont].shared.featurecache
+ if not featurecache[kind] then
+ featurecache[kind] = fonts.otf.features.collect_ligatures(tfmdata,kind)
+ -- to be tested: only collect internal
+ -- featurecache[kind] = fonts.otf.features.collect_ligatures(tfmdata,kind,true) --
+ end
+ local lookups = otfdata.luatex.internals[lookups[1]].lookups
+ local ligaturecache = featurecache[kind]
+ for i=1,#lookups do
+ local ligatures = ligaturecache[lookups[i]]
+ if ligatures and ligatures[start.char] then
+ ligatures = ligatures[start.char]
+ local s = start.next
+ while s do
+ if characters[s.char].class == 'mark' then
+ s = s.next
+ else
+ local lg = ligatures[1][s.char]
+ if not lg then
+ break
+ else
+ ligatures = lg
+ if s == stop then
+ break
+ else
+ s = s.next
+ end
+ end
+ end
+ end
+ if ligatures[2] then
+ if fonts.otf.trace_ligatures then
+ report("otf chain",format("%s: replacing character %s by ligature",kind,start.char))
+ end
+ return toligature(start,stop,ligatures[2],flags[1])
+ end
+ break
+ end
+ end
+ end
+ return stop
+ end
+
+ function chainprocs.gpos_mark2base(start,stop,kind,lookupname,sequence,lookups)
+ local component = start.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ local char = start.char
+ local anchortag = sequence[1][char]
+ if anchortag == true then
+ local classes = otfdata.anchor_classes
+ for k=1,#classes do
+ local v = classes[k]
+ if v.lookup == lookupname and v.type == kind then
+ anchortag = v.name
+ sequence[1][char] = anchortag
+ break
+ end
+ end
+ end
+ if anchortag ~= true then
+ local glyph = glyphs[characters[char].index]
+ if glyph.anchors and glyph.anchors[anchortag] then
+ local trace = fonts.otf.trace_anchors
+ local last, done = start, false
+ local baseanchors = glyph.anchors['basechar'][anchortag]
+ while true do
+ local nextchar = component.char
+ local charnext = characters[nextchar]
+ local markanchors = glyphs[charnext.index].anchors['mark'][anchortag]
+ if markanchors then
+ for anchor,data in pairs(markanchors) do
+ local ba = baseanchors[anchor]
+ if ba then
+ local dx = tex.scale(ba.x-data.x, tfmdata.factor)
+ local dy = tex.scale(ba.y-data.y, tfmdata.factor)
+ component.xoffset = start.xoffset - dx
+ component.yoffset = start.yoffset + dy
+ if trace then
+ report("otf chain",format("%s: anchoring mark %s to basechar %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset))
+ end
+ done = true
+ break
+ end
+ end
+ end
+ last = component
+ component = component.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ -- ok
+ else
+ break
+ end
+ end
+ return last, done
+ end
+ end
+ end
+ return start, false
+ end
+
+ function chainprocs.gpos_mark2ligature(start,stop,kind,lookupname,sequence,lookups)
+ local component = start.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ local char = start.char
+ local anchortag = sequence[1][char]
+ if anchortag == true then
+ local classes = otfdata.anchor_classes
+ for k=1,#classes do
+ local v = classes[k]
+ if v.lookup == lookupname and v.type == kind then
+ anchortag = v.name
+ sequence[1][char] = anchortag
+ break
+ end
+ end
+ end
+ if anchortag ~= true then
+ local glyph = glyphs[characters[char].index]
+ if glyph.anchors and glyph.anchors[anchortag] then
+ local trace = fonts.otf.trace_anchors
+ local done = false
+ local last = start
+ local baseanchors = glyph.anchors['baselig'][anchortag]
+ while true do
+ local nextchar = component.char
+ local charnext = characters[nextchar]
+ local markanchors = glyphs[charnext.index].anchors['mark'][anchortag]
+ if markanchors then
+ for anchor,data in pairs(markanchors) do
+ local ba = baseanchors[anchor]
+ if ba then
+ local n = has_attribute(component,marknumber)
+ local ban = ba[n]
+ if ban then
+ local dx = tex.scale(ban.x-data.x, tfmdata.factor)
+ local dy = tex.scale(ban.y-data.y, tfmdata.factor)
+ component.xoffset = start.xoffset - dx
+ component.yoffset = start.yoffset + dy
+ if trace then
+ report("otf chain",format("%s: anchoring mark %s to baselig %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset))
+ end
+ done = true
+ break
+ end
+ end
+ end
+ end
+ last = component
+ component = component.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ -- ok
+ else
+ break
+ end
+ end
+ return last, done
+ end
+ end
+ end
+ return start, false
+ end
+
+ function chainprocs.gpos_mark2mark(start,stop,kind,lookupname,sequence,lookups)
+ local component = start.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ local char = start.char
+ local anchortag = sequence[1][char]
+ if anchortag == true then
+ local classes = otfdata.anchor_classes
+ for k=1,#classes do
+ local v = classes[k]
+ if v.lookup == lookupname and v.type == kind then
+ anchortag = v.name
+ sequence[1][char] = anchortag
+ break
+ end
+ end
+ end
+ local baseattr = has_attribute(start,marknumber)
+ local markattr = has_attribute(component,marknumber)
+ if baseattr == markattr and anchortag ~= true then
+ local glyph = glyphs[characters[char].index]
+ if glyph.anchors and glyph.anchors[anchortag] then
+ local trace = fonts.otf.trace_anchors
+ local last, done = false
+ local baseanchors = glyph.anchors['basemark'][anchortag]
+ while true do
+ local nextchar = component.char
+ local charnext = characters[nextchar]
+ local markanchors = glyphs[charnext.index].anchors['mark'][anchortag]
+ if markanchors then
+ for anchor,data in pairs(markanchors) do
+ local ba = baseanchors[anchor]
+ if ba then
+ local dx = tex.scale(ba.x-data.x, tfmdata.factor)
+ local dy = tex.scale(ba.y-data.y, tfmdata.factor)
+ component.xoffset = start.xoffset - dx
+ component.yoffset = start.yoffset + dy
+ if trace then
+ report("otf chain",format("%s: anchoring mark %s to basemark %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset))
+ end
+ done = true
+ break
+ end
+ end
+ end
+ last = component
+ component = component.next
+ if component and component.id == glyph and component.font == currentfont and marks[component.char] then
+ markattr = has_attribute(component,marknumber)
+ if baseattr ~= markattr then
+ break
+ end
+ else
+ break
+ end
+ end
+ return last, done
+ end
+ end
+ end
+ return start, false
+ end
+
+ function chainprocs.gpos_cursive(start,stop,kind,lookupname,sequence,lookups)
+ report("otf chain","chainproc gpos_cursive not yet supported")
+ return start
+ end
+ function chainprocs.gpos_single(start,stop,kind,lookupname,sequence,lookups)
+ report("otf process","chainproc gpos_single not yet supported")
+ return start
+ end
+ function chainprocs.gpos_pair(start,stop,kind,lookupname,sequence,lookups)
+ report("otf process","chainproc gpos_pair not yet supported")
+ return start
+ end
+
+ function chainprocs.self(start,stop,kind,lookupname,sequence,lookups)
+ report("otf process","self refering lookup cannot happen")
+ return stop
+ end
+
+ function fonts.otf.features.process.contextchain(start,kind,lookupname,contextdata)
+ local done = false
+ local contexts = contextdata.lookups
+ local flags = contextdata.flags
+ local skipmark, skipligature, skipbase = unpack(flags)
+ for k=1,#contexts do
+ local match, stop = true, start
+ local rule, lookuptype, sequence, before, after, lookups = unpack(contexts[k])
+ if #sequence > 0 then
+ if #sequence == 1 then
+ match = sequence[1][start.char]
+ else -- n = #sequence -> faster
+ for n=1,#sequence do
+ if stop and stop.id == glyph and stop.font == currentfont then
+ local char = stop.char
+ local class = characters[char].class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
+ elseif sequence[n][char] then
+ if n < #sequence then
+ stop = stop.next
+ end
+ else
+ match = false break
+ end
+ else
+ match = false break
+ end
+ end
+ end
+ end
+ if match and #before > 0 then
+ local prev = start.prev
+ if prev then
+ if #before == 1 then
+ match = prev.id == glyph and prev.font == currentfont and before[1][prev.char]
+ else
+ for n=#before,1 do
+ if prev then
+ if prev.id == glyph and prev.font == currentfont then -- normal char
+ local char = prev.char
+ local class = characters[char].class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
+ elseif not before[n][char] then
+ match = false break
+ end
+ elseif not before[n][32] then
+ match = false break
+ end
+ prev = prev.prev
+ elseif not before[n][32] then
+ match = false break
+ end
+ end
+ end
+ elseif #before == 1 then
+ match = before[1][32]
+ else
+ for n=#before,1 do
+ if not before[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ if match and #after > 0 then
+ local next = stop.next
+ if next then
+ if #after == 1 then
+ match = next.id == glyph and next.font == currentfont and after[1][next.char]
+ else
+ for n=1,#after do
+ if next then
+ if next.id == glyph and next.font == currentfont then -- normal char
+ local char = next.char
+ local class = characters[char].class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
+ elseif not after[n][char] then
+ match = false break
+ end
+ elseif not after[n][32] then -- brrr
+ match = false break
+ end
+ next = next.next
+ elseif not after[n][32] then
+ match = false break
+ end
+ end
+ end
+ elseif #after == 1 then
+ match = after[1][32]
+ else
+ for n=1,#after do
+ if not after[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ if match then
+ local trace = fonts.otf.trace_contexts
+ if trace then
+ report("otf chain",format("%s: rule %s of %s matches %s times at char %s (%s) lookuptype %s",kind,rule,lookupname,#sequence,char,utf.char(char),lookuptype))
+ end
+ if lookups then
+ local cp = chainprocs[lookuptype]
+ if cp then
+ start = cp(start,stop,kind,lookupname,sequence,lookups,flags)
+ else
+ report("otf chain",format("%s: lookuptype %s not supported yet for %s",kind,lookuptype,lookupname))
+ end
+ elseif trace then
+ report("otf chain",format("%s: skipping match for %s",kind,lookupname))
+ end
+ done = true
+ break
+ end
+ end
+ return start, done
+ end
+
+ function fonts.otf.features.process.reversecontextchain(start,kind,lookupname,contextdata)
+ -- there is only a single substitution here so it is a simple case of the normal one
+ -- sequence is one character here and we swap the rest
+ local done = false
+ local contexts = contextdata.lookups
+ local flags = contextdata.flags
+ local skipmark, skipligature, skipbase = unpack(flags)
+ for k=1,#contexts do
+ local match, stop = true, start
+ local rule, lookuptype, sequence, before, after, lookups = unpack(contexts[k])
+ match = sequence[1][start.char]
+ if match and #after > 0 then
+ local prev = start.prev
+ if prev then
+ if #after == 1 then
+ match = prev.id == glyph and prev.font == currentfont and after[1][prev.char]
+ else
+ for n=1,#after do
+ if prev then
+ if prev.id == glyph and prev.font == currentfont then -- normal char
+ local char = prev.char
+ local class = characters[char].class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
+ elseif not after[n][char] then
+ match = false break
+ end
+ elseif not after[n][32] then
+ match = false break
+ end
+ prev = prev.prev
+ elseif not after[n][32] then
+ match = false break
+ end
+ end
+ end
+ elseif #after == 1 then
+ match = after[1][32]
+ else
+ for n=#after,1 do
+ if not after[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ if match and #before > 0 then
+ local next = stop.next
+ if next then
+ if #after == 1 then
+ match = next.id == glyph and next.font == currentfont and before[1][next.char]
+ else
+ for n=#before,1 do
+ if next then
+ if next.id == glyph and next.font == currentfont then -- normal char
+ local char = next.char
+ local class = characters[char].class
+ if class == skipmark or class == skipligature or class == skipbase then
+ -- skip 'm
+ elseif not before[n][char] then
+ match = false break
+ end
+ elseif not before[n][32] then -- brrr
+ match = false break
+ end
+ next = next.next
+ elseif not before[n][32] then
+ match = false break
+ end
+ end
+ end
+ elseif #before == 1 then
+ match = before[1][32]
+ else
+ for n=1,#before do
+ if not before[n][32] then
+ match = false break
+ end
+ end
+ end
+ end
+ if match then
+ local trace = fonts.otf.trace_contexts
+ if trace then
+ report("otf reverse chain",format("%s: rule %s of %s matches %s times at char %s (%s) lookuptype %s",kind,rule,lookupname,#sequence,char,utf.char(char),lookuptype))
+ end
+ if lookups then
+ local cp = chainprocs[lookuptype]
+ if cp then
+ start = cp(start,stop,kind,lookupname,sequence,lookups,flags)
+ else
+ report("otf reverse chain",format("%s: lookuptype %s not supported yet for %s",kind,lookuptype,lookupname))
+ end
+ elseif trace then
+ report("otf reverse chain",format("%s: skipping match for %s",kind,lookupname))
+ end
+ done = true
+ break
+ end
+ end
+ return start, done
+ end
+
+ fonts.otf.features.process.gsub_context = fonts.otf.features.process.contextchain
+ fonts.otf.features.process.gsub_contextchain = fonts.otf.features.process.contextchain
+ fonts.otf.features.process.gsub_reversecontextchain = fonts.otf.features.process.reversecontextchain
+
+ fonts.otf.features.process.gpos_contextchain = fonts.otf.features.process.contextchain
+ fonts.otf.features.process.gpos_context = fonts.otf.features.process.contextchain
+
+end
+
+-- aalt abvf abvs blwf blwm blws dist falt fwid half halt hwid jalt lfbd ljmo
+-- mset opbd palt pwid qwid rand rtbd rtla ruby size tjmo twid valt vatu vert
+-- vhal vjmo vkna vkrn vpal vrt2
+
+do
+
+ local process = fonts.otf.features.process.feature
+
+ function fonts.methods.node.otf.afrc(head,font) return process(head,font,'afrc') end
+ function fonts.methods.node.otf.akhn(head,font) return process(head,font,'akhn') end
+ function fonts.methods.node.otf.c2pc(head,font) return process(head,font,'c2pc') end
+ function fonts.methods.node.otf.c2sc(head,font) return process(head,font,'c2sc') end
+ function fonts.methods.node.otf.calt(head,font) return process(head,font,'calt') end
+ function fonts.methods.node.otf.case(head,font) return process(head,font,'case') end
+ function fonts.methods.node.otf.ccmp(head,font) return process(head,font,'ccmp') end
+ function fonts.methods.node.otf.clig(head,font) return process(head,font,'clig') end
+ function fonts.methods.node.otf.cpsp(head,font) return process(head,font,'cpsp') end
+ function fonts.methods.node.otf.cswh(head,font) return process(head,font,'cswh') end
+ function fonts.methods.node.otf.curs(head,font) return process(head,font,'curs') end
+ function fonts.methods.node.otf.dlig(head,font) return process(head,font,'dlig') end
+ function fonts.methods.node.otf.dnom(head,font) return process(head,font,'dnom') end
+ function fonts.methods.node.otf.expt(head,font) return process(head,font,'expt') end
+ function fonts.methods.node.otf.fin2(head,font) return process(head,font,'fin2') end
+ function fonts.methods.node.otf.fin3(head,font) return process(head,font,'fin3') end
+ function fonts.methods.node.otf.fina(head,font) return process(head,font,'fina',3) end
+ function fonts.methods.node.otf.frac(head,font) return process(head,font,'frac') end
+ function fonts.methods.node.otf.haln(head,font) return process(head,font,'haln') end
+ function fonts.methods.node.otf.hist(head,font) return process(head,font,'hist') end
+ function fonts.methods.node.otf.hkna(head,font) return process(head,font,'hkna') end
+ function fonts.methods.node.otf.hlig(head,font) return process(head,font,'hlig') end
+ function fonts.methods.node.otf.hngl(head,font) return process(head,font,'hngl') end
+ function fonts.methods.node.otf.init(head,font) return process(head,font,'init',1) end
+ function fonts.methods.node.otf.isol(head,font) return process(head,font,'isol',4) end
+ function fonts.methods.node.otf.ital(head,font) return process(head,font,'ital') end
+ function fonts.methods.node.otf.jp78(head,font) return process(head,font,'jp78') end
+ function fonts.methods.node.otf.jp83(head,font) return process(head,font,'jp83') end
+ function fonts.methods.node.otf.jp90(head,font) return process(head,font,'jp90') end
+ function fonts.methods.node.otf.kern(head,font) return process(head,font,'kern') end
+ function fonts.methods.node.otf.liga(head,font) return process(head,font,'liga') end
+ function fonts.methods.node.otf.lnum(head,font) return process(head,font,'lnum') end
+ function fonts.methods.node.otf.locl(head,font) return process(head,font,'locl') end
+ function fonts.methods.node.otf.mark(head,font) return process(head,font,'mark') end
+ function fonts.methods.node.otf.med2(head,font) return process(head,font,'med2') end
+ function fonts.methods.node.otf.medi(head,font) return process(head,font,'medi',2) end
+ function fonts.methods.node.otf.mgrk(head,font) return process(head,font,'mgrk') end
+ function fonts.methods.node.otf.mkmk(head,font) return process(head,font,'mkmk') end
+ function fonts.methods.node.otf.nalt(head,font) return process(head,font,'nalt') end
+ function fonts.methods.node.otf.nlck(head,font) return process(head,font,'nlck') end
+ function fonts.methods.node.otf.nukt(head,font) return process(head,font,'nukt') end
+ function fonts.methods.node.otf.numr(head,font) return process(head,font,'numr') end
+ function fonts.methods.node.otf.onum(head,font) return process(head,font,'onum') end
+ function fonts.methods.node.otf.ordn(head,font) return process(head,font,'ordn') end
+ function fonts.methods.node.otf.ornm(head,font) return process(head,font,'ornm') end
+ function fonts.methods.node.otf.pnum(head,font) return process(head,font,'pnum') end
+ function fonts.methods.node.otf.pref(head,font) return process(head,font,'pref') end
+ function fonts.methods.node.otf.pres(head,font) return process(head,font,'pres') end
+ function fonts.methods.node.otf.pstf(head,font) return process(head,font,'pstf') end
+ function fonts.methods.node.otf.rlig(head,font) return process(head,font,'rlig') end
+ function fonts.methods.node.otf.rphf(head,font) return process(head,font,'rphf') end
+ function fonts.methods.node.otf.salt(head,font) return process(head,font,'calt') end
+ function fonts.methods.node.otf.sinf(head,font) return process(head,font,'sinf') end
+ function fonts.methods.node.otf.smcp(head,font) return process(head,font,'smcp') end
+ function fonts.methods.node.otf.smpl(head,font) return process(head,font,'smpl') end
+ function fonts.methods.node.otf.ss01(head,font) return process(head,font,'ss01') end
+ function fonts.methods.node.otf.ss02(head,font) return process(head,font,'ss02') end
+ function fonts.methods.node.otf.ss03(head,font) return process(head,font,'ss03') end
+ function fonts.methods.node.otf.ss04(head,font) return process(head,font,'ss04') end
+ function fonts.methods.node.otf.ss05(head,font) return process(head,font,'ss05') end
+ function fonts.methods.node.otf.ss06(head,font) return process(head,font,'ss06') end
+ function fonts.methods.node.otf.ss07(head,font) return process(head,font,'ss07') end
+ function fonts.methods.node.otf.ss08(head,font) return process(head,font,'ss08') end
+ function fonts.methods.node.otf.ss09(head,font) return process(head,font,'ss09') end
+ function fonts.methods.node.otf.subs(head,font) return process(head,font,'subs') end
+ function fonts.methods.node.otf.sups(head,font) return process(head,font,'sups') end
+ function fonts.methods.node.otf.swsh(head,font) return process(head,font,'swsh') end
+ function fonts.methods.node.otf.titl(head,font) return process(head,font,'titl') end
+ function fonts.methods.node.otf.tnam(head,font) return process(head,font,'tnam') end
+ function fonts.methods.node.otf.tnum(head,font) return process(head,font,'tnum') end
+ function fonts.methods.node.otf.trad(head,font) return process(head,font,'trad') end
+ function fonts.methods.node.otf.unic(head,font) return process(head,font,'unic') end
+ function fonts.methods.node.otf.zero(head,font) return process(head,font,'zero') end
+
+end
+
+--~ function fonts.initializers.node.otf.install(feature,attribute)
+--~ function fonts.initializers.node.otf[feature](tfm,value) return fonts.otf.features.prepare.feature(tfm,feature,value) end
+--~ function fonts.methods.node.otf[feature] (head,font) return fonts.otf.features.process.feature(head,font,feature,attribute) end
+--~ end
+
+-- common stuff
+
+function fonts.otf.features.language(tfm,value)
+ if value then
+ value = value:lower()
+ if fonts.otf.tables.languages[value] then
+ tfm.language = value
+ end
+ end
+end
+
+function fonts.otf.features.script(tfm,value)
+ if value then
+ value = value:lower()
+ if fonts.otf.tables.scripts[value] then
+ tfm.script = value
+ end
+ end
+end
+
+function fonts.otf.features.mode(tfm,value)
+ if value then
+ tfm.mode = value:lower()
+ end
+end
+
+fonts.initializers.base.otf.language = fonts.otf.features.language
+fonts.initializers.base.otf.script = fonts.otf.features.script
+fonts.initializers.base.otf.mode = fonts.otf.features.mode
+fonts.initializers.base.otf.method = fonts.otf.features.mode
+
+fonts.initializers.node.otf.language = fonts.otf.features.language
+fonts.initializers.node.otf.script = fonts.otf.features.script
+fonts.initializers.node.otf.mode = fonts.otf.features.mode
+fonts.initializers.node.otf.method = fonts.otf.features.mode
+
+fonts.initializers.node.otf.trep = fonts.initializers.base.otf.trep
+fonts.initializers.node.otf.tlig = fonts.initializers.base.otf.tlig
+fonts.initializers.node.otf.texquotes = fonts.initializers.base.otf.texquotes
+fonts.initializers.node.otf.texligatures = fonts.initializers.base.otf.texligatures
+
+-- we need this because fonts can be bugged
+
+-- \definefontfeature[calt][language=nld,script=latn,mode=node,calt=yes,clig=yes,rlig=yes]
+-- \definefontfeature[dflt][language=nld,script=latn,mode=node,calt=no, clig=yes,rlig=yes]
+-- \definefontfeature[fixd][language=nld,script=latn,mode=node,calt=no, clig=yes,rlig=yes,ignoredrules={44,45,47}]
+
+-- \starttext
+
+-- {\type{dflt:}\font\test=ZapfinoExtraLTPro*dflt at 24pt \test \char57777\char57812 c/o} \endgraf
+-- {\type{calt:}\font\test=ZapfinoExtraLTPro*calt at 24pt \test \char57777\char57812 c/o} \endgraf
+-- {\type{fixd:}\font\test=ZapfinoExtraLTPro*fixd at 24pt \test \char57777\char57812 c/o} \endgraf
+
+-- \stoptext
+
+--~ table.insert(fonts.triggers,"ignoredrules")
+
+--~ function fonts.initializers.node.otf.ignoredrules(tfmdata,value)
+--~ if value then
+--~ -- these tests must move !
+--~ tfmdata.unique = tfmdata.unique or { }
+--~ tfmdata.unique.ignoredrules = tfmdata.unique.ignoredrules or { }
+--~ local ignored = tfmdata.unique.ignoredrules
+--~ -- value is already ok now
+--~ for s in string.gmatch(value:gsub("[{}]","")..",", "%s*(.-),") do
+--~ ignored[tonumber(s)] = true
+--~ end
+--~ end
+--~ end
+
+fonts.initializers.base.otf.equaldigits = fonts.initializers.common.equaldigits
+fonts.initializers.node.otf.equaldigits = fonts.initializers.common.equaldigits
+
+fonts.initializers.base.otf.lineheight = fonts.initializers.common.lineheight
+fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight
+
+-- temp hack, may change
+
+function fonts.initializers.base.otf.kern(tfmdata,value)
+ fonts.otf.features.prepare_base_kerns(tfmdata,'kern',value)
+end
+
+--~ fonts.initializers.node.otf.kern = fonts.initializers.base.otf.kern
+
+-- there is no real need to register features here, only the defaults; supported
+-- features are part of the font data
+
+-- fonts.otf.features.register('tlig',true)
+-- fonts.otf.features.register('liga',true)
+-- fonts.otf.features.register('kern',true)
+
+-- bonus function
+
+function fonts.otf.name_to_slot(name) -- todo: afm en tfm
+ local tfmdata = fonts.tfm.id[font.current()]
+ if tfmdata and tfmdata.shared then
+ local otfdata = tfmdata.shared.otfdata
+ if otfdata and otfdata.luatex then
+ return otfdata.luatex.unicodes[name]
+ end
+ end
+ return nil
+end
+
+function fonts.otf.char(n) -- todo: afm en tfm
+ if type(n) == "string" then
+ n = fonts.otf.name_to_slot(n)
+ end
+ if n then
+ tex.sprint(tex.ctxcatcodes,string.format("\\char%s ",n))
+ end
+end
+
+--~ function fonts.otf.name_to_table(name)
+--~ lcoal temp, result = { }
+--~ local tfmdata = fonts.tfm.id[font.current()]
+--~ if tfmdata and tfmdata.shared then
+--~ local otfdata = tfmdata.shared.otfdata
+--~ if otfdata and otfdata.luatex then
+--~ for k,v in pairs(otfdata.glyphs) do
+--~ if v.name:find(name) then
+--~ temp[v.name] = v.unicodeenc
+--~ end
+--~ end
+--~ end
+--~ end
+--~ for k,v in pairs(table.sortedkeys(temp)) do
+--~ result[#result+1] = { v, temp[v] }
+--~ end
+--~ return result
+--~ end
+
+-- Here we plug in some analyzing code
+
+
+do
+
+ local glyph = node.id('glyph')
+ local fontdata = fonts.tfm.id
+ local set_attribute = node.set_attribute
+ local has_attribute = node.has_attribute
+ local state = attributes.numbers['state'] or 100
+
+ -- in the future we will use language/script attributes instead of the
+ -- font related value, but then we also need dynamic features which is
+ -- somewhat slower; and .. we need a chain of them
+
+ function fonts.initializers.node.otf.analyze(tfm,value)
+ local script, language = tfm.script, tfm.language
+ local action = fonts.analyzers.initializers[script]
+ if action then
+ if type(action) == "function" then
+ return action(tfm,value)
+ elseif action[language] then
+ return action[language](tfm,value)
+ end
+ end
+ return nil
+ end
+
+ function fonts.methods.node.otf.analyze(head,font)
+ local tfmdata = fontdata[font]
+ local script, language = fontdata[font].script, fontdata[font].language
+ local action = fonts.analyzers.methods[script]
+ if action then
+ if type(action) == "function" then
+ return action(head,font)
+ elseif action[language] then
+ return action[language](head,font)
+ end
+ end
+ return head, false
+ end
+
+ fonts.otf.features.register("analyze",true) -- we always analyze
+ table.insert(fonts.triggers,"analyze") -- we need a proper function for doing this
+
+ -- latin
+
+ fonts.analyzers.methods.latn = fonts.analyzers.aux.setstate
+
+ -- arab / todo: 0640 tadwil
+
+ local isol = {
+ [0x0621] = true,
+ }
+
+ local isol_fina = {
+ [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true, [0x0627] = true, [0x062F] = true,
+ [0x0630] = true, [0x0631] = true, [0x0632] = true,
+ [0x0648] = true,
+ [0xFEF5] = true, [0xFEF7] = true, [0xFEF9] = true, [0xFEFB] = true,
+ }
+
+ local isol_fina_medi_init = {
+ [0x0626] = true, [0x0628] = true, [0x0629] = true, [0x062A] = true, [0x062B] = true, [0x062C] = true, [0x062D] = true, [0x062E] = true,
+ [0x0633] = true, [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true, [0x0638] = true, [0x0639] = true, [0x063A] = true,
+ [0x0641] = true, [0x0642] = true, [0x0643] = true, [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true, [0x0649] = true, [0x064A] = true,
+ [0x067E] = true,
+ [0x0686] = true,
+ }
+
+ local arab_warned = { }
+
+ local function warning(current,what)
+ local char = current.char
+ if not arab_warned[char] then
+ log.report("analyze",string.format("arab: character %s (0x%04X) has no %s class", char, char, what))
+ arab_warned[char] = true
+ end
+ end
+
+ local fcs = fonts.color.set
+ local fcr = fonts.color.reset
+
+ function fonts.analyzers.methods.nocolor(head,font)
+ for n in nodes.traverse(glyph) do
+ if not font or n.font == font then
+ fcr(n)
+ end
+ end
+ return head, true
+ end
+
+ function fonts.analyzers.methods.arab(head,font) -- maybe make a special version with no trace
+ local characters = fontdata[font].characters
+ local first, last, current, done = nil, nil, head, false
+ local trace = fonts.color.trace
+ --~ local laststate = 0
+ local function finish()
+ if last then
+ if first == last then
+ if isol_fina_medi_init[first.char] or isol_fina[first.char] then
+ set_attribute(first,state,4) -- isol
+ if trace then fcs(first,"font:isol") end
+ else
+ warning(first,"isol")
+ set_attribute(first,state,0) -- error
+ if trace then fcr(first) end
+ end
+ else
+ if isol_fina_medi_init[last.char] or isol_fina[last.char] then -- why isol here ?
+ -- if laststate == 1 or laststate == 2 or laststate == 4 then
+ set_attribute(last,state,3) -- fina
+ if trace then fcs(last,"font:fina") end
+ else
+ warning(last,"fina")
+ set_attribute(last,state,0) -- error
+ if trace then fcr(last) end
+ end
+ end
+ first, last = nil, nil
+ elseif first then
+ -- first and last are either both set so we never com here
+ if isol_fina_medi_init[first.char] or isol_fina[first.char] then
+ set_attribute(first,state,4) -- isol
+ if trace then fcs(first,"font:isol") end
+ else
+ warning(first,"isol")
+ set_attribute(first,state,0) -- error
+ if trace then fcr(first) end
+ end
+ first = nil
+ end
+ --~ laststate = 0
+ end
+ while current do
+ if current.id == glyph and current.font == font then
+ done = true
+ local char = current.char
+ if characters[char].class == "mark" then -- marks are now in components
+ set_attribute(current,state,5) -- mark
+ if trace then fcs(current,"font:mark") end
+ elseif isol[char] then
+ finish()
+ set_attribute(current,state,4) -- isol
+ if trace then fcs(current,"font:isol") end
+ first, last = nil, nil
+ --~ laststate = 0
+ elseif not first then
+ if isol_fina_medi_init[char] then
+ set_attribute(current,state,1) -- init
+ if trace then fcs(current,"font:init") end
+ first, last = first or current, current
+ --~ laststate = 1
+ elseif isol_fina[char] then
+ set_attribute(current,state,4) -- isol
+ if trace then fcs(current,"font:isol") end
+ first, last = nil, nil
+ --~ laststate = 0
+ else -- no arab
+ finish()
+ end
+ elseif isol_fina_medi_init[char] then
+ first, last = first or current, current
+ set_attribute(current,state,2) -- medi
+ if trace then fcs(current,"font:medi") end
+ --~ laststate = 2
+ elseif isol_fina[char] then
+ -- if not laststate == 1 then
+ if not has_attribute(last,state,1) then
+ -- tricky, we need to check what last may be !
+ set_attribute(last,state,2) -- medi
+ if trace then fcs(last,"font:medi") end
+ end
+ set_attribute(current,state,3) -- fina
+ if trace then fcs(current,"font:fina") end
+ first, last = nil, nil
+ --~ laststate = 0
+ elseif char >= 0x0600 and char <= 0x06FF then
+ if trace then fcs(current,"font:rest") end
+ finish()
+ else --no
+ finish()
+ end
+ else
+ finish()
+ end
+ current = current.next
+ end
+ finish()
+ return head, done
+ end
+
+end
+
+-- experimental and will probably change
+
+function fonts.install_feature(type,...)
+ if fonts[type] and fonts[type].install_feature then
+ fonts[type].install_feature(...)
+ end
+end
+function fonts.otf.install_feature(tag)
+ fonts.methods.node.otf [tag] = function(head,font) return fonts.otf.features.process.feature(head,font,tag) end
+ fonts.initializers.node.otf[tag] = function(tfm,value) return fonts.otf.features.prepare.feature(tfm,tag,value) end
+end
+
+
+--~ exclam + quoteleft => exclamdown
+--~ question + quoteleft => questiondown
+
+--~ less + less => guillemotleft
+--~ greater + greater => guillemotright
+
+--~ I + J => IJ
+--~ f + f => ff
+--~ f + i => fi
+--~ f + l => fl
+--~ f + k => fk
+--~ ff + i => ffi
+--~ ff + l => ffl
+--~ i + j => ij
+
+--~ comma + comma => quotedblbase
+--~ quoteleft + quoteleft => quotedblleft
+--~ quoteright + quoteright => quotedblright
+
+--~ hyphen + hyphen => endash
+--~ endash + hyphen => emdash
+
diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua
new file mode 100644
index 000000000..77898a4a2
--- /dev/null
+++ b/tex/context/base/font-syn.lua
@@ -0,0 +1,285 @@
+if not modules then modules = { } end modules ['font-syn'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module implements a name to filename resolver. Names are resolved
+using a table that has keys filtered from the font related files.</p>
+--ldx]]--
+
+fonts = fonts or { }
+input = input or { }
+texmf = texmf or { }
+
+fonts.names = { }
+fonts.names.filters = { }
+fonts.names.data = { }
+fonts.names.version = 1.04
+fonts.names.saved = false
+fonts.names.loaded = false
+fonts.names.be_clever = true
+fonts.names.enabled = true
+fonts.names.cache = containers.define("fonts","data",fonts.names.version,true)
+
+--[[ldx--
+<p>It would make sense to implement the filters in the related modules,
+but to keep the overview, we define them here.</p>
+--ldx]]--
+
+fonts.names.filters.otf = fontforge.info
+fonts.names.filters.ttf = fontforge.info
+fonts.names.filters.ttc = fontforge.info
+
+function fonts.names.filters.afm(name)
+ local f = io.open(name)
+ if f then
+ local hash = { }
+ for line in f:lines() do
+ local key, value = line:match("^(.+)%s+(.+)%s*$")
+ if key and #key > 0 then
+ hash[key:lower()] = value
+ end
+ if line:find("StartCharMetrics") then
+ break
+ end
+ end
+ f:close()
+ return hash
+ else
+ return nil
+ end
+end
+
+--[[ldx--
+<p>The scanner loops over the filters using the information stored in
+the file databases. Watch how we check not only for the names, but also
+for combination with the weight of a font.</p>
+--ldx]]--
+
+fonts.names.filters.list = {
+ "otf", "ttf", "ttc", "afm"
+}
+
+fonts.names.filters.fixes = {
+ { "reg$", "regular", },
+ { "ita$", "italic", },
+ { "ital$", "italic", },
+ { "cond$", "condensed", },
+}
+
+function fonts.names.identify()
+ fonts.names.data = {
+ mapping = { },
+ version = fonts.names.version
+ }
+ local done, mapping, nofread, nofok = { }, fonts.names.data.mapping, 0, 0
+ local function add(n,fontname,filename,suffix, sub)
+ n = n:lower()
+ if not mapping[n] then mapping[n], nofok = { suffix, fontname, filename, sub }, nofok + 1 end
+ n = n:gsub("[^%a%d]","")
+ if not mapping[n] then mapping[n], nofok = { suffix, fontname, filename, sub }, nofok + 1 end
+ end
+ local function check(result, filename, suffix, is_sub)
+ local fontname = result.fullname
+ if fontname then
+ add(result.fullname, fontname, filename, suffix, is_sub)
+ end
+ if result.fontname then
+ fontname = fontname or result.fontname
+ add(result.fontname, fontname, filename, suffix, is_sub)
+ end
+ if result.familyname and result.weight then
+ local madename = result.familyname .. " " .. result.weight
+ fontname = fontname or madename
+ add(madename, fontname, filename, suffix, is_sub)
+ end
+ end
+ local function identify(completename,name,suffix)
+ if not done[name] then
+ nofread = nofread + 1
+ logs.info("fontnames", "identifying " .. suffix .. " font " .. completename)
+ logs.push()
+ local result = fonts.names.filters[suffix](completename)
+ logs.pop()
+ if result then
+ if not result[1] then
+ check(result,name,suffix,false)
+ else for _, r in ipairs(result) do
+ check(r,name,suffix,true)
+ end end
+ end
+ done[name] = true
+ end
+ end
+ local function traverse(what, method)
+ for n, suffix in pairs(fonts.names.filters.list) do
+ nofread, nofok = 0, 0
+ local t = os.clock()
+ logs.report("fontnames", string.format("identifying %s font files with suffix %s",what,suffix))
+ method(suffix)
+ logs.report("fontnames", string.format("%s %s files identified, %s hash entries added, runtime %s seconds", nofread, what,nofok, os.clock()-t))
+ end
+ end
+ traverse("tree", function(suffix)
+ input.with_files(texmf.instance,".*%." .. suffix .. "$", function(method,root,path,name)
+ if method == "file" then
+ identify(root .."/" .. path .. "/" .. name,name,suffix)
+ end
+ end)
+ end)
+ traverse("system", function(suffix)
+ local pathlist = input.expanded_path_list(texmf.instance,"osfontdir")
+ if pathlist then
+ for _, path in ipairs(pathlist) do
+ -- not that much needed
+ path = input.clean_path(path .. "/")
+ path = path:gsub("/+","/")
+ local pattern = path .. "*." .. suffix
+ logs.info("fontnames", "globbing path " .. pattern)
+ local t = dir.glob(pattern)
+ for _, name in pairs(t) do
+ local mode = lfs.attributes(name,'mode')
+ if mode == "file" then
+ identify(name,file.basename(name),suffix)
+ end
+ end
+ end
+ end
+ end)
+ local t = { }
+ for _, f in ipairs(fonts.names.filters.fixes) do
+ local expression, replacement = f[1], f[2]
+ for k,v in pairs(mapping) do
+ local fix, pos = k:gsub(expression,replacement)
+ if pos > 0 and not mapping[fix] then
+ t[fix] = v
+ end
+ end
+ end
+ for k,v in pairs(t) do
+ mapping[k] = v
+ end
+end
+
+function fonts.names.load(reload)
+ if not fonts.names.loaded then
+ if reload then
+ if containers.is_usable(fonts.names.cache, "names") then
+ fonts.names.identify()
+ containers.write(fonts.names.cache, "names", fonts.names.data)
+ end
+ fonts.names.saved = true
+ else
+ fonts.names.data = containers.read(fonts.names.cache, "names")
+ if not fonts.names.saved then
+ if table.is_empty(fonts.names.data) or table.is_empty(fonts.names.data.mapping) then
+ fonts.names.load(true)
+ end
+ fonts.names.saved = true
+ end
+ end
+ fonts.names.loaded = true
+ end
+end
+
+function fonts.names.list(pattern,reload)
+ fonts.names.load(reload)
+ if fonts.names.loaded then
+ local t = { }
+ for k,v in pairs(fonts.names.data.mapping) do
+ if k:find(pattern) then
+ t[k] = v
+ end
+ end
+ return t
+ else
+ return nil
+ end
+end
+
+--[[ldx--
+<p>The resolver also checks if the cached names are loaded. Being clever
+here is for testing purposes only (it deals with names prefixed by an
+encoding name).</p>
+--ldx]]--
+
+do
+
+ local function found(name)
+ if fonts.names.data then
+ local result, mapping = nil, fonts.names.data.mapping
+ local mn = mapping[name]
+ if mn then
+ return mn[2], mn[3], mn[4]
+ end
+ if fonts.names.be_clever then -- this will become obsolete
+ local encoding, tag = name:match("^(.-)[%-%:](.+)$")
+ local mt = mapping[tag]
+ if tag and fonts.enc.is_known(encoding) and mt then
+ return mt[1], encoding .. "-" .. mt[3], mt[4]
+ end
+ end
+ -- name, type, file
+ for k,v in pairs(mapping) do
+ if k:find(name) then
+ return v[2], v[3], v[4]
+ end
+ end
+ local condensed = name:gsub("[^%a%d]","")
+ local mc = mapping[condensed]
+ if mc then
+ return mc[2], mc[3], mc[4]
+ end
+ for k,v in pairs(mapping) do
+ if k:find(condensed) then
+ return v[2], v[3], v[4]
+ end
+ end
+ end
+ return nil, nil, nil
+ end
+
+ function fonts.names.resolve(name, sub)
+ if not name then
+ return nil, nil
+ elseif fonts.names.enabled then
+ fonts.names.load()
+ local name, filename, is_sub = found(name:lower())
+ if is_sub then
+ return filename, name
+ else
+ return filename, sub
+ end
+ else
+ return filename, sub
+ end
+ end
+
+end
+
+--[[ldx--
+<p>A handy helper.</p>
+--ldx]]--
+
+function fonts.names.table(pattern,reload,all)
+ local t = fonts.names.list(pattern,reload)
+ if t then
+ tex.sprint(tex.ctxcatcodes,"\\start\\nonknuthmode\\starttabulate[|T|T|T|T|T|]")
+ tex.sprint(tex.ctxcatcodes,"\\NC hashname\\NC type\\NC fontname\\NC filename\\NC\\NR\\HL")
+ for k,v in pairs(table.sortedkeys(t)) do
+ if all or v == t[v][2]:lower() then
+ local type, name, file = unpack(t[v])
+ if type and name and file then
+ tex.sprint(tex.ctxcatcodes,string.format("\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR",v,type, name, file))
+ else
+ logs.report("font table", "skipping ".. v)
+ end
+ end
+ end
+ tex.sprint(tex.ctxcatcodes,"\\stoptabulate\\stop")
+ end
+end
diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua
new file mode 100644
index 000000000..b07f0a062
--- /dev/null
+++ b/tex/context/base/font-tfm.lua
@@ -0,0 +1,479 @@
+if not modules then modules = { } end modules ['font-tfm'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Here we only implement a few helper functions.</p>
+--ldx]]--
+
+fonts = fonts or { }
+fonts.loaded = fonts.loaded or { }
+fonts.dontembed = fonts.dontembed or { }
+fonts.logger = fonts.logger or { }
+fonts.loadtime = 0
+fonts.tfm = fonts.tfm or { }
+fonts.triggers = fonts.triggers or { } -- brrr
+
+--[[ldx--
+<p>The next function encapsulates the standard <l n='tfm'/> loader as
+supplied by <l n='luatex'/>.</p>
+--ldx]]--
+
+function fonts.tfm.read_from_tfm(specification)
+ return font.read_tfm(specification.name,specification.size)
+end
+
+--[[ldx--
+<p>We need to normalize the scale factor (in scaled points). This has to
+do with the fact that <l n='tex'/> uses a negative multiple of 1000 as
+a signal for a font scaled based on the design size.</p>
+--ldx]]--
+
+function fonts.tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as well
+ if scaledpoints < 0 then
+ if designsize then
+ if designsize > 65536 then -- or just 1000
+ return (- scaledpoints/1000) * designsize -- sp's
+ else
+ return (- scaledpoints/1000) * designsize * 65536
+ end
+ else
+ return (- scaledpoints/1000) * 10 * 65536
+ end
+ else
+ return scaledpoints
+ end
+end
+
+--[[ldx--
+<p>Before a font is passed to <l n='tex'/> we scale it.</p>
+--ldx]]--
+
+function fonts.tfm.scale(tfmtable, scaledpoints)
+ -- 65536 = 1pt
+ -- 1000 units per designsize (not always)
+ local scale, round = tex.scale, tex.round -- replaces math.floor(n*m+0.5)
+ local delta
+ if scaledpoints < 0 then
+ scaledpoints = (- scaledpoints/1000) * tfmtable.designsize -- already in sp
+ end
+ delta = scaledpoints/(tfmtable.units or 1000) -- brr, some open type fonts have 2048
+ local t = { }
+ t.factor = delta
+ for k,v in pairs(tfmtable) do
+ if type(v) == "table" then
+ t[k] = { }
+ else
+ t[k] = v
+ end
+ end
+ local tc = t.characters
+ for k,v in pairs(tfmtable.characters) do
+ local chr = {
+ unicode = v.unicode,
+ name = v.name,
+ index = v.index or k,
+ width = scale(v.width , delta),
+ height = scale(v.height, delta),
+ depth = scale(v.depth , delta),
+ class = v.class
+ }
+ local b = v.boundingbox -- maybe faster to have llx etc not in table
+ if b then
+ chr.boundingbox = scale(v.boundingbox,delta)
+ end
+ if v.italic then
+ chr.italic = scale(v.italic,delta)
+ end
+ if v.kerns then
+ chr.kerns = scale(v.kerns,delta)
+ end
+ if v.ligatures then
+ local tt = { }
+ for kk,vv in pairs(v.ligatures) do
+ tt[kk] = vv
+ end
+ chr.ligatures = tt
+ end
+ tc[k] = chr
+ end
+ local tp = t.parameters
+ for k,v in pairs(tfmtable.parameters) do
+ if k == 1 then
+ tp[k] = round(v)
+ else
+ tp[k] = scale(v,delta)
+ end
+ end
+--~ t.encodingbytes = tfmtable.encodingbytes or 2
+ t.size = scaledpoints
+ t.italicangle = tfmtable.italicangle
+ t.ascender = scale(tfmtable.ascender or 0,delta)
+ t.descender = scale(tfmtable.descender or 0,delta)
+ -- new / some data will move here
+ t.shared = tfmtable.shared or { }
+ if t.unique then
+ t.unique = table.fastcopy(tfmtable.unique)
+ else
+ t.unique = { }
+ end
+ return t
+end
+
+--[[ldx--
+<p>The following functions are used for reporting about the fonts
+used. The message itself is not that useful in regular runs but since
+we now have several readers it may be handy to know what reader is
+used for which font.</p>
+--ldx]]--
+
+function fonts.logger.save(tfmtable,source,specification)
+ if tfmtable and specification and specification.specification then
+ specification.source = source
+ fonts.loaded[specification.specification] = specification
+ fonts.used[specification.name] = source
+ end
+end
+
+function fonts.logger.report(separator)
+ local t = { }
+ for _,v in pairs(table.sortedkeys(fonts.loaded)) do
+ t[#t+1] = v .. ":" .. fonts.loaded[v].source
+ end
+ return table.concat(t,separator or " ")
+end
+
+function fonts.logger.format(name)
+ return fonts.used[name] or "unknown"
+end
+
+--[[ldx--
+<p>When we implement functions that deal with features, most of them
+will depend of the font format. Here we define the few that are kind
+of neutral.</p>
+--ldx]]--
+
+fonts.initializers = fonts.initializers or { }
+fonts.initializers.common = fonts.initializers.common or { }
+
+--[[ldx--
+<p>This feature will remove inter-digit kerns.</p>
+--ldx]]--
+
+table.insert(fonts.triggers,"equaldigits")
+
+function fonts.initializers.common.equaldigits(tfmdata,value)
+ if value then
+ local chr = tfmdata.characters
+ for i = utf.byte('0'), utf.byte('9') do
+ local c = chr[i]
+ if c then
+ c.kerns = nil
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>This feature will give all glyphs an equal height and/or depth. Valid
+values are <type>none</type>, <type>height</type>, <type>depth</type> and
+<type>both</type>.</p>
+--ldx]]--
+
+table.insert(fonts.triggers,"lineheight")
+
+function fonts.initializers.common.lineheight(tfmdata,value)
+ if value and type(value) == "string" then
+ if value == "none" then
+ for _,v in pairs(tfmdata.characters) do
+ v.height, v.depth = 0, 0
+ end
+ else
+ local ascender, descender = tfmdata.ascender, tfmdata.descender
+ if ascender and descender then
+ local ht, dp = ascender or 0, descender or 0
+ if value == "height" then
+ dp = 0
+ elseif value == "depth" then
+ ht = 0
+ end
+ if ht > 0 then
+ if dp > 0 then
+ for _,v in pairs(tfmdata.characters) do
+ v.height, v.depth = ht, dp
+ end
+ else
+ for _,v in pairs(tfmdata.characters) do
+ v.height = ht
+ end
+ end
+ elseif dp > 0 then
+ for _,v in pairs(tfmdata.characters) do
+ v.depth = dp
+ end
+ end
+ end
+ end
+ end
+end
+
+--[[ldx--
+<p>It does not make sense any more to support messed up encoding vectors
+so we stick to those that implement oldstyle and small caps. After all,
+we move on. We can extend the next function on demand. This features is
+only used with <l n='afm'/> files.</p>
+--ldx]]--
+
+do
+
+ local smallcaps = lpeg.P(".sc") + lpeg.P(".smallcaps") + lpeg.P(".caps") + lpeg.P("small")
+ local oldstyle = lpeg.P(".os") + lpeg.P(".oldstyle") + lpeg.P(".onum")
+
+ smallcaps = lpeg.Cs((1-smallcaps)^1) * smallcaps^1
+ oldstyle = lpeg.Cs((1-oldstyle )^1) * oldstyle ^1
+
+ function fonts.initializers.common.encoding(tfmdata,value)
+ if value then
+ local encodingfile = value .. '.enc'
+ local encoding = fonts.enc.load(encodingfile)
+ if encoding then
+ -- tfmdata.encoding = value
+ local vector = encoding.vector
+ local afmdata = tfmdata.shared.afmdata
+ local characters = tfmdata.characters
+ local unicodes = afmdata.luatex.unicodes
+ local function remap(pattern,name)
+ local p = lpeg.match(pattern,name)
+ if p then
+ local oldchr, newchr = unicodes[p], unicodes[name]
+ if oldchr and newchr then
+ -- texio.write_nl(string.format("%s (%s) -> %s (%s)",p,oldchr or -1,name,newchr or -1))
+ characters[oldchr] = characters[newchr]
+ end
+ end
+ return p
+ end
+ for _, name in pairs(vector) do
+ local ok = remap(smallcaps,name) or remap(oldstyle,name)
+ end
+ if fonts.map.data[tfmdata.name] then
+ fonts.map.data[tfmdata.name].encoding = encodingfile
+ end
+ end
+ end
+ end
+
+ -- when needed we can provide this as features in e.g. afm files
+
+ function fonts.initializers.common.remap(tfmdata,value,pattern)
+ if value then
+ local afmdata = tfmdata.shared.afmdata
+ local characters = tfmdata.characters
+ local unicodes = afmdata.luatex.unicodes
+ local function remap(pattern,name)
+ local p = lpeg.match(pattern,name)
+ if p then
+ local oldchr, newchr = unicodes[p], unicodes[name]
+ if oldchr and newchr then
+ characters[oldchr] = characters[newchr]
+ end
+ end
+ return p
+ end
+ for _, blob in pairs(characters) do
+ remap(pattern,blob.name)
+ end
+ end
+ end
+
+ function fonts.initializers.common.oldstyle(tfmdata,value)
+ fonts.initializers.common.remap(tfmdata,value,oldstyle)
+ end
+ function fonts.initializers.common.smallcaps(tfmdata,value)
+ fonts.initializers.common.remap(tfmdata,value,smallcaps)
+ end
+
+end
+
+--~ function fonts.initializers.common.install(format,feature) -- 'afm','lineheight'
+--~ fonts.initializers.base[format][feature] = fonts.initializers.common[feature]
+--~ fonts.initializers.node[format][feature] = fonts.initializers.common[feature]
+--~ end
+
+--[[ldx--
+<p>Analyzers run per script and/or language and are needed in order to
+process features right.</p>
+--ldx]]--
+
+fonts.analyzers = fonts.analyzers or { }
+fonts.analyzers.aux = fonts.analyzers.aux or { }
+fonts.analyzers.methods = fonts.analyzers.methods or { }
+fonts.analyzers.initializers = fonts.analyzers.initializers or { }
+
+do
+
+ local glyph = node.id('glyph')
+ local fontdata = fonts.tfm.id
+ local set_attribute = node.set_attribute
+ local unset_attribute = node.unset_attribute
+ local has_attribute = node.has_attribute
+
+ local state = attributes.numbers['state'] or 100
+
+ -- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
+ -- e.g. latin -> hyphenate, arab -> 1/2/3 analyze
+
+ -- an example analyzer
+
+ function fonts.analyzers.aux.setstate(head,font)
+ local characters = fontdata[font].characters
+ local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
+ local function finish()
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ while current do
+ if current.id == glyph and current.font == font then
+ if characters[current.char].class == "mark" then
+ done = true
+ set_attribute(current,state,5) -- mark
+ elseif n == 0 then
+ first, last, n = current, current, 1
+ set_attribute(current,state,1) -- init
+ else
+ last, n = current, n+1
+ set_attribute(current,state,2) -- medi
+ end
+ else
+ finish()
+ end
+ current = current.next
+ end
+ finish()
+ return head, done
+ end
+
+end
+
+
+--[[ldx--
+<p>We move marks into the components list. This saves much nasty testing later on.</p>
+--ldx]]--
+
+do
+
+ local glyph = node.id('glyph')
+ local fontdata = fonts.tfm.id
+ local marknumber = attributes.numbers['mark'] or 200
+ local set_attribute = node.set_attribute
+
+ function fonts.pushmarks(head,font)
+ local tfmdata = fontdata[font]
+ local characters = tfmdata.characters
+ local current, last, done, n = head, nil, false, 0
+ while current do
+ if current.id == glyph and current.font == font then
+ if characters[current.char].class == "mark" then
+ -- check if head
+ if last and not last.components then
+ last.components = current
+ last.components.prev = nil
+ done = true
+ n = 1
+ else
+ n = n + 1
+ end
+ set_attribute(current,marknumber,n)
+ current = current.next
+ elseif last and last.components then
+ -- finish 'm
+ current.prev.next = nil
+ current.prev = last
+ last.next = current
+ last = current
+ last = nil
+ else
+ last = current
+ current = current.next
+ end
+ elseif last and last.components then
+ current.prev.next = nil
+ current.prev = last
+ last.next = current
+ last = nil
+ else
+ last = nil
+ current = current.next
+ end
+ end
+ if last and last.components then
+ last.next = nil
+ end
+ tfmdata.shared.markspushed = done
+ return head, done
+ end
+
+ function fonts.removemarks(head,font)
+ local current, done, characters = head, false, tfmdata.characters
+ while current do
+ if current.id == glyph and current.font == font and characters[current.char].class == "mark" then
+ local next, prev = current.next, current.prev
+ if next then
+ next.prev = prev
+ end
+ if prev then
+ prev.next = next
+ else
+ head = next
+ end
+ node.free(current)
+ current = next
+ done = true
+ else
+ current = current.next
+ end
+ end
+ return head, done
+ end
+
+ function fonts.popmarks(head,font)
+ local tfmdata = fontdata[font]
+ if tfmdata.shared.markspushed then
+ local current, done, characters = head, false, tfmdata.characters
+ while current do
+ if current.id == glyph and current.font == font then
+ local components = current.components
+ if components then
+ local last, next = components, current.next
+ while last.next do last = last.next end
+ if next then
+ next.prev = last
+ end
+ last.next= next
+ current.next = components
+ components.prev = current
+ current.components = nil
+ current = last.next
+ done = true
+ else
+ current = current.next
+ end
+ else
+ current = current.next
+ end
+ end
+ return head, done
+ else
+ return head, false
+ end
+ end
+
+end
diff --git a/tex/context/base/font-vf.lua b/tex/context/base/font-vf.lua
new file mode 100644
index 000000000..f0258e281
--- /dev/null
+++ b/tex/context/base/font-vf.lua
@@ -0,0 +1,213 @@
+if not modules then modules = { } end modules ['font-vf'] = {
+ version = 1.001,
+ comment = "companion to font-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This is very experimental code! Not yet adapted to recent changes.</p>
+--ldx]]--
+
+-- define.methods elsewhere !
+
+fonts = fonts or { }
+
+fonts.define = fonts.define or { }
+fonts.define.methods = fonts.define.methods or { }
+
+fonts.vf = fonts.vf or { }
+fonts.vf.combinations = fonts.vf.combinations or { }
+fonts.vf.aux = fonts.vf.aux or { }
+fonts.vf.aux.combine = fonts.vf.aux.combine or { }
+
+function fonts.define.methods.install(tag, rules)
+ fonts.vf.combinations[tag] = rules
+ fonts.define.methods[tag] = function(specification)
+ return fonts.vf.combine(specification,tag)
+ end
+end
+
+function fonts.vf.aux.combine.assign(g, name, from, to, start, force)
+ local f, id = fonts.vf.aux.combine.load(g,name)
+ if f and id then
+ -- optimize for whole range, then just g = f
+ if not from then from, to = 0, 0xFF00 end
+ if not to then to = from end
+ if not start then start = from end
+ local fc, gc = f.characters, g.characters
+ g.fonts[#g.fonts+1] = { id = id } -- no need to be sparse
+ local hn = #g.fonts
+ for i=from,to do
+ if fc[i] and (force or not gc[i]) then
+ gc[i] = table.fastcopy(fc[i])
+ gc[i].commands = { { 'slot', hn, start } }
+ end
+ start = start + 1
+ end
+ if not g.parameters and #g.fonts > 0 then -- share this code !
+ g.parameters = table.fastcopy(f.parameters)
+ g.italicangle = f.italicangle
+ g.ascender = f.ascender
+ g.descender = f.descender
+ end
+ end
+end
+
+function fonts.vf.aux.combine.process(g,list)
+ if list then
+ for _,v in pairs(list) do
+ (fonts.vf.aux.combine.commands[v[1]] or nop)(g,v)
+ end
+ end
+end
+
+function fonts.vf.aux.combine.load(g,name)
+ return fonts.tfm.read_and_define(name or g.specification.name,g.specification.size)
+end
+
+fonts.vf.aux.combine.commands = {
+ ["initialize"] = function(g,v) fonts.vf.aux.combine.assign(g, g.name) end,
+ ["include-method"] = function(g,v) fonts.vf.aux.combine.process(g,fonts.vf.combinations[v[2]]) end, -- name
+ ["copy-parameters"] = function(g,v) fonts.vf.aux.combine.parameters(g,v[2]) end, -- name
+ ["copy-range"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[4],v[5],true) end, -- name, from-start, from-end, to-start
+ ["copy-char"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[3],v[4],true) end, -- name, from, to
+ ["fallback-range"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[4],v[5],false) end, -- name, from-start, from-end, to-start
+ ["fallback-char"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[3],v[4],false) end, -- name, from, to
+}
+
+function fonts.vf.combine(specification,tag)
+ local g = {
+ name = specification.name,
+ type = 'virtual',
+ fonts = { },
+ characters = { },
+ specification = table.fastcopy(specification)
+ }
+ fonts.vf.aux.combine.process(g,fonts.vf.combinations[tag])
+ return g
+end
+
+fonts.vf.aux.combine.commands["feature"] = function(g,v)
+ local key, value = v[2], v[3]
+ if key then
+ if value == nil then
+ value = true
+ end
+ if g.specification and g.specification.features.normal then
+ g.specification.features.normal[key] = value -- otf?
+ end
+ end
+end
+
+-- simple example with features
+
+fonts.define.methods.install(
+ "ligatures", {
+ { "feature", "liga" } ,
+ { "feature", "dlig" } ,
+ { "initialize" } ,
+ }
+)
+
+--~ fonts.define.methods.install (
+--~ "ligatures-x", {
+--~ { "feature", "liga" } ,
+--~ { "feature", "dlig" } ,
+--~ { "initialize" } ,
+--~ { "lineheight" }
+--~ }
+--~ )
+
+-- docu case
+
+--~ fonts.define.methods.install(
+--~ "weird", {
+--~ { "copy-range", "lmroman10-regular" } ,
+--~ { "copy-char", "lmroman10-regular", 65, 66 } ,
+--~ { "copy-range", "lmsans10-regular", 0x0100, 0x01FF } ,
+--~ { "copy-range", "lmtypewriter10-regular", 0x0200, 0xFF00 } ,
+--~ { "fallback-range", "lmtypewriter10-regular", 0x0000, 0x0200 }
+--~ }
+--~ )
+
+-- demo case -> move to module
+
+fonts.define.methods["demo-1"] = function(specification)
+ local name = specification.name -- symbolic name
+ local size = specification.size -- given size
+--~ specification.name = 'lmroman10-regular' -- forced base name
+--~ specification.features.vtf = { }
+ local f, id = fonts.tfm.read_and_define('lmroman10-regular',size)
+ if f and id then
+ local capscale, digscale = 0.85, 0.75
+ f.name, f.type = name, 'virtual'
+ f.fonts = {
+ {id=id},
+ {name='lmsans10-regular' , size=size*capscale}, -- forced extra name
+ {name='lmtypewriter10-regular', size=size*digscale} -- forced extra name
+ }
+ for k,v in pairs(f.characters) do
+ local u = v.unicode
+ if u and characters.i_is_of_category(u,'lu') then
+ v.width = capscale*v.width
+ v.commands = {
+ {'special','pdf: 1 0 0 rg'},
+ {'slot',2, k},
+ {'special','pdf: 0 g'},
+ }
+ elseif u and characters.i_is_of_category(u,'nd') then
+ v.width = digscale*v.width
+ v.commands = {
+ {'special','pdf: 0 0 1 rg'},
+ {'slot',3,k},
+ {'special','pdf: 0 g'},
+ }
+ else
+ v.commands = {
+ {'special','pdf: 0 1 0 rg'},
+ {'slot',1,k},
+ {'special','pdf: 0 g'},
+ }
+ end
+ end
+ end
+ return f
+end
+
+-- keep as example, now tfm feature
+
+--~ fonts.vf.aux.combine.commands["lineheight"] = function(g,v)
+--~ if g.ascender and g.descender then
+--~ local ht, dp = g.ascender or 0, g.descender or 0
+--~ if v[2] == "none" then
+--~ for _,v in pairs(g.characters) do
+--~ v.height = 0
+--~ v.depth = 0
+--~ end
+--~ else
+--~ if v[2] == "height" then
+--~ dp = 0
+--~ elseif v[2] == "depth" then
+--~ ht = 0
+--~ end
+--~ if ht > 0 then
+--~ if dp > 0 then
+--~ for _,v in pairs(g.characters) do
+--~ v.height = ht
+--~ v.depth = dp
+--~ end
+--~ else
+--~ for _,v in pairs(g.characters) do
+--~ v.height = ht
+--~ end
+--~ end
+--~ elseif dp > 0 then
+--~ for _,v in pairs(g.characters) do
+--~ v.depth = dp
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
diff --git a/tex/context/base/l-aux.lua b/tex/context/base/l-aux.lua
new file mode 100644
index 000000000..59ff42539
--- /dev/null
+++ b/tex/context/base/l-aux.lua
@@ -0,0 +1,39 @@
+-- filename : l-aux.lua
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-aux'] = 1.001
+if not aux then aux = { } end
+
+do
+
+ hash = { }
+
+ function set(key,value)
+ hash[key] = value
+ end
+
+ local space = lpeg.S(' ')^0
+ local equal = lpeg.S("=")^1
+ local comma = lpeg.S(",")^0
+ local nonspace = lpeg.P(1-lpeg.S(' '))^1
+ local nonequal = lpeg.P(1-lpeg.S('='))^1
+ local noncomma = lpeg.P(1-lpeg.S(','))^1
+ local nonbrace = lpeg.P(1-lpeg.S('{}'))^1
+ local nested = lpeg.S('{') * lpeg.C(nonbrace^1) * lpeg.S('}')
+
+ local key = lpeg.C(nonequal)
+ local value = nested + lpeg.C(noncomma)
+
+ local pattern = ((space * key * equal * value * comma) / set)^1
+
+ function aux.settings_to_hash(str)
+ hash = { }
+ lpeg.match(pattern,str)
+ return hash
+ end
+
+end
+
+--~ print(table.serialize(aux.settings_to_hash("aaa=bbb, ccc={d,d,d}")))
diff --git a/tex/context/base/l-boolean.lua b/tex/context/base/l-boolean.lua
new file mode 100644
index 000000000..128e1d069
--- /dev/null
+++ b/tex/context/base/l-boolean.lua
@@ -0,0 +1,41 @@
+-- filename : l-boolean.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-boolean'] = 1.001
+if not boolean then boolean = { } end
+
+function boolean.tonumber(b)
+ if b then return 1 else return 0 end
+end
+
+function toboolean(str)
+ if type(str) == "string" then
+ return str == "true" or str == "yes" or str == "on" or str == "1"
+ elseif type(str) == "number" then
+ return tonumber(str) ~= 0
+ else
+ return str
+ end
+end
+
+function string.is_boolean(str)
+ if type(str) == "string" then
+ if str == "true" or str == "yes" or str == "on" then
+ return true
+ elseif str == "false" or str == "no" or str == "off" then
+ return false
+ end
+ end
+ return nil
+end
+
+function boolean.alwaystrue()
+ return true
+end
+
+function boolean.falsetrue()
+ return false
+end
diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua
new file mode 100644
index 000000000..df241d221
--- /dev/null
+++ b/tex/context/base/l-dir.lua
@@ -0,0 +1,94 @@
+-- filename : l-dir.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-dir'] = 1.001
+
+dir = { }
+
+-- optimizing for no string.find (*) does not save time
+
+if lfs then
+
+ function dir.glob_pattern(path,patt,recurse,action)
+ for name in lfs.dir(path) do
+ local full = path .. '/' .. name
+ local mode = lfs.attributes(full,'mode')
+ if mode == 'file' then
+ if name:find(patt) then
+ action(full)
+ end
+ elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
+ dir.glob_pattern(full,patt,recurse,action)
+ end
+ end
+ end
+
+ function dir.glob(pattern, action)
+ local t = { }
+ local action = action or function(name) table.insert(t,name) end
+ local path, patt = pattern:match("^(.*)/*%*%*/*(.-)$")
+ local recurse = path and patt
+ if not recurse then
+ path, patt = pattern:match("^(.*)/(.-)$")
+ if not (path and patt) then
+ path, patt = '.', pattern
+ end
+ end
+ patt = patt:gsub("([%.%-%+])", "%%%1")
+ patt = patt:gsub("%*", ".*")
+ patt = patt:gsub("%?", ".")
+ patt = "^" .. patt .. "$"
+ -- print('path: ' .. path .. ' | pattern: ' .. patt .. ' | recurse: ' .. tostring(recurse))
+ dir.glob_pattern(path,patt,recurse,action)
+ return t
+ end
+
+ -- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex")
+ -- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex")
+ -- t = dir.glob("c:/data/develop/context/texmf/**/*.tex")
+ -- t = dir.glob("f:/minimal/tex/**/*")
+ -- print(dir.ls("f:/minimal/tex/**/*"))
+ -- print(dir.ls("*.tex"))
+
+ function dir.ls(pattern)
+ return table.concat(dir.glob(pattern),"\n")
+ end
+
+ --~ mkdirs("temp")
+ --~ mkdirs("a/b/c")
+ --~ mkdirs(".","/a/b/c")
+ --~ mkdirs("a","b","c")
+
+ function dir.mkdirs(...) -- root,... or ... ; root is not split
+ local pth, err = "", false
+ for k,v in pairs({...}) do
+ if k == 1 then
+ if not lfs.isdir(v) then
+ -- print("no root path " .. v)
+ err = true
+ else
+ pth = v
+ end
+ elseif lfs.isdir(pth .. "/" .. v) then
+ pth = pth .. "/" .. v
+ else
+ for _,s in pairs(v:split("/")) do
+ pth = pth .. "/" .. s
+ if not lfs.isdir(pth) then
+ ok = lfs.mkdir(pth)
+ if not lfs.isdir(pth) then
+ err = true
+ end
+ end
+ if err then break end
+ end
+ end
+ if err then break end
+ end
+ return pth, not err
+ end
+
+end
diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua
new file mode 100644
index 000000000..ca983402b
--- /dev/null
+++ b/tex/context/base/l-file.lua
@@ -0,0 +1,101 @@
+-- filename : l-file.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-file'] = 1.001
+
+if not file then file = { } end
+
+function file.removesuffix(filename)
+ return filename:gsub("%.%a+$", "")
+end
+
+function file.addsuffix(filename, suffix)
+ if not filename:find("%.%a-$") then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+end
+
+function file.replacesuffix(filename, suffix)
+ return filename:gsub("%.%a+$", "." .. suffix)
+end
+
+function file.dirname(name)
+ return name:match("^(.+)[/\\].-$") or ""
+end
+
+function file.basename(name)
+ return name:match("^.+[/\\](.-)$") or name
+end
+
+function file.extname(name)
+ return name:match("^.+%.(.-)$") or ""
+end
+
+function file.join(...) -- args
+ return (string.gsub(table.concat({...},"/"),"\\","/"))
+end
+
+function file.is_writable(name)
+ local f = io.open(name, 'w')
+ if f then
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function file.is_readable(name)
+ local f = io.open(name,'r')
+ if f then
+ f:close()
+ return true
+ else
+ return false
+ end
+end
+
+function file.split_path(str)
+ if str:find(';') then
+ return str:splitchr(";")
+ else
+ return str:splitchr(io.pathseparator)
+ end
+end
+
+function file.join_path(tab)
+ return table.concat(tab,io.pathseparator)
+end
+
+--~ print('test' .. " == " .. file.collapse_path("test"))
+--~ print("test/test" .. " == " .. file.collapse_path("test/test"))
+--~ print("test/test/test" .. " == " .. file.collapse_path("test/test/test"))
+--~ print("test/test" .. " == " .. file.collapse_path("test/../test/test"))
+--~ print("test" .. " == " .. file.collapse_path("test/../test"))
+--~ print("../test" .. " == " .. file.collapse_path("../test"))
+--~ print("../test/" .. " == " .. file.collapse_path("../test/"))
+--~ print("a/a" .. " == " .. file.collapse_path("a/b/c/../../a"))
+
+function file.collapse_path(str)
+ local ok = false
+ while not ok do
+ ok = true
+ str, n = str:gsub("[^%./]+/%.%./", function(s)
+ ok = false
+ return ""
+ end)
+ end
+ return (str:gsub("/%./","/"))
+end
+
+function file.robustname(str)
+ return (str:gsub("[^%a%d%/%-%.\\]+","-"))
+end
+
+file.readdata = io.loaddata
+file.savedata = io.savedata
diff --git a/tex/context/base/l-io.lua b/tex/context/base/l-io.lua
new file mode 100644
index 000000000..e53b8fb6a
--- /dev/null
+++ b/tex/context/base/l-io.lua
@@ -0,0 +1,173 @@
+-- filename : l-io.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-io'] = 1.001
+
+if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator = "\\", ";"
+else
+ io.fileseparator, io.pathseparator = "/" , ":"
+end
+
+function io.loaddata(filename)
+ local f = io.open(filename)
+ if f then
+ local data = f:read('*all')
+ f:close()
+ return data
+ else
+ return nil
+ end
+end
+
+function io.savedata(filename,data,joiner)
+ local f = io.open(filename, "wb")
+ if f then
+ if type(data) == "table" then
+ f:write(table.join(data,joiner or ""))
+ elseif type(data) == "function" then
+ data(f)
+ else
+ f:write(data)
+ end
+ f:close()
+ end
+end
+
+function io.exists(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return false
+ else
+ assert(f:close())
+ return true
+ end
+end
+
+function io.size(filename)
+ local f = io.open(filename)
+ if f == nil then
+ return 0
+ else
+ local s = f:seek("end")
+ assert(f:close())
+ return s
+ end
+end
+
+function io.noflines(f)
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
+end
+
+--~ t, f, n = os.clock(), io.open("testbed/sample-utf16-bigendian-big.txt",'rb'), 0
+--~ for a in io.characters(f) do n = n + 1 end
+--~ print(string.format("characters: %s, time: %s", n, os.clock()-t))
+
+do
+
+ local nextchar = {
+ [ 4] = function(f)
+ return f:read(1), f:read(1), f:read(1), f:read(1)
+ end,
+ [ 2] = function(f)
+ return f:read(1), f:read(1)
+ end,
+ [ 1] = function(f)
+ return f:read(1)
+ end,
+ [-2] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ return b, a
+ end,
+ [-4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local c = f:read(1)
+ return d, c, b, a
+ end
+ }
+
+ function io.characters(f,n)
+ local sb = string.byte
+ if f then
+ return nextchar[n or 1], f
+ else
+ return nil, nil
+ end
+ end
+
+end
+
+do
+
+ local nextbyte = {
+ [4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local d = f:read(1)
+ if d then
+ return sb(a), sb(b), sb(c), sb(d)
+ else
+ return nil, nil, nil, nil
+ end
+ end,
+ [2] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ if b then
+ return sb(a), sb(b)
+ else
+ return nil, nil
+ end
+ end,
+ [1] = function (f)
+ local a = f:read(1)
+ if a then
+ return sb(a)
+ else
+ return nil
+ end
+ end,
+ [-2] = function (f)
+ local a = f:read(1)
+ local b = f:read(1)
+ if b then
+ return sb(b), sb(a)
+ else
+ return nil, nil
+ end
+ end,
+ [-4] = function(f)
+ local a = f:read(1)
+ local b = f:read(1)
+ local c = f:read(1)
+ local d = f:read(1)
+ if d then
+ return sb(d), sb(c), sb(b), sb(a)
+ else
+ return nil, nil, nil, nil
+ end
+ end
+ }
+
+ function io.bytes(f,n)
+ local sb = string.byte
+ if f then
+ return nextbyte[n or 1], f
+ else
+ return nil, nil
+ end
+ end
+
+end
diff --git a/tex/context/base/l-math.lua b/tex/context/base/l-math.lua
new file mode 100644
index 000000000..b2090143b
--- /dev/null
+++ b/tex/context/base/l-math.lua
@@ -0,0 +1,25 @@
+-- filename : l-math.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-math'] = 1.001
+
+if not math.round then
+ function math.round(x)
+ return math.floor(x + 0.5)
+ end
+end
+
+if not math.div then
+ function math.div(n,m)
+ math.floor(n/m)
+ end
+end
+
+if not math.mod then
+ function math.mod(n,m)
+ return n % m
+ end
+end
diff --git a/tex/context/base/l-md5.lua b/tex/context/base/l-md5.lua
new file mode 100644
index 000000000..2a24f4169
--- /dev/null
+++ b/tex/context/base/l-md5.lua
@@ -0,0 +1,18 @@
+-- filename : l-md5.lua
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-md5'] = 1.001
+
+if md5 then do
+
+ local function convert(str,fmt)
+ return (string.gsub(md5.sum(str),".",function(chr) return string.format(fmt,string.byte(chr)) end))
+ end
+
+ if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end
+ if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end
+ if not md5.dec then function md5.dec(str) return convert(stt,"%03i") end end
+
+end end
diff --git a/tex/context/base/l-number.lua b/tex/context/base/l-number.lua
new file mode 100644
index 000000000..e463cb973
--- /dev/null
+++ b/tex/context/base/l-number.lua
@@ -0,0 +1,10 @@
+-- filename : l-number.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-number'] = 1.001
+
+if not number then number = { } end
+
diff --git a/tex/context/base/l-os.lua b/tex/context/base/l-os.lua
new file mode 100644
index 000000000..0c1d92911
--- /dev/null
+++ b/tex/context/base/l-os.lua
@@ -0,0 +1,27 @@
+-- filename : l-os.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-os'] = 1.001
+
+function os.resultof(command)
+ return io.popen(command,"r"):read("*all")
+end
+
+--~ if not os.exec then -- still not ok
+ os.exec = os.execute
+--~ end
+
+function os.launch(str)
+ if os.platform == "windows" then
+ os.execute("start " .. str)
+ else
+ os.execute(str .. " &")
+ end
+end
+
+if not os.setenv then
+ function os.setenv() return false end
+end
diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua
new file mode 100644
index 000000000..9b594ff8a
--- /dev/null
+++ b/tex/context/base/l-string.lua
@@ -0,0 +1,307 @@
+-- filename : l-string.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-string'] = 1.001
+
+--~ function string.split(str, pat) -- taken from the lua wiki
+--~ local t = {n = 0} -- so this table has a length field, traverse with ipairs then!
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = string.find(str, fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ table.insert(t,cap)
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = string.find(str, fpat, last_end)
+--~ end
+--~ if last_end<=string.len(str) then
+--~ table.insert(t,(string.sub(str,last_end)))
+--~ end
+--~ return t
+--~ end
+
+--~ function string:split(pat) -- taken from the lua wiki but adapted
+--~ local t = { } -- self and colon usage (faster)
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = self:find(fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ t[#t+1] = cap
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = self:find(fpat, last_end)
+--~ end
+--~ if last_end <= #self then
+--~ t[#t+1] = self:sub(last_end)
+--~ end
+--~ return t
+--~ end
+
+--~ a piece of brilliant code by Rici Lake (posted on lua list) -- only names changed
+--~
+--~ function string:splitter(pat)
+--~ local st, g = 1, self:gmatch("()"..pat.."()")
+--~ local function splitter(self)
+--~ if st then
+--~ local s, f = g()
+--~ local rv = self:sub(st, (s or 0)-1)
+--~ st = f
+--~ return rv
+--~ end
+--~ end
+--~ return splitter, self
+--~ end
+
+function string:splitter(pat)
+ -- by Rici Lake (posted on lua list) -- only names changed
+ -- p 79 ref man: () returns position of match
+ local st, g = 1, self:gmatch("()("..pat..")")
+ local function strgetter(self, segs, seps, sep, cap1, ...)
+ st = sep and seps + #sep
+ return self:sub(segs, (seps or 0) - 1), cap1 or sep, ...
+ end
+ local function strsplitter(self)
+ if st then return strgetter(self, st, g()) end
+ end
+ return strsplitter, self
+end
+
+function string:split(separator)
+ local t = {}
+ for k in self:splitter(separator) do t[#t+1] = k end
+ return t
+end
+
+-- faster than a string:split:
+
+function string:splitchr(chr)
+ if #self > 0 then
+ local t = { }
+ for s in string.gmatch(self..chr,"(.-)"..chr) do
+ t[#t+1] = s
+ end
+ return t
+ else
+ return { }
+ end
+end
+
+--~ function string.piecewise(str, pat, fnc) -- variant of split
+--~ local fpat = "(.-)"..pat
+--~ local last_end = 1
+--~ local s, e, cap = string.find(str, fpat, 1)
+--~ while s ~= nil do
+--~ if s~=1 or cap~="" then
+--~ fnc(cap)
+--~ end
+--~ last_end = e+1
+--~ s, e, cap = string.find(str, fpat, last_end)
+--~ end
+--~ if last_end <= #str then
+--~ fnc((string.sub(str,last_end)))
+--~ end
+--~ end
+
+function string.piecewise(str, pat, fnc) -- variant of split
+ for k in string.splitter(str,pat) do fnc(k) end
+end
+
+--~ do if lpeg then
+
+--~ -- this alternative is 30% faster esp when we cache them
+--~ -- problem: no expressions
+
+--~ splitters = { }
+
+--~ function string:split(separator)
+--~ if #self > 0 then
+--~ local split = splitters[separator]
+--~ if not split then
+--~ -- based on code by Roberto
+--~ local p = lpeg.P(separator)
+--~ local c = lpeg.C((1-p)^0)
+--~ split = lpeg.Ct(c*(p*c)^0)
+--~ splitters[separator] = split
+--~ end
+--~ return lpeg.match(split,self)
+--~ else
+--~ return { }
+--~ end
+--~ end
+
+--~ string.splitchr = string.split
+
+--~ function string:piecewise(separator,fnc)
+--~ for _,v in pairs(self:split(separator)) do
+--~ fnc(v)
+--~ end
+--~ end
+
+--~ end end
+
+string.chr_to_esc = {
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["^"] = "%^", ["$"] = "%$",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ ["{"] = "%{", ["}"] = "%}"
+}
+
+function string:esc() -- variant 2
+ return (self:gsub("(.)",string.chr_to_esc))
+end
+
+function string.unquote(str)
+ return (str:gsub("^([\"\'])(.*)%1$","%2"))
+end
+
+function string.quote(str)
+ return '"' .. str:unquote() .. '"'
+end
+
+function string:count(pattern) -- variant 3
+ local n = 0
+ for _ in self:gmatch(pattern) do
+ n = n + 1
+ end
+ return n
+end
+
+function string:limit(n,sentinel)
+ if #self > n then
+ sentinel = sentinel or " ..."
+ return self:sub(1,(n-#sentinel)) .. sentinel
+ else
+ return self
+ end
+end
+
+function string:strip()
+ return (self:gsub("^%s*(.-)%s*$", "%1"))
+end
+
+--~ function string.strip(str) -- slightly different
+--~ return (string.gsub(string.gsub(str,"^%s*(.-)%s*$","%1"),"%s+"," "))
+--~ end
+
+function string:is_empty()
+ return not self:find("%S")
+end
+
+function string:enhance(pattern,action)
+ local ok, n = true, 0
+ while ok do
+ ok = false
+ self = self:gsub(pattern, function(...)
+ ok, n = true, n + 1
+ return action(...)
+ end)
+ end
+ return self, n
+end
+
+--~ function string:enhance(pattern,action)
+--~ local ok, n = 0, 0
+--~ repeat
+--~ self, ok = self:gsub(pattern, function(...)
+--~ n = n + 1
+--~ return action(...)
+--~ end)
+--~ until ok == 0
+--~ return self, n
+--~ end
+
+--~ function string:to_hex()
+--~ if self then
+--~ return (self:gsub("(.)",function(c)
+--~ return string.format("%02X",c:byte())
+--~ end))
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+--~ function string:from_hex()
+--~ if self then
+--~ return (self:gsub("(..)",function(c)
+--~ return string.char(tonumber(c,16))
+--~ end))
+--~ else
+--~ return ""
+--~ end
+--~ end
+
+string.chr_to_hex = { }
+string.hex_to_chr = { }
+
+for i=0,255 do
+ local c, h = string.char(i), string.format("%02X",i)
+ string.chr_to_hex[c], string.hex_to_chr[h] = h, c
+end
+
+--~ function string:to_hex()
+--~ if self then return (self:gsub("(.)",string.chr_to_hex)) else return "" end
+--~ end
+
+--~ function string:from_hex()
+--~ if self then return (self:gsub("(..)",string.hex_to_chr)) else return "" end
+--~ end
+
+function string:to_hex()
+ return ((self or ""):gsub("(.)",string.chr_to_hex))
+end
+
+function string:from_hex()
+ return ((self or ""):gsub("(..)",string.hex_to_chr))
+end
+
+if not string.characters then
+
+ local function nextchar(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, str:sub(index,index)
+ end
+ function string:characters()
+ return nextchar, self, 0
+ end
+ local function nextbyte(str, index)
+ index = index + 1
+ return (index <= #str) and index or nil, string.byte(str:sub(index,index))
+ end
+ function string:bytes()
+ return nextbyte, self, 0
+ end
+
+end
+
+--~ function string:padd(n,chr)
+--~ return self .. self.rep(chr or " ",n-#self)
+--~ end
+
+function string:padd(n,chr)
+ local m = n-#self
+ if m > 0 then
+ return self .. self.rep(chr or " ",m)
+ else
+ return self
+ end
+end
+
+function is_number(str)
+ return str:find("^[%-%+]?[%d]-%.?[%d+]$") == 1
+end
+
+--~ print(is_number("1"))
+--~ print(is_number("1.1"))
+--~ print(is_number(".1"))
+--~ print(is_number("-0.1"))
+--~ print(is_number("+0.1"))
+--~ print(is_number("-.1"))
+--~ print(is_number("+.1"))
diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua
new file mode 100644
index 000000000..79d87139b
--- /dev/null
+++ b/tex/context/base/l-table.lua
@@ -0,0 +1,492 @@
+-- filename : l-table.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-table'] = 1.001
+
+table.join = table.concat
+
+function table.strip(tab)
+ local lst = { }
+ for k, v in ipairs(tab) do
+ -- s = string.gsub(v, "^%s*(.-)%s*$", "%1")
+ s = v:gsub("^%s*(.-)%s*$", "%1")
+ if s == "" then
+ -- skip this one
+ else
+ lst[#lst+1] = s
+ end
+ end
+ return lst
+end
+
+--~ function table.sortedkeys(tab)
+--~ local srt = { }
+--~ for key,_ in pairs(tab) do
+--~ srt[#srt+1] = key
+--~ end
+--~ table.sort(srt)
+--~ return srt
+--~ end
+
+function table.sortedkeys(tab)
+ local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ for key,_ in pairs(tab) do
+ srt[#srt+1] = key
+ if kind == 3 then
+ -- no further check
+ elseif type(key) == "string" then
+ if kind == 2 then kind = 3 else kind = 1 end
+ elseif type(key) == "number" then
+ if kind == 1 then kind = 3 else kind = 2 end
+ else
+ kind = 3
+ end
+ end
+ if kind == 0 or kind == 3 then
+ table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end)
+ else
+ table.sort(srt)
+ end
+ return srt
+end
+
+function table.append(t, list)
+ for _,v in pairs(list) do
+ table.insert(t,v)
+ end
+end
+
+function table.prepend(t, list)
+ for k,v in pairs(list) do
+ table.insert(t,k,v)
+ end
+end
+
+if not table.fastcopy then
+
+ function table.fastcopy(old) -- fast one
+ if old then
+ local new = { }
+ for k,v in pairs(old) do
+ if type(v) == "table" then
+ new[k] = table.copy(v)
+ else
+ new[k] = v
+ end
+ end
+ return new
+ else
+ return { }
+ end
+ end
+
+end
+
+if not table.copy then
+
+ function table.copy(t, _lookup_table) -- taken from lua wiki
+ _lookup_table = _lookup_table or { }
+ local tcopy = {}
+ if not _lookup_table[t] then
+ _lookup_table[t] = tcopy
+ end
+ for i,v in pairs(t) do
+ if type(i) == "table" then
+ if _lookup_table[i] then
+ i = _lookup_table[i]
+ else
+ i = table.copy(i, _lookup_table)
+ end
+ end
+ if type(v) ~= "table" then
+ tcopy[i] = v
+ else
+ if _lookup_table[v] then
+ tcopy[i] = _lookup_table[v]
+ else
+ tcopy[i] = table.copy(v, _lookup_table)
+ end
+ end
+ end
+ return tcopy
+ end
+
+end
+
+-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
+end
+
+function table.replace(a,b)
+ for k,v in pairs(b) do
+ a[k] = v
+ end
+end
+
+-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
+
+function table.is_empty(t)
+ return not t or not next(t)
+end
+
+function table.one_entry(t)
+ local n = next(t)
+ return n and not next(t,n)
+end
+
+function table.starts_at(t)
+ return ipairs(t,1)(t,0)
+end
+
+do
+
+ -- 34.055.092 32.403.326 arabtype.tma
+ -- 1.620.614 1.513.863 lmroman10-italic.tma
+ -- 1.325.585 1.233.044 lmroman10-regular.tma
+ -- 1.248.157 1.158.903 lmsans10-regular.tma
+ -- 194.646 153.120 lmtypewriter10-regular.tma
+ -- 1.771.678 1.658.461 palatinosanscom-bold.tma
+ -- 1.695.251 1.584.491 palatinosanscom-regular.tma
+ -- 13.736.534 13.409.446 zapfinoextraltpro.tma
+
+ -- 13.679.038 11.774.106 arabtype.tmc
+ -- 886.248 754.944 lmroman10-italic.tmc
+ -- 729.828 466.864 lmroman10-regular.tmc
+ -- 688.482 441.962 lmsans10-regular.tmc
+ -- 128.685 95.853 lmtypewriter10-regular.tmc
+ -- 715.929 582.985 palatinosanscom-bold.tmc
+ -- 669.942 540.126 palatinosanscom-regular.tmc
+ -- 1.560.588 1.317.000 zapfinoextraltpro.tmc
+
+ table.serialize_functions = true
+ table.serialize_compact = true
+ table.serialize_inline = true
+
+ local function key(k)
+ if type(k) == "number" then -- or k:find("^%d+$") then
+ return "["..k.."]"
+ elseif noquotes and k:find("^%a[%a%d%_]*$") then
+ return k
+ else
+ return '["'..k..'"]'
+ end
+ end
+
+ local function simple_table(t)
+ if #t > 0 then
+ local n = 0
+ for _,v in pairs(t) do
+ n = n + 1
+ end
+ if n == #t then
+ local tt = { }
+ for _,v in ipairs(t) do
+ local tv = type(v)
+ if tv == "number" or tv == "boolean" then
+ tt[#tt+1] = tostring(v)
+ elseif tv == "string" then
+ tt[#tt+1] = ("%q"):format(v)
+ else
+ tt = nil
+ break
+ end
+ end
+ return tt
+ end
+ end
+ return nil
+ end
+
+ local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed)
+ handle = handle or print
+ reduce = reduce or false
+ if depth then
+ depth = depth .. " "
+ if indexed then
+ handle(("%s{"):format(depth))
+ else
+ handle(("%s%s={"):format(depth,key(name)))
+ end
+ else
+ depth = ""
+ if type(name) == "string" then
+ if name == "return" then
+ handle("return {")
+ else
+ handle(name .. "={")
+ end
+ elseif type(name) == "number" then
+ handle("[" .. name .. "]={")
+ elseif type(name) == "boolean" then
+ if name then
+ handle("return {")
+ else
+ handle("{")
+ end
+ else
+ handle("t={")
+ end
+ end
+ if root and next(root) then
+ local compact = table.serialize_compact
+ local inline = compact and table.serialize_inline
+ local first, last = nil, 0 -- #root cannot be trusted here
+ if compact then
+ for k,v in ipairs(root) do
+ if not first then first = k end
+ last = last + 1
+ end
+ end
+ for _,k in pairs(table.sortedkeys(root)) do
+ local v = root[k]
+ local t = type(v)
+ if compact and first and type(k) == "number" and k >= first and k <= last then
+ if t == "number" then
+ handle(("%s %s,"):format(depth,v))
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s,"):format(depth,v))
+ else
+ handle(("%s %q,"):format(depth,v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s {},"):format(depth))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s { %s },"):format(depth,table.concat(st,", ")))
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
+ end
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes,true)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s,"):format(depth,tostring(v)))
+ elseif t == "function" then
+ if table.serialize_functions then
+ handle(('%s loadstring(%q),'):format(depth,string.dump(v)))
+ else
+ handle(('%s "function",'):format(depth))
+ end
+ else
+ handle(("%s %q,"):format(depth,tostring(v)))
+ end
+ elseif k == "__p__" then -- parent
+ if false then
+ handle(("%s __p__=nil,"):format(depth))
+ end
+ elseif t == "number" then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ elseif t == "string" then
+ if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),v))
+ end
+ elseif t == "table" then
+ if not next(v) then
+ handle(("%s %s={},"):format(depth,key(k)))
+ elseif inline then
+ local st = simple_table(v)
+ if st then
+ handle(("%s %s={ %s },"):format(depth,key(k),table.concat(st,", ")))
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes)
+ end
+ else
+ serialize(v,k,handle,depth,level+1,reduce,noquotes)
+ end
+ elseif t == "boolean" then
+ handle(("%s %s=%s,"):format(depth,key(k),tostring(v)))
+ elseif t == "function" then
+ if table.serialize_functions then
+ handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v)))
+ else
+ handle(('%s %s="function",'):format(depth,key(k)))
+ end
+ else
+ handle(("%s %s=%q,"):format(depth,key(k),tostring(v)))
+ -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end)))
+ end
+ end
+ if level > 0 then
+ handle(("%s},"):format(depth))
+ else
+ handle(("%s}"):format(depth))
+ end
+ else
+ handle(("%s}"):format(depth))
+ end
+ end
+
+ --~ name:
+ --~
+ --~ true : return { }
+ --~ false : { }
+ --~ nil : t = { }
+ --~ string : string = { }
+ --~ 'return' : return { }
+ --~ number : [number] = { }
+
+ function table.serialize(root,name,reduce,noquotes)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ return table.concat(t,"\n")
+ end
+
+ function table.tohandle(handle,root,name,reduce,noquotes)
+ serialize(root, name, handle, nil, 0, reduce, noquotes)
+ end
+
+ -- sometimes tables are real use (zapfino extra pro is some 85M) in which
+ -- case a stepwise serialization is nice; actually, we could consider:
+ --
+ -- for line in table.serializer(root,name,reduce,noquotes) do
+ -- ...(line)
+ -- end
+ --
+ -- so this is on the todo list
+
+ table.tofile_maxtab = 2*1024
+
+ function table.tofile(filename,root,name,reduce,noquotes)
+ local f = io.open(filename,'w')
+ if f then
+ local concat = table.concat
+ local maxtab = table.tofile_maxtab
+ if maxtab > 1 then
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ if #t > maxtab then
+ f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
+ t = { }
+ end
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ f:write(concat(t,"\n"),"\n")
+ else
+ local function flush(s)
+ f:write(s,"\n")
+ end
+ serialize(root, name, flush, nil, 0, reduce, noquotes)
+ end
+ f:close()
+ end
+ end
+
+end
+
+--~ t = {
+--~ b = "123",
+--~ a = "x",
+--~ c = 1.23,
+--~ d = "1.23",
+--~ e = true,
+--~ f = {
+--~ d = "1.23",
+--~ a = "x",
+--~ b = "123",
+--~ c = 1.23,
+--~ e = true,
+--~ f = {
+--~ e = true,
+--~ f = {
+--~ e = true
+--~ },
+--~ },
+--~ },
+--~ g = function() end
+--~ }
+
+--~ print(table.serialize(t), "\n")
+--~ print(table.serialize(t,"name"), "\n")
+--~ print(table.serialize(t,false), "\n")
+--~ print(table.serialize(t,true), "\n")
+--~ print(table.serialize(t,"name",true), "\n")
+--~ print(table.serialize(t,"name",true,true), "\n")
+
+do
+
+ local function flatten(t,f,complete)
+ for _,v in ipairs(t) do
+ if type(v) == "table" then
+ if complete or type(v[1]) == "table" then
+ flatten(v,f,complete)
+ else
+ f[#f+1] = v
+ end
+ else
+ f[#f+1] = v
+ end
+ end
+ end
+
+ function table.flatten(t)
+ local f = { }
+ flatten(t,f,true)
+ return f
+ end
+
+ function table.unnest(t) -- bad name
+ local f = { }
+ flatten(t,f,false)
+ return f
+ end
+
+ table.flatten_one_level = table.unnest
+
+end
+
+function table.insert_before_value(t,value,str)
+ for i=1,#t do
+ if t[i] == value then
+ table.insert(t,i,str)
+ return
+ end
+ end
+ table.insert(t,1,str)
+end
+
+function table.insert_after_value(t,value,str)
+ for i=1,#t do
+ if t[i] == value then
+ table.insert(t,i+1,str)
+ return
+ end
+ end
+ t[#t+1] = str
+end
+
+function table.are_equal(a,b,n,m)
+ if #a == #b then
+ n = n or 1
+ m = m or #a
+ for i=n,m do
+ local ai, bi = a[i], b[i]
+ if (ai==bi) or (type(ai)=="table" and type(bi)=="table" and table.are_equal(ai,bi)) then
+ -- continue
+ else
+ return false
+ end
+ end
+ return true
+ else
+ return false
+ end
+end
+
+--~ function table.are_equal(a,b)
+--~ return table.serialize(a) == table.serialize(b)
+--~ end
+
diff --git a/tex/context/base/l-tex.lua b/tex/context/base/l-tex.lua
new file mode 100644
index 000000000..3d87fe6e3
--- /dev/null
+++ b/tex/context/base/l-tex.lua
@@ -0,0 +1,110 @@
+-- filename : l-tex.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-tex'] = 1.001
+
+if not number then number = { } end
+
+number.dimenfactors = {
+ ["pt"] = 1/65536,
+ ["in"] = ( 100/ 7227)/65536,
+ ["cm"] = ( 254/ 7227)/65536,
+ ["mm"] = ( 254/72270)/65536,
+ ["sp"] = 1,
+ ["bp"] = ( 7200/ 7227)/65536,
+ ["pc"] = ( 1/ 12)/65536,
+ ["dd"] = ( 1157/ 1238)/65536,
+ ["cc"] = ( 1157/14856)/65536,
+ ["nd"] = (20320/21681)/65536,
+ ["nc"] = ( 5080/65043)/65536
+}
+
+function number.todimen(n,unit,fmt)
+ if type(n) == 'string' then
+ return n
+ else
+ return string.format(fmt or "%.5g%s",n*number.dimenfactors[unit or 'pt'],unit or 'pt')
+ end
+end
+
+function number.topoints (n) return number.todimen(n,"pt") end
+function number.toinches (n) return number.todimen(n,"in") end
+function number.tocentimeters (n) return number.todimen(n,"cm") end
+function number.tomillimeters (n) return number.todimen(n,"mm") end
+function number.toscaledpoints(n) return number.todimen(n,"sp") end
+function number.toscaledpoints(n) return n .. "sp" end
+function number.tobasepoints (n) return number.todimen(n,"bp") end
+function number.topicas (n) return number.todimen(n "pc") end
+function number.todidots (n) return number.todimen(n,"dd") end
+function number.tociceros (n) return number.todimen(n,"cc") end
+function number.tonewdidots (n) return number.todimen(n,"nd") end
+function number.tonewciceros (n) return number.todimen(n,"nc") end
+
+--~ for k,v in pairs{nil, "%.5f%s", "%.8g%s", "%.8f%s"} do
+--~ print(number.todimen(65536))
+--~ print(number.todimen( 256))
+--~ print(number.todimen(65536,'pt',v))
+--~ print(number.todimen( 256,'pt',v))
+--~ end
+
+-- todo: use different scratchdimen
+-- todo: use parser if no tex.dimen
+
+function string.todimen(str)
+ if type(str) == "number" then
+ return str
+ elseif str:find("^[%d%-%+%.]+$") then
+ return tonumber(str)
+--~ elseif tex then
+--~ tex.dimen[0] = str
+--~ return tex.dimen[0] or 0
+ else
+ local n, u = str:match("([%d%-%+%.]+)(%a%a)")
+ if n and u then
+ return n/number.dimenfactors[u]
+ else
+ return 0
+ end
+ end
+end
+
+--~ print(string.todimen("10000"))
+--~ print(string.todimen("10pt"))
+
+--~ See mk.pdf for an explanation of the following code:
+--~
+--~ function test(n)
+--~ lua.delay(function(...)
+--~ tex.sprint(string.format("pi: %s %s %s\\par",...))
+--~ end)
+--~ lua.delay(function(...)
+--~ tex.sprint(string.format("more pi: %s %s %s\\par",...))
+--~ end)
+--~ tex.sprint(string.format("\\setbox0=\\hbox{%s}",math.pi*n))
+--~ lua.flush(tex.wd[0],tex.ht[0],tex.dp[0])
+--~ end
+
+if lua then do
+
+ delayed = { } -- could also be done with closures
+
+ function lua.delay(f)
+ delayed[#delayed+1] = f
+ end
+
+ function lua.flush_delayed(...)
+ local t = delayed
+ delayed = { }
+ for _, fun in ipairs(t) do
+ fun(...)
+ end
+ end
+
+ function lua.flush(...)
+ tex.sprint("\\directlua 0 {lua.flush_delayed(" .. table.concat({...},',') .. ")}")
+ end
+
+end end
diff --git a/tex/context/base/l-unicode.lua b/tex/context/base/l-unicode.lua
new file mode 100644
index 000000000..d0c05bb86
--- /dev/null
+++ b/tex/context/base/l-unicode.lua
@@ -0,0 +1,148 @@
+-- filename : l-unicode.lua
+-- comment : split off from luat-inp
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-unicode'] = 1.001
+if not unicode then unicode = { } end
+
+if not garbagecollector then
+ garbagecollector = {
+ push = function() collectgarbage("stop") end,
+ pop = function() collectgarbage("restart") end,
+ }
+end
+
+-- 0 EF BB BF UTF-8
+-- 1 FF FE UTF-16-little-endian
+-- 2 FE FF UTF-16-big-endian
+-- 3 FF FE 00 00 UTF-32-little-endian
+-- 4 00 00 FE FF UTF-32-big-endian
+
+unicode.utfname = {
+ [0] = 'utf-8',
+ [1] = 'utf-16-le',
+ [2] = 'utf-16-be',
+ [3] = 'utf-32-le',
+ [4] = 'utf-32-be'
+}
+
+function unicode.utftype(f) -- \000 fails !
+ local str = f:read(4)
+ if not str then
+ f:seek('set')
+ return 0
+ elseif str:find("^%z%z\254\255") then
+ return 4
+ elseif str:find("^\255\254%z%z") then
+ return 3
+ elseif str:find("^\254\255") then
+ f:seek('set',2)
+ return 2
+ elseif str:find("^\255\254") then
+ f:seek('set',2)
+ return 1
+ elseif str:find("^\239\187\191") then
+ f:seek('set',3)
+ return 0
+ else
+ f:seek('set')
+ return 0
+ end
+end
+
+function unicode.utf16_to_utf8(str, endian)
+ garbagecollector.push()
+ local result = { }
+ local tc, uc = table.concat, unicode.utf8.char
+ local tmp, n, m, p = { }, 0, 0, 0
+ -- lf | cr | crlf / (cr:13, lf:10)
+ local function doit()
+ if n == 10 then
+ if p ~= 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = 0
+ end
+ elseif n == 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = n
+ else
+ tmp[#tmp+1] = uc(n)
+ p = 0
+ end
+ end
+ for l,r in str:bytepairs() do
+ if endian then
+ n = l*256 + r
+ else
+ n = r*256 + l
+ end
+ if m > 0 then
+ n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000
+ m = 0
+ doit()
+ elseif n >= 0xD800 and n <= 0xDBFF then
+ m = n
+ else
+ doit()
+ end
+ end
+ if #tmp > 0 then
+ result[#result+1] = tc(tmp,"")
+ end
+ garbagecollector.pop()
+ return result
+end
+
+function unicode.utf32_to_utf8(str, endian)
+ garbagecollector.push()
+ local result = { }
+ local tc, uc = table.concat, unicode.utf8.char
+ local tmp, n, m, p = { }, 0, -1, 0
+ -- lf | cr | crlf / (cr:13, lf:10)
+ local function doit()
+ if n == 10 then
+ if p ~= 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = 0
+ end
+ elseif n == 13 then
+ result[#result+1] = tc(tmp,"")
+ tmp = { }
+ p = n
+ else
+ tmp[#tmp+1] = uc(n)
+ p = 0
+ end
+ end
+ for a,b in str:bytepairs() do
+ if a and b then
+ if m < 0 then
+ if endian then
+ m = a*256*256*256 + b*256*256
+ else
+ m = b*256 + a
+ end
+ else
+ if endian then
+ n = m + a*256 + b
+ else
+ n = m + b*256*256*256 + a*256*256
+ end
+ m = -1
+ doit()
+ end
+ else
+ break
+ end
+ end
+ if #tmp > 0 then
+ result[#result+1] = tc(tmp,"")
+ end
+ garbagecollector.pop()
+ return result
+end
diff --git a/tex/context/base/l-utils.lua b/tex/context/base/l-utils.lua
new file mode 100644
index 000000000..96273106a
--- /dev/null
+++ b/tex/context/base/l-utils.lua
@@ -0,0 +1,121 @@
+-- filename : l-utils.lua
+-- comment : split off from luat-lib
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['l-utils'] = 1.001
+
+if not utils then utils = { } end
+if not utils.merger then utils.merger = { } end
+if not utils.lua then utils.lua = { } end
+
+utils.merger.m_begin = "begin library merge"
+utils.merger.m_end = "end library merge"
+utils.merger.pattern =
+ "%c+" ..
+ "%-%-%s+" .. utils.merger.m_begin ..
+ "%c+(.-)%c+" ..
+ "%-%-%s+" .. utils.merger.m_end ..
+ "%c+"
+
+function utils.merger._self_fake_()
+ return
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. utils.merger.m_begin .. "\n\n" ..
+ "-- " .. utils.merger.m_end .. "\n\n"
+end
+
+function utils.report(...)
+ print(...)
+end
+
+function utils.merger._self_load_(name)
+ local f, data = io.open(name), ""
+ if f then
+ data = f:read("*all")
+ f:close()
+ end
+ return data or ""
+end
+
+function utils.merger._self_save_(name, data)
+ if data ~= "" then
+ local f = io.open(name,'w')
+ if f then
+ f:write(data)
+ f:close()
+ end
+ end
+end
+
+function utils.merger._self_swap_(data,code)
+ if data ~= "" then
+ return (data:gsub(utils.merger.pattern, function(s)
+ return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
+ end, 1))
+ else
+ return ""
+ end
+end
+
+function utils.merger._self_libs_(libs,list)
+ local result, f = "", nil
+ if type(libs) == 'string' then libs = { libs } end
+ if type(list) == 'string' then list = { list } end
+ for _, lib in ipairs(libs) do
+ for _, pth in ipairs(list) do
+ local name = string.gsub(pth .. "/" .. lib,"\\","/")
+ f = io.open(name)
+ if f then
+ -- utils.report("merging library",name)
+ result = result .. "\n" .. f:read("*all") .. "\n"
+ f:close()
+ list = { pth } -- speed up the search
+ break
+ else
+ -- utils.report("no library",name)
+ end
+ end
+ end
+ return result or ""
+end
+
+function utils.merger.selfcreate(libs,list,target)
+ if target then
+ utils.merger._self_save_(
+ target,
+ utils.merger._self_swap_(
+ utils.merger._self_fake_(),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+ end
+end
+
+function utils.merger.selfmerge(name,libs,list,target)
+ utils.merger._self_save_(
+ target or name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ utils.merger._self_libs_(libs,list)
+ )
+ )
+end
+
+function utils.merger.selfclean(name)
+ utils.merger._self_save_(
+ name,
+ utils.merger._self_swap_(
+ utils.merger._self_load_(name),
+ ""
+ )
+ )
+end
+
+function utils.lua.compile(luafile, lucfile)
+ -- utils.report("compiling",luafile,"into",lucfile)
+ os.remove(lucfile)
+ return (os.execute("luac -s -o " .. string.quote(lucfile) .. " " .. string.quote(luafile)) == 0)
+end
+
diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua
new file mode 100644
index 000000000..5259a085e
--- /dev/null
+++ b/tex/context/base/lang-ini.lua
@@ -0,0 +1,327 @@
+if not modules then modules = { } end modules ['lang-ini'] = {
+ version = 1.001,
+ comment = "companion to lang-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+languages = languages or { }
+languages.patterns = languages.patterns or { }
+languages.version = 1.009
+languages.template = "words-%s.txt"
+languages.number = nil
+languages.current = nil
+languages.attribute = nil
+
+-- We used to have one list: data[word] = pattern but that overflowed lua's function
+-- mechanism. Then we split the lists and again we had oveflows. So eventually we
+-- ended up with a dedicated reader.
+--
+-- function languages.set(attribute,number,name)
+-- if not languages.patterns[number] then
+-- languages.patterns[number] = containers.define("languages","patterns", languages.version, true)
+-- end
+-- input.start_timing(languages)
+-- local data = containers.read(languages.patterns[number],name)
+-- if not data then
+-- data = { }
+-- local fullname = string.format(languages.template,name)
+-- local foundname = input.find_file(texmf.instance,fullname,'other text file')
+-- if foundname and foundname ~= "" then
+-- local ok, blob, size = input.loadbinfile(texmf.instance,foundname)
+-- for word in utf.gfind(blob,"(.-)[%s]+") do
+-- local key = word:gsub("-","")
+-- if key == word then
+-- -- skip
+-- else
+-- data[word:gsub("-","")] = word
+-- end
+-- end
+-- end
+-- data = containers.write(languages.patterns[number],name,data)
+-- end
+-- input.stop_timing(languages)
+-- languages.attribute = attribute
+-- languages.number = number
+-- languages.current = data
+-- end
+
+function languages.set(attribute,number,name)
+ if not languages.patterns[number] then
+ input.start_timing(languages)
+ local fullname = string.format(languages.template,name)
+ local foundname = input.find_file(texmf.instance,fullname,'other text file')
+ if foundname and foundname ~= "" then
+ -- texio.write_nl(string.format("loading patterns for language %s as %s from %s",name,number,foundname))
+ languages.patterns[number] = tex.load_dict(foundname) or { }
+ else
+ languages.patterns[number] = { }
+ end
+ input.stop_timing(languages)
+ end
+ languages.attribute = attribute
+ languages.number = number
+ languages.current = languages.patterns[number]
+end
+
+function languages.add(word,pattern)
+ if languages.current and word and pattern then
+ languages.current[word] = pattern
+ end
+end
+
+function languages.remove(word)
+ if languages.current and word then
+ languages.current[word] = nil
+ end
+end
+
+function languages.hyphenate(str)
+ if languages.current then
+ local result = languages.current[str]
+ if result then
+ return result
+ else
+ -- todo: be clever
+ end
+ end
+ return str
+end
+
+function languages.found(number, str)
+ local patterns = languages.patterns[number]
+ return patterns and patterns[str]
+end
+
+do
+
+ local discnode = node.new('disc')
+
+ discnode.pre = node.new('glyph')
+ discnode.pre.subtype = 0
+ discnode.pre.char = 45 -- will be configurable
+ discnode.pre.font = 0
+
+ local glyph, disc, kern = node.id('glyph'), node.id('disc'), node.id('kern')
+
+ local bynode = node.traverse
+ local bychar = string.utfcharacters
+
+ function reconstruct(prev,str,fnt)
+ local done = false
+ if #str < 4 then
+ -- too short
+ else
+ local wrd = languages.hyphenate(str)
+ if wrd == str then
+ -- not found
+ else
+ local pre, post, after, comp = nil, nil, false, nil
+ for chr in bychar(wrd) do
+ if prev then
+ if not comp and prev.next and prev.next.subtype > 0 then
+ comp = prev.next.components
+ pre = node.copy(comp)
+ comp = comp.next
+ post, after = nil, false
+ elseif chr == '-' then
+ if not comp then
+ done = true
+ local n = node.copy(discnode)
+ n.pre.font = fnt.font
+ n.pre.attr = fnt.attr
+ if pre then
+ pre.next = n.pre
+ n.pre = pre
+ pre, pos, after = nil, nil, false
+ end
+ n.next = prev.next
+ prev.next = n
+ prev = n
+ else
+ after = true
+ end
+ elseif comp then
+ local g = node.copy(comp)
+ comp = comp.next
+ if after then
+ if post then post.next = g else post = g end
+ else
+ if pre then pre.next = g else pre = g end
+ end
+ if not comp then
+ done = true
+ local n = node.copy(discnode)
+ n.pre.font = fnt.font
+ n.pre.attr = fnt.attr
+ pre.next = n.pre
+ n.pre = pre
+ n.post = post
+ n.replace = 1
+ n.next = prev.next
+ prev.next = n
+ prev = n
+ pre, pos, after = nil, nil, false
+ prev = prev.next -- hm, now we get error 1
+ end
+ else
+ prev = prev.next
+ end
+ else
+ -- print("ERROR 1")
+ end
+ end
+ end
+ end
+ return done
+ end
+
+ function nodes.hyphenate_words(head) -- we forget about the very first, no head stuff here
+ local cd = characters.data
+ local uc = utf.char
+ local n, p = head, nil
+ local done, prev, str, fnt, lan = false, false, "", nil, nil
+ local currentlanguage = languages.current
+ local att = languages.attribute
+ local function action() -- maybe inline
+ if reconstruct(prev,str,fnt) then
+ done = true
+ end
+ str, prev = "", false
+ end
+ while n do
+ local id = n.id
+ if id == glyph then
+ local l = node.has_attribute(n,att)
+ if l then
+ if l ~= lan then
+ if prev then action() end
+ lan = l
+ languages.current = languages.patterns[lan]
+ end
+ elseif prev then
+ action()
+ end
+ if not languages.current then
+ -- skip
+ elseif n.subtype > 0 then
+ if not prev then
+ prev, fnt = p, n
+ end
+ for g in bynode(n.components) do
+ str = str .. uc(g.char)
+ end
+ else
+ local code = n.char
+ if cd[code].lccode then
+ if not prev then
+ prev, fnt = p, n
+ end
+ str = str .. uc(code)
+ elseif prev then
+ action()
+ end
+ end
+ elseif id == kern and n.subtype == 0 and p then
+ p.next = n.next
+ node.free(p,n)
+ n = p
+ elseif prev then
+ action()
+ end
+ p = n
+ n = n.next
+ end
+ if prev then
+ action()
+ end
+ languages.current = currentlanguage
+ return head
+ end
+
+ function nodes.mark_words(head,attribute,found)
+ local cd = characters.data
+ local uc = utf.char
+ local current, start, str, att, n = head, nil, "", nil, 0
+ local function action()
+ local f = found(att,str)
+ if f then
+ for i=1,n do
+ f(start)
+ start = start.next
+ end
+ end
+ str, start, n = "", nil, 0
+ end
+ while current do
+ local id = current.id
+ if id == glyph then
+ local a = node.has_attribute(current,attribute)
+ if a then
+ if a ~= att then
+ if start then
+ action()
+ end
+ att = a
+ end
+ elseif start then
+ action()
+ att = a
+ end
+ if current.subtype > 0 then
+ start = start or current
+ n = n + 1
+ for g in bynode(current.components) do
+ str = str .. uc(g.char)
+ end
+ else
+ local code = current.char
+ if cd[code].lccode then
+ start = start or current
+ n = n + 1
+ str = str .. uc(code)
+ else
+ if start then
+ action()
+ end
+ end
+ end
+ elseif id == disc then
+ -- ok
+ elseif id == kern and current.subtype == 0 and start then
+ -- ok
+ elseif start then
+ action()
+ end
+ current = current.next
+ end
+ if start then
+ action()
+ end
+ return head
+ end
+
+ function languages.check(head, attribute, yes, nop)
+ local set = node.set_attribute
+ local unset = node.unset_attribute
+ local wrong, right = false, false
+ if nop then wrong = function(n) set(n,attribute,nop) end end
+ if yes then right = function(n) set(n,attribute,yes) end end
+ for n in node.traverse(head) do
+ unset(n,attribute)
+ end
+ nodes.mark_words(head, languages.attribute, function(att,str)
+ if #str < 4 then
+ return false
+ elseif languages.found(att,str) then
+ return right
+ else
+ return wrong
+ end
+ end)
+ nodes.hyphenate_words(head)
+ return head
+ end
+
+end
diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv
new file mode 100644
index 000000000..e62166966
--- /dev/null
+++ b/tex/context/base/lang-ini.mkiv
@@ -0,0 +1,23 @@
+%D \module
+%D [ file=lang-ini,
+%D version=1996.01.25,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\registerctxluafile{lang-ini}{1.001}
+
+\def\synchronizepatternswithfont{}
+\def\doloadpatterns #1#2{\dodoloadpatterns{#1}{#2}\s!default\s!default}
+\def\setnormallanguage #1{\dosetnormallanguage{:\s!default:\s!default:}#1\empty}
+\def\setuphyppatencoding {\pathypsettings}
+
+\protect \endinput
diff --git a/tex/context/base/lang-ini.tex b/tex/context/base/lang-ini.tex
index b5cfda0db..6f0352772 100644
--- a/tex/context/base/lang-ini.tex
+++ b/tex/context/base/lang-ini.tex
@@ -353,12 +353,12 @@
\def\setuphyppatencoding {\pathypsettings}
\endXETEX
-\beginMETATEX
+\beginLUATEX
\def\synchronizepatternswithfont{}
\def\doloadpatterns #1#2{\dodoloadpatterns{#1}{#2}\s!default\s!default}
\def\setnormallanguage #1{\dosetnormallanguage{:\s!default:\s!default:}#1\empty}
\def\setuphyppatencoding {\pathypsettings}
-\endMETATEX
+\endLUATEX
\def\dodoloadpatterns#1#2#3#4% beware, loaded language also incr
{\normallanguage\loadedlanguage % when not really needed
diff --git a/tex/context/base/lang-sla.mkiv b/tex/context/base/lang-sla.mkiv
new file mode 100644
index 000000000..dfa56bab5
--- /dev/null
+++ b/tex/context/base/lang-sla.mkiv
@@ -0,0 +1,17 @@
+%D \module
+%D [ file=lang-sla,
+%D version=2006.09.16,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Slavic Languages,
+%D author=Hans Hagen / Tobias Burnus,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\def\sloveniancharacters#1{\ctxlua{convert.alphabetic(\number#1,"sl")}}
+\def\slovenianCharacters#1{\ctxlua{convert.Alphabetic(\number#1,"sl")}}
+
+\endinput
diff --git a/tex/context/base/luat-cbk.lua b/tex/context/base/luat-cbk.lua
new file mode 100644
index 000000000..a6145ec3b
--- /dev/null
+++ b/tex/context/base/luat-cbk.lua
@@ -0,0 +1,150 @@
+if not modules then modules = { } end modules ['luat-cbk'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Callbacks are the real asset of <l n='luatex'/>. They permit you to hook
+your own code into the <l n='tex'/> engine. Here we implement a few handy
+auxiliary functions.</p>
+--ldx]]--
+
+callbacks = { }
+callbacks.stack = { }
+
+--[[ldx--
+<p>When you (temporarily) want to install a callback function, and after a
+while wants to revert to the original one, you can use the following two
+functions.</p>
+--ldx]]--
+
+function callbacks.push(name, func)
+ if not callbacks.stack[name] then
+ callbacks.stack[name] = { }
+ end
+ table.insert(callbacks.stack[name],callback.find(name))
+ callback.register(name, func)
+end
+
+function callbacks.pop(name)
+-- this fails: callback.register(name, table.remove(callbacks.stack[name]))
+ local func = table.remove(callbacks.stack[name])
+ callback.register(name, func)
+end
+
+--[[ldx--
+<p>The simple case is to remove the callback:</p>
+
+<code>
+callbacks.push('linebreak_filter')
+... some actions ...
+callbacks.pop('linebreak_filter')
+</code>
+
+<p>Often, in such case, another callback or a macro call will pop
+the original.</p>
+
+<p>In practice one will install a new handler, like in:</p>
+
+<code>
+callbacks.push('linebreak_filter', function(...)
+ return something_done(...)
+end)
+</code>
+
+<p>Even more interesting is:</p>
+
+<code>
+callbacks.push('linebreak_filter', function(...)
+ callbacks.pop('linebreak_filter')
+ return something_done(...)
+end)
+</code>
+
+<p>This does a one-shot.</p>
+--ldx]]--
+
+
+--[[ldx--
+<p>Callbacks may result in <l n='lua'/> doing some hard work
+which takes time and above all resourses. Sometimes it makes
+sense to disable or tune the garbage collector in order to
+keep the use of resources acceptable.</p>
+
+<p>At some point in the development we did some tests with counting
+nodes (in thsi case 121049).</p>
+
+<table>
+<tr><td>setstepmul</td><td>seconds</td><td>megabytes</td</tr>
+<tr><td>200</td><td>24.0</td><td>80.5</td</tr>
+<tr><td>175</td><td>21.0</td><td>78.2</td</tr>
+<tr><td>150</td><td>22.0</td><td>74.6</td</tr>
+<tr><td>160</td><td>22.0</td><td>74.6</td</tr>
+<tr><td>165</td><td>21.0</td><td>77.6</td</tr>
+<tr><td>125</td><td>21.5</td><td>89.2</td</tr>
+<tr><td>100</td><td>21.5</td><td>88.4</td</tr>
+</table>
+
+<p>The following code is kind of experimental. In the documents
+that describe the development of <l n='luatex'/> we report
+on speed tests. One observation is thta it sometimes helps to
+restart the collector.</p>
+--ldx]]--
+
+garbagecollector = { }
+
+do
+ local level = 0
+
+ collectgarbage("setstepmul", 165)
+
+ garbagecollector.trace = false
+ garbagecollector.tune = false -- for the moment
+
+ function report(format)
+ if garbagecollector.trace then
+ -- texio.write_nl(string.format(format,level,status.luastate_bytes))
+ texio.write_nl(string.format(format,level,collectgarbage("count")))
+ end
+ end
+
+ function garbagecollector.update()
+ report("%s: memory before update: %s")
+ collectgarbage("restart")
+ end
+
+ function garbagecollector.push()
+ if garbagecollector.tune then
+ level = level + 1
+ if level == 1 then
+ collectgarbage("stop")
+ end
+ report("%s: memory after push: %s")
+ else
+ garbagecollector.update()
+ end
+ end
+
+ function garbagecollector.pop()
+ if garbagecollector.tune then
+ report("%s: memory before pop: %s")
+ if level == 1 then
+ collectgarbage("restart")
+ end
+ level = level - 1
+ end
+ end
+
+ function garbagecollector.cycle()
+ if garbagecollector.tune then
+ report("%s: memory before collect: %s")
+ collectgarbage("collect")
+ report("%s: memory after collect: %s")
+ end
+ end
+
+end
+
diff --git a/tex/context/base/luat-crl.lua b/tex/context/base/luat-crl.lua
new file mode 100644
index 000000000..9d15b4896
--- /dev/null
+++ b/tex/context/base/luat-crl.lua
@@ -0,0 +1,53 @@
+-- filename : luat-crl.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-crl'] = 1.001
+if not curl then curl = { } end
+
+curl.cachepath = cache.setpath(texmf.instance,"curl")
+
+curl.cached = { }
+
+function curl.fetch(protocol, name)
+ local cachename = curl.cachepath .. "/" .. file.robustname(name)
+ cachename = cachename:gsub("[\\/]", io.fileseparator)
+ if not curl.cached[name] then
+ if not io.exists(cachename) then
+ curl.cached[name] = cachename
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. protocol .. "://" .. name
+ os.execute(command)
+ end
+ if io.exists(cachename) then
+ curl.cached[name] = cachename
+ else
+ curl.cached[name] = ""
+ end
+ end
+ return curl.cached[name]
+end
+
+function input.finders.curl(instance,protocol,filename)
+ local foundname = curl.fetch(protocol, filename)
+ return input.finders.generic(instance,protocol,foundname,filetype)
+end
+function input.openers.curl(instance,protocol,filename)
+ return input.openers.generic(instance,protocol,filename)
+end
+function input.loaders.curl(instance,protocol,filename)
+ return input.loaders.generic(instance,protocol,filename)
+end
+
+-- todo: metamethod
+
+function curl.install(protocol)
+ input.finders[protocol] = function (instance,filename,filetype) return input.finders.curl(instance,protocol,filename) end
+ input.openers[protocol] = function (instance,filename) return input.openers.curl(instance,protocol,filename) end
+ input.loaders[protocol] = function (instance,filename) return input.loaders.curl(instance,protocol,filename) end
+end
+
+curl.install('http')
+curl.install('https')
+curl.install('ftp')
diff --git a/tex/context/base/luat-deb.lua b/tex/context/base/luat-deb.lua
new file mode 100644
index 000000000..fc671d6be
--- /dev/null
+++ b/tex/context/base/luat-deb.lua
@@ -0,0 +1,154 @@
+-- filename : luat-deb.lua
+-- comment : companion to luat-deb.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-deb'] = 1.001
+if not lmx then lmx = { } end
+if not lmx.variables then lmx.variables = { } end
+
+lmx.variables['color-background-green'] = '#4F6F6F'
+lmx.variables['color-background-blue'] = '#6F6F8F'
+lmx.variables['color-background-yellow'] = '#8F8F6F'
+lmx.variables['color-background-purple'] = '#8F6F8F'
+
+lmx.variables['color-background-body'] = '#808080'
+lmx.variables['color-background-main'] = '#3F3F3F'
+lmx.variables['color-background-one'] = lmx.variables['color-background-green']
+lmx.variables['color-background-two'] = lmx.variables['color-background-blue']
+
+lmx.variables['title-default'] = 'ConTeXt Status Information'
+lmx.variables['title'] = lmx.variables['title-default']
+
+if not trace then trace = { } end
+if not trace.list then trace.list = { } end
+if not trace.strings then trace.strings = { } end
+
+trace.strings.undefined = "undefined"
+
+function trace.split(csname)
+ return csname:match("^(.+):(.+)$")
+end
+
+function trace.type(csname)
+ tag, name = trace.split(csname)
+ if tag then return tag else return nil end
+end
+
+function trace.name(csname)
+ tag, name = trace.split(csname)
+ if tag then return name else return csname end
+end
+
+function trace.cs(csname)
+ tag, name = trace.split(csname)
+ if trace.types[tag] then
+ return trace.types[tag](name)
+ else
+ return trace.primitive(csname)
+ end
+end
+
+function trace.dimen(name)
+ return (tex.dimen[name] and number.topoints(tex.dimen[name])) or trace.strings.undefined
+end
+
+function trace.count(name)
+ return tex.count[name] or trace.strings.undefined
+end
+
+function trace.toks(name)
+ return (tex.toks[name] and string.limit(tex.toks[name],40)) or trace.strings.undefined
+end
+
+function trace.primitive(name)
+ return tex[name] or trace.strings.undefined
+end
+
+trace.types = {
+ ['d'] = trace.dimen,
+ ['c'] = trace.count,
+ ['t'] = trace.toks,
+ ['p'] = trace.primitive
+}
+
+function trace.knownlist(name)
+ return trace.list[name] and #trace.list[name] > 0
+end
+
+function trace.showdebuginfo()
+ lmx.set('title', 'ConTeXt Debug Information')
+ lmx.set('color-background-one', lmx.get('color-background-green'))
+ lmx.set('color-background-two', lmx.get('color-background-blue'))
+ lmx.show('context-debug.lmx')
+ lmx.restore()
+end
+
+function trace.showerror()
+ lmx.set('title', 'ConTeXt Error Information')
+ lmx.set('errormessage', status.lasterrorstring)
+ lmx.set('linenumber', status.linenumber)
+ lmx.set('color-background-one', lmx.get('color-background-yellow'))
+ lmx.set('color-background-two', lmx.get('color-background-purple'))
+ local filename = status.filename
+ local linenumber = tonumber(status.linenumber or "0")
+ if not filename then
+ lmx.set('filename', 'unknown')
+ lmx.set('errorcontext', 'error in filename')
+ elseif type(filename) == "number" then
+ lmx.set('filename', "<read " .. filename .. ">")
+ lmx.set('errorcontext', 'unknown error')
+ elseif io.exists(filename) then
+ -- todo: use an input opener so that we also catch utf16 an reencoding
+ lmx.set('filename', filename)
+ lines = io.lines(filename)
+ if lines then
+ local context = { }
+ n, m = 1, linenumber
+ b, e = m-10, m+10
+ s = string.len(tostring(e))
+ for line in lines do
+ if n > e then
+ break
+ elseif n > b then
+ if n == m then
+ context[#context+1] = string.format("%" .. s .. "d",n) .. " >> " .. line
+ else
+ context[#context+1] = string.format("%" .. s .. "d",n) .. " " .. line
+ end
+ end
+ n = n + 1
+ end
+ lmx.set('errorcontext', table.concat(context,"\n"))
+ else
+ lmx.set('errorcontext', "")
+ end
+ else
+ lmx.set('filename', filename)
+ lmx.set('errorcontext', 'file not found')
+ end
+ lmx.show('context-error.lmx')
+ lmx.restore()
+end
+
+function trace.overloaderror()
+--~ callback.register('show_error_hook', function(identifier, filename, linenumber)
+--~ trace.showerror(identifier, filename, linenumber)
+--~ end )
+ callback.register('show_error_hook', trace.showerror)
+end
+
+trace.list['scratch'] = {
+ 0, 2, 4, 6, 8
+}
+
+trace.list['internals'] = {
+ 'p:hsize', 'p:parindent', 'p:leftskip','p:rightskip',
+ 'p:vsize', 'p:parskip', 'p:baselineskip', 'p:lineskip', 'p:topskip'
+}
+
+trace.list['context'] = {
+ 'd:lineheight',
+ 'c:realpageno', 'c:pageno', 'c:subpageno'
+}
diff --git a/tex/context/base/luat-deb.tex b/tex/context/base/luat-deb.tex
new file mode 100644
index 000000000..d76cb212e
--- /dev/null
+++ b/tex/context/base/luat-deb.tex
@@ -0,0 +1,49 @@
+%D \module
+%D [ file=luat-deb,
+%D version=2005.11.06,
+%D title=\CONTEXT\ Communication Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Communication Support (initialization)}
+
+\registerctxluafile{luat-deb}{1.001}
+
+\startruntimeluacode
+ \ctxlua {
+ lmx.htmfile = function(name) return environment.jobname .. "-status.html" end
+ lmx.lmxfile = function(name) return environment.texfile(name) end
+ }
+\stopruntimeluacode
+
+\def\showdebuginfo{\ctxlua{trace.showdebuginfo()}}
+\def\overloaderror{\ctxlua{trace.overloaderror()}}
+
+\def\breakpoint{\showdebuginfo\wait}
+
+\registerctxluafile{luat-tra}{1.001}
+
+\appendtoks
+ \ctxlua {
+ if debugger.tracing() then
+ debugger.enable() ;
+ end
+ }%
+\to \everyjob
+
+\appendtoks
+ \ctxlua {
+ if debugger.tracing() then
+ debugger.disable() ;
+ debugger.savestats("\jobname-luacalls.log") ;
+ end
+ }%
+\to \everybye
+
+\endinput
diff --git a/tex/context/base/luat-env.lua b/tex/context/base/luat-env.lua
new file mode 100644
index 000000000..a3bf6cd11
--- /dev/null
+++ b/tex/context/base/luat-env.lua
@@ -0,0 +1,172 @@
+-- filename : luat-env.lua
+-- comment : companion to luat-env.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- here we don't assume any extra libraries
+
+if not versions then versions = { } end versions['luat-env'] = 1.001
+
+-- environment
+
+if not environment then environment = { } end
+
+environment.useluc = false -- for testing
+--~ environment.silent = true -- for testing
+
+if environment.silent == nil then environment.silent = false end
+if environment.useluc == nil then environment.useluc = true end
+
+-- kpse is overloaded by this time
+
+if environment.formatname == nil then environment.formatname = tex.formatname end
+if environment.formatpath == nil then environment.formatpath = kpse.find_file(tex.formatname,"fmt") or "." end
+if environment.jobname == nil then environment.jobname = tex.jobname end
+if environment.progname == nil then environment.progname = os.getenv("progname") or "luatex" end
+if environment.engine == nil then environment.engine = os.getenv("engine") or "context" end
+if environment.enginepath == nil then environment.enginepath = os.getenv("SELFAUTOLOC") or "." end
+if environment.initex == nil then environment.initex = tex.formatname == "" end
+
+environment.formatpath = string.gsub(environment.formatpath:gsub("\\","/"),"/([^/]-)$","")
+environment.enginepath = string.gsub(environment.enginepath:gsub("\\","/"),"/([^/]-)$","")
+
+if environment.formatname == "" then environment.formatpath = "cont-en" end
+if environment.formatpath == "" then environment.formatpath = '.' end
+if environment.enginepath == "" then environment.enginepath = '.' end
+if environment.version == nil then environment.version = "unknown" end
+
+function environment.get(name)
+ return os.getenv(name) or ""
+end
+
+function environment.cleanname(filename)
+ if filename and filename ~= "" then
+ return filename:gsub( "\\", "/")
+ else -- leave nil and empty untouched
+ return filename
+ end
+end
+
+function environment.texfile(filename)
+ return environment.cleanname(input.find_file(texmf.instance,filename,'tex'))
+end
+
+function environment.ctxfile(filename)
+ return environment.cleanname(input.find_file(texmf.instance,filename,'tex'))
+end
+
+function environment.luafile(filename)
+ return environment.cleanname(input.find_file(texmf.instance,filename,'tex') or input.find_file(texmf.instance,filename,'texmfscripts'))
+end
+
+function environment.showmessage(...) -- todo, cleaner
+ if not environment.silent then
+ if input and input.report then
+ input.report(table.concat({...}," "))
+ elseif texio and texio.write_nl then
+ texio.write_nl("[[" .. table.concat({...}," ") .. "]]")
+ else
+ print("[[" .. table.concat({...}," ") .. "]]")
+ end
+ end
+end
+
+if not environment.jobname then environment.jobname = "unknown" end
+
+function environment.setlucpath()
+ if environment.initex then
+ environment.lucpath = nil
+ else
+ environment.lucpath = environment.formatpath .. "/lua/" .. environment.progname
+ end
+end
+
+function environment.luafilechunk(filename)
+ local filename = filename:gsub("%.%a+$", "") .. ".lua"
+ local fullname = environment.luafile(filename)
+ if fullname and fullname ~= "" then
+ environment.showmessage("loading file", fullname)
+ return loadfile(fullname)
+ else
+ environment.showmessage("unknown file", filename)
+ return nil
+ end
+end
+
+-- the next ones can use the previous ones
+
+function environment.loadluafile(filename,register)
+ filename = filename:gsub("%.%a+$", "") .. ".lua"
+ local fullname = environment.luafile(filename)
+ if fullname and fullname ~= "" then
+ environment.showmessage("loading", fullname)
+ if register then
+ if not environment.regfil then
+ environment.regfil = io.open('luafiles.tmp', 'w')
+ end
+ if environment.regfil then
+ environment.regfil:write(fullname .."\n")
+ end
+ end
+ dofile(fullname)
+ else
+ environment.showmessage("unknown file", filename)
+ end
+end
+
+function environment.loadlucfile(filename,version)
+ local filename = filename:gsub("%.%a+$", "")
+ local fullname = nil
+ if environment.initex or not environment.useluc then
+ environment.loadluafile(filename,environment.initex)
+ else
+ if environment.lucpath and environment.lucpath ~= "" then
+ fullname = environment.lucpath .. "/" .. filename .. ".luc"
+ local chunk = loadfile(fullname) -- this way we don't need a file exists check
+ if chunk then
+ environment.showmessage("loading", fullname)
+ assert(chunk)()
+ if version then
+--~ if modules and modules[filename] and modules[filename].version ~= version then
+--~ environment.showmessage("version mismatch", filename,"lua=" .. modules[filename].version, "luc=" ..version)
+--~ environment.loadluafile(filename)
+--~ elseif versions and versions[filename] and versions[filename] ~= version then
+--~ environment.showmessage("version mismatch", filename,"lua=" .. versions[filename], "luc=" ..version)
+--~ environment.loadluafile(filename)
+--~ end
+ local v = version -- can be nil
+ if modules and modules[filename] then
+ v = modules[filename].version -- new
+ elseif versions and versions[filename] then
+ v = versions[filename] -- old
+ end
+ if v ~= version then
+ environment.showmessage("version mismatch", filename,"lua=" .. v, "luc=" ..version)
+ environment.loadluafile(filename)
+ end
+
+ end
+ else
+ environment.loadluafile(filename)
+ end
+ else
+ environment.loadluafile(filename)
+ end
+ end
+end
+
+function environment.loadedctxfile(filename)
+ local fullname = environment.ctxfile(filename)
+ local i = io.open(fullname)
+ if i then
+ local data = i:read('*all')
+ i:close()
+ return data
+ else
+ environment.showmessage("missing",filename)
+ return ""
+ end
+end
+
+environment.setlucpath()
diff --git a/tex/context/base/luat-env.tex b/tex/context/base/luat-env.tex
new file mode 100644
index 000000000..ec2b942eb
--- /dev/null
+++ b/tex/context/base/luat-env.tex
@@ -0,0 +1,169 @@
+%D \module
+%D [ file=luat-env,
+%D version=2005.05.26,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=ConTeXt features,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \writestatus{loading}{Lua Support Macros (environment)}
+
+% print (lua.id)
+% print (lua.version)
+% print (lua.startupfile)
+
+%D Allocation of \LUA\ engines.
+
+\newcount\luadefcounter
+
+\ifx\zerocount\undefined \chardef\zerocount=0 \fi
+\ifx\plusone \undefined \chardef\plusone =1 \fi
+
+\def\newlua#1%
+ {\global\advance\luadefcounter\plusone
+ \mathchardef#1\luadefcounter}
+
+%D We use a dedicated instance for \CONTEXT\ core functionality. In
+%D \CONTEXT we also use this as callback instance. Instance 0 is
+%D the scratch instance.
+
+\ifx\luastartup\undefined \newcount\luastartup \fi
+
+\chardef\CTXlua\zerocount \luadefcounter\CTXlua \luastartup\CTXlua
+
+\def\ctxlua {\directlua\CTXlua}
+\def\directctxlua{\directlua\CTXlua}
+\def\latectxlua {\latelua \CTXlua}
+
+%D The simple \type {\lua} command is just a shortcut to the
+%D zero instance. Beware, we don't use the 0--9 range for
+%D scratch purposes as we do with other registers. First of all
+%D we want to avoid the overhead, but mostly, users can just define
+%D their own.
+
+\newlua \luadefault
+
+\def \lua {\directlua\luadefault} % zero is the main one, and reserved for ctx
+\edef\luaversion{\CTXlua{tex.print(_VERSION)}}
+
+%D We want to define \LUA\ related things in the format but
+%D need to reluad code because \LUA\ instances are not dumped
+%D into the format.
+
+\ifx\undefined\normaleveryjob \let\normaleveryjob\everyjob \newtoks\everyjob \fi
+
+\newtoks\everyloadluacode
+\newtoks\everyfinalizeluacode
+
+\normaleveryjob{\the\everyloadluacode\the\everyfinalizeluacode\the\everyjob}
+
+\newif\ifproductionrun
+
+\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init)
+ {\ifproductionrun
+ \global\let\startruntimeluacode\relax
+ \global\let\stopruntimeluacode \relax
+ \else
+ \global\everyloadluacode\expandafter{\the\everyloadluacode#1}%
+ \fi
+ #1} % maybe no interference
+
+\long\def\startruntimectxluacode#1\stopruntimectxluacode
+ {\startruntimeluacode\ctxlua{#1}\stopruntimeluacode}
+
+%D Next we load the initialization code.
+
+\startruntimectxluacode
+ if not environment then environment = { } end
+ environment.jobname = "\jobname" % tex.jobname
+ environment.formatname = "\contextformat" % tex.formatname
+ environment.initex = \ifproductionrun false \else true \fi % tex.formatname == ""
+ environment.version = "\contextversion"
+ dofile(input.find_file(texmf.instance,"luat-env.lua","tex"))
+\stopruntimectxluacode
+
+% 0 = external compilation and loading
+% 1 = runtime compilation and embedding
+
+\chardef\ctxluaembeddingmode \plusone
+\chardef\ctxluaexecutionmode \zerocount % private
+
+% we start at 500, below this, we store predefined data (dumps)
+
+\newcount\luabytecodecounter \luabytecodecounter=500
+
+\startruntimectxluacode
+ if not lua.bytedata then lua.bytedata = { } end
+\stopruntimectxluacode
+
+%D Handy when we expand:
+
+\let\stopruntimeluacode \relax
+\let\stopruntimectxluacode\relax
+
+\long\def\lastexpanded{} % todo: elsewhere we use \@@expanded
+
+\long\def\expanded#1{\long\xdef\lastexpanded{\noexpand#1}\lastexpanded}
+
+%D More code:
+
+\def\ctxluabytecode#1% executes an already loaded chunk
+ {\ctxlua {
+ do
+ local str = ''
+ if lua.bytedata[#1] then
+ str = " from file " .. lua.bytedata[#1][1] .. " version " .. lua.bytedata[#1][2]
+ end
+ if lua.bytecode[#1] then
+ if environment.initex then
+ environment.showmessage("executing byte code " .. "#1" .. str)
+ assert(lua.bytecode[#1])()
+ else
+ assert(lua.bytecode[#1])()
+ lua.bytecode[#1] = nil
+ end
+ else
+ environment.showmessage("invalid byte code " .. "#1" .. str)
+ end
+ end
+ }}
+
+\def\ctxluabyteload#1#2% registers and compiles chunk
+ {\global\advance\luabytecodecounter \plusone
+ \expanded{\startruntimectxluacode
+ lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" }
+ \stopruntimectxluacode}%
+ \ctxlua {
+ lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" }
+ lua.bytecode[\the\luabytecodecounter] = environment.luafilechunk("#1")}}
+
+\def\ctxluafileload#1#2% load a (either not compiled) chunk at runtime
+ {\doifelsenothing{#2}
+ {\ctxlua{environment.loadlucfile("#1")}}
+ {\ctxlua{environment.loadlucfile("#1",#2)}}}
+
+\def\registerctxluafile#1#2% name version
+ {\ifcase\ctxluaembeddingmode
+ \ifproductionrun \else
+ \global\everyloadluacode\expandafter{\the\everyloadluacode\ctxluafileload{#1}{#2}}%
+ \fi
+ \ifcase\ctxluaexecutionmode\or\ctxluafileload{#1}{#2}\fi
+ \else
+ \ifproductionrun \else
+ \ctxluabyteload{#1}{#2}%
+ \fi
+ \global\everyloadluacode\expandafter\expandafter\expandafter{\expandafter\the\expandafter\everyloadluacode
+ \expandafter\ctxluabytecode\expandafter{\the\luabytecodecounter}}%
+ \ifcase\ctxluaexecutionmode\or\ctxluabytecode{\the\luabytecodecounter}\fi
+ \fi}
+
+\ifcase\ctxluaembeddingmode \else \registerctxluafile{luat-env}{1.001} \fi
+
+\chardef\ctxluaexecutionmode \plusone
+
+\endinput
diff --git a/tex/context/base/luat-exe.lua b/tex/context/base/luat-exe.lua
new file mode 100644
index 000000000..dcb28d35f
--- /dev/null
+++ b/tex/context/base/luat-exe.lua
@@ -0,0 +1,68 @@
+-- filename : luat-exe.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-exe'] = 1.001
+if not executer then executer = { } end
+
+executer.permitted = { }
+executer.execute = os.execute
+
+function executer.register(...)
+ for k,v in pairs({...}) do
+ if v == "*" then
+ table.insert(executer.permitted, ".*")
+ else
+ table.insert(executer.permitted, v)
+ end
+ end
+end
+
+function executer.finalize() -- todo: os.exec
+ do
+ local execute = os.execute
+ function executer.execute(...)
+ local t, name, arguments = {...}, "", ""
+ if #t == 1 then
+ if type(t[1]) == 'table' then
+ name, arguments = t[1], table.concat(t," ",2,#t)
+ else
+ name, arguments = string.match(t[1],"^(.-)%s+(.+)$")
+ if not (name and arguments) then
+ name, arguments = t[1], ""
+ end
+ end
+ else
+ name, arguments = t[1], table.concat(t," ",2,#t)
+ end
+ for _,v in pairs(executer.permitted) do
+ if string.find(name,v) then
+ execute(name .. " " .. arguments)
+ -- print("executed: " .. name .. " " .. arguments)
+ else
+ print("not permitted: " .. name .. " " .. arguments)
+ end
+ end
+ end
+ function executer.finalize()
+ print("executer is already finalized")
+ end
+ function executer.register(name)
+ print("executer is already finalized")
+ end
+ os.execute = executer.execute
+ end
+end
+
+--~ executer.register('.*')
+--~ executer.register('*')
+--~ executer.register('dir','ls')
+--~ executer.register('dir')
+
+--~ executer.finalize()
+--~ executer.execute('dir',"*.tex")
+--~ executer.execute("dir *.tex")
+--~ executer.execute("ls *.tex")
+--~ os.execute('ls')
diff --git a/tex/context/base/luat-ini.lua b/tex/context/base/luat-ini.lua
new file mode 100644
index 000000000..022055e7f
--- /dev/null
+++ b/tex/context/base/luat-ini.lua
@@ -0,0 +1,11 @@
+if not modules then modules = { } end modules ['luat-ini'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>We cannot load anything yet.</p>
+--ldx]]--
diff --git a/tex/context/base/luat-ini.tex b/tex/context/base/luat-ini.tex
new file mode 100644
index 000000000..800950baf
--- /dev/null
+++ b/tex/context/base/luat-ini.tex
@@ -0,0 +1,104 @@
+%D \module
+%D [ file=luat-ini,
+%D version=2005.08.11,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Lua Support Macros (initialization)}
+
+\unprotect
+
+%D We have to load this module in a very early stage. Therefore we
+%D cannot rely on support macros being available.
+
+% \long\def\rescan#1{\expanded{\scantextokens{#1}}}
+
+%D Loading lua code can be done using \type {startup.lua}. The following
+%D method uses the \TEX\ input file locator of kpse. At least we need to
+%D use that way of loading when we haven't yet define our own code, which
+%D we keep outside the format. We will keep code outside \TEX\ files as
+%D much as possible.
+
+\ifx\setnaturalcatcodes\undefined \let\setnaturalcatcodes\relax \fi
+\ifx\obeylualines \undefined \let\obeylualines \relax \fi
+\ifx\obeyluatokens \undefined \let\obeyluatokens \relax \fi
+
+% \def\loadluacode#1#2% instance filename
+% {\bgroup
+% \everyeof{\noexpand}% hack to make \input nicely expandable
+% \setnaturalcatcodes
+% \obeylualines
+% %message{[Lua Load: #2]}%
+% \directlua#1\expandafter{\normalinput#2\space}\relax
+% \egroup}
+
+%D A few more goodies:
+
+\def\dostartlua#1%
+ {\begingroup
+ \obeylualines
+ \directlua#1\iftrue{\else}\fi}
+
+\def\dostoplua
+ {\iffalse{\else}\fi
+ \endgroup}
+
+\def\dostartluacode#1%
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \directlua#1\iftrue{\else}\fi}
+
+\def\dostopluacode % no unexpanded, else no } seen
+ {\iffalse{\else}\fi
+ \endgroup}
+
+\def\startlua {\dostartlua \zerocount} \def\stoplua {\dostoplua}
+\def\startluacode{\dostartluacode\zerocount} \def\stopluacode {\dostopluacode}
+
+%D Some delayed definitions:
+
+\ifx\obeylines \undefined \let\obeylines \relax \fi
+\ifx\obeyedline \undefined \let\obeyedline \relax \fi
+\ifx\obeyspaces \undefined \let\obeyspaces \relax \fi
+\ifx\obeyedspace \undefined \let\obeyedspace \relax \fi
+\ifx\outputnewlinechar\undefined \let\outputnewlinechar\relax \fi
+
+\def\obeylualines
+ {\obeylines \let\obeyedline \outputnewlinechar
+ \obeyspaces \let\obeyedspace\space}
+
+\def\obeyluatokens % todo: make this a proper catcode table
+ {\catcode`\%=11 \catcode`\#=11
+ \catcode`\_=11 \catcode`\^=11
+ \catcode`\&=11 \catcode`\|=11
+ \catcode`\{=11 \catcode`\}=11
+ \def\\{\string\\}\def\|{\string\|}\def\-{\string\-}%
+ \def\({\string\(}\def\){\string\)}\def\{{\string\{}\def\}{\string\}}%
+ \def\'{\string\'}\def\"{\string\"}%
+ \def\n{\string\n}\def\r{\string\r}\def\f{\string\f}\def\t{\string\t}%
+ \def\a{\string\a}\def\b{\string\b}\def\v{\string\v}%
+ \def\1{\string1}\def\2{\string2}\def\3{\string3}\def\4{\string\4}\def\5{\string\5}%
+ \def\6{\string6}\def\7{\string7}\def\8{\string8}\def\9{\string\9}\def\0{\string\0}}
+
+%D We provide an interface for defining instances:
+
+\def\s!lua{lua} \def\v!code{code} \let\@EA\expandafter
+
+\def\definelua[#1]%
+ {\ifcsname#1\s!lua\endcsname\else\expandafter\newlua\csname#1\s!lua\endcsname\fi
+ \setevalue{\e!start#1\s!lua }{\noexpand\dostartlua \csname#1\s!lua\endcsname}%
+ \setevalue{\e!start#1\s!lua\v!code}{\noexpand\dostartluacode\csname#1\s!lua\endcsname}%
+ \setvalue {\e!stop #1\s!lua }{\dostoplua }%
+ \setvalue {\e!stop #1\s!lua\v!code}{\dostopluacode}}
+
+\definelua[CTX]
+
+\protect \endinput
diff --git a/tex/context/base/luat-inp.lua b/tex/context/base/luat-inp.lua
new file mode 100644
index 000000000..798105718
--- /dev/null
+++ b/tex/context/base/luat-inp.lua
@@ -0,0 +1,1865 @@
+-- filename : luat-inp.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- This lib is multi-purpose and can be loaded again later on so that
+-- additional functionality becomes available. We will split this
+-- module in components when we're done with prototyping.
+
+-- This is the first code I wrote for LuaTeX, so it needs some cleanup.
+
+-- To be considered: hash key lowercase, first entry in table filename
+-- (any case), rest paths (so no need for optimization). Or maybe a
+-- separate table that matches lowercase names to mixed case when
+-- present. In that case the lower() cases can go away. I will do that
+-- only when we run into problems with names.
+
+if not versions then versions = { } end versions['luat-inp'] = 1.001
+if not environment then environment = { } end
+if not file then file = { } end
+
+if environment.aleph_mode == nil then environment.aleph_mode = true end -- temp hack
+
+if not input then input = { } end
+if not input.suffixes then input.suffixes = { } end
+if not input.formats then input.formats = { } end
+if not input.aux then input.aux = { } end
+
+if not input.suffixmap then input.suffixmap = { } end
+
+if not input.locators then input.locators = { } end -- locate databases
+if not input.hashers then input.hashers = { } end -- load databases
+if not input.generators then input.generators = { } end -- generate databases
+if not input.filters then input.filters = { } end -- conversion filters
+
+input.locators.notfound = { nil }
+input.hashers.notfound = { nil }
+input.generators.notfound = { nil }
+
+input.cacheversion = '1.0.1'
+input.banner = nil
+input.verbose = false
+input.debug = false
+input.cnfname = 'texmf.cnf'
+input.lsrname = 'ls-R'
+input.luasuffix = '.tma'
+input.lucsuffix = '.tmc'
+
+-- we use a cleaned up list / format=any is a wildcard, as is *name
+
+input.formats['afm'] = 'AFMFONTS' input.suffixes['afm'] = { 'afm' }
+input.formats['enc'] = 'ENCFONTS' input.suffixes['enc'] = { 'enc' }
+input.formats['fmt'] = 'TEXFORMATS' input.suffixes['fmt'] = { 'fmt' }
+input.formats['map'] = 'TEXFONTMAPS' input.suffixes['map'] = { 'map' }
+input.formats['mp'] = 'MPINPUTS' input.suffixes['mp'] = { 'mp' }
+input.formats['ocp'] = 'OCPINPUTS' input.suffixes['ocp'] = { 'ocp' }
+input.formats['ofm'] = 'OFMFONTS' input.suffixes['ofm'] = { 'ofm', 'tfm' }
+input.formats['otf'] = 'OPENTYPEFONTS' input.suffixes['otf'] = { 'otf' } -- 'ttf'
+input.formats['opl'] = 'OPLFONTS' input.suffixes['opl'] = { 'opl' }
+input.formats['otp'] = 'OTPINPUTS' input.suffixes['otp'] = { 'otp' }
+input.formats['ovf'] = 'OVFFONTS' input.suffixes['ovf'] = { 'ovf', 'vf' }
+input.formats['ovp'] = 'OVPFONTS' input.suffixes['ovp'] = { 'ovp' }
+input.formats['tex'] = 'TEXINPUTS' input.suffixes['tex'] = { 'tex' }
+input.formats['tfm'] = 'TFMFONTS' input.suffixes['tfm'] = { 'tfm' }
+input.formats['ttf'] = 'TTFONTS' input.suffixes['ttf'] = { 'ttf', 'ttc' }
+input.formats['pfb'] = 'T1FONTS' input.suffixes['pfb'] = { 'pfb', 'pfa' }
+input.formats['vf'] = 'VFFONTS' input.suffixes['vf'] = { 'vf' }
+
+input.formats['fea'] = 'FONTFEATURES' input.suffixes['fea'] = { 'fea' }
+
+input.formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
+input.suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
+
+input.formats ['lua'] = 'LUAINPUTS' -- new
+input.suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
+
+-- here we catch a few new thingies
+
+function input.checkconfigdata(instance)
+ if input.env(instance,"LUAINPUTS") == "" then
+ instance.environment["LUAINPUTS"] = ".;$TEXINPUTS;$TEXMFSCRIPTS"
+ end
+ if input.env(instance,"FONTFEATURES") == "" then
+ instance.environment["FONTFEATURES"] = ".;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS"
+ end
+end
+
+-- backward compatible ones
+
+input.alternatives = { }
+
+input.alternatives['map files'] = 'map'
+input.alternatives['enc files'] = 'enc'
+input.alternatives['opentype fonts'] = 'otf'
+input.alternatives['truetype fonts'] = 'ttf'
+input.alternatives['truetype collections'] = 'ttc'
+input.alternatives['type1 fonts'] = 'pfb'
+
+-- obscure ones
+
+input.formats ['misc fonts'] = ''
+input.suffixes['misc fonts'] = { }
+
+input.formats ['sfd'] = 'SFDFONTS'
+input.suffixes ['sfd'] = { 'sfd' }
+input.alternatives['subfont definition files'] = 'sfd'
+
+function input.reset()
+
+ local instance = { }
+
+ instance.rootpath = ''
+ instance.treepath = ''
+ instance.progname = environment.progname or 'context'
+ instance.engine = environment.engine or 'luatex'
+ instance.format = ''
+ instance.environment = { }
+ instance.variables = { }
+ instance.expansions = { }
+ instance.files = { }
+ instance.configuration = { }
+ instance.found = { }
+ instance.foundintrees = { }
+ instance.kpsevars = { }
+ instance.hashes = { }
+ instance.cnffiles = { }
+ instance.lists = { }
+ instance.remember = true
+ instance.diskcache = true
+ instance.renewcache = false
+ instance.scandisk = true
+ instance.cachepath = nil
+ instance.loaderror = false
+ instance.smallcache = false
+ instance.savelists = true
+ instance.cleanuppaths = true
+ instance.allresults = false
+ instance.pattern = nil -- lists
+ instance.kpseonly = false -- lists
+ instance.cachefile = 'tmftools'
+ instance.loadtime = 0
+ instance.starttime = 0
+ instance.stoptime = 0
+ instance.validfile = function(path,name) return true end
+ instance.data = { } -- only for loading
+ instance.sortdata = false
+ instance.force_suffixes = true
+ instance.dummy_path_expr = "^!*unset/*$"
+ instance.fakepaths = { }
+ instance.lsrmode = false
+
+ if os.env then
+ -- store once, freeze and faster
+ for k,v in pairs(os.env) do
+ instance.environment[k] = input.bare_variable(v)
+ end
+ else
+ -- we will access os.env frequently
+ for k,v in pairs({'HOME','TEXMF','TEXMFCNF','SELFAUTOPARENT'}) do
+ local e = os.getenv(v)
+ if e then
+ -- input.report("setting",v,"to",input.bare_variable(e))
+ instance.environment[v] = input.bare_variable(e)
+ end
+ end
+ end
+
+ -- cross referencing
+
+ for k, v in pairs(input.suffixes) do
+ for _, vv in pairs(v) do
+ if vv then
+ input.suffixmap[vv] = k
+ end
+ end
+ end
+
+ return instance
+
+end
+
+function input.bare_variable(str)
+ -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1")
+ return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2")
+end
+
+if texio then
+ input.log = texio.write_nl
+else
+ input.log = print
+end
+
+function input.simple_logger(kind, name)
+ if name and name ~= "" then
+ if input.banner then
+ input.log(input.banner..kind..": "..name)
+ else
+ input.log("<<"..kind..": "..name..">>")
+ end
+ else
+ if input.banner then
+ input.log(input.banner..kind..": no name")
+ else
+ input.log("<<"..kind..": no name>>")
+ end
+ end
+end
+
+function input.dummy_logger()
+end
+
+function input.settrace(n)
+ input.trace = tonumber(n or 0)
+ if input.trace > 0 then
+ input.logger = input.simple_logger
+ input.verbose = true
+ else
+ input.logger = function() end
+ end
+end
+
+function input.report(...) -- inefficient
+ if input.verbose then
+ if input.banner then
+ input.log(input.banner .. table.concat({...},' '))
+ elseif input.logmode() == 'xml' then
+ input.log("<t>"..table.concat({...},' ').."</t>")
+ else
+ input.log("<<"..table.concat({...},' ')..">>")
+ end
+ end
+end
+
+function input.reportlines(str)
+ if type(str) == "string" then
+ str = str:split("\n")
+ end
+ for _,v in pairs(str) do input.report(v) end
+end
+
+input.settrace(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRACE") or input.trace or 0)
+
+-- These functions can be used to test the performance, especially
+-- loading the database files.
+
+function input.start_timing(instance)
+ if instance then
+ instance.starttime = os.clock()
+ if not instance.loadtime then
+ instance.loadtime = 0
+ end
+ end
+end
+
+function input.stop_timing(instance, report)
+ if instance and instance.starttime then
+ instance.stoptime = os.clock()
+ local loadtime = instance.stoptime - instance.starttime
+ instance.loadtime = instance.loadtime + loadtime
+ if report then
+ input.report('load time', string.format("%0.3f",loadtime))
+ end
+ return loadtime
+ else
+ return 0
+ end
+end
+
+input.stoptiming = input.stop_timing
+input.starttiming = input.start_timing
+
+function input.elapsedtime(instance)
+ return string.format("%0.3f",instance.loadtime or 0)
+end
+
+function input.report_loadtime(instance)
+ if instance then
+ input.report('total load time', input.elapsedtime(instance))
+ end
+end
+
+function input.loadtime(instance)
+ tex.print(input.elapsedtime(instance))
+end
+
+function input.env(instance,key)
+ return instance.environment[key] or input.osenv(instance,key)
+end
+
+function input.osenv(instance,key)
+ if instance.environment[key] == nil then
+ local e = os.getenv(key)
+ if e == nil then
+ instance.environment[key] = "" -- false
+ else
+ instance.environment[key] = input.bare_variable(e)
+ end
+ end
+ return instance.environment[key] or ""
+end
+
+-- we follow a rather traditional approach:
+--
+-- (1) texmf.cnf given in TEXMFCNF
+-- (2) texmf.cnf searched in TEXMF/web2c
+--
+-- for the moment we don't expect a configuration file in a zip
+
+function input.identify_cnf(instance)
+ if #instance.cnffiles == 0 then
+ if instance.treepath ~= "" then
+ if instance.rootpath ~= "" then
+ local t = instance.treepath:splitchr(',')
+ for k,v in ipairs(t) do
+ t[k] = file.join(instance.rootpath,v)
+ end
+ instance.treepath = table.concat(t,',')
+ end
+ local t = instance.treepath:splitchr(',')
+ instance.environment['TEXMF'] = input.bare_variable(instance.treepath)
+ instance.environment['TEXMFCNF'] = file.join(t[1] or '.','texmf/web2c')
+ end
+ if instance.rootpath ~= "" then
+ instance.environment['TEXMFCNF'] = file.join(instance.rootpath,'texmf/web2c')
+ instance.environment['SELFAUTOPARENT'] = instance.rootpath
+ end
+ if input.env(instance,'TEXMFCNF') ~= "" then
+ local t = input.split_path(input.env(instance,'TEXMFCNF'))
+ t = input.aux.expanded_path(instance,t)
+ input.aux.expand_vars(instance,t)
+ for _,v in ipairs(t) do
+ table.insert(instance.cnffiles,file.join(v,input.cnfname))
+ end
+ elseif input.env(instance,'SELFAUTOPARENT') == '.' then
+ table.insert(instance.cnffiles,file.join('.',input.cnfname))
+ else
+ for _,v in ipairs({'texmf-local','texmf'}) do
+ table.insert(instance.cnffiles,file.join(input.env(instance,'SELFAUTOPARENT'),v,'web2c',input.cnfname))
+ end
+ end
+ end
+end
+
+function input.load_cnf(instance)
+ -- instance.cnffiles contain complete names now !
+ if #instance.cnffiles == 0 then
+ input.report("no cnf files found (TEXMFCNF may not be set/known)")
+ else
+ instance.rootpath = instance.cnffiles[1]
+ for k,fname in ipairs(instance.cnffiles) do
+ instance.cnffiles[k] = fname:gsub("\\",'/')
+ end
+ for i = 1, 3 do
+ instance.rootpath = file.dirname(instance.rootpath)
+ end
+ if instance.lsrmode then
+ input.loadconfigdata(instance,instance.cnffiles)
+ elseif instance.diskcache and not instance.renewcache then
+ input.loadconfig(instance,instance.cnffiles)
+ if instance.loaderror then
+ input.loadconfigdata(instance,instance.cnffiles)
+ input.saveconfig(instance)
+ end
+ else
+ input.loadconfigdata(instance,instance.cnffiles)
+ if instance.renewcache then
+ input.saveconfig(instance)
+ end
+ end
+ input.aux.collapse_cnf_data(instance)
+ end
+ input.checkconfigdata(instance)
+end
+
+function input.loadconfigdata(instance)
+ for _, fname in pairs(instance.cnffiles) do
+ input.aux.load_cnf(instance,fname)
+ end
+end
+
+if os.env then
+ function input.aux.collapse_cnf_data(instance)
+ for _,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if not instance.variables[k] then
+ if instance.environment[k] then
+ instance.variables[k] = instance.environment[k]
+ else
+ instance.kpsevars[k] = true
+ instance.variables[k] = input.bare_variable(v)
+ end
+ end
+ end
+ end
+ end
+else
+ function input.aux.collapse_cnf_data(instance)
+ for _,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if not instance.variables[k] then
+ local e = os.getenv(k)
+ if e then
+ instance.environment[k] = input.bare_variable(e)
+ instance.variables[k] = instance.environment[k]
+ else
+ instance.variables[k] = input.bare_variable(v)
+ instance.kpsevars[k] = true
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.aux.load_cnf(instance,fname)
+ fname = input.clean_path(fname)
+ local lname = fname:gsub("%.%a+$",input.luasuffix)
+ local f = io.open(lname)
+ if f then
+ f:close()
+ input.aux.load_data(instance,file.dirname(lname),'configuration',file.basename(lname))
+ else
+ f = io.open(fname)
+ if f then
+ input.report("loading", fname)
+ local line, data, n, k, v
+ local dname = file.dirname(fname)
+ if not instance.configuration[dname] then
+ instance.configuration[dname] = { }
+ end
+ local data = instance.configuration[dname]
+ while true do
+ line = f:read()
+ if line then
+ while true do -- join lines
+ line, n = line:gsub("\\%s*$", "")
+ if n > 0 then
+ line = line .. f:read()
+ else
+ break
+ end
+ end
+ if not line:find("^[%%#]") then
+ k, v = (line:gsub("%s*%%.*$","")):match("%s*(.-)%s*=%s*(.-)%s*$")
+ if k and v and not data[k] then
+ data[k] = (v:gsub("[%%#].*",'')):gsub("~", "$HOME")
+ instance.kpsevars[k] = true
+ end
+ end
+ else
+ break
+ end
+ end
+ f:close()
+ else
+ input.report("skipping", fname)
+ end
+ end
+end
+
+-- database loading
+
+function input.load_hash(instance)
+ input.locatelists(instance)
+ if instance.lsrmode then
+ input.loadlists(instance)
+ elseif instance.diskcache and not instance.renewcache then
+ input.loadfiles(instance)
+ if instance.loaderror then
+ input.loadlists(instance)
+ input.savefiles(instance)
+ end
+ else
+ input.loadlists(instance)
+ if instance.renewcache then
+ input.savefiles(instance)
+ end
+ end
+end
+
+function input.aux.append_hash(instance,type,tag,name)
+ input.logger("= hash append",tag)
+ table.insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function input.aux.prepend_hash(instance,type,tag,name)
+ input.logger("= hash prepend",tag)
+ table.insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
+end
+
+function input.aux.extend_texmf_var(instance,specification) -- crap
+ if instance.environment['TEXMF'] then
+ input.report("extending environment variable TEXMF with", specification)
+ instance.environment['TEXMF'] = instance.environment['TEXMF']:gsub("^%{", function()
+ return "{" .. specification .. ","
+ end)
+ elseif instance.variables['TEXMF'] then
+ input.report("extending configuration variable TEXMF with", specification)
+ instance.variables['TEXMF'] = instance.variables['TEXMF']:gsub("^%{", function()
+ return "{" .. specification .. ","
+ end)
+ else
+ input.report("setting configuration variable TEXMF to", specification)
+ instance.variables['TEXMF'] = "{" .. specification .. "}"
+ end
+ if instance.variables['TEXMF']:find("%,") and not instance.variables['TEXMF']:find("^%{") then
+ input.report("adding {} to complex TEXMF variable, best do that yourself")
+ instance.variables['TEXMF'] = "{" .. instance.variables['TEXMF'] .. "}"
+ end
+ input.expand_variables(instance)
+end
+
+-- locators
+
+function input.locatelists(instance)
+ for _, path in pairs(input.simplified_list(input.expansion(instance,'TEXMF'))) do
+ input.report("locating list of",path)
+ input.locatedatabase(instance,input.normalize_name(path))
+ end
+end
+
+function input.locatedatabase(instance,specification)
+ return input.methodhandler('locators', instance, specification)
+end
+
+function input.locators.tex(instance,specification)
+ if specification and specification ~= '' then
+ local files = {
+ file.join(specification,'files'..input.lucsuffix),
+ file.join(specification,'files'..input.luasuffix),
+ file.join(specification,input.lsrname)
+ }
+ for _, filename in pairs(files) do
+ local f = io.open(filename)
+ if f then
+ input.logger('! tex locator', specification..' found')
+ input.aux.append_hash(instance,'file',specification,filename)
+ f:close()
+ return
+ end
+ end
+ input.logger('? tex locator', specification..' not found')
+ end
+end
+
+-- hashers
+
+function input.hashdatabase(instance,tag,name)
+ return input.methodhandler('hashers',instance,tag,name)
+end
+
+function input.loadfiles(instance)
+ instance.loaderror = false
+ instance.files = { }
+ if not instance.renewcache then
+ for _, hash in ipairs(instance.hashes) do
+ input.hashdatabase(instance,hash.tag,hash.name)
+ if instance.loaderror then break end
+ end
+ end
+end
+
+function input.hashers.tex(instance,tag,name)
+ input.aux.load_data(instance,tag,'files')
+end
+
+-- generators:
+
+function input.loadlists(instance)
+ for _, hash in ipairs(instance.hashes) do
+ input.generatedatabase(instance,hash.tag)
+ end
+end
+
+function input.generatedatabase(instance,specification)
+ return input.methodhandler('generators', instance, specification)
+end
+
+function input.generators.tex(instance,specification)
+ local tag = specification
+ if not instance.lsrmode and lfs and lfs.dir then
+ input.report("scanning path",specification)
+ instance.files[tag] = { }
+ local files = instance.files[tag]
+ local n, m = 0, 0
+ local spec = specification .. '/'
+ local attributes = lfs.attributes
+ local directory = lfs.dir
+ local small = instance.smallcache
+ local function action(path)
+ local mode, full
+ if path then
+ full = spec .. path .. '/'
+ else
+ full = spec
+ end
+ for name in directory(full) do
+ if name == '.' or name == ".." then
+ -- skip
+ else
+ mode = attributes(full..name,'mode')
+ if mode == "directory" then
+ m = m + 1
+ if path then
+ action(path..'/'..name)
+ else
+ action(name)
+ end
+ elseif path and mode == 'file' then
+ n = n + 1
+ local f = files[name]
+ if f then
+ if not small then
+ if type(f) == 'string' then
+ files[name] = { f, path }
+ else
+ f[#f+1] = path
+ end
+ end
+ else
+ files[name] = path
+ end
+ end
+ end
+ end
+ end
+ action()
+ input.report(n,"files found on",m,"directories")
+ else
+ local fullname = file.join(specification,input.lsrname)
+ local path = '.'
+ local f = io.open(fullname)
+ if f then
+ instance.files[tag] = { }
+ local files = instance.files[tag]
+ local small = instance.smallcache
+ input.report("loading lsr file",fullname)
+ -- for line in f:lines() do -- much slower then the next one
+ for line in (f:read("*a")):gmatch("(.-)\n") do
+ if line:find("^[%a%d]") then
+ local fl = files[line]
+ if fl then
+ if not small then
+ if type(fl) == 'string' then
+ files[line] = { fl, path } -- table
+ else
+ fl[#fl+1] = path
+ end
+ end
+ else
+ files[line] = path -- string
+ end
+ else
+ path = line:match("%.%/(.-)%:$") or path -- match could be nil due to empty line
+ end
+ end
+ f:close()
+ end
+ end
+end
+
+-- savers, todo
+
+function input.savefiles(instance)
+ input.aux.save_data(instance, 'files', function(k,v)
+ return instance.validfile(k,v) -- path, name
+ end)
+end
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+function input.splitconfig(instance)
+ for i,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if type(v) == 'string' then
+ local t = file.split_path(v)
+ if #t > 1 then
+ c[k] = t
+ end
+ end
+ end
+ end
+end
+function input.joinconfig(instance)
+ for i,c in pairs(instance.configuration) do
+ for k,v in pairs(c) do
+ if type(v) == 'table' then
+ c[k] = file.join_path(v)
+ end
+ end
+ end
+end
+function input.split_path(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return file.split_path(str)
+ end
+end
+function input.join_path(str)
+ if type(str) == 'table' then
+ return file.join_path(str)
+ else
+ return str
+ end
+end
+function input.splitexpansions(instance)
+ for k,v in pairs(instance.expansions) do
+ local t = file.split_path(v)
+ if #t > 1 then
+ instance.expansions[k] = t
+ end
+ end
+end
+function input.splitexpansions(instance)
+ for k,v in pairs(instance.expansions) do
+ local t, h = { }, { }
+ for _,vv in pairs(file.split_path(v)) do
+ if vv ~= "" and not h[vv] then
+ t[#t+1] = vv
+ h[vv] = true
+ end
+ end
+ if #t > 1 then
+ instance.expansions[k] = t
+ else
+ instance.expansions[k] = t[1]
+ end
+ end
+end
+
+-- end of split/join code
+
+function input.saveconfig(instance)
+ input.splitconfig(instance)
+ input.aux.save_data(instance, 'configuration', nil)
+ input.joinconfig(instance)
+end
+
+input.configbanner = [[
+-- This is a Luatex configuration file created by 'luatools.lua' or
+-- 'luatex.exe' directly. For comment, suggestions and questions you can
+-- contact the ConTeXt Development Team. This configuration file is
+-- not copyrighted. [HH & TH]
+]]
+
+function input.aux.save_data(instance, dataname, check)
+ for cachename, files in pairs(instance[dataname]) do
+ local name = file.join(cachename,dataname)
+ local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix
+ local f = io.open(luaname,'w')
+ if f then
+ input.report("saving " .. dataname .. " in", luaname)
+ f:write(input.configbanner)
+ f:write("\n")
+ f:write("if not texmf then texmf = { } end\n")
+ f:write("if not texmf.data then texmf.data = { } end\n")
+ f:write("\n")
+ f:write("texmf.data.type = '" .. dataname .. "'\n")
+ f:write("texmf.data.version = '" .. input.cacheversion .. "'\n")
+ f:write("texmf.data.date = '" .. os.date("%Y-%m-%d") .. "'\n")
+ f:write("texmf.data.time = '" .. os.date("%H:%M:%S") .. "'\n")
+ f:write('texmf.data.content = {\n')
+ local function dump(k,v)
+ if not check or check(v,k) then -- path, name
+ if type(v) == 'string' then
+ f:write("\t['" .. k .. "'] = '" .. v .. "',\n")
+ elseif #v == 1 then
+ f:write("\t['" .. k .. "'] = '" .. v[1] .. "',\n")
+ else
+ f:write("\t['" .. k .. "'] = {'" .. table.concat(v,"','").. "'},\n")
+ end
+ end
+ end
+ if instance.sortdata then
+ for _, k in pairs(table.sortedkeys(files)) do
+ dump(k,files[k])
+ end
+ else
+ for k, v in pairs(files) do
+ dump(k,v)
+ end
+ end
+ f:write('}\n')
+ f:close()
+ input.report("compiling " .. dataname .. " to", lucname)
+ if not utils.lua.compile(luaname,lucname) then
+ input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname)
+ os.remove(lucname)
+ end
+ else
+ input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix)
+ end
+ end
+end
+
+function input.loadconfig(instance)
+ instance.configuration, instance.loaderror = { }, false
+ if not instance.renewcache then
+ for _, cnf in pairs(instance.cnffiles) do
+ input.aux.load_data(instance,file.dirname(cnf),'configuration')
+ if instance.loaderror then break end
+ end
+ end
+ input.joinconfig(instance)
+end
+
+if not texmf then texmf = {} end
+if not texmf.data then texmf.data = {} end
+
+function input.aux.load_data(instance,pathname,dataname,filename)
+ if not filename or (filename == "") then
+ filename = dataname .. input.lucsuffix
+ end
+ local blob = loadfile(file.join(pathname,filename))
+ if not blob then
+ filename = dataname .. input.luasuffix
+ blob = loadfile(file.join(pathname,filename))
+ end
+ if blob then
+ blob()
+ if (texmf.data.type == dataname) and (texmf.data.version == input.cacheversion) and texmf.data.content then
+ input.report("loading",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = texmf.data.content
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = { }
+ instance.loaderror = true
+ end
+ end
+ texmf.data.content = { }
+end
+
+function input.expand_variables(instance)
+ instance.expansions = { }
+ if instance.engine ~= "" then instance.environment['engine'] = instance.engine end
+ if instance.progname ~= "" then instance.environment['progname'] = instance.engine end
+ for k,v in pairs(instance.environment) do
+ local a, b = k:match("^(%a+)%_(.*)%s*$")
+ if a and b then
+ instance.expansions[a..'.'..b] = v
+ else
+ instance.expansions[k] = v
+ end
+ end
+ for k,v in pairs(instance.environment) do -- move environment to expansions
+ if not instance.expansions[k] then instance.expansions[k] = v end
+ end
+ for k,v in pairs(instance.variables) do -- move variables to expansions
+ if not instance.expansions[k] then instance.expansions[k] = v end
+ end
+ while true do
+ local busy = false
+ for k,v in pairs(instance.expansions) do
+ local s, n = v:gsub("%$([%a%d%_%-]+)", function(a)
+ busy = true
+ return instance.expansions[a] or input.env(instance,a)
+ end)
+ local s, m = s:gsub("%$%{([%a%d%_%-]+)%}", function(a)
+ busy = true
+ return instance.expansions[a] or input.env(instance,a)
+ end)
+ if n > 0 or m > 0 then
+ instance.expansions[k]= s
+ end
+ end
+ if not busy then break end
+ end
+ for k,v in pairs(instance.expansions) do
+ instance.expansions[k] = v:gsub("\\", '/')
+ end
+ input.splitexpansions(instance)
+end
+
+function input.aux.expand_vars(instance,lst) -- simple vars
+ for k,v in pairs(lst) do
+ lst[k] = v:gsub("%$([%a%d%_%-]+)", function(a)
+ return instance.variables[a] or input.env(instance,a)
+ end)
+ end
+end
+
+function input.aux.expanded_var(instance,var) -- simple vars
+ return var:gsub("%$([%a%d%_%-]+)", function(a)
+ return instance.variables[a] or input.env(instance,a)
+ end)
+end
+
+function input.aux.entry(instance,entries,name)
+ if name and (name ~= "") then
+ name = name:gsub('%$','')
+ local result = entries[name..'.'..instance.progname] or entries[name]
+ if result then
+ return result
+ else
+ result = input.env(instance,name)
+ if result then
+ instance.variables[name] = result
+ input.expand_variables(instance)
+ return instance.expansions[name] or ""
+ end
+ end
+ end
+ return ""
+end
+function input.variable(instance,name)
+ return input.aux.entry(instance,instance.variables,name)
+end
+function input.expansion(instance,name)
+ return input.aux.entry(instance,instance.expansions,name)
+end
+
+function input.aux.is_entry(instance,entries,name)
+ if name and name ~= "" then
+ name = name:gsub('%$','')
+ return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
+ else
+ return false
+ end
+end
+
+function input.is_variable(instance,name)
+ return input.aux.is_entry(instance,instance.variables,name)
+end
+function input.is_expansion(instance,name)
+ return input.aux.is_entry(instance,instance.expansions,name)
+end
+
+function input.aux.list(instance,list)
+ local pat = string.upper(instance.pattern or "","")
+ for _,key in pairs(table.sortedkeys(list)) do
+ if (instance.pattern=="") or string.find(key:upper(),pat) then
+ if instance.kpseonly then
+ if instance.kpsevars[key] then
+ print(key .. "=" .. input.aux.tabstr(list[key]))
+ end
+ elseif instance.kpsevars[key] then
+ print('K ' .. key .. "=" .. input.aux.tabstr(list[key]))
+ else
+ print('E ' .. key .. "=" .. input.aux.tabstr(list[key]))
+ end
+ end
+ end
+end
+
+function input.list_variables(instance)
+ input.aux.list(instance,instance.variables)
+end
+function input.list_expansions(instance)
+ input.aux.list(instance,instance.expansions)
+end
+
+function input.list_configurations(instance)
+ for _,key in pairs(table.sortedkeys(instance.kpsevars)) do
+ if not instance.pattern or (instance.pattern=="") or key:find(instance.pattern) then
+ print(key.."\n")
+ for i,c in pairs(instance.configuration) do
+ local str = c[key]
+ if str then
+ print("\t" .. i .. "\t\t" .. input.aux.tabstr(str))
+ end
+ end
+ print()
+ end
+ end
+end
+
+function input.aux.tabstr(str)
+ if type(str) == 'table' then
+ return table.concat(str," | ")
+ else
+ return str
+ end
+end
+
+function input.simplified_list(str)
+ if type(str) == 'table' then
+ return str -- troubles ; ipv , in texmf
+ elseif str == '' then
+ return { }
+ else
+ local t = { }
+ for _,v in ipairs(string.splitchr(str:gsub("^\{(.+)\}$","%1"),",")) do
+ t[#t+1] = (v:gsub("^[%!]*(.+)[%/\\]*$","%1"))
+ end
+ return t
+ end
+end
+
+function input.unexpanded_path_list(instance,str)
+ local pth = input.variable(instance,str)
+ local lst = input.split_path(pth)
+ return input.aux.expanded_path(instance,lst)
+end
+function input.unexpanded_path(instance,str)
+ return file.join_path(input.unexpanded_path_list(instance,str))
+end
+
+function input.expanded_path_list(instance,str)
+ if not str then
+ return { }
+ elseif instance.savelists then
+ -- engine+progname hash
+ str = str:gsub("%$","")
+ if not instance.lists[str] then -- cached
+ local lst = input.split_path(input.expansion(instance,str))
+ instance.lists[str] = input.aux.expanded_path(instance,lst)
+ end
+ return instance.lists[str]
+ else
+ local lst = input.split_path(input.expansion(instance,str))
+ return input.aux.expanded_path(instance,lst)
+ end
+end
+function input.expand_path(instance,str)
+ return file.join_path(input.expanded_path_list(instance,str))
+end
+
+--~ function input.first_writable_path(instance,name)
+--~ for _,v in pairs(input.expanded_path_list(instance,name)) do
+--~ if file.is_writable(file.join(v,'luatex-cache.tmp')) then
+--~ return v
+--~ end
+--~ end
+--~ return "."
+--~ end
+
+function input.expanded_path_list_from_var(instance,str) -- brrr
+ local tmp = input.var_of_format_or_suffix(str:gsub("%$",""))
+ if tmp ~= "" then
+ return input.expanded_path_list(instance,str)
+ else
+ return input.expanded_path_list(instance,tmp)
+ end
+end
+function input.expand_path_from_var(instance,str)
+ return file.join_path(input.expanded_path_list_from_var(instance,str))
+end
+
+function input.format_of_var(str)
+ return input.formats[str] or input.formats[input.alternatives[str]] or ''
+end
+function input.format_of_suffix(str)
+ return input.suffixmap[file.extname(str)] or 'tex'
+end
+
+function input.variable_of_format(str)
+ return input.formats[str] or input.formats[input.alternatives[str]] or ''
+end
+
+function input.var_of_format_or_suffix(str)
+ local v = input.formats[str]
+ if v then
+ return v
+ end
+ v = input.formats[input.alternatives[str]]
+ if v then
+ return v
+ end
+ v = input.suffixmap[file.extname(str)]
+ if v then
+ return input.formats[isf]
+ end
+ return ''
+end
+
+function input.expand_braces(instance,str) -- output variable and brace expansion of STRING
+ local ori = input.variable(instance,str)
+ local pth = input.aux.expanded_path(instance,input.split_path(ori))
+ return file.join_path(pth)
+end
+
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+
+function input.aux.expanded_path(instance,pathlist)
+ -- a previous version fed back into pathlist
+ local i, n, oldlist, newlist, ok = 0, 0, { }, { }, false
+ for _,v in ipairs(pathlist) do
+ if v:find("[{}]") then
+ ok = true
+ break
+ end
+ end
+ if ok then
+ for _,v in ipairs(pathlist) do
+ oldlist[#oldlist+1] = (v:gsub("([\{\}])", function(p)
+ if p == "{" then
+ i = i + 1
+ if i > n then n = i end
+ return "<" .. (i-1) .. ">"
+ else
+ i = i - 1
+ return "</" .. i .. ">"
+ end
+ end))
+ end
+ for i=1,n do
+ while true do
+ local more = false
+ local pattern = "^(.-)<"..(n-i)..">(.-)</"..(n-i)..">(.-)$"
+ local t = { }
+ for _,v in ipairs(oldlist) do
+ local pre, mid, post = v:match(pattern)
+ if pre and mid and post then
+ more = true
+ -- for _,vv in ipairs(mid:splitchr(',')) do
+ for vv in string.gmatch(mid..',',"(.-),") do
+ if vv == '.' then
+ t[#t+1] = pre..post
+ else
+ t[#t+1] = pre..vv..post
+ end
+ end
+ else
+ t[#t+1] = v
+ end
+ end
+ oldlist = t
+ if not more then break end
+ end
+ end
+ for _,v in pairs(oldlist) do
+ v = file.collapse_path(v)
+ if v ~= "" and not v:find(instance.dummy_path_expr) then newlist[#newlist+1] = v end
+ end
+ else
+ for _,v in pairs(pathlist) do
+ -- for _,vv in pairs(v:split(",")) do
+ for vv in string.gmatch(v..',',"(.-),") do
+ vv = file.collapse_path(v)
+ if vv ~= "" then newlist[#newlist+1] = vv end
+ end
+ end
+ end
+ return newlist
+end
+
+--~ function input.is_readable(name) -- brrr, get rid of this
+--~ return name:find("^zip##") or file.is_readable(name)
+--~ end
+
+input.is_readable = { }
+
+function input.aux.is_readable(readable, name)
+ if input.trace > 2 then
+ if readable then
+ input.logger("+ readable", name)
+ else
+ input.logger("- readable", name)
+ end
+ end
+ return readable
+end
+
+function input.is_readable.file(name)
+ -- return input.aux.is_readable(file.is_readable(name), name)
+ return input.aux.is_readable(input.aux.is_file(name), name)
+end
+
+input.is_readable.tex = input.is_readable.file
+
+-- name
+-- name/name
+
+function input.aux.collect_files(instance,names)
+ local filelist = nil
+ for _, fname in pairs(names) do
+ if fname then
+ if input.trace > 2 then
+ input.logger("? blobpath asked",fname)
+ end
+ local bname = file.basename(fname)
+ local dname = file.dirname(fname)
+ if dname == "" or dname:find("^%.") then
+ dname = false
+ else
+ dname = "/" .. dname .. "$"
+ end
+ for _, hash in pairs(instance.hashes) do
+ local blobpath = hash.tag
+ if blobpath and instance.files[blobpath] then
+ if input.trace > 2 then
+ input.logger('? blobpath do',blobpath .. " (" .. bname ..")")
+ end
+ local blobfile = instance.files[blobpath][bname]
+ if blobfile then
+ if type(blobfile) == 'string' then
+ if not dname or blobfile:find(dname) then
+ if not filelist then filelist = { } end
+ -- input.logger('= collected', blobpath.." | "..blobfile.." | "..bname)
+ filelist[#filelist+1] = file.join(blobpath,blobfile,bname)
+ end
+ else
+ for _, vv in pairs(blobfile) do
+ if not dname or vv:find(dname) then
+ if not filelist then filelist = { } end
+ filelist[#filelist+1] = file.join(blobpath,vv,bname)
+ end
+ end
+ end
+ end
+ elseif input.trace > 1 then
+ input.logger('! blobpath no',blobpath .. " (" .. bname ..")" )
+ end
+ end
+ end
+ end
+ return filelist
+end
+
+function input.suffix_of_format(str)
+ if input.suffixes[str] then
+ return input.suffixes[str][1]
+ else
+ return ""
+ end
+end
+
+function input.suffixes_of_format(str)
+ if input.suffixes[str] then
+ return input.suffixes[str]
+ else
+ return {}
+ end
+end
+
+function input.aux.qualified_path(filename) -- make platform dependent / not good yet
+ return
+ filename:find("^%.+/") or
+ filename:find("^/") or
+ filename:find("^%a+%:") or
+ filename:find("^%a+##")
+end
+
+function input.normalize_name(original)
+ -- internally we use type##spec##subspec ; this hackery slightly slows down searching
+ local str = original or ""
+ str = str:gsub("::", "##") -- :: -> ##
+ str = str:gsub("^(%a+)://" ,"%1##") -- zip:// -> zip##
+ str = str:gsub("(.+)##(.+)##/(.+)","%1##%2##%3") -- ##/spec -> ##spec
+ if (input.trace>1) and (original ~= str) then
+ input.logger('= normalizer',original.." -> "..str)
+ end
+ return str
+end
+
+-- split the next one up, better for jit
+
+function input.aux.register_in_trees(instance,name)
+ if not name:find("^%.") then
+ instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
+ end
+end
+
+function input.aux.find_file(instance,filename) -- todo : plugin (scanners, checkers etc)
+ local result = { }
+ local stamp = nil
+ filename = input.normalize_name(filename)
+ filename = file.collapse_path(filename:gsub("\\","/"))
+ -- speed up / beware: format problem
+ if instance.remember then
+ stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.found[stamp] then
+ input.logger('! remembered', filename)
+ return instance.found[stamp]
+ end
+ end
+ if filename:find('%*') then
+ input.logger('! wildcard', filename)
+ result = input.find_wildcard_files(instance,filename)
+ elseif input.aux.qualified_path(filename) then
+ if input.is_readable.file(filename) then
+ input.logger('! qualified', filename)
+ result = { filename }
+ else
+ local forcedname, ok = "", false
+ if file.extname(filename) == "" then
+ if instance.format == "" then
+ forcedname = filename .. ".tex"
+ if input.is_readable.file(forcedname) then
+ input.logger('! no suffix, forcing standard filetype tex')
+ result, ok = { forcedname }, true
+ end
+ else
+ for _, s in pairs(input.suffixes_of_format(instance.format)) do
+ forcedname = filename .. "." .. s
+ if input.is_readable.file(forcedname) then
+ input.logger('! no suffix, forcing format filetype', s)
+ result, ok = { forcedname }, true
+ break
+ end
+ end
+ end
+ end
+ if not ok then
+ input.logger('? qualified', filename)
+ end
+ end
+ else
+ -- search spec
+ local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
+ if ext == "" then
+ if not instance.force_suffixes then
+ table.insert(wantedfiles, filename)
+ end
+ else
+ table.insert(wantedfiles, filename)
+ end
+ if instance.format == "" then
+ if ext == "" then
+ local forcedname = filename .. '.tex'
+ table.insert(wantedfiles, forcedname)
+ filetype = input.format_of_suffix(forcedname)
+ input.logger('! forcing filetype',filetype)
+ else
+ filetype = input.format_of_suffix(filename)
+ input.logger('! using suffix based filetype',filetype)
+ end
+ else
+ if ext == "" then
+ for _, s in pairs(input.suffixes_of_format(instance.format)) do
+ table.insert(wantedfiles, filename .. "." .. s)
+ end
+ end
+ filetype = instance.format
+ input.logger('! using given filetype',filetype)
+ end
+ local typespec = input.variable_of_format(filetype)
+ local pathlist = input.expanded_path_list(instance,typespec)
+ if not pathlist or #pathlist == 0 then
+ -- no pathlist, access check only
+ if input.trace > 2 then
+ input.logger('? filename',filename)
+ input.logger('? filetype',filetype or '?')
+ input.logger('? wanted files',table.concat(wantedfiles," | "))
+ end
+ for _, fname in pairs(wantedfiles) do
+ if fname and input.is_readable.file(fname) then
+ filename, done = fname, true
+ table.insert(result, file.join('.',fname))
+ break
+ end
+ end
+ -- this is actually 'other text files' or 'any' or 'whatever'
+ local filelist = input.aux.collect_files(instance,wantedfiles)
+ filename = filelist and filelist[1]
+ if filename then
+ table.insert(result, filename)
+ done = true
+ end
+ else
+ -- list search
+ local filelist = input.aux.collect_files(instance,wantedfiles)
+ local doscan, recurse
+ if input.trace > 2 then
+ input.logger('? filename',filename)
+ if pathlist then input.logger('? path list',table.concat(pathlist," | ")) end
+ if filelist then input.logger('? file list',table.concat(filelist," | ")) end
+ end
+ -- a bit messy ... esp the doscan setting here
+ for _, path in pairs(pathlist) do
+ if path:find("^!!") then doscan = false else doscan = true end
+ if path:find("//$") then recurse = true else recurse = false end
+ local pathname = path:gsub("^!+", '')
+ done = false
+ -- using file list
+ if filelist and not (done and not instance.allresults) and recurse then
+ -- compare list entries with permitted pattern
+ pathname = pathname:gsub("([%-%.])","%%%1") -- this also influences
+ pathname = pathname:gsub("/+$", '/.*') -- later usage of pathname
+ pathname = pathname:gsub("//", '/.-/')
+ expr = "^" .. pathname
+ -- input.debug('?',expr)
+ for _, f in pairs(filelist) do
+ if f:find(expr) then
+ -- input.debug('T',' '..f)
+ if input.trace > 2 then
+ input.logger('= found in hash',f)
+ end
+ table.insert(result,f)
+ input.aux.register_in_trees(instance,f) -- for tracing used files
+ done = true
+ if not instance.allresults then break end
+ else
+ -- input.debug('F',' '..f)
+ end
+ end
+ end
+ if not done and doscan then
+ -- check if on disk / unchecked / does not work at all
+ if input.method_is_file(pathname) then -- ?
+ local pname = pathname:gsub("%.%*$",'')
+ if not pname:find("%*") then
+ local ppname = pname:gsub("/+$","")
+ if input.aux.can_be_dir(instance,ppname) then
+ for _, w in pairs(wantedfiles) do
+ local fname = file.join(ppname,w)
+ if input.is_readable.file(fname) then
+ if input.trace > 2 then
+ input.logger('= found by scanning',fname)
+ end
+ table.insert(result,fname)
+ done = true
+ if not instance.allresults then break end
+ end
+ end
+ else
+ -- no access needed for non existing path, speedup (esp in large tree with lots of fake)
+ end
+ end
+ end
+ end
+ if not done and doscan then
+ -- todo: slow path scanning
+ end
+ if done and not instance.allresults then break end
+ end
+ end
+ end
+ for k,v in pairs(result) do
+ result[k] = file.collapse_path(v)
+ end
+ if instance.remember then
+ instance.found[stamp] = result
+ end
+ return result
+end
+
+input.aux._find_file_ = input.aux.find_file
+
+function input.aux.find_file(instance,filename) -- maybe make a lowres cache too
+ local result = input.aux._find_file_(instance,filename)
+ if #result == 0 then
+ local lowered = filename:lower()
+ if filename ~= lowered then
+ return input.aux._find_file_(instance,lowered)
+ end
+ end
+ return result
+end
+
+if lfs and lfs.isfile then
+ input.aux.is_file = lfs.isfile -- to be done: use this
+else
+ input.aux.is_file = file.is_readable
+end
+
+if lfs and lfs.isdir then
+ function input.aux.can_be_dir(instance,name)
+ if not instance.fakepaths[name] then
+ if lfs.isdir(name) then
+ instance.fakepaths[name] = 1 -- directory
+ else
+ instance.fakepaths[name] = 2 -- no directory
+ end
+ end
+ return (instance.fakepaths[name] == 1)
+ end
+else
+ function input.aux.can_be_dir()
+ return true
+ end
+end
+
+if not input.concatinators then input.concatinators = { } end
+
+function input.concatinators.tex(tag,path,name)
+ return tag .. '/' .. path .. '/' .. name
+end
+
+input.concatinators.file = input.concatinators.tex
+
+function input.find_files(instance,filename,filetype,mustexist)
+ if type(mustexist) == boolean then
+ -- all set
+ elseif type(filetype) == 'boolean' then
+ filetype, mustexist = nil, false
+ elseif type(filetype) ~= 'string' then
+ filetype, mustexist = nil, false
+ end
+ instance.format = filetype or ''
+ local t = input.aux.find_file(instance,filename,true)
+ instance.format = ''
+ return t
+end
+
+function input.find_file(instance,filename,filetype,mustexist)
+ return (input.find_files(instance,filename,filetype,mustexist)[1] or "")
+end
+
+function input.find_given_files(instance,filename)
+ local bname, result = file.basename(filename), { }
+ for k, hash in pairs(instance.hashes) do
+ local blist = instance.files[hash.tag][bname]
+ if blist then
+ if type(blist) == 'string' then
+ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+ if not instance.allresults then break end
+ else
+ for kk,vv in pairs(blist) do
+ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+ if not instance.allresults then break end
+ end
+ end
+ end
+ end
+ return result
+end
+
+function input.find_given_file(instance,filename)
+ return (input.find_given_files(instance,filename)[1] or "")
+end
+
+--~ function input.find_wildcard_files(instance,filename)
+--~ local result = { }
+--~ local bname, dname = file.basename(filename), file.dirname(filename)
+--~ local expr = dname:gsub("^*/","")
+--~ expr = expr:gsub("*",".*")
+--~ expr = expr:gsub("-","%-")
+--~ for k, hash in pairs(instance.hashes) do
+--~ local blist = instance.files[hash.tag][bname]
+--~ if blist then
+--~ if type(blist) == 'string' then
+--~ -- make function and share code
+--~ if blist:find(expr) then
+--~ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+--~ if not instance.allresults then break end
+--~ end
+--~ else
+--~ for kk,vv in pairs(blist) do
+--~ if vv:find(expr) then
+--~ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+--~ if not instance.allresults then break end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ return result
+--~ end
+
+function input.find_wildcard_files(instance,filename)
+ local result = { }
+ local bname, dname = file.basename(filename), file.dirname(filename)
+ local path = dname:gsub("^*/","")
+ path = path:gsub("*",".*")
+ path = path:gsub("-","%%-")
+ if dname == "" then
+ path = ".*"
+ end
+ local name = bname
+ name = name:gsub("*",".*")
+ name = name:gsub("-","%%-")
+ path = path:lower()
+ name = name:lower()
+ local function doit(blist,bname,hash,allresults)
+ local done = false
+ if blist then
+ if type(blist) == 'string' then
+ -- make function and share code
+ if (blist:lower()):find(path) then
+ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "")
+ done = true
+ end
+ else
+ for kk,vv in pairs(blist) do
+ if (vv:lower()):find(path) then
+ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "")
+ done = true
+ if not allresults then break end
+ end
+ end
+ end
+ end
+ return done
+ end
+ local files, allresults, done = instance.files, instance.allresults, false
+ if name:find("%*") then
+ for k, hash in pairs(instance.hashes) do
+ for kk, hh in pairs(files[hash.tag]) do
+ if (kk:lower()):find(name) then
+ if doit(hh,kk,hash,allresults) then done = true end
+ if done and not allresults then break end
+ end
+ end
+ end
+ else
+ for k, hash in pairs(instance.hashes) do
+ if doit(files[hash.tag][bname],bname,hash,allresults) then done = true end
+ if done and not allresults then break end
+ end
+ end
+ return result
+end
+
+function input.find_wildcard_file(instance,filename)
+ return (input.find_wildcard_files(instance,filename)[1] or "")
+end
+
+-- main user functions
+
+function input.save_used_files_in_trees(instance, filename,jobname)
+ if not filename then filename = 'luatex.jlg' end
+ local f = io.open(filename,'w')
+ if f then
+ f:write("<?xml version='1.0' standalone='yes'?>\n")
+ f:write("<rl:job>\n")
+ if jobname then
+ f:write("\t<rl:name>" .. jobname .. "</rl:name>\n")
+ end
+ f:write("\t<rl:files>\n")
+ for _,v in pairs(table.sortedkeys(instance.foundintrees)) do
+ f:write("\t\t<rl:file n='" .. instance.foundintrees[v] .. "'>" .. v .. "</rl:file>\n")
+ end
+ f:write("\t</rl:files>\n")
+ f:write("</rl:usedfiles>\n")
+ f:close()
+ end
+end
+
+function input.automount(instance)
+ -- implemented later
+end
+
+function input.load(instance)
+ input.start_timing(instance)
+ input.identify_cnf(instance)
+ input.load_cnf(instance)
+ input.expand_variables(instance)
+ input.load_hash(instance)
+ input.automount(instance)
+ input.stop_timing(instance)
+end
+
+function input.for_files(instance, command, files, filetype, mustexist)
+ if files and #files > 0 then
+ local function report(str)
+ if input.verbose then
+ input.report(str) -- has already verbose
+ else
+ print(str)
+ end
+ end
+ if input.verbose then
+ report('')
+ end
+ for _, file in pairs(files) do
+ local result = command(instance,file,filetype,mustexist)
+ if type(result) == 'string' then
+ report(result)
+ else
+ for _,v in pairs(result) do
+ report(v)
+ end
+ end
+ end
+ end
+end
+
+-- strtab
+
+function input.var_value(instance,str) -- output the value of variable $STRING.
+ return input.variable(instance,str)
+end
+function input.expand_var(instance,str) -- output variable expansion of STRING.
+ return input.expansion(instance,str)
+end
+function input.show_path(instance,str) -- output search path for file type NAME
+ return file.join_path(input.expanded_path_list(instance,input.format_of_var(str)))
+end
+
+-- input.find_file(filename)
+-- input.find_file(filename, filetype, mustexist)
+-- input.find_file(filename, mustexist)
+-- input.find_file(filename, filetype)
+
+function input.aux.register_file(files, name, path)
+ if files[name] then
+ if type(files[name]) == 'string' then
+ files[name] = { files[name], path }
+ else
+ files[name] = path
+ end
+ else
+ files[name] = path
+ end
+end
+
+-- zip:: zip## zip://
+-- zip::pathtozipfile::pathinzipfile (also: pathtozipfile/pathinzipfile)
+-- file::name
+-- tex::name
+-- kpse::name
+-- kpse::format::name
+-- parent::n::name
+-- parent::name (default 2)
+
+if not input.finders then input.finders = { } end
+if not input.openers then input.openers = { } end
+if not input.loaders then input.loaders = { } end
+
+input.finders.notfound = { nil }
+input.openers.notfound = { nil }
+input.loaders.notfound = { false, nil, 0 }
+
+function input.splitmethod(filename)
+ local method, specification = filename:match("^(.-)##(.+)$")
+ if method and specification then
+ return method, specification
+ else
+ return 'tex', filename
+ end
+end
+
+function input.method_is_file(filename)
+ local method, specification = input.splitmethod(filename)
+ return method == 'tex' or method == 'file'
+end
+
+function input.methodhandler(what, instance, filename, filetype) -- ...
+ local method, specification = input.splitmethod(filename)
+ if method and specification then -- redundant
+ if input[what][method] then
+ input.logger('= handler',filename.." -> "..what.." | "..method.." | "..specification)
+ return input[what][method](instance,specification,filetype)
+ else
+ return nil
+ end
+ else
+ return input[what].tex(instance,filename,filetype)
+ end
+end
+
+-- also inside next test?
+
+function input.findtexfile(instance, filename, filetype)
+ return input.methodhandler('finders',instance, input.normalize_name(filename), filetype)
+end
+function input.opentexfile(instance,filename)
+ return input.methodhandler('openers',instance, input.normalize_name(filename))
+end
+
+function input.findbinfile(instance, filename, filetype)
+ return input.methodhandler('finders',instance, input.normalize_name(filename), filetype)
+end
+function input.openbinfile(instance,filename)
+ return input.methodhandler('loaders',instance, input.normalize_name(filename))
+end
+
+function input.loadbinfile(instance, filename, filetype)
+ local fname = input.findbinfile(instance, input.normalize_name(filename), filetype)
+ if fname and fname ~= "" then
+ return input.openbinfile(instance,fname)
+ else
+ return unpack(input.loaders.notfound)
+ end
+end
+
+function input.texdatablob(instance, filename, filetype)
+ local ok, data, size = input.loadbinfile(instance, filename, filetype)
+ return data or ""
+end
+
+function input.openfile(filename) -- brrr texmf.instance here / todo ! ! ! ! !
+ local fullname = input.findtexfile(texmf.instance, filename)
+ if fullname and (fullname ~= "") then
+ return input.opentexfile(texmf.instance, fullname)
+ else
+ return nil
+ end
+end
+
+function input.logmode()
+ return (os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"):lower()
+end
+
+-- this is a prelude to engine/progname specific configuration files
+-- in which case we can omit files meant for other programs and
+-- packages
+
+--- ctx
+
+-- maybe texinputs + font paths
+-- maybe positive selection tex/context fonts/tfm|afm|vf|opentype|type1|map|enc
+
+input.validators = { }
+input.validators.visibility = { }
+
+function input.validators.visibility.default(path, name)
+ return true
+end
+
+function input.validators.visibility.context(path, name)
+ path = path[1] or path -- some day a loop
+ return not (
+ path:find("latex") or
+ path:find("doc") or
+ path:find("tex4ht") or
+ path:find("source") or
+-- path:find("config") or
+-- path:find("metafont") or
+ path:find("lists$") or
+ name:find("%.tpm$") or
+ name:find("%.bak$")
+ )
+end
+
+-- todo: describe which functions are public (maybe input.private. ... )
+
+-- beware: i need to check where we still need a / on windows:
+
+function input.clean_path(str)
+ -- return string.gsub(string.gsub(string.gsub(str,"\\","/"),"^!+",""),"//$","/")
+ return (string.gsub(string.gsub(str,"\\","/"),"^!+",""))
+end
+function input.do_with_path(name,func)
+ for _, v in pairs(input.expanded_path_list(instance,name)) do
+ func("^"..input.clean_path(v))
+ end
+end
+function input.do_with_var(name,func)
+ func(input.aux.expanded_var(name))
+end
+
+function input.with_files(instance,pattern,handle)
+ for _, hash in pairs(instance.hashes) do
+ local blobpath = hash.tag
+ local blobtype = hash.type
+ if blobpath and instance.files[blobpath] then -- sort them?
+ for k,v in pairs(instance.files[blobpath]) do
+ if k:find(pattern) then
+ if type(v) == "string" then
+ handle(blobtype,blobpath,v,k)
+ else
+ for _,vv in pairs(v) do
+ handle(blobtype,blobpath,vv,k)
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+ newname = file.addsuffix(newname,"lua")
+ newscript = input.clean_path(input.find_file(instance, newname))
+ oldscript = input.clean_path(oldname)
+ input.report("old script", oldscript)
+ input.report("new script", newscript)
+ if oldscript ~= newscript and (oldscript:find(file.removesuffix(newname).."$") or oldscript:find(newname.."$")) then
+ newdata = io.loaddata(newscript)
+ if newdata then
+ input.report("old script content replaced by new content")
+ io.savedata(oldscript,newdata)
+ end
+ end
+end
diff --git a/tex/context/base/luat-iop.lua b/tex/context/base/luat-iop.lua
new file mode 100644
index 000000000..469b7c034
--- /dev/null
+++ b/tex/context/base/luat-iop.lua
@@ -0,0 +1,157 @@
+-- filename : luat-iop.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- this paranoid stuff in web2c ... we cannot hook checks into the
+-- input functions because one can always change the callback but
+-- we can feed back specific patterns and paths into the next
+-- mechanism
+
+if not versions then versions = { } end versions['luat-exe'] = 1.001
+
+if not io.inp then io.inp = { } end
+if not io.out then io.out = { } end
+
+io.inp.blocked = { }
+io.out.blocked = { }
+io.inp.permitted = { }
+io.out.permitted = { }
+io.inp.modes = { } -- functions
+io.out.modes = { } -- functions
+
+io.blocked_openers = { } -- *.open(name,method)
+
+function io.inp.inhibit (name) table.insert(io.inp.blocked, name) end
+function io.out.inhibit (name) table.insert(io.out.blocked, name) end
+function io.inp.permit (name) table.insert(io.inp.permitted, name) end
+function io.out.permit (name) table.insert(io.out.permitted, name) end
+
+function io.register_opener(func) table.insert(io.blocked_openers, func) end
+
+function io.finalize_openers(func)
+ if (#io.out.blocked > 0) or (#io.inp.blocked > 0) then
+ do
+ local open = func
+ local out_permitted = io.out.permitted
+ local inp_permitted = io.inp.permitted
+ local out_blocked = io.out.blocked
+ local inp_blocked = io.inp.blocked
+ return function(name,method)
+ local function checked(blocked, permitted)
+ local n = string.lower(name)
+ for _,b in pairs(blocked) do
+ if string.find(n,b) then
+ for _,p in pairs(permitted) do
+ if string.find(n,p) then
+ return true
+ end
+ end
+ return false
+ end
+ end
+ return true
+ end
+ if method and string.find(method,'[wa]') then
+ if #out.blocked > 0 then
+ if not checked(out_blocked, out_permitted) then
+ -- print("writing to " .. name .. " is not permitted")
+ return nil
+ end
+ end
+ else
+ if #inp.blocked > 0 then
+ if not checked(inp_blocked, inp_permitted) then
+ -- print("reading from " .. name .. " is not permitted")
+ return nil
+ end
+ end
+ end
+ return open(name,method)
+ end
+ end
+ else
+ return func
+ end
+end
+
+--~ io.inp.inhibit('^%.')
+--~ io.inp.inhibit('^/etc')
+--~ io.inp.inhibit('/windows/')
+--~ io.inp.inhibit('/winnt/')
+--~ io.inp.permit('c:/windows/wmsetup.log')
+
+--~ io.open = io.finalize_openers(io.open)
+
+--~ f = io.open('.tex') print(f)
+--~ f = io.open('tufte.tex') print(f)
+--~ f = io.open('t:/sources/tufte.tex') print(f)
+--~ f = io.open('/etc/passwd') print(f)
+--~ f = io.open('c:/windows/crap.log') print(f)
+--~ f = io.open('c:/windows/wmsetup.log') print(f)
+
+function io.set_opener_modes(i,o)
+ for _,v in pairs({'inp','out'}) do
+ if io[v][i] then
+ io[v][i]()
+ elseif io[v][string.sub(i,1,1)] then
+ io[v][string.sub(i,1,1)]()
+ end
+ end
+ io.open = io.finalize_openers(io.open)
+end
+
+function io.set_opener_modes(i,o)
+ local f
+ for _,v in pairs({'inp','out'}) do
+ f = io[v][i] or io[v][string.sub(i,1,1)]
+ if f then f() end
+ end
+ io.open = io.finalize_openers(io.open)
+end
+
+-- restricted
+
+function io.inp.modes.restricted()
+ io.inp.inhibit('^%.[%a]')
+end
+function io.out.modes.restricted()
+ io.out.inhibit('^%.[%a]')
+end
+
+-- paranoid
+
+function io.inp.modes.paranoid()
+ io.inp.inhibit('.*')
+ io.inp.inhibit('%.%.')
+ io.inp.permit('^%./')
+ io.inp.permit('[^/]')
+ input.do_with_path('TEXMF',io.inp.permit)
+end
+function io.out.modes.paranoid()
+ io.out.inhibit('.*')
+ input.do_with_path('TEXMFOUTPUT',io.out.permit)
+end
+
+-- handy
+
+function io.inp.modes.handy()
+ io.inp.inhibit('%.%.')
+ if os.platform == 'linux' then
+ io.inp.inhibit('^/etc')
+ else
+ io.inp.inhibit('/windows/')
+ io.inp.inhibit('/winnt/')
+ end
+end
+function io.out.modes.handy()
+ io.out.inhibit('.*')
+ io.out.permit('%./')
+ io.out.permit('^%./')
+ io.out.permit('[^/]')
+end
+
+--~ io.set_opener_modes('p','p')
+--~ io.set_opener_modes('r','r')
+--~ io.set_opener_modes('h','h')
diff --git a/tex/context/base/luat-kps.lua b/tex/context/base/luat-kps.lua
new file mode 100644
index 000000000..15dadbb84
--- /dev/null
+++ b/tex/context/base/luat-kps.lua
@@ -0,0 +1,102 @@
+if not modules then modules = { } end modules ['luat-kps'] = {
+ version = 1.001,
+ comment = "companion to luatools.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This file is used when we want the input handlers to behave like
+<type>kpsewhich</type>. What to do with the following:</p>
+
+<typing>
+{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
+$SELFAUTOLOC : /usr/tex/bin/platform
+$SELFAUTODIR : /usr/tex/bin
+$SELFAUTOPARENT : /usr/tex
+</typing>
+
+<p>How about just forgetting abou them?</p>
+--ldx]]--
+
+input = input or { }
+input.suffixes = input.suffixes or { }
+input.formats = input.formats or { }
+
+input.suffixes['gf'] = { '<resolution>gf' }
+input.suffixes['pk'] = { '<resolution>pk' }
+input.suffixes['base'] = { 'base' }
+input.suffixes['bib'] = { 'bib' }
+input.suffixes['bst'] = { 'bst' }
+input.suffixes['cnf'] = { 'cnf' }
+input.suffixes['mem'] = { 'mem' }
+input.suffixes['mf'] = { 'mf' }
+input.suffixes['mfpool'] = { 'pool' }
+input.suffixes['mft'] = { 'mft' }
+input.suffixes['mppool'] = { 'pool' }
+input.suffixes['graphic/figure'] = { 'eps', 'epsi' }
+input.suffixes['texpool'] = { 'pool' }
+input.suffixes['PostScript header'] = { 'pro' }
+input.suffixes['ist'] = { 'ist' }
+input.suffixes['web'] = { 'web', 'ch' }
+input.suffixes['cweb'] = { 'w', 'web', 'ch' }
+input.suffixes['cmap files'] = { 'cmap' }
+input.suffixes['lig files'] = { 'lig' }
+input.suffixes['bitmap font'] = { }
+input.suffixes['MetaPost support'] = { }
+input.suffixes['TeX system documentation'] = { }
+input.suffixes['TeX system sources'] = { }
+input.suffixes['dvips config'] = { }
+input.suffixes['type42 fonts'] = { }
+input.suffixes['web2c files'] = { }
+input.suffixes['other text files'] = { }
+input.suffixes['other binary files'] = { }
+input.suffixes['opentype fonts'] = { 'otf' }
+
+input.suffixes['fmt'] = { 'fmt' }
+input.suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
+
+input.suffixes['pdftex config'] = { }
+input.suffixes['Troff fonts'] = { }
+
+input.suffixes['ls-R'] = { }
+
+--[[ldx--
+<p>If you wondered abou tsome of the previous mappings, how about
+the next bunch:</p>
+--ldx]]--
+
+input.formats['bib'] = ''
+input.formats['bst'] = ''
+input.formats['mft'] = ''
+input.formats['ist'] = ''
+input.formats['web'] = ''
+input.formats['cweb'] = ''
+input.formats['MetaPost support'] = ''
+input.formats['TeX system documentation'] = ''
+input.formats['TeX system sources'] = ''
+input.formats['Troff fonts'] = ''
+input.formats['dvips config'] = ''
+input.formats['graphic/figure'] = ''
+input.formats['ls-R'] = ''
+input.formats['other text files'] = ''
+input.formats['other binary files'] = ''
+
+input.formats['gf'] = ''
+input.formats['pk'] = ''
+input.formats['base'] = 'MFBASES'
+input.formats['cnf'] = ''
+input.formats['mem'] = 'MPMEMS'
+input.formats['mf'] = 'MFINPUTS'
+input.formats['mfpool'] = 'MFPOOL'
+input.formats['mppool'] = 'MPPOOL'
+input.formats['texpool'] = 'TEXPOOL'
+input.formats['PostScript header'] = 'TEXPSHEADERS'
+input.formats['cmap files'] = 'CMAPFONTS'
+input.formats['type42 fonts'] = 'T42FONTS'
+input.formats['web2c files'] = 'WEB2C'
+input.formats['pdftex config'] = 'PDFTEXCONFIG'
+input.formats['texmfscripts'] = 'TEXMFSCRIPTS'
+input.formats['bitmap font'] = ''
+input.formats['lig files'] = 'LIGFONTS'
diff --git a/tex/context/base/luat-lib.lua b/tex/context/base/luat-lib.lua
new file mode 100644
index 000000000..16c573ded
--- /dev/null
+++ b/tex/context/base/luat-lib.lua
@@ -0,0 +1,144 @@
+-- filename : luat-lib.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-lib'] = 1.001
+
+-- mostcode moved to the l-*.lua and other luat-*.lua files
+
+-- os / io
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+-- os.platform
+
+-- mswin|bccwin|mingw|cygwin windows
+-- darwin|rhapsody|nextstep macosx
+-- netbsd|unix unix
+-- linux linux
+
+if not io.fileseparator then
+ if string.find(os.getenv("PATH"),";") then
+ io.fileseparator, io.pathseparator, os.platform = "\\", ";", "windows"
+ else
+ io.fileseparator, io.pathseparator, os.platform = "/" , ":", "unix"
+ end
+end
+
+if not os.platform then
+ if io.pathseparator == ";" then
+ os.platform = "windows"
+ else
+ os.platform = "unix"
+ end
+end
+
+-- arg normalization
+--
+-- for k,v in pairs(arg) do print(k,v) end
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
+end
+
+-- environment
+
+if not environment then environment = { } end
+
+environment.arguments = { }
+environment.files = { }
+environment.sorted_argument_keys = nil
+
+environment.platform = os.platform
+
+function environment.initialize_arguments(arg)
+ environment.arguments = { }
+ environment.files = { }
+ environment.sorted_argument_keys = nil
+ for index, argument in pairs(arg) do
+ if index > 0 then
+ local flag, value = argument:match("^%-+(.+)=(.-)$")
+ if flag then
+ environment.arguments[flag] = string.unquote(value or "")
+ else
+ flag = argument:match("^%-+(.+)")
+ if flag then
+ environment.arguments[flag] = true
+ else
+ environment.files[#environment.files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.showarguments()
+ for k,v in pairs(environment.arguments) do
+ print(k .. " : " .. tostring(v))
+ end
+ if #environment.files > 0 then
+ print("files : " .. table.concat(environment.files, " "))
+ end
+end
+
+function environment.argument(name)
+ if environment.arguments[name] then
+ return environment.arguments[name]
+ else
+ if not environment.sorted_argument_keys then
+ environment.sorted_argument_keys = { }
+ for _,v in pairs(table.sortedkeys(environment.arguments)) do
+ table.insert(environment.sorted_argument_keys, "^" .. v)
+ end
+ end
+ for _,v in pairs(environment.sorted_argument_keys) do
+ if name:find(v) then
+ return environment.arguments[v:sub(2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+function environment.split_arguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ for _,v in ipairs(environment.original_arguments) do
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstruct_commandline(arg)
+ if not arg then arg = environment.original_arguments end
+ local result = { }
+ for _,a in ipairs(arg) do -- ipairs 1 .. #n
+ local kk, vv = a:match("^(%-+.-)=(.+)$")
+ if kk and vv then
+ if vv:find(" ") then
+ result[#result+1] = kk .. "=" .. string.quote(vv)
+ else
+ result[#result+1] = a
+ end
+ elseif a:find(" ") then
+ result[#result+1] = string.quote(a)
+ else
+ result[#result+1] = a
+ end
+ end
+ return table.join(result," ")
+end
+
+if arg then
+ environment.initialize_arguments(arg)
+ environment.original_arguments = arg
+ arg = { } -- prevent duplicate handling
+end
diff --git a/tex/context/base/luat-lib.tex b/tex/context/base/luat-lib.tex
new file mode 100644
index 000000000..6c5c63227
--- /dev/null
+++ b/tex/context/base/luat-lib.tex
@@ -0,0 +1,86 @@
+%D \module
+%D [ file=luat-lib,
+%D version=2006.09.11,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Unicode Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \writestatus{loading}{Lua Support Macros (libs)}
+
+%D For the moment we only load this lib.
+
+%D This will move cq. become configurable. The XML like output is just
+%D an example.
+
+% todo \let\normaleverytoks\everytoks \newtoks\everytoke \normaleverytoks{\the\everytoks}
+
+\chardef\statuswidth=15
+\chardef\statuswrite=16
+
+\newtoks\everywritestring
+
+\def\writedirect {\immediate\write\statuswrite}
+\def\writeline {\writedirect{}}
+\def\writestring#1{\begingroup\the\everywritestring\writedirect{#1}\endgroup}
+
+\ifx\normalmessage \undefined \let\normalmessage \message \fi
+\ifx\normalwritestatus\undefined \def\normalwritestatus#1#2{\writedirect{#1 : #2}} \fi
+
+% this will change once we have proper write overloads
+
+\registerctxluafile{l-string} {1.001}
+\registerctxluafile{l-boolean}{1.001}
+\registerctxluafile{l-number} {1.001}
+\registerctxluafile{l-math} {1.001}
+\registerctxluafile{l-table} {1.001}
+\registerctxluafile{l-md5} {1.001}
+\registerctxluafile{l-aux} {1.001}
+\registerctxluafile{l-io} {1.001}
+\registerctxluafile{l-os} {1.001}
+\registerctxluafile{l-file} {1.001}
+\registerctxluafile{l-dir} {1.001}
+\registerctxluafile{l-unicode}{1.001}
+\registerctxluafile{l-utils} {1.001}
+\registerctxluafile{l-tex} {1.001}
+\registerctxluafile{l-xml} {1.001}
+\registerctxluafile{l-xmlctx} {1.001}
+
+\registerctxluafile{luat-cbk} {1.001}
+\registerctxluafile{luat-lib} {1.001}
+\registerctxluafile{luat-inp} {1.001}
+\registerctxluafile{luat-log} {1.001}
+\registerctxluafile{luat-zip} {1.001}
+\registerctxluafile{luat-tex} {1.001}
+
+\startruntimeluacode
+ \edef\asciia{\ctxlua{tex.sprint(input.logmode())}}
+ \edef\asciib{xml}
+ \ifx\asciia\asciib % brrr
+ \long\def\writebanner #1{\writestring {<m t='banner'>#1</m>}}
+ \long\def\writestatus#1#2{\writestring {<m t='#1'>#2</m>}}
+ \long\def\message #1{\normalmessage{<m t='message'>#1</m>}}
+ \else
+ \let\writebanner\writestring
+ \let\writestatus\normalwritestatus
+ \let\message \normalmessage
+ \fi
+\stopruntimeluacode
+
+\registerctxluafile{luat-tmp}{1.001}
+\registerctxluafile{luat-crl}{1.001}
+\registerctxluafile{luat-exe}{1.001}
+\registerctxluafile{luat-iop}{1.001}
+
+% trace used files (only from trees)
+%
+% \ctxlua{input.register_stop_actions(function() input.save_used_files_in_trees(texmf.instance) end)}
+% \ctxlua{table.insert(input.stop_actions, function() input.save_used_files_in_trees(texmf.instance) end)}
+% \ctxlua{function input.stop_actions.trace_used_files() input.save_used_files_in_trees(texmf.instance) end}
+
+\endinput
diff --git a/tex/context/base/luat-lmx.lua b/tex/context/base/luat-lmx.lua
new file mode 100644
index 000000000..817506220
--- /dev/null
+++ b/tex/context/base/luat-lmx.lua
@@ -0,0 +1,139 @@
+-- filename : luat-lmx.lua
+-- comment : companion to luat-lmx.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-mlx'] = 1.001
+
+lmx = { }
+
+lmx.escapes = {
+ ['&'] = '&amp;',
+ ['<'] = '&lt;',
+ ['>'] = '&gt;',
+ ['"'] = '&quot;'
+}
+
+-- local function p -> ends up in lmx.p, so we need to cast
+
+lmx.variables = { }
+
+lmx.variables['title-default'] = 'LMX File'
+lmx.variables['title'] = lmx.variables['title-default']
+
+-- demonstrates: local, *all, gsub using tables, nil or value, loadstring
+
+function lmx.loadedfile(filename)
+ return input.texdatablob(texmf.instance, filename)
+end
+
+lmx.converting = false
+
+function lmx.convert(template,result) -- use lpeg instead
+ if not lmx.converting then -- else, if error then again tex error and loop
+ local data = input.texdatablob(texmf.instance, template)
+ local f = false
+ if result then
+ f = io.open(result,"w")
+ function lmx.print(str) f:write(str) end
+ else
+ lmx.print = io.write
+ end
+ function lmx.variable(str)
+ return lmx.variables[str] or ""
+ end
+ function lmx.escape(str)
+ return string.gsub(string.gsub(str,'&','&amp;'),'[<>"]',lmx.escapes)
+ end
+ function lmx.type(str)
+ if str then lmx.print("<tt>" .. lmx.escape(str) .. "</tt>") end
+ end
+ function lmx.pv(str)
+ lmx.print(lmx.variable(str))
+ end
+ function lmx.tv(str)
+ lmx.type(lmx.variable(str))
+ end
+ data = string.gsub(data, "<%?lmx%-include%s+(.-)%s-%?>", function(filename)
+ return lmx.loadedfile(filename)
+ end)
+ local definitions = { }
+ data = string.gsub(data, "<%?lmx%-define%-begin%s+(%S-)%s-%?>(.-)<%?lmx%-define%-end%s-%?>", function(tag,content)
+ definitions[tag] = content
+ return ""
+ end)
+ data = string.gsub(data, "<%?lmx%-resolve%s+(%S-)%s-%?>", function(tag)
+ return definitions[tag] or ""
+ end)
+ data = string.gsub(data, "%c%s-(<%?lua .-%?>)%s-%c", function(lua)
+ return "\n" .. lua .. " "
+ end)
+ data = string.gsub(data .. "<?lua ?>","(.-)<%?lua%s+(.-)%?>", function(txt, lua)
+ txt = txt:gsub("%c+", "\\n")
+ txt = txt:gsub('"' , '\\"')
+ txt = txt:gsub("'" , "\\'")
+ -- txt = string.gsub(txt, "([\'\"])", { ["'"] = '\\"', ['"'] = "\\'" } )
+ return "p(\"" .. txt .. "\")\n" .. lua .. "\n"
+ end)
+ lmx.converting = true
+ data = "local p,v,e,t,pv,tv = lmx.print,lmx.variable,lmx.escape,lmx.type,lmx.pv,lmx.tv " .. data
+ assert(loadstring(data))()
+ lmx.converting = false
+ if f then
+ f:close()
+ end
+ end
+end
+
+-- these can be overloaded; we assume that the os handles filename associations
+
+lmx.lmxfile = function(filename) return filename end
+lmx.htmfile = function(filename) return filename end
+
+if environment.platform == "windows" then
+ lmx.popupfile = function(filename) os.execute("start " .. filename) end
+else
+ lmx.popupfile = function(filename) os.execute(filename) end
+end
+
+function lmx.show(name)
+ local lmxfile = lmx.lmxfile(name)
+ local htmfile = lmx.htmfile(name)
+ if lmxfile == htmfile then
+ htmfile = string.gsub(lmxfile, "%.%a+$", "html")
+ end
+ lmx.convert(lmxfile, htmfile)
+ lmx.popupfile(htmfile)
+end
+
+-- kind of private
+
+lmx.restorables = { }
+
+function lmx.set(key, value)
+ if not lmx.restorables[key] then
+ table.insert(lmx.restorables, key)
+ lmx.variables['@@' .. key] = lmx.variables[key]
+ end
+ lmx.variables[key] = value
+end
+
+function lmx.get(key)
+ return lmx.variables[key] or ""
+end
+
+function lmx.restore()
+ for _,key in pairs(lmx.restorables) do
+ lmx.variables[key] = lmx.variables['@@' .. key]
+ end
+ lmx.restorables = { }
+end
+
+-- command line
+
+if arg then
+ if arg[1] == "--show" then if arg[2] then lmx.show (arg[2]) end
+ elseif arg[1] == "--convert" then if arg[2] then lmx.convert(arg[2], arg[3] or "temp.html") end
+ end
+end
diff --git a/tex/context/base/luat-lmx.tex b/tex/context/base/luat-lmx.tex
new file mode 100644
index 000000000..cc7fa448f
--- /dev/null
+++ b/tex/context/base/luat-lmx.tex
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=luat-lmx,
+%D version=2005.09.02,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=LMX Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Lua Support Macros (lmx)}
+
+\registerctxluafile{luat-lmx}{1.001}
diff --git a/tex/context/base/luat-log.lua b/tex/context/base/luat-log.lua
new file mode 100644
index 000000000..faecf7e29
--- /dev/null
+++ b/tex/context/base/luat-log.lua
@@ -0,0 +1,123 @@
+if not modules then modules = { } end modules ['luat-log'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This is a prelude to a more extensive logging module. For the sake
+of parsing log files, in addition to the standard logging we will
+provide an <l n='xml'/> structured file. Actually, any logging that
+is hooked into callbacks will be \XML\ by default.</p>
+--ldx]]--
+
+input = input or { }
+logs = logs or { }
+
+--[[ldx--
+<p>This looks pretty ugly but we need to speed things up a bit.</p>
+--ldx]]--
+
+logs.levels = {
+ ['error'] = 1,
+ ['warning'] = 2,
+ ['info'] = 3,
+ ['debug'] = 4
+}
+
+logs.functions = {
+ 'error', 'warning', 'info', 'debug', 'report',
+ 'start', 'stop', 'push', 'pop'
+}
+
+logs.callbacks = {
+ 'start_page_number',
+ 'stop_page_number',
+ 'report_output_pages',
+ 'report_output_log'
+}
+
+logs.xml = logs.xml or { }
+logs.tex = logs.tex or { }
+
+logs.level = 0
+
+do
+ local write_nl, write, format = texio.write_nl or print, texio.write or print, string.format
+
+ function logs.xml.debug(category,str)
+ if logs.level > 3 then write_nl(format("<d category='%s'>%s</d>",category,str)) end
+ end
+ function logs.xml.info(category,str)
+ if logs.level > 2 then write_nl(format("<i category='%s'>%s</i>",category,str)) end
+ end
+ function logs.xml.warning(category,str)
+ if logs.level > 1 then write_nl(format("<w category='%s'>%s</w>",category,str)) end
+ end
+ function logs.xml.error(category,str)
+ if logs.level > 0 then write_nl(format("<e category='%s'>%s</e>",category,str)) end
+ end
+ function logs.xml.report(category,str)
+ write_nl(format("<r category='%s'>%s</r>",category,str))
+ end
+
+ function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
+ function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
+ function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
+ function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
+
+ function logs.tex.debug(category,str)
+ if logs.level > 3 then write_nl(format("debug >> %s: %s" ,category,str)) end
+ end
+ function logs.tex.info(category,str)
+ if logs.level > 2 then write_nl(format("info >> %s: %s" ,category,str)) end
+ end
+ function logs.tex.warning(category,str)
+ if logs.level > 1 then write_nl(format("warning >> %s: %s",category,str)) end
+ end
+ function logs.tex.error(category,str)
+ if logs.level > 0 then write_nl(format("error >> %s: %s" ,category,str)) end
+ end
+ function logs.tex.report(category,str)
+ write_nl(format("report >> %s: %s" ,category,str))
+ end
+
+ function logs.set_level(level)
+ logs.level = logs.levels[level] or level
+ end
+
+ function logs.set_method(method)
+ for _, v in pairs(logs.functions) do
+ logs[v] = logs[method][v] or function() end
+ end
+ if callback and input[method] then
+ for _, cb in pairs(logs.callbacks) do
+ callback.register(cb, input[method][cb])
+ end
+ end
+ end
+
+ function logs.xml.start_page_number()
+ write_nl(format("<p real='%s' page='%s' sub='%s'", tex.count[0], tex.count[1], tex.count[2]))
+ end
+
+ function logs.xml.stop_page_number()
+ write("/>")
+ write_nl("")
+ end
+
+ function logs.xml.report_output_pages(p,b)
+ write_nl(format("<v k='pages' v='%s'/>", p))
+ write_nl(format("<v k='bytes' v='%s'/>", b))
+ write_nl("")
+ end
+
+ function logs.xml.report_output_log()
+ end
+
+end
+
+logs.set_level('error')
+logs.set_method('tex')
diff --git a/tex/context/base/luat-tex.lua b/tex/context/base/luat-tex.lua
new file mode 100644
index 000000000..8e770f9de
--- /dev/null
+++ b/tex/context/base/luat-tex.lua
@@ -0,0 +1,389 @@
+-- filename : luat-zip.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-tex'] = 1.001
+
+-- special functions that deal with io
+
+if texconfig and not texlua then
+
+ input.level = input.level or 0
+
+ if input.logmode() == 'xml' then
+ function input.show_open(name)
+ input.level = input.level + 1
+ texio.write_nl("<f l='"..input.level.."' n='"..name.."'>")
+ end
+ function input.show_close(name)
+ texio.write("</f> ")
+ input.level = input.level - 1
+ end
+ function input.show_load(name)
+ texio.write_nl("<f l='"..(input.level+1).."' n='"..name.."'/>") -- level?
+ end
+ else
+ function input.show_open () end
+ function input.show_close() end
+ function input.show_load () end
+ end
+
+ function input.finders.generic(instance,tag,filename,filetype)
+ local foundname = input.find_file(instance,filename,filetype)
+ if foundname and foundname ~= "" then
+ input.logger('+ ' .. tag .. ' finder',filename,'filetype')
+ return foundname
+ else
+ input.logger('- ' .. tag .. ' finder',filename,'filetype')
+ return unpack(input.finders.notfound)
+ end
+ end
+
+ input.filters.dynamic_translator = nil
+ input.filters.frozen_translator = nil
+ input.filters.utf_translator = nil
+
+ function input.openers.text_opener(filename,file_handle,tag)
+ local u = unicode.utftype(file_handle)
+ local t = { }
+ if u > 0 then
+ input.logger('+ ' .. tag .. ' opener (' .. unicode.utfname[u] .. ')',filename)
+ local l
+ if u > 2 then
+ l = unicode.utf32_to_utf8(file_handle:read("*a"),u==4)
+ else
+ l = unicode.utf16_to_utf8(file_handle:read("*a"),u==2)
+ end
+ file_handle:close()
+ t = {
+ utftype = u, -- may go away
+ lines = l,
+ current = 0,
+ handle = nil,
+ noflines = #l,
+ close = function()
+ input.logger('= ' .. tag .. ' closer (' .. unicode.utfname[u] .. ')',filename)
+ input.show_close(filename)
+ end,
+ reader = function(self)
+ if not self then self = t end
+ if self.current >= #self.lines then
+ return nil
+ else
+ self.current = self.current + 1
+ if input.filters.utf_translator then
+ return input.filters.utf_translator(self.lines[t.current])
+ else
+ return self.lines[self.current]
+ end
+ end
+ end
+ }
+ else
+ input.logger('+ ' .. tag .. ' opener',filename)
+ -- todo: file;name -> freeze / eerste regel scannen -> freeze
+ t = {
+ reader = function(self)
+ if not self then self = t end -- not used
+ if input.filters.dynamic_translator then
+ return input.filters.dynamic_translator(file_handle:read())
+ elseif input.filters.utf_translator then
+ return input.filters.utf_translator(file_handle:read())
+ else
+ return file_handle:read()
+ end
+ end,
+ close = function()
+ input.logger('= ' .. tag .. ' closer',filename)
+ input.show_close(filename)
+ file_handle:close()
+ end,
+ handle = function()
+ return file_handle
+ end,
+ noflines = function()
+ t.noflines = io.noflines(file_handle)
+ return t.noflines
+ end
+ }
+ end
+ return t
+ end
+
+ function input.openers.generic(instance,tag,filename)
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ input.show_open(filename)
+ return input.openers.text_opener(filename,f,tag)
+ end
+ end
+ input.logger('- ' .. tag .. ' opener',filename)
+ return unpack(input.openers.notfound)
+ end
+
+ function input.loaders.generic(instance,tag,filename)
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ input.show_load(filename)
+ input.logger('+ ' .. tag .. ' loader',filename)
+ local s = f:read("*a")
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ input.logger('- ' .. tag .. ' loader',filename)
+ return unpack(input.loaders.notfound)
+ end
+
+ function input.finders.tex(instance,filename,filetype)
+ return input.finders.generic(instance,'tex',filename,filetype)
+ end
+ function input.openers.tex(instance,filename)
+ return input.openers.generic(instance,'tex',filename)
+ end
+ function input.loaders.tex(instance,filename)
+ return input.loaders.generic(instance,'tex',filename)
+ end
+
+end
+
+-- callback into the file io and related things; disabling kpse
+
+if texconfig and not texlua then
+
+ texconfig.kpse_init = false
+ texconfig.trace_file_names = input.logmode() == 'tex'
+ texconfig.max_print_line = 100000
+
+ -- if still present, we overload kpse (put it off-line so to say)
+
+ if not texmf then texmf = { } end
+
+ if not texmf.instance then
+
+ if not texmf.instance then -- prevent a second loading
+
+ texmf.instance = input.reset()
+ texmf.instance.progname = environment.progname or 'context'
+ texmf.instance.engine = environment.engine or 'luatex'
+ texmf.instance.validfile = input.validctxfile
+
+ input.load(texmf.instance)
+
+ end
+
+ if callback then
+ callback.register('find_read_file' , function(id,name) return input.findtexfile(texmf.instance,name) end)
+ callback.register('open_read_file' , function( name) return input.opentexfile(texmf.instance,name) end)
+ end
+
+ if callback then
+ callback.register('find_data_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end)
+ callback.register('find_enc_file' , function(name) return input.findbinfile(texmf.instance,name,"enc") end)
+ callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"tfm") end)
+ callback.register('find_format_file' , function(name) return input.findbinfile(texmf.instance,name,"fmt") end)
+ callback.register('find_image_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end)
+ callback.register('find_map_file' , function(name) return input.findbinfile(texmf.instance,name,"map") end)
+ callback.register('find_ocp_file' , function(name) return input.findbinfile(texmf.instance,name,"ocp") end)
+ callback.register('find_opentype_file' , function(name) return input.findbinfile(texmf.instance,name,"otf") end)
+ callback.register('find_output_file' , function(name) return name end)
+ callback.register('find_pk_file' , function(name) return input.findbinfile(texmf.instance,name,"pk") end)
+ callback.register('find_sfd_file' , function(name) return input.findbinfile(texmf.instance,name,"sfd") end)
+ callback.register('find_truetype_file' , function(name) return input.findbinfile(texmf.instance,name,"ttf") end)
+ callback.register('find_type1_file' , function(name) return input.findbinfile(texmf.instance,name,"pfb") end)
+ callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"vf") end)
+
+ callback.register('read_data_file' , function(file) return input.loadbinfile(texmf.instance,file,"tex") end)
+ callback.register('read_enc_file' , function(file) return input.loadbinfile(texmf.instance,file,"enc") end)
+ callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"tfm") end)
+ -- format
+ -- image
+ callback.register('read_map_file' , function(file) return input.loadbinfile(texmf.instance,file,"map") end)
+ callback.register('read_ocp_file' , function(file) return input.loadbinfile(texmf.instance,file,"ocp") end)
+ callback.register('read_opentype_file' , function(file) return input.loadbinfile(texmf.instance,file,"otf") end)
+ -- output
+ callback.register('read_pk_file' , function(file) return input.loadbinfile(texmf.instance,file,"pk") end)
+ callback.register('read_sfd_file' , function(file) return input.loadbinfile(texmf.instance,file,"sfd") end)
+ callback.register('read_truetype_file' , function(file) return input.loadbinfile(texmf.instance,file,"ttf") end)
+ callback.register('read_type1_file' , function(file) return input.loadbinfile(texmf.instance,file,"pfb") end)
+ callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"vf" ) end)
+ end
+
+ if callback and environment.aleph_mode then
+ callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"ofm") end)
+ callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"ofm") end)
+ callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"ovf") end)
+ callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"ovf") end)
+ end
+
+ if callback then
+ callback.register('find_write_file' , function(id,name) return name end)
+ end
+
+ if callback and (not config or (#config == 0)) then
+ callback.register('find_format_file' , function(name) return name end)
+ end
+
+ if callback and false then
+ for k, v in pairs(callback.list()) do
+ if not v then texio.write_nl("<w>callback "..k.." is not set</w>") end
+ end
+ end
+
+ if callback then
+
+ input.start_actions = { }
+ input.stop_actions = { }
+
+ function input.register_start_actions(f) table.insert(input.start_actions, f) end
+ function input.register_stop_actions (f) table.insert(input.stop_actions, f) end
+
+--~ callback.register('start_run', function() for _, a in pairs(input.start_actions) do a() end end)
+--~ callback.register('stop_run' , function() for _, a in pairs(input.stop_actions ) do a() end end)
+
+ end
+
+ if callback and (input.logmode() == 'xml') then
+
+ function input.start_page_number()
+ texio.write_nl("<p real='" .. tex.count[0] .. "' page='"..tex.count[1].."' sub='"..tex.count[2].."'")
+ end
+ function input.stop_page_number()
+ texio.write("/>")
+ texio.write_nl("")
+ end
+
+ callback.register('start_page_number' , input.start_page_number)
+ callback.register('stop_page_number' , input.stop_page_number )
+
+ function input.report_output_pages(p,b)
+ texio.write_nl("<v k='pages'>"..p.."</v>")
+ texio.write_nl("<v k='bytes'>"..b.."</v>")
+ texio.write_nl("")
+ end
+ function input.report_output_log()
+ end
+
+ callback.register('report_output_pages', input.report_output_pages)
+ callback.register('report_output_log' , input.report_output_log )
+
+ function input.start_run()
+ texio.write_nl("<?xml version='1.0' standalone='yes'?>")
+ texio.write_nl("<job xmlns='www.tug.org/luatex/schemas/context-job.rng'>")
+ texio.write_nl("")
+ end
+ function input.stop_run()
+ texio.write_nl("</job>")
+ end
+ function input.show_statistics()
+ for k,v in pairs(status.list()) do
+ texio.write_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
+ end
+ end
+
+ table.insert(input.start_actions, input.start_run)
+
+ table.insert(input.stop_actions, input.show_statistics)
+ table.insert(input.stop_actions, input.stop_run)
+
+ function input.start_run() for _, a in pairs(input.start_actions) do a() end end
+ function input.stop_run () for _, a in pairs(input.stop_actions ) do a() end end
+
+ callback.register('start_run', input.start_run)
+ callback.register('stop_run' , input.stop_run )
+
+ end
+
+ end
+
+ if kpse then
+
+ function kpse.find_file(filename,filetype,mustexist)
+ return input.find_file(texmf.instance,filename,filetype,mustexist)
+ end
+ function kpse.expand_path(variable)
+ return input.expand_path(texmf.instance,variable)
+ end
+ function kpse.expand_var(variable)
+ return input.expand_var(texmf.instance,variable)
+ end
+ function kpse.expand_braces(variable)
+ return input.expand_braces(texmf.instance,variable)
+ end
+
+ end
+
+end
+
+-- program specific configuration (memory settings and alike)
+
+if texconfig and not texlua then
+
+ if not luatex then luatex = { } end
+
+ luatex.variablenames = {
+ 'main_memory', 'extra_mem_bot', 'extra_mem_top',
+ 'buf_size',
+ 'font_max', 'font_mem_size',
+ 'hash_extra', 'max_strings', 'pool_free', 'pool_size', 'string_vacancies',
+ 'obj_tab_size', 'pdf_mem_size', 'dest_names_size',
+ 'nest_size', 'param_size', 'save_size', 'stack_size',
+ 'trie_size', 'hyph_size',
+ 'ocp_stack_size', 'ocp_list_size', 'ocp_buf_size'
+ }
+
+ function luatex.variables()
+ local t, x = { }, nil
+ for _,v in pairs(luatex.variablenames) do
+ x = input.var_value(texmf.instance,v)
+ if x and x:find("^%d+$") then
+ t[v] = tonumber(x)
+ end
+ end
+ return t
+ end
+
+ function luatex.setvariables(tab)
+ for k,v in pairs(luatex.variables()) do
+ tab[k] = v
+ end
+ end
+
+ if not luatex.variables_set then
+ luatex.setvariables(texconfig)
+ luatex.variables_set = true
+ end
+
+ texconfig.max_print_line = 100000
+
+end
+
+-- some tex basics
+
+if not cs then cs = { } end
+
+function cs.def(k,v)
+ tex.sprint(tex.texcatcodes, "\\def\\" .. k .. "{" .. v .. "}")
+end
+
+function cs.chardef(k,v)
+ tex.sprint(tex.texcatcodes, "\\chardef\\" .. k .. "=" .. v .. "\\relax")
+end
+
+function cs.boolcase(b)
+ if b then tex.write(1) else tex.write(0) end
+end
+
+function cs.testcase(b)
+ if b then
+ tex.sprint(tex.texcatcodes, "\\firstoftwoarguments")
+ else
+ tex.sprint(tex.texcatcodes, "\\secondoftwoarguments")
+ end
+end
diff --git a/tex/context/base/luat-tmp.lua b/tex/context/base/luat-tmp.lua
new file mode 100644
index 000000000..d11ae6329
--- /dev/null
+++ b/tex/context/base/luat-tmp.lua
@@ -0,0 +1,457 @@
+if not modules then modules = { } end modules ['luat-tmp'] = {
+ version = 1.001,
+ comment = "companion to luat-lib.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+cache = cache or { }
+dir = dir or { }
+texmf = texmf or { }
+
+cache.path = nil
+cache.base = cache.base or "luatex-cache"
+cache.more = cache.more or "context"
+cache.direct = false -- true is faster but may need huge amounts of memory
+cache.trace = false
+cache.tree = false
+cache.temp = os.getenv("TEXMFCACHE") or os.getenv("HOME") or os.getenv("HOMEPATH") or os.getenv("VARTEXMF") or os.getenv("TEXMFVAR") or os.getenv("TMP") or os.getenv("TEMP") or os.getenv("TMPDIR") or nil
+cache.paths = { cache.temp }
+
+if not cache.temp then
+ print("\nFATAL ERROR: NO VALID TEMPORARY PATH\n")
+ os.exit()
+end
+
+function cache.configpath(instance)
+ return input.expand_var(instance,"TEXMFCNF")
+end
+
+function cache.treehash(instance)
+ local tree = cache.configpath(instance)
+ if not tree or tree == "" then
+ return false
+ else
+ return md5.hex(tree)
+ end
+end
+
+function cache.setpath(instance,...)
+ if not cache.path then
+ if lfs and instance then
+ for _,v in pairs(cache.paths) do
+ for _,vv in pairs(input.expanded_path_list(instance,v)) do
+ if lfs.isdir(vv) then
+ cache.path = vv
+ break
+ end
+ end
+ if cache.path then break end
+ end
+ end
+ if not cache.path then
+ cache.path = cache.temp
+ end
+ if lfs then
+ cache.tree = cache.tree or cache.treehash(instance)
+ if cache.tree then
+ cache.path = dir.mkdirs(cache.path,cache.base,cache.more,cache.tree)
+ else
+ cache.path = dir.mkdirs(cache.path,cache.base,cache.more)
+ end
+ end
+ end
+ if not cache.path then
+ cache.path = '.'
+ end
+ cache.path = input.clean_path(cache.path)
+ if lfs and not table.is_empty({...}) then
+ local pth = dir.mkdirs(cache.path,...)
+ return pth
+ end
+ return cache.path
+end
+
+function cache.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
+end
+
+function cache.loaddata(path,name)
+ local tmaname, tmcname = cache.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ return loader()
+ else
+ return false
+ end
+end
+
+function cache.is_writable(filepath,filename)
+ local tmaname, tmcname = cache.setluanames(filepath,filename)
+ return file.is_writable(tmaname)
+end
+
+function cache.savedata(filepath,filename,data,raw) -- raw needed for file cache
+ local tmaname, tmcname = cache.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ if cache.direct then
+ file.savedata(tmaname, table.serialize(data,'return',true,true))
+ else
+ table.tofile (tmaname, data,'return',true,true) -- maybe not the last true
+ end
+ utils.lua.compile(tmaname, tmcname)
+end
+
+-- here we use the cache for format loading (texconfig.[formatname|jobname])
+
+if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
+ if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end
+ texconfig.formatname = cache.setpath(instance,"format") .. "/" .. texconfig.luaname:gsub("%.lu.$",".fmt")
+end
+
+--[[ldx--
+<p>Once we found ourselves defining similar cache constructs
+several times, containers were introduced. Containers are used
+to collect tables in memory and reuse them when possible based
+on (unique) hashes (to be provided by the calling function).</p>
+
+<p>Caching to disk is disabled by default. Version numbers are
+stored in the saved table which makes it possible to change the
+table structures without bothering about the disk cache.</p>
+
+<p>Examples of usage can be found in the font related code.</p>
+--ldx]]--
+
+containers = { }
+containers.trace = false
+
+do -- local report
+
+ local function report(container,tag,name)
+ if cache.trace or containers.trace or container.trace then
+ logs.report(string.format("%s cache",container.subcategory),string.format("%s: %s",tag,name or 'invalid'))
+ end
+ end
+
+ function containers.define(category, subcategory, version, enabled)
+ if category and subcategory then
+ return {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or 1.000,
+ trace = false,
+ path = cache.setpath(texmf.instance,category,subcategory),
+ }
+ else
+ return nil
+ end
+ end
+
+ function containers.is_usable(container, name)
+ return container.enabled and cache.is_writable(container.path, name)
+ end
+
+ function containers.is_valid(container, name)
+ if name and name ~= "" then
+ local cs = container.storage[name]
+ return cs and not table.is_empty(cs) and cs.cache_version == container.version
+ else
+ return false
+ end
+ end
+
+ function containers.read(container,name)
+ if container.enabled and not container.storage[name] then
+ container.storage[name] = cache.loaddata(container.path,name)
+ if containers.is_valid(container,name) then
+ report(container,"loaded",name)
+ else
+ container.storage[name] = nil
+ end
+ end
+ if container.storage[name] then
+ report(container,"reusing",name)
+ end
+ return container.storage[name]
+ end
+
+ function containers.write(container, name, data)
+ if data then
+ data.cache_version = container.version
+ if container.enabled then
+ local unique, shared = data.unique, data.shared
+ data.unique, data.shared = nil, nil
+ cache.savedata(container.path, name, data)
+ report(container,"saved",name)
+ data.unique, data.shared = unique, shared
+ end
+ report(container,"stored",name)
+ container.storage[name] = data
+ end
+ return data
+ end
+
+ function containers.content(container,name)
+ return container.storage[name]
+ end
+
+end
+
+-- since we want to use the cache instead of the tree, we will now
+-- reimplement the saver.
+
+input.usecache = true
+
+function input.aux.save_data(instance, dataname, check)
+ for cachename, files in pairs(instance[dataname]) do
+ local name
+ if input.usecache then
+ name = file.join(cache.setpath(instance,"trees"),md5.hex(cachename))
+ else
+ name = file.join(cachename,dataname)
+ end
+ local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix
+ input.report("preparing " .. dataname .. " in", luaname)
+ for k, v in pairs(files) do
+ if not check or check(v,k) then -- path, name
+ if #v == 1 then
+ files[k] = v[1]
+ end
+ else
+ files[k] = nil -- false
+ end
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = input.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = files,
+ }
+ local f = io.open(luaname,'w')
+ if f then
+ input.report("saving " .. dataname .. " in", luaname)
+ -- f:write(table.serialize(data,'return'))
+ f:write(input.serialize(data))
+ f:close()
+ input.report("compiling " .. dataname .. " to", lucname)
+ if not utils.lua.compile(luaname,lucname) then
+ input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname)
+ os.remove(lucname)
+ end
+ else
+ input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix)
+ end
+ end
+end
+
+function input.serialize(files)
+ -- This version is somewhat optimized for the kind of
+ -- tables that we deal with, so it's much faster than
+ -- the generic serializer. This makes sense because
+ -- luatools and mtxtools are called frequently. Okay,
+ -- we pay a small price for properly tabbed tables.
+ local t = { }
+ local concat = table.concat
+ local sorted = table.sortedkeys
+ local function dump(k,v,m)
+ if type(v) == 'string' then
+ return m .. "['" .. k .. "']='" .. v .. "',"
+ elseif #v == 1 then
+ return m .. "['" .. k .. "']='" .. v[1] .. "',"
+ else
+ return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
+ end
+ end
+ t[#t+1] = "return {"
+ if instance.sortdata then
+ for _, k in pairs(sorted(files)) do
+ local fk = files[k]
+ if type(fk) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ for _, kk in pairs(sorted(fk)) do
+ t[#t+1] = dump(kk,fk[kk],"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,fk,"\t")
+ end
+ end
+ else
+ for k, v in pairs(files) do
+ if type(v) == 'table' then
+ t[#t+1] = "\t['" .. k .. "']={"
+ for kk,vv in pairs(v) do
+ t[#t+1] = dump(kk,vv,"\t\t")
+ end
+ t[#t+1] = "\t},"
+ else
+ t[#t+1] = dump(k,v,"\t")
+ end
+ end
+ end
+ t[#t+1] = "}"
+ return concat(t,"\n")
+end
+
+function input.aux.load_data(instance,pathname,dataname,filename)
+ local luaname, lucname, pname, fname
+ if input.usecache then
+ pname, fname = cache.setpath(instance,"trees"), md5.hex(pathname)
+ filename = file.join(pname,fname)
+ else
+ if not filename or (filename == "") then
+ filename = dataname
+ end
+ pname, fname = pathname, filename
+ end
+ luaname = file.join(pname,fname) .. input.luasuffix
+ lucname = file.join(pname,fname) .. input.lucsuffix
+ local blob = loadfile(lucname)
+ if not blob then
+ blob = loadfile(luaname)
+ end
+ if blob then
+ local data = blob()
+ if data and data.content and data.type == dataname and data.version == input.cacheversion then
+ input.report("loading",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = data.content
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ instance[dataname][pathname] = { }
+ instance.loaderror = true
+ end
+ else
+ input.report("skipping",dataname,"for",pathname,"from",filename)
+ end
+end
+
+-- we will make a better format, maybe something xml or just text
+
+input.automounted = input.automounted or { }
+
+function input.automount(instance,usecache)
+ local mountpaths = input.simplified_list(input.expansion(instance,'TEXMFMOUNT'))
+ if table.is_empty(mountpaths) and usecache then
+ mountpaths = { cache.setpath(instance,"mount") }
+ end
+ if not table.is_empty(mountpaths) then
+ input.starttiming(instance)
+ for k, root in pairs(mountpaths) do
+ local f = io.open(root.."/url.tmi")
+ if f then
+ for line in f:lines() do
+ if line then
+ if line:find("^[%%#%-]") then -- or %W
+ -- skip
+ elseif line:find("^zip://") then
+ input.report("mounting",line)
+ table.insert(input.automounted,line)
+ input.usezipfile(instance,line)
+ end
+ end
+ end
+ f:close()
+ end
+ end
+ input.stoptiming(instance)
+ end
+end
+
+-- store info in format
+
+input.storage = { }
+input.storage.data = { }
+input.storage.min = 0 -- 500
+input.storage.max = input.storage.min - 1
+input.storage.trace = false -- true
+input.storage.done = 0
+input.storage.evaluators = { }
+-- (evaluate,message,names)
+
+function input.storage.register(...)
+ input.storage.data[#input.storage.data+1] = { ... }
+end
+
+function input.storage.evaluate(name)
+ input.storage.evaluators[#input.storage.evaluators+1] = name
+end
+
+function input.storage.finalize() -- we can prepend the string with "evaluate:"
+ for _, t in ipairs(input.storage.evaluators) do
+ for i, v in pairs(t) do
+ if type(v) == "string" then
+ t[i] = loadstring(v)()
+ elseif type(v) == "table" then
+ for _, vv in pairs(v) do
+ if type(vv) == "string" then
+ t[i] = loadstring(vv)()
+ end
+ end
+ end
+ end
+ end
+end
+
+function input.storage.dump()
+ for name, data in ipairs(input.storage.data) do
+ local evaluate, message, original, target = data[1], data[2], data[3] ,data[4]
+ local name, initialize, finalize = nil, "", ""
+ for str in string.gmatch(target,"([^%.]+)") do
+ if name then
+ name = name .. "." .. str
+ else
+ name = str
+ end
+ initialize = string.format("%s %s = %s or {} ", initialize, name, name)
+ end
+ if evaluate then
+ finalize = "input.storage.evaluate(" .. name .. ")"
+ end
+ input.storage.max = input.storage.max + 1
+ if input.storage.trace then
+ logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max))
+ lua.bytecode[input.storage.max] = loadstring(
+ initialize ..
+ string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) ..
+ table.serialize(original,name) ..
+ finalize
+ )
+ else
+ lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize)
+ end
+ end
+end
+
+if lua.bytecode then -- from 0 upwards
+ local i = input.storage.min
+ while lua.bytecode[i] do
+ lua.bytecode[i]()
+ lua.bytecode[i] = nil
+ i = i + 1
+ end
+ input.storage.done = i
+end
diff --git a/tex/context/base/luat-tra.lua b/tex/context/base/luat-tra.lua
new file mode 100644
index 000000000..90756d359
--- /dev/null
+++ b/tex/context/base/luat-tra.lua
@@ -0,0 +1,82 @@
+-- filename : luat-tra.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-tra'] = 1.001
+
+debugger = { }
+
+debugger.counters = { }
+debugger.names = { }
+
+function debugger.hook()
+ local f = debug.getinfo(2,"f").func
+ if debugger.counters[f] == nil then
+ debugger.counters[f] = 1
+ debugger.names[f] = debug.getinfo(2,"Sn")
+ else
+ debugger.counters[f] = debugger.counters[f] + 1
+ end
+end
+
+function debugger.getname(func)
+ local n = debugger.names[func]
+ if n.what == "C" then
+ return n.name
+ end
+ local lc = string.format("[%s]:%s", n.short_src, n.linedefined)
+ if n.namewhat ~= "" then
+ return string.format("%s (%s)", lc, n.name)
+ else
+ return lc
+ end
+end
+
+function debugger.showstats(printer,threshold)
+ if not printer then printer = print end
+ if not threshold then threshold = 0 end
+ for func, count in pairs(debugger.counters) do
+ if count > threshold then
+ printer(string.format("%8i %s\n", count, debugger.getname(func)))
+ end
+ end
+end
+
+function debugger.savestats(filename,threshold)
+ local f = io.open(filename,'w')
+ if f then
+ debugger.showstats(function(str) f:write(str) end,threshold)
+ f:close()
+ end
+end
+
+function debugger.enable()
+ debug.sethook(debugger.hook,"c")
+end
+
+function debugger.disable()
+ debug.sethook()
+--~ debugger.counters[debug.getinfo(2,"f").func] = nil
+end
+
+function debugger.tracing()
+ return tonumber((os.env['MTX.TRACE.CALLS'] or os.env['MTX_TRACE_CALLS'] or 0)) > 0
+end
+
+--~ debugger.enable()
+
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+
+--~ debugger.disable()
+
+--~ print("")
+--~ debugger.showstats()
+--~ print("")
+--~ debugger.showstats(print,3)
+
diff --git a/tex/context/base/luat-uni.lua b/tex/context/base/luat-uni.lua
new file mode 100644
index 000000000..06945ed2b
--- /dev/null
+++ b/tex/context/base/luat-uni.lua
@@ -0,0 +1,23 @@
+-- filename : luat-uni.lua
+-- comment : companion to luat-uni.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-uni'] = 1.001
+
+function unicode.utf8.split(str)
+ lst = { }
+ -- for snippet in unicode.utf8.gfind(str,".") do
+ for snippet in string.utfcharacters(str) do
+ table.insert(lst,snippet)
+ end
+ return lst
+end
+
+function unicode.utf8.each(str,fnc)
+ -- for snippet in unicode.utf8.gfind(str,".") do
+ for snippet in string.utfcharacters(str) do
+ fnc(snippet)
+ end
+end
diff --git a/tex/context/base/luat-uni.tex b/tex/context/base/luat-uni.tex
new file mode 100644
index 000000000..453c8e0d8
--- /dev/null
+++ b/tex/context/base/luat-uni.tex
@@ -0,0 +1,33 @@
+%D \module
+%D [ file=luat-uni,
+%D version=2006.04.25,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Unicode Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Lua Support Macros (unicode)}
+
+\registerctxluafile{luat-uni}{1.001}
+
+% \defconvertedargument\ascii{ÀÁÂÃÄÅàáâãäå}
+%
+% \lua{ tex.print ("\ascii")}
+% \lua{ tex.print(unicode.utf8.reverse ("\ascii"))}
+% \lua{ tex.print(unicode.utf8.lower ("\ascii"))}
+% \lua{ tex.print(unicode.utf8.upper ("\ascii"))}
+% \lua{ tex.print(unicode.utf8.len ("\ascii"))}
+% \lua{ tex.print(table.getn(unicode.utf8.split("\ascii"))}}
+%
+% \lua{unicode.utf8.each("\ascii", function(chr) tex.print("["..chr.."]") end)}
+
+\let\UnicodeOne \gobbleoneargument
+\let\UnicodeTwo \gobbleoneargument
+\let\UnicodeThree\gobbleoneargument
+
+\endinput
diff --git a/tex/context/base/luat-zip.lua b/tex/context/base/luat-zip.lua
new file mode 100644
index 000000000..fbf00a47e
--- /dev/null
+++ b/tex/context/base/luat-zip.lua
@@ -0,0 +1,221 @@
+-- filename : luat-zip.lua
+-- comment : companion to luat-lib.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['luat-zip'] = 1.001
+
+if zip and input then
+ zip.supported = true
+else
+ zip = { }
+ zip.supported = false
+end
+
+if not zip.supported then
+
+ if not input then input = { } end -- will go away
+
+ function zip.openarchive (...) return nil end -- needed ?
+ function zip.closenarchive (...) end -- needed ?
+ function input.registerzipfile (...) end -- needed ?
+ function input.usezipfile (...) end -- needed ?
+
+else
+
+ function input.locators.zip(instance,specification)
+ local name, spec = specification:match("^(.-)##(.-)$")
+ local f = io.open(name or specification)
+ if f then -- todo: reuse code
+ input.logger('! zip locator', specification..' found')
+ if name and spec then
+ input.aux.append_hash(instance,'zip',"zip##"..specification,name)
+ input.aux.extend_texmf_var(instance, "zip##"..specification)
+ else
+ input.aux.append_hash(instance,'zip',"zip##"..specification.."##",specification)
+ input.aux.extend_texmf_var(instance, "zip##"..specification.."##")
+ end
+ f:close()
+ else
+ input.logger('? zip locator', specification..' not found')
+ end
+ end
+
+ function input.hashers.zip(instance,tag,name)
+ input.report("loading zip file",name,"as",tag)
+ input.registerzipfile(instance,name,tag)
+ end
+
+ function input.concatinators.zip(tag,path,name)
+ return tag .. path .. '/' .. name
+ end
+
+ function input.is_readable.zip(name)
+ return true
+ end
+
+ function input.finders.zip(instance,filename,filetype)
+ local archive, dataname = filename:match("^(.+)##/*(.+)$")
+ if archive and dataname then
+ local zfile = zip.openarchive(archive)
+ if not zfile then
+ archive = input.find_file(instance,archive,filetype)
+ zfile = zip.openarchive(archive)
+ end
+ if zfile then
+ input.logger('! zip finder',archive)
+ local dfile = zfile:open(dataname)
+ if dfile then
+ dfile = zfile:close()
+ input.logger('+ zip finder',filename)
+ return 'zip##' .. filename
+ end
+ else
+ input.logger('? zip finder',archive)
+ end
+ end
+ input.logger('- zip finder',filename)
+ return unpack(input.finders.notfound)
+ end
+
+ function input.openers.zip(instance,filename)
+ if filename and filename ~= "" then
+ local archive, dataname = filename:match("^(.-)##/*(.+)$")
+ if archive and dataname then
+ local zfile= zip.openarchive(archive)
+ if zfile then
+ input.logger('+ zip starter',archive)
+ local dfile = zfile:open(dataname)
+ if dfile then
+ input.show_open(filename)
+ return input.openers.text_opener(filename,dfile,'zip')
+ end
+ else
+ input.logger('- zip starter',archive)
+ end
+ end
+ end
+ input.logger('- zip opener',filename)
+ return unpack(input.openers.notfound)
+ end
+
+ function input.loaders.zip(instance, filename) -- we could use input.openers.zip
+ if filename and filename ~= "" then
+ input.logger('= zip loader',filename)
+ local archive, dataname = filename:match("^(.+)##/*(.+)$")
+ if archive and dataname then
+ local zfile = zip.openarchive(archive)
+ if zfile then
+ input.logger('= zip starter',archive)
+ local dfile = zfile:open(dataname)
+ if dfile then
+ input.show_load(filename)
+ input.logger('+ zip loader',filename)
+ local s = dfile:read("*all")
+ dfile:close()
+ return true, s, #s
+ end
+ else
+ input.logger('- zip starter',archive)
+ end
+ end
+ end
+ input.logger('- zip loader',filename)
+ return unpack(input.loaders.notfound)
+ end
+
+ zip.archives = { }
+ zip.registeredfiles = { }
+
+ function zip.openarchive(name)
+ if name and name ~= "" and not zip.archives[name] then
+ zip.archives[name] = zip.open(name)
+ end
+ return zip.archives[name]
+ end
+
+ function zip.closearchive(name)
+ if zip.archives[name] then
+ zip.close(archives[name])
+ zip.archives[name] = nil
+ end
+ end
+
+ -- aparte register maken voor user (register tex / zip), runtime tree register
+ -- todo: alleen url syntax toestaan
+ -- user function: also handle zip::name::path
+
+ function input.usezipfile(instance,zipname) -- todo zip://
+ zipname = input.normalize_name(zipname)
+ if not zipname:find("^zip##") then
+ zipname = "zip##"..zipname
+ end
+ input.logger('! zip user','file '..zipname)
+ if not zipname:find("^zip##(.+)##(.-)$") then
+ zipname = zipname .. "##" -- dummy spec
+ end
+ local tag = zipname
+ local name = zipname:match("zip##(.+)##.-")
+ input.aux.prepend_hash(instance,'zip',tag,name)
+ input.aux.extend_texmf_var(instance, tag)
+ input.registerzipfile(instance,name,tag)
+ end
+
+ function input.registerzipfile(instance,zipname,tag)
+ if not zip.registeredfiles[zipname] then
+ input.start_timing(instance)
+ local z = zip.open(zipname)
+ if not z then
+ zipname = input.find_file(instance,zipname)
+ z = zip.open(zipname)
+ end
+ if z then
+ input.logger("= zipfile","registering "..zipname)
+ zip.registeredfiles[zipname] = z
+ input.aux.register_zip_file(instance,zipname,tag)
+ else
+ input.logger("? zipfile","unknown "..zipname)
+ end
+ input.stop_timing(instance)
+ end
+ end
+
+ function input.aux.register_zip_file(instance,zipname,tagname)
+ if zip.registeredfiles[zipname] then
+ if not tagname:find("^zip##") then
+ tagname = "zip##" .. tagname
+ end
+ local path, name, n = nil, nil, 0
+ if not instance.files[tagname] then
+ instance.files[tagname] = { }
+ end
+ local files, filter = instance.files[tagname], ""
+ local subtree = tagname:match("^zip##.+##(.+)$")
+ if subtree then
+ filter = "^"..subtree.."/(.+)/(.-)$"
+ else
+ filter = "^(.+)/(.-)$"
+ end
+ input.logger('= zip filter',filter)
+ -- we can consider putting a files.luc in the file
+ local register = input.aux.register_file
+ for i, _ in zip.registeredfiles[zipname]:files() do
+ path, name = i.filename:match(filter)
+ if path then
+ if name and name ~= '' then
+ register(files, name, path)
+ n = n + 1
+ else
+ -- directory
+ end
+ else
+ register(files, i.filename, '')
+ n = n + 1
+ end
+ end
+ input.report(n, 'entries in', zipname)
+ end
+ end
+
+end
diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua
new file mode 100644
index 000000000..56e09bb1f
--- /dev/null
+++ b/tex/context/base/meta-pdf.lua
@@ -0,0 +1,585 @@
+-- filename : meta-pdf.lua
+-- comment : companion to meta-pdf.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- This is the third version. Version 1 converted to Lua code,
+-- version 2 gsubbed the file into TeX code, and version 3 uses
+-- the new lpeg functionality and streams the result into TeX.
+
+--~ old lpeg 0.4 lpeg 0.5
+--~ 100 times test graphic 2.45 (T:1.07) 0.72 (T:0.24) 0.580 (0.560 no table) -- 0.54 optimized for one space (T:0.19)
+--~ 100 times big graphic 10.44 4.30/3.35 nogb 2.914 (2.050 no table) -- 1.99 optimized for one space (T:0.85)
+--~ 500 times test graphic T:1.29 T:1.16 (T:1.10 no table) -- T:1.10
+
+if not versions then versions = { } end versions['meta-pdf'] = 1.003
+
+mptopdf = { }
+mptopdf.parsers = { }
+mptopdf.parser = 'none'
+
+function mptopdf.reset()
+ mptopdf.data = ""
+ mptopdf.path = { }
+ mptopdf.stack = { }
+ mptopdf.texts = { }
+ mptopdf.version = 0
+ mptopdf.shortcuts = false
+ mptopdf.resetpath()
+end
+
+function mptopdf.resetpath()
+ mptopdf.stack.close = false
+ mptopdf.stack.path = { }
+ mptopdf.stack.concat = nil
+ mptopdf.stack.special = false
+end
+
+mptopdf.reset()
+
+function mptopdf.parsers.none()
+ -- no parser set
+end
+
+function mptopdf.parse()
+ mptopdf.parsers[mptopdf.parser]()
+end
+
+-- shared code
+
+mptopdf.steps = { }
+
+mptopdf.descapes = {
+ ['('] = "\\\\char40 ",
+ [')'] = "\\\\char41 ",
+ ['"'] = "\\\\char92 "
+}
+
+function mptopdf.descape(str)
+ str = str:gsub("\\(%d%d%d)",function(n)
+ return "\\char" .. tonumber(n,8) .. " "
+ end)
+ return str:gsub("\\([%(%)\\])",mptopdf.descapes)
+end
+
+-- old code
+
+function mptopdf.steps.descape(str)
+ str = str:gsub("\\(%d%d%d)",function(n)
+ return "\\\\char" .. tonumber(n,8) .. " "
+ end)
+ return str:gsub("\\([%(%)\\])",mptopdf.descapes)
+end
+
+function mptopdf.steps.strip() -- .3 per expr
+ mptopdf.data = mptopdf.data:gsub("^(.-)%%+Page:.-%c+(.*)%s+%a+%s+%%+EOF.*$", function(preamble, graphic)
+ local bbox = "0 0 0 0"
+ for b in preamble:gmatch("%%%%%a+oundingBox: +(.-)%c+") do
+ bbox = b
+ end
+ local name, version = preamble:gmatch("%%%%Creator: +(.-) +(.-) ")
+ mptopdf.version = tostring(version or "0")
+ if preamble:find("/hlw{0 dtransform") then
+ mptopdf.shortcuts = true
+ end
+ -- the boundingbox specification needs to come before data, well, not really
+ return bbox .. " boundingbox\n" .. "\nbegindata\n" .. graphic .. "\nenddata\n"
+ end, 1)
+ mptopdf.data = mptopdf.data:gsub("%%%%MetaPostSpecials: +(.-)%c+", "%1 specials\n", 1)
+ mptopdf.data = mptopdf.data:gsub("%%%%MetaPostSpecial: +(.-)%c+", "%1 special\n")
+ mptopdf.data = mptopdf.data:gsub("%%.-%c+", "")
+end
+
+function mptopdf.steps.cleanup()
+ if not mptopdf.shortcuts then
+ mptopdf.data = mptopdf.data:gsub("gsave%s+fill%s+grestore%s+stroke", "both")
+ mptopdf.data = mptopdf.data:gsub("([%d%.]+)%s+([%d%.]+)%s+dtransform%s+exch%s+truncate%s+exch%s+idtransform%s+pop%s+setlinewidth", function(wx,wy)
+ if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end
+ end)
+ mptopdf.data = mptopdf.data:gsub("([%d%.]+)%s+([%d%.]+)%s+dtransform%s+truncate%s+idtransform%s+setlinewidth%s+pop", function(wx,wy)
+ if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end
+ end)
+ end
+end
+
+function mptopdf.steps.convert()
+ mptopdf.data = mptopdf.data:gsub("%c%((.-)%) (.-) (.-) fshow", function(str,font,scale)
+ table.insert(mptopdf.texts,{mptopdf.steps.descape(str), font, scale})
+ return "\n" .. #mptopdf.texts .. " textext"
+ end)
+ mptopdf.data = mptopdf.data:gsub("%[%s*(.-)%s*%]", function(str)
+ return str:gsub("%s+"," ")
+ end)
+ local t
+ mptopdf.data = mptopdf.data:gsub("%s*([^%a]-)%s*(%a+)", function(args,cmd)
+ if cmd == "textext" then
+ t = mptopdf.texts[tonumber(args)]
+ return "mp.textext(" .. "\"" .. t[2] .. "\"," .. t[3] .. ",\"" .. t[1] .. "\")\n"
+ else
+ return "mp." .. cmd .. "(" .. args:gsub(" +",",") .. ")\n"
+ end
+ end)
+end
+
+function mptopdf.steps.process()
+ assert(loadstring(mptopdf.data))() -- () runs the loaded chunk
+end
+
+function mptopdf.parsers.gsub()
+ mptopdf.steps.strip()
+ mptopdf.steps.cleanup()
+ mptopdf.steps.convert()
+ mptopdf.steps.process()
+end
+
+-- end of old code
+
+-- from lua to tex
+
+function mptopdf.pdfcode(str)
+ tex.sprint(tex.ctxcatcodes,"\\PDFcode{" .. str .. "}")
+end
+
+function mptopdf.texcode(str)
+ tex.sprint(tex.ctxcatcodes,str)
+end
+
+-- auxiliary functions
+
+function mptopdf.flushconcat()
+ if mptopdf.stack.concat then
+ mptopdf.pdfcode(table.concat(mptopdf.stack.concat," ") .. " cm")
+ mptopdf.stack.concat = nil
+ end
+end
+
+function mptopdf.flushpath(cmd)
+ if #mptopdf.stack.path > 0 then
+ local path = { }
+ if mptopdf.stack.concat then
+ local sx, sy = mptopdf.stack.concat[1], mptopdf.stack.concat[4]
+ local rx, ry = mptopdf.stack.concat[2], mptopdf.stack.concat[3]
+ local tx, ty = mptopdf.stack.concat[5], mptopdf.stack.concat[6]
+ local d = (sx*sy) - (rx*ry)
+ local function concat(px, py)
+ return (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d
+ end
+ for _,v in pairs(mptopdf.stack.path) do
+ v[1],v[2] = concat(v[1],v[2])
+ if #v == 7 then
+ v[3],v[4] = concat(v[3],v[4])
+ v[5],v[6] = concat(v[5],v[6])
+ end
+ table.insert(path, table.concat(v," "))
+ end
+ else
+ for _,v in pairs(mptopdf.stack.path) do
+ table.insert(path, table.concat(v," "))
+ end
+ end
+ mptopdf.flushconcat()
+ mptopdf.texcode("\\MPSpath{" .. table.concat(path," ") .. "}")
+ if mptopdf.stack.close then
+ mptopdf.texcode("\\MPScode{h " .. cmd .. "}")
+ else
+ mptopdf.texcode("\\MPScode{" .. cmd .."}")
+ end
+ end
+ mptopdf.resetpath()
+end
+
+if texmf and texmf.instance then
+ function mptopdf.loaded(name)
+ local ok, n
+ mptopdf.reset()
+ ok, mptopdf.data, n = input.loadbinfile(texmf.instance, name, 'tex') -- we need a binary load !
+ return ok
+ end
+else
+ function mptopdf.loaded(name)
+ local f = io.open(name, 'rb')
+ if f then
+ mptopdf.reset()
+ mptopdf.data = f:read('*all')
+ f:close()
+ return true
+ else
+ return false
+ end
+ end
+end
+
+if not mptopdf.parse then
+ function mptopdf.parse() end -- forward declaration
+end
+
+function mptopdf.convertmpstopdf(name)
+ if mptopdf.loaded(name) then
+ garbagecollector.push()
+ input.start_timing(mptopdf)
+ mptopdf.parse()
+ mptopdf.reset()
+ input.stop_timing(mptopdf)
+ garbagecollector.pop()
+ else
+ tex.print("file " .. name .. " not found")
+ end
+end
+
+-- mp interface
+
+mp = { }
+
+function mp.creator(a, b, c)
+ mptopdf.version = tonumber(b)
+end
+
+function mp.creationdate(a)
+ mptopdf.date= a
+end
+
+function mp.newpath()
+ mptopdf.stack.path = { }
+end
+
+function mp.boundingbox(llx, lly, urx, ury)
+ mptopdf.texcode("\\MPSboundingbox{" .. llx .. "}{" .. lly .. "}{" .. urx .. "}{" .. ury .. "}")
+end
+
+function mp.moveto(x,y)
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {x,y,"m"}
+end
+
+function mp.curveto(ax, ay, bx, by, cx, cy)
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {ax,ay,bx,by,cx,cy,"c"}
+end
+
+function mp.lineto(x,y)
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {x,y,"l"}
+end
+
+function mp.rlineto(x,y)
+ local dx, dy = 0, 0
+ if #mptopdf.stack.path > 0 then
+ dx, dy = mptopdf.stack.path[#mptopdf.stack.path][1], mptopdf.stack.path[#mptopdf.stack.path][2]
+ end
+ mptopdf.stack.path[#mptopdf.stack.path+1] = {dx,dy,"l"}
+end
+
+function mp.translate(tx,ty)
+ mptopdf.pdfcode("1 0 0 0 1 " .. tx .. " " .. ty .. " cm")
+end
+
+function mp.scale(sx,sy)
+ mptopdf.stack.concat = {sx,0,0,sy,0,0}
+end
+
+function mp.concat(sx, rx, ry, sy, tx, ty)
+ mptopdf.stack.concat = {sx,rx,ry,sy,tx,ty}
+end
+
+function mp.setlinejoin(d)
+ mptopdf.pdfcode(d .. " j")
+end
+
+function mp.setlinecap(d)
+ mptopdf.pdfcode(d .. " J")
+end
+
+function mp.setmiterlimit(d)
+ mptopdf.pdfcode(d .. " M")
+end
+
+function mp.gsave()
+ mptopdf.pdfcode("q")
+end
+
+function mp.grestore()
+ mptopdf.pdfcode("Q")
+end
+
+function mp.setdash(...)
+ local n = select("#",...)
+ mptopdf.pdfcode("[" .. table.concat({...}," ",1,n-1) .. "] " .. select(n,...) .. " d")
+end
+
+function mp.resetdash()
+ mptopdf.pdfcode("[ ] 0 d")
+end
+
+function mp.setlinewidth(d)
+ mptopdf.pdfcode(d .. " w")
+end
+
+function mp.closepath()
+ mptopdf.stack.close = true
+end
+
+function mp.fill()
+ mptopdf.flushpath('f')
+end
+
+function mp.stroke()
+ mptopdf.flushpath('S')
+end
+
+function mp.both()
+ mptopdf.flushpath('B')
+end
+
+function mp.clip()
+ mptopdf.flushpath('W n')
+end
+
+function mp.textext(font, scale, str) -- old parser
+ local dx, dy = 0, 0
+ if #mptopdf.stack.path > 0 then
+ dx, dy = mptopdf.stack.path[1][1], mptopdf.stack.path[1][2]
+ end
+ mptopdf.flushconcat()
+ mptopdf.texcode("\\MPStextext{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}")
+ mptopdf.resetpath()
+end
+
+function mp.fshow(str,font,scale) -- lpeg parser
+ mp.textext(font,scale,mptopdf.descape(str))
+--~ local dx, dy = 0, 0
+--~ if #mptopdf.stack.path > 0 then
+--~ dx, dy = mptopdf.stack.path[1][1], mptopdf.stack.path[1][2]
+--~ end
+--~ mptopdf.flushconcat()
+--~ mptopdf.texcode("\\MPStextext{"..font.."}{"..scale.."}{"..mptopdf.descape(str).."}{"..dx.."}{"..dy.."}")
+--~ mptopdf.resetpath()
+end
+
+
+--~ function mp.handletext(font,scale.str,dx,dy)
+--~ local one, two = string.match(str, "^(%d+)::::(%d+)")
+--~ if one and two then
+--~ mptopdf.texcode("\\MPTOPDFtextext{"..font.."}{"..scale.."}{"..one.."}{"..two.."}{"..dx.."}{"..dy.."}")
+--~ else
+--~ mptopdf.texcode("\\MPTOPDFtexcode{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}")
+--~ end
+--~ end
+
+function mp.setrgbcolor(r,g,b) -- extra check
+ r, g = tonumber(r), tonumber(g) -- needed when we use lpeg
+ if r == 0.0123 and g < 0.01 then
+ mptopdf.texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}")
+ elseif r == 0.123 and r < 0.1 then
+ mptopdf.texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}")
+ else
+ mptopdf.texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}")
+ end
+end
+
+function mp.setcmykcolor(c,m,y,k)
+ mptopdf.texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}")
+end
+
+function mp.setgray(s)
+ mptopdf.texcode("\\MPSgray{" .. s .. "}")
+end
+
+function mp.specials(version,signal,factor) -- 2.0 123 1000
+end
+
+function mp.special(...) -- 7 1 0.5 1 0 0 1 3
+ local n = select("#",...)
+ mptopdf.texcode("\\MPSbegin\\MPSset{" .. table.concat({...},"}\\MPSset{",2,n) .. "}\\MPSend")
+end
+
+function mp.begindata()
+end
+
+function mp.enddata()
+end
+
+function mp.showpage()
+end
+
+mp.n = mp.newpath -- n
+mp.p = mp.closepath -- h
+mp.l = mp.lineto -- l
+mp.r = mp.rlineto -- r
+mp.m = mp.moveto -- m
+mp.c = mp.curveto -- c
+mp.hlw = mp.setlinewidth
+mp.vlw = mp.setlinewidth
+
+mp.C = mp.setcmykcolor -- k
+mp.G = mp.setgray -- g
+mp.R = mp.setrgbcolor -- rg
+
+mp.lj = mp.setlinejoin -- j
+mp.ml = mp.setmiterlimit -- M
+mp.lc = mp.setlinecap -- J
+mp.sd = mp.setdash -- d
+mp.rd = mp.resetdash
+
+mp.S = mp.stroke -- S
+mp.F = mp.fill -- f
+mp.B = mp.both -- B
+mp.W = mp.clip -- W
+
+mp.q = mp.gsave -- q
+mp.Q = mp.grestore -- Q
+
+mp.s = mp.scale -- (not in pdf)
+mp.t = mp.concat -- (not the same as pdf anyway)
+
+mp.P = mp.showpage
+
+-- experimental
+
+function mp.attribute(id,value)
+ mptopdf.texcode("\\attribute " .. id .. "=" .. value .. " ")
+-- mptopdf.texcode("\\dompattribute{" .. id .. "}{" .. value .. "}")
+end
+
+-- lpeg parser
+
+-- The lpeg based parser is rather optimized for the kind of output
+-- that MetaPost produces. It's my first real lpeg code, which may
+-- show. Because the parser binds to functions, we define it last.
+
+do
+
+ local eol = lpeg.S('\r\n')^1
+ local sp = lpeg.P(' ')^1
+ local space = lpeg.S(' \r\n')^1
+ local number = lpeg.S('0123456789.-+')^1
+ local nonspace = lpeg.P(1-lpeg.S(' \r\n'))^1
+
+ local cnumber = lpeg.C(number)
+ local cstring = lpeg.C(nonspace)
+
+ local specials = (lpeg.P("%%MetaPostSpecials:") * sp * (cstring * sp^0)^0 * eol) / mp.specials
+ local special = (lpeg.P("%%MetaPostSpecial:") * sp * (cstring * sp^0)^0 * eol) / mp.special
+ local boundingbox = (lpeg.P("%%BoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mp.boundingbox
+ local highresboundingbox = (lpeg.P("%%HiResBoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mp.boundingbox
+
+ local setup = lpeg.P("%%BeginSetup") * (1 - lpeg.P("%%EndSetup") )^1
+ local prolog = lpeg.P("%%BeginProlog") * (1 - lpeg.P("%%EndProlog"))^1
+ local comment = lpeg.P('%')^1 * (1 - eol)^1
+
+ local curveto = ((cnumber * sp)^6 * lpeg.P("curveto") ) / mp.curveto
+ local lineto = ((cnumber * sp)^2 * lpeg.P("lineto") ) / mp.lineto
+ local rlineto = ((cnumber * sp)^2 * lpeg.P("rlineto") ) / mp.rlineto
+ local moveto = ((cnumber * sp)^2 * lpeg.P("moveto") ) / mp.moveto
+ local setrgbcolor = ((cnumber * sp)^3 * lpeg.P("setrgbcolor") ) / mp.setrgbcolor
+ local setcmykcolor = ((cnumber * sp)^4 * lpeg.P("setcmykcolor") ) / mp.setcmykcolor
+ local setgray = ((cnumber * sp)^1 * lpeg.P("setgray") ) / mp.setgray
+ local newpath = ( lpeg.P("newpath") ) / mp.newpath
+ local closepath = ( lpeg.P("closepath") ) / mp.closepath
+ local fill = ( lpeg.P("fill") ) / mp.fill
+ local stroke = ( lpeg.P("stroke") ) / mp.stroke
+ local clip = ( lpeg.P("clip") ) / mp.clip
+ local both = ( lpeg.P("gsave fill grestore")) / mp.both
+ local showpage = ( lpeg.P("showpage") )
+ local setlinejoin = ((cnumber * sp)^1 * lpeg.P("setlinejoin") ) / mp.setlinejoin
+ local setlinecap = ((cnumber * sp)^1 * lpeg.P("setlinecap") ) / mp.setlinecap
+ local setmiterlimit = ((cnumber * sp)^1 * lpeg.P("setmiterlimit") ) / mp.setmiterlimit
+ local gsave = ( lpeg.P("gsave") ) / mp.gsave
+ local grestore = ( lpeg.P("grestore") ) / mp.grestore
+
+ local setdash = (lpeg.P("[") * (cnumber * sp^0)^0 * lpeg.P("]") * sp * cnumber * sp * lpeg.P("setdash")) / mp.setdash
+ local concat = (lpeg.P("[") * (cnumber * sp^0)^6 * lpeg.P("]") * sp * lpeg.P("concat") ) / mp.concat
+ local scale = ( (cnumber * sp^0)^6 * sp * lpeg.P("concat") ) / mp.concat
+
+ local fshow = (lpeg.P("(") * lpeg.C((1-lpeg.P(")"))^1) * lpeg.P(")") * space * lpeg.C(lpeg.P((1-space)^1)) * space * cnumber * space * lpeg.P("fshow")) / mp.fshow
+ local fshow = (lpeg.P("(") * lpeg.C((1-lpeg.P(")"))^1) * lpeg.P(")") * space * cstring * space * cnumber * space * lpeg.P("fshow")) / mp.fshow
+
+ local setlinewidth_x = (lpeg.P("0") * sp * cnumber * sp * lpeg.P("dtransform truncate idtransform setlinewidth pop")) / mp.setlinewidth
+ local setlinewidth_y = (cnumber * sp * lpeg.P("0 dtransform exch truncate exch idtransform pop setlinewidth") ) / mp.setlinewidth
+
+ local c = ((cnumber * sp)^6 * lpeg.P("c") ) / mp.curveto -- ^6 very inefficient, ^1 ok too
+ local l = ((cnumber * sp)^2 * lpeg.P("l") ) / mp.lineto
+ local r = ((cnumber * sp)^2 * lpeg.P("r") ) / mp.rlineto
+ local m = ((cnumber * sp)^2 * lpeg.P("m") ) / mp.moveto
+ local vlw = ((cnumber * sp)^1 * lpeg.P("vlw")) / mp.setlinewidth
+ local hlw = ((cnumber * sp)^1 * lpeg.P("hlw")) / mp.setlinewidth
+
+ local R = ((cnumber * sp)^3 * lpeg.P("R") ) / mp.setrgbcolor
+ local C = ((cnumber * sp)^4 * lpeg.P("C") ) / mp.setcmykcolor
+ local G = ((cnumber * sp)^1 * lpeg.P("G") ) / mp.setgray
+
+ local lj = ((cnumber * sp)^1 * lpeg.P("lj") ) / mp.setlinejoin
+ local ml = ((cnumber * sp)^1 * lpeg.P("ml") ) / mp.setmiterlimit
+ local lc = ((cnumber * sp)^1 * lpeg.P("lc") ) / mp.setlinecap
+
+ local n = lpeg.P("n") / mp.newpath
+ local p = lpeg.P("p") / mp.closepath
+ local S = lpeg.P("S") / mp.stroke
+ local F = lpeg.P("F") / mp.fill
+ local B = lpeg.P("B") / mp.both
+ local W = lpeg.P("W") / mp.clip
+ local P = lpeg.P("P") / mp.showpage
+
+ local q = lpeg.P("q") / mp.gsave
+ local Q = lpeg.P("Q") / mp.grestore
+
+ local sd = (lpeg.P("[") * (cnumber * sp^0)^0 * lpeg.P("]") * sp * cnumber * sp * lpeg.P("sd")) / mp.setdash
+ local rd = ( lpeg.P("rd")) / mp.resetdash
+
+ local s = ( (cnumber * sp^0)^2 * sp * lpeg.P("s") ) / mp.scale
+ local t = (lpeg.P("[") * (cnumber * sp^0)^6 * lpeg.P("]") * sp * lpeg.P("t") ) / mp.concat
+
+ -- experimental
+
+ local attribute = ((cnumber * sp)^2 * lpeg.P("attribute")) / mp.attribute
+ local A = ((cnumber * sp)^2 * lpeg.P("A")) / mp.attribute
+
+
+ local preamble = (
+ prolog + setup +
+ boundingbox + highresboundingbox + specials + special +
+ comment
+ )
+
+ local procset = (
+ lj + ml + lc +
+ c + l + m + n + p + r +
+A +
+ R + C + G +
+ S + F + B + W +
+ vlw + hlw +
+ Q + q +
+ sd + rd +
+ t + s +
+ fshow +
+ P
+ )
+
+ local verbose = (
+ curveto + lineto + moveto + newpath + closepath + rlineto +
+ setrgbcolor + setcmykcolor + setgray +
+attribute +
+ setlinejoin + setmiterlimit + setlinecap +
+ stroke + fill + clip + both +
+ setlinewidth_x + setlinewidth_y +
+ gsave + grestore +
+ concat + scale +
+ fshow +
+ setdash + -- no resetdash
+ showpage
+ )
+
+ -- order matters in terms of speed / we could check for procset first
+
+ local captures_old = ( space + verbose + preamble )^0
+ local captures_new = ( space + procset + preamble + verbose )^0
+
+ function mptopdf.parsers.lpeg()
+ if mptopdf.data:find("%%%%BeginResource: procset mpost") then
+--~ if mptopdf.data:find("/bd{bind def}bind def") then -- bug in mp
+ lpeg.match(captures_new,mptopdf.data)
+ else
+ lpeg.match(captures_old,mptopdf.data)
+ end
+ end
+
+end
+
+mptopdf.parser = 'lpeg'
diff --git a/tex/context/base/meta-pdf.mkiv b/tex/context/base/meta-pdf.mkiv
new file mode 100644
index 000000000..dadf760a6
--- /dev/null
+++ b/tex/context/base/meta-pdf.mkiv
@@ -0,0 +1,155 @@
+%D \module
+%D [ file=meta-pdf,
+%D version=2006.29.09,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=\METAPOST\ to \PDF\ conversion,
+%D author=Hans Hagen \& others (see text),
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+% Using test case at end of meta-pdf.tex:
+%
+% \useMPgraphic{1}
+% \testfeatureonce{250}{\setbox0\hbox{\convertMPtoPDF{test-mps-mpgraph.1}{1}{1}}}
+%
+% 8.4 : mkii, direct parsing by tex
+% 11.8 : mkiv, dirty conversion (10.8 with dirty tricks)
+% 14.5 : mkiv, clean conversion
+% 7.4 : mkiv, simulated clean direct lua from mp
+% 0.3 : time taken by tex to handle converted code
+
+% Maybe delayed load, only at first call of the converter.
+
+\registerctxluafile{meta-pdf}{1.003}
+
+%D Plugin.
+
+\def\mkconvertMPtoPDF
+ {\vbox\bgroup
+ \forgetall
+ \offinterlineskip
+ %\ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi % fixed in mp
+ \setbox\scratchbox\vbox\bgroup
+ \setnormalcatcodes % we can be in verbatim or so
+ \message{[MP to PDF]}%
+ \startMPresources
+ \PDFcomment{mps begin}%
+ \PDFcode{q 1 0 0 1 0 0 cm}%
+ \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
+ \PDFcode{Q}%
+ \PDFcomment{mps end}%
+ \stopMPresources
+ \egroup
+ \setbox\scratchbox\hbox\bgroup
+ \hskip-\MPllx\onebasepoint
+ \raise-\MPlly\onebasepoint
+ \box\scratchbox
+ \egroup
+ \setbox\scratchbox\vbox to \MPheight\bgroup
+ \vfill
+ \hsize\MPwidth
+ \smashbox\scratchbox
+ \box\scratchbox
+ \egroup
+ \wd\scratchbox\MPwidth
+ \ht\scratchbox\MPheight
+ \dopackageMPgraphic\scratchbox
+ \egroup}
+
+\let\mkprocessMPtoPDFfile\mkconvertMPtoPDF
+
+% \def\TEXcode#1#2#3#4#5%
+% {\setbox\scratchbox\hbox
+% {\font\temp=#1\space at #2\onebasepoint
+% \temp
+% \MPfshowcommand{#3}}%
+% \setbox\scratchbox\hbox
+% {\hskip#4\onebasepoint
+% \raise#5\onebasepoint
+% \box\scratchbox}%
+% \smashbox\scratchbox
+% \box\scratchbox}
+
+% will be done better
+
+\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can
+ {\def\MPtextdata{#3}% % delegate the splitter to lua
+ \def\MPtextsize{#2}%
+ \def\lastMPmoveX{#4}%
+ \def\lastMPmoveY{#5}%
+ \convertcommand\MPtextdata\to\MPtextdata
+ \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber
+ \executeifdefined{handleMPtext\MPtexttag}
+ {\setbox\scratchbox\hbox
+ {\font\temp=#1\space at #2\onebasepoint
+ \temp
+ \MPfshowcommand{#3}}%
+ \setbox\scratchbox\hbox
+ {\hskip#4\onebasepoint
+ \raise#5\onebasepoint
+ \box\scratchbox}%
+ \smashbox\scratchbox
+ \box\scratchbox}}
+
+%D We save the special variables on a stack. It's not that
+%D fast, but it make implementing the special more convenient.
+
+\def\MPSbegin
+ {\nofMParguments\zerocount}
+
+\def\MPSend
+ {\csname\MPspecial\endcsname}
+
+\def\MPSset
+ {\advance\nofMParguments\plusone
+ \expandafter\def\csname\@@MP\number\nofMParguments\endcsname}
+
+\def\gMPs#1{\csname\@@MP\number#1\endcsname}
+
+%D The boundingbox.
+
+\def\MPSboundingbox#1#2#3#4%
+ {\xdef\MPllx{#1}
+ \xdef\MPlly{#2}
+ \xdef\MPurx{#3}
+ \xdef\MPury{#4}
+ \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax}
+ \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}}
+
+\MPSboundingbox0000
+
+\def\MPSspecial#1#2%
+ {\csname\@@MPSK#2\endcsname}
+
+%D A path is (in most cases) just a sequence of \PDF\ commands.
+
+% \newcontitional\ignoreMPpath
+
+\def\MPSpath
+ {\PDFcode}
+
+\def\MPScode % hack, will be improved
+ {\ifconditional\ignoreMPpath
+ \PDFcode{h W n}%
+ \ifx\extraMPpathcode\empty\else
+ \PDFcode{\extraMPpathcode}%
+ \let\extraMPpathcode\empty
+ \fi
+ \setfalse\ignoreMPpath
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\PDFcode
+ \fi}
+
+\let\MPSrgb \dohandleMPrgb
+\let\MPScmyk\dohandleMPcmyk
+\let\MPSgray\dohandleMPgray
+\let\MPSspot\dohandleMPspot
+
+\protect \endinput
diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex
index 2b2cefe99..f10e91cfe 100644
--- a/tex/context/base/mult-sys.tex
+++ b/tex/context/base/mult-sys.tex
@@ -108,6 +108,7 @@
\definemessageconstant {structures}
\definemessageconstant {symbols}
\definemessageconstant {systems}
+\definemessageconstant {lua}
\definemessageconstant {textblocks}
\definemessageconstant {verbatims}
\definemessageconstant {versions}
diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua
new file mode 100644
index 000000000..77835e04b
--- /dev/null
+++ b/tex/context/base/node-ini.lua
@@ -0,0 +1,905 @@
+if not modules then modules = { } end modules ['node-ini'] = {
+ version = 1.001,
+ comment = "companion to node-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Access to nodes is what gives <l n='luatex'/> its power. Here we
+implement a few helper functions.</p>
+--ldx]]--
+
+nodes = nodes or { }
+nodes.trace = false
+
+-- handy helpers
+
+do
+
+ local remove, free = node.remove, node.free
+
+ function nodes.remove(head, current, free_too)
+ local t = current
+ head, current = remove(head,current)
+ if t then
+ if free_too then
+ free(t)
+ t = nil
+ else
+ t.next, t.prev = nil, nil
+ end
+ end
+ return head, current, t
+ end
+
+ function nodes.delete(head,current)
+ return nodes.remove(head,current,true)
+ end
+
+ nodes.before = node.insert_before
+ nodes.after = node.insert_after
+
+ function nodes.show_list(head, message)
+ if message then
+ texio.write_nl(message)
+ end
+ for n in node.traverse(head) do
+ texio.write_nl(tostring(n))
+ end
+ end
+
+end
+
+-- will move
+
+nodes.processors = { }
+nodes.processors.char = { }
+nodes.processors.char.proc = { }
+
+function nodes.report(t,done)
+ if nodes.trace then
+ if done then
+ if status.output_active then
+ texio.write(string.format("<++ %s>",nodes.count(t)))
+ else
+ texio.write(string.format("<+ %s>",nodes.count(t)))
+ end
+ else
+ if status.output_active then
+ texio.write(string.format("<-- %s>",nodes.count(t)))
+ else
+ texio.write(string.format("<- %s>",nodes.count(t)))
+ end
+ end
+ end
+end
+
+--~ function nodes.count(stack)
+--~ if stack then
+--~ local n = 0
+--~ for _, node in pairs(stack) do
+--~ if node then
+--~ local kind = node[1]
+--~ if kind == 'hlist' or kind == 'vlist' then
+--~ local content = node[8]
+--~ if type(content) == "table" then
+--~ n = n + 1 + nodes.count(content) -- self counts too
+--~ else
+--~ n = n + 1
+--~ end
+--~ elseif kind == 'inline' then
+--~ n = n + nodes.count(node[4]) -- self does not count
+--~ else
+--~ n = n + 1
+--~ end
+--~ end
+--~ end
+--~ return n
+--~ else
+--~ return 0
+--~ end
+--~ end
+
+do
+
+ local hlist, vlist = node.id('hlist'), node.id('vlist')
+
+ function nodes.count(stack)
+ local n = 0
+ while stack do
+ local id = stack.id
+ if id == hlist or id == vlist then
+ local list = stack.list
+ if list then
+ n = n + 1 + nodes.count(list) -- self counts too
+ else
+ n = n + 1
+ end
+ else
+ n = n + 1
+ end
+ stack = stack.next
+ end
+ return n
+ end
+
+end
+
+--[[ldx--
+<p>When manipulating node lists in <l n='context'/>, we will remove
+nodes and insert new ones. While node access was implemented, we did
+quite some experiments in order to find out if manipulating nodes
+in <l n='lua'/> was feasible from the perspective of performance.</p>
+
+<p>First of all, we noticed that the bottleneck is more with excessive
+callbacks (some gets called very often) and the conversion from and to
+<l n='tex'/>'s datastructures. However, at the <l n='lua'/> end, we
+found that inserting and deleting nodes in a table could become a
+bottleneck.</p>
+
+<p>This resulted in two special situations in passing nodes back to
+<l n='tex'/>: a table entry with value <type>false</type> is ignored,
+and when instead of a table <type>true</type> is returned, the
+original table is used.</p>
+
+<p>Insertion is handled (at least in <l n='context'/> as follows. When
+we need to insert a node at a certain position, we change the node at
+that position by a dummy node, tagged <type>inline</type> which itself
+contains the original node and one or more new nodes. Before we pass
+back the list we collapse the list. Of course collapsing could be built
+into the <l n='tex'/> engine, but this is a not so natural extension.</p>
+
+<p>When we collapse (something that we only do when really needed), we
+also ignore the empty nodes.</p>
+--ldx]]--
+
+--~ function nodes.inline(...)
+--~ return { 'inline', 0, nil, { ... } }
+--~ end
+
+--~ do
+
+--~ function collapse(stack,existing_t)
+--~ if stack then
+--~ local t = existing_t or { }
+--~ for _, node in pairs(stack) do
+--~ if node then
+--~ -- if node[3] then node[3][1] = nil end -- remove status bit
+--~ local kind = node[1]
+--~ if kind == 'inline' then
+--~ collapse(node[4],t)
+--~ elseif kind == 'hlist' or kind == 'vlist' then
+--~ local content = node[8]
+--~ if type(content) == "table" then
+--~ node[8] = collapse(content)
+--~ end
+--~ t[#t+1] = node
+--~ else
+--~ t[#t+1] = node
+--~ end
+--~ else
+--~ -- deleted node
+--~ end
+--~ end
+--~ return t
+--~ else
+--~ return stack
+--~ end
+--~ end
+
+--~ nodes.collapse = collapse
+
+--~ end
+
+--[[ldx--
+<p>The following function implements a generic node processor. A
+generic processer is not that much needed, because we often need
+to act differently for horizontal or vertical lists. For instance
+counting nodes needs a different method (ok, we could add a second
+handle for catching them but it would become messy then).</p>
+--ldx]]--
+
+--~ function nodes.each(stack,handle)
+--~ if stack then
+--~ local i = 1
+--~ while true do
+--~ local node = stack[i]
+--~ if node then
+--~ local kind = node[1]
+--~ if kind == 'hlist' or kind == 'vlist' then
+--~ local content = node[8]
+--~ if type(content) == "table" then
+--~ nodes.each(content,handle)
+--~ end
+--~ elseif kind == 'inline' then
+--~ nodes.each(node[4],handle)
+--~ else
+--~ stack[i] = handle(kind,node)
+--~ end
+--~ end
+--~ i = i + 1
+--~ if i > #stack then
+--~ break
+--~ end
+--~ end
+--~ end
+--~ end
+
+--~ function nodes.remove(stack,id,subid) -- "whatsit", 6
+--~ nodes.each(stack, function(kind,node)
+--~ if kind == id and node[2] == subid then
+--~ return false
+--~ else
+--~ return node
+--~ end
+--~ end)
+--~ end
+
+--[[ldx--
+<p>Serializing nodes can be handy for tracing. Also, saving and
+loading node lists can come in handy as soon we are going to
+use external applications to process node lists.</p>
+--ldx]]--
+
+function nodes.show(stack)
+--~ texio.write_nl(table.serialize(stack))
+end
+
+function nodes.save(stack,name) -- *.ltn : luatex node file
+--~ if name then
+--~ file.savedata(name,table.serialize(stack))
+--~ else
+--~ texio.write_nl('log',table.serialize(stack))
+--~ end
+end
+
+function nodes.load(name)
+--~ return file.loaddata(name)
+end
+
+-- node-cap.lua
+
+--~ nodes.capture = { } -- somehow fails
+
+--~ function nodes.capture.start(cbk)
+--~ local head, tail = nil, nil
+--~ callbacks.push(cbk, function(t)
+--~ if tail then
+--~ tail.next = t
+--~ else
+--~ head, tail = t, t
+--~ end
+--~ while tail.next do
+--~ tail = tail.next
+--~ end
+--~ return false
+--~ end)
+--~ function nodes.capture.stop()
+--~ function nodes.capture.stop() end
+--~ function nodes.capture.get()
+--~ function nodes.capture.get() end
+--~ return head
+--~ end
+--~ callbacks.pop(cbk)
+--~ end
+--~ function nodes.capture.get() end -- error
+--~ end
+
+--~ nodes.capture.stop = function() end
+--~ nodes.capture.get = function() end
+
+-- node-gly.lua
+
+if not fonts then fonts = { } end
+if not fonts.tfm then fonts.tfm = { } end
+if not fonts.tfm.id then fonts.tfm.id = { } end
+
+--~ function nodes.do_process_glyphs(stack)
+--~ if not stack or #stack == 0 then
+--~ return false
+--~ elseif #stack == 1 then
+--~ local node = stack[1]
+--~ if node then
+--~ local kind = node[1]
+--~ if kind == 'glyph' then
+--~ local tfmdata = fonts.tfm.id[node[5]] -- we can use fonts.tfm.processor_id
+--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then
+--~ for _, func in pairs(tfmdata.shared.processors) do -- per font
+--~ func(stack,1,node)
+--~ end
+--~ end
+--~ elseif kind == 'hlist' or kind == "vlist" then
+--~ local done = nodes.do_process_glyphs(node[8])
+--~ end
+--~ return true
+--~ else
+--~ return false
+--~ end
+--~ else
+--~ local font_ids = { }
+--~ local done = false
+--~ for _, v in pairs(stack) do
+--~ if v then
+--~ if v[1] == 'glyph' then
+--~ local font_id = v[5]
+--~ local tfmdata = fonts.tfm.id[font_id] -- we can use fonts.tfm.processor_id
+--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then
+--~ font_ids[font_id] = tfmdata.shared.processors
+--~ end
+--~ end
+--~ end
+--~ end
+--~ if done then
+--~ return false
+--~ else
+--~ -- todo: generic loop before
+--~ for font_id, _ in pairs(font_ids) do
+--~ for _, func in pairs(font_ids[font_id]) do -- per font
+--~ local i = 1
+--~ while true do
+--~ local node = stack[i]
+--~ if node and node[1] == 'glyph' and node[5] == font_id then
+--~ i = func(stack,i,node)
+--~ end
+--~ if i < #stack then
+--~ i = i + 1
+--~ else
+--~ break
+--~ end
+--~ end
+--~ end
+--~ end
+--~ for i=1, #stack do
+--~ local node = stack[i]
+--~ if node then
+--~ if node[1] == 'hlist' or node[1] == "vlist" then
+--~ nodes.do_process_glyphs(node[8])
+--~ end
+--~ end
+--~ end
+--~ return true
+--~ end
+--~ end
+--~ end
+
+--~ function nodes.do_process_glyphs(stack)
+--~ local function process_list(node)
+--~ local done = false
+--~ if node and node[1] == 'hlist' or node[1] == "vlist" then
+--~ local attributes = node[3]
+--~ if attributes then
+--~ if not attributes[1] then
+--~ nodes.do_process_glyphs(node[8])
+--~ attributes[1] = 1
+--~ done = true
+--~ end
+--~ else
+--~ nodes.do_process_glyphs(node[8])
+--~ node[3] = { 1 }
+--~ done = true
+--~ end
+--~ end
+--~ return done
+--~ end
+--~ if not stack or #stack == 0 then
+--~ return false
+--~ elseif #stack == 1 then
+--~ return process_list(stack[1])
+--~ else
+--~ local font_ids, found = { }, false
+--~ for _, node in ipairs(stack) do
+--~ if node and node[1] == 'glyph' then
+--~ local font_id = node[5]
+--~ local tfmdata = fonts.tfm.id[font_id] -- we can use fonts.tfm.processor_id
+--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then
+--~ font_ids[font_id], found = tfmdata.shared.processors, true
+--~ end
+--~ end
+--~ end
+--~ if not found then
+--~ return false
+--~ else
+--~ -- we need func to report a 'done'
+--~ local done = false
+--~ for font_id, font_func in pairs(font_ids) do
+--~ for _, func in pairs(font_func) do -- per font
+--~ local i = 1
+--~ while true do
+--~ local node = stack[i]
+--~ if node and node[1] == 'glyph' and node[5] == font_id then
+--~ i = func(stack,i,node)
+--~ done = true
+--~ end
+--~ if i < #stack then
+--~ i = i + 1
+--~ else
+--~ break
+--~ end
+--~ end
+--~ end
+--~ end
+--~ for _, node in ipairs(stack) do
+--~ if node then
+--~ done = done or process_list(node)
+--~ end
+--~ end
+--~ return done
+--~ end
+--~ end
+--~ end
+
+--~ function nodes.process_glyphs(t,...)
+--~ input.start_timing(nodes)
+--~ local done = nodes.do_process_glyphs(t)
+--~ if done then
+--~ t = nodes.collapse(t)
+--~ end
+--~ input.stop_timing(nodes)
+--~ nodes.report(t,done)
+--~ if done then
+--~ return t
+--~ else
+--~ return true
+--~ end
+--~ end
+
+--~ function nodes.do_process_glyphs(stack)
+--~ local function process_list(node)
+--~ local done = false
+--~ if node and node[1] == 'hist' or node[1] == "vlist" then
+--~ local attributes = node[3]
+--~ if attributes then
+--~ if attributes[1] then
+--~ else
+--~ local content = node[8]
+--~ if type(content) == "table" then
+--~ nodes.do_process_glyphs(content)
+--~ end
+--~ attributes[1] = 1
+--~ done = true
+--~ end
+--~ else
+--~ nodes.do_process_glyphs(node[8])
+--~ node[3] = { 1 }
+--~ done = true
+--~ end
+--~ end
+--~ return done
+--~ end
+--~ if not stack or #stack == 0 then
+--~ return false
+--~ elseif #stack == 1 then
+--~ return process_list(stack[1])
+--~ else
+--~ local font_ids, found = { }, false
+--~ for _, node in ipairs(stack) do
+--~ if node and node[1] == 'glyph' then
+--~ local font_id = node[5]
+--~ local tfmdata = fonts.tfm.id[font_id] -- we can use fonts.tfm.processor_id
+--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then
+--~ font_ids[font_id], found = tfmdata.shared.processors, true
+--~ end
+--~ end
+--~ end
+--~ if not found then
+--~ return false
+--~ else
+--~ -- we need func to report a 'done'
+--~ local done = false
+--~ for font_id, font_func in pairs(font_ids) do
+--~ for _, func in pairs(font_func) do -- per font
+--~ local i = 1
+--~ while true do
+--~ local node = stack[i]
+--~ if node and node[1] == 'glyph' and node[5] == font_id then
+--~ i = func(stack,i,node)
+--~ done = true
+--~ end
+--~ if i < #stack then
+--~ i = i + 1
+--~ else
+--~ break
+--~ end
+--~ end
+--~ end
+--~ end
+--~ for _, node in ipairs(stack) do
+--~ if node then
+--~ done = done or process_list(node)
+--~ end
+--~ end
+--~ return done
+--~ end
+--~ end
+--~ end
+
+--~ function nodes.process_glyphs(t,...)
+--~ if status.output_active then
+--~ return true
+--~ else
+--~ input.start_timing(nodes)
+--~ local done = nodes.do_process_glyphs(t)
+--~ if done then
+--~ t = nodes.collapse(t)
+--~ end
+--~ input.stop_timing(nodes)
+--~ nodes.report(t,done)
+--~ if done then
+--~ return t
+--~ else
+--~ return true
+--~ end
+--~ end
+--~ end
+
+--~ do
+
+--~ local function do_process_glyphs(stack)
+--~ if not stack or #stack == 0 then
+--~ return false
+--~ elseif #stack == 1 and stack[1][1] ~= 'glyph' then
+--~ return false
+--~ else
+--~ local font_ids, found = { }, false
+--~ local fti = fonts.tfm.id
+--~ for _, node in ipairs(stack) do
+--~ if node and node[1] == 'glyph' then
+--~ local font_id = node[5]
+--~ local tfmdata = fti[font_id] -- we can use fonts.tfm.processor_id
+--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then
+--~ font_ids[font_id], found = tfmdata.shared.processors, true
+--~ end
+--~ end
+--~ end
+--~ if not found then
+--~ return false
+--~ else
+--~ -- we need func to report a 'done'
+--~ local done = false
+--~ for font_id, font_func in pairs(font_ids) do
+--~ for _, func in pairs(font_func) do -- per font
+--~ local i = 1
+--~ while true do
+--~ local node = stack[i]
+--~ if node and node[1] == 'glyph' and node[5] == font_id then
+--~ i = func(stack,i,node)
+--~ done = true
+--~ end
+--~ if i < #stack then
+--~ i = i + 1
+--~ else
+--~ break
+--~ end
+--~ end
+--~ end
+--~ end
+--~ for _, node in ipairs(stack) do
+--~ if node then
+--~ done = done or process_list(node)
+--~ end
+--~ end
+--~ return done
+--~ end
+--~ end
+--~ end
+
+--~ local function do_collapse_glyphs(stack,existing_t)
+--~ if stack then
+--~ local t = existing_t or { }
+--~ for _, node in pairs(stack) do
+--~ if node then
+--~ if node[3] then node[3][1] = nil end -- remove status bit / 1 sec faster on 15 sec
+--~ if node[1] == 'inline' then
+--~ local nodes = node[4]
+--~ if #nodes == 1 then
+--~ t[#t+1] = nodes[1]
+--~ else
+--~ do_collapse_glyphs(nodes,t)
+--~ end
+--~ else
+--~ t[#t+1] = node
+--~ end
+--~ else
+--~ -- deleted node
+--~ end
+--~ end
+--~ return t
+--~ else
+--~ return stack
+--~ end
+--~ end
+
+--~ function nodes.process_glyphs(t,...)
+--~ --~ print(...)
+--~ if status.output_active then -- not ok, we need a generic blocker, pagebody ! / attr tex.attibutes
+--~ return true
+--~ else
+--~ input.start_timing(nodes)
+--~ local done = do_process_glyphs(t)
+--~ if done then
+--~ t = do_collapse_glyphs(t)
+--~ end
+--~ input.stop_timing(nodes)
+--~ nodes.report(t,done)
+--~ if done then
+--~ --~ texio.write_nl("RETURNING PROCESSED LIST")
+--~ return t
+--~ else
+--~ --~ texio.write_nl("RETURNING SIGNAL")
+--~ return true
+--~ end
+--~ end
+--~ end
+
+--~ end
+
+do
+
+ local glyph = node.id('glyph')
+ local pushmarks = false
+
+ function do_process_glyphs(head) -- beware, we need to handle shifted heads -- todo
+ if not head then
+ return head
+ end
+ local usedfonts, found, fontdata = { }, false, fonts.tfm.id
+ for n in node.traverse_id(glyph,head) do
+ local font = n.font
+ if not usedfonts[font] then
+ local shared = fontdata[font].shared
+ if shared and shared.processors then
+ usedfonts[font], found = shared.processors, true
+ end
+ end
+ end
+ if not found then
+ return head, false
+ else
+ local tail, done = node.slide(head), false
+ for font, processors in pairs(usedfonts) do
+ if pushmarks then
+ local h, d = fonts.pushmarks(head,font)
+ head, done = head or h, done or d
+ end
+ for _, processor in ipairs(processors) do
+ local h, d = processor(head,font)
+ head, done = head or h, done or d
+ end
+ if pushmarks then
+ local h, d = fonts.popmarks(head,font)
+ head, done = head or h, done or d
+ end
+ end
+ return head, done
+ end
+ end
+
+ function nodes.process_glyphs(head)
+ if status.output_active then -- not ok, we need a generic blocker, pagebody ! / attr tex.attibutes
+ return true
+ else
+ input.start_timing(nodes)
+ local head, done = do_process_glyphs(head)
+ input.stop_timing(nodes)
+ nodes.report(head,done)
+ if done then
+ return head -- something changed
+ elseif head then
+ return true -- nothing changed
+ else
+ return false -- delete list
+ end
+ end
+ end
+
+end
+
+-- vbox: grouptype: vbox vtop output split_off split_keep | box_type: exactly|aditional
+-- hbox: grouptype: hbox adjusted_hbox(=hbox_in_vmode) | box_type: exactly|aditional
+
+callback.register('pre_linebreak_filter', nodes.process_glyphs)
+callback.register('hpack_filter', nodes.process_glyphs)
+
+--~ callback.register('pre_linebreak_filter', function(t,...)
+--~ print("pre_linebreak_filter",...)
+--~ return nodes.process_glyphs(t)
+--~ end )
+--~ callback.register('hpack_filter', function(t,...)
+--~ print("hpack_filter",...)
+--~ return nodes.process_glyphs(t)
+--~ end )
+
+function nodes.length(head)
+ if head then
+ local m = 0
+ for n in node.traverse(head) do
+ m = m + 1
+ end
+ return m
+ else
+ return 0
+ end
+end
+
+do
+
+--~ function nodes.totable(n)
+--~ function totable(n)
+--~ local f, tt = node.fields(n.id,n.subtype), { }
+--~ for _,v in ipairs(f) do
+--~ local nv = n[v]
+--~ if nv then
+--~ local tnv = type(nv)
+--~ if tnv == "string" or tnv == "number" then
+--~ tt[v] = nv
+--~ else -- userdata
+--~ tt[v] = nodes.totable(nv)
+--~ end
+--~ end
+--~ end
+--~ return tt
+--~ end
+--~ local t = { }
+--~ while n do
+--~ t[#t+1] = totable(n)
+--~ n = n.next
+--~ end
+--~ return t
+--~ end
+
+ local expand = {
+ list = true,
+ pre = true,
+ post = true,
+ spec = true,
+ attr = true,
+ components = true,
+ }
+
+ -- flat: don't use next, but indexes
+ -- verbose: also add type
+
+ function nodes.totable(n,flat,verbose)
+ function totable(n,verbose)
+ local f = node.fields(n.id,n.subtype)
+ local tt = { }
+ for _,v in ipairs(f) do
+ if n[v] then
+ if v == "ref_count" then
+ -- skip
+ elseif expand[v] then -- or: type(n[v]) ~= "string" or type(n[v]) ~= "number"
+ tt[v] = nodes.totable(n[v],flat,verbose)
+ else
+ tt[v] = n[v]
+ end
+ end
+ end
+ if verbose then
+ tt.type = node.type(tt.id)
+ end
+ return tt
+ end
+ if flat then
+ local t = { }
+ while n do
+ t[#t+1] = totable(n,verbose)
+ n = n.next
+ end
+ return t
+ else
+ local t = totable(n,verbose)
+ if n.next then
+ t.next = nodes.totable(n.next,flat,verbose)
+ end
+ return t
+ end
+ end
+
+ local function key(k)
+ if type(k) == "number" then
+ return "["..k.."]"
+ else
+ return k
+ end
+ end
+
+ local function serialize(root,name,handle,depth,m)
+ handle = handle or print
+ if depth then
+ depth = depth .. " "
+ handle(("%s%s={"):format(depth,key(name)))
+ else
+ depth = ""
+ if type(name) == "string" then
+ if name == "return" then
+ handle("return {")
+ else
+ handle(name .. "={")
+ end
+ elseif type(name) == "number" then
+ handle("[" .. name .. "]={")
+ else
+ handle("t={")
+ end
+ end
+ if root then
+ local fld
+ if root.id then
+ fld = node.fields(root.id,root.subtype)
+ else
+ fld = table.sortedkeys(root)
+ end
+ if type(root) == 'table' and root['type'] then -- userdata or table
+ handle(("%s %s=%q,"):format(depth,'type',root['type']))
+ end
+ for _,k in ipairs(fld) do
+ if k then
+ local v = root[k]
+ local t = type(v)
+ if t == "number" then
+ handle(("%s %s=%s,"):format(depth,key(k),v))
+ elseif t == "string" then
+ handle(("%s %s=%q,"):format(depth,key(k),v))
+ elseif v then -- userdata or table
+ serialize(v,k,handle,depth,n+1)
+ end
+ end
+ end
+ if root['next'] then -- userdata or table
+ serialize(root['next'],'next',handle,depth,n+1)
+ end
+ end
+ if m and m > 0 then
+ handle(("%s},"):format(depth))
+ else
+ handle(("%s}"):format(depth))
+ end
+ end
+
+ function nodes.serialize(root,name)
+ local t = { }
+ local function flush(s)
+ t[#t+1] = s
+ end
+ serialize(root, name, flush, nil, nil)
+ return table.concat(t,"\n")
+ end
+
+ function nodes.serializebox(n,flat,verbose)
+ return nodes.serialize(nodes.totable(tex.box[n],flat,verbose))
+ -- return nodes.serialize(tex.box[n])
+ end
+
+ function nodes.visualizebox(...)
+ -- tex.sprint(tex.ctxcatcodes,"\\starttyping\n" .. nodes.serializebox(...) .. "\n\\stoptyping\n")
+ tex.print(tex.ctxcatcodes,"\\starttyping")
+ tex.print(nodes.serializebox(...))
+ tex.print("\\stoptyping")
+ end
+
+end
+
+if not node.list_has_attribute then
+
+ function node.list_has_attribute(list,attribute)
+ if list and attribute then
+ for n in node.traverse(list) do
+ local a = has_attribute(n,attribute)
+ if a then return a end
+ end
+ end
+ return false
+ end
+
+end
+
+function nodes.pack_list(head)
+ local t = { }
+ for n in node.traverse(head) do
+ t[#t+1] = tostring(n)
+ end
+ return t
+end
+
diff --git a/tex/context/base/node-ini.tex b/tex/context/base/node-ini.tex
new file mode 100644
index 000000000..6b6700e5d
--- /dev/null
+++ b/tex/context/base/node-ini.tex
@@ -0,0 +1,46 @@
+%D \module
+%D [ file=node-ini,
+%D version=2006.08.20,
+%D title=\CONTEXT\ Character Macros,
+%D subtitle=Node Support (Initialization),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Node Support (initialization)}
+
+\registerctxluafile{node-ini}{1.001}
+
+% \appendtoks
+% \ctxlua {
+% callbacks.push('hpack_filter')
+% callbacks.push('vpack_filter')
+% callbacks.push('buildpage_filter')
+% callbacks.push('pre_linebreak_filter')
+% callbacks.push('pre_output_filter')
+% }%
+% \to \everybeforeoutput
+% \appendtoks
+% \ctxlua {
+% callbacks.pop('hpack_filter')
+% callbacks.pop('vpack_filter')
+% callbacks.pop('buildpage_filter')
+% callbacks.pop('pre_linebreak_filter')
+% callbacks.pop('pre_output_filter')
+% }%
+% \to \everyafteroutput
+
+\newcount\shownodescounter
+
+\def\shownextnodes {\afterassignment\doshownodes\shownextnodescounter}
+\def\showflatnodes {\afterassignment\doshownodes\showflatnodescounter}
+\def\doshownextnodes {\ctxlua{texio.write_nl('log',nodes.serializebox(\number\shownodescounter,false,true))}}
+\def\doshowflatnodes {\ctxlua{texio.write_nl('log',nodes.serializebox(\number\shownodescounter,true, true))}}
+\def\visualizenextnodes{\dowithnextbox{\ctxlua{nodes.visualizebox(\number\nextbox,false,true)}}}
+\def\visualizeflatnodes{\dowithnextbox{\ctxlua{nodes.visualizebox(\number\nextbox,true,true)}}}
+
+\endinput
diff --git a/tex/context/base/page-imp.tex b/tex/context/base/page-imp.tex
index 2b96e6f44..3acf201bc 100644
--- a/tex/context/base/page-imp.tex
+++ b/tex/context/base/page-imp.tex
@@ -144,6 +144,8 @@
\let\pagestoshipout\empty % {1,3,6}
\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even
+\ifx\processshipoutbox\undefined \let\processshipoutbox\firstofoneargument \fi
+
\def\actualshipout#1%
{\global\advance\shippedoutpages\plusone
% this is not resource safe!
@@ -170,7 +172,7 @@
\vskip\scratchdimen
\hskip\scratchdimen
\hbox % \setbox0=\box.. is nicer
- {\setbox0\hbox{#1}% just in case there are objects there
+ {\setbox0\hbox{\processshipoutbox{#1}}% just in case there are objects there, hook for testing
\setbox\scratchbox\hbox
{% before the main one !
\ifcase\realfolio \or
diff --git a/tex/context/base/regi-8859-1.lua b/tex/context/base/regi-8859-1.lua
new file mode 100644
index 000000000..affc65762
--- /dev/null
+++ b/tex/context/base/regi-8859-1.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-1.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-1"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-10.lua b/tex/context/base/regi-8859-10.lua
new file mode 100644
index 000000000..2b1d2d4ab
--- /dev/null
+++ b/tex/context/base/regi-8859-10.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-10.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-10"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
+ 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138
+}
diff --git a/tex/context/base/regi-8859-11.lua b/tex/context/base/regi-8859-11.lua
new file mode 100644
index 000000000..f6ff34b69
--- /dev/null
+++ b/tex/context/base/regi-8859-11.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-11.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-11"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000
+}
diff --git a/tex/context/base/regi-8859-13.lua b/tex/context/base/regi-8859-13.lua
new file mode 100644
index 000000000..13b631e9b
--- /dev/null
+++ b/tex/context/base/regi-8859-13.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-13.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-13"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019
+}
diff --git a/tex/context/base/regi-8859-14.lua b/tex/context/base/regi-8859-14.lua
new file mode 100644
index 000000000..ae349ed36
--- /dev/null
+++ b/tex/context/base/regi-8859-14.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-14.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-14"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
+ 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-15.lua b/tex/context/base/regi-8859-15.lua
new file mode 100644
index 000000000..14891c7ff
--- /dev/null
+++ b/tex/context/base/regi-8859-15.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-15.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-15"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-16.lua b/tex/context/base/regi-8859-16.lua
new file mode 100644
index 000000000..426c43773
--- /dev/null
+++ b/tex/context/base/regi-8859-16.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-16.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-16"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B,
+ 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF
+}
diff --git a/tex/context/base/regi-8859-2.lua b/tex/context/base/regi-8859-2.lua
new file mode 100644
index 000000000..98988cd8e
--- /dev/null
+++ b/tex/context/base/regi-8859-2.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-2.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-2"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
+ 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
+}
diff --git a/tex/context/base/regi-8859-3.lua b/tex/context/base/regi-8859-3.lua
new file mode 100644
index 000000000..ab94e5a77
--- /dev/null
+++ b/tex/context/base/regi-8859-3.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-3.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-3"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B,
+ 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9
+}
diff --git a/tex/context/base/regi-8859-4.lua b/tex/context/base/regi-8859-4.lua
new file mode 100644
index 000000000..079285590
--- /dev/null
+++ b/tex/context/base/regi-8859-4.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-4.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-4"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
+ 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
+ 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
+ 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
+}
diff --git a/tex/context/base/regi-8859-5.lua b/tex/context/base/regi-8859-5.lua
new file mode 100644
index 000000000..5f6df9242
--- /dev/null
+++ b/tex/context/base/regi-8859-5.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-5.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-5"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F
+}
diff --git a/tex/context/base/regi-8859-6.lua b/tex/context/base/regi-8859-6.lua
new file mode 100644
index 000000000..86ed0b262
--- /dev/null
+++ b/tex/context/base/regi-8859-6.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-6.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-6"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F,
+ 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
+ 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+}
diff --git a/tex/context/base/regi-8859-7.lua b/tex/context/base/regi-8859-7.lua
new file mode 100644
index 000000000..bb110fbfa
--- /dev/null
+++ b/tex/context/base/regi-8859-7.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-7.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-7"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
+}
diff --git a/tex/context/base/regi-8859-8.lua b/tex/context/base/regi-8859-8.lua
new file mode 100644
index 000000000..a6821499a
--- /dev/null
+++ b/tex/context/base/regi-8859-8.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-8.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-8"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 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, 0x2017,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
+}
diff --git a/tex/context/base/regi-8859-9.lua b/tex/context/base/regi-8859-9.lua
new file mode 100644
index 000000000..44a3a18ab
--- /dev/null
+++ b/tex/context/base/regi-8859-9.lua
@@ -0,0 +1,26 @@
+-- filename : regi-8859-9.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["8859-9"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
+}
diff --git a/tex/context/base/regi-cp1250.lua b/tex/context/base/regi-cp1250.lua
new file mode 100644
index 000000000..aa374193a
--- /dev/null
+++ b/tex/context/base/regi-cp1250.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1250.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1250"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
+ 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
+ 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
+}
diff --git a/tex/context/base/regi-cp1251.lua b/tex/context/base/regi-cp1251.lua
new file mode 100644
index 000000000..88204df36
--- /dev/null
+++ b/tex/context/base/regi-cp1251.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1251.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1251"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
+ 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
+ 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
+}
diff --git a/tex/context/base/regi-cp1252.lua b/tex/context/base/regi-cp1252.lua
new file mode 100644
index 000000000..910656edf
--- /dev/null
+++ b/tex/context/base/regi-cp1252.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1252.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1252"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
+}
diff --git a/tex/context/base/regi-cp1253.lua b/tex/context/base/regi-cp1253.lua
new file mode 100644
index 000000000..6d854e967
--- /dev/null
+++ b/tex/context/base/regi-cp1253.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1253.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1253"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
+}
diff --git a/tex/context/base/regi-cp1254.lua b/tex/context/base/regi-cp1254.lua
new file mode 100644
index 000000000..12f094b46
--- /dev/null
+++ b/tex/context/base/regi-cp1254.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1254.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1254"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
+}
diff --git a/tex/context/base/regi-cp1255.lua b/tex/context/base/regi-cp1255.lua
new file mode 100644
index 000000000..77119da56
--- /dev/null
+++ b/tex/context/base/regi-cp1255.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1255.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1255"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
+ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
+}
diff --git a/tex/context/base/regi-cp1256.lua b/tex/context/base/regi-cp1256.lua
new file mode 100644
index 000000000..9bd3dbd73
--- /dev/null
+++ b/tex/context/base/regi-cp1256.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1256.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1256"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+ 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
+ 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
+ 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
+ 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2
+}
diff --git a/tex/context/base/regi-cp1257.lua b/tex/context/base/regi-cp1257.lua
new file mode 100644
index 000000000..d043b256f
--- /dev/null
+++ b/tex/context/base/regi-cp1257.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1257.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1257"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9
+}
diff --git a/tex/context/base/regi-cp1258.lua b/tex/context/base/regi-cp1258.lua
new file mode 100644
index 000000000..45fa7eca0
--- /dev/null
+++ b/tex/context/base/regi-cp1258.lua
@@ -0,0 +1,26 @@
+-- filename : regi-cp1258.lua
+-- comment : companion to char-reg.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+regimes.data["cp1258"] = { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
+ 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
+ 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF
+}
diff --git a/tex/context/base/regi-ini.lua b/tex/context/base/regi-ini.lua
new file mode 100644
index 000000000..07dd54c1f
--- /dev/null
+++ b/tex/context/base/regi-ini.lua
@@ -0,0 +1,107 @@
+if not modules then modules = { } end modules ['regi-ini'] = {
+ version = 1.001,
+ comment = "companion to regi-ini.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>Regimes take care of converting the input characters into
+<l n='utf'/> sequences. The conversion tables are loaded at
+runtime.</p>
+--ldx]]--
+
+regimes = regimes or { }
+regimes.data = regimes.data or { }
+regimes.utf = regimes.utf or { }
+regimes.context = regimes.context or { }
+
+-- setmetatable(regimes.data,_empty_table_)
+
+regimes.currentregime = ""
+
+--[[ldx--
+<p>We will hook regime handling code into the input methods.</p>
+--ldx]]--
+
+input = input or { }
+input.filters = input.filters or { }
+
+function regimes.number(n)
+ if type(n) == "string" then return tonumber(n,16) else return n end
+end
+
+function regimes.define(c) -- is this used at all?
+ local r, u, s = c.regime, c.unicodeslot, c.slot
+ regimes.data[r] = regimes.data[r] or { }
+ if s then
+ if u then
+ regimes.data[r][regimes.number(s)] = regimes.number(u)
+ else
+ regimes.data[r][regimes.number(s)] = 0
+ end
+ else
+ input.report(string.format("regi-ini: invalid regime code %s/%s", r, s))
+ end
+end
+
+function regimes.load(regime)
+ environment.loadlucfile("regi-"..regime, 1.001)
+ if regimes.data[regime] then
+ regimes.utf[regime] = { }
+ for k,v in pairs(regimes.data[regime]) do
+ regimes.utf[regime][string.char(k)] = unicode.utf8.char(v)
+ end
+ end
+end
+
+function regimes.translate(line,regime)
+ if regime and line and regimes.utf[regime] then
+ return line:gsub("(.)", regimes.utf[regime])
+ else
+ return line
+ end
+end
+
+function regimes.enable(regime)
+ if regimes.data[regime] then
+ regimes.currentregime = regime
+ input.filters.dynamic_translator = function(s)
+ return regimes.translate(s,regimes.currentregime)
+ end
+ else
+ regimes.disable()
+ end
+end
+
+function regimes.disable()
+ regimes.currentregime = ""
+ input.filters.dynamic_translator = nil
+end
+
+function input.filters.frozen_translator(regime)
+ return function(s)
+ return regimes.translate(s,regime)
+ end
+end
+
+--[[ldx--
+<p>The following code is rather <l n='context'/> specific.</p>
+--ldx]]--
+
+function regimes.context.show(regime)
+ local flush, tc = tex.sprint, tex.ctxcatcodes
+ local r = regimes.data[regime]
+ if r then
+ flush(tc, "\\starttabulate[|rT|T|rT|lT|lT|lT|]")
+ for k, v in ipairs(r) do
+ flush(tc, string.format("\\NC %s\\NC\\getvalue{%s}\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR", k,
+ characters.contextname(v), characters.hexindex(v), characters.contextname(v),
+ characters.category(v), characters.description(v)))
+ end
+ flush(tc, "\\stoptabulate")
+ else
+ flush(tc, "unknown regime " .. regime)
+ end
+end
diff --git a/tex/context/base/regi-ini.mkiv b/tex/context/base/regi-ini.mkiv
new file mode 100644
index 000000000..ef269985c
--- /dev/null
+++ b/tex/context/base/regi-ini.mkiv
@@ -0,0 +1,39 @@
+%D \module
+%D [ file=char-reg,
+%D version=2005.04.25,
+%D title=\CONTEXT\ Lua Macros,
+%D subtitle=Regime Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+%D First some initialization code:
+
+\registerctxluafile{regi-ini}{1.001}
+
+\def\mkloadregime #1{\ctxlua{regimes.load("#1")}}
+\def\mkenableregime #1{\ctxlua{regimes.enable("#1")}}
+\def\mkdisableregime {\ctxlua{regimes.disable()}}
+\def\mkshowregime #1{\ctxlua{regimes.context.show("#1")}}
+
+\appendtoks
+ \pushmacro\currentregime
+ \disableregime
+\to \everystartreadingfile
+
+\appendtoks
+ \popmacro\currentregime
+ \enableregime[\currentregime]%
+\to \everystopreadingfile
+
+\protect \endinput
+
+% \starttext
+% \showregimetable{cp1250}
+% \stoptext
diff --git a/tex/context/base/regi-utf.tex b/tex/context/base/regi-utf.tex
index 90e018684..297ad9649 100644
--- a/tex/context/base/regi-utf.tex
+++ b/tex/context/base/regi-utf.tex
@@ -37,9 +37,9 @@
\expandafter \endinput
\endXETEX
-\beginMETATEX
+\beginLUATEX
\expandafter \endinput
-\endMETATEX
+\endLUATEX
\unprotect
diff --git a/tex/context/base/s-abr-01.tex b/tex/context/base/s-abr-01.tex
index dd5160a0d..98e36e2f1 100644
--- a/tex/context/base/s-abr-01.tex
+++ b/tex/context/base/s-abr-01.tex
@@ -24,32 +24,35 @@
\logo [MKIII] {MkIII}
\logo [MKIV] {MkIV}
+%logo [FGA] {fga}
+%logo [FGBBS] {fgbbs}
\logo [ACROBAT] {Acro\-bat}
\logo [AFM] {afm}
\logo [ALEPH] {Aleph} % {\mathematics{\aleph}}
\logo [ALGOL] {ALGOL}
-\logo [ARABTEX] {Arab\TeX}
+\logo [AMS] {ams}
\logo [AMSLATEX] {\AmSLaTeX}
\logo [AMSTEX] {\AmSTeX}
-\logo [AMS] {ams}
\logo [ANSI] {ansi}
-\logo [ASCIITEX] {ascii\TeX}
+\logo [ARABTEX] {Arab\TeX}
\logo [ASCII] {ascii}
+\logo [ASCIITEX] {ascii\TeX}
\logo [BACHOTEX] {Bacho\TeX}
\logo [BIBTEX] {bib\TeX}
\logo [BLUESKY] {BlueSky}
-\logo [BSD] {bsd}
\logo [BMP] {bmp}
-\logo [CDROM] {cdrom}
+\logo [BSD] {bsd}
+\logo [CALCMATH] {CalcMath}
\logo [CD] {cd}
+\logo [CDROM] {cdrom}
+\logo [CID] {cid}
\logo [CMR] {cmr}
\logo [CMYK] {cmyk}
\logo [CODHOST] {CodHost}
-\logo [CALCMATH] {CalcMath}
\logo [CONTEXT] {\ConTeXt}
\logo [CSS] {css}
-\logo [CID] {cid}
\logo [CTAN] {ctan}
+\logo [CTXTOOLS] {ctxtools}
\logo [CWEB] {cweb}
\logo [DANTE] {Dante}
\logo [DISTILLER] {distiller}
@@ -59,41 +62,38 @@
\logo [DTK] {dtk}
\logo [DTP] {dtp}
\logo [DVD] {dvd}
-\logo [DVIPSONE] {dvipsone}
+\logo [DVI] {dvi}
\logo [DVIPDFM] {dvipdfm}
\logo [DVIPDFMX] {dvipdfmx}
\logo [DVIPOS] {dvipos}
\logo [DVIPS] {dvips}
+\logo [DVIPSONE] {dvipsone}
\logo [DVISCR] {dviscr}
\logo [DVIWINDO] {dviwindo}
-\logo [DVI] {dvi}
\logo [EC] {ec}
\logo [EIFFEL] {Eiffel}
\logo [EMACS] {emacs}
\logo [EMTEX] {em\TeX}
+\logo [ENCODING] {enc}
\logo [ENCTEX] {enc\TeX}
\logo [EPS] {eps}
-\logo [EUROBACHOTEX] {EuroBacho\TeX}
-\logo [ENCODING] {enc}
-\logo [MAPPING] {map}
-\logo [EXAMPLEX] {examplex}
-\logo [EXAMPLET] {examplet}
-\logo [EXAMPLER] {exampler}
-\logo [EXAMPLEQ] {exampleq}
-\logo [EXAMPLED] {exampled}
-\logo [EXAMPLE] {eXaMpLe}
-\logo [EXIMPLE] {eXiMpLe}
\logo [ETEX] {\eTeX}
+\logo [EUROBACHOTEX] {EuroBacho\TeX}
\logo [EUROMATH] {EuroMath}
\logo [EUROTEX] {Euro\TeX}
+\logo [EXAMPLE] {eXaMpLe}
+\logo [EXAMPLED] {exampled}
+\logo [EXAMPLEQ] {exampleq}
+\logo [EXAMPLER] {exampler}
+\logo [EXAMPLET] {examplet}
+\logo [EXAMPLEX] {examplex}
+\logo [EXIMPLE] {eXiMpLe}
\logo [FAQ] {faq}
-%logo [FGA] {fga}
\logo [FDF] {fdf}
-%logo [FGBBS] {fgbbs}
+\logo [FONTFORGE] {FontForge}
+\logo [FOXET] {foXet}
\logo [FPTEX] {fp\TeX}
\logo [FREEBSD] {FreeBSD}
-\logo [FOXET] {foXet}
-\logo [FONTFORGE] {FontForge}
\logo [FTP] {ftp}
\logo [GHOSTSCRIPT]{Ghost\-script}
\logo [GHOSTVIEW] {Ghost\-view}
@@ -103,11 +103,10 @@
\logo [GS] {Ghost\-Script}
\logo [GUST] {Gust}
\logo [GWTEX] {gw\TeX}
-\logo [HZ] {hz}
-\logo [HTTP] {http}
\logo [HSB] {hsb}
\logo [HTML] {html}
-\logo [XHTML] {xhtml}
+\logo [HTTP] {http}
+\logo [HZ] {hz}
\logo [IBM] {ibm}
\logo [IMAGEMAGICK]{ImageMagick}
\logo [INITEX] {ini\TeX}
@@ -115,27 +114,28 @@
\logo [IO] {io}
\logo [IRCNET] {IRCnet}
\logo [ISO] {iso}
-\logo [JAVASCRIPT] {Java\-Script}
\logo [JAVA] {Java}
+\logo [JAVASCRIPT] {Java\-Script}
\logo [JPEG] {jpeg}
\logo [JPG] {jpg}
+\logo [KPATHSEA] {kpathsea}
\logo [KPSE] {kpse}
\logo [KPSEWHICH] {kpsewhich}
-\logo [KPATHSEA] {kpathsea}
\logo [LAMSTEX] {\LamSTeX}
+\logo [LATEX] {\LaTeX}
\logo [LATEXTE] {\LaTeX2e}
\logo [LATEXTN] {\LaTeX2.09}
-\logo [LATEX] {\LaTeX}
\logo [LINUX] {linux}
\logo [LISP] {Lisp}
-\logo [LUAJIT] {LuaJIT}
+\logo [LPEG] {lpeg}
\logo [LUA] {Lua}
+\logo [LUAJIT] {LuaJIT}
\logo [LUATEX] {Lua\TeX}
-\logo [TEXLUA] {\TeX Lua}
\logo [LUATOOLS] {luatools}
\logo [MACOSX] {MacOSX}
\logo [MACROTEX] {Macro\TeX}
\logo [MAKEMPY] {MakeMPY}
+\logo [MAPPING] {map}
\logo [MAPS] {Maps}
\logo [MATHML] {MathML}
\logo [METAFONT] {\MetaFont}
@@ -143,33 +143,36 @@
\logo [METATEX] {Meta\TeX}
\logo [MIKTEX] {Mik\TeX}
\logo [MLTEX] {ml\TeX}
-\logo [MTXTOOLS] {mtxtools}
\logo [MODULA] {Modula}
\logo [MOV] {mov}
\logo [MPS] {mps}
\logo [MPTOPDF] {mptopdf}
\logo [MSDOS] {msdos}
\logo [MSWINDOWS] {MS~Windows}
+\logo [MTXRUN] {mtxrun}
+\logo [MTXTOOLS] {mtxtools}
\logo [NETPBM] {NetPBM}
\logo [NTG] {ntg}
\logo [NTS] {nts}
+\logo [OFM] {ofm}
\logo [OMEGA] {Omega}
-\logo [OPI] {opi}
\logo [OPENMATH] {OpenMath}
\logo [OPENTYPE] {OpenType}
-\logo [OTP] {otp}
+\logo [OPI] {opi}
\logo [OTF] {otf}
-\logo [OFM] {ofm}
+\logo [OTP] {otp}
\logo [OVF] {ovf}
\logo [PASCAL] {Pascal}
\logo [PCTEX] {pc\TeX}
+\logo [PDF] {pdf}
\logo [PDFETEX] {pdfe\TeX}
\logo [PDFTEX] {pdf\TeX}
+\logo [PDFTOOLS] {pdftools}
\logo [PDFTOPS] {pdftops}
-\logo [PDF] {pdf}
-\logo [PERLTK] {Perl/Tk}
\logo [PERL] {Perl}
+\logo [PERLTK] {Perl/Tk}
\logo [PICTEX] {\PiCTeX}
+\logo [PK] {pk}
\logo [PLAIN] {Plain}
\logo [PNG] {png}
\logo [POSIX] {posix}
@@ -178,17 +181,18 @@
\logo [PRAGMA] {Pragma ADE}
\logo [PRESS] {press}
\logo [PRIFIL] {prifil}
+\logo [PS] {Post\-Script}
\logo [PSCHECK] {pscheck}
+\logo [PSTOEDIT] {pstoedit}
\logo [PSTOPAGE] {pstopage}
\logo [PSTOPDF] {pstopdf}
\logo [PSTRICKS] {pstricks}
-\logo [PSTOEDIT] {pstoedit}
-\logo [PS] {Post\-Script}
+\logo [RAM] {ram}
\logo [READER] {Acro\-bat Reader}
\logo [RELAXNG] {Relax\kern.125emNG}
-\logo [RAM] {ram}
-\logo [RUBY] {Ruby}
\logo [RGB] {rgb}
+\logo [RLXTOOLS] {rlxtools}
+\logo [RUBY] {Ruby}
\logo [SCITE] {SciTE}
\logo [SGML] {sgml}
\logo [SI] {si}
@@ -197,73 +201,71 @@
\logo [TCPIP] {tcp/ip}
\logo [TDS] {tds} % no sc te
\logo [TETEX] {te\TeX} % no sc te
+\logo [TEX] {\TeX}
\logo [TEXADRES] {\TeX adress}
\logo [TEXBASE] {\TeX base}
\logo [TEXEDIT] {\TeX edit}
\logo [TEXEXEC] {\TeX exec}
+\logo [TEXFONT] {\TeX font}
\logo [TEXFORM] {\TeX form}
\logo [TEXLIVE] {\TeX Live}
+\logo [TEXLUA] {\TeX Lua}
\logo [TEXMF] {texmf}
+\logo [TEXMFSTART] {texmfstart}
\logo [TEXNL] {tex-nl}
-\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT}
\logo [TEXSHOW] {\TeX show}
\logo [TEXSPELL] {\TeX spell}
-\logo [TEXUTIL] {\TeX util}
-\logo [TEXWORK] {\TeX work}
-\logo [TEXFONT] {\TeX font}
+\logo [TEXSYNC] {texsync}
\logo [TEXTMATE] {TextMate}
\logo [TEXTOOLS] {\TeX tools}
-\logo [TRUETYPE] {TrueType}
-\logo [TTF] {ttf}
-\logo [TYPEONE] {Type1}
-\logo [XMLTOOLS] {xmltools}
-\logo [PDFTOOLS] {pdftools}
-\logo [RLXTOOLS] {rlxtools}
-\logo [CTXTOOLS] {ctxtools}
-\logo [TMFTOOLS] {tmftools}
-\logo [TEXMFSTART] {texmfstart}
-\logo [TEXSYNC] {texsync}
-\logo [TEX] {\TeX}
+\logo [TEXUTIL] {\TeX util}
+\logo [TEXWORK] {\TeX work}
+\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT}
\logo [TFM] {tfm}
-\logo [VF] {vf}
-\logo [PK] {pk}
+\logo [TIF] {tif}
+\logo [TIFF] {tiff}
\logo [TIFFINFO] {tiffinfo}
\logo [TIFFTAGS] {tifftags}
-\logo [TIFF] {tiff}
-\logo [TIF] {tif}
+\logo [TMFTOOLS] {tmftools}
\logo [TPIC] {tpic}
\logo [TPM] {tpm}
+\logo [TRUETYPE] {TrueType}
+\logo [TTF] {ttf}
+\logo [TUG] {tug}
\logo [TUGBOAT] {Tug\-Boat}
\logo [TUGNEWS] {Tug\-News}
-\logo [TUG] {tug}
+\logo [TYPEONE] {Type1}
+\logo [UCS] {ucs}
\logo [UNICODE] {Uni\-code}
\logo [UNIX] {Unix}
\logo [URI] {uri}
\logo [URL] {url}
\logo [USA] {usa}
-\logo [UTF] {utf}
-\logo [UCS] {ucs}
\logo [USENET] {usenet}
\logo [UTF] {utf}
+\logo [UTF] {utf}
+\logo [VF] {vf}
\logo [WDT] {wdt}
-\logo [WEBC] {web2c}
\logo [WEB] {web}
-\logo [WINNT] {WinNT}
+\logo [WEBC] {web2c}
\logo [WIKI] {Wiki}
\logo [WINDOWS] {Windows}
+\logo [WINNT] {WinNT}
\logo [WINNX] {Win9x}
\logo [WWW] {www}
\logo [WYSIWYG] {wysiwyg}
\logo [XDVI] {Xdvi}
+\logo [XETEX] {\XeTeX}
+\logo [XFDF] {xfdf}
+\logo [XHTML] {xhtml}
\logo [XINDY] {Xindy}
\logo [XML] {xml}
-\logo [XFDF] {xfdf}
+\logo [XMLTOOLS] {xmltools}
\logo [XPDFETEX] {xpdfe\TeX}
-\logo [XSLT] {xslt}
-\logo [XSLTPROC] {xsltproc}
\logo [XSL] {xsl}
-\logo [XETEX] {\XeTeX}
\logo [XSLFO] {xsl-fo}
+\logo [XSLT] {xslt}
+\logo [XSLTPROC] {xsltproc}
\logo [XYPIC] {XYPIC} % wrong logo
\logo [YandY] {y\&y}
\logo [ZIP] {zip}
diff --git a/tex/context/base/s-mag-01.tex b/tex/context/base/s-mag-01.tex
index 79d944f4c..54d997fc1 100644
--- a/tex/context/base/s-mag-01.tex
+++ b/tex/context/base/s-mag-01.tex
@@ -377,6 +377,13 @@
\definetyping[xtyping] [style=\ttx]
\definetyping[xxtyping][style=\ttxx]
+\definetypeface
+ [narrowtt] [tt]
+ [mono] [modern-cond] [default] [encoding=\defaultencoding]
+
+\definetyping[ntyping] \setuptyping[ntyping][style=\narrowtt]
+\definetype [ntype] \setuptype [ntype] [style=\narrowtt]
+
\doifnotmode{demo}{\endinput}
\startbuffer[abstract]
diff --git a/tex/context/base/sort-def.mkiv b/tex/context/base/sort-def.mkiv
new file mode 100644
index 000000000..8cc92a02e
--- /dev/null
+++ b/tex/context/base/sort-def.mkiv
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=sort-def,
+%D version=2005.08.08,
+%D title=\CONTEXT\ Sort Macros,
+%D subtitle=Defaults,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% nothing here
+
+\endinput
diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua
new file mode 100644
index 000000000..11d1e8c79
--- /dev/null
+++ b/tex/context/base/sort-ini.lua
@@ -0,0 +1,176 @@
+-- filename : sort-ini.lua
+-- comment : companion to sort-ini.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- todo:
+--
+-- out of range
+-- uppercase
+-- texutil compatible
+-- always expand to utf
+
+if not versions then versions = { } end versions['sort-ini'] = 1.001
+
+sorters = { }
+sorters.comparers = { }
+sorters.splitters = { }
+sorters.entries = { }
+sorters.mappings = { }
+sorters.replacements = { }
+sorters.language = 'en'
+
+function sorters.comparers.basic(a,b,i) -- [2] has entry, key, cmp
+ local sort_a, sort_b = a[2][i][3], b[2][i][3]
+ if #sort_a > #sort_b then
+ if #sort_b == 0 then
+ return 1
+ else
+ for i=1,#sort_b do
+ local ai, bi = sort_a[i], sort_b[i]
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
+ end
+ end
+ return -1
+ end
+ elseif #sort_a < #sort_b then
+ if #sort_a == 0 then
+ return -1
+ else
+ for i=1,#sort_a do
+ local ai, bi = sort_a[i], sort_b[i]
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
+ end
+ end
+ return 1
+ end
+ elseif #sort_a == 0 then
+ return 0
+ else
+ for i=1,#sort_a do
+ local ai, bi = sort_a[i], sort_b[i]
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
+ end
+ end
+ sort_a, sort_b = a[2][i][2], b[2][i][2]
+ if sort_a == "" then sort_a = a[2][i][1] end
+ if sort_b == "" then sort_b = b[2][i][1] end
+ if sort_a < sort_b then
+ return -1
+ elseif sort_a > sort_b then
+ return 1
+ else
+ return 0
+ end
+ end
+end
+
+function sorters.prepare(data,split,n)
+ local strip = sorters.strip
+ for k,v in ipairs(data) do
+ for i=1,n do
+ local vv = v[2][i]
+ if vv then
+ if vv[2] then
+ if vv[2] ~= "" then
+ vv[3] = split(strip(vv[2]))
+ else
+ vv[3] = split(strip(vv[1]))
+ end
+ else
+ vv[2] = { }
+ vv[3] = split(strip(vv[1]))
+ end
+ else
+ v[2][i] = { {}, {}, {} }
+ end
+ end
+ end
+end
+
+function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])","")
+ str = str:gsub("\\%S*","")
+ str = str:gsub("[%s%[%](){}%$\"\']*","")
+ str = str:gsub("(%d+)",function(s) return (" "):rep(10-#s) .. s end) -- sort numbers properly
+ return str
+end
+
+function sorters.splitters.utf(str)
+ local r = sorters.replacements[sorters.language] or { }
+ local m = sorters.mappings[sorters.language] or { }
+ local u = characters.uncompose
+ local t = { }
+ for _,v in pairs(r) do
+ str = str:gsub(v[1],v[2])
+ end
+ for c in string.utfcharacters(str) do
+ if m[c] then
+ t[#t+1] = m[c]
+ else
+ for cc in string.characters(u(c)) do
+ t[#t+1] = m[cc] or cc
+ end
+ end
+ end
+ return t
+end
+
+function sorters.sort(data,cmp)
+ table.sort(data,function(a,b) return cmp(a,b) == -1 end)
+end
+
+function sorters.cleanup(data)
+ for k,v in ipairs(data) do
+ for kk,vv in ipairs(v[2]) do
+ if vv and #vv[1] == 0 then
+ v[1][kk] = nil
+ else
+ vv[3] = nil
+ end
+ end
+ for kk,vv in pairs(v) do
+ if vv == "" then
+ v[kk] = nil
+ end
+ end
+ end
+end
+
+function sorters.unique(data)
+ local prev, last = nil, 0
+ for _,v in ipairs(data) do
+ if not prev or not table.are_equal(prev,v,2,3) then -- check range
+ last = last + 1
+ data[last] = v
+ prev = v
+ end
+ end
+ for i=last+1,#data do
+ data[i] = nil
+ end
+end
+
+function sorters.process(kind,data)
+ if data.entries then
+ if not data.sorted then
+ sorters.language = data.language or sorters.language
+ sorters[kind].prepare(data.entries)
+ sorters[kind].sort(data.entries)
+ sorters[kind].unique(data.entries)
+ data.sorted = true
+ end
+ return sorters[kind].flush(sorters[kind].finalize(data.entries),data.class,data.flush)
+ else
+ return { }
+ end
+end
diff --git a/tex/context/base/sort-ini.mkiv b/tex/context/base/sort-ini.mkiv
new file mode 100644
index 000000000..9c87edb11
--- /dev/null
+++ b/tex/context/base/sort-ini.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=sort-ini,
+%D version=2005.08.08,
+%D title=\CONTEXT\ Sort Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{sort-ini}{1.001}
+
+\let\savesortlanguage\gobbleoneargument
+
+\readfile{sort-def.tex}{}{} % runtime loaded in mkii
+\readfile{sort-lan.tex}{}{} % runtime loaded in mkii
+
+\endinput
diff --git a/tex/context/base/sort-lan.lua b/tex/context/base/sort-lan.lua
new file mode 100644
index 000000000..9802dd315
--- /dev/null
+++ b/tex/context/base/sort-lan.lua
@@ -0,0 +1,193 @@
+-- filename : sort-lan.lua
+-- comment : companion to sort-lan.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not versions then versions = { } end versions['sort-lan'] = 1.001
+
+-- this is a rather preliminary and incomplete file
+-- maybe we should load this kind of stuff runtime
+
+-- english
+
+do
+ -- The next one can be more efficient when not indexed this way, but
+ -- other languages are sparse so for the moment we keep this one.
+
+ sorters.entries['en'] = {
+ [ 1] = "a", [ 3] = "b", [ 5] = "c", [ 7] = "d", [ 9] = "e",
+ [11] = "f", [13] = "g", [15] = "h", [17] = "i", [19] = "j",
+ [21] = "k", [23] = "l", [25] = "m", [27] = "n", [29] = "o",
+ [31] = "p", [33] = "q", [35] = "r", [37] = "s", [39] = "t",
+ [41] = "u", [43] = "v", [45] = "w", [47] = "x", [49] = "y",
+ [51] = "z",
+ [ 2] = 1, [ 4] = 3, [ 6] = 5, [ 8] = 7, [10] = 9,
+ [12] = 11, [14] = 13, [16] = 15, [18] = 17, [20] = 19,
+ [22] = 21, [24] = 23, [26] = 25, [28] = 27, [30] = 29,
+ [32] = 31, [34] = 33, [36] = 35, [38] = 37, [40] = 39,
+ [42] = 41, [44] = 43, [46] = 45, [48] = 47, [50] = 49,
+ [52] = 51,
+ }
+ sorters.mappings['en'] = {
+ ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9,
+ ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19,
+ ["k"] = 21, ["l"] = 23, ["m"] = 25, ["n"] = 27, ["o"] = 29,
+ ["p"] = 31, ["q"] = 33, ["r"] = 35, ["s"] = 37, ["t"] = 39,
+ ["u"] = 41, ["v"] = 43, ["w"] = 45, ["x"] = 47, ["y"] = 49,
+ ["z"] = 51,
+ ["A"] = 2, ["B"] = 4, ["C"] = 6, ["D"] = 8, ["E"] = 10,
+ ["F"] = 12, ["G"] = 14, ["H"] = 16, ["I"] = 18, ["J"] = 20,
+ ["K"] = 22, ["L"] = 24, ["M"] = 26, ["N"] = 28, ["O"] = 30,
+ ["P"] = 32, ["Q"] = 34, ["R"] = 36, ["S"] = 38, ["T"] = 40,
+ ["U"] = 42, ["V"] = 44, ["W"] = 46, ["X"] = 48, ["Y"] = 50,
+ ["Z"] = 52,
+ }
+end
+
+-- dutch
+
+do
+ sorters.replacements['nl'] = { { "ij", 'y' }, { "IJ", 'Y' } }
+ sorters.entries ['nl'] = sorters.entries ['en']
+ sorters.mappings ['nl'] = sorters.mappings['en']
+end
+
+-- czech
+
+do
+
+ local uc = unicode.utf8.char
+ local ub = unicode.utf8.byte
+
+ sorters.replacements['cz'] = {
+ [1] = { "ch", uc(0xFF01) }
+ }
+
+ sorters.entries['cz'] = {
+ [ 1] = "a",
+ [ 2] = 1,
+ [ 3] = "b",
+ [ 4] = "c",
+ [ 5] = uc(0x010D), -- ccaron
+ [ 6] = "d",
+ [ 7] = uc(0x010F), -- dcaron
+ [ 8] = "e",
+ [ 9] = 8,
+ [10] = 8,
+ [11] = "f",
+ [12] = "g",
+ [13] = "h",
+ [14] = "ch",
+ [15] = "i",
+ [16] = 15,
+ [17] = "j",
+ [18] = "k",
+ [19] = "l",
+ [20] = "m",
+ [21] = "n",
+ [22] = uc(0x0147), -- ncaron
+ [23] = "o",
+ [24] = "p",
+ [25] = "q",
+ [26] = "r",
+ [27] = uc(0x0147), -- rcaron
+ [28] = "s",
+ [29] = uc(0x0161), -- scaron
+ [30] = "t",
+ [31] = uc(0x0165), -- tcaron
+ [32] = "u",
+ [33] = 32,
+ [34] = 32,
+ [35] = "v",
+ [36] = "w",
+ [37] = "x",
+ [38] = "y",
+ [49] = "z",
+ [40] = uc(0x017E), -- zcaron
+ }
+
+ sorters.mappings['cz'] = {
+ ['a'] = 1, -- a
+ [uc(0x00E1)] = 2, -- aacute
+ ['b'] = 3, -- b
+ ['c'] = 4, -- c
+ [uc(0x010D)] = 5, -- ccaron
+ ['d'] = 6, -- d
+ [uc(0x010F)] = 7, -- dcaron
+ ['e'] = 8, -- e
+ [uc(0x00E9)] = 9, -- eacute
+ [uc(0x011B)] = 10, -- ecaron
+ ['f'] = 11, -- f
+ ['g'] = 12, -- g
+ ['h'] = 13, -- h
+ [uc(0xFF01)] = 14, -- ch
+ ['i'] = 15, -- i
+ [uc(0x00ED)] = 16, -- iacute
+ ['j'] = 17, -- j
+ ['k'] = 18, -- k
+ ['l'] = 19, -- l
+ ['m'] = 20, -- m
+ ['n'] = 21, -- n
+ [uc(0x0147)] = 22, -- ncaron
+ ['o'] = 23, -- o
+ ['p'] = 24, -- p
+ ['q'] = 25, -- q
+ ['s'] = 26, -- r
+ [uc(0x0147)] = 27, -- rcaron
+ ['s'] = 28, -- s
+ [uc(0x0161)] = 29, -- scaron
+ ['t'] = 30, -- t
+ [uc(0x0165)] = 31, -- tcaron
+ ['u'] = 32, -- u
+ [uc(0x00FA)] = 33, -- uacute
+ [uc(0x01F6)] = 34, -- uring
+ ['v'] = 35, -- v
+ ['w'] = 36, -- w
+ ['x'] = 37, -- x
+ ['y'] = 38, -- y
+ ['z'] = 49, -- z
+ [uc(0x017E)] = 40, -- zcaron
+ }
+
+end
+
+--~ sorters.test = ''
+--~ sorters.test = 'nl'
+--~ sorters.test = 'cz'
+
+--~ if sorters.test == 'nl' then -- dutch test
+
+--~ data = {
+--~ { 'e', { {"ijsco",""} },2,"","","",""},
+--~ { 'e', { {"ysco" ,""} },2,"","","",""},
+--~ { 'e', { {"ijsco",""} },2,"","","",""},
+--~ { 'e', { {"hans" ,""}, {"aap" ,""} },2,"","","",""},
+--~ { 'e', { {"$a$" ,""} },2,"","","",""},
+--~ { 'e', { {"aap" ,""} },2,"","","",""},
+--~ { 'e', { {"hans" ,""}, {"aap" ,""} },6,"","","",""},
+--~ { 'e', { {"hans" ,""}, {"noot",""} },2,"","","",""},
+--~ { 'e', { {"hans" ,""}, {"mies",""} },2,"","","",""},
+--~ { 'e', { {"hans" ,""}, {"mies",""} },2,"","","",""},
+--~ { 'e', { {"hans" ,""}, {"mies",""}, [3] = {"oeps",""} },2,"","","",""},
+--~ { 'e', { {"hans" ,""}, {"mies",""}, [3] = {"oeps",""} },4,"","","",""},
+--~ }
+--~ sorters.index.process({ entries = data, language = 'nl'})
+
+--~ elseif sorters.test == 'cz' then -- czech test
+
+--~ data = {
+--~ { 'e', { {"blabla",""} },2,"","","",""},
+--~ { 'e', { {"czacza",""} },2,"","","",""},
+--~ { 'e', { {"albalb",""} },2,"","","",""},
+--~ { 'e', { {"azcazc",""} },2,"","","",""},
+--~ { 'e', { {"chacha",""} },2,"","","",""},
+--~ { 'e', { {"hazzah",""} },2,"","","",""},
+--~ { 'e', { {"iaccai",""} },2,"","","",""},
+--~ }
+--~ sorters.index.process({ entries = data, language = 'cz'})
+
+--~ end
+
+
+--~ print(table.serialize(sorters))
diff --git a/tex/context/base/sort-lan.mkiv b/tex/context/base/sort-lan.mkiv
new file mode 100644
index 000000000..918f7f9b7
--- /dev/null
+++ b/tex/context/base/sort-lan.mkiv
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=sort-lan,
+%D version=2005.08.08,
+%D title=\CONTEXT\ Sort Macros,
+%D subtitle=Language Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{sort-lan}{1.001}
+
+\endinput
diff --git a/tex/context/base/spec-def.mkiv b/tex/context/base/spec-def.mkiv
new file mode 100644
index 000000000..82e121864
--- /dev/null
+++ b/tex/context/base/spec-def.mkiv
@@ -0,0 +1,19 @@
+%D \module
+%D [ file=spec-def,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Special Macros,
+%D subtitle=Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D We load the lua scripts here because we don't want to load
+%D them multiple times.
+
+\registerctxluafile{spec-pdf}{1.001}
+
+\endinput
diff --git a/tex/context/base/spec-fdf.mkiv b/tex/context/base/spec-fdf.mkiv
new file mode 100644
index 000000000..87a30d0ca
--- /dev/null
+++ b/tex/context/base/spec-fdf.mkiv
@@ -0,0 +1,19 @@
+%D \module
+%D [ file=spec-fdf,
+%D version=2006.09.18,
+%D title=\CONTEXT\ \PDF\ Macros,
+%D subtitle=Support Macros,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\def\setPDFdestination#1{\xdef\PDFdestination{\ctxlua{pdf.cleandestination("\luaescapestring{#1}")}}}
+\def\sanitizePDFstring#1\to#2{\xdef#2{\ctxlua{pdf.sanitizedstring("\luaescapestring{#1}")}}}
+
+\protect \endinput
diff --git a/tex/context/base/spec-fdf.tex b/tex/context/base/spec-fdf.tex
index d6f912df5..7b99dfcc9 100644
--- a/tex/context/base/spec-fdf.tex
+++ b/tex/context/base/spec-fdf.tex
@@ -3111,7 +3111,7 @@
\PDFcode{/GSknockout gs}% wrong
\fi}
-%D Transparency support (experimental):
+%D Transparency support:
\newif\ifPDFtransparencysupported
@@ -3126,11 +3126,9 @@
\def\dodoPDFstarttransparency#1#2%
{\presetPDFtransparency{#1}{#2}%
-% \PDFdirectcode{\PDFtransparencyidentifier\space gs }}
\PDFcode{\PDFtransparencyidentifier\space gs }}
\def\dodoPDFstoptransparency
-% {\PDFdirectcode{/Tr0 gs }}
{\PDFcode{/Tr0 gs }}
\def\doPDFstarttransparency
diff --git a/tex/context/base/spec-pdf.lua b/tex/context/base/spec-pdf.lua
new file mode 100644
index 000000000..04886b724
--- /dev/null
+++ b/tex/context/base/spec-pdf.lua
@@ -0,0 +1,28 @@
+if not modules then modules = { } end modules ['spec-pdf'] = {
+ version = 1.001,
+ comment = "companion to spec-fdf.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>This module implements a couple of cleanup methods. We need these
+in order to meet the <l n='pdf'/> specification. Watch the double
+parenthesis; they are needed because otherwise we would pass more
+than one argument to <l n='tex'/>.</p>
+--ldx]]--
+
+pdf = pdf or { }
+
+function pdf.cleandestination(str)
+ tex.sprint((str:gsub("[%/%#%<%>%[%]%(%)%-%s]+","-")))
+end
+
+function pdf.cleandestination(str)
+ tex.sprint((str:gsub("[%/%#%<%>%[%]%(%)%-%s]+","-")))
+end
+
+function pdf.santizedstring(str)
+ tex.sprint((str:gsub("([\\/#<>%[%]%(%)])","\\%1")))
+end
diff --git a/tex/context/base/supp-fil.lua b/tex/context/base/supp-fil.lua
new file mode 100644
index 000000000..ecf118104
--- /dev/null
+++ b/tex/context/base/supp-fil.lua
@@ -0,0 +1,78 @@
+if not modules then modules = { } end modules ['supp-fil'] = {
+ version = 1.001,
+ comment = "companion to supp-fil.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx--
+<p>It's more convenient to manipulate filenames (paths) in
+<l n='lua'/> than in <l n='tex'/>. These methods have counterparts
+at the <l n='tex'/> side.</p>
+--ldx]]--
+
+support = support or { }
+environment = environment or { }
+
+environment.outputfilename = environment.outputfilename or environment.jobname
+
+function support.checkfilename(str) -- "/whatever..." "c:..." "http://..."
+ cs.chardef("kindoffile",boolean.tonumber(str:find("^/") or str:find("[%a]:")))
+end
+
+function support.thesanitizedfilename(str)
+ tex.write((str:gsub("\\","/")))
+end
+
+function support.splitfilename(fullname)
+ local path, name, base, suffix, kind = '', fullname, fullname, '', 0
+ local p, n = fullname:match("^(.+)/(.-)$")
+ if p and n then
+ path, name, base = p, n, n
+ end
+ local b, s = base:match("^(.+)%.(.-)$")
+ if b and s then
+ name, suffix = b, s
+ end
+ if path == "" then
+ kind = 0
+ elseif path == '.' then
+ kind = 1
+ else
+ kind = 2
+ end
+ cs.def("splitofffull", fullname)
+ cs.def("splitoffpath", path)
+ cs.def("splitoffbase", base)
+ cs.def("splitoffname", name)
+ cs.def("splitofftype", suffix)
+ cs.chardef("splitoffkind", kind)
+end
+
+function support.splitfiletype(fullname)
+ local name, suffix = fullname, ''
+ local n, s = fullname:match("^(.+)%.(.-)$")
+ if n and s then
+ name, suffix = n, s
+ end
+ cs.def("splitofffull", fullname)
+ cs.def("splitoffpath", "")
+ cs.def("splitoffname", name)
+ cs.def("splitofftype", suffix)
+end
+
+function support.doifparentfileelse(n)
+ cs.testcase(n==environment.jobname or n==environment.jobname..'.tex' or n==environment.outputfilename)
+end
+
+-- saves some .15 sec on 12 sec format generation
+
+function support.doiffileexistelse(name)
+ if not name or name == "" then
+ return cs.testcase(false)
+ else
+ local n = input.findtexfile(texmf.instance,name)
+ return cs.testcase(n and n ~= "")
+ end
+end
diff --git a/tex/context/base/supp-fil.mkiv b/tex/context/base/supp-fil.mkiv
new file mode 100644
index 000000000..586004259
--- /dev/null
+++ b/tex/context/base/supp-fil.mkiv
@@ -0,0 +1,32 @@
+%D \module
+%D [ file=supp-fil,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Files,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details
+
+% \input supp-fil.mkii \endinput
+
+\registerctxluafile{supp-fil}{1.001}
+
+% \def\sanitizefilename#1\to#2%
+% {\edef#2{\ctxlua{support.thesanitizedfilename("\luaescapestring{#1}")}}}
+% \def\checkfilename #1{\ctxlua{support.checkfilename("\luaescapestring{#1}")}}
+% \def\splitfilename #1{\ctxlua{support.splitfilename("\luaescapestring{#1}")}}
+% \def\splitfiletype #1{\ctxlua{support.splitfiletype("\luaescapestring{#1}")}}
+% \def\doifparentfileelse#1{\ctxlua{support.doifparentfileelse("\luaescapestring{#1}")}}
+
+\def\sanitizefilename#1\to#2{\edef#2{\ctxlua{support.thesanitizedfilename([[#1]])}}}
+\def\checkfilename #1{\ctxlua{support.checkfilename([[#1]])}}
+\def\splitfilename #1{\ctxlua{support.splitfilename([[#1]])}}
+\def\splitfiletype #1{\ctxlua{support.splitfiletype([[#1]])}}
+\def\doifparentfileelse #1{\ctxlua{support.doifparentfileelse([[#1]])}}
+\def\doiffileexistselse #1{\ctxlua{support.doiffileexistelse([[#1]])}}
+
+\endinput
diff --git a/tex/context/base/syst-cat.mkiv b/tex/context/base/syst-cat.mkiv
new file mode 100644
index 000000000..6f3f605b8
--- /dev/null
+++ b/tex/context/base/syst-cat.mkiv
@@ -0,0 +1,116 @@
+%D \module
+%D [ file=syst-cat,
+%D version=2006.09.18,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Catcode Handling,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\def\newcatcodetable#1%
+ {\global\advance\cctdefcounter\plusone
+ \expandafter\xdef\csname @@ccn:\number\cctdefcounter\endcsname{\string#1}% logging
+ \global\mathchardef#1\cctdefcounter}
+
+\newcatcodetable \scratchcatcodetable \initcatcodetable\scratchcatcodetable
+
+\ifx\nilcatcodes \undefined \newcatcodetable \nilcatcodes \fi
+\ifx\texcatcodes \undefined \newcatcodetable \texcatcodes \fi
+\ifx\ctxcatcodes \undefined \newcatcodetable \ctxcatcodes \fi
+\ifx\vrbcatcodes \undefined \newcatcodetable \vrbcatcodes \fi
+\ifx\prtcatcodes \undefined \newcatcodetable \prtcatcodes \fi
+\ifx\xmlcatcodesn\undefined \newcatcodetable \xmlcatcodesn \fi % normal
+\ifx\xmlcatcodese\undefined \newcatcodetable \xmlcatcodese \fi % entitle
+\ifx\xmlcatcodesr\undefined \newcatcodetable \xmlcatcodesr \fi % reduce
+
+\newtoks \setdefaultcatcodes
+
+\setdefaultcatcodes
+ {\catcode`\\ 12
+ \catcode`\^^M 12
+ \catcode`\ 12
+ \catcode`\% 12
+ \catcode127 12 }
+
+\long\def\startcatcodetable#1#2\stopcatcodetable
+ {\bgroup
+ \catcodetable\scratchcatcodetable
+ \the\setdefaultcatcodes
+ #2%
+ \savecatcodetable#1\relax
+ \egroup}
+
+\newcatcodetable\dummycatcodes
+
+% \long\def\startextendcatcodetable#1#2\stopextendcatcodetable
+% {\bgroup
+% \catcodetable#1\relax
+% #2%
+% \savecatcodetable\dummycatcodes
+% \catcodetable\dummycatcodes
+% \savecatcodetable#1\relax
+% \egroup}
+
+\long\def\startextendcatcodetable#1#2\stopextendcatcodetable
+ {\bgroup
+ \catcodetable#1\relax
+ \globaldefs\plusone
+ #2%
+ \globaldefs\zerocount
+ \egroup}
+
+% ==
+%
+% \long\def\startextendcatcodetable#1#2\stopextendcatcodetable
+% {\bgroup
+% \scratchcounter\the\catcodetable
+% \catcodetable #1 #2
+% \catcodetable\scratchcounter
+% \egroup}
+
+\def\letcatcodecommand
+ {\afterassignment\letcatcodecommanda\cctcountera}
+
+\def\letcatcodecommanda
+ {\afterassignment\letcatcodecommandb\cctcounterb}
+
+% construct the definition in lua
+%
+% \def\letcatcodecommandb
+% {\scratchcounter\catcode\cctcounterb \catcode\cctcounterb=13
+% \directlua\CTXlua{tex.print(tex.texcatcodes,"\\xdef " .. string.char(\number\cctcounterb)
+% .. "{\\noexpand\\catcodecommand{\number\cctcounterb}}")}%
+% \catcode\cctcounterb\scratchcounter
+% \expandafter\let\csname cc:\number\cctcountera:\number\cctcounterb\endcsname}
+%
+% or less messy:
+%
+% \def\letcatcodecommandb
+% {\chardef\savedcctcode\catcode\cctcounterb
+% \catcode\cctcounterb=13
+% \expandafter\edef\directlua\CTXlua{tex.sprint(tex.texcatcodes,string.char(\number\cctcounterb))}%
+% {\noexpand\catcodecommand{\number\cctcounterb}}%
+% \catcode\cctcounterb\savedcctcode
+% \expandafter\let\csname cc:\number\cctcountera:\number\cctcounterb\endcsname}
+
+\let\currentcatcodetable\catcodetable
+
+\startruntimectxluacode
+ tex.nilcatcodes = \number\nilcatcodes ;
+ tex.texcatcodes = \number\texcatcodes ;
+ tex.ctxcatcodes = \number\ctxcatcodes ;
+ tex.vrbcatcodes = \number\vrbcatcodes ;
+ tex.prtcatcodes = \number\prtcatcodes ;
+ tex.xmlcatcodes = \number\xmlcatcodesn ;
+ tex.xmlcatcodesn = \number\xmlcatcodesn ; % normal
+ tex.xmlcatcodese = \number\xmlcatcodese ; % entitle
+ tex.xmlcatcodesr = \number\xmlcatcodesr ; % reduce
+\stopruntimectxluacode
+
+\protect \endinput
diff --git a/tex/context/base/syst-con.lua b/tex/context/base/syst-con.lua
new file mode 100644
index 000000000..273bc5b5c
--- /dev/null
+++ b/tex/context/base/syst-con.lua
@@ -0,0 +1,30 @@
+-- filename : syst-con.lua
+-- comment : companion to syst-con.tex (in ConTeXt)
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- remark : compact version
+
+if not versions then versions = { } end versions['syst-con'] = 1.001
+if not convert then convert = { } end
+
+-- For raw 8 bit characters, the offset is 0x110000 (bottom of plane 18)
+-- at the top of luatex's char range but outside the unicode range.
+
+function convert.lchexnumber (n) tex.sprint(string.format("%x" ,n)) end
+function convert.uchexnumber (n) tex.sprint(string.format("%X" ,n)) end
+function convert.lchexnumbers (n) tex.sprint(string.format("%02x",n)) end
+function convert.uchexnumbers (n) tex.sprint(string.format("%02X",n)) end
+function convert.octnumber (n) tex.sprint(string.format("%03o",n)) end
+function convert.hexstringtonumber(n) tex.sprint(tonumber(n,16)) end
+function convert.octstringtonumber(n) tex.sprint(tonumber(n, 8)) end
+function convert.rawcharacter (n) tex.sprint(unicode.utf8.char(0x110000+n)) end
+
+do
+ local char = unicode.utf8.char
+ local flush = tex.sprint
+
+ function convert.rawcharacter(n) flush(char(0x110000+n)) end
+
+end
diff --git a/tex/context/base/syst-con.mkiv b/tex/context/base/syst-con.mkiv
new file mode 100644
index 000000000..ddc9fe564
--- /dev/null
+++ b/tex/context/base/syst-con.mkiv
@@ -0,0 +1,27 @@
+%D \module
+%D [ file=syst-con,
+%D version=2006.09.16,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Conversions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{syst-con}{1.001}
+
+\unprotect
+
+\def\lchexnumber #1{\ctxlua{convert.lchexnumber(\number#1)}}
+\def\uchexnumber #1{\ctxlua{convert.uchexnumber(\number#1)}}
+\def\lchexnumbers #1{\ctxlua{convert.lchexnumbers(\number#1)}}
+\def\uchexnumbers #1{\ctxlua{convert.uchexnumbers(\number#1)}}
+\def\octnumber #1{\ctxlua{convert.octnumber(\number#1)}}
+\def\hexstringtonumber#1{\ctxlua{convert.hexstringtonumber("#1")}}
+\def\octstringtonumber#1{\ctxlua{convert.octstringtonumber("#1")}}
+\def\rawcharacter #1{\ctxlua{convert.rawcharacter(\number#1)}}
+
+\protect \endinput
diff --git a/tex/context/base/syst-new.tex b/tex/context/base/syst-new.tex
index dca897ac0..853b2514c 100644
--- a/tex/context/base/syst-new.tex
+++ b/tex/context/base/syst-new.tex
@@ -65,6 +65,21 @@
\def\unspaceafter#1#2%
{\edef\ascii{\dounspaced#2\end}\@EA#1\@EA{\ascii}}
+
+% sometimes handy:
+
+\def\doifhasspaceelse#1%
+ {\edef\!!stringa{#1}%
+ \expanded{\dodoifhasspaceelse#1\space}\empty\relax}
+
+\def\dodoifhasspaceelse#1 #2#3\relax % \space\empty\relax
+ {\ifx\!!stringa\space
+ \@EA\firstoftwoarguments
+ \else\ifx#2\empty
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
% this will replace loadfile once and alike !!! todo
diff --git a/tex/context/base/syst-prm.tex b/tex/context/base/syst-prm.tex
index ea7b5634c..dc259dff7 100644
--- a/tex/context/base/syst-prm.tex
+++ b/tex/context/base/syst-prm.tex
@@ -102,19 +102,51 @@
\ifx\directlua\undefined
- \long\gdef\beginMETATEX#1\endMETATEX%
+ \long\gdef\beginLUATEX#1\endLUATEX%
{}
\else
- \gdef\beginMETATEX%
- {\bgroup\obeylines\dobeginMETATEX}
+ \gdef\beginLUATEX%
+ {\bgroup\obeylines\dobeginLUATEX}
- \gdef\dobeginMETATEX#1
+ \gdef\dobeginLUATEX#1
{\egroup\immediate\write16%
- {system (METATEX) : [line \the\inputlineno] \detokenize{#1}}}
+ {system (LUATEX) : [line \the\inputlineno] \detokenize{#1}}}
- \global\let\endMETATEX\relax
+ \global\let\endLUATEX\relax
+
+\fi
+
+% traditional tex's vs de utf tex's
+
+\ifx\XeTeXversion\undefined \ifx\directlua\undefined
+
+ \gdef\beginOLDTEX%
+ {\bgroup\obeylines\dobeginOLDTEX}
+
+ \gdef\dobeginOLDTEX#1
+ {\egroup\immediate\write16%
+ {system (OLDTEX) : [line \the\inputlineno] \detokenize{#1}}}
+
+ \global\let\endOLDTEX\relax
+
+ \long\gdef\beginNEWTEX#1\endNEWTEX%
+ {}
+
+\fi \fi \ifx\beginOLDTEX\undefined
+
+ \long\gdef\beginOLDTEX#1\endOLDTEX%
+ {}
+
+ \gdef\beginNEWTEX%
+ {\bgroup\obeylines\dobeginNEWTEX}
+
+ \gdef\dobeginNEWTEX#1
+ {\egroup\immediate\write16%
+ {system (NEWTEX) : [line \the\inputlineno] \detokenize{#1}}}
+
+ \global\let\endNEWTEX\relax
\fi
diff --git a/tex/context/base/syst-rtp.mkiv b/tex/context/base/syst-rtp.mkiv
new file mode 100644
index 000000000..36ce8edb1
--- /dev/null
+++ b/tex/context/base/syst-rtp.mkiv
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=syst-rtp,
+%D version=2006.10.13,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Run Time Processes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+\def\executesystemcommand#1{\ctxlua{os.execute([[#1]])}}
+
+\protect \endinput
diff --git a/tex/context/base/syst-str.mkiv b/tex/context/base/syst-str.mkiv
new file mode 100644
index 000000000..6d0f0565e
--- /dev/null
+++ b/tex/context/base/syst-str.mkiv
@@ -0,0 +1,27 @@
+%D \module
+%D [ file=syst-str,
+%D version=2006.09.18,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=String Processing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+% todo: escape special chars in expr (\luaescapeexpression)
+
+\def\replacecharacters#1#2#3% macro characters replacement
+ {\dodoglobal\edef#1{\ctxlua{tex.sprint((string.gsub("#1",string.esc(#2),"#3")))}}}
+
+\def\separatestring#1\to#2%
+ {\dodoglobal\def#2{\ctxlua{tex.sprint(string.gsub(("#1","\letterpercent s+",","))})}}
+
+\def\unspacefilename#1\to#2%
+ {\dodoglobal\def#2{\ctxlua{tex.sprint(string.gsub(("#1","\letterpercent s+","-")))}}}
+
+\protect \endinput
diff --git a/tex/context/base/toks-ini.lua b/tex/context/base/toks-ini.lua
new file mode 100644
index 000000000..ad046be50
--- /dev/null
+++ b/tex/context/base/toks-ini.lua
@@ -0,0 +1,232 @@
+if not modules then modules = { } end modules ['toks-ini'] = {
+ version = 1.001,
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+utf = utf or unicode.utf8
+
+--[[ldx--
+<p>This code is experimental.</p>
+--ldx]]--
+
+
+-- 1 = command, 2 = modifier (char), 3 = controlsequence id
+--
+-- callback.register('token_filter', token.get_next)
+--
+-- token.get_next()
+-- token.expand()
+-- token.create()
+-- token.csname_id()
+-- token.csname_name(v)
+-- token.command_id()
+-- token.command_name(v)
+-- token.is_expandable()
+-- token.is_activechar()
+-- token.lookup(v)
+
+-- actually, we can use token registers to store tokens
+
+tokens = tokens or { }
+
+tokens.vbox = token.create("vbox")
+tokens.hbox = token.create("hbox")
+tokens.vtop = token.create("vtop")
+tokens.bgroup = token.create(utf.byte("{"), 1)
+tokens.egroup = token.create(utf.byte("}"), 2)
+
+tokens.letter = function(chr) return token.create(utf.byte(chr), 11) end
+tokens.other = function(chr) return token.create(utf.byte(chr), 12) end
+
+tokens.letters = function(str)
+ local t = { }
+ for chr in string.utfvalues(str) do
+ t[#t+1] = token.create(chr, 11)
+ end
+ return t
+end
+
+collector = collector or { }
+collector.data = collector.data or { }
+
+function tex.printlist(data)
+ callbacks.push('token_filter', function ()
+ callbacks.pop('token_filter')
+ return data
+ end)
+end
+
+function collector.flush(tag)
+ tex.printlist(collector.data[tag])
+end
+
+function collector.test(tag)
+ tex.printlist(collector.data[tag])
+end
+
+collector.registered = { }
+
+function collector.register(name)
+ collector.registered[token.csname_id(name)] = name
+end
+
+function collector.install(tag,end_cs)
+ collector.data[tag] = { }
+ local data = collector.data[tag]
+ local call = token.command_id("call")
+ local relax = token.command_id("relax")
+ local endcs = token.csname_id(end_cs)
+ local expand = collector.registered
+ local get = token.get_next -- so no callback!
+ while true do
+ local t = get()
+ local a, b = t[1], t[3]
+ if a == relax and b == endcs then
+ return
+ elseif a == call and expand[b] then
+ token.expand()
+ else
+ data[#data+1] = t
+ end
+ end
+end
+
+collector.show_methods = { }
+
+function collector.show(tag, method)
+ if type(tag) == "table" then
+ collector.show_methods[method or 'a'](tag)
+ else
+ collector.show_methods[method or 'a'](collector.data[tag])
+ end
+end
+
+commands = commands or { }
+
+commands.letter = token.command_id("letter")
+commands.other = token.command_id("other_char")
+
+function collector.default_words(t,str)
+ t[#t+1] = tokens.bgroup
+ t[#t+1] = token.create("red")
+ for k,v in ipairs(str) do
+ t[#t+1] = tokens.other('*')
+ end
+ t[#t+1] = tokens.egroup
+end
+
+function collector.with_words(tag,handle)
+ local t, w = { }, { }
+ handle = handle or collector.default_words
+ for _,v in ipairs(collector.data[tag]) do
+ if v[1] == commands.letter then
+ w[#w+1] = v[2]
+ else
+ if #w > 0 then
+ handle(t,w)
+ w = { }
+ end
+ t[#t+1] = v
+ end
+ end
+ if #w > 0 then
+ handle(t,w)
+ end
+ collector.data[tag] = t
+end
+
+function collector.show_token(t)
+ if t then
+ local cmd, chr, id, cs, name = t[1], t[2], t[3], nil, token.command_name(t) or ""
+ if cmd == commands.letter or cmd == commands.other then
+ return string.format("%s-> %s -> %s", name, chr, utf.char(chr))
+ elseif id > 0 then
+ cs = token.csname_name(t) or nil
+ if cs then
+ return string.format("%s-> %s", name, cs)
+ elseif tonumber(chr) < 0 then
+ return string.format("%s-> %s", name, id)
+ else
+ return string.format("%s-> (%s,%s)", name, chr, id)
+ end
+ else
+ return string.format("%s", name)
+ end
+ else
+ return "no node"
+ end
+end
+
+function collector.trace()
+ local t = token.get_next()
+ texio.write_nl(collector.show_token(t))
+ return t
+end
+
+collector.show_methods.a = function(data) -- no need to store the table, just pass directly
+ local flush, ct = tex.sprint, tex.ctxcatcodes
+ local template = "\\NC %s\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR "
+ flush(ct, "\\starttabulate[|T|Tr|cT|Tr|T|]")
+ flush(ct, template:format("cmd","chr","","id","name"))
+ flush(ct, "\\HL")
+ for _,v in pairs(data) do
+ local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", ""
+ local name = (token.command_name(v) or ""):gsub("_","\\_")
+ if id > 0 then
+ cs = token.csname_name(v) or ""
+ if cs ~= "" then cs = "\\string " .. cs end
+ else
+ id = ""
+ end
+ if cmd == commands.letter or cmd == commands.other then
+ sym = "\\char " .. chr
+ end
+ if tonumber(chr) < 0 then
+ flush(ct, template:format(name, "", sym, id, cs))
+ else
+ flush(ct, template:format(name, chr, sym, id, cs))
+ end
+ end
+ flush(ct, "\\stoptabulate")
+end
+
+collector.show_methods.b_c = function(data,swap) -- no need to store the table, just pass directly
+ local flush, ct = tex.sprint, tex.ctxcatcodes
+ local template = "\\NC %s\\NC %s\\NC %s\\NC\\NR"
+ if swap then
+ flush(ct, "\\starttabulate[|Tl|Tl|Tr|]")
+ else
+ flush(ct, "\\starttabulate[|Tl|Tr|Tl|]")
+ end
+ flush(ct, template:format("cmd","chr","name"))
+ flush(ct, "\\HL")
+ for _,v in pairs(data) do
+ local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", ""
+ local name = (token.command_name(v) or ""):gsub("_","\\_")
+ if id > 0 then
+ cs = token.csname_name(v) or ""
+ end
+ if cmd == commands.letter or cmd == commands.other then
+ sym = "\\char " .. chr
+ elseif cs ~= "" then
+ if token.is_activechar(v) then
+ sym = "\\string " .. cs
+ else
+ sym = "\\string\\" .. cs
+ end
+ end
+ if swap then
+ flush(ct, template:format(name, sym, chr))
+ elseif tonumber(chr) < 0 then
+ flush(ct, template:format(name, "", sym))
+ else
+ flush(ct, template:format(name, chr, sym))
+ end
+ end
+ flush(ct, "\\stoptabulate")
+end
+
+collector.show_methods.b = function(tag) collector.show_methods.b_c(tag,false) end
+collector.show_methods.c = function(tag) collector.show_methods.b_c(tag,true ) end
diff --git a/tex/context/base/toks-ini.tex b/tex/context/base/toks-ini.tex
new file mode 100644
index 000000000..873cfa4d5
--- /dev/null
+++ b/tex/context/base/toks-ini.tex
@@ -0,0 +1,25 @@
+%D \module
+%D [ file=toks-ini,
+%D version=2007.03.03,
+%D title=\CONTEXT\ Character Macros,
+%D subtitle=Token Support (Initialization),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{Token Support (initialization)}
+
+\registerctxluafile{toks-ini}{1.001}
+
+\def\starttokens [#1]{\ctxlua{collector.install("#1", "stoptokens")}}
+\let\stoptokens \relax
+\def\flushtokens [#1]{\ctxlua{collector.flush("#1")}}
+\def\showtokens [#1]{\ctxlua{collector.show("#1")}}
+\def\testtokens [#1]{\ctxlua{collector.with_words("#1")}}
+\def\registertoken #1{\ctxlua{collector.register("#1")}}
+
+\endinput
diff --git a/tex/context/base/type-buy.tex b/tex/context/base/type-buy.tex
index 7ccbac9ca..555535388 100644
--- a/tex/context/base/type-buy.tex
+++ b/tex/context/base/type-buy.tex
@@ -20,467 +20,442 @@
% temporary code, replaced by setups
\starttypescript [serif] [fallback]
-
- \definefontsynonym [SerifBold] [Serif]
- \definefontsynonym [SerifItalic] [Serif]
- \definefontsynonym [SerifSlanted] [SerifItalic]
- \definefontsynonym [SerifBoldItalic] [SerifBold]
- \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
- \definefontsynonym [SerifCaps] [Serif]
-
+ \definefontsynonym [SerifBold] [Serif]
+ \definefontsynonym [SerifItalic] [Serif]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldItalic] [SerifBold]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+ \definefontsynonym [SerifCaps] [Serif]
\stoptypescript
\starttypescript [sans] [fallback]
-
- \definefontsynonym [SansBold] [Sans]
- \definefontsynonym [SansItalic] [Sans]
- \definefontsynonym [SansSlanted] [SansItalic]
- \definefontsynonym [SansBoldItalic] [SansBold]
- \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
- \definefontsynonym [SansCaps] [Sans]
-
+ \definefontsynonym [SansBold] [Sans]
+ \definefontsynonym [SansItalic] [Sans]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldItalic] [SansBold]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [Sans]
\stoptypescript
\starttypescript [mono] [fallback]
-
- \definefontsynonym [MonoBold] [Mono]
- \definefontsynonym [MonoItalic] [Mono]
- \definefontsynonym [MonoSlanted] [MonoItalic]
- \definefontsynonym [MonoBoldItalic] [MonoBold]
- \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
- \definefontsynonym [MonoCaps] [Mono]
-
+ \definefontsynonym [MonoBold] [Mono]
+ \definefontsynonym [MonoItalic] [Mono]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldItalic] [MonoBold]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+ \definefontsynonym [MonoCaps] [Mono]
\stoptypescript
% Lucida Bright : Biggelow and Holmes
-\starttypescript [map] [lucida] [ec,8r,texnansi]
- \loadmapfile [\typescriptthree-bh-lucida.map]
-\stoptypescript
-
\starttypescript [serif] [lucida] [name]
- \definefontsynonym [Serif] [LucidaBright]
- \definefontsynonym [SerifBold] [LucidaBright-Demi]
- \definefontsynonym [SerifItalic] [LucidaBright-Italic]
- \definefontsynonym [SerifSlanted] [LucidaBright-Oblique]
- \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic]
- \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic]
- \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps]
- \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi]
+ \definefontsynonym [Serif] [LucidaBright]
+ \definefontsynonym [SerifBold] [LucidaBright-Demi]
+ \definefontsynonym [SerifItalic] [LucidaBright-Italic]
+ \definefontsynonym [SerifSlanted] [LucidaBright-Oblique]
+ \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic]
+ \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps]
+ \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi]
\stoptypescript
\starttypescript [sans] [lucida] [name]
- \definefontsynonym [Sans] [LucidaSans]
- \definefontsynonym [SansBold] [LucidaSans-Demi]
- \definefontsynonym [SansItalic] [LucidaSans-Italic]
- \definefontsynonym [SansSlanted] [LucidaSans-Italic]
- \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic]
- \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic]
- \definefontsynonym [SansCaps] [LucidaSans]
+ \definefontsynonym [Sans] [LucidaSans]
+ \definefontsynonym [SansBold] [LucidaSans-Demi]
+ \definefontsynonym [SansItalic] [LucidaSans-Italic]
+ \definefontsynonym [SansSlanted] [LucidaSans-Italic]
+ \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic]
+ \definefontsynonym [SansCaps] [LucidaSans]
\stoptypescript
\starttypescript [mono] [lucida] [name]
- \definefontsynonym [Mono] [LucidaSans-Typewriter]
- \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold]
- \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique]
- \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique]
- \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique]
- \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique]
- \definefontsynonym [MonoCaps] [LucidaSans-Typewriter]
+ \definefontsynonym [Mono] [LucidaSans-Typewriter]
+ \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold]
+ \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique]
+ \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique]
+ \definefontsynonym [MonoCaps] [LucidaSans-Typewriter]
\stoptypescript
\starttypescript [math] [lucida] [name]
- \definefontsynonym [MathRoman] [LucidaBright]
- \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
- \definefontsynonym [MathItalic] [LucidaNewMath-AltItalic]
- \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol]
- \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows]
- \definefontsynonym [MathBeta] [LucidaNewMath-Roman]
+ \definefontsynonym [MathRoman] [LucidaBright]
+ \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalic] [LucidaNewMath-AltItalic]
+ \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol]
+ \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows]
+ \definefontsynonym [MathBeta] [LucidaNewMath-Roman]
\stoptypescript
\starttypescript [math] [lucida] [name]
- \definefontsynonym [OldStyle] [MathItalic]
- \definefontsynonym [Fraktur] [eufm10]
- \definefontsynonym [Blackboard] [MathAlpha]
- \definefontsynonym [Gothic] [eufm10]
- \definefontsynonym [Calligraphic] [MathSymbol] % math caligraphic !
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathAlpha]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [MathSymbol] % math caligraphic !
\stoptypescript
\starttypescript [boldmath] [lucida] [name]
- \definefontsynonym [MathRoman] [LucidaBright-Demi]
- \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
- \definefontsynonym [MathItalic] [LucidaNewMath-AltDemiItalic]
- \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol-Demi]
- \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows-Demi]
- \definefontsynonym [MathBeta] [LucidaNewMath-Demi]
+ \definefontsynonym [MathRoman] [LucidaBright-Demi]
+ \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalic] [LucidaNewMath-AltDemiItalic]
+ \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol-Demi]
+ \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows-Demi]
+ \definefontsynonym [MathBeta] [LucidaNewMath-Demi]
\stoptypescript
\starttypescript [bfmath] [lucida] [name]
- \definefontsynonym [MathRomanBold] [LucidaNewMath-Demi]
- \definefontsynonym [MathExtensionBold] [LucidaNewMath-Extension]
- \definefontsynonym [MathItalicBold] [LucidaNewMath-AltDemiItalic]
- \definefontsynonym [MathSymbolBold] [LucidaNewMath-Symbol-Demi]
- \definefontsynonym [MathAlphaBold] [LucidaNewMath-Arrows-Demi]
- \definefontsynonym [MathBetaBold] [LucidaNewMath-Demi]
+ \definefontsynonym [MathRomanBold] [LucidaNewMath-Demi]
+ \definefontsynonym [MathExtensionBold] [LucidaNewMath-Extension]
+ \definefontsynonym [MathItalicBold] [LucidaNewMath-AltDemiItalic]
+ \definefontsynonym [MathSymbolBold] [LucidaNewMath-Symbol-Demi]
+ \definefontsynonym [MathAlphaBold] [LucidaNewMath-Arrows-Demi]
+ \definefontsynonym [MathBetaBold] [LucidaNewMath-Demi]
\stoptypescript
\starttypescript [handwriting] [lucida] [name]
- \definefontsynonym [Handwriting] [LucidaHandwriting-Italic]
+ \definefontsynonym [Handwriting] [LucidaHandwriting-Italic]
\stoptypescript
\starttypescript [calligraphy] [lucida] [name]
- \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic]
+ \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic]
\stoptypescript
\starttypescript [serif] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-Demi] [\typescriptthree-lbd] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-DemiItalic] [\typescriptthree-lbdi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-Italic] [\typescriptthree-lbi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBrightSmallcaps] [\typescriptthree-lbrsc] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typescriptthree-lbdsc] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-Oblique] [\typescriptthree-lbsl] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Demi] [\typescriptthree-lbd] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-DemiItalic] [\typescriptthree-lbdi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Italic] [\typescriptthree-lbi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBrightSmallcaps] [\typescriptthree-lbrsc] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typescriptthree-lbdsc] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaBright-Oblique] [\typescriptthree-lbsl] [encoding=\typescriptthree]
\stoptypescript
\starttypescript [sans] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaSans] [\typescriptthree-lsr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-Demi] [\typescriptthree-lsd] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-DemiItalic] [\typescriptthree-lsdi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-Italic] [\typescriptthree-lsi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-Bold] [\typescriptthree-lsb] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-BoldItalic] [\typescriptthree-lsbi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans] [\typescriptthree-lsr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Demi] [\typescriptthree-lsd] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-DemiItalic] [\typescriptthree-lsdi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Italic] [\typescriptthree-lsi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Bold] [\typescriptthree-lsb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-BoldItalic] [\typescriptthree-lsbi] [encoding=\typescriptthree]
\stoptypescript
\starttypescript [mono] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaSans-Typewriter] [\typescriptthree-lstr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-TypewriterBold] [\typescriptthree-lstb] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typescriptthree-lstbo] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-TypewriterOblique] [\typescriptthree-lsto] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-Typewriter] [\typescriptthree-lstr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterBold] [\typescriptthree-lstb] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typescriptthree-lstbo] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaSans-TypewriterOblique] [\typescriptthree-lsto] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
+ \fakecontrolspace
\stoptypescript
\starttypescript [math] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaNewMath-AltItalic] [lbmo]
- \definefontsynonym [LucidaNewMath-Arrows] [lbma]
- \definefontsynonym [LucidaNewMath-Extension] [lbme]
- \definefontsynonym [LucidaNewMath-Roman] [lbmr]
- \definefontsynonym [LucidaNewMath-Italic] [lbmi]
- \definefontsynonym [LucidaNewMath-Symbol] [lbms]
- \definefontsynonym [LucidaBlackletter] [lbl]
+ \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaNewMath-AltItalic] [lbmo]
+ \definefontsynonym [LucidaNewMath-Arrows] [lbma]
+ \definefontsynonym [LucidaNewMath-Extension] [lbme]
+ \definefontsynonym [LucidaNewMath-Roman] [lbmr]
+ \definefontsynonym [LucidaNewMath-Italic] [lbmi]
+ \definefontsynonym [LucidaNewMath-Symbol] [lbms]
+ \definefontsynonym [LucidaBlackletter] [lbl]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
\stoptypescript
\starttypescript [boldmath,bfmath] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaNewMath-AltDemiItalic] [lbmdo]
- \definefontsynonym [LucidaNewMath-Arrows-Demi] [lbmad]
- \definefontsynonym [LucidaNewMath-Extension] [lbme]
- \definefontsynonym [LucidaNewMath-Demi] [lbmd]
- \definefontsynonym [LucidaNewMath-DemiItalic] [lbmdi]
- \definefontsynonym [LucidaNewMath-Symbol-Demi] [lbmsd]
+ \definefontsynonym [LucidaNewMath-AltDemiItalic] [lbmdo]
+ \definefontsynonym [LucidaNewMath-Arrows-Demi] [lbmad]
+ \definefontsynonym [LucidaNewMath-Extension] [lbme]
+ \definefontsynonym [LucidaNewMath-Demi] [lbmd]
+ \definefontsynonym [LucidaNewMath-DemiItalic] [lbmdi]
+ \definefontsynonym [LucidaNewMath-Symbol-Demi] [lbmsd]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
\stoptypescript
\starttypescript [calligraphy] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaCalligraphy-Italic] [\typescriptthree-lbc] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaCalligraphy-Italic] [\typescriptthree-lbc] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
\stoptypescript
\starttypescript [casual] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaCasual] [\typescriptthree-lbkr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaCasual-Italic] [\typescriptthree-lbki] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaCasual] [\typescriptthree-lbkr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaCasual-Italic] [\typescriptthree-lbki] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
\stoptypescript
\starttypescript [handwriting] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaHandwriting-Italic] [\typescriptthree-lbh] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaHandwriting-Italic] [\typescriptthree-lbh] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
\stoptypescript
\starttypescript [fax] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaFax] [\typescriptthree-lfr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaFax-Demi] [\typescriptthree-lfd] [encoding=\typescriptthree]
- \definefontsynonym [LucidaFax-DemiItalic] [\typescriptthree-lfdi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaFax-Italic] [\typescriptthree-lfi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaFax] [\typescriptthree-lfr] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaFax-Demi] [\typescriptthree-lfd] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaFax-DemiItalic] [\typescriptthree-lfdi] [encoding=\typescriptthree]
+ \definefontsynonym [LucidaFax-Italic] [\typescriptthree-lfi] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
\stoptypescript
-% Informal : Vulis
+\starttypescript [lucida,lucidabfm] [texnansi,ec,8r,uc]
+ \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
+ \loadmapfile [\typescriptthree-bh-lucida.map]
+\stoptypescript
+
+\starttypescript [lucida] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [math] [lucida] [default] [encoding=\typescripttwo]
+\stoptypescript
-\starttypescript [map] [informal] [default]
- \loadmapfile[original-micropress-informal.map]
+\starttypescript [lucidaboldmath] [texnansi,ec,8r]
+ \definetypeface [lucidaboldmath] [rm] [serif] [lucida] [default] [encoding=\typescripttwo] % needed ?
+ \definetypeface [lucidaboldmath] [ss] [sans] [lucida] [default] [encoding=\typescripttwo] % needed ?
+ \definetypeface [lucidaboldmath] [tt] [mono] [lucida] [default] [encoding=\typescripttwo] % needed ?
+ \definetypeface [lucidaboldmath] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
\stoptypescript
+\starttypescript [lucidabfm,lucidaboldmath] [texnansi,ec,8r]
+ \definetypeface [lucida] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
+ \definetypeface [lucidaboldmath] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
+\stoptypescript
+
+\starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r]
+ \usemathcollection[lbr]
+ \quittypescriptscanning % last in the row
+\stoptypescript
+
+% Informal : Vulis
+
\starttypescript [casual] [informal] [name]
- \definefontsynonym [Serif] [Informal-Regular]
- \definefontsynonym [SerifBold] [Informal-Bold]
- \definefontsynonym [SerifSlanted] [Informal-Oblique]
- \definefontsynonym [SerifItalic] [Informal-Oblique]
- \definefontsynonym [SerifBoldSlanted] [Informal-BoldOblique]
- \definefontsynonym [SerifBoldItalic] [Informal-BoldOblique]
- \definefontsynonym [SerifCaps] [Informal-Regular]
+ \definefontsynonym [Serif] [Informal-Regular]
+ \definefontsynonym [SerifBold] [Informal-Bold]
+ \definefontsynonym [SerifSlanted] [Informal-Oblique]
+ \definefontsynonym [SerifItalic] [Informal-Oblique]
+ \definefontsynonym [SerifBoldSlanted] [Informal-BoldOblique]
+ \definefontsynonym [SerifBoldItalic] [Informal-BoldOblique]
+ \definefontsynonym [SerifCaps] [Informal-Regular]
\stoptypescript
\starttypescript [math] [informal] [name]
- \definefontsynonym [MathRoman] [Informal-Regular]
- \definefontsynonym [MathExtension] [Informal-MathExtendedSymbols]
- \definefontsynonym [MathItalic] [Informal-MathItalics]
- \definefontsynonym [MathSymbol] [Informal-MathSymbols]
+ \definefontsynonym [MathRoman] [Informal-Regular]
+ \definefontsynonym [MathExtension] [Informal-MathExtendedSymbols]
+ \definefontsynonym [MathItalic] [Informal-MathItalics]
+ \definefontsynonym [MathSymbol] [Informal-MathSymbols]
\stoptypescript
\starttypescript [casual] [informal] [default]
- \definefontsynonym [Informal-Regular] [ifrm10cm]
- \definefontsynonym [Informal-Bold] [ifrb10cm]
- \definefontsynonym [Informal-Oblique] [ifro10cm]
- \definefontsynonym [Informal-BoldOblique] [ifbo10cm]
+ \definefontsynonym [Informal-Regular] [ifrm10cm]
+ \definefontsynonym [Informal-Bold] [ifrb10cm]
+ \definefontsynonym [Informal-Oblique] [ifro10cm]
+ \definefontsynonym [Informal-BoldOblique] [ifbo10cm]
+ \loadmapfile[original-micropress-informal.map]
\stoptypescript
\starttypescript [math] [informal] [default]
- \definefontsynonym [Informal-Regular] [ifrm10cm]
- \definefontsynonym [Informal-MathExtendedSymbols] [ifex10]
- \definefontsynonym [Informal-MathItalics] [ifmi10]
- \definefontsynonym [Informal-MathSymbols] [ifsy10]
+ \definefontsynonym [Informal-Regular] [ifrm10cm]
+ \definefontsynonym [Informal-MathExtendedSymbols] [ifex10]
+ \definefontsynonym [Informal-MathItalics] [ifmi10]
+ \definefontsynonym [Informal-MathSymbols] [ifsy10]
+ \loadmapfile[original-micropress-informal.map]
\stoptypescript
% ITC Officina
-\starttypescript [map] [officina] [ec,8r,texnansi]
- \loadmapfile [\typescriptthree-itc-officina.map]
-\stoptypescript
-
\starttypescript [serif] [officina] [name]
-
- \definefontsynonym [Serif] [OfficinaSerif-Book]
- \definefontsynonym [SerifItalic] [OfficinaSerif-BookItalic]
- \definefontsynonym [SerifSlanted] [OfficinaSerif-BookSlanted]
- \definefontsynonym [SerifBold] [OfficinaSerif-Bold]
- \definefontsynonym [SerifBoldItalic] [OfficinaSerif-BoldItalic]
- \definefontsynonym [SerifBoldSlanted][OfficinaSerif-BoldSlanted]
- \definefontsynonym [SerifCaps] [OfficinaSerif-Caps]
-
+ \definefontsynonym [Serif] [OfficinaSerif-Book]
+ \definefontsynonym [SerifItalic] [OfficinaSerif-BookItalic]
+ \definefontsynonym [SerifSlanted] [OfficinaSerif-BookSlanted]
+ \definefontsynonym [SerifBold] [OfficinaSerif-Bold]
+ \definefontsynonym [SerifBoldItalic] [OfficinaSerif-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [OfficinaSerif-BoldSlanted]
+ \definefontsynonym [SerifCaps] [OfficinaSerif-Caps]
\stoptypescript
\starttypescript [sans] [officina] [name]
-
- \definefontsynonym [Sans] [OfficinaSans-Book]
- \definefontsynonym [SansItalic] [OfficinaSans-BookItalic]
- \definefontsynonym [SansSlanted] [OfficinaSans-BookSlanted]
- \definefontsynonym [SansBold] [OfficinaSans-Bold]
- \definefontsynonym [SansBoldItalic] [OfficinaSans-BoldItalic]
- \definefontsynonym [SansBoldSlanted][OfficinaSans-BoldSlanted]
- \definefontsynonym [SansCaps] [OfficinaSans-Caps]
-
+ \definefontsynonym [Sans] [OfficinaSans-Book]
+ \definefontsynonym [SansItalic] [OfficinaSans-BookItalic]
+ \definefontsynonym [SansSlanted] [OfficinaSans-BookSlanted]
+ \definefontsynonym [SansBold] [OfficinaSans-Bold]
+ \definefontsynonym [SansBoldItalic] [OfficinaSans-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [OfficinaSans-BoldSlanted]
+ \definefontsynonym [SansCaps] [OfficinaSans-Caps]
\stoptypescript
\starttypescript [serif] [officina] [texnansi,ec,8r]
-
- \definefontsynonym [OfficinaSerif-Book] [\typescriptthree-ovbk] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSerif-BookItalic] [\typescriptthree-ovwi] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSerif-Bold] [\typescriptthree-ovb] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSerif-BoldItalic] [\typescriptthree-ovbi] [encoding=\typescriptthree]
-
- \definefontsynonym [OfficinaSerif-BookSlanted][\typescriptthree-ovbk-slanted-167] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSerif-BoldSlanted][\typescriptthree-ovb-slanted-167] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSerif-Caps] [\typescriptthree-ovbk-capitalized-800] [encoding=\typescriptthree]
-
+ \definefontsynonym [OfficinaSerif-Book] [\typescriptthree-ovbk] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BookItalic] [\typescriptthree-ovwi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-Bold] [\typescriptthree-ovb] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BoldItalic] [\typescriptthree-ovbi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BookSlanted] [\typescriptthree-ovbk-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-BoldSlanted] [\typescriptthree-ovb-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSerif-Caps] [\typescriptthree-ovbk-capitalized-800] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-itc-officina.map]
\stoptypescript
\starttypescript [sans] [officina] [texnansi,ec,8r]
-
- \definefontsynonym [OfficinaSans-Book] [\typescriptthree-owbk] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSans-BookItalic] [\typescriptthree-owwi] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSans-Bold] [\typescriptthree-owb] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSans-BoldItalic] [\typescriptthree-owbi] [encoding=\typescriptthree]
-
- \definefontsynonym [OfficinaSans-BookSlanted][\typescriptthree-owbk-slanted-167] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSans-BoldSlanted][\typescriptthree-owb-slanted-167] [encoding=\typescriptthree]
- \definefontsynonym [OfficinaSans-Caps] [\typescriptthree-owbk-capitalized-800] [encoding=\typescriptthree]
-
+ \definefontsynonym [OfficinaSans-Book] [\typescriptthree-owbk] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BookItalic] [\typescriptthree-owwi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-Bold] [\typescriptthree-owb] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BoldItalic] [\typescriptthree-owbi] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BookSlanted] [\typescriptthree-owbk-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-BoldSlanted] [\typescriptthree-owb-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [OfficinaSans-Caps] [\typescriptthree-owbk-capitalized-800] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-itc-officina.map]
\stoptypescript
% FontFont Meta
-\starttypescript [map] [meta] [ec,8r,texnansi]
- \loadmapfile [\typescriptthree-fontfont-meta.map]
-\stoptypescript
-
\starttypescript [sans] [meta] [name]
-
- \definefontsynonym [Sans] [MetaNormal-Roman]
- \definefontsynonym [SansItalic] [MetaNormal-Italic]
- \definefontsynonym [SansSlanted] [MetaNormal-Italic]
- \definefontsynonym [SansBold] [MetaBold-Roman]
- \definefontsynonym [SansBoldItalic] [MetaBold-Italic]
- \definefontsynonym [SansBoldSlanted][MetaBold-Italic]
- \definefontsynonym [SansCaps] [MetaNormal-Caps]
-
+ \definefontsynonym [Sans] [MetaNormal-Roman]
+ \definefontsynonym [SansItalic] [MetaNormal-Italic]
+ \definefontsynonym [SansSlanted] [MetaNormal-Italic]
+ \definefontsynonym [SansBold] [MetaBold-Roman]
+ \definefontsynonym [SansBoldItalic] [MetaBold-Italic]
+ \definefontsynonym [SansBoldSlanted][MetaBold-Italic]
+ \definefontsynonym [SansCaps] [MetaNormal-Caps]
\stoptypescript
\starttypescript [sans] [meta-medium] [name]
-
- \definefontsynonym [Sans] [MetaMedium-Roman]
- \definefontsynonym [SansItalic] [MetaMedium-Italic]
- \definefontsynonym [SansSlanted] [MetaMedium-Italic]
- \definefontsynonym [SansBold] [MetaBold-Roman]
- \definefontsynonym [SansBoldItalic] [MetaBold-Italic]
- \definefontsynonym [SansBoldSlanted][MetaBold-Italic]
- \definefontsynonym [SansCaps] [MetaMedium-Caps]
-
+ \definefontsynonym [Sans] [MetaMedium-Roman]
+ \definefontsynonym [SansItalic] [MetaMedium-Italic]
+ \definefontsynonym [SansSlanted] [MetaMedium-Italic]
+ \definefontsynonym [SansBold] [MetaBold-Roman]
+ \definefontsynonym [SansBoldItalic] [MetaBold-Italic]
+ \definefontsynonym [SansBoldSlanted][MetaBold-Italic]
+ \definefontsynonym [SansCaps] [MetaMedium-Caps]
\stoptypescript
\starttypescript [sans] [meta-lf] [name]
-
- \definefontsynonym [Sans] [MetaBookLF-Roman]
- \definefontsynonym [SansBold] [MetaBoldLF-Roman]
- \definefontsynonym [SansItalic] [MetaBookLF-Italic]
- \definefontsynonym [SansBoldItalic] [MetaBoldLF-Italic]
- \definefontsynonym [SansCaps] [MetaBookLF-Caps]
-
+ \definefontsynonym [Sans] [MetaBookLF-Roman]
+ \definefontsynonym [SansBold] [MetaBoldLF-Roman]
+ \definefontsynonym [SansItalic] [MetaBookLF-Italic]
+ \definefontsynonym [SansBoldItalic] [MetaBoldLF-Italic]
+ \definefontsynonym [SansCaps] [MetaBookLF-Caps]
\stoptypescript
\starttypescript [sans] [meta,meta-book] [texnansi,ec,8r]
-
- \definefontsynonym [MetaBook-Roman] [\typescriptthree-mtbk] [encoding=\typescriptthree]
- \definefontsynonym [MetaBook-Italic] [\typescriptthree-mtbki] [encoding=\typescriptthree]
- \definefontsynonym [MetaBook-Caps] [\typescriptthree-mtbkc] [encoding=\typescriptthree]
- \definefontsynonym [MetaBook-ItalicCaps] [\typescriptthree-mtbkic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaBook-Roman] [\typescriptthree-mtbk] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBook-Italic] [\typescriptthree-mtbki] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBook-Caps] [\typescriptthree-mtbkc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBook-ItalicCaps] [\typescriptthree-mtbkic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-lf,meta-book-lf] [texnansi,ec,8r]
-
- \definefontsynonym [MetaBookLF-Roman] [\typescriptthree-mtbkf] [encoding=\typescriptthree]
- \definefontsynonym [MetaBookLF-Italic] [\typescriptthree-mtbkfi] [encoding=\typescriptthree]
- \definefontsynonym [MetaBookLF-Caps] [\typescriptthree-mtbkfc] [encoding=\typescriptthree]
- \definefontsynonym [MetaBookLF-ItalicCaps] [\typescriptthree-mtbkfic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaBookLF-Roman] [\typescriptthree-mtbkf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBookLF-Italic] [\typescriptthree-mtbkfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBookLF-Caps] [\typescriptthree-mtbkfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBookLF-ItalicCaps] [\typescriptthree-mtbkfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta,meta-bold] [texnansi,ec,8r]
-
- \definefontsynonym [MetaBold-Roman] [\typescriptthree-mtbd] [encoding=\typescriptthree]
- \definefontsynonym [MetaBold-Italic] [\typescriptthree-mtbdi] [encoding=\typescriptthree]
- \definefontsynonym [MetaBold-Caps] [\typescriptthree-mtbdc] [encoding=\typescriptthree]
- \definefontsynonym [MetaBold-ItalicCaps] [\typescriptthree-mtbdic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaBold-Roman] [\typescriptthree-mtbd] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBold-Italic] [\typescriptthree-mtbdi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBold-Caps] [\typescriptthree-mtbdc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBold-ItalicCaps] [\typescriptthree-mtbdic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-lf,meta-bold-lf] [texnansi,ec,8r]
-
- \definefontsynonym [MetaBoldLF-Roman] [\typescriptthree-mtbdf] [encoding=\typescriptthree]
- \definefontsynonym [MetaBoldLF-Italic] [\typescriptthree-mtbdfi] [encoding=\typescriptthree]
- \definefontsynonym [MetaBoldLF-Caps] [\typescriptthree-mtbdfc] [encoding=\typescriptthree]
- \definefontsynonym [MetaBoldLF-ItalicCaps] [\typescriptthree-mtbdfic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaBoldLF-Roman] [\typescriptthree-mtbdf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBoldLF-Italic] [\typescriptthree-mtbdfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBoldLF-Caps] [\typescriptthree-mtbdfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBoldLF-ItalicCaps] [\typescriptthree-mtbdfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-normal] [texnansi,ec,8r]
-
- \definefontsynonym [MetaNormal-Roman] [\typescriptthree-mtn] [encoding=\typescriptthree]
- \definefontsynonym [MetaNormal-Italic] [\typescriptthree-mtni] [encoding=\typescriptthree]
- \definefontsynonym [MetaNormal-Caps] [\typescriptthree-mtnc] [encoding=\typescriptthree]
- \definefontsynonym [MetaNormal-ItalicCaps] [\typescriptthree-mtnic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaNormal-Roman] [\typescriptthree-mtn] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormal-Italic] [\typescriptthree-mtni] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormal-Caps] [\typescriptthree-mtnc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormal-ItalicCaps] [\typescriptthree-mtnic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-normal-lf] [texnansi,ec,8r]
-
- \definefontsynonym [MetaNormalLF-Roman] [\typescriptthree-mtnf] [encoding=\typescriptthree]
- \definefontsynonym [MetaNormalLF-Italic] [\typescriptthree-mtnfi] [encoding=\typescriptthree]
- \definefontsynonym [MetaNormalLF-Caps] [\typescriptthree-mtnfc] [encoding=\typescriptthree]
- \definefontsynonym [MetaNormalLF-ItalicCaps] [\typescriptthree-mtnfic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaNormalLF-Roman] [\typescriptthree-mtnf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormalLF-Italic] [\typescriptthree-mtnfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormalLF-Caps] [\typescriptthree-mtnfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaNormalLF-ItalicCaps] [\typescriptthree-mtnfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-medium] [texnansi,ec,8r]
-
- \definefontsynonym [MetaMedium-Roman] [\typescriptthree-mtm] [encoding=\typescriptthree]
- \definefontsynonym [MetaMedium-Italic] [\typescriptthree-mtmi] [encoding=\typescriptthree]
- \definefontsynonym [MetaMedium-Caps] [\typescriptthree-mtmc] [encoding=\typescriptthree]
- \definefontsynonym [MetaMedium-ItalicCaps] [\typescriptthree-mtmic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaMedium-Roman] [\typescriptthree-mtm] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMedium-Italic] [\typescriptthree-mtmi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMedium-Caps] [\typescriptthree-mtmc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMedium-ItalicCaps] [\typescriptthree-mtmic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-medium-lf] [texnansi,ec,8r]
-
- \definefontsynonym [MetaMediumLF-Roman] [\typescriptthree-mtmf] [encoding=\typescriptthree]
- \definefontsynonym [MetaMediumLF-Italic] [\typescriptthree-mtmfi] [encoding=\typescriptthree]
- \definefontsynonym [MetaMediumLF-Caps] [\typescriptthree-mtmfc] [encoding=\typescriptthree]
- \definefontsynonym [MetaMediumLF-ItalicCaps] [\typescriptthree-mtmfic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaMediumLF-Roman] [\typescriptthree-mtmf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMediumLF-Italic] [\typescriptthree-mtmfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMediumLF-Caps] [\typescriptthree-mtmfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaMediumLF-ItalicCaps] [\typescriptthree-mtmfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-black] [texnansi,ec,8r]
-
- \definefontsynonym [MetaBlack-Roman] [\typescriptthree-mtbl] [encoding=\typescriptthree]
- \definefontsynonym [MetaBlack-Italic] [\typescriptthree-mtbli] [encoding=\typescriptthree]
- \definefontsynonym [MetaBlack-Caps] [\typescriptthree-mtblc] [encoding=\typescriptthree]
- \definefontsynonym [MetaBlack-ItalicCaps] [\typescriptthree-mtblic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaBlack-Roman] [\typescriptthree-mtbl] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlack-Italic] [\typescriptthree-mtbli] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlack-Caps] [\typescriptthree-mtblc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlack-ItalicCaps] [\typescriptthree-mtblic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [sans] [meta-black-lf] [texnansi,ec,8r]
-
- \definefontsynonym [MetaBlackLF-Roman] [\typescriptthree-mtblf] [encoding=\typescriptthree]
- \definefontsynonym [MetaBlackLF-Italic] [\typescriptthree-mtblfi] [encoding=\typescriptthree]
- \definefontsynonym [MetaBlackLF-Caps] [\typescriptthree-mtblfc] [encoding=\typescriptthree]
- \definefontsynonym [MetaBlackLF-ItalicCaps] [\typescriptthree-mtblfic] [encoding=\typescriptthree]
-
+ \definefontsynonym [MetaBlackLF-Roman] [\typescriptthree-mtblf] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlackLF-Italic] [\typescriptthree-mtblfi] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlackLF-Caps] [\typescriptthree-mtblfc] [encoding=\typescriptthree]
+ \definefontsynonym [MetaBlackLF-ItalicCaps] [\typescriptthree-mtblfic] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
\starttypescript [expert] [meta] % incomplete
-
- \definefontsynonym [MetaNormal-Expert] [mtnx]
-
+ \definefontsynonym [MetaNormal-Expert] [mtnx]
+ \loadmapfile [\typescriptthree-fontfont-meta.map]
\stoptypescript
%D Linotype Univers
-\starttypescript [map] [univers] [texnansi]
- \loadmapfile[\typescriptthree-linotype-univers.map]
-\stoptypescript
-
\starttypescript [sans] [univers,univers-light,univers-black] [name]
-
\definefontsynonym [Sans] [Univers]
\definefontsynonym [SansBold] [Univers-Bold]
\definefontsynonym [SansSlanted] [Univers-Oblique]
\definefontsynonym [SansBoldSlanted] [Univers-BoldOblique]
-
\stoptypescript
\starttypescript [sans] [univers-light] [name]
-
\definefontsynonym [Sans] [Univers-Light]
\definefontsynonym [SansSlanted] [Univers-LightOblique]
-
\stoptypescript
\starttypescript [sans] [univers-black] [name]
-
\definefontsynonym [Sans] [Univers-Black]
\definefontsynonym [SansSlanted] [Univers-BlackOblique]
\definefontsynonym [SansBold] [Univers-Black]
\definefontsynonym [SansBoldSlanted] [Univers-BlackOblique]
-
\stoptypescript
\starttypescript [sans] [univers,univers-black,univers-light] [texnansi,ec,8r]
-
- \definefontsynonym [Univers-Light] [\typescriptthree-lt50136] [encoding=\typescriptthree]
- \definefontsynonym [Univers-LightOblique] [\typescriptthree-lt50137] [encoding=\typescriptthree]
-
- \definefontsynonym [Univers] [\typescriptthree-lt50138] [encoding=\typescriptthree]
- \definefontsynonym [Univers-Oblique] [\typescriptthree-lt50139] [encoding=\typescriptthree]
- \definefontsynonym [Univers-Bold] [\typescriptthree-lt50140] [encoding=\typescriptthree]
- \definefontsynonym [Univers-BoldOblique] [\typescriptthree-lt50141] [encoding=\typescriptthree]
-
- \definefontsynonym [Univers-Black] [\typescriptthree-lt50142] [encoding=\typescriptthree]
- \definefontsynonym [Univers-BlackOblique] [\typescriptthree-lt50143] [encoding=\typescriptthree]
-
+ \definefontsynonym [Univers-Light] [\typescriptthree-lt50136] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-LightOblique] [\typescriptthree-lt50137] [encoding=\typescriptthree]
+ \definefontsynonym [Univers] [\typescriptthree-lt50138] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-Oblique] [\typescriptthree-lt50139] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-Bold] [\typescriptthree-lt50140] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-BoldOblique] [\typescriptthree-lt50141] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-Black] [\typescriptthree-lt50142] [encoding=\typescriptthree]
+ \definefontsynonym [Univers-BlackOblique] [\typescriptthree-lt50143] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-univers.map]
\stoptypescript
% mendoza
-\starttypescript [map] [mendoza] [ec,8r,texnansi]
- \loadmapfile[\typescriptthree-itc-mendoza.map]
-\stoptypescript
-
\starttypescript [serif] [mendoza] [name]
-
\definefontsynonym [Serif] [MendozaRoman-Book]
\definefontsynonym [SerifCaps] [MendozaRoman-Book]
\definefontsynonym [SerifSlanted] [MendozaRoman-BookItalic]
@@ -488,370 +463,241 @@
\definefontsynonym [SerifBold] [MendozaRoman-Bold]
\definefontsynonym [SerifBoldSlanted] [MendozaRoman-BoldItalic]
\definefontsynonym [SerifBoldItalic] [MendozaRoman-BoldItalic]
-
\stoptypescript
\starttypescript [serif] [mendoza] [ec,8r,texnansi]
-
- \definefontsynonym[MendozaRoman-Bold] [\typescriptthree-zab] [encoding=\typescriptthree]
- \definefontsynonym[MendozaRoman-BoldItalic] [\typescriptthree-zabi][encoding=\typescriptthree]
- \definefontsynonym[MendozaRoman-Medium] [\typescriptthree-zam] [encoding=\typescriptthree]
- \definefontsynonym[MendozaRoman-MediumItalic][\typescriptthree-zami][encoding=\typescriptthree]
- \definefontsynonym[MendozaRoman-Book] [\typescriptthree-zaw] [encoding=\typescriptthree]
- \definefontsynonym[MendozaRoman-BookItalic] [\typescriptthree-zawi][encoding=\typescriptthree]
-
+ \definefontsynonym[MendozaRoman-Bold] [\typescriptthree-zab] [encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-BoldItalic] [\typescriptthree-zabi][encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-Medium] [\typescriptthree-zam] [encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-MediumItalic][\typescriptthree-zami][encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-Book] [\typescriptthree-zaw] [encoding=\typescriptthree]
+ \definefontsynonym[MendozaRoman-BookItalic] [\typescriptthree-zawi][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-mendoza.map]
\stoptypescript
% frutiger
-\starttypescript [map] [frutiger] [ec,8r,texnansi]
- \loadmapfile[\typescriptthree-adobe-frutiger.map]
-\stoptypescript
-
\starttypescript [sans] [frutiger] [name]
-
- \definefontsynonym [Sans] [Frutiger-Roman]
- \definefontsynonym [SansCaps] [Frutiger-Roman]
- \definefontsynonym [SansItalic] [Frutiger-Italic]
- \definefontsynonym [SansSlanted] [Frutiger-Italic]
- \definefontsynonym [SansBold] [Frutiger-Bold]
- \definefontsynonym [SansBoldItalic] [Frutiger-BoldItalic]
- \definefontsynonym [SansBoldSlanted] [Frutiger-BoldItalic]
-
+ \definefontsynonym [Sans] [Frutiger-Roman]
+ \definefontsynonym [SansCaps] [Frutiger-Roman]
+ \definefontsynonym [SansItalic] [Frutiger-Italic]
+ \definefontsynonym [SansSlanted] [Frutiger-Italic]
+ \definefontsynonym [SansBold] [Frutiger-Bold]
+ \definefontsynonym [SansBoldItalic] [Frutiger-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [Frutiger-BoldItalic]
\stoptypescript
\starttypescript [sans] [frutiger] [ec,8r,texnansi]
-
- \definefontsynonym[Frutiger-Bold] [\typescriptthree-ftb] [encoding=\typescriptthree]
- \definefontsynonym[Frutiger-BoldItalic] [\typescriptthree-ftbi] [encoding=\typescriptthree]
- \definefontsynonym[Frutiger-Black] [\typescriptthree-ftbl] [encoding=\typescriptthree]
- \definefontsynonym[Frutiger-BlackItalic][\typescriptthree-ftbli][encoding=\typescriptthree]
- \definefontsynonym[Frutiger-Italic] [\typescriptthree-fti] [encoding=\typescriptthree]
- \definefontsynonym[Frutiger-Light] [\typescriptthree-ftl] [encoding=\typescriptthree]
- \definefontsynonym[Frutiger-LightItalic][\typescriptthree-ftli] [encoding=\typescriptthree]
- \definefontsynonym[Frutiger-Roman] [\typescriptthree-ftr] [encoding=\typescriptthree]
- \definefontsynonym[Frutiger-UltraBlack] [\typescriptthree-ftubl][encoding=\typescriptthree]
-
+ \definefontsynonym[Frutiger-Bold] [\typescriptthree-ftb] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-BoldItalic] [\typescriptthree-ftbi] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Black] [\typescriptthree-ftbl] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-BlackItalic][\typescriptthree-ftbli][encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Italic] [\typescriptthree-fti] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Light] [\typescriptthree-ftl] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-LightItalic][\typescriptthree-ftli] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-Roman] [\typescriptthree-ftr] [encoding=\typescriptthree]
+ \definefontsynonym[Frutiger-UltraBlack] [\typescriptthree-ftubl][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-adobe-frutiger.map]
\stoptypescript
% kabel
-\starttypescript [map] [kabel] [ec,8r,texnansi]
- \loadmapfile [\typescriptthree-itc-kabel.map]
-\stoptypescript
-
-% \starttypescript [sans] [kabel] [name]
-
-% \definefontsynonym [Sans] [ItcKabel-Bold]
-% \definefontsynonym [SansItalic] [ItcKabel-Bold]
-% \definefontsynonym [SansSlanted] [ItcKabel-Bold]
-% \definefontsynonym [SansBold] [ItcKabel-Bold]
-% \definefontsynonym [SansBoldItalic] [ItcKabel-Bold]
-% \definefontsynonym [SansBoldSlanted] [ItcKabel-Bold]
-
-% \stoptypescript
-
\starttypescript [sans] [kabel] [ec,8r,texnansi]
-
- \definefontsynonym [ItcKabel-Bold] [\typescriptthree-kbb] [encoding=\typescriptthree]
- \definefontsynonym [ItcKabel-Demi] [\typescriptthree-kbd] [encoding=\typescriptthree]
- \definefontsynonym [ItcKabel-Medium] [\typescriptthree-kbm] [encoding=\typescriptthree]
- \definefontsynonym [ItcKabel-Ultra] [\typescriptthree-kbu] [encoding=\typescriptthree]
- \definefontsynonym [ItcKabel-Book] [\typescriptthree-kbw] [encoding=\typescriptthree]
-
+ \definefontsynonym [ItcKabel-Bold] [\typescriptthree-kbb] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Demi] [\typescriptthree-kbd] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Medium] [\typescriptthree-kbm] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Ultra] [\typescriptthree-kbu] [encoding=\typescriptthree]
+ \definefontsynonym [ItcKabel-Book] [\typescriptthree-kbw] [encoding=\typescriptthree]
+ \loadmapfile [\typescriptthree-itc-kabel.map]
\stoptypescript
% thesans
-\starttypescript [map] [thesans] [ec,8r,texnansi]
- \loadmapfile[\typescriptthree-lucas-thesans.map]
-\stoptypescript
-
\starttypescript [sans] [thesans] [name]
-
- \definefontsynonym [Sans] [TheSans-Plain]
- \definefontsynonym [SansItalic] [TheSans-Italic]
- \definefontsynonym [SansSlanted] [TheSans-Italic]
- \definefontsynonym [SansBold] [TheSansBold-Plain]
- \definefontsynonym [SansBoldItalic] [TheSansBold-Italic]
- \definefontsynonym [SansBoldSlanted] [TheSansBold-Italic]
-
- \definefontsynonym [SansCaps] [TheSans-Caps]
- \definefontsynonym [SansCapsItalic] [TheSans-CapsItalic]
- \definefontsynonym [SansCapsSlanted] [TheSans-CapsItalic]
- \definefontsynonym [SansCapsBold] [TheSansBold-Caps]
- \definefontsynonym [SansCapsBoldItalic] [TheSansBold-CapsItalic]
- \definefontsynonym [SansCapsBoldSlanted] [TheSansBold-CapsItalic]
-
+ \definefontsynonym [Sans] [TheSans-Plain]
+ \definefontsynonym [SansItalic] [TheSans-Italic]
+ \definefontsynonym [SansSlanted] [TheSans-Italic]
+ \definefontsynonym [SansBold] [TheSansBold-Plain]
+ \definefontsynonym [SansBoldItalic] [TheSansBold-Italic]
+ \definefontsynonym [SansBoldSlanted] [TheSansBold-Italic]
+ \definefontsynonym [SansCaps] [TheSans-Caps]
+ \definefontsynonym [SansCapsItalic] [TheSans-CapsItalic]
+ \definefontsynonym [SansCapsSlanted] [TheSans-CapsItalic]
+ \definefontsynonym [SansCapsBold] [TheSansBold-Caps]
+ \definefontsynonym [SansCapsBoldItalic] [TheSansBold-CapsItalic]
+ \definefontsynonym [SansCapsBoldSlanted] [TheSansBold-CapsItalic]
\stoptypescript
\starttypescript [mono] [thesans] [name]
-
- \definefontsynonym [Mono] [TheSansTypewriter-Plain]
- \definefontsynonym [MonoCaps] [TheSansTypewriter-Plain]
- \definefontsynonym [MonoItalic] [TheSansTypewriter-Italic]
- \definefontsynonym [MonoSlanted] [TheSansTypewriter-Italic]
- \definefontsynonym [MonoBold] [TheSansTypewriter-Bold]
- \definefontsynonym [MonoBoldItalic] [TheSansTypewriter-BoldItalic]
- \definefontsynonym [MonoBoldSlanted] [TheSansTypewriter-BoldItalic]
-
+ \definefontsynonym [Mono] [TheSansTypewriter-Plain]
+ \definefontsynonym [MonoCaps] [TheSansTypewriter-Plain]
+ \definefontsynonym [MonoItalic] [TheSansTypewriter-Italic]
+ \definefontsynonym [MonoSlanted] [TheSansTypewriter-Italic]
+ \definefontsynonym [MonoBold] [TheSansTypewriter-Bold]
+ \definefontsynonym [MonoBoldItalic] [TheSansTypewriter-BoldItalic]
+ \definefontsynonym [MonoBoldSlanted] [TheSansTypewriter-BoldItalic]
\stoptypescript
\starttypescript [sans] [thesans] [ec,8r,texnansi]
-
- \definefontsynonym [TheSans-Plain] [\typescriptthree-tsan5] [encoding=\typescriptthree]
- \definefontsynonym [TheSans-Italic] [\typescriptthree-tsan5i] [encoding=\typescriptthree]
- \definefontsynonym [TheSansBold-Plain] [\typescriptthree-tsan7] [encoding=\typescriptthree]
- \definefontsynonym [TheSansBold-Italic] [\typescriptthree-tsan7i] [encoding=\typescriptthree]
-
- \definefontsynonym [TheSans-Caps] [\typescriptthree-tsan5c] [encoding=\typescriptthree]
- \definefontsynonym [TheSans-CapsItalic] [\typescriptthree-tsan5ci] [encoding=\typescriptthree]
- \definefontsynonym [TheSansBold-Caps] [\typescriptthree-tsan7c] [encoding=\typescriptthree]
- \definefontsynonym [TheSansBold-CapsItalic] [\typescriptthree-tsan7ci] [encoding=\typescriptthree]
-
-% \definefontsynonym[TheSans-B2ExtraLight] [\typescriptthree-thesnb2] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B2ExtraLightItalic] [\typescriptthree-thesnb2i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B3Light] [\typescriptthree-thesnb3] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B3LightItalic] [\typescriptthree-thesnb3i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B4SemiLight] [\typescriptthree-thesnb4] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B4SemiLightItalic] [\typescriptthree-thesnb4i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B5Plain] [\typescriptthree-thesnb5] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B5PlainItalic] [\typescriptthree-thesnb5i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B6SemiBold] [\typescriptthree-thesnb6] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B6SemiBoldItalic] [\typescriptthree-thesnb6i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B7Bold] [\typescriptthree-thesnb7] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B7BoldItalic] [\typescriptthree-thesnb7i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B8ExtraBold] [\typescriptthree-thesnb8] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B8ExtraBoldItalic] [\typescriptthree-thesnb8i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B8ExtraBoldItalic] [\typescriptthree-thesnb8i] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B9Black] [\typescriptthree-thesnb9] [encoding=\typescriptthree]
-% \definefontsynonym[TheSans-B9BlackItalic] [\typescriptthree-thesnb9i] [encoding=\typescriptthree]
-
+ \definefontsynonym [TheSans-Plain] [\typescriptthree-tsan5] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-Italic] [\typescriptthree-tsan5i] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Plain] [\typescriptthree-tsan7] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Italic] [\typescriptthree-tsan7i] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-Caps] [\typescriptthree-tsan5c] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-CapsItalic] [\typescriptthree-tsan5ci] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Caps] [\typescriptthree-tsan7c] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-CapsItalic] [\typescriptthree-tsan7ci] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-lucas-thesans.map]
\stoptypescript
\starttypescript [mono] [thesans] [ec,8r,texnansi]
-
- \definefontsynonym [TheSansTypewriter-Plain] [\typescriptthree-tsaty5] [encoding=\typescriptthree]
- \definefontsynonym [TheSansTypewriter-Italic] [\typescriptthree-tsaty5i] [encoding=\typescriptthree]
- \definefontsynonym [TheSansTypewriter-Bold] [\typescriptthree-tsaty7] [encoding=\typescriptthree]
- \definefontsynonym [TheSansTypewriter-BoldItalic] [\typescriptthree-tsaty7i] [encoding=\typescriptthree]
-
+ \definefontsynonym [TheSansTypewriter-Plain] [\typescriptthree-tsaty5] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansTypewriter-Italic] [\typescriptthree-tsaty5i] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansTypewriter-Bold] [\typescriptthree-tsaty7] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansTypewriter-BoldItalic] [\typescriptthree-tsaty7i] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-lucas-thesans.map]
\stoptypescript
\starttypescript [expert] [thesans]
-
- \definefontsynonym [TheSans-Expert] [tsan5e] [encoding=\typescriptthree]
- \definefontsynonym [TheSans-ExpertItalic] [tsan5ei] [encoding=\typescriptthree]
- \definefontsynonym [TheSansBold-Expert] [tsan7e] [encoding=\typescriptthree]
- \definefontsynonym [TheSansBold-ExpertItalic] [tsan7ei] [encoding=\typescriptthree]
-
+ \definefontsynonym [TheSans-Expert] [tsan5e] [encoding=\typescriptthree]
+ \definefontsynonym [TheSans-ExpertItalic] [tsan5ei] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-Expert] [tsan7e] [encoding=\typescriptthree]
+ \definefontsynonym [TheSansBold-ExpertItalic] [tsan7ei] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-lucas-thesans.map]
\stoptypescript
% monotype sabon
-\starttypescript [map] [sabon] [ec,8r,texnansi]
- \loadmapfile[\typescriptthree-monotype-sabon.map]
-\stoptypescript
-
\starttypescript [serif] [sabon] [name]
-
- \definefontsynonym [Serif] [SabonMT]
- \definefontsynonym [SerifItalic] [SabonMT-Italic]
- \definefontsynonym [SerifSlanted] [SabonMT-Italic]
- \definefontsynonym [SerifBold] [SabonMT-SemiBold]
- \definefontsynonym [SerifBoldItalic] [SabonMT-SemiBoldItalic]
- \definefontsynonym [SerifBoldSlanted] [SabonMT-SemiBoldItalic]
- \definefontsynonym [SerifCaps] [SabonMT-RegularSC]
-
+ \definefontsynonym [Serif] [SabonMT]
+ \definefontsynonym [SerifItalic] [SabonMT-Italic]
+ \definefontsynonym [SerifSlanted] [SabonMT-Italic]
+ \definefontsynonym [SerifBold] [SabonMT-SemiBold]
+ \definefontsynonym [SerifBoldItalic] [SabonMT-SemiBoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [SabonMT-SemiBoldItalic]
+ \definefontsynonym [SerifCaps] [SabonMT-RegularSC]
\stoptypescript
\starttypescript [serif] [sabon] [ec,8r,texnansi]
-
- \definefontsynonym[SabonMT] [\typescriptthree-sab] [encoding=\typescriptthree]
- \definefontsynonym[SabonMT-Italic] [\typescriptthree-sabi] [encoding=\typescriptthree]
- \definefontsynonym[SabonMT-ItalicOsF] [\typescriptthree-saboi][encoding=\typescriptthree]
- \definefontsynonym[SabonMT-SemiBoldOsF] [\typescriptthree-sabos][encoding=\typescriptthree]
- \definefontsynonym[SabonMT-SemiBold] [\typescriptthree-sabs] [encoding=\typescriptthree]
- \definefontsynonym[SabonMT-RegularSC] [\typescriptthree-sabsc][encoding=\typescriptthree]
- \definefontsynonym[SabonMT-SemiBoldItalic] [\typescriptthree-sabsi][encoding=\typescriptthree]
- \definefontsynonym[SabonMT-SemiBoldItalicOsF][\typescriptthree-sasio][encoding=\typescriptthree]
-
+ \definefontsynonym[SabonMT] [\typescriptthree-sab] [encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-Italic] [\typescriptthree-sabi] [encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-ItalicOsF] [\typescriptthree-saboi][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBoldOsF] [\typescriptthree-sabos][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBold] [\typescriptthree-sabs] [encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-RegularSC] [\typescriptthree-sabsc][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBoldItalic] [\typescriptthree-sabsi][encoding=\typescriptthree]
+ \definefontsynonym[SabonMT-SemiBoldItalicOsF][\typescriptthree-sasio][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-monotype-sabon.map]
\stoptypescript
% itc stone
-\starttypescript [map] [stone] [ec,texnansi]
- \loadmapfile[\typescriptthree-itc-stone.map]
-\stoptypescript
-
-% less readable but less parsing
-%
-% \starttypescript [sans,serif] [stone] [name]
-%
-% \definefontsynonym [\typescriptprefix\typescriptone ] [Stone\typescriptprefix\typescriptone ITC-Medium]
-% \definefontsynonym [\typescriptprefix\typescriptone Italic] [Stone\typescriptprefix\typescriptone ITC-MediumItalic]
-% \definefontsynonym [\typescriptprefix\typescriptone Slanted] [Stone\typescriptprefix\typescriptone ITC-MediumItalic]
-% \definefontsynonym [\typescriptprefix\typescriptone Bold] [Stone\typescriptprefix\typescriptone ITC-Bold]
-% \definefontsynonym [\typescriptprefix\typescriptone BoldItalic] [Stone\typescriptprefix\typescriptone ITC-BoldItalic]
-% \definefontsynonym [\typescriptprefix\typescriptone BoldSlanted] [Stone\typescriptprefix\typescriptone ITC-BoldItalic]
-% \definefontsynonym [\typescriptprefix\typescriptone Caps] [Stone\typescriptprefix\typescriptone SCITC-Medium]
-%
-% \stoptypescript
-
\starttypescript [sans] [stone] [name]
-
- \definefontsynonym [Sans] [StoneSansITC-Medium]
- \definefontsynonym [SansItalic] [StoneSansITC-MediumItalic]
- \definefontsynonym [SansSlanted] [StoneSansITC-MediumItalic]
- \definefontsynonym [SansBold] [StoneSansITC-Bold]
- \definefontsynonym [SansBoldItalic] [StoneSansITC-BoldItalic]
- \definefontsynonym [SansBoldSlanted] [StoneSansITC-BoldItalic]
- \definefontsynonym [SansCaps] [StoneSansSCITC-Medium]
-
+ \definefontsynonym [Sans] [StoneSansITC-Medium]
+ \definefontsynonym [SansItalic] [StoneSansITC-MediumItalic]
+ \definefontsynonym [SansSlanted] [StoneSansITC-MediumItalic]
+ \definefontsynonym [SansBold] [StoneSansITC-Bold]
+ \definefontsynonym [SansBoldItalic] [StoneSansITC-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [StoneSansITC-BoldItalic]
+ \definefontsynonym [SansCaps] [StoneSansSCITC-Medium]
\stoptypescript
\starttypescript [serif] [stone] [name]
-
- \definefontsynonym [Serif] [StoneSerifITC-Medium]
- \definefontsynonym [SerifItalic] [StoneSerifITC-MediumItalic]
- \definefontsynonym [SerifSlanted] [StoneSerifITC-MediumItalic]
- \definefontsynonym [SerifBold] [StoneSerifITC-Bold]
- \definefontsynonym [SerifBoldItalic] [StoneSerifITC-BoldItalic]
- \definefontsynonym [SerifBoldSlanted] [StoneSerifITC-BoldItalic]
- \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium]
-
+ \definefontsynonym [Serif] [StoneSerifITC-Medium]
+ \definefontsynonym [SerifItalic] [StoneSerifITC-MediumItalic]
+ \definefontsynonym [SerifSlanted] [StoneSerifITC-MediumItalic]
+ \definefontsynonym [SerifBold] [StoneSerifITC-Bold]
+ \definefontsynonym [SerifBoldItalic] [StoneSerifITC-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [StoneSerifITC-BoldItalic]
+ \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium]
\stoptypescript
\starttypescript [sans] [stone-oldstyle] [name]
-
- \definefontsynonym [Sans] [StoneSansOSITC-Medium]
- \definefontsynonym [SansItalic] [StoneSansOSITC-MediumItalic]
- \definefontsynonym [SansSlanted] [StoneSansOSITC-MediumItalic]
- \definefontsynonym [SansBold] [StoneSansOSITC-Bold]
- \definefontsynonym [SansBoldItalic] [StoneSansOSITC-BoldItalic]
- \definefontsynonym [SansBoldSlanted] [StoneSansOSITC-BoldItalic]
- \definefontsynonym [SansCaps] [StoneSansSCITC-Medium]
-
+ \definefontsynonym [Sans] [StoneSansOSITC-Medium]
+ \definefontsynonym [SansItalic] [StoneSansOSITC-MediumItalic]
+ \definefontsynonym [SansSlanted] [StoneSansOSITC-MediumItalic]
+ \definefontsynonym [SansBold] [StoneSansOSITC-Bold]
+ \definefontsynonym [SansBoldItalic] [StoneSansOSITC-BoldItalic]
+ \definefontsynonym [SansBoldSlanted] [StoneSansOSITC-BoldItalic]
+ \definefontsynonym [SansCaps] [StoneSansSCITC-Medium]
\stoptypescript
\starttypescript [serif] [stone-oldstyle] [name]
-
- \definefontsynonym [Serif] [StoneSerifOSITC-Medium]
- \definefontsynonym [SerifItalic] [StoneSerifOSITC-MediumItalic]
- \definefontsynonym [SerifSlanted] [StoneSerifOSITC-MediumItalic]
- \definefontsynonym [SerifBold] [StoneSerifOSITC-Bold]
- \definefontsynonym [SerifBoldItalic] [StoneSerifOSITC-BoldItalic]
- \definefontsynonym [SerifBoldSlanted] [StoneSerifOSITC-BoldItalic]
- \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium]
-
+ \definefontsynonym [Serif] [StoneSerifOSITC-Medium]
+ \definefontsynonym [SerifItalic] [StoneSerifOSITC-MediumItalic]
+ \definefontsynonym [SerifSlanted] [StoneSerifOSITC-MediumItalic]
+ \definefontsynonym [SerifBold] [StoneSerifOSITC-Bold]
+ \definefontsynonym [SerifBoldItalic] [StoneSerifOSITC-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [StoneSerifOSITC-BoldItalic]
+ \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium]
\stoptypescript
\starttypescript [sans] [stone] [ec,texnansi]
-
- \definefontsynonym[StoneSansITC-Bold] [\typescriptthree-stosnb] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansITC-BoldItalic] [\typescriptthree-stosnbi] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansITC-Medium] [\typescriptthree-stosnm] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansITC-MediumItalic] [\typescriptthree-stosnmi] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansOSITC-Bold] [\typescriptthree-stosnob] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansOSITC-BoldItalic] [\typescriptthree-stosnobi][encoding=\typescriptthree]
- \definefontsynonym[StoneSansOSITC-Medium] [\typescriptthree-stosnom] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansOSITC-MediumItalic][\typescriptthree-stosnomi][encoding=\typescriptthree]
- \definefontsynonym[StoneSansSCITC-Medium] [\typescriptthree-stosnscm][encoding=\typescriptthree]
- \definefontsynonym[StoneSansSemITC-Semi] [\typescriptthree-stosns] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansSemITC-SemiIta] [\typescriptthree-stosnsi] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansSemOSITC-Semi] [\typescriptthree-stosnos] [encoding=\typescriptthree]
- \definefontsynonym[StoneSansSemOSITC-SemiIta] [\typescriptthree-stosnosi][encoding=\typescriptthree]
- \definefontsynonym[StoneSansSemSCITC-Semi] [\typescriptthree-stosnscs][encoding=\typescriptthree]
-
+ \definefontsynonym[StoneSansITC-Bold] [\typescriptthree-stosnb] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansITC-BoldItalic] [\typescriptthree-stosnbi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansITC-Medium] [\typescriptthree-stosnm] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansITC-MediumItalic] [\typescriptthree-stosnmi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-Bold] [\typescriptthree-stosnob] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-BoldItalic] [\typescriptthree-stosnobi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-Medium] [\typescriptthree-stosnom] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansOSITC-MediumItalic][\typescriptthree-stosnomi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSCITC-Medium] [\typescriptthree-stosnscm][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemITC-Semi] [\typescriptthree-stosns] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemITC-SemiIta] [\typescriptthree-stosnsi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemOSITC-Semi] [\typescriptthree-stosnos] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemOSITC-SemiIta] [\typescriptthree-stosnosi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSansSemSCITC-Semi] [\typescriptthree-stosnscs][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-stone.map]
\stoptypescript
\starttypescript [serif] [stone] [ec,texnansi]
-
- \definefontsynonym[StoneSerifITC-Bold] [\typescriptthree-stosfb] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifITC-BoldItalic] [\typescriptthree-stosfbi] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifITC-Medium] [\typescriptthree-stosfm] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifITC-MediumItalic] [\typescriptthree-stosfmi] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifOSITC-Bold] [\typescriptthree-stosfob] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifOSITC-BoldItalic] [\typescriptthree-stosfobi][encoding=\typescriptthree]
- \definefontsynonym[StoneSerifOSITC-Medium] [\typescriptthree-stosfom] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifOSITC-MediumItalic][\typescriptthree-stosfomi][encoding=\typescriptthree]
- \definefontsynonym[StoneSerifSCITC-Medium] [\typescriptthree-stosfscm][encoding=\typescriptthree]
- \definefontsynonym[StoneSerifSemITC-Semi] [\typescriptthree-stosfs] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifSemITC-SemiIta] [\typescriptthree-stosfsi] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifSemOSITC-Semi] [\typescriptthree-stosfos] [encoding=\typescriptthree]
- \definefontsynonym[StoneSerifSemOSITC-SemiIta] [\typescriptthree-stosfosi][encoding=\typescriptthree]
- \definefontsynonym[StoneSerifSemSCITC-Semi] [\typescriptthree-stosfscs][encoding=\typescriptthree]
-
+ \definefontsynonym[StoneSerifITC-Bold] [\typescriptthree-stosfb] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifITC-BoldItalic] [\typescriptthree-stosfbi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifITC-Medium] [\typescriptthree-stosfm] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifITC-MediumItalic] [\typescriptthree-stosfmi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-Bold] [\typescriptthree-stosfob] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-BoldItalic] [\typescriptthree-stosfobi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-Medium] [\typescriptthree-stosfom] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifOSITC-MediumItalic][\typescriptthree-stosfomi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSCITC-Medium] [\typescriptthree-stosfscm][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemITC-Semi] [\typescriptthree-stosfs] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemITC-SemiIta] [\typescriptthree-stosfsi] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemOSITC-Semi] [\typescriptthree-stosfos] [encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemOSITC-SemiIta] [\typescriptthree-stosfosi][encoding=\typescriptthree]
+ \definefontsynonym[StoneSerifSemSCITC-Semi] [\typescriptthree-stosfscs][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-stone.map]
\stoptypescript
% linotype industria
-\starttypescript [map] [industria] [ec,texnansi]
- \loadmapfile[\typescriptthree-linotype-industria.map]
-\stoptypescript
-
\starttypescript [sans] [industria] [ec,texnansi]
-
- \loadmapfile[\typescriptthree-linotype-industria.map]
-
- \definefontsynonym[Industria-Solid][\typescriptthree-lt50545][encoding=\typescriptthree]
-
+ \definefontsynonym[Industria-Solid][\typescriptthree-lt50545][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-industria.map]
\stoptypescript
% itc bauhaus
%
% texfont --enc=texnansi --ven=itc --col=bauhaus type-buy.dat
-\starttypescript [map] [bauhaus] [ec,texnansi]
- \loadmapfile[\typescriptthree-itc-bauhaus.map]
-\stoptypescript
-
\starttypescript [sans] [bauhaus] [ec,texnansi]
-
- \loadmapfile[\typescriptthree-itc-bauhaus.map]
-
- \definefontsynonym[Bauhaus-Light] [\typescriptthree-bhl] [encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Medium] [\typescriptthree-bhm] [encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Demi] [\typescriptthree-bhd] [encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Bold] [\typescriptthree-bhb] [encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Heavy] [\typescriptthree-bhh] [encoding=\typescriptthree]
-
- \definefontsynonym[Bauhaus-Bold-Slanted] [\typescriptthree-bhb-slanted-167][encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Demi-Slanted] [\typescriptthree-bhd-slanted-167][encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Heavy-Slanted] [\typescriptthree-bhh-slanted-167][encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Light-Slanted] [\typescriptthree-bhl-slanted-167][encoding=\typescriptthree]
- \definefontsynonym[Bauhaus-Medium-Slanted][\typescriptthree-bhm-slanted-167][encoding=\typescriptthree]
-
+ \definefontsynonym[Bauhaus-Light] [\typescriptthree-bhl] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Medium] [\typescriptthree-bhm] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Demi] [\typescriptthree-bhd] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Bold] [\typescriptthree-bhb] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Heavy] [\typescriptthree-bhh] [encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Bold-Slanted] [\typescriptthree-bhb-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Demi-Slanted] [\typescriptthree-bhd-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Heavy-Slanted] [\typescriptthree-bhh-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Light-Slanted] [\typescriptthree-bhl-slanted-167][encoding=\typescriptthree]
+ \definefontsynonym[Bauhaus-Medium-Slanted][\typescriptthree-bhm-slanted-167][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-itc-bauhaus.map]
\stoptypescript
-
% ef swift
%
% texfont --enc=texnansi --ven=ef --col=swift type-buy.dat
-\starttypescript [map] [swift] [ec,texnansi]
- \loadmapfile[\typescriptthree-itc-bauhaus.map]
-\stoptypescript
-
-\starttypescript [serif] [swift] [ec,texnansi]
-
- \loadmapfile[\typescriptthree-ef-swift.map]
-
- \definefontsynonym[SwiftEF-Light] [\typescriptthree-swlt] [encoding=\typescriptthree]
- \definefontsynonym[SwiftEF-Regular] [\typescriptthree-swrg] [encoding=\typescriptthree]
- \definefontsynonym[SwiftEF-Bold] [\typescriptthree-swbd] [encoding=\typescriptthree]
- \definefontsynonym[SwiftEF-ExtraBold] [\typescriptthree-swxb] [encoding=\typescriptthree]
-
- \definefontsynonym[SwiftEF-LightItalic] [\typescriptthree-swlti][encoding=\typescriptthree]
- \definefontsynonym[SwiftEF-RegularItalic][\typescriptthree-swrgi][encoding=\typescriptthree]
-
- \definefontsynonym[SwiftEF-BoldCondensed][\typescriptthree-swbdc][encoding=\typescriptthree]
- \definefontsynonym[SwiftSCEF-Regular] [\typescriptthree-swrgs][encoding=\typescriptthree]
-
-\stoptypescript
-
\starttypescript [serif] [swift] [name]
-
\definefontsynonym [Serif] [SwiftEF-Regular]
\definefontsynonym [SerifItalic] [SwiftEF-RegularItalic]
\definefontsynonym [SerifSlanted] [SwiftEF-RegularItalic]
@@ -859,11 +705,9 @@
\definefontsynonym [SerifBoldItalic] [SwiftEF-Bold]
\definefontsynonym [SerifBoldSlanted] [SwiftEF-Bold]
\definefontsynonym [SerifCaps] [SwiftSCEF-Regular]
-
\stoptypescript
\starttypescript [serif] [swift-light] [name]
-
\definefontsynonym [Serif] [SwiftEF-Light]
\definefontsynonym [SerifItalic] [SwiftEF-LightItalic]
\definefontsynonym [SerifSlanted] [SwiftEF-LightItalic]
@@ -871,63 +715,59 @@
\definefontsynonym [SerifBoldItalic] [SwiftEF-RegularItalic]
\definefontsynonym [SerifBoldSlanted] [SwiftEF-RegularItalic]
\definefontsynonym [SerifCaps] [SwiftSCEF-Regular]
+\stoptypescript
+\starttypescript [serif] [swift] [ec,texnansi]
+ \definefontsynonym[SwiftEF-Light] [\typescriptthree-swlt] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-Regular] [\typescriptthree-swrg] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-Bold] [\typescriptthree-swbd] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-ExtraBold] [\typescriptthree-swxb] [encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-LightItalic] [\typescriptthree-swlti][encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-RegularItalic][\typescriptthree-swrgi][encoding=\typescriptthree]
+ \definefontsynonym[SwiftEF-BoldCondensed][\typescriptthree-swbdc][encoding=\typescriptthree]
+ \definefontsynonym[SwiftSCEF-Regular] [\typescriptthree-swrgs][encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-ef-swift.map]
\stoptypescript
% linotype syntax
-\starttypescript [sans] [syntax] [ec,texnansi]
-
- \loadmapfile[\typescriptthree-linotype-syntax.map]
-
- \definefontsynonym [SyntaxLT-Roman] [\typescriptthree-lte50617] [encoding=\typescriptthree]
- \definefontsynonym [SyntaxLT-Italic] [\typescriptthree-lte50618] [encoding=\typescriptthree]
- \definefontsynonym [SyntaxLT-Bold] [\typescriptthree-lte50619] [encoding=\typescriptthree]
- \definefontsynonym [SyntaxLT-Black] [\typescriptthree-lte50620] [encoding=\typescriptthree]
- \definefontsynonym [SyntaxLT-UltraBlack] [\typescriptthree-lte50621] [encoding=\typescriptthree]
-
-\stoptypescript
-
\starttypescript [sans] [syntax] [name]
-
- \loadmapfile[\typescriptthree-linotype-syntax.map]
-
\definefontsynonym [Sans] [SyntaxLT-Roman]
\definefontsynonym [SansItalic] [SyntaxLT-Italic]
\definefontsynonym [SansSlanted] [SyntaxLT-Italic]
\definefontsynonym [SansBold] [SyntaxLT-Black]
\definefontsynonym [SansBoldItalic] [SyntaxLT-Black]
\definefontsynonym [SansBoldSlanted][SyntaxLT-Black]
+\stoptypescript
+\starttypescript [sans] [syntax] [ec,texnansi]
+ \definefontsynonym [SyntaxLT-Roman] [\typescriptthree-lte50617] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-Italic] [\typescriptthree-lte50618] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-Bold] [\typescriptthree-lte50619] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-Black] [\typescriptthree-lte50620] [encoding=\typescriptthree]
+ \definefontsynonym [SyntaxLT-UltraBlack] [\typescriptthree-lte50621] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-syntax.map]
\stoptypescript
% linotype linoletter
-\starttypescript [serif] [linoletter] [ec,texnansi]
-
- \loadmapfile[\typescriptthree-linotype-linoletter.map]
-
- \definefontsynonym[LinoLetterLT-Roman] [texnansi-lte51129] [encoding=\typescriptthree]
- \definefontsynonym[LinoLetterLT-Italic] [texnansi-lte51130] [encoding=\typescriptthree]
- \definefontsynonym[LinoLetterLT-Bold] [texnansi-lte51133] [encoding=\typescriptthree]
- \definefontsynonym[LinoLetterLT-BoldItalic] [texnansi-lte51134] [encoding=\typescriptthree]
-
- \definefontsynonym[LinoLetterLT-BlackItalic] [texnansi-lte51136] [encoding=\typescriptthree]
- \definefontsynonym[LinoLetter-MediumSC] [texnansi-llmsc] [encoding=\typescriptthree]
-
-\stoptypescript
-
\starttypescript [serif] [linoletter] [name]
+ \definefontsynonym [Serif] [LinoLetterLT-Roman]
+ \definefontsynonym [SerifItalic] [LinoLetterLT-Italic]
+ \definefontsynonym [SerifSlanted] [LinoLetterLT-Italic]
+ \definefontsynonym [SerifBold] [LinoLetterLT-Bold]
+ \definefontsynonym [SerifBoldItalic] [LinoLetterLT-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted][LinoLetterLT-BoldItalic]
+\stoptypescript
- \loadmapfile[\typescriptthree-linotype-linoletter.map]
-
- \definefontsynonym [Serif] [LinoLetterLT-Roman]
- \definefontsynonym [SerifItalic] [LinoLetterLT-Italic]
- \definefontsynonym [SerifSlanted] [LinoLetterLT-Italic]
- \definefontsynonym [SerifBold] [LinoLetterLT-Bold]
- \definefontsynonym [SerifBoldItalic] [LinoLetterLT-BoldItalic]
- \definefontsynonym [SerifBoldSlanted][LinoLetterLT-BoldItalic]
-
+\starttypescript [serif] [linoletter] [ec,texnansi]
+ \definefontsynonym[LinoLetterLT-Roman] [texnansi-lte51129] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-Italic] [texnansi-lte51130] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-Bold] [texnansi-lte51133] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-BoldItalic] [texnansi-lte51134] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetterLT-BlackItalic] [texnansi-lte51136] [encoding=\typescriptthree]
+ \definefontsynonym[LinoLetter-MediumSC] [texnansi-llmsc] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-linotype-linoletter.map]
\stoptypescript
\stoptypescriptcollection
diff --git a/tex/context/base/type-cbg.tex b/tex/context/base/type-cbg.tex
index 1c041376b..93cfa077e 100644
--- a/tex/context/base/type-cbg.tex
+++ b/tex/context/base/type-cbg.tex
@@ -33,90 +33,82 @@
\starttypescriptcollection[cbgreek]
\starttypescript [serif] [cbgreek] [name]
-
- \definefontsynonym [CBGreek-Regular-Medium-Normal] [grmn1000]
- \definefontsynonym [CBGreek-Regular-Medium-Oblique] [grmo1000]
- \definefontsynonym [CBGreek-Regular-Medium-Italic] [grmi1000]
- \definefontsynonym [CBGreek-Regular-Medium-UprightItalic] [grmu1000]
- \definefontsynonym [CBGreek-Regular-Medium-Caps] [grmc1000]
- \definefontsynonym [CBGreek-Regular-Medium-Leipzig] [grml1000]
- \definefontsynonym [CBGreek-Regular-Medium-Roman] [grmr1000]
-
- \definefontsynonym [CBGreek-Regular-BoldExtended-Normal] [grxn1000]
- \definefontsynonym [CBGreek-Regular-BoldExtended-Oblique] [grxo1000]
- \definefontsynonym [CBGreek-Regular-BoldExtended-Italic] [grxi1000]
- \definefontsynonym [CBGreek-Regular-BoldExtended-UprightItalic] [grxu1000]
- \definefontsynonym [CBGreek-Regular-BoldExtended-Caps] [grxc1000]
- \definefontsynonym [CBGreek-Regular-BoldExtended-Leipzig] [grxl1000]
- \definefontsynonym [CBGreek-Regular-BoldExtended-Roman] [grxr1000]
-
+ \definefontsynonym [CBGreek-Regular-Medium-Normal] [grmn1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Oblique] [grmo1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Italic] [grmi1000]
+ \definefontsynonym [CBGreek-Regular-Medium-UprightItalic] [grmu1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Caps] [grmc1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Leipzig] [grml1000]
+ \definefontsynonym [CBGreek-Regular-Medium-Roman] [grmr1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Normal] [grxn1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Oblique] [grxo1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Italic] [grxi1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-UprightItalic] [grxu1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Caps] [grxc1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Leipzig] [grxl1000]
+ \definefontsynonym [CBGreek-Regular-BoldExtended-Roman] [grxr1000]
+ \loadmapfile [cbgreek.map]
\stoptypescript
\starttypescript [sans] [cbgreek] [name]
-
- \definefontsynonym [CBGreek-Sans-Medium-Normal] [gsmn1000]
- \definefontsynonym [CBGreek-Sans-Medium-Oblique] [gsmo1000]
- \definefontsynonym [CBGreek-Sans-Medium-Italic] [gsmi1000]
- \definefontsynonym [CBGreek-Sans-Medium-UprightItalic] [gsmu1000]
- \definefontsynonym [CBGreek-Sans-Medium-Caps] [gsmc1000]
- \definefontsynonym [CBGreek-Sans-Medium-Leipzig] [gsml1000]
- \definefontsynonym [CBGreek-Sans-Medium-Roman] [gsmr1000]
-
- \definefontsynonym [CBGreek-Sans-BoldExtended-Normal] [gsxn1000]
- \definefontsynonym [CBGreek-Sans-BoldExtended-Oblique] [gsxo1000]
- \definefontsynonym [CBGreek-Sans-BoldExtended-Italic] [gsxi1000]
- \definefontsynonym [CBGreek-Sans-BoldExtended-UprightItalic] [gsxu1000]
- \definefontsynonym [CBGreek-Sans-BoldExtended-Caps] [gsxc1000]
- \definefontsynonym [CBGreek-Sans-BoldExtended-Leipzig] [gsxl1000]
- \definefontsynonym [CBGreek-Sans-BoldExtended-Roman] [gsxr1000]
-
+ \definefontsynonym [CBGreek-Sans-Medium-Normal] [gsmn1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Oblique] [gsmo1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Italic] [gsmi1000]
+ \definefontsynonym [CBGreek-Sans-Medium-UprightItalic] [gsmu1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Caps] [gsmc1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Leipzig] [gsml1000]
+ \definefontsynonym [CBGreek-Sans-Medium-Roman] [gsmr1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Normal] [gsxn1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Oblique] [gsxo1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Italic] [gsxi1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-UprightItalic] [gsxu1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Caps] [gsxc1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Leipzig] [gsxl1000]
+ \definefontsynonym [CBGreek-Sans-BoldExtended-Roman] [gsxr1000]
+ \loadmapfile [cbgreek.map]
\stoptypescript
\starttypescript [mono] [cbgreek] [name]
-
- \definefontsynonym [CBGreek-Typewriter-Medium-Normal] [gttn1000]
- \definefontsynonym [CBGreek-Typewriter-Medium-Oblique] [gtto1000]
- \definefontsynonym [CBGreek-Typewriter-Medium-Italic] [gtti1000]
- \definefontsynonym [CBGreek-Typewriter-Medium-UprightItalic] [gttu1000]
- \definefontsynonym [CBGreek-Typewriter-Medium-Caps] [gttc1000]
- \definefontsynonym [CBGreek-Typewriter-Medium-Leipzig] [gttl1000]
- \definefontsynonym [CBGreek-Typewriter-Medium-Roman] [gttr1000]
-
+ \definefontsynonym [CBGreek-Typewriter-Medium-Normal] [gttn1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Oblique] [gtto1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Italic] [gtti1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-UprightItalic] [gttu1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Caps] [gttc1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Leipzig] [gttl1000]
+ \definefontsynonym [CBGreek-Typewriter-Medium-Roman] [gttr1000]
+ \loadmapfile [cbgreek.map]
\stoptypescript
\starttypescript [serif] [cbgreek] [name]
-
- \definefontsynonym [Serif] [CBGreek-Regular-Medium-Normal]
- \definefontsynonym [SerifSlanted] [CBGreek-Regular-Medium-Oblique]
- \definefontsynonym [SerifItalic] [CBGreek-Regular-Medium-Italic]
- \definefontsynonym [SerifCaps] [CBGreek-Regular-Medium-Caps]
- \definefontsynonym [SerifBold] [CBGreek-Regular-BoldExtended-Normal]
- \definefontsynonym [SerifBoldSlanted] [CBGreek-Regular-BoldExtended-Oblique]
- \definefontsynonym [SerifBoldItalic] [CBGreek-Regular-BoldExtended-Italic]
- \definefontsynonym [SerifBoldCaps] [CBGreek-Regular-BoldExtended-Caps]
-
+ \definefontsynonym [Serif] [CBGreek-Regular-Medium-Normal]
+ \definefontsynonym [SerifSlanted] [CBGreek-Regular-Medium-Oblique]
+ \definefontsynonym [SerifItalic] [CBGreek-Regular-Medium-Italic]
+ \definefontsynonym [SerifCaps] [CBGreek-Regular-Medium-Caps]
+ \definefontsynonym [SerifBold] [CBGreek-Regular-BoldExtended-Normal]
+ \definefontsynonym [SerifBoldSlanted] [CBGreek-Regular-BoldExtended-Oblique]
+ \definefontsynonym [SerifBoldItalic] [CBGreek-Regular-BoldExtended-Italic]
+ \definefontsynonym [SerifBoldCaps] [CBGreek-Regular-BoldExtended-Caps]
+ \loadmapfile [cbgreek.map]
\stoptypescript
\starttypescript [sans] [cbgreek] [name]
-
- \definefontsynonym [Sans] [CBGreek-Sans-Medium-Normal]
- \definefontsynonym [SansSlanted] [CBGreek-Sans-Medium-Oblique]
- \definefontsynonym [SansItalic] [CBGreek-Sans-Medium-Italic]
- \definefontsynonym [SansCaps] [CBGreek-Sans-Medium-Caps]
- \definefontsynonym [SansBold] [CBGreek-Sans-BoldExtended-Normal]
- \definefontsynonym [SansBoldSlanted] [CBGreek-Sans-BoldExtended-Oblique]
- \definefontsynonym [SansBoldItalic] [CBGreek-Sans-BoldExtended-Italic]
- \definefontsynonym [SansBoldCaps] [CBGreek-Sans-BoldExtended-Caps]
-
+ \definefontsynonym [Sans] [CBGreek-Sans-Medium-Normal]
+ \definefontsynonym [SansSlanted] [CBGreek-Sans-Medium-Oblique]
+ \definefontsynonym [SansItalic] [CBGreek-Sans-Medium-Italic]
+ \definefontsynonym [SansCaps] [CBGreek-Sans-Medium-Caps]
+ \definefontsynonym [SansBold] [CBGreek-Sans-BoldExtended-Normal]
+ \definefontsynonym [SansBoldSlanted] [CBGreek-Sans-BoldExtended-Oblique]
+ \definefontsynonym [SansBoldItalic] [CBGreek-Sans-BoldExtended-Italic]
+ \definefontsynonym [SansBoldCaps] [CBGreek-Sans-BoldExtended-Caps]
+ \loadmapfile [cbgreek.map]
\stoptypescript
\starttypescript [mono] [cbgreek] [name]
-
- \definefontsynonym [Mono] [CBGreek-Typewriter-Medium-Normal]
- \definefontsynonym [MonoSlanted] [CBGreek-Typewriter-Medium-Oblique]
- \definefontsynonym [MonoItalic] [CBGreek-Typewriter-Medium-Italic]
- \definefontsynonym [MonoCaps] [CBGreek-Typewriter-Medium-Caps]
-
+ \definefontsynonym [Mono] [CBGreek-Typewriter-Medium-Normal]
+ \definefontsynonym [MonoSlanted] [CBGreek-Typewriter-Medium-Oblique]
+ \definefontsynonym [MonoItalic] [CBGreek-Typewriter-Medium-Italic]
+ \definefontsynonym [MonoCaps] [CBGreek-Typewriter-Medium-Caps]
+ \loadmapfile [cbgreek.map]
\stoptypescript
% Please note that we use Bold Extended instead of Bold
@@ -168,6 +160,8 @@
bf=grxn1440 sa 1,bs=grxo1440 sa 1,bi=grxi1440 sa 1,
sc=grmc1440 sa 1]
+ \loadmapfile [cbgreek.map]
+
\stoptypescript
\starttypescript [sans] [cbgreek-all] [size]
@@ -217,6 +211,8 @@
bf=gsxn1440 sa 1,bs=gsxo1440 sa 1,bi=gsxi1440 sa 1,
sc=gsmc1440 sa 1]
+ \loadmapfile [cbgreek.map]
+
\stoptypescript
\starttypescript [mono] [cbgreek-all] [size]
@@ -257,6 +253,8 @@
[tf=gttn1440 sa 1,sl=gtto1440 sa 1,it=gtti1440 sa 1,
sc=gttc1440 sa 1]
+ \loadmapfile [cbgreek.map]
+
\stoptypescript
\starttypescript [serif] [cbgreek-medium] [size]
@@ -276,6 +274,8 @@
bf=grxn1200 sa 1,bs=grxo1200 sa 1,bi=grxi1200 sa 1,
sc=grmc1200 sa 1]
+ \loadmapfile [cbgreek.map]
+
\stoptypescript
\starttypescript [sans] [cbgreek-medium] [size]
@@ -295,6 +295,8 @@
bf=gsxn1200 sa 1,bs=gsxo1200 sa 1,bi=gsxi1200 sa 1,
sc=gsmc1200 sa 1]
+ \loadmapfile [cbgreek.map]
+
\stoptypescript
\starttypescript [mono] [cbgreek-medium] [size]
@@ -311,11 +313,8 @@
[tf=gttn1200 sa 1,sl=gtto1200 sa 1,it=gtti1200 sa 1,
sc=gttc1200 sa 1]
-\stoptypescript
-
-\starttypescript [map] [cbgreek]
\loadmapfile [cbgreek.map]
-% \loadmapfile [cbsmall.map]
+
\stoptypescript
\starttypescript [cbgreek-all]
diff --git a/tex/context/base/type-def.tex b/tex/context/base/type-def.tex
index e78087b94..6469a5925 100644
--- a/tex/context/base/type-def.tex
+++ b/tex/context/base/type-def.tex
@@ -18,47 +18,111 @@
\definefontsynonym [DefaultFont] [cmvtt10]
\startsetups [font:fallback:serif]
- \definefontsynonym [Serif] [DefaultFont]
- \definefontsynonym [SerifBold] [Serif]
- \definefontsynonym [SerifItalic] [Serif]
- \definefontsynonym [SerifSlanted] [SerifItalic]
- \definefontsynonym [SerifBoldItalic] [Serif]
- \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
- \definefontsynonym [SerifCaps] [Serif]
+ \definefontsynonym [Serif] [DefaultFont]
+ \definefontsynonym [SerifBold] [Serif]
+ \definefontsynonym [SerifItalic] [Serif]
+ \definefontsynonym [SerifSlanted] [SerifItalic]
+ \definefontsynonym [SerifBoldItalic] [Serif]
+ \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic]
+ \definefontsynonym [SerifCaps] [Serif]
\stopsetups
\startsetups [font:fallback:sans]
- \definefontsynonym [Sans] [DefaultFont]
- \definefontsynonym [SansBold] [Sans]
- \definefontsynonym [SansItalic] [Sans]
- \definefontsynonym [SansSlanted] [SansItalic]
- \definefontsynonym [SansBoldItalic] [Sans]
- \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
- \definefontsynonym [SansCaps] [Sans]
+ \definefontsynonym [Sans] [DefaultFont]
+ \definefontsynonym [SansBold] [Sans]
+ \definefontsynonym [SansItalic] [Sans]
+ \definefontsynonym [SansSlanted] [SansItalic]
+ \definefontsynonym [SansBoldItalic] [Sans]
+ \definefontsynonym [SansBoldSlanted] [SansBoldItalic]
+ \definefontsynonym [SansCaps] [Sans]
\stopsetups
\startsetups [font:fallback:mono]
- \definefontsynonym [Mono] [DefaultFont]
- \definefontsynonym [MonoBold] [Mono]
- \definefontsynonym [MonoItalic] [Mono]
- \definefontsynonym [MonoSlanted] [MonoItalic]
- \definefontsynonym [MonoBoldItalic] [Mono]
- \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
- \definefontsynonym [MonoCaps] [Mono]
+ \definefontsynonym [Mono] [DefaultFont]
+ \definefontsynonym [MonoBold] [Mono]
+ \definefontsynonym [MonoItalic] [Mono]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldItalic] [Mono]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+ \definefontsynonym [MonoCaps] [Mono]
\stopsetups
\startsetups [font:allbold:serif]
- \definefontsynonym [Serif] [SerifBold]
- \definefontsynonym [SerifItalic] [SerifBoldItalic]
- \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
- %definefontsynonym [SerifCaps] [SerifBold]
+ \definefontsynonym [Serif] [SerifBold]
+ \definefontsynonym [SerifItalic] [SerifBoldItalic]
+ \definefontsynonym [SerifSlanted] [SerifBoldSlanted]
+ %definefontsynonym [SerifCaps] [SerifBold]
\stopsetups
\startsetups [font:allbold:sans]
- \definefontsynonym [Sans] [SansBold]
- \definefontsynonym [SansItalic] [SansBoldItalic]
- \definefontsynonym [SansSlanted] [SansBoldSlanted]
- %definefontsynonym [SansCaps] [SansBold]
+ \definefontsynonym [Sans] [SansBold]
+ \definefontsynonym [SansItalic] [SansBoldItalic]
+ \definefontsynonym [SansSlanted] [SansBoldSlanted]
+ %definefontsynonym [SansCaps] [SansBold]
\stopsetups
+\starttypescript [serif] [simple] [name]
+ \definefontsynonym [Serif] [Simple]
+ \definefontsynonym [SerifBold] [Serif]
+ \definefontsynonym [SerifItalic] [Serif]
+ \definefontsynonym [SerifSlanted] [Serif]
+ \definefontsynonym [SerifBoldItalic] [Serif]
+ \definefontsynonym [SerifBoldSlanted] [Serif]
+ \definefontsynonym [SerifCaps] [Serif]
+\stoptypescript
+
+\starttypescript [sans] [simple] [name]
+ \definefontsynonym [Sans] [Simple]
+ \definefontsynonym [SansBold] [Sans]
+ \definefontsynonym [SansItalic] [Sans]
+ \definefontsynonym [SansSlanted] [Sans]
+ \definefontsynonym [SansBoldItalic] [Sans]
+ \definefontsynonym [SansBoldSlanted] [Sans]
+ \definefontsynonym [SansCaps] [Sans]
+\stoptypescript
+
+\starttypescript [mono] [simple] [name]
+ \definefontsynonym [Mono] [Simple]
+ \definefontsynonym [MonoBold] [Mono]
+ \definefontsynonym [MonoItalic] [Mono]
+ \definefontsynonym [MonoSlanted] [Mono]
+ \definefontsynonym [MonoBoldItalic] [Mono]
+ \definefontsynonym [MonoBoldSlanted] [Mono]
+ \definefontsynonym [MonoCaps] [Mono]
+\stoptypescript
+
+% handy
+
+% \starttypescript [serif] [simple] [name]
+% \definefontsynonym [Simple] [cmvtt10]
+% \setupfontsynonym [Simple] [handling=pure]
+% \stoptypescript
+
+\starttypescript [serif,sans,mono] [handling,hanging] [pure,normal]
+ \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree bold]
+ \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree slanted]
+ \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree italic]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree boldslanted]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree bolditalic]
+\stoptypescript
+
+\starttypescript [serif,sans,mono] [handling,hz] [hz,quality,highquality]
+ \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree]
+\stoptypescript
+
+\starttypescript [serif,sans,mono] [handling] [noligs,prespacing,flexspacing]
+ \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree]
+ \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree]
+\stoptypescript
+
\endinput
diff --git a/tex/context/base/type-exa.tex b/tex/context/base/type-exa.tex
index 123e2cb4d..29f882f02 100644
--- a/tex/context/base/type-exa.tex
+++ b/tex/context/base/type-exa.tex
@@ -11,244 +11,17 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D A couple of goodies:
-
-\starttypescriptcollection[examples]
-
-\starttypescript [fallback] [texnansi,ec,qx,t5,default]
-
- % no fontclass, so this is the fall back
-
- \definetypeface [] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo]
- \definetypeface [] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo]
- \definetypeface [] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo]
- \definetypeface [] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo]
-
- \quittypescriptscanning
-
-\stoptypescript
-
-\starttypescript [modern] [texnansi,ec,qx,t5,default]
-
- \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo]
- \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo]
- \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo]
- \definetypeface [modern] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo]
-
- \quittypescriptscanning
-
-\stoptypescript
-
-\starttypescript [modern-base] [texnansi,ec,qx,t5,default]
-
- \definetypeface [modern] [rm] [serif] [modern] [default] [encoding=\typescripttwo]
- \definetypeface [modern] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
- \definetypeface [modern] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
- \definetypeface [modern] [mm] [math] [modern] [default] [encoding=\typescripttwo]
-
- \quittypescriptscanning
-
-\stoptypescript
-
-\starttypescript [modern-base] [t2a,t2b,t2c,x2]
-
- \definetypeface [modern] [rm] [serif] [computer-modern] [default] [encoding=\typescripttwo]
- \definetypeface [modern] [ss] [sans] [computer-modern] [default] [encoding=\typescripttwo]
- \definetypeface [modern] [tt] [mono] [computer-modern] [default] [encoding=\typescripttwo]
- \definetypeface [modern] [mm] [math] [computer-modern] [default] [encoding=\typescripttwo]
-
- \quittypescriptscanning
-
-\stoptypescript
+%D The examples are moved to \type {type-one}, \type {type-otf} and
+%D \type {type-buy}.
\starttypescript [fallback,modern,modern-base] [il2]
- \usetypescript[\typescriptone][ec]
- \enableregime[il2]
-\stoptypescript
-\starttypescript [fallback,modern,modern-base] [pl0]
- \usetypescript[\typescriptone][qx]
- \enableregime[pl0]
-\stoptypescript
-
-\starttypescript [postscript] [texnansi,ec,qx,t5,uc,8r]
-
- \definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo]
- \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=.9,encoding=\typescripttwo]
- \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1,encoding=\typescripttwo]
- \definetypeface [postscript] [mm] [math] [times] [default]
-
- \quittypescriptscanning
-
-\stoptypescript
-
-\starttypescript [times] [texnansi,ec,qx,8r,t5,uc]
-
- \definetypeface [times] [rm] [serif] [times] [default] [encoding=\typescripttwo]
- \definetypeface [times] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9]
- \definetypeface [times] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05]
- \definetypeface [times] [mm] [math] [times] [default] [encoding=\typescripttwo]
-
-% \usemathcollection[default]
-
- \quittypescriptscanning
-
-\stoptypescript
-
-\starttypescript [palatino] [texnansi,ec,qx,8r,t5,uc]
-
- \definetypeface [palatino] [rm] [serif] [palatino] [default] [encoding=\typescripttwo]
- \definetypeface [palatino] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.075]
- \definetypeface [palatino] [mm] [math] [palatino] [default] [encoding=default]
-
-% \usemathcollection[default]
-
- \quittypescriptscanning
-
+ \usetypescript[\typescriptone][ec]
+ \enableregime[il2]
\stoptypescript
-\starttypescript [fourier] [ec]
-
- \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec]
- \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default]
- \definetypeface [fourier] [tt] [mono] [modern] [default] [encoding=ec,rscale=1.07]
-
- \usemathcollection[fou]
-
- \quittypescriptscanning
-
-\stoptypescript
-
-% \starttypescript [utopia] [ec]
-
-% \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec]
-% \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default]
-% \definetypeface [fourier] [tt] [mono] [modern] [default] [rscale=1.070,encoding=ec]
-
-% \usemathcollection[fou]
-
-% \stoptypescript
-
-\starttypescript [lucida,lucidabfm] [texnansi,ec,8r,uc]
-
- \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
-
-\stoptypescript
-
-\starttypescript [lucida] [texnansi,ec,8r]
-
- \definetypeface [lucida] [mm] [math] [lucida] [default] [encoding=\typescripttwo]
-
-\stoptypescript
-
-\starttypescript [lucidaboldmath] [texnansi,ec,8r]
-
- \definetypeface [lucidaboldmath] [rm] [serif] [lucida] [default] [encoding=\typescripttwo] % needed ?
- \definetypeface [lucidaboldmath] [ss] [sans] [lucida] [default] [encoding=\typescripttwo] % needed ?
- \definetypeface [lucidaboldmath] [tt] [mono] [lucida] [default] [encoding=\typescripttwo] % needed ?
- \definetypeface [lucidaboldmath] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
-
-\stoptypescript
-
-\starttypescript [lucidabfm,lucidaboldmath] [texnansi,ec,8r]
-
- \definetypeface [lucida] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidaboldmath] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
-
-\stoptypescript
-
-\starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r]
-
- \usemathcollection[lbr]
-
- \quittypescriptscanning % last in the row
-
-\stoptypescript
-
-\starttypescript [serif,sans,mono] [handling,hanging] [pure,normal]
-
- \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree bold]
- \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree slanted]
- \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree italic]
- \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree boldslanted]
- \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree bolditalic]
-
-\stoptypescript
-
-\starttypescript [serif,sans,mono] [handling,hz] [hz,quality,highquality]
-
- \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree]
-
-\stoptypescript
-
-
-\starttypescript [serif,sans,mono] [handling] [noligs,prespacing,flexspacing]
-
- \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree]
- \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree]
-
-\stoptypescript
-
-% handy
-
-\starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it
-
- \definefontsynonym [Simple] [cmvtt10]
- \setupfontsynonym [Simple] [handling=pure]
-
-\stoptypescript
-
-\starttypescript [modernvariable] [texnansi,ec,qx,8r,t5]
-
- \definetypeface [modernvariable] [rm] [serif] [simple] [default] [encoding=\typescripttwo]
- \definetypeface [modernvariable] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
- \definetypeface [modernvariable] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
- \definetypeface [modernvariable] [mm] [math] [modern] [default]
-
-\stoptypescript
-
-\starttypescript [optima] [texnansi,ec,qx]
-
- \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo]
- \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo]
- \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1]
- \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo]
-
-\stoptypescript
-
-\starttypescript [antykwa-torunska] [texnansi,ec,8r,uc,t2a]
-
- \definetypeface[antykwa][rm][serif][antykwa-torunska] [default][encoding=\typescripttwo]
- \definetypeface[antykwa][ss][sans] [modern] [default][encoding=\typescripttwo,rscale=1.05]
- \definetypeface[antykwa][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1]
- \definetypeface[antykwa][mm][math] [antykwa-torunska] [default][encoding=\typescripttwo]
-
-\stoptypescript
-
-\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] [texnansi,ec,8r,uc,t2a]
-
- % todo: rscale
-
- \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo]
- \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo]
- \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo]
- \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss]
-
+\starttypescript [fallback,modern,modern-base] [pl0]
+ \usetypescript[\typescriptone][qx]
+ \enableregime[pl0]
\stoptypescript
-\stoptypescriptcollection
-
\endinput
diff --git a/tex/context/base/type-fsf.tex b/tex/context/base/type-fsf.tex
index 9467ae929..7813b7b5d 100644
--- a/tex/context/base/type-fsf.tex
+++ b/tex/context/base/type-fsf.tex
@@ -11,6 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D I'm not sure how correct the fontsite cd is. These are probably
+%D mostly rip-offs. I no longer use these fonts.
+
% run texfont from currentpath with the fonts on subpath fontsite/500
% texfont --en=texnansi --ve=fontsite --co=opus type-fsf.dat
@@ -18,99 +21,72 @@
\starttypescriptcollection[font site 500]
-\starttypescript [sans] [opus] [name]
-
- \definefontsynonym [Sans] [Opus]
- \definefontsynonym [SansCaps] [OpusSmCaps]
- \definefontsynonym [SansItalic] [Opus-Italic]
- \definefontsynonym [SansBold] [Opus-Bold]
- \definefontsynonym [SansBoldCaps] [OpusSmCaps-Bold]
- \definefontsynonym [SansBoldItalic] [Opus-BoldItalic]
-
- \definefontsynonym [SansSlanted] [Opus-Slanted] % faked
- \definefontsynonym [SansBoldSlanted] [Opus-BoldSlanted] % faked
+%D Please use the original Optima!
+\starttypescript [sans] [opus] [name]
+ \definefontsynonym [Sans] [Opus]
+ \definefontsynonym [SansCaps] [OpusSmCaps]
+ \definefontsynonym [SansItalic] [Opus-Italic]
+ \definefontsynonym [SansBold] [Opus-Bold]
+ \definefontsynonym [SansBoldCaps] [OpusSmCaps-Bold]
+ \definefontsynonym [SansBoldItalic] [Opus-BoldItalic]
+ \definefontsynonym [SansSlanted] [Opus-Slanted] % faked
+ \definefontsynonym [SansBoldSlanted] [Opus-BoldSlanted] % faked
\stoptypescript
\starttypescript [sans] [opus] [texnansi,ec,8r]
-
- \definefontsynonym [Opus] [\typescriptthree-opusrg] [encoding=\typescriptthree]
- \definefontsynonym [OpusSmCaps] [\typescriptthree-opusscrg] [encoding=\typescriptthree]
- \definefontsynonym [Opus-Italic] [\typescriptthree-opusi] [encoding=\typescriptthree]
- \definefontsynonym [Opus-Bold] [\typescriptthree-opusb] [encoding=\typescriptthree]
- \definefontsynonym [Opus-BoldItalic] [\typescriptthree-opusbi] [encoding=\typescriptthree]
- \definefontsynonym [OpusSmCaps-Bold] [\typescriptthree-opusscb] [encoding=\typescriptthree]
-
- \definefontsynonym [Opus-Slanted] [\typescriptthree-opusrg-slanted-167] [encoding=\typescriptthree]
- \definefontsynonym [Opus-BoldSlanted] [\typescriptthree-opusb-slanted-167] [encoding=\typescriptthree]
-
-\stoptypescript
-
-\starttypescript [map] [opus] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-fontsite-opus.map]
+ \definefontsynonym [Opus] [\typescriptthree-opusrg] [encoding=\typescriptthree]
+ \definefontsynonym [OpusSmCaps] [\typescriptthree-opusscrg] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-Italic] [\typescriptthree-opusi] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-Bold] [\typescriptthree-opusb] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-BoldItalic] [\typescriptthree-opusbi] [encoding=\typescriptthree]
+ \definefontsynonym [OpusSmCaps-Bold] [\typescriptthree-opusscb] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-Slanted] [\typescriptthree-opusrg-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Opus-BoldSlanted] [\typescriptthree-opusb-slanted-167] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-fontsite-opus.map]
\stoptypescript
\starttypescript [mono] [typewriter] [name]
-
- \definefontsynonym [Mono] [Typewriter]
- \definefontsynonym [MonoItalic] [Typewriter-Italic]
- \definefontsynonym [MonoBold] [Typewriter-Bold]
- \definefontsynonym [MonoBoldItalic] [Typewriter-BoldItalic]
-
- \definefontsynonym [MonoSlanted] [Typewriter-Slanted] % faked
- \definefontsynonym [MonoBoldSlanted] [Typewriter-BoldSlanted] % faked
-
+ \definefontsynonym [Mono] [Typewriter]
+ \definefontsynonym [MonoItalic] [Typewriter-Italic]
+ \definefontsynonym [MonoBold] [Typewriter-Bold]
+ \definefontsynonym [MonoBoldItalic] [Typewriter-BoldItalic]
+ \definefontsynonym [MonoSlanted] [Typewriter-Slanted] % faked
+ \definefontsynonym [MonoBoldSlanted] [Typewriter-BoldSlanted] % faked
\stoptypescript
\starttypescript [mono] [typewriter] [texnansi,ec,8r]
-
-
- \definefontsynonym [Typewriter] [\typescriptthree-typerg] [encoding=\typescriptthree]
- \definefontsynonym [Typewriter-Italic] [\typescriptthree-typei] [encoding=\typescriptthree]
- \definefontsynonym [Typewriter-Bold] [\typescriptthree-typeb] [encoding=\typescriptthree]
- \definefontsynonym [Typewriter-BoldItalic] [\typescriptthree-typebi] [encoding=\typescriptthree]
-
- \definefontsynonym [Typewriter-Slanted] [\typescriptthree-typerg-slanted-167] [encoding=\typescriptthree]
- \definefontsynonym [Typewriter-BoldSlanted] [\typescriptthree-typeb-slanted-167] [encoding=\typescriptthree]
-
- \definefontsynonym [TypewriterCond] [\typescriptthree-typecrg]
- \definefontsynonym [TypewriterCond-Bold] [\typescriptthree-typecb]
-
-\stoptypescript
-
-\starttypescript [map] [typewriter] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-fontsite-typewriter.map]
+ \definefontsynonym [Typewriter] [\typescriptthree-typerg] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-Italic] [\typescriptthree-typei] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-Bold] [\typescriptthree-typeb] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-BoldItalic] [\typescriptthree-typebi] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-Slanted] [\typescriptthree-typerg-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Typewriter-BoldSlanted] [\typescriptthree-typeb-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [TypewriterCond] [\typescriptthree-typecrg]
+ \definefontsynonym [TypewriterCond-Bold] [\typescriptthree-typecb]
+ \loadmapfile[\typescriptthree-fontsite-typewriter.map]
\stoptypescript
\starttypescript [serif] [garamond] [name]
-
- \definefontsynonym [Serif] [FSGaramond]
- \definefontsynonym [SerifCaps] [FSGaramondSmCaps]
- \definefontsynonym [SerifItalic] [FSGaramond-Italic]
- \definefontsynonym [SerifBold] [FSGaramond-Bold]
- \definefontsynonym [SerifBoldCaps] [FSGaramondSmCaps-Bold]
-
- \definefontsynonym [SerifSlanted] [FSGaramond-Slanted]
- \definefontsynonym [SerifBoldSlanted] [FSGaramond-BoldSlanted]
-
+ \definefontsynonym [Serif] [FSGaramond]
+ \definefontsynonym [SerifCaps] [FSGaramondSmCaps]
+ \definefontsynonym [SerifItalic] [FSGaramond-Italic]
+ \definefontsynonym [SerifBold] [FSGaramond-Bold]
+ \definefontsynonym [SerifBoldCaps] [FSGaramondSmCaps-Bold]
+ \definefontsynonym [SerifSlanted] [FSGaramond-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [FSGaramond-BoldSlanted]
\stoptypescript
\starttypescript [serif] [garamond] [texnansi,ec,8r]
-
- \definefontsynonym [FSGaramond] [\typescriptthree-garamond] [encoding=\typescriptthree]
- \definefontsynonym [FSGaramondSmCaps] [\typescriptthree-garasc] [encoding=\typescriptthree]
- \definefontsynonym [FSGaramond-Italic] [\typescriptthree-garai] [encoding=\typescriptthree]
- \definefontsynonym [FSGaramond-Bold] [\typescriptthree-garab] [encoding=\typescriptthree]
- \definefontsynonym [FSGaramond-BoldItalic] [\typescriptthree-garabi] [encoding=\typescriptthree]
- \definefontsynonym [FSGaramondSmCaps-Bold] [\typescriptthree-garascb] [encoding=\typescriptthree]
-
- \definefontsynonym [FSGaramond-Slanted] [\typescriptthree-garamond-slanted-167] [encoding=\typescriptthree]
- \definefontsynonym [FSGaramond-BoldSlanted] [\typescriptthree-garab-slanted-167] [encoding=\typescriptthree]
-
-\stoptypescript
-
-\starttypescript [map] [garamond] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-fontsite-garamond.map]
+ \definefontsynonym [FSGaramond] [\typescriptthree-garamond] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramondSmCaps] [\typescriptthree-garasc] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-Italic] [\typescriptthree-garai] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-Bold] [\typescriptthree-garab] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-BoldItalic] [\typescriptthree-garabi] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramondSmCaps-Bold] [\typescriptthree-garascb] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-Slanted] [\typescriptthree-garamond-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [FSGaramond-BoldSlanted] [\typescriptthree-garab-slanted-167] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-fontsite-garamond.map]
\stoptypescript
\stoptypescriptcollection
diff --git a/tex/context/base/type-ghz.tex b/tex/context/base/type-ghz.tex
index 2be9de7cb..12ee9f3a3 100644
--- a/tex/context/base/type-ghz.tex
+++ b/tex/context/base/type-ghz.tex
@@ -59,8 +59,6 @@
\starttypescript [sans] [optima,optima-nova] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-linotype-optima.map]
-
\definefontsynonym [OptimaLT] [\typescriptthree-lte50019] [encoding=\typescriptthree]
\definefontsynonym [OptimaLT-Italic] [\typescriptthree-lte52401] [encoding=\typescriptthree]
\definefontsynonym [OptimaLT-Bold] [\typescriptthree-lte50021] [encoding=\typescriptthree]
@@ -75,14 +73,18 @@
\definefontsynonym [OptimaLT-ExtraBlack] [\typescriptthree-lte53511] [encoding=\typescriptthree]
\definefontsynonym [OptimaLT-ExtraBlackItalic] [\typescriptthree-lte53512] [encoding=\typescriptthree]
-\stoptypescript
-
-\starttypescript [map] [optima,optima-nova] [texnansi,ec,8r]
-
\loadmapfile[\typescriptthree-linotype-optima.map]
\stoptypescript
+\starttypescript [optima] [texnansi,ec,qx]
+ \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo]
+ \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo]
+ \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
% optima nova
% see antykwa, we could define variants for light and osf
@@ -172,8 +174,6 @@
\starttypescript [sans] [optima-nova,optima-nova-light,optima-nova-medium,optima-nova-os] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-linotype-optima-nova.map]
-
\definefontsynonym[OptimaNovaLT-Light] [\typescriptthree-lt55476][encoding=\typescriptthree]
\definefontsynonym[OptimaNovaLT-LightSC] [\typescriptthree-lt55477][encoding=\typescriptthree]
\definefontsynonym[OptimaNovaLT-LightOsF] [\typescriptthree-lt55478][encoding=\typescriptthree]
@@ -215,10 +215,8 @@
\definefontsynonym[OptimaNovaLT-Black] [\typescriptthree-lt55514][encoding=\typescriptthree]
\definefontsynonym[OptimaNovaLT-BlackItalic] [\typescriptthree-lt55515][encoding=\typescriptthree]
-\stoptypescript
-
-\starttypescript [map] [optima-nova,optima-nova-light,optima-nova-medium,optima-nova-os] [texnansi,ec,8r]
\loadmapfile[\typescriptthree-linotype-optima-nova.map]
+
\stoptypescript
% palatino
@@ -238,8 +236,6 @@
\starttypescript [serif] [palatino] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-linotype-palatino.map]
-
\definefontsynonym[PalatinoLT-Roman] [\typescriptthree-lte50001] [encoding=\typescriptthree]
\definefontsynonym[PalatinoLT-Italic] [\typescriptthree-lte50002] [encoding=\typescriptthree]
\definefontsynonym[PalatinoLT-Bold] [\typescriptthree-lte50003] [encoding=\typescriptthree]
@@ -257,10 +253,8 @@
\definefontsynonym[PalatinoSC] [\typescriptthree-posc] [encoding=\typescriptthree]
-\stoptypescript
-
-\starttypescript [map] [palatino] [texnansi,ec,8r]
\loadmapfile[\typescriptthree-linotype-palatino.map]
+
\stoptypescript
% palatino nova
@@ -313,8 +307,6 @@
\starttypescript [serif] [palatino-nova,palatino-nova-light,palatino-nova-medium] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-linotype-palatino-nova.map]
-
\definefontsynonym[PalatinoNova-Light] [\typescriptthree-PalatinoNova-Light] [encoding=\typescriptthree]
\definefontsynonym[PalatinoNova-LightItalic] [\typescriptthree-PalatinoNova-LightItalic] [encoding=\typescriptthree]
\definefontsynonym[PalatinoNova-Regular] [\typescriptthree-PalatinoNova-Regular] [encoding=\typescriptthree]
@@ -326,8 +318,6 @@
\definefontsynonym[PalatinoNova-Imperial] [\typescriptthree-PalatinoNova-Imperial] [encoding=\typescriptthree]
\definefontsynonym[PalatinoNova-Titling] [\typescriptthree-PalatinoNova-Titling] [encoding=\typescriptthree]
- \loadmapfile[\typescriptthree-sc-linotype-palatino-nova.map]
-
\definefontsynonym[PalatinoNova-LightSC] [\typescriptthree-sc-PalatinoNova-Light] [encoding=\typescriptthree]
\definefontsynonym[PalatinoNova-LightItalicSC] [\typescriptthree-sc-PalatinoNova-LightItalic] [encoding=\typescriptthree]
\definefontsynonym[PalatinoNova-RegularSC] [\typescriptthree-sc-PalatinoNova-Regular] [encoding=\typescriptthree]
@@ -339,12 +329,9 @@
\definefontsynonym[PalatinoNova-ImperialSC] [\typescriptthree-sc-PalatinoNova-Imperial] [encoding=\typescriptthree]
\definefontsynonym[PalatinoNova-TitlingSC] [\typescriptthree-sc-PalatinoNova-Titling] [encoding=\typescriptthree]
-\stoptypescript
-
-\starttypescript [map] [palatino-nova,palatino-nova-light,palatino-nova-medium] [texnansi,ec,8r]
\loadmapfile[\typescriptthree-linotype-palatino-nova.map]
\loadmapfile[\typescriptthree-sc-linotype-palatino-nova.map]
-% \loadmapfile[\typescriptthree-os-linotype-palatino-nova.map]
+
\stoptypescript
% aldusnova
@@ -373,27 +360,20 @@
\starttypescript [serif] [aldus-nova] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-linotype-aldus-nova.map]
-
\definefontsynonym[AldusNova-Book] [\typescriptthree-AldusNova-Book] [encoding=\typescriptthree]
\definefontsynonym[AldusNova-BookItalic] [\typescriptthree-AldusNova-BookItalic] [encoding=\typescriptthree]
\definefontsynonym[AldusNova-Bold] [\typescriptthree-AldusNova-Bold] [encoding=\typescriptthree]
\definefontsynonym[AldusNova-BoldItalic] [\typescriptthree-AldusNova-BoldItalic] [encoding=\typescriptthree]
- \loadmapfile[\typescriptthree-sc-linotype-aldus-nova.map]
-
\definefontsynonym[AldusNova-BookSC] [\typescriptthree-sc-AldusNova-Book] [encoding=\typescriptthree]
\definefontsynonym[AldusNova-BookItalicSC] [\typescriptthree-sc-AldusNova-BookItalic] [encoding=\typescriptthree]
\definefontsynonym[AldusNova-BoldSC] [\typescriptthree-sc-AldusNova-Bold] [encoding=\typescriptthree]
\definefontsynonym[AldusNova-BoldItalicSC] [\typescriptthree-sc-AldusNova-BoldItalic] [encoding=\typescriptthree]
-\stoptypescript
-
-\starttypescript [map] [aldus-nova] [texnansi,ec,8r]
\loadmapfile[\typescriptthree-linotype-aldus-nova.map]
\loadmapfile[\typescriptthree-sc-linotype-aldus-nova.map]
-\stoptypescript
+\stoptypescript
% melior
@@ -415,17 +395,13 @@
\starttypescript [serif] [melior] [texnansi,ec,8r]
- \loadmapfile[\typescriptthree-linotype-melior.map]
-
\definefontsynonym [MeliorLT] [texnansi-lte50062] [encoding=\typescriptthree]
\definefontsynonym [MeliorLT-Italic] [texnansi-lte50063] [encoding=\typescriptthree]
\definefontsynonym [MeliorLT-Bold] [texnansi-lte50064] [encoding=\typescriptthree]
\definefontsynonym [MeliorLT-BoldItalic] [texnansi-lte50065] [encoding=\typescriptthree]
-\stoptypescript
-
-\starttypescript [map] [melior] [texnansi,ec,8r]
\loadmapfile[\typescriptthree-linotype-melior.map]
+
\stoptypescript
\stoptypescriptcollection
diff --git a/tex/context/base/type-gyr.tex b/tex/context/base/type-gyr.tex
index ac625d22f..3fa266f8e 100644
--- a/tex/context/base/type-gyr.tex
+++ b/tex/context/base/type-gyr.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D These definitions will eventually replace the ones in \type {type-one}!
+
% \usetypescriptfile[type-gyr]
% \definetypeface[pagella][rm][serif][pagella][default][encoding=t5]
% \setupbodyfont[pagella]
@@ -50,69 +52,64 @@
\definetypescriptprefix [f:adventor][ag]
\starttypescript [serif] [pagella,termes,heros,bonum,schola,adventor] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x]
- \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map]
-
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r] [encoding=\typescriptthree]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri] [encoding=\typescriptthree]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b] [encoding=\typescriptthree]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi] [encoding=\typescriptthree]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r-sc] [encoding=\typescriptthree]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri-sc] [encoding=\typescriptthree]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b-sc] [encoding=\typescriptthree]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi-sc] [encoding=\typescriptthree]
-
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Slanted] [\typescriptprefix{n:\typescripttwo}-Italic]
- \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
-\stoptypescript
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi] [encoding=\typescriptthree]
-\starttypescript [serif] [pagella,termes,bonum,schola] [name]
- \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular]
- \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
- \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold]
- \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
- \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
- \definefontsynonym [SerifSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted]
- \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted]
-
- \definefontvariant [Serif][osf][Caps]
- \definefontvariant [Serif][sc] [Caps]
-
- \definefontsynonym [SerifRegular] [\typescriptprefix{n:\typescripttwo}-Regular]
- \definefontsynonym [SerifRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
- \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
- \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
- \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
- \definefontsynonym [SerifCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
- \definefontsynonym [SerifSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
- \definefontsynonym [SerifBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r-sc] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri-sc] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b-sc] [encoding=\typescriptthree]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi-sc] [encoding=\typescriptthree]
-\stoptypescript
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Slanted] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
-\starttypescript [sans] [heros,adventor] [name]
- \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular]
- \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
- \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold]
- \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
- \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
- \definefontsynonym [SansSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted]
- \definefontsynonym [SansBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted]
-
- \definefontvariant [Sans][osf][Caps]
- \definefontvariant [Sans][sc] [Caps]
-
- \definefontsynonym [SansRegular] [\typescriptprefix{n:\typescripttwo}-Regular]
- \definefontsynonym [SansRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
- \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
- \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
- \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
- \definefontsynonym [SansCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
- \definefontsynonym [SansSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
- \definefontsynonym [SansBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map]
+\stoptypescript
+\starttypescript [serif] [pagella,termes,bonum,schola] [name]
+ \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+ \definefontsynonym [SerifSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegular] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SerifRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+ \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SerifCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+ \definefontsynonym [SerifSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SerifBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
\stoptypescript
-\starttypescript [map] [pagella,termes,bonum,schola,heros,adventor] [all]
- \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map]
+\starttypescript [sans] [heros,adventor] [name]
+ \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+ \definefontsynonym [SansSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted]
+ \definefontsynonym [SansBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted]
+
+ \definefontvariant [Sans][osf][Caps]
+ \definefontvariant [Sans][sc] [Caps]
+
+ \definefontsynonym [SansRegular] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [SansRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+ \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps]
+ \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
+ \definefontsynonym [SansCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps]
+ \definefontsynonym [SansSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps]
+ \definefontsynonym [SansBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps]
\stoptypescript
%D Here we overload the older (URW) fonts.
@@ -125,16 +122,16 @@
% qplbi TeXGyrePagella-BoldItalic
\starttypescript [serif] [palatino] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x]
- \loadmapfile[qpl-\typescriptthree.map]
+ \definefontsynonym [Palatino] [\typescriptthree-qplr] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-Italic] [\typescriptthree-qplri] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-Bold] [\typescriptthree-qplb] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-BoldItalic] [\typescriptthree-qplbi] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-Caps] [\typescriptthree-qplr-sc] [encoding=\typescriptthree]
- \definefontsynonym [Palatino] [\typescriptthree-qplr] [encoding=\typescriptthree]
- \definefontsynonym [Palatino-Italic] [\typescriptthree-qplri] [encoding=\typescriptthree]
- \definefontsynonym [Palatino-Bold] [\typescriptthree-qplb] [encoding=\typescriptthree]
- \definefontsynonym [Palatino-BoldItalic] [\typescriptthree-qplbi] [encoding=\typescriptthree]
- \definefontsynonym [Palatino-Caps] [\typescriptthree-qplr-sc] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-Slanted] [Palatino-Italic]
+ \definefontsynonym [Palatino-BoldSlanted] [Palatino-BoldItalic]
- \definefontsynonym [Palatino-Slanted] [Palatino-Italic]
- \definefontsynonym [Palatino-BoldSlanted] [Palatino-BoldItalic]
+ \loadmapfile[qpl-\typescriptthree.map]
\stoptypescript
% TeXGyreTermes
@@ -145,17 +142,16 @@
% qtmbi TeXGyreTermes-BoldItalic
\starttypescript [serif] [times] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x]
-% \loadmapfile[\typescriptthree-qtm.map]
- \loadmapfile[qtm-\typescriptthree.map]
+ \definefontsynonym [Times-Roman] [\typescriptthree-qtmr] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Italic] [\typescriptthree-qtmri] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Bold] [\typescriptthree-qtmb] [encoding=\typescriptthree]
+ \definefontsynonym [Times-BoldItalic] [\typescriptthree-qtmbi] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Caps] [\typescriptthree-qtmr-sc] [encoding=\typescriptthree]
- \definefontsynonym [Times-Roman] [\typescriptthree-qtmr] [encoding=\typescriptthree]
- \definefontsynonym [Times-Italic] [\typescriptthree-qtmri] [encoding=\typescriptthree]
- \definefontsynonym [Times-Bold] [\typescriptthree-qtmb] [encoding=\typescriptthree]
- \definefontsynonym [Times-BoldItalic] [\typescriptthree-qtmbi] [encoding=\typescriptthree]
- \definefontsynonym [Times-Caps] [\typescriptthree-qtmr-sc] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Slanted] [Times-Italic]
+ \definefontsynonym [Times-BoldSlanted] [Times-BoldItalic]
- \definefontsynonym [Times-Slanted] [Times-Italic]
- \definefontsynonym [Times-BoldSlanted] [Times-BoldItalic]
+ \loadmapfile[qtm-\typescriptthree.map]
\stoptypescript
% TeXGyreHeros
@@ -166,13 +162,13 @@
% qtmbi TeXGyreHeros-BoldItalic
\starttypescript [serif] [heros,helvetica] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x]
- \loadmapfile[qhv-\typescriptthree.map]
+ \definefontsynonym [Helvetica] [\typescriptthree-qhvr] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-Oblique] [\typescriptthree-qhvri] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-Bold] [\typescriptthree-qhvb] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-BoldOblique] [\typescriptthree-qhvbi] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-Caps] [\typescriptthree-qhvr-sc] [encoding=\typescriptthree]
- \definefontsynonym [Helvetica] [\typescriptthree-qhvr] [encoding=\typescriptthree]
- \definefontsynonym [Helvetica-Oblique] [\typescriptthree-qhvri] [encoding=\typescriptthree]
- \definefontsynonym [Helvetica-Bold] [\typescriptthree-qhvb] [encoding=\typescriptthree]
- \definefontsynonym [Helvetica-BoldOblique] [\typescriptthree-qhvbi] [encoding=\typescriptthree]
- \definefontsynonym [Helvetica-Caps] [\typescriptthree-qhvr-sc] [encoding=\typescriptthree]
+ \loadmapfile[qhv-\typescriptthree.map]
\stoptypescript
% TeXGyreBonum
@@ -183,17 +179,16 @@
% qtmbi TeXGyreBonum-BoldItalic
\starttypescript [serif] [bookman] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x]
-% \loadmapfile[\typescriptthree-qbk.map]
- \loadmapfile[qbk-\typescriptthree.map]
+ \definefontsynonym [Bookman-Light] [\typescriptthree-qbkr] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-LightItalic] [\typescriptthree-qbkri] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-DemiBold] [\typescriptthree-qbkb] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-DemiBoldItalic] [\typescriptthree-qbkbi] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-Light-Caps] [\typescriptthree-qbkr-sc] [encoding=\typescriptthree]
- \definefontsynonym [Bookman-Light] [\typescriptthree-qbkr] [encoding=\typescriptthree]
- \definefontsynonym [Bookman-LightItalic] [\typescriptthree-qbkri] [encoding=\typescriptthree]
- \definefontsynonym [Bookman-DemiBold] [\typescriptthree-qbkb] [encoding=\typescriptthree]
- \definefontsynonym [Bookman-DemiBoldItalic] [\typescriptthree-qbkbi] [encoding=\typescriptthree]
- \definefontsynonym [Bookman-Light-Caps] [\typescriptthree-qbkr-sc] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-LightSlanted] [Bookman-LightItalic]
+ \definefontsynonym [Bookman-DemiBoldSlanted] [Bookman-DemiBoldItalic]
- \definefontsynonym [Bookman-LightSlanted] [Bookman-LightItalic]
- \definefontsynonym [Bookman-DemiBoldSlanted] [Bookman-DemiBoldItalic]
+ \loadmapfile[qbk-\typescriptthree.map]
\stoptypescript
% TeXGyreScola
@@ -204,16 +199,16 @@
% qcsbi TeXGyreSchola-BoldItalic
\starttypescript [serif] [schoolbook] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x]
- \loadmapfile[qcs-\typescriptthree.map]
+ \definefontsynonym [Schoolbook-Roman] [\typescriptthree-qcsr] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-Italic] [\typescriptthree-qcsri] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-Bold] [\typescriptthree-qcsb] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-BoldItalic] [\typescriptthree-qcsbi] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-Roman-Caps] [\typescriptthree-qcsr-sc] [encoding=\typescriptthree]
- \definefontsynonym [Schoolbook-Roman] [\typescriptthree-qcsr] [encoding=\typescriptthree]
- \definefontsynonym [Schoolbook-Italic] [\typescriptthree-qcsri] [encoding=\typescriptthree]
- \definefontsynonym [Schoolbook-Bold] [\typescriptthree-qcsb] [encoding=\typescriptthree]
- \definefontsynonym [Schoolbook-BoldItalic] [\typescriptthree-qcsbi] [encoding=\typescriptthree]
- \definefontsynonym [Schoolbook-Roman-Caps] [\typescriptthree-qcsr-sc] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-Slanted] [Schoolbook-Italic]
+ \definefontsynonym [Schoolbook-BoldSlanted] [Schoolbook-BoldItalic]
- \definefontsynonym [Schoolbook-Slanted] [Schoolbook-Italic]
- \definefontsynonym [Schoolbook-BoldSlanted] [Schoolbook-BoldItalic]
+ \loadmapfile[qcs-\typescriptthree.map]
\stoptypescript
% TeXGyreAdventor
diff --git a/tex/context/base/type-ini.tex b/tex/context/base/type-ini.tex
index 25f12ff17..a009c37e1 100644
--- a/tex/context/base/type-ini.tex
+++ b/tex/context/base/type-ini.tex
@@ -76,25 +76,39 @@
{\splitfiletype{#1}%
\addtocommalist\splitoffname\typescriptfiles}}
-\usetypescriptfile[\f!typeprefix exa] % some examples
-\usetypescriptfile[\f!typeprefix syn] % font file synonyms
-\usetypescriptfile[\f!typeprefix enc] % files and encodings
-%usetypescriptfile[\f!typeprefix dis] % funny name remappings, obsolete
-\usetypescriptfile[\f!typeprefix siz] % specific font sizes
-\usetypescriptfile[\f!typeprefix map] % pdftex mapping
-\usetypescriptfile[\f!typeprefix spe] % special macros
-\usetypescriptfile[\f!typeprefix akb] % adobe karl berry names
+% \usetypescriptfile[\f!typeprefix exa] % some examples
+% \usetypescriptfile[\f!typeprefix syn] % font file synonyms
+% \usetypescriptfile[\f!typeprefix enc] % files and encodings
+% %usetypescriptfile[\f!typeprefix dis] % funny name remappings, obsolete
+% \usetypescriptfile[\f!typeprefix siz] % specific font sizes
+% \usetypescriptfile[\f!typeprefix map] % pdftex mapping
+% \usetypescriptfile[\f!typeprefix spe] % special macros
+% \usetypescriptfile[\f!typeprefix akb] % adobe karl berry names
+%
+% \beginXETEX \font
+% \usetypescriptfile[\f!typeprefix xtx] % xetex definitions
+% \endXETEX
-\beginXETEX \font
+\usetypescriptfile[\f!typeprefix tmf]
+\usetypescriptfile[\f!typeprefix siz]
- \usetypescriptfile[\f!typeprefix xtx] % xetex definitions
+\beginOLDTEX \font
+ \usetypescriptfile[\f!typeprefix one]
+ %usetypescriptfile[\f!typeprefix gyr] % to be merged into one
+ \usetypescriptfile[\f!typeprefix akb] % will go away when gyre is merged
+\endOLDTEX
+\beginNEWTEX \font
+ \usetypescriptfile[\f!typeprefix otf]
+\endNEWTEX
+
+\beginXETEX \font
+ \usetypescriptfile[\f!typeprefix xtx]
\endXETEX
-\usetypescriptfile[\f!typeprefix loc] % local scripts
+\usetypescriptfile[\f!typeprefix loc]
-%usetypescriptfile[\f!typeprefix pre] % predefined scripts (compatible)
-%usetypescriptfile[typeface] % project scripts
+% SO FAR
\let\currenttypescripts\empty
@@ -148,6 +162,7 @@
% {\startreadingfile
% \pushmacro\currenttypefile
% \def\currenttypefile{#1}%
+% \def\currenttypefile{#1}%
% \readfile\currenttypefile\donothing\donothing
% \popmacro\currenttypefile
% \stopreadingfile}
@@ -535,22 +550,26 @@
% we can use \rawgetparameters or \rawgeteparameters
+\ifx\mkdodefinetypeface\undefined
+ \let\mkdodefinetypeface\gobblefivearguments
+\fi
+
\def\dodefinetypeface[#1][#2][#3][#4][#5][#6]%
{\dododefinetypeface[#1][#2]%
\iffifthargument % sixth is optional
% we need to expand since in #6 there can be a \typescripttwo
- \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!text=,#6]}% \geteparameters
+ \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!text=,#6]}% \geteparameters
\pushmacro\relativefontsize
\pushmacro\typefaceencoding
\pushmacro\fontclass
\let\relativefontsize\@@tsrscale
\let\typefaceencoding\@@tsencoding
\setcurrentfontclass{#1}%
+ \letvalue{\fontclass\s!features}\@@tsfeatures % new per 16/6/2007
\saverelativefontsize{#2}\relativefontsize % fall back
\savemathtextstyle\@@tstext % math text style (new per 28/4/2006)
\iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4] / \typefaceencoding}\fi
- %\usetypescript[map][\typefaceencoding]% latest versions of pdftex can load after first page
- \usetypescript[#3,\t!map][#4][\t!name,\t!default,\typefaceencoding,\t!special]% is default needed
+ \usetypescript[#3,\t!map][#4][\t!name,\t!default,\typefaceencoding,\t!special]% map is needed for backward cmp
\usetypescript[#3][#5][\t!size]%
\popmacro\fontclass
\popmacro\typefaceencoding
diff --git a/tex/context/base/type-map.tex b/tex/context/base/type-map.tex
index e333423b7..37eef0ed5 100644
--- a/tex/context/base/type-map.tex
+++ b/tex/context/base/type-map.tex
@@ -16,62 +16,62 @@
%D This one plays safe:
\starttypescript [map] [base] [all]
- \loadmapfile[original-base.map]
- \loadmapfile[ec-base.map]
- \loadmapfile[texnansi-base.map]
- \loadmapfile[8r-base.map]
- \loadmapfile[qx-base.map]
- \loadmapfile[t5-base.map]
+ \loadmapfile[original-base.map]
+ \loadmapfile[ec-base.map]
+ \loadmapfile[texnansi-base.map]
+ \loadmapfile[8r-base.map]
+ \loadmapfile[qx-base.map]
+ \loadmapfile[t5-base.map]
\stoptypescript
\starttypescript [map] [base,euler,ams] [all]
- \loadmapfile[original-ams-base.map]
-% \loadmapfile[original-ams-cmr.map]
- \loadmapfile[original-ams-euler.map]
- \loadmapfile[original-public-lm.map]
+ \loadmapfile[original-ams-base.map]
+ %loadmapfile[original-ams-cmr.map]
+ \loadmapfile[original-ams-euler.map]
+ \loadmapfile[original-public-lm.map]
\stoptypescript
% This is the base map file, load it to be sure.
\starttypescript [map] [all] [ec,8r,texnansi,qx,t5]
- \loadmapfile[original-base.map]
- \loadmapfile[\typescriptthree-base.map]
+ \loadmapfile[original-base.map]
+ \loadmapfile[\typescriptthree-base.map]
\stoptypescript
% if we were in full control, we could have
%
% \starttypescript [berry] [ec]
-% \loadmapfile[ec-base.map]
+% \loadmapfile[ec-base.map]
% \stoptypescript
% cmr and related
\starttypescript [map] [cmr,lm,lmr]
- \loadmapfile[original-public-lm.map]
- \loadmapfile[original-ams-base.map]
- \loadmapfile[original-ams-euler.map]
+ \loadmapfile[original-public-lm.map]
+ \loadmapfile[original-ams-base.map]
+ \loadmapfile[original-ams-euler.map]
\stoptypescript
% cyrillic
\starttypescript [map] [computer-modern] [t2a,t2b,t2c,x2]
- \loadmapfile[subset-cmsuper-\typescriptthree.map]
- \loadmapfile[cm-super-\typescriptthree.map]
+ \loadmapfile[subset-cmsuper-\typescriptthree.map]
+ \loadmapfile[cm-super-\typescriptthree.map]
\stoptypescript
% latin modern (watch the unfortunate \quote {lm-encoding} order
% in the name; for the moment we ship copies of the map files.
\starttypescript [map] [modern,modern-vari,modern-cond,computer-modern,latin-modern,latin-modern-vari,latin-modern-cond,] [ec,texnansi,qx,t5]
- % this was what we had at the start and what fits best into our naming scheme
- % well, all those changes in lm gave too many user problem reports so i revert to:
- % \loadmapfile[\typescriptthree-public-lm.map]
- % this one also fits into the naming scheme but has been dropped by the distributers
- % \loadmapfile[\typescriptthree-lm.map]
- % this is what the latest distributions provide
- \loadmapfile[lm-\typescriptthree.map] % maybe some day
- \loadmapfile[lm-math.map]
- \loadmapfile[lm-rm.map]
+ % this was what we had at the start and what fits best into our naming scheme
+ % well, all those changes in lm gave too many user problem reports so i revert to:
+ % \loadmapfile[\typescriptthree-public-lm.map]
+ % this one also fits into the naming scheme but has been dropped by the distributers
+ % \loadmapfile[\typescriptthree-lm.map]
+ % this is what the latest distributions provide
+ \loadmapfile[lm-\typescriptthree.map] % maybe some day
+ \loadmapfile[lm-math.map]
+ \loadmapfile[lm-rm.map]
\stoptypescript
% \usetypescript [map] [latin-modern-os] [ec] % lm is loaded under ec regime
@@ -80,116 +80,116 @@
% \stoptext
\starttypescript [map] [latin-modern-os] [ec,texnansi,qx,t5]
- \loadmapfile[\typescriptthree-os-public-lm.map]
+ \loadmapfile[\typescriptthree-os-public-lm.map]
\stoptypescript
% the next applies to texfont generated metrics
\starttypescript [map] [utopia] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-adobe-utopia.map]
+ \loadmapfile[\typescriptthree-adobe-utopia.map]
\stoptypescript
\starttypescript [map] [charter] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-bitstrea-charter.map]
+ \loadmapfile[\typescriptthree-bitstrea-charter.map]
\stoptypescript
% \starttypescript [map] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,ec,qx,t5,t2a,t2b,t2c,default]
-% \loadmapfile[\typescriptthree-antt.map]
-% \loadmapfile[rm-antt.map]
-% \loadmapfile[mi-antt.map]
-% \loadmapfile[sy-antt.map]
-% \loadmapfile[ex-antt.map]
+% \loadmapfile[\typescriptthree-antt.map]
+% \loadmapfile[rm-antt.map]
+% \loadmapfile[mi-antt.map]
+% \loadmapfile[sy-antt.map]
+% \loadmapfile[ex-antt.map]
% \stoptypescript
\starttypescript [map] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,ec,qx,t5,t2a,t2b,t2c,default]
- \loadmapfile[antt-\typescriptthree.map]
- \loadmapfile[antt-rm.map]
- \loadmapfile[antt-mi.map]
- \loadmapfile[antt-sy.map]
- \loadmapfile[antt-ex.map]
+ \loadmapfile[antt-\typescriptthree.map]
+ \loadmapfile[antt-rm.map]
+ \loadmapfile[antt-mi.map]
+ \loadmapfile[antt-sy.map]
+ \loadmapfile[antt-ex.map]
\stoptypescript
\starttypescript [map] [antykwa-poltawskiego] [ec,texnansi,qx,t5]
- \loadmapfile[\typescriptthree-public-antp.map]
+ \loadmapfile[\typescriptthree-public-antp.map]
\stoptypescript
% \starttypescript [map] [iwona,iwona-light,iwona-medium,iwona-heavy] [ec,texnansi,qx,t5]
-% \loadmapfile[\typescriptthree-iwona.map]
-% \loadmapfile[rm-iwona.map]
-% \loadmapfile[mi-iwona.map]
-% \loadmapfile[sy-iwona.map]
-% \loadmapfile[ex-iwona.map]
+% \loadmapfile[\typescriptthree-iwona.map]
+% \loadmapfile[rm-iwona.map]
+% \loadmapfile[mi-iwona.map]
+% \loadmapfile[sy-iwona.map]
+% \loadmapfile[ex-iwona.map]
% \stoptypescript
\starttypescript [map] [iwona,iwona-light,iwona-medium,iwona-heavy] [ec,texnansi,qx,t5]
- \loadmapfile[iwona-\typescriptthree.map]
- \loadmapfile[iwona-rm.map]
- \loadmapfile[iwona-mi.map]
- \loadmapfile[iwona-sy.map]
- \loadmapfile[iwona-ex.map]
+ \loadmapfile[iwona-\typescriptthree.map]
+ \loadmapfile[iwona-rm.map]
+ \loadmapfile[iwona-mi.map]
+ \loadmapfile[iwona-sy.map]
+ \loadmapfile[iwona-ex.map]
\stoptypescript
% \starttypescript [map] [kurier,kurier-light,kurier-medium,kurier-heavy] [ec,texnansi,qx,t5,default]
-% \loadmapfile[\typescriptthree-kurier.map]
-% \loadmapfile[rm-kurier.map]
-% \loadmapfile[mi-kurier.map]
-% \loadmapfile[sy-kurier.map]
-% \loadmapfile[ex-kurier.map]
+% \loadmapfile[\typescriptthree-kurier.map]
+% \loadmapfile[rm-kurier.map]
+% \loadmapfile[mi-kurier.map]
+% \loadmapfile[sy-kurier.map]
+% \loadmapfile[ex-kurier.map]
% \stoptypescript
\starttypescript [map] [kurier,kurier-light,kurier-medium,kurier-heavy] [ec,texnansi,qx,t5,default]
- \loadmapfile[kurier-\typescriptthree.map]
- \loadmapfile[kurier-rm.map]
- \loadmapfile[kurier-mi.map]
- \loadmapfile[kurier-sy.map]
- \loadmapfile[kurier-ex.map]
+ \loadmapfile[kurier-\typescriptthree.map]
+ \loadmapfile[kurier-rm.map]
+ \loadmapfile[kurier-mi.map]
+ \loadmapfile[kurier-sy.map]
+ \loadmapfile[kurier-ex.map]
\stoptypescript
\starttypescript [map] [bookman] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-urw-bookman.map]
+ \loadmapfile[\typescriptthree-urw-bookman.map]
\stoptypescript
\starttypescript [map] [courier] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-urw-courier.map]
+ \loadmapfile[\typescriptthree-urw-courier.map]
\stoptypescript
\starttypescript [map] [helvetica] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-urw-helvetica.map]
+ \loadmapfile[\typescriptthree-urw-helvetica.map]
\stoptypescript
\starttypescript [map] [palatino] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-urw-palatino.map]
-% \loadmapfile[\typescriptthree-public-pfl.map]
+ \loadmapfile[\typescriptthree-urw-palatino.map]
+ %loadmapfile[\typescriptthree-public-pfl.map]
\stoptypescript
\starttypescript [map] [times] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-urw-times.map]
+ \loadmapfile[\typescriptthree-urw-times.map]
\stoptypescript
\starttypescript [map] [chancery] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-urw-zapfchan.map]
+ \loadmapfile[\typescriptthree-urw-zapfchan.map]
\stoptypescript
\starttypescript [map] [schoolbook] [ec,texnansi,t5,8r]
- \loadmapfile[\typescriptthree-urw-ncntrsbk.map]
+ \loadmapfile[\typescriptthree-urw-ncntrsbk.map]
\stoptypescript
% once i can be sure that the map files are in the tree, i will
% use those instead of original (too many variants anyway)
\starttypescript [map] [palatino] [default,ec,texnansi,t5,8r]
- \loadmapfile[original-youngryu-px.map]
+ \loadmapfile[original-youngryu-px.map]
\stoptypescript
\starttypescript [map] [times] [default,ec,texnansi,t5,8r]
- \loadmapfile[original-youngryu-tx.map]
+ \loadmapfile[original-youngryu-tx.map]
\stoptypescript
% to do: maybe original, maybe not
\starttypescript [map] [fourier] [ec]
- \loadmapfile[fourier.map]
- \loadmapfile[fourier-utopia-expert.map]
+ \loadmapfile[fourier.map]
+ \loadmapfile[fourier-utopia-expert.map]
\stoptypescript
\stoptypescriptcollection
diff --git a/tex/context/base/type-msw.tex b/tex/context/base/type-msw.tex
index 985aa9c17..343e76eab 100644
--- a/tex/context/base/type-msw.tex
+++ b/tex/context/base/type-msw.tex
@@ -31,57 +31,37 @@
% verdana
\starttypescript [sans] [verdana] [name]
-
- \setups[font:fallback:sans]
-
- \definefontsynonym [Sans] [Verdana]
- \definefontsynonym [SansBold] [Verdana-Bold]
- \definefontsynonym [SansItalic] [Verdana-Italic]
- \definefontsynonym [SansBoldItalic] [Verdana-BoldItalic]
-
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Verdana]
+ \definefontsynonym [SansBold] [Verdana-Bold]
+ \definefontsynonym [SansItalic] [Verdana-Italic]
+ \definefontsynonym [SansBoldItalic] [Verdana-BoldItalic]
\stoptypescript
\starttypescript [sans] [verdana] [texnansi]
-
- \definefontsynonym [Verdana] [\typescriptthree-verdana] [encoding=\typescriptthree]
- \definefontsynonym [Verdana-Bold] [\typescriptthree-verdanab] [encoding=\typescriptthree]
- \definefontsynonym [Verdana-Italic] [\typescriptthree-verdanai] [encoding=\typescriptthree]
- \definefontsynonym [Verdana-BoldItalic] [\typescriptthree-verdanaz] [encoding=\typescriptthree]
-
-\stoptypescript
-
-\starttypescript [map] [verdana] [texnansi]
-
- \loadmapfile[texnansi-microsoft-verdana.map]
-
+ \definefontsynonym [Verdana] [\typescriptthree-verdana] [encoding=\typescriptthree]
+ \definefontsynonym [Verdana-Bold] [\typescriptthree-verdanab] [encoding=\typescriptthree]
+ \definefontsynonym [Verdana-Italic] [\typescriptthree-verdanai] [encoding=\typescriptthree]
+ \definefontsynonym [Verdana-BoldItalic] [\typescriptthree-verdanaz] [encoding=\typescriptthree]
+ \loadmapfile[texnansi-microsoft-verdana.map]
\stoptypescript
% arial
\starttypescript [sans] [arial] [name]
-
\setups[font:fallback:sans]
-
\definefontsynonym [Sans] [ArialMT]
\definefontsynonym [SansBold] [Arial-BoldMT]
\definefontsynonym [SansItalic] [Arial-ItalicMT]
\definefontsynonym [SansBoldItalic] [Arial-BoldItalicMT]
-
\stoptypescript
\starttypescript [sans] [arial] [texnansi]
-
- \definefontsynonym [ArialMT] [\typescriptthree-arial] [encoding=\typescriptthree]
- \definefontsynonym [Arial-BoldMT] [\typescriptthree-arialbd] [encoding=\typescriptthree]
- \definefontsynonym [Arial-ItalicMT] [\typescriptthree-ariali] [encoding=\typescriptthree]
- \definefontsynonym [Arial-BoldItalicMT] [\typescriptthree-arialbi] [encoding=\typescriptthree]
-
-\stoptypescript
-
-\starttypescript [map] [arial] [texnansi]
-
- \loadmapfile[texnansi-microsoft-arial.map]
-
+ \definefontsynonym [ArialMT] [\typescriptthree-arial] [encoding=\typescriptthree]
+ \definefontsynonym [Arial-BoldMT] [\typescriptthree-arialbd] [encoding=\typescriptthree]
+ \definefontsynonym [Arial-ItalicMT] [\typescriptthree-ariali] [encoding=\typescriptthree]
+ \definefontsynonym [Arial-BoldItalicMT] [\typescriptthree-arialbi] [encoding=\typescriptthree]
+ \loadmapfile[texnansi-microsoft-arial.map]
\stoptypescript
\stoptypescriptcollection
diff --git a/tex/context/base/type-one.tex b/tex/context/base/type-one.tex
new file mode 100644
index 000000000..09ffc748b
--- /dev/null
+++ b/tex/context/base/type-one.tex
@@ -0,0 +1,1154 @@
+%D \module
+%D [ file=type-one,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Type One Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This file merges the traditional enc, syn and map files into one. If
+%D you think that it looks messy you're right. It shows some history of
+%D \TEX\ fonts and the development towards latin modern.
+
+% texfont --ven=public --col=antt --enc=ec --sou=auto
+% texfont --ven=public --col=antp --enc=ec --sou=auto
+% texfont --ven=urw --col=palatino --enc=ec --sou=auto
+% texfont --ven-lucas --col=sun --enc=ec --sou=.
+
+% \usetypescript [all] [modern] [texnansi]
+% \setupbodyfont[reset] \setupbodyfont[cmr]
+% \starttext \showfont[Serif] \stoptext
+
+\starttypescriptcollection[examples]
+
+\starttypescript [fallback] [texnansi,ec,qx,t5,default]
+ \definetypeface [] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [modern] [texnansi,ec,qx,t5,default]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo]
+ \definetypeface [modern] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [modern-base] [texnansi,ec,qx,t5,default]
+ \definetypeface [modern] [rm] [serif] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [mm] [math] [modern] [default] [encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [modern-base] [t2a,t2b,t2c,x2]
+ \definetypeface [modern] [rm] [serif] [computer-modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [ss] [sans] [computer-modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [tt] [mono] [computer-modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modern] [mm] [math] [computer-modern] [default] [encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [postscript] [texnansi,ec,qx,t5,uc,8r]
+ \definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo]
+ \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=.9,encoding=\typescripttwo]
+ \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1,encoding=\typescripttwo]
+ \definetypeface [postscript] [mm] [math] [times] [default]
+ \usemathcollection[default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [times] [texnansi,ec,qx,8r,t5,uc]
+ \definetypeface [times] [rm] [serif] [times] [default] [encoding=\typescripttwo]
+ \definetypeface [times] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9]
+ \definetypeface [times] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05]
+ \definetypeface [times] [mm] [math] [times] [default] [encoding=\typescripttwo]
+ \usemathcollection[default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [palatino] [texnansi,ec,qx,8r,t5,uc]
+ \definetypeface [palatino] [rm] [serif] [palatino] [default] [encoding=\typescripttwo]
+ \definetypeface [palatino] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.075]
+ \definetypeface [palatino] [mm] [math] [palatino] [default] [encoding=default]
+ \usemathcollection[default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [fourier] [ec]
+ \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec]
+ \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default]
+ \definetypeface [fourier] [tt] [mono] [modern] [default] [encoding=ec,rscale=1.07]
+ \usemathcollection[fou]
+ \quittypescriptscanning
+\stoptypescript
+
+% handy
+
+\starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it
+ \definefontsynonym [Simple] [cmvtt10]
+ \setupfontsynonym [Simple] [handling=pure]
+\stoptypescript
+
+\starttypescript [modernvariable] [texnansi,ec,qx,8r,t5]
+ \definetypeface [modernvariable] [rm] [serif] [simple] [default] [encoding=\typescripttwo]
+ \definetypeface [modernvariable] [ss] [sans] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modernvariable] [tt] [mono] [modern] [default] [encoding=\typescripttwo]
+ \definetypeface [modernvariable] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [optima] [texnansi,ec,qx]
+ \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo]
+ \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo]
+ \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [antykwa-torunska] [texnansi,ec,8r,uc,t2a]
+ \definetypeface[antykwa][rm][serif][antykwa-torunska] [default][encoding=\typescripttwo]
+ \definetypeface[antykwa][ss][sans] [modern] [default][encoding=\typescripttwo,rscale=1.05]
+ \definetypeface[antykwa][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1]
+ \definetypeface[antykwa][mm][math] [antykwa-torunska] [default][encoding=\typescripttwo]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] [texnansi,ec,8r,uc,t2a]
+ \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo]
+ \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss]
+ \quittypescriptscanning
+\stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[typeone]
+
+\starttypescript [map] [all]
+ \loadmapfile[original-base.map]
+ \loadmapfile[original-ams-base.map]
+\stoptypescript
+
+\starttypescript[all][modern,latin-modern][all]
+
+ % fallbacks, no math in latin modern
+
+ \definefontsynonym[lmdunh10][cmdunh10]
+ \definefontsynonym[lmff10] [cmff10]
+ \definefontsynonym[lmfi10] [cmfi10]
+ \definefontsynonym[lmfib8] [cmfib8]
+ \definefontsynonym[lmtex10] [cmtex10]
+ \definefontsynonym[lmtex8] [cmtex8]
+ \definefontsynonym[lmtex9] [cmtex9]
+
+ \loadmapfile[original-public-lm.map]
+\stoptypescript
+
+\starttypescript [serif] [modern,latin-modern] [texnansi,ec,qx,t5]
+ \definefontsynonym [LMRoman10-DemiOblique] [\typescriptthree-lmbo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Bold] [\typescriptthree-lmbx10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Bold] [\typescriptthree-lmbx12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman5-Bold] [\typescriptthree-lmbx5] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman6-Bold] [\typescriptthree-lmbx6] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman7-Bold] [\typescriptthree-lmbx7] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Bold] [\typescriptthree-lmbx8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Bold] [\typescriptthree-lmbx9] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-BoldItalic] [\typescriptthree-lmbxi10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-BoldOblique] [\typescriptthree-lmbxo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-CapsRegular] [\typescriptthree-lmcsc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-CapsOblique] [\typescriptthree-lmcsco10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Regular] [\typescriptthree-lmr10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Regular] [\typescriptthree-lmr12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman17-Regular] [\typescriptthree-lmr17] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman5-Regular] [\typescriptthree-lmr5] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman6-Regular] [\typescriptthree-lmr6] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman7-Regular] [\typescriptthree-lmr7] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Regular] [\typescriptthree-lmr8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Regular] [\typescriptthree-lmr9] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Italic] [\typescriptthree-lmri10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Italic] [\typescriptthree-lmri12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman7-Italic] [\typescriptthree-lmri7] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Italic] [\typescriptthree-lmri8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Italic] [\typescriptthree-lmri9] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman10-Oblique] [\typescriptthree-lmro10] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman12-Oblique] [\typescriptthree-lmro12] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman17-Oblique] [\typescriptthree-lmro17] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman8-Oblique] [\typescriptthree-lmro8] [encoding=\typescriptthree]
+ \definefontsynonym [LMRoman9-Oblique] [\typescriptthree-lmro9] [encoding=\typescriptthree]
+
+ \loadmapfile[lm-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [sans] [modern,latin-modern] [texnansi,ec,qx,t5]
+ \definefontsynonym [LMSans10-Regular] [\typescriptthree-lmss10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans12-Regular] [\typescriptthree-lmss12] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans17-Regular] [\typescriptthree-lmss17] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans8-Regular] [\typescriptthree-lmss8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans9-Regular] [\typescriptthree-lmss9] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-BoldOblique] [\typescriptthree-lmssbo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-Bold] [\typescriptthree-lmssbx10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-DemiCondensed] [\typescriptthree-lmssdc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-DemiCondensedOblique] [\typescriptthree-lmssdo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans10-Oblique] [\typescriptthree-lmsso10] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans12-Oblique] [\typescriptthree-lmsso12] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans17-Oblique] [\typescriptthree-lmsso17] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans8-Oblique] [\typescriptthree-lmsso8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSans9-Oblique] [\typescriptthree-lmsso9] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-Regular] [\typescriptthree-lmssq8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-BoldOblique] [\typescriptthree-lmssqbo8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-Bold] [\typescriptthree-lmssqbx8] [encoding=\typescriptthree]
+ \definefontsynonym [LMSansQuotation8-Oblique] [\typescriptthree-lmssqo8] [encoding=\typescriptthree]
+
+ \loadmapfile[lm-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] [texnansi,ec,qx,t5]
+ \definefontsynonym [LMTypewriter10-CapsRegular] [\typescriptthree-lmtcsc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-CapsOblique] [\typescriptthree-lmtcso10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Light] [\typescriptthree-lmtl10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-LightOblique] [\typescriptthree-lmtlo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-LightCondensed] [\typescriptthree-lmtlc10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-LightCondensedOblique] [\typescriptthree-lmtlco10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Dark] [\typescriptthree-lmtk10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-DarkOblique] [\typescriptthree-lmtko10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Regular] [\typescriptthree-lmtt10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter12-Regular] [\typescriptthree-lmtt12] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter8-Regular] [\typescriptthree-lmtt8] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter9-Regular] [\typescriptthree-lmtt9] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Italic] [\typescriptthree-lmtti10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriter10-Oblique] [\typescriptthree-lmtto10] [encoding=\typescriptthree]
+
+ \definefontsynonym [LMTypewriterVarWd10-Regular] [\typescriptthree-lmvtt10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-Oblique] [\typescriptthree-lmvtto10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-Light] [\typescriptthree-lmvtl10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-LightOblique] [\typescriptthree-lmvtlo10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-Dark] [\typescriptthree-lmvtk10] [encoding=\typescriptthree]
+ \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\typescriptthree-lmvtko10] [encoding=\typescriptthree]
+
+ \loadmapfile[lm-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [math] [modern,latin-modern]
+ \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5]
+ \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7]
+ \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10]
+ \definefontsynonym [LMMathSymbols5-Italic] [lmsy5]
+ \definefontsynonym [LMMathSymbols6-Italic] [lmsy6]
+ \definefontsynonym [LMMathSymbols7-Italic] [lmsy7]
+ \definefontsynonym [LMMathSymbols8-Italic] [lmsy8]
+ \definefontsynonym [LMMathSymbols9-Italic] [lmsy9]
+ \definefontsynonym [LMMathSymbols10-Italic] [lmsy10]
+ \definefontsynonym [LMMathExtension10-Regular] [lmex10]
+ \definefontsynonym [LMMathItalic5-Italic] [lmmi5]
+ \definefontsynonym [LMMathItalic6-Italic] [lmmi6]
+ \definefontsynonym [LMMathItalic7-Italic] [lmmi7]
+ \definefontsynonym [LMMathItalic8-Italic] [lmmi8]
+ \definefontsynonym [LMMathItalic9-Italic] [lmmi9]
+ \definefontsynonym [LMMathItalic10-Italic] [lmmi10]
+ \definefontsynonym [LMMathItalic12-Italic] [lmmi12]
+ \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5]
+ \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7]
+ \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10]
+
+ \loadmapfile[lm-math.map]
+ \loadmapfile[lm-rm.map]
+\stoptypescript
+
+%D {\em Comments by Victor Figurnov:} the wcmb10, wcmbx10,
+%D \unknown\ fonts below are taken from the Paradissa
+%D collection by Basil Malyshev. These fonts don't conform t2a
+%D encoding but are in MS Windows Cyrillic codepage 1251
+%D encoding. These fonts contain only 33 russian letters in
+%D upper and lower case, the number sign, and guillemots. But
+%D even among these characters only the basic 32 russian
+%D letters (in upper and lower case) will be typeset correctly
+%D with this definition. The letters cyrillicYO and
+%D cyrillicyo, as well as number sign (textnumero) and
+%D guillemots won't be typeset properly, because these symbols
+%D have different positions in t2a and MS CP1251 encodings.
+%D
+%D I think that the russian lh fonts and|/|or cm-super provide
+%D better alternatives (type1). Therefore, the names below
+%D match those of cm-super (\type {0NNN} instead of \type
+%D {NNN}, i.e.\ four digit numbers).
+
+\starttypescript [serif] [computer-modern] [cyr]
+ \definefontsynonym [cmb10] [wcmb10] [encoding=t2a]
+ \definefontsynonym [cmbsy10] [wcmbsy10] [encoding=t2a]
+ \definefontsynonym [cmbx10] [wcmbx10] [encoding=t2a]
+ \definefontsynonym [cmbx12] [wcmbx12] [encoding=t2a]
+ \definefontsynonym [cmbx5] [wcmbx5] [encoding=t2a]
+ \definefontsynonym [cmbx6] [wcmbx6] [encoding=t2a]
+ \definefontsynonym [cmbx7] [wcmbx7] [encoding=t2a]
+ \definefontsynonym [cmbx8] [wcmbx8] [encoding=t2a]
+ \definefontsynonym [cmbx9] [wcmbx9] [encoding=t2a]
+ \definefontsynonym [cmbxsl10] [wcmbxsl10] [encoding=t2a]
+ \definefontsynonym [cmbxti10] [wcmbxti10] [encoding=t2a]
+ \definefontsynonym [cmcsc10] [wcmcsc10] [encoding=t2a]
+ %definefontsynonym [cmdunh10] [wcmdunh10] [encoding=t2a]
+ \definefontsynonym [cminch] [wcminch] [encoding=t2a]
+ \definefontsynonym [cmr10] [wcmr10] [encoding=t2a]
+ \definefontsynonym [cmr12] [wcmr12] [encoding=t2a]
+ \definefontsynonym [cmr17] [wcmr17] [encoding=t2a]
+ \definefontsynonym [cmr5] [wcmr5] [encoding=t2a]
+ \definefontsynonym [cmr6] [wcmr6] [encoding=t2a]
+ \definefontsynonym [cmr7] [wcmr7] [encoding=t2a]
+ \definefontsynonym [cmr8] [wcmr8] [encoding=t2a]
+ \definefontsynonym [cmr9] [wcmr9] [encoding=t2a]
+ \definefontsynonym [cmsl10] [wcmsl10] [encoding=t2a]
+ \definefontsynonym [cmsl12] [wcmsl12] [encoding=t2a]
+ \definefontsynonym [cmsl8] [wcmsl8] [encoding=t2a]
+ \definefontsynonym [cmsl9] [wcmsl9] [encoding=t2a]
+ \definefontsynonym [cmti10] [wcmti10] [encoding=t2a]
+ \definefontsynonym [cmti12] [wcmti12] [encoding=t2a]
+ \definefontsynonym [cmti7] [wcmti7] [encoding=t2a]
+ \definefontsynonym [cmti8] [wcmti8] [encoding=t2a]
+ \definefontsynonym [cmti9] [wcmti9] [encoding=t2a]
+ \definefontsynonym [cmu10] [wcmu10] [encoding=t2a]
+\stoptypescript
+
+\starttypescript [sans] [computer-modern] [cyr]
+ \definefontsynonym [cmss10] [wcmss10] [encoding=t2a]
+ \definefontsynonym [cmss12] [wcmss12] [encoding=t2a]
+ \definefontsynonym [cmss17] [wcmss17] [encoding=t2a]
+ \definefontsynonym [cmss8] [wcmss8] [encoding=t2a]
+ \definefontsynonym [cmss9] [wcmss9] [encoding=t2a]
+ %definefontsynonym [cmssbi10] [wcmssbi10] [encoding=t2a]
+ \definefontsynonym [cmssbx10] [wcmssbx10] [encoding=t2a]
+ \definefontsynonym [cmssdc10] [wcmssdc10] [encoding=t2a]
+ \definefontsynonym [cmssi10] [wcmssi10] [encoding=t2a]
+ \definefontsynonym [cmssi12] [wcmssi12] [encoding=t2a]
+ \definefontsynonym [cmssi17] [wcmssi17] [encoding=t2a]
+ \definefontsynonym [cmssi8] [wcmssi8] [encoding=t2a]
+ \definefontsynonym [cmssi9] [wcmssi9] [encoding=t2a]
+ \definefontsynonym [cmssq8] [wcmssq8] [encoding=t2a]
+ \definefontsynonym [cmssqi8] [wcmssqi8] [encoding=t2a]
+\stoptypescript
+
+\starttypescript [mono] [computer-modern] [cyr]
+ \definefontsynonym [cmitt10] [wcmitt10] [encoding=t2a]
+ \definefontsynonym [cmsltt10] [wcmsltt10] [encoding=t2a]
+ \definefontsynonym [cmtt10] [wcmtt10] [encoding=t2a]
+ \definefontsynonym [cmtt12] [wcmtt12] [encoding=t2a]
+ \definefontsynonym [cmtt8] [wcmtt8] [encoding=t2a]
+ \definefontsynonym [cmtt9] [wcmtt9] [encoding=t2a]
+ %definefontsynonym [cmvtt10] [wcmvtt10] [encoding=t2a]
+\stoptypescript
+
+\definetypescriptprefix [c:t2a] [la]
+\definetypescriptprefix [c:t2b] [lb]
+\definetypescriptprefix [c:t2c] [lc]
+\definetypescriptprefix [c:x2] [rx]
+
+\starttypescript [all] [computer-modern] [t2a,t2b,t2c,x2]
+ \loadmapfile[subset-cmsuper-\typescriptthree.map]
+ \loadmapfile[subset-cmsuper-\typescriptthree.map]
+ \loadmapfile[cm-super-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [cmb10] [\typescriptprefix{c:\typescriptthree}rb1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx10] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx12] [\typescriptprefix{c:\typescriptthree}bx1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx5] [\typescriptprefix{c:\typescriptthree}bx0500] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx6] [\typescriptprefix{c:\typescriptthree}bx0600] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx7] [\typescriptprefix{c:\typescriptthree}bx0700] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx8] [\typescriptprefix{c:\typescriptthree}bx0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmbx9] [\typescriptprefix{c:\typescriptthree}bx0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmbxsl10] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmbxti10] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmcsc10] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmdunh10] [\typescriptprefix{c:\typescriptthree}dh1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmff10] [\typescriptprefix{c:\typescriptthree}ff1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmfi10] [\typescriptprefix{c:\typescriptthree}fi1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmfib8] [\typescriptprefix{c:\typescriptthree}fb0800] [encoding=\typescriptthree]
+ %\definefontsynonym [cminch] [\typescriptprefix{c:\typescriptthree}inch00] [encoding=\typescriptthree]
+ \definefontsynonym [cmr10] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmr12] [\typescriptprefix{c:\typescriptthree}rm1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmr17] [\typescriptprefix{c:\typescriptthree}rm1700] [encoding=\typescriptthree]
+ \definefontsynonym [cmr5] [\typescriptprefix{c:\typescriptthree}rm0500] [encoding=\typescriptthree]
+ \definefontsynonym [cmr6] [\typescriptprefix{c:\typescriptthree}rm0600] [encoding=\typescriptthree]
+ \definefontsynonym [cmr7] [\typescriptprefix{c:\typescriptthree}rm0700] [encoding=\typescriptthree]
+ \definefontsynonym [cmr8] [\typescriptprefix{c:\typescriptthree}rm0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmr9] [\typescriptprefix{c:\typescriptthree}rm0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl10] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl12] [\typescriptprefix{c:\typescriptthree}sl1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl8] [\typescriptprefix{c:\typescriptthree}sl0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmsl9] [\typescriptprefix{c:\typescriptthree}sl0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmtcsc10] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmti10] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmti12] [\typescriptprefix{c:\typescriptthree}ti1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmti7] [\typescriptprefix{c:\typescriptthree}ti0700] [encoding=\typescriptthree]
+ \definefontsynonym [cmti8] [\typescriptprefix{c:\typescriptthree}ti0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmti9] [\typescriptprefix{c:\typescriptthree}ti0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmu10] [\typescriptprefix{c:\typescriptthree}ui1000] [encoding=\typescriptthree]
+\stoptypescript
+
+\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [cmss10] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmss12] [\typescriptprefix{c:\typescriptthree}ss1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmss17] [\typescriptprefix{c:\typescriptthree}ss1700] [encoding=\typescriptthree]
+ \definefontsynonym [cmss8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmss9] [\typescriptprefix{c:\typescriptthree}ss0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmssbx10] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree]
+ %\definefontsynonym [cmssdc10] [\typescriptprefix{c:\typescriptthree}ssdc1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi10] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi12] [\typescriptprefix{c:\typescriptthree}si1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi17] [\typescriptprefix{c:\typescriptthree}si1700] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmssi9] [\typescriptprefix{c:\typescriptthree}si0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmssq8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmssqi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree]
+\stoptypescript
+
+\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [cmitt10] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmsltt10] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt10] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt12] [\typescriptprefix{c:\typescriptthree}tt1200] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt8] [\typescriptprefix{c:\typescriptthree}tt0800] [encoding=\typescriptthree]
+ \definefontsynonym [cmtt9] [\typescriptprefix{c:\typescriptthree}tt0900] [encoding=\typescriptthree]
+ \definefontsynonym [cmvtt10] [\typescriptprefix{c:\typescriptthree}vt1000] [encoding=\typescriptthree]
+\stoptypescript
+
+\starttypescript [serif] [computer-modern] [lcy]
+ \definefontsynonym [cmb10] [lhb10] [encoding=lcy]
+ \definefontsynonym [cmbx10] [lhbx10] [encoding=lcy]
+ \definefontsynonym [cmbx12] [lhbx12] [encoding=lcy]
+ \definefontsynonym [cmbx5] [lhbx5] [encoding=lcy]
+ \definefontsynonym [cmbx6] [lhbx6] [encoding=lcy]
+ \definefontsynonym [cmbx7] [lhbx7] [encoding=lcy]
+ \definefontsynonym [cmbx8] [lhbx8] [encoding=lcy]
+ \definefontsynonym [cmbx9] [lhbx9] [encoding=lcy]
+ \definefontsynonym [cmbxsl10] [lhbxsl10] [encoding=lcy]
+ \definefontsynonym [cmbxti10] [lhbxti10] [encoding=lcy]
+ \definefontsynonym [cmcsc10] [lhcsc10] [encoding=lcy]
+ \definefontsynonym [cmdunh10] [lhdunh10] [encoding=lcy]
+ \definefontsynonym [cmff10] [lhff10] [encoding=lcy]
+ \definefontsynonym [cmfi10] [lhfi10] [encoding=lcy]
+ \definefontsynonym [cmfib8] [lhfib8] [encoding=lcy]
+ \definefontsynonym [cminch] [lhinch] [encoding=lcy]
+ \definefontsynonym [cmr10] [lhr10] [encoding=lcy]
+ \definefontsynonym [cmr12] [lhr12] [encoding=lcy]
+ \definefontsynonym [cmr17] [lhr17] [encoding=lcy]
+ \definefontsynonym [cmr5] [lhr5] [encoding=lcy]
+ \definefontsynonym [cmr6] [lhr6] [encoding=lcy]
+ \definefontsynonym [cmr7] [lhr7] [encoding=lcy]
+ \definefontsynonym [cmr8] [lhr8] [encoding=lcy]
+ \definefontsynonym [cmr9] [lhr9] [encoding=lcy]
+ \definefontsynonym [cmsl10] [lhsl10] [encoding=lcy]
+ \definefontsynonym [cmsl12] [lhsl12] [encoding=lcy]
+ \definefontsynonym [cmsl8] [lhsl8] [encoding=lcy]
+ \definefontsynonym [cmsl9] [lhsl9] [encoding=lcy]
+ \definefontsynonym [cmtcsc10] [lhtcsc10] [encoding=lcy]
+ \definefontsynonym [cmtex10] [lhtex10] [encoding=lcy]
+ \definefontsynonym [cmtex8] [lhtex8] [encoding=lcy]
+ \definefontsynonym [cmtex9] [lhtex9] [encoding=lcy]
+ \definefontsynonym [cmti10] [lhti10] [encoding=lcy]
+ \definefontsynonym [cmti12] [lhti12] [encoding=lcy]
+ \definefontsynonym [cmti7] [lhti7] [encoding=lcy]
+ \definefontsynonym [cmti8] [lhti8] [encoding=lcy]
+ \definefontsynonym [cmti9] [lhti9] [encoding=lcy]
+ \definefontsynonym [cmu10] [lhu10] [encoding=lcy]
+\stoptypescript
+
+\starttypescript [sans] [computer-modern] [lcy]
+ \definefontsynonym [cmss10] [lhss10] [encoding=lcy]
+ \definefontsynonym [cmss12] [lhss12] [encoding=lcy]
+ \definefontsynonym [cmss17] [lhss17] [encoding=lcy]
+ \definefontsynonym [cmss8] [lhss8] [encoding=lcy]
+ \definefontsynonym [cmss9] [lhss9] [encoding=lcy]
+ \definefontsynonym [cmssbi10] [lhssbi10] [encoding=lcy]
+ \definefontsynonym [cmssbx10] [lhssbx10] [encoding=lcy]
+ \definefontsynonym [cmssdc10] [lhssdc10] [encoding=lcy]
+ \definefontsynonym [cmssi10] [lhssi10] [encoding=lcy]
+ \definefontsynonym [cmssi12] [lhssi12] [encoding=lcy]
+ \definefontsynonym [cmssi17] [lhssi17] [encoding=lcy]
+ \definefontsynonym [cmssi8] [lhssi8] [encoding=lcy]
+ \definefontsynonym [cmssi9] [lhssi9] [encoding=lcy]
+ \definefontsynonym [cmssq8] [lhssq8] [encoding=lcy]
+ \definefontsynonym [cmssqi8] [lhssqi8] [encoding=lcy]
+\stoptypescript
+
+\starttypescript [mono] [computer-modern] [lcy]
+ \definefontsynonym [cmitt10] [lhitt10] [encoding=lcy]
+ \definefontsynonym [cmsltt10] [lhsltt10] [encoding=lcy]
+ \definefontsynonym [cmtt10] [lhtt10] [encoding=lcy]
+ \definefontsynonym [cmtt12] [lhtt12] [encoding=lcy]
+ \definefontsynonym [cmtt8] [lhtt8] [encoding=lcy]
+ \definefontsynonym [cmtt9] [lhtt9] [encoding=lcy]
+ \definefontsynonym [cmvtt10] [lhvtt10] [encoding=lcy]
+\stoptypescript
+
+%
+
+\starttypescript [math] [modern,computer-modern,latin-modern] % [default]
+ % watch the space, it prevents remapping
+ \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10]% [lmr10 ]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic] [lmmi10]
+ \definefontsynonym [ComputerModernMath-Symbol] [lmsy10]
+\stoptypescript
+
+\starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] % [default]
+ % watch the space, it prevents remapping
+ \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10] % [lmb10 ]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10]
+ \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10]
+\stoptypescript
+
+% Till we have cyrilic in lm:
+
+% \usetypescript[modern-base][t2a]
+% \setupbodyfont[modern,10pt]
+
+\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [ComputerModern] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModern-Italic] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModern-Slanted] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModern-Bold] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModern-BoldItalic] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModern-BoldSlanted] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModern-Caps] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModern-CapsSlanted] [\typescriptprefix{c:\typescriptthree}sc1000] [encoding=\typescriptthree]
+\stoptypescript
+
+\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [ComputerModernSans] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernSans-Italic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModernSans-Slanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModernSans-Bold] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernSans-BoldItalic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModernSans-BoldSlanted] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernSans-Caps] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernSans-CapsSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+\stoptypescript
+
+\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2]
+ \definefontsynonym [ComputerModernMono] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModernMono-Italic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModernMono-Slanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernMono-Bold] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernMono-BoldItalic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernMono-BoldSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+ \definefontsynonym [ComputerModernMono-Caps] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree]
+ %definefontsynonym [ComputerModernMono-CapsSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree]
+\stoptypescript
+
+% Computer Concrete (AMS)
+
+\starttypescript [serif] [concrete] [default]
+ \definefontsynonym [ComputerConcrete] [ccr10]
+ \definefontsynonym [ComputerConcrete-Italic] [ccti10]
+ \definefontsynonym [ComputerConcrete-Slanted] [ccsl10]
+ \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete]
+ \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [ComputerConcrete-Caps] [cccsc10]
+\stoptypescript
+
+% Euler (AMS)
+
+\starttypescript [math] [euler] [default]
+ \definefontsynonym [Euler-Roman] [zeurm10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol] [zeusm10]
+ \definefontsynonym [Euler-Fraktur] [eufm10]
+
+ \loadmapfile[original-ams-euler.map]
+\stoptypescript
+
+\starttypescript [boldmath,bfmath] [euler] [default]
+ \definefontsynonym [Euler-Roman-Bold] [zeurb10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol-Bold] [zeusb10]
+ \definefontsynonym [Euler-Fraktur-Bold] [eufb10]
+
+ \loadmapfile[original-ams-euler.map]
+\stoptypescript
+
+% AMS (AMS)
+
+\starttypescript [math] [modern,computer-modern,latin-modern,ams] [default]
+ \definefontsynonym [AMS-SymbolA] [msam10]
+ \definefontsynonym [AMS-SymbolB] [msbm10]
+\stoptypescript
+
+% Fourier (Utopia)
+
+\starttypescript [math] [fourier] [default,ec]
+ \definefontsynonym [Fourier-Math-Letters] [futr8t] [encoding=ec]
+ %definefontsynonym [Fourier-Math-Letters] [futmi]
+ \definefontsynonym [Fourier-Math-Letters-Italic] [futmii]
+ \definefontsynonym [Fourier-Math-Symbols] [futsy]
+ \definefontsynonym [Fourier-Math-Extension] [fourier-mex]
+
+ \loadmapfile[fourier.map]
+\stoptypescript
+
+\starttypescript [serif] [fourier] [ec]
+ \definefontsynonym [Fourier-Regular] [futr8t] [encoding=ec]
+ \definefontsynonym [Fourier-Slanted] [futro8t] [encoding=ec]
+ \definefontsynonym [Fourier-Italic] [futri8t] [encoding=ec]
+ \definefontsynonym [Fourier-RegularCaps] [futrc8t] [encoding=ec]
+ \definefontsynonym [Fourier-Bold] [futb8t] [encoding=ec]
+ \definefontsynonym [Fourier-BoldSlanted] [futbo8t] [encoding=ec]
+ \definefontsynonym [Fourier-BoldItalic] [futbi8t] [encoding=ec]
+ \definefontsynonym [Fourier-BoldCaps] [futbc8t] [encoding=ec]
+
+ \definefontsynonym [Fourier-Regular-Expert] [futr9e] [encoding=ec]
+ \definefontsynonym [Fourier-Slanted-Expert] [futro9e] [encoding=ec]
+ \definefontsynonym [Fourier-Italic-Expert] [futri9e] [encoding=ec]
+ \definefontsynonym [Fourier-RegularCaps-Expert] [futrc9e] [encoding=ec]
+ \definefontsynonym [Fourier-Semi-Expert] [futs9e] [encoding=ec]
+ \definefontsynonym [Fourier-SemiSlanted-Expert] [futso9e] [encoding=ec]
+ \definefontsynonym [Fourier-SemiItalic-Expert] [futsi9e] [encoding=ec]
+ \definefontsynonym [Fourier-SemiCaps-Expert] [futsc9e] [encoding=ec]
+ \definefontsynonym [Fourier-Bold-Expert] [futb9e] [encoding=ec]
+ \definefontsynonym [Fourier-BoldSlanted-Expert] [futbo9e] [encoding=ec]
+ \definefontsynonym [Fourier-BoldItalic-Expert] [futbi9e] [encoding=ec]
+ \definefontsynonym [Fourier-Black-Expert] [futc9e] [encoding=ec]
+
+ \definefontsynonym [Fourier-Regular-OldStyle] [futr9d] [encoding=ec]
+ \definefontsynonym [Fourier-Slanted-OldStyle] [futro9d] [encoding=ec]
+ \definefontsynonym [Fourier-Italic-OldStyle] [futri9d] [encoding=ec]
+ \definefontsynonym [Fourier-RegularCaps-OldStyle] [futrc9d] [encoding=ec]
+ \definefontsynonym [Fourier-Semi-OldStyle] [futs9d] [encoding=ec]
+ \definefontsynonym [Fourier-SemiSlanted-OldStyle] [futso9d] [encoding=ec]
+ \definefontsynonym [Fourier-SemiItalic-OldStyle] [futsi9d] [encoding=ec]
+ \definefontsynonym [Fourier-SemiCaps-OldStyle] [futsc9d] [encoding=ec]
+ \definefontsynonym [Fourier-Bold-OldStyle] [futb9d] [encoding=ec]
+ \definefontsynonym [Fourier-BoldSlanted-OldStyle] [futbo9d] [encoding=ec]
+ \definefontsynonym [Fourier-BoldItalic-OldStyle] [futbi9d] [encoding=ec]
+ \definefontsynonym [Fourier-Black-OldStyle] [futc9d] [encoding=ec]
+
+ \loadmapfile[fourier.map]
+ \loadmapfile[fourier-utopia-expert.map]
+\stoptypescript
+
+% Courier (URW)
+
+\starttypescript [mono] [courier] [qx]
+ \definefontsynonym [qx-ucrr8a] [qcrr] [encoding=qx]
+ \definefontsynonym [qx-ucrb8a] [qcrb] [encoding=qx]
+ \definefontsynonym [qx-ucrro8a] [qcrri] [encoding=qx]
+ \definefontsynonym [qx-ucrbo8a] [qcrbi] [encoding=qx]
+\stoptypescript
+
+\starttypescript [mono] [courier] [texnansi,ec,8r,t5]
+ \definefontsynonym [Courier] [\typescriptthree-ucrr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Courier-Bold] [\typescriptthree-ucrb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Courier-Oblique] [\typescriptthree-ucrro8a] [encoding=\typescriptthree]
+ \definefontsynonym [Courier-BoldOblique] [\typescriptthree-ucrbo8a] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-urw-courier.map]
+\stoptypescript
+
+% Helvetica (URW)
+
+\starttypescript [sans] [helvetica] [qx]
+ \definefontsynonym [qx-uhvr8a] [qhvr] [encoding=qx]
+ \definefontsynonym [qx-uhvri8a] [qhvri] [encoding=qx]
+ \definefontsynonym [qx-uhvro8a] [qhvri] [encoding=qx]
+ \definefontsynonym [qx-uhvb8a] [qhvb] [encoding=qx]
+ \definefontsynonym [qx-uhvbi8a] [qhvbi] [encoding=qx]
+ \definefontsynonym [qx-uhvbo8a] [qhvbi] [encoding=qx]
+\stoptypescript
+
+\starttypescript [sans] [helvetica] [texnansi,ec,8r,t5]
+ \definefontsynonym [Helvetica] [\typescriptthree-uhvr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-Italic] [\typescriptthree-uhvri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-Oblique] [\typescriptthree-uhvro8a] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-Bold] [\typescriptthree-uhvb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-BoldItalic] [\typescriptthree-uhvbi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Helvetica-BoldOblique] [\typescriptthree-uhvbo8a] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-urw-helvetica.map]
+\stoptypescript
+
+% Times Roman (URW)
+
+\starttypescript [serif] [times] [qx]
+ \definefontsynonym [qx-utmr8a] [qtmr] [encoding=qx]
+ \definefontsynonym [qx-utmri8a] [qtmri] [encoding=qx]
+ \definefontsynonym [qx-utmb8a] [qtmb] [encoding=qx]
+ \definefontsynonym [qx-utmbi8a] [qtmbi] [encoding=qx]
+ \definefontsynonym [qx-utmr8a-slanted-167] [qtmri] [encoding=qx]
+ \definefontsynonym [qx-utmb8a-slanted-167] [qtmbi] [encoding=qx]
+\stoptypescript
+
+\starttypescript [serif] [times] [texnansi,ec,8r,t5]
+ \definefontsynonym [Times-Roman] [\typescriptthree-utmr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Italic] [\typescriptthree-utmri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Bold] [\typescriptthree-utmb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Times-BoldItalic] [\typescriptthree-utmbi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Slanted] [\typescriptthree-utmr8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Times-BoldSlanted] [\typescriptthree-utmb8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Times-Caps] [Times-Roman]
+ \definefontsynonym [Times] [Times-Roman]
+
+ \loadmapfile[\typescriptthree-urw-times.map]
+\stoptypescript
+
+% Math Times (tx)
+
+\starttypescript [math] [times] [all]
+ \definefontsynonym [Times-Roman-Upright] [txr]
+ \definefontsynonym [Times-Roman-Italic] [txi]
+ \definefontsynonym [Times-Roman-Slanted] [txsl]
+ \definefontsynonym [Times-Roman-Caps] [txsc]
+ \definefontsynonym [Times-Companion-Upright] [tcxr]
+ \definefontsynonym [Times-Companion-Italic] [tcxi]
+ \definefontsynonym [Times-Companion-Slanted] [tcxsl]
+ \definefontsynonym [Times-Math-Italic] [txmi]
+ \definefontsynonym [Times-Math-Symbols] [txsy]
+ \definefontsynonym [Times-Math-Extension] [txex]
+ \definefontsynonym [Times-Math-SymbolsA] [txsya]
+ \definefontsynonym [Times-Math-SymbolsB] [txsyb]
+ \definefontsynonym [Times-Math-SymbolsC] [txsyc]
+ \definefontsynonym [Times-Math-Italic-A] [txmia]
+ \definefontsynonym [Times-Math-Extension-A] [txexa]
+
+ \loadmapfile[original-youngryu-tx.map]
+\stoptypescript
+
+% Antykwa Torunska (GUST)
+
+% \starttypescript [serif] [antykwa-torunska] [texnansi,ec,8r]
+% \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree]
+% \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree]
+% \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree]
+% \stoptypescript
+
+\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec,t2a,t2b,t2c,greek]
+ \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalic] [\typescriptthree-anttbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Light] [\typescriptthree-anttl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalic] [\typescriptthree-anttli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Medium] [\typescriptthree-anttm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalic] [\typescriptthree-anttmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBold] [\typescriptthree-anttcb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalic] [\typescriptthree-anttcbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLight] [\typescriptthree-anttcl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalic][\typescriptthree-anttcli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedium] [\typescriptthree-anttcm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalic] [\typescriptthree-anttcmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondRegular] [\typescriptthree-anttcr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalic] [\typescriptthree-anttcri] [encoding=\typescriptthree]
+
+ \loadmapfile[antt-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttbcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttlcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttlicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttmcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttrcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttricap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcbcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttclcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttclicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcmcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmicap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcrcap] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcricap] [encoding=\typescriptthree]
+
+ \loadmapfile[antt-\typescriptthree.map]
+\stoptypescript
+
+% duplicates ? ?
+% atl: no: fallbacks for the named variants
+
+\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c,greek]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree]
+
+ \loadmapfile[antt-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c]
+ \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree]
+
+ \loadmapfile[antt-\typescriptthree.map]
+\stoptypescript
+
+% mabye no -Regular etc
+% dunny reverse of condlight lightcond
+
+\starttypescript [math] [antykwa-torunska] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-RegularItalic] [mi-anttri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-light] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-cond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegularItalic] [mi-anttcri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-lightcond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [default]
+ \loadmapfile[antt-rm.map]
+ \loadmapfile[antt-mi.map]
+ \loadmapfile[antt-sy.map]
+ \loadmapfile[antt-ex.map]
+\stoptypescript
+
+% Antykwa Poltawskiego (GUST)
+
+\starttypescript [serif] [antykwa-poltawskiego] [texnansi,ec,8r]
+ \definefontsynonym [AntykwaPoltawskiego-Regular] [\typescriptthree-antpr] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Bold] [\typescriptthree-antpb] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-Italic] [\typescriptthree-antpri] [encoding=\typescriptthree]
+ \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\typescriptthree-antpbi] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-public-antp.map]
+\stoptypescript
+
+% Iwona (JMN)
+
+% maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic
+
+\starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond] [texnansi,ec,el,qx,t5]
+ \definefontsynonym[Iwona-Light] [\typescriptthree-iwonal] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Regular] [\typescriptthree-iwonar] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Medium] [\typescriptthree-iwonam] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Bold] [\typescriptthree-iwonab] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-Heavy] [\typescriptthree-iwonah] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-LightItalic] [\typescriptthree-iwonali] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-RegularItalic] [\typescriptthree-iwonari] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-MediumItalic] [\typescriptthree-iwonami] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-BoldItalic] [\typescriptthree-iwonabi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-HeavyItalic] [\typescriptthree-iwonahi] [encoding=\typescriptthree]
+
+ \definefontsynonym[Iwona-CapsLight] [\typescriptthree-iwonalcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsRegular] [\typescriptthree-iwonarcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsMedium] [\typescriptthree-iwonamcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsBold] [\typescriptthree-iwonabcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsHeavy] [\typescriptthree-iwonahcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsLightItalic] [\typescriptthree-iwonalicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsRegularItalic] [\typescriptthree-iwonaricap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsMediumItalic] [\typescriptthree-iwonamicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsBoldItalic] [\typescriptthree-iwonabicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CapsHeavyItalic] [\typescriptthree-iwonahicap] [encoding=\typescriptthree]
+
+ \definefontsynonym[Iwona-CondLight] [\typescriptthree-iwonacl] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondRegular] [\typescriptthree-iwonacr] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondMedium] [\typescriptthree-iwonacm] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondBold] [\typescriptthree-iwonacb] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondHeavy] [\typescriptthree-iwonach] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondLightItalic] [\typescriptthree-iwonacli] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondRegularItalic] [\typescriptthree-iwonacri] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondMediumItalic] [\typescriptthree-iwonacmi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondBoldItalic] [\typescriptthree-iwonacbi] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondHeavyItalic] [\typescriptthree-iwonachi] [encoding=\typescriptthree]
+
+ \definefontsynonym[Iwona-CondCapsLight] [\typescriptthree-iwonaclcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsRegular] [\typescriptthree-iwonacrcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsMedium] [\typescriptthree-iwonacmcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsBold] [\typescriptthree-iwonacbcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsHeavy] [\typescriptthree-iwonachcap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsLightItalic] [\typescriptthree-iwonaclicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsRegularItalic] [\typescriptthree-iwonacricap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsMediumItalic] [\typescriptthree-iwonacmicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsBoldItalic] [\typescriptthree-iwonacbicap] [encoding=\typescriptthree]
+ \definefontsynonym[Iwona-CondCapsHeavyItalic] [\typescriptthree-iwonachicap] [encoding=\typescriptthree]
+
+ \loadmapfile[iwona-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [math] [iwona] [default]
+ \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar]
+ \definefontsynonym [Iwona-Math-Letters-RegularItalic] [mi-iwonari]
+ \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz]
+ \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar]
+\stoptypescript
+
+\starttypescript [math] [iwona-light] [default]
+ \definefontsynonym [Iwona-Math-Letters-Light] [rm-iwonal]
+ \definefontsynonym [Iwona-Math-Letters-LightItalic] [mi-iwonali]
+ \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz]
+ \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal]
+\stoptypescript
+
+\starttypescript [math] [iwona-medium] [default]
+ \definefontsynonym [Iwona-Math-Letters-Medium] [rm-iwonam]
+ \definefontsynonym [Iwona-Math-Letters-MediumItalic] [mi-iwonami]
+ \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz]
+ \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam]
+\stoptypescript
+
+\starttypescript [math] [iwona-heavy] [default]
+ \definefontsynonym [Iwona-Math-Letters-Heavy] [rm-iwonah]
+ \definefontsynonym [Iwona-Math-Letters-HeavyItalic] [mi-iwonahi]
+ \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz]
+ \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah]
+\stoptypescript
+
+\starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default]
+ \loadmapfile[iwona-rm.map]
+ \loadmapfile[iwona-mi.map]
+ \loadmapfile[iwona-sy.map]
+ \loadmapfile[iwona-ex.map]
+\stoptypescript
+
+% Kurier (JMN)
+
+\starttypescript [sans] [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5]
+ \definefontsynonym[Kurier-Light] [\typescriptthree-kurierl] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Regular] [\typescriptthree-kurierr] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Medium] [\typescriptthree-kurierm] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Bold] [\typescriptthree-kurierb] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-Heavy] [\typescriptthree-kurierh] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-LightItalic] [\typescriptthree-kurierli] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-RegularItalic] [\typescriptthree-kurierri] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-MediumItalic] [\typescriptthree-kuriermi] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-BoldItalic] [\typescriptthree-kurierbi] [encoding=\typescriptthree]
+ \definefontsynonym[Kurier-HeavyItalic] [\typescriptthree-kurierhi] [encoding=\typescriptthree]
+
+ \loadmapfile[kurier-\typescriptthree.map]
+\stoptypescript
+
+\starttypescript [math] [kurier] [default]
+ \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr]
+ \definefontsynonym [Kurier-Math-Letters-RegularItalic] [mi-kurierri]
+ \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz]
+ \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr]
+\stoptypescript
+
+\starttypescript [math] [kurier-light] [default]
+ \definefontsynonym [Kurier-Math-Letters-Light] [rm-kurierl]
+ \definefontsynonym [Kurier-Math-Letters-LightItalic] [mi-kurierli]
+ \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz]
+ \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl]
+\stoptypescript
+
+\starttypescript [math] [kurier-medium] [default]
+ \definefontsynonym [Kurier-Math-Letters-Medium] [rm-kurierm]
+ \definefontsynonym [Kurier-Math-Letters-MediumItalic] [mi-kuriermi]
+ \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz]
+ \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm]
+\stoptypescript
+
+\starttypescript [math] [kurier,kurier-light,kurier-medium] [default]
+ \loadmapfile[kurier-rm.map]
+ \loadmapfile[kurier-mi.map]
+ \loadmapfile[kurier-sy.map]
+ \loadmapfile[kurier-ex.map]
+\stoptypescript
+
+% Palatino (URW)
+
+\starttypescript [serif] [palatino] [qx]
+ \definefontsynonym [qx-uplr8a] [qplr] [encoding=qx]
+ \definefontsynonym [qx-uplri8a] [qplri] [encoding=qx]
+ \definefontsynonym [qx-uplb8a] [qplb] [encoding=qx]
+ \definefontsynonym [qx-uplbi8a] [qplbi] [encoding=qx]
+ \definefontsynonym [qx-uplr8a-slanted-167] [qplri] [encoding=qx]
+ \definefontsynonym [qx-uplb8a-slanted-167] [qplbi] [encoding=qx]
+ \definefontsynonym [qx-uplr8a-capitalized-800] [qplr] [encoding=qx]
+\stoptypescript
+
+\starttypescript [serif] [palatino] [texnansi,ec,8r,t5]
+ \definefontsynonym [Palatino] [\typescriptthree-uplr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-Italic] [\typescriptthree-uplri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-Bold] [\typescriptthree-uplb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-BoldItalic] [\typescriptthree-uplbi8a] [encoding=\typescriptthree]
+
+ \definefontsynonym [Palatino-Slanted] [\typescriptthree-uplr8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-BoldSlanted] [\typescriptthree-uplb8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Palatino-Caps] [\typescriptthree-uplr8a-capitalized-800] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-urw-palatino.map]
+\stoptypescript
+
+% bonus definitions
+
+% when these fonts are in tex live ...
+%
+% \definefontsynonym [Palatino-Caps] [TeXPalladioL-SC] [encoding=\typescriptthree]
+
+\starttypescript [serif] [palatino] [ec,texnansi,8r]
+
+ \definefontsynonym[TeXPalladioL-BoldItalicOsF][\typescriptthree-fplbij8a][encoding=\typescriptthree]
+ \definefontsynonym[TeXPalladioL-BoldOsF] [\typescriptthree-fplbj8a] [encoding=\typescriptthree]
+ \definefontsynonym[TeXPalladioL-SC] [\typescriptthree-fplrc8a] [encoding=\typescriptthree]
+ \definefontsynonym[TeXPalladioL-ItalicOsF] [\typescriptthree-fplrij8a][encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-urw-palatino.map]
+\stoptypescript
+
+% Palatino Math (PX)
+
+\starttypescript [math] [palatino] [all]
+ \definefontsynonym [Palatino-Roman-Upright] [pxr]
+ \definefontsynonym [Palatino-Roman-Italic] [pxi]
+ \definefontsynonym [Palatino-Roman-Slanted] [pxsl]
+ \definefontsynonym [Palatino-Roman-Caps] [pxsc]
+ \definefontsynonym [Palatino-Companion-Upright] [pcxr]
+ \definefontsynonym [Palatino-Companion-Italic] [pcxi]
+ \definefontsynonym [Palatino-Companion-Slanted] [pcxsl]
+ \definefontsynonym [Palatino-Math-Italic] [pxmi]
+ \definefontsynonym [Palatino-Math-Symbols] [pxsy]
+ \definefontsynonym [Palatino-Math-Extension] [pxex]
+ \definefontsynonym [Palatino-Math-SymbolsA] [pxsya]
+ \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb]
+ \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc]
+ \definefontsynonym [Palatino-Math-Italic-A] [pxmia]
+ \definefontsynonym [Palatino-Math-Extension-A] [pxexa]
+
+ \loadmapfile[original-youngryu-px.map]
+\stoptypescript
+
+% Bookman (URW)
+
+
+\starttypescript [serif] [bookman] [qx]
+ \definefontsynonym [qx-ubkl8a] [qbkr] [encoding=qx]
+ \definefontsynonym [qx-ubkli8a] [qbkri] [encoding=qx]
+ \definefontsynonym [qx-ubkd8a] [qbkb] [encoding=qx]
+ \definefontsynonym [qx-ubkdi8a] [qbkbi] [encoding=qx]
+ \definefontsynonym [qx-ubkl8a-slanted-167] [qbkri] [encoding=qx]
+ \definefontsynonym [qx-ubkd8a-slanted-167] [qbkbi] [encoding=qx]
+ \definefontsynonym [qx-ubkl8a-capitalized-800] [qbkr] [encoding=qx]
+\stoptypescript
+
+\starttypescript [serif] [bookman] [ec,texnansi,8r,t5]
+ \definefontsynonym [Bookman-Light] [\typescriptthree-ubkl8a] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-LightItalic] [\typescriptthree-ubkli8a] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-DemiBold] [\typescriptthree-ubkd8a] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-DemiBoldItalic] [\typescriptthree-ubkdi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-LightSlanted] [\typescriptthree-ubkl8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-DemiBoldSlanted] [\typescriptthree-ubkd8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Bookman-Light-Caps] [\typescriptthree-ubkl8a-capitalized-800] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-urw-bookman.map]
+\stoptypescript
+
+% Chancery (URW)
+
+\starttypescript [calligraphy] [chancery] [qx]
+ \definefontsynonym [qx-uzcmi8a] [qzcmi] [encoding=qx]
+\stoptypescript
+
+\starttypescript [calligraphy] [chancery] [ec,texnansi,8r]
+ \definefontsynonym [Chancery] [\typescriptthree-uzcmi8a] [encoding=\typescriptthree]
+ \loadmapfile[\typescriptthree-urw-zapfchan.map]
+\stoptypescript
+
+% New Century Schoolbook (URW)
+
+\starttypescript [serif] [schoolbook] [ec,texnansi,8r,t5]
+ \definefontsynonym [Schoolbook-Roman] [\typescriptthree-uncr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-Italic] [\typescriptthree-uncri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-Bold] [\typescriptthree-uncb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-BoldItalic] [\typescriptthree-uncbi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-RomanSlanted] [\typescriptthree-uncr8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-BoldSlanted] [\typescriptthree-uncb8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Schoolbook-Roman-Caps] [\typescriptthree-uncr8a-capitalized-800] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-urw-ncntrsbk.map]
+\stoptypescript
+
+% Utopia (Adobe)
+
+\starttypescript [serif] [utopia] [ec,texnansi]
+ \definefontsynonym [Utopia-Regular] [\typescriptthree-putr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Italic] [\typescriptthree-putri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Bold] [\typescriptthree-putb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-BoldItalic] [\typescriptthree-putbi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Slanted] [\typescriptthree-putr8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-BoldSlanted] [\typescriptthree-putb8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Utopia-Regular-Caps][\typescriptthree-putr8a-capitalized-800] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-adobe-utopia.map]
+\stoptypescript
+
+% Charter (Bitstream)
+
+\starttypescript [serif] [charter] [ec,texnansi,8r]
+ \definefontsynonym [Charter-Roman] [\typescriptthree-bchr8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Italic] [\typescriptthree-bchri8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Bold] [\typescriptthree-bchb8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-BoldItalic] [\typescriptthree-bchbi8a] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Slanted] [\typescriptthree-bchr8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-BoldSlanted][\typescriptthree-bchb8a-slanted-167] [encoding=\typescriptthree]
+ \definefontsynonym [Charter-Roman-Caps] [\typescriptthree-bchr8a-capitalized-800] [encoding=\typescriptthree]
+
+ \loadmapfile[\typescriptthree-bitstrea-charter.map]
+\stoptypescript
+
+% Whatever else we need:
+
+\starttypescript
+ \definefontsynonym [ZapfDingbats] [uzdr]
+ \definefontsynonym [RalfSmithFormalScript] [rsfs10]
+ \definefontsynonym [MartinVogel] [fmvr8x]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-otf.tex b/tex/context/base/type-otf.tex
new file mode 100644
index 000000000..ee51c559c
--- /dev/null
+++ b/tex/context/base/type-otf.tex
@@ -0,0 +1,720 @@
+%D \module
+%D [ file=type-otf,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Opentype Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D Actually, \LUATEX\ does not need all these definitions since it can
+%D consult its database. However, here we use the names that we used
+%D in good old \TEX, and these may differ a bit. Here we also see
+%D some oldstyle definitions which normally are done with features.
+
+\starttypescriptcollection[examples]
+
+\starttypescript [fallback]
+ \definetypeface [] [rm] [serif] [modern] [computer-modern]
+ \definetypeface [] [ss] [sans] [modern] [computer-modern]
+ \definetypeface [] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [] [mm] [math] [modern] [computer-modern]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [modern]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern]
+ \definetypeface [modern] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [modern] [mm] [math] [modern] [computer-modern]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [modern-base]
+ \definetypeface [modern] [rm] [serif] [modern] [default]
+ \definetypeface [modern] [ss] [sans] [modern] [default]
+ \definetypeface [modern] [tt] [mono] [modern] [default]
+ \definetypeface [modern] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [postscript]
+ \definetypeface [postscript] [rm] [serif] [times] [default]
+ \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=.9]
+ \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1]
+ \definetypeface [postscript] [mm] [math] [times] [default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [times]
+ \definetypeface [times] [rm] [serif] [times] [default]
+ \definetypeface [times] [ss] [sans] [helvetica] [default] [rscale=0.9]
+ \definetypeface [times] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [times] [mm] [math] [times] [default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [palatino]
+ \definetypeface [palatino] [rm] [serif] [palatino] [default]
+ \definetypeface [palatino] [tt] [mono] [modern] [default] [rscale=1.075]
+ \definetypeface [palatino] [mm] [math] [palatino] [default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [modernvariable]
+ \definetypeface [modernvariable] [rm] [serif] [simple] [default]
+ \definetypeface [modernvariable] [ss] [sans] [modern] [default]
+ \definetypeface [modernvariable] [tt] [mono] [modern] [default]
+ \definetypeface [modernvariable] [mm] [math] [modern] [default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [antykwa-torunska]
+ \definetypeface[antykwa][rm][serif][antykwa-torunska] [default]
+ \definetypeface[antykwa][ss][sans] [modern] [default] [rscale=1.05]
+ \definetypeface[antykwa][tt][mono] [modern] [default] [rscale=1.1]
+ \definetypeface[antykwa][mm][math] [antykwa-torunska] [default]
+ \quittypescriptscanning
+\stoptypescript
+
+\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium]
+ \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default]
+ \definetypeface[\typescriptone][rm][serif][modern] [default]
+ \definetypeface[\typescriptone][tt][mono] [modern] [default]
+ \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][text=ss]
+ \quittypescriptscanning
+\stoptypescript
+
+\stoptypescriptcollection
+
+% if a fontname equals the filename, then use
+%
+% \setupfontsynonym [LMRoman10-DemiOblique] [features=default] % file is lowercase, so fails
+% \definefontsynonym [LMRoman10-DemiOblique] [name:LMRoman10-DemiOblique] [features=default]
+% \definefontsynonym [LMRoman10-DemiOblique] [lmroman10-demioblique] [features=default]
+
+\starttypescriptcollection[opentype]
+
+\starttypescript [serif] [modern,latin-modern]
+ \definefontsynonym [LMRoman10-DemiOblique] [lmroman10-demioblique] [features=default]
+ \definefontsynonym [LMRoman10-Bold] [lmroman10-bold] [features=default]
+ \definefontsynonym [LMRoman12-Bold] [lmroman12-bold] [features=default]
+ \definefontsynonym [LMRoman5-Bold] [lmroman5-bold] [features=default]
+ \definefontsynonym [LMRoman6-Bold] [lmroman6-bold] [features=default]
+ \definefontsynonym [LMRoman7-Bold] [lmroman7-bold] [features=default]
+ \definefontsynonym [LMRoman8-Bold] [lmroman8-bold] [features=default]
+ \definefontsynonym [LMRoman9-Bold] [lmroman9-bold] [features=default]
+ \definefontsynonym [LMRoman10-BoldItalic] [lmroman10-bolditalic] [features=default]
+ \definefontsynonym [LMRoman10-BoldOblique] [lmroman10-boldoblique] [features=default]
+ \definefontsynonym [LMRoman10-CapsRegular] [lmroman10-capsregular] [features=default]
+ \definefontsynonym [LMRoman10-CapsOblique] [lmroman10-capsoblique] [features=default]
+ \definefontsynonym [LMRoman10-Regular] [lmroman10-regular] [features=default]
+ \definefontsynonym [LMRoman12-Regular] [lmroman12-regular] [features=default]
+ \definefontsynonym [LMRoman17-Regular] [lmroman17-regular] [features=default]
+ \definefontsynonym [LMRoman5-Regular] [lmroman5-regular] [features=default]
+ \definefontsynonym [LMRoman6-Regular] [lmroman6-regular] [features=default]
+ \definefontsynonym [LMRoman7-Regular] [lmroman7-regular] [features=default]
+ \definefontsynonym [LMRoman8-Regular] [lmroman8-regular] [features=default]
+ \definefontsynonym [LMRoman9-Regular] [lmroman9-regular] [features=default]
+ \definefontsynonym [LMRoman10-Italic] [lmroman10-italic] [features=default]
+ \definefontsynonym [LMRoman12-Italic] [lmroman12-italic] [features=default]
+ \definefontsynonym [LMRoman7-Italic] [lmroman7-italic] [features=default]
+ \definefontsynonym [LMRoman8-Italic] [lmroman8-italic] [features=default]
+ \definefontsynonym [LMRoman9-Italic] [lmroman9-italic] [features=default]
+ \definefontsynonym [LMRoman10-Oblique] [lmroman10-oblique] [features=default]
+ \definefontsynonym [LMRoman12-Oblique] [lmroman12-oblique] [features=default]
+ \definefontsynonym [LMRoman17-Oblique] [lmroman17-oblique] [features=default]
+ \definefontsynonym [LMRoman8-Oblique] [lmroman8-oblique] [features=default]
+ \definefontsynonym [LMRoman9-Oblique] [lmroman9-oblique] [features=default]
+\stoptypescript
+
+\starttypescript [sans] [modern,latin-modern]
+ \definefontsynonym [LMSans10-Regular] [lmsans10-regular] [features=default]
+ \definefontsynonym [LMSans12-Regular] [lmsans12-regular] [features=default]
+ \definefontsynonym [LMSans17-Regular] [lmsans17-regular] [features=default]
+ \definefontsynonym [LMSans8-Regular] [lmsans8-regular] [features=default]
+ \definefontsynonym [LMSans9-Regular] [lmsans9-regular] [features=default]
+ \definefontsynonym [LMSans10-BoldOblique] [lmsans10-boldoblique] [features=default]
+ \definefontsynonym [LMSans10-Bold] [lmsans10-bold] [features=default]
+ \definefontsynonym [LMSans10-DemiCondensed] [lmsans10-demicondensed] [features=default]
+ \definefontsynonym [LMSans10-DemiCondensedOblique] [lmsans10-demicondensedoblique] [features=default]
+ \definefontsynonym [LMSans10-Oblique] [lmsans10-oblique] [features=default]
+ \definefontsynonym [LMSans12-Oblique] [lmsans12-oblique] [features=default]
+ \definefontsynonym [LMSans17-Oblique] [lmsans17-oblique] [features=default]
+ \definefontsynonym [LMSans8-Oblique] [lmsans8-oblique] [features=default]
+ \definefontsynonym [LMSans9-Oblique] [lmsans9-oblique] [features=default]
+ \definefontsynonym [LMSansQuotation8-Regular] [lmsansquotation8-regular] [features=default]
+ \definefontsynonym [LMSansQuotation8-BoldOblique] [lmsansquotation8-boldoblique] [features=default]
+ \definefontsynonym [LMSansQuotation8-Bold] [lmsansquotation8-bold] [features=default]
+ \definefontsynonym [LMSansQuotation8-Oblique] [lmsansquotation8-oblique] [features=default]
+\stoptypescript
+
+\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond]
+ \definefontsynonym [LMTypewriter10-CapsRegular] [lmtypewriter10-capsregular]
+ \definefontsynonym [LMTypewriter10-CapsOblique] [lmtypewriter10-capsoblique]
+ \definefontsynonym [LMTypewriter10-Light] [lmtypewriter10-light]
+ \definefontsynonym [LMTypewriter10-LightOblique] [lmtypewriter10-lightoblique]
+ \definefontsynonym [LMTypewriter10-LightCondensed] [lmtypewriter10-lightcondensed]
+ \definefontsynonym [LMTypewriter10-LightCondensedOblique] [lmtypewriter10-lightcondensedoblique]
+ \definefontsynonym [LMTypewriter10-Dark] [lmtypewriter10-dark]
+ \definefontsynonym [LMTypewriter10-DarkOblique] [lmtypewriter10-darkoblique]
+ \definefontsynonym [LMTypewriter10-Regular] [lmtypewriter10-regular]
+ \definefontsynonym [LMTypewriter12-Regular] [lmtypewriter12-regular]
+ \definefontsynonym [LMTypewriter8-Regular] [lmtypewriter8-regular]
+ \definefontsynonym [LMTypewriter9-Regular] [lmtypewriter9-regular]
+ \definefontsynonym [LMTypewriter10-Italic] [lmtypewriter10-italic]
+ \definefontsynonym [LMTypewriter10-Oblique] [lmtypewriter10-oblique]
+ \definefontsynonym [LMTypewriterVarWd10-Regular] [lmtypewritervarwd10-regular] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-Oblique] [lmtypewritervarwd10-oblique] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-Light] [lmtypewritervarwd10-light] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-LightOblique] [lmtypewritervarwd10-lightoblique] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-Dark] [lmtypewritervarwd10-dark] [features=default]
+ \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [lmtypewritervarwd10-darkoblique] [features=default]
+\stoptypescript
+
+\starttypescript [math] [modern,latin-modern]
+ \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5]
+ \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7]
+ \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10]
+ \definefontsynonym [LMMathSymbols5-Italic] [lmsy5]
+ \definefontsynonym [LMMathSymbols6-Italic] [lmsy6]
+ \definefontsynonym [LMMathSymbols7-Italic] [lmsy7]
+ \definefontsynonym [LMMathSymbols8-Italic] [lmsy8]
+ \definefontsynonym [LMMathSymbols9-Italic] [lmsy9]
+ \definefontsynonym [LMMathSymbols10-Italic] [lmsy10]
+ \definefontsynonym [LMMathExtension10-Regular] [lmex10]
+ \definefontsynonym [LMMathItalic5-Italic] [lmmi5]
+ \definefontsynonym [LMMathItalic6-Italic] [lmmi6]
+ \definefontsynonym [LMMathItalic7-Italic] [lmmi7]
+ \definefontsynonym [LMMathItalic8-Italic] [lmmi8]
+ \definefontsynonym [LMMathItalic9-Italic] [lmmi9]
+ \definefontsynonym [LMMathItalic10-Italic] [lmmi10]
+ \definefontsynonym [LMMathItalic12-Italic] [lmmi12]
+ \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5]
+ \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7]
+ \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10]
+
+ \loadmapfile[lm-math.map]
+ \loadmapfile[lm-rm.map]
+\stoptypescript
+
+\starttypescript [math] [modern,computer-modern,latin-modern]
+ % watch the space, it prevents remapping
+ \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic] [lmmi10]
+ \definefontsynonym [ComputerModernMath-Symbol] [lmsy10]
+\stoptypescript
+
+\starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern]
+ % watch the space, it prevents remapping
+ \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10]
+ \definefontsynonym [ComputerModernMath-Extension] [lmex10]
+ \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10]
+ \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10]
+\stoptypescript
+
+% Computer Concrete (AMS)
+
+\starttypescript [serif] [concrete]
+ \definefontsynonym [ComputerConcrete] [ccr10]
+ \definefontsynonym [ComputerConcrete-Italic] [ccti10]
+ \definefontsynonym [ComputerConcrete-Slanted] [ccsl10]
+ \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete]
+ \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [ComputerConcrete-Caps] [cccsc10]
+\stoptypescript
+
+% Euler (AMS)
+
+\starttypescript [math] [euler]
+ \definefontsynonym [Euler-Roman] [zeurm10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol] [zeusm10]
+ \definefontsynonym [Euler-Fraktur] [eufm10]
+
+ \loadmapfile[original-ams-euler.map]
+\stoptypescript
+
+\starttypescript [boldmath,bfmath] [euler]
+ \definefontsynonym [Euler-Roman-Bold] [zeurb10]
+ \definefontsynonym [Euler-Extension] [zeuex10]
+ \definefontsynonym [Euler-Symbol-Bold] [zeusb10]
+ \definefontsynonym [Euler-Fraktur-Bold] [eufb10]
+
+ \loadmapfile[original-ams-euler.map]
+\stoptypescript
+
+% AMS (AMS)
+
+\starttypescript [math] [modern,computer-modern,latin-modern,ams]
+ \definefontsynonym [AMS-SymbolA] [msam10]
+ \definefontsynonym [AMS-SymbolB] [msbm10]
+\stoptypescript
+
+% TeXGyre
+
+\definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [f:pagella] [pagella]
+\definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [f:termes] [termes]
+\definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [f:heros] [heros]
+\definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [f:bonum] [bonum]
+\definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [f:schola] [schola]
+\definetypescriptprefix [n:adventor][TeXGyreAdventor] \definetypescriptprefix [f:adventor][adventor]
+\definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [f:cursor] [cursor]
+\definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [f:chorus] [chorus] % not the full set
+
+\starttypescript [serif] [pagella,termes,heros,bonum,schola,adventor]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-regular] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-italic] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bold] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bolditalic] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-regular] [features=oldstyle]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-italic] [features=oldstyle]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bold] [features=oldstyle]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bolditalic] [features=oldstyle]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Slanted] [texgyre\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [texgyre\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+\stoptypescript
+
+\starttypescript [serif] [pagella,termes,bonum,schola,chorus] [name]
+ \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+ \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+ \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+ \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps]
+ \definefontsynonym [SerifSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] [features=default]
+ \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [features=default]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegular] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SerifRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps]
+ \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps]
+ \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] [features=smallcaps]
+ \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps]
+ \definefontsynonym [SerifCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps]
+ \definefontsynonym [SerifSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps]
+ \definefontsynonym [SerifBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps]
+\stoptypescript
+
+\starttypescript [sans] [heros,adventor] [name]
+ \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default]
+ \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default]
+ \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default]
+ \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps]
+ \definefontsynonym [SansSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] [features=default]
+ \definefontsynonym [SansBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [features=default]
+
+ \definefontvariant [Sans][osf][Caps]
+ \definefontvariant [Sans][sc] [Caps]
+
+ \definefontsynonym [SansRegular] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default]
+ \definefontsynonym [SansRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps]
+ \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps]
+ \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] [features=smallcaps]
+ \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps]
+ \definefontsynonym [SansCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps]
+ \definefontsynonym [SansSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps]
+ \definefontsynonym [SansBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps]
+\stoptypescript
+
+\starttypescript [sans] [cursor] [name]
+ \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular]
+ \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic]
+ \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold]
+ \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic]
+ \definefontsynonym [MonoSlanted] [MonoItalic]
+ \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic]
+\stoptypescript
+
+%D Here we overload the older (URW) fonts.
+
+% TeXGyrePagella
+%
+% qplr TeXGyrePagella-Regular
+% qplri TeXGyrePagella-Italic
+% qplb TeXGyrePagella-Bold
+% qplbi TeXGyrePagella-BoldItalic
+
+\starttypescript [serif] [palatino]
+ \definefontsynonym [Palatino] [texgyrepagella-regular] [features=default]
+ \definefontsynonym [Palatino-Italic] [texgyrepagella-italic] [features=default]
+ \definefontsynonym [Palatino-Bold] [texgyrepagella-bold] [features=default]
+ \definefontsynonym [Palatino-BoldItalic] [texgyrepagella-bolditalic] [features=default]
+ \definefontsynonym [Palatino-Caps] [texgyrepagella-regular] [features=smallcaps]
+ \definefontsynonym [Palatino-Slanted] [Palatino-Italic]
+ \definefontsynonym [Palatino-BoldSlanted] [Palatino-BoldItalic]
+\stoptypescript
+
+% TeXGyreTermes
+%
+% qtmr TeXGyreTermes-Regular
+% qtmri TeXGyreTermes-Italic
+% qtmb TeXGyreTermes-Bold
+% qtmbi TeXGyreTermes-BoldItalic
+
+\starttypescript [serif] [times]
+ \definefontsynonym [Times-Roman] [texgyretermes-regular] [features=default]
+ \definefontsynonym [Times-Italic] [texgyretermes-italic] [features=default]
+ \definefontsynonym [Times-Bold] [texgyretermes-bold] [features=default]
+ \definefontsynonym [Times-BoldItalic] [texgyretermes-bolditalic] [features=default]
+ \definefontsynonym [Times-Caps] [texgyretermes-regular] [features=smallcaps]
+ \definefontsynonym [Times-Slanted] [Times-Italic]
+ \definefontsynonym [Times-BoldSlanted] [Times-BoldItalic]
+\stoptypescript
+
+% TeXGyreHeros
+%
+% qtmr TeXGyreHeros-Regular
+% qtmri TeXGyreHeros-Italic
+% qtmb TeXGyreHeros-Bold
+% qtmbi TeXGyreHeros-BoldItalic
+
+\starttypescript [serif] [helvetica]
+ \definefontsynonym [Helvetica] [texgyreheros-regular] [features=default]
+ \definefontsynonym [Helvetica-Oblique] [texgyreheros-italic] [features=default]
+ \definefontsynonym [Helvetica-Bold] [texgyreheros-bold] [features=default]
+ \definefontsynonym [Helvetica-BoldOblique] [texgyreheros-bolditalic] [features=default]
+ \definefontsynonym [Helvetica-Caps] [texgyreheros-regular] [features=smallcaps]
+\stoptypescript
+
+% TeXGyreBonum
+%
+% qtmr TeXGyreBonum-Regular
+% qtmri TeXGyreBonum-Italic
+% qtmb TeXGyreBonum-Bold
+% qtmbi TeXGyreBonum-BoldItalic
+
+\starttypescript [serif] [bookman]
+ \definefontsynonym [Bookman-Light] [texgyrebonum-regular] [features=default]
+ \definefontsynonym [Bookman-LightItalic] [texgyrebonum-italic] [features=default]
+ \definefontsynonym [Bookman-DemiBold] [texgyrebonum-bold] [features=default]
+ \definefontsynonym [Bookman-DemiBoldItalic] [texgyrebonum-bolditalic] [features=default]
+ \definefontsynonym [Bookman-Light-Caps] [texgyrebonum-regular] [features=smallcaps]
+ \definefontsynonym [Bookman-LightSlanted] [Bookman-LightItalic] [features=default]
+ \definefontsynonym [Bookman-DemiBoldSlanted] [Bookman-DemiBoldItalic] [features=default]
+\stoptypescript
+
+% TeXGyreScola
+%
+% qcsr TeXGyreSchola-Regular
+% qcsri TeXGyreSchola-Italic
+% qcsb TeXGyreSchola-Bold
+% qcsbi TeXGyreSchola-BoldItalic
+
+\starttypescript [serif] [schoolbook]
+ \definefontsynonym [Schoolbook-Roman] [texgyreschola-regular] [features=default]
+ \definefontsynonym [Schoolbook-Italic] [texgyreschola-italic] [features=default]
+ \definefontsynonym [Schoolbook-Bold] [texgyreschola-bold] [features=default]
+ \definefontsynonym [Schoolbook-BoldItalic] [texgyreschola-bolditalic] [features=default]
+ \definefontsynonym [Schoolbook-Roman-Caps] [texgyreschola-regular] [features=smallcaps]
+ \definefontsynonym [Schoolbook-Slanted] [Schoolbook-Italic] [features=default]
+ \definefontsynonym [Schoolbook-BoldSlanted] [Schoolbook-BoldItalic] [features=default]
+\stoptypescript
+
+% TeXGyreAdventor
+%
+% qagr TeXGyreAdventor-Regular
+% qagri TeXGyreAdventor-Italic
+% qagb TeXGyreAdventor-Bold
+% qagbi TeXGyreAdventor-BoldItalic
+
+% TeXGyreCursor
+%
+% crgr TeXGyreCursor-Regular
+% crgri TeXGyreCursor-Italic
+% crgb TeXGyreCursor-Bold
+% crgbi TeXGyreCursor-BoldItalic
+
+\starttypescript [mono] [courier] [name]
+ \definefontsynonym [Courier] [texgyrecursor-regular] [features=default]
+ \definefontsynonym [Courier-Bold] [texgyrecursor-bold] [features=default]
+ \definefontsynonym [Courier-Oblique] [texgyrecursor-italic] [features=default]
+ \definefontsynonym [Courier-BoldOblique] [texgyrecursor-bolditalic] [features=default]
+ \fakecontrolspace
+\stoptypescript
+
+% TeXGyreChorus
+%
+% qzcr TeXGyreChorus-Regular
+
+\starttypescript [calligraphy] [chancery]
+ \definefontsynonym [Chancery] [texgyrechorus-regular] [features=default]
+\stoptypescript
+
+% Math Times (tx)
+
+\starttypescript [math] [times] [all]
+ \definefontsynonym [Times-Roman-Upright] [txr]
+ \definefontsynonym [Times-Roman-Italic] [txi]
+ \definefontsynonym [Times-Roman-Slanted] [txsl]
+ \definefontsynonym [Times-Roman-Caps] [txsc]
+ \definefontsynonym [Times-Companion-Upright] [tcxr]
+ \definefontsynonym [Times-Companion-Italic] [tcxi]
+ \definefontsynonym [Times-Companion-Slanted] [tcxsl]
+ \definefontsynonym [Times-Math-Italic] [txmi]
+ \definefontsynonym [Times-Math-Symbols] [txsy]
+ \definefontsynonym [Times-Math-Extension] [txex]
+ \definefontsynonym [Times-Math-SymbolsA] [txsya]
+ \definefontsynonym [Times-Math-SymbolsB] [txsyb]
+ \definefontsynonym [Times-Math-SymbolsC] [txsyc]
+ \definefontsynonym [Times-Math-Italic-A] [txmia]
+ \definefontsynonym [Times-Math-Extension-A] [txexa]
+
+ \loadmapfile[original-youngryu-tx.map]
+ \usemathcollection[default]
+\stoptypescript
+
+% Palatino Math (PX)
+
+\starttypescript [math] [palatino] [all]
+ \definefontsynonym [Palatino-Roman-Upright] [pxr]
+ \definefontsynonym [Palatino-Roman-Italic] [pxi]
+ \definefontsynonym [Palatino-Roman-Slanted] [pxsl]
+ \definefontsynonym [Palatino-Roman-Caps] [pxsc]
+ \definefontsynonym [Palatino-Companion-Upright] [pcxr]
+ \definefontsynonym [Palatino-Companion-Italic] [pcxi]
+ \definefontsynonym [Palatino-Companion-Slanted] [pcxsl]
+ \definefontsynonym [Palatino-Math-Italic] [pxmi]
+ \definefontsynonym [Palatino-Math-Symbols] [pxsy]
+ \definefontsynonym [Palatino-Math-Extension] [pxex]
+ \definefontsynonym [Palatino-Math-SymbolsA] [pxsya]
+ \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb]
+ \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc]
+ \definefontsynonym [Palatino-Math-Italic-A] [pxmia]
+ \definefontsynonym [Palatino-Math-Extension-A] [pxexa]
+
+ \loadmapfile[original-youngryu-px.map]
+ \usemathcollection[default]
+\stoptypescript
+
+% Antykwa Torunska (GUST)
+
+\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
+ \definefontsynonym [AntykwaTorunska-Bold] [AntykwaTorunska-Bold] [features=default]
+ \definefontsynonym [AntykwaTorunska-BoldItalic] [AntykwaTorunska-BoldItalic] [features=default]
+ \definefontsynonym [AntykwaTorunska-Light] [AntykwaTorunskaLight-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-LightItalic] [AntykwaTorunskaLight-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-Medium] [AntykwaTorunskaMed-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-MedItalic] [AntykwaTorunskaMed-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-Regular] [AntykwaTorunska-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-Italic] [AntykwaTorunska-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondBold] [AntykwaTorunskaCond-Bold] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalic] [AntykwaTorunskaCond-BoldItalic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondLight] [AntykwaTorunskaCondLight-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondLightItalic] [AntykwaTorunskaCondLight-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondMedium] [AntykwaTorunskaCondMed-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondMedItalic] [AntykwaTorunskaCondMed-Italic] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondRegular] [AntykwaTorunskaCond-Regular] [features=default]
+ \definefontsynonym [AntykwaTorunska-CondItalic] [AntykwaTorunskaCond-Italic] [features=default]
+
+ \definefontsynonym [AntykwaTorunska-BoldCap] [AntykwaTorunska-Bold] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-BoldItalicCap] [AntykwaTorunska-BoldItalic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-LightCap] [AntykwaTorunskaLight-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-LightItalicCap] [AntykwaTorunskaLight-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-MediumCap] [AntykwaTorunskaMed-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-MedItalicCap] [AntykwaTorunskaMed-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-Cap] [AntykwaTorunska-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-ItalicCap] [AntykwaTorunska-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondBoldCap] [AntykwaTorunskaCond-Bold] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [AntykwaTorunskaCond-BoldItalic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondLightCap] [AntykwaTorunskaCondLight-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondLightItalicCap][AntykwaTorunskaCondLight-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondMediumCap] [AntykwaTorunskaCondMed-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [AntykwaTorunskaCondMed-Italic] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondCap] [AntykwaTorunskaCond-Regular] [features=smallcaps]
+ \definefontsynonym [AntykwaTorunska-CondItalicCap] [AntykwaTorunskaCond-Italic] [features=smallcaps]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-RegularItalic] [mi-anttri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-light] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-cond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegularItalic] [mi-anttcri]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-lightcond] [default]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl]
+ \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli]
+ \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz]
+ \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
+ \usemathcollection[default]
+ \loadmapfile[antt-rm.map]
+ \loadmapfile[antt-mi.map]
+ \loadmapfile[antt-sy.map]
+ \loadmapfile[antt-ex.map]
+\stoptypescript
+
+% Antykwa Poltawskiego (GUST)
+
+\starttypescript [serif] [antykwa-poltawskiego]
+ \definefontsynonym [AntykwaPoltawskiego-Regular] [antpr]
+ \definefontsynonym [AntykwaPoltawskiego-Bold] [antpb]
+ \definefontsynonym [AntykwaPoltawskiego-Italic] [antpri]
+ \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [antpbi]
+\stoptypescript
+
+% Iwona (JMN)
+
+% maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic
+
+\starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond]
+ \definefontsynonym [Iwona-Regular] [Iwona-Regular] [features=default]
+ \definefontsynonym [Iwona-RegularItalic] [Iwona-Italic] [features=default]
+ \definefontsynonym [Iwona-Bold] [Iwona-Bold] [features=default]
+ \definefontsynonym [Iwona-BoldItalic] [Iwona-BoldItalic] [features=default]
+ \definefontsynonym [Iwona-Light] [IwonaLight-Regular] [features=default]
+ \definefontsynonym [Iwona-LightItalic] [IwonaLight-Italic] [features=default]
+ \definefontsynonym [Iwona-Medium] [IwonaMedium-Regular] [features=default]
+ \definefontsynonym [Iwona-MediumItalic] [IwonaMedium-Italic] [features=default]
+ \definefontsynonym [Iwona-Heavy] [IwonaHeavy-Regular] [features=default]
+ \definefontsynonym [Iwona-HeavyItalic] [IwonaHeavy-Italic] [features=default]
+
+ \definefontsynonym [Iwona-CondLight] [IwonaCond-Regular] [features=default]
+ \definefontsynonym [Iwona-CondRegular] [IwonaCond-Italic] [features=default]
+ \definefontsynonym [Iwona-CondMedium] [IwonaCond-Bold] [features=default]
+ \definefontsynonym [Iwona-CondBold] [IwonaCond-BoldItalic] [features=default]
+ \definefontsynonym [Iwona-CondHeavy] [IwonaCondLight-Regular] [features=default]
+ \definefontsynonym [Iwona-CondLightItalic] [IwonaCondLight-Italic] [features=default]
+ \definefontsynonym [Iwona-CondRegularItalic] [IwonaCondMedium-Regular] [features=default]
+ \definefontsynonym [Iwona-CondMediumItalic] [IwonaCondMedium-Italic] [features=default]
+ \definefontsynonym [Iwona-CondBoldItalic] [IwonaCondHeavy-Regular] [features=default]
+ \definefontsynonym [Iwona-CondHeavyItalic] [IwonaCondHeavy-Italic] [features=default]
+
+ \definefontsynonym [Iwona-CapsLight] [Iwona-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsRegular] [Iwona-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsMedium] [Iwona-Bold] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsBold] [Iwona-BoldItalic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsHeavy] [IwonaLight-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsLightItalic] [IwonaLight-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsRegularItalic] [IwonaMedium-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsMediumItalic] [IwonaMedium-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsBoldItalic] [IwonaHeavy-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CapsHeavyItalic] [IwonaHeavy-Italic] [features=smallcaps]
+
+ \definefontsynonym [Iwona-CondCapsLight] [IwonaCond-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsRegular] [IwonaCond-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsMedium] [IwonaCond-Bold] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsBold] [IwonaCond-BoldItalic] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsHeavy] [IwonaCondLight-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsLightItalic] [IwonaCondLight-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsRegularItalic] [IwonaCondMedium-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsMediumItalic] [IwonaCondMedium-Italic] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsBoldItalic] [IwonaCondHeavy-Regular] [features=smallcaps]
+ \definefontsynonym [Iwona-CondCapsHeavyItalic] [IwonaCondHeavy-Italic] [features=smallcaps]
+\stoptypescript
+
+\starttypescript [math] [iwona] [default]
+ \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar]
+ \definefontsynonym [Iwona-Math-Letters-RegularItalic] [mi-iwonari]
+ \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz]
+ \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar]
+\stoptypescript
+
+\starttypescript [math] [iwona-light] [default]
+ \definefontsynonym [Iwona-Math-Letters-Light] [rm-iwonal]
+ \definefontsynonym [Iwona-Math-Letters-LightItalic] [mi-iwonali]
+ \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz]
+ \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal]
+\stoptypescript
+
+\starttypescript [math] [iwona-medium] [default]
+ \definefontsynonym [Iwona-Math-Letters-Medium] [rm-iwonam]
+ \definefontsynonym [Iwona-Math-Letters-MediumItalic] [mi-iwonami]
+ \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz]
+ \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam]
+\stoptypescript
+
+\starttypescript [math] [iwona-heavy] [default]
+ \definefontsynonym [Iwona-Math-Letters-Heavy] [rm-iwonah]
+ \definefontsynonym [Iwona-Math-Letters-HeavyItalic] [mi-iwonahi]
+ \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz]
+ \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah]
+\stoptypescript
+
+\starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default]
+ \usemathcollection[default]
+ \loadmapfile[iwona-rm.map]
+ \loadmapfile[iwona-mi.map]
+ \loadmapfile[iwona-sy.map]
+ \loadmapfile[iwona-ex.map]
+\stoptypescript
+
+% Kurier (JMN) / no open type fonts
+
+\starttypescript [sans] [kurier-light,kurier,kurier-medium]
+ \definefontsynonym[Kurier-Light] [kurierl]
+ \definefontsynonym[Kurier-Regular] [kurierr]
+ \definefontsynonym[Kurier-Medium] [kurierm]
+ \definefontsynonym[Kurier-Bold] [kurierb]
+ \definefontsynonym[Kurier-Heavy] [kurierh]
+ \definefontsynonym[Kurier-LightItalic] [kurierli]
+ \definefontsynonym[Kurier-RegularItalic] [kurierri]
+ \definefontsynonym[Kurier-MediumItalic] [kuriermi]
+ \definefontsynonym[Kurier-BoldItalic] [kurierbi]
+ \definefontsynonym[Kurier-HeavyItalic] [kurierhi]
+\stoptypescript
+
+\starttypescript [math] [kurier] [default]
+ \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr]
+ \definefontsynonym [Kurier-Math-Letters-RegularItalic] [mi-kurierri]
+ \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz]
+ \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr]
+\stoptypescript
+
+\starttypescript [math] [kurier-light] [default]
+ \definefontsynonym [Kurier-Math-Letters-Light] [rm-kurierl]
+ \definefontsynonym [Kurier-Math-Letters-LightItalic] [mi-kurierli]
+ \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz]
+ \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl]
+\stoptypescript
+
+\starttypescript [math] [kurier-medium] [default]
+ \definefontsynonym [Kurier-Math-Letters-Medium] [rm-kurierm]
+ \definefontsynonym [Kurier-Math-Letters-MediumItalic] [mi-kuriermi]
+ \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz]
+ \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm]
+\stoptypescript
+
+\starttypescript [math] [kurier,kurier-light,kurier-medium] [default]
+ \loadmapfile[kurier-rm.map]
+ \loadmapfile[kurier-mi.map]
+ \loadmapfile[kurier-sy.map]
+ \loadmapfile[kurier-ex.map]
+\stoptypescript
+
+% Whatever else we need:
+
+\starttypescript
+ \definefontsynonym [ZapfDingbats] [uzdr]
+ \definefontsynonym [RalfSmithFormalScript] [rsfs10]
+ \definefontsynonym [MartinVogel] [fmvr8x]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-siz.tex b/tex/context/base/type-siz.tex
index 6a2e35b30..018f979bb 100644
--- a/tex/context/base/type-siz.tex
+++ b/tex/context/base/type-siz.tex
@@ -394,15 +394,18 @@
\starttypescript [math] [modern,computer-modern,latin-modern] [size]
- % hack to prevent mapping of filenames, watch the space!
-
- \definefontsynonym[xcmr12][cmr12 ]
- \definefontsynonym[xcmr10][cmr10 ]
- \definefontsynonym[xcmr9] [cmr9 ]
- \definefontsynonym[xcmr8] [cmr8 ]
- \definefontsynonym[xcmr7] [cmr7 ]
- \definefontsynonym[xcmr6] [cmr6 ]
- \definefontsynonym[xcmr5] [cmr5 ]
+ % hack to prevent mapping of filenames, watch the space! before
+ % latin modern came aroudn we needed this trick to make sure that
+ % we loaded the raw cmr12 etc instead of the ones mapped onto
+ % an encoding
+
+ % \definefontsynonym[xcmr12][cmr12 ]
+ % \definefontsynonym[xcmr10][cmr10 ]
+ % \definefontsynonym[xcmr9] [cmr9 ]
+ % \definefontsynonym[xcmr8] [cmr8 ]
+ % \definefontsynonym[xcmr7] [cmr7 ]
+ % \definefontsynonym[xcmr6] [cmr6 ]
+ % \definefontsynonym[xcmr5] [cmr5 ]
\definebodyfont [12pt] [mm]
[mr=xcmr12,
diff --git a/tex/context/base/type-syn.tex b/tex/context/base/type-syn.tex
index c5514c65f..b7e9335df 100644
--- a/tex/context/base/type-syn.tex
+++ b/tex/context/base/type-syn.tex
@@ -13,37 +13,6 @@
\starttypescriptcollection[synonyms]
-% Simple Minded Fonts / to be redone so that it's not bound to modern
-
-\starttypescript [serif] [simple] [name]
- \definefontsynonym [Serif] [Simple]
- \definefontsynonym [SerifBold] [Serif]
- \definefontsynonym [SerifItalic] [Serif]
- \definefontsynonym [SerifSlanted] [Serif]
- \definefontsynonym [SerifBoldItalic] [Serif]
- \definefontsynonym [SerifBoldSlanted] [Serif]
- \definefontsynonym [SerifCaps] [Serif]
-\stoptypescript
-
-% \starttypescript [sans] [simple] [name]
-% \definefontsynonym [Sans] [Simple]
-% \definefontsynonym [SansBold] [Sans]
-% \definefontsynonym [SansItalic] [Sans]
-% \definefontsynonym [SansSlanted] [Sans]
-% \definefontsynonym [SansBoldItalic] [Sans]
-% \definefontsynonym [SansBoldSlanted] [Sans]
-% \definefontsynonym [SansCaps] [Sans]
-% \stoptypescript
-
-% \starttypescript [mono] [simple] [name]
-% \definefontsynonym [Mono] [Simple]
-% \definefontsynonym [MonoBold] [Mono]
-% \definefontsynonym [MonoItalic] [Mono]
-% \definefontsynonym [MonoSlanted] [Mono]
-% \definefontsynonym [MonoBoldItalic] [Mono]
-% \definefontsynonym [MonoBoldSlanted] [Mono]
-% \definefontsynonym [MonoCaps] [Mono]
-% \stoptypescript
% Computer Modern Roman : Donald Knuth
% Latin Modern: LM Font Revision Team
@@ -819,13 +788,6 @@
\definefontsynonym [SerifCaps] [Times-Roman]
\stoptypescript
-% \starttypescript [math] [times] [name]
-% \definefontsynonym [MathRoman] [Times-MathRoman]
-% \definefontsynonym [MathExtension] [Times-MathExtension]
-% \definefontsynonym [MathItalic] [Times-MathItalic]
-% \definefontsynonym [MathSymbol] [Times-MathSymbol]
-% \stoptypescript
-
\starttypescript [math] [times] [name]
\definefontsynonym [MathRoman] [Times-Roman-Upright]
\definefontsynonym [MathExtension] [Times-Math-Extension]
diff --git a/tex/context/base/type-tmf.tex b/tex/context/base/type-tmf.tex
new file mode 100644
index 000000000..db6240ba5
--- /dev/null
+++ b/tex/context/base/type-tmf.tex
@@ -0,0 +1,1073 @@
+%D \module
+%D [ file=type-tmf,
+%D version=2007.07.30,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Core \TEX\ Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\starttypescriptcollection[synonyms]
+
+% Computer Modern Roman : Donald Knuth
+% Latin Modern: LM Font Revision Team
+
+% LM math vs CM math (analysis by Taco):
+%
+% lmex10.tfm % identical
+% lmmi5.tfm % identical
+% lmmi6.tfm % identical
+% lmmi7.tfm % identical
+% lmmi8.tfm % identical
+% lmmi9.tfm % identical
+% lmmi10.tfm % identical
+% lmmi12.tfm % identical
+% lmmib10.tfm % identical
+% lmsy5.tfm % extra chars: 254,255 (octal)
+% lmsy6.tfm % extra chars: 254,255 (octal)
+% lmsy7.tfm % extra chars: 254,255 (octal)
+% lmsy8.tfm % extra chars: 254,255 (octal)
+% lmsy9.tfm % extra chars: 254,255 (octal)
+% lmsy10.tfm % extra chars: 254,255 (octal)
+% lmbsy10.tfm % extra chars: 254,255 (octal)
+%
+% From the 'AMS' set:
+%
+% lmmib5.tfm % identical
+% lmmib7.tfm % identical
+% lmbsy5.tfm % extra chars: 254,255 (octal)
+% lmbsy7.tfm % extra chars: 254,255 (octal)
+%
+% The two extra characters are:
+%
+% /lessorequalslant
+% /greaterorequalslant
+
+\starttypescript [serif] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Serif] [LMRoman-Regular]
+ \definefontsynonym [SerifBold] [LMRoman-Bold]
+ \definefontsynonym [SerifItalic] [LMRoman-Italic]
+ \definefontsynonym [SerifSlanted] [LMRoman-Oblique]
+ \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [SerifCaps] [LMRoman-CapsRegular]
+ \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique]
+\stoptypescript
+
+\starttypescript [sans] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Sans] [LMSans-Regular]
+ \definefontsynonym [SansBold] [LMSans-Bold]
+ \definefontsynonym [SansItalic] [LMSans-Oblique]
+ \definefontsynonym [SansSlanted] [LMSans-Oblique]
+ \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [SansCaps] [LMSans-Regular]
+ \definefontsynonym [SansCapsSlanted] [LMSans-Oblique]
+\stoptypescript
+
+\starttypescript [mono] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Regular]
+ \definefontsynonym [MonoBold] [LMTypewriter-Dark]
+ \definefontsynonym [MonoItalic] [LMTypewriter-Italic]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular]
+\stoptypescript
+
+\starttypescript [math] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRoman] [LMRoman-Regular]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalic] [LMMathItalic-Italic]
+ \definefontsynonym [MathSymbol] [LMMathSymbols-Italic]
+\stoptypescript
+
+% maybe we can by now just use: (to be tested first)
+
+% \starttypescript [math] [modern,computer-modern,latin-modern] [name]
+% \definefontsynonym[xcmr12][LMRoman-Regular12]
+% \definefontsynonym[xcmr10][LMRoman-Regular10]
+% \definefontsynonym[xcmr9] [LMRoman-Regular9]
+% \definefontsynonym[xcmr8] [LMRoman-Regular8]
+% \definefontsynonym[xcmr7] [LMRoman-Regular7]
+% \definefontsynonym[xcmr6] [LMRoman-Regular6]
+% \definefontsynonym[xcmr5] [LMRoman-Regular5]
+% \stoptypescript
+
+\starttypescript [math] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym[xcmr12][rm-lmr12]
+ \definefontsynonym[xcmr10][rm-lmr10]
+ \definefontsynonym[xcmr9] [rm-lmr9]
+ \definefontsynonym[xcmr8] [rm-lmr8]
+ \definefontsynonym[xcmr7] [rm-lmr7]
+ \definefontsynonym[xcmr6] [rm-lmr6]
+ \definefontsynonym[xcmr5] [rm-lmr5]
+\stoptypescript
+
+\starttypescript [boldmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRoman] [LMRoman-Bold]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalic] [LMMathItalic-BoldItalic]
+ \definefontsynonym [MathSymbol] [LMMathSymbols-BoldItalic]
+\stoptypescript
+
+\starttypescript [bfmath] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [MathRomanBold] [LMRoman-Bold]
+ \definefontsynonym [MathExtension] [LMMathExtension-Regular]
+ \definefontsynonym [MathItalicBold] [LMMathItalic-BoldItalic]
+ \definefontsynonym [MathSymbolBold] [LMMathSymbols-BoldItalic]
+\stoptypescript
+
+\starttypescript [math,boldmath,bfmath] [modern,computer-modern,latin-modern] [name]
+ \usemathcollection[default]
+\stoptypescript
+
+\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name]
+ \definefontsynonym [Serif] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique]
+\stoptypescript
+
+\starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name]
+ \definefontsynonym [Mono] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed]
+\stoptypescript
+
+\starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name]
+ \definefontsynonym [Mono] [LMTypewriter-Light]
+ \definefontsynonym [MonoBold] [LMTypewriter-Light]
+ \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique]
+ \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light]
+ \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light]
+ \definefontsynonym [MonoCaps] [LMTypewriter-Light]
+ \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light]
+\stoptypescript
+
+% Later we will map the real fonts, here we just map synonyms.
+
+\starttypescript [serif] [modern,latin-modern]
+ \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique]
+ \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold]
+ \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic]
+ \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique]
+ \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular]
+ \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique]
+ \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular]
+ \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic]
+ \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique]
+\stoptypescript
+
+\starttypescript [sans] [modern,latin-modern]
+ \definefontsynonym [LMSans-Regular] [LMSans10-Regular]
+ \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique]
+ \definefontsynonym [LMSans-Bold] [LMSans10-Bold]
+ \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed]
+ \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique]
+ \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique]
+\stoptypescript
+
+\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond]
+ \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular]
+ \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique]
+ \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light]
+ \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique]
+ \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed]
+ \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique]
+ \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark]
+ \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique]
+ \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular]
+ \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic]
+ \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular]
+ \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique]
+ \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light]
+ \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique]
+ \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark]
+ \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique]
+\stoptypescript
+
+\starttypescript [serif] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModern] [LMRoman-Regular]
+ \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic]
+ \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique]
+ \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold]
+ \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic]
+ \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique]
+ \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular]
+ \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique]
+\stoptypescript
+
+\starttypescript [sans] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernSans] [LMSans-Regular]
+ \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique]
+ \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold]
+ \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique]
+ \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular]
+ \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique]
+\stoptypescript
+
+\starttypescript [mono] [modern,computer-modern,latin-modern]
+ \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular]
+ \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic]
+ \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique]
+ \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark]
+ \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % !
+ \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique]
+ \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular]
+ \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique]
+ \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular]
+\stoptypescript
+
+\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari]
+ \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique]
+ \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark]
+ \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique]
+ \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular]
+ \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique]
+\stoptypescript
+
+\starttypescript [math] [modern,latin-modern]
+ \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
+ \definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic]
+ \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
+ \definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic]
+ \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+\stoptypescript
+
+\starttypescript [serif] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmr5] [LMRoman5-Regular]
+ \definefontsynonym [cmr6] [LMRoman6-Regular]
+ \definefontsynonym [cmr7] [LMRoman7-Regular]
+ \definefontsynonym [cmr8] [LMRoman8-Regular]
+ \definefontsynonym [cmr9] [LMRoman9-Regular]
+ \definefontsynonym [cmr10] [LMRoman10-Regular]
+ \definefontsynonym [cmr12] [LMRoman12-Regular]
+ \definefontsynonym [cmr17] [LMRoman17-Regular]
+ \definefontsynonym [cmbx5] [LMRoman5-Bold]
+ \definefontsynonym [cmbx6] [LMRoman6-Bold]
+ \definefontsynonym [cmbx7] [LMRoman7-Bold]
+ \definefontsynonym [cmbx8] [LMRoman8-Bold]
+ \definefontsynonym [cmbx9] [LMRoman9-Bold]
+ \definefontsynonym [cmbx10] [LMRoman10-Bold]
+ \definefontsynonym [cmbx12] [LMRoman12-Bold]
+ \definefontsynonym [cmsl10] [LMRoman10-Oblique]
+ \definefontsynonym [cmsl12] [LMRoman12-Oblique]
+ \definefontsynonym [cmsl17] [LMRoman17-Oblique]
+ \definefontsynonym [cmsl8] [LMRoman8-Oblique]
+ \definefontsynonym [cmsl9] [LMRoman9-Oblique]
+ \definefontsynonym [cmti7] [LMRoman7-Italic]
+ \definefontsynonym [cmti8] [LMRoman8-Italic]
+ \definefontsynonym [cmti9] [LMRoman9-Italic]
+ \definefontsynonym [cmti10] [LMRoman10-Italic]
+ \definefontsynonym [cmti12] [LMRoman12-Italic]
+ \definefontsynonym [cmbsl10] [LMRoman10-DemiOblique]
+ \definefontsynonym [cmbxsl10] [LMRoman10-BoldOblique]
+ \definefontsynonym [cmbxti10] [LMRoman10-BoldItalic]
+ \definefontsynonym [cmcsc10] [LMRoman10-CapsRegular]
+ \definefontsynonym [cmcscsl10][LMRoman10-CapsOblique]
+
+ %definefontsynonym [cmb10]
+\stoptypescript
+
+\starttypescript [sans] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmss8] [LMSans8-Regular]
+ \definefontsynonym [cmss9] [LMSans9-Regular]
+ \definefontsynonym [cmss10] [LMSans10-Regular]
+ \definefontsynonym [cmss12] [LMSans12-Regular]
+ \definefontsynonym [cmss17] [LMSans17-Regular]
+ \definefontsynonym [cmssi10] [LMSans10-Oblique]
+ \definefontsynonym [cmssi12] [LMSans12-Oblique]
+ \definefontsynonym [cmssi17] [LMSans17-Oblique]
+ \definefontsynonym [cmssi8] [LMSans8-Oblique]
+ \definefontsynonym [cmssi9] [LMSans9-Oblique]
+ \definefontsynonym [cmssq8] [LMSansQuotation8-Regular]
+ \definefontsynonym [cmssqb8] [LMSansQuotation8-Bold]
+ \definefontsynonym [cmssqbi8] [LMSansQuotation8-BoldOblique]
+ \definefontsynonym [cmssqi8] [LMSansQuotation8-Oblique]
+ \definefontsynonym [cmssbx10] [LMSans10-Bold]
+ \definefontsynonym [cmssdc10] [LMSans10-DemiCondensed]
+ \definefontsynonym [cmssbi10] [LMSans10-BoldOblique]
+ \definefontsynonym [cmssdi10] [LMSans10-DemiCondensedOblique]
+\stoptypescript
+
+\starttypescript [mono] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmtt8] [LMTypewriter8-Regular]
+ \definefontsynonym [cmtt9] [LMTypewriter9-Regular]
+ \definefontsynonym [cmtt10] [LMTypewriter10-Regular]
+ \definefontsynonym [cmtt12] [LMTypewriter12-Regular]
+ \definefontsynonym [cmitt10] [LMTypewriter10-Italic]
+ \definefontsynonym [cmsltt10] [LMTypewriter10-Oblique]
+ \definefontsynonym [cmvtt10] [LMTypewriterVarWd10-Regular]
+ \definefontsynonym [cmvtti10] [LMTypewriterVarWd10-Oblique]
+ \definefontsynonym [cmtcsc10] [LMTypewriter10-CapsRegular]
+\stoptypescript
+
+\starttypescript [math] [modern,latin-modern,computer-modern]
+ \definefontsynonym [cmbsy5] [LMMathSymbols5-BoldItalic]
+ \definefontsynonym [cmbsy7] [LMMathSymbols7-BoldItalic]
+ \definefontsynonym [cmbsy10] [LMMathSymbols10-BoldItalic]
+ \definefontsynonym [cmsy5] [LMMathSymbols5-Italic]
+ \definefontsynonym [cmsy6] [LMMathSymbols6-Italic]
+ \definefontsynonym [cmsy7] [LMMathSymbols7-Italic]
+ \definefontsynonym [cmsy8] [LMMathSymbols8-Italic]
+ \definefontsynonym [cmsy9] [LMMathSymbols9-Italic]
+ \definefontsynonym [cmsy10] [LMMathSymbols10-Italic]
+ \definefontsynonym [cmex10] [LMMathExtension10-Regular]
+ \definefontsynonym [cmmi5] [LMMathItalic5-Italic]
+ \definefontsynonym [cmmi6] [LMMathItalic6-Italic]
+ \definefontsynonym [cmmi7] [LMMathItalic7-Italic]
+ \definefontsynonym [cmmi8] [LMMathItalic8-Italic]
+ \definefontsynonym [cmmi9] [LMMathItalic9-Italic]
+ \definefontsynonym [cmmi10] [LMMathItalic10-Italic]
+ \definefontsynonym [cmmi12] [LMMathItalic12-Italic]
+ \definefontsynonym [cmmib5] [LMMathItalic5-BoldItalic]
+ \definefontsynonym [cmmib7] [LMMathItalic7-BoldItalic]
+ \definefontsynonym [cmmib10] [LMMathItalic10-BoldItalic]
+\stoptypescript
+
+% This will change some day.
+
+\starttypescript [math] [modern,computer-modern,latin-modern] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [msbm10]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [cmsy10]
+\stoptypescript
+
+% Concrete Modern Roman : Donald Knuth
+
+\starttypescript [serif] [concrete] [name]
+ \definefontsynonym [Serif] [ComputerConcrete]
+ \definefontsynonym [SerifBold] [ComputerConcrete]
+ \definefontsynonym [SerifItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [SerifSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [SerifBoldItalic] [ComputerConcrete-Italic]
+ \definefontsynonym [SerifBoldSlanted] [ComputerConcrete-Slanted]
+ \definefontsynonym [SerifCaps] [ComputerConcrete-Caps]
+\stoptypescript
+
+% Euler : Hermann Zapf
+
+\starttypescript [math] [euler] [name]
+ \definefontsynonym [MathRoman] [Euler-Roman] % mr
+ \definefontsynonym [MathItalic] [Euler-Fraktur] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbol] [Euler-Symbol] % sy
+\stoptypescript
+
+\starttypescript [boldmath] [euler] [name]
+ \definefontsynonym [MathRoman] [Euler-Roman-Bold] % mr
+ \definefontsynonym [MathItalic] [Euler-Fraktur-Bold] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbol] [Euler-Symbol-Bold] % sy
+\stoptypescript
+
+\starttypescript [bfmath] [euler] [name]
+ \definefontsynonym [MathRomanBold] [Euler-Roman-Bold] % mr
+ \definefontsynonym [MathItalicBold] [Euler-Fraktur-Bold] % mi
+ \definefontsynonym [MathExtension] [Euler-Extension] % ex
+ \definefontsynonym [MathSymbolBold] [Euler-Symbol-Bold] % sy
+\stoptypescript
+
+\starttypescript [math] [euler] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [MathItalic]
+ \definefontsynonym [Gothic] [MathItalic]
+ \definefontsynonym [Calligraphic] [MathSymbol]
+\stoptypescript
+
+\starttypescript [boldmath] [euler] [name]
+ \definefontsynonym [OldStyle] [MathItalicBold]
+ \definefontsynonym [Fraktur] [MathItalicBold]
+ \definefontsynonym [Gothic] [MathItalicBold]
+ \definefontsynonym [Calligraphic] [MathSymbolBold]
+\stoptypescript
+
+\starttypescript [math,boldmath,bfmath] [euler] [name]
+ \usemathcollection[eul]
+\stoptypescript
+
+% American Math Society : Michael Spivak
+
+\starttypescript [math] [modern,computer-modern,latin-modern,ams] [name]
+ \definefontsynonym [MathAlpha] [AMS-SymbolA]
+ \definefontsynonym [MathBeta] [AMS-SymbolB]
+\stoptypescript
+
+% Antykwa Torunska :
+
+\starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap]
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap]
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap]
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [Serif] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap]
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][lt][Light]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][cond][Cond]
+
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska-light] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][dk][Dark]
+
+ \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][cond][Cond]
+
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska-cond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight]
+ \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium]
+ \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic]
+ \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic]
+ \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][lt][Light]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap]
+
+ \definefontvariant [Serif][exp][Exp]
+
+\stoptypescript
+
+\starttypescript [serif] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap]
+ \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap]
+ \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap]
+ \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap]
+ \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap]
+
+ \definefontvariant [Serif][osf][Caps]
+ \definefontvariant [Serif][sc] [Caps]
+
+ \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular]
+ \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold]
+ \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic]
+ \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic]
+ \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap]
+
+ \definefontvariant [Serif][dk][Dark]
+
+ \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light]
+ \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium]
+ \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic]
+ \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic]
+ \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap]
+
+ \definefontvariant [Serif][exp][Exp]
+
+\stoptypescript
+
+% maybe no -Regular etc
+
+\starttypescript [math] [antykwa-torunska-light] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-RegularItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-cond] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondRegularItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular]
+\stoptypescript
+
+\starttypescript [math] [antykwa-torunska-lightcond] [name]
+ \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight]
+ \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic]
+ \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight]
+ \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight]
+\stoptypescript
+
+% Antykwa Poltawskiego :
+
+\starttypescript [serif] [antykwa-poltawskiego] [name]
+ \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular]
+ \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold]
+ \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic]
+ \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold]
+ \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold]
+ \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular]
+\stoptypescript
+
+% Iwona
+
+\starttypescript [sans] [iwona-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Light]
+ \definefontsynonym [SansItalic] [Iwona-LightItalic]
+ \definefontsynonym [SansBold] [Iwona-Medium]
+ \definefontsynonym [SansBoldItalic] [Iwona-MediumItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsLight]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-light-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsLight]
+ \definefontsynonym [SansItalic] [Iwona-CapsLightItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsMedium]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsMediumItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Regular]
+ \definefontsynonym [SansItalic] [Iwona-RegularItalic]
+ \definefontsynonym [SansBold] [Iwona-Bold]
+ \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsRegularItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsRegular]
+ \definefontsynonym [SansItalic] [Iwona-CapsRegularItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Medium]
+ \definefontsynonym [SansItalic] [Iwona-MediumItalic]
+ \definefontsynonym [SansBold] [Iwona-Heavy]
+ \definefontsynonym [SansBoldItalic] [Iwona-HeavyItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsMediumItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-medium-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CapsHeavy]
+ \definefontsynonym [SansItalic] [Iwona-CapsMediumItalic]
+ \definefontsynonym [SansBold] [Iwona-CapsHeavy]
+ \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavyItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-heavy] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-Heavy]
+ \definefontsynonym [SansItalic] [Iwona-HeavyItalic]
+ \definefontsynonym [SansBold] [Iwona-Heavy]
+ \definefontsynonym [SansBoldItalic] [Iwona-HeavyItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavyItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-heavy-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [SansCaps] [Iwona-CapsHeavy]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavyItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-light-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondLight]
+ \definefontsynonym [SansItalic] [Iwona-CondLightItalic]
+ \definefontsynonym [SansBold] [Iwona-CondMedium]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondMediumItalic]
+ \definefontsynonym [SansCaps] [Iwona-CondCapsLight]
+ \definefontsynonym [SansItalicCaps] [Iwona-CondCapsLightItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CondCapsMedium]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsMediumItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-light-cond-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondCapsLight]
+ \definefontsynonym [SansItalic] [Iwona-CondCapsLightItalic]
+ \definefontsynonym [SansBold] [Iwona-CondCapsMedium]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondCapsMediumItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondRegular]
+ \definefontsynonym [SansItalic] [Iwona-CondRegularItalic]
+ \definefontsynonym [SansBold] [Iwona-CondBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic]
+ \definefontsynonym [SansCaps] [Iwona-CondCapsRegular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CondCapsRegularItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CondCapsBold]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsBoldItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-cond-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondCapsRegular]
+ \definefontsynonym [SansItalic] [Iwona-CondCapsRegularItalic]
+ \definefontsynonym [SansBold] [Iwona-CondCapsBold]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondCapsBoldItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-medium-cond] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondMedium]
+ \definefontsynonym [SansItalic] [Iwona-CondMediumItalic]
+ \definefontsynonym [SansBold] [Iwona-CondHeavy]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondHeavyItalic]
+ \definefontsynonym [SansCaps] [Iwona-CondCapsHeavy]
+ \definefontsynonym [SansItalicCaps] [Iwona-CondCapsMediumItalic]
+ \definefontsynonym [SansBoldCaps] [Iwona-CondCapsHeavy]
+ \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsHeavyItalic]
+\stoptypescript
+
+\starttypescript [sans] [iwona-medium-cond-caps] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Iwona-CondCapsHeavy]
+ \definefontsynonym [SansItalic] [Iwona-CondCapsMediumItalic]
+ \definefontsynonym [SansBold] [Iwona-CondCapsHeavy]
+ \definefontsynonym [SansBoldItalic] [Iwona-CondCapsHeavyItalic]
+\stoptypescript
+
+\starttypescript [math] [iwona-light] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-LightItalic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Light]
+\stoptypescript
+
+\starttypescript [math] [iwona] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-RegularItalic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular]
+\stoptypescript
+
+\starttypescript [math] [iwona-medium] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-MediumItalic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium]
+\stoptypescript
+
+\starttypescript [math] [iwona-heavy] [name]
+ \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy]
+ \definefontsynonym [MathItalic] [Iwona-Math-Letters-HeavyItalic]
+ \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy]
+ \definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy]
+\stoptypescript
+
+% Kurier
+
+\starttypescript [sans] [kurier-light] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Light]
+ \definefontsynonym [SansItalic] [Kurier-LightItalic]
+ \definefontsynonym [SansBold] [Kurier-Medium]
+ \definefontsynonym [SansBoldItalic] [Kurier-MediumItalic]
+\stoptypescript
+
+\starttypescript [sans] [kurier] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Regular]
+ \definefontsynonym [SansItalic] [Kurier-RegularItalic]
+ \definefontsynonym [SansBold] [Kurier-Bold]
+ \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic]
+\stoptypescript
+
+\starttypescript [sans] [kurier-medium] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [Kurier-Medium]
+ \definefontsynonym [SansItalic] [Kurier-MediumItalic]
+ \definefontsynonym [SansBold] [Kurier-Heavy]
+ \definefontsynonym [SansBoldItalic] [Kurier-HeavyItalic]
+\stoptypescript
+
+\starttypescript [math] [kurier-light] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-LightItalic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Light]
+\stoptypescript
+
+\starttypescript [math] [kurier] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-RegularItalic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular]
+\stoptypescript
+
+\starttypescript [math] [kurier-medium] [name]
+ \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium]
+ \definefontsynonym [MathItalic] [Kurier-Math-Letters-MediumItalic]
+ \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium]
+ \definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium]
+\stoptypescript
+
+% Bookman :
+
+\starttypescript [serif] [bookman] [name]
+ \definefontsynonym [Serif] [Bookman-Light]
+ \definefontsynonym [SerifItalic] [Bookman-LightItalic]
+ \definefontsynonym [SerifBold] [Bookman-DemiBold]
+ \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic]
+ \definefontsynonym [SerifSlanted] [Bookman-LightSlanted]
+ \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted]
+ \definefontsynonym [SerifCaps] [Bookman-Light-Caps]
+\stoptypescript
+
+% Chancery : Zapf
+
+\starttypescript [calligraphy] [chancery] [name]
+ \definefontsynonym [Calligraphy] [Chancery]
+\stoptypescript
+
+% Schoolbook :
+
+\starttypescript [serif] [schoolbook] [name]
+ \definefontsynonym [Serif] [Schoolbook-Roman]
+ \definefontsynonym [SerifItalic] [Schoolbook-Italic]
+ \definefontsynonym [SerifBold] [Schoolbook-Bold]
+ \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic]
+ \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted]
+ \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps]
+\stoptypescript
+
+% Utopia : Adobe
+
+\starttypescript [serif] [utopia] [name]
+ \definefontsynonym [Serif] [Utopia-Regular]
+ \definefontsynonym [SerifItalic] [Utopia-Italic]
+ \definefontsynonym [SerifBold] [Utopia-Bold]
+ \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic]
+ \definefontsynonym [SerifSlanted] [Utopia-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Utopia-Regular-Caps]
+\stoptypescript
+
+% Fourier : Michael Bovani
+
+\starttypescript [serif] [fourier] [name]
+ \definefontsynonym [Serif] [Fourier-Regular]
+ \definefontsynonym [SerifSlanted] [Fourier-Slanted]
+ \definefontsynonym [SerifItalic] [Fourier-Italic]
+ \definefontsynonym [SerifCaps] [Fourier-RegularCaps]
+ \definefontsynonym [SerifBold] [Fourier-Bold]
+ \definefontsynonym [SerifBoldSlanted] [Fourier-BoldSlanted]
+ \definefontsynonym [SerifBoldItalic] [Fourier-BoldItalic]
+ \definefontsynonym [SerifBoldCaps] [Fourier-BoldCaps]
+
+ \definefontsynonym [Serif-Expert] [Fourier-Regular-Expert]
+ \definefontsynonym [SerifSlanted-Expert] [Fourier-Slanted-Expert]
+ \definefontsynonym [SerifItalic-Expert] [Fourier-Italic-Expert]
+ \definefontsynonym [SerifCaps-Expert] [Fourier-RegularCaps-Expert]
+ \definefontsynonym [SerifSemiBold-Expert] [Fourier-Semi-Expert]
+ \definefontsynonym [SerifSemiSlanted-Expert] [Fourier-SemiSlanted-Expert]
+ \definefontsynonym [SerifSemiItalic-Expert] [Fourier-SemiItalic-Expert]
+ \definefontsynonym [SerifSemiCaps-Expert] [Fourier-SemiCaps-Expert]
+ \definefontsynonym [SerifBold-Expert] [Fourier-Bold-Expert]
+ \definefontsynonym [SerifBoldSlanted-Expert] [Fourier-BoldSlanted-Expert]
+ \definefontsynonym [SerifBoldItalic-Expert] [Fourier-BoldItalic-Expert]
+ \definefontsynonym [SerifBlack-Expert] [Fourier-Black-Expert]
+
+ \definefontsynonym [Serif-OldStyle] [Fourier-Regular-OldStyle]
+ \definefontsynonym [SerifSlanted-OldStyle] [Fourier-Slanted-OldStyle]
+ \definefontsynonym [SerifItalic-OldStyle] [Fourier-Italic-OldStyle]
+ \definefontsynonym [SerifCaps-OldStyle] [Fourier-RegularCaps-OldStyle]
+ \definefontsynonym [SerifSemiBold-OldStyle] [Fourier-Semi-OldStyle]
+ \definefontsynonym [SerifSemiSlanted-OldStyle] [Fourier-SemiSlanted-OldStyle]
+ \definefontsynonym [SerifSemiItalic-OldStyle] [Fourier-SemiItalic-OldStyle]
+ \definefontsynonym [SerifSemiCaps-OldStyle] [Fourier-SemiCaps-OldStyle]
+ \definefontsynonym [SerifBold-OldStyle] [Fourier-Bold-OldStyle]
+ \definefontsynonym [SerifBoldSlanted-OldStyle] [Fourier-BoldSlanted-OldStyle]
+ \definefontsynonym [SerifBoldItalic-OldStyle] [Fourier-BoldItalic-OldStyle]
+ \definefontsynonym [SerifBlack-OldStyle] [Fourier-Black-OldStyle]
+ \definefontsynonym [SerifBlackSlanted-OldStyle] [Fourier-BlackSlanted-OldStyle]
+\stoptypescript
+
+\starttypescript [math] [fourier] [name]
+ \definefontsynonym [MathRoman] [Fourier-Math-Letters]
+ \definefontsynonym [MathItalic] [Fourier-Math-Letters-Italic]
+ \definefontsynonym [MathSymbol] [Fourier-Math-Symbols]
+ \definefontsynonym [MathExtension] [Fourier-Math-Extension]
+\stoptypescript
+
+\starttypescript [math] [fourier] [name] % todo
+ \definefontsynonym [OldStyle] [Serif-OldStyle] % strange, no oldstyles
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [msbm10]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+\stoptypescript
+
+% Charter :
+
+\starttypescript [serif] [charter] [name]
+ \definefontsynonym [Serif] [Charter-Roman]
+ \definefontsynonym [SerifItalic] [Charter-Italic]
+ \definefontsynonym [SerifBold] [Charter-Bold]
+ \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic]
+ \definefontsynonym [SerifSlanted] [Charter-Slanted]
+ \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Charter-Roman-Caps]
+\stoptypescript
+
+% Times :
+
+\starttypescript [serif] [times] [name]
+ \definefontsynonym [Serif] [Times-Roman]
+ \definefontsynonym [SerifBold] [Times-Bold]
+ \definefontsynonym [SerifItalic] [Times-Italic]
+ \definefontsynonym [SerifSlanted] [Times-Italic]
+ \definefontsynonym [SerifBoldItalic] [Times-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic]
+ \definefontsynonym [SerifCaps] [Times-Caps]
+\stoptypescript
+
+\starttypescript [math] [times] [name]
+ \definefontsynonym [MathRoman] [Times-Roman-Upright]
+ \definefontsynonym [MathExtension] [Times-Math-Extension]
+ \definefontsynonym [MathItalic] [Times-Math-Italic]
+ \definefontsynonym [MathSymbol] [Times-Math-Symbols]
+ \definefontsynonym [MathAlpha] [Times-Math-SymbolsA]
+ \definefontsynonym [MathBeta] [Times-Math-SymbolsB]
+\stoptypescript
+
+\starttypescript [math] [times] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathBeta]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+\stoptypescript
+
+% Helvetica :
+
+\starttypescript [sans] [helvetica] [name]
+ \definefontsynonym [Sans] [Helvetica]
+ \definefontsynonym [SansBold] [Helvetica-Bold]
+ \definefontsynonym [SansItalic] [Helvetica-Oblique]
+ \definefontsynonym [SansSlanted] [Helvetica-Oblique]
+ \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique]
+ \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique]
+ \definefontsynonym [SansCaps] [Helvetica-Caps]
+\stoptypescript
+
+\starttypescript [math] [helvetica] [name]
+ \definefontsynonym [MathRoman] [Helvetica-MathRoman]
+ \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols]
+ \definefontsynonym [MathItalic] [Helvetica-MathItalics]
+ \definefontsynonym [MathSymbol] [Helvetica-MathSymbols]
+\stoptypescript
+
+% Courier :
+
+\starttypescript [mono] [courier] [name]
+ \definefontsynonym [Mono] [Courier]
+ \definefontsynonym [MonoBold] [Courier-Bold]
+ \definefontsynonym [MonoItalic] [Courier-Oblique]
+ \definefontsynonym [MonoSlanted] [Courier-Oblique]
+ \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique]
+ \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique]
+ \definefontsynonym [MonoCaps] [Courier-Caps]
+\stoptypescript
+
+% Palatino : Hermann Zapf / URW
+
+\starttypescript [serif] [palatino] [name]
+ \definefontsynonym [Serif] [Palatino]
+ \definefontsynonym [SerifBold] [Palatino-Bold]
+ \definefontsynonym [SerifItalic] [Palatino-Italic]
+ \definefontsynonym [SerifSlanted] [Palatino-Slanted]
+ \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic]
+ \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted]
+ \definefontsynonym [SerifCaps] [Palatino-Caps]
+\stoptypescript
+
+\starttypescript [math] [palatino] [name]
+ \definefontsynonym [MathRoman] [Palatino-Roman-Upright]
+ \definefontsynonym [MathExtension] [Palatino-Math-Extension]
+ \definefontsynonym [MathItalic] [Palatino-Math-Italic]
+ \definefontsynonym [MathSymbol] [Palatino-Math-Symbols]
+ \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA]
+ \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB]
+\stoptypescript
+
+\starttypescript [math] [palatino] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathBeta]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+\stoptypescript
+
+% bonus definitions / will disappear
+
+\starttypescript [serif] [palatino] [name]
+ \definefontsynonym [SerifRegular] [Serif]
+ \definefontsynonym [SerifRegularOsF] [TeXPalladioL-SC]
+ \definefontsynonym [SerifItalicOsF] [TeXPalladioL-ItalicOsF]
+ \definefontsynonym [SerifBoldOsF] [TeXPalladioL-BoldOsF]
+ \definefontsynonym [SerifBoldItalicOsF][TeXPalladioL-BoldItalicOsF]
+ \definefontsynonym [SerifCapsOsF] [TeXPalladioL-SC]
+\stoptypescript
+
+\stoptypescriptcollection
+
+\endinput
diff --git a/tex/context/base/type-xtx.tex b/tex/context/base/type-xtx.tex
index 010de1f85..be833bb2a 100644
--- a/tex/context/base/type-xtx.tex
+++ b/tex/context/base/type-xtx.tex
@@ -106,7 +106,7 @@
%D in this case since tricks like \type{/I} will never, ever work for local fonts,
%D so there is really only one choice.
-%D HH: todo, define feature set swith mapping=tex-tex
+%D HH: todo, define feature set switch mapping=tex-tex
\definefontsynonym[Dummy] [name:\typescripttwo\xetexcolon mapping=tex-text] [encoding=uc]
\definefontsynonym[DummyItalic] [name:\typescripttwo/I\xetexcolon mapping=tex-text] [encoding=uc]
diff --git a/tex/context/base/verb-lua.lua b/tex/context/base/verb-lua.lua
new file mode 100644
index 000000000..78d5f2a2c
--- /dev/null
+++ b/tex/context/base/verb-lua.lua
@@ -0,0 +1,212 @@
+-- filename : type-lua.lua
+-- comment : companion to core-buf.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+-- BROKEN : result is now table
+
+
+
+if not buffers then buffers = { } end
+if not buffers.visualizers then buffers.visualizers = { } end
+if not buffers.visualizers.lua then buffers.visualizers.lua = { } end
+
+buffers.visualizers.lua.identifiers = { }
+
+-- borrowed from scite
+
+buffers.visualizers.lua.identifiers.core = {
+ "and", "break", "do", "else", "elseif", "end", "false", "for", "function",
+ "if", "in", "local", "nil", "not", "or", "repeat", "return", "then",
+ "true", "until", "while"
+}
+
+buffers.visualizers.lua.identifiers.base = {
+ "assert", "collectgarbage", "dofile", "error", "gcinfo", "loadfile",
+ "loadstring", "print", "rawget", "rawset", "require", "tonumber",
+ "tostring", "type", "unpack",
+}
+
+buffers.visualizers.lua.identifiers.five = {
+ "_G", "getfenv", "getmetatable", "ipairs", "loadlib", "next", "pairs",
+ "pcall", "rawequal", "setfenv", "setmetatable", "xpcall", "string", "table",
+ "math", "coroutine", "io", "os", "debug", "load", "module", "select"
+}
+
+buffers.visualizers.lua.identifiers.libs = {
+ -- coroutine
+ "coroutine.create", "coroutine.resume", "coroutine.status", "coroutine.wrap",
+ "coroutine.yield", "coroutine.running",
+ -- package
+ "package.cpath", "package.loaded", "package.loadlib", "package.path",
+ -- io
+ "io.close", "io.flush", "io.input", "io.lines", "io.open", "io.output",
+ "io.read", "io.tmpfile", "io.type", "io.write", "io.stdin", "io.stdout",
+ "io.stderr", "io.popen",
+ -- math
+ "math.abs", "math.acos", "math.asin", "math.atan", "math.atan2", "math.ceil",
+ "math.cos", "math.deg", "math.exp", "math.floor math.", "math.ldexp",
+ "math.log", "math.log10", "math.max", "math.min math.mod math.pi", "math.pow",
+ "math.rad", "math.random", "math.randomseed", "math.sin", "math.sqrt",
+ "math.tan", "math.cosh", "math.fmod", "math.modf", "math.sinh", "math.tanh",
+ "math.huge",
+ -- string
+ "string.byte", "string.char", "string.dump", "string.find", "string.len",
+ "string.lower", "string.rep", "string.sub", "string.upper", "string.format",
+ "string.gfind", "string.gsub", "string.gmatch", "string.match", "string.reverse",
+ -- table
+ "table.maxn", "table.concat", "table.foreach", "table.foreachi", "table.getn",
+ "table.sort", "table.insert", "table.remove", "table.setn",
+ -- os
+ "os.clock", "os.date", "os.difftime", "os.execute", "os.exit", "os.getenv",
+ "os.remove", "os.rename", "os.setlocale", "os.time", "os.tmpname",
+ -- package
+ "package.preload", "package.seeall"
+}
+
+buffers.visualizers.lua.words = { }
+
+for k,v in pairs(buffers.visualizers.lua.identifiers) do
+ for _,w in pairs(v) do
+ buffers.visualizers.lua.words[w] = k
+ end
+end
+
+buffers.visualizers.lua.styles = { }
+
+buffers.visualizers.lua.styles.core = ""
+buffers.visualizers.lua.styles.base = "\\sl "
+buffers.visualizers.lua.styles.five = "\\sl "
+buffers.visualizers.lua.styles.libs = "\\sl "
+
+-- btex .. etex
+
+buffers.visualizers.lua.colors = {
+ "prettyone",
+ "prettytwo",
+ "prettythree",
+ "prettyfour",
+}
+
+buffers.visualizers.lua.states = {
+ ['1']=1, ['2']=1, ['3']=1, ['4']=1, ['5']=1, ['6']=1, ['7']=1, ['8']=1, ['9']=1, ['0']=1,
+ ['--']=4,
+ ['"']=3, ["'"]=3,
+ ['+']=1, ['-']=1, ['*']=1, ['/']=1, ['%']=1, ['^']=1,
+}
+
+buffers.visualizers.lua.options = { }
+
+buffers.visualizers.lua.options.colorize_strings = false
+buffers.visualizers.lua.options.colorize_comments = false
+
+function buffers.flush_lua_word(state, word, result)
+ if #word>0 then
+ local id = buffers.visualizers.lua.words[word]
+ if id then
+ state, result = buffers.change_state(2, state, result)
+ if buffers.visualizers.lua.styles[id] then
+ state, result = buffers.finish_state(state,result .. buffers.visualizers.lua.styles[id] .. word)
+ else
+ state, result = buffers.finish_state(state,result .. word)
+ end
+ return state, result
+ else
+ state, result = buffers.finish_state(state,result)
+ return state, result .. buffers.escaped(word) -- cmp mp
+ end
+ else
+ state, result = buffers.finish_state(state,result)
+ return state, result
+ end
+end
+
+buffers.visualizers.lua.states.incomment = false
+
+-- to be sped up
+
+function buffers.visualizers.lua.flush_line(str, nested)
+ local result, state = { }, 0
+ local instr, inesc, incom = false, false, false
+ local c, p
+ local sb, ss, sf = string.byte, string.sub, string.find
+ local code, comment
+--~ buffers.currentcolors = buffers.visualizers.lua.colors
+--~ if sf(str,"^%-%-%[") then
+--~ buffers.visualizers.lua.states.incomment = true
+--~ code, comment, incom = "", str, true
+--~ elseif sf(str,"^%]%-%-") then
+--~ buffers.visualizers.lua.states.incomment = false
+--~ code, comment, incom = "", str, true
+--~ elseif buffers.visualizers.lua.states.incomment then
+--~ code, comment, incom = "", str, true
+--~ else
+--~ code, comment = string.match(str,"^(.-)%-%-(.*)$")
+--~ if not code then
+--~ code, comment = str, ""
+--~ end
+--~ end
+--~ -- bla bla1 bla.bla
+--~ for c in string.utfcharacters(code) do
+--~ if instr then
+--~ if c == s then
+--~ if inesc then
+--~ result = result .. "\\char" .. sb(c) .. " "
+--~ inesc = false
+--~ else
+--~ state, result = buffers.change_state(buffers.visualizers.lua.states[c], state, result)
+--~ instr = false
+--~ result = result .. "\\char" .. sb(c) .. " "
+--~ state, result = buffers.finish_state(state,result)
+--~ end
+--~ elseif c == "\\" then
+--~ inesc = not inesc
+--~ result = result .. buffers.escaped_chr(c)
+--~ else
+--~ inesc = false
+--~ result = result .. buffers.escaped_chr(c)
+--~ end
+--~ elseif sf(c,"^([\'\"])$") then
+--~ s, instr = c, true
+--~ state, result = buffers.change_state(buffers.visualizers.lua.states[c], state, result)
+--~ result = result .. "\\char" .. sb(c) .. " "
+--~ if not buffers.visualizers.lua.options.colorize_strings then
+--~ state, result = buffers.finish_state(state,result)
+--~ end
+--~ elseif c == " " then
+--~ state, result = buffers.flush_lua_word(state, word, result)
+--~ word = ""
+--~ result = result .. "\\obs "
+--~ elseif sf(c,"^[%a]$") then
+--~ state, result = buffers.finish_state(state,result)
+--~ word = word .. c
+--~ elseif (#word > 1) and sf(c,"^[%d%.%_]$") then
+--~ word = word .. c
+--~ else
+--~ state, result = buffers.flush_lua_word(state, word, result)
+--~ word = ""
+--~ state, result = buffers.change_state(buffers.visualizers.lua.states[c], state, result)
+--~ result = result .. "\\char" .. sb(c) .. " "
+--~ instr = (c == '"')
+--~ end
+--~ end
+--~ state, result = buffers.flush_lua_word(state, word, result)
+--~ if comment ~= "" then
+--~ state, result = buffers.change_state(buffers.visualizers.lua.states['--'], state, result)
+--~ if not incom then
+--~ result = result .. buffers.escaped("--")
+--~ end
+--~ if buffers.visualizers.lua.options.colorize_comments then
+--~ state, result = buffers.finish_state(state,result)
+--~ result = result .. buffers.escaped(comment)
+--~ else
+--~ result = result .. buffers.escaped(comment)
+--~ state, result = buffers.finish_state(state,result)
+--~ end
+--~ else
+--~ state, result = buffers.finish_state(state,result)
+--~ end
+--~ tex.sprint(tex.ctxcatcodes,result)
+ return "not yet finished"
+end
diff --git a/tex/context/base/verb-mp.lua b/tex/context/base/verb-mp.lua
new file mode 100644
index 000000000..90091a2a9
--- /dev/null
+++ b/tex/context/base/verb-mp.lua
@@ -0,0 +1,234 @@
+-- filename : type-mp.lua
+-- comment : companion to core-buf.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not buffers then buffers = { } end
+if not buffers.visualizers then buffers.visualizers = { } end
+if not buffers.visualizers.mp then buffers.visualizers.mp = { } end
+
+buffers.visualizers.mp.identifiers = { }
+
+buffers.visualizers.mp.identifiers.primitives = {
+ 'charcode', 'day', 'linecap', 'linejoin', 'miterlimit', 'month', 'pausing',
+ 'prologues', 'showstopping', 'time', 'tracingcapsules', 'tracingchoices',
+ 'tracingcommands', 'tracingequations', 'tracinglostchars',
+ 'tracingmacros', 'tracingonline', 'tracingoutput', 'tracingrestores',
+ 'tracingspecs', 'tracingstats', 'tracingtitles', 'truecorners',
+ 'warningcheck', 'year', 'mpprocset',
+ 'false', 'nullpicture', 'pencircle', 'true',
+ 'and', 'angle', 'arclength', 'arctime', 'ASCII', 'bluepart', 'boolean', 'bot',
+ 'char', 'color', 'cosd', 'cycle', 'decimal', 'directiontime', 'floor', 'fontsize',
+ 'greenpart', 'hex', 'infont', 'intersectiontimes', 'known', 'length', 'llcorner',
+ 'lrcorner', 'makepath', 'makepen', 'mexp', 'mlog', 'normaldeviate', 'not',
+ 'numeric', 'oct', 'odd', 'or', 'path', 'pair', 'pen', 'penoffset', 'picture', 'point',
+ 'postcontrol', 'precontrol', 'redpart', 'reverse', 'rotated', 'scaled',
+ 'shifted', 'sind', 'slanted', 'sqrt', 'str', 'string', 'subpath', 'substring',
+ 'transform', 'transformed', 'ulcorner', 'uniformdeviate', 'unknown',
+ 'urcorner', 'xpart', 'xscaled', 'xxpart', 'xypart', 'ypart', 'yscaled', 'yxpart',
+ 'yypart', 'zscaled',
+ 'addto', 'clip', 'input', 'interim', 'let', 'newinternal', 'save', 'setbounds',
+ 'shipout', 'show', 'showdependencies', 'showtoken', 'showvariable',
+ 'special',
+ 'begingroup', 'endgroup', 'of', 'curl', 'tension', 'and', 'controls',
+ 'reflectedabout', 'rotatedaround', 'interpath', 'on', 'off', 'beginfig',
+ 'endfig', 'def', 'vardef', 'enddef', 'epxr', 'suffix', 'text', 'primary', 'secondary',
+ 'tertiary', 'primarydef', 'secondarydef', 'tertiarydef', 'top', 'bottom',
+ 'ulft', 'urt', 'llft', 'lrt', 'randomseed', 'also', 'contour', 'doublepath',
+ 'withcolor', 'withpen', 'dashed', 'if', 'else', 'elseif', 'fi', 'for', 'endfor', 'forever', 'exitif',
+ 'forsuffixes', 'downto', 'upto', 'step', 'until',
+ 'charlist', 'extensible', 'fontdimen', 'headerbyte', 'kern', 'ligtable',
+ 'boundarychar', 'chardp', 'charext', 'charht', 'charic', 'charwd', 'designsize',
+ 'fontmaking', 'charexists',
+ 'cullit', 'currenttransform', 'gfcorners', 'grayfont', 'hround',
+ 'imagerules', 'lowres_fix', 'nodisplays', 'notransforms', 'openit',
+ 'displaying', 'currentwindow', 'screen_rows', 'screen_cols',
+ 'pixels_per_inch', 'cull', 'display', 'openwindow', 'numspecial',
+ 'totalweight', 'autorounding', 'fillin', 'proofing', 'tracingpens',
+ 'xoffset', 'chardx', 'granularity', 'smoothing', 'turningcheck', 'yoffset',
+ 'chardy', 'hppp', 'tracingedges', 'vppp',
+ 'extra_beginfig', 'extra_endfig', 'mpxbreak',
+ 'end', 'btex', 'etex', 'verbatimtex'
+}
+
+buffers.visualizers.mp.identifiers.plain = {
+ 'ahangle', 'ahlength', 'bboxmargin', 'defaultpen', 'defaultscale',
+ 'labeloffset', 'background', 'currentpen', 'currentpicture', 'cuttings',
+ 'defaultfont', 'extra_beginfig', 'extra_endfig',
+ 'beveled', 'black', 'blue', 'bp', 'butt', 'cc', 'cm', 'dd', 'ditto', 'down', 'epsilon',
+ 'evenly', 'fullcircle', 'green', 'halfcircle', 'identity', 'in', 'infinity', 'left',
+ 'mitered', 'mm', 'origin', 'pensquare', 'pt', 'quartercircle', 'red', 'right',
+ 'rounded', 'squared', 'unitsquare', 'up', 'white', 'withdots',
+ 'abs', 'bbox', 'ceiling', 'center', 'cutafter', 'cutbefore', 'dir',
+ 'directionpoint', 'div', 'dotprod', 'intersectionpoint', 'inverse', 'mod', 'lft',
+ 'round', 'rt', 'unitvector', 'whatever',
+ 'cutdraw', 'draw', 'drawarrow', 'drawdblarrow', 'fill', 'filldraw', 'drawdot',
+ 'loggingall', 'pickup', 'tracingall', 'tracingnone', 'undraw', 'unfill',
+ 'unfilldraw',
+ 'buildcycle', 'dashpattern', 'decr', 'dotlabel', 'dotlabels', 'drawoptions',
+ 'incr', 'label', 'labels', 'max', 'min', 'thelabel', 'z',
+ 'beginchar', 'blacker', 'capsule_end', 'change_width',
+ 'define_blacker_pixels', 'define_corrected_pixels',
+ 'define_good_x_pixels', 'define_good_y_pixels',
+ 'define_horizontal_corrected_pixels', 'define_pixels',
+ 'define_whole_blacker_pixels', 'define_whole_pixels',
+ 'define_whole_vertical_blacker_pixels',
+ 'define_whole_vertical_pixels', 'endchar', 'extra_beginchar',
+ 'extra_endchar', 'extra_setup', 'font_coding_scheme',
+ 'font_extra_space'
+}
+
+buffers.visualizers.mp.identifiers.metafun = {
+ 'unitcircle', 'fulldiamond', 'unitdiamond',
+ 'halfcircle', 'quartercircle',
+ 'llcircle', 'lrcircle', 'urcircle', 'ulcircle',
+ 'tcircle', 'bcircle', 'lcircle', 'rcircle',
+ 'lltriangle', 'lrtriangle', 'urtriangle', 'ultriangle',
+ 'smoothed', 'cornered', 'superellipsed', 'randomized', 'squeezed',
+ 'punked', 'curved', 'unspiked', 'simplified', 'blownup', 'stretched',
+ 'enlarged', 'leftenlarged', 'topenlarged', 'rightenlarged', 'bottomenlarged',
+ 'llenlarged', 'lrenlarged', 'urenlarged', 'ulenlarged',
+ 'llmoved', 'lrmoved', 'urmoved', 'ulmoved',
+ 'boundingbox', 'innerboundingbox', 'outerboundingbox',
+ 'bottomboundary', 'leftboundary', 'topboundary', 'rightboundary',
+ 'xsized', 'ysized', 'xysized',
+ 'cmyk', 'transparent', 'withshade', 'spotcolor',
+ 'drawfill', 'undrawfill',
+ 'inverted', 'uncolored', 'softened', 'grayed',
+ 'textext', 'graphictext',
+ 'loadfigure', 'externalfigure'
+}
+
+buffers.visualizers.mp.words = { }
+
+for k,v in pairs(buffers.visualizers.mp.identifiers) do
+ for _,w in pairs(v) do
+ buffers.visualizers.mp.words[w] = k
+ end
+end
+
+buffers.visualizers.mp.styles = { }
+
+buffers.visualizers.mp.styles.primitives = ""
+buffers.visualizers.mp.styles.plain = "\\sl "
+buffers.visualizers.mp.styles.metafun = "\\sl "
+
+-- btex .. etex
+
+buffers.visualizers.mp.colors = {
+ "prettyone",
+ "prettytwo",
+ "prettythree",
+ "prettyfour",
+}
+
+buffers.visualizers.mp.states = {
+ [';']=1, ['$']=1, ['@']=1, ['#']=1,
+ ['\\']=2,
+ ['(']=3, [')']=3, ['[']=3, [']']=3, [':']=3, ['=']=3, ['<']=3, ['>']=3,
+ ['-']=4, ['+']=4, ['/']=4, ['*']=4, ['|']=4, ['`']=4, ['!']=4, ['?']=4, ['^']=4, ['&']=4, ['%']=4,
+ ['%']=4, ['.']=4, [',']=4
+}
+
+function buffers.flush_mp_word(state, word, intex, result)
+ if #word>0 then
+ if intex then
+ if word == 'etex' then
+ state = buffers.change_state(2, state, result)
+ result[#result+1] = word
+ state = buffers.finish_state(state,result)
+ return state, false
+ else
+ result[#result+1] = word
+ return state, true
+ end
+ else
+ local id = buffers.visualizers.mp.words[word]
+ if id then
+ state = buffers.change_state(2, state, result)
+ if buffers.visualizers.mp.styles[id] then
+ result[#result+1] = buffers.visualizers.mp.styles[id] .. word
+ else
+ result[#result+1] = word
+ end
+ state = buffers.finish_state(state,result)
+ return state, (word == 'btex') or (word == 'verbatimtex')
+ else
+ state = buffers.finish_state(state,result)
+ result[#result+1] = word
+ return state, intex
+ end
+ end
+ else
+ state = buffers.finish_state(state,result)
+ return state, intex
+ end
+end
+
+-- todo: split string in code and comment, and escape comment fast
+-- could be generic
+
+-- to be considered: visualizer => table [result, instr, incomment, word]
+
+function buffers.visualizers.mp.flush_line_(str,nested)
+ local result, state, word = { }, 0, ""
+ local instr, intex, incomment = false, false, false
+ local byte, find = utf.byte, utf.find
+ local finish, change = buffers.finish_state, buffers.change_state
+ buffers.currentcolors = buffers.visualizers.mp.colors
+ for c in string.utfcharacters(str) do
+ if incomment then
+ result[#result+1] = buffers.escaped_chr(c)
+ elseif c == '%' then
+ state = change(buffers.visualizers.mp.states[c], state, result)
+ incomment = true
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ state = finish(state,result)
+ elseif instr then
+ if c == '"' then
+ state = change(buffers.visualizers.mp.states[c], state, result)
+ instr = false
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ state = finish(state,result)
+ elseif find(c,"^[%a%d]$") then
+ result[#result+1] = c
+ else
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ end
+ elseif c == " " then
+ state, intex = buffers.flush_mp_word_(state, word, intex, result)
+ word = ""
+ result[#result+1] = "\\obs "
+ elseif intex then
+ if find(c,"^[%a]$") then
+ word = word .. c
+ else
+ state, intex = buffers.flush_mp_word_(state, word, intex, result)
+ word = ""
+ if intex then
+ if find(c,"^[%d]$") then
+ result[#result+1] = c
+ else
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ end
+ else
+ state = change(buffers.visualizers.mp.states[c], state, result)
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ end
+ end
+ elseif find(c,"^[%a]$") then
+ state = finish(state,result)
+ word = word .. c
+ else
+ state, intex = buffers.flush_mp_word_(state, word, intex, result)
+ word = ""
+ state = change(buffers.visualizers.mp.states[c], state, result)
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ instr = (c == '"')
+ end
+ end
+ state, intex = buffers.flush_mp_word_(state, word, intex, result)
+ state = finish(state,result)
+ buffers.flush_result(result,false)
+end
diff --git a/tex/context/base/verb-tex.lua b/tex/context/base/verb-tex.lua
new file mode 100644
index 000000000..dbb483ad5
--- /dev/null
+++ b/tex/context/base/verb-tex.lua
@@ -0,0 +1,122 @@
+-- filename : type-tex.lua
+-- comment : companion to core-buf.tex
+-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL
+-- copyright: PRAGMA ADE / ConTeXt Development Team
+-- license : see context related readme files
+
+if not buffers then buffers = { } end
+if not buffers.visualizers then buffers.visualizers = { } end
+if not buffers.visualizers.tex then buffers.visualizers.tex = { } end
+
+buffers.visualizers.tex.colors = {
+ "prettytwo",
+ "prettyone",
+ "prettythree",
+ "prettyfour"
+}
+
+buffers.visualizers.tex.states = {
+ ['$']=2, ['{']=2, ['}']=2,
+ ['[']=3, [']']=3, ['(']=3, [')']=3, ['<']=3, ['>']=3, ['#']=3, ['=']=3, ['"']=3,
+ ['/']=4, ['^']=4, ['_']=4, ['-']=4, ['&']=4, ['+']=4, ["'"]=4, ['`']=4, ['|']=4, ['%']=4
+}
+
+-- using a table to store the result does not make sense here (actually,
+-- it's substantial slower since we're flushing lines on the fly)
+--
+-- we could use a special catcode regime: only \ { }
+
+function buffers.visualizers.tex.flush_line(str,nested)
+ local result, state = { }, 0
+ local first, escaping = false, false
+ local byte, find = utf.byte, utf.find
+ local finish, change = buffers.finish_state, buffers.change_state
+ buffers.currentcolors = buffers.visualizers.tex.colors
+ for c in string.utfcharacters(str) do
+ if c == " " then
+ if escaping then
+ result[#result+1] = " "
+ else
+ state = finish(state, result)
+ result[#result+1] = "\\obs "
+ end
+ escaping, first = false, false
+ elseif c == "\t" then
+ if escaping then
+ result[#result+1] = " "
+ else
+ state = finish(state, result)
+ result[#result+1] = "\\obs "
+ end
+ if buffers.visualizers.enabletab then
+ result[#result+1] = string.rep("\\obs ",i%buffers.visualizers.tablength)
+ end
+ escaping, first = false, false
+ elseif buffers.visualizers.enableescape and (c == buffers.visualizers.escapetoken) then
+ if escaping then
+ if first then
+ if find(c,"^[%a%!%?%@]$") then
+ result[#result+1] =c
+ else
+ result[#result+1] ="\\char" .. byte(c) .. " "
+ end
+ first = false
+ else
+ result[#result+1] = "\\"
+ first = true
+ end
+ else
+ state = finish(state, result)
+ result[#result+1] = "\\"
+ escaping, first = true, true
+ end
+ elseif escaping then
+ if find(c,"^[%a%!%?%@]$") then
+ result[#result+1] = c
+ else
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ end
+ first = false
+ elseif first then
+ state = 1
+ if find(c,"^[%a%!%?%@]$") then
+ result[#result+1] = c
+ else
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ state = finish(state, result)
+ end
+ first = false
+ elseif state == 1 then
+ if find(c,"^[%a%!%?%@]$") then
+ result[#result+1] = c
+ first = false
+ elseif c == "\\" then
+ state = change(1, state, result)
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ first = true
+ else
+ state = change(buffers.visualizers.tex.states[c], state, result)
+ if state == 0 then
+ result[#result+1] = c
+ else
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ end
+ first = false
+ end
+ elseif c == "\\" then
+ first = true
+ state = change(1, state, result)
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ else
+ state = change(buffers.visualizers.tex.states[c], state, result)
+ if state == 0 then
+ result[#result+1] = c
+ else
+ result[#result+1] = "\\char" .. byte(c) .. " "
+ end
+ first = false
+ end
+ end
+ state = finish(state, result)
+ buffers.flush_result(result,nested)
+end
diff --git a/tex/context/base/x-ldx.ctx b/tex/context/base/x-ldx.ctx
new file mode 100644
index 000000000..21ef6db5f
--- /dev/null
+++ b/tex/context/base/x-ldx.ctx
@@ -0,0 +1,23 @@
+<?xml version='1.0' standalone='yes'?>
+
+<ctx:job>
+ <ctx:message>Lua Documentation</ctx:message>
+ <ctx:preprocess>
+ <ctx:processors>
+ <ctx:processor name='ldx'>mtxrun --verbose --internal x-ldx.lua <ctx:value name='old'/> <ctx:value name='new'/></ctx:processor>
+ </ctx:processors>
+ <ctx:files>
+ <ctx:file processor='ldx'><ctx:value name='old'/></ctx:file>
+ </ctx:files>
+ </ctx:preprocess>
+ <ctx:flags>
+ <ctx:flag>purge</ctx:flag>
+ <ctx:flag>forcexml</ctx:flag>
+ </ctx:flags>
+ <ctx:process>
+ <ctx:resources>
+ <ctx:module>ldx</ctx:module>
+ </ctx:resources>
+ </ctx:process>
+</ctx:job>
+
diff --git a/tex/context/base/x-ldx.tex b/tex/context/base/x-ldx.tex
new file mode 100644
index 000000000..0d9350c1c
--- /dev/null
+++ b/tex/context/base/x-ldx.tex
@@ -0,0 +1,133 @@
+\defineregister[function][functions]
+\defineregister[variable][variables]
+
+\definehead[source][subject]
+\definehead[extra] [subsubject]
+\definehead[topic] [subsubsubject]
+
+\setuphead[source][style=\bfb]
+\setuphead[extra] [style=\bfa]
+\setuphead[topic] [style=\bf]
+
+\def\LDXkey #1{\bold{#1}}
+\def\LDXfunction#1{\LDXkey{function} #1\function{#1}}
+\def\LDXvariable#1{#1\variable{#1}}
+\def\LDXcomment #1{{\tt--#1}}
+\def\LDXsource #1{\source{#1}}
+
+\defineXMLenvironment
+ [ldx:document]
+ {\page}
+ {\determineregistercharacteristics[function]
+ \startmode[*register]
+ \extra{Functions}
+ \placeregister[function]
+ \stopmode
+ \determineregistercharacteristics[variable]
+ \startmode[*register]
+ \extra{Variables}
+ \placeregister[variable]
+ \stopmode}
+
+\defineXMLargument [ldx:source] \LDXsource
+\defineXMLargument [ldx:key] \LDXkey
+\defineXMLargument [ldx:variable] \LDXvariable
+\defineXMLargument [ldx:function] \LDXfunction
+\defineXMLargument [ldx:com] \LDXcomment
+
+\newcounter\CommentCounter
+
+\defineXMLenvironment[ldx:comment]
+ {\endgraf
+ \blank
+ \doglobal\increment\CommentCounter
+ \margintitle{\bf\CommentCounter}}
+ {\blank
+ \endgraf}
+
+\defineXMLenvironment[ldx:dqs]
+ {\bgroup\tt"}
+ {"\egroup}
+
+\defineXMLenvironment[ldx:sqs]
+ {\bgroup\tt'}
+ {'\egroup}
+
+\defineXMLenvironment[ldx:code]
+ {\startpacked}
+ {\stoppacked}
+
+\defineXMLenvironment[ldx:line][n=0,comment=] % maybe hangindent or leftskip
+ {\dontleavehmode
+ \hbox to \hsize\bgroup
+ \strut\hskip\dimexpr\XMLop{n}em/4\relax\relax
+ \doif {\XMLop{comment}} {yes} {\tt}}
+ {\hss
+ \egroup
+ \endgraf}
+
+\defineXMLsingular[ldx:line]
+ {\crlf}
+
+\defineXMLargument [source] \LDXsource
+\defineXMLargument [key] \LDXkey
+
+\defineXMLsingular[logo][label=,name=]
+ {\uppercasestring\XMLop{label}\XMLop{label}\to\ascii
+ \getvalue{\ascii}}
+
+\defineXMLsingular[l][l=,n=]
+ {\uppercasestring\XMLop{l}\XMLop{l}\to\ascii
+ \getvalue{\ascii}}
+
+\defineXMLenvironment
+ [typing]
+ {\blank
+ \startpacked \tt
+ \obeyspaces}
+ {\stoppacked
+ \blank}
+
+\defineXMLentity[amp]{\&}
+\defineXMLentity[lt] {<}
+\defineXMLentity[gt] {>}
+
+\usemodule[abr-02]
+
+\startnotmode[atpragma]
+ \definetypeface[mainfacenormal] [ss][sans] [iwona] [default]
+ \definetypeface[mainfacenormal] [rm][serif][palatino] [default]
+ \definetypeface[mainfacenormal] [tt][mono] [modern] [default][rscale=1.1]
+ \definetypeface[mainfacenormal] [mm][math] [iwona] [default][encoding=default]
+
+ \definetypeface[mainfacemedium] [ss][sans] [iwona-medium][default]
+ \definetypeface[mainfacenormal] [rm][serif][palatino] [default]
+ \definetypeface[mainfacemedium] [tt][mono] [modern] [default][rscale=1.1]
+ \definetypeface[mainfacemedium] [mm][math] [iwona-medium][default][encoding=default]
+
+ \definetypeface[mainfacenarrowtt][tt][mono] [modern-cond] [default][rscale=1.1]
+\stopnotmode
+
+\startmode[atpragma]
+ \usetypescriptfile[type-ghz]
+
+ \definetypeface[mainfacenormal] [ss][sans] [optima-nova] [default]
+ \definetypeface[mainfacenormal] [rm][serif][palatino] [default]
+ \definetypeface[mainfacenormal] [tt][mono] [modern] [default][rscale=1.1]
+ \definetypeface[mainfacenormal] [mm][math] [palatino] [default][encoding=default]
+
+ \definetypeface[mainfacemedium] [ss][sans] [optima-nova] [default]
+ \definetypeface[mainfacenormal] [rm][serif][palatino] [default]
+ \definetypeface[mainfacemedium] [tt][mono] [modern] [default][rscale=1.1]
+ \definetypeface[mainfacemedium] [mm][math] [palatino] [default][encoding=default]
+
+ \definetypeface[mainfacenarrowtt][tt][mono] [modern-cond] [default][rscale=1.1]
+\stopmode
+
+\setupbodyfont[mainfacenormal,11pt]
+
+\setupwhitespace[big]
+
+% \starttext
+% \processXMLfilegrouped{\inputfilename}
+% \stoptext
diff --git a/tex/context/interface/keys-cz.xml b/tex/context/interface/keys-cz.xml
index 4a67e283b..7bb8e9000 100644
--- a/tex/context/interface/keys-cz.xml
+++ b/tex/context/interface/keys-cz.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="cz" version="2007.07.25 12:35">
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="cz" version="2007.08.07 01:37">
<cd:variables>
<cd:variable name="lesshyphenation" value="lesshyphenation"/>
diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml
index a05e281b4..9611a5593 100644
--- a/tex/context/interface/keys-de.xml
+++ b/tex/context/interface/keys-de.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="de" version="2007.07.25 12:35">
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="de" version="2007.08.07 01:37">
<cd:variables>
<cd:variable name="lesshyphenation" value="lesshyphenation"/>
diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml
index e205814a8..2b623712e 100644
--- a/tex/context/interface/keys-en.xml
+++ b/tex/context/interface/keys-en.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="en" version="2007.07.25 12:35">
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="en" version="2007.08.07 01:37">
<cd:variables>
<cd:variable name="lesshyphenation" value="lesshyphenation"/>
diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml
index 291669d90..afdee8099 100644
--- a/tex/context/interface/keys-fr.xml
+++ b/tex/context/interface/keys-fr.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="fr" version="2007.07.25 12:35">
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="fr" version="2007.08.07 01:37">
<cd:variables>
<cd:variable name="lesshyphenation" value="lesshyphenation"/>
diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml
index d038e931d..3a6de75a1 100644
--- a/tex/context/interface/keys-it.xml
+++ b/tex/context/interface/keys-it.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="it" version="2007.07.25 12:35">
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="it" version="2007.08.07 01:37">
<cd:variables>
<cd:variable name="lesshyphenation" value="lesshyphenation"/>
diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml
index 1c67d4b4b..5fccd10a7 100644
--- a/tex/context/interface/keys-nl.xml
+++ b/tex/context/interface/keys-nl.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="nl" version="2007.07.25 12:35">
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="nl" version="2007.08.07 01:37">
<cd:variables>
<cd:variable name="lesshyphenation" value="lesshyphenation"/>
diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml
index dfcc7003a..f1194cf49 100644
--- a/tex/context/interface/keys-ro.xml
+++ b/tex/context/interface/keys-ro.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="ro" version="2007.07.25 12:35">
+<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="ro" version="2007.08.07 01:37">
<cd:variables>
<cd:variable name="lesshyphenation" value="lesshyphenation"/>